linux/arch/x86/platform/geode/geos.c
<<
>>
Prefs
   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
  32static 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};
  44static 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
  50static 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
  58static 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
  79static struct gpio_led_platform_data geos_leds_data = {
  80        .num_leds = ARRAY_SIZE(geos_leds),
  81        .leds = geos_leds,
  82};
  83
  84static struct platform_device geos_leds_dev = {
  85        .name = "leds-gpio",
  86        .id = -1,
  87        .dev.platform_data = &geos_leds_data,
  88};
  89
  90static struct platform_device *geos_devs[] __initdata = {
  91        &geos_buttons_dev,
  92        &geos_leds_dev,
  93};
  94
  95static 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
 101static 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
 124module_init(geos_init);
 125
 126MODULE_AUTHOR("Philip Prindeville <philipp@redfish-solutions.com>");
 127MODULE_DESCRIPTION("Traverse Technologies Geos System Setup");
 128MODULE_LICENSE("GPL");
 129