From: Can Guo <cang@codeaurora.org>
To: asutoshd@codeaurora.org, nguyenb@codeaurora.org,
rnayak@codeaurora.org, linux-scsi@vger.kernel.org,
kernel-team@android.com, saravanak@google.com,
salyzyn@google.com, cang@codeaurora.org
Cc: Alim Akhtar <alim.akhtar@samsung.com>,
Avri Altman <avri.altman@wdc.com>,
Pedro Sousa <pedrom.sousa@synopsys.com>,
"James E.J. Bottomley" <jejb@linux.ibm.com>,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Evan Green <evgreen@chromium.org>,
Kishon Vijay Abraham I <kishon@ti.com>,
Stanley Chu <stanley.chu@mediatek.com>,
Vignesh Raghavendra <vigneshr@ti.com>,
Bean Huo <beanhuo@micron.com>,
Bart Van Assche <bvanassche@acm.org>,
YueHaibing <yuehaibing@huawei.com>, Arnd Bergmann <arnd@arndb.de>,
Venkat Gopalakrishnan <venkatg@codeaurora.org>,
Tomas Winkler <tomas.winkler@intel.com>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
linux-kernel@vger.kernel.org (open list)
Subject: [PATCH 2/2] scsi: ufs: Modularize ufs-bsg
Date: Sat, 14 Dec 2019 05:03:35 -0800 [thread overview]
Message-ID: <1576328616-30404-3-git-send-email-cang@codeaurora.org> (raw)
In-Reply-To: <1576328616-30404-1-git-send-email-cang@codeaurora.org>
In order to improve the flexibility of ufs-bsg, modularizing it is a good
choice. This change introduces tristate to ufs-bsg to allow users compile
it as an external module.
Signed-off-by: Can Guo <cang@codeaurora.org>
diff --git a/drivers/scsi/ufs/Kconfig b/drivers/scsi/ufs/Kconfig
index d14c224..d43655a 100644
--- a/drivers/scsi/ufs/Kconfig
+++ b/drivers/scsi/ufs/Kconfig
@@ -143,7 +143,7 @@ config SCSI_UFS_TI_J721E
If unsure, say N.
config SCSI_UFS_BSG
- bool "Universal Flash Storage BSG device node"
+ tristate "Universal Flash Storage BSG device node"
depends on SCSI_UFSHCD
select BLK_DEV_BSGLIB
help
diff --git a/drivers/scsi/ufs/Makefile b/drivers/scsi/ufs/Makefile
index 94c6c5d..904eff1 100644
--- a/drivers/scsi/ufs/Makefile
+++ b/drivers/scsi/ufs/Makefile
@@ -6,7 +6,7 @@ obj-$(CONFIG_SCSI_UFS_CDNS_PLATFORM) += cdns-pltfrm.o
obj-$(CONFIG_SCSI_UFS_QCOM) += ufs-qcom.o
obj-$(CONFIG_SCSI_UFSHCD) += ufshcd-core.o
ufshcd-core-y += ufshcd.o ufs-sysfs.o
-ufshcd-core-$(CONFIG_SCSI_UFS_BSG) += ufs_bsg.o
+obj-$(CONFIG_SCSI_UFS_BSG) += ufs_bsg.o
obj-$(CONFIG_SCSI_UFSHCD_PCI) += ufshcd-pci.o
obj-$(CONFIG_SCSI_UFSHCD_PLATFORM) += ufshcd-pltfrm.o
obj-$(CONFIG_SCSI_UFS_HISI) += ufs-hisi.o
diff --git a/drivers/scsi/ufs/ufs_bsg.c b/drivers/scsi/ufs/ufs_bsg.c
index 3a2e68f..9c49b4e 100644
--- a/drivers/scsi/ufs/ufs_bsg.c
+++ b/drivers/scsi/ufs/ufs_bsg.c
@@ -4,6 +4,7 @@
*
* Copyright (C) 2018 Western Digital Corporation
*/
+#include <linux/platform_device.h>
#include "ufs_bsg.h"
static int ufs_bsg_get_query_desc_size(struct ufs_hba *hba, int *desc_len,
@@ -158,53 +159,45 @@ static int ufs_bsg_request(struct bsg_job *job)
/**
* ufs_bsg_remove - detach and remove the added ufs-bsg node
- * @hba: per adapter object
+ * @pdev: Pointer to platform device handle
*
- * Should be called when unloading the driver.
+ * Return zero for success and non-zero for failure
*/
-void ufs_bsg_remove(struct ufs_hba *hba)
+static int ufs_bsg_remove(struct platform_device *pdev)
{
- struct device *bsg_dev = &hba->bsg_dev;
+ struct ufs_hba *hba;
+
+ hba = (struct ufs_hba *)pdev->dev.platform_data;
+ if (!hba)
+ return -ENODEV;
if (!hba->bsg_queue)
- return;
+ return 0;
bsg_remove_queue(hba->bsg_queue);
+ hba->bsg_queue = NULL;
- device_del(bsg_dev);
- put_device(bsg_dev);
-}
-
-static inline void ufs_bsg_node_release(struct device *dev)
-{
- put_device(dev->parent);
+ return 0;
}
/**
- * ufs_bsg_probe - Add ufs bsg device node
- * @hba: per adapter object
+ * ufs_bsg_probe - Probe routine of the driver
+ * @pdev: Pointer to platform device handle
*
- * Called during initial loading of the driver, and before scsi_scan_host.
+ * Return zero for success and non-zero for failure
*/
-int ufs_bsg_probe(struct ufs_hba *hba)
+static int ufs_bsg_probe(struct platform_device *pdev)
{
- struct device *bsg_dev = &hba->bsg_dev;
- struct Scsi_Host *shost = hba->host;
- struct device *parent = &shost->shost_gendev;
+ struct ufs_hba *hba;
+ struct device *bsg_dev;
struct request_queue *q;
int ret;
- device_initialize(bsg_dev);
-
- bsg_dev->parent = get_device(parent);
- bsg_dev->release = ufs_bsg_node_release;
-
- dev_set_name(bsg_dev, "ufs-bsg");
-
- ret = device_add(bsg_dev);
- if (ret)
- goto out;
+ hba = (struct ufs_hba *)pdev->dev.platform_data;
+ if (!hba)
+ return -ENODEV;
+ bsg_dev = &pdev->dev;
q = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), ufs_bsg_request, NULL, 0);
if (IS_ERR(q)) {
ret = PTR_ERR(q);
@@ -216,7 +209,19 @@ int ufs_bsg_probe(struct ufs_hba *hba)
return 0;
out:
- dev_err(bsg_dev, "fail to initialize a bsg dev %d\n", shost->host_no);
- put_device(bsg_dev);
+ dev_err(bsg_dev, "fail to initialize bsg node, err %d\n", ret);
return ret;
}
+
+static struct platform_driver ufs_bsg_driver = {
+ .probe = ufs_bsg_probe,
+ .remove = ufs_bsg_remove,
+ .driver = {
+ .name = "ufs-bsg",
+ },
+};
+
+module_platform_driver(ufs_bsg_driver);
+
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:ufs-bsg");
diff --git a/drivers/scsi/ufs/ufs_bsg.h b/drivers/scsi/ufs/ufs_bsg.h
index d099187..9d922c0 100644
--- a/drivers/scsi/ufs/ufs_bsg.h
+++ b/drivers/scsi/ufs/ufs_bsg.h
@@ -12,12 +12,4 @@
#include "ufshcd.h"
#include "ufs.h"
-#ifdef CONFIG_SCSI_UFS_BSG
-void ufs_bsg_remove(struct ufs_hba *hba);
-int ufs_bsg_probe(struct ufs_hba *hba);
-#else
-static inline void ufs_bsg_remove(struct ufs_hba *hba) {}
-static inline int ufs_bsg_probe(struct ufs_hba *hba) {return 0; }
-#endif
-
#endif /* UFS_BSG_H */
diff --git a/drivers/scsi/ufs/ufshcd-pltfrm.c b/drivers/scsi/ufs/ufshcd-pltfrm.c
index 76f9be7..90dc399 100644
--- a/drivers/scsi/ufs/ufshcd-pltfrm.c
+++ b/drivers/scsi/ufs/ufshcd-pltfrm.c
@@ -393,6 +393,7 @@ int ufshcd_pltfrm_init(struct platform_device *pdev,
void __iomem *mmio_base;
int irq, err;
struct device *dev = &pdev->dev;
+ struct platform_device *bsg_pdev;
mmio_base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(mmio_base)) {
@@ -440,6 +441,17 @@ int ufshcd_pltfrm_init(struct platform_device *pdev,
pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev);
+ bsg_pdev = platform_device_register_data(dev, "ufs-bsg",
+ hba->host->host_no, hba,
+ sizeof(struct ufs_hba));
+ /* Failure here is non-fatal */
+ if (IS_ERR(bsg_pdev)) {
+ err = PTR_ERR(bsg_pdev);
+ dev_warn(dev, "Register bsg platform device failed %d\n", err);
+ } else {
+ hba->bsg_pdev = bsg_pdev;
+ }
+
return 0;
dealloc_host:
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index a86b0fd..0160cc3 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -42,6 +42,7 @@
#include <linux/nls.h>
#include <linux/of.h>
#include <linux/bitfield.h>
+#include <linux/platform_device.h>
#include "ufshcd.h"
#include "ufs_quirks.h"
#include "unipro.h"
@@ -2093,6 +2094,7 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
ufshcd_release(hba);
return ret;
}
+EXPORT_SYMBOL_GPL(ufshcd_send_uic_cmd);
/**
* ufshcd_map_sg - Map scatter-gather list to prdt
@@ -6024,6 +6026,7 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
return err;
}
+EXPORT_SYMBOL_GPL(ufshcd_exec_raw_upiu_cmd);
/**
* ufshcd_eh_device_reset_handler - device reset handler registered to
@@ -7043,9 +7046,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba)
}
hba->clk_scaling.is_allowed = true;
}
-
- ufs_bsg_probe(hba);
-
scsi_scan_host(hba->host);
pm_runtime_put_sync(hba->dev);
}
@@ -8248,7 +8248,7 @@ int ufshcd_shutdown(struct ufs_hba *hba)
*/
void ufshcd_remove(struct ufs_hba *hba)
{
- ufs_bsg_remove(hba);
+ platform_device_unregister(hba->bsg_pdev);
ufs_sysfs_remove_nodes(hba->dev);
scsi_remove_host(hba->host);
scsi_host_put(hba->host);
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 2740f69..dd86404 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -734,7 +734,7 @@ struct ufs_hba {
struct ufs_desc_size desc_size;
atomic_t scsi_block_reqs_cnt;
- struct device bsg_dev;
+ struct platform_device *bsg_pdev;
struct request_queue *bsg_queue;
};
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
prev parent reply other threads:[~2019-12-14 13:04 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-14 13:03 [PATCH v3 0/2] Modularize ufs-bsg Can Guo
2019-12-14 13:03 ` [PATCH 1/2] scsi: ufs: Put SCSI host after remove it Can Guo
2019-12-14 18:32 ` Bart Van Assche
2019-12-14 22:24 ` cang
2019-12-15 21:55 ` Bart Van Assche
2019-12-16 1:34 ` cang
2019-12-16 2:39 ` Bart Van Assche
2019-12-16 3:12 ` cang
2019-12-16 5:46 ` cang
2019-12-16 17:44 ` Bart Van Assche
2019-12-16 14:31 ` cang
2019-12-16 17:39 ` Bart Van Assche
2019-12-17 0:46 ` cang
2019-12-17 1:15 ` Bart Van Assche
2019-12-17 1:31 ` cang
2019-12-16 18:05 ` Greg KH
2019-12-17 0:50 ` cang
2019-12-14 13:03 ` Can Guo [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1576328616-30404-3-git-send-email-cang@codeaurora.org \
--to=cang@codeaurora.org \
--cc=alim.akhtar@samsung.com \
--cc=arnd@arndb.de \
--cc=asutoshd@codeaurora.org \
--cc=avri.altman@wdc.com \
--cc=beanhuo@micron.com \
--cc=bjorn.andersson@linaro.org \
--cc=bvanassche@acm.org \
--cc=evgreen@chromium.org \
--cc=jejb@linux.ibm.com \
--cc=kernel-team@android.com \
--cc=kishon@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=nguyenb@codeaurora.org \
--cc=pedrom.sousa@synopsys.com \
--cc=rnayak@codeaurora.org \
--cc=salyzyn@google.com \
--cc=saravanak@google.com \
--cc=stanley.chu@mediatek.com \
--cc=tomas.winkler@intel.com \
--cc=venkatg@codeaurora.org \
--cc=vigneshr@ti.com \
--cc=yuehaibing@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.