From: Arne Fitzenreiter Date: Mon, 17 Mar 2014 23:21:38 +0000 (+0100) Subject: kernel: add pcengines apu led support. X-Git-Url: http://git.ipfire.org/?p=people%2Fteissler%2Fipfire-2.x.git;a=commitdiff_plain;h=e583643a25e2249bcc3583bdae9aed7b57663fbe;hp=9a5050b4c5e9a2635f859cae14820827742dfcf4 kernel: add pcengines apu led support. --- diff --git a/config/kernel/kernel.config.i586-ipfire b/config/kernel/kernel.config.i586-ipfire index c7fdbd1c7..9ec9523b7 100644 --- a/config/kernel/kernel.config.i586-ipfire +++ b/config/kernel/kernel.config.i586-ipfire @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 3.10.30-ipfire Kernel Configuration +# Linux/x86 3.10.33 Kernel Configuration # # CONFIG_64BIT is not set CONFIG_X86_32=y @@ -658,6 +658,7 @@ CONFIG_EISA_NAMES=y CONFIG_SCx200=m CONFIG_SCx200HR_TIMER=m # CONFIG_OLPC is not set +CONFIG_APULED=y CONFIG_ALIX=y CONFIG_NET5501=y CONFIG_GEOS=y diff --git a/config/kernel/kernel.config.i586-ipfire-pae b/config/kernel/kernel.config.i586-ipfire-pae index 14802522d..5fd7ab9bf 100644 --- a/config/kernel/kernel.config.i586-ipfire-pae +++ b/config/kernel/kernel.config.i586-ipfire-pae @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86 3.10.30-ipfire Kernel Configuration +# Linux/x86 3.10.33 Kernel Configuration # # CONFIG_64BIT is not set CONFIG_X86_32=y @@ -670,6 +670,7 @@ CONFIG_EISA_PCI_EISA=y CONFIG_EISA_VIRTUAL_ROOT=y CONFIG_EISA_NAMES=y # CONFIG_SCx200 is not set +CONFIG_APULED=y # CONFIG_ALIX is not set # CONFIG_NET5501 is not set # CONFIG_GEOS is not set diff --git a/lfs/linux b/lfs/linux index 1993cc8aa..7d08e6baa 100644 --- a/lfs/linux +++ b/lfs/linux @@ -150,6 +150,9 @@ endif # cs5535audio spams syslog if no ac97 was present (geos router) cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10.30_cs5535audio_fix_logspam_on_geos.patch + # Add PC Engines APU led support + cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10-apu_leds.patch + # Fix uevent PHYSDEVDRIVER cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2.33_ipg-fix-driver-name.patch cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-2.6.32.27_mcs7830-fix-driver-name.patch diff --git a/src/patches/linux-3.10-apu_leds.patch b/src/patches/linux-3.10-apu_leds.patch new file mode 100644 index 000000000..53d389af1 --- /dev/null +++ b/src/patches/linux-3.10-apu_leds.patch @@ -0,0 +1,215 @@ +diff -Naur linux-3.10.33.org/arch/x86/Kconfig linux-3.10.33/arch/x86/Kconfig +--- linux-3.10.33.org/arch/x86/Kconfig 2014-03-07 06:58:45.000000000 +0100 ++++ linux-3.10.33/arch/x86/Kconfig 2014-03-17 17:02:46.703135023 +0100 +@@ -2199,6 +2199,12 @@ + - AC adapter status updates + - Battery status updates + ++config APULED ++ bool "PCEngines APU Led Support" ++ depends on DMI ++ ---help--- ++ This option enables system support for the PCEngines APU. ++ + config ALIX + bool "PCEngines ALIX System Support (LED setup)" + select GPIOLIB +diff -Naur linux-3.10.33.org/arch/x86/platform/apu/apu-led.c linux-3.10.33/arch/x86/platform/apu/apu-led.c +--- linux-3.10.33.org/arch/x86/platform/apu/apu-led.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.10.33/arch/x86/platform/apu/apu-led.c 2014-03-17 17:00:36.187188456 +0100 +@@ -0,0 +1,181 @@ ++/* ++ * LEDs driver for PCEngines apu ++ * ++ * Copyright (C) 2013 Christian Herzog , based on ++ * Petr Leibman's leds-alix ++ * Hardware presence check added by Arne Fitzenreiter ++ * Based on leds-wrap.c ++ * Hardware info taken from http://www.dpie.com/manuals/miniboards/kontron/KTD-S0043-0_KTA55_SoftwareGuide.pdf ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define DRVNAME "apu-led" ++#define BASEADDR (0xFED801BD) ++#define LEDON (0x8) ++#define LEDOFF (0xC8) ++ ++static struct platform_device *pdev; ++unsigned int *p1; ++unsigned int *p2; ++unsigned int *p3; ++ ++static void apu_led_set_1(struct led_classdev *led_cdev, ++ enum led_brightness value) { ++ if (value) ++ iowrite8(LEDON, p1); ++ else ++ iowrite8(LEDOFF, p1); ++} ++ ++static void apu_led_set_2(struct led_classdev *led_cdev, ++ enum led_brightness value) { ++ if (value) ++ iowrite8(LEDON, p2); ++ else ++ iowrite8(LEDOFF, p2); ++} ++ ++static void apu_led_set_3(struct led_classdev *led_cdev, ++ enum led_brightness value) { ++ if (value) ++ iowrite8(LEDON, p3); ++ else ++ iowrite8(LEDOFF, p3); ++} ++ ++static struct led_classdev apu_led_1 = { ++ .name = "apu:1", ++ .brightness_set = apu_led_set_1, ++}; ++ ++static struct led_classdev apu_led_2 = { ++ .name = "apu:2", ++ .brightness_set = apu_led_set_2, ++}; ++ ++static struct led_classdev apu_led_3 = { ++ .name = "apu:3", ++ .brightness_set = apu_led_set_3, ++}; ++ ++ ++#ifdef CONFIG_PM ++static int apu_led_suspend(struct platform_device *dev, ++ pm_message_t state) ++{ ++ led_classdev_suspend(&apu_led_1); ++ led_classdev_suspend(&apu_led_2); ++ led_classdev_suspend(&apu_led_3); ++ return 0; ++} ++ ++static int apu_led_resume(struct platform_device *dev) ++{ ++ led_classdev_resume(&apu_led_1); ++ led_classdev_resume(&apu_led_2); ++ led_classdev_resume(&apu_led_3); ++ return 0; ++} ++#else ++#define apu_led_suspend NULL ++#define apu_led_resume NULL ++#endif ++ ++static int apu_led_probe(struct platform_device *pdev) ++{ ++ int ret; ++ ++ ret = led_classdev_register(&pdev->dev, &apu_led_1); ++ if (ret == 0) ++ { ++ ret = led_classdev_register(&pdev->dev, &apu_led_2); ++ if (ret >= 0) ++ { ++ ret = led_classdev_register(&pdev->dev, &apu_led_3); ++ if (ret < 0) ++ led_classdev_unregister(&apu_led_2); ++ } ++ if (ret < 0) ++ led_classdev_unregister(&apu_led_1); ++ } ++ return ret; ++} ++ ++static int apu_led_remove(struct platform_device *pdev) ++{ ++ led_classdev_unregister(&apu_led_1); ++ led_classdev_unregister(&apu_led_2); ++ led_classdev_unregister(&apu_led_3); ++ return 0; ++} ++ ++static struct platform_driver apu_led_driver = { ++ .probe = apu_led_probe, ++ .remove = apu_led_remove, ++ .suspend = apu_led_suspend, ++ .resume = apu_led_resume, ++ .driver = { ++ .name = DRVNAME, ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init apu_led_init(void) ++{ ++ int ret=0; ++ const char *vendor, *product; ++ ++ vendor = dmi_get_system_info(DMI_SYS_VENDOR); ++ if (!vendor || strcmp(vendor, "PC Engines")) ++ goto out; ++ ++ product = dmi_get_system_info(DMI_PRODUCT_NAME); ++ if (!product || strcmp(product, "APU")) ++ goto out; ++ ++ printk(KERN_INFO "%s: system is recognized as \"%s %s\"\n", ++ KBUILD_MODNAME, vendor, product); ++ ++ ret = platform_driver_register(&apu_led_driver); ++ if (ret < 0) ++ goto out; ++ ++ pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); ++ if (IS_ERR(pdev)) { ++ ret = PTR_ERR(pdev); ++ platform_driver_unregister(&apu_led_driver); ++ goto out; ++ } ++ ++ p1 = ioremap(BASEADDR, 1); ++ p2 = ioremap(BASEADDR+1, 1); ++ p3 = ioremap(BASEADDR+2, 1); ++ ++out: ++ return ret; ++} ++ ++static void __exit apu_led_exit(void) ++{ ++ platform_device_unregister(pdev); ++ platform_driver_unregister(&apu_led_driver); ++} ++ ++module_init(apu_led_init); ++module_exit(apu_led_exit); ++ ++MODULE_AUTHOR("Christian Herzog"); ++MODULE_DESCRIPTION("PCEngines apu LED driver"); ++MODULE_LICENSE("GPL"); +diff -Naur linux-3.10.33.org/arch/x86/platform/apu/Makefile linux-3.10.33/arch/x86/platform/apu/Makefile +--- linux-3.10.33.org/arch/x86/platform/apu/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-3.10.33/arch/x86/platform/apu/Makefile 2014-03-17 17:05:19.245651480 +0100 +@@ -0,0 +1 @@ ++obj-$(CONFIG_APULED) += apu-led.o +diff -Naur linux-3.10.33.org/arch/x86/platform/Makefile linux-3.10.33/arch/x86/platform/Makefile +--- linux-3.10.33.org/arch/x86/platform/Makefile 2014-03-07 06:58:45.000000000 +0100 ++++ linux-3.10.33/arch/x86/platform/Makefile 2014-03-17 14:53:15.078571307 +0100 +@@ -1,4 +1,5 @@ + # Platform specific code goes here ++obj-y += apu/ + obj-y += ce4100/ + obj-y += efi/ + obj-y += geode/