[PATCH 3/7] pinctrl: imx1 core driver
Markus Pargmann
mpa at pengutronix.de
Fri Aug 9 14:16:41 EDT 2013
On Mon, Aug 05, 2013 at 11:29:52AM +0200, Sascha Hauer wrote:
> On Fri, Aug 02, 2013 at 12:38:23PM +0200, Markus Pargmann wrote:
> > Signed-off-by: Markus Pargmann <mpa at pengutronix.de>
> > ---
> > drivers/pinctrl/Kconfig | 5 +
> > drivers/pinctrl/Makefile | 1 +
> > drivers/pinctrl/pinctrl-imx1-core.c | 667 ++++++++++++++++++++++++++++++++++++
> > drivers/pinctrl/pinctrl-imx1.h | 23 ++
> > 4 files changed, 696 insertions(+)
> > create mode 100644 drivers/pinctrl/pinctrl-imx1-core.c
> > create mode 100644 drivers/pinctrl/pinctrl-imx1.h
> >
> > +static int imx1_pinctrl_parse_groups(struct device_node *np,
> > + struct imx_pin_group *grp,
> > + struct imx_pinctrl_soc_info *info,
> > + u32 index)
> > +{
> > + int size;
> > + const __be32 *list;
> > + int i;
> > + u32 config;
> > +
> > + dev_dbg(info->dev, "group(%d): %s\n", index, np->name);
> > +
> > + /* Initialise group */
> > + grp->name = np->name;
> > +
> > + /*
> > + * the binding format is fsl,pins = <PIN_FUNC_ID CONFIG ...>,
> > + * do sanity check and calculate pins number
> > + */
> > + list = of_get_property(np, "fsl,pins", &size);
> > + /* we do not check return since it's safe node passed down */
> > + if (!size || size % 12) {
> > + dev_notice(info->dev, "Not a valid fsl,pins property (%s)\n",
> > + np->name);
> > + return -EINVAL;
> > + }
> > +
> > + grp->npins = size / 12;
> > + grp->pins = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
> > + GFP_KERNEL);
> > + grp->mux_mode = devm_kzalloc(info->dev,
> > + grp->npins * sizeof(unsigned int), GFP_KERNEL);
> > + grp->configs = devm_kzalloc(info->dev,
> > + grp->npins * sizeof(unsigned long), GFP_KERNEL);
>
> I know this is copied from the existing imx pinctrl driver, but normally
> we check for allocation failures.
Yes, I added allocation checks.
>
> Also I find it very irritating that you allocate three arrays of
> integers instead of a single array of a struct type. I know the pinctrl
> framework forces you to pass an array of pin numbers (which is quite
> horrible for drivers to handle, who came up with the idea that a pin is
> a number instead of some struct pointer which can be attached data to?)
Fixed, using new imx1_pin structs now.
>
> > + for (i = 0; i < grp->npins; i++) {
> > + grp->pins[i] = be32_to_cpu(*list++);
> > + grp->mux_mode[i] = be32_to_cpu(*list++);
> > +
> > + config = be32_to_cpu(*list++);
> > + grp->configs[i] = config;
> > + }
> > +
> > + return 0;
> > +}
> > +
>
> [...]
>
> > +
> > + for_each_child_of_node(np, child) {
> > + func->groups[i] = child->name;
> > + grp = &info->groups[grp_index++];
> > + ret = imx1_pinctrl_parse_groups(child, grp, info, i++);
> > + if (ret)
> > + return ret;
>
> This is one thing which nags me in the imx pinctrl driver aswell. Once
> you made a single mistake in a single pinctrl group in the devicetree
> you will never see the error message because the whole pinctrl driver
> bails out leaving the serial driver with the console unusable. Wouldn't
> it be possible to continue here instead of bailing out?
Yes, it is possible. I changed it to continue if ret != -ENOMEM.
Thanks,
Markus
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the linux-arm-kernel
mailing list