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