GNU Linux-libre 4.14.265-gnu1
[releases.git] / drivers / staging / media / atomisp / i2c / imx / dw9714.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __DW9714_H__
3 #define __DW9714_H__
4
5 #include "../../include/linux/atomisp_platform.h"
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