Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
On 03/24/2016 11:26 PM, Peng Fan wrote: > Support Driver Model for fsl esdhc driver. > > 1. Introduce a new structure struct fsl_esdhc_priv > 2. Refactor fsl_esdhc_initialize which is originally used by board code. >- Introduce fsl_esdhc_init to be common usage for DM and non-DM >- Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. >- The original API for board code is still there, but we use > 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. > 3. All the functions are changed to use 'struct fsl_esdhc_priv', except >fsl_esdhc_initialize. > 4. Since clk driver is not implemented, use mxc_get_clock to geth >the clk and fill 'priv->sdhc_clk'. > > Has been tested on i.MX6UL 14X14 EVK board: > " > =>dm tree > > simple_bus [ + ]| `-- aips-bus@0210 > mmc[ + ]| |-- usdhc@0219 > mmc[ + ]| |-- usdhc@02194000 > > => mmc list > FSL_SDHC: 0 (SD) > FSL_SDHC: 1 (SD) > " > > Signed-off-by: Peng Fan> Cc: York Sun > Cc: Yangbo Lu > Cc: Hector Palacios > Cc: Eric Nelson > Cc: Stefano Babic > Cc: Fabio Estevam > Cc: Pantelis Antoniou > Cc: Simon Glass > --- > > V3: > Fix build error reported by York for PPC. > > V2: > restructure the V1 patch. > Introduce fsl_esdhc_priv structure. > Introduce code to handle cd-gpios and non-removable. > > drivers/mmc/fsl_esdhc.c | 253 > > 1 file changed, 213 insertions(+), 40 deletions(-) Applied to u-boot-fsl-qoriq master. Awaiting upstream. Thanks. York ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
Hi York, On Mon, Mar 28, 2016 at 05:55:39PM +, york sun wrote: >On 03/27/2016 08:02 AM, Peng Fan wrote: >> Hi York, >> >> Could you test this patch for PPC and layerscape platform? Since I >> only test this on i.MX6 platform, I do not want to break PPC or else. >> >> Thanks, >> Peng. >> >> On Fri, Mar 25, 2016 at 02:16:56PM +0800, Peng Fan wrote: >>> Support Driver Model for fsl esdhc driver. >>> >>> 1. Introduce a new structure struct fsl_esdhc_priv >>> 2. Refactor fsl_esdhc_initialize which is originally used by board code. >>> - Introduce fsl_esdhc_init to be common usage for DM and non-DM >>> - Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. >>> - The original API for board code is still there, but we use >>> 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. >>> 3. All the functions are changed to use 'struct fsl_esdhc_priv', except >>> fsl_esdhc_initialize. >>> 4. Since clk driver is not implemented, use mxc_get_clock to geth >>> the clk and fill 'priv->sdhc_clk'. >>> >>> Has been tested on i.MX6UL 14X14 EVK board: >>> " >>> =>dm tree >>> >>> simple_bus [ + ]| `-- aips-bus@0210 >>> mmc[ + ]| |-- usdhc@0219 >>> mmc[ + ]| |-- usdhc@02194000 >>> >>> => mmc list >>> FSL_SDHC: 0 (SD) >>> FSL_SDHC: 1 (SD) >>> " >>> >>> Signed-off-by: Peng Fan>>> Cc: York Sun >>> Cc: Yangbo Lu >>> Cc: Hector Palacios >>> Cc: Eric Nelson >>> Cc: Stefano Babic >>> Cc: Fabio Estevam >>> Cc: Pantelis Antoniou >>> Cc: Simon Glass >>> --- >>> >>> V3: >>> Fix build error reported by York for PPC. >>> >>> V2: >>> restructure the V1 patch. >>> Introduce fsl_esdhc_priv structure. >>> Introduce code to handle cd-gpios and non-removable. > > > >>> + >>> +#ifdef CONFIG_DM_MMC >>> +#include >>> +static int fsl_esdhc_probe(struct udevice *dev) >>> +{ >>> + struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); >>> + struct fsl_esdhc_priv *priv = dev_get_priv(dev); >>> + const void *fdt = gd->fdt_blob; >>> + int node = dev->of_offset; >>> + fdt_addr_t addr; >>> + unsigned int val; >>> + int ret; >>> + >>> + addr = dev_get_addr(dev); >>> + if (addr == FDT_ADDR_T_NONE) >>> + return -EINVAL; >>> + >>> + priv->esdhc_regs = (struct fsl_esdhc *)addr; >>> + priv->dev = dev; >>> + >>> + val = fdtdec_get_int(fdt, node, "bus-width", -1); >>> + if (val == 8) >>> + priv->bus_width = 8; >>> + else if (val == 4) >>> + priv->bus_width = 4; >>> + else >>> + priv->bus_width = 1; >>> + >>> + if (fdt_get_property(fdt, node, "non-removable", NULL)) { >>> + priv->non_removable = 1; >>> +} else { >>> + priv->non_removable = 0; >>> + gpio_request_by_name_nodev(fdt, node, "cd-gpios", 0, >>> + >cd_gpio, GPIOD_IS_IN); >>> + } >>> + >>> + /* >>> +* TODO: >>> +* Because lack of clk driver, if SDHC clk is not enabled, >>> +* need to enable it first before this driver is invoked. >>> +* >>> +* we use MXC_ESDHC_CLK to get clk freq. >>> +* If one would like to make this function work, >>> +* the aliases should be provided in dts as this: >>> +* >>> +* aliases { >>> +* mmc0 = >>> +* mmc1 = >>> +* mmc2 = >>> +* mmc3 = >>> +* }; >>> +* Then if your board only supports mmc2 and mmc3, but we can >>> +* correctly get the seq as 2 and 3, then let mxc_get_clock >>> +* work as expected. >>> +*/ >>> + priv->sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK + dev->seq); >>> + if (priv->sdhc_clk <= 0) { >>> + dev_err(dev, "Unable to get clk for %s\n", dev->name); >>> + return -EINVAL; >>> + } >>> + >>> + ret = fsl_esdhc_init(priv); >>> + if (ret) { >>> + dev_err(dev, "fsl_esdhc_init failure\n"); >>> + return ret; >>> + } >>> + >>> + upriv->mmc = priv->mmc; >>> + >>> + return 0; >>> +} >>> + >>> +static const struct udevice_id fsl_esdhc_ids[] = { >>> + { .compatible = "fsl,imx6ul-usdhc", }, >>> + { .compatible = "fsl,imx6sx-usdhc", }, >>> + { .compatible = "fsl,imx6sl-usdhc", }, >>> + { .compatible = "fsl,imx6q-usdhc", }, >>> + { .compatible = "fsl,imx7d-usdhc", }, >>> + { /* sentinel */ } >>> +}; >>> + >>> +U_BOOT_DRIVER(fsl_esdhc) = { >>> + .name = "fsl-esdhc-mmc", >>> + .id = UCLASS_MMC, >>> + .of_match = fsl_esdhc_ids, >>> + .probe = fsl_esdhc_probe, >>> + .priv_auto_alloc_size = sizeof(struct fsl_esdhc_priv), >>> +}; >>> +#endif >>> -- >>> 2.6.2 >>> >> > >Peng, > >You are not breaking PPC yet. The new function you added fsl_esdhc_probe() is >gated by CONFIG_DM_MMC. This macro is not defined for any PPC platform. Thanks for the test. If
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
On 03/27/2016 08:02 AM, Peng Fan wrote: > Hi York, > > Could you test this patch for PPC and layerscape platform? Since I > only test this on i.MX6 platform, I do not want to break PPC or else. > > Thanks, > Peng. > > On Fri, Mar 25, 2016 at 02:16:56PM +0800, Peng Fan wrote: >> Support Driver Model for fsl esdhc driver. >> >> 1. Introduce a new structure struct fsl_esdhc_priv >> 2. Refactor fsl_esdhc_initialize which is originally used by board code. >> - Introduce fsl_esdhc_init to be common usage for DM and non-DM >> - Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. >> - The original API for board code is still there, but we use >> 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. >> 3. All the functions are changed to use 'struct fsl_esdhc_priv', except >> fsl_esdhc_initialize. >> 4. Since clk driver is not implemented, use mxc_get_clock to geth >> the clk and fill 'priv->sdhc_clk'. >> >> Has been tested on i.MX6UL 14X14 EVK board: >> " >> =>dm tree >> >> simple_bus [ + ]| `-- aips-bus@0210 >> mmc[ + ]| |-- usdhc@0219 >> mmc[ + ]| |-- usdhc@02194000 >> >> => mmc list >> FSL_SDHC: 0 (SD) >> FSL_SDHC: 1 (SD) >> " >> >> Signed-off-by: Peng Fan>> Cc: York Sun >> Cc: Yangbo Lu >> Cc: Hector Palacios >> Cc: Eric Nelson >> Cc: Stefano Babic >> Cc: Fabio Estevam >> Cc: Pantelis Antoniou >> Cc: Simon Glass >> --- >> >> V3: >> Fix build error reported by York for PPC. >> >> V2: >> restructure the V1 patch. >> Introduce fsl_esdhc_priv structure. >> Introduce code to handle cd-gpios and non-removable. >> + >> +#ifdef CONFIG_DM_MMC >> +#include >> +static int fsl_esdhc_probe(struct udevice *dev) >> +{ >> +struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); >> +struct fsl_esdhc_priv *priv = dev_get_priv(dev); >> +const void *fdt = gd->fdt_blob; >> +int node = dev->of_offset; >> +fdt_addr_t addr; >> +unsigned int val; >> +int ret; >> + >> +addr = dev_get_addr(dev); >> +if (addr == FDT_ADDR_T_NONE) >> +return -EINVAL; >> + >> +priv->esdhc_regs = (struct fsl_esdhc *)addr; >> +priv->dev = dev; >> + >> +val = fdtdec_get_int(fdt, node, "bus-width", -1); >> +if (val == 8) >> +priv->bus_width = 8; >> +else if (val == 4) >> +priv->bus_width = 4; >> +else >> +priv->bus_width = 1; >> + >> +if (fdt_get_property(fdt, node, "non-removable", NULL)) { >> +priv->non_removable = 1; >> + } else { >> +priv->non_removable = 0; >> +gpio_request_by_name_nodev(fdt, node, "cd-gpios", 0, >> + >cd_gpio, GPIOD_IS_IN); >> +} >> + >> +/* >> + * TODO: >> + * Because lack of clk driver, if SDHC clk is not enabled, >> + * need to enable it first before this driver is invoked. >> + * >> + * we use MXC_ESDHC_CLK to get clk freq. >> + * If one would like to make this function work, >> + * the aliases should be provided in dts as this: >> + * >> + * aliases { >> + * mmc0 = >> + * mmc1 = >> + * mmc2 = >> + * mmc3 = >> + * }; >> + * Then if your board only supports mmc2 and mmc3, but we can >> + * correctly get the seq as 2 and 3, then let mxc_get_clock >> + * work as expected. >> + */ >> +priv->sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK + dev->seq); >> +if (priv->sdhc_clk <= 0) { >> +dev_err(dev, "Unable to get clk for %s\n", dev->name); >> +return -EINVAL; >> +} >> + >> +ret = fsl_esdhc_init(priv); >> +if (ret) { >> +dev_err(dev, "fsl_esdhc_init failure\n"); >> +return ret; >> +} >> + >> +upriv->mmc = priv->mmc; >> + >> +return 0; >> +} >> + >> +static const struct udevice_id fsl_esdhc_ids[] = { >> +{ .compatible = "fsl,imx6ul-usdhc", }, >> +{ .compatible = "fsl,imx6sx-usdhc", }, >> +{ .compatible = "fsl,imx6sl-usdhc", }, >> +{ .compatible = "fsl,imx6q-usdhc", }, >> +{ .compatible = "fsl,imx7d-usdhc", }, >> +{ /* sentinel */ } >> +}; >> + >> +U_BOOT_DRIVER(fsl_esdhc) = { >> +.name = "fsl-esdhc-mmc", >> +.id = UCLASS_MMC, >> +.of_match = fsl_esdhc_ids, >> +.probe = fsl_esdhc_probe, >> +.priv_auto_alloc_size = sizeof(struct fsl_esdhc_priv), >> +}; >> +#endif >> -- >> 2.6.2 >> > Peng, You are not breaking PPC yet. The new function you added fsl_esdhc_probe() is gated by CONFIG_DM_MMC. This macro is not defined for any PPC platform. York ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
Hi Eric, On Sun, Mar 27, 2016 at 11:18:00AM -0700, Eric Nelson wrote: >Hi Peng, > >On 03/27/2016 07:57 AM, Peng Fan wrote: >> On Fri, Mar 25, 2016 at 01:12:39PM -0700, Eric Nelson wrote: >>> On 03/24/2016 11:16 PM, Peng Fan wrote: Support Driver Model for fsl esdhc driver. 1. Introduce a new structure struct fsl_esdhc_priv 2. Refactor fsl_esdhc_initialize which is originally used by board code. - Introduce fsl_esdhc_init to be common usage for DM and non-DM - Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. - The original API for board code is still there, but we use 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. 3. All the functions are changed to use 'struct fsl_esdhc_priv', except fsl_esdhc_initialize. 4. Since clk driver is not implemented, use mxc_get_clock to geth the clk and fill 'priv->sdhc_clk'. Has been tested on i.MX6UL 14X14 EVK board: " =>dm tree simple_bus [ + ]| `-- aips-bus@0210 mmc[ + ]| |-- usdhc@0219 mmc[ + ]| |-- usdhc@02194000 => mmc list FSL_SDHC: 0 (SD) FSL_SDHC: 1 (SD) " >>> >>> After pulling in device tree files from the mainline kernel, I was able >>> to test this on a SABRE Lite, so you can add my: >>> >>> Tested-By: Eric Nelson>> >> Thanks, Eric. >> > >Thank you for adding this support. > >>> >>> Is somebody prepping patches to pull in support for i.MX6DQ? >> >> I can not follow you on this? you mean adding dts files for i.MX6DQ or else? >> > >Yes, or at least the .dtsi and .h files from arch/arm/boot/dts/. > >Your i.MX6UL patch pulled in the files needed for UL, and the same >is needed for i.MX6DQ, i.MX6SX and such. > >I have a patch pulling i.MX6DQ files from linux-stable (4.4), but That's great. >don't want to jump in the middle if somebody else is doing this. I have not began this. If you have patches, feel free to post them out:) Thanks, Peng. > >Regards, > > >Eric ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
Hi Peng, On 03/27/2016 07:57 AM, Peng Fan wrote: > On Fri, Mar 25, 2016 at 01:12:39PM -0700, Eric Nelson wrote: >> On 03/24/2016 11:16 PM, Peng Fan wrote: >>> Support Driver Model for fsl esdhc driver. >>> >>> 1. Introduce a new structure struct fsl_esdhc_priv >>> 2. Refactor fsl_esdhc_initialize which is originally used by board code. >>>- Introduce fsl_esdhc_init to be common usage for DM and non-DM >>>- Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. >>>- The original API for board code is still there, but we use >>> 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. >>> 3. All the functions are changed to use 'struct fsl_esdhc_priv', except >>>fsl_esdhc_initialize. >>> 4. Since clk driver is not implemented, use mxc_get_clock to geth >>>the clk and fill 'priv->sdhc_clk'. >>> >>> Has been tested on i.MX6UL 14X14 EVK board: >>> " >>> =>dm tree >>> >>> simple_bus [ + ]| `-- aips-bus@0210 >>> mmc[ + ]| |-- usdhc@0219 >>> mmc[ + ]| |-- usdhc@02194000 >>> >>> => mmc list >>> FSL_SDHC: 0 (SD) >>> FSL_SDHC: 1 (SD) >>> " >>> >> >> After pulling in device tree files from the mainline kernel, I was able >> to test this on a SABRE Lite, so you can add my: >> >> Tested-By: Eric Nelson> > Thanks, Eric. > Thank you for adding this support. >> >> Is somebody prepping patches to pull in support for i.MX6DQ? > > I can not follow you on this? you mean adding dts files for i.MX6DQ or else? > Yes, or at least the .dtsi and .h files from arch/arm/boot/dts/. Your i.MX6UL patch pulled in the files needed for UL, and the same is needed for i.MX6DQ, i.MX6SX and such. I have a patch pulling i.MX6DQ files from linux-stable (4.4), but don't want to jump in the middle if somebody else is doing this. Regards, Eric ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
(Sorry for top posting. Using OWA) Yes, I can compile it for PPC and spot check on selected boards. York From: Peng FanSent: Sunday, March 27, 2016 7:59 AM To: york sun; pa...@antoniou-consulting.com; sba...@denx.de; s...@chromium.org Cc: u-boot@lists.denx.de; Yangbo Lu; Hector Palacios; Eric Nelson; Fabio Estevam Subject: Re: [PATCH V3] fsl: esdhc: support driver model Hi York, Could you test this patch for PPC and layerscape platform? Since I only test this on i.MX6 platform, I do not want to break PPC or else. Thanks, Peng. On Fri, Mar 25, 2016 at 02:16:56PM +0800, Peng Fan wrote: >Support Driver Model for fsl esdhc driver. > >1. Introduce a new structure struct fsl_esdhc_priv >2. Refactor fsl_esdhc_initialize which is originally used by board code. > - Introduce fsl_esdhc_init to be common usage for DM and non-DM > - Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. > - The original API for board code is still there, but we use > 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. >3. All the functions are changed to use 'struct fsl_esdhc_priv', except > fsl_esdhc_initialize. >4. Since clk driver is not implemented, use mxc_get_clock to geth > the clk and fill 'priv->sdhc_clk'. > >Has been tested on i.MX6UL 14X14 EVK board: >" >=>dm tree > > simple_bus [ + ]| `-- aips-bus@0210 > mmc[ + ]| |-- usdhc@0219 > mmc[ + ]| |-- usdhc@02194000 > >=> mmc list >FSL_SDHC: 0 (SD) >FSL_SDHC: 1 (SD) >" > >Signed-off-by: Peng Fan >Cc: York Sun >Cc: Yangbo Lu >Cc: Hector Palacios >Cc: Eric Nelson >Cc: Stefano Babic >Cc: Fabio Estevam >Cc: Pantelis Antoniou >Cc: Simon Glass >--- > >V3: > Fix build error reported by York for PPC. > >V2: > restructure the V1 patch. > Introduce fsl_esdhc_priv structure. > Introduce code to handle cd-gpios and non-removable. > > drivers/mmc/fsl_esdhc.c | 253 > 1 file changed, 213 insertions(+), 40 deletions(-) > >diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c >index ea5f4bf..3acf9e8 100644 >--- a/drivers/mmc/fsl_esdhc.c >+++ b/drivers/mmc/fsl_esdhc.c >@@ -20,6 +20,8 @@ > #include > #include > #include >+#include >+#include > > DECLARE_GLOBAL_DATA_PTR; > >@@ -72,6 +74,30 @@ struct fsl_esdhc { > uintscr;/* eSDHC control register */ > }; > >+/** >+ * struct fsl_esdhc_priv >+ * >+ * @esdhc_regs: registers of the sdhc controller >+ * @sdhc_clk: Current clk of the sdhc controller >+ * @bus_width: bus width, 1bit, 4bit or 8bit >+ * @cfg: mmc config >+ * @mmc: mmc >+ * Following is used when Driver Model is enabled for MMC >+ * @dev: pointer for the device >+ * @non_removable: 0: removable; 1: non-removable >+ * @cd_gpio: gpio for card detection >+ */ >+struct fsl_esdhc_priv { >+ struct fsl_esdhc *esdhc_regs; >+ unsigned int sdhc_clk; >+ unsigned int bus_width; >+ struct mmc_config cfg; >+ struct mmc *mmc; >+ struct udevice *dev; >+ int non_removable; >+ struct gpio_desc cd_gpio; >+}; >+ > /* Return the XFERTYP flags for a given command and data packet */ > static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data) > { >@@ -118,8 +144,8 @@ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct >mmc_data *data) > static void > esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data) > { >- struct fsl_esdhc_cfg *cfg = mmc->priv; >- struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; >+ struct fsl_esdhc_priv *priv = mmc->priv; >+ struct fsl_esdhc *regs = priv->esdhc_regs; > uint blocks; > char *buffer; > uint databuf; >@@ -180,8 +206,8 @@ esdhc_pio_read_write(struct mmc *mmc, struct mmc_data >*data) > static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) > { > int timeout; >- struct fsl_esdhc_cfg *cfg = mmc->priv; >- struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; >+ struct fsl_esdhc_priv *priv = mmc->priv; >+ struct fsl_esdhc *regs = priv->esdhc_regs; > #ifdef CONFIG_FSL_LAYERSCAPE > dma_addr_t addr; > #endif >@@ -312,8 +338,8 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, >struct mmc_data *data) > int err = 0; > uintxfertyp; > uintirqstat; >- struct fsl_esdhc_cfg *cfg = mmc->priv; >- volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; >+ struct fsl_esdhc_priv *priv = mmc->priv; >+ struct fsl_esdhc *regs = priv->esdhc_regs; > > #ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111 > if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) >@@ -482,9 +508,9 @@ out: > static void set_sysctl(struct mmc *mmc, uint clock) > { >
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
Hi York, Could you test this patch for PPC and layerscape platform? Since I only test this on i.MX6 platform, I do not want to break PPC or else. Thanks, Peng. On Fri, Mar 25, 2016 at 02:16:56PM +0800, Peng Fan wrote: >Support Driver Model for fsl esdhc driver. > >1. Introduce a new structure struct fsl_esdhc_priv >2. Refactor fsl_esdhc_initialize which is originally used by board code. > - Introduce fsl_esdhc_init to be common usage for DM and non-DM > - Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. > - The original API for board code is still there, but we use > 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. >3. All the functions are changed to use 'struct fsl_esdhc_priv', except > fsl_esdhc_initialize. >4. Since clk driver is not implemented, use mxc_get_clock to geth > the clk and fill 'priv->sdhc_clk'. > >Has been tested on i.MX6UL 14X14 EVK board: >" >=>dm tree > > simple_bus [ + ]| `-- aips-bus@0210 > mmc[ + ]| |-- usdhc@0219 > mmc[ + ]| |-- usdhc@02194000 > >=> mmc list >FSL_SDHC: 0 (SD) >FSL_SDHC: 1 (SD) >" > >Signed-off-by: Peng Fan>Cc: York Sun >Cc: Yangbo Lu >Cc: Hector Palacios >Cc: Eric Nelson >Cc: Stefano Babic >Cc: Fabio Estevam >Cc: Pantelis Antoniou >Cc: Simon Glass >--- > >V3: > Fix build error reported by York for PPC. > >V2: > restructure the V1 patch. > Introduce fsl_esdhc_priv structure. > Introduce code to handle cd-gpios and non-removable. > > drivers/mmc/fsl_esdhc.c | 253 > 1 file changed, 213 insertions(+), 40 deletions(-) > >diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c >index ea5f4bf..3acf9e8 100644 >--- a/drivers/mmc/fsl_esdhc.c >+++ b/drivers/mmc/fsl_esdhc.c >@@ -20,6 +20,8 @@ > #include > #include > #include >+#include >+#include > > DECLARE_GLOBAL_DATA_PTR; > >@@ -72,6 +74,30 @@ struct fsl_esdhc { > uintscr;/* eSDHC control register */ > }; > >+/** >+ * struct fsl_esdhc_priv >+ * >+ * @esdhc_regs: registers of the sdhc controller >+ * @sdhc_clk: Current clk of the sdhc controller >+ * @bus_width: bus width, 1bit, 4bit or 8bit >+ * @cfg: mmc config >+ * @mmc: mmc >+ * Following is used when Driver Model is enabled for MMC >+ * @dev: pointer for the device >+ * @non_removable: 0: removable; 1: non-removable >+ * @cd_gpio: gpio for card detection >+ */ >+struct fsl_esdhc_priv { >+ struct fsl_esdhc *esdhc_regs; >+ unsigned int sdhc_clk; >+ unsigned int bus_width; >+ struct mmc_config cfg; >+ struct mmc *mmc; >+ struct udevice *dev; >+ int non_removable; >+ struct gpio_desc cd_gpio; >+}; >+ > /* Return the XFERTYP flags for a given command and data packet */ > static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data) > { >@@ -118,8 +144,8 @@ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct >mmc_data *data) > static void > esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data) > { >- struct fsl_esdhc_cfg *cfg = mmc->priv; >- struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; >+ struct fsl_esdhc_priv *priv = mmc->priv; >+ struct fsl_esdhc *regs = priv->esdhc_regs; > uint blocks; > char *buffer; > uint databuf; >@@ -180,8 +206,8 @@ esdhc_pio_read_write(struct mmc *mmc, struct mmc_data >*data) > static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) > { > int timeout; >- struct fsl_esdhc_cfg *cfg = mmc->priv; >- struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; >+ struct fsl_esdhc_priv *priv = mmc->priv; >+ struct fsl_esdhc *regs = priv->esdhc_regs; > #ifdef CONFIG_FSL_LAYERSCAPE > dma_addr_t addr; > #endif >@@ -312,8 +338,8 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, >struct mmc_data *data) > int err = 0; > uintxfertyp; > uintirqstat; >- struct fsl_esdhc_cfg *cfg = mmc->priv; >- volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; >+ struct fsl_esdhc_priv *priv = mmc->priv; >+ struct fsl_esdhc *regs = priv->esdhc_regs; > > #ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111 > if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) >@@ -482,9 +508,9 @@ out: > static void set_sysctl(struct mmc *mmc, uint clock) > { > int div, pre_div; >- struct fsl_esdhc_cfg *cfg = mmc->priv; >- volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; >- int sdhc_clk = cfg->sdhc_clk; >+ struct fsl_esdhc_priv *priv = mmc->priv; >+ struct fsl_esdhc *regs = priv->esdhc_regs; >+ int sdhc_clk = priv->sdhc_clk; > uint clk; > > if (clock < mmc->cfg->f_min) >@@ -527,8 +553,8 @@ static void set_sysctl(struct mmc
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
Hi Eric, On Fri, Mar 25, 2016 at 01:12:39PM -0700, Eric Nelson wrote: >Hi Peng, > >On 03/24/2016 11:16 PM, Peng Fan wrote: >> Support Driver Model for fsl esdhc driver. >> >> 1. Introduce a new structure struct fsl_esdhc_priv >> 2. Refactor fsl_esdhc_initialize which is originally used by board code. >>- Introduce fsl_esdhc_init to be common usage for DM and non-DM >>- Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. >>- The original API for board code is still there, but we use >> 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. >> 3. All the functions are changed to use 'struct fsl_esdhc_priv', except >>fsl_esdhc_initialize. >> 4. Since clk driver is not implemented, use mxc_get_clock to geth >>the clk and fill 'priv->sdhc_clk'. >> >> Has been tested on i.MX6UL 14X14 EVK board: >> " >> =>dm tree >> >> simple_bus [ + ]| `-- aips-bus@0210 >> mmc[ + ]| |-- usdhc@0219 >> mmc[ + ]| |-- usdhc@02194000 >> >> => mmc list >> FSL_SDHC: 0 (SD) >> FSL_SDHC: 1 (SD) >> " >> > >After pulling in device tree files from the mainline kernel, I was able >to test this on a SABRE Lite, so you can add my: > >Tested-By: Eric NelsonThanks, Eric. > >Is somebody prepping patches to pull in support for i.MX6DQ? I can not follow you on this? you mean adding dts files for i.MX6DQ or else? Regards, Peng > >Please advise, > > >Eric ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model
Hi Peng, On 03/24/2016 11:16 PM, Peng Fan wrote: > Support Driver Model for fsl esdhc driver. > > 1. Introduce a new structure struct fsl_esdhc_priv > 2. Refactor fsl_esdhc_initialize which is originally used by board code. >- Introduce fsl_esdhc_init to be common usage for DM and non-DM >- Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. >- The original API for board code is still there, but we use > 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. > 3. All the functions are changed to use 'struct fsl_esdhc_priv', except >fsl_esdhc_initialize. > 4. Since clk driver is not implemented, use mxc_get_clock to geth >the clk and fill 'priv->sdhc_clk'. > > Has been tested on i.MX6UL 14X14 EVK board: > " > =>dm tree > > simple_bus [ + ]| `-- aips-bus@0210 > mmc[ + ]| |-- usdhc@0219 > mmc[ + ]| |-- usdhc@02194000 > > => mmc list > FSL_SDHC: 0 (SD) > FSL_SDHC: 1 (SD) > " > After pulling in device tree files from the mainline kernel, I was able to test this on a SABRE Lite, so you can add my: Tested-By: Eric NelsonIs somebody prepping patches to pull in support for i.MX6DQ? Please advise, Eric ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
[U-Boot] [PATCH V3] fsl: esdhc: support driver model
Support Driver Model for fsl esdhc driver. 1. Introduce a new structure struct fsl_esdhc_priv 2. Refactor fsl_esdhc_initialize which is originally used by board code. - Introduce fsl_esdhc_init to be common usage for DM and non-DM - Introduce fsl_esdhc_cfg_to_priv to build the bridge for non-DM part. - The original API for board code is still there, but we use 'fsl_esdhc_cfg_to_priv' and 'fsl_esdhc_init' to serve it. 3. All the functions are changed to use 'struct fsl_esdhc_priv', except fsl_esdhc_initialize. 4. Since clk driver is not implemented, use mxc_get_clock to geth the clk and fill 'priv->sdhc_clk'. Has been tested on i.MX6UL 14X14 EVK board: " =>dm tree simple_bus [ + ]| `-- aips-bus@0210 mmc[ + ]| |-- usdhc@0219 mmc[ + ]| |-- usdhc@02194000 => mmc list FSL_SDHC: 0 (SD) FSL_SDHC: 1 (SD) " Signed-off-by: Peng FanCc: York Sun Cc: Yangbo Lu Cc: Hector Palacios Cc: Eric Nelson Cc: Stefano Babic Cc: Fabio Estevam Cc: Pantelis Antoniou Cc: Simon Glass --- V3: Fix build error reported by York for PPC. V2: restructure the V1 patch. Introduce fsl_esdhc_priv structure. Introduce code to handle cd-gpios and non-removable. drivers/mmc/fsl_esdhc.c | 253 1 file changed, 213 insertions(+), 40 deletions(-) diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c index ea5f4bf..3acf9e8 100644 --- a/drivers/mmc/fsl_esdhc.c +++ b/drivers/mmc/fsl_esdhc.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include DECLARE_GLOBAL_DATA_PTR; @@ -72,6 +74,30 @@ struct fsl_esdhc { uintscr;/* eSDHC control register */ }; +/** + * struct fsl_esdhc_priv + * + * @esdhc_regs: registers of the sdhc controller + * @sdhc_clk: Current clk of the sdhc controller + * @bus_width: bus width, 1bit, 4bit or 8bit + * @cfg: mmc config + * @mmc: mmc + * Following is used when Driver Model is enabled for MMC + * @dev: pointer for the device + * @non_removable: 0: removable; 1: non-removable + * @cd_gpio: gpio for card detection + */ +struct fsl_esdhc_priv { + struct fsl_esdhc *esdhc_regs; + unsigned int sdhc_clk; + unsigned int bus_width; + struct mmc_config cfg; + struct mmc *mmc; + struct udevice *dev; + int non_removable; + struct gpio_desc cd_gpio; +}; + /* Return the XFERTYP flags for a given command and data packet */ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data) { @@ -118,8 +144,8 @@ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data) static void esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data) { - struct fsl_esdhc_cfg *cfg = mmc->priv; - struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; + struct fsl_esdhc_priv *priv = mmc->priv; + struct fsl_esdhc *regs = priv->esdhc_regs; uint blocks; char *buffer; uint databuf; @@ -180,8 +206,8 @@ esdhc_pio_read_write(struct mmc *mmc, struct mmc_data *data) static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data) { int timeout; - struct fsl_esdhc_cfg *cfg = mmc->priv; - struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; + struct fsl_esdhc_priv *priv = mmc->priv; + struct fsl_esdhc *regs = priv->esdhc_regs; #ifdef CONFIG_FSL_LAYERSCAPE dma_addr_t addr; #endif @@ -312,8 +338,8 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data) int err = 0; uintxfertyp; uintirqstat; - struct fsl_esdhc_cfg *cfg = mmc->priv; - volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; + struct fsl_esdhc_priv *priv = mmc->priv; + struct fsl_esdhc *regs = priv->esdhc_regs; #ifdef CONFIG_SYS_FSL_ERRATUM_ESDHC111 if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION) @@ -482,9 +508,9 @@ out: static void set_sysctl(struct mmc *mmc, uint clock) { int div, pre_div; - struct fsl_esdhc_cfg *cfg = mmc->priv; - volatile struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; - int sdhc_clk = cfg->sdhc_clk; + struct fsl_esdhc_priv *priv = mmc->priv; + struct fsl_esdhc *regs = priv->esdhc_regs; + int sdhc_clk = priv->sdhc_clk; uint clk; if (clock < mmc->cfg->f_min) @@ -527,8 +553,8 @@ static void set_sysctl(struct mmc *mmc, uint clock) #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK static void esdhc_clock_control(struct mmc *mmc, bool enable) { - struct fsl_esdhc_cfg *cfg = mmc->priv; - struct fsl_esdhc *regs = (struct fsl_esdhc *)cfg->esdhc_base; + struct fsl_esdhc_priv *priv = mmc->priv; + struct fsl_esdhc *regs