* [PATCH V3 0/2] Add SDHCI driver for Broadcom BRCMSTB/BMIPS Soc's
@ 2016-02-10 20:25 Al Cooper
2016-02-10 20:25 ` [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps Al Cooper
2016-02-10 20:25 ` [PATCH V3 2/2] mmc: sdhci-brcmstb: Add driver for Broadcom BRCMSTB SoCs Al Cooper
0 siblings, 2 replies; 5+ messages in thread
From: Al Cooper @ 2016-02-10 20:25 UTC (permalink / raw)
To: ulf.hansson, adrian.hunter, linux-mmc, bcm-kernel-feedback-list; +Cc: Al Cooper
V3 - Don't add new QUIRKS to workaround Host Controller issues.
It turns out that all the issues could be solved by using
SDHCI_QUIRK_MISSING_CAPS to supply modified "caps" and "caps1"
Host Controller registers.
Al Cooper (2):
mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden
caps
mmc: sdhci-brcmstb: Add driver for Broadcom BRCMSTB SoCs
.../devicetree/bindings/mmc/sdhci-brcmstb.txt | 40 ++++++
MAINTAINERS | 7 +
drivers/mmc/host/Kconfig | 11 ++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-brcmstb.c | 154 +++++++++++++++++++++
drivers/mmc/host/sdhci.c | 2 +-
6 files changed, 214 insertions(+), 1 deletion(-)
create mode 100644 Documentation/devicetree/bindings/mmc/sdhci-brcmstb.txt
create mode 100644 drivers/mmc/host/sdhci-brcmstb.c
--
1.9.0.138.g2de3478
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps
2016-02-10 20:25 [PATCH V3 0/2] Add SDHCI driver for Broadcom BRCMSTB/BMIPS Soc's Al Cooper
@ 2016-02-10 20:25 ` Al Cooper
2016-02-11 12:22 ` Adrian Hunter
2016-02-11 13:07 ` Ulf Hansson
2016-02-10 20:25 ` [PATCH V3 2/2] mmc: sdhci-brcmstb: Add driver for Broadcom BRCMSTB SoCs Al Cooper
1 sibling, 2 replies; 5+ messages in thread
From: Al Cooper @ 2016-02-10 20:25 UTC (permalink / raw)
To: ulf.hansson, adrian.hunter, linux-mmc, bcm-kernel-feedback-list; +Cc: Al Cooper
sdhci_add_host() allows the Host Controller Capability registers
to be supplied by the calling driver by using
SDHCI_QUIRK_MISSING_CAPS, but the check for the Capabilities bit
SDHCI_CAN_64BIT doesn't use the applied value and instead reads
the Host register directly. This change uses the supplied "caps"
register instead of reading the host register.
This change will allow a calling driver to simply clear the
SDHCI_CAN_64BIT bit in "caps" to handle some cases of
SDHCI_QUIRK2_BROKEN_64_BIT_DMA.
Signed-off-by: Al Cooper <alcooperx@gmail.com>
---
drivers/mmc/host/sdhci.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index d622435..ba3b072 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2926,7 +2926,7 @@ int sdhci_add_host(struct sdhci_host *host)
* SDHCI_QUIRK2_BROKEN_64_BIT_DMA must be left to the drivers to
* implement.
*/
- if (sdhci_readl(host, SDHCI_CAPABILITIES) & SDHCI_CAN_64BIT)
+ if (caps[0] & SDHCI_CAN_64BIT)
host->flags |= SDHCI_USE_64_BIT_DMA;
if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
--
1.9.0.138.g2de3478
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH V3 2/2] mmc: sdhci-brcmstb: Add driver for Broadcom BRCMSTB SoCs
2016-02-10 20:25 [PATCH V3 0/2] Add SDHCI driver for Broadcom BRCMSTB/BMIPS Soc's Al Cooper
2016-02-10 20:25 ` [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps Al Cooper
@ 2016-02-10 20:25 ` Al Cooper
1 sibling, 0 replies; 5+ messages in thread
From: Al Cooper @ 2016-02-10 20:25 UTC (permalink / raw)
To: ulf.hansson, adrian.hunter, linux-mmc, bcm-kernel-feedback-list; +Cc: Al Cooper
Signed-off-by: Al Cooper <alcooperx@gmail.com>
---
.../devicetree/bindings/mmc/sdhci-brcmstb.txt | 40 ++++++
MAINTAINERS | 7 +
drivers/mmc/host/Kconfig | 11 ++
drivers/mmc/host/Makefile | 1 +
drivers/mmc/host/sdhci-brcmstb.c | 154 +++++++++++++++++++++
5 files changed, 213 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mmc/sdhci-brcmstb.txt
create mode 100644 drivers/mmc/host/sdhci-brcmstb.c
diff --git a/Documentation/devicetree/bindings/mmc/sdhci-brcmstb.txt b/Documentation/devicetree/bindings/mmc/sdhci-brcmstb.txt
new file mode 100644
index 0000000..f8dd6a9d
--- /dev/null
+++ b/Documentation/devicetree/bindings/mmc/sdhci-brcmstb.txt
@@ -0,0 +1,40 @@
+* BROADCOM BRCMSTB/BMIPS SDHCI Controller
+
+This file documents differences between the core properties in mmc.txt
+and the properties used by the sdhci-brcmstb driver.
+
+Required properties:
+- compatible: "brcm,sdhci-brcmstb"
+
+Optional properties:
+- broken-sdr50: The Host Controller's SDR50 mode is broken.
+- broken-ddr50: The Host Controller's DDR50 mode is broken.
+- broken-64-bit-dma: 64 BIT DMA mode is broken, use 32 BIT DMA.
+- broken-timeout-value: The Host Controller CAPABILITY timeout value is incorrrect, use the maximum timeout.
+
+
+Example:
+
+ sdhci@f03e0100 {
+ compatible = "brcm,sdhci-brcmstb";
+ reg = <0xf03e0000 0x100>;
+ interrupts = <0x0 0x26 0x0>;
+ interrupt-names = "sdio0_0";
+ sdhci,auto-cmd12;
+ clocks = <0x13>;
+ clock-names = "sw_sdio";
+ broken-sdr50;
+ };
+
+ sdhci@f03e0300 {
+ no-1-8-v;
+ non-removable;
+ bus-width = <0x8>;
+ compatible = "brcm,sdhci-brcmstb";
+ reg = <0xf03e0200 0x100>;
+ interrupts = <0x0 0x27 0x0>;
+ interrupt-names = "sdio1_0";
+ sdhci,auto-cmd12;
+ clocks = <0x13>;
+ clock-names = "sw_sdio";
+ };
diff --git a/MAINTAINERS b/MAINTAINERS
index 30aca4a..2d9c90c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9724,6 +9724,13 @@ F: tools/testing/selftests/seccomp/*
K: \bsecure_computing
K: \bTIF_SECCOMP\b
+SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) Broadcom BRCMSTB DRIVER
+M: Al Cooper <alcooperx@gmail.com>
+L: linux-mmc@vger.kernel.org
+L: bcm-kernel-feedback-list@broadcom.com
+S: Maintained
+F: drivers/mmc/host/sdhci-brcmstb*
+
SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER
M: Ben Dooks <ben-linux@fluff.org>
M: Jaehoon Chung <jh80.chung@samsung.com>
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
index 4a35ebf..85bf266 100644
--- a/drivers/mmc/host/Kconfig
+++ b/drivers/mmc/host/Kconfig
@@ -797,3 +797,14 @@ config MMC_SDHCI_MICROCHIP_PIC32
If you have a controller with this interface, say Y or M here.
If unsure, say N.
+config MMC_SDHCI_BRCMSTB
+ tristate "Broadcom SDIO/SD/MMC support"
+ depends on ARCH_BRCMSTB || BMIPS_GENERIC
+ depends on MMC_SDHCI_PLTFM
+ default y
+ select MMC_SDHCI_IO_ACCESSORS
+ help
+ This selects support for the SDIO/SD/MMC Host Controller on
+ Broadcom STB SoCs.
+
+ If unsure, say Y.
diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
index af918d2..2075c11 100644
--- a/drivers/mmc/host/Makefile
+++ b/drivers/mmc/host/Makefile
@@ -76,6 +76,7 @@ obj-$(CONFIG_MMC_SDHCI_IPROC) += sdhci-iproc.o
obj-$(CONFIG_MMC_SDHCI_MSM) += sdhci-msm.o
obj-$(CONFIG_MMC_SDHCI_ST) += sdhci-st.o
obj-$(CONFIG_MMC_SDHCI_MICROCHIP_PIC32) += sdhci-pic32.o
+obj-$(CONFIG_MMC_SDHCI_BRCMSTB) += sdhci-brcmstb.o
ifeq ($(CONFIG_CB710_DEBUG),y)
CFLAGS-cb710-mmc += -DDEBUG
diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c
new file mode 100644
index 0000000..0e6cca6
--- /dev/null
+++ b/drivers/mmc/host/sdhci-brcmstb.c
@@ -0,0 +1,154 @@
+/*
+ * sdhci-brcmstb.c Support for SDHCI on Broadcom BRCMSTB SoC's
+ *
+ * Copyright (C) 2015 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/io.h>
+#include <linux/mmc/host.h>
+#include <linux/module.h>
+#include <linux/of.h>
+
+#include "sdhci-pltfm.h"
+
+static void brcmstb_of_parse(struct platform_device *pdev,
+ struct sdhci_host *host)
+{
+ struct device_node *np = pdev->dev.of_node;
+
+ host->quirks |= SDHCI_QUIRK_MISSING_CAPS;
+ host->caps = sdhci_readl(host, SDHCI_CAPABILITIES);
+ host->caps1 = sdhci_readl(host, SDHCI_CAPABILITIES_1);
+ if (of_get_property(np, "broken-sdr50", NULL))
+ host->caps1 &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50);
+ if (of_find_property(np, "broken-ddr50", NULL))
+ host->caps1 &= ~SDHCI_SUPPORT_DDR50;
+ if (of_get_property(np, "broken-64-bit-dma", NULL))
+ host->caps &= ~SDHCI_CAN_64BIT;
+ if (of_get_property(np, "broken-timeout-value", NULL))
+ host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
+}
+
+
+#ifdef CONFIG_PM_SLEEP
+
+static int sdhci_brcmstb_suspend(struct device *dev)
+{
+ struct sdhci_host *host = dev_get_drvdata(dev);
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ int res;
+
+ res = sdhci_suspend_host(host);
+ if (res)
+ return res;
+ clk_disable(pltfm_host->clk);
+ return res;
+}
+
+static int sdhci_brcmstb_resume(struct device *dev)
+{
+ struct sdhci_host *host = dev_get_drvdata(dev);
+ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+ int err;
+
+ err = clk_enable(pltfm_host->clk);
+ if (err)
+ return err;
+ return sdhci_resume_host(host);
+}
+
+#endif /* CONFIG_PM_SLEEP */
+
+static SIMPLE_DEV_PM_OPS(sdhci_brcmstb_pmops, sdhci_brcmstb_suspend,
+ sdhci_brcmstb_resume);
+
+static const struct sdhci_ops sdhci_brcmstb_ops = {
+ .set_clock = sdhci_set_clock,
+ .set_bus_width = sdhci_set_bus_width,
+ .reset = sdhci_reset,
+ .set_uhs_signaling = sdhci_set_uhs_signaling,
+};
+
+static struct sdhci_pltfm_data sdhci_brcmstb_pdata = {
+ .ops = &sdhci_brcmstb_ops,
+};
+
+static int sdhci_brcmstb_probe(struct platform_device *pdev)
+{
+ struct device_node *dn = pdev->dev.of_node;
+ struct sdhci_host *host;
+ struct sdhci_pltfm_host *pltfm_host;
+ struct clk *clk;
+ int res;
+
+ clk = of_clk_get_by_name(dn, "sw_sdio");
+ if (IS_ERR(clk)) {
+ dev_err(&pdev->dev, "Clock not found in Device Tree\n");
+ clk = NULL;
+ }
+ res = clk_prepare_enable(clk);
+ if (res)
+ goto undo_clk_get;
+
+ host = sdhci_pltfm_init(pdev, &sdhci_brcmstb_pdata, 0);
+ if (IS_ERR(host)) {
+ res = PTR_ERR(host);
+ goto undo_clk_prep;
+ }
+
+ /* Enable MMC_CAP2_HC_ERASE_SZ for better max discard calculations */
+ host->mmc->caps2 |= MMC_CAP2_HC_ERASE_SZ;
+
+ sdhci_get_of_property(pdev);
+ mmc_of_parse(host->mmc);
+ brcmstb_of_parse(pdev, host);
+
+ res = sdhci_add_host(host);
+ if (res)
+ goto undo_pltfm_init;
+
+ pltfm_host = sdhci_priv(host);
+ pltfm_host->clk = clk;
+ return res;
+
+undo_pltfm_init:
+ sdhci_pltfm_free(pdev);
+undo_clk_prep:
+ clk_disable_unprepare(clk);
+undo_clk_get:
+ clk_put(clk);
+ return res;
+}
+
+static const struct of_device_id sdhci_brcm_of_match[] = {
+ { .compatible = "brcm,sdhci-brcmstb" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sdhci_brcm_of_match);
+
+static struct platform_driver sdhci_brcmstb_driver = {
+ .driver = {
+ .name = "sdhci-brcmstb",
+ .owner = THIS_MODULE,
+ .pm = &sdhci_brcmstb_pmops,
+ .of_match_table = of_match_ptr(sdhci_brcm_of_match),
+ },
+ .probe = sdhci_brcmstb_probe,
+ .remove = sdhci_pltfm_unregister,
+};
+
+module_platform_driver(sdhci_brcmstb_driver);
+
+MODULE_DESCRIPTION("SDHCI driver for Broadcom BRCMSTB SoCs");
+MODULE_AUTHOR("Broadcom");
+MODULE_LICENSE("GPL v2");
--
1.9.0.138.g2de3478
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps
2016-02-10 20:25 ` [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps Al Cooper
@ 2016-02-11 12:22 ` Adrian Hunter
2016-02-11 13:07 ` Ulf Hansson
1 sibling, 0 replies; 5+ messages in thread
From: Adrian Hunter @ 2016-02-11 12:22 UTC (permalink / raw)
To: Al Cooper, ulf.hansson, linux-mmc, bcm-kernel-feedback-list
On 10/02/16 22:25, Al Cooper wrote:
> sdhci_add_host() allows the Host Controller Capability registers
> to be supplied by the calling driver by using
> SDHCI_QUIRK_MISSING_CAPS, but the check for the Capabilities bit
> SDHCI_CAN_64BIT doesn't use the applied value and instead reads
> the Host register directly. This change uses the supplied "caps"
> register instead of reading the host register.
>
> This change will allow a calling driver to simply clear the
> SDHCI_CAN_64BIT bit in "caps" to handle some cases of
> SDHCI_QUIRK2_BROKEN_64_BIT_DMA.
>
> Signed-off-by: Al Cooper <alcooperx@gmail.com>
> ---
> drivers/mmc/host/sdhci.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index d622435..ba3b072 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -2926,7 +2926,7 @@ int sdhci_add_host(struct sdhci_host *host)
> * SDHCI_QUIRK2_BROKEN_64_BIT_DMA must be left to the drivers to
> * implement.
> */
> - if (sdhci_readl(host, SDHCI_CAPABILITIES) & SDHCI_CAN_64BIT)
> + if (caps[0] & SDHCI_CAN_64BIT)
> host->flags |= SDHCI_USE_64_BIT_DMA;
>
> if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps
2016-02-10 20:25 ` [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps Al Cooper
2016-02-11 12:22 ` Adrian Hunter
@ 2016-02-11 13:07 ` Ulf Hansson
1 sibling, 0 replies; 5+ messages in thread
From: Ulf Hansson @ 2016-02-11 13:07 UTC (permalink / raw)
To: Al Cooper; +Cc: Adrian Hunter, linux-mmc, bcm-kernel-feedback-list
On 10 February 2016 at 21:25, Al Cooper <alcooperx@gmail.com> wrote:
> sdhci_add_host() allows the Host Controller Capability registers
> to be supplied by the calling driver by using
> SDHCI_QUIRK_MISSING_CAPS, but the check for the Capabilities bit
> SDHCI_CAN_64BIT doesn't use the applied value and instead reads
> the Host register directly. This change uses the supplied "caps"
> register instead of reading the host register.
>
> This change will allow a calling driver to simply clear the
> SDHCI_CAN_64BIT bit in "caps" to handle some cases of
> SDHCI_QUIRK2_BROKEN_64_BIT_DMA.
>
> Signed-off-by: Al Cooper <alcooperx@gmail.com>
Thanks, applied for next!
Kind regards
Uffe
> ---
> drivers/mmc/host/sdhci.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index d622435..ba3b072 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -2926,7 +2926,7 @@ int sdhci_add_host(struct sdhci_host *host)
> * SDHCI_QUIRK2_BROKEN_64_BIT_DMA must be left to the drivers to
> * implement.
> */
> - if (sdhci_readl(host, SDHCI_CAPABILITIES) & SDHCI_CAN_64BIT)
> + if (caps[0] & SDHCI_CAN_64BIT)
> host->flags |= SDHCI_USE_64_BIT_DMA;
>
> if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {
> --
> 1.9.0.138.g2de3478
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2016-02-11 13:07 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-02-10 20:25 [PATCH V3 0/2] Add SDHCI driver for Broadcom BRCMSTB/BMIPS Soc's Al Cooper
2016-02-10 20:25 ` [PATCH V3 1/2] mmc: sdhci: Allow CAPS check for SDHCI_CAN_64BIT to use overridden caps Al Cooper
2016-02-11 12:22 ` Adrian Hunter
2016-02-11 13:07 ` Ulf Hansson
2016-02-10 20:25 ` [PATCH V3 2/2] mmc: sdhci-brcmstb: Add driver for Broadcom BRCMSTB SoCs Al Cooper
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.