Skip to content

Commit 2f5d6fe

Browse files
henning-schildlag-linaro
authored andcommitted
leds: simatic-ipc-leds-gpio: Split up into multiple drivers
In order to clearly describe the dependencies between the GPIO controller drivers and the users the driver is split up into a core, two drivers and a common header. Signed-off-by: Henning Schild <henning.schild@siemens.com> Acked-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Lee Jones <lee@kernel.org> Link: https://lore.kernel.org/r/20230524124628.32295-4-henning.schild@siemens.com
1 parent 799c019 commit 2f5d6fe

8 files changed

Lines changed: 265 additions & 168 deletions

drivers/leds/simple/Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0
22
obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC) += simatic-ipc-leds.o
3-
obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC) += simatic-ipc-leds-gpio.o
3+
obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC) += simatic-ipc-leds-gpio-core.o
4+
obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC) += simatic-ipc-leds-gpio-apollolake.o
5+
obj-$(CONFIG_LEDS_SIEMENS_SIMATIC_IPC) += simatic-ipc-leds-gpio-f7188x.o
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* Siemens SIMATIC IPC driver for GPIO based LEDs
4+
*
5+
* Copyright (c) Siemens AG, 2023
6+
*
7+
* Author:
8+
* Henning Schild <henning.schild@siemens.com>
9+
*/
10+
11+
#include <linux/gpio/machine.h>
12+
#include <linux/gpio/consumer.h>
13+
#include <linux/leds.h>
14+
#include <linux/module.h>
15+
#include <linux/platform_device.h>
16+
#include <linux/platform_data/x86/simatic-ipc-base.h>
17+
18+
#include "simatic-ipc-leds-gpio.h"
19+
20+
static struct gpiod_lookup_table simatic_ipc_led_gpio_table = {
21+
.dev_id = "leds-gpio",
22+
.table = {
23+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 52, NULL, 0, GPIO_ACTIVE_LOW),
24+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 53, NULL, 1, GPIO_ACTIVE_LOW),
25+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 57, NULL, 2, GPIO_ACTIVE_LOW),
26+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 58, NULL, 3, GPIO_ACTIVE_LOW),
27+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 60, NULL, 4, GPIO_ACTIVE_LOW),
28+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 51, NULL, 5, GPIO_ACTIVE_LOW),
29+
{} /* Terminating entry */
30+
},
31+
};
32+
33+
static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra = {
34+
.dev_id = NULL, /* Filled during initialization */
35+
.table = {
36+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 56, NULL, 6, GPIO_ACTIVE_LOW),
37+
GPIO_LOOKUP_IDX("apollolake-pinctrl.0", 59, NULL, 7, GPIO_ACTIVE_HIGH),
38+
{} /* Terminating entry */
39+
},
40+
};
41+
42+
static int simatic_ipc_leds_gpio_apollolake_probe(struct platform_device *pdev)
43+
{
44+
return simatic_ipc_leds_gpio_probe(pdev, &simatic_ipc_led_gpio_table,
45+
&simatic_ipc_led_gpio_table_extra);
46+
}
47+
48+
static int simatic_ipc_leds_gpio_apollolake_remove(struct platform_device *pdev)
49+
{
50+
return simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table,
51+
&simatic_ipc_led_gpio_table_extra);
52+
}
53+
54+
static struct platform_driver simatic_ipc_led_gpio_apollolake_driver = {
55+
.probe = simatic_ipc_leds_gpio_apollolake_probe,
56+
.remove = simatic_ipc_leds_gpio_apollolake_remove,
57+
.driver = {
58+
.name = KBUILD_MODNAME,
59+
},
60+
};
61+
module_platform_driver(simatic_ipc_led_gpio_apollolake_driver);
62+
63+
MODULE_LICENSE("GPL v2");
64+
MODULE_ALIAS("platform:" KBUILD_MODNAME);
65+
MODULE_SOFTDEP("pre: simatic-ipc-leds-gpio-core platform:apollolake-pinctrl");
66+
MODULE_AUTHOR("Henning Schild <henning.schild@siemens.com>");
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* Siemens SIMATIC IPC driver for GPIO based LEDs
4+
*
5+
* Copyright (c) Siemens AG, 2023
6+
*
7+
* Author:
8+
* Henning Schild <henning.schild@siemens.com>
9+
*/
10+
11+
#include <linux/gpio/machine.h>
12+
#include <linux/gpio/consumer.h>
13+
#include <linux/leds.h>
14+
#include <linux/module.h>
15+
#include <linux/platform_device.h>
16+
#include <linux/platform_data/x86/simatic-ipc-base.h>
17+
18+
#include "simatic-ipc-leds-gpio.h"
19+
20+
static struct platform_device *simatic_leds_pdev;
21+
22+
static const struct gpio_led simatic_ipc_gpio_leds[] = {
23+
{ .name = "red:" LED_FUNCTION_STATUS "-1" },
24+
{ .name = "green:" LED_FUNCTION_STATUS "-1" },
25+
{ .name = "red:" LED_FUNCTION_STATUS "-2" },
26+
{ .name = "green:" LED_FUNCTION_STATUS "-2" },
27+
{ .name = "red:" LED_FUNCTION_STATUS "-3" },
28+
{ .name = "green:" LED_FUNCTION_STATUS "-3" },
29+
};
30+
31+
static const struct gpio_led_platform_data simatic_ipc_gpio_leds_pdata = {
32+
.num_leds = ARRAY_SIZE(simatic_ipc_gpio_leds),
33+
.leds = simatic_ipc_gpio_leds,
34+
};
35+
36+
int simatic_ipc_leds_gpio_remove(struct platform_device *pdev,
37+
struct gpiod_lookup_table *table,
38+
struct gpiod_lookup_table *table_extra)
39+
{
40+
gpiod_remove_lookup_table(table);
41+
gpiod_remove_lookup_table(table_extra);
42+
platform_device_unregister(simatic_leds_pdev);
43+
44+
return 0;
45+
}
46+
EXPORT_SYMBOL_GPL(simatic_ipc_leds_gpio_remove);
47+
48+
int simatic_ipc_leds_gpio_probe(struct platform_device *pdev,
49+
struct gpiod_lookup_table *table,
50+
struct gpiod_lookup_table *table_extra)
51+
{
52+
const struct simatic_ipc_platform *plat = pdev->dev.platform_data;
53+
struct device *dev = &pdev->dev;
54+
struct gpio_desc *gpiod;
55+
int err;
56+
57+
switch (plat->devmode) {
58+
case SIMATIC_IPC_DEVICE_127E:
59+
case SIMATIC_IPC_DEVICE_227G:
60+
break;
61+
default:
62+
return -ENODEV;
63+
}
64+
65+
gpiod_add_lookup_table(table);
66+
simatic_leds_pdev = platform_device_register_resndata(NULL,
67+
"leds-gpio", PLATFORM_DEVID_NONE, NULL, 0,
68+
&simatic_ipc_gpio_leds_pdata,
69+
sizeof(simatic_ipc_gpio_leds_pdata));
70+
if (IS_ERR(simatic_leds_pdev)) {
71+
err = PTR_ERR(simatic_leds_pdev);
72+
goto out;
73+
}
74+
75+
table_extra->dev_id = dev_name(dev);
76+
gpiod_add_lookup_table(table_extra);
77+
78+
/* PM_BIOS_BOOT_N */
79+
gpiod = gpiod_get_index(dev, NULL, 6, GPIOD_OUT_LOW);
80+
if (IS_ERR(gpiod)) {
81+
err = PTR_ERR(gpiod);
82+
goto out;
83+
}
84+
gpiod_put(gpiod);
85+
86+
/* PM_WDT_OUT */
87+
gpiod = gpiod_get_index(dev, NULL, 7, GPIOD_OUT_LOW);
88+
if (IS_ERR(gpiod)) {
89+
err = PTR_ERR(gpiod);
90+
goto out;
91+
}
92+
gpiod_put(gpiod);
93+
94+
return 0;
95+
out:
96+
simatic_ipc_leds_gpio_remove(pdev, table, table_extra);
97+
98+
return err;
99+
}
100+
EXPORT_SYMBOL_GPL(simatic_ipc_leds_gpio_probe);
101+
102+
MODULE_LICENSE("GPL v2");
103+
MODULE_SOFTDEP("pre: platform:leds-gpio");
104+
MODULE_AUTHOR("Henning Schild <henning.schild@siemens.com>");
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* Siemens SIMATIC IPC driver for GPIO based LEDs
4+
*
5+
* Copyright (c) Siemens AG, 2023
6+
*
7+
* Author:
8+
* Henning Schild <henning.schild@siemens.com>
9+
*/
10+
11+
#include <linux/gpio/machine.h>
12+
#include <linux/gpio/consumer.h>
13+
#include <linux/leds.h>
14+
#include <linux/module.h>
15+
#include <linux/platform_device.h>
16+
#include <linux/platform_data/x86/simatic-ipc-base.h>
17+
18+
#include "simatic-ipc-leds-gpio.h"
19+
20+
static struct gpiod_lookup_table simatic_ipc_led_gpio_table = {
21+
.dev_id = "leds-gpio",
22+
.table = {
23+
GPIO_LOOKUP_IDX("gpio-f7188x-2", 0, NULL, 0, GPIO_ACTIVE_LOW),
24+
GPIO_LOOKUP_IDX("gpio-f7188x-2", 1, NULL, 1, GPIO_ACTIVE_LOW),
25+
GPIO_LOOKUP_IDX("gpio-f7188x-2", 2, NULL, 2, GPIO_ACTIVE_LOW),
26+
GPIO_LOOKUP_IDX("gpio-f7188x-2", 3, NULL, 3, GPIO_ACTIVE_LOW),
27+
GPIO_LOOKUP_IDX("gpio-f7188x-2", 4, NULL, 4, GPIO_ACTIVE_LOW),
28+
GPIO_LOOKUP_IDX("gpio-f7188x-2", 5, NULL, 5, GPIO_ACTIVE_LOW),
29+
{} /* Terminating entry */
30+
},
31+
};
32+
33+
static struct gpiod_lookup_table simatic_ipc_led_gpio_table_extra = {
34+
.dev_id = NULL, /* Filled during initialization */
35+
.table = {
36+
GPIO_LOOKUP_IDX("gpio-f7188x-3", 6, NULL, 6, GPIO_ACTIVE_HIGH),
37+
GPIO_LOOKUP_IDX("gpio-f7188x-3", 7, NULL, 7, GPIO_ACTIVE_HIGH),
38+
{} /* Terminating entry */
39+
},
40+
};
41+
42+
static int simatic_ipc_leds_gpio_f7188x_probe(struct platform_device *pdev)
43+
{
44+
return simatic_ipc_leds_gpio_probe(pdev, &simatic_ipc_led_gpio_table,
45+
&simatic_ipc_led_gpio_table_extra);
46+
}
47+
48+
static int simatic_ipc_leds_gpio_f7188x_remove(struct platform_device *pdev)
49+
{
50+
return simatic_ipc_leds_gpio_remove(pdev, &simatic_ipc_led_gpio_table,
51+
&simatic_ipc_led_gpio_table_extra);
52+
}
53+
54+
static struct platform_driver simatic_ipc_led_gpio_driver = {
55+
.probe = simatic_ipc_leds_gpio_f7188x_probe,
56+
.remove = simatic_ipc_leds_gpio_f7188x_remove,
57+
.driver = {
58+
.name = KBUILD_MODNAME,
59+
},
60+
};
61+
module_platform_driver(simatic_ipc_led_gpio_driver);
62+
63+
MODULE_LICENSE("GPL v2");
64+
MODULE_ALIAS("platform:" KBUILD_MODNAME);
65+
MODULE_SOFTDEP("pre: simatic-ipc-leds-gpio-core gpio_f7188x");
66+
MODULE_AUTHOR("Henning Schild <henning.schild@siemens.com>");

0 commit comments

Comments
 (0)