From 3fce06406c59228d97921e9b564bdeb5c285e280 Mon Sep 17 00:00:00 2001 From: Henning Schild Date: Wed, 19 Jul 2023 17:35:16 +0200 Subject: [PATCH 1/7] watchdog: make Siemens Simatic watchdog driver default on platform If a user did choose to enable Siemens Simatic platform support they likely want that driver to be enabled without having to flip more config switches. So we make the watchdog driver config switch default to the platform driver switches value. Signed-off-by: Henning Schild Reviewed-by: Andy Shevchenko Reviewed-by: Guenter Roeck Link: https://lore.kernel.org/r/20230719153518.13073-2-henning.schild@siemens.com Signed-off-by: Hans de Goede --- drivers/watchdog/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index ee97d89dfc11..04e9b40cf7d5 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -1681,6 +1681,7 @@ config NIC7018_WDT config SIEMENS_SIMATIC_IPC_WDT tristate "Siemens Simatic IPC Watchdog" depends on SIEMENS_SIMATIC_IPC + default y select WATCHDOG_CORE select P2SB help From 3ad3ab31ae84bfaddc713914682799a944543c14 Mon Sep 17 00:00:00 2001 From: Henning Schild Date: Wed, 19 Jul 2023 17:35:17 +0200 Subject: [PATCH 2/7] leds: simatic-ipc-leds: default config switch to platform switch If a user did choose to enable Siemens Simatic platform support they likely want the LED drivers to be enabled without having to flip more config switches. So we make the LED drivers config switch default to the platform driver switches value. Signed-off-by: Henning Schild Reviewed-by: Andy Shevchenko Acked-by: Lee Jones Link: https://lore.kernel.org/r/20230719153518.13073-3-henning.schild@siemens.com Signed-off-by: Hans de Goede --- drivers/leds/simple/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/leds/simple/Kconfig b/drivers/leds/simple/Kconfig index 44fa0f93cb3b..609e438af9f6 100644 --- a/drivers/leds/simple/Kconfig +++ b/drivers/leds/simple/Kconfig @@ -2,6 +2,7 @@ config LEDS_SIEMENS_SIMATIC_IPC tristate "LED driver for Siemens Simatic IPCs" depends on SIEMENS_SIMATIC_IPC + default y help This option enables support for the LEDs of several Industrial PCs from Siemens. From 9bc289b8123ce149bc4088dbe74300057fa244c3 Mon Sep 17 00:00:00 2001 From: Henning Schild Date: Wed, 19 Jul 2023 17:35:18 +0200 Subject: [PATCH 3/7] platform/x86: Move all simatic ipc drivers to the subdirectory siemens With more files around move everything to a subdirectory. Users will only see the several options once they enable the main one. Suggested-by: Hans de Goede Signed-off-by: Henning Schild Reviewed-by: Andy Shevchenko Link: https://lore.kernel.org/r/20230719153518.13073-4-henning.schild@siemens.com Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede --- drivers/platform/x86/Kconfig | 59 +---------------- drivers/platform/x86/Makefile | 6 +- drivers/platform/x86/siemens/Kconfig | 63 +++++++++++++++++++ drivers/platform/x86/siemens/Makefile | 11 ++++ .../simatic-ipc-batt-apollolake.c | 0 .../simatic-ipc-batt-elkhartlake.c | 0 .../{ => siemens}/simatic-ipc-batt-f7188x.c | 0 .../x86/{ => siemens}/simatic-ipc-batt.c | 0 .../x86/{ => siemens}/simatic-ipc-batt.h | 0 .../platform/x86/{ => siemens}/simatic-ipc.c | 0 10 files changed, 76 insertions(+), 63 deletions(-) create mode 100644 drivers/platform/x86/siemens/Kconfig create mode 100644 drivers/platform/x86/siemens/Makefile rename drivers/platform/x86/{ => siemens}/simatic-ipc-batt-apollolake.c (100%) rename drivers/platform/x86/{ => siemens}/simatic-ipc-batt-elkhartlake.c (100%) rename drivers/platform/x86/{ => siemens}/simatic-ipc-batt-f7188x.c (100%) rename drivers/platform/x86/{ => siemens}/simatic-ipc-batt.c (100%) rename drivers/platform/x86/{ => siemens}/simatic-ipc-batt.h (100%) rename drivers/platform/x86/{ => siemens}/simatic-ipc.c (100%) diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index 487d3d8f4da9..f5fcb1ca1b63 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig @@ -1074,64 +1074,7 @@ config INTEL_SCU_IPC_UTIL low level access for debug work and updating the firmware. Say N unless you will be doing this on an Intel MID platform. -config SIEMENS_SIMATIC_IPC - tristate "Siemens Simatic IPC Class driver" - help - This Simatic IPC class driver is the central of several drivers. It - is mainly used for system identification, after which drivers in other - classes will take care of driving specifics of those machines. - i.e. LEDs and watchdog. - - To compile this driver as a module, choose M here: the module - will be called simatic-ipc. - -config SIEMENS_SIMATIC_IPC_BATT - tristate "CMOS battery driver for Siemens Simatic IPCs" - depends on HWMON - depends on SIEMENS_SIMATIC_IPC - default SIEMENS_SIMATIC_IPC - help - This option enables support for monitoring the voltage of the CMOS - batteries of several Industrial PCs from Siemens. - - To compile this driver as a module, choose M here: the module - will be called simatic-ipc-batt. - -config SIEMENS_SIMATIC_IPC_BATT_APOLLOLAKE - tristate "CMOS Battery monitoring for Simatic IPCs based on Apollo Lake GPIO" - depends on PINCTRL_BROXTON - depends on SIEMENS_SIMATIC_IPC_BATT - default SIEMENS_SIMATIC_IPC_BATT - help - This option enables CMOS battery monitoring for Simatic Industrial PCs - from Siemens based on Apollo Lake GPIO. - - To compile this driver as a module, choose M here: the module - will be called simatic-ipc-batt-apollolake. - -config SIEMENS_SIMATIC_IPC_BATT_ELKHARTLAKE - tristate "CMOS Battery monitoring for Simatic IPCs based on Elkhart Lake GPIO" - depends on PINCTRL_ELKHARTLAKE - depends on SIEMENS_SIMATIC_IPC_BATT - default SIEMENS_SIMATIC_IPC_BATT - help - This option enables CMOS battery monitoring for Simatic Industrial PCs - from Siemens based on Elkhart Lake GPIO. - - To compile this driver as a module, choose M here: the module - will be called simatic-ipc-batt-elkhartlake. - -config SIEMENS_SIMATIC_IPC_BATT_F7188X - tristate "CMOS Battery monitoring for Simatic IPCs based on Nuvoton GPIO" - depends on GPIO_F7188X - depends on SIEMENS_SIMATIC_IPC_BATT - default SIEMENS_SIMATIC_IPC_BATT - help - This option enables CMOS battery monitoring for Simatic Industrial PCs - from Siemens based on Nuvoton GPIO. - - To compile this driver as a module, choose M here: the module - will be called simatic-ipc-batt-elkhartlake. +source "drivers/platform/x86/siemens/Kconfig" config WINMATE_FM07_KEYS tristate "Winmate FM07/FM07P front-panel keys driver" diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile index 522da0d1584d..affce39f3c67 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile @@ -131,11 +131,7 @@ obj-$(CONFIG_INTEL_SCU_IPC_UTIL) += intel_scu_ipcutil.o obj-$(CONFIG_X86_INTEL_LPSS) += pmc_atom.o # Siemens Simatic Industrial PCs -obj-$(CONFIG_SIEMENS_SIMATIC_IPC) += simatic-ipc.o -obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT) += simatic-ipc-batt.o -obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT_APOLLOLAKE) += simatic-ipc-batt-apollolake.o -obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT_ELKHARTLAKE) += simatic-ipc-batt-elkhartlake.o -obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT_F7188X) += simatic-ipc-batt-f7188x.o +obj-$(CONFIG_SIEMENS_SIMATIC_IPC) += siemens/ # Winmate obj-$(CONFIG_WINMATE_FM07_KEYS) += winmate-fm07-keys.o diff --git a/drivers/platform/x86/siemens/Kconfig b/drivers/platform/x86/siemens/Kconfig new file mode 100644 index 000000000000..618790f132f7 --- /dev/null +++ b/drivers/platform/x86/siemens/Kconfig @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: GPL-2.0-only +# +# Siemens X86 Platform Specific Drivers +# + +config SIEMENS_SIMATIC_IPC + tristate "Siemens Simatic IPC Class driver" + help + This Simatic IPC class driver is the central of several drivers. It + is mainly used for system identification, after which drivers in other + classes will take care of driving specifics of those machines. + i.e. LEDs and watchdog. + + To compile this driver as a module, choose M here: the module + will be called simatic-ipc. + +config SIEMENS_SIMATIC_IPC_BATT + tristate "CMOS battery driver for Siemens Simatic IPCs" + default SIEMENS_SIMATIC_IPC + depends on HWMON + depends on SIEMENS_SIMATIC_IPC + help + This option enables support for monitoring the voltage of the CMOS + batteries of several Industrial PCs from Siemens. + + To compile this driver as a module, choose M here: the module + will be called simatic-ipc-batt. + +config SIEMENS_SIMATIC_IPC_BATT_APOLLOLAKE + tristate "CMOS Battery monitoring for Simatic IPCs based on Apollo Lake GPIO" + default SIEMENS_SIMATIC_IPC_BATT + depends on PINCTRL_BROXTON + depends on SIEMENS_SIMATIC_IPC_BATT + help + This option enables CMOS battery monitoring for Simatic Industrial PCs + from Siemens based on Apollo Lake GPIO. + + To compile this driver as a module, choose M here: the module + will be called simatic-ipc-batt-apollolake. + +config SIEMENS_SIMATIC_IPC_BATT_ELKHARTLAKE + tristate "CMOS Battery monitoring for Simatic IPCs based on Elkhart Lake GPIO" + default SIEMENS_SIMATIC_IPC_BATT + depends on PINCTRL_ELKHARTLAKE + depends on SIEMENS_SIMATIC_IPC_BATT + help + This option enables CMOS battery monitoring for Simatic Industrial PCs + from Siemens based on Elkhart Lake GPIO. + + To compile this driver as a module, choose M here: the module + will be called simatic-ipc-batt-elkhartlake. + +config SIEMENS_SIMATIC_IPC_BATT_F7188X + tristate "CMOS Battery monitoring for Simatic IPCs based on Nuvoton GPIO" + default SIEMENS_SIMATIC_IPC_BATT + depends on GPIO_F7188X + depends on SIEMENS_SIMATIC_IPC_BATT + help + This option enables CMOS battery monitoring for Simatic Industrial PCs + from Siemens based on Nuvoton GPIO. + + To compile this driver as a module, choose M here: the module + will be called simatic-ipc-batt-elkhartlake. diff --git a/drivers/platform/x86/siemens/Makefile b/drivers/platform/x86/siemens/Makefile new file mode 100644 index 000000000000..2b384b4cb8ba --- /dev/null +++ b/drivers/platform/x86/siemens/Makefile @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# +# Makefile for linux/drivers/platform/x86/siemens +# Siemens x86 Platform-Specific Drivers +# + +obj-$(CONFIG_SIEMENS_SIMATIC_IPC) += simatic-ipc.o +obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT) += simatic-ipc-batt.o +obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT_APOLLOLAKE) += simatic-ipc-batt-apollolake.o +obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT_ELKHARTLAKE) += simatic-ipc-batt-elkhartlake.o +obj-$(CONFIG_SIEMENS_SIMATIC_IPC_BATT_F7188X) += simatic-ipc-batt-f7188x.o diff --git a/drivers/platform/x86/simatic-ipc-batt-apollolake.c b/drivers/platform/x86/siemens/simatic-ipc-batt-apollolake.c similarity index 100% rename from drivers/platform/x86/simatic-ipc-batt-apollolake.c rename to drivers/platform/x86/siemens/simatic-ipc-batt-apollolake.c diff --git a/drivers/platform/x86/simatic-ipc-batt-elkhartlake.c b/drivers/platform/x86/siemens/simatic-ipc-batt-elkhartlake.c similarity index 100% rename from drivers/platform/x86/simatic-ipc-batt-elkhartlake.c rename to drivers/platform/x86/siemens/simatic-ipc-batt-elkhartlake.c diff --git a/drivers/platform/x86/simatic-ipc-batt-f7188x.c b/drivers/platform/x86/siemens/simatic-ipc-batt-f7188x.c similarity index 100% rename from drivers/platform/x86/simatic-ipc-batt-f7188x.c rename to drivers/platform/x86/siemens/simatic-ipc-batt-f7188x.c diff --git a/drivers/platform/x86/simatic-ipc-batt.c b/drivers/platform/x86/siemens/simatic-ipc-batt.c similarity index 100% rename from drivers/platform/x86/simatic-ipc-batt.c rename to drivers/platform/x86/siemens/simatic-ipc-batt.c diff --git a/drivers/platform/x86/simatic-ipc-batt.h b/drivers/platform/x86/siemens/simatic-ipc-batt.h similarity index 100% rename from drivers/platform/x86/simatic-ipc-batt.h rename to drivers/platform/x86/siemens/simatic-ipc-batt.h diff --git a/drivers/platform/x86/simatic-ipc.c b/drivers/platform/x86/siemens/simatic-ipc.c similarity index 100% rename from drivers/platform/x86/simatic-ipc.c rename to drivers/platform/x86/siemens/simatic-ipc.c From d0563dd3345f7d6feb950204a3480f169d93a659 Mon Sep 17 00:00:00 2001 From: "xingtong.wu" Date: Fri, 28 Jul 2023 10:36:51 +0200 Subject: [PATCH 4/7] platform/x86/siemens: simatic-ipc-batt: fix bat reading in BX_21A There was a case missing in a switch statement which lead to that model not actually reading the GPIOs. That switch statement got simplified now. Additionally on that model we need to initialize one pin differently. As a drive-by finding also add a missing newline. Fixes: 917f54340794 ("platform/x86: simatic-ipc: add CMOS battery monitoring") Reported-by: Henning Schild Signed-off-by: xingtong.wu Signed-off-by: Henning Schild Link: https://lore.kernel.org/r/20230728083651.19747-1-henning.schild@siemens.com Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede --- .../platform/x86/siemens/simatic-ipc-batt.c | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/drivers/platform/x86/siemens/simatic-ipc-batt.c b/drivers/platform/x86/siemens/simatic-ipc-batt.c index d2791ff84f23..e34417ca9e13 100644 --- a/drivers/platform/x86/siemens/simatic-ipc-batt.c +++ b/drivers/platform/x86/siemens/simatic-ipc-batt.c @@ -92,19 +92,14 @@ static long simatic_ipc_batt_read_value(struct device *dev) next_update = priv.last_updated_jiffies + msecs_to_jiffies(BATT_DELAY_MS); if (time_after(jiffies, next_update) || !priv.last_updated_jiffies) { - switch (priv.devmode) { - case SIMATIC_IPC_DEVICE_127E: - case SIMATIC_IPC_DEVICE_227G: - case SIMATIC_IPC_DEVICE_BX_39A: - priv.current_state = simatic_ipc_batt_read_gpio(); - break; - case SIMATIC_IPC_DEVICE_227E: + if (priv.devmode == SIMATIC_IPC_DEVICE_227E) priv.current_state = simatic_ipc_batt_read_io(dev); - break; - } + else + priv.current_state = simatic_ipc_batt_read_gpio(); + priv.last_updated_jiffies = jiffies; if (priv.current_state < SIMATIC_IPC_BATT_LEVEL_FULL) - dev_warn(dev, "CMOS battery needs to be replaced."); + dev_warn(dev, "CMOS battery needs to be replaced.\n"); } return priv.current_state; @@ -163,6 +158,7 @@ int simatic_ipc_batt_probe(struct platform_device *pdev, struct gpiod_lookup_tab struct simatic_ipc_platform *plat; struct device *dev = &pdev->dev; struct device *hwmon_dev; + unsigned long flags; int err; plat = pdev->dev.platform_data; @@ -196,7 +192,10 @@ int simatic_ipc_batt_probe(struct platform_device *pdev, struct gpiod_lookup_tab } if (table->table[2].key) { - priv.gpios[2] = devm_gpiod_get_index(dev, "CMOSBattery meter", 2, GPIOD_OUT_HIGH); + flags = GPIOD_OUT_HIGH; + if (priv.devmode == SIMATIC_IPC_DEVICE_BX_21A) + flags = GPIOD_OUT_LOW; + priv.gpios[2] = devm_gpiod_get_index(dev, "CMOSBattery meter", 2, flags); if (IS_ERR(priv.gpios[2])) { err = PTR_ERR(priv.gpios[1]); priv.gpios[2] = NULL; From 1598e3f6e9d43318d5e06669ca260e898e7b68c2 Mon Sep 17 00:00:00 2001 From: Henning Schild Date: Tue, 25 Jul 2023 11:31:13 +0200 Subject: [PATCH 5/7] platform/x86/siemens: Kconfig: adjust help text There was a copy and paste mistake where the module name was not correct. Fixes: 917f54340794 ("platform/x86: simatic-ipc: add CMOS battery monitoring") Signed-off-by: Henning Schild Link: https://lore.kernel.org/r/20230725093113.9739-3-henning.schild@siemens.com Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede --- drivers/platform/x86/siemens/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/platform/x86/siemens/Kconfig b/drivers/platform/x86/siemens/Kconfig index 618790f132f7..1769621d5aec 100644 --- a/drivers/platform/x86/siemens/Kconfig +++ b/drivers/platform/x86/siemens/Kconfig @@ -60,4 +60,4 @@ config SIEMENS_SIMATIC_IPC_BATT_F7188X from Siemens based on Nuvoton GPIO. To compile this driver as a module, choose M here: the module - will be called simatic-ipc-batt-elkhartlake. + will be called simatic-ipc-batt-f7188x. From b8af77951941e943434a76ef40fdc372bf95030e Mon Sep 17 00:00:00 2001 From: "xingtong.wu" Date: Mon, 31 Jul 2023 15:14:24 +0800 Subject: [PATCH 6/7] platform/x86/siemens: simatic-ipc: add new models BX-56A/BX-59A This adds support for the Siemens Simatic IPC models BX-56A/BX-59A, led/watchdog/battery on these models are same, actual drivers for models will be sent in separate patches. Signed-off-by: xingtong.wu Link: https://lore.kernel.org/r/20230731071424.4663-2-xingtong_wu@163.com Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede --- drivers/platform/x86/siemens/simatic-ipc.c | 12 ++++++++++-- include/linux/platform_data/x86/simatic-ipc-base.h | 1 + include/linux/platform_data/x86/simatic-ipc.h | 2 ++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/siemens/simatic-ipc.c b/drivers/platform/x86/siemens/simatic-ipc.c index 13c857316c7f..02c540cf4070 100644 --- a/drivers/platform/x86/siemens/simatic-ipc.c +++ b/drivers/platform/x86/siemens/simatic-ipc.c @@ -78,6 +78,12 @@ static struct { {SIMATIC_IPC_IPCBX_21A, SIMATIC_IPC_DEVICE_BX_21A, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_BX_21A, { "emc1403", NULL }}, + {SIMATIC_IPC_IPCBX_56A, + SIMATIC_IPC_DEVICE_BX_59A, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_BX_59A, + { "emc1403", "w83627hf_wdt" }}, + {SIMATIC_IPC_IPCBX_59A, + SIMATIC_IPC_DEVICE_BX_59A, SIMATIC_IPC_DEVICE_NONE, SIMATIC_IPC_DEVICE_BX_59A, + { "emc1403", "w83627hf_wdt" }}, }; static int register_platform_devices(u32 station_id) @@ -103,7 +109,9 @@ static int register_platform_devices(u32 station_id) pdevname = KBUILD_MODNAME "_batt_apollolake"; if (battmode == SIMATIC_IPC_DEVICE_BX_21A) pdevname = KBUILD_MODNAME "_batt_elkhartlake"; - if (battmode == SIMATIC_IPC_DEVICE_227G || battmode == SIMATIC_IPC_DEVICE_BX_39A) + if (battmode == SIMATIC_IPC_DEVICE_227G || + battmode == SIMATIC_IPC_DEVICE_BX_39A || + battmode == SIMATIC_IPC_DEVICE_BX_59A) pdevname = KBUILD_MODNAME "_batt_f7188x"; platform_data.devmode = battmode; ipc_batt_platform_device = @@ -121,7 +129,7 @@ static int register_platform_devices(u32 station_id) pdevname = KBUILD_MODNAME "_leds"; if (ledmode == SIMATIC_IPC_DEVICE_127E) pdevname = KBUILD_MODNAME "_leds_gpio_apollolake"; - if (ledmode == SIMATIC_IPC_DEVICE_227G) + if (ledmode == SIMATIC_IPC_DEVICE_227G || SIMATIC_IPC_DEVICE_BX_59A) pdevname = KBUILD_MODNAME "_leds_gpio_f7188x"; if (ledmode == SIMATIC_IPC_DEVICE_BX_21A) pdevname = KBUILD_MODNAME "_leds_gpio_elkhartlake"; diff --git a/include/linux/platform_data/x86/simatic-ipc-base.h b/include/linux/platform_data/x86/simatic-ipc-base.h index 4ca21065c862..2d7f7120ba6b 100644 --- a/include/linux/platform_data/x86/simatic-ipc-base.h +++ b/include/linux/platform_data/x86/simatic-ipc-base.h @@ -22,6 +22,7 @@ #define SIMATIC_IPC_DEVICE_227G 5 #define SIMATIC_IPC_DEVICE_BX_21A 6 #define SIMATIC_IPC_DEVICE_BX_39A 7 +#define SIMATIC_IPC_DEVICE_BX_59A 8 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 f2eafa43a605..8d8b3b919674 100644 --- a/include/linux/platform_data/x86/simatic-ipc.h +++ b/include/linux/platform_data/x86/simatic-ipc.h @@ -36,6 +36,8 @@ enum simatic_ipc_station_ids { SIMATIC_IPC_IPCBX_39A = 0x00001001, SIMATIC_IPC_IPCPX_39A = 0x00001002, SIMATIC_IPC_IPCBX_21A = 0x00001101, + SIMATIC_IPC_IPCBX_56A = 0x00001201, + SIMATIC_IPC_IPCBX_59A = 0x00001202, }; static inline u32 simatic_ipc_get_station_id(u8 *data, int max_len) From c56beff2037549c951042d178de75e535818a98a Mon Sep 17 00:00:00 2001 From: "xingtong.wu" Date: Mon, 31 Jul 2023 15:21:48 +0800 Subject: [PATCH 7/7] platform/x86/siemens: simatic-ipc-batt: add support for module BX-59A This is used for the Siemens Simatic IPC BX-59A, which can monitor the voltage of the CMOS battery with two bits that indicate low or empty state Signed-off-by: xingtong.wu Link: https://lore.kernel.org/r/20230731072148.4781-1-xingtong_wu@163.com Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede --- drivers/platform/x86/siemens/Kconfig | 1 + .../x86/siemens/simatic-ipc-batt-f7188x.c | 37 ++++++++++++++----- .../platform/x86/siemens/simatic-ipc-batt.c | 3 +- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/drivers/platform/x86/siemens/Kconfig b/drivers/platform/x86/siemens/Kconfig index 1769621d5aec..33d028c26bf8 100644 --- a/drivers/platform/x86/siemens/Kconfig +++ b/drivers/platform/x86/siemens/Kconfig @@ -54,6 +54,7 @@ config SIEMENS_SIMATIC_IPC_BATT_F7188X tristate "CMOS Battery monitoring for Simatic IPCs based on Nuvoton GPIO" default SIEMENS_SIMATIC_IPC_BATT depends on GPIO_F7188X + depends on PINCTRL_ALDERLAKE depends on SIEMENS_SIMATIC_IPC_BATT help This option enables CMOS battery monitoring for Simatic Industrial PCs diff --git a/drivers/platform/x86/siemens/simatic-ipc-batt-f7188x.c b/drivers/platform/x86/siemens/simatic-ipc-batt-f7188x.c index ed330f6a8ea8..a66107e0fe1e 100644 --- a/drivers/platform/x86/siemens/simatic-ipc-batt-f7188x.c +++ b/drivers/platform/x86/siemens/simatic-ipc-batt-f7188x.c @@ -17,6 +17,8 @@ #include "simatic-ipc-batt.h" +static struct gpiod_lookup_table *batt_lookup_table; + static struct gpiod_lookup_table simatic_ipc_batt_gpio_table_227g = { .table = { GPIO_LOOKUP_IDX("gpio-f7188x-7", 6, NULL, 0, GPIO_ACTIVE_HIGH), @@ -34,24 +36,39 @@ static struct gpiod_lookup_table simatic_ipc_batt_gpio_table_bx_39a = { }, }; +static struct gpiod_lookup_table simatic_ipc_batt_gpio_table_bx_59a = { + .table = { + GPIO_LOOKUP_IDX("gpio-f7188x-7", 6, NULL, 0, GPIO_ACTIVE_HIGH), + GPIO_LOOKUP_IDX("gpio-f7188x-7", 5, NULL, 1, GPIO_ACTIVE_HIGH), + GPIO_LOOKUP_IDX("INTC1056:00", 438, NULL, 2, GPIO_ACTIVE_HIGH), + {} /* Terminating entry */ + } +}; + static int simatic_ipc_batt_f7188x_remove(struct platform_device *pdev) { - const struct simatic_ipc_platform *plat = pdev->dev.platform_data; - - if (plat->devmode == SIMATIC_IPC_DEVICE_227G) - return simatic_ipc_batt_remove(pdev, &simatic_ipc_batt_gpio_table_227g); - - return simatic_ipc_batt_remove(pdev, &simatic_ipc_batt_gpio_table_bx_39a); + return simatic_ipc_batt_remove(pdev, batt_lookup_table); } static int simatic_ipc_batt_f7188x_probe(struct platform_device *pdev) { const struct simatic_ipc_platform *plat = pdev->dev.platform_data; - if (plat->devmode == SIMATIC_IPC_DEVICE_227G) - return simatic_ipc_batt_probe(pdev, &simatic_ipc_batt_gpio_table_227g); + switch (plat->devmode) { + case SIMATIC_IPC_DEVICE_227G: + batt_lookup_table = &simatic_ipc_batt_gpio_table_227g; + break; + case SIMATIC_IPC_DEVICE_BX_39A: + batt_lookup_table = &simatic_ipc_batt_gpio_table_bx_39a; + break; + case SIMATIC_IPC_DEVICE_BX_59A: + batt_lookup_table = &simatic_ipc_batt_gpio_table_bx_59a; + break; + default: + return -ENODEV; + } - return simatic_ipc_batt_probe(pdev, &simatic_ipc_batt_gpio_table_bx_39a); + return simatic_ipc_batt_probe(pdev, batt_lookup_table); } static struct platform_driver simatic_ipc_batt_driver = { @@ -66,5 +83,5 @@ module_platform_driver(simatic_ipc_batt_driver); MODULE_LICENSE("GPL"); MODULE_ALIAS("platform:" KBUILD_MODNAME); -MODULE_SOFTDEP("pre: simatic-ipc-batt gpio_f7188x platform:elkhartlake-pinctrl"); +MODULE_SOFTDEP("pre: simatic-ipc-batt gpio_f7188x platform:elkhartlake-pinctrl platform:alderlake-pinctrl"); MODULE_AUTHOR("Henning Schild "); diff --git a/drivers/platform/x86/siemens/simatic-ipc-batt.c b/drivers/platform/x86/siemens/simatic-ipc-batt.c index e34417ca9e13..d66b9969234b 100644 --- a/drivers/platform/x86/siemens/simatic-ipc-batt.c +++ b/drivers/platform/x86/siemens/simatic-ipc-batt.c @@ -169,6 +169,7 @@ int simatic_ipc_batt_probe(struct platform_device *pdev, struct gpiod_lookup_tab case SIMATIC_IPC_DEVICE_227G: case SIMATIC_IPC_DEVICE_BX_39A: case SIMATIC_IPC_DEVICE_BX_21A: + case SIMATIC_IPC_DEVICE_BX_59A: table->dev_id = dev_name(dev); gpiod_add_lookup_table(table); break; @@ -193,7 +194,7 @@ int simatic_ipc_batt_probe(struct platform_device *pdev, struct gpiod_lookup_tab if (table->table[2].key) { flags = GPIOD_OUT_HIGH; - if (priv.devmode == SIMATIC_IPC_DEVICE_BX_21A) + if (priv.devmode == SIMATIC_IPC_DEVICE_BX_21A || SIMATIC_IPC_DEVICE_BX_59A) flags = GPIOD_OUT_LOW; priv.gpios[2] = devm_gpiod_get_index(dev, "CMOSBattery meter", 2, flags); if (IS_ERR(priv.gpios[2])) {