Message ID | 20240204083048.2458-2-xingtong_wu@163.com |
---|---|
State | Superseded |
Headers | show |
Series | Patch Resent: Enabling LED Support for Siemens IPC BX-59A | expand |
On Sun, 04 Feb 2024, Xing Tong Wu wrote: > From: Xing Tong Wu <xingtong.wu@siemens.com> > > This is used for the Siemens Simatic IPC BX-59A, which has its LEDs > connected to GPIOs provided by the Nuvoton NCT6126D > > Signed-off-by: Xing Tong Wu <xingtong.wu@siemens.com> > --- > .../leds/simple/simatic-ipc-leds-gpio-core.c | 1 + > .../simple/simatic-ipc-leds-gpio-f7188x.c | 42 ++++++++++++++++--- > 2 files changed, 37 insertions(+), 6 deletions(-) > > diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c > index 667ba1bc3a30..85003fd7f1aa 100644 > --- a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c > +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c > @@ -56,6 +56,7 @@ int simatic_ipc_leds_gpio_probe(struct platform_device *pdev, > case SIMATIC_IPC_DEVICE_127E: > case SIMATIC_IPC_DEVICE_227G: > case SIMATIC_IPC_DEVICE_BX_21A: > + case SIMATIC_IPC_DEVICE_BX_59A: > break; > default: > return -ENODEV; > diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c b/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c > index c7c3a1f986e6..783e74e9a805 100644 > --- a/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c > +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c > @@ -17,7 +17,10 @@ > > #include "simatic-ipc-leds-gpio.h" > > -static struct gpiod_lookup_table simatic_ipc_led_gpio_table = { > +static struct gpiod_lookup_table *led_lookup_table; > +static struct gpiod_lookup_table *led_lookup_table_extra; No globals please. Dynamically create them in .probe(). If you need to use them later use dev_{s,g}et_drvdata. > +static struct gpiod_lookup_table simatic_ipc_led_gpio_table_227g = { > .dev_id = "leds-gpio", > .table = { > GPIO_LOOKUP_IDX("gpio-f7188x-2", 0, NULL, 0, GPIO_ACTIVE_LOW), > @@ -30,7 +33,7 @@ static struct gpiod_lookup_table simatic_ipc_led_gpio_table = { > }, > }; > > -static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra = { > +static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra_227g = { > .dev_id = NULL, /* Filled during initialization */ > .table = { > GPIO_LOOKUP_IDX("gpio-f7188x-3", 6, NULL, 6, GPIO_ACTIVE_HIGH), > @@ -39,16 +42,43 @@ static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra = { > }, > }; > > +static struct gpiod_lookup_table simatic_ipc_led_gpio_table_bx_59a = { > + .dev_id = "leds-gpio", > + .table = { > + GPIO_LOOKUP_IDX("gpio-f7188x-2", 0, NULL, 0, GPIO_ACTIVE_LOW), > + GPIO_LOOKUP_IDX("gpio-f7188x-2", 3, NULL, 1, GPIO_ACTIVE_LOW), > + GPIO_LOOKUP_IDX("gpio-f7188x-5", 3, NULL, 2, GPIO_ACTIVE_LOW), > + GPIO_LOOKUP_IDX("gpio-f7188x-5", 2, NULL, 3, GPIO_ACTIVE_LOW), > + GPIO_LOOKUP_IDX("gpio-f7188x-7", 7, NULL, 4, GPIO_ACTIVE_LOW), > + GPIO_LOOKUP_IDX("gpio-f7188x-7", 4, NULL, 5, GPIO_ACTIVE_LOW), > + {} /* Terminating entry */ > + } > +}; > + > static int simatic_ipc_leds_gpio_f7188x_probe(struct platform_device *pdev) > { > - return simatic_ipc_leds_gpio_probe(pdev, &simatic_ipc_led_gpio_table, > - &simatic_ipc_led_gpio_table_extra); > + const struct simatic_ipc_platform *plat = pdev->dev.platform_data; > + > + switch (plat->devmode) { > + case SIMATIC_IPC_DEVICE_227G: > + led_lookup_table = &simatic_ipc_led_gpio_table_227g; > + led_lookup_table_extra = &simatic_ipc_led_gpio_table_extra_227g; > + break; > + case SIMATIC_IPC_DEVICE_BX_59A: > + led_lookup_table = &simatic_ipc_led_gpio_table_bx_59a; > + break; > + default: > + return -ENODEV; > + } > + > + return simatic_ipc_leds_gpio_probe(pdev, led_lookup_table, > + led_lookup_table_extra); > } > > static void simatic_ipc_leds_gpio_f7188x_remove(struct platform_device *pdev) > { > - simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, > - &simatic_ipc_led_gpio_table_extra); > + simatic_ipc_leds_gpio_remove(pdev, led_lookup_table, > + led_lookup_table_extra); > } > > static struct platform_driver simatic_ipc_led_gpio_driver = { > -- > 2.25.1 >
diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c index 667ba1bc3a30..85003fd7f1aa 100644 --- a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c @@ -56,6 +56,7 @@ int simatic_ipc_leds_gpio_probe(struct platform_device *pdev, case SIMATIC_IPC_DEVICE_127E: case SIMATIC_IPC_DEVICE_227G: case SIMATIC_IPC_DEVICE_BX_21A: + case SIMATIC_IPC_DEVICE_BX_59A: break; default: return -ENODEV; diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c b/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c index c7c3a1f986e6..783e74e9a805 100644 --- a/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c @@ -17,7 +17,10 @@ #include "simatic-ipc-leds-gpio.h" -static struct gpiod_lookup_table simatic_ipc_led_gpio_table = { +static struct gpiod_lookup_table *led_lookup_table; +static struct gpiod_lookup_table *led_lookup_table_extra; + +static struct gpiod_lookup_table simatic_ipc_led_gpio_table_227g = { .dev_id = "leds-gpio", .table = { GPIO_LOOKUP_IDX("gpio-f7188x-2", 0, NULL, 0, GPIO_ACTIVE_LOW), @@ -30,7 +33,7 @@ static struct gpiod_lookup_table simatic_ipc_led_gpio_table = { }, }; -static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra = { +static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra_227g = { .dev_id = NULL, /* Filled during initialization */ .table = { GPIO_LOOKUP_IDX("gpio-f7188x-3", 6, NULL, 6, GPIO_ACTIVE_HIGH), @@ -39,16 +42,43 @@ static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra = { }, }; +static struct gpiod_lookup_table simatic_ipc_led_gpio_table_bx_59a = { + .dev_id = "leds-gpio", + .table = { + GPIO_LOOKUP_IDX("gpio-f7188x-2", 0, NULL, 0, GPIO_ACTIVE_LOW), + GPIO_LOOKUP_IDX("gpio-f7188x-2", 3, NULL, 1, GPIO_ACTIVE_LOW), + GPIO_LOOKUP_IDX("gpio-f7188x-5", 3, NULL, 2, GPIO_ACTIVE_LOW), + GPIO_LOOKUP_IDX("gpio-f7188x-5", 2, NULL, 3, GPIO_ACTIVE_LOW), + GPIO_LOOKUP_IDX("gpio-f7188x-7", 7, NULL, 4, GPIO_ACTIVE_LOW), + GPIO_LOOKUP_IDX("gpio-f7188x-7", 4, NULL, 5, GPIO_ACTIVE_LOW), + {} /* Terminating entry */ + } +}; + static int simatic_ipc_leds_gpio_f7188x_probe(struct platform_device *pdev) { - return simatic_ipc_leds_gpio_probe(pdev, &simatic_ipc_led_gpio_table, - &simatic_ipc_led_gpio_table_extra); + const struct simatic_ipc_platform *plat = pdev->dev.platform_data; + + switch (plat->devmode) { + case SIMATIC_IPC_DEVICE_227G: + led_lookup_table = &simatic_ipc_led_gpio_table_227g; + led_lookup_table_extra = &simatic_ipc_led_gpio_table_extra_227g; + break; + case SIMATIC_IPC_DEVICE_BX_59A: + led_lookup_table = &simatic_ipc_led_gpio_table_bx_59a; + break; + default: + return -ENODEV; + } + + return simatic_ipc_leds_gpio_probe(pdev, led_lookup_table, + led_lookup_table_extra); } static void simatic_ipc_leds_gpio_f7188x_remove(struct platform_device *pdev) { - simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, - &simatic_ipc_led_gpio_table_extra); + simatic_ipc_leds_gpio_remove(pdev, led_lookup_table, + led_lookup_table_extra); } static struct platform_driver simatic_ipc_led_gpio_driver = {