On Wed, 27 Aug 2014, Gyungoh Yoo wrote: > On Tue, Aug 26, 2014 at 09:22:58AM +0100, Lee Jones wrote: > > On Mon, 25 Aug 2014, Gyungoh Yoo wrote: > > > On Thu, Aug 21, 2014 at 10:45:02AM +0100, Lee Jones wrote: > > > > When you send patch-sets, you should send them connected to one > > > > another AKA threaded. That way, when we're reviewing we can look at > > > > the other patches in the set for reference. See the man page for `git > > > > send-email` for details. > > > > > > > > <commit log> > > > > > > > > > Signed-off-by: Gyungoh Yoo <jack.yoo@xxxxxxxxxxxxxxx> > > > > > --- > > > > [...] > > > > > > > +static int sky81452_register_devices(struct device *dev, > > > > > + const struct sky81452_platform_data *pdata) > > > > > +{ > > > > > + struct mfd_cell cells[] = { > > > > > + { > > > > > + .name = "sky81452-bl", > > > > > + .platform_data = pdata->bl_pdata, > > > > > + .pdata_size = sizeof(*pdata->bl_pdata), > > > > > > > > Have you tested this with DT? > > > > > > > > You're not passing the compatible string and not using > > > > of_platform_populate() so I'm struggling to see how it would work > > > > properly. > > > > > > sky81452-bl and regulator-sky81452 is parsing the information > > > in regulator node of its parent node. So I thought these 2 drivers > > > don't need compatible attribute. That is what it didn't have > > > compatible string. > > > Is is mandatory that all drivers should have compatible attribute? > > > > How do they obtain their DT nodes? > > The backlight driver which is one of the child driver is obtain its DT node like this > > np = of_get_child_by_name(dev->parent->of_node, "backlight"); The MFD core provides infrastructure so you don't have to do this. Just place the compatible string in 'struct mfd_cell cells[]' and the core will match and populate dev->of_node for you. > > [...] > > > > > > > + return mfd_add_devices(dev, -1, cells, ARRAY_SIZE(cells), > > > > > + NULL, 0, NULL); > > > > > > > > This doesn't really need to be in a function of its own. Please put > > > > it in .probe(). Also check for the return value and present the user > > > > with an error message if it fails. > > > > > > I think this need to be, in case of !CONFIG_OF. > > > Can you please explain more in details? > > > > Then how to you obtain the shared register map you created? > > regmap is stored in driver data in MFD. > > i2c_set_clientdata(client, regmap); > > The child drivers obain the regmap from the parent. > > struct regmap *regmap = dev_get_drvdata(dev->parent); Ah yes, of course you do. Silly of me to miss this. I also just noticed that you're also manually populating the chlidren's platform data. It's easier if you do this from the child device drivers: const struct sky81452_platform_data ppdata = dev_get_platdata(dev->parent); const struct sky81452_bl_platform_data = pdata = ppdata->bl_pdata; -- Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog -- 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