Re: [U-Boot] [PATCH V3] fsl: esdhc: support driver model

2016-04-06 Thread York Sun
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

2016-03-28 Thread Peng Fan
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

2016-03-28 Thread york sun
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

2016-03-27 Thread Peng Fan
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

2016-03-27 Thread Eric Nelson
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

2016-03-27 Thread york sun
(Sorry for top posting. Using OWA)

Yes, I can compile it for PPC and spot check on selected boards.

York



From: Peng Fan 
Sent: 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

2016-03-27 Thread Peng Fan
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

2016-03-27 Thread Peng Fan
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 Nelson 

Thanks, 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

2016-03-25 Thread Eric Nelson
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 Nelson 

Is 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

2016-03-25 Thread Peng Fan
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 *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