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

Message ID 20230731072148.4781-1-xingtong_wu@163.com
State New
Headers
Series platform/x86: simatic-ipc: add another model BX-56A/BX-59A |

Commit Message

Xing Tong Wu July 31, 2023, 7:21 a.m. UTC
  From: "xingtong.wu" <xingtong.wu@siemens.com>

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@siemens.com>
---
 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(-)
  

Patch

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@siemens.com>");
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])) {