* [PATCH v4 1/2] sdhci-of-arasan: Add device tree parameter xlnx-fails-without-test-cd bit
@ 2016-09-06 20:34 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-06 20:34 UTC (permalink / raw)
To: adrian.hunter
Cc: robh+dt, ulf.hansson, mark.rutland, linux-mmc, devicetree,
linux-kernel, michal.simek, soren.brinkmann, linux-arm-kernel,
zach.brown
The sdhci controller on xilinx zynq devices will not function unless
the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
In cases where it is impossible to provide the CD bit in hardware,
setting the controller to test mode and then setting inserted to true
will get the controller to function without the CD bit.
The device property "xlnx-fails-without-test-cd" will let the arasan
driver know the controller does not have the CD line wired and that the
controller does not function without it.
Signed-off-by: Zach Brown <zach.brown@ni.com>
---
v2:
* improved commit messages
* removed fake-cd device property
* removed fake-cd quirk
* use broken-cd device property
* documented new usage of broken-cd
v3:
* removed new usage of broken-cd
* created fails-without-test-cd device property
* created arasan controller specific quirk
v4:
* changed fails-without-test-cd to xlnx-fails-without-test-cd
* removed extra blank line
Documentation/devicetree/bindings/mmc/arasan,sdhci.txt | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
index 31b35c3..7407450 100644
--- a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
+++ b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
@@ -17,6 +17,10 @@ Required Properties:
- interrupts: Interrupt specifier
- interrupt-parent: Phandle for the interrupt controller that services
interrupts for this device.
+Optional Properties:
+- xlnx-fails-without-test-cd: when present, the controller doesn't work when
+ the CD line is not connected properly, and the line is not connected
+ properly. Test mode can be used to force the controller to function.
Required Properties for "arasan,sdhci-5.1":
- phys: From PHY bindings: Phandle for the Generic PHY for arasan.
--
2.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 1/2] sdhci-of-arasan: Add device tree parameter xlnx-fails-without-test-cd bit
@ 2016-09-06 20:34 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-06 20:34 UTC (permalink / raw)
To: adrian.hunter-ral2JQCrhuEAvxtiuMwx3w
Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
ulf.hansson-QSEj5FYQhm4dnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
linux-mmc-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
michal.simek-gjFFaj9aHVfQT0dZR+AlfA,
soren.brinkmann-gjFFaj9aHVfQT0dZR+AlfA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
zach.brown-acOepvfBmUk
The sdhci controller on xilinx zynq devices will not function unless
the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
In cases where it is impossible to provide the CD bit in hardware,
setting the controller to test mode and then setting inserted to true
will get the controller to function without the CD bit.
The device property "xlnx-fails-without-test-cd" will let the arasan
driver know the controller does not have the CD line wired and that the
controller does not function without it.
Signed-off-by: Zach Brown <zach.brown-acOepvfBmUk@public.gmane.org>
---
v2:
* improved commit messages
* removed fake-cd device property
* removed fake-cd quirk
* use broken-cd device property
* documented new usage of broken-cd
v3:
* removed new usage of broken-cd
* created fails-without-test-cd device property
* created arasan controller specific quirk
v4:
* changed fails-without-test-cd to xlnx-fails-without-test-cd
* removed extra blank line
Documentation/devicetree/bindings/mmc/arasan,sdhci.txt | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
index 31b35c3..7407450 100644
--- a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
+++ b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
@@ -17,6 +17,10 @@ Required Properties:
- interrupts: Interrupt specifier
- interrupt-parent: Phandle for the interrupt controller that services
interrupts for this device.
+Optional Properties:
+- xlnx-fails-without-test-cd: when present, the controller doesn't work when
+ the CD line is not connected properly, and the line is not connected
+ properly. Test mode can be used to force the controller to function.
Required Properties for "arasan,sdhci-5.1":
- phys: From PHY bindings: Phandle for the Generic PHY for arasan.
--
2.7.4
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 1/2] sdhci-of-arasan: Add device tree parameter xlnx-fails-without-test-cd bit
@ 2016-09-06 20:34 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-06 20:34 UTC (permalink / raw)
To: linux-arm-kernel
The sdhci controller on xilinx zynq devices will not function unless
the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
In cases where it is impossible to provide the CD bit in hardware,
setting the controller to test mode and then setting inserted to true
will get the controller to function without the CD bit.
The device property "xlnx-fails-without-test-cd" will let the arasan
driver know the controller does not have the CD line wired and that the
controller does not function without it.
Signed-off-by: Zach Brown <zach.brown@ni.com>
---
v2:
* improved commit messages
* removed fake-cd device property
* removed fake-cd quirk
* use broken-cd device property
* documented new usage of broken-cd
v3:
* removed new usage of broken-cd
* created fails-without-test-cd device property
* created arasan controller specific quirk
v4:
* changed fails-without-test-cd to xlnx-fails-without-test-cd
* removed extra blank line
Documentation/devicetree/bindings/mmc/arasan,sdhci.txt | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
index 31b35c3..7407450 100644
--- a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
+++ b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt
@@ -17,6 +17,10 @@ Required Properties:
- interrupts: Interrupt specifier
- interrupt-parent: Phandle for the interrupt controller that services
interrupts for this device.
+Optional Properties:
+- xlnx-fails-without-test-cd: when present, the controller doesn't work when
+ the CD line is not connected properly, and the line is not connected
+ properly. Test mode can be used to force the controller to function.
Required Properties for "arasan,sdhci-5.1":
- phys: From PHY bindings: Phandle for the Generic PHY for arasan.
--
2.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
@ 2016-09-06 20:34 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-06 20:34 UTC (permalink / raw)
To: adrian.hunter
Cc: robh+dt, ulf.hansson, mark.rutland, linux-mmc, devicetree,
linux-kernel, michal.simek, soren.brinkmann, linux-arm-kernel,
zach.brown
The sdhci controller on xilinx zynq devices will not function unless
the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
In cases where it is impossible to provide the CD bit in hardware,
setting the controller to test mode and then setting inserted to true
will get the controller to function without the CD bit.
When the device has the property xlnx-fails-without-test-cd the driver
changes the controller to test mode and sets test inserted to true to
make the controller function.
Signed-off-by: Zach Brown <zach.brown@ni.com>
---
drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
drivers/mmc/host/sdhci.h | 2 ++
2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index b6f4c1d..63b0c2a 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -23,6 +23,7 @@
#include <linux/of_device.h>
#include <linux/phy/phy.h>
#include "sdhci-pltfm.h"
+#include <linux/of.h>
#define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
@@ -38,6 +39,10 @@
struct sdhci_arasan_data {
struct clk *clk_ahb;
struct phy *phy;
+ unsigned int arasan_quirks; /* Arasan deviations from spec */
+
+/* Controller does not have CD wired and will not function normally without */
+#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
};
static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
@@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
}
}
+void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
+{
+ u8 ctrl;
+ struct sdhci_pltfm_host *pltfm_host;
+ struct sdhci_arasan_data *sdhci_arasan;
+
+ sdhci_reset(host, mask);
+
+ pltfm_host = sdhci_priv(host);
+ sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
+
+ if (sdhci_arasan->arasan_quirks &
+ SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
+ ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
+ ctrl |= SDHCI_CTRL_CDTEST_INS |
+ SDHCI_CTRL_CDTEST_EN;
+ sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
+ }
+}
+
static struct sdhci_ops sdhci_arasan_ops = {
.set_clock = sdhci_arasan_set_clock,
.get_max_clock = sdhci_pltfm_clk_get_max_clock,
.get_timeout_clock = sdhci_arasan_get_timeout_clock,
.set_bus_width = sdhci_set_bus_width,
- .reset = sdhci_reset,
+ .reset = sdhci_arasan_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling,
};
@@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
struct sdhci_host *host;
struct sdhci_pltfm_host *pltfm_host;
struct sdhci_arasan_data *sdhci_arasan;
+ struct device_node *np = pdev->dev.of_node;
host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
sizeof(*sdhci_arasan));
@@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
}
sdhci_get_of_property(pdev);
+
+ if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
+ sdhci_arasan->arasan_quirks |=
+ SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
+ }
+
pltfm_host->clk = clk_xin;
ret = mmc_of_parse(host->mmc);
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 609f87c..ac0ba18 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -84,6 +84,8 @@
#define SDHCI_CTRL_ADMA32 0x10
#define SDHCI_CTRL_ADMA64 0x18
#define SDHCI_CTRL_8BITBUS 0x20
+#define SDHCI_CTRL_CDTEST_INS 0x40
+#define SDHCI_CTRL_CDTEST_EN 0x80
#define SDHCI_POWER_CONTROL 0x29
#define SDHCI_POWER_ON 0x01
--
2.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
@ 2016-09-06 20:34 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-06 20:34 UTC (permalink / raw)
To: adrian.hunter-ral2JQCrhuEAvxtiuMwx3w
Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A,
ulf.hansson-QSEj5FYQhm4dnm+yROfE0A, mark.rutland-5wv7dgnIgG8,
linux-mmc-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
michal.simek-gjFFaj9aHVfQT0dZR+AlfA,
soren.brinkmann-gjFFaj9aHVfQT0dZR+AlfA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
zach.brown-acOepvfBmUk
The sdhci controller on xilinx zynq devices will not function unless
the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
In cases where it is impossible to provide the CD bit in hardware,
setting the controller to test mode and then setting inserted to true
will get the controller to function without the CD bit.
When the device has the property xlnx-fails-without-test-cd the driver
changes the controller to test mode and sets test inserted to true to
make the controller function.
Signed-off-by: Zach Brown <zach.brown-acOepvfBmUk@public.gmane.org>
---
drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
drivers/mmc/host/sdhci.h | 2 ++
2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index b6f4c1d..63b0c2a 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -23,6 +23,7 @@
#include <linux/of_device.h>
#include <linux/phy/phy.h>
#include "sdhci-pltfm.h"
+#include <linux/of.h>
#define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
@@ -38,6 +39,10 @@
struct sdhci_arasan_data {
struct clk *clk_ahb;
struct phy *phy;
+ unsigned int arasan_quirks; /* Arasan deviations from spec */
+
+/* Controller does not have CD wired and will not function normally without */
+#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
};
static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
@@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
}
}
+void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
+{
+ u8 ctrl;
+ struct sdhci_pltfm_host *pltfm_host;
+ struct sdhci_arasan_data *sdhci_arasan;
+
+ sdhci_reset(host, mask);
+
+ pltfm_host = sdhci_priv(host);
+ sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
+
+ if (sdhci_arasan->arasan_quirks &
+ SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
+ ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
+ ctrl |= SDHCI_CTRL_CDTEST_INS |
+ SDHCI_CTRL_CDTEST_EN;
+ sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
+ }
+}
+
static struct sdhci_ops sdhci_arasan_ops = {
.set_clock = sdhci_arasan_set_clock,
.get_max_clock = sdhci_pltfm_clk_get_max_clock,
.get_timeout_clock = sdhci_arasan_get_timeout_clock,
.set_bus_width = sdhci_set_bus_width,
- .reset = sdhci_reset,
+ .reset = sdhci_arasan_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling,
};
@@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
struct sdhci_host *host;
struct sdhci_pltfm_host *pltfm_host;
struct sdhci_arasan_data *sdhci_arasan;
+ struct device_node *np = pdev->dev.of_node;
host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
sizeof(*sdhci_arasan));
@@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
}
sdhci_get_of_property(pdev);
+
+ if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
+ sdhci_arasan->arasan_quirks |=
+ SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
+ }
+
pltfm_host->clk = clk_xin;
ret = mmc_of_parse(host->mmc);
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 609f87c..ac0ba18 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -84,6 +84,8 @@
#define SDHCI_CTRL_ADMA32 0x10
#define SDHCI_CTRL_ADMA64 0x18
#define SDHCI_CTRL_8BITBUS 0x20
+#define SDHCI_CTRL_CDTEST_INS 0x40
+#define SDHCI_CTRL_CDTEST_EN 0x80
#define SDHCI_POWER_CONTROL 0x29
#define SDHCI_POWER_ON 0x01
--
2.7.4
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
@ 2016-09-06 20:34 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-06 20:34 UTC (permalink / raw)
To: linux-arm-kernel
The sdhci controller on xilinx zynq devices will not function unless
the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
In cases where it is impossible to provide the CD bit in hardware,
setting the controller to test mode and then setting inserted to true
will get the controller to function without the CD bit.
When the device has the property xlnx-fails-without-test-cd the driver
changes the controller to test mode and sets test inserted to true to
make the controller function.
Signed-off-by: Zach Brown <zach.brown@ni.com>
---
drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
drivers/mmc/host/sdhci.h | 2 ++
2 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
index b6f4c1d..63b0c2a 100644
--- a/drivers/mmc/host/sdhci-of-arasan.c
+++ b/drivers/mmc/host/sdhci-of-arasan.c
@@ -23,6 +23,7 @@
#include <linux/of_device.h>
#include <linux/phy/phy.h>
#include "sdhci-pltfm.h"
+#include <linux/of.h>
#define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
@@ -38,6 +39,10 @@
struct sdhci_arasan_data {
struct clk *clk_ahb;
struct phy *phy;
+ unsigned int arasan_quirks; /* Arasan deviations from spec */
+
+/* Controller does not have CD wired and will not function normally without */
+#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
};
static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
@@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
}
}
+void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
+{
+ u8 ctrl;
+ struct sdhci_pltfm_host *pltfm_host;
+ struct sdhci_arasan_data *sdhci_arasan;
+
+ sdhci_reset(host, mask);
+
+ pltfm_host = sdhci_priv(host);
+ sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
+
+ if (sdhci_arasan->arasan_quirks &
+ SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
+ ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
+ ctrl |= SDHCI_CTRL_CDTEST_INS |
+ SDHCI_CTRL_CDTEST_EN;
+ sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
+ }
+}
+
static struct sdhci_ops sdhci_arasan_ops = {
.set_clock = sdhci_arasan_set_clock,
.get_max_clock = sdhci_pltfm_clk_get_max_clock,
.get_timeout_clock = sdhci_arasan_get_timeout_clock,
.set_bus_width = sdhci_set_bus_width,
- .reset = sdhci_reset,
+ .reset = sdhci_arasan_reset,
.set_uhs_signaling = sdhci_set_uhs_signaling,
};
@@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
struct sdhci_host *host;
struct sdhci_pltfm_host *pltfm_host;
struct sdhci_arasan_data *sdhci_arasan;
+ struct device_node *np = pdev->dev.of_node;
host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
sizeof(*sdhci_arasan));
@@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
}
sdhci_get_of_property(pdev);
+
+ if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
+ sdhci_arasan->arasan_quirks |=
+ SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
+ }
+
pltfm_host->clk = clk_xin;
ret = mmc_of_parse(host->mmc);
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 609f87c..ac0ba18 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -84,6 +84,8 @@
#define SDHCI_CTRL_ADMA32 0x10
#define SDHCI_CTRL_ADMA64 0x18
#define SDHCI_CTRL_8BITBUS 0x20
+#define SDHCI_CTRL_CDTEST_INS 0x40
+#define SDHCI_CTRL_CDTEST_EN 0x80
#define SDHCI_POWER_CONTROL 0x29
#define SDHCI_POWER_ON 0x01
--
2.7.4
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
2016-09-06 20:34 ` Zach Brown
(?)
@ 2016-09-07 5:15 ` Michal Simek
-1 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2016-09-07 5:15 UTC (permalink / raw)
To: Zach Brown, adrian.hunter
Cc: robh+dt, ulf.hansson, mark.rutland, linux-mmc, devicetree,
linux-kernel, michal.simek, soren.brinkmann, linux-arm-kernel
On 6.9.2016 22:34, Zach Brown wrote:
> The sdhci controller on xilinx zynq devices will not function unless
> the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
> In cases where it is impossible to provide the CD bit in hardware,
> setting the controller to test mode and then setting inserted to true
> will get the controller to function without the CD bit.
>
> When the device has the property xlnx-fails-without-test-cd the driver
> changes the controller to test mode and sets test inserted to true to
> make the controller function.
>
> Signed-off-by: Zach Brown <zach.brown@ni.com>
> ---
> drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
> drivers/mmc/host/sdhci.h | 2 ++
> 2 files changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
> index b6f4c1d..63b0c2a 100644
> --- a/drivers/mmc/host/sdhci-of-arasan.c
> +++ b/drivers/mmc/host/sdhci-of-arasan.c
> @@ -23,6 +23,7 @@
> #include <linux/of_device.h>
> #include <linux/phy/phy.h>
> #include "sdhci-pltfm.h"
> +#include <linux/of.h>
>
> #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
>
> @@ -38,6 +39,10 @@
> struct sdhci_arasan_data {
> struct clk *clk_ahb;
> struct phy *phy;
> + unsigned int arasan_quirks; /* Arasan deviations from spec */
> +
> +/* Controller does not have CD wired and will not function normally without */
> +#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
Also here. If it is fine not to use BIT macro here you should at least
fix coding style (1 << 0)
> };
>
> static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
> @@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
> }
> }
>
> +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
> +{
> + u8 ctrl;
> + struct sdhci_pltfm_host *pltfm_host;
> + struct sdhci_arasan_data *sdhci_arasan;
> +
> + sdhci_reset(host, mask);
> +
> + pltfm_host = sdhci_priv(host);
> + sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
> +
> + if (sdhci_arasan->arasan_quirks &
> + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
> + ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
> + ctrl |= SDHCI_CTRL_CDTEST_INS |
> + SDHCI_CTRL_CDTEST_EN;
> + sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
> + }
> +}
> +
> static struct sdhci_ops sdhci_arasan_ops = {
> .set_clock = sdhci_arasan_set_clock,
> .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> .get_timeout_clock = sdhci_arasan_get_timeout_clock,
> .set_bus_width = sdhci_set_bus_width,
> - .reset = sdhci_reset,
> + .reset = sdhci_arasan_reset,
> .set_uhs_signaling = sdhci_set_uhs_signaling,
> };
>
> @@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> struct sdhci_host *host;
> struct sdhci_pltfm_host *pltfm_host;
> struct sdhci_arasan_data *sdhci_arasan;
> + struct device_node *np = pdev->dev.of_node;
>
> host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
> sizeof(*sdhci_arasan));
> @@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> }
>
> sdhci_get_of_property(pdev);
> +
> + if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
> + sdhci_arasan->arasan_quirks |=
> + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
> + }
> +
> pltfm_host->clk = clk_xin;
>
> ret = mmc_of_parse(host->mmc);
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index 609f87c..ac0ba18 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -84,6 +84,8 @@
> #define SDHCI_CTRL_ADMA32 0x10
> #define SDHCI_CTRL_ADMA64 0x18
> #define SDHCI_CTRL_8BITBUS 0x20
> +#define SDHCI_CTRL_CDTEST_INS 0x40
> +#define SDHCI_CTRL_CDTEST_EN 0x80
The issue is still present here.
Thanks,
Michal
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
@ 2016-09-07 5:15 ` Michal Simek
0 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2016-09-07 5:15 UTC (permalink / raw)
To: Zach Brown, adrian.hunter
Cc: robh+dt, ulf.hansson, mark.rutland, linux-mmc, devicetree,
linux-kernel, michal.simek, soren.brinkmann, linux-arm-kernel
On 6.9.2016 22:34, Zach Brown wrote:
> The sdhci controller on xilinx zynq devices will not function unless
> the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
> In cases where it is impossible to provide the CD bit in hardware,
> setting the controller to test mode and then setting inserted to true
> will get the controller to function without the CD bit.
>
> When the device has the property xlnx-fails-without-test-cd the driver
> changes the controller to test mode and sets test inserted to true to
> make the controller function.
>
> Signed-off-by: Zach Brown <zach.brown@ni.com>
> ---
> drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
> drivers/mmc/host/sdhci.h | 2 ++
> 2 files changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
> index b6f4c1d..63b0c2a 100644
> --- a/drivers/mmc/host/sdhci-of-arasan.c
> +++ b/drivers/mmc/host/sdhci-of-arasan.c
> @@ -23,6 +23,7 @@
> #include <linux/of_device.h>
> #include <linux/phy/phy.h>
> #include "sdhci-pltfm.h"
> +#include <linux/of.h>
>
> #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
>
> @@ -38,6 +39,10 @@
> struct sdhci_arasan_data {
> struct clk *clk_ahb;
> struct phy *phy;
> + unsigned int arasan_quirks; /* Arasan deviations from spec */
> +
> +/* Controller does not have CD wired and will not function normally without */
> +#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
Also here. If it is fine not to use BIT macro here you should at least
fix coding style (1 << 0)
> };
>
> static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
> @@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
> }
> }
>
> +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
> +{
> + u8 ctrl;
> + struct sdhci_pltfm_host *pltfm_host;
> + struct sdhci_arasan_data *sdhci_arasan;
> +
> + sdhci_reset(host, mask);
> +
> + pltfm_host = sdhci_priv(host);
> + sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
> +
> + if (sdhci_arasan->arasan_quirks &
> + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
> + ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
> + ctrl |= SDHCI_CTRL_CDTEST_INS |
> + SDHCI_CTRL_CDTEST_EN;
> + sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
> + }
> +}
> +
> static struct sdhci_ops sdhci_arasan_ops = {
> .set_clock = sdhci_arasan_set_clock,
> .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> .get_timeout_clock = sdhci_arasan_get_timeout_clock,
> .set_bus_width = sdhci_set_bus_width,
> - .reset = sdhci_reset,
> + .reset = sdhci_arasan_reset,
> .set_uhs_signaling = sdhci_set_uhs_signaling,
> };
>
> @@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> struct sdhci_host *host;
> struct sdhci_pltfm_host *pltfm_host;
> struct sdhci_arasan_data *sdhci_arasan;
> + struct device_node *np = pdev->dev.of_node;
>
> host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
> sizeof(*sdhci_arasan));
> @@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> }
>
> sdhci_get_of_property(pdev);
> +
> + if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
> + sdhci_arasan->arasan_quirks |=
> + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
> + }
> +
> pltfm_host->clk = clk_xin;
>
> ret = mmc_of_parse(host->mmc);
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index 609f87c..ac0ba18 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -84,6 +84,8 @@
> #define SDHCI_CTRL_ADMA32 0x10
> #define SDHCI_CTRL_ADMA64 0x18
> #define SDHCI_CTRL_8BITBUS 0x20
> +#define SDHCI_CTRL_CDTEST_INS 0x40
> +#define SDHCI_CTRL_CDTEST_EN 0x80
The issue is still present here.
Thanks,
Michal
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
@ 2016-09-07 5:15 ` Michal Simek
0 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2016-09-07 5:15 UTC (permalink / raw)
To: linux-arm-kernel
On 6.9.2016 22:34, Zach Brown wrote:
> The sdhci controller on xilinx zynq devices will not function unless
> the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
> In cases where it is impossible to provide the CD bit in hardware,
> setting the controller to test mode and then setting inserted to true
> will get the controller to function without the CD bit.
>
> When the device has the property xlnx-fails-without-test-cd the driver
> changes the controller to test mode and sets test inserted to true to
> make the controller function.
>
> Signed-off-by: Zach Brown <zach.brown@ni.com>
> ---
> drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
> drivers/mmc/host/sdhci.h | 2 ++
> 2 files changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
> index b6f4c1d..63b0c2a 100644
> --- a/drivers/mmc/host/sdhci-of-arasan.c
> +++ b/drivers/mmc/host/sdhci-of-arasan.c
> @@ -23,6 +23,7 @@
> #include <linux/of_device.h>
> #include <linux/phy/phy.h>
> #include "sdhci-pltfm.h"
> +#include <linux/of.h>
>
> #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
>
> @@ -38,6 +39,10 @@
> struct sdhci_arasan_data {
> struct clk *clk_ahb;
> struct phy *phy;
> + unsigned int arasan_quirks; /* Arasan deviations from spec */
> +
> +/* Controller does not have CD wired and will not function normally without */
> +#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
Also here. If it is fine not to use BIT macro here you should@least
fix coding style (1 << 0)
> };
>
> static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
> @@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
> }
> }
>
> +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
> +{
> + u8 ctrl;
> + struct sdhci_pltfm_host *pltfm_host;
> + struct sdhci_arasan_data *sdhci_arasan;
> +
> + sdhci_reset(host, mask);
> +
> + pltfm_host = sdhci_priv(host);
> + sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
> +
> + if (sdhci_arasan->arasan_quirks &
> + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
> + ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
> + ctrl |= SDHCI_CTRL_CDTEST_INS |
> + SDHCI_CTRL_CDTEST_EN;
> + sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
> + }
> +}
> +
> static struct sdhci_ops sdhci_arasan_ops = {
> .set_clock = sdhci_arasan_set_clock,
> .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> .get_timeout_clock = sdhci_arasan_get_timeout_clock,
> .set_bus_width = sdhci_set_bus_width,
> - .reset = sdhci_reset,
> + .reset = sdhci_arasan_reset,
> .set_uhs_signaling = sdhci_set_uhs_signaling,
> };
>
> @@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> struct sdhci_host *host;
> struct sdhci_pltfm_host *pltfm_host;
> struct sdhci_arasan_data *sdhci_arasan;
> + struct device_node *np = pdev->dev.of_node;
>
> host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
> sizeof(*sdhci_arasan));
> @@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> }
>
> sdhci_get_of_property(pdev);
> +
> + if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
> + sdhci_arasan->arasan_quirks |=
> + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
> + }
> +
> pltfm_host->clk = clk_xin;
>
> ret = mmc_of_parse(host->mmc);
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index 609f87c..ac0ba18 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -84,6 +84,8 @@
> #define SDHCI_CTRL_ADMA32 0x10
> #define SDHCI_CTRL_ADMA64 0x18
> #define SDHCI_CTRL_8BITBUS 0x20
> +#define SDHCI_CTRL_CDTEST_INS 0x40
> +#define SDHCI_CTRL_CDTEST_EN 0x80
The issue is still present here.
Thanks,
Michal
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
2016-09-07 5:15 ` Michal Simek
(?)
@ 2016-09-07 16:06 ` Zach Brown
-1 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-07 16:06 UTC (permalink / raw)
To: Michal Simek
Cc: adrian.hunter, robh+dt, ulf.hansson, mark.rutland, linux-mmc,
devicetree, linux-kernel, soren.brinkmann, linux-arm-kernel
On Wed, Sep 07, 2016 at 07:15:02AM +0200, Michal Simek wrote:
> On 6.9.2016 22:34, Zach Brown wrote:
> > The sdhci controller on xilinx zynq devices will not function unless
> > the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
> > In cases where it is impossible to provide the CD bit in hardware,
> > setting the controller to test mode and then setting inserted to true
> > will get the controller to function without the CD bit.
> >
> > When the device has the property xlnx-fails-without-test-cd the driver
> > changes the controller to test mode and sets test inserted to true to
> > make the controller function.
> >
> > Signed-off-by: Zach Brown <zach.brown@ni.com>
> > ---
> > drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
> > drivers/mmc/host/sdhci.h | 2 ++
> > 2 files changed, 35 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
> > index b6f4c1d..63b0c2a 100644
> > --- a/drivers/mmc/host/sdhci-of-arasan.c
> > +++ b/drivers/mmc/host/sdhci-of-arasan.c
> > @@ -23,6 +23,7 @@
> > #include <linux/of_device.h>
> > #include <linux/phy/phy.h>
> > #include "sdhci-pltfm.h"
> > +#include <linux/of.h>
> >
> > #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
> >
> > @@ -38,6 +39,10 @@
> > struct sdhci_arasan_data {
> > struct clk *clk_ahb;
> > struct phy *phy;
> > + unsigned int arasan_quirks; /* Arasan deviations from spec */
> > +
> > +/* Controller does not have CD wired and will not function normally without */
> > +#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
>
> Also here. If it is fine not to use BIT macro here you should at least
> fix coding style (1 << 0)
>
>
> > };
I'll make sure to fix that if I end up not using the BIT macro. Thank you.
> >
> > static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
> > @@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
> > }
> > }
> >
> > +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
> > +{
> > + u8 ctrl;
> > + struct sdhci_pltfm_host *pltfm_host;
> > + struct sdhci_arasan_data *sdhci_arasan;
> > +
> > + sdhci_reset(host, mask);
> > +
> > + pltfm_host = sdhci_priv(host);
> > + sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
> > +
> > + if (sdhci_arasan->arasan_quirks &
> > + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
> > + ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
> > + ctrl |= SDHCI_CTRL_CDTEST_INS |
> > + SDHCI_CTRL_CDTEST_EN;
> > + sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
> > + }
> > +}
> > +
> > static struct sdhci_ops sdhci_arasan_ops = {
> > .set_clock = sdhci_arasan_set_clock,
> > .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> > .get_timeout_clock = sdhci_arasan_get_timeout_clock,
> > .set_bus_width = sdhci_set_bus_width,
> > - .reset = sdhci_reset,
> > + .reset = sdhci_arasan_reset,
> > .set_uhs_signaling = sdhci_set_uhs_signaling,
> > };
> >
> > @@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> > struct sdhci_host *host;
> > struct sdhci_pltfm_host *pltfm_host;
> > struct sdhci_arasan_data *sdhci_arasan;
> > + struct device_node *np = pdev->dev.of_node;
> >
> > host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
> > sizeof(*sdhci_arasan));
> > @@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> > }
> >
> > sdhci_get_of_property(pdev);
> > +
> > + if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
> > + sdhci_arasan->arasan_quirks |=
> > + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
> > + }
> > +
> > pltfm_host->clk = clk_xin;
> >
> > ret = mmc_of_parse(host->mmc);
> > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> > index 609f87c..ac0ba18 100644
> > --- a/drivers/mmc/host/sdhci.h
> > +++ b/drivers/mmc/host/sdhci.h
> > @@ -84,6 +84,8 @@
> > #define SDHCI_CTRL_ADMA32 0x10
> > #define SDHCI_CTRL_ADMA64 0x18
> > #define SDHCI_CTRL_8BITBUS 0x20
> > +#define SDHCI_CTRL_CDTEST_INS 0x40
> > +#define SDHCI_CTRL_CDTEST_EN 0x80
>
> The issue is still present here.
>
Sorry for not getting it last time. Your last email cleared it up for me. I
have corrected the issue with my editor. The style will be fixed in the next
version. Thank you for pointing it out.
> Thanks,
> Michal
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
@ 2016-09-07 16:06 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-07 16:06 UTC (permalink / raw)
To: Michal Simek
Cc: adrian.hunter, robh+dt, ulf.hansson, mark.rutland, linux-mmc,
devicetree, linux-kernel, soren.brinkmann, linux-arm-kernel
On Wed, Sep 07, 2016 at 07:15:02AM +0200, Michal Simek wrote:
> On 6.9.2016 22:34, Zach Brown wrote:
> > The sdhci controller on xilinx zynq devices will not function unless
> > the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
> > In cases where it is impossible to provide the CD bit in hardware,
> > setting the controller to test mode and then setting inserted to true
> > will get the controller to function without the CD bit.
> >
> > When the device has the property xlnx-fails-without-test-cd the driver
> > changes the controller to test mode and sets test inserted to true to
> > make the controller function.
> >
> > Signed-off-by: Zach Brown <zach.brown@ni.com>
> > ---
> > drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
> > drivers/mmc/host/sdhci.h | 2 ++
> > 2 files changed, 35 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
> > index b6f4c1d..63b0c2a 100644
> > --- a/drivers/mmc/host/sdhci-of-arasan.c
> > +++ b/drivers/mmc/host/sdhci-of-arasan.c
> > @@ -23,6 +23,7 @@
> > #include <linux/of_device.h>
> > #include <linux/phy/phy.h>
> > #include "sdhci-pltfm.h"
> > +#include <linux/of.h>
> >
> > #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
> >
> > @@ -38,6 +39,10 @@
> > struct sdhci_arasan_data {
> > struct clk *clk_ahb;
> > struct phy *phy;
> > + unsigned int arasan_quirks; /* Arasan deviations from spec */
> > +
> > +/* Controller does not have CD wired and will not function normally without */
> > +#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
>
> Also here. If it is fine not to use BIT macro here you should at least
> fix coding style (1 << 0)
>
>
> > };
I'll make sure to fix that if I end up not using the BIT macro. Thank you.
> >
> > static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
> > @@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
> > }
> > }
> >
> > +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
> > +{
> > + u8 ctrl;
> > + struct sdhci_pltfm_host *pltfm_host;
> > + struct sdhci_arasan_data *sdhci_arasan;
> > +
> > + sdhci_reset(host, mask);
> > +
> > + pltfm_host = sdhci_priv(host);
> > + sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
> > +
> > + if (sdhci_arasan->arasan_quirks &
> > + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
> > + ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
> > + ctrl |= SDHCI_CTRL_CDTEST_INS |
> > + SDHCI_CTRL_CDTEST_EN;
> > + sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
> > + }
> > +}
> > +
> > static struct sdhci_ops sdhci_arasan_ops = {
> > .set_clock = sdhci_arasan_set_clock,
> > .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> > .get_timeout_clock = sdhci_arasan_get_timeout_clock,
> > .set_bus_width = sdhci_set_bus_width,
> > - .reset = sdhci_reset,
> > + .reset = sdhci_arasan_reset,
> > .set_uhs_signaling = sdhci_set_uhs_signaling,
> > };
> >
> > @@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> > struct sdhci_host *host;
> > struct sdhci_pltfm_host *pltfm_host;
> > struct sdhci_arasan_data *sdhci_arasan;
> > + struct device_node *np = pdev->dev.of_node;
> >
> > host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
> > sizeof(*sdhci_arasan));
> > @@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> > }
> >
> > sdhci_get_of_property(pdev);
> > +
> > + if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
> > + sdhci_arasan->arasan_quirks |=
> > + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
> > + }
> > +
> > pltfm_host->clk = clk_xin;
> >
> > ret = mmc_of_parse(host->mmc);
> > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> > index 609f87c..ac0ba18 100644
> > --- a/drivers/mmc/host/sdhci.h
> > +++ b/drivers/mmc/host/sdhci.h
> > @@ -84,6 +84,8 @@
> > #define SDHCI_CTRL_ADMA32 0x10
> > #define SDHCI_CTRL_ADMA64 0x18
> > #define SDHCI_CTRL_8BITBUS 0x20
> > +#define SDHCI_CTRL_CDTEST_INS 0x40
> > +#define SDHCI_CTRL_CDTEST_EN 0x80
>
> The issue is still present here.
>
Sorry for not getting it last time. Your last email cleared it up for me. I
have corrected the issue with my editor. The style will be fixed in the next
version. Thank you for pointing it out.
> Thanks,
> Michal
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present
@ 2016-09-07 16:06 ` Zach Brown
0 siblings, 0 replies; 12+ messages in thread
From: Zach Brown @ 2016-09-07 16:06 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Sep 07, 2016 at 07:15:02AM +0200, Michal Simek wrote:
> On 6.9.2016 22:34, Zach Brown wrote:
> > The sdhci controller on xilinx zynq devices will not function unless
> > the CD bit is provided. http://www.xilinx.com/support/answers/61064.html
> > In cases where it is impossible to provide the CD bit in hardware,
> > setting the controller to test mode and then setting inserted to true
> > will get the controller to function without the CD bit.
> >
> > When the device has the property xlnx-fails-without-test-cd the driver
> > changes the controller to test mode and sets test inserted to true to
> > make the controller function.
> >
> > Signed-off-by: Zach Brown <zach.brown@ni.com>
> > ---
> > drivers/mmc/host/sdhci-of-arasan.c | 34 +++++++++++++++++++++++++++++++++-
> > drivers/mmc/host/sdhci.h | 2 ++
> > 2 files changed, 35 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c
> > index b6f4c1d..63b0c2a 100644
> > --- a/drivers/mmc/host/sdhci-of-arasan.c
> > +++ b/drivers/mmc/host/sdhci-of-arasan.c
> > @@ -23,6 +23,7 @@
> > #include <linux/of_device.h>
> > #include <linux/phy/phy.h>
> > #include "sdhci-pltfm.h"
> > +#include <linux/of.h>
> >
> > #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c
> >
> > @@ -38,6 +39,10 @@
> > struct sdhci_arasan_data {
> > struct clk *clk_ahb;
> > struct phy *phy;
> > + unsigned int arasan_quirks; /* Arasan deviations from spec */
> > +
> > +/* Controller does not have CD wired and will not function normally without */
> > +#define SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD (1<<0)
>
> Also here. If it is fine not to use BIT macro here you should at least
> fix coding style (1 << 0)
>
>
> > };
I'll make sure to fix that if I end up not using the BIT macro. Thank you.
> >
> > static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host)
> > @@ -79,12 +84,32 @@ static void sdhci_arasan_set_clock(struct sdhci_host *host, unsigned int clock)
> > }
> > }
> >
> > +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask)
> > +{
> > + u8 ctrl;
> > + struct sdhci_pltfm_host *pltfm_host;
> > + struct sdhci_arasan_data *sdhci_arasan;
> > +
> > + sdhci_reset(host, mask);
> > +
> > + pltfm_host = sdhci_priv(host);
> > + sdhci_arasan = sdhci_pltfm_priv(pltfm_host);
> > +
> > + if (sdhci_arasan->arasan_quirks &
> > + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD) {
> > + ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
> > + ctrl |= SDHCI_CTRL_CDTEST_INS |
> > + SDHCI_CTRL_CDTEST_EN;
> > + sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
> > + }
> > +}
> > +
> > static struct sdhci_ops sdhci_arasan_ops = {
> > .set_clock = sdhci_arasan_set_clock,
> > .get_max_clock = sdhci_pltfm_clk_get_max_clock,
> > .get_timeout_clock = sdhci_arasan_get_timeout_clock,
> > .set_bus_width = sdhci_set_bus_width,
> > - .reset = sdhci_reset,
> > + .reset = sdhci_arasan_reset,
> > .set_uhs_signaling = sdhci_set_uhs_signaling,
> > };
> >
> > @@ -179,6 +204,7 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> > struct sdhci_host *host;
> > struct sdhci_pltfm_host *pltfm_host;
> > struct sdhci_arasan_data *sdhci_arasan;
> > + struct device_node *np = pdev->dev.of_node;
> >
> > host = sdhci_pltfm_init(pdev, &sdhci_arasan_pdata,
> > sizeof(*sdhci_arasan));
> > @@ -215,6 +241,12 @@ static int sdhci_arasan_probe(struct platform_device *pdev)
> > }
> >
> > sdhci_get_of_property(pdev);
> > +
> > + if (of_get_property(np, "xlnx-fails-without-test-cd", NULL)) {
> > + sdhci_arasan->arasan_quirks |=
> > + SDHCI_ARASAN_QUIRK_FAILS_WITHOUT_TEST_CD;
> > + }
> > +
> > pltfm_host->clk = clk_xin;
> >
> > ret = mmc_of_parse(host->mmc);
> > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> > index 609f87c..ac0ba18 100644
> > --- a/drivers/mmc/host/sdhci.h
> > +++ b/drivers/mmc/host/sdhci.h
> > @@ -84,6 +84,8 @@
> > #define SDHCI_CTRL_ADMA32 0x10
> > #define SDHCI_CTRL_ADMA64 0x18
> > #define SDHCI_CTRL_8BITBUS 0x20
> > +#define SDHCI_CTRL_CDTEST_INS 0x40
> > +#define SDHCI_CTRL_CDTEST_EN 0x80
>
> The issue is still present here.
>
Sorry for not getting it last time. Your last email cleared it up for me. I
have corrected the issue with my editor. The style will be fixed in the next
version. Thank you for pointing it out.
> Thanks,
> Michal
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-09-07 16:06 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-06 20:34 [PATCH v4 1/2] sdhci-of-arasan: Add device tree parameter xlnx-fails-without-test-cd bit Zach Brown
2016-09-06 20:34 ` Zach Brown
2016-09-06 20:34 ` Zach Brown
2016-09-06 20:34 ` [PATCH v4 2/2] sdhci-of-arasan: Set controller to test mode when xlnx-fails-without-test-cd is present Zach Brown
2016-09-06 20:34 ` Zach Brown
2016-09-06 20:34 ` Zach Brown
2016-09-07 5:15 ` Michal Simek
2016-09-07 5:15 ` Michal Simek
2016-09-07 5:15 ` Michal Simek
2016-09-07 16:06 ` Zach Brown
2016-09-07 16:06 ` Zach Brown
2016-09-07 16:06 ` Zach Brown
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.