Quoting Rob Herring (2018-11-06 12:44:52) > On Tue, Nov 6, 2018 at 12:36 PM Stephen Boyd <sboyd@xxxxxxxxxx> wrote: > > > > We have a handful of clk drivers that have a collection of slightly > > variant device support keyed off of the compatible string. In each of > > these drivers, we demux the variant and then call the "real" probe > > function based on whatever is stored in the match data for that > > compatible string. Let's generalize this function so that it can be > > re-used as the platform_driver probe function directly. > > This looks really hacky to me. It sounds kind of general, but really > only works if we have match data that's a single function and we lose > any type checking on the function. I don't know what this means. Are you saying that we lose the ability to type check the function pointer stored in the data member? I don't have a good answer for this besides it's not any worse than the status quo for the mediatek drivers. One alternative is to add a DT only array to the platform_driver struct that has the platform driver probe function type and matches the index in the of_device_id table. Then we can add some logic into platform_drv_probe() to look for this table being set and find the probe function to call. Then we still have match data for anything that wants that (maybe it could be passed in to the probe function) at the cost of having another array. I don't have a use-case for this right now so I'm not sure this is a great idea. struct of_platform_driver_probe_func { int (*probe)(struct platform_device *pdev); }; struct of_platform_driver_probe_func mtk_probes[] = { mtk_probe1, mtk_probe2, mtk_probe3, }; struct platform_driver mtk_driver = { .of_probes = &mtk_probes; .driver = { .name = "mtk-foo"; .of_match_table = mtk_match_table, }, }; > What about things other than > platform devices? > I suppose those would need similar functions that take the right struct type and match the driver probe function signature. To make the above more generic we could try to figure out a way to put the 'of_probes' array inside struct device_driver. That would require dropping platform_device specifically from the probe functions and having those take a plain 'struct device' that those probe functions turn into the appropriate structure with to_platform_device() or to_i2c_client()? So the example would become struct of_driver_probe_func { int (*probe)(struct device *dev); }; struct of_driver_probe_func mtk_probes[] = { mtk_probe1, mtk_probe2, mtk_probe3, }; struct platform_driver mtk_driver = { .driver = { .name = "mtk-foo"; .of_match_table = mtk_match_table, .of_probes = &mtk_probes; }, }; And the probe functions might need to container_of() the device pointer to get the struct they know they need. The probe function could also be added to of_device_id and then we would have to look and see if that pointer is populated when the device is matched in generic device code.