Chinaunix首页 | 论坛 | 博客
  • 博客访问: 971110
  • 博文数量: 214
  • 博客积分: 10173
  • 博客等级: 上将
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-18 13:48
文章分类

全部博文(214)

文章存档

2012年(1)

2010年(13)

2009年(5)

2008年(98)

2007年(97)

分类: 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");

==========

阅读(1707) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~