From: T Karthik Reddy Date: Mon, 12 Jul 2021 11:29:43 +0000 (-0600) Subject: mmc: zynq_sdhci: Use pm_node id instead of device sequence id X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d6ad7d204b38f37cc88875b12091bd5e554d207d;p=thirdparty%2Fu-boot.git mmc: zynq_sdhci: Use pm_node id instead of device sequence id When programming tapdelays & resetting dll, we are using device sequence id, which is not programming tapelays & dll reset. So use pm_node id instead of device sequence id to fix above issue. Also use u8 instead of u32 for node_id variable as we have pm_node ids less than 128. Signed-off-by: T Karthik Reddy Reviewed-by: Ashok Reddy Soma --- diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c index ba13c48e352..16fd9799bfa 100644 --- a/drivers/mmc/zynq_sdhci.c +++ b/drivers/mmc/zynq_sdhci.c @@ -125,15 +125,14 @@ static int arasan_sdhci_execute_tuning(struct mmc *mmc, u8 opcode) struct mmc_cmd cmd; struct mmc_data data; u32 ctrl; + u8 node_id = mmc->dev->seq ? NODE_SD_0 : NODE_SD_1; struct sdhci_host *host; struct arasan_sdhci_priv *priv = dev_get_priv(mmc->dev); char tuning_loop_counter = SDHCI_TUNING_LOOP_COUNT; - u8 deviceid; debug("%s\n", __func__); host = priv->host; - deviceid = priv->deviceid; ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); ctrl |= SDHCI_CTRL_EXEC_TUNING; @@ -141,7 +140,7 @@ static int arasan_sdhci_execute_tuning(struct mmc *mmc, u8 opcode) mdelay(1); - arasan_zynqmp_dll_reset(host, deviceid); + arasan_zynqmp_dll_reset(host, node_id); sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_INT_ENABLE); sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_SIGNAL_ENABLE); @@ -187,7 +186,7 @@ static int arasan_sdhci_execute_tuning(struct mmc *mmc, u8 opcode) } udelay(1); - arasan_zynqmp_dll_reset(host, deviceid); + arasan_zynqmp_dll_reset(host, node_id); /* Enable only interrupts served by the SD controller */ sdhci_writel(host, SDHCI_INT_DATA_MASK | SDHCI_INT_CMD_MASK, @@ -210,10 +209,9 @@ static int arasan_sdhci_execute_tuning(struct mmc *mmc, u8 opcode) static int sdhci_zynqmp_sdcardclk_set_phase(struct sdhci_host *host, int degrees) { - struct arasan_sdhci_priv *priv = dev_get_priv(host->mmc->dev); struct mmc *mmc = (struct mmc *)host->mmc; struct udevice *dev = mmc->dev; - u32 node_id = dev->seq ? NODE_SD_0 : NODE_SD_1; + u8 node_id = dev->seq ? NODE_SD_0 : NODE_SD_1; u8 tap_delay, tap_max = 0; int timing = mode2timing[mmc->selected_mode]; int ret; @@ -253,7 +251,7 @@ static int sdhci_zynqmp_sdcardclk_set_phase(struct sdhci_host *host, tap_delay &= SDHCI_ARASAN_OTAPDLY_SEL_MASK; /* Set the Clock Phase */ - ret = arasan_zynqmp_set_out_tapdelay(priv->deviceid, + ret = arasan_zynqmp_set_out_tapdelay(node_id, PM_TAPDELAY_OUTPUT, tap_delay); if (ret) { dev_err(dev, "Error setting output Tap Delay\n"); @@ -282,10 +280,9 @@ static int sdhci_zynqmp_sdcardclk_set_phase(struct sdhci_host *host, static int sdhci_zynqmp_sampleclk_set_phase(struct sdhci_host *host, int degrees) { - struct arasan_sdhci_priv *priv = dev_get_priv(host->mmc->dev); struct mmc *mmc = (struct mmc *)host->mmc; struct udevice *dev = mmc->dev; - u32 node_id = dev->seq ? NODE_SD_0 : NODE_SD_1; + u8 node_id = dev->seq ? NODE_SD_0 : NODE_SD_1; u8 tap_delay, tap_max = 0; int timing = mode2timing[mmc->selected_mode]; int ret; @@ -331,7 +328,7 @@ static int sdhci_zynqmp_sampleclk_set_phase(struct sdhci_host *host, /* Limit input tap_delay value to 8 bits */ tap_delay &= SDHCI_ARASAN_ITAPDLY_SEL_MASK; - ret = arasan_zynqmp_set_in_tapdelay(priv->deviceid, + ret = arasan_zynqmp_set_in_tapdelay(node_id, PM_TAPDELAY_INPUT, tap_delay); if (ret) { dev_err(dev, "Error setting Input Tap Delay\n"); diff --git a/include/zynqmp_tap_delay.h b/include/zynqmp_tap_delay.h index b159f0ca7ba..7e4d4e4a9ab 100644 --- a/include/zynqmp_tap_delay.h +++ b/include/zynqmp_tap_delay.h @@ -25,9 +25,9 @@ int arasan_zynqmp_set_out_tapdelay(u8 device_id, u32 type, u32 otap_delay) } #endif -static inline int zynqmp_pm_sd_dll_reset(u32 node_id, u32 type) +static inline int zynqmp_pm_sd_dll_reset(u8 node_id, u32 type) { - return xilinx_pm_request(PM_IOCTL, node_id, IOCTL_SD_DLL_RESET, + return xilinx_pm_request(PM_IOCTL, (u32)node_id, IOCTL_SD_DLL_RESET, type, 0, NULL); }