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