diff options
| author | Florian Vaussard <florian.vaussard@epfl.ch> | 2012-09-05 09:46:25 +0200 | 
|---|---|---|
| committer | Benoit Cousson <b-cousson@ti.com> | 2012-09-07 19:22:27 +0200 | 
| commit | f74ce8fb849e9f9c54a494cff5fc30d53ca4e963 (patch) | |
| tree | 4136e8fc03d9aff1155a316c839f69f05f63d25a | |
| parent | 5635121edb18cda14a60e4702f3ae53add5df894 (diff) | |
| download | olio-linux-3.10-f74ce8fb849e9f9c54a494cff5fc30d53ca4e963.tar.xz olio-linux-3.10-f74ce8fb849e9f9c54a494cff5fc30d53ca4e963.zip  | |
gpio/twl4030: get platform data from device tree
Adds a number of missing device tree properties for
twl4030/gpio, and update bindings:
- "ti,use-leds"  -> .use_leds
- "ti,debounce"  -> .debounce
- "ti,mmc-cd"    -> .mmc_cd
- "ti,pullups"   -> .pullups
- "ti,pulldowns" -> .pulldowns
Signed-off-by: Florian Vaussard <florian.vaussard@epfl.ch>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Vaibhav Hiremath <hvaibhav@ti.com>
[b-cousson@ti.com: Fix some checkpatch CHECK issues]
Signed-off-by: Benoit Cousson <b-cousson@ti.com>
| -rw-r--r-- | Documentation/devicetree/bindings/gpio/gpio-twl4030.txt | 6 | ||||
| -rw-r--r-- | drivers/gpio/gpio-twl4030.c | 80 | 
2 files changed, 60 insertions, 26 deletions
diff --git a/Documentation/devicetree/bindings/gpio/gpio-twl4030.txt b/Documentation/devicetree/bindings/gpio/gpio-twl4030.txt index 16695d9cf1e..66788fda1db 100644 --- a/Documentation/devicetree/bindings/gpio/gpio-twl4030.txt +++ b/Documentation/devicetree/bindings/gpio/gpio-twl4030.txt @@ -11,6 +11,11 @@ Required properties:  - interrupt-controller: Mark the device node as an interrupt controller    The first cell is the GPIO number.    The second cell is not used. +- ti,use-leds : Enables LEDA and LEDB outputs if set +- ti,debounce : if n-th bit is set, debounces GPIO-n +- ti,mmc-cd : if n-th bit is set, GPIO-n controls VMMC(n+1) +- ti,pullups : if n-th bit is set, set a pullup on GPIO-n +- ti,pulldowns : if n-th bit is set, set a pulldown on GPIO-n  Example: @@ -20,4 +25,5 @@ twl_gpio: gpio {      gpio-controller;      #interrupt-cells = <2>;      interrupt-controller; +    ti,use-leds;  }; diff --git a/drivers/gpio/gpio-twl4030.c b/drivers/gpio/gpio-twl4030.c index 94256fe7bf3..f923252da83 100644 --- a/drivers/gpio/gpio-twl4030.c +++ b/drivers/gpio/gpio-twl4030.c @@ -395,6 +395,31 @@ static int __devinit gpio_twl4030_debounce(u32 debounce, u8 mmc_cd)  static int gpio_twl4030_remove(struct platform_device *pdev); +static struct twl4030_gpio_platform_data *of_gpio_twl4030(struct device *dev) +{ +	struct twl4030_gpio_platform_data *omap_twl_info; + +	omap_twl_info = devm_kzalloc(dev, sizeof(*omap_twl_info), GFP_KERNEL); +	if (!omap_twl_info) +		return NULL; + +	omap_twl_info->gpio_base = -1; + +	omap_twl_info->use_leds = of_property_read_bool(dev->of_node, +			"ti,use-leds"); + +	of_property_read_u32(dev->of_node, "ti,debounce", +			     &omap_twl_info->debounce); +	of_property_read_u32(dev->of_node, "ti,mmc-cd", +			     (u32 *)&omap_twl_info->mmc_cd); +	of_property_read_u32(dev->of_node, "ti,pullups", +			     &omap_twl_info->pullups); +	of_property_read_u32(dev->of_node, "ti,pulldowns", +			     &omap_twl_info->pulldowns); + +	return omap_twl_info; +} +  static int __devinit gpio_twl4030_probe(struct platform_device *pdev)  {  	struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data; @@ -423,38 +448,41 @@ static int __devinit gpio_twl4030_probe(struct platform_device *pdev)  	twl4030_gpio_irq_base = irq_base;  no_irqs: -	twl_gpiochip.base = -1;  	twl_gpiochip.ngpio = TWL4030_GPIO_MAX;  	twl_gpiochip.dev = &pdev->dev; -	if (pdata) { -		twl_gpiochip.base = pdata->gpio_base; +	if (node) +		pdata = of_gpio_twl4030(&pdev->dev); -		/* -		 * NOTE:  boards may waste power if they don't set pullups -		 * and pulldowns correctly ... default for non-ULPI pins is -		 * pulldown, and some other pins may have external pullups -		 * or pulldowns.  Careful! -		 */ -		ret = gpio_twl4030_pulls(pdata->pullups, pdata->pulldowns); -		if (ret) -			dev_dbg(&pdev->dev, "pullups %.05x %.05x --> %d\n", -					pdata->pullups, pdata->pulldowns, -					ret); +	if (pdata == NULL) { +		dev_err(&pdev->dev, "Platform data is missing\n"); +		return -ENXIO; +	} -		ret = gpio_twl4030_debounce(pdata->debounce, pdata->mmc_cd); -		if (ret) -			dev_dbg(&pdev->dev, "debounce %.03x %.01x --> %d\n", -					pdata->debounce, pdata->mmc_cd, -					ret); +	twl_gpiochip.base = pdata->gpio_base; -		/* -		 * NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE, -		 * is (still) clear if use_leds is set. -		 */ -		if (pdata->use_leds) -			twl_gpiochip.ngpio += 2; -	} +	/* +	 * NOTE:  boards may waste power if they don't set pullups +	 * and pulldowns correctly ... default for non-ULPI pins is +	 * pulldown, and some other pins may have external pullups +	 * or pulldowns.  Careful! +	 */ +	ret = gpio_twl4030_pulls(pdata->pullups, pdata->pulldowns); +	if (ret) +		dev_dbg(&pdev->dev, "pullups %.05x %.05x --> %d\n", +			pdata->pullups, pdata->pulldowns, ret); + +	ret = gpio_twl4030_debounce(pdata->debounce, pdata->mmc_cd); +	if (ret) +		dev_dbg(&pdev->dev, "debounce %.03x %.01x --> %d\n", +			pdata->debounce, pdata->mmc_cd, ret); + +	/* +	 * NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE, +	 * is (still) clear if use_leds is set. +	 */ +	if (pdata->use_leds) +		twl_gpiochip.ngpio += 2;  	ret = gpiochip_add(&twl_gpiochip);  	if (ret < 0) {  |