]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
gpio: imx_rgpio2p: support one address
authorPeng Fan <peng.fan@nxp.com>
Fri, 12 Apr 2024 14:24:51 +0000 (22:24 +0800)
committerFabio Estevam <festevam@gmail.com>
Mon, 15 Apr 2024 11:09:26 +0000 (08:09 -0300)
The i.MX8ULP/93 gpio dt-schema have been updated to only have one
address entry, update the driver to support it.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
drivers/gpio/imx_rgpio2p.c

index 175e460aff54ecf346ad61f4f4da1c16e6ac492c..3227a8d5b574eb074987870c6487b231fba0d980 100644 (file)
@@ -21,6 +21,12 @@ enum imx_rgpio2p_direction {
 
 #define GPIO_PER_BANK                  32
 
+struct imx_rgpio2p_soc_data {
+       bool have_dual_base;
+};
+
+#define IMX8ULP_GPIO_BASE_OFF  0x40
+
 struct imx_rgpio2p_data {
        struct gpio_regs *regs;
 };
@@ -165,6 +171,9 @@ static int imx_rgpio2p_probe(struct udevice *dev)
 static int imx_rgpio2p_bind(struct udevice *dev)
 {
        struct imx_rgpio2p_plat *plat = dev_get_plat(dev);
+       struct imx_rgpio2p_soc_data *data =
+               (struct imx_rgpio2p_soc_data *)dev_get_driver_data(dev);
+       bool dual_base = data->have_dual_base;
        fdt_addr_t addr;
 
        /*
@@ -176,9 +185,26 @@ static int imx_rgpio2p_bind(struct udevice *dev)
        if (plat)
                return 0;
 
-       addr = devfdt_get_addr_index(dev, 1);
-       if (addr == FDT_ADDR_T_NONE)
-               return -EINVAL;
+       /*
+        * Handle legacy compatible combinations which used two reg values
+        * for the i.MX8ULP and i.MX93.
+        */
+       if (device_is_compatible(dev, "fsl,imx7ulp-gpio") &&
+           (device_is_compatible(dev, "fsl,imx93-gpio") ||
+           (device_is_compatible(dev, "fsl,imx8ulp-gpio"))))
+               dual_base = true;
+
+       if (dual_base) {
+               addr = devfdt_get_addr_index(dev, 1);
+               if (addr == FDT_ADDR_T_NONE)
+                       return -EINVAL;
+       } else {
+               addr = devfdt_get_addr_index(dev, 0);
+               if (addr == FDT_ADDR_T_NONE)
+                       return -EINVAL;
+
+               addr += IMX8ULP_GPIO_BASE_OFF;
+       }
 
        /*
         * TODO:
@@ -202,9 +228,17 @@ static int imx_rgpio2p_bind(struct udevice *dev)
        return 0;
 }
 
+static struct imx_rgpio2p_soc_data imx7ulp_data = {
+       .have_dual_base = true,
+};
+
+static struct imx_rgpio2p_soc_data imx8ulp_data = {
+       .have_dual_base = false,
+};
 
 static const struct udevice_id imx_rgpio2p_ids[] = {
-       { .compatible = "fsl,imx7ulp-gpio" },
+       { .compatible = "fsl,imx7ulp-gpio", .data = (ulong)&imx7ulp_data },
+       { .compatible = "fsl,imx8ulp-gpio", .data = (ulong)&imx8ulp_data },
        { }
 };