pinctrl: qcom: Add generic ssbi and spmi GPIO/MPP bindings
Subsystems (6)
The drivers don't really need to know which PMIC they're for, so make a generic binding for them. This alleviates us from updating the drivers every time a new PMIC comes out. It's still recommended that we update the binding with new PMIC models and always specify the specific model for the MPPs and gpios before the generic compatible string in devicetree, but this at least cuts down on adding more and more compatible strings to the drivers until we actually need them.
---
We can also figure out the number of the pins from the number of interrupts, so we really don't need to even look at the size of the reg property or model number for the spmi and ssbi modules. I'll propose that change as well tomorrow.
Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.txt | 5 ++++- Documentation/devicetree/bindings/pinctrl/qcom,pmic-mpp.txt | 5 ++++- drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 1 + drivers/pinctrl/qcom/pinctrl-spmi-mpp.c | 1 + 4 files changed, 10 insertions(+), 2 deletions(-)
Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.txt +4 -1
@@ -17,6 +17,9 @@ PMIC's from Qualcomm. "qcom,pm8994-gpio" "qcom,pma8084-gpio" + And must contain either "qcom,spmi-gpio" or "qcom,ssbi-gpio" + if the device is on an spmi bus or an ssbi bus respectively + - reg: Usage: required Value type: <prop-encoded-array>
@@ -183,7 +186,7 @@ to specify in a pin configuration subnode: Example: pm8921_gpio: gpio at 150 { - compatible = "qcom,pm8921-gpio"; + compatible = "qcom,pm8921-gpio", "qcom,ssbi-gpio"; reg = <0x150 0x160>; interrupts = <192 1>, <193 1>, <194 1>, <195 1>, <196 1>, <197 1>,
Documentation/devicetree/bindings/pinctrl/qcom,pmic-mpp.txt +4 -1
@@ -18,6 +18,9 @@ of PMIC's from Qualcomm. "qcom,pm8994-mpp", "qcom,pma8084-mpp", + And must contain either "qcom,spmi-mpp" or "qcom,ssbi-mpp" + if the device is on an spmi bus or an ssbi bus respectively. + - reg: Usage: required Value type: <prop-encoded-array>
@@ -157,7 +160,7 @@ to specify in a pin configuration subnode: Example: mpps at a000 { - compatible = "qcom,pm8841-mpp"; + compatible = "qcom,pm8841-mpp", "qcom,spmi-mpp"; reg = <0xa000>; gpio-controller; #gpio-cells = <2>;
drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +1 -0
@@ -806,6 +806,7 @@ static const struct of_device_id pmic_gpio_of_match[] = { { .compatible = "qcom,pm8941-gpio" }, /* 36 GPIO's */ { .compatible = "qcom,pm8994-gpio" }, /* 22 GPIO's */ { .compatible = "qcom,pma8084-gpio" }, /* 22 GPIO's */ + { .compatible = "qcom,spmi-gpio" }, /* Generic */ { }, };
drivers/pinctrl/qcom/pinctrl-spmi-mpp.c +1 -0
@@ -909,6 +909,7 @@ static const struct of_device_id pmic_mpp_of_match[] = { { .compatible = "qcom,pm8941-mpp" }, /* 8 MPP's */ { .compatible = "qcom,pm8994-mpp" }, /* 8 MPP's */ { .compatible = "qcom,pma8084-mpp" }, /* 8 MPP's */ + { .compatible = "qcom,spmi-mpp" }, /* Generic */ { }, };
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Andy Gross
Reviewed-byQuoted 9 lines · Stephen Boyd
The drivers don't really need to know which PMIC they're for, so make a generic binding for them. This alleviates us from updating the drivers every time a new PMIC comes out. It's still recommended that we update the binding with new PMIC models and always specify the specific model for the MPPs and gpios before the generic compatible string in devicetree, but this at least cuts down on adding more and more compatible strings to the drivers until we actually need them.
Quoted 4 lines
Cc <[email protected]>Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>
Signature · 3 lines
Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH 1/1 pinctrl: qcom: pmic-gpio/mpp: of_irq_count() == npins
In reply to Stephen BoydThe number of interrupts is always equal to the number of pins provided by the PMIC gpio and MPP hardware blocks. Count the number of irqs to figure out the number of pins instead of adding more compatible strings or doing math on the reg property. This should make the code more generic and ease the number of changes we have to make to the driver for each new pmic revision.
---
Quoted 4 lines · Stephen Boyd
We can also figure out the number of the pins from the number of interrupts, so we really don't need to even look at the size of the reg property or model number for the spmi and ssbi modules. I'll propose that change as well tomorrow.
And here's that change. It can be squashed together if desired.
drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 12 ++++++------ drivers/pinctrl/qcom/pinctrl-spmi-mpp.c | 11 ++++++----- drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c | 16 ++++++++++------ drivers/pinctrl/qcom/pinctrl-ssbi-mpp.c | 16 ++++++++++------ 4 files changed, 32 insertions(+), 23 deletions(-)
drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +6 -6
@@ -14,6 +14,7 @@#include <linux/gpio.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_irq.h> #include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinmux.h>
@@ -693,16 +694,15 @@ static int pmic_gpio_probe(struct platform_device *pdev)struct pmic_gpio_pad *pad, *pads;struct pmic_gpio_state *state;int ret, npins, i; -u32 res[2 ]; +u32 reg; - ret =of_property_read_u32_array (dev->of_node,"reg" , res,2 ); + ret =of_property_read_u32 (dev->of_node,"reg" , ®);if (ret <0 ) { -dev_err (dev,"missing base address and/or range" ); +dev_err (dev,"missing base address" );return ret; } - npins = res[1 ] /PMIC_GPIO_ADDRESS_RANGE ; - + npins =of_irq_count (dev->of_node);if (!npins)return -EINVAL ;
@@ -752,7 +752,7 @@ static int pmic_gpio_probe(struct platform_device *pdev)if (pad->irq <0 )return pad->irq; - pad->base = res[0 ] + i *PMIC_GPIO_ADDRESS_RANGE ; + pad->base = reg + i *PMIC_GPIO_ADDRESS_RANGE ; ret =pmic_gpio_populate (state, pad);if (ret <0 )
drivers/pinctrl/qcom/pinctrl-spmi-mpp.c +6 -5
@@ -14,6 +14,7 @@#include <linux/gpio.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_irq.h> #include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinmux.h>
@@ -795,15 +796,15 @@ static int pmic_mpp_probe(struct platform_device *pdev)struct pmic_mpp_pad *pad, *pads;struct pmic_mpp_state *state;int ret, npins, i; -u32 res[2 ]; +u32 reg; - ret =of_property_read_u32_array (dev->of_node,"reg" , res,2 ); + ret =of_property_read_u32 (dev->of_node,"reg" , ®);if (ret <0 ) { -dev_err (dev,"missing base address and/or range" ); +dev_err (dev,"missing base address" );return ret; } - npins = res[1 ] /PMIC_MPP_ADDRESS_RANGE ; + npins =of_irq_count (dev->of_node);if (!npins)return -EINVAL ;
@@ -854,7 +855,7 @@ static int pmic_mpp_probe(struct platform_device *pdev)if (pad->irq <0 )return pad->irq; - pad->base = res[0 ] + i *PMIC_MPP_ADDRESS_RANGE ; + pad->base = reg + i *PMIC_MPP_ADDRESS_RANGE ; ret =pmic_mpp_populate (state, pad);if (ret <0 )
drivers/pinctrl/qcom/pinctrl-ssbi-gpio.c +10 -6
@@ -23,6 +23,7 @@#include <linux/gpio.h> #include <linux/interrupt.h> #include <linux/of_device.h> +#include <linux/of_irq.h> #include <dt-bindings/pinctrl/qcom,pmic-gpio.h>
@@ -650,11 +651,12 @@ static int pm8xxx_pin_populate(struct pm8xxx_gpio *pctrl, }static const struct of_device_id pm8xxx_gpio_of_match[] = { - { .compatible ="qcom,pm8018-gpio" , .data = (void *)6 }, - { .compatible ="qcom,pm8038-gpio" , .data = (void *)12 }, - { .compatible ="qcom,pm8058-gpio" , .data = (void *)40 }, - { .compatible ="qcom,pm8917-gpio" , .data = (void *)38 }, - { .compatible ="qcom,pm8921-gpio" , .data = (void *)44 }, + { .compatible ="qcom,pm8018-gpio" }, + { .compatible ="qcom,pm8038-gpio" }, + { .compatible ="qcom,pm8058-gpio" }, + { .compatible ="qcom,pm8917-gpio" }, + { .compatible ="qcom,pm8921-gpio" }, + { .compatible ="qcom,ssbi-gpio" }, { }, };MODULE_DEVICE_TABLE (of, pm8xxx_gpio_of_match);
@@ -672,7 +674,9 @@ static int pm8xxx_gpio_probe(struct platform_device *pdev)return -ENOMEM ; pctrl->dev = &pdev->dev; - pctrl->npins = (unsigned )of_device_get_match_data (&pdev->dev); + pctrl->npins =of_irq_count (pdev->dev.of_node); +if (!pctrl->npins) +return -EINVAL ; pctrl->regmap =dev_get_regmap (pdev->dev.parent,NULL );if (!pctrl->regmap) {
drivers/pinctrl/qcom/pinctrl-ssbi-mpp.c +10 -6
@@ -23,6 +23,7 @@#include <linux/gpio.h> #include <linux/interrupt.h> #include <linux/of_device.h> +#include <linux/of_irq.h> #include <dt-bindings/pinctrl/qcom,pmic-mpp.h>
@@ -741,11 +742,12 @@ static int pm8xxx_pin_populate(struct pm8xxx_mpp *pctrl, }static const struct of_device_id pm8xxx_mpp_of_match[] = { - { .compatible ="qcom,pm8018-mpp" , .data = (void *)6 }, - { .compatible ="qcom,pm8038-mpp" , .data = (void *)6 }, - { .compatible ="qcom,pm8917-mpp" , .data = (void *)10 }, - { .compatible ="qcom,pm8821-mpp" , .data = (void *)4 }, - { .compatible ="qcom,pm8921-mpp" , .data = (void *)12 }, + { .compatible ="qcom,pm8018-mpp" }, + { .compatible ="qcom,pm8038-mpp" }, + { .compatible ="qcom,pm8917-mpp" }, + { .compatible ="qcom,pm8821-mpp" }, + { .compatible ="qcom,pm8921-mpp" }, + { .compatible ="qcom,ssbi-mpp" }, { }, };MODULE_DEVICE_TABLE (of, pm8xxx_mpp_of_match);
@@ -763,7 +765,9 @@ static int pm8xxx_mpp_probe(struct platform_device *pdev)return -ENOMEM ; pctrl->dev = &pdev->dev; - pctrl->npins = (unsigned )of_device_get_match_data (&pdev->dev); + pctrl->npins =of_irq_count (pdev->dev.of_node); +if (!pctrl->npins) +return -EINVAL ; pctrl->regmap =dev_get_regmap (pdev->dev.parent,NULL );if (!pctrl->regmap) {
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [PATCH] pinctrl: qcom: pmic-gpio/mpp: of_irq_count() == npins
Quoted 11 lines · Stephen Boyd
The number of interrupts is always equal to the number of pins provided by the PMIC gpio and MPP hardware blocks. Count the number of irqs to figure out the number of pins instead of adding more compatible strings or doing math on the reg property. This should make the code more generic and ease the number of changes we have to make to the driver for each new pmic revision.
Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
This is pretty nice.
Signature · 3 lines
Qualcomm Innovation Center, Inc. The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [PATCH] pinctrl: qcom: pmic-gpio/mpp: of_irq_count() == npins
In reply to Stephen BoydQuoted 11 lines · Stephen Boyd
The number of interrupts is always equal to the number of pins provided by the PMIC gpio and MPP hardware blocks. Count the number of irqs to figure out the number of pins instead of adding more compatible strings or doing math on the reg property. This should make the code more generic and ease the number of changes we have to make to the driver for each new pmic revision.
Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Regards,
Bjorn
Re: [PATCH] pinctrl: qcom: pmic-gpio/mpp: of_irq_count() == npins
In reply to Stephen BoydQuoted 10 lines · Stephen Boyd
The number of interrupts is always equal to the number of pins provided by the PMIC gpio and MPP hardware blocks. Count the number of irqs to figure out the number of pins instead of adding more compatible strings or doing math on the reg property. This should make the code more generic and ease the number of changes we have to make to the driver for each new pmic revision.
Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>
Patch applied with Andy's and Bj?rn's ACKs.
Yours,
Linus Walleij
Rob Herring
maintainerQuoted 9 lines · Stephen Boyd
The drivers don't really need to know which PMIC they're for, so make a generic binding for them. This alleviates us from updating the drivers every time a new PMIC comes out. It's still recommended that we update the binding with new PMIC models and always specify the specific model for the MPPs and gpios before the generic compatible string in devicetree, but this at least cuts down on adding more and more compatible strings to the drivers until we actually need them.
Quoted 5 lines
Cc <[email protected]>Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Seems okay to me. I assume you are going to update all the dts files?
Rob
Quoted 90 lines
We can also figure out the number of the pins from the number of interrupts, so we really don't need to even look at the size of the reg property or model number for the spmi and ssbi modules. I'll propose that change as well tomorrow.
Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.txt | 5 ++++- Documentation/devicetree/bindings/pinctrl/qcom,pmic-mpp.txt | 5 ++++- drivers/pinctrl/qcom/pinctrl-spmi-gpio.c | 1 + drivers/pinctrl/qcom/pinctrl-spmi-mpp.c | 1 + 4 files changed, 10 insertions(+), 2 deletions(-)Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.txt +4
-1@@ -17,6 +17,9 @@ PMIC's from Qualcomm. "qcom,pm8994-gpio" "qcom,pma8084-gpio" + And must contain either "qcom,spmi-gpio" or "qcom,ssbi-gpio" + if the device is on an spmi bus or an ssbi bus respectively + - reg: Usage: required Value type: <prop-encoded-array>@@ -183,7 +186,7 @@ to specify in a pin configuration subnode: Example: pm8921_gpio: gpio at 150 { - compatible = "qcom,pm8921-gpio"; + compatible = "qcom,pm8921-gpio", "qcom,ssbi-gpio"; reg = <0x150 0x160>; interrupts = <192 1>, <193 1>, <194 1>, <195 1>, <196 1>, <197 1>,Documentation/devicetree/bindings/pinctrl/qcom,pmic-mpp.txt +4
-1@@ -18,6 +18,9 @@ of PMIC's from Qualcomm. "qcom,pm8994-mpp", "qcom,pma8084-mpp", + And must contain either "qcom,spmi-mpp" or "qcom,ssbi-mpp" + if the device is on an spmi bus or an ssbi bus respectively. + - reg: Usage: required Value type: <prop-encoded-array>@@ -157,7 +160,7 @@ to specify in a pin configuration subnode: Example: mpps at a000 { - compatible = "qcom,pm8841-mpp"; + compatible = "qcom,pm8841-mpp", "qcom,spmi-mpp"; reg = <0xa000>; gpio-controller; #gpio-cells = <2>;drivers/pinctrl/qcom/pinctrl-spmi-gpio.c +1
-0@@ -806,6 +806,7 @@ static const struct of_device_id pmic_gpio_of_match[] = { { .compatible = "qcom,pm8941-gpio" }, /* 36 GPIO's */ { .compatible = "qcom,pm8994-gpio" }, /* 22 GPIO's */ { .compatible = "qcom,pma8084-gpio" }, /* 22 GPIO's */ + { .compatible = "qcom,spmi-gpio" }, /* Generic */ { }, };drivers/pinctrl/qcom/pinctrl-spmi-mpp.c +1
-0@@ -909,6 +909,7 @@ static const struct of_device_id pmic_mpp_of_match[] = { { .compatible = "qcom,pm8941-mpp" }, /* 8 MPP's */ { .compatible = "qcom,pm8994-mpp" }, /* 8 MPP's */ { .compatible = "qcom,pma8084-mpp" }, /* 8 MPP's */ + { .compatible = "qcom,spmi-mpp" }, /* Generic */ { }, };Signature · 7 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 10 lines · Rob Herring
Quoted 9 lines · Stephen Boyd
The drivers don't really need to know which PMIC they're for, so make a generic binding for them. This alleviates us from updating the drivers every time a new PMIC comes out. It's still recommended that we update the binding with new PMIC models and always specify the specific model for the MPPs and gpios before the generic compatible string in devicetree, but this at least cuts down on adding more and more compatible strings to the drivers until we actually need them.
Quoted 7 lines
Quoted 5 lines
Cc <[email protected]>Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Seems okay to me. I assume you are going to update all the dts files?
Yep, I'll send out patches to do that.
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
Ivan T. Ivanov
Acked-byQuoted 12 lines · Stephen Boyd
The drivers don't really need to know which PMIC they're for, so make a generic binding for them. This alleviates us from updating the drivers every time a new PMIC comes out. It's still recommended that we update the binding with new PMIC models and always specify the specific model for the MPPs and gpios before the generic compatible string in devicetree, but this at least cuts down on adding more and more compatible strings to the drivers until we actually need them.
Quoted 4 lines
Cc <[email protected]>Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>
Thanks.
Bjorn Andersson
Reviewed-byQuoted 9 lines · Stephen Boyd
The drivers don't really need to know which PMIC they're for, so make a generic binding for them. This alleviates us from updating the drivers every time a new PMIC comes out. It's still recommended that we update the binding with new PMIC models and always specify the specific model for the MPPs and gpios before the generic compatible string in devicetree, but this at least cuts down on adding more and more compatible strings to the drivers until we actually need them.
Quoted 6 lines
Cc <[email protected]>Cc "Ivan T. Ivanov" <[email protected]>Cc Bjorn Andersson <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
I must say that when it comes to writing dts files I much prefer the msm way of denoting functions over the pmic one. But because of that decision this makes perfect sense!
Regards,
Bjorn