
On 1/21/21 9:40 PM, Aswath Govindraju wrote:
From: Faiz Abbas faiz_abbas@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_abbas@ti.com Signed-off-by: Aswath Govindraju a-govindraju@ti.com
Reviewed-by: Jaehoon Chung jh80.chung@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);
}