Re: [PATCH 8/8] mmc: sunxi: Use mmc_of_parse()

2021-05-24 Thread Jaehoon Chung
On 5/25/21 8:30 AM, Andre Przywara wrote:
> At the moment the Allwinner MMC driver parses the bus-width and
> non-removable DT properties itself, in the probe() routine.
> 
> There is actually a generic function provided by the MMC framework doing
> this job, also it parses more generic properties like broken-cd and
> advanced transfer modes.
> 
> Drop our own code and call mmc_of_parse() instead, to get all new
> features for free.
> 
> Signed-off-by: Andre Przywara 

Reviewed-by: Jaehoon Chung 

Best Regards,
Jaehoon Chung
> ---
>  drivers/mmc/sunxi_mmc.c | 32 +---
>  1 file changed, 17 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
> index 115b519546e..178b8cf106d 100644
> --- a/drivers/mmc/sunxi_mmc.c
> +++ b/drivers/mmc/sunxi_mmc.c
> @@ -37,7 +37,6 @@ struct sunxi_mmc_priv {
>   uint32_t *mclkreg;
>   unsigned fatal_err;
>   struct gpio_desc cd_gpio;   /* Change Detect GPIO */
> - int cd_inverted;/* Inverted Card Detect */
>   struct sunxi_mmc *reg;
>   struct mmc_config cfg;
>  };
> @@ -612,12 +611,21 @@ static int sunxi_mmc_send_cmd(struct udevice *dev, 
> struct mmc_cmd *cmd,
>  
>  static int sunxi_mmc_getcd(struct udevice *dev)
>  {
> + struct mmc *mmc = mmc_get_mmc_dev(dev);
>   struct sunxi_mmc_priv *priv = dev_get_priv(dev);
>  
> + /* If polling, assume that the card is always present. */
> + if ((mmc->cfg->host_caps & MMC_CAP_NONREMOVABLE) ||
> + (mmc->cfg->host_caps & MMC_CAP_NEEDS_POLL))
> + return 1;
> +
>   if (dm_gpio_is_valid(>cd_gpio)) {
>   int cd_state = dm_gpio_get_value(>cd_gpio);
>  
> - return cd_state ^ priv->cd_inverted;
> + if (mmc->cfg->host_caps & MMC_CAP_CD_ACTIVE_HIGH)
> + return !cd_state;
> + else
> + return cd_state;
>   }
>   return 1;
>  }
> @@ -649,23 +657,21 @@ static int sunxi_mmc_probe(struct udevice *dev)
>   struct mmc_config *cfg = >cfg;
>   struct ofnode_phandle_args args;
>   u32 *ccu_reg;
> - int bus_width, ret;
> + int ret;
>  
>   cfg->name = dev->name;
> - bus_width = dev_read_u32_default(dev, "bus-width", 1);
>  
>   cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
> - cfg->host_caps = 0;
> - if (bus_width == 8)
> - cfg->host_caps |= MMC_MODE_8BIT;
> - if (bus_width >= 4)
> - cfg->host_caps |= MMC_MODE_4BIT;
> - cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
> + cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
>   cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
>  
>   cfg->f_min = 40;
>   cfg->f_max = 5200;
>  
> + ret = mmc_of_parse(dev, cfg);
> + if (ret)
> + return ret;
> +
>   priv->reg = dev_read_addr_ptr(dev);
>  
>   /* We don't have a sunxi clock driver so find the clock address here */
> @@ -691,17 +697,13 @@ static int sunxi_mmc_probe(struct udevice *dev)
>   return ret;
>  
>   /* This GPIO is optional */
> - if (!dev_read_bool(dev, "non-removable") &&
> - !gpio_request_by_name(dev, "cd-gpios", 0, >cd_gpio,
> + if (!gpio_request_by_name(dev, "cd-gpios", 0, >cd_gpio,
> GPIOD_IS_IN)) {
>   int cd_pin = gpio_get_number(>cd_gpio);
>  
>   sunxi_gpio_set_pull(cd_pin, SUNXI_GPIO_PULL_UP);
>   }
>  
> - /* Check if card detect is inverted */
> - priv->cd_inverted = dev_read_bool(dev, "cd-inverted");
> -
>   upriv->mmc = >mmc;
>  
>   /* Reset controller */
> 



[PATCH 8/8] mmc: sunxi: Use mmc_of_parse()

2021-05-24 Thread Andre Przywara
At the moment the Allwinner MMC driver parses the bus-width and
non-removable DT properties itself, in the probe() routine.

There is actually a generic function provided by the MMC framework doing
this job, also it parses more generic properties like broken-cd and
advanced transfer modes.

Drop our own code and call mmc_of_parse() instead, to get all new
features for free.

Signed-off-by: Andre Przywara 
---
 drivers/mmc/sunxi_mmc.c | 32 +---
 1 file changed, 17 insertions(+), 15 deletions(-)

diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
index 115b519546e..178b8cf106d 100644
--- a/drivers/mmc/sunxi_mmc.c
+++ b/drivers/mmc/sunxi_mmc.c
@@ -37,7 +37,6 @@ struct sunxi_mmc_priv {
uint32_t *mclkreg;
unsigned fatal_err;
struct gpio_desc cd_gpio;   /* Change Detect GPIO */
-   int cd_inverted;/* Inverted Card Detect */
struct sunxi_mmc *reg;
struct mmc_config cfg;
 };
@@ -612,12 +611,21 @@ static int sunxi_mmc_send_cmd(struct udevice *dev, struct 
mmc_cmd *cmd,
 
 static int sunxi_mmc_getcd(struct udevice *dev)
 {
+   struct mmc *mmc = mmc_get_mmc_dev(dev);
struct sunxi_mmc_priv *priv = dev_get_priv(dev);
 
+   /* If polling, assume that the card is always present. */
+   if ((mmc->cfg->host_caps & MMC_CAP_NONREMOVABLE) ||
+   (mmc->cfg->host_caps & MMC_CAP_NEEDS_POLL))
+   return 1;
+
if (dm_gpio_is_valid(>cd_gpio)) {
int cd_state = dm_gpio_get_value(>cd_gpio);
 
-   return cd_state ^ priv->cd_inverted;
+   if (mmc->cfg->host_caps & MMC_CAP_CD_ACTIVE_HIGH)
+   return !cd_state;
+   else
+   return cd_state;
}
return 1;
 }
@@ -649,23 +657,21 @@ static int sunxi_mmc_probe(struct udevice *dev)
struct mmc_config *cfg = >cfg;
struct ofnode_phandle_args args;
u32 *ccu_reg;
-   int bus_width, ret;
+   int ret;
 
cfg->name = dev->name;
-   bus_width = dev_read_u32_default(dev, "bus-width", 1);
 
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
-   cfg->host_caps = 0;
-   if (bus_width == 8)
-   cfg->host_caps |= MMC_MODE_8BIT;
-   if (bus_width >= 4)
-   cfg->host_caps |= MMC_MODE_4BIT;
-   cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
+   cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
 
cfg->f_min = 40;
cfg->f_max = 5200;
 
+   ret = mmc_of_parse(dev, cfg);
+   if (ret)
+   return ret;
+
priv->reg = dev_read_addr_ptr(dev);
 
/* We don't have a sunxi clock driver so find the clock address here */
@@ -691,17 +697,13 @@ static int sunxi_mmc_probe(struct udevice *dev)
return ret;
 
/* This GPIO is optional */
-   if (!dev_read_bool(dev, "non-removable") &&
-   !gpio_request_by_name(dev, "cd-gpios", 0, >cd_gpio,
+   if (!gpio_request_by_name(dev, "cd-gpios", 0, >cd_gpio,
  GPIOD_IS_IN)) {
int cd_pin = gpio_get_number(>cd_gpio);
 
sunxi_gpio_set_pull(cd_pin, SUNXI_GPIO_PULL_UP);
}
 
-   /* Check if card detect is inverted */
-   priv->cd_inverted = dev_read_bool(dev, "cd-inverted");
-
upriv->mmc = >mmc;
 
/* Reset controller */
-- 
2.17.5