2 * drivers/media/i2c/lm3560.c
3 * General device driver for TI 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.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 #include <linux/delay.h>
27 #include <linux/module.h>
28 #include <linux/i2c.h>
29 #include <linux/slab.h>
30 #include <linux/mutex.h>
31 #include <linux/regmap.h>
32 #include <linux/videodev2.h>
33 #include <media/lm3560.h>
34 #include <media/v4l2-ctrls.h>
35 #include <media/v4l2-device.h>
37 /* registers definitions */
38 #define REG_ENABLE 0x10
39 #define REG_TORCH_BR 0xa0
40 #define REG_FLASH_BR 0xb0
41 #define REG_FLASH_TOUT 0xc0
43 #define REG_CONFIG1 0xe0
46 #define FAULT_TIMEOUT (1<<0)
47 #define FAULT_OVERTEMP (1<<1)
48 #define FAULT_SHORT_CIRCUIT (1<<2)
56 /* struct lm3560_flash
58 * @pdata: platform data
59 * @regmap: reg. map for i2c
60 * @lock: muxtex for serial access.
61 * @led_mode: V4L2 LED mode
62 * @ctrls_led: V4L2 contols
63 * @subdev_led: V4L2 subdev
67 struct lm3560_platform_data
*pdata
;
68 struct regmap
*regmap
;
71 enum v4l2_flash_led_mode led_mode
;
72 struct v4l2_ctrl_handler ctrls_led
[LM3560_LED_MAX
];
73 struct v4l2_subdev subdev_led
[LM3560_LED_MAX
];
76 #define to_lm3560_flash(_ctrl, _no) \
77 container_of(_ctrl->handler, struct lm3560_flash, ctrls_led[_no])
79 /* enable mode control */
80 static int lm3560_mode_ctrl(struct lm3560_flash
*flash
)
84 switch (flash
->led_mode
) {
85 case V4L2_FLASH_LED_MODE_NONE
:
86 rval
= regmap_update_bits(flash
->regmap
,
87 REG_ENABLE
, 0x03, MODE_SHDN
);
89 case V4L2_FLASH_LED_MODE_TORCH
:
90 rval
= regmap_update_bits(flash
->regmap
,
91 REG_ENABLE
, 0x03, MODE_TORCH
);
93 case V4L2_FLASH_LED_MODE_FLASH
:
94 rval
= regmap_update_bits(flash
->regmap
,
95 REG_ENABLE
, 0x03, MODE_FLASH
);
101 /* led1/2 enable/disable */
102 static int lm3560_enable_ctrl(struct lm3560_flash
*flash
,
103 enum lm3560_led_id led_no
, bool on
)
107 if (led_no
== LM3560_LED0
) {
109 rval
= regmap_update_bits(flash
->regmap
,
110 REG_ENABLE
, 0x08, 0x08);
112 rval
= regmap_update_bits(flash
->regmap
,
113 REG_ENABLE
, 0x08, 0x00);
116 rval
= regmap_update_bits(flash
->regmap
,
117 REG_ENABLE
, 0x10, 0x10);
119 rval
= regmap_update_bits(flash
->regmap
,
120 REG_ENABLE
, 0x10, 0x00);
125 /* torch1/2 brightness control */
126 static int lm3560_torch_brt_ctrl(struct lm3560_flash
*flash
,
127 enum lm3560_led_id led_no
, unsigned int brt
)
132 if (brt
< LM3560_TORCH_BRT_MIN
)
133 return lm3560_enable_ctrl(flash
, led_no
, false);
135 rval
= lm3560_enable_ctrl(flash
, led_no
, true);
137 br_bits
= LM3560_TORCH_BRT_uA_TO_REG(brt
);
138 if (led_no
== LM3560_LED0
)
139 rval
= regmap_update_bits(flash
->regmap
,
140 REG_TORCH_BR
, 0x07, br_bits
);
142 rval
= regmap_update_bits(flash
->regmap
,
143 REG_TORCH_BR
, 0x38, br_bits
<< 3);
148 /* flash1/2 brightness control */
149 static int lm3560_flash_brt_ctrl(struct lm3560_flash
*flash
,
150 enum lm3560_led_id led_no
, unsigned int brt
)
155 if (brt
< LM3560_FLASH_BRT_MIN
)
156 return lm3560_enable_ctrl(flash
, led_no
, false);
158 rval
= lm3560_enable_ctrl(flash
, led_no
, true);
160 br_bits
= LM3560_FLASH_BRT_uA_TO_REG(brt
);
161 if (led_no
== LM3560_LED0
)
162 rval
= regmap_update_bits(flash
->regmap
,
163 REG_FLASH_BR
, 0x0f, br_bits
);
165 rval
= regmap_update_bits(flash
->regmap
,
166 REG_FLASH_BR
, 0xf0, br_bits
<< 4);
172 static int lm3560_get_ctrl(struct v4l2_ctrl
*ctrl
, enum lm3560_led_id led_no
)
174 struct lm3560_flash
*flash
= to_lm3560_flash(ctrl
, led_no
);
177 mutex_lock(&flash
->lock
);
179 if (ctrl
->id
== V4L2_CID_FLASH_FAULT
) {
181 unsigned int reg_val
;
182 rval
= regmap_read(flash
->regmap
, REG_FLAG
, ®_val
);
185 if (reg_val
& FAULT_SHORT_CIRCUIT
)
186 fault
|= V4L2_FLASH_FAULT_SHORT_CIRCUIT
;
187 if (reg_val
& FAULT_OVERTEMP
)
188 fault
|= V4L2_FLASH_FAULT_OVER_TEMPERATURE
;
189 if (reg_val
& FAULT_TIMEOUT
)
190 fault
|= V4L2_FLASH_FAULT_TIMEOUT
;
191 ctrl
->cur
.val
= fault
;
195 mutex_unlock(&flash
->lock
);
199 static int lm3560_set_ctrl(struct v4l2_ctrl
*ctrl
, enum lm3560_led_id led_no
)
201 struct lm3560_flash
*flash
= to_lm3560_flash(ctrl
, led_no
);
205 mutex_lock(&flash
->lock
);
208 case V4L2_CID_FLASH_LED_MODE
:
209 flash
->led_mode
= ctrl
->val
;
210 if (flash
->led_mode
!= V4L2_FLASH_LED_MODE_FLASH
)
211 rval
= lm3560_mode_ctrl(flash
);
214 case V4L2_CID_FLASH_STROBE_SOURCE
:
215 rval
= regmap_update_bits(flash
->regmap
,
216 REG_CONFIG1
, 0x04, (ctrl
->val
) << 2);
221 case V4L2_CID_FLASH_STROBE
:
222 if (flash
->led_mode
!= V4L2_FLASH_LED_MODE_FLASH
) {
226 flash
->led_mode
= V4L2_FLASH_LED_MODE_FLASH
;
227 rval
= lm3560_mode_ctrl(flash
);
230 case V4L2_CID_FLASH_STROBE_STOP
:
231 if (flash
->led_mode
!= V4L2_FLASH_LED_MODE_FLASH
) {
235 flash
->led_mode
= V4L2_FLASH_LED_MODE_NONE
;
236 rval
= lm3560_mode_ctrl(flash
);
239 case V4L2_CID_FLASH_TIMEOUT
:
240 tout_bits
= LM3560_FLASH_TOUT_ms_TO_REG(ctrl
->val
);
241 rval
= regmap_update_bits(flash
->regmap
,
242 REG_FLASH_TOUT
, 0x1f, tout_bits
);
245 case V4L2_CID_FLASH_INTENSITY
:
246 rval
= lm3560_flash_brt_ctrl(flash
, led_no
, ctrl
->val
);
249 case V4L2_CID_FLASH_TORCH_INTENSITY
:
250 rval
= lm3560_torch_brt_ctrl(flash
, led_no
, ctrl
->val
);
255 mutex_unlock(&flash
->lock
);
259 static int lm3560_led1_get_ctrl(struct v4l2_ctrl
*ctrl
)
261 return lm3560_get_ctrl(ctrl
, LM3560_LED1
);
264 static int lm3560_led1_set_ctrl(struct v4l2_ctrl
*ctrl
)
266 return lm3560_set_ctrl(ctrl
, LM3560_LED1
);
269 static int lm3560_led0_get_ctrl(struct v4l2_ctrl
*ctrl
)
271 return lm3560_get_ctrl(ctrl
, LM3560_LED0
);
274 static int lm3560_led0_set_ctrl(struct v4l2_ctrl
*ctrl
)
276 return lm3560_set_ctrl(ctrl
, LM3560_LED0
);
279 static const struct v4l2_ctrl_ops lm3560_led_ctrl_ops
[LM3560_LED_MAX
] = {
281 .g_volatile_ctrl
= lm3560_led0_get_ctrl
,
282 .s_ctrl
= lm3560_led0_set_ctrl
,
285 .g_volatile_ctrl
= lm3560_led1_get_ctrl
,
286 .s_ctrl
= lm3560_led1_set_ctrl
,
290 static int lm3560_init_controls(struct lm3560_flash
*flash
,
291 enum lm3560_led_id led_no
)
293 struct v4l2_ctrl
*fault
;
294 u32 max_flash_brt
= flash
->pdata
->max_flash_brt
[led_no
];
295 u32 max_torch_brt
= flash
->pdata
->max_torch_brt
[led_no
];
296 struct v4l2_ctrl_handler
*hdl
= &flash
->ctrls_led
[led_no
];
297 const struct v4l2_ctrl_ops
*ops
= &lm3560_led_ctrl_ops
[led_no
];
299 v4l2_ctrl_handler_init(hdl
, 8);
301 v4l2_ctrl_new_std_menu(hdl
, ops
, V4L2_CID_FLASH_LED_MODE
,
302 V4L2_FLASH_LED_MODE_TORCH
, ~0x7,
303 V4L2_FLASH_LED_MODE_NONE
);
304 flash
->led_mode
= V4L2_FLASH_LED_MODE_NONE
;
307 v4l2_ctrl_new_std_menu(hdl
, ops
, V4L2_CID_FLASH_STROBE_SOURCE
,
308 0x1, ~0x3, V4L2_FLASH_STROBE_SOURCE_SOFTWARE
);
311 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_STROBE
, 0, 0, 0, 0);
312 /* flash strobe stop */
313 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_STROBE_STOP
, 0, 0, 0, 0);
315 /* flash strobe timeout */
316 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_TIMEOUT
,
317 LM3560_FLASH_TOUT_MIN
,
318 flash
->pdata
->max_flash_timeout
,
319 LM3560_FLASH_TOUT_STEP
,
320 flash
->pdata
->max_flash_timeout
);
323 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_INTENSITY
,
324 LM3560_FLASH_BRT_MIN
, max_flash_brt
,
325 LM3560_FLASH_BRT_STEP
, max_flash_brt
);
328 v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_TORCH_INTENSITY
,
329 LM3560_TORCH_BRT_MIN
, max_torch_brt
,
330 LM3560_TORCH_BRT_STEP
, max_torch_brt
);
333 fault
= v4l2_ctrl_new_std(hdl
, ops
, V4L2_CID_FLASH_FAULT
, 0,
334 V4L2_FLASH_FAULT_OVER_VOLTAGE
335 | V4L2_FLASH_FAULT_OVER_TEMPERATURE
336 | V4L2_FLASH_FAULT_SHORT_CIRCUIT
337 | V4L2_FLASH_FAULT_TIMEOUT
, 0, 0);
339 fault
->flags
|= V4L2_CTRL_FLAG_VOLATILE
;
344 flash
->subdev_led
[led_no
].ctrl_handler
= hdl
;
348 /* initialize device */
349 static const struct v4l2_subdev_ops lm3560_ops
= {
353 static const struct regmap_config lm3560_regmap
= {
356 .max_register
= 0xFF,
359 static int lm3560_subdev_init(struct lm3560_flash
*flash
,
360 enum lm3560_led_id led_no
, char *led_name
)
362 struct i2c_client
*client
= to_i2c_client(flash
->dev
);
365 v4l2_i2c_subdev_init(&flash
->subdev_led
[led_no
], client
, &lm3560_ops
);
366 flash
->subdev_led
[led_no
].flags
|= V4L2_SUBDEV_FL_HAS_DEVNODE
;
367 strcpy(flash
->subdev_led
[led_no
].name
, led_name
);
368 rval
= lm3560_init_controls(flash
, led_no
);
371 rval
= media_entity_init(&flash
->subdev_led
[led_no
].entity
, 0, NULL
, 0);
374 flash
->subdev_led
[led_no
].entity
.type
= MEDIA_ENT_T_V4L2_SUBDEV_FLASH
;
379 v4l2_ctrl_handler_free(&flash
->ctrls_led
[led_no
]);
383 static int lm3560_init_device(struct lm3560_flash
*flash
)
386 unsigned int reg_val
;
388 /* set peak current */
389 rval
= regmap_update_bits(flash
->regmap
,
390 REG_FLASH_TOUT
, 0x60, flash
->pdata
->peak
);
394 flash
->led_mode
= V4L2_FLASH_LED_MODE_NONE
;
395 rval
= lm3560_mode_ctrl(flash
);
399 rval
= regmap_read(flash
->regmap
, REG_FLAG
, ®_val
);
403 static int lm3560_probe(struct i2c_client
*client
,
404 const struct i2c_device_id
*devid
)
406 struct lm3560_flash
*flash
;
407 struct lm3560_platform_data
*pdata
= dev_get_platdata(&client
->dev
);
410 flash
= devm_kzalloc(&client
->dev
, sizeof(*flash
), GFP_KERNEL
);
414 flash
->regmap
= devm_regmap_init_i2c(client
, &lm3560_regmap
);
415 if (IS_ERR(flash
->regmap
)) {
416 rval
= PTR_ERR(flash
->regmap
);
420 /* if there is no platform data, use chip default value */
423 kzalloc(sizeof(struct lm3560_platform_data
), GFP_KERNEL
);
426 pdata
->peak
= LM3560_PEAK_3600mA
;
427 pdata
->max_flash_timeout
= LM3560_FLASH_TOUT_MAX
;
429 pdata
->max_flash_brt
[LM3560_LED0
] = LM3560_FLASH_BRT_MAX
;
430 pdata
->max_torch_brt
[LM3560_LED0
] = LM3560_TORCH_BRT_MAX
;
432 pdata
->max_flash_brt
[LM3560_LED1
] = LM3560_FLASH_BRT_MAX
;
433 pdata
->max_torch_brt
[LM3560_LED1
] = LM3560_TORCH_BRT_MAX
;
435 flash
->pdata
= pdata
;
436 flash
->dev
= &client
->dev
;
437 mutex_init(&flash
->lock
);
439 rval
= lm3560_subdev_init(flash
, LM3560_LED0
, "lm3560-led0");
443 rval
= lm3560_subdev_init(flash
, LM3560_LED1
, "lm3560-led1");
447 rval
= lm3560_init_device(flash
);
451 i2c_set_clientdata(client
, flash
);
456 static int lm3560_remove(struct i2c_client
*client
)
458 struct lm3560_flash
*flash
= i2c_get_clientdata(client
);
461 for (i
= LM3560_LED0
; i
< LM3560_LED_MAX
; i
++) {
462 v4l2_device_unregister_subdev(&flash
->subdev_led
[i
]);
463 v4l2_ctrl_handler_free(&flash
->ctrls_led
[i
]);
464 media_entity_cleanup(&flash
->subdev_led
[i
].entity
);
470 static const struct i2c_device_id lm3560_id_table
[] = {
475 MODULE_DEVICE_TABLE(i2c
, lm3560_id_table
);
477 static struct i2c_driver lm3560_i2c_driver
= {
482 .probe
= lm3560_probe
,
483 .remove
= lm3560_remove
,
484 .id_table
= lm3560_id_table
,
487 module_i2c_driver(lm3560_i2c_driver
);
489 MODULE_AUTHOR("Daniel Jeong <gshark.jeong@gmail.com>");
490 MODULE_AUTHOR("Ldd Mlp <ldd-mlp@list.ti.com>");
491 MODULE_DESCRIPTION("Texas Instruments LM3560 LED flash driver");
492 MODULE_LICENSE("GPL");