Commit 8cb21086 authored by Raffaello D. Di Napoli's avatar Raffaello D. Di Napoli Committed by Jacek Anaszewski

leds: Modify PC Engines apu/apu2 driver to support apu3

PC Engines apu3 is an improved version of the apu2, using the same SoC
and almost everything else.

This patch reuses as much as possible from the apu2 definitions, to
avoid redundancy.
Signed-off-by: default avatarRaffaello D. Di Napoli <rafdev@dinapo.li>
Acked-by: default avatarPavel Machek <pavel@ucw.cz>
Signed-off-by: default avatarJacek Anaszewski <jacek.anaszewski@gmail.com>
parent d30c8d20
...@@ -57,12 +57,13 @@ config LEDS_AAT1290 ...@@ -57,12 +57,13 @@ config LEDS_AAT1290
depends on PINCTRL depends on PINCTRL
help help
This option enables support for the LEDs on the AAT1290. This option enables support for the LEDs on the AAT1290.
config LEDS_APU config LEDS_APU
tristate "Front panel LED support for PC Engines APU/APU2 boards" tristate "Front panel LED support for PC Engines APU/APU2/APU3 boards"
depends on LEDS_CLASS depends on LEDS_CLASS
depends on X86 && DMI depends on X86 && DMI
help help
This driver makes the PC Engines APU/APU2 front panel LEDs This driver makes the PC Engines APU/APU2/APU3 front panel LEDs
accessible from userspace programs through the LED subsystem. accessible from userspace programs through the LED subsystem.
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
......
...@@ -102,6 +102,13 @@ static const struct apu_led_profile apu2_led_profile[] = { ...@@ -102,6 +102,13 @@ static const struct apu_led_profile apu2_led_profile[] = {
{ "apu2:green:3", LED_OFF, APU2_FCH_GPIO_BASE + 70 * APU2_IOSIZE }, { "apu2:green:3", LED_OFF, APU2_FCH_GPIO_BASE + 70 * APU2_IOSIZE },
}; };
/* Same as apu2_led_profile, but with "3" in the LED names. */
static const struct apu_led_profile apu3_led_profile[] = {
{ "apu3:green:1", LED_ON, APU2_FCH_GPIO_BASE + 68 * APU2_IOSIZE },
{ "apu3:green:2", LED_OFF, APU2_FCH_GPIO_BASE + 69 * APU2_IOSIZE },
{ "apu3:green:3", LED_OFF, APU2_FCH_GPIO_BASE + 70 * APU2_IOSIZE },
};
static const struct dmi_system_id apu_led_dmi_table[] __initconst = { static const struct dmi_system_id apu_led_dmi_table[] __initconst = {
{ {
.ident = "apu", .ident = "apu",
...@@ -134,6 +141,30 @@ static const struct dmi_system_id apu_led_dmi_table[] __initconst = { ...@@ -134,6 +141,30 @@ static const struct dmi_system_id apu_led_dmi_table[] __initconst = {
DMI_MATCH(DMI_BOARD_NAME, "PC Engines apu2") DMI_MATCH(DMI_BOARD_NAME, "PC Engines apu2")
} }
}, },
/* PC Engines APU3 with "Legacy" bios < 4.0.8 */
{
.ident = "apu3",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"),
DMI_MATCH(DMI_BOARD_NAME, "APU3")
}
},
/* PC Engines APU3 with "Legacy" bios >= 4.0.8 */
{
.ident = "apu3",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"),
DMI_MATCH(DMI_BOARD_NAME, "apu3")
}
},
/* PC Engines APU2 with "Mainline" bios */
{
.ident = "apu3",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "PC Engines"),
DMI_MATCH(DMI_BOARD_NAME, "PC Engines apu3")
}
},
{} {}
}; };
MODULE_DEVICE_TABLE(dmi, apu_led_dmi_table); MODULE_DEVICE_TABLE(dmi, apu_led_dmi_table);
...@@ -235,6 +266,14 @@ static int __init apu_led_probe(struct platform_device *pdev) ...@@ -235,6 +266,14 @@ static int __init apu_led_probe(struct platform_device *pdev)
apu_led->platform = APU2_LED_PLATFORM; apu_led->platform = APU2_LED_PLATFORM;
apu_led->num_led_instances = ARRAY_SIZE(apu2_led_profile); apu_led->num_led_instances = ARRAY_SIZE(apu2_led_profile);
apu_led->iosize = APU2_IOSIZE; apu_led->iosize = APU2_IOSIZE;
} else if (dmi_match(DMI_BOARD_NAME, "APU3") ||
dmi_match(DMI_BOARD_NAME, "apu3") ||
dmi_match(DMI_BOARD_NAME, "PC Engines apu3")) {
apu_led->profile = apu3_led_profile;
/* Otherwise identical to APU2. */
apu_led->platform = APU2_LED_PLATFORM;
apu_led->num_led_instances = ARRAY_SIZE(apu3_led_profile);
apu_led->iosize = APU2_IOSIZE;
} }
spin_lock_init(&apu_led->lock); spin_lock_init(&apu_led->lock);
...@@ -259,7 +298,10 @@ static int __init apu_led_init(void) ...@@ -259,7 +298,10 @@ static int __init apu_led_init(void)
if (!(dmi_match(DMI_PRODUCT_NAME, "APU") || if (!(dmi_match(DMI_PRODUCT_NAME, "APU") ||
dmi_match(DMI_PRODUCT_NAME, "APU2") || dmi_match(DMI_PRODUCT_NAME, "APU2") ||
dmi_match(DMI_PRODUCT_NAME, "apu2") || dmi_match(DMI_PRODUCT_NAME, "apu2") ||
dmi_match(DMI_PRODUCT_NAME, "PC Engines apu2"))) { dmi_match(DMI_PRODUCT_NAME, "PC Engines apu2") ||
dmi_match(DMI_PRODUCT_NAME, "APU3") ||
dmi_match(DMI_PRODUCT_NAME, "apu3") ||
dmi_match(DMI_PRODUCT_NAME, "PC Engines apu3"))) {
pr_err("Unknown PC Engines board: %s\n", pr_err("Unknown PC Engines board: %s\n",
dmi_get_system_info(DMI_PRODUCT_NAME)); dmi_get_system_info(DMI_PRODUCT_NAME));
return -ENODEV; return -ENODEV;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment