Fix error message and present UFS variant
Subsystems (3)
v6 cover Fix error message and present UFS variant
V6: removed dead code from ufs-qcom.c and added calling to ufshcd_dealloc_host() in ufshcd-pltfrm.c in case of an error after a successfull ufshcd_alloc_host()
V5: removed a redundant null check
V4: add file Documentation/devicetree/bindings/ufs/ufs-qcom.txt and modify the compatible strings in Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
V3: fixes a few minor issues.
V2: fixes a few issues of unnecessary EXPORT_SYMBOL, types of parameters in routine definition, build errors in case CONFIG_PM is not defined and some other minor fixes.
Yaniv Gardi (8):
phy: qcom-ufs: fix build error when the component is built as a module
scsi: ufs-qcom: fix compilation warning if compiled as a module
scsi: ufs-qcom: update configuration option of SCSI_UFS_QCOM component add ufshcd_get_variant ufshcd_set_variant
scsi: ufs: creates wrapper functions for vops
scsi: ufs: make the UFS variant a platform device
scsi: ufs-qcom: add debug prints for test bus
scsi: ufs-qcom: add QUniPro hardware support and power optimizations
Documentation/devicetree/bindings/ufs/ufs-qcom.txt | 57 ++ .../devicetree/bindings/ufs/ufshcd-pltfrm.txt | 4 +- drivers/phy/phy-qcom-ufs.c | 11 + drivers/scsi/ufs/Kconfig | 2 +- drivers/scsi/ufs/ufs-qcom.c | 910 ++++++++++++++++----- drivers/scsi/ufs/ufs-qcom.h | 68 +- drivers/scsi/ufs/ufshcd-pltfrm.c | 98 +-- drivers/scsi/ufs/ufshcd-pltfrm.h | 41 + drivers/scsi/ufs/ufshcd.c | 122 ++- drivers/scsi/ufs/ufshcd.h | 149 +++- 10 files changed, 1124 insertions(+), 338 deletions(-) create mode 100644 Documentation/devicetree/bindings/ufs/ufs-qcom.txt create mode 100644 drivers/scsi/ufs/ufshcd-pltfrm.h
Signature · 4 lines
1.8.5.2 -- QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
PATCH v6 1/8 phy: qcom-ufs: fix build error when the component is built as a module
Export the following functions in order to avoid build errors when the component PHY_QCOM_UFS is compiled as a module:
ERROR: "ufs_qcom_phy_disable_ref_clk"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_enable_ref_clk"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_is_pcs_ready"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_disable_iface_clk"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_start_serdes"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_calibrate_phy"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_enable_dev_ref_clk"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_set_tx_lane_enable"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_disable_dev_ref_clk"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_save_controller_version"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
ERROR: "ufs_qcom_phy_enable_iface_clk"
[drivers/scsi/ufs/ufs-qcom.ko] undefined!
make[1]: *** [__modpost] Error 1
--- drivers/phy/phy-qcom-ufs.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/phy/phy-qcom-ufs.c +11 -0
@@ -432,6 +432,7 @@ out_disable_src: out:return ret; } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_enable_ref_clk); static int ufs_qcom_phy_disable_vreg(struct phy *phy,
@@ -474,6 +475,7 @@ void ufs_qcom_phy_disable_ref_clk(struct phy *generic_phy) phy->is_ref_clk_enabled = false; } } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_disable_ref_clk);#define UFS_REF_CLK_EN (1 << 5)
@@ -517,11 +519,13 @@ void ufs_qcom_phy_enable_dev_ref_clk(struct phy *generic_phy) {ufs_qcom_phy_dev_ref_clk_ctrl (generic_phy, true); } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_enable_dev_ref_clk);void ufs_qcom_phy_disable_dev_ref_clk (struct phy *generic_phy) {ufs_qcom_phy_dev_ref_clk_ctrl (generic_phy, false); } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_disable_dev_ref_clk);/* Turn ON M-PHY RMMI interface clocks */ int ufs_qcom_phy_enable_iface_clk (struct phy *generic_phy)
@@ -550,6 +554,7 @@ int ufs_qcom_phy_enable_iface_clk(struct phy *generic_phy) out:return ret; } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_enable_iface_clk);/* Turn OFF M-PHY RMMI interface clocks */ void ufs_qcom_phy_disable_iface_clk (struct phy *generic_phy)
@@ -562,6 +567,7 @@ void ufs_qcom_phy_disable_iface_clk(struct phy *generic_phy) phy->is_iface_clk_enabled = false; } } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_disable_iface_clk);int ufs_qcom_phy_start_serdes (struct phy *generic_phy) {
@@ -578,6 +584,7 @@ int ufs_qcom_phy_start_serdes(struct phy *generic_phy)return ret; } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_start_serdes);int ufs_qcom_phy_set_tx_lane_enable (struct phy *generic_phy,u32 tx_lanes) {
@@ -595,6 +602,7 @@ int ufs_qcom_phy_set_tx_lane_enable(struct phy *generic_phy, u32 tx_lanes)return ret; } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_set_tx_lane_enable);void ufs_qcom_phy_save_controller_version (struct phy *generic_phy,u8 major,u16 minor,u16 step)
@@ -605,6 +613,7 @@ void ufs_qcom_phy_save_controller_version(struct phy *generic_phy, ufs_qcom_phy->host_ctrl_rev_minor = minor; ufs_qcom_phy->host_ctrl_rev_step = step; } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_save_controller_version);int ufs_qcom_phy_calibrate_phy (struct phy *generic_phy,bool is_rate_B) {
@@ -625,6 +634,7 @@ int ufs_qcom_phy_calibrate_phy(struct phy *generic_phy, bool is_rate_B)return ret; } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_calibrate_phy);int ufs_qcom_phy_remove (struct phy *generic_phy,struct ufs_qcom_phy *ufs_qcom_phy)
@@ -662,6 +672,7 @@ int ufs_qcom_phy_is_pcs_ready(struct phy *generic_phy)return ufs_qcom_phy->phy_spec_ops->is_physical_coding_sublayer_ready (ufs_qcom_phy); } +EXPORT_SYMBOL_GPL (ufs_qcom_phy_is_pcs_ready);int ufs_qcom_phy_power_on (struct phy *generic_phy) {
Signature · 4 lines
1.8.5.2 -- QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
PATCH v6 2/8 scsi: ufs-qcom: fix compilation warning if compiled as a module
In reply to Yaniv GardiThis change fixes a compilation warning that happens if SCSI_UFS_QCOM is compiled as a module.
Also this patch fixes an error happens when insmod the module:
"ufs_qcom: module license 'unspecified' taints kernel."
--- drivers/scsi/ufs/ufs-qcom.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/scsi/ufs/ufs-qcom.c +6 -1
@@ -917,12 +917,15 @@ out:#define ANDROID_BOOT_DEV_MAX 30static char android_boot_dev[ANDROID_BOOT_DEV_MAX ]; -static int get_android_boot_dev (char *str) + +#ifndef MODULE +static int __init get_android_boot_dev (char *str) {strlcpy (android_boot_dev, str,ANDROID_BOOT_DEV_MAX );return 1 ; }__setup ("androidboot.bootdevice=" , get_android_boot_dev); +#endif /** * ufs_qcom_init - bind phy with controller
@@ -1047,3 +1050,5 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = { .resume = ufs_qcom_resume, };EXPORT_SYMBOL (ufs_hba_qcom_vops); + +MODULE_LICENSE ("GPL v2" );
Signature · 4 lines
1.8.5.2 -- QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
PATCH v6 3/8 scsi: ufs-qcom: update configuration option of SCSI_UFS_QCOM component
In reply to Yaniv GardiThis change is required in order to be able to build the component as a module.
--- drivers/scsi/ufs/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/ufs/Kconfig +1 -1
@@ -72,7 +72,7 @@ config SCSI_UFSHCD_PLATFORM If unsure, say N. config SCSI_UFS_QCOM - bool "QCOM specific hooks to UFS controller platform driver" + tristate "QCOM specific hooks to UFS controller platform driver" depends on SCSI_UFSHCD_PLATFORM && ARCH_QCOM select PHY_QCOM_UFS help
Signature · 4 lines
1.8.5.2 -- QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
PATCH v6 4/8 add ufshcd_get_variant ufshcd_set_variant
In reply to Yaniv Gardi--- drivers/scsi/ufs/ufs-qcom.c | 34 +++++++++++++++++----------------- drivers/scsi/ufs/ufshcd.h | 21 +++++++++++++++++++++ 2 files changed, 38 insertions(+), 17 deletions(-)
drivers/scsi/ufs/ufs-qcom.c +17 -17
@@ -155,7 +155,7 @@ out:static int ufs_qcom_link_startup_post_change (struct ufs_hba *hba) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);struct phy *phy = host->generic_phy;u32 tx_lanes;int err =0 ;
@@ -211,7 +211,7 @@ static int ufs_qcom_check_hibern8(struct ufs_hba *hba)static int ufs_qcom_power_up_sequence (struct ufs_hba *hba) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);struct phy *phy = host->generic_phy;int ret =0 ;bool is_rate_B = (UFS_QCOM_LIMIT_HS_RATE ==PA_HS_MODE_B )
@@ -273,7 +273,7 @@ static void ufs_qcom_enable_hw_clk_gating(struct ufs_hba *hba)static int ufs_qcom_hce_enable_notify (struct ufs_hba *hba,bool status) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);int err =0 ;switch (status) {
@@ -307,7 +307,7 @@ static int ufs_qcom_hce_enable_notify(struct ufs_hba *hba, bool status)static unsigned long ufs_qcom_cfg_timers (struct ufs_hba *hba,u32 gear,u32 hs,u32 rate) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);struct ufs_clk_info *clki;u32 core_clk_period_in_ns;u32 tx_clk_cycles_per_us =0 ;
@@ -448,7 +448,7 @@ static int ufs_qcom_link_startup_notify(struct ufs_hba *hba, bool status)static int ufs_qcom_suspend (struct ufs_hba *hba,enum ufs_pm_op pm_op) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);struct phy *phy = host->generic_phy;int ret =0 ;
@@ -479,7 +479,7 @@ out:static int ufs_qcom_resume (struct ufs_hba *hba,enum ufs_pm_op pm_op) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);struct phy *phy = host->generic_phy;int err;
@@ -621,7 +621,7 @@ static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba, struct ufs_pa_layer_attr *dev_req_params) {u32 val; -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);struct phy *phy = host->generic_phy;struct ufs_qcom_dev_params ufs_qcom_cap;int ret =0 ;
@@ -696,7 +696,7 @@ out:static u32 ufs_qcom_get_ufs_hci_version (struct ufs_hba *hba) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);if (host->hw_ver.major ==0x1 )return UFSHCI_VERSION_11 ;
@@ -715,7 +715,7 @@ static u32 ufs_qcom_get_ufs_hci_version(struct ufs_hba *hba)*/ static void ufs_qcom_advertise_quirks (struct ufs_hba *hba) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);if (host->hw_ver.major ==0x01 ) { hba->quirks |=UFSHCD_QUIRK_DELAY_BEFORE_DME_CMDS
@@ -740,7 +740,7 @@ static void ufs_qcom_advertise_quirks(struct ufs_hba *hba)static void ufs_qcom_set_caps (struct ufs_hba *hba) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);if (host->hw_ver.major >=0x2 ) host->caps =UFS_QCOM_CAP_QUNIPRO ;
@@ -811,7 +811,7 @@ static void ufs_qcom_get_speed_mode(struct ufs_pa_layer_attr *p, char *result)static int ufs_qcom_setup_clocks (struct ufs_hba *hba,bool on) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);int err =0 ;int vote =0 ;
@@ -866,7 +866,7 @@ show_ufs_to_mem_max_bus_bw(struct device *dev, struct device_attribute *attr, char *buf) {struct ufs_hba *hba =dev_get_drvdata (dev); -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);return snprintf (buf,PAGE_SIZE ,"%u\n" , host->bus_vote.is_max_bw_needed);
@@ -877,7 +877,7 @@ store_ufs_to_mem_max_bus_bw(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {struct ufs_hba *hba =dev_get_drvdata (dev); -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);uint32_t value;if (!kstrtou32 (buf,0 , &value)) {
@@ -954,7 +954,7 @@ static int ufs_qcom_init(struct ufs_hba *hba) } host->hba = hba; - hba->priv = (void *)host; +ufshcd_set_variant (hba, host); host->generic_phy =devm_phy_get (dev,"ufsphy" );
@@ -1003,14 +1003,14 @@ out_unregister_bus:phy_exit (host->generic_phy); out_host_free:devm_kfree (dev, host); - hba->priv =NULL ; +ufshcd_set_variant (hba,NULL ); out:return err; }static void ufs_qcom_exit (struct ufs_hba *hba) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);ufs_qcom_disable_lane_clks (host);phy_power_off (host->generic_phy);
@@ -1019,7 +1019,7 @@ static void ufs_qcom_exit(struct ufs_hba *hba)static void ufs_qcom_clk_scale_notify (struct ufs_hba *hba) { -struct ufs_qcom_host *host = hba->priv; +struct ufs_qcom_host *host =ufshcd_get_variant (hba);struct ufs_pa_layer_attr *dev_req_params = &host->dev_req_params;if (!dev_req_params)
drivers/scsi/ufs/ufshcd.h +21 -0
@@ -594,6 +594,27 @@ static inline void check_upiu_size(void) GENERAL_UPIU_REQUEST_SIZE + QUERY_DESC_MAX_SIZE); } +/** +* ufshcd_set_variant - set variant specific data to the hba +* @hba - per adapter instance +* @variant - pointer to variant specific data +*/ +static inline void ufshcd_set_variant (struct ufs_hba *hba,void *variant) +{ +BUG_ON (!hba); + hba->priv = variant; +} + +/** +* ufshcd_get_variant - get variant specific data from the hba +* @hba - per adapter instance +*/ +static inline void *ufshcd_get_variant (struct ufs_hba *hba) +{ +BUG_ON (!hba); +return hba->priv; +} +extern int ufshcd_runtime_suspend (struct ufs_hba *hba);extern int ufshcd_runtime_resume (struct ufs_hba *hba);extern int ufshcd_runtime_idle (struct ufs_hba *hba);
Signature · 4 lines
1.8.5.2 -- QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
PATCH v6 5/8 scsi: ufs: creates wrapper functions for vops
In reply to Yaniv GardiIn order to simplify the code a set of wrapper functions is created to test and call each of the variant operations.
--- drivers/scsi/ufs/ufs-qcom.c | 1 - drivers/scsi/ufs/ufshcd.c | 104 +++++++++++++++++--------------------------- drivers/scsi/ufs/ufshcd.h | 98 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+), 66 deletions(-)
drivers/scsi/ufs/ufs-qcom.c +0 -1
@@ -1049,6 +1049,5 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = { .suspend = ufs_qcom_suspend, .resume = ufs_qcom_resume, }; -EXPORT_SYMBOL (ufs_hba_qcom_vops);MODULE_LICENSE ("GPL v2" );
drivers/scsi/ufs/ufshcd.c +39 -65
211 lines not on this page · raw message
drivers/scsi/ufs/ufshcd.h +98 -0
102 lines not on this page · raw message
Signature · 4 lines
1.8.5.2 -- QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation