gpio: em: Add Device Tree support
PATCH 1/1 gpio: em: Add Device Tree support
From: Magnus Damm <[email protected]>
Update the Emma Mobile GPIO driver to add DT support.
The patch simply adds a two-cell xlate function and updates the probe code to allow configuration via DT using the "ngpios" property plus OF id in the same style as gpio-mvebu.c. The code is also adjusted to use postcore_initcall() to force early setup.
---
Written on top of:
[PATCH] gpio: em: Use irq_domain_add_simple() to fix runtime error
drivers/gpio/gpio-em.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-)
drivers/gpio/gpio-em.c +42 -3
@@ -231,10 +231,12 @@ static int em_gio_irq_domain_map(structstatic struct irq_domain_ops em_gio_irq_domain_ops = { .map = em_gio_irq_domain_map, + .xlate = irq_domain_xlate_twocell, };static int em_gio_probe (struct platform_device *pdev) { +struct gpio_em_config pdata_dt;struct gpio_em_config *pdata = pdev->dev.platform_data;struct em_gio_priv *p;struct resource *io[2 ], *irq[2 ];
@@ -259,8 +261,8 @@ static int em_gio_probe(struct platform_ irq[0 ] =platform_get_resource (pdev,IORESOURCE_IRQ ,0 ); irq[1 ] =platform_get_resource (pdev,IORESOURCE_IRQ ,1 ); -if (!io[0 ] || !io[1 ] || !irq[0 ] || !irq[1 ] || !pdata) { -dev_err (&pdev->dev,"missing IRQ, IOMEM or configuration\n" ); +if (!io[0 ] || !io[1 ] || !irq[0 ] || !irq[1 ]) { +dev_err (&pdev->dev,"missing IRQ or IOMEM\n" ); ret = -EINVAL ; goto err1; }
@@ -279,6 +281,25 @@ static int em_gio_probe(struct platform_ goto err2; } +if (!pdata) { +memset (&pdata_dt,0 ,sizeof (pdata_dt)); + pdata = &pdata_dt; + +if (of_property_read_u32 (pdev->dev.of_node,"ngpios" , + &pdata->number_of_pins)) { +dev_err (&pdev->dev,"Missing ngpios OF property\n" ); + ret = -EINVAL ; + goto err3; + } + + ret =of_alias_get_id (pdev->dev.of_node,"gpio" ); +if (ret <0 ) { +dev_err (&pdev->dev,"Couldn't get OF id\n" ); + goto err3; + } + pdata->gpio_base = ret *32 ;/* 32 GPIOs per instance */ + } + gpio_chip = &p->gpio_chip; gpio_chip->direction_input = em_gio_direction_input; gpio_chip->get = em_gio_get;
@@ -366,15 +387,33 @@ static int em_gio_remove(struct platformreturn 0 ; } +static const struct of_device_id em_gio_dt_ids[] = { + { .compatible ="renesas,em-gio" , }, + {}, +}; +MODULE_DEVICE_TABLE (of, em_gio_dt_ids); +static struct platform_driver em_gio_device_driver = { .probe = em_gio_probe, .remove = em_gio_remove, .driver = { .name ="em_gio" , + .of_match_table = em_gio_dt_ids, + .owner =THIS_MODULE , } }; -module_platform_driver (em_gio_device_driver); +static int __init em_gio_init (void ) +{ +return platform_driver_register (&em_gio_device_driver); +} +postcore_initcall (em_gio_init); + +static void __exit em_gio_exit(void) +{ +platform_driver_unregister (&em_gio_device_driver); +} +module_exit (em_gio_exit);MODULE_AUTHOR ("Magnus Damm" );MODULE_DESCRIPTION ("Renesas Emma Mobile GIO Driver" );
Hi Magnus,
Quoted 4 lines · Magnus Damm
From: Magnus Damm <[email protected]>
Update the Emma Mobile GPIO driver to add DT support.
...
drivers/gpio/gpio-em.c static int em_gio_remove(struct platform · line 389
Quoted 4 lines
drivers/gpio/gpio-em.c +0
-0@@ -366,15 +387,33 @@ static int em_gio_remove(struct platformreturn 0 ; }
#ifdef CONFIG_OF here? No need to have extra aliases in modules if OF support is not enabled (or is entire ARM arch now enables device tree?).
Quoted 16 lines
drivers/gpio/gpio-em.c +8
-0+static const struct of_device_id em_gio_dt_ids[] = { + { .compatible ="renesas,em-gio" , }, + {}, +}; +MODULE_DEVICE_TABLE (of, em_gio_dt_ids); +static struct platform_driver em_gio_device_driver = { .probe = em_gio_probe, .remove = em_gio_remove, .driver = { .name ="em_gio" , + .of_match_table = em_gio_dt_ids, + .owner =THIS_MODULE , } };
Signature · 1 line
Dmitry
Hi Dmitry,
Thanks for your feedback!
Quoted 18 lines · Dmitry Torokhov
Hi Magnus,
Quoted 4 lines · Magnus Damm
From: Magnus Damm <[email protected]>
Update the Emma Mobile GPIO driver to add DT support.
...
drivers/gpio/gpio-em.c static int em_gio_remove(struct platform · line 389
Quoted 4 lines
drivers/gpio/gpio-em.c +0
-0@@ -366,15 +387,33 @@ static int em_gio_remove(struct platformreturn 0 ; }#ifdef
CONFIG_OFhere? No need to have extra aliases in modules if OF support is not enabled (or is entire ARM arch now enables device tree?).
Quoted 6 lines
drivers/gpio/gpio-em.c static int em_gio_remove(struct platform · line 395
Quoted 6 lines
drivers/gpio/gpio-em.c +6
-0+static const struct of_device_id em_gio_dt_ids[] = { + { .compatible ="renesas,em-gio" , }, + {}, +}; +MODULE_DEVICE_TABLE (of, em_gio_dt_ids); +
I suppose we could sprinkle a couple of #ifdefs across the code, but I have to say that I'm not that fond of #ifdefs in general. So if it was up to me only then I would aim at having exactly zero #ifdefs in my drivers at the expense of slightly larger binaries in some cases.
Are you interested in hacking on EMEV2 in general? I assume you're busy, but I could try to locate a developer board for you if you'd like.
Cheers,
/ magnus
Quoted 24 lines · Magnus Damm
Hi Dmitry,
Thanks for your feedback!
Quoted 18 lines · Dmitry Torokhov
Hi Magnus,
Quoted 4 lines · Magnus Damm
From: Magnus Damm <[email protected]>
Update the Emma Mobile GPIO driver to add DT support.
...
drivers/gpio/gpio-em.c static int em_gio_remove(struct platform · line 389
Quoted 4 lines
drivers/gpio/gpio-em.c +0
-0@@ -366,15 +387,33 @@ static int em_gio_remove(struct platformreturn 0 ; }#ifdef
CONFIG_OFhere? No need to have extra aliases in modules if OF support is not enabled (or is entire ARM arch now enables device tree?).
Quoted 11 lines
Quoted 6 lines
drivers/gpio/gpio-em.c static int em_gio_remove(struct platform · line 395
Quoted 6 lines
drivers/gpio/gpio-em.c +6
-0+static const struct of_device_id em_gio_dt_ids[] = { + { .compatible ="renesas,em-gio" , }, + {}, +}; +MODULE_DEVICE_TABLE (of, em_gio_dt_ids); +I suppose we could sprinkle a couple of #ifdefs across the code, but I have to say that I'm not that fond of #ifdefs in general. So if it was up to me only then I would aim at having exactly zero #ifdefs in my drivers at the expense of slightly larger binaries in some cases.
My take on this is as follows (if anyone cares):
* The driver in question is currently only useful in conjunction with the Emev2 SoC and the kzm9g board which uses that SoC. The current (and to date only) practice when booting that board and thus SoC with merged upstream code is to do so using DT.
* The inclusion of the code above does not appear to cause build-time breakage even if CONFIG_OF is not set.
So it seems to me that it is reasonable to leave the code as is without being guarded by an #ifdef.
Quoted 44 lines · Simon Horman
Quoted 24 lines · Magnus Damm
Hi Dmitry,
Thanks for your feedback!
Quoted 18 lines · Dmitry Torokhov
Hi Magnus,
Quoted 4 lines · Magnus Damm
From: Magnus Damm <[email protected]>
Update the Emma Mobile GPIO driver to add DT support.
...
drivers/gpio/gpio-em.c static int em_gio_remove(struct platform · line 389
Quoted 4 lines
drivers/gpio/gpio-em.c +0
-0@@ -366,15 +387,33 @@ static int em_gio_remove(struct platformreturn 0 ; }#ifdef
CONFIG_OFhere? No need to have extra aliases in modules if OF support is not enabled (or is entire ARM arch now enables device tree?).Quoted 11 lines
Quoted 6 lines
drivers/gpio/gpio-em.c static int em_gio_remove(struct platform · line 395
Quoted 6 lines
drivers/gpio/gpio-em.c +6
-0+static const struct of_device_id em_gio_dt_ids[] = { + { .compatible ="renesas,em-gio" , }, + {}, +}; +MODULE_DEVICE_TABLE (of, em_gio_dt_ids); +I suppose we could sprinkle a couple of #ifdefs across the code, but I have to say that I'm not that fond of #ifdefs in general. So if it was up to me only then I would aim at having exactly zero #ifdefs in my drivers at the expense of slightly larger binaries in some cases.
My take on this is as follows (if anyone cares):
* The driver in question is currently only useful in conjunction with the Emev2 SoC and the kzm9g board which uses that SoC. The current (and to date only) practice when booting that board and thus SoC with merged upstream code is to do so using DT.
Quoted 5 lines
* The inclusion of the code above does not appear to cause build-time breakage even if
CONFIG_OFis not set.So it seems to me that it is reasonable to leave the code as is without being guarded by an #ifdef.
I completely agree. Applied for v3.10
g.
Signature · 2 lines
Grant Likely, B.Sc, P.Eng. Secret Lab Technologies, Ltd.