Hi, On 5/31/23 17:54, Henning Schild wrote: > This adds support for the Siemens Simatic IPC BX-21A. Its LEDs are > connected to GPIO pins provided by the Intel Elkhart Lake pinctrl > driver. > > Signed-off-by: Henning Schild <henning.schild@xxxxxxxxxxx> Thank you for the patch. Since this mostly touches files under drivers/leds I believe it would be best for this to be merged through Lee's LEDs tree. Here is my ack for merging the pdx86 bits through that tree: Acked-by: Hans de Goede <hdegoede@xxxxxxxxxx> Regards, Hans > --- > drivers/leds/simple/Kconfig | 13 +++++ > drivers/leds/simple/Makefile | 1 + > .../leds/simple/simatic-ipc-leds-gpio-core.c | 4 ++ > .../simatic-ipc-leds-gpio-elkhartlake.c | 57 +++++++++++++++++++ > drivers/platform/x86/simatic-ipc.c | 3 + > .../platform_data/x86/simatic-ipc-base.h | 1 + > include/linux/platform_data/x86/simatic-ipc.h | 3 +- > 7 files changed, 81 insertions(+), 1 deletion(-) > create mode 100644 drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c > > diff --git a/drivers/leds/simple/Kconfig b/drivers/leds/simple/Kconfig > index 44fa0f93cb3b..626ab18ac09d 100644 > --- a/drivers/leds/simple/Kconfig > +++ b/drivers/leds/simple/Kconfig > @@ -34,3 +34,16 @@ config LEDS_SIEMENS_SIMATIC_IPC_F7188X > > To compile this driver as a module, choose M here: the module > will be called simatic-ipc-leds-gpio-f7188x. > + > +config LEDS_SIEMENS_SIMATIC_IPC_ELKHARTLAKE > + tristate "LED driver for Siemens Simatic IPCs based on Intel Elkhart Lake GPIO" > + depends on LEDS_GPIO > + depends on PINCTRL_ELKHARTLAKE > + depends on SIEMENS_SIMATIC_IPC > + default LEDS_SIEMENS_SIMATIC_IPC > + help > + This option enables support for the LEDs of several Industrial PCs > + from Siemens based on Elkhart Lake GPIO i.e. BX-21A. > + > + To compile this driver as a module, choose M here: the module > + will be called simatic-ipc-leds-gpio-elkhartlake. > diff --git a/drivers/leds/simple/Makefile b/drivers/leds/simple/Makefile > index e3e840cea275..783578f11bb0 100644 > --- a/drivers/leds/simple/Makefile > +++ b/drivers/leds/simple/Makefile > @@ -2,3 +2,4 @@ > obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC) += simatic-ipc-leds.o > obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC_APOLLOLAKE) += simatic-ipc-leds-gpio-core.o simatic-ipc-leds-gpio-apollolake.o > obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC_F7188X) += simatic-ipc-leds-gpio-core.o simatic-ipc-leds-gpio-f7188x.o > +obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC_ELKHARTLAKE) += simatic-ipc-leds-gpio-core.o simatic-ipc-leds-gpio-elkhartlake.o > diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c > index 2a21b663df87..c552ea73ed9d 100644 > --- a/drivers/leds/simple/simatic-ipc-leds-gpio-core.c > +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-core.c > @@ -57,6 +57,7 @@ int simatic_ipc_leds_gpio_probe(struct platform_device *pdev, > switch (plat->devmode) { > case SIMATIC_IPC_DEVICE_127E: > case SIMATIC_IPC_DEVICE_227G: > + case SIMATIC_IPC_DEVICE_BX_21A: > break; > default: > return -ENODEV; > @@ -72,6 +73,9 @@ int simatic_ipc_leds_gpio_probe(struct platform_device *pdev, > goto out; > } > > + if (!table_extra) > + return 0; > + > table_extra->dev_id = dev_name(dev); > gpiod_add_lookup_table(table_extra); > > diff --git a/drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c b/drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c > new file mode 100644 > index 000000000000..6ba21dbb3ba0 > --- /dev/null > +++ b/drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c > @@ -0,0 +1,57 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Siemens SIMATIC IPC driver for GPIO based LEDs > + * > + * Copyright (c) Siemens AG, 2023 > + * > + * Author: > + * Henning Schild <henning.schild@xxxxxxxxxxx> > + */ > + > +#include <linux/gpio/machine.h> > +#include <linux/gpio/consumer.h> > +#include <linux/leds.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > +#include <linux/platform_data/x86/simatic-ipc-base.h> > + > +#include "simatic-ipc-leds-gpio.h" > + > +static struct gpiod_lookup_table simatic_ipc_led_gpio_table = { > + .dev_id = "leds-gpio", > + .table = { > + GPIO_LOOKUP_IDX("INTC1020:04", 72, NULL, 0, GPIO_ACTIVE_HIGH), > + GPIO_LOOKUP_IDX("INTC1020:04", 77, NULL, 1, GPIO_ACTIVE_HIGH), > + GPIO_LOOKUP_IDX("INTC1020:04", 78, NULL, 2, GPIO_ACTIVE_HIGH), > + GPIO_LOOKUP_IDX("INTC1020:04", 58, NULL, 3, GPIO_ACTIVE_HIGH), > + GPIO_LOOKUP_IDX("INTC1020:04", 60, NULL, 4, GPIO_ACTIVE_HIGH), > + GPIO_LOOKUP_IDX("INTC1020:04", 62, NULL, 5, GPIO_ACTIVE_HIGH), > + {} /* Terminating entry */ > + }, > +}; > + > +static int simatic_ipc_leds_gpio_elkhartlake_probe(struct platform_device *pdev) > +{ > + return simatic_ipc_leds_gpio_probe(pdev, &simatic_ipc_led_gpio_table, > + NULL); > +} > + > +static int simatic_ipc_leds_gpio_elkhartlake_remove(struct platform_device *pdev) > +{ > + return simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table, > + NULL); > +} > + > +static struct platform_driver simatic_ipc_led_gpio_elkhartlake_driver = { > + .probe = simatic_ipc_leds_gpio_elkhartlake_probe, > + .remove = simatic_ipc_leds_gpio_elkhartlake_remove, > + .driver = { > + .name = KBUILD_MODNAME, > + }, > +}; > +module_platform_driver(simatic_ipc_led_gpio_elkhartlake_driver); > + > +MODULE_LICENSE("GPL v2"); > +MODULE_ALIAS("platform:" KBUILD_MODNAME); > +MODULE_SOFTDEP("pre: simatic-ipc-leds-gpio-core platform:elkhartlake-pinctrl"); > +MODULE_AUTHOR("Henning Schild <henning.schild@xxxxxxxxxxx>"); > diff --git a/drivers/platform/x86/simatic-ipc.c b/drivers/platform/x86/simatic-ipc.c > index c773995b230d..4402cd354104 100644 > --- a/drivers/platform/x86/simatic-ipc.c > +++ b/drivers/platform/x86/simatic-ipc.c > @@ -48,6 +48,7 @@ static struct { > {SIMATIC_IPC_IPC477E, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_427E}, > {SIMATIC_IPC_IPCBX_39A, SIMATIC_IPC_DEVICE_227G, SIMATIC_IPC_DEVICE_227G}, > {SIMATIC_IPC_IPCPX_39A, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_227G}, > + {SIMATIC_IPC_IPCBX_21A, SIMATIC_IPC_DEVICE_BX_21A, SIMATIC_IPC_DEVICE_NONE}, > }; > > static int register_platform_devices(u32 station_id) > @@ -72,6 +73,8 @@ static int register_platform_devices(u32 station_id) > pdevname = KBUILD_MODNAME "_leds_gpio_apollolake"; > if (ledmode == SIMATIC_IPC_DEVICE_227G) > pdevname = KBUILD_MODNAME "_leds_gpio_f7188x"; > + if (ledmode == SIMATIC_IPC_DEVICE_BX_21A) > + pdevname = KBUILD_MODNAME "_leds_gpio_elkhartlake"; > platform_data.devmode = ledmode; > ipc_led_platform_device = > platform_device_register_data(NULL, > diff --git a/include/linux/platform_data/x86/simatic-ipc-base.h b/include/linux/platform_data/x86/simatic-ipc-base.h > index 57d6a10dfc9e..00bf18ecb160 100644 > --- a/include/linux/platform_data/x86/simatic-ipc-base.h > +++ b/include/linux/platform_data/x86/simatic-ipc-base.h > @@ -20,6 +20,7 @@ > #define SIMATIC_IPC_DEVICE_127E 3 > #define SIMATIC_IPC_DEVICE_227E 4 > #define SIMATIC_IPC_DEVICE_227G 5 > +#define SIMATIC_IPC_DEVICE_BX_21A 6 > > struct simatic_ipc_platform { > u8 devmode; > diff --git a/include/linux/platform_data/x86/simatic-ipc.h b/include/linux/platform_data/x86/simatic-ipc.h > index a48bb5240977..1a8e4c1099e3 100644 > --- a/include/linux/platform_data/x86/simatic-ipc.h > +++ b/include/linux/platform_data/x86/simatic-ipc.h > @@ -2,7 +2,7 @@ > /* > * Siemens SIMATIC IPC drivers > * > - * Copyright (c) Siemens AG, 2018-2021 > + * Copyright (c) Siemens AG, 2018-2023 > * > * Authors: > * Henning Schild <henning.schild@xxxxxxxxxxx> > @@ -34,6 +34,7 @@ enum simatic_ipc_station_ids { > SIMATIC_IPC_IPC227G = 0x00000F01, > SIMATIC_IPC_IPCBX_39A = 0x00001001, > SIMATIC_IPC_IPCPX_39A = 0x00001002, > + SIMATIC_IPC_IPCBX_21A = 0x00001101, > }; > > static inline u32 simatic_ipc_get_station_id(u8 *data, int max_len)