pinctrl: amd: Add amd_get_iomux_res function
authorBasavaraj Natikar <Basavaraj.Natikar@amd.com>
Wed, 1 Jun 2022 15:28:59 +0000 (20:58 +0530)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 15 Jun 2022 13:54:20 +0000 (15:54 +0200)
Presently there is no way to change pinmux configuration run time.
Hence add a function to get IOMUX resource which can be used to
configure IOMUX GPIO pins run time.

Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20220601152900.1012813-6-Basavaraj.Natikar@amd.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-amd.c
drivers/pinctrl/pinctrl-amd.h

index 0645c2c24f508b48ccb9909843ea206a1d2c1406..a1d21fb7802814355a978f84aab9a8d5a327090e 100644 (file)
@@ -963,6 +963,30 @@ static struct pinctrl_desc amd_pinctrl_desc = {
        .owner = THIS_MODULE,
 };
 
+static void amd_get_iomux_res(struct amd_gpio *gpio_dev)
+{
+       struct pinctrl_desc *desc = &amd_pinctrl_desc;
+       struct device *dev = &gpio_dev->pdev->dev;
+       int index;
+
+       index = device_property_match_string(dev, "pinctrl-resource-names",  "iomux");
+       if (index < 0) {
+               dev_warn(dev, "failed to get iomux index\n");
+               goto out_no_pinmux;
+       }
+
+       gpio_dev->iomux_base = devm_platform_ioremap_resource(gpio_dev->pdev, index);
+       if (IS_ERR(gpio_dev->iomux_base)) {
+               dev_warn(dev, "Failed to get iomux %d io resource\n", index);
+               goto out_no_pinmux;
+       }
+
+       return;
+
+out_no_pinmux:
+       desc->pmxops = NULL;
+}
+
 static int amd_gpio_probe(struct platform_device *pdev)
 {
        int ret = 0;
@@ -1020,6 +1044,7 @@ static int amd_gpio_probe(struct platform_device *pdev)
        gpio_dev->ngroups = ARRAY_SIZE(kerncz_groups);
 
        amd_pinctrl_desc.name = dev_name(&pdev->dev);
+       amd_get_iomux_res(gpio_dev);
        gpio_dev->pctrl = devm_pinctrl_register(&pdev->dev, &amd_pinctrl_desc,
                                                gpio_dev);
        if (IS_ERR(gpio_dev->pctrl)) {
index e2523738fe51af74088b5aa0132ee441336ac152..76538792ac789ee59503efaad749a009ec6303e6 100644 (file)
@@ -83,6 +83,7 @@ struct amd_function {
 struct amd_gpio {
        raw_spinlock_t          lock;
        void __iomem            *base;
+       void __iomem            *iomux_base;
 
        const struct pingroup *groups;
        u32 ngroups;