Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm/nvidia/as3722.h
39478 views
1
/*-
2
* Copyright (c) 2016 Michal Meloun <[email protected]>
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
* SUCH DAMAGE.
25
*/
26
27
#ifndef _AS3722_H_
28
29
#include <sys/clock.h>
30
31
#define AS3722_SD0_VOLTAGE 0x00
32
#define AS3722_SD_VSEL_MASK 0x7F /* For all SD */
33
#define AS3722_SD0_VSEL_MIN 0x01
34
#define AS3722_SD0_VSEL_MAX 0x5A
35
#define AS3722_SD0_VSEL_LOW_VOL_MAX 0x6E
36
37
#define AS3722_SD1_VOLTAGE 0x01
38
#define AS3722_SD2_VOLTAGE 0x02
39
#define AS3722_SD2_VSEL_MIN 0x01
40
#define AS3722_SD2_VSEL_MAX 0x7F
41
#define AS3722_SD3_VOLTAGE 0x03
42
#define AS3722_SD4_VOLTAGE 0x04
43
#define AS3722_SD5_VOLTAGE 0x05
44
#define AS3722_SD6_VOLTAGE 0x06
45
#define AS3722_GPIO0_CONTROL 0x08
46
#define AS3722_GPIO_INVERT 0x80
47
#define AS3722_GPIO_IOSF_MASK 0x0F
48
#define AS3722_GPIO_IOSF_SHIFT 3
49
#define AS3722_GPIO_MODE_MASK 0x07
50
#define AS3722_GPIO_MODE_SHIFT 0
51
52
#define AS3722_GPIO1_CONTROL 0x09
53
#define AS3722_GPIO2_CONTROL 0x0A
54
#define AS3722_GPIO3_CONTROL 0x0B
55
#define AS3722_GPIO4_CONTROL 0x0C
56
#define AS3722_GPIO5_CONTROL 0x0D
57
#define AS3722_GPIO6_CONTROL 0x0E
58
#define AS3722_GPIO7_CONTROL 0x0F
59
#define AS3722_LDO0_VOLTAGE 0x10
60
#define AS3722_LDO0_VSEL_MASK 0x1F
61
#define AS3722_LDO0_VSEL_MIN 0x01
62
#define AS3722_LDO0_VSEL_MAX 0x12
63
#define AS3722_LDO0_NUM_VOLT 0x12
64
65
#define AS3722_LDO1_VOLTAGE 0x11
66
#define AS3722_LDO_VSEL_MASK 0x7F
67
#define AS3722_LDO_VSEL_MIN 0x01
68
#define AS3722_LDO_VSEL_MAX 0x7F
69
#define AS3722_LDO_VSEL_DNU_MIN 0x25
70
#define AS3722_LDO_VSEL_DNU_MAX 0x3F
71
#define AS3722_LDO_NUM_VOLT 0x80
72
73
#define AS3722_LDO2_VOLTAGE 0x12
74
#define AS3722_LDO3_VOLTAGE 0x13
75
#define AS3722_LDO3_VSEL_MASK 0x3F
76
#define AS3722_LDO3_VSEL_MIN 0x01
77
#define AS3722_LDO3_VSEL_MAX 0x2D
78
#define AS3722_LDO3_NUM_VOLT 0x2D
79
#define AS3722_LDO3_MODE_MASK (0x3 << 6)
80
#define AS3722_LDO3_MODE_GET(x) (((x) >> 6) & 0x3)
81
#define AS3722_LDO3_MODE(x) (((x) & 0x3) << 6)
82
#define AS3722_LDO3_MODE_PMOS AS3722_LDO3_MODE(0)
83
#define AS3722_LDO3_MODE_PMOS_TRACKING AS3722_LDO3_MODE(1)
84
#define AS3722_LDO3_MODE_NMOS AS3722_LDO3_MODE(2)
85
#define AS3722_LDO3_MODE_SWITCH AS3722_LDO3_MODE(3)
86
87
#define AS3722_LDO4_VOLTAGE 0x14
88
#define AS3722_LDO5_VOLTAGE 0x15
89
#define AS3722_LDO6_VOLTAGE 0x16
90
#define AS3722_LDO6_SEL_BYPASS 0x3F
91
#define AS3722_LDO7_VOLTAGE 0x17
92
#define AS3722_LDO9_VOLTAGE 0x19
93
#define AS3722_LDO10_VOLTAGE 0x1A
94
#define AS3722_LDO11_VOLTAGE 0x1B
95
#define AS3722_LDO3_SETTINGS 0x1D
96
#define AS3722_GPIO_DEB1 0x1E
97
#define AS3722_GPIO_DEB2 0x1F
98
#define AS3722_GPIO_SIGNAL_OUT 0x20
99
#define AS3722_GPIO_SIGNAL_IN 0x21
100
#define AS3722_REG_SEQU_MOD1 0x22
101
#define AS3722_REG_SEQU_MOD2 0x23
102
#define AS3722_REG_SEQU_MOD3 0x24
103
#define AS3722_SD_PHSW_CTRL 0x27
104
#define AS3722_SD_PHSW_STATUS 0x28
105
106
#define AS3722_SD0_CONTROL 0x29
107
#define AS3722_SD0_MODE_FAST (1 << 4)
108
109
#define AS3722_SD1_CONTROL 0x2A
110
#define AS3722_SD1_MODE_FAST (1 << 4)
111
112
#define AS3722_SDMPH_CONTROL 0x2B
113
#define AS3722_SD23_CONTROL 0x2C
114
#define AS3722_SD3_MODE_FAST (1 << 6)
115
#define AS3722_SD2_MODE_FAST (1 << 2)
116
117
#define AS3722_SD4_CONTROL 0x2D
118
#define AS3722_SD4_MODE_FAST (1 << 2)
119
120
#define AS3722_SD5_CONTROL 0x2E
121
#define AS3722_SD5_MODE_FAST (1 << 2)
122
123
#define AS3722_SD6_CONTROL 0x2F
124
#define AS3722_SD6_MODE_FAST (1 << 4)
125
126
#define AS3722_SD_DVM 0x30
127
#define AS3722_RESET_REASON 0x31
128
#define AS3722_BATTERY_VOLTAGE_MONITOR 0x32
129
#define AS3722_STARTUP_CONTROL 0x33
130
#define AS3722_RESET_TIMER 0x34
131
#define AS3722_REFERENCE_CONTROL 0x35
132
#define AS3722_RESET_CONTROL 0x36
133
#define AS3722_OVERTEMPERATURE_CONTROL 0x37
134
#define AS3722_WATCHDOG_CONTROL 0x38
135
#define AS3722_REG_STANDBY_MOD1 0x39
136
#define AS3722_REG_STANDBY_MOD2 0x3A
137
#define AS3722_REG_STANDBY_MOD3 0x3B
138
#define AS3722_ENABLE_CTRL1 0x3C
139
#define AS3722_SD3_EXT_ENABLE_MASK 0xC0
140
#define AS3722_SD2_EXT_ENABLE_MASK 0x30
141
#define AS3722_SD1_EXT_ENABLE_MASK 0x0C
142
#define AS3722_SD0_EXT_ENABLE_MASK 0x03
143
144
#define AS3722_ENABLE_CTRL2 0x3D
145
#define AS3722_SD6_EXT_ENABLE_MASK 0x30
146
#define AS3722_SD5_EXT_ENABLE_MASK 0x0C
147
#define AS3722_SD4_EXT_ENABLE_MASK 0x03
148
149
#define AS3722_ENABLE_CTRL3 0x3E
150
#define AS3722_LDO3_EXT_ENABLE_MASK 0xC0
151
#define AS3722_LDO2_EXT_ENABLE_MASK 0x30
152
#define AS3722_LDO1_EXT_ENABLE_MASK 0x0C
153
#define AS3722_LDO0_EXT_ENABLE_MASK 0x03
154
155
#define AS3722_ENABLE_CTRL4 0x3F
156
#define AS3722_LDO7_EXT_ENABLE_MASK 0xC0
157
#define AS3722_LDO6_EXT_ENABLE_MASK 0x30
158
#define AS3722_LDO5_EXT_ENABLE_MASK 0x0C
159
#define AS3722_LDO4_EXT_ENABLE_MASK 0x03
160
161
#define AS3722_ENABLE_CTRL5 0x40
162
#define AS3722_LDO11_EXT_ENABLE_MASK 0xC0
163
#define AS3722_LDO10_EXT_ENABLE_MASK 0x30
164
#define AS3722_LDO9_EXT_ENABLE_MASK 0x0C
165
166
#define AS3722_PWM_CONTROL_L 0x41
167
#define AS3722_PWM_CONTROL_H 0x42
168
#define AS3722_WATCHDOG_TIMER 0x46
169
#define AS3722_WATCHDOG_SOFTWARE_SIGNAL 0x48
170
#define AS3722_IO_VOLTAGE 0x49
171
#define AS3722_I2C_PULL_UP (1 << 4)
172
#define AS3722_INT_PULL_UP (1 << 5)
173
174
#define AS3722_BATTERY_VOLTAGE_MONITOR2 0x4A
175
#define AS3722_SD_CONTROL 0x4D
176
#define AS3722_SDN_CTRL(x) (1 << (x))
177
178
#define AS3722_LDO_CONTROL0 0x4E
179
#define AS3722_LDO7_CTRL (1 << 7)
180
#define AS3722_LDO6_CTRL (1 << 6)
181
#define AS3722_LDO5_CTRL (1 << 5)
182
#define AS3722_LDO4_CTRL (1 << 4)
183
#define AS3722_LDO3_CTRL (1 << 3)
184
#define AS3722_LDO2_CTRL (1 << 2)
185
#define AS3722_LDO1_CTRL (1 << 1)
186
#define AS3722_LDO0_CTRL (1 << 0)
187
188
#define AS3722_LDO_CONTROL1 0x4F
189
#define AS3722_LDO11_CTRL (1 << 3)
190
#define AS3722_LDO10_CTRL (1 << 2)
191
#define AS3722_LDO9_CTRL (1 << 1)
192
193
#define AS3722_SD0_PROTECT 0x50
194
#define AS3722_SD6_PROTECT 0x51
195
#define AS3722_PWM_VCONTROL1 0x52
196
#define AS3722_PWM_VCONTROL2 0x53
197
#define AS3722_PWM_VCONTROL3 0x54
198
#define AS3722_PWM_VCONTROL4 0x55
199
#define AS3722_BB_CHARGER 0x57
200
#define AS3722_CTRL_SEQU1 0x58
201
#define AS3722_CTRL_SEQU2 0x59
202
#define AS3722_OV_CURRENT 0x5A
203
#define AS3722_OV_CURRENT_DEB 0x5B
204
#define AS3722_SDLV_DEB 0x5C
205
#define AS3722_OC_PG_CTRL 0x5D
206
#define AS3722_OC_PG_CTRL2 0x5E
207
#define AS3722_CTRL_STATUS 0x5F
208
#define AS3722_RTC_CONTROL 0x60
209
#define AS3722_RTC_AM_PM_MODE (1 << 7)
210
#define AS3722_RTC_CLK32K_OUT_EN (1 << 5)
211
#define AS3722_RTC_IRQ_MODE (1 << 3)
212
#define AS3722_RTC_ON (1 << 2)
213
#define AS3722_RTC_ALARM_WAKEUP_EN (1 << 1)
214
#define AS3722_RTC_REP_WAKEUP_EN (1 << 0)
215
216
#define AS3722_RTC_SECOND 0x61
217
#define AS3722_RTC_MINUTE 0x62
218
#define AS3722_RTC_HOUR 0x63
219
#define AS3722_RTC_DAY 0x64
220
#define AS3722_RTC_MONTH 0x65
221
#define AS3722_RTC_YEAR 0x66
222
#define AS3722_RTC_ALARM_SECOND 0x67
223
#define AS3722_RTC_ALARM_MINUTE 0x68
224
#define AS3722_RTC_ALARM_HOUR 0x69
225
#define AS3722_RTC_ALARM_DAY 0x6A
226
#define AS3722_RTC_ALARM_MONTH 0x6B
227
#define AS3722_RTC_ALARM_YEAR 0x6C
228
#define AS3722_SRAM 0x6D
229
#define AS3722_RTC_ACCESS 0x6F
230
#define AS3722_REG_STATUS 0x73
231
#define AS3722_INTERRUPT_MASK1 0x74
232
#define AS3722_INTERRUPT_MASK2 0x75
233
#define AS3722_INTERRUPT_MASK3 0x76
234
#define AS3722_INTERRUPT_MASK4 0x77
235
#define AS3722_INTERRUPT_STATUS1 0x78
236
#define AS3722_INTERRUPT_STATUS2 0x79
237
#define AS3722_INTERRUPT_STATUS3 0x7A
238
#define AS3722_INTERRUPT_STATUS4 0x7B
239
#define AS3722_TEMP_STATUS 0x7D
240
#define AS3722_ADC0_CONTROL 0x80
241
#define AS3722_ADC1_CONTROL 0x81
242
#define AS3722_ADC0_MSB_RESULT 0x82
243
#define AS3722_ADC0_LSB_RESULT 0x83
244
#define AS3722_ADC1_MSB_RESULT 0x84
245
#define AS3722_ADC1_LSB_RESULT 0x85
246
#define AS3722_ADC1_THRESHOLD_HI_MSB 0x86
247
#define AS3722_ADC1_THRESHOLD_HI_LSB 0x87
248
#define AS3722_ADC1_THRESHOLD_LO_MSB 0x88
249
#define AS3722_ADC1_THRESHOLD_LO_LSB 0x89
250
#define AS3722_ADC_CONFIGURATION 0x8A
251
#define AS3722_ASIC_ID1 0x90
252
#define AS3722_ASIC_ID2 0x91
253
#define AS3722_LOCK 0x9E
254
#define AS3722_FUSE7 0x9E
255
#define AS3722_FUSE7_SD0_LOW_VOLTAGE (1 << 4)
256
257
struct as3722_reg_sc;
258
struct as3722_gpio_pin;
259
260
struct as3722_softc {
261
device_t dev;
262
struct sx lock;
263
int bus_addr;
264
struct resource *irq_res;
265
void *irq_h;
266
267
uint8_t chip_rev;
268
int int_pullup;
269
int i2c_pullup;
270
271
/* Regulators. */
272
struct as3722_reg_sc **regs;
273
int nregs;
274
275
/* GPIO */
276
device_t gpio_busdev;
277
struct as3722_gpio_pin **gpio_pins;
278
int gpio_npins;
279
struct sx gpio_lock;
280
281
};
282
283
#define RD1(sc, reg, val) as3722_read(sc, reg, val)
284
#define WR1(sc, reg, val) as3722_write(sc, reg, val)
285
#define RM1(sc, reg, clr, set) as3722_modify(sc, reg, clr, set)
286
287
int as3722_read(struct as3722_softc *sc, uint8_t reg, uint8_t *val);
288
int as3722_write(struct as3722_softc *sc, uint8_t reg, uint8_t val);
289
int as3722_modify(struct as3722_softc *sc, uint8_t reg, uint8_t clear,
290
uint8_t set);
291
int as3722_read_buf(struct as3722_softc *sc, uint8_t reg, uint8_t *buf,
292
size_t size);
293
int as3722_write_buf(struct as3722_softc *sc, uint8_t reg, uint8_t *buf,
294
size_t size);
295
296
/* Regulators */
297
int as3722_regulator_attach(struct as3722_softc *sc, phandle_t node);
298
int as3722_regulator_map(device_t dev, phandle_t xref, int ncells,
299
pcell_t *cells, int *num);
300
301
/* RTC */
302
int as3722_rtc_attach(struct as3722_softc *sc, phandle_t node);
303
int as3722_rtc_gettime(device_t dev, struct timespec *ts);
304
int as3722_rtc_settime(device_t dev, struct timespec *ts);
305
306
/* GPIO */
307
device_t as3722_gpio_get_bus(device_t dev);
308
int as3722_gpio_pin_max(device_t dev, int *maxpin);
309
int as3722_gpio_pin_getname(device_t dev, uint32_t pin, char *name);
310
int as3722_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags);
311
int as3722_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps);
312
int as3722_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags);
313
int as3722_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value);
314
int as3722_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val);
315
int as3722_gpio_pin_toggle(device_t dev, uint32_t pin);
316
int as3722_gpio_map_gpios(device_t dev, phandle_t pdev, phandle_t gparent,
317
int gcells, pcell_t *gpios, uint32_t *pin, uint32_t *flags);
318
int as3722_gpio_attach(struct as3722_softc *sc, phandle_t node);
319
int as3722_pinmux_configure(device_t dev, phandle_t cfgxref);
320
321
#endif /* _AS3722_H_ */
322
323