diff mbox

[U-Boot,v5,14/21] rockchip: mmc: get the fifo mode and fifo depth property from dts

Message ID 1447151098-2628-15-git-send-email-hl@rock-chips.com
State Changes Requested
Delegated to: Simon Glass
Headers show

Commit Message

Lin Huang Nov. 10, 2015, 10:24 a.m. UTC
rk3036 mmc do not have internal dma, so we use fifo mode when read
and write data, we get the fifo mode and fifo depth property from
dts, pass to dw_mmc driver.

Signed-off-by: Lin Huang <hl@rock-chips.com>
---
 arch/arm/dts/rk3036.dtsi      |  1 +
 drivers/mmc/rockchip_dw_mmc.c | 28 ++++++++++++++++++++++------
 2 files changed, 23 insertions(+), 6 deletions(-)

Comments

Simon Glass Nov. 13, 2015, 6:13 p.m. UTC | #1
Hi Lin,

On 10 November 2015 at 03:24, Lin Huang <hl@rock-chips.com> wrote:
> rk3036 mmc do not have internal dma, so we use fifo mode when read
> and write data, we get the fifo mode and fifo depth property from
> dts, pass to dw_mmc driver.
>
> Signed-off-by: Lin Huang <hl@rock-chips.com>
> ---
>  arch/arm/dts/rk3036.dtsi      |  1 +
>  drivers/mmc/rockchip_dw_mmc.c | 28 ++++++++++++++++++++++------
>  2 files changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/dts/rk3036.dtsi b/arch/arm/dts/rk3036.dtsi
> index 0daae1e..ecf5416 100644
> --- a/arch/arm/dts/rk3036.dtsi
> +++ b/arch/arm/dts/rk3036.dtsi
> @@ -257,6 +257,7 @@
>                 cap-mmc-highspeed;
>                 mmc-ddr-1_8v;
>                 disable-wp;
> +               fifo-mode;
>                 non-removable;
>                 num-slots = <1>;
>                 default-sample-phase = <158>;
> diff --git a/drivers/mmc/rockchip_dw_mmc.c b/drivers/mmc/rockchip_dw_mmc.c
> index f11c8e0..616e0bb 100644
> --- a/drivers/mmc/rockchip_dw_mmc.c
> +++ b/drivers/mmc/rockchip_dw_mmc.c
> @@ -50,8 +50,10 @@ static int rockchip_dwmmc_ofdata_to_platdata(struct udevice *dev)
>         host->get_mmc_clk = rockchip_dwmmc_get_mmc_clk;
>         host->priv = dev;
>
> -       /* TODO(sjg@chromium.org): Remove the need for this hack */
> -       host->dev_index = (ulong)host->ioaddr == 0xff0f0000 ? 0 : 1;
> +       /* use non-removeable as sdcard and emmc as judgement */
> +       if (fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset, "non-removable")
> +                                       == -FDT_ERR_NOTFOUND)
> +               host->dev_index = 1;

I think this should be a separate patch as it does not relate to your
commit message.

Also can you use fdtdec_get_bool() instead?

>
>         return 0;
>  }
> @@ -63,6 +65,7 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
>         struct dwmci_host *host = &priv->host;
>         u32 minmax[2];
>         int ret;
> +       u32 fifo_depth;

int, I think

>
>         priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
>         if (IS_ERR(priv->grf))
> @@ -71,10 +74,23 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
>         if (ret)
>                 return ret;
>
> -       ret = fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
> -                                  "clock-freq-min-max", minmax, 2);
> -       if (!ret)
> -               ret = add_dwmci(host, minmax[1], minmax[0]);
> +       if (fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
> +                                "clock-freq-min-max", minmax, 2))
> +               return -EINVAL;
> +
> +       fifo_depth = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
> +                                   "fifo-depth", 0);
> +       if (fifo_depth < 0)

Cannot be < 0 if u32 - so I think int is better.

> +               return -EINVAL;
> +
> +       host->fifoth_val = MSIZE(0x2) |
> +               RX_WMARK(fifo_depth / 2 - 1) | TX_WMARK(fifo_depth / 2);
> +
> +       if (fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset, "fifo-mode")
> +                                       != -FDT_ERR_NOTFOUND)

fdtdec_get_bool()

> +               host->fifo_mode = 1;

host->fifo_mode = true;

> +
> +       ret = add_dwmci(host, minmax[1], minmax[0]);
>         if (ret)
>                 return ret;
>
> --
> 1.9.1
>

Regards,
Simon
diff mbox

Patch

diff --git a/arch/arm/dts/rk3036.dtsi b/arch/arm/dts/rk3036.dtsi
index 0daae1e..ecf5416 100644
--- a/arch/arm/dts/rk3036.dtsi
+++ b/arch/arm/dts/rk3036.dtsi
@@ -257,6 +257,7 @@ 
 		cap-mmc-highspeed;
 		mmc-ddr-1_8v;
 		disable-wp;
+		fifo-mode;
 		non-removable;
 		num-slots = <1>;
 		default-sample-phase = <158>;
diff --git a/drivers/mmc/rockchip_dw_mmc.c b/drivers/mmc/rockchip_dw_mmc.c
index f11c8e0..616e0bb 100644
--- a/drivers/mmc/rockchip_dw_mmc.c
+++ b/drivers/mmc/rockchip_dw_mmc.c
@@ -50,8 +50,10 @@  static int rockchip_dwmmc_ofdata_to_platdata(struct udevice *dev)
 	host->get_mmc_clk = rockchip_dwmmc_get_mmc_clk;
 	host->priv = dev;
 
-	/* TODO(sjg@chromium.org): Remove the need for this hack */
-	host->dev_index = (ulong)host->ioaddr == 0xff0f0000 ? 0 : 1;
+	/* use non-removeable as sdcard and emmc as judgement */
+	if (fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset, "non-removable")
+					== -FDT_ERR_NOTFOUND)
+		host->dev_index = 1;
 
 	return 0;
 }
@@ -63,6 +65,7 @@  static int rockchip_dwmmc_probe(struct udevice *dev)
 	struct dwmci_host *host = &priv->host;
 	u32 minmax[2];
 	int ret;
+	u32 fifo_depth;
 
 	priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
 	if (IS_ERR(priv->grf))
@@ -71,10 +74,23 @@  static int rockchip_dwmmc_probe(struct udevice *dev)
 	if (ret)
 		return ret;
 
-	ret = fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
-				   "clock-freq-min-max", minmax, 2);
-	if (!ret)
-		ret = add_dwmci(host, minmax[1], minmax[0]);
+	if (fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
+				 "clock-freq-min-max", minmax, 2))
+		return -EINVAL;
+
+	fifo_depth = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+				    "fifo-depth", 0);
+	if (fifo_depth < 0)
+		return -EINVAL;
+
+	host->fifoth_val = MSIZE(0x2) |
+		RX_WMARK(fifo_depth / 2 - 1) | TX_WMARK(fifo_depth / 2);
+
+	if (fdtdec_lookup_phandle(gd->fdt_blob, dev->of_offset, "fifo-mode")
+					!= -FDT_ERR_NOTFOUND)
+		host->fifo_mode = 1;
+
+	ret = add_dwmci(host, minmax[1], minmax[0]);
 	if (ret)
 		return ret;