On 1/21/21 9:40 PM, Aswath Govindraju wrote: > From: Faiz Abbas <faiz_ab...@ti.com> > > Add Support for AM65x PG2.0. Use the SoC bus framework to fixup > the platform data and do DLL calibration if the revision is 1.0
Is there no method to get the revision from H/W? If not, looks good tome. > > Signed-off-by: Faiz Abbas <faiz_ab...@ti.com> > Signed-off-by: Aswath Govindraju <a-govindr...@ti.com> Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com> Best Regards, Jaehoon Chung > --- > drivers/mmc/am654_sdhci.c | 30 ++++++++++++++++++++++++++++++ > 1 file changed, 30 insertions(+) > > diff --git a/drivers/mmc/am654_sdhci.c b/drivers/mmc/am654_sdhci.c > index 1e0654183811..5790fa3d0dbf 100644 > --- a/drivers/mmc/am654_sdhci.c > +++ b/drivers/mmc/am654_sdhci.c > @@ -12,6 +12,7 @@ > #include <power-domain.h> > #include <regmap.h> > #include <sdhci.h> > +#include <soc.h> > #include <dm/device_compat.h> > #include <linux/bitops.h> > #include <linux/err.h> > @@ -292,6 +293,11 @@ const struct sdhci_ops am654_sdhci_ops = { > }; > > const struct am654_driver_data am654_drv_data = { > + .ops = &am654_sdhci_ops, > + .flags = DLL_PRESENT | IOMUX_PRESENT | FREQSEL_2_BIT | STRBSEL_4_BIT, > +}; > + > +const struct am654_driver_data am654_sr1_drv_data = { > .ops = &am654_sdhci_ops, > .flags = IOMUX_PRESENT | FREQSEL_2_BIT | DLL_PRESENT | DLL_CALIB | > STRBSEL_4_BIT, > @@ -326,6 +332,11 @@ const struct am654_driver_data j721e_4bit_drv_data = { > .flags = IOMUX_PRESENT, > }; > > +const struct soc_attr am654_sdhci_soc_attr[] = { > + { .family = "AM65X", .revision = "SR1.0", .data = &am654_sr1_drv_data}, > + {/* sentinel */} > +}; > + > static int sdhci_am654_get_otap_delay(struct udevice *dev, > struct mmc_config *cfg) > { > @@ -365,6 +376,8 @@ static int am654_sdhci_probe(struct udevice *dev) > struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); > struct sdhci_host *host = dev_get_priv(dev); > struct mmc_config *cfg = &plat->cfg; > + const struct soc_attr *soc; > + const struct am654_driver_data *soc_drv_data; > struct clk clk; > unsigned long clock; > int ret; > @@ -394,6 +407,14 @@ static int am654_sdhci_probe(struct udevice *dev) > return ret; > > host->ops = drv_data->ops; > + > + /* Update ops based on SoC revision */ > + soc = soc_device_match(am654_sdhci_soc_attr); > + if (soc && soc->data) { > + soc_drv_data = soc->data; > + host->ops = soc_drv_data->ops; > + } > + > host->mmc->priv = host; > upriv->mmc = host->mmc; > > @@ -458,9 +479,18 @@ static int am654_sdhci_bind(struct udevice *dev) > struct am654_driver_data *drv_data = > (struct am654_driver_data *)dev_get_driver_data(dev); > struct am654_sdhci_plat *plat = dev_get_plat(dev); > + const struct soc_attr *soc; > + const struct am654_driver_data *soc_drv_data; > > plat->flags = drv_data->flags; > > + /* Update flags based on SoC revision */ > + soc = soc_device_match(am654_sdhci_soc_attr); > + if (soc && soc->data) { > + soc_drv_data = soc->data; > + plat->flags = soc_drv_data->flags; > + } > + > return sdhci_bind(dev, &plat->mmc, &plat->cfg); > } > >