From bbc57c3c7114276cf65385b5d36412e9169ce6c5 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 3 Apr 2025 15:21:03 +0100 Subject: [PATCH 1/4] dtoverlays: Add gpio-ranges to the mcp23017 and mcp23s17 overlays All DT configured GPIO controllers are meant to have gpio-ranges if linking pinctrl and gpio. As the mcp23s17 driver does, add them. Signed-off-by: Dave Stevenson --- .../boot/dts/overlays/mcp23017-overlay.dts | 1 + .../boot/dts/overlays/mcp23s17-overlay.dts | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/arch/arm/boot/dts/overlays/mcp23017-overlay.dts b/arch/arm/boot/dts/overlays/mcp23017-overlay.dts index e23780b985a3a1..a73355a996f4fb 100644 --- a/arch/arm/boot/dts/overlays/mcp23017-overlay.dts +++ b/arch/arm/boot/dts/overlays/mcp23017-overlay.dts @@ -51,6 +51,7 @@ #gpio-cells = <2>; status = "okay"; + gpio-ranges = <&mcp23017 0 0 16>; }; }; }; diff --git a/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts b/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts index 484d64b225fb8b..f3395cd04f1a75 100644 --- a/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts +++ b/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts @@ -103,6 +103,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi0-0-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_00 0 0 16>; }; }; }; @@ -124,6 +126,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi0-1-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_01 0 0 16>; }; }; }; @@ -145,6 +149,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi1-0-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_10 0 0 16>; }; }; }; @@ -166,6 +172,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi1-1-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_11 0 0 16>; }; }; }; @@ -187,6 +195,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi1-2-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_12 0 0 16>; }; }; }; @@ -208,6 +218,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi2-0-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_20 0 0 16>; }; }; }; @@ -229,6 +241,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi2-1-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_21 0 0 16>; }; }; }; @@ -250,6 +264,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s08-spi2-2-int-gpio parameter */ + + gpio-ranges = <&mcp23s08_22 0 0 16>; }; }; }; @@ -271,6 +287,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi0-0-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_00 0 0 16>; }; }; }; @@ -292,6 +310,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi0-1-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_01 0 0 16>; }; }; }; @@ -313,6 +333,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi1-0-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_10 0 0 16>; }; }; }; @@ -334,6 +356,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi1-1-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_11 0 0 16>; }; }; }; @@ -355,6 +379,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi1-2-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_12 0 0 16>; }; }; }; @@ -376,6 +402,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi2-0-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_20 0 0 16>; }; }; }; @@ -397,6 +425,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi2-1-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_21 0 0 16>; }; }; }; @@ -418,6 +448,8 @@ status = "okay"; #interrupt-cells=<2>; interrupts = <0 2>; /* 1st word overwritten by mcp23s17-spi2-2-int-gpio parameter */ + + gpio-ranges = <&mcp23s17_22 0 0 16>; }; }; }; From 74d6e8487948864bf01e98d6d3fd340225ae2b17 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 3 Apr 2025 16:10:35 +0100 Subject: [PATCH 2/4] pinctrl: mcp23s08: Register pinctrl before gpiochip In order for gpio-ranges to be registered correctly, the pinctrl device needs to be registered before the gpiochip. The mcp23s08 driver was doing them in the opposite order. Signed-off-by: Dave Stevenson --- drivers/pinctrl/pinctrl-mcp23s08.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index f384c72d955452..250ebdc8bb73d7 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -675,10 +675,6 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, girq->threaded = true; } - ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp); - if (ret < 0) - return dev_err_probe(dev, ret, "can't add GPIO chip\n"); - mcp->pinctrl_desc.pctlops = &mcp_pinctrl_ops; mcp->pinctrl_desc.confops = &mcp_pinconf_ops; mcp->pinctrl_desc.npins = mcp->chip.ngpio; @@ -692,6 +688,10 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, if (IS_ERR(mcp->pctldev)) return dev_err_probe(dev, PTR_ERR(mcp->pctldev), "can't register controller\n"); + ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp); + if (ret < 0) + return dev_err_probe(dev, ret, "can't add GPIO chip\n"); + if (mcp->irq) { ret = mcp23s08_irq_setup(mcp); if (ret) From dccfabb90e00ed5b38552aad1f1f26793ce26f42 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 3 Apr 2025 16:12:17 +0100 Subject: [PATCH 3/4] pinctrl: mcp23s08: Provide a gpiochip set_config function In order to use gpioget to set bias pull up settings, the gpiochip function list needs a set_config function. gpiochip_generic_config is applicable for mcp23s08, so configure it. Signed-off-by: Dave Stevenson --- drivers/pinctrl/pinctrl-mcp23s08.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index 250ebdc8bb73d7..71ff1078389a86 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -610,6 +610,7 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, mcp->chip.get_multiple = mcp23s08_get_multiple; mcp->chip.direction_output = mcp23s08_direction_output; mcp->chip.set = mcp23s08_set; + mcp->chip.set_config = gpiochip_generic_config; mcp->chip.set_multiple = mcp23s08_set_multiple; mcp->chip.base = base; From 2631f6f217adc42dc5c243c9e407de65d3a45c95 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 3 Apr 2025 16:15:24 +0100 Subject: [PATCH 4/4] pinctrl: mcp23s08: Add support for PIN_CONFIG_BIAS_DISABLE Whilst PIN_CONFIG_BIAS_PULL_UP had been implemented to enable the 100k pull-up resistor, PIN_CONFIG_BIAS_DISABLE hadn't been implemented to disable it again. Signed-off-by: Dave Stevenson --- drivers/pinctrl/pinctrl-mcp23s08.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index 71ff1078389a86..9ad001d9df4e16 100644 --- a/drivers/pinctrl/pinctrl-mcp23s08.c +++ b/drivers/pinctrl/pinctrl-mcp23s08.c @@ -230,6 +230,7 @@ static int mcp_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin, switch (param) { case PIN_CONFIG_BIAS_PULL_UP: + case PIN_CONFIG_BIAS_DISABLE: mutex_lock(&mcp->lock); ret = mcp_read(mcp, MCP_GPPU, &data); mutex_unlock(&mcp->lock); @@ -265,6 +266,11 @@ static int mcp_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, ret = mcp_set_bit(mcp, MCP_GPPU, pin, arg); mutex_unlock(&mcp->lock); break; + case PIN_CONFIG_BIAS_DISABLE: + mutex_lock(&mcp->lock); + ret = mcp_set_bit(mcp, MCP_GPPU, pin, 0); + mutex_unlock(&mcp->lock); + break; default: dev_dbg(mcp->dev, "Invalid config param %04x\n", param); return -ENOTSUPP;