1 /* 2 * System Specific setup for Traverse Technologies GEOS. 3 * At the moment this means setup of GPIO control of LEDs. 4 * 5 * Copyright (C) 2008 Constantin Baranov <const@mimas.ru> 6 * Copyright (C) 2011 Ed Wildgoose <kernel@wildgooses.com> 7 * and Philip Prindeville <philipp@redfish-solutions.com> 8 * 9 * TODO: There are large similarities with leds-net5501.c 10 * by Alessandro Zummo <a.zummo@towertech.it> 11 * In the future leds-net5501.c should be migrated over to platform 12 * 13 * This program is free software; you can redistribute it and/or modify 14 * it under the terms of the GNU General Public License version 2 15 * as published by the Free Software Foundation. 16 */ 17 18 #include <linux/kernel.h> 19 #include <linux/init.h> 20 #include <linux/io.h> 21 #include <linux/string.h> 22 #include <linux/module.h> 23 #include <linux/leds.h> 24 #include <linux/platform_device.h> 25 #include <linux/gpio.h> 26 #include <linux/input.h> 27 #include <linux/gpio_keys.h> 28 #include <linux/dmi.h> 29 30 #include <asm/geode.h> 31 32 static struct gpio_keys_button geos_gpio_buttons[] = { 33 { 34 .code = KEY_RESTART, 35 .gpio = 3, 36 .active_low = 1, 37 .desc = "Reset button", 38 .type = EV_KEY, 39 .wakeup = 0, 40 .debounce_interval = 100, 41 .can_disable = 0, 42 } 43 }; 44 static struct gpio_keys_platform_data geos_buttons_data = { 45 .buttons = geos_gpio_buttons, 46 .nbuttons = ARRAY_SIZE(geos_gpio_buttons), 47 .poll_interval = 20, 48 }; 49 50 static struct platform_device geos_buttons_dev = { 51 .name = "gpio-keys-polled", 52 .id = 1, 53 .dev = { 54 .platform_data = &geos_buttons_data, 55 } 56 }; 57 58 static struct gpio_led geos_leds[] = { 59 { 60 .name = "geos:1", 61 .gpio = 6, 62 .default_trigger = "default-on", 63 .active_low = 1, 64 }, 65 { 66 .name = "geos:2", 67 .gpio = 25, 68 .default_trigger = "default-off", 69 .active_low = 1, 70 }, 71 { 72 .name = "geos:3", 73 .gpio = 27, 74 .default_trigger = "default-off", 75 .active_low = 1, 76 }, 77 }; 78 79 static struct gpio_led_platform_data geos_leds_data = { 80 .num_leds = ARRAY_SIZE(geos_leds), 81 .leds = geos_leds, 82 }; 83 84 static struct platform_device geos_leds_dev = { 85 .name = "leds-gpio", 86 .id = -1, 87 .dev.platform_data = &geos_leds_data, 88 }; 89 90 static struct __initdata platform_device *geos_devs[] = { 91 &geos_buttons_dev, 92 &geos_leds_dev, 93 }; 94 95 static void __init register_geos(void) 96 { 97 /* Setup LED control through leds-gpio driver */ 98 platform_add_devices(geos_devs, ARRAY_SIZE(geos_devs)); 99 } 100 101 static int __init geos_init(void) 102 { 103 const char *vendor, *product; 104 105 if (!is_geode()) 106 return 0; 107 108 vendor = dmi_get_system_info(DMI_SYS_VENDOR); 109 if (!vendor || strcmp(vendor, "Traverse Technologies")) 110 return 0; 111 112 product = dmi_get_system_info(DMI_PRODUCT_NAME); 113 if (!product || strcmp(product, "Geos")) 114 return 0; 115 116 printk(KERN_INFO "%s: system is recognized as \"%s %s\"\n", 117 KBUILD_MODNAME, vendor, product); 118 119 register_geos(); 120 121 return 0; 122 } 123 124 module_init(geos_init); 125 126 MODULE_AUTHOR("Philip Prindeville <philipp@redfish-solutions.com>"); 127 MODULE_DESCRIPTION("Traverse Technologies Geos System Setup"); 128 MODULE_LICENSE("GPL"); 129