[PATCH 3/3] batt: simatic-ipc-batt: add support for module BX-59A

From: xingtong_wu
Date: Mon Jul 31 2023 - 03:38:47 EST


From: "xingtong.wu" <xingtong.wu@xxxxxxxxxxx>

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 <xingtong.wu@xxxxxxxxxxx>
---
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 9c227a19432f..2ee36e33b03d 100644
--- a/drivers/platform/x86/siemens/Kconfig
+++ b/drivers/platform/x86/siemens/Kconfig
@@ -53,6 +53,7 @@ config SIEMENS_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 PINCTRL_ALDERLAKE
depends on SIEMENS_SIMATIC_IPC_BATT
default SIEMENS_SIMATIC_IPC_BATT
help
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 <henning.schild@xxxxxxxxxxx>");
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])) {
--
2.25.1