]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
mmc: zynq_sdhci: Use pm_node id instead of device sequence id
authorT Karthik Reddy <t.karthik.reddy@xilinx.com>
Mon, 12 Jul 2021 11:29:43 +0000 (05:29 -0600)
committerMichal Simek <michal.simek@xilinx.com>
Mon, 12 Jul 2021 13:56:19 +0000 (15:56 +0200)
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 <t.karthik.reddy@xilinx.com>
Reviewed-by: Ashok Reddy Soma <ashok.reddy.soma@xilinx.com>
drivers/mmc/zynq_sdhci.c
include/zynqmp_tap_delay.h

index ba13c48e3520a0c5669bdd38d5fec4f7a7457359..16fd9799bfa928a1331cdb17b45d965c1e639725 100644 (file)
@@ -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");
index b159f0ca7ba6960683a1e9612bef56826774aa8e..7e4d4e4a9ab08c71338220882a3aa626f11bc2b8 100644 (file)
@@ -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);
 }