xref: /openbmc/linux/drivers/media/i2c/adp1653.c (revision aac5987a)
1 /*
2  * drivers/media/i2c/adp1653.c
3  *
4  * Copyright (C) 2008--2011 Nokia Corporation
5  *
6  * Contact: Sakari Ailus <sakari.ailus@iki.fi>
7  *
8  * Contributors:
9  *	Sakari Ailus <sakari.ailus@iki.fi>
10  *	Tuukka Toivonen <tuukkat76@gmail.com>
11  *	Pavel Machek <pavel@ucw.cz>
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * version 2 as published by the Free Software Foundation.
16  *
17  * This program is distributed in the hope that it will be useful, but
18  * WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  * General Public License for more details.
21  *
22  * TODO:
23  * - fault interrupt handling
24  * - hardware strobe
25  * - power doesn't need to be ON if all lights are off
26  *
27  */
28 
29 #include <linux/delay.h>
30 #include <linux/module.h>
31 #include <linux/i2c.h>
32 #include <linux/slab.h>
33 #include <linux/of.h>
34 #include <linux/gpio/consumer.h>
35 #include <media/i2c/adp1653.h>
36 #include <media/v4l2-device.h>
37 
38 #define TIMEOUT_MAX		820000
39 #define TIMEOUT_STEP		54600
40 #define TIMEOUT_MIN		(TIMEOUT_MAX - ADP1653_REG_CONFIG_TMR_SET_MAX \
41 				 * TIMEOUT_STEP)
42 #define TIMEOUT_US_TO_CODE(t)	((TIMEOUT_MAX + (TIMEOUT_STEP / 2) - (t)) \
43 				 / TIMEOUT_STEP)
44 #define TIMEOUT_CODE_TO_US(c)	(TIMEOUT_MAX - (c) * TIMEOUT_STEP)
45 
46 /* Write values into ADP1653 registers. */
47 static int adp1653_update_hw(struct adp1653_flash *flash)
48 {
49 	struct i2c_client *client = v4l2_get_subdevdata(&flash->subdev);
50 	u8 out_sel;
51 	u8 config = 0;
52 	int rval;
53 
54 	out_sel = ADP1653_INDICATOR_INTENSITY_uA_TO_REG(
55 		flash->indicator_intensity->val)
56 		<< ADP1653_REG_OUT_SEL_ILED_SHIFT;
57 
58 	switch (flash->led_mode->val) {
59 	case V4L2_FLASH_LED_MODE_NONE:
60 		break;
61 	case V4L2_FLASH_LED_MODE_FLASH:
62 		/* Flash mode, light on with strobe, duration from timer */
63 		config = ADP1653_REG_CONFIG_TMR_CFG;
64 		config |= TIMEOUT_US_TO_CODE(flash->flash_timeout->val)
65 			  << ADP1653_REG_CONFIG_TMR_SET_SHIFT;
66 		break;
67 	case V4L2_FLASH_LED_MODE_TORCH:
68 		/* Torch mode, light immediately on, duration indefinite */
69 		out_sel |= ADP1653_FLASH_INTENSITY_mA_TO_REG(
70 			flash->torch_intensity->val)
71 			<< ADP1653_REG_OUT_SEL_HPLED_SHIFT;
72 		break;
73 	}
74 
75 	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL, out_sel);
76 	if (rval < 0)
77 		return rval;
78 
79 	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_CONFIG, config);
80 	if (rval < 0)
81 		return rval;
82 
83 	return 0;
84 }
85 
86 static int adp1653_get_fault(struct adp1653_flash *flash)
87 {
88 	struct i2c_client *client = v4l2_get_subdevdata(&flash->subdev);
89 	int fault;
90 	int rval;
91 
92 	fault = i2c_smbus_read_byte_data(client, ADP1653_REG_FAULT);
93 	if (fault < 0)
94 		return fault;
95 
96 	flash->fault |= fault;
97 
98 	if (!flash->fault)
99 		return 0;
100 
101 	/* Clear faults. */
102 	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL, 0);
103 	if (rval < 0)
104 		return rval;
105 
106 	flash->led_mode->val = V4L2_FLASH_LED_MODE_NONE;
107 
108 	rval = adp1653_update_hw(flash);
109 	if (rval)
110 		return rval;
111 
112 	return flash->fault;
113 }
114 
115 static int adp1653_strobe(struct adp1653_flash *flash, int enable)
116 {
117 	struct i2c_client *client = v4l2_get_subdevdata(&flash->subdev);
118 	u8 out_sel = ADP1653_INDICATOR_INTENSITY_uA_TO_REG(
119 		flash->indicator_intensity->val)
120 		<< ADP1653_REG_OUT_SEL_ILED_SHIFT;
121 	int rval;
122 
123 	if (flash->led_mode->val != V4L2_FLASH_LED_MODE_FLASH)
124 		return -EBUSY;
125 
126 	if (!enable)
127 		return i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL,
128 						 out_sel);
129 
130 	out_sel |= ADP1653_FLASH_INTENSITY_mA_TO_REG(
131 		flash->flash_intensity->val)
132 		<< ADP1653_REG_OUT_SEL_HPLED_SHIFT;
133 	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL, out_sel);
134 	if (rval)
135 		return rval;
136 
137 	/* Software strobe using i2c */
138 	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_SW_STROBE,
139 		ADP1653_REG_SW_STROBE_SW_STROBE);
140 	if (rval)
141 		return rval;
142 	return i2c_smbus_write_byte_data(client, ADP1653_REG_SW_STROBE, 0);
143 }
144 
145 /* --------------------------------------------------------------------------
146  * V4L2 controls
147  */
148 
149 static int adp1653_get_ctrl(struct v4l2_ctrl *ctrl)
150 {
151 	struct adp1653_flash *flash =
152 		container_of(ctrl->handler, struct adp1653_flash, ctrls);
153 	int rval;
154 
155 	rval = adp1653_get_fault(flash);
156 	if (rval)
157 		return rval;
158 
159 	ctrl->cur.val = 0;
160 
161 	if (flash->fault & ADP1653_REG_FAULT_FLT_SCP)
162 		ctrl->cur.val |= V4L2_FLASH_FAULT_SHORT_CIRCUIT;
163 	if (flash->fault & ADP1653_REG_FAULT_FLT_OT)
164 		ctrl->cur.val |= V4L2_FLASH_FAULT_OVER_TEMPERATURE;
165 	if (flash->fault & ADP1653_REG_FAULT_FLT_TMR)
166 		ctrl->cur.val |= V4L2_FLASH_FAULT_TIMEOUT;
167 	if (flash->fault & ADP1653_REG_FAULT_FLT_OV)
168 		ctrl->cur.val |= V4L2_FLASH_FAULT_OVER_VOLTAGE;
169 
170 	flash->fault = 0;
171 
172 	return 0;
173 }
174 
175 static int adp1653_set_ctrl(struct v4l2_ctrl *ctrl)
176 {
177 	struct adp1653_flash *flash =
178 		container_of(ctrl->handler, struct adp1653_flash, ctrls);
179 	int rval;
180 
181 	rval = adp1653_get_fault(flash);
182 	if (rval)
183 		return rval;
184 	if ((rval & (ADP1653_REG_FAULT_FLT_SCP |
185 		     ADP1653_REG_FAULT_FLT_OT |
186 		     ADP1653_REG_FAULT_FLT_OV)) &&
187 	    (ctrl->id == V4L2_CID_FLASH_STROBE ||
188 	     ctrl->id == V4L2_CID_FLASH_TORCH_INTENSITY ||
189 	     ctrl->id == V4L2_CID_FLASH_LED_MODE))
190 		return -EBUSY;
191 
192 	switch (ctrl->id) {
193 	case V4L2_CID_FLASH_STROBE:
194 		return adp1653_strobe(flash, 1);
195 	case V4L2_CID_FLASH_STROBE_STOP:
196 		return adp1653_strobe(flash, 0);
197 	}
198 
199 	return adp1653_update_hw(flash);
200 }
201 
202 static const struct v4l2_ctrl_ops adp1653_ctrl_ops = {
203 	.g_volatile_ctrl = adp1653_get_ctrl,
204 	.s_ctrl = adp1653_set_ctrl,
205 };
206 
207 static int adp1653_init_controls(struct adp1653_flash *flash)
208 {
209 	struct v4l2_ctrl *fault;
210 
211 	v4l2_ctrl_handler_init(&flash->ctrls, 9);
212 
213 	flash->led_mode =
214 		v4l2_ctrl_new_std_menu(&flash->ctrls, &adp1653_ctrl_ops,
215 				       V4L2_CID_FLASH_LED_MODE,
216 				       V4L2_FLASH_LED_MODE_TORCH, ~0x7, 0);
217 	v4l2_ctrl_new_std_menu(&flash->ctrls, &adp1653_ctrl_ops,
218 			       V4L2_CID_FLASH_STROBE_SOURCE,
219 			       V4L2_FLASH_STROBE_SOURCE_SOFTWARE, ~0x1, 0);
220 	v4l2_ctrl_new_std(&flash->ctrls, &adp1653_ctrl_ops,
221 			  V4L2_CID_FLASH_STROBE, 0, 0, 0, 0);
222 	v4l2_ctrl_new_std(&flash->ctrls, &adp1653_ctrl_ops,
223 			  V4L2_CID_FLASH_STROBE_STOP, 0, 0, 0, 0);
224 	flash->flash_timeout =
225 		v4l2_ctrl_new_std(&flash->ctrls, &adp1653_ctrl_ops,
226 				  V4L2_CID_FLASH_TIMEOUT, TIMEOUT_MIN,
227 				  flash->platform_data->max_flash_timeout,
228 				  TIMEOUT_STEP,
229 				  flash->platform_data->max_flash_timeout);
230 	flash->flash_intensity =
231 		v4l2_ctrl_new_std(&flash->ctrls, &adp1653_ctrl_ops,
232 				  V4L2_CID_FLASH_INTENSITY,
233 				  ADP1653_FLASH_INTENSITY_MIN,
234 				  flash->platform_data->max_flash_intensity,
235 				  1, flash->platform_data->max_flash_intensity);
236 	flash->torch_intensity =
237 		v4l2_ctrl_new_std(&flash->ctrls, &adp1653_ctrl_ops,
238 				  V4L2_CID_FLASH_TORCH_INTENSITY,
239 				  ADP1653_TORCH_INTENSITY_MIN,
240 				  flash->platform_data->max_torch_intensity,
241 				  ADP1653_FLASH_INTENSITY_STEP,
242 				  flash->platform_data->max_torch_intensity);
243 	flash->indicator_intensity =
244 		v4l2_ctrl_new_std(&flash->ctrls, &adp1653_ctrl_ops,
245 				  V4L2_CID_FLASH_INDICATOR_INTENSITY,
246 				  ADP1653_INDICATOR_INTENSITY_MIN,
247 				  flash->platform_data->max_indicator_intensity,
248 				  ADP1653_INDICATOR_INTENSITY_STEP,
249 				  ADP1653_INDICATOR_INTENSITY_MIN);
250 	fault = v4l2_ctrl_new_std(&flash->ctrls, &adp1653_ctrl_ops,
251 				  V4L2_CID_FLASH_FAULT, 0,
252 				  V4L2_FLASH_FAULT_OVER_VOLTAGE
253 				  | V4L2_FLASH_FAULT_OVER_TEMPERATURE
254 				  | V4L2_FLASH_FAULT_SHORT_CIRCUIT, 0, 0);
255 
256 	if (flash->ctrls.error)
257 		return flash->ctrls.error;
258 
259 	fault->flags |= V4L2_CTRL_FLAG_VOLATILE;
260 
261 	flash->subdev.ctrl_handler = &flash->ctrls;
262 	return 0;
263 }
264 
265 /* --------------------------------------------------------------------------
266  * V4L2 subdev operations
267  */
268 
269 static int
270 adp1653_init_device(struct adp1653_flash *flash)
271 {
272 	struct i2c_client *client = v4l2_get_subdevdata(&flash->subdev);
273 	int rval;
274 
275 	/* Clear FAULT register by writing zero to OUT_SEL */
276 	rval = i2c_smbus_write_byte_data(client, ADP1653_REG_OUT_SEL, 0);
277 	if (rval < 0) {
278 		dev_err(&client->dev, "failed writing fault register\n");
279 		return -EIO;
280 	}
281 
282 	mutex_lock(flash->ctrls.lock);
283 	/* Reset faults before reading new ones. */
284 	flash->fault = 0;
285 	rval = adp1653_get_fault(flash);
286 	mutex_unlock(flash->ctrls.lock);
287 	if (rval > 0) {
288 		dev_err(&client->dev, "faults detected: 0x%1.1x\n", rval);
289 		return -EIO;
290 	}
291 
292 	mutex_lock(flash->ctrls.lock);
293 	rval = adp1653_update_hw(flash);
294 	mutex_unlock(flash->ctrls.lock);
295 	if (rval) {
296 		dev_err(&client->dev,
297 			"adp1653_update_hw failed at %s\n", __func__);
298 		return -EIO;
299 	}
300 
301 	return 0;
302 }
303 
304 static int
305 __adp1653_set_power(struct adp1653_flash *flash, int on)
306 {
307 	int ret;
308 
309 	if (flash->platform_data->power) {
310 		ret = flash->platform_data->power(&flash->subdev, on);
311 		if (ret < 0)
312 			return ret;
313 	} else {
314 		gpiod_set_value(flash->platform_data->enable_gpio, on);
315 		if (on)
316 			/* Some delay is apparently required. */
317 			udelay(20);
318 	}
319 
320 	if (!on)
321 		return 0;
322 
323 	ret = adp1653_init_device(flash);
324 	if (ret >= 0)
325 		return ret;
326 
327 	if (flash->platform_data->power)
328 		flash->platform_data->power(&flash->subdev, 0);
329 	else
330 		gpiod_set_value(flash->platform_data->enable_gpio, 0);
331 
332 	return ret;
333 }
334 
335 static int
336 adp1653_set_power(struct v4l2_subdev *subdev, int on)
337 {
338 	struct adp1653_flash *flash = to_adp1653_flash(subdev);
339 	int ret = 0;
340 
341 	mutex_lock(&flash->power_lock);
342 
343 	/* If the power count is modified from 0 to != 0 or from != 0 to 0,
344 	 * update the power state.
345 	 */
346 	if (flash->power_count == !on) {
347 		ret = __adp1653_set_power(flash, !!on);
348 		if (ret < 0)
349 			goto done;
350 	}
351 
352 	/* Update the power count. */
353 	flash->power_count += on ? 1 : -1;
354 	WARN_ON(flash->power_count < 0);
355 
356 done:
357 	mutex_unlock(&flash->power_lock);
358 	return ret;
359 }
360 
361 static int adp1653_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
362 {
363 	return adp1653_set_power(sd, 1);
364 }
365 
366 static int adp1653_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
367 {
368 	return adp1653_set_power(sd, 0);
369 }
370 
371 static const struct v4l2_subdev_core_ops adp1653_core_ops = {
372 	.s_power = adp1653_set_power,
373 };
374 
375 static const struct v4l2_subdev_ops adp1653_ops = {
376 	.core = &adp1653_core_ops,
377 };
378 
379 static const struct v4l2_subdev_internal_ops adp1653_internal_ops = {
380 	.open = adp1653_open,
381 	.close = adp1653_close,
382 };
383 
384 /* --------------------------------------------------------------------------
385  * I2C driver
386  */
387 #ifdef CONFIG_PM
388 
389 static int adp1653_suspend(struct device *dev)
390 {
391 	struct i2c_client *client = to_i2c_client(dev);
392 	struct v4l2_subdev *subdev = i2c_get_clientdata(client);
393 	struct adp1653_flash *flash = to_adp1653_flash(subdev);
394 
395 	if (!flash->power_count)
396 		return 0;
397 
398 	return __adp1653_set_power(flash, 0);
399 }
400 
401 static int adp1653_resume(struct device *dev)
402 {
403 	struct i2c_client *client = to_i2c_client(dev);
404 	struct v4l2_subdev *subdev = i2c_get_clientdata(client);
405 	struct adp1653_flash *flash = to_adp1653_flash(subdev);
406 
407 	if (!flash->power_count)
408 		return 0;
409 
410 	return __adp1653_set_power(flash, 1);
411 }
412 
413 #else
414 
415 #define adp1653_suspend	NULL
416 #define adp1653_resume	NULL
417 
418 #endif /* CONFIG_PM */
419 
420 static int adp1653_of_init(struct i2c_client *client,
421 			   struct adp1653_flash *flash,
422 			   struct device_node *node)
423 {
424 	struct adp1653_platform_data *pd;
425 	struct device_node *child;
426 
427 	pd = devm_kzalloc(&client->dev, sizeof(*pd), GFP_KERNEL);
428 	if (!pd)
429 		return -ENOMEM;
430 	flash->platform_data = pd;
431 
432 	child = of_get_child_by_name(node, "flash");
433 	if (!child)
434 		return -EINVAL;
435 
436 	if (of_property_read_u32(child, "flash-timeout-us",
437 				 &pd->max_flash_timeout))
438 		goto err;
439 
440 	if (of_property_read_u32(child, "flash-max-microamp",
441 				 &pd->max_flash_intensity))
442 		goto err;
443 
444 	pd->max_flash_intensity /= 1000;
445 
446 	if (of_property_read_u32(child, "led-max-microamp",
447 				 &pd->max_torch_intensity))
448 		goto err;
449 
450 	pd->max_torch_intensity /= 1000;
451 	of_node_put(child);
452 
453 	child = of_get_child_by_name(node, "indicator");
454 	if (!child)
455 		return -EINVAL;
456 
457 	if (of_property_read_u32(child, "led-max-microamp",
458 				 &pd->max_indicator_intensity))
459 		goto err;
460 
461 	of_node_put(child);
462 
463 	pd->enable_gpio = devm_gpiod_get(&client->dev, "enable", GPIOD_OUT_LOW);
464 	if (IS_ERR(pd->enable_gpio)) {
465 		dev_err(&client->dev, "Error getting GPIO\n");
466 		return PTR_ERR(pd->enable_gpio);
467 	}
468 
469 	return 0;
470 err:
471 	dev_err(&client->dev, "Required property not found\n");
472 	of_node_put(child);
473 	return -EINVAL;
474 }
475 
476 
477 static int adp1653_probe(struct i2c_client *client,
478 			 const struct i2c_device_id *devid)
479 {
480 	struct adp1653_flash *flash;
481 	int ret;
482 
483 	flash = devm_kzalloc(&client->dev, sizeof(*flash), GFP_KERNEL);
484 	if (flash == NULL)
485 		return -ENOMEM;
486 
487 	if (client->dev.of_node) {
488 		ret = adp1653_of_init(client, flash, client->dev.of_node);
489 		if (ret)
490 			return ret;
491 	} else {
492 		if (!client->dev.platform_data) {
493 			dev_err(&client->dev,
494 				"Neither DT not platform data provided\n");
495 			return -EINVAL;
496 		}
497 		flash->platform_data = client->dev.platform_data;
498 	}
499 
500 	mutex_init(&flash->power_lock);
501 
502 	v4l2_i2c_subdev_init(&flash->subdev, client, &adp1653_ops);
503 	flash->subdev.internal_ops = &adp1653_internal_ops;
504 	flash->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
505 
506 	ret = adp1653_init_controls(flash);
507 	if (ret)
508 		goto free_and_quit;
509 
510 	ret = media_entity_pads_init(&flash->subdev.entity, 0, NULL);
511 	if (ret < 0)
512 		goto free_and_quit;
513 
514 	flash->subdev.entity.function = MEDIA_ENT_F_FLASH;
515 
516 	return 0;
517 
518 free_and_quit:
519 	dev_err(&client->dev, "adp1653: failed to register device\n");
520 	v4l2_ctrl_handler_free(&flash->ctrls);
521 	return ret;
522 }
523 
524 static int adp1653_remove(struct i2c_client *client)
525 {
526 	struct v4l2_subdev *subdev = i2c_get_clientdata(client);
527 	struct adp1653_flash *flash = to_adp1653_flash(subdev);
528 
529 	v4l2_device_unregister_subdev(&flash->subdev);
530 	v4l2_ctrl_handler_free(&flash->ctrls);
531 	media_entity_cleanup(&flash->subdev.entity);
532 
533 	return 0;
534 }
535 
536 static const struct i2c_device_id adp1653_id_table[] = {
537 	{ ADP1653_NAME, 0 },
538 	{ }
539 };
540 MODULE_DEVICE_TABLE(i2c, adp1653_id_table);
541 
542 static const struct dev_pm_ops adp1653_pm_ops = {
543 	.suspend	= adp1653_suspend,
544 	.resume		= adp1653_resume,
545 };
546 
547 static struct i2c_driver adp1653_i2c_driver = {
548 	.driver		= {
549 		.name	= ADP1653_NAME,
550 		.pm	= &adp1653_pm_ops,
551 	},
552 	.probe		= adp1653_probe,
553 	.remove		= adp1653_remove,
554 	.id_table	= adp1653_id_table,
555 };
556 
557 module_i2c_driver(adp1653_i2c_driver);
558 
559 MODULE_AUTHOR("Sakari Ailus <sakari.ailus@nokia.com>");
560 MODULE_DESCRIPTION("Analog Devices ADP1653 LED flash driver");
561 MODULE_LICENSE("GPL");
562