分类: LINUX
2007-12-05 23:08:37
S3C2410-LED Driver Framework:
-------------------------------------------
struct s3c2410_gpio_led {
struct led_classdev cdev;
struct s3c2410_led_platdata *pdata;
};
platform_device{} ==> device{} ==>driver_data
static inline struct s3c2410_gpio_led *pdev_to_gpio(struct platform_device *dev)
{
return platform_get_drvdata(dev);
}
static inline struct s3c2410_gpio_led *to_gpio(struct led_classdev *led_cdev)
{
return container_of(led_cdev, struct s3c2410_gpio_led, cdev);
}
----------------------------------------------------
static int s3c24xx_led_probe(struct platform_device *dev)
{
struct s3c24xx_led_platdata *pdata = (pdev_to_gpio(dev))->pdata;
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\n");
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;
led->pdata = pdata;
/* register our new led device */
ret = led_classdev_register(&dev->dev, &led->cdev);
if (ret < 0) {
dev_err(&dev->dev, "led_classdev_register failed\n");
goto exit_err1;
}
........
exit_err1:
kfree(led);
......
static int s3c2410_led_remove(struct platform_device *dev)
{
struct s3c2410_gpio_led *led = pdev_to_gpio(dev);
led_classdev_unregister(&led->cdev);
kfree(led);
return 0;
}
===================================================
static int s3c2410_led_remove(struct platform_device *dev)
{
Implement is as above.Here only gives a design framework;
}
static int s3c2410_led_probe(struct platform_device *dev)
{
Implement is as above.Here only gives a design framework;
}
#ifdef CONFIG_PM
static int s3c2410_led_suspend(struct platform_device *dev,pm_message_t state)
{
Implement is as above.Here only gives a design framework;
}
static int s3c2410_led_resume(struct platform_device *dev)
{
Implement is as above.Here only gives a design framework;
}
#else
#define s3c2410_led_suspend NULL
#define s3c2410_led_resume NULL
#endif
static struct platform_driver s3c2410_led_driver = {
.probe = s3c2410_led_probe,
.remove = s3c2410_led_remove,
.suspend = s3c2410_led_suspend,
.resume = s3c2410_led_resume,
.driver = {
.name = "s3c2410-led",
.owner = THIS_MODULE
},
};
static int __init s3c2410_led_init(void)
{
platform_driver_register(&s3c2410_led_driver);
}
static void __exit s3c2410_led_exit(void)
{
platform_driver_unregister(&s3c2410_led_driver);
}
module_init(s3c2410_led_init);
module_exit(s3c2410_led_exit);
MODULE_AUTHOR("YX<>");
MODULE_DESCRIPTION("S3C2410-LED");
MODULE_LICENSE("GPL");
==========