2 * LED driver for the Openmoko GTA02 GSM phone
4 * (C) 2006-2008 by Openmoko, Inc.
5 * Author: Harald Welte <laforge@openmoko.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17 #include <linux/leds.h>
18 #include <mach/hardware.h>
19 #include <asm/mach-types.h>
20 #include <mach/gta02.h>
21 #include <plat/regs-timer.h>
29 struct led_classdev cdev
;
33 struct gta02_led_bundle
36 struct gta02_led_priv led
[MAX_LEDS
];
39 static inline struct gta02_led_priv
*to_priv(struct led_classdev
*led_cdev
)
41 return container_of(led_cdev
, struct gta02_led_priv
, cdev
);
44 static inline struct gta02_led_bundle
*to_bundle(struct led_classdev
*led_cdev
)
46 return dev_get_drvdata(led_cdev
->dev
->parent
);
49 static void gta02led_set(struct led_classdev
*led_cdev
,
50 enum led_brightness value
)
53 struct gta02_led_priv
*lp
= to_priv(led_cdev
);
55 spin_lock_irqsave(&lp
->lock
, flags
);
56 s3c2410_gpio_setpin(lp
->gpio
, value
? 1 : 0);
57 spin_unlock_irqrestore(&lp
->lock
, flags
);
61 static int gta02led_suspend(struct platform_device
*pdev
, pm_message_t state
)
63 struct gta02_led_bundle
*bundle
= platform_get_drvdata(pdev
);
66 for (i
= 0; i
< bundle
->num_leds
; i
++)
67 led_classdev_suspend(&bundle
->led
[i
].cdev
);
72 static int gta02led_resume(struct platform_device
*pdev
)
74 struct gta02_led_bundle
*bundle
= platform_get_drvdata(pdev
);
77 for (i
= 0; i
< bundle
->num_leds
; i
++)
78 led_classdev_resume(&bundle
->led
[i
].cdev
);
84 static int __init
gta02led_probe(struct platform_device
*pdev
)
87 struct gta02_led_bundle
*bundle
;
89 if (!machine_is_neo1973_gta02())
92 bundle
= kzalloc(sizeof(struct gta02_led_bundle
), GFP_KERNEL
);
95 platform_set_drvdata(pdev
, bundle
);
97 for (i
= 0; i
< pdev
->num_resources
; i
++) {
98 struct gta02_led_priv
*lp
;
104 r
= platform_get_resource(pdev
, 0, i
);
105 if (!r
|| !r
->start
|| !r
->name
)
108 lp
= &bundle
->led
[i
];
111 lp
->cdev
.name
= r
->name
;
112 lp
->cdev
.brightness_set
= gta02led_set
;
118 s3c2410_gpio_cfgpin(lp
->gpio
, S3C2410_GPIO_OUTPUT
);
124 spin_lock_init(&lp
->lock
);
125 rc
= led_classdev_register(&pdev
->dev
, &lp
->cdev
);
128 bundle
->num_leds
= i
;
133 static int gta02led_remove(struct platform_device
*pdev
)
135 struct gta02_led_bundle
*bundle
= platform_get_drvdata(pdev
);
138 for (i
= 0; i
< bundle
->num_leds
; i
++) {
139 struct gta02_led_priv
*lp
= &bundle
->led
[i
];
140 gta02led_set(&lp
->cdev
, 0);
141 led_classdev_unregister(&lp
->cdev
);
144 platform_set_drvdata(pdev
, NULL
);
150 static struct platform_driver gta02led_driver
= {
151 .probe
= gta02led_probe
,
152 .remove
= gta02led_remove
,
154 .suspend
= gta02led_suspend
,
155 .resume
= gta02led_resume
,
162 static int __init
gta02led_init(void)
164 return platform_driver_register(>a02led_driver
);
167 static void __exit
gta02led_exit(void)
169 platform_driver_unregister(>a02led_driver
);
172 module_init(gta02led_init
);
173 module_exit(gta02led_exit
);
175 MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
176 MODULE_DESCRIPTION("Openmoko GTA02 LED driver");
177 MODULE_LICENSE("GPL");