mfd: wm831x: Add basic device tree binding
Subsystems (4)
PATCH v2 1/3 mfd: wm831x: Add basic device tree binding
Add the basic ability to register the device through device tree, more work is needed to get each individual sub-driver functioning correctly but this is enough to get the device to probe from device tree.
---
Changes since v1:
- Moved MAINTAINERS update to the binding patch
- Fixed a warning on 64-bit architectures
drivers/mfd/wm831x-core.c | 32 +++++++++++++++++++++++++++++++- drivers/mfd/wm831x-i2c.c | 9 ++++++++- drivers/mfd/wm831x-irq.c | 6 +++--- drivers/mfd/wm831x-spi.c | 6 +++++- include/linux/mfd/wm831x/core.h | 15 +++++++++++++++ 5 files changed, 62 insertions(+), 6 deletions(-)
drivers/mfd/wm831x-core.c +31 -1
@@ -19,6 +19,8 @@#include <linux/mfd/core.h> #include <linux/slab.h> #include <linux/err.h> +#include <linux/of.h> +#include <linux/of_device.h> #include <linux/mfd/wm831x/core.h> #include <linux/mfd/wm831x/pdata.h>
@@ -1613,6 +1615,31 @@ struct regmap_config wm831x_regmap_config = { };EXPORT_SYMBOL_GPL (wm831x_regmap_config); +#ifdef CONFIG_OF +const struct of_device_id wm831x_of_match[] = { + { .compatible ="wlf,wm8310" , .data = (void *)WM8310 }, + { .compatible ="wlf,wm8311" , .data = (void *)WM8311 }, + { .compatible ="wlf,wm8312" , .data = (void *)WM8312 }, + { .compatible ="wlf,wm8320" , .data = (void *)WM8320 }, + { .compatible ="wlf,wm8321" , .data = (void *)WM8321 }, + { .compatible ="wlf,wm8325" , .data = (void *)WM8325 }, + { .compatible ="wlf,wm8326" , .data = (void *)WM8326 }, + { }, +}; +EXPORT_SYMBOL_GPL (wm831x_of_match); + +int wm831x_of_get_type (struct device *dev) +{ +const struct of_device_id *id =of_match_device (wm831x_of_match, dev); + +if (id) +return (unsigned long )id->data; +else +return 0 ; +} +EXPORT_SYMBOL_GPL (wm831x_of_get_type); +#endif +/* * Instantiate the generic non-control parts of the device. */
@@ -1628,7 +1655,10 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)dev_set_drvdata (wm831x->dev, wm831x);if (pdata) - wm831x->soft_shutdown = pdata->soft_shutdown; +memcpy (&wm831x->pdata, pdata,sizeof (*pdata)); + pdata = &wm831x->pdata; + + wm831x->soft_shutdown = pdata->soft_shutdown; ret =wm831x_reg_read (wm831x,WM831X_PARENT_ID );if (ret <0 ) {
drivers/mfd/wm831x-i2c.c +8 -1
@@ -28,8 +28,14 @@ static int wm831x_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) {struct wm831x *wm831x; +enum wm831x_parent type;int ret; +if (i2c->dev.of_node) + type = (enum wm831x_parent )wm831x_of_get_type (&i2c->dev); +else + type = (enum wm831x_parent )id->driver_data; + wm831x =devm_kzalloc (&i2c->dev,sizeof (struct wm831x ),GFP_KERNEL );if (wm831x ==NULL )return -ENOMEM ;
@@ -45,7 +51,7 @@ static int wm831x_i2c_probe(struct i2c_client *i2c,return ret; } -return wm831x_device_init (wm831x, id->driver_data, i2c->irq); +return wm831x_device_init (wm831x, type, i2c->irq); }static int wm831x_i2c_remove (struct i2c_client *i2c)
@@ -94,6 +100,7 @@ static struct i2c_driver wm831x_i2c_driver = { .driver = { .name = "wm831x", .pm = &wm831x_pm_ops, + .of_match_table = of_match_ptr(wm831x_of_match), }, .probe = wm831x_i2c_probe, .remove = wm831x_i2c_remove,
drivers/mfd/wm831x-irq.c +3 -3
@@ -564,7 +564,7 @@ static const struct irq_domain_ops wm831x_irq_domain_ops = {int wm831x_irq_init (struct wm831x *wm831x,int irq) { -struct wm831x_pdata *pdata =dev_get_platdata (wm831x->dev); +struct wm831x_pdata *pdata = &wm831x->pdata;struct irq_domain *domain;int i, ret, irq_base;
@@ -579,7 +579,7 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq) }/* Try to dynamically allocate IRQs if no base is specified */ -if (pdata && pdata->irq_base) { +if (pdata->irq_base) { irq_base =irq_alloc_descs (pdata->irq_base,0 ,WM831X_NUM_IRQS ,0 );if (irq_base <0 ) {
@@ -608,7 +608,7 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq)return -EINVAL ; } -if (pdata && pdata->irq_cmos) +if (pdata->irq_cmos) i =0 ;else i =WM831X_IRQ_OD ;
drivers/mfd/wm831x-spi.c +5 -1
@@ -28,7 +28,10 @@ static int wm831x_spi_probe(struct spi_device *spi)enum wm831x_parent type;int ret; - type = (enum wm831x_parent )id->driver_data; +if (spi->dev.of_node) + type = (enum wm831x_parent )wm831x_of_get_type (&spi->dev); +else + type = (enum wm831x_parent )id->driver_data; wm831x =devm_kzalloc (&spi->dev,sizeof (struct wm831x ),GFP_KERNEL );if (wm831x ==NULL )
@@ -97,6 +100,7 @@ static struct spi_driver wm831x_spi_driver = { .driver = { .name = "wm831x", .pm = &wm831x_spi_pm, + .of_match_table = of_match_ptr(wm831x_of_match), }, .id_table = wm831x_spi_ids, .probe = wm831x_spi_probe,
include/linux/mfd/wm831x/core.h +15 -0
@@ -21,6 +21,8 @@#include <linux/list.h> #include <linux/regmap.h> #include <linux/mfd/wm831x/auxadc.h> +#include <linux/mfd/wm831x/pdata.h> +#include <linux/of.h> /* * Register values.
@@ -367,6 +369,8 @@ struct wm831x {struct regmap *regmap; +struct wm831x_pdata pdata; +int irq;/* Our chip IRQ */ struct mutex irq_lock;struct irq_domain *irq_domain;
@@ -427,4 +431,15 @@ static inline int wm831x_irq(struct wm831x *wm831x, int irq)extern struct regmap_config wm831x_regmap_config; +extern const struct of_device_id wm831x_of_match[]; + +#ifdef CONFIG_OF +int wm831x_of_get_type (struct device *dev); +#else +static inline int wm831x_of_get_type (struct device *dev) +{ +return 0 ; +} +#endif +#endif
Signature · 1 line
2.1.4
PATCH v2 2/3 gpio: wm831x: Add basic device tree support
Now the wm831x-core has basic DT support we can update this driver to allow use of the GPIOs within a device tree system.
---
No changes since v1.
drivers/gpio/gpio-wm831x.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/gpio/gpio-wm831x.c +4 -1
@@ -264,7 +264,7 @@ static const struct gpio_chip template_chip = {static int wm831x_gpio_probe (struct platform_device *pdev) {struct wm831x *wm831x =dev_get_drvdata (pdev->dev.parent); -struct wm831x_pdata *pdata =dev_get_platdata (wm831x->dev); +struct wm831x_pdata *pdata = &wm831x->pdata;struct wm831x_gpio *wm831x_gpio;int ret;
@@ -281,6 +281,9 @@ static int wm831x_gpio_probe(struct platform_device *pdev) wm831x_gpio->gpio_chip.base = pdata->gpio_base; else wm831x_gpio->gpio_chip.base = -1; +#ifdef CONFIG_OF_GPIO + wm831x_gpio->gpio_chip.of_node = wm831x->dev->of_node; +#endif ret =devm_gpiochip_add_data (&pdev->dev, &wm831x_gpio->gpio_chip, wm831x_gpio);
Signature · 1 line
2.1.4
Re: [PATCH v2 2/3] gpio: wm831x: Add basic device tree support
Quoted 7 lines · Charles Keepax
Now the wm831x-core has basic DT support we can update this driver to allow use of the GPIOs within a device tree system.
---
No changes since v1.
Is it OK if I merge this separately from the first patch in the series?
Else you need to ask Lee to merge it with my ACK.
Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 2/3] gpio: wm831x: Add basic device tree support
Quoted 9 lines · Linus Walleij
Quoted 6 lines · Charles Keepax
Now the wm831x-core has basic DT support we can update this driver to allow use of the GPIOs within a device tree system.
Signed-off-by Charles Keepax <[email protected]>---
Quoted 6 lines
Quoted 1 line
No changes since v1.
Acked-by Linus Walleij <[email protected]>Is it OK if I merge this separately from the first patch in the series?
Else you need to ask Lee to merge it with my ACK.
Afraid these two need to go in together because of a build dependency.
Thanks,
Charles
PATCH v2 3/3 mfd: wm831x: Add device tree binding document
In reply to Charles KeepaxThis is just a very simple initial binding, supporting only registering the chip and the GPIOs. More features will be added as support for device tree in the driver is expanded.
---
Changes since v1:
- Added MAINTAINERS update
Documentation/devicetree/bindings/mfd/wm831x.txt | 31 ++++++++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 32 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/wm831x.txt
Documentation/devicetree/bindings/mfd/wm831x.txt new file +31 -0
@@ -0,0 +1,31 @@ +Cirrus Logic/Wolfson Microelectronics wm831x PMICs + +System PMICs with a wide range of additional features. + +Required properties: + + - compatible : One of the following chip-specific strings: + "wlf,wm8310" + "wlf,wm8311" + "wlf,wm8312" + "wlf,wm8320" + "wlf,wm8321" + "wlf,wm8325" + "wlf,wm8326" + + - reg : I2C slave address when connected using I2C, chip select number when + using SPI. + + - gpio-controller : Indicates this device is a GPIO controller. + - #gpio-cells : Must be 2. The first cell is the pin number and the + second cell is used to specify optional parameters (currently unused). + +Example: + +wm8310: wm8310@36 { + compatible = "wlf,wm8310"; + reg = <0x36>; + + gpio-controller; + #gpio-cells = <2>; +};
MAINTAINERS +1 -0
@@ -13363,6 +13363,7 @@ F: Documentation/hwmon/wm83?? F: Documentation/devicetree/bindings/extcon/extcon-arizona.txt F: Documentation/devicetree/bindings/regulator/arizona-regulator.txt F: Documentation/devicetree/bindings/mfd/arizona.txt +F: Documentation/devicetree/bindings/mfd/wm831x.txt F: arch/arm/mach-s3c64xx/mach-crag6410* F: drivers/clk/clk-wm83*.c F: drivers/extcon/extcon-arizona.c
Signature · 1 line
2.1.4
Rob Herring
maintainerRe: [PATCH v2 3/3] mfd: wm831x: Add device tree binding document
Quoted 3 lines · Charles Keepax
This is just a very simple initial binding, supporting only registering the chip and the GPIOs. More features will be added as support for device tree in the driver is expanded.
Please make the binding as complete as you can. You don't have to have driver side support in place. Doesn't have to be everything, but at least everything you know you will need.
Quoted 33 lines
---
Changes since v1:
- AddedMAINTAINERSupdateDocumentation/devicetree/bindings/mfd/wm831x.txt | 31 ++++++++++++++++++++++++ MAINTAINERS | 1 + 2 files changed, 32 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/wm831x.txtDocumentation/devicetree/bindings/mfd/wm831x.txt new file +15
-0@@ -0,0 +1,31 @@ +Cirrus Logic/Wolfson Microelectronics wm831x PMICs + +System PMICs with a wide range of additional features. + +Required properties: + + - compatible : One of the following chip-specific strings: + "wlf,wm8310" + "wlf,wm8311" + "wlf,wm8312" + "wlf,wm8320" + "wlf,wm8321" + "wlf,wm8325" + "wlf,wm8326" +
Documentation/devicetree/bindings/mfd/wm831x.txt line 25
Quoted 10 lines
Documentation/devicetree/bindings/mfd/wm831x.txt new file +10
-0+ - reg : I2C slave address when connected using I2C, chip select number when + using SPI. + + - gpio-controller : Indicates this device is a GPIO controller. + - #gpio-cells : Must be 2. The first cell is the pin number and the + second cell is used to specify optional parameters (currently unused). + +Example: + +wm8310: wm8310@36 {
pmic@
Quoted 21 lines
Documentation/devicetree/bindings/mfd/wm831x.txt new file +6
-0+ compatible = "wlf,wm8310"; + reg = <0x36>; + + gpio-controller; + #gpio-cells = <2>; +};MAINTAINERS +1
-0@@ -13363,6 +13363,7 @@ F: Documentation/hwmon/wm83?? F: Documentation/devicetree/bindings/extcon/extcon-arizona.txt F: Documentation/devicetree/bindings/regulator/arizona-regulator.txt F: Documentation/devicetree/bindings/mfd/arizona.txt +F: Documentation/devicetree/bindings/mfd/wm831x.txt F: arch/arm/mach-s3c64xx/mach-crag6410* F: drivers/clk/clk-wm83*.c F: drivers/extcon/extcon-arizona.cSignature · 1 line
2.1.4
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v2 3/3] mfd: wm831x: Add device tree binding document
Quoted 9 lines · Rob Herring
Quoted 3 lines · Charles Keepax
This is just a very simple initial binding, supporting only registering the chip and the GPIOs. More features will be added as support for device tree in the driver is expanded.
Please make the binding as complete as you can. You don't have to have driver side support in place. Doesn't have to be everything, but at least everything you know you will need.
I am happy to flush the binding out with a bit more detail, although the GPIOs are actually all I need to use at the moment. I will send a new revision with some more detail. Do we normally do anything to mark the bits of the binding that are currently un-implemented?
Thanks,
Charles