* [PATCH v4 1/3] scsi: ufs: Introduce vops for resetting device
2019-08-28 19:17 [PATCH v4 0/3] Qualcomm UFS device reset support Bjorn Andersson
@ 2019-08-28 19:17 ` Bjorn Andersson
2019-09-02 8:39 ` [EXT] " Bean Huo (beanhuo)
2019-08-28 19:17 ` [PATCH v4 2/3] scsi: ufs-qcom: Implement device_reset vops Bjorn Andersson
` (4 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Bjorn Andersson @ 2019-08-28 19:17 UTC (permalink / raw)
To: Alim Akhtar, Avri Altman, Pedro Sousa, James E.J. Bottomley,
Martin K. Petersen
Cc: Rob Herring, Mark Rutland, Andy Gross, Bean Huo, devicetree,
linux-kernel, linux-arm-msm, linux-scsi, Linus Walleij
Some UFS memory devices needs their reset line toggled in order to get
them into a good state for initialization. Provide a new vops to allow
the platform driver to implement this operation.
Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
Changes since v3:
- None
drivers/scsi/ufs/ufshcd.c | 6 ++++++
drivers/scsi/ufs/ufshcd.h | 8 ++++++++
2 files changed, 14 insertions(+)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 219c435d69a7..0fb4bfdd7943 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6235,6 +6235,9 @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba)
int retries = MAX_HOST_RESET_RETRIES;
do {
+ /* Reset the attached device */
+ ufshcd_vops_device_reset(hba);
+
err = ufshcd_host_reset_and_restore(hba);
} while (err && --retries);
@@ -8371,6 +8374,9 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
goto exit_gating;
}
+ /* Reset the attached device */
+ ufshcd_vops_device_reset(hba);
+
/* Host controller enable */
err = ufshcd_hba_enable(hba);
if (err) {
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 9f61550abc7f..c94cfda52829 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -298,6 +298,7 @@ struct ufs_pwr_mode_info {
* @resume: called during host controller PM callback
* @dbg_register_dump: used to dump controller debug information
* @phy_initialization: used to initialize phys
+ * @device_reset: called to issue a reset pulse on the UFS device
*/
struct ufs_hba_variant_ops {
const char *name;
@@ -326,6 +327,7 @@ struct ufs_hba_variant_ops {
int (*resume)(struct ufs_hba *, enum ufs_pm_op);
void (*dbg_register_dump)(struct ufs_hba *hba);
int (*phy_initialization)(struct ufs_hba *);
+ void (*device_reset)(struct ufs_hba *hba);
};
/* clock gating state */
@@ -1070,6 +1072,12 @@ static inline void ufshcd_vops_dbg_register_dump(struct ufs_hba *hba)
hba->vops->dbg_register_dump(hba);
}
+static inline void ufshcd_vops_device_reset(struct ufs_hba *hba)
+{
+ if (hba->vops && hba->vops->device_reset)
+ hba->vops->device_reset(hba);
+}
+
extern struct ufs_pm_lvl_states ufs_pm_lvl_states[];
/*
--
2.18.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* RE: [EXT] [PATCH v4 1/3] scsi: ufs: Introduce vops for resetting device
2019-08-28 19:17 ` [PATCH v4 1/3] scsi: ufs: Introduce vops for resetting device Bjorn Andersson
@ 2019-09-02 8:39 ` Bean Huo (beanhuo)
0 siblings, 0 replies; 9+ messages in thread
From: Bean Huo (beanhuo) @ 2019-09-02 8:39 UTC (permalink / raw)
To: Bjorn Andersson, Alim Akhtar, Avri Altman, Pedro Sousa,
James E.J. Bottomley, Martin K. Petersen
Cc: Rob Herring, Mark Rutland, Andy Gross, devicetree, linux-kernel,
linux-arm-msm, linux-scsi, Linus Walleij
>
>Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com>
>Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Reviewed-by: Bean Huo <beanhuo@micron.com>
//Bean Huo
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v4 2/3] scsi: ufs-qcom: Implement device_reset vops
2019-08-28 19:17 [PATCH v4 0/3] Qualcomm UFS device reset support Bjorn Andersson
2019-08-28 19:17 ` [PATCH v4 1/3] scsi: ufs: Introduce vops for resetting device Bjorn Andersson
@ 2019-08-28 19:17 ` Bjorn Andersson
2019-09-02 13:38 ` Rob Herring
2019-08-28 19:17 ` [PATCH v4 3/3] arm64: dts: qcom: sdm845: Specify UFS device-reset GPIO Bjorn Andersson
` (3 subsequent siblings)
5 siblings, 1 reply; 9+ messages in thread
From: Bjorn Andersson @ 2019-08-28 19:17 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Alim Akhtar, Avri Altman, Pedro Sousa,
James E.J. Bottomley, Martin K. Petersen
Cc: Andy Gross, Bean Huo, devicetree, linux-kernel, linux-arm-msm,
linux-scsi, Linus Walleij
The UFS_RESET pin on Qualcomm SoCs are controlled by TLMM and exposed
through the GPIO framework. Acquire the device-reset GPIO and use this
to implement the device_reset vops, to allow resetting the attached
memory.
Based on downstream support implemented by Subhash Jadavani
<subhashj@codeaurora.org>.
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
Changes since v3:
- Renamed device-reset-gpios to just reset-gpios.
- Explicitly bail on !host->device_reset, to not rely on passing NULL to
gpiod_set_value_cansleep()
.../devicetree/bindings/ufs/ufshcd-pltfrm.txt | 2 ++
drivers/scsi/ufs/ufs-qcom.c | 36 +++++++++++++++++++
drivers/scsi/ufs/ufs-qcom.h | 4 +++
3 files changed, 42 insertions(+)
diff --git a/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt b/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
index a74720486ee2..d78ef63935f9 100644
--- a/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
+++ b/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
@@ -54,6 +54,8 @@ Optional properties:
PHY reset from the UFS controller.
- resets : reset node register
- reset-names : describe reset node register, the "rst" corresponds to reset the whole UFS IP.
+- reset-gpios : A phandle and gpio specifier denoting the GPIO connected
+ to the RESET pin of the UFS memory device.
Note: If above properties are not defined it can be assumed that the supply
regulators or clocks are always on.
diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
index 4473f339cbc0..2200c8434ef3 100644
--- a/drivers/scsi/ufs/ufs-qcom.c
+++ b/drivers/scsi/ufs/ufs-qcom.c
@@ -8,6 +8,7 @@
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/phy/phy.h>
+#include <linux/gpio/consumer.h>
#include <linux/reset-controller.h>
#include "ufshcd.h"
@@ -1140,6 +1141,15 @@ static int ufs_qcom_init(struct ufs_hba *hba)
}
}
+ host->device_reset = devm_gpiod_get_optional(dev, "reset",
+ GPIOD_OUT_HIGH);
+ if (IS_ERR(host->device_reset)) {
+ err = PTR_ERR(host->device_reset);
+ if (err != -EPROBE_DEFER)
+ dev_err(dev, "failed to acquire reset gpio: %d\n", err);
+ goto out_variant_clear;
+ }
+
err = ufs_qcom_bus_register(host);
if (err)
goto out_variant_clear;
@@ -1545,6 +1555,31 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
usleep_range(1000, 1100);
}
+/**
+ * ufs_qcom_device_reset() - toggle the (optional) device reset line
+ * @hba: per-adapter instance
+ *
+ * Toggles the (optional) reset line to reset the attached device.
+ */
+static void ufs_qcom_device_reset(struct ufs_hba *hba)
+{
+ struct ufs_qcom_host *host = ufshcd_get_variant(hba);
+
+ /* reset gpio is optional */
+ if (!host->device_reset)
+ return;
+
+ /*
+ * The UFS device shall detect reset pulses of 1us, sleep for 10us to
+ * be on the safe side.
+ */
+ gpiod_set_value_cansleep(host->device_reset, 1);
+ usleep_range(10, 15);
+
+ gpiod_set_value_cansleep(host->device_reset, 0);
+ usleep_range(10, 15);
+}
+
/**
* struct ufs_hba_qcom_vops - UFS QCOM specific variant operations
*
@@ -1565,6 +1600,7 @@ static const struct ufs_hba_variant_ops ufs_hba_qcom_vops = {
.suspend = ufs_qcom_suspend,
.resume = ufs_qcom_resume,
.dbg_register_dump = ufs_qcom_dump_dbg_regs,
+ .device_reset = ufs_qcom_device_reset,
};
/**
diff --git a/drivers/scsi/ufs/ufs-qcom.h b/drivers/scsi/ufs/ufs-qcom.h
index 001915d1e0e4..d401f174bb70 100644
--- a/drivers/scsi/ufs/ufs-qcom.h
+++ b/drivers/scsi/ufs/ufs-qcom.h
@@ -195,6 +195,8 @@ struct ufs_qcom_testbus {
u8 select_minor;
};
+struct gpio_desc;
+
struct ufs_qcom_host {
/*
* Set this capability if host controller supports the QUniPro mode
@@ -232,6 +234,8 @@ struct ufs_qcom_host {
struct ufs_qcom_testbus testbus;
struct reset_controller_dev rcdev;
+
+ struct gpio_desc *device_reset;
};
static inline u32
--
2.18.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 2/3] scsi: ufs-qcom: Implement device_reset vops
2019-08-28 19:17 ` [PATCH v4 2/3] scsi: ufs-qcom: Implement device_reset vops Bjorn Andersson
@ 2019-09-02 13:38 ` Rob Herring
0 siblings, 0 replies; 9+ messages in thread
From: Rob Herring @ 2019-09-02 13:38 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Mark Rutland, Alim Akhtar, Avri Altman, Pedro Sousa,
James E.J. Bottomley, Martin K. Petersen, Andy Gross, Bean Huo,
devicetree, linux-kernel, linux-arm-msm, linux-scsi,
Linus Walleij
On Wed, 28 Aug 2019 12:17:55 -0700, Bjorn Andersson wrote:
> The UFS_RESET pin on Qualcomm SoCs are controlled by TLMM and exposed
> through the GPIO framework. Acquire the device-reset GPIO and use this
> to implement the device_reset vops, to allow resetting the attached
> memory.
>
> Based on downstream support implemented by Subhash Jadavani
> <subhashj@codeaurora.org>.
>
> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> ---
>
> Changes since v3:
> - Renamed device-reset-gpios to just reset-gpios.
> - Explicitly bail on !host->device_reset, to not rely on passing NULL to
> gpiod_set_value_cansleep()
>
> .../devicetree/bindings/ufs/ufshcd-pltfrm.txt | 2 ++
> drivers/scsi/ufs/ufs-qcom.c | 36 +++++++++++++++++++
> drivers/scsi/ufs/ufs-qcom.h | 4 +++
> 3 files changed, 42 insertions(+)
>
Acked-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v4 3/3] arm64: dts: qcom: sdm845: Specify UFS device-reset GPIO
2019-08-28 19:17 [PATCH v4 0/3] Qualcomm UFS device reset support Bjorn Andersson
2019-08-28 19:17 ` [PATCH v4 1/3] scsi: ufs: Introduce vops for resetting device Bjorn Andersson
2019-08-28 19:17 ` [PATCH v4 2/3] scsi: ufs-qcom: Implement device_reset vops Bjorn Andersson
@ 2019-08-28 19:17 ` Bjorn Andersson
2019-08-30 5:59 ` [PATCH] arm64: dts: qcom: sdm845: Use UFS reset gpio instead of pinctrl Stephen Boyd
` (2 subsequent siblings)
5 siblings, 0 replies; 9+ messages in thread
From: Bjorn Andersson @ 2019-08-28 19:17 UTC (permalink / raw)
To: Rob Herring, Mark Rutland, Andy Gross
Cc: Alim Akhtar, Avri Altman, Pedro Sousa, James E.J. Bottomley,
Martin K. Petersen, Bean Huo, devicetree, linux-kernel,
linux-arm-msm, linux-scsi, Linus Walleij
Specify the UFS device-reset gpio for db845c and mtp, so that the
controller will issue a reset of the UFS device.
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
---
Changes since v3:
- Renamed property
- Added property to db845c
arch/arm64/boot/dts/qcom/sdm845-db845c.dts | 2 ++
arch/arm64/boot/dts/qcom/sdm845-mtp.dts | 2 ++
2 files changed, 4 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts
index 71bd717a4251..f5a85caff1a3 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-db845c.dts
+++ b/arch/arm64/boot/dts/qcom/sdm845-db845c.dts
@@ -497,6 +497,8 @@
&ufs_mem_hc {
status = "okay";
+ reset-gpios = <&tlmm 150 GPIO_ACTIVE_LOW>;
+
vcc-supply = <&vreg_l20a_2p95>;
vcc-max-microamp = <800000>;
};
diff --git a/arch/arm64/boot/dts/qcom/sdm845-mtp.dts b/arch/arm64/boot/dts/qcom/sdm845-mtp.dts
index 2e78638eb73b..c57548b7b250 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-mtp.dts
+++ b/arch/arm64/boot/dts/qcom/sdm845-mtp.dts
@@ -388,6 +388,8 @@
&ufs_mem_hc {
status = "okay";
+ reset-gpios = <&tlmm 150 GPIO_ACTIVE_LOW>;
+
vcc-supply = <&vreg_l20a_2p95>;
vcc-max-microamp = <600000>;
};
--
2.18.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH] arm64: dts: qcom: sdm845: Use UFS reset gpio instead of pinctrl
2019-08-28 19:17 [PATCH v4 0/3] Qualcomm UFS device reset support Bjorn Andersson
` (2 preceding siblings ...)
2019-08-28 19:17 ` [PATCH v4 3/3] arm64: dts: qcom: sdm845: Specify UFS device-reset GPIO Bjorn Andersson
@ 2019-08-30 5:59 ` Stephen Boyd
2019-09-01 6:12 ` [PATCH v4 0/3] Qualcomm UFS device reset support Avri Altman
2019-09-07 20:37 ` Martin K. Petersen
5 siblings, 0 replies; 9+ messages in thread
From: Stephen Boyd @ 2019-08-30 5:59 UTC (permalink / raw)
To: Andy Gross, Bjorn Andersson; +Cc: linux-kernel, linux-arm-msm
We use a pinctrl "workaround" to toggle the UFS reset line. Now that UFS
controller can issue the reset, just specify the line as a GPIO and let
it be reset that way.
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi | 51 +---------------------
1 file changed, 2 insertions(+), 49 deletions(-)
diff --git a/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi b/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi
index 1ebbd568dfd7..611ae48437f1 100644
--- a/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi
+++ b/arch/arm64/boot/dts/qcom/sdm845-cheza.dtsi
@@ -701,9 +701,8 @@ ap_ts_i2c: &i2c14 {
&ufs_mem_hc {
status = "okay";
- pinctrl-names = "init", "default";
- pinctrl-0 = <&ufs_dev_reset_assert>;
- pinctrl-1 = <&ufs_dev_reset_deassert>;
+
+ reset-gpios = <&tlmm 150 GPIO_ACTIVE_LOW>;
vcc-supply = <&src_pp2950_l20a>;
vcc-max-microamp = <600000>;
@@ -1258,52 +1257,6 @@ ap_ts_i2c: &i2c14 {
};
};
- ufs_dev_reset_assert: ufs_dev_reset_assert {
- config {
- pins = "ufs_reset";
- bias-pull-down; /* default: pull down */
- /*
- * UFS_RESET driver strengths are having
- * different values/steps compared to typical
- * GPIO drive strengths.
- *
- * Following table clarifies:
- *
- * HDRV value | UFS_RESET | Typical GPIO
- * (dec) | (mA) | (mA)
- * 0 | 0.8 | 2
- * 1 | 1.55 | 4
- * 2 | 2.35 | 6
- * 3 | 3.1 | 8
- * 4 | 3.9 | 10
- * 5 | 4.65 | 12
- * 6 | 5.4 | 14
- * 7 | 6.15 | 16
- *
- * POR value for UFS_RESET HDRV is 3 which means
- * 3.1mA and we want to use that. Hence just
- * specify 8mA to "drive-strength" binding and
- * that should result into writing 3 to HDRV
- * field.
- */
- drive-strength = <8>; /* default: 3.1 mA */
- output-low; /* active low reset */
- };
- };
-
- ufs_dev_reset_deassert: ufs_dev_reset_deassert {
- config {
- pins = "ufs_reset";
- bias-pull-down; /* default: pull down */
- /*
- * default: 3.1 mA
- * check comments under ufs_dev_reset_assert
- */
- drive-strength = <8>;
- output-high; /* active low reset */
- };
- };
-
ap_suspend_l_assert: ap_suspend_l_assert {
config {
pins = "gpio126";
base-commit: a55aa89aab90fae7c815b0551b07be37db359d76
prerequisite-patch-id: 2f2797d174d16a953446039125978c024c34d497
prerequisite-patch-id: 4020423c7331cee87d7679d325c66bafb56a6b69
prerequisite-patch-id: 46f8bd1aa2aee384021beefc9b6ed7315690f96f
--
Sent by a computer through tubes
^ permalink raw reply related [flat|nested] 9+ messages in thread
* RE: [PATCH v4 0/3] Qualcomm UFS device reset support
2019-08-28 19:17 [PATCH v4 0/3] Qualcomm UFS device reset support Bjorn Andersson
` (3 preceding siblings ...)
2019-08-30 5:59 ` [PATCH] arm64: dts: qcom: sdm845: Use UFS reset gpio instead of pinctrl Stephen Boyd
@ 2019-09-01 6:12 ` Avri Altman
2019-09-07 20:37 ` Martin K. Petersen
5 siblings, 0 replies; 9+ messages in thread
From: Avri Altman @ 2019-09-01 6:12 UTC (permalink / raw)
To: Bjorn Andersson, Rob Herring, Mark Rutland, Andy Gross,
Alim Akhtar, Pedro Sousa, James E.J. Bottomley,
Martin K. Petersen
Cc: Bean Huo, devicetree, linux-kernel, linux-arm-msm, linux-scsi,
Linus Walleij
Hi,
>
> This series adds a new ufs vops to allow platform specific methods for
> resetting an attached UFS device, then implements this for the
> Qualcomm driver.
> This reset seems to be necessary for the majority of Dragonboard845c
> devices.
>
> Bean requested in v3 that a software fallback mechanism, using
> UIC_CMD_DME_END_PT_RST. I have not been successful in validating
> that this
> works for me, so I'm postponing this effort and hoping we can add it
> incrementally at a later time.
This series looks good to me.
Yeah - We can add and test the uic command bail-out once this is accepted.
Thanks,
Avri
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 0/3] Qualcomm UFS device reset support
2019-08-28 19:17 [PATCH v4 0/3] Qualcomm UFS device reset support Bjorn Andersson
` (4 preceding siblings ...)
2019-09-01 6:12 ` [PATCH v4 0/3] Qualcomm UFS device reset support Avri Altman
@ 2019-09-07 20:37 ` Martin K. Petersen
5 siblings, 0 replies; 9+ messages in thread
From: Martin K. Petersen @ 2019-09-07 20:37 UTC (permalink / raw)
To: Bjorn Andersson
Cc: Rob Herring, Mark Rutland, Andy Gross, Alim Akhtar, Avri Altman,
Pedro Sousa, James E.J. Bottomley, Martin K. Petersen, Bean Huo,
devicetree, linux-kernel, linux-arm-msm, linux-scsi,
Linus Walleij
Bjorn,
> This series adds a new ufs vops to allow platform specific methods for
> resetting an attached UFS device, then implements this for the
> Qualcomm driver. This reset seems to be necessary for the majority of
> Dragonboard845c devices.
Applied to 5.4/scsi-queue, thanks!
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 9+ messages in thread