Message ID | 1474038102-20937-1-git-send-email-zach.brown@ni.com |
---|---|
State | Not Applicable, archived |
Headers | show |
On 16/09/16 18:01, 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> Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > drivers/mmc/host/sdhci-of-arasan.c | 27 ++++++++++++++++++++++++++- > drivers/mmc/host/sdhci.h | 2 ++ > 2 files changed, 28 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c > index 33601a8..da8e40a 100644 > --- a/drivers/mmc/host/sdhci-of-arasan.c > +++ b/drivers/mmc/host/sdhci-of-arasan.c > @@ -26,6 +26,7 @@ > #include <linux/phy/phy.h> > #include <linux/regmap.h> > #include "sdhci-pltfm.h" > +#include <linux/of.h> > > #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c > #define SDHCI_ARASAN_VENDOR_REGISTER 0x78 > @@ -98,6 +99,10 @@ struct sdhci_arasan_data { > > struct regmap *soc_ctl_base; > const struct sdhci_arasan_soc_ctl_map *soc_ctl_map; > + unsigned int quirks; /* Arasan deviations from spec */ > + > +/* Controller does not have CD wired and will not function normally without */ > +#define SDHCI_ARASAN_QUIRK_FORCE_CDTEST BIT(0) > }; > > static const struct sdhci_arasan_soc_ctl_map rk3399_soc_ctl_map = { > @@ -245,12 +250,27 @@ static void sdhci_arasan_hs400_enhanced_strobe(struct mmc_host *mmc, > writel(vendor, host->ioaddr + SDHCI_ARASAN_VENDOR_REGISTER); > } > > +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask) > +{ > + u8 ctrl; > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host); > + > + sdhci_reset(host, mask); > + > + if (sdhci_arasan->quirks & SDHCI_ARASAN_QUIRK_FORCE_CDTEST) { > + 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, > }; > > @@ -545,6 +565,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)); > @@ -599,6 +620,10 @@ static int sdhci_arasan_probe(struct platform_device *pdev) > } > > sdhci_get_of_property(pdev); > + > + if (of_property_read_bool(np, "xlnx,fails-without-test-cd")) > + sdhci_arasan->quirks |= SDHCI_ARASAN_QUIRK_FORCE_CDTEST; > + > pltfm_host->clk = clk_xin; > > if (of_device_is_compatible(pdev->dev.of_node, > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h > index a2bc9e1..c722cd2 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 > -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 16 September 2016 at 17:01, Zach Brown <zach.brown@ni.com> 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. > > 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> Thanks, applied for next! I took the liberty to shrink the commit msg header bit and to add "dt: " prefix. Kind regards Uffe > --- > 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 > v5: > * Fixed style mistake > * Changed (1 << 0 ) to BIT(0) > v6: > * Fixed style mistakes > * Condensed unnecessarily long variable names > * Removed line wraps that were no longer necessary. > * Rebased changes off Ulf's mmc tree's next branch. > v7: > * Removed erroneous re-creation of Optional Properties section > * Changed xlnx-fails-without-test-cd to xlnx,fails-without-test-cd > * Changed of_get_property to of_property_read_bool > > > Documentation/devicetree/bindings/mmc/arasan,sdhci.txt | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt > index 3404afa..49df630 100644 > --- a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt > +++ b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt > @@ -36,6 +36,9 @@ Optional Properties: > - #clock-cells: If specified this should be the value <0>. With this property > in place we will export a clock representing the Card Clock. This clock > is expected to be consumed by our PHY. You must also specify > + - 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. > > Example: > sdhci@e0100000 { > -- > 2.7.4 > -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 16 September 2016 at 17:01, Zach Brown <zach.brown@ni.com> 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> Thanks, applied for next! I took the liberty to shrink the commit msg header bit and to add "mmc: " prefix. Kind regards Uffe > --- > drivers/mmc/host/sdhci-of-arasan.c | 27 ++++++++++++++++++++++++++- > drivers/mmc/host/sdhci.h | 2 ++ > 2 files changed, 28 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c > index 33601a8..da8e40a 100644 > --- a/drivers/mmc/host/sdhci-of-arasan.c > +++ b/drivers/mmc/host/sdhci-of-arasan.c > @@ -26,6 +26,7 @@ > #include <linux/phy/phy.h> > #include <linux/regmap.h> > #include "sdhci-pltfm.h" > +#include <linux/of.h> > > #define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c > #define SDHCI_ARASAN_VENDOR_REGISTER 0x78 > @@ -98,6 +99,10 @@ struct sdhci_arasan_data { > > struct regmap *soc_ctl_base; > const struct sdhci_arasan_soc_ctl_map *soc_ctl_map; > + unsigned int quirks; /* Arasan deviations from spec */ > + > +/* Controller does not have CD wired and will not function normally without */ > +#define SDHCI_ARASAN_QUIRK_FORCE_CDTEST BIT(0) > }; > > static const struct sdhci_arasan_soc_ctl_map rk3399_soc_ctl_map = { > @@ -245,12 +250,27 @@ static void sdhci_arasan_hs400_enhanced_strobe(struct mmc_host *mmc, > writel(vendor, host->ioaddr + SDHCI_ARASAN_VENDOR_REGISTER); > } > > +void sdhci_arasan_reset(struct sdhci_host *host, u8 mask) > +{ > + u8 ctrl; > + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); > + struct sdhci_arasan_data *sdhci_arasan = sdhci_pltfm_priv(pltfm_host); > + > + sdhci_reset(host, mask); > + > + if (sdhci_arasan->quirks & SDHCI_ARASAN_QUIRK_FORCE_CDTEST) { > + 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, > }; > > @@ -545,6 +565,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)); > @@ -599,6 +620,10 @@ static int sdhci_arasan_probe(struct platform_device *pdev) > } > > sdhci_get_of_property(pdev); > + > + if (of_property_read_bool(np, "xlnx,fails-without-test-cd")) > + sdhci_arasan->quirks |= SDHCI_ARASAN_QUIRK_FORCE_CDTEST; > + > pltfm_host->clk = clk_xin; > > if (of_device_is_compatible(pdev->dev.of_node, > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h > index a2bc9e1..c722cd2 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt index 3404afa..49df630 100644 --- a/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt +++ b/Documentation/devicetree/bindings/mmc/arasan,sdhci.txt @@ -36,6 +36,9 @@ Optional Properties: - #clock-cells: If specified this should be the value <0>. With this property in place we will export a clock representing the Card Clock. This clock is expected to be consumed by our PHY. You must also specify + - 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. Example: sdhci@e0100000 {
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 v5: * Fixed style mistake * Changed (1 << 0 ) to BIT(0) v6: * Fixed style mistakes * Condensed unnecessarily long variable names * Removed line wraps that were no longer necessary. * Rebased changes off Ulf's mmc tree's next branch. v7: * Removed erroneous re-creation of Optional Properties section * Changed xlnx-fails-without-test-cd to xlnx,fails-without-test-cd * Changed of_get_property to of_property_read_bool Documentation/devicetree/bindings/mmc/arasan,sdhci.txt | 3 +++ 1 file changed, 3 insertions(+)