blob: 040312c8492fb351745a8881c8502b0600a6fda9 [file] [log] [blame]
Duy Truong790f06d2013-02-13 16:38:12 -08001/* Copyright (c) 2008-2010, The Linux Foundation. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#ifndef __ARCH_ARM_MACH_MSM_MPP_H
15#define __ARCH_ARM_MACH_MSM_MPP_H
16
17#ifdef CONFIG_PMIC8058
18#define MPPS 12
19#else
20#define MPPS 22
21#endif
22
23/* Digital Logical Output Level */
24enum {
25 MPP_DLOGIC_LVL_MSME,
26 MPP_DLOGIC_LVL_MSMP,
27 MPP_DLOGIC_LVL_RUIM,
28 MPP_DLOGIC_LVL_MMC,
29 MPP_DLOGIC_LVL_VDD,
30};
31
32/* Digital Logical Output Control Value */
33enum {
34 MPP_DLOGIC_OUT_CTRL_LOW,
35 MPP_DLOGIC_OUT_CTRL_HIGH,
36 MPP_DLOGIC_OUT_CTRL_MPP, /* MPP Output = MPP Input */
37 MPP_DLOGIC_OUT_CTRL_NOT_MPP, /* MPP Output = Inverted MPP Input */
38};
39
40/* Digital Logical Input Value */
41enum {
42 MPP_DLOGIC_IN_DBUS_NONE,
43 MPP_DLOGIC_IN_DBUS_1,
44 MPP_DLOGIC_IN_DBUS_2,
45 MPP_DLOGIC_IN_DBUS_3,
46};
47
48#define MPP_CFG(level, control) ((((level) & 0x0FFFF) << 16) | \
49 ((control) & 0x0FFFF))
50#define MPP_CFG_INPUT(level, dbus) ((((level) & 0x0FFFF) << 16) | \
51 ((dbus) & 0x0FFFF))
52
53/* Use mpp number starting from 0 */
54int mpp_config_digital_out(unsigned mpp, unsigned config);
55int mpp_config_digital_in(unsigned mpp, unsigned config);
56
57/* PM8058/PM8901 definitions */
58
59/* APIs */
60#ifdef CONFIG_PMIC8058
61int pm8058_mpp_config(unsigned mpp, unsigned type, unsigned level,
62 unsigned control);
63#else
64static inline int pm8058_mpp_config(unsigned mpp, unsigned type,
65 unsigned level, unsigned control)
66{
67 return -EINVAL;
68}
69#endif
70
71#ifdef CONFIG_PMIC8901
72int pm8901_mpp_config(unsigned mpp, unsigned type, unsigned level,
73 unsigned control);
74#else
75static inline int pm8901_mpp_config(unsigned mpp, unsigned type,
76 unsigned level, unsigned control)
77{
78 return -EINVAL;
79}
80#endif
81
82/* MPP Type: type */
83#define PM_MPP_TYPE_D_INPUT 0
84#define PM_MPP_TYPE_D_OUTPUT 1
85#define PM_MPP_TYPE_D_BI_DIR 2
86#define PM_MPP_TYPE_A_INPUT 3
87#define PM_MPP_TYPE_A_OUTPUT 4
88#define PM_MPP_TYPE_SINK 5
89#define PM_MPP_TYPE_DTEST_SINK 6
90#define PM_MPP_TYPE_DTEST_OUTPUT 7
91
92
93/* Digital Input/Output: level [8058] */
94#define PM8058_MPP_DIG_LEVEL_VPH 0
95#define PM8058_MPP_DIG_LEVEL_S3 1
96#define PM8058_MPP_DIG_LEVEL_L2 2
97#define PM8058_MPP_DIG_LEVEL_L3 3
98
99/* Digital Input/Output: level [8901] */
100#define PM8901_MPP_DIG_LEVEL_MSMIO 0
101#define PM8901_MPP_DIG_LEVEL_DIG 1
102#define PM8901_MPP_DIG_LEVEL_L5 2
103#define PM8901_MPP_DIG_LEVEL_S4 3
104#define PM8901_MPP_DIG_LEVEL_VPH 4
105
106/* Digital Input: control */
107#define PM_MPP_DIN_TO_INT 0
108#define PM_MPP_DIN_TO_DBUS1 1
109#define PM_MPP_DIN_TO_DBUS2 2
110#define PM_MPP_DIN_TO_DBUS3 3
111
112/* Digital Output: control */
113#define PM_MPP_DOUT_CTL_LOW 0
114#define PM_MPP_DOUT_CTL_HIGH 1
115#define PM_MPP_DOUT_CTL_MPP 2
116#define PM_MPP_DOUT_CTL_INV_MPP 3
117
118/* Bidirectional: control */
119#define PM_MPP_BI_PULLUP_1KOHM 0
120#define PM_MPP_BI_PULLUP_OPEN 1
121#define PM_MPP_BI_PULLUP_10KOHM 2
122#define PM_MPP_BI_PULLUP_30KOHM 3
123
124/* Analog Input: level */
125#define PM_MPP_AIN_AMUX_CH5 0
126#define PM_MPP_AIN_AMUX_CH6 1
127#define PM_MPP_AIN_AMUX_CH7 2
128#define PM_MPP_AIN_AMUX_CH8 3
129#define PM_MPP_AIN_AMUX_CH9 4
130#define PM_MPP_AIN_AMUX_ABUS1 5
131#define PM_MPP_AIN_AMUX_ABUS2 6
132#define PM_MPP_AIN_AMUX_ABUS3 7
133
134/* Analog Output: level */
135#define PM_MPP_AOUT_LVL_1V25 0
136#define PM_MPP_AOUT_LVL_1V25_2 1
137#define PM_MPP_AOUT_LVL_0V625 2
138#define PM_MPP_AOUT_LVL_0V3125 3
139#define PM_MPP_AOUT_LVL_MPP 4
140#define PM_MPP_AOUT_LVL_ABUS1 5
141#define PM_MPP_AOUT_LVL_ABUS2 6
142#define PM_MPP_AOUT_LVL_ABUS3 7
143
144/* Analog Output: control */
145#define PM_MPP_AOUT_CTL_DISABLE 0
146#define PM_MPP_AOUT_CTL_ENABLE 1
147#define PM_MPP_AOUT_CTL_MPP_HIGH_EN 2
148#define PM_MPP_AOUT_CTL_MPP_LOW_EN 3
149
150/* Current Sink: level */
151#define PM_MPP_CS_OUT_5MA 0
152#define PM_MPP_CS_OUT_10MA 1
153#define PM_MPP_CS_OUT_15MA 2
154#define PM_MPP_CS_OUT_20MA 3
155#define PM_MPP_CS_OUT_25MA 4
156#define PM_MPP_CS_OUT_30MA 5
157#define PM_MPP_CS_OUT_35MA 6
158#define PM_MPP_CS_OUT_40MA 7
159
160/* Current Sink: control */
161#define PM_MPP_CS_CTL_DISABLE 0
162#define PM_MPP_CS_CTL_ENABLE 1
163#define PM_MPP_CS_CTL_MPP_HIGH_EN 2
164#define PM_MPP_CS_CTL_MPP_LOW_EN 3
165
166/* DTEST Current Sink: control */
167#define PM_MPP_DTEST_CS_CTL_EN1 0
168#define PM_MPP_DTEST_CS_CTL_EN2 1
169#define PM_MPP_DTEST_CS_CTL_EN3 2
170#define PM_MPP_DTEST_CS_CTL_EN4 3
171
172/* DTEST Digital Output: control */
173#define PM_MPP_DTEST_DBUS1 0
174#define PM_MPP_DTEST_DBUS2 1
175#define PM_MPP_DTEST_DBUS3 2
176#define PM_MPP_DTEST_DBUS4 3
177
178/* Helper APIs */
179static inline int pm8058_mpp_config_digital_in(unsigned mpp, unsigned level,
180 unsigned control)
181{
182 return pm8058_mpp_config(mpp, PM_MPP_TYPE_D_INPUT, level, control);
183}
184
185static inline int pm8058_mpp_config_digital_out(unsigned mpp, unsigned level,
186 unsigned control)
187{
188 return pm8058_mpp_config(mpp, PM_MPP_TYPE_D_OUTPUT, level, control);
189}
190
191static inline int pm8058_mpp_config_bi_dir(unsigned mpp, unsigned level,
192 unsigned control)
193{
194 return pm8058_mpp_config(mpp, PM_MPP_TYPE_D_BI_DIR, level, control);
195}
196
197static inline int pm8058_mpp_config_analog_input(unsigned mpp, unsigned level,
198 unsigned control)
199{
200 return pm8058_mpp_config(mpp, PM_MPP_TYPE_A_INPUT, level, control);
201}
202
203static inline int pm8058_mpp_config_analog_output(unsigned mpp, unsigned level,
204 unsigned control)
205{
206 return pm8058_mpp_config(mpp, PM_MPP_TYPE_A_OUTPUT, level, control);
207}
208
209static inline int pm8058_mpp_config_current_sink(unsigned mpp, unsigned level,
210 unsigned control)
211{
212 return pm8058_mpp_config(mpp, PM_MPP_TYPE_SINK, level, control);
213}
214
215static inline int pm8058_mpp_config_dtest_sink(unsigned mpp, unsigned level,
216 unsigned control)
217{
218 return pm8058_mpp_config(mpp, PM_MPP_TYPE_DTEST_SINK, level, control);
219}
220
221static inline int pm8058_mpp_config_dtest_output(unsigned mpp, unsigned level,
222 unsigned control)
223{
224 return pm8058_mpp_config(mpp, PM_MPP_TYPE_DTEST_OUTPUT,
225 level, control);
226}
227
228static inline int pm8901_mpp_config_digital_in(unsigned mpp, unsigned level,
229 unsigned control)
230{
231 return pm8901_mpp_config(mpp, PM_MPP_TYPE_D_INPUT, level, control);
232}
233
234static inline int pm8901_mpp_config_digital_out(unsigned mpp, unsigned level,
235 unsigned control)
236{
237 return pm8901_mpp_config(mpp, PM_MPP_TYPE_D_OUTPUT, level, control);
238}
239
240static inline int pm8901_mpp_config_bi_dir(unsigned mpp, unsigned level,
241 unsigned control)
242{
243 return pm8901_mpp_config(mpp, PM_MPP_TYPE_D_BI_DIR, level, control);
244}
245
246static inline int pm8901_mpp_config_analog_input(unsigned mpp, unsigned level,
247 unsigned control)
248{
249 return pm8901_mpp_config(mpp, PM_MPP_TYPE_A_INPUT, level, control);
250}
251
252static inline int pm8901_mpp_config_analog_output(unsigned mpp, unsigned level,
253 unsigned control)
254{
255 return pm8901_mpp_config(mpp, PM_MPP_TYPE_A_OUTPUT, level, control);
256}
257
258static inline int pm8901_mpp_config_current_sink(unsigned mpp, unsigned level,
259 unsigned control)
260{
261 return pm8901_mpp_config(mpp, PM_MPP_TYPE_SINK, level, control);
262}
263
264static inline int pm8901_mpp_config_dtest_sink(unsigned mpp, unsigned level,
265 unsigned control)
266{
267 return pm8901_mpp_config(mpp, PM_MPP_TYPE_DTEST_SINK, level, control);
268}
269
270static inline int pm8901_mpp_config_dtest_output(unsigned mpp, unsigned level,
271 unsigned control)
272{
273 return pm8901_mpp_config(mpp, PM_MPP_TYPE_DTEST_OUTPUT,
274 level, control);
275}
276#endif