aa18062
From 83b8b93188114e1a39b3475d9429a2ee8977a398 Mon Sep 17 00:00:00 2001
aa18062
From: Bjorn Andersson <bjorn.andersson@linaro.org>
aa18062
Date: Wed, 28 Jun 2017 14:53:23 -0700
aa18062
Subject: [PATCH 1/6] rpmsg: Make modalias work for DeviceTree based devices
aa18062
aa18062
When rpmsg devices are expected to be matched based on their compatible
aa18062
the modalias should reflect this, so that module autoloading has a
aa18062
chance to match and load the appropriate module.
aa18062
aa18062
Tested-by: Rob Clark <robdclark@gmail.com>
aa18062
Reported-by: Rob Clark <robdclark@gmail.com>
aa18062
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
aa18062
---
aa18062
 drivers/rpmsg/rpmsg_core.c | 10 ++++++++++
aa18062
 1 file changed, 10 insertions(+)
aa18062
aa18062
diff --git a/drivers/rpmsg/rpmsg_core.c b/drivers/rpmsg/rpmsg_core.c
aa18062
index 600f5f9f7431..62580ad1b1f1 100644
aa18062
--- a/drivers/rpmsg/rpmsg_core.c
aa18062
+++ b/drivers/rpmsg/rpmsg_core.c
aa18062
@@ -342,6 +342,11 @@ static ssize_t modalias_show(struct device *dev,
aa18062
 			     struct device_attribute *attr, char *buf)
aa18062
 {
aa18062
 	struct rpmsg_device *rpdev = to_rpmsg_device(dev);
aa18062
+	ssize_t len;
aa18062
+
aa18062
+	len = of_device_modalias(dev, buf, PAGE_SIZE);
aa18062
+	if (len != -ENODEV)
aa18062
+		return len;
aa18062
 
aa18062
 	return sprintf(buf, RPMSG_DEVICE_MODALIAS_FMT "\n", rpdev->id.name);
aa18062
 }
aa18062
@@ -384,6 +389,11 @@ static int rpmsg_dev_match(struct device *dev, struct device_driver *drv)
aa18062
 static int rpmsg_uevent(struct device *dev, struct kobj_uevent_env *env)
aa18062
 {
aa18062
 	struct rpmsg_device *rpdev = to_rpmsg_device(dev);
aa18062
+	int ret;
aa18062
+
aa18062
+	ret = of_device_uevent_modalias(dev, env);
aa18062
+	if (ret != -ENODEV)
aa18062
+		return ret;
aa18062
 
aa18062
 	return add_uevent_var(env, "MODALIAS=" RPMSG_DEVICE_MODALIAS_FMT,
aa18062
 					rpdev->id.name);
aa18062
-- 
aa18062
2.13.0
aa18062
aa18062
From ccdf75f90484a87ddb29649304156a503bf5a829 Mon Sep 17 00:00:00 2001
aa18062
From: Bjorn Andersson <bjorn.andersson@linaro.org>
aa18062
Date: Wed, 28 Jun 2017 16:44:58 -0700
aa18062
Subject: [PATCH 2/6] spmi: Include OF based modalias in device uevent
aa18062
aa18062
Include the OF-based modalias in the uevent sent when registering SPMI
aa18062
devices, so that user space has a chance to autoload the kernel module
aa18062
for the device.
aa18062
aa18062
Reported-by: Rob Clark <robdclark@gmail.com>
aa18062
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
aa18062
Tested-by: Rob Clark <robdclark@gmail.com>
aa18062
Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
aa18062
---
aa18062
 drivers/spmi/spmi.c | 12 ++++++++++++
aa18062
 1 file changed, 12 insertions(+)
aa18062
aa18062
diff --git a/drivers/spmi/spmi.c b/drivers/spmi/spmi.c
aa18062
index 2b9b0941d9eb..6d23226e5f69 100644
aa18062
--- a/drivers/spmi/spmi.c
aa18062
+++ b/drivers/spmi/spmi.c
aa18062
@@ -365,11 +365,23 @@ static int spmi_drv_remove(struct device *dev)
aa18062
 	return 0;
aa18062
 }
aa18062
 
aa18062
+static int spmi_drv_uevent(struct device *dev, struct kobj_uevent_env *env)
aa18062
+{
aa18062
+	int ret;
aa18062
+
aa18062
+	ret = of_device_uevent_modalias(dev, env);
aa18062
+	if (ret != -ENODEV)
aa18062
+		return ret;
aa18062
+
aa18062
+	return 0;
aa18062
+}
aa18062
+
aa18062
 static struct bus_type spmi_bus_type = {
aa18062
 	.name		= "spmi",
aa18062
 	.match		= spmi_device_match,
aa18062
 	.probe		= spmi_drv_probe,
aa18062
 	.remove		= spmi_drv_remove,
aa18062
+	.uevent		= spmi_drv_uevent,
aa18062
 };
aa18062
 
aa18062
 /**
aa18062
-- 
aa18062
2.13.0
aa18062
aa18062
From 283d0e00a18b294ec56f1fb904896a546704faaf Mon Sep 17 00:00:00 2001
aa18062
From: Rob Clark <robdclark@gmail.com>
aa18062
Date: Fri, 30 Jun 2017 11:47:21 -0400
aa18062
Subject: [PATCH 3/6] soc: qcom: smsm: fix of_node refcnting problem
aa18062
aa18062
of_find_node_with_property() drops the reference to the 'from' node,
aa18062
which eventually (after enough -EPROBE_DEFERs) drops the last reference
aa18062
to the node causing all sorts of fun problems, and this nice splat.
aa18062
aa18062
  BUG: sleeping function called from invalid context at ../kernel/locking/mutex.c:747
aa18062
  in_atomic(): 1, irqs_disabled(): 128, pid: 33, name: kworker/0:1
aa18062
  4 locks held by kworker/0:1/33:
aa18062
   #0:  ("events"){.+.+.+}, at: [<ffff0000080fa91c>] process_one_work+0x1a4/0x728
aa18062
   #1:  (deferred_probe_work){+.+.+.}, at: [<ffff0000080fa91c>] process_one_work+0x1a4/0x728
aa18062
   #2:  (&dev->mutex){......}, at: [<ffff000008676078>] __device_attach+0x30/0x168
aa18062
   #3:  (devtree_lock){......}, at: [<ffff000008828fd0>] of_find_node_with_property+0x30/0xe0
aa18062
  irq event stamp: 18976
aa18062
  hardirqs last  enabled at (18975): [<ffff00000815794c>] __down_trylock_console_sem+0x74/0xb8
aa18062
  hardirqs last disabled at (18976): [<ffff0000089e26d4>] _raw_spin_lock_irqsave+0x2c/0x78
aa18062
  softirqs last  enabled at (16880): [<ffff0000080e0f00>] __do_softirq+0x580/0x640
aa18062
  softirqs last disabled at (16871): [<ffff0000080e13a4>] irq_exit+0xe4/0x138
aa18062
  CPU: 0 PID: 33 Comm: kworker/0:1 Tainted: G            E   4.12.0-rc5+ #1455
aa18062
  Hardware name: qualcomm dragonboard410c/dragonboard410c, BIOS 2017.07-rc1-00234-g22fa70a-dirty 06/26/2017
aa18062
  Workqueue: events deferred_probe_work_func
aa18062
  Call trace:
aa18062
  [<ffff000008089ee0>] dump_backtrace+0x0/0x230
aa18062
  [<ffff00000808a134>] show_stack+0x24/0x30
aa18062
  [<ffff0000084e1944>] dump_stack+0xac/0xe8
aa18062
  [<ffff00000810d7e0>] ___might_sleep+0x150/0x230
aa18062
  [<ffff00000810d918>] __might_sleep+0x58/0x90
aa18062
  [<ffff0000089dde18>] __mutex_lock+0x50/0x870
aa18062
  [<ffff0000089de674>] mutex_lock_nested+0x3c/0x50
aa18062
  [<ffff000008388ae0>] kernfs_remove+0x30/0x50
aa18062
  [<ffff00000838b720>] sysfs_remove_dir+0x58/0x70
aa18062
  [<ffff0000084e393c>] kobject_del+0x1c/0x58
aa18062
  [<ffff0000084e374c>] kobject_put+0xb4/0x208
aa18062
  [<ffff00000882c364>] of_node_put+0x24/0x30
aa18062
  [<ffff000008829018>] of_find_node_with_property+0x78/0xe0
aa18062
  [<ffff000000aff5f4>] qcom_smsm_probe+0x194/0x720 [smsm]
aa18062
  [<ffff0000086793b4>] platform_drv_probe+0x74/0x110
aa18062
  [<ffff0000086765bc>] driver_probe_device+0x2b4/0x420
aa18062
  [<ffff000008676920>] __device_attach_driver+0xd0/0x150
aa18062
  [<ffff000008673e78>] bus_for_each_drv+0x68/0xa8
aa18062
  [<ffff00000867611c>] __device_attach+0xd4/0x168
aa18062
  [<ffff000008676a1c>] device_initial_probe+0x24/0x30
aa18062
  [<ffff000008675380>] bus_probe_device+0xa0/0xa8
aa18062
  [<ffff000008675948>] deferred_probe_work_func+0xb8/0xf8
aa18062
  [<ffff0000080fa9d4>] process_one_work+0x25c/0x728
aa18062
  [<ffff0000080faef4>] worker_thread+0x54/0x3d8
aa18062
  [<ffff0000081031d8>] kthread+0x110/0x140
aa18062
  [<ffff000008082d90>] ret_from_fork+0x10/0x40
aa18062
  OF: ERROR: Bad of_node_put() on /smsm
aa18062
  CPU: 0 PID: 33 Comm: kworker/0:1 Tainted: G        W   E   4.12.0-rc5+ #1455
aa18062
  Hardware name: qualcomm dragonboard410c/dragonboard410c, BIOS 2017.07-rc1-00234-g22fa70a-dirty 06/26/2017
aa18062
  Workqueue: events deferred_probe_work_func
aa18062
aa18062
Signed-off-by: Rob Clark <robdclark@gmail.com>
aa18062
---
aa18062
 drivers/soc/qcom/smsm.c | 3 ++-
aa18062
 1 file changed, 2 insertions(+), 1 deletion(-)
aa18062
aa18062
diff --git a/drivers/soc/qcom/smsm.c b/drivers/soc/qcom/smsm.c
aa18062
index d0337b2a71c8..a64ecd597a22 100644
aa18062
--- a/drivers/soc/qcom/smsm.c
aa18062
+++ b/drivers/soc/qcom/smsm.c
aa18062
@@ -495,7 +495,8 @@ static int qcom_smsm_probe(struct platform_device *pdev)
aa18062
 	if (!smsm->hosts)
aa18062
 		return -ENOMEM;
aa18062
 
aa18062
-	local_node = of_find_node_with_property(pdev->dev.of_node, "#qcom,smem-state-cells");
aa18062
+	local_node = of_find_node_with_property(of_node_get(pdev->dev.of_node),
aa18062
+						"#qcom,smem-state-cells");
aa18062
 	if (!local_node) {
aa18062
 		dev_err(&pdev->dev, "no state entry\n");
aa18062
 		return -EINVAL;
aa18062
-- 
aa18062
2.13.0
aa18062
aa18062
From 40cb129048e5d2456da8d9d6468f292da3071b91 Mon Sep 17 00:00:00 2001
aa18062
From: Rob Clark <robdclark@gmail.com>
aa18062
Date: Fri, 30 Jun 2017 16:40:23 -0400
aa18062
Subject: [PATCH 4/6] thermal: qcom: tsens: fix crash due to incorrect __init
aa18062
aa18062
init_common() is called from probe, which can happen after the __init
aa18062
section is already unloaded in the case of -EPROBE_DEFER.  Causing a
aa18062
later probe to attempt to branch to hyperspace.
aa18062
aa18062
Cc: <stable@vger.kernel.org>
aa18062
Signed-off-by: Rob Clark <robdclark@gmail.com>
aa18062
Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org>
aa18062
---
aa18062
 drivers/thermal/qcom/tsens-common.c | 2 +-
aa18062
 1 file changed, 1 insertion(+), 1 deletion(-)
aa18062
aa18062
diff --git a/drivers/thermal/qcom/tsens-common.c b/drivers/thermal/qcom/tsens-common.c
aa18062
index b1449ad67fc0..22ad37c9808c 100644
aa18062
--- a/drivers/thermal/qcom/tsens-common.c
aa18062
+++ b/drivers/thermal/qcom/tsens-common.c
aa18062
@@ -123,7 +123,7 @@ static const struct regmap_config tsens_config = {
aa18062
 	.reg_stride	= 4,
aa18062
 };
aa18062
 
aa18062
-int __init init_common(struct tsens_device *tmdev)
aa18062
+int init_common(struct tsens_device *tmdev)
aa18062
 {
aa18062
 	void __iomem *base;
aa18062
 
aa18062
-- 
aa18062
2.13.0
aa18062
aa18062
From ae9b4fa55748cc9ce3c8ac039e46feab7257eff9 Mon Sep 17 00:00:00 2001
aa18062
From: Rob Clark <robdclark@gmail.com>
aa18062
Date: Sun, 2 Jul 2017 09:23:36 -0400
aa18062
Subject: [PATCH 5/6] soc: qcom: wcnss_ctrl: add missing MODULE_DEVICE_TABLE()
aa18062
aa18062
This fixes a problem of wifi module not loading on db410c.
aa18062
aa18062
Signed-off-by: Rob Clark <robdclark@gmail.com>
aa18062
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
aa18062
---
aa18062
 drivers/soc/qcom/wcnss_ctrl.c | 1 +
aa18062
 1 file changed, 1 insertion(+)
aa18062
aa18062
diff --git a/drivers/soc/qcom/wcnss_ctrl.c b/drivers/soc/qcom/wcnss_ctrl.c
aa18062
index b9069184df19..d008e5b82db4 100644
aa18062
--- a/drivers/soc/qcom/wcnss_ctrl.c
aa18062
+++ b/drivers/soc/qcom/wcnss_ctrl.c
aa18062
@@ -347,6 +347,7 @@ static const struct of_device_id wcnss_ctrl_of_match[] = {
aa18062
 	{ .compatible = "qcom,wcnss", },
aa18062
 	{}
aa18062
 };
aa18062
+MODULE_DEVICE_TABLE(of, wcnss_ctrl_of_match);
aa18062
 
aa18062
 static struct rpmsg_driver wcnss_ctrl_driver = {
aa18062
 	.probe = wcnss_ctrl_probe,
aa18062
-- 
aa18062
2.13.0
aa18062
aa18062
From 173c1207986956ea4c00601a67c952751a1985e6 Mon Sep 17 00:00:00 2001
aa18062
From: Peter Robinson <pbrobinson@gmail.com>
aa18062
Date: Mon, 3 Jul 2017 10:10:21 +0100
aa18062
Subject: [PATCH 6/6] wcn36xx: check dma_mapping_error()
aa18062
aa18062
Fixes splat:
aa18062
aa18062
  wcn36xx a204000.wcnss:smd-edge:wcnss:wifi: DMA-API: device driver failed to check map error[device address=0x00000000b45ba000] [size=3872 bytes] [mapped as single]
aa18062
  ------------[ cut here ]------------
aa18062
  WARNING: CPU: 0 PID: 0 at ../lib/dma-debug.c:1167 check_unmap+0x474/0x8d0
aa18062
  Modules linked in: bnep(E) arc4(E) wcn36xx(E) mac80211(E) btqcomsmd(E) btqca(E) bluetooth(E) cfg80211(E) ecdh_generic(E) rfkill(E) vfat(E) fat(E) wcnss_ctrl qcom_wcnss_pil(E) mdt_loader(E) qcom_common(E) remoteproc(E) crc32_ce(E) virtio_ring(E) snd_soc_lpass_apq8016(E) snd_soc_lpass_cpu(E) virtio(E) snd_soc_lpass_platform(E) leds_gpio(E) snd_soc_hdmi_codec(E) snd_soc_apq8016_sbc(E) snd_soc_msm8916_digital(E) snd_soc_core(E) qcom_spmi_temp_alarm(E) ac97_bus(E) snd_pcm_dmaengine(E) snd_seq(E) snd_seq_device(E) snd_pcm(E) spi_qup(E) nvmem_qfprom(E) snd_timer(E) snd(E) soundcore(E) msm_rng(E) qcom_tsens(E) nvmem_core(E) uas(E) usb_storage(E) dm9601(E) cdc_ether(E) usbnet(E) mii(E) mmc_block(E) sdhci_msm(E) sdhci_pltfm(E) qcom_spmi_vadc(E) qcom_vadc_common(PE) clk_smd_rpm(E) industrialio(E)
aa18062
   qcom_smd_regulator(E) pinctrl_spmi_mpp(E) pinctrl_spmi_gpio(E) rtc_pm8xxx(E) adv7511(E) smd_rpm(E) qcom_spmi_pmic(E) regmap_spmi(E) phy_msm_usb(E) usb3503(E) extcon_usb_gpio(E) ci_hdrc_msm(E) ci_hdrc(E) qcom_hwspinlock(E) udc_core(E) extcon_core(E) ehci_msm(E) i2c_qup(E) sdhci(E) msm(E) mmc_core(E) drm_kms_helper(E) syscopyarea(E) sysfillrect(E) sysimgblt(E) fb_sys_fops(E) spmi_pmic_arb(E) drm(E) spmi(E) qcom_smd(E) rpmsg_core smsm(E) gpio_keys(E) smp2p(E) smem(E) hwspinlock_core(E) sunrpc(E) scsi_transport_iscsi(E)
aa18062
  CPU: 0 PID: 0 Comm: swapper/0 Tainted: P            E   4.12.0-rc7+ #1476
aa18062
  Hardware name: qualcomm dragonboard410c/dragonboard410c, BIOS 2017.07-rc1-00234-g22fa70a-dirty 06/26/2017
aa18062
  task: ffff000009049780 task.stack: ffff000009030000
aa18062
  PC is at check_unmap+0x474/0x8d0
aa18062
  LR is at check_unmap+0x474/0x8d0
aa18062
  ...
aa18062
  Mapped at:
aa18062
   dma_entry_alloc+0x68/0xa8
aa18062
   debug_dma_map_page+0x94/0x148
aa18062
   wcn36xx_dxe_fill_skb.isra.1+0xbc/0xf8 [wcn36xx]
aa18062
   wcn36xx_dxe_init+0x244/0x398 [wcn36xx]
aa18062
   wcn36xx_start+0xf4/0x298 [wcn36xx]
aa18062
aa18062
v2: pbrobinson: add kfree_skb(skb);
aa18062
aa18062
Signed-off-by: Rob Clark <robdclark@gmail.com>
aa18062
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
aa18062
---
aa18062
 drivers/net/wireless/ath/wcn36xx/dxe.c | 5 +++++
aa18062
 1 file changed, 5 insertions(+)
aa18062
aa18062
diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c
aa18062
index 87dfdaf9044c..d5c810a8cc52 100644
aa18062
--- a/drivers/net/wireless/ath/wcn36xx/dxe.c
aa18062
+++ b/drivers/net/wireless/ath/wcn36xx/dxe.c
aa18062
@@ -289,6 +289,11 @@ static int wcn36xx_dxe_fill_skb(struct device *dev, struct wcn36xx_dxe_ctl *ctl)
aa18062
 					 skb_tail_pointer(skb),
aa18062
 					 WCN36XX_PKT_SIZE,
aa18062
 					 DMA_FROM_DEVICE);
aa18062
+	if (dma_mapping_error(dev, dxe->dst_addr_l)) {
aa18062
+		dev_err(dev, "unable to map skb\n");
aa18062
+		kfree_skb(skb);
aa18062
+		return -ENOMEM;
aa18062
+	}
aa18062
 	ctl->skb = skb;
aa18062
 
aa18062
 	return 0;
aa18062
-- 
aa18062
2.13.0
aa18062