Hi Jonathan, On Sun, Jul 24, 2016 at 12:26:56PM +0100, Jonathan Cameron wrote: > >> @@ -142,23 +159,45 @@ static int sunxi_gpadc_mfd_probe(struct platform_device *pdev) > >> } > >> > >> if (of_device_is_compatible(pdev->dev.of_node, > >> - "allwinner,sun4i-a10-ts")) > >> - ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> - sun4i_gpadc_mfd_cells, > >> - ARRAY_SIZE(sun4i_gpadc_mfd_cells), NULL, > >> - 0, NULL); > >> - else if (of_device_is_compatible(pdev->dev.of_node, > >> - "allwinner,sun5i-a13-ts")) > >> - ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> - sun5i_gpadc_mfd_cells, > >> - ARRAY_SIZE(sun5i_gpadc_mfd_cells), NULL, > >> - 0, NULL); > >> - else if (of_device_is_compatible(pdev->dev.of_node, > >> - "allwinner,sun6i-a31-ts")) > >> - ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> - sun6i_gpadc_mfd_cells, > >> - ARRAY_SIZE(sun6i_gpadc_mfd_cells), NULL, > >> - 0, NULL); > >> + "allwinner,sun4i-a10-ts")) { > >> + if (of_property_read_bool(pdev->dev.of_node, > >> + "allwinner,ts-attached")) > >> + ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> + sun4i_gpadc_mfd_cells_ts, > >> + ARRAY_SIZE(sun4i_gpadc_mfd_cells_ts), > >> + NULL, 0, NULL); > >> + else > >> + ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> + sun4i_gpadc_mfd_cells, > >> + ARRAY_SIZE(sun4i_gpadc_mfd_cells), > >> + NULL, 0, NULL); > >> + } else if (of_device_is_compatible(pdev->dev.of_node, > >> + "allwinner,sun5i-a13-ts")) { > >> + if (of_property_read_bool(pdev->dev.of_node, > >> + "allwinner,ts-attached")) > >> + ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> + sun5i_gpadc_mfd_cells_ts, > >> + ARRAY_SIZE(sun5i_gpadc_mfd_cells_ts), > >> + NULL, 0, NULL); > >> + else > >> + ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> + sun5i_gpadc_mfd_cells, > >> + ARRAY_SIZE(sun5i_gpadc_mfd_cells), > >> + NULL, 0, NULL); > >> + } else if (of_device_is_compatible(pdev->dev.of_node, > >> + "allwinner,sun6i-a31-ts")) { > >> + if (of_property_read_bool(pdev->dev.of_node, > >> + "allwinner,ts-attached")) > >> + ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> + sun6i_gpadc_mfd_cells_ts, > >> + ARRAY_SIZE(sun6i_gpadc_mfd_cells_ts), > >> + NULL, 0, NULL); > >> + else > >> + ret = mfd_add_devices(sunxi_gpadc_mfd_dev->dev, 0, > >> + sun6i_gpadc_mfd_cells, > >> + ARRAY_SIZE(sun6i_gpadc_mfd_cells), > >> + NULL, 0, NULL); > >> + } > > > > Please don't use any of_device_is_compatible. > Hi Maxime, > > Why? (Just curious...) This is completely redundant. The compatible has already been looked up once to match the driver, and you can associate a void * pointer to any compatible you register in the of_device_id array. So you can just retrieve the compatible that probed you in the first place, and use it's private data pointer to store whatever you want, without the numerous (and expensive) calls to of_device_is_compatible. It's also easier to maintain in the long term, since you can simply add a new field to the structure you would register there, instead of keeping adding more conditions. Maxime -- Maxime Ripard, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Attachment:
signature.asc
Description: PGP signature