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