* [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC @ 2016-12-05 2:29 Jun Nie [not found] ` <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> ` (3 more replies) 0 siblings, 4 replies; 10+ messages in thread From: Jun Nie @ 2016-12-05 2:29 UTC (permalink / raw) To: robh+dt, mark.rutland, shawn.guo, xie.baoyou, devicetree Cc: ulf.hansson, jh80.chung, jason.liu, chen.chaokai, lai.binz, linux-mmc, Jun Nie Add intial support to DW MMC host on ZTE SoC. It include platform specific wrapper driver and workarounds for fifo quirk. Patches are prepared based on latest dw mmc runtime change: https://github.com/jh80chung/dw-mmc.git for-ulf Changes vs version 6: - Resolve confilict when rebase to latest dw-mmc.git for-ulf branch. - Add Shawn Lin's review tag. Changes vs version 5: - Add clock delay lock status check to save CPU cycle in timing tuning CMD. Changes vs version 4: - Fix missing empty dts compatible element in the end of compatible array. Changes vs version 3: - Fix brace error in document. Changes vs version 2: - Change dt property fifo-addr to data-addr and fifo-watermark-quirk to fifo-watermark-aligned. - Polish ZX MMC driver on minor coding style issues. Changes vs version 1: - Change fifo-addr-override to fifo-addr and remove its workaround tag in comments. - Remove ZX DW MMC driver reset cap in driver, which can be added in dt nodes. Jun Nie (5): mmc: dt-bindings: add ZTE ZX296718 MMC bindings mmc: zx: Initial support for ZX mmc controller Documentation: synopsys-dw-mshc: add binding for fifo quirks mmc: dw: Add fifo address property mmc: dw: Add fifo watermark alignment property .../devicetree/bindings/mmc/synopsys-dw-mshc.txt | 13 ++ .../devicetree/bindings/mmc/zx-dw-mshc.txt | 34 +++ drivers/mmc/host/Kconfig | 9 + drivers/mmc/host/Makefile | 1 + drivers/mmc/host/dw_mmc-zx.c | 242 +++++++++++++++++++++ drivers/mmc/host/dw_mmc-zx.h | 31 +++ drivers/mmc/host/dw_mmc.c | 17 +- include/linux/mmc/dw_mmc.h | 5 + 8 files changed, 349 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt create mode 100644 drivers/mmc/host/dw_mmc-zx.c create mode 100644 drivers/mmc/host/dw_mmc-zx.h -- 1.9.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>]
* [PATCH v7 1/5] mmc: dt-bindings: add ZTE ZX296718 MMC bindings [not found] ` <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2016-12-05 2:29 ` Jun Nie 2016-12-09 21:47 ` Rob Herring 2016-12-05 2:29 ` [PATCH v7 2/5] mmc: zx: Initial support for ZX mmc controller Jun Nie 2016-12-08 1:28 ` [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC Jun Nie 2 siblings, 1 reply; 10+ messages in thread From: Jun Nie @ 2016-12-05 2:29 UTC (permalink / raw) To: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, shawn.guo-QSEj5FYQhm4dnm+yROfE0A, xie.baoyou-Th6q7B73Y6EnDS1+zs4M5A, devicetree-u79uwXL29TY76Z2rM5mHXA Cc: ulf.hansson-QSEj5FYQhm4dnm+yROfE0A, jh80.chung-Sze3O3UU22JBDgjK7y7TUQ, jason.liu-QSEj5FYQhm4dnm+yROfE0A, chen.chaokai-Th6q7B73Y6EnDS1+zs4M5A, lai.binz-Th6q7B73Y6EnDS1+zs4M5A, linux-mmc-u79uwXL29TY76Z2rM5mHXA, Jun Nie Document the device-tree binding of ZTE MMC host on ZX296718 SoC. Signed-off-by: Jun Nie <jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> --- .../devicetree/bindings/mmc/zx-dw-mshc.txt | 35 ++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt diff --git a/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt new file mode 100644 index 0000000..c175c4b --- /dev/null +++ b/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt @@ -0,0 +1,35 @@ +* ZTE specific extensions to the Synopsys Designware Mobile Storage + Host Controller + +The Synopsys designware mobile storage host controller is used to interface +a SoC with storage medium such as eMMC or SD/MMC cards. This file documents +differences between the core Synopsys dw mshc controller properties described +by synopsys-dw-mshc.txt and the properties used by the ZTE specific +extensions to the Synopsys Designware Mobile Storage Host Controller. + +Required Properties: + +* compatible: should be + - "zte,zx296718-dw-mshc": for ZX SoCs + +Example: + + mmc1: mmc@1110000 { + compatible = "zte,zx296718-dw-mshc"; + #address-cells = <1>; + #size-cells = <0>; + reg = <0x01110000 0x1000>; + interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; + fifo-depth = <32>; + data-addr = <0x200>; + fifo-watermark-aligned; + bus-width = <4>; + clock-frequency = <50000000>; + clocks = <&topcrm SD0_AHB>, <&topcrm SD0_WCLK>; + clock-names = "biu", "ciu"; + num-slots = <1>; + max-frequency = <50000000>; + cap-sdio-irq; + cap-sd-highspeed; + status = "disabled"; + }; -- 1.9.1 -- 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] 10+ messages in thread
* Re: [PATCH v7 1/5] mmc: dt-bindings: add ZTE ZX296718 MMC bindings 2016-12-05 2:29 ` [PATCH v7 1/5] mmc: dt-bindings: add ZTE ZX296718 MMC bindings Jun Nie @ 2016-12-09 21:47 ` Rob Herring 2016-12-13 14:20 ` Jun Nie 0 siblings, 1 reply; 10+ messages in thread From: Rob Herring @ 2016-12-09 21:47 UTC (permalink / raw) To: Jun Nie Cc: mark.rutland, shawn.guo, xie.baoyou, devicetree, ulf.hansson, jh80.chung, jason.liu, chen.chaokai, lai.binz, linux-mmc On Mon, Dec 05, 2016 at 10:29:32AM +0800, Jun Nie wrote: > Document the device-tree binding of ZTE MMC host on > ZX296718 SoC. > > Signed-off-by: Jun Nie <jun.nie@linaro.org> > --- > .../devicetree/bindings/mmc/zx-dw-mshc.txt | 35 ++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > create mode 100644 Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt > > diff --git a/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt > new file mode 100644 > index 0000000..c175c4b > --- /dev/null > +++ b/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt > @@ -0,0 +1,35 @@ > +* ZTE specific extensions to the Synopsys Designware Mobile Storage > + Host Controller > + > +The Synopsys designware mobile storage host controller is used to interface > +a SoC with storage medium such as eMMC or SD/MMC cards. This file documents > +differences between the core Synopsys dw mshc controller properties described > +by synopsys-dw-mshc.txt and the properties used by the ZTE specific > +extensions to the Synopsys Designware Mobile Storage Host Controller. > + > +Required Properties: > + > +* compatible: should be > + - "zte,zx296718-dw-mshc": for ZX SoCs > + > +Example: > + > + mmc1: mmc@1110000 { > + compatible = "zte,zx296718-dw-mshc"; > + #address-cells = <1>; > + #size-cells = <0>; These aren't needed unless you have child nodes with reg property. The DW binding says you should have at least one child. > + reg = <0x01110000 0x1000>; > + interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; > + fifo-depth = <32>; > + data-addr = <0x200>; > + fifo-watermark-aligned; Custom properties should have vendor prefix. > + bus-width = <4>; > + clock-frequency = <50000000>; > + clocks = <&topcrm SD0_AHB>, <&topcrm SD0_WCLK>; > + clock-names = "biu", "ciu"; > + num-slots = <1>; > + max-frequency = <50000000>; > + cap-sdio-irq; > + cap-sd-highspeed; > + status = "disabled"; > + }; > -- > 1.9.1 > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v7 1/5] mmc: dt-bindings: add ZTE ZX296718 MMC bindings 2016-12-09 21:47 ` Rob Herring @ 2016-12-13 14:20 ` Jun Nie 0 siblings, 0 replies; 10+ messages in thread From: Jun Nie @ 2016-12-13 14:20 UTC (permalink / raw) To: Rob Herring Cc: Mark Rutland, Shawn Guo, xie.baoyou, devicetree-u79uwXL29TY76Z2rM5mHXA, Ulf Hansson, Jaehoon Chung, Jason Liu, chen.chaokai-Th6q7B73Y6EnDS1+zs4M5A, lai.binz-Th6q7B73Y6EnDS1+zs4M5A, linux-mmc 2016-12-10 5:47 GMT+08:00 Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>: > On Mon, Dec 05, 2016 at 10:29:32AM +0800, Jun Nie wrote: >> Document the device-tree binding of ZTE MMC host on >> ZX296718 SoC. >> >> Signed-off-by: Jun Nie <jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> >> --- >> .../devicetree/bindings/mmc/zx-dw-mshc.txt | 35 ++++++++++++++++++++++ >> 1 file changed, 35 insertions(+) >> create mode 100644 Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt >> >> diff --git a/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt >> new file mode 100644 >> index 0000000..c175c4b >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt >> @@ -0,0 +1,35 @@ >> +* ZTE specific extensions to the Synopsys Designware Mobile Storage >> + Host Controller >> + >> +The Synopsys designware mobile storage host controller is used to interface >> +a SoC with storage medium such as eMMC or SD/MMC cards. This file documents >> +differences between the core Synopsys dw mshc controller properties described >> +by synopsys-dw-mshc.txt and the properties used by the ZTE specific >> +extensions to the Synopsys Designware Mobile Storage Host Controller. >> + >> +Required Properties: >> + >> +* compatible: should be >> + - "zte,zx296718-dw-mshc": for ZX SoCs >> + >> +Example: >> + >> + mmc1: mmc@1110000 { >> + compatible = "zte,zx296718-dw-mshc"; > >> + #address-cells = <1>; >> + #size-cells = <0>; > > These aren't needed unless you have child nodes with reg property. The > DW binding says you should have at least one child. Will remove them in next version. > >> + reg = <0x01110000 0x1000>; >> + interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; >> + fifo-depth = <32>; >> + data-addr = <0x200>; >> + fifo-watermark-aligned; > > Custom properties should have vendor prefix. These properties are consumed by DW MMC driver, not by ZTE driver. And they may reused by SoCs from other vendors that integrate DW MMC IP. The names are OK in this case? Jun > >> + bus-width = <4>; >> + clock-frequency = <50000000>; >> + clocks = <&topcrm SD0_AHB>, <&topcrm SD0_WCLK>; >> + clock-names = "biu", "ciu"; >> + num-slots = <1>; >> + max-frequency = <50000000>; >> + cap-sdio-irq; >> + cap-sd-highspeed; >> + status = "disabled"; >> + }; >> -- >> 1.9.1 >> -- 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 [flat|nested] 10+ messages in thread
* [PATCH v7 2/5] mmc: zx: Initial support for ZX mmc controller [not found] ` <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2016-12-05 2:29 ` [PATCH v7 1/5] mmc: dt-bindings: add ZTE ZX296718 MMC bindings Jun Nie @ 2016-12-05 2:29 ` Jun Nie 2016-12-08 1:28 ` [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC Jun Nie 2 siblings, 0 replies; 10+ messages in thread From: Jun Nie @ 2016-12-05 2:29 UTC (permalink / raw) To: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, mark.rutland-5wv7dgnIgG8, shawn.guo-QSEj5FYQhm4dnm+yROfE0A, xie.baoyou-Th6q7B73Y6EnDS1+zs4M5A, devicetree-u79uwXL29TY76Z2rM5mHXA Cc: ulf.hansson-QSEj5FYQhm4dnm+yROfE0A, jh80.chung-Sze3O3UU22JBDgjK7y7TUQ, jason.liu-QSEj5FYQhm4dnm+yROfE0A, chen.chaokai-Th6q7B73Y6EnDS1+zs4M5A, lai.binz-Th6q7B73Y6EnDS1+zs4M5A, linux-mmc-u79uwXL29TY76Z2rM5mHXA, Jun Nie This platform driver adds initial support for the DW host controller found on ZTE SoCs. It has been tested on ZX296718 EVB board currently. More support on timing tuning will be added when hardware is available. Signed-off-by: Jun Nie <jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> --- drivers/mmc/host/Kconfig | 9 ++ drivers/mmc/host/Makefile | 1 + drivers/mmc/host/dw_mmc-zx.c | 242 +++++++++++++++++++++++++++++++++++++++++++ drivers/mmc/host/dw_mmc-zx.h | 31 ++++++ 4 files changed, 283 insertions(+) create mode 100644 drivers/mmc/host/dw_mmc-zx.c create mode 100644 drivers/mmc/host/dw_mmc-zx.h diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index 4128a3c..7bef121 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -673,6 +673,15 @@ config MMC_DW_ROCKCHIP Synopsys DesignWare Memory Card Interface driver. Select this option for platforms based on RK3066, RK3188 and RK3288 SoC's. +config MMC_DW_ZX + tristate "ZTE specific extensions for Synopsys DW Memory Card Interface" + depends on MMC_DW && ARCH_ZX + select MMC_DW_PLTFM + help + This selects support for ZTE SoC specific extensions to the + Synopsys DesignWare Memory Card Interface driver. Select this option + for platforms based on ZX296718 SoC's. + config MMC_SH_MMCIF tristate "SuperH Internal MMCIF support" depends on HAS_DMA diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile index e609bf0..61d8ae1 100644 --- a/drivers/mmc/host/Makefile +++ b/drivers/mmc/host/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_MMC_DW_EXYNOS) += dw_mmc-exynos.o obj-$(CONFIG_MMC_DW_K3) += dw_mmc-k3.o obj-$(CONFIG_MMC_DW_PCI) += dw_mmc-pci.o obj-$(CONFIG_MMC_DW_ROCKCHIP) += dw_mmc-rockchip.o +obj-$(CONFIG_MMC_DW_ZX) += dw_mmc-zx.o obj-$(CONFIG_MMC_SH_MMCIF) += sh_mmcif.o obj-$(CONFIG_MMC_JZ4740) += jz4740_mmc.o obj-$(CONFIG_MMC_VUB300) += vub300.o diff --git a/drivers/mmc/host/dw_mmc-zx.c b/drivers/mmc/host/dw_mmc-zx.c new file mode 100644 index 0000000..11b9fc3 --- /dev/null +++ b/drivers/mmc/host/dw_mmc-zx.c @@ -0,0 +1,242 @@ +/* + * ZX Specific Extensions for Synopsys DW Multimedia Card Interface driver + * + * Copyright (C) 2016, Linaro Ltd. + * Copyright (C) 2016, ZTE Corp. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include <linux/clk.h> +#include <linux/mfd/syscon.h> +#include <linux/mmc/dw_mmc.h> +#include <linux/mmc/host.h> +#include <linux/mmc/mmc.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/platform_device.h> +#include <linux/pm_runtime.h> +#include <linux/regmap.h> +#include <linux/slab.h> + +#include "dw_mmc.h" +#include "dw_mmc-pltfm.h" +#include "dw_mmc-zx.h" + +struct dw_mci_zx_priv_data { + struct regmap *sysc_base; +}; + +enum delay_type { + DELAY_TYPE_READ, /* read dqs delay */ + DELAY_TYPE_CLK, /* clk sample delay */ +}; + +static int dw_mci_zx_emmc_set_delay(struct dw_mci *host, unsigned int delay, + enum delay_type dflag) +{ + struct dw_mci_zx_priv_data *priv = host->priv; + struct regmap *sysc_base = priv->sysc_base; + unsigned int clksel; + unsigned int loop = 1000; + int ret; + + if (!sysc_base) + return -EINVAL; + + ret = regmap_update_bits(sysc_base, LB_AON_EMMC_CFG_REG0, + PARA_HALF_CLK_MODE | PARA_DLL_BYPASS_MODE | + PARA_PHASE_DET_SEL_MASK | + PARA_DLL_LOCK_NUM_MASK | + DLL_REG_SET | PARA_DLL_START_MASK, + PARA_DLL_START(4) | PARA_DLL_LOCK_NUM(4)); + if (ret) + return ret; + + ret = regmap_read(sysc_base, LB_AON_EMMC_CFG_REG1, &clksel); + if (ret) + return ret; + + if (dflag == DELAY_TYPE_CLK) { + clksel &= ~CLK_SAMP_DELAY_MASK; + clksel |= CLK_SAMP_DELAY(delay); + } else { + clksel &= ~READ_DQS_DELAY_MASK; + clksel |= READ_DQS_DELAY(delay); + } + + regmap_write(sysc_base, LB_AON_EMMC_CFG_REG1, clksel); + regmap_update_bits(sysc_base, LB_AON_EMMC_CFG_REG0, + PARA_DLL_START_MASK | PARA_DLL_LOCK_NUM_MASK | + DLL_REG_SET, + PARA_DLL_START(4) | PARA_DLL_LOCK_NUM(4) | + DLL_REG_SET); + + do { + ret = regmap_read(sysc_base, LB_AON_EMMC_CFG_REG2, &clksel); + if (ret) + return ret; + + } while (--loop && !(clksel & ZX_DLL_LOCKED)); + + if (!loop) { + dev_err(host->dev, "Error: %s dll lock fail\n", __func__); + return -EIO; + } + + return 0; +} + +static int dw_mci_zx_emmc_execute_tuning(struct dw_mci_slot *slot, u32 opcode) +{ + struct dw_mci *host = slot->host; + struct mmc_host *mmc = slot->mmc; + int ret, len, start = 0, end = 0, delay, best = 0; + + for (delay = 1 ; delay < 128; delay++) { + ret = dw_mci_zx_emmc_set_delay(host, delay, DELAY_TYPE_CLK); + if (!ret && mmc_send_tuning(mmc, opcode, NULL)) { + if (start >= 0) { + end = delay - 1; + /* check and update longest good range */ + if ((end - start) > len) { + best = (start + end) >> 1; + len = end - start; + } + } + start = -1; + end = 0; + continue; + } + if (start < 0) + start = delay; + } + + if (start >= 0) { + end = delay - 1; + if ((end - start) > len) { + best = (start + end) >> 1; + len = end - start; + } + } + if (best < 0) + return -EIO; + + dev_info(host->dev, "%s best range: start %d end %d\n", __func__, + start, end); + return dw_mci_zx_emmc_set_delay(host, best, DELAY_TYPE_CLK); +} + +static int dw_mci_zx_prepare_hs400_tuning(struct dw_mci *host, + struct mmc_ios *ios) +{ + int ret; + + /* config phase shift as 90 degree */ + ret = dw_mci_zx_emmc_set_delay(host, 32, DELAY_TYPE_READ); + if (ret < 0) + return -EIO; + + return 0; +} + +static int dw_mci_zx_execute_tuning(struct dw_mci_slot *slot, u32 opcode) +{ + struct dw_mci *host = slot->host; + + if (host->verid == 0x290a) /* only for emmc */ + return dw_mci_zx_emmc_execute_tuning(slot, opcode); + /* TODO: Add 0x210a dedicated tuning for sd/sdio */ + + return 0; +} + +static int dw_mci_zx_parse_dt(struct dw_mci *host) +{ + struct device_node *np = host->dev->of_node; + struct device_node *node; + struct dw_mci_zx_priv_data *priv; + struct regmap *sysc_base; + int ret; + + /* syscon is needed only by emmc */ + node = of_parse_phandle(np, "zte,aon-syscon", 0); + if (node) { + sysc_base = syscon_node_to_regmap(node); + of_node_put(node); + + if (IS_ERR(sysc_base)) { + ret = PTR_ERR(sysc_base); + if (ret != -EPROBE_DEFER) + dev_err(host->dev, "Can't get syscon: %d\n", + ret); + return ret; + } + } else { + return 0; + } + + priv = devm_kzalloc(host->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + priv->sysc_base = sysc_base; + host->priv = priv; + + return 0; +} + +static unsigned long zx_dwmmc_caps[3] = { + MMC_CAP_CMD23, + MMC_CAP_CMD23, + MMC_CAP_CMD23, +}; + +static const struct dw_mci_drv_data zx_drv_data = { + .caps = zx_dwmmc_caps, + .execute_tuning = dw_mci_zx_execute_tuning, + .prepare_hs400_tuning = dw_mci_zx_prepare_hs400_tuning, + .parse_dt = dw_mci_zx_parse_dt, +}; + +static const struct of_device_id dw_mci_zx_match[] = { + { .compatible = "zte,zx296718-dw-mshc", .data = &zx_drv_data}, + {}, +}; +MODULE_DEVICE_TABLE(of, dw_mci_zx_match); + +static int dw_mci_zx_probe(struct platform_device *pdev) +{ + const struct dw_mci_drv_data *drv_data; + const struct of_device_id *match; + + match = of_match_node(dw_mci_zx_match, pdev->dev.of_node); + drv_data = match->data; + + return dw_mci_pltfm_register(pdev, drv_data); +} + +static const struct dev_pm_ops dw_mci_zx_dev_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, + pm_runtime_force_resume) + SET_RUNTIME_PM_OPS(dw_mci_runtime_suspend, + dw_mci_runtime_resume, + NULL) +}; + +static struct platform_driver dw_mci_zx_pltfm_driver = { + .probe = dw_mci_zx_probe, + .remove = dw_mci_pltfm_remove, + .driver = { + .name = "dwmmc_zx", + .of_match_table = dw_mci_zx_match, + .pm = &dw_mci_zx_dev_pm_ops, + }, +}; + +module_platform_driver(dw_mci_zx_pltfm_driver); + +MODULE_DESCRIPTION("ZTE emmc/sd driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/mmc/host/dw_mmc-zx.h b/drivers/mmc/host/dw_mmc-zx.h new file mode 100644 index 0000000..f369997 --- /dev/null +++ b/drivers/mmc/host/dw_mmc-zx.h @@ -0,0 +1,31 @@ +#ifndef _DW_MMC_ZX_H_ +#define _DW_MMC_ZX_H_ + +/* ZX296718 SoC specific DLL register offset. */ +#define LB_AON_EMMC_CFG_REG0 0x1B0 +#define LB_AON_EMMC_CFG_REG1 0x1B4 +#define LB_AON_EMMC_CFG_REG2 0x1B8 + +/* LB_AON_EMMC_CFG_REG0 register defines */ +#define PARA_DLL_START(x) ((x) & 0xFF) +#define PARA_DLL_START_MASK 0xFF +#define DLL_REG_SET BIT(8) +#define PARA_DLL_LOCK_NUM(x) (((x) & 7) << 16) +#define PARA_DLL_LOCK_NUM_MASK (7 << 16) +#define PARA_PHASE_DET_SEL(x) (((x) & 7) << 20) +#define PARA_PHASE_DET_SEL_MASK (7 << 20) +#define PARA_DLL_BYPASS_MODE BIT(23) +#define PARA_HALF_CLK_MODE BIT(24) + +/* LB_AON_EMMC_CFG_REG1 register defines */ +#define READ_DQS_DELAY(x) ((x) & 0x7F) +#define READ_DQS_DELAY_MASK (0x7F) +#define READ_DQS_BYPASS_MODE BIT(7) +#define CLK_SAMP_DELAY(x) (((x) & 0x7F) << 8) +#define CLK_SAMP_DELAY_MASK (0x7F << 8) +#define CLK_SAMP_BYPASS_MODE BIT(15) + +/* LB_AON_EMMC_CFG_REG2 register defines */ +#define ZX_DLL_LOCKED BIT(2) + +#endif /* _DW_MMC_ZX_H_ */ -- 1.9.1 -- 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] 10+ messages in thread
* Re: [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC [not found] ` <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2016-12-05 2:29 ` [PATCH v7 1/5] mmc: dt-bindings: add ZTE ZX296718 MMC bindings Jun Nie 2016-12-05 2:29 ` [PATCH v7 2/5] mmc: zx: Initial support for ZX mmc controller Jun Nie @ 2016-12-08 1:28 ` Jun Nie 2 siblings, 0 replies; 10+ messages in thread From: Jun Nie @ 2016-12-08 1:28 UTC (permalink / raw) To: Rob Herring, mark.rutland-5wv7dgnIgG8, Shawn Guo, xie.baoyou, devicetree-u79uwXL29TY76Z2rM5mHXA Cc: Ulf Hansson, Jaehoon Chung, Jason Liu, chen.chaokai-Th6q7B73Y6EnDS1+zs4M5A, lai.binz-Th6q7B73Y6EnDS1+zs4M5A, linux-mmc, Jun Nie 2016-12-05 10:29 GMT+08:00 Jun Nie <jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>: > Add intial support to DW MMC host on ZTE SoC. It include platform > specific wrapper driver and workarounds for fifo quirk. > > Patches are prepared based on latest dw mmc runtime change: > https://github.com/jh80chung/dw-mmc.git for-ulf > > Changes vs version 6: > - Resolve confilict when rebase to latest dw-mmc.git for-ulf branch. > - Add Shawn Lin's review tag. > > Changes vs version 5: > - Add clock delay lock status check to save CPU cycle in timing tuning CMD. > > Changes vs version 4: > - Fix missing empty dts compatible element in the end of compatible array. > > Changes vs version 3: > - Fix brace error in document. > > Changes vs version 2: > - Change dt property fifo-addr to data-addr and fifo-watermark-quirk to > fifo-watermark-aligned. > - Polish ZX MMC driver on minor coding style issues. > > Changes vs version 1: > - Change fifo-addr-override to fifo-addr and remove its workaround tag in comments. > - Remove ZX DW MMC driver reset cap in driver, which can be added in dt nodes. > > Jun Nie (5): > mmc: dt-bindings: add ZTE ZX296718 MMC bindings > mmc: zx: Initial support for ZX mmc controller > Documentation: synopsys-dw-mshc: add binding for fifo quirks > mmc: dw: Add fifo address property > mmc: dw: Add fifo watermark alignment property > > .../devicetree/bindings/mmc/synopsys-dw-mshc.txt | 13 ++ > .../devicetree/bindings/mmc/zx-dw-mshc.txt | 34 +++ > drivers/mmc/host/Kconfig | 9 + > drivers/mmc/host/Makefile | 1 + > drivers/mmc/host/dw_mmc-zx.c | 242 +++++++++++++++++++++ > drivers/mmc/host/dw_mmc-zx.h | 31 +++ > drivers/mmc/host/dw_mmc.c | 17 +- > include/linux/mmc/dw_mmc.h | 5 + > 8 files changed, 349 insertions(+), 3 deletions(-) > create mode 100644 Documentation/devicetree/bindings/mmc/zx-dw-mshc.txt > create mode 100644 drivers/mmc/host/dw_mmc-zx.c > create mode 100644 drivers/mmc/host/dw_mmc-zx.h > > -- > 1.9.1 > Hi Rob & Mark, Could you help act DT patches in this set? Thank you! Jun -- 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 [flat|nested] 10+ messages in thread
* [PATCH v7 3/5] Documentation: synopsys-dw-mshc: add binding for fifo quirks 2016-12-05 2:29 [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC Jun Nie [not found] ` <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> @ 2016-12-05 2:29 ` Jun Nie 2016-12-09 21:51 ` Rob Herring 2016-12-05 2:29 ` [PATCH v7 4/5] mmc: dw: Add fifo address property Jun Nie 2016-12-05 2:29 ` [PATCH v7 5/5] mmc: dw: Add fifo watermark alignment property Jun Nie 3 siblings, 1 reply; 10+ messages in thread From: Jun Nie @ 2016-12-05 2:29 UTC (permalink / raw) To: robh+dt, mark.rutland, shawn.guo, xie.baoyou, devicetree Cc: ulf.hansson, jh80.chung, jason.liu, chen.chaokai, lai.binz, linux-mmc, Jun Nie Add fifo-addr property and fifo-watermark-quirk property to synopsys-dw-mshc bindings. It is intended to provide more dt interface to support SoCs specific configuration. Signed-off-by: Jun Nie <jun.nie@linaro.org> --- Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt index 7fd17c3..bca30b6 100644 --- a/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt +++ b/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt @@ -75,6 +75,17 @@ Optional properties: * card-detect-delay: Delay in milli-seconds before detecting card after card insert event. The default value is 0. +* data-addr: Override fifo address with value provided by DT. The default FIFO reg + offset is assumed as 0x100 (version < 0x240A) and 0x200(version >= 0x240A) by + driver. If the controller does not follow this rule, please use this property + to set fifo address in device tree. + +* fifo-watermark-aligned: Data done irq is expected if data length is less than + watermark in PIO mode. But fifo watermark is requested to be aligned with data + length in some SoC so that TX/RX irq can be generated with data done irq. Add this + watermark quirk to mark this requirement and force fifo watermark setting + accordingly. + * vmmc-supply: The phandle to the regulator to use for vmmc. If this is specified we'll defer probe until we can find this regulator. @@ -102,6 +113,8 @@ board specific portions as listed below. interrupts = <0 75 0>; #address-cells = <1>; #size-cells = <0>; + data-addr = <0x200>; + fifo-watermark-aligned; resets = <&rst 20>; reset-names = "reset"; }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v7 3/5] Documentation: synopsys-dw-mshc: add binding for fifo quirks 2016-12-05 2:29 ` [PATCH v7 3/5] Documentation: synopsys-dw-mshc: add binding for fifo quirks Jun Nie @ 2016-12-09 21:51 ` Rob Herring 0 siblings, 0 replies; 10+ messages in thread From: Rob Herring @ 2016-12-09 21:51 UTC (permalink / raw) To: Jun Nie Cc: mark.rutland, shawn.guo, xie.baoyou, devicetree, ulf.hansson, jh80.chung, jason.liu, chen.chaokai, lai.binz, linux-mmc On Mon, Dec 05, 2016 at 10:29:34AM +0800, Jun Nie wrote: > Add fifo-addr property and fifo-watermark-quirk property to > synopsys-dw-mshc bindings. It is intended to provide more > dt interface to support SoCs specific configuration. > > Signed-off-by: Jun Nie <jun.nie@linaro.org> > --- > Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt | 13 +++++++++++++ > 1 file changed, 13 insertions(+) This patch should come before patch 1 since you use these there. Acked-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v7 4/5] mmc: dw: Add fifo address property 2016-12-05 2:29 [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC Jun Nie [not found] ` <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2016-12-05 2:29 ` [PATCH v7 3/5] Documentation: synopsys-dw-mshc: add binding for fifo quirks Jun Nie @ 2016-12-05 2:29 ` Jun Nie 2016-12-05 2:29 ` [PATCH v7 5/5] mmc: dw: Add fifo watermark alignment property Jun Nie 3 siblings, 0 replies; 10+ messages in thread From: Jun Nie @ 2016-12-05 2:29 UTC (permalink / raw) To: robh+dt, mark.rutland, shawn.guo, xie.baoyou, devicetree Cc: ulf.hansson, jh80.chung, jason.liu, chen.chaokai, lai.binz, linux-mmc, Jun Nie The FIFO address may break default address assumption of 0x100 (version < 0x240A) and 0x200(version >= 0x240A) in current driver. The new property is introduced to override fifo address via DT node information. Signed-off-by: Jun Nie <jun.nie@linaro.org> Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com> --- drivers/mmc/host/dw_mmc.c | 6 +++++- include/linux/mmc/dw_mmc.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index b44306b..b600170 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -2977,6 +2977,8 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) of_property_read_u32(np, "card-detect-delay", &pdata->detect_delay_ms); + of_property_read_u32(np, "data-addr", &host->data_addr_override); + if (!of_property_read_u32(np, "clock-frequency", &clock_frequency)) pdata->bus_hz = clock_frequency; @@ -3180,7 +3182,9 @@ int dw_mci_probe(struct dw_mci *host) host->verid = SDMMC_GET_VERID(mci_readl(host, VERID)); dev_info(host->dev, "Version ID is %04x\n", host->verid); - if (host->verid < DW_MMC_240A) + if (host->data_addr_override) + host->fifo_reg = host->regs + host->data_addr_override; + else if (host->verid < DW_MMC_240A) host->fifo_reg = host->regs + DATA_OFFSET; else host->fifo_reg = host->regs + DATA_240A_OFFSET; diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 15db6f8..1c09cca 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -113,6 +113,7 @@ struct dw_mci_dma_slave { * @ciu_clk: Pointer to card interface unit clock instance. * @slot: Slots sharing this MMC controller. * @fifo_depth: depth of FIFO. + * @data_addr_override: override fifo reg offset with this value. * @data_shift: log2 of FIFO item size. * @part_buf_start: Start index in part_buf. * @part_buf_count: Bytes of partial data in part_buf. @@ -160,6 +161,7 @@ struct dw_mci { spinlock_t irq_lock; void __iomem *regs; void __iomem *fifo_reg; + u32 data_addr_override; struct scatterlist *sg; struct sg_mapping_iter sg_miter; -- 1.9.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v7 5/5] mmc: dw: Add fifo watermark alignment property 2016-12-05 2:29 [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC Jun Nie ` (2 preceding siblings ...) 2016-12-05 2:29 ` [PATCH v7 4/5] mmc: dw: Add fifo address property Jun Nie @ 2016-12-05 2:29 ` Jun Nie 3 siblings, 0 replies; 10+ messages in thread From: Jun Nie @ 2016-12-05 2:29 UTC (permalink / raw) To: robh+dt, mark.rutland, shawn.guo, xie.baoyou, devicetree Cc: ulf.hansson, jh80.chung, jason.liu, chen.chaokai, lai.binz, linux-mmc, Jun Nie Data done irq is expected if data length is less than watermark in PIO mode. But fifo watermark is requested to be aligned with data length in some SoC so that TX/RX irq can be generated with data done irq. Add the watermark alignment to mark this requirement and force fifo watermark setting accordingly. Signed-off-by: Jun Nie <jun.nie@linaro.org> Reviewed-by: Shawn Lin <shawn.lin@rock-chips.com> --- drivers/mmc/host/dw_mmc.c | 11 +++++++++-- include/linux/mmc/dw_mmc.h | 3 +++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index b600170..e890a45 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -1113,11 +1113,15 @@ static void dw_mci_submit_data(struct dw_mci *host, struct mmc_data *data) mci_writel(host, CTRL, temp); /* - * Use the initial fifoth_val for PIO mode. + * Use the initial fifoth_val for PIO mode. If wm_algined + * is set, we set watermark same as data size. * If next issued data may be transfered by DMA mode, * prev_blksz should be invalidated. */ - mci_writel(host, FIFOTH, host->fifoth_val); + if (host->wm_aligned) + dw_mci_adjust_fifoth(host, data); + else + mci_writel(host, FIFOTH, host->fifoth_val); host->prev_blksz = 0; } else { /* @@ -2979,6 +2983,9 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) of_property_read_u32(np, "data-addr", &host->data_addr_override); + if (of_get_property(np, "fifo-watermark-aligned", NULL)) + host->wm_aligned = true; + if (!of_property_read_u32(np, "clock-frequency", &clock_frequency)) pdata->bus_hz = clock_frequency; diff --git a/include/linux/mmc/dw_mmc.h b/include/linux/mmc/dw_mmc.h index 1c09cca..cc7da85 100644 --- a/include/linux/mmc/dw_mmc.h +++ b/include/linux/mmc/dw_mmc.h @@ -114,6 +114,8 @@ struct dw_mci_dma_slave { * @slot: Slots sharing this MMC controller. * @fifo_depth: depth of FIFO. * @data_addr_override: override fifo reg offset with this value. + * @wm_aligned: force fifo watermark equal with data length in PIO mode. + * Set as true if alignment is needed. * @data_shift: log2 of FIFO item size. * @part_buf_start: Start index in part_buf. * @part_buf_count: Bytes of partial data in part_buf. @@ -162,6 +164,7 @@ struct dw_mci { void __iomem *regs; void __iomem *fifo_reg; u32 data_addr_override; + bool wm_aligned; struct scatterlist *sg; struct sg_mapping_iter sg_miter; -- 1.9.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2016-12-13 14:20 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-12-05 2:29 [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC Jun Nie [not found] ` <1480904976-7081-1-git-send-email-jun.nie-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org> 2016-12-05 2:29 ` [PATCH v7 1/5] mmc: dt-bindings: add ZTE ZX296718 MMC bindings Jun Nie 2016-12-09 21:47 ` Rob Herring 2016-12-13 14:20 ` Jun Nie 2016-12-05 2:29 ` [PATCH v7 2/5] mmc: zx: Initial support for ZX mmc controller Jun Nie 2016-12-08 1:28 ` [PATCH v7 0/5] Add intial support to DW MMC host on ZTE SoC Jun Nie 2016-12-05 2:29 ` [PATCH v7 3/5] Documentation: synopsys-dw-mshc: add binding for fifo quirks Jun Nie 2016-12-09 21:51 ` Rob Herring 2016-12-05 2:29 ` [PATCH v7 4/5] mmc: dw: Add fifo address property Jun Nie 2016-12-05 2:29 ` [PATCH v7 5/5] mmc: dw: Add fifo watermark alignment property Jun Nie
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).