[PATCH 1/3] mmc: sunxi: Refactor mod clock register offset

Jaehoon Chung jh80.chung at samsung.com
Mon Jan 11 02:33:32 CET 2021


On 1/11/21 10:03 AM, Andre Przywara wrote:
> So far the only difference between the various Allwinner MMC controller
> we are concerned about is the mod clock register offset.
> This is actually not directly related to the MMC controller IP, but an
> integration choice, dependent on the SoC this appears in.
> 
> To avoid becoming trapped with some compatible fallback strings, let's
> remove the whole struct sunxi_mmc_variant, and replace this with a SoC
> based choice, which we can derive from the CONFIG_MACH_SUNx_y symbols.
> 
> This will later simplify H616 support.
> 
> Signed-off-by: Andre Przywara <andre.przywara at arm.com>

Reviewed-by: Jaehoon Chung <jh80.chung at samsung.com>

Best Regards,
Jaehoon Chung

> ---
>  drivers/mmc/sunxi_mmc.c | 84 +++++++++++------------------------------
>  1 file changed, 23 insertions(+), 61 deletions(-)
> 
> diff --git a/drivers/mmc/sunxi_mmc.c b/drivers/mmc/sunxi_mmc.c
> index 0e03b07ce55..bbdbbc7a373 100644
> --- a/drivers/mmc/sunxi_mmc.c
> +++ b/drivers/mmc/sunxi_mmc.c
> @@ -23,12 +23,6 @@
>  #include <asm-generic/gpio.h>
>  #include <linux/delay.h>
>  
> -#ifdef CONFIG_DM_MMC
> -struct sunxi_mmc_variant {
> -	u16 mclk_offset;
> -};
> -#endif
> -
>  struct sunxi_mmc_plat {
>  	struct mmc_config cfg;
>  	struct mmc mmc;
> @@ -42,9 +36,6 @@ struct sunxi_mmc_priv {
>  	int cd_inverted;		/* Inverted Card Detect */
>  	struct sunxi_mmc *reg;
>  	struct mmc_config cfg;
> -#ifdef CONFIG_DM_MMC
> -	const struct sunxi_mmc_variant *variant;
> -#endif
>  };
>  
>  #if !CONFIG_IS_ENABLED(DM_MMC)
> @@ -605,6 +596,17 @@ static const struct dm_mmc_ops sunxi_mmc_ops = {
>  	.get_cd		= sunxi_mmc_getcd,
>  };
>  
> +static unsigned get_mclk_offset(void)
> +{
> +	if (IS_ENABLED(CONFIG_MACH_SUN9I_A80))
> +		return 0x410;
> +
> +	if (IS_ENABLED(CONFIG_MACH_SUN50I_H6))
> +		return 0x830;
> +
> +	return 0x88;
> +};
> +
>  static int sunxi_mmc_probe(struct udevice *dev)
>  {
>  	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
> @@ -633,8 +635,6 @@ static int sunxi_mmc_probe(struct udevice *dev)
>  	cfg->f_max = 52000000;
>  
>  	priv->reg = (void *)dev_read_addr(dev);
> -	priv->variant =
> -		(const struct sunxi_mmc_variant *)dev_get_driver_data(dev);
>  
>  	/* We don't have a sunxi clock driver so find the clock address here */
>  	ret = dev_read_phandle_with_args(dev, "clocks", "#clock-cells", 0,
> @@ -644,8 +644,7 @@ static int sunxi_mmc_probe(struct udevice *dev)
>  	ccu_reg = (u32 *)ofnode_get_addr(args.node);
>  
>  	priv->mmc_no = ((uintptr_t)priv->reg - SUNXI_MMC0_BASE) / 0x1000;
> -	priv->mclkreg = (void *)ccu_reg +
> -			(priv->variant->mclk_offset + (priv->mmc_no * 4));
> +	priv->mclkreg = (void *)ccu_reg + get_mclk_offset() + priv->mmc_no * 4;
>  
>  	ret = clk_get_by_name(dev, "ahb", &gate_clk);
>  	if (!ret)
> @@ -687,55 +686,18 @@ static int sunxi_mmc_bind(struct udevice *dev)
>  	return mmc_bind(dev, &plat->mmc, &plat->cfg);
>  }
>  
> -static const struct sunxi_mmc_variant sun4i_a10_variant = {
> -	.mclk_offset = 0x88,
> -};
> -
> -static const struct sunxi_mmc_variant sun9i_a80_variant = {
> -	.mclk_offset = 0x410,
> -};
> -
> -static const struct sunxi_mmc_variant sun50i_h6_variant = {
> -	.mclk_offset = 0x830,
> -};
> -
>  static const struct udevice_id sunxi_mmc_ids[] = {
> -	{
> -	  .compatible = "allwinner,sun4i-a10-mmc",
> -	  .data = (ulong)&sun4i_a10_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun5i-a13-mmc",
> -	  .data = (ulong)&sun4i_a10_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun7i-a20-mmc",
> -	  .data = (ulong)&sun4i_a10_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun8i-a83t-emmc",
> -	  .data = (ulong)&sun4i_a10_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun9i-a80-mmc",
> -	  .data = (ulong)&sun9i_a80_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun50i-a64-mmc",
> -	  .data = (ulong)&sun4i_a10_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun50i-a64-emmc",
> -	  .data = (ulong)&sun4i_a10_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun50i-h6-mmc",
> -	  .data = (ulong)&sun50i_h6_variant,
> -	},
> -	{
> -	  .compatible = "allwinner,sun50i-h6-emmc",
> -	  .data = (ulong)&sun50i_h6_variant,
> -	},
> +	{ .compatible = "allwinner,sun4i-a10-mmc" },
> +	{ .compatible = "allwinner,sun5i-a13-mmc" },
> +	{ .compatible = "allwinner,sun7i-a20-mmc" },
> +	{ .compatible = "allwinner,sun8i-a83t-emmc" },
> +	{ .compatible = "allwinner,sun9i-a80-mmc" },
> +	{ .compatible = "allwinner,sun50i-a64-mmc" },
> +	{ .compatible = "allwinner,sun50i-a64-emmc" },
> +	{ .compatible = "allwinner,sun50i-h6-mmc" },
> +	{ .compatible = "allwinner,sun50i-h6-emmc" },
> +	{ .compatible = "allwinner,sun50i-a100-mmc" },
> +	{ .compatible = "allwinner,sun50i-a100-emmc" },
>  	{ /* sentinel */ }
>  };
>  
> 



More information about the U-Boot mailing list