diff mbox series

[v4,5/6] pinctrl: amd: Add amd_get_iomux_res function

Message ID 20220601100214.828595-6-Basavaraj.Natikar@amd.com
State New
Headers show
Series Enhancements to AMD pinctrl and implementation of AMD pinmux | expand

Commit Message

Basavaraj Natikar June 1, 2022, 10:02 a.m. UTC
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>
---
 drivers/pinctrl/pinctrl-amd.c | 27 +++++++++++++++++++++++++++
 drivers/pinctrl/pinctrl-amd.h |  1 +
 2 files changed, 28 insertions(+)

Comments

Andy Shevchenko June 1, 2022, 10:38 a.m. UTC | #1
On Wed, Jun 01, 2022 at 03:32:13PM +0530, Basavaraj Natikar wrote:
> 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.

...

> +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;
> +	struct resource *res;
> +	int index;
> +
> +	index = device_property_match_string(dev, "pinctrl-resource-names",  "iomux");
> +	if (index > 0) {

> +		res = platform_get_resource(gpio_dev->pdev, IORESOURCE_MEM, index);
> +		if (!res) {
> +			dev_warn(dev, "Failed to get iomux %d io resource\n", index);
> +			return;
> +		}
> +
> +		gpio_dev->iomux_base = devm_ioremap(dev, res->start, resource_size(res));
> +		if (!gpio_dev->iomux_base) {
> +			desc->pmxops = NULL;
> +			dev_warn(dev, "failed to devm_ioremap() iomux_base\n");
> +		}

	iomux_base = devm_platform_ioremap_resource(..., index);
	if (IS_ERR(...))
		dev_warn();

> +	} else {
> +		desc->pmxops = NULL;
> +		dev_warn(dev, "failed to get iomux index\n");
> +	}
> +}
diff mbox series

Patch

diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c
index 0645c2c24f50..c037e932d37d 100644
--- a/drivers/pinctrl/pinctrl-amd.c
+++ b/drivers/pinctrl/pinctrl-amd.c
@@ -963,6 +963,32 @@  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;
+	struct resource *res;
+	int index;
+
+	index = device_property_match_string(dev, "pinctrl-resource-names",  "iomux");
+	if (index > 0) {
+		res = platform_get_resource(gpio_dev->pdev, IORESOURCE_MEM, index);
+		if (!res) {
+			dev_warn(dev, "Failed to get iomux %d io resource\n", index);
+			return;
+		}
+
+		gpio_dev->iomux_base = devm_ioremap(dev, res->start, resource_size(res));
+		if (!gpio_dev->iomux_base) {
+			desc->pmxops = NULL;
+			dev_warn(dev, "failed to devm_ioremap() iomux_base\n");
+		}
+	} else {
+		desc->pmxops = NULL;
+		dev_warn(dev, "failed to get iomux index\n");
+	}
+}
+
 static int amd_gpio_probe(struct platform_device *pdev)
 {
 	int ret = 0;
@@ -1020,6 +1046,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)) {
diff --git a/drivers/pinctrl/pinctrl-amd.h b/drivers/pinctrl/pinctrl-amd.h
index be74fb106fa7..8ab4bf422ddf 100644
--- a/drivers/pinctrl/pinctrl-amd.h
+++ b/drivers/pinctrl/pinctrl-amd.h
@@ -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;