xref: /OK3568_Linux_fs/kernel/drivers/video/backlight/lm3533_bl.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * lm3533-bl.c -- LM3533 Backlight driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2011-2012 Texas Instruments
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Johan Hovold <jhovold@gmail.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/module.h>
11*4882a593Smuzhiyun #include <linux/init.h>
12*4882a593Smuzhiyun #include <linux/platform_device.h>
13*4882a593Smuzhiyun #include <linux/backlight.h>
14*4882a593Smuzhiyun #include <linux/fb.h>
15*4882a593Smuzhiyun #include <linux/slab.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/mfd/lm3533.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define LM3533_HVCTRLBANK_COUNT		2
21*4882a593Smuzhiyun #define LM3533_BL_MAX_BRIGHTNESS	255
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define LM3533_REG_CTRLBANK_AB_BCONF	0x1a
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun struct lm3533_bl {
27*4882a593Smuzhiyun 	struct lm3533 *lm3533;
28*4882a593Smuzhiyun 	struct lm3533_ctrlbank cb;
29*4882a593Smuzhiyun 	struct backlight_device *bd;
30*4882a593Smuzhiyun 	int id;
31*4882a593Smuzhiyun };
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 
lm3533_bl_get_ctrlbank_id(struct lm3533_bl * bl)34*4882a593Smuzhiyun static inline int lm3533_bl_get_ctrlbank_id(struct lm3533_bl *bl)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun 	return bl->id;
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun 
lm3533_bl_update_status(struct backlight_device * bd)39*4882a593Smuzhiyun static int lm3533_bl_update_status(struct backlight_device *bd)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	struct lm3533_bl *bl = bl_get_data(bd);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	return lm3533_ctrlbank_set_brightness(&bl->cb, backlight_get_brightness(bd));
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
lm3533_bl_get_brightness(struct backlight_device * bd)46*4882a593Smuzhiyun static int lm3533_bl_get_brightness(struct backlight_device *bd)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	struct lm3533_bl *bl = bl_get_data(bd);
49*4882a593Smuzhiyun 	u8 val;
50*4882a593Smuzhiyun 	int ret;
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	ret = lm3533_ctrlbank_get_brightness(&bl->cb, &val);
53*4882a593Smuzhiyun 	if (ret)
54*4882a593Smuzhiyun 		return ret;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	return val;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun static const struct backlight_ops lm3533_bl_ops = {
60*4882a593Smuzhiyun 	.get_brightness	= lm3533_bl_get_brightness,
61*4882a593Smuzhiyun 	.update_status	= lm3533_bl_update_status,
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun 
show_id(struct device * dev,struct device_attribute * attr,char * buf)64*4882a593Smuzhiyun static ssize_t show_id(struct device *dev,
65*4882a593Smuzhiyun 				struct device_attribute *attr, char *buf)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	return scnprintf(buf, PAGE_SIZE, "%d\n", bl->id);
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
show_als_channel(struct device * dev,struct device_attribute * attr,char * buf)72*4882a593Smuzhiyun static ssize_t show_als_channel(struct device *dev,
73*4882a593Smuzhiyun 				struct device_attribute *attr, char *buf)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
76*4882a593Smuzhiyun 	unsigned channel = lm3533_bl_get_ctrlbank_id(bl);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	return scnprintf(buf, PAGE_SIZE, "%u\n", channel);
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
show_als_en(struct device * dev,struct device_attribute * attr,char * buf)81*4882a593Smuzhiyun static ssize_t show_als_en(struct device *dev,
82*4882a593Smuzhiyun 				struct device_attribute *attr, char *buf)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
85*4882a593Smuzhiyun 	int ctrlbank = lm3533_bl_get_ctrlbank_id(bl);
86*4882a593Smuzhiyun 	u8 val;
87*4882a593Smuzhiyun 	u8 mask;
88*4882a593Smuzhiyun 	bool enable;
89*4882a593Smuzhiyun 	int ret;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	ret = lm3533_read(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, &val);
92*4882a593Smuzhiyun 	if (ret)
93*4882a593Smuzhiyun 		return ret;
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	mask = 1 << (2 * ctrlbank);
96*4882a593Smuzhiyun 	enable = val & mask;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	return scnprintf(buf, PAGE_SIZE, "%d\n", enable);
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun 
store_als_en(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)101*4882a593Smuzhiyun static ssize_t store_als_en(struct device *dev,
102*4882a593Smuzhiyun 					struct device_attribute *attr,
103*4882a593Smuzhiyun 					const char *buf, size_t len)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
106*4882a593Smuzhiyun 	int ctrlbank = lm3533_bl_get_ctrlbank_id(bl);
107*4882a593Smuzhiyun 	int enable;
108*4882a593Smuzhiyun 	u8 val;
109*4882a593Smuzhiyun 	u8 mask;
110*4882a593Smuzhiyun 	int ret;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	if (kstrtoint(buf, 0, &enable))
113*4882a593Smuzhiyun 		return -EINVAL;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	mask = 1 << (2 * ctrlbank);
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	if (enable)
118*4882a593Smuzhiyun 		val = mask;
119*4882a593Smuzhiyun 	else
120*4882a593Smuzhiyun 		val = 0;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	ret = lm3533_update(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, val,
123*4882a593Smuzhiyun 									mask);
124*4882a593Smuzhiyun 	if (ret)
125*4882a593Smuzhiyun 		return ret;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	return len;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
show_linear(struct device * dev,struct device_attribute * attr,char * buf)130*4882a593Smuzhiyun static ssize_t show_linear(struct device *dev,
131*4882a593Smuzhiyun 				struct device_attribute *attr, char *buf)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
134*4882a593Smuzhiyun 	u8 val;
135*4882a593Smuzhiyun 	u8 mask;
136*4882a593Smuzhiyun 	int linear;
137*4882a593Smuzhiyun 	int ret;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	ret = lm3533_read(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, &val);
140*4882a593Smuzhiyun 	if (ret)
141*4882a593Smuzhiyun 		return ret;
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	mask = 1 << (2 * lm3533_bl_get_ctrlbank_id(bl) + 1);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	if (val & mask)
146*4882a593Smuzhiyun 		linear = 1;
147*4882a593Smuzhiyun 	else
148*4882a593Smuzhiyun 		linear = 0;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	return scnprintf(buf, PAGE_SIZE, "%x\n", linear);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun 
store_linear(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)153*4882a593Smuzhiyun static ssize_t store_linear(struct device *dev,
154*4882a593Smuzhiyun 					struct device_attribute *attr,
155*4882a593Smuzhiyun 					const char *buf, size_t len)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
158*4882a593Smuzhiyun 	unsigned long linear;
159*4882a593Smuzhiyun 	u8 mask;
160*4882a593Smuzhiyun 	u8 val;
161*4882a593Smuzhiyun 	int ret;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	if (kstrtoul(buf, 0, &linear))
164*4882a593Smuzhiyun 		return -EINVAL;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	mask = 1 << (2 * lm3533_bl_get_ctrlbank_id(bl) + 1);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	if (linear)
169*4882a593Smuzhiyun 		val = mask;
170*4882a593Smuzhiyun 	else
171*4882a593Smuzhiyun 		val = 0;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	ret = lm3533_update(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, val,
174*4882a593Smuzhiyun 									mask);
175*4882a593Smuzhiyun 	if (ret)
176*4882a593Smuzhiyun 		return ret;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	return len;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
show_pwm(struct device * dev,struct device_attribute * attr,char * buf)181*4882a593Smuzhiyun static ssize_t show_pwm(struct device *dev,
182*4882a593Smuzhiyun 					struct device_attribute *attr,
183*4882a593Smuzhiyun 					char *buf)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
186*4882a593Smuzhiyun 	u8 val;
187*4882a593Smuzhiyun 	int ret;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	ret = lm3533_ctrlbank_get_pwm(&bl->cb, &val);
190*4882a593Smuzhiyun 	if (ret)
191*4882a593Smuzhiyun 		return ret;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	return scnprintf(buf, PAGE_SIZE, "%u\n", val);
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun 
store_pwm(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)196*4882a593Smuzhiyun static ssize_t store_pwm(struct device *dev,
197*4882a593Smuzhiyun 					struct device_attribute *attr,
198*4882a593Smuzhiyun 					const char *buf, size_t len)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
201*4882a593Smuzhiyun 	u8 val;
202*4882a593Smuzhiyun 	int ret;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	if (kstrtou8(buf, 0, &val))
205*4882a593Smuzhiyun 		return -EINVAL;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	ret = lm3533_ctrlbank_set_pwm(&bl->cb, val);
208*4882a593Smuzhiyun 	if (ret)
209*4882a593Smuzhiyun 		return ret;
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	return len;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun static LM3533_ATTR_RO(als_channel);
215*4882a593Smuzhiyun static LM3533_ATTR_RW(als_en);
216*4882a593Smuzhiyun static LM3533_ATTR_RO(id);
217*4882a593Smuzhiyun static LM3533_ATTR_RW(linear);
218*4882a593Smuzhiyun static LM3533_ATTR_RW(pwm);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun static struct attribute *lm3533_bl_attributes[] = {
221*4882a593Smuzhiyun 	&dev_attr_als_channel.attr,
222*4882a593Smuzhiyun 	&dev_attr_als_en.attr,
223*4882a593Smuzhiyun 	&dev_attr_id.attr,
224*4882a593Smuzhiyun 	&dev_attr_linear.attr,
225*4882a593Smuzhiyun 	&dev_attr_pwm.attr,
226*4882a593Smuzhiyun 	NULL,
227*4882a593Smuzhiyun };
228*4882a593Smuzhiyun 
lm3533_bl_attr_is_visible(struct kobject * kobj,struct attribute * attr,int n)229*4882a593Smuzhiyun static umode_t lm3533_bl_attr_is_visible(struct kobject *kobj,
230*4882a593Smuzhiyun 					     struct attribute *attr, int n)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun 	struct device *dev = kobj_to_dev(kobj);
233*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
234*4882a593Smuzhiyun 	umode_t mode = attr->mode;
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	if (attr == &dev_attr_als_channel.attr ||
237*4882a593Smuzhiyun 					attr == &dev_attr_als_en.attr) {
238*4882a593Smuzhiyun 		if (!bl->lm3533->have_als)
239*4882a593Smuzhiyun 			mode = 0;
240*4882a593Smuzhiyun 	}
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	return mode;
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun static struct attribute_group lm3533_bl_attribute_group = {
246*4882a593Smuzhiyun 	.is_visible	= lm3533_bl_attr_is_visible,
247*4882a593Smuzhiyun 	.attrs		= lm3533_bl_attributes
248*4882a593Smuzhiyun };
249*4882a593Smuzhiyun 
lm3533_bl_setup(struct lm3533_bl * bl,struct lm3533_bl_platform_data * pdata)250*4882a593Smuzhiyun static int lm3533_bl_setup(struct lm3533_bl *bl,
251*4882a593Smuzhiyun 					struct lm3533_bl_platform_data *pdata)
252*4882a593Smuzhiyun {
253*4882a593Smuzhiyun 	int ret;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	ret = lm3533_ctrlbank_set_max_current(&bl->cb, pdata->max_current);
256*4882a593Smuzhiyun 	if (ret)
257*4882a593Smuzhiyun 		return ret;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	return lm3533_ctrlbank_set_pwm(&bl->cb, pdata->pwm);
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun 
lm3533_bl_probe(struct platform_device * pdev)262*4882a593Smuzhiyun static int lm3533_bl_probe(struct platform_device *pdev)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun 	struct lm3533 *lm3533;
265*4882a593Smuzhiyun 	struct lm3533_bl_platform_data *pdata;
266*4882a593Smuzhiyun 	struct lm3533_bl *bl;
267*4882a593Smuzhiyun 	struct backlight_device *bd;
268*4882a593Smuzhiyun 	struct backlight_properties props;
269*4882a593Smuzhiyun 	int ret;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	dev_dbg(&pdev->dev, "%s\n", __func__);
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	lm3533 = dev_get_drvdata(pdev->dev.parent);
274*4882a593Smuzhiyun 	if (!lm3533)
275*4882a593Smuzhiyun 		return -EINVAL;
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	pdata = dev_get_platdata(&pdev->dev);
278*4882a593Smuzhiyun 	if (!pdata) {
279*4882a593Smuzhiyun 		dev_err(&pdev->dev, "no platform data\n");
280*4882a593Smuzhiyun 		return -EINVAL;
281*4882a593Smuzhiyun 	}
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	if (pdev->id < 0 || pdev->id >= LM3533_HVCTRLBANK_COUNT) {
284*4882a593Smuzhiyun 		dev_err(&pdev->dev, "illegal backlight id %d\n", pdev->id);
285*4882a593Smuzhiyun 		return -EINVAL;
286*4882a593Smuzhiyun 	}
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	bl = devm_kzalloc(&pdev->dev, sizeof(*bl), GFP_KERNEL);
289*4882a593Smuzhiyun 	if (!bl)
290*4882a593Smuzhiyun 		return -ENOMEM;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	bl->lm3533 = lm3533;
293*4882a593Smuzhiyun 	bl->id = pdev->id;
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 	bl->cb.lm3533 = lm3533;
296*4882a593Smuzhiyun 	bl->cb.id = lm3533_bl_get_ctrlbank_id(bl);
297*4882a593Smuzhiyun 	bl->cb.dev = NULL;			/* until registered */
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	memset(&props, 0, sizeof(props));
300*4882a593Smuzhiyun 	props.type = BACKLIGHT_RAW;
301*4882a593Smuzhiyun 	props.max_brightness = LM3533_BL_MAX_BRIGHTNESS;
302*4882a593Smuzhiyun 	props.brightness = pdata->default_brightness;
303*4882a593Smuzhiyun 	bd = devm_backlight_device_register(&pdev->dev, pdata->name,
304*4882a593Smuzhiyun 					pdev->dev.parent, bl, &lm3533_bl_ops,
305*4882a593Smuzhiyun 					&props);
306*4882a593Smuzhiyun 	if (IS_ERR(bd)) {
307*4882a593Smuzhiyun 		dev_err(&pdev->dev, "failed to register backlight device\n");
308*4882a593Smuzhiyun 		return PTR_ERR(bd);
309*4882a593Smuzhiyun 	}
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	bl->bd = bd;
312*4882a593Smuzhiyun 	bl->cb.dev = &bl->bd->dev;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	platform_set_drvdata(pdev, bl);
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	ret = sysfs_create_group(&bd->dev.kobj, &lm3533_bl_attribute_group);
317*4882a593Smuzhiyun 	if (ret < 0) {
318*4882a593Smuzhiyun 		dev_err(&pdev->dev, "failed to create sysfs attributes\n");
319*4882a593Smuzhiyun 		return ret;
320*4882a593Smuzhiyun 	}
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	backlight_update_status(bd);
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	ret = lm3533_bl_setup(bl, pdata);
325*4882a593Smuzhiyun 	if (ret)
326*4882a593Smuzhiyun 		goto err_sysfs_remove;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	ret = lm3533_ctrlbank_enable(&bl->cb);
329*4882a593Smuzhiyun 	if (ret)
330*4882a593Smuzhiyun 		goto err_sysfs_remove;
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	return 0;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun err_sysfs_remove:
335*4882a593Smuzhiyun 	sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group);
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun 	return ret;
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
lm3533_bl_remove(struct platform_device * pdev)340*4882a593Smuzhiyun static int lm3533_bl_remove(struct platform_device *pdev)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun 	struct lm3533_bl *bl = platform_get_drvdata(pdev);
343*4882a593Smuzhiyun 	struct backlight_device *bd = bl->bd;
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	dev_dbg(&bd->dev, "%s\n", __func__);
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	bd->props.power = FB_BLANK_POWERDOWN;
348*4882a593Smuzhiyun 	bd->props.brightness = 0;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun 	lm3533_ctrlbank_disable(&bl->cb);
351*4882a593Smuzhiyun 	sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group);
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 	return 0;
354*4882a593Smuzhiyun }
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
lm3533_bl_suspend(struct device * dev)357*4882a593Smuzhiyun static int lm3533_bl_suspend(struct device *dev)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	dev_dbg(dev, "%s\n", __func__);
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	return lm3533_ctrlbank_disable(&bl->cb);
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun 
lm3533_bl_resume(struct device * dev)366*4882a593Smuzhiyun static int lm3533_bl_resume(struct device *dev)
367*4882a593Smuzhiyun {
368*4882a593Smuzhiyun 	struct lm3533_bl *bl = dev_get_drvdata(dev);
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun 	dev_dbg(dev, "%s\n", __func__);
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 	return lm3533_ctrlbank_enable(&bl->cb);
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun #endif
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(lm3533_bl_pm_ops, lm3533_bl_suspend, lm3533_bl_resume);
377*4882a593Smuzhiyun 
lm3533_bl_shutdown(struct platform_device * pdev)378*4882a593Smuzhiyun static void lm3533_bl_shutdown(struct platform_device *pdev)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun 	struct lm3533_bl *bl = platform_get_drvdata(pdev);
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	dev_dbg(&pdev->dev, "%s\n", __func__);
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	lm3533_ctrlbank_disable(&bl->cb);
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun static struct platform_driver lm3533_bl_driver = {
388*4882a593Smuzhiyun 	.driver = {
389*4882a593Smuzhiyun 		.name	= "lm3533-backlight",
390*4882a593Smuzhiyun 		.pm	= &lm3533_bl_pm_ops,
391*4882a593Smuzhiyun 	},
392*4882a593Smuzhiyun 	.probe		= lm3533_bl_probe,
393*4882a593Smuzhiyun 	.remove		= lm3533_bl_remove,
394*4882a593Smuzhiyun 	.shutdown	= lm3533_bl_shutdown,
395*4882a593Smuzhiyun };
396*4882a593Smuzhiyun module_platform_driver(lm3533_bl_driver);
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");
399*4882a593Smuzhiyun MODULE_DESCRIPTION("LM3533 Backlight driver");
400*4882a593Smuzhiyun MODULE_LICENSE("GPL");
401*4882a593Smuzhiyun MODULE_ALIAS("platform:lm3533-backlight");
402