1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * linux/include/linux/mfd/aat2870.h
4  *
5  * Copyright (c) 2011, NVIDIA Corporation.
6  * Author: Jin Park <jinyoungp@nvidia.com>
7  */
8 
9 #ifndef __LINUX_MFD_AAT2870_H
10 #define __LINUX_MFD_AAT2870_H
11 
12 #include <linux/debugfs.h>
13 #include <linux/i2c.h>
14 
15 /* Register offsets */
16 #define AAT2870_BL_CH_EN	0x00
17 #define AAT2870_BLM		0x01
18 #define AAT2870_BLS		0x02
19 #define AAT2870_BL1		0x03
20 #define AAT2870_BL2		0x04
21 #define AAT2870_BL3		0x05
22 #define AAT2870_BL4		0x06
23 #define AAT2870_BL5		0x07
24 #define AAT2870_BL6		0x08
25 #define AAT2870_BL7		0x09
26 #define AAT2870_BL8		0x0A
27 #define AAT2870_FLR		0x0B
28 #define AAT2870_FM		0x0C
29 #define AAT2870_FS		0x0D
30 #define AAT2870_ALS_CFG0	0x0E
31 #define AAT2870_ALS_CFG1	0x0F
32 #define AAT2870_ALS_CFG2	0x10
33 #define AAT2870_AMB		0x11
34 #define AAT2870_ALS0		0x12
35 #define AAT2870_ALS1		0x13
36 #define AAT2870_ALS2		0x14
37 #define AAT2870_ALS3		0x15
38 #define AAT2870_ALS4		0x16
39 #define AAT2870_ALS5		0x17
40 #define AAT2870_ALS6		0x18
41 #define AAT2870_ALS7		0x19
42 #define AAT2870_ALS8		0x1A
43 #define AAT2870_ALS9		0x1B
44 #define AAT2870_ALSA		0x1C
45 #define AAT2870_ALSB		0x1D
46 #define AAT2870_ALSC		0x1E
47 #define AAT2870_ALSD		0x1F
48 #define AAT2870_ALSE		0x20
49 #define AAT2870_ALSF		0x21
50 #define AAT2870_SUB_SET		0x22
51 #define AAT2870_SUB_CTRL	0x23
52 #define AAT2870_LDO_AB		0x24
53 #define AAT2870_LDO_CD		0x25
54 #define AAT2870_LDO_EN		0x26
55 #define AAT2870_REG_NUM		0x27
56 
57 /* Device IDs */
58 enum aat2870_id {
59 	AAT2870_ID_BL,
60 	AAT2870_ID_LDOA,
61 	AAT2870_ID_LDOB,
62 	AAT2870_ID_LDOC,
63 	AAT2870_ID_LDOD
64 };
65 
66 /* Backlight channels */
67 #define AAT2870_BL_CH1		0x01
68 #define AAT2870_BL_CH2		0x02
69 #define AAT2870_BL_CH3		0x04
70 #define AAT2870_BL_CH4		0x08
71 #define AAT2870_BL_CH5		0x10
72 #define AAT2870_BL_CH6		0x20
73 #define AAT2870_BL_CH7		0x40
74 #define AAT2870_BL_CH8		0x80
75 #define AAT2870_BL_CH_ALL	0xFF
76 
77 /* Backlight current magnitude (mA) */
78 enum aat2870_current {
79 	AAT2870_CURRENT_0_45 = 1,
80 	AAT2870_CURRENT_0_90,
81 	AAT2870_CURRENT_1_80,
82 	AAT2870_CURRENT_2_70,
83 	AAT2870_CURRENT_3_60,
84 	AAT2870_CURRENT_4_50,
85 	AAT2870_CURRENT_5_40,
86 	AAT2870_CURRENT_6_30,
87 	AAT2870_CURRENT_7_20,
88 	AAT2870_CURRENT_8_10,
89 	AAT2870_CURRENT_9_00,
90 	AAT2870_CURRENT_9_90,
91 	AAT2870_CURRENT_10_8,
92 	AAT2870_CURRENT_11_7,
93 	AAT2870_CURRENT_12_6,
94 	AAT2870_CURRENT_13_5,
95 	AAT2870_CURRENT_14_4,
96 	AAT2870_CURRENT_15_3,
97 	AAT2870_CURRENT_16_2,
98 	AAT2870_CURRENT_17_1,
99 	AAT2870_CURRENT_18_0,
100 	AAT2870_CURRENT_18_9,
101 	AAT2870_CURRENT_19_8,
102 	AAT2870_CURRENT_20_7,
103 	AAT2870_CURRENT_21_6,
104 	AAT2870_CURRENT_22_5,
105 	AAT2870_CURRENT_23_4,
106 	AAT2870_CURRENT_24_3,
107 	AAT2870_CURRENT_25_2,
108 	AAT2870_CURRENT_26_1,
109 	AAT2870_CURRENT_27_0,
110 	AAT2870_CURRENT_27_9
111 };
112 
113 struct aat2870_register {
114 	bool readable;
115 	bool writeable;
116 	u8 value;
117 };
118 
119 struct aat2870_data {
120 	struct device *dev;
121 	struct i2c_client *client;
122 
123 	struct mutex io_lock;
124 	struct aat2870_register *reg_cache; /* register cache */
125 	int en_pin; /* enable GPIO pin (if < 0, ignore this value) */
126 	bool is_enable;
127 
128 	/* init and uninit for platform specified */
129 	int (*init)(struct aat2870_data *aat2870);
130 	void (*uninit)(struct aat2870_data *aat2870);
131 
132 	/* i2c io funcntions */
133 	int (*read)(struct aat2870_data *aat2870, u8 addr, u8 *val);
134 	int (*write)(struct aat2870_data *aat2870, u8 addr, u8 val);
135 	int (*update)(struct aat2870_data *aat2870, u8 addr, u8 mask, u8 val);
136 
137 	/* for debugfs */
138 	struct dentry *dentry_root;
139 };
140 
141 struct aat2870_subdev_info {
142 	int id;
143 	const char *name;
144 	void *platform_data;
145 };
146 
147 struct aat2870_platform_data {
148 	int en_pin; /* enable GPIO pin (if < 0, ignore this value) */
149 
150 	struct aat2870_subdev_info *subdevs;
151 	int num_subdevs;
152 
153 	/* init and uninit for platform specified */
154 	int (*init)(struct aat2870_data *aat2870);
155 	void (*uninit)(struct aat2870_data *aat2870);
156 };
157 
158 struct aat2870_bl_platform_data {
159 	/* backlight channels, default is AAT2870_BL_CH_ALL */
160 	int channels;
161 	/* backlight current magnitude, default is AAT2870_CURRENT_27_9 */
162 	int max_current;
163 	/* maximum brightness, default is 255 */
164 	int max_brightness;
165 };
166 
167 #endif /* __LINUX_MFD_AAT2870_H */
168