On Fri, Aug 30, 2013 at 05:29:36AM +0100, Guenter Roeck wrote: > Signed-off-by: Guenter Roeck <linux@xxxxxxxxxxxx> > --- > drivers/extcon/extcon-gpio.c | 59 ++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 57 insertions(+), 2 deletions(-) > > diff --git a/drivers/extcon/extcon-gpio.c b/drivers/extcon/extcon-gpio.c > index d4e3c89..16951fe 100644 > --- a/drivers/extcon/extcon-gpio.c > +++ b/drivers/extcon/extcon-gpio.c > @@ -30,6 +30,8 @@ > #include <linux/gpio.h> > #include <linux/extcon.h> > #include <linux/extcon/extcon-gpio.h> > +#include <linux/of_gpio.h> > +#include <linux/err.h> > > struct gpio_extcon_data { > struct extcon_dev edev; > @@ -77,14 +79,66 @@ static ssize_t extcon_gpio_print_state(struct extcon_dev *edev, char *buf) > return -EINVAL; > } > > +#ifdef CONFIG_OF_GPIO > + > +static struct gpio_extcon_platform_data * > +extcon_gpio_config_of(struct device *dev) > +{ > + struct gpio_extcon_platform_data *pdata; > + struct device_node *np = dev->of_node; > + enum of_gpio_flags flags; > + int gpio, ret; > + u32 debounce; > + > + gpio = of_get_named_gpio_flags(np, "presence-detect-gpios", 0, &flags); > + if (gpio < 0) > + return ERR_PTR(gpio); > + > + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); > + if (!pdata) > + return ERR_PTR(-ENOMEM); > + > + pdata->gpio = gpio; > + pdata->gpio_active_low = flags & OF_GPIO_ACTIVE_LOW; > + pdata->irq_flags = IRQ_TYPE_EDGE_BOTH; > + > + if (!of_property_read_u32(np, "debounce-interval", &debounce)) > + pdata->debounce = debounce; > + > + ret = of_property_read_string(np, "name", &pdata->name); This wasn't listed in the binding. What's this for? Thanks, Mark. > + if (ret < 0) > + return ERR_PTR(ret); > + > + of_property_read_string(np, "state-on", &pdata->state_on); > + of_property_read_string(np, "state-off", &pdata->state_off); > + > + return pdata; > +} > + > +static const struct of_device_id of_gpio_extcon_match[] = { > + { .compatible = "gpio-connector", }, > + {}, > +}; > +#else /* CONFIG_OF_GPIO */ > +static struct gpio_extcon_platform_data * > +extcon_gpio_config_of(struct device *pdev) > +{ > + return ERR_PTR(-ENODEV); > +} > +#endif /* CONFIG_OF_GPIO */ > + > static int gpio_extcon_probe(struct platform_device *pdev) > { > struct gpio_extcon_platform_data *pdata = pdev->dev.platform_data; > struct gpio_extcon_data *extcon_data; > int ret; > > - if (!pdata) > - return -EBUSY; > + if (!pdata) { > + pdata = extcon_gpio_config_of(&pdev->dev); > + if (IS_ERR(pdata)) > + return PTR_ERR(pdata); > + } > + > if (!pdata->irq_flags) { > dev_err(&pdev->dev, "IRQ flag is not specified.\n"); > return -EINVAL; > @@ -161,6 +215,7 @@ static struct platform_driver gpio_extcon_driver = { > .driver = { > .name = "extcon-gpio", > .owner = THIS_MODULE, > + .of_match_table = of_match_ptr(of_gpio_extcon_match), > }, > }; > > -- > 1.7.9.7 > > -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html