1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
/*
* Copyright 2004-2012 Freescale Semiconductor, Inc. All Rights Reserved.
*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
/*
* NOTICE: Currently, it only supports i.mx6q usb charger detect
*/
#ifndef __IMXUSB_CHARGER_H
#define __IMXUSB_CHARGER_H
#define HW_ANADIG_REG_3P0 (0x00000120)
#define HW_ANADIG_REG_3P0_SET (0x00000124)
#define HW_ANADIG_REG_3P0_CLR (0x00000128)
#define HW_ANADIG_REG_3P0_TOG (0x0000012c)
#define BM_ANADIG_REG_3P0_ENABLE_ILIMIT 0x00000004
#define BM_ANADIG_REG_3P0_ENABLE_LINREG 0x00000001
#define HW_ANADIG_USB1_VBUS_DETECT (0x000001a0)
#define HW_ANADIG_USB1_VBUS_DETECT_SET (0x000001a4)
#define HW_ANADIG_USB1_VBUS_DETECT_CLR (0x000001a8)
#define HW_ANADIG_USB1_VBUS_DETECT_TOG (0x000001ac)
#define BM_ANADIG_USB1_VBUS_DETECT_EN_CHARGER_RESISTOR 0x80000000
#define BP_ANADIG_USB1_VBUS_DETECT_RSVD2 28
#define BM_ANADIG_USB1_VBUS_DETECT_RSVD2 0x70000000
#define BF_ANADIG_USB1_VBUS_DETECT_RSVD2(v) \
(((v) << 28) & BM_ANADIG_USB1_VBUS_DETECT_RSVD2)
#define BM_ANADIG_USB1_VBUS_DETECT_CHARGE_VBUS 0x08000000
#define BM_ANADIG_USB1_VBUS_DETECT_DISCHARGE_VBUS 0x04000000
#define BP_ANADIG_USB1_VBUS_DETECT_RSVD1 21
#define BM_ANADIG_USB1_VBUS_DETECT_RSVD1 0x03E00000
#define BF_ANADIG_USB1_VBUS_DETECT_RSVD1(v) \
(((v) << 21) & BM_ANADIG_USB1_VBUS_DETECT_RSVD1)
#define BM_ANADIG_USB1_VBUS_DETECT_VBUSVALID_PWRUP_CMPS 0x00100000
#define BM_ANADIG_USB1_VBUS_DETECT_VBUSVALID_5VDETECT 0x00080000
#define BM_ANADIG_USB1_VBUS_DETECT_VBUSVALID_TO_B 0x00040000
#define BP_ANADIG_USB1_VBUS_DETECT_RSVD0 8
#define BM_ANADIG_USB1_VBUS_DETECT_RSVD0 0x0003FF00
#define BF_ANADIG_USB1_VBUS_DETECT_RSVD0(v) \
(((v) << 8) & BM_ANADIG_USB1_VBUS_DETECT_RSVD0)
#define BM_ANADIG_USB1_VBUS_DETECT_VBUSVALID_OVERRIDE 0x00000080
#define BM_ANADIG_USB1_VBUS_DETECT_AVALID_OVERRIDE 0x00000040
#define BM_ANADIG_USB1_VBUS_DETECT_BVALID_OVERRIDE 0x00000020
#define BM_ANADIG_USB1_VBUS_DETECT_SESSEND_OVERRIDE 0x00000010
#define BM_ANADIG_USB1_VBUS_DETECT_VBUS_OVERRIDE_EN 0x00000008
#define BP_ANADIG_USB1_VBUS_DETECT_VBUSVALID_THRESH 0
#define BM_ANADIG_USB1_VBUS_DETECT_VBUSVALID_THRESH 0x00000007
#define BF_ANADIG_USB1_VBUS_DETECT_VBUSVALID_THRESH(v) \
(((v) << 0) & BM_ANADIG_USB1_VBUS_DETECT_VBUSVALID_THRESH)
#define HW_ANADIG_USB1_CHRG_DETECT (0x000001b0)
#define HW_ANADIG_USB1_CHRG_DETECT_SET (0x000001b4)
#define HW_ANADIG_USB1_CHRG_DETECT_CLR (0x000001b8)
#define HW_ANADIG_USB1_CHRG_DETECT_TOG (0x000001bc)
#define BP_ANADIG_USB1_CHRG_DETECT_RSVD2 24
#define BM_ANADIG_USB1_CHRG_DETECT_RSVD2 0xFF000000
#define BF_ANADIG_USB1_CHRG_DETECT_RSVD2(v) \
(((v) << 24) & BM_ANADIG_USB1_CHRG_DETECT_RSVD2)
#define BM_ANADIG_USB1_CHRG_DETECT_BGR_BIAS 0x00800000
#define BP_ANADIG_USB1_CHRG_DETECT_RSVD1 21
#define BM_ANADIG_USB1_CHRG_DETECT_RSVD1 0x00600000
#define BF_ANADIG_USB1_CHRG_DETECT_RSVD1(v) \
(((v) << 21) & BM_ANADIG_USB1_CHRG_DETECT_RSVD1)
#define BM_ANADIG_USB1_CHRG_DETECT_EN_B 0x00100000
#define BM_ANADIG_USB1_CHRG_DETECT_CHK_CHRG_B 0x00080000
#define BM_ANADIG_USB1_CHRG_DETECT_CHK_CONTACT 0x00040000
#define BP_ANADIG_USB1_CHRG_DETECT_RSVD0 1
#define BM_ANADIG_USB1_CHRG_DETECT_RSVD0 0x0003FFFE
#define BF_ANADIG_USB1_CHRG_DETECT_RSVD0(v) \
(((v) << 1) & BM_ANADIG_USB1_CHRG_DETECT_RSVD0)
#define BM_ANADIG_USB1_CHRG_DETECT_FORCE_DETECT 0x00000001
#define HW_ANADIG_USB1_VBUS_DET_STAT (0x000001c0)
#define HW_ANADIG_USB1_VBUS_DET_STAT_SET (0x000001c4)
#define HW_ANADIG_USB1_VBUS_DET_STAT_CLR (0x000001c8)
#define HW_ANADIG_USB1_VBUS_DET_STAT_TOG (0x000001cc)
#define BP_ANADIG_USB1_VBUS_DET_STAT_RSVD0 4
#define BM_ANADIG_USB1_VBUS_DET_STAT_RSVD0 0xFFFFFFF0
#define BF_ANADIG_USB1_VBUS_DET_STAT_RSVD0(v) \
(((v) << 4) & BM_ANADIG_USB1_VBUS_DET_STAT_RSVD0)
#define BM_ANADIG_USB1_VBUS_DET_STAT_VBUS_VALID 0x00000008
#define BM_ANADIG_USB1_VBUS_DET_STAT_AVALID 0x00000004
#define BM_ANADIG_USB1_VBUS_DET_STAT_BVALID 0x00000002
#define BM_ANADIG_USB1_VBUS_DET_STAT_SESSEND 0x00000001
#define HW_ANADIG_USB1_CHRG_DET_STAT (0x000001d0)
#define HW_ANADIG_USB1_CHRG_DET_STAT_SET (0x000001d4)
#define HW_ANADIG_USB1_CHRG_DET_STAT_CLR (0x000001d8)
#define HW_ANADIG_USB1_CHRG_DET_STAT_TOG (0x000001dc)
#define BP_ANADIG_USB1_CHRG_DET_STAT_RSVD0 4
#define BM_ANADIG_USB1_CHRG_DET_STAT_RSVD0 0xFFFFFFF0
#define BF_ANADIG_USB1_CHRG_DET_STAT_RSVD0(v) \
(((v) << 4) & BM_ANADIG_USB1_CHRG_DET_STAT_RSVD0)
#define BM_ANADIG_USB1_CHRG_DET_STAT_DP_STATE 0x00000008
#define BM_ANADIG_USB1_CHRG_DET_STAT_DM_STATE 0x00000004
#define BM_ANADIG_USB1_CHRG_DET_STAT_CHRG_DETECTED 0x00000002
#define BM_ANADIG_USB1_CHRG_DET_STAT_PLUG_CONTACT 0x00000001
#define HW_ANADIG_USB1_LOOPBACK (0x000001e0)
#define HW_ANADIG_USB1_LOOPBACK_SET (0x000001e4)
#define HW_ANADIG_USB1_LOOPBACK_CLR (0x000001e8)
#define HW_ANADIG_USB1_LOOPBACK_TOG (0x000001ec)
#define BP_ANADIG_USB1_LOOPBACK_RSVD0 9
#define BM_ANADIG_USB1_LOOPBACK_RSVD0 0xFFFFFE00
#define BF_ANADIG_USB1_LOOPBACK_RSVD0(v) \
(((v) << 9) & BM_ANADIG_USB1_LOOPBACK_RSVD0)
#define BM_ANADIG_USB1_LOOPBACK_UTMO_DIG_TST1 0x00000100
#define BM_ANADIG_USB1_LOOPBACK_UTMO_DIG_TST0 0x00000080
#define BM_ANADIG_USB1_LOOPBACK_TSTI_TX_HIZ 0x00000040
#define BM_ANADIG_USB1_LOOPBACK_TSTI_TX_EN 0x00000020
#define BM_ANADIG_USB1_LOOPBACK_TSTI_TX_LS_MODE 0x00000010
#define BM_ANADIG_USB1_LOOPBACK_TSTI_TX_HS_MODE 0x00000008
#define BM_ANADIG_USB1_LOOPBACK_UTMI_DIG_TST1 0x00000004
#define BM_ANADIG_USB1_LOOPBACK_UTMI_DIG_TST0 0x00000002
#define BM_ANADIG_USB1_LOOPBACK_UTMI_TESTSTART 0x00000001
#define HW_ANADIG_USB1_MISC (0x000001f0)
#define HW_ANADIG_USB1_MISC_SET (0x000001f4)
#define HW_ANADIG_USB1_MISC_CLR (0x000001f8)
#define HW_ANADIG_USB1_MISC_TOG (0x000001fc)
#define BM_ANADIG_USB1_MISC_RSVD1 0x80000000
#define BM_ANADIG_USB1_MISC_EN_CLK_UTMI 0x40000000
#define BM_ANADIG_USB1_MISC_RX_VPIN_FS 0x20000000
#define BM_ANADIG_USB1_MISC_RX_VMIN_FS 0x10000000
#define BM_ANADIG_USB1_MISC_RX_RXD_FS 0x08000000
#define BM_ANADIG_USB1_MISC_RX_SQUELCH 0x04000000
#define BM_ANADIG_USB1_MISC_RX_DISCON_DET 0x02000000
#define BM_ANADIG_USB1_MISC_RX_HS_DATA 0x01000000
#define BP_ANADIG_USB1_MISC_RSVD0 2
#define BM_ANADIG_USB1_MISC_RSVD0 0x00FFFFFC
#define BF_ANADIG_USB1_MISC_RSVD0(v) \
(((v) << 2) & BM_ANADIG_USB1_MISC_RSVD0)
#define BM_ANADIG_USB1_MISC_EN_DEGLITCH 0x00000002
#define BM_ANADIG_USB1_MISC_HS_USE_EXTERNAL_R 0x00000001
#include <linux/power_supply.h>
enum battery_charging_spec {
BATTERY_CHARGING_SPEC_NONE = 0,
BATTERY_CHARGING_SPEC_UNKNOWN,
BATTERY_CHARGING_SPEC_1_0,
BATTERY_CHARGING_SPEC_1_1,
BATTERY_CHARGING_SPEC_1_2,
};
struct usb_charger {
void __iomem *charger_base_addr; /* Get from MSL if exists */
struct device *dev; /* udc supplies */
/* charger detect can be enabled/disabled by kernel config */
bool enable;
struct power_supply psy;
struct work_struct work;
struct mutex lock;
/* Compliant with Battery Charging Specification version (if any) */
enum battery_charging_spec bc;
/* properties */
unsigned present:1;
unsigned online:1;
unsigned max_current;
/* pull up/down dp during the charger detect, udc supplies */
void (*dp_pullup)(bool);
int (*connect)(struct usb_charger *charger);
int (*disconnect)(struct usb_charger *charger);
int (*set_power)(struct usb_charger *charger, unsigned mA);
int (*detect)(struct usb_charger *charger);
};
static char *usb_charger_supplied_to[] = {
"imx_usb_charger",
};
static enum power_supply_property power_props[] = {
POWER_SUPPLY_PROP_PRESENT, /* Charger detected */
POWER_SUPPLY_PROP_ONLINE, /* VBUS online */
POWER_SUPPLY_PROP_CURRENT_MAX, /* Maximum current in mA */
};
#endif /* __IMXUSB_CHARGER_H */
|