Re: [PATCH v3 10/15] leds: leds-gpio: Add ACPI probing support

Mika Westerberg
2014-10-01T09:13:21Z

On Wed, Oct 01, 2014 at 10:13:04AM +0200, Arnd Bergmann wrote:
> On Wednesday 01 October 2014 04:17:02 Rafael J. Wysocki wrote:
> > Index: linux-pm/drivers/leds/leds-gpio.c
> > ===================================================================
> > --- linux-pm.orig/drivers/leds/leds-gpio.c
> > +++ linux-pm/drivers/leds/leds-gpio.c
> > @@ -231,6 +231,13 @@ static const struct of_device_id of_gpio
> >
> > MODULE_DEVICE_TABLE(of, of_gpio_leds_match);
> >
> > +static const struct acpi_device_id acpi_gpio_leds_match[] = {
> > + { "PRP0001" }, /* Device Tree shoehorned into ACPI */
> > + {},
> > +};
> > +
> > +MODULE_DEVICE_TABLE(acpi, acpi_gpio_leds_match);
> > +
> > static int gpio_led_probe(struct platform_device *pdev)
> > {
> > struct gpio_led_platform_data *pdata = dev_get_platdata(&pdev->dev);
> > @@ -286,6 +293,7 @@ static struct platform_driver gpio_led_d
> > .name = "leds-gpio",
> > .owner = THIS_MODULE,
> > .of_match_table = of_gpio_leds_match,
> > + .acpi_match_table = acpi_gpio_leds_match,
> > },
> > };
>
> Is this something you'd have to do in every driver you want to support
> _PRP based probing? For the ".acpi_match_table =" reference, I think
> you could actually provide a generic acpi_device_id table exported from
> core code that you refer to, so each driver just does
>
> .acpi_match_table = acpi_match_by_of_compatible,
>
> (or whatever you want to call it).

That's a good idea.

> Regarding the MODULE_DEVICE_TABLE, I suspect the above won't work the
> way you are hoping for, because once you get to dozens or hundreds of
> drivers doing this, each device will show up with the same string,
> so udev will try to load all the modules that list "PRP0001". That
> doesn't look right. With the code from patch 3, you can probably drop
> the acpi MODULE_DEVICE_TABLE() entirely and get the correct behavior.

It actually works like this now:

# cd /sys/bus/platform/devices/PRP0001\:00/
DRIVER=leds-gpio
MODALIAS=of:Nprp0001TacpiCgpio-leds

# cat modalias
of:Nprp0001TacpiCgpio-leds

In other words the modalias changes to be of:Nprp0001Tacpi, e.g
name=prp0001, type=acpi and then list of compatible values.

Udev then loads only module that matches the modalias so it should not
load everything listing PRP0001 in their MODULE_DEVICE_TABLE().