Commit 917f5434 authored by Henning Schild's avatar Henning Schild Committed by Hans de Goede
Browse files

platform/x86: simatic-ipc: add CMOS battery monitoring



Siemens Simatic Industrial PCs can monitor the voltage of the CMOS
battery with two bits that indicate low or empty state. This can be GPIO
or PortIO based.
Here we model that as a hwmon voltage. The core driver does the PortIO
and provides boilerplate for the GPIO versions. Which are split out to
model runtime dependencies while allowing fine-grained kernel
configuration.

Signed-off-by: default avatarHenning Schild <henning.schild@siemens.com>
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20230706154831.19100-3-henning.schild@siemens.com


Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 15fe994e
Loading
Loading
Loading
Loading
+48 −0
Original line number Diff line number Diff line
@@ -1086,6 +1086,54 @@ config SIEMENS_SIMATIC_IPC
	  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.

config WINMATE_FM07_KEYS
	tristate "Winmate FM07/FM07P front-panel keys driver"
	depends on INPUT
+5 −1
Original line number Diff line number Diff line
@@ -132,6 +132,10 @@ 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

# Winmate
obj-$(CONFIG_WINMATE_FM07_KEYS)		+= winmate-fm07-keys.o
+51 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Siemens SIMATIC IPC driver for CMOS battery monitoring
 *
 * Copyright (c) Siemens AG, 2023
 *
 * Authors:
 *  Henning Schild <henning.schild@siemens.com>
 */

#include <linux/gpio/machine.h>
#include <linux/gpio/consumer.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#include "simatic-ipc-batt.h"

static struct gpiod_lookup_table simatic_ipc_batt_gpio_table_127e = {
	.table = {
		GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 55, NULL, 0, GPIO_ACTIVE_HIGH),
		GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 61, NULL, 1, GPIO_ACTIVE_HIGH),
		GPIO_LOOKUP_IDX("apollolake-pinctrl.1", 41, NULL, 2, GPIO_ACTIVE_HIGH),
		{} /* Terminating entry */
	},
};

static int simatic_ipc_batt_apollolake_remove(struct platform_device *pdev)
{
	return simatic_ipc_batt_remove(pdev, &simatic_ipc_batt_gpio_table_127e);
}

static int simatic_ipc_batt_apollolake_probe(struct platform_device *pdev)
{
	return simatic_ipc_batt_probe(pdev, &simatic_ipc_batt_gpio_table_127e);
}

static struct platform_driver simatic_ipc_batt_driver = {
	.probe = simatic_ipc_batt_apollolake_probe,
	.remove = simatic_ipc_batt_apollolake_remove,
	.driver = {
		.name = KBUILD_MODNAME,
	},
};

module_platform_driver(simatic_ipc_batt_driver);

MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" KBUILD_MODNAME);
MODULE_SOFTDEP("pre: simatic-ipc-batt platform:apollolake-pinctrl");
MODULE_AUTHOR("Henning Schild <henning.schild@siemens.com>");
+51 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Siemens SIMATIC IPC driver for CMOS battery monitoring
 *
 * Copyright (c) Siemens AG, 2023
 *
 * Authors:
 *  Henning Schild <henning.schild@siemens.com>
 */

#include <linux/gpio/machine.h>
#include <linux/gpio/consumer.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>

#include "simatic-ipc-batt.h"

static struct gpiod_lookup_table simatic_ipc_batt_gpio_table_bx_21a = {
	.table = {
		GPIO_LOOKUP_IDX("INTC1020:04", 18, NULL, 0, GPIO_ACTIVE_HIGH),
		GPIO_LOOKUP_IDX("INTC1020:04", 19, NULL, 1, GPIO_ACTIVE_HIGH),
		GPIO_LOOKUP_IDX("INTC1020:01", 66, NULL, 2, GPIO_ACTIVE_HIGH),
		{} /* Terminating entry */
	},
};

static int simatic_ipc_batt_elkhartlake_remove(struct platform_device *pdev)
{
	return simatic_ipc_batt_remove(pdev, &simatic_ipc_batt_gpio_table_bx_21a);
}

static int simatic_ipc_batt_elkhartlake_probe(struct platform_device *pdev)
{
	return simatic_ipc_batt_probe(pdev, &simatic_ipc_batt_gpio_table_bx_21a);
}

static struct platform_driver simatic_ipc_batt_driver = {
	.probe = simatic_ipc_batt_elkhartlake_probe,
	.remove = simatic_ipc_batt_elkhartlake_remove,
	.driver = {
		.name = KBUILD_MODNAME,
	},
};

module_platform_driver(simatic_ipc_batt_driver);

MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:" KBUILD_MODNAME);
MODULE_SOFTDEP("pre: simatic-ipc-batt platform:elkhartlake-pinctrl");
MODULE_AUTHOR("Henning Schild <henning.schild@siemens.com>");
+70 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
/*
 * Siemens SIMATIC IPC driver for CMOS battery monitoring
 *
 * Copyright (c) Siemens AG, 2023
 *
 * Authors:
 *  Henning Schild <henning.schild@siemens.com>
 */

#include <linux/gpio/machine.h>
#include <linux/gpio/consumer.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/platform_data/x86/simatic-ipc-base.h>

#include "simatic-ipc-batt.h"

static struct gpiod_lookup_table simatic_ipc_batt_gpio_table_227g = {
	.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("INTC1020:01",  66, NULL, 2, GPIO_ACTIVE_HIGH),
		{} /* Terminating entry */
	},
};

static struct gpiod_lookup_table simatic_ipc_batt_gpio_table_bx_39a = {
	.table = {
		GPIO_LOOKUP_IDX("gpio-f7188x-6", 4, NULL, 0, GPIO_ACTIVE_HIGH),
		GPIO_LOOKUP_IDX("gpio-f7188x-6", 3, NULL, 1, 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);
}

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);

	return simatic_ipc_batt_probe(pdev, &simatic_ipc_batt_gpio_table_bx_39a);
}

static struct platform_driver simatic_ipc_batt_driver = {
	.probe = simatic_ipc_batt_f7188x_probe,
	.remove = simatic_ipc_batt_f7188x_remove,
	.driver = {
		.name = KBUILD_MODNAME,
	},
};

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_AUTHOR("Henning Schild <henning.schild@siemens.com>");
Loading