Blame view

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