]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/linux-3.14-apu_leds.patch
Merge branch 'next' of ssh://git.ipfire.org/pub/git/ipfire-2.x into next
[ipfire-2.x.git] / src / patches / linux-3.14-apu_leds.patch
CommitLineData
4d4f36ef
AF
1diff -Naur linux-3.14.43.org/arch/x86/Kconfig linux-3.14.43/arch/x86/Kconfig
2--- linux-3.14.43.org/arch/x86/Kconfig 2015-05-17 18:54:01.000000000 +0200
3+++ linux-3.14.43/arch/x86/Kconfig 2015-09-19 20:14:52.436654988 +0200
4@@ -2287,6 +2287,7 @@
e583643a
AF
5 - AC adapter status updates
6 - Battery status updates
7
4d4f36ef
AF
8+
9 config ALIX
10 bool "PCEngines ALIX System Support (LED setup)"
11 select GPIOLIB
12@@ -2325,6 +2326,12 @@
13
14 endif # X86_32
15
e583643a
AF
16+config APULED
17+ bool "PCEngines APU Led Support"
18+ depends on DMI
19+ ---help---
20+ This option enables system support for the PCEngines APU.
21+
4d4f36ef
AF
22 config AMD_NB
23 def_bool y
24 depends on CPU_SUP_AMD && PCI
25diff -Naur linux-3.14.43.org/arch/x86/platform/apu/apu-led.c linux-3.14.43/arch/x86/platform/apu/apu-led.c
26--- linux-3.14.43.org/arch/x86/platform/apu/apu-led.c 1970-01-01 01:00:00.000000000 +0100
27+++ linux-3.14.43/arch/x86/platform/apu/apu-led.c 2015-09-19 20:12:20.520647636 +0200
e583643a
AF
28@@ -0,0 +1,181 @@
29+/*
30+ * LEDs driver for PCEngines apu
31+ *
32+ * Copyright (C) 2013 Christian Herzog <daduke@daduke.org>, based on
33+ * Petr Leibman's leds-alix
34+ * Hardware presence check added by Arne Fitzenreiter <arne_f@ipfire.org>
35+ * Based on leds-wrap.c
36+ * Hardware info taken from http://www.dpie.com/manuals/miniboards/kontron/KTD-S0043-0_KTA55_SoftwareGuide.pdf
37+ *
38+ * This program is free software; you can redistribute it and/or modify
39+ * it under the terms of the GNU General Public License version 2 as
40+ * published by the Free Software Foundation.
41+ */
42+
43+#include <linux/kernel.h>
44+#include <linux/module.h>
45+#include <linux/init.h>
46+#include <linux/platform_device.h>
47+#include <linux/leds.h>
48+#include <linux/err.h>
49+#include <asm/io.h>
50+#include <linux/dmi.h>
51+
52+#define DRVNAME "apu-led"
53+#define BASEADDR (0xFED801BD)
54+#define LEDON (0x8)
55+#define LEDOFF (0xC8)
56+
57+static struct platform_device *pdev;
58+unsigned int *p1;
59+unsigned int *p2;
60+unsigned int *p3;
61+
62+static void apu_led_set_1(struct led_classdev *led_cdev,
63+ enum led_brightness value) {
64+ if (value)
65+ iowrite8(LEDON, p1);
66+ else
67+ iowrite8(LEDOFF, p1);
68+}
69+
70+static void apu_led_set_2(struct led_classdev *led_cdev,
71+ enum led_brightness value) {
72+ if (value)
73+ iowrite8(LEDON, p2);
74+ else
75+ iowrite8(LEDOFF, p2);
76+}
77+
78+static void apu_led_set_3(struct led_classdev *led_cdev,
79+ enum led_brightness value) {
80+ if (value)
81+ iowrite8(LEDON, p3);
82+ else
83+ iowrite8(LEDOFF, p3);
84+}
85+
86+static struct led_classdev apu_led_1 = {
87+ .name = "apu:1",
88+ .brightness_set = apu_led_set_1,
89+};
90+
91+static struct led_classdev apu_led_2 = {
92+ .name = "apu:2",
93+ .brightness_set = apu_led_set_2,
94+};
95+
96+static struct led_classdev apu_led_3 = {
97+ .name = "apu:3",
98+ .brightness_set = apu_led_set_3,
99+};
100+
101+
102+#ifdef CONFIG_PM
103+static int apu_led_suspend(struct platform_device *dev,
104+ pm_message_t state)
105+{
106+ led_classdev_suspend(&apu_led_1);
107+ led_classdev_suspend(&apu_led_2);
108+ led_classdev_suspend(&apu_led_3);
109+ return 0;
110+}
111+
112+static int apu_led_resume(struct platform_device *dev)
113+{
114+ led_classdev_resume(&apu_led_1);
115+ led_classdev_resume(&apu_led_2);
116+ led_classdev_resume(&apu_led_3);
117+ return 0;
118+}
119+#else
120+#define apu_led_suspend NULL
121+#define apu_led_resume NULL
122+#endif
123+
124+static int apu_led_probe(struct platform_device *pdev)
125+{
126+ int ret;
127+
128+ ret = led_classdev_register(&pdev->dev, &apu_led_1);
129+ if (ret == 0)
130+ {
131+ ret = led_classdev_register(&pdev->dev, &apu_led_2);
132+ if (ret >= 0)
133+ {
134+ ret = led_classdev_register(&pdev->dev, &apu_led_3);
135+ if (ret < 0)
136+ led_classdev_unregister(&apu_led_2);
137+ }
138+ if (ret < 0)
139+ led_classdev_unregister(&apu_led_1);
140+ }
141+ return ret;
142+}
143+
144+static int apu_led_remove(struct platform_device *pdev)
145+{
146+ led_classdev_unregister(&apu_led_1);
147+ led_classdev_unregister(&apu_led_2);
148+ led_classdev_unregister(&apu_led_3);
149+ return 0;
150+}
151+
152+static struct platform_driver apu_led_driver = {
153+ .probe = apu_led_probe,
154+ .remove = apu_led_remove,
155+ .suspend = apu_led_suspend,
156+ .resume = apu_led_resume,
157+ .driver = {
158+ .name = DRVNAME,
159+ .owner = THIS_MODULE,
160+ },
161+};
162+
163+static int __init apu_led_init(void)
164+{
165+ int ret=0;
166+ const char *vendor, *product;
167+
168+ vendor = dmi_get_system_info(DMI_SYS_VENDOR);
169+ if (!vendor || strcmp(vendor, "PC Engines"))
170+ goto out;
171+
172+ product = dmi_get_system_info(DMI_PRODUCT_NAME);
173+ if (!product || strcmp(product, "APU"))
174+ goto out;
175+
176+ printk(KERN_INFO "%s: system is recognized as \"%s %s\"\n",
177+ KBUILD_MODNAME, vendor, product);
178+
179+ ret = platform_driver_register(&apu_led_driver);
180+ if (ret < 0)
181+ goto out;
182+
183+ pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
184+ if (IS_ERR(pdev)) {
185+ ret = PTR_ERR(pdev);
186+ platform_driver_unregister(&apu_led_driver);
187+ goto out;
188+ }
189+
190+ p1 = ioremap(BASEADDR, 1);
191+ p2 = ioremap(BASEADDR+1, 1);
192+ p3 = ioremap(BASEADDR+2, 1);
193+
194+out:
195+ return ret;
196+}
197+
198+static void __exit apu_led_exit(void)
199+{
200+ platform_device_unregister(pdev);
201+ platform_driver_unregister(&apu_led_driver);
202+}
203+
204+module_init(apu_led_init);
205+module_exit(apu_led_exit);
206+
207+MODULE_AUTHOR("Christian Herzog");
208+MODULE_DESCRIPTION("PCEngines apu LED driver");
209+MODULE_LICENSE("GPL");
4d4f36ef
AF
210diff -Naur linux-3.14.43.org/arch/x86/platform/apu/Makefile linux-3.14.43/arch/x86/platform/apu/Makefile
211--- linux-3.14.43.org/arch/x86/platform/apu/Makefile 1970-01-01 01:00:00.000000000 +0100
212+++ linux-3.14.43/arch/x86/platform/apu/Makefile 2015-09-19 20:12:20.520647636 +0200
e583643a
AF
213@@ -0,0 +1 @@
214+obj-$(CONFIG_APULED) += apu-led.o
4d4f36ef
AF
215diff -Naur linux-3.14.43.org/arch/x86/platform/Makefile linux-3.14.43/arch/x86/platform/Makefile
216--- linux-3.14.43.org/arch/x86/platform/Makefile 2015-05-17 18:54:01.000000000 +0200
217+++ linux-3.14.43/arch/x86/platform/Makefile 2015-09-19 20:12:20.520647636 +0200
e583643a
AF
218@@ -1,4 +1,5 @@
219 # Platform specific code goes here
220+obj-y += apu/
221 obj-y += ce4100/
222 obj-y += efi/
223 obj-y += geode/