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
= devm_kzalloc(&pdev
->dev
, sizeof(struct platform_lcd
),
91 dev_err(dev
, "no memory for state\n");
97 plcd
->lcd
= lcd_device_register(dev_name(dev
), dev
,
98 plcd
, &platform_lcd_ops
);
99 if (IS_ERR(plcd
->lcd
)) {
100 dev_err(dev
, "cannot register lcd device\n");
101 err
= PTR_ERR(plcd
->lcd
);
105 platform_set_drvdata(pdev
, plcd
);
106 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
);
124 static int platform_lcd_suspend(struct platform_device
*pdev
, pm_message_t st
)
126 struct platform_lcd
*plcd
= platform_get_drvdata(pdev
);
129 platform_lcd_set_power(plcd
->lcd
, plcd
->power
);
134 static int platform_lcd_resume(struct platform_device
*pdev
)
136 struct platform_lcd
*plcd
= platform_get_drvdata(pdev
);
139 platform_lcd_set_power(plcd
->lcd
, plcd
->power
);
144 #define platform_lcd_suspend NULL
145 #define platform_lcd_resume NULL
148 static struct platform_driver platform_lcd_driver
= {
150 .name
= "platform-lcd",
151 .owner
= THIS_MODULE
,
153 .probe
= platform_lcd_probe
,
154 .remove
= __devexit_p(platform_lcd_remove
),
155 .suspend
= platform_lcd_suspend
,
156 .resume
= platform_lcd_resume
,
159 module_platform_driver(platform_lcd_driver
);
161 MODULE_AUTHOR("Ben Dooks <ben-linux@fluff.org>");
162 MODULE_LICENSE("GPL v2");
163 MODULE_ALIAS("platform:platform-lcd");