1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * include/media/i2c/adp1653.h |
4 | * |
5 | * Copyright (C) 2008--2011 Nokia Corporation |
6 | * |
7 | * Contact: Sakari Ailus <sakari.ailus@iki.fi> |
8 | * |
9 | * Contributors: |
10 | * Sakari Ailus <sakari.ailus@iki.fi> |
11 | * Tuukka Toivonen <tuukkat76@gmail.com> |
12 | */ |
13 | |
14 | #ifndef ADP1653_H |
15 | #define ADP1653_H |
16 | |
17 | #include <linux/i2c.h> |
18 | #include <linux/mutex.h> |
19 | #include <linux/videodev2.h> |
20 | #include <media/v4l2-ctrls.h> |
21 | #include <media/v4l2-subdev.h> |
22 | |
23 | #define ADP1653_NAME "adp1653" |
24 | #define ADP1653_I2C_ADDR (0x60 >> 1) |
25 | |
26 | /* Register definitions */ |
27 | #define ADP1653_REG_OUT_SEL 0x00 |
28 | #define ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN 0x01 |
29 | #define ADP1653_REG_OUT_SEL_HPLED_TORCH_MAX 0x0b |
30 | #define ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN 0x0c |
31 | #define ADP1653_REG_OUT_SEL_HPLED_FLASH_MAX 0x1f |
32 | #define ADP1653_REG_OUT_SEL_HPLED_SHIFT 3 |
33 | #define ADP1653_REG_OUT_SEL_ILED_MAX 0x07 |
34 | #define ADP1653_REG_OUT_SEL_ILED_SHIFT 0 |
35 | |
36 | #define ADP1653_REG_CONFIG 0x01 |
37 | #define ADP1653_REG_CONFIG_TMR_CFG (1 << 4) |
38 | #define ADP1653_REG_CONFIG_TMR_SET_MAX 0x0f |
39 | #define ADP1653_REG_CONFIG_TMR_SET_SHIFT 0 |
40 | |
41 | #define ADP1653_REG_SW_STROBE 0x02 |
42 | #define ADP1653_REG_SW_STROBE_SW_STROBE (1 << 0) |
43 | |
44 | #define ADP1653_REG_FAULT 0x03 |
45 | #define ADP1653_REG_FAULT_FLT_SCP (1 << 3) |
46 | #define ADP1653_REG_FAULT_FLT_OT (1 << 2) |
47 | #define ADP1653_REG_FAULT_FLT_TMR (1 << 1) |
48 | #define ADP1653_REG_FAULT_FLT_OV (1 << 0) |
49 | |
50 | #define ADP1653_INDICATOR_INTENSITY_MIN 0 |
51 | #define ADP1653_INDICATOR_INTENSITY_STEP 2500 |
52 | #define ADP1653_INDICATOR_INTENSITY_MAX \ |
53 | (ADP1653_REG_OUT_SEL_ILED_MAX * ADP1653_INDICATOR_INTENSITY_STEP) |
54 | #define ADP1653_INDICATOR_INTENSITY_uA_TO_REG(a) \ |
55 | ((a) / ADP1653_INDICATOR_INTENSITY_STEP) |
56 | #define ADP1653_INDICATOR_INTENSITY_REG_TO_uA(a) \ |
57 | ((a) * ADP1653_INDICATOR_INTENSITY_STEP) |
58 | |
59 | #define ADP1653_FLASH_INTENSITY_BASE 35 |
60 | #define ADP1653_FLASH_INTENSITY_STEP 15 |
61 | #define ADP1653_FLASH_INTENSITY_MIN \ |
62 | (ADP1653_FLASH_INTENSITY_BASE \ |
63 | + ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN * ADP1653_FLASH_INTENSITY_STEP) |
64 | #define ADP1653_FLASH_INTENSITY_MAX \ |
65 | (ADP1653_FLASH_INTENSITY_MIN + \ |
66 | (ADP1653_REG_OUT_SEL_HPLED_FLASH_MAX - \ |
67 | ADP1653_REG_OUT_SEL_HPLED_FLASH_MIN + 1) * \ |
68 | ADP1653_FLASH_INTENSITY_STEP) |
69 | |
70 | #define ADP1653_FLASH_INTENSITY_mA_TO_REG(a) \ |
71 | ((a) < ADP1653_FLASH_INTENSITY_BASE ? 0 : \ |
72 | (((a) - ADP1653_FLASH_INTENSITY_BASE) / ADP1653_FLASH_INTENSITY_STEP)) |
73 | #define ADP1653_FLASH_INTENSITY_REG_TO_mA(a) \ |
74 | ((a) * ADP1653_FLASH_INTENSITY_STEP + ADP1653_FLASH_INTENSITY_BASE) |
75 | |
76 | #define ADP1653_TORCH_INTENSITY_MIN \ |
77 | (ADP1653_FLASH_INTENSITY_BASE \ |
78 | + ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN * ADP1653_FLASH_INTENSITY_STEP) |
79 | #define ADP1653_TORCH_INTENSITY_MAX \ |
80 | (ADP1653_TORCH_INTENSITY_MIN + \ |
81 | (ADP1653_REG_OUT_SEL_HPLED_TORCH_MAX - \ |
82 | ADP1653_REG_OUT_SEL_HPLED_TORCH_MIN + 1) * \ |
83 | ADP1653_FLASH_INTENSITY_STEP) |
84 | |
85 | struct adp1653_platform_data { |
86 | int (*power)(struct v4l2_subdev *sd, int on); |
87 | |
88 | u32 max_flash_timeout; /* flash light timeout in us */ |
89 | u32 max_flash_intensity; /* led intensity, flash mode, mA */ |
90 | u32 max_torch_intensity; /* led intensity, torch mode, mA */ |
91 | u32 max_indicator_intensity; /* indicator led intensity, uA */ |
92 | |
93 | struct gpio_desc *enable_gpio; /* for device-tree based boot */ |
94 | }; |
95 | |
96 | #define to_adp1653_flash(sd) container_of(sd, struct adp1653_flash, subdev) |
97 | |
98 | struct adp1653_flash { |
99 | struct v4l2_subdev subdev; |
100 | struct adp1653_platform_data *platform_data; |
101 | |
102 | struct v4l2_ctrl_handler ctrls; |
103 | struct v4l2_ctrl *led_mode; |
104 | struct v4l2_ctrl *flash_timeout; |
105 | struct v4l2_ctrl *flash_intensity; |
106 | struct v4l2_ctrl *torch_intensity; |
107 | struct v4l2_ctrl *indicator_intensity; |
108 | |
109 | struct mutex power_lock; |
110 | int power_count; |
111 | int fault; |
112 | }; |
113 | |
114 | #endif /* ADP1653_H */ |
115 | |