1 /* drivers/video/backlight/platform_lcd.c
3 * Copyright 2008 Simtec Electronics
4 * Ben Dooks <ben@simtec.co.uk>
6 * Generic platform-device LCD power control interface.
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/module.h>
15 #include <linux/platform_device.h>
17 #include <linux/backlight.h>
18 #include <linux/lcd.h>
19 #include <linux/slab.h>
21 #include <video/platform_lcd.h>
25 struct lcd_device
*lcd
;
26 struct plat_lcd_data
*pdata
;
29 unsigned int suspended
: 1;
32 static inline struct platform_lcd
*to_our_lcd(struct lcd_device
*lcd
)
34 return lcd_get_data(lcd
);
37 static int platform_lcd_get_power(struct lcd_device
*lcd
)
39 struct platform_lcd
*plcd
= to_our_lcd(lcd
);
44 static int platform_lcd_set_power(struct lcd_device
*lcd
, int power
)
46 struct platform_lcd
*plcd
= to_our_lcd(lcd
);
49 if (power
== FB_BLANK_POWERDOWN
|| plcd
->suspended
)
52 plcd
->pdata
->set_power(plcd
->pdata
, lcd_power
);
58 static int platform_lcd_match(struct lcd_device
*lcd
, struct fb_info
*info
)
60 struct platform_lcd
*plcd
= to_our_lcd(lcd
);
61 struct plat_lcd_data
*pdata
= plcd
->pdata
;
64 return pdata
->match_fb(pdata
, info
);
66 return plcd
->us
->parent
== info
->device
;
69 static struct lcd_ops platform_lcd_ops
= {
70 .get_power
= platform_lcd_get_power
,
71 .set_power
= platform_lcd_set_power
,
72 .check_fb
= platform_lcd_match
,
75 static int __devinit
platform_lcd_probe(struct platform_device
*pdev
)
77 struct plat_lcd_data
*pdata
;
78 struct platform_lcd
*plcd
;
79 struct device
*dev
= &pdev
->dev
;
82 pdata
= pdev
->dev
.platform_data
;
84 dev_err(dev
, "no platform data supplied\n");
88 plcd
= kzalloc(sizeof(struct platform_lcd
), GFP_KERNEL
);
90 dev_err(dev
, "no memory for state\n");
96 plcd
->lcd
= lcd_device_register(dev_name(dev
), dev
,
97 plcd
, &platform_lcd_ops
);
98 if (IS_ERR(plcd
->lcd
)) {
99 dev_err(dev
, "cannot register lcd device\n");
100 err
= PTR_ERR(plcd
->lcd
);
104 platform_set_drvdata(pdev
, plcd
);
105 platform_lcd_set_power(plcd
->lcd
, FB_BLANK_NORMAL
);
114 static int __devexit
platform_lcd_remove(struct platform_device
*pdev
)
116 struct platform_lcd
*plcd
= platform_get_drvdata(pdev
);
118 lcd_device_unregister(plcd
->lcd
);
125 static int platform_lcd_suspend(struct platform_device
*pdev
, pm_message_t st
)
127 struct platform_lcd
*plcd
= platform_get_drvdata(pdev
);
130 platform_lcd_set_power(plcd
->lcd
, plcd
->power
);
135 static int platform_lcd_resume(struct platform_device
*pdev
)
137 struct platform_lcd
*plcd
= platform_get_drvdata(pdev
);
140 platform_lcd_set_power(plcd
->lcd
, plcd
->power
);
145 #define platform_lcd_suspend NULL
146 #define platform_lcd_resume NULL
149 static struct platform_driver platform_lcd_driver
= {
151 .name
= "platform-lcd",
152 .owner
= THIS_MODULE
,
154 .probe
= platform_lcd_probe
,
155 .remove
= __devexit_p(platform_lcd_remove
),
156 .suspend
= platform_lcd_suspend
,
157 .resume
= platform_lcd_resume
,
160 static int __init
platform_lcd_init(void)
162 return platform_driver_register(&platform_lcd_driver
);
165 static void __exit
platform_lcd_cleanup(void)
167 platform_driver_unregister(&platform_lcd_driver
);
170 module_init(platform_lcd_init
);
171 module_exit(platform_lcd_cleanup
);
173 MODULE_AUTHOR("Ben Dooks <ben-linux@fluff.org>");
174 MODULE_LICENSE("GPL v2");
175 MODULE_ALIAS("platform:platform-lcd");