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>; }; }; }; diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c index f384c72d955452..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; @@ -610,6 +616,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; @@ -675,10 +682,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 +695,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)