]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
a49d2536 AC |
2 | #ifndef __DW9714_H__ |
3 | #define __DW9714_H__ | |
4 | ||
25016567 | 5 | #include "../../include/linux/atomisp_platform.h" |
a49d2536 AC |
6 | #include <linux/types.h> |
7 | ||
8 | ||
9 | #define DW9714_VCM_ADDR 0x0c | |
10 | ||
11 | enum dw9714_tok_type { | |
12 | DW9714_8BIT = 0x0001, | |
13 | DW9714_16BIT = 0x0002, | |
14 | }; | |
15 | ||
16 | struct dw9714_vcm_settings { | |
17 | u16 code; /* bit[9:0]: Data[9:0] */ | |
18 | u8 t_src; /* bit[4:0]: T_SRC[4:0] */ | |
19 | u8 step_setting; /* bit[3:0]: S[3:0]/bit[5:4]: MCLK[1:0] */ | |
20 | bool update; | |
21 | }; | |
22 | ||
23 | enum dw9714_vcm_mode { | |
24 | DW9714_DIRECT = 0x1, /* direct control */ | |
25 | DW9714_LSC = 0x2, /* linear slope control */ | |
26 | DW9714_DLC = 0x3, /* dual level control */ | |
27 | }; | |
28 | ||
29 | /* dw9714 device structure */ | |
30 | struct dw9714_device { | |
31 | struct dw9714_vcm_settings vcm_settings; | |
32 | struct timespec timestamp_t_focus_abs; | |
33 | enum dw9714_vcm_mode vcm_mode; | |
34 | s16 number_of_steps; | |
35 | bool initialized; /* true if dw9714 is detected */ | |
36 | s32 focus; /* Current focus value */ | |
37 | struct timespec focus_time; /* Time when focus was last time set */ | |
38 | __u8 buffer[4]; /* Used for i2c transactions */ | |
39 | const struct camera_af_platform_data *platform_data; | |
40 | }; | |
41 | ||
42 | #define DW9714_INVALID_CONFIG 0xffffffff | |
43 | #define DW9714_MAX_FOCUS_POS 1023 | |
44 | #define DW9714_DEFAULT_FOCUS_POS 290 | |
45 | ||
46 | ||
47 | /* MCLK[1:0] = 01 T_SRC[4:0] = 00001 S[3:0] = 0111 */ | |
48 | #define DELAY_PER_STEP_NS 1000000 | |
49 | #define DELAY_MAX_PER_STEP_NS (1000000 * 1023) | |
50 | ||
51 | #define DLC_ENABLE 1 | |
52 | #define DLC_DISABLE 0 | |
53 | #define VCM_PROTECTION_OFF 0xeca3 | |
54 | #define VCM_PROTECTION_ON 0xdc51 | |
55 | #define VCM_DEFAULT_S 0x0 | |
56 | ||
57 | #define vcm_step_s(a) (u8)(a & 0xf) | |
58 | #define vcm_step_mclk(a) (u8)((a >> 4) & 0x3) | |
59 | #define vcm_dlc_mclk(dlc, mclk) (u16)((dlc << 3) | mclk | 0xa104) | |
60 | #define vcm_tsrc(tsrc) (u16)(tsrc << 3 | 0xf200) | |
61 | #define vcm_val(data, s) (u16)(data << 4 | s) | |
62 | #define DIRECT_VCM vcm_dlc_mclk(0, 0) | |
63 | ||
64 | #endif |