From 3e8b55411468ef9aa4401282a869715c45b0310b Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Fri, 30 Jun 2017 11:47:21 -0400 Subject: soc: qcom: smsm: fix of_node refcnting problem of_find_node_with_property() drops the reference to the 'from' node, which eventually (after enough -EPROBE_DEFERs) drops the last reference to the node causing all sorts of fun problems, and this nice splat. BUG: sleeping function called from invalid context at ../kernel/locking/mutex.c:747 in_atomic(): 1, irqs_disabled(): 128, pid: 33, name: kworker/0:1 4 locks held by kworker/0:1/33: #0: ("events"){.+.+.+}, at: [] process_one_work+0x1a4/0x728 #1: (deferred_probe_work){+.+.+.}, at: [] process_one_work+0x1a4/0x728 #2: (&dev->mutex){......}, at: [] __device_attach+0x30/0x168 #3: (devtree_lock){......}, at: [] of_find_node_with_property+0x30/0xe0 irq event stamp: 18976 hardirqs last enabled at (18975): [] __down_trylock_console_sem+0x74/0xb8 hardirqs last disabled at (18976): [] _raw_spin_lock_irqsave+0x2c/0x78 softirqs last enabled at (16880): [] __do_softirq+0x580/0x640 softirqs last disabled at (16871): [] irq_exit+0xe4/0x138 CPU: 0 PID: 33 Comm: kworker/0:1 Tainted: G E 4.12.0-rc5+ #1455 Hardware name: qualcomm dragonboard410c/dragonboard410c, BIOS 2017.07-rc1-00234-g22fa70a-dirty 06/26/2017 Workqueue: events deferred_probe_work_func Call trace: [] dump_backtrace+0x0/0x230 [] show_stack+0x24/0x30 [] dump_stack+0xac/0xe8 [] ___might_sleep+0x150/0x230 [] __might_sleep+0x58/0x90 [] __mutex_lock+0x50/0x870 [] mutex_lock_nested+0x3c/0x50 [] kernfs_remove+0x30/0x50 [] sysfs_remove_dir+0x58/0x70 [] kobject_del+0x1c/0x58 [] kobject_put+0xb4/0x208 [] of_node_put+0x24/0x30 [] of_find_node_with_property+0x78/0xe0 [] qcom_smsm_probe+0x194/0x720 [smsm] [] platform_drv_probe+0x74/0x110 [] driver_probe_device+0x2b4/0x420 [] __device_attach_driver+0xd0/0x150 [] bus_for_each_drv+0x68/0xa8 [] __device_attach+0xd4/0x168 [] device_initial_probe+0x24/0x30 [] bus_probe_device+0xa0/0xa8 [] deferred_probe_work_func+0xb8/0xf8 [] process_one_work+0x25c/0x728 [] worker_thread+0x54/0x3d8 [] kthread+0x110/0x140 [] ret_from_fork+0x10/0x40 OF: ERROR: Bad of_node_put() on /smsm CPU: 0 PID: 33 Comm: kworker/0:1 Tainted: G W E 4.12.0-rc5+ #1455 Hardware name: qualcomm dragonboard410c/dragonboard410c, BIOS 2017.07-rc1-00234-g22fa70a-dirty 06/26/2017 Workqueue: events deferred_probe_work_func Signed-off-by: Rob Clark Signed-off-by: Andy Gross --- drivers/soc/qcom/smsm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/soc') diff --git a/drivers/soc/qcom/smsm.c b/drivers/soc/qcom/smsm.c index dc540ea92e9d..403bea9d546b 100644 --- a/drivers/soc/qcom/smsm.c +++ b/drivers/soc/qcom/smsm.c @@ -496,7 +496,8 @@ static int qcom_smsm_probe(struct platform_device *pdev) if (!smsm->hosts) return -ENOMEM; - local_node = of_find_node_with_property(pdev->dev.of_node, "#qcom,smem-state-cells"); + local_node = of_find_node_with_property(of_node_get(pdev->dev.of_node), + "#qcom,smem-state-cells"); if (!local_node) { dev_err(&pdev->dev, "no state entry\n"); return -EINVAL; -- cgit v1.2.3-73-gaa49b From b83399090135e6315660d5cce68899174161843b Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sun, 2 Jul 2017 09:23:36 -0400 Subject: soc: qcom: wcnss_ctrl: add missing MODULE_DEVICE_TABLE() This fixes a problem of wifi module not loading on db410c. Signed-off-by: Rob Clark Reviewed-by: Bjorn Andersson Signed-off-by: Andy Gross --- drivers/soc/qcom/wcnss_ctrl.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/soc') diff --git a/drivers/soc/qcom/wcnss_ctrl.c b/drivers/soc/qcom/wcnss_ctrl.c index b9069184df19..d008e5b82db4 100644 --- a/drivers/soc/qcom/wcnss_ctrl.c +++ b/drivers/soc/qcom/wcnss_ctrl.c @@ -347,6 +347,7 @@ static const struct of_device_id wcnss_ctrl_of_match[] = { { .compatible = "qcom,wcnss", }, {} }; +MODULE_DEVICE_TABLE(of, wcnss_ctrl_of_match); static struct rpmsg_driver wcnss_ctrl_driver = { .probe = wcnss_ctrl_probe, -- cgit v1.2.3-73-gaa49b From 2a464815d3262e441a5cff7cbece69c0b76b14d6 Mon Sep 17 00:00:00 2001 From: Srinivas Kandagatla Date: Wed, 26 Jul 2017 17:27:16 +0200 Subject: soc: qcom: bring all qcom drivers into a submenu As the number of qcom drivers increase, entries in SOC menu looks scattered with other SOC drivers. Make a submenu for Qcom drivers to make it visibly clear while selecting qcom SOC specific drivers. Signed-off-by: Srinivas Kandagatla Signed-off-by: Andy Gross --- drivers/soc/qcom/Kconfig | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers/soc') diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig index 9fca977ef18d..5f12657fc552 100644 --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig @@ -1,6 +1,8 @@ # # QCOM Soc drivers # +menu "Qualcomm SoC drivers" + config QCOM_GSBI tristate "QCOM General Serial Bus Interface" depends on ARCH_QCOM @@ -74,3 +76,5 @@ config QCOM_WCNSS_CTRL help Client driver for the WCNSS_CTRL SMD channel, used to download nv firmware to a newly booted WCNSS chip. + +endmenu -- cgit v1.2.3-73-gaa49b From 445c2410a449ae29c0ec0bb9cee8f38078c4a2f1 Mon Sep 17 00:00:00 2001 From: Bjorn Andersson Date: Mon, 26 Jun 2017 13:36:59 -0700 Subject: soc: qcom: mdt_loader: Use request_firmware_into_buf() By switching to the request_firmware_into_buf() we load the segment data straight into the preallocated buffers, reducing the need for allocating scratch buffers for these. In particular the modem firmware consists of multiple segments in the range 5-15MB, making this worth while. Signed-off-by: Bjorn Andersson Signed-off-by: Andy Gross --- drivers/soc/qcom/mdt_loader.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'drivers/soc') diff --git a/drivers/soc/qcom/mdt_loader.c b/drivers/soc/qcom/mdt_loader.c index bd63df0d14e0..08bd8549242a 100644 --- a/drivers/soc/qcom/mdt_loader.c +++ b/drivers/soc/qcom/mdt_loader.c @@ -178,14 +178,13 @@ int qcom_mdt_load(struct device *dev, const struct firmware *fw, if (phdr->p_filesz) { sprintf(fw_name + fw_name_len - 3, "b%02d", i); - ret = request_firmware(&seg_fw, fw_name, dev); + ret = request_firmware_into_buf(&seg_fw, fw_name, dev, + ptr, phdr->p_filesz); if (ret) { dev_err(dev, "failed to load %s\n", fw_name); break; } - memcpy(ptr, seg_fw->data, seg_fw->size); - release_firmware(seg_fw); } -- cgit v1.2.3-73-gaa49b