Messages in this thread Patch in this message | | | Date | Fri, 21 Mar 2014 15:44:00 +0000 | From | Charles Keepax <> | Subject | Re: [PATCH 2/5] mfd: arizona: Fix and factor out read of device tree GPIOs |
| |
On Fri, Mar 21, 2014 at 10:52:18AM +0000, Lee Jones wrote: > On Wed, 19 Mar 2014, Charles Keepax wrote: > > > On non-DT systems with device tree built in the current device tree GPIO > > reads will overwrite the pdata with zero when they fail. This patch > > factors out the reading of GPIOs for the Arizona devices into a helper > > function, and ensures that the pdata version will be preserved if the > > device tree read fails. > > > > Signed-off-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com> > > --- > > drivers/mfd/arizona-core.c | 33 ++++++++++++++++++++++++--------- > > include/linux/mfd/arizona/core.h | 3 +++ > > 2 files changed, 27 insertions(+), 9 deletions(-) > > > > diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c > > index a45aab9..333621e 100644 > > --- a/drivers/mfd/arizona-core.c > > +++ b/drivers/mfd/arizona-core.c > > @@ -512,19 +512,34 @@ int arizona_of_get_type(struct device *dev) > > } > > EXPORT_SYMBOL_GPL(arizona_of_get_type); > > > > +int arizona_of_get_named_gpio(struct arizona *arizona, const char *prop, > > + bool mandatory, int *gpio) > > +{ > > + int ret; > > + > > + ret = of_get_named_gpio(arizona->dev->of_node, prop, 0); > > + if (ret >= 0) { > > + *gpio = ret; > > + return ret; > > + } > > + > > + /* Warn if GPIO is mandatory and not specified */ > > + if (mandatory && *gpio <= 0) > > + dev_err(arizona->dev, > > + "Mandatory DT gpio %s missing/malformed: %d\n", > > + prop, ret); > > + > > + return ret; > > +} > > +EXPORT_SYMBOL_GPL(arizona_of_get_named_gpio); > > + > > static int arizona_of_get_core_pdata(struct arizona *arizona) > > { > > + struct arizona_pdata *pdata = &arizona->pdata; > > int ret, i; > > > > - arizona->pdata.reset = of_get_named_gpio(arizona->dev->of_node, > > - "wlf,reset", 0); > > - if (arizona->pdata.reset < 0) > > - arizona->pdata.reset = 0; > > - > > - arizona->pdata.ldoena = of_get_named_gpio(arizona->dev->of_node, > > - "wlf,ldoena", 0); > > - if (arizona->pdata.ldoena < 0) > > - arizona->pdata.ldoena = 0; > > + arizona_of_get_named_gpio(arizona, "wlf,reset", true, &pdata->reset); > > + arizona_of_get_named_gpio(arizona, "wlf,ldoena", true, &pdata->ldoena); > > > > ret = of_property_read_u32_array(arizona->dev->of_node, > > "wlf,gpio-defaults", > > This doesn't look correct to me at all. Have you tested it in the DT > and !DT case? By the looks of it arizona_of_get_core_pdata() is only > called if no platform data is present. Yet you are dereferencing it > here without allocated any memory.
The pdata struct is contained within the arizona one so there is no need to allocate memory for it.
> > So how were any platform data passed variables being overwritten in > the first place?
Ah good point this is not called if the pdata exists, I will update the commit message.
Thanks, Charles
| |