2 * drivers/media/i2c/lm3560.c
3 * General device driver for TI lm3559, lm3560, FLASH LED Driver
5 * Copyright (C) 2013 Texas Instruments
7 * Contact: Daniel Jeong <gshark.jeong@gmail.com>
8 * Ldd-Mlp <ldd-mlp@list.ti.com>
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * version 2 as published by the Free Software Foundation.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
20 #include <linux/delay.h>
21 #include <linux/module.h>
22 #include <linux/i2c.h>
23 #include <linux/slab.h>
24 #include <linux/mutex.h>
25 #include <linux/regmap.h>
26 #include <linux/videodev2.h>
27 #include <media/i2c/lm3560.h>
28 #include <media/v4l2-ctrls.h>
29 #include <media/v4l2-device.h>
31 /* registers definitions */
32 #define REG_ENABLE 0x10
33 #define REG_TORCH_BR 0xa0
34 #define REG_FLASH_BR 0xb0
35 #define REG_FLASH_TOUT 0xc0
37 #define REG_CONFIG1 0xe0
40 #define FAULT_TIMEOUT (1<<0)
41 #define FAULT_OVERTEMP (1<<1)
42 #define FAULT_SHORT_CIRCUIT (1<<2)
53 * @dev: pointer to &struct device
54 * @pdata: platform data
55 * @regmap: reg. map for i2c
56 * @lock: muxtex for serial access.
57 * @led_mode: V4L2 LED mode
58 * @ctrls_led: V4L2 contols
59 * @subdev_led: V4L2 subdev
63 struct lm3560_platform_data
*pdata
;
64 struct regmap
*regmap
;
67 enum v4l2_flash_led_mode led_mode
;
68 struct v4l2_ctrl_handler ctrls_led
[LM3560_LED_MAX
];
69 struct v4l2_subdev subdev_led
[LM3560_LED_MAX
];
72 #define to_lm3560_flash(_ctrl, _no) \
73 container_of(_ctrl->handler, struct lm3560_flash, ctrls_led[_no])
75 /* enable mode control */
76 static int lm3560_mode_ctrl(struct lm3560_flash
*flash
)
80 switch (flash
->led_mode
) {
81 case V4L2_FLASH_LED_MODE_NONE
:
82 rval
= regmap_update_bits(flash
->regmap
,
83 REG_ENABLE
, 0x03, MODE_SHDN
);
85 case V4L2_FLASH_LED_MODE_TORCH
:
86 rval
= regmap_update_bits(flash
->regmap
,
87 REG_ENABLE
, 0x03, MODE_TORCH
);
89 case V4L2_FLASH_LED_MODE_FLASH
:
90 rval
= regmap_update_bits(flash
->regmap
,
91 REG_ENABLE
, 0x03, MODE_FLASH
);
97 /* led1/2 enable/disable */
98 static int lm3560_enable_ctrl(struct lm3560_flash
*flash
,
99 enum lm3560_led_id led_no
, bool on
)
103 if (led_no
== LM3560_LED0
) {
105 rval
= regmap_update_bits(flash
->regmap
,
106 REG_ENABLE
, 0x08, 0x08);
108 rval
= regmap_update_bits(flash
->regmap
,
109 REG_ENABLE
, 0x08, 0x00);
112 rval
= regmap_update_bits(flash
->regmap
,
113 REG_ENABLE
, 0x10, 0x10);
115 rval
= regmap_update_bits(flash
->regmap
,
116 REG_ENABLE
, 0x10, 0x00);
121 /* torch1/2 brightness control */
122 static int lm3560_torch_brt_ctrl(struct lm3560_flash
*flash
,
123 enum lm3560_led_id led_no
, unsigned int brt
)
128 if (brt
< LM3560_TORCH_BRT_MIN
)
129 return lm3560_enable_ctrl(flash
, led_no
, false);
131 rval
= lm3560_enable_ctrl(flash
, led_no
, true);
133 br_bits
= LM3560_TORCH_BRT_uA_TO_REG(brt
);
134 if (led_no
== LM3560_LED0
)
135 rval
= regmap_update_bits(flash
->regmap
,
136 REG_TORCH_BR
, 0x07, br_bits
);
138 rval
= regmap_update_bits(flash
->regmap
,
139 REG_TORCH_BR
, 0x38, br_bits
<< 3);
144 /* flash1/2 brightness control */
145 static int lm3560_flash_brt_ctrl(struct lm3560_flash
*flash
,
146 enum lm3560_led_id led_no
, unsigned int brt
)
151 if (brt
< LM3560_FLASH_BRT_MIN
)
152 return lm3560_enable_ctrl(flash
, led_no
, false);
154 rval
= lm3560_enable_ctrl(flash
, led_no
, true);
156 br_bits
= LM3560_FLASH_BRT_uA_TO_REG(brt
);
157 if (led_no
== LM3560_LED0
)
158 rval
= regmap_update_bits(flash
->regmap
,
159 REG_FLASH_BR
, 0x0f, br_bits
);
161 rval
= regmap_update_bits(flash
->regmap
,
162 REG_FLASH_BR
, 0xf0, br_bits
<< 4);
168 static int lm3560_get_ctrl(struct v4l2_ctrl
*ctrl
, enum lm3560_led_id led_no
)
170 struct lm3560_flash
*flash
= to_lm3560_flash(ctrl
, led_no
);
173 mutex_lock(&flash
->lock
);
175 if (ctrl
->id
== V4L2_CID_FLASH_FAULT
) {
177 unsigned int reg_val
;
178 rval
= regmap_read(flash
->regmap
, REG_FLAG
, ®_val
);
181 if (reg_val
& FAULT_SHORT_CIRCUIT
)
182 fault
|= V4L2_FLASH_FAULT_SHORT_CIRCUIT
;
183 if (reg_val
& FAULT_OVERTEMP
)
184 fault
|= V4L2_FLASH_FAULT_OVER_TEMPERATURE
;
185 if (reg_val
& FAULT_TIMEOUT
)
186 fault
|= V4L2_FLASH_FAULT_TIMEOUT
;
187 ctrl
->cur
.val
= fault
;
191 mutex_unlock(&flash
->lock
);
195 static int lm3560_set_ctrl(struct v4l2_ctrl
*ctrl
, enum lm3560_led_id led_no
)
197 struct lm3560_flash
*flash
= to_lm3560_flash(ctrl
, led_no
);
201 mutex_lock(&flash
->lock
);
204 case V4L2_CID_FLASH_LED_MODE
:
205 flash
->led_mode
= ctrl
->val
;
206 if (flash
->led_mode
!= V4L2_FLASH_LED_MODE_FLASH
)
207 rval
= lm3560_mode_ctrl(flash
);
210 case V4L2_CID_FLASH_STROBE_SOURCE
:
211 rval
= regmap_update_bits(flash
->regmap
,
212 REG_CONFIG1
, 0x04, (ctrl
->val
) << 2);
217 case V4L2_CID_FLASH_STROBE
:
218 if (flash
->led_mode
!= V4L2_FLASH_LED_MODE_FLASH
) {
222 flash
->led_mode
= V4L2_FLASH_LED_MODE_FLASH
;
223 rval
= lm3560_mode_ctrl(flash
);
226 case V4L2_CID_FLASH_STROBE_STOP
:
227 if (flash
->led_mode
!= V4L2_FLASH_LED_MODE_FLASH
) {
231 flash
->led_mode
= V4L2_FLASH_LED_MODE_NONE
;
232 rval
= lm3560_mode_ctrl(flash
);
235 case V4L2_CID_FLASH_TIMEOUT
:
236 tout_bits
= LM3560_FLASH_TOUT_ms_TO_REG(ctrl
->val
);
237 rval
= regmap_update_bits(flash
->regmap
,
238 REG_FLASH_TOUT
, 0x1f, tout_bits
);
241 case V4L2_CID_FLASH_INTENSITY
:
242 rval
= lm3560_flash_brt_ctrl(flash
, led_no
, ctrl
->val
);
245 case V4L2_CID_FLASH_TORCH_INTENSITY
:
246 rval
= lm3560_torch_brt_ctrl(flash
, led_no
, ctrl
->val
);
251 mutex_unlock(&flash
->lock
);
255 static int lm3560_led1_get_ctrl(struct v4l2_ctrl
*ctrl
)
257 return lm3560_get_ctrl(ctrl
, LM3560_LED1
);
260 static int lm3560_led1_set_ctrl(struct v4l2_ctrl
*ctrl
)
262 return lm3560_set_ctrl(ctrl
, LM3560_LED1
);
265 static int lm3560_led0_get_ctrl(struct v4l2_ctrl
*ctrl
)
267 return lm3560_get_ctrl(ctrl
, LM3560_LED0
);
270 static int lm3560_led0_set_ctrl(struct v4l2_ctrl
*ctrl
)
272 return lm3560_set_ctrl(ctrl
, LM3560_LED0
);
275 static const struct v4l2_ctrl_ops lm3560_led_ctrl_ops
[LM3560_LED_MAX
] = {
277 .g_volatile_ctrl
= lm3560_led0_get_ctrl
,
278 .s_ctrl
= lm3560_led0_set_ctrl
,
281 .g_volatile_ctrl
= lm3560_led1_get_ctrl
,
282 .s_ctrl
= lm3560_led1_set_ctrl
,
286 static int lm3560_init_controls(struct lm3560_flash
*flash
,
287 enum lm3560_led_id led_no
)
289 struct v4l2_ctrl
*fault
;
290 u32 max_flash_brt
= flash
->pdata
->max_flash_brt
[led_no
];
291 u32 max_torch_brt
= flash
->pdata
->max_torch_brt
[led_no
];
292 struct v4l2_ctrl_handler
*hdl
= &flash
->ctrls_led
[led_no
];
293 const struct v4l2_ctrl_ops
*ops
= &lm3560_led_ctrl_ops
[led_no
];
295 v4l2_ctrl_handler_init(hdl
, 8);
298 v4l2_ctrl_new_std_menu(hdl
, ops
, V4L2_CID_FLASH_LED_MODE
,
299 V4L2_FLASH_LED_MODE_TORCH
, ~0x7,
300 V4L2_FLASH_LED_MODE_NONE
);
301 flash
->led_mode
= V4L2_FLASH_LED_MODE_NONE
;
304 v4l2_ctrl_new_std_menu(hdl
, ops
, V4L2_CID_FLASH_STROBE_SOURCE
,
305 0x1, ~0x3, V4L2_FLASH_STROBE_SOURCE_SOFTWARE
);
308 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_STROBE
, 0, 0, 0, 0);
310 /* flash strobe stop */
311 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_STROBE_STOP
, 0, 0, 0, 0);
313 /* flash strobe timeout */
314 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_TIMEOUT
,
315 LM3560_FLASH_TOUT_MIN
,
316 flash
->pdata
->max_flash_timeout
,
317 LM3560_FLASH_TOUT_STEP
,
318 flash
->pdata
->max_flash_timeout
);
321 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_INTENSITY
,
322 LM3560_FLASH_BRT_MIN
, max_flash_brt
,
323 LM3560_FLASH_BRT_STEP
, max_flash_brt
);
326 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_TORCH_INTENSITY
,
327 LM3560_TORCH_BRT_MIN
, max_torch_brt
,
328 LM3560_TORCH_BRT_STEP
, max_torch_brt
);
331 fault
= v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_FAULT
, 0,
332 V4L2_FLASH_FAULT_OVER_VOLTAGE
333 | V4L2_FLASH_FAULT_OVER_TEMPERATURE
334 | V4L2_FLASH_FAULT_SHORT_CIRCUIT
335 | V4L2_FLASH_FAULT_TIMEOUT
, 0, 0);
337 fault
->flags
|= V4L2_CTRL_FLAG_VOLATILE
;
342 flash
->subdev_led
[led_no
].ctrl_handler
= hdl
;
346 /* initialize device */
347 static const struct v4l2_subdev_ops lm3560_ops
= {
351 static const struct regmap_config lm3560_regmap
= {
354 .max_register
= 0xFF,
357 static int lm3560_subdev_init(struct lm3560_flash
*flash
,
358 enum lm3560_led_id led_no
, char *led_name
)
360 struct i2c_client
*client
= to_i2c_client(flash
->dev
);
363 v4l2_i2c_subdev_init(&flash
->subdev_led
[led_no
], client
, &lm3560_ops
);
364 flash
->subdev_led
[led_no
].flags
|= V4L2_SUBDEV_FL_HAS_DEVNODE
;
365 strcpy(flash
->subdev_led
[led_no
].name
, led_name
);
366 rval
= lm3560_init_controls(flash
, led_no
);
369 rval
= media_entity_pads_init(&flash
->subdev_led
[led_no
].entity
, 0, NULL
);
372 flash
->subdev_led
[led_no
].entity
.function
= MEDIA_ENT_F_FLASH
;
377 v4l2_ctrl_handler_free(&flash
->ctrls_led
[led_no
]);
381 static int lm3560_init_device(struct lm3560_flash
*flash
)
384 unsigned int reg_val
;
386 /* set peak current */
387 rval
= regmap_update_bits(flash
->regmap
,
388 REG_FLASH_TOUT
, 0x60, flash
->pdata
->peak
);
392 flash
->led_mode
= V4L2_FLASH_LED_MODE_NONE
;
393 rval
= lm3560_mode_ctrl(flash
);
397 rval
= regmap_read(flash
->regmap
, REG_FLAG
, ®_val
);
401 static int lm3560_probe(struct i2c_client
*client
,
402 const struct i2c_device_id
*devid
)
404 struct lm3560_flash
*flash
;
405 struct lm3560_platform_data
*pdata
= dev_get_platdata(&client
->dev
);
408 flash
= devm_kzalloc(&client
->dev
, sizeof(*flash
), GFP_KERNEL
);
412 flash
->regmap
= devm_regmap_init_i2c(client
, &lm3560_regmap
);
413 if (IS_ERR(flash
->regmap
)) {
414 rval
= PTR_ERR(flash
->regmap
);
418 /* if there is no platform data, use chip default value */
420 pdata
= devm_kzalloc(&client
->dev
, sizeof(*pdata
), GFP_KERNEL
);
423 pdata
->peak
= LM3560_PEAK_3600mA
;
424 pdata
->max_flash_timeout
= LM3560_FLASH_TOUT_MAX
;
426 pdata
->max_flash_brt
[LM3560_LED0
] = LM3560_FLASH_BRT_MAX
;
427 pdata
->max_torch_brt
[LM3560_LED0
] = LM3560_TORCH_BRT_MAX
;
429 pdata
->max_flash_brt
[LM3560_LED1
] = LM3560_FLASH_BRT_MAX
;
430 pdata
->max_torch_brt
[LM3560_LED1
] = LM3560_TORCH_BRT_MAX
;
432 flash
->pdata
= pdata
;
433 flash
->dev
= &client
->dev
;
434 mutex_init(&flash
->lock
);
436 rval
= lm3560_subdev_init(flash
, LM3560_LED0
, "lm3560-led0");
440 rval
= lm3560_subdev_init(flash
, LM3560_LED1
, "lm3560-led1");
444 rval
= lm3560_init_device(flash
);
448 i2c_set_clientdata(client
, flash
);
453 static int lm3560_remove(struct i2c_client
*client
)
455 struct lm3560_flash
*flash
= i2c_get_clientdata(client
);
458 for (i
= LM3560_LED0
; i
< LM3560_LED_MAX
; i
++) {
459 v4l2_device_unregister_subdev(&flash
->subdev_led
[i
]);
460 v4l2_ctrl_handler_free(&flash
->ctrls_led
[i
]);
461 media_entity_cleanup(&flash
->subdev_led
[i
].entity
);
467 static const struct i2c_device_id lm3560_id_table
[] = {
473 MODULE_DEVICE_TABLE(i2c
, lm3560_id_table
);
475 static struct i2c_driver lm3560_i2c_driver
= {
480 .probe
= lm3560_probe
,
481 .remove
= lm3560_remove
,
482 .id_table
= lm3560_id_table
,
485 module_i2c_driver(lm3560_i2c_driver
);
487 MODULE_AUTHOR("Daniel Jeong <gshark.jeong@gmail.com>");
488 MODULE_AUTHOR("Ldd Mlp <ldd-mlp@list.ti.com>");
489 MODULE_DESCRIPTION("Texas Instruments LM3560 LED flash driver");
490 MODULE_LICENSE("GPL");