linux/drivers/leds/leds-net5501.c
<<
>>
Prefs
   1/*
   2 * Soekris board support code
   3 *
   4 * Copyright (C) 2008-2009 Tower Technologies
   5 * Written by Alessandro Zummo <a.zummo@towertech.it>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2
   9 * as published by the Free Software Foundation.
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/init.h>
  14#include <linux/io.h>
  15#include <linux/string.h>
  16#include <linux/leds.h>
  17#include <linux/platform_device.h>
  18#include <linux/gpio.h>
  19
  20#include <asm/geode.h>
  21
  22static const struct gpio_led net5501_leds[] = {
  23        {
  24                .name = "error",
  25                .gpio = 6,
  26                .default_trigger = "default-on",
  27        },
  28};
  29
  30static struct gpio_led_platform_data net5501_leds_data = {
  31        .num_leds = ARRAY_SIZE(net5501_leds),
  32        .leds = net5501_leds,
  33};
  34
  35static struct platform_device net5501_leds_dev = {
  36        .name = "leds-gpio",
  37        .id = -1,
  38        .dev.platform_data = &net5501_leds_data,
  39};
  40
  41static void __init init_net5501(void)
  42{
  43        platform_device_register(&net5501_leds_dev);
  44}
  45
  46struct soekris_board {
  47        u16     offset;
  48        char    *sig;
  49        u8      len;
  50        void    (*init)(void);
  51};
  52
  53static struct soekris_board __initdata boards[] = {
  54        { 0xb7b, "net5501", 7, init_net5501 },  /* net5501 v1.33/1.33c */
  55        { 0xb1f, "net5501", 7, init_net5501 },  /* net5501 v1.32i */
  56};
  57
  58static int __init soekris_init(void)
  59{
  60        int i;
  61        unsigned char *rombase, *bios;
  62
  63        if (!is_geode())
  64                return 0;
  65
  66        rombase = ioremap(0xffff0000, 0xffff);
  67        if (!rombase) {
  68                printk(KERN_INFO "Soekris net5501 LED driver failed to get rombase");
  69                return 0;
  70        }
  71
  72        bios = rombase + 0x20;  /* null terminated */
  73
  74        if (strncmp(bios, "comBIOS", 7))
  75                goto unmap;
  76
  77        for (i = 0; i < ARRAY_SIZE(boards); i++) {
  78                unsigned char *model = rombase + boards[i].offset;
  79
  80                if (strncmp(model, boards[i].sig, boards[i].len) == 0) {
  81                        printk(KERN_INFO "Soekris %s: %s\n", model, bios);
  82
  83                        if (boards[i].init)
  84                                boards[i].init();
  85                        break;
  86                }
  87        }
  88
  89unmap:
  90        iounmap(rombase);
  91        return 0;
  92}
  93
  94arch_initcall(soekris_init);
  95
  96MODULE_LICENSE("GPL");
  97