geos.c (2973B)
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/gpio/machine.h> 24#include <linux/dmi.h> 25 26#include <asm/geode.h> 27 28static struct gpio_keys_button geos_gpio_buttons[] = { 29 { 30 .code = KEY_RESTART, 31 .gpio = 3, 32 .active_low = 1, 33 .desc = "Reset button", 34 .type = EV_KEY, 35 .wakeup = 0, 36 .debounce_interval = 100, 37 .can_disable = 0, 38 } 39}; 40static struct gpio_keys_platform_data geos_buttons_data = { 41 .buttons = geos_gpio_buttons, 42 .nbuttons = ARRAY_SIZE(geos_gpio_buttons), 43 .poll_interval = 20, 44}; 45 46static struct platform_device geos_buttons_dev = { 47 .name = "gpio-keys-polled", 48 .id = 1, 49 .dev = { 50 .platform_data = &geos_buttons_data, 51 } 52}; 53 54static struct gpio_led geos_leds[] = { 55 { 56 .name = "geos:1", 57 .default_trigger = "default-on", 58 }, 59 { 60 .name = "geos:2", 61 .default_trigger = "default-off", 62 }, 63 { 64 .name = "geos:3", 65 .default_trigger = "default-off", 66 }, 67}; 68 69static struct gpio_led_platform_data geos_leds_data = { 70 .num_leds = ARRAY_SIZE(geos_leds), 71 .leds = geos_leds, 72}; 73 74static struct gpiod_lookup_table geos_leds_gpio_table = { 75 .dev_id = "leds-gpio", 76 .table = { 77 /* The Geode GPIOs should be on the CS5535 companion chip */ 78 GPIO_LOOKUP_IDX("cs5535-gpio", 6, NULL, 0, GPIO_ACTIVE_LOW), 79 GPIO_LOOKUP_IDX("cs5535-gpio", 25, NULL, 1, GPIO_ACTIVE_LOW), 80 GPIO_LOOKUP_IDX("cs5535-gpio", 27, NULL, 2, GPIO_ACTIVE_LOW), 81 { } 82 }, 83}; 84 85static struct platform_device geos_leds_dev = { 86 .name = "leds-gpio", 87 .id = -1, 88 .dev.platform_data = &geos_leds_data, 89}; 90 91static struct platform_device *geos_devs[] __initdata = { 92 &geos_buttons_dev, 93 &geos_leds_dev, 94}; 95 96static void __init register_geos(void) 97{ 98 /* Setup LED control through leds-gpio driver */ 99 gpiod_add_lookup_table(&geos_leds_gpio_table); 100 platform_add_devices(geos_devs, ARRAY_SIZE(geos_devs)); 101} 102 103static int __init geos_init(void) 104{ 105 const char *vendor, *product; 106 107 if (!is_geode()) 108 return 0; 109 110 vendor = dmi_get_system_info(DMI_SYS_VENDOR); 111 if (!vendor || strcmp(vendor, "Traverse Technologies")) 112 return 0; 113 114 product = dmi_get_system_info(DMI_PRODUCT_NAME); 115 if (!product || strcmp(product, "Geos")) 116 return 0; 117 118 printk(KERN_INFO "%s: system is recognized as \"%s %s\"\n", 119 KBUILD_MODNAME, vendor, product); 120 121 register_geos(); 122 123 return 0; 124} 125device_initcall(geos_init);