Blame view

drivers/leds/leds-s3c24xx.c 3.13 KB
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
1
2
3
4
5
6
7
8
9
10
11
12
  /* drivers/leds/leds-s3c24xx.c
   *
   * (c) 2006 Simtec Electronics
   *	http://armlinux.simtec.co.uk/
   *	Ben Dooks <ben@simtec.co.uk>
   *
   * S3C24XX - LEDs GPIO driver
   *
   * 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.
  */
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
13
14
15
16
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/platform_device.h>
  #include <linux/leds.h>
ec976d6eb   Ben Dooks   [ARM] S3C24XX: GP...
17
  #include <linux/gpio.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
18
  #include <linux/slab.h>
54f4dedb5   Paul Gortmaker   drivers/leds: Add...
19
  #include <linux/module.h>
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
20

a09e64fbc   Russell King   [ARM] Move includ...
21
22
23
  #include <mach/hardware.h>
  #include <mach/regs-gpio.h>
  #include <mach/leds-gpio.h>
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  
  /* our context */
  
  struct s3c24xx_gpio_led {
  	struct led_classdev		 cdev;
  	struct s3c24xx_led_platdata	*pdata;
  };
  
  static inline struct s3c24xx_gpio_led *pdev_to_gpio(struct platform_device *dev)
  {
  	return platform_get_drvdata(dev);
  }
  
  static inline struct s3c24xx_gpio_led *to_gpio(struct led_classdev *led_cdev)
  {
  	return container_of(led_cdev, struct s3c24xx_gpio_led, cdev);
  }
  
  static void s3c24xx_led_set(struct led_classdev *led_cdev,
  			    enum led_brightness value)
  {
  	struct s3c24xx_gpio_led *led = to_gpio(led_cdev);
  	struct s3c24xx_led_platdata *pd = led->pdata;
4a739d55c   Uwe Kleine-König   fix typo "sort" -...
47
  	/* there will be a short delay between setting the output and
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
48
49
50
51
52
53
54
  	 * going from output to input when using tristate. */
  
  	s3c2410_gpio_setpin(pd->gpio, (value ? 1 : 0) ^
  			    (pd->flags & S3C24XX_LEDF_ACTLOW));
  
  	if (pd->flags & S3C24XX_LEDF_TRISTATE)
  		s3c2410_gpio_cfgpin(pd->gpio,
4d404fd5c   Németh Márton   leds: Cleanup var...
55
  			value ? S3C2410_GPIO_OUTPUT : S3C2410_GPIO_INPUT);
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
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
  
  }
  
  static int s3c24xx_led_remove(struct platform_device *dev)
  {
  	struct s3c24xx_gpio_led *led = pdev_to_gpio(dev);
  
  	led_classdev_unregister(&led->cdev);
  	kfree(led);
  
  	return 0;
  }
  
  static int s3c24xx_led_probe(struct platform_device *dev)
  {
  	struct s3c24xx_led_platdata *pdata = dev->dev.platform_data;
  	struct s3c24xx_gpio_led *led;
  	int ret;
  
  	led = kzalloc(sizeof(struct s3c24xx_gpio_led), GFP_KERNEL);
  	if (led == NULL) {
  		dev_err(&dev->dev, "No memory for device
  ");
  		return -ENOMEM;
  	}
  
  	platform_set_drvdata(dev, led);
  
  	led->cdev.brightness_set = s3c24xx_led_set;
  	led->cdev.default_trigger = pdata->def_trigger;
  	led->cdev.name = pdata->name;
859cb7f2a   Richard Purdie   leds: Add suspend...
87
  	led->cdev.flags |= LED_CORE_SUSPENDRESUME;
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  
  	led->pdata = pdata;
  
  	/* no point in having a pull-up if we are always driving */
  
  	if (pdata->flags & S3C24XX_LEDF_TRISTATE) {
  		s3c2410_gpio_setpin(pdata->gpio, 0);
  		s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_INPUT);
  	} else {
  		s3c2410_gpio_pullup(pdata->gpio, 0);
  		s3c2410_gpio_setpin(pdata->gpio, 0);
  		s3c2410_gpio_cfgpin(pdata->gpio, S3C2410_GPIO_OUTPUT);
  	}
  
  	/* register our new led device */
  
  	ret = led_classdev_register(&dev->dev, &led->cdev);
  	if (ret < 0) {
  		dev_err(&dev->dev, "led_classdev_register failed
  ");
bfb2cc48f   Zhenwen Xu   leds: remove an u...
108
109
  		kfree(led);
  		return ret;
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
110
111
112
  	}
  
  	return 0;
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
113
  }
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
114
115
116
  static struct platform_driver s3c24xx_led_driver = {
  	.probe		= s3c24xx_led_probe,
  	.remove		= s3c24xx_led_remove,
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
117
118
119
120
121
  	.driver		= {
  		.name		= "s3c24xx_led",
  		.owner		= THIS_MODULE,
  	},
  };
892a8843f   Axel Lin   leds: convert led...
122
  module_platform_driver(s3c24xx_led_driver);
54bdc4701   Ben Dooks   [PATCH] S3C24XX G...
123
124
125
126
  
  MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
  MODULE_DESCRIPTION("S3C24XX LED driver");
  MODULE_LICENSE("GPL");
3c4ded971   Kay Sievers   leds: fix platfor...
127
  MODULE_ALIAS("platform:s3c24xx_led");