blob: aabfb415a044f6a6174e6a0f1212d5e521e91233 [file] [log] [blame]
Jack Phamf4baeb12017-02-03 19:01:48 -08001/* Copyright (c) 2016-2017, Linux Foundation. All rights reserved.
2 *
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#include <linux/completion.h>
14#include <linux/delay.h>
15#include <linux/hrtimer.h>
16#include <linux/ipc_logging.h>
17#include <linux/kernel.h>
18#include <linux/list.h>
19#include <linux/module.h>
20#include <linux/of.h>
21#include <linux/of_platform.h>
22#include <linux/power_supply.h>
23#include <linux/regulator/consumer.h>
24#include <linux/slab.h>
25#include <linux/spinlock.h>
26#include <linux/workqueue.h>
27#include <linux/extcon.h>
28#include <linux/usb/class-dual-role.h>
29#include <linux/usb/usbpd.h>
30#include "usbpd.h"
31
Vijayavardhan Vennapusa34a1f1d2017-05-31 12:00:37 +053032/* To start USB stack for USB3.1 complaince testing */
33static bool usb_compliance_mode;
34module_param(usb_compliance_mode, bool, 0644);
35MODULE_PARM_DESC(usb_compliance_mode, "Start USB stack for USB3.1 compliance testing");
36
Vijayavardhan Vennapusa49f21ce2017-06-05 14:47:56 +053037static bool disable_usb_pd;
38module_param(disable_usb_pd, bool, 0644);
39MODULE_PARM_DESC(disable_usb_pd, "Disable USB PD for USB3.1 compliance testing");
40
Hemant Kumarbe746222017-07-20 13:51:49 -070041static bool rev3_sink_only;
42module_param(rev3_sink_only, bool, 0644);
43MODULE_PARM_DESC(rev3_sink_only, "Enable power delivery rev3.0 sink only mode");
44
Jack Phamf4baeb12017-02-03 19:01:48 -080045enum usbpd_state {
46 PE_UNKNOWN,
47 PE_ERROR_RECOVERY,
48 PE_SRC_DISABLED,
49 PE_SRC_STARTUP,
50 PE_SRC_SEND_CAPABILITIES,
51 PE_SRC_SEND_CAPABILITIES_WAIT, /* substate to wait for Request */
52 PE_SRC_NEGOTIATE_CAPABILITY,
53 PE_SRC_TRANSITION_SUPPLY,
54 PE_SRC_READY,
55 PE_SRC_HARD_RESET,
56 PE_SRC_SOFT_RESET,
57 PE_SRC_SEND_SOFT_RESET,
58 PE_SRC_DISCOVERY,
59 PE_SRC_TRANSITION_TO_DEFAULT,
60 PE_SNK_STARTUP,
61 PE_SNK_DISCOVERY,
62 PE_SNK_WAIT_FOR_CAPABILITIES,
63 PE_SNK_EVALUATE_CAPABILITY,
64 PE_SNK_SELECT_CAPABILITY,
65 PE_SNK_TRANSITION_SINK,
66 PE_SNK_READY,
67 PE_SNK_HARD_RESET,
68 PE_SNK_SOFT_RESET,
69 PE_SNK_SEND_SOFT_RESET,
70 PE_SNK_TRANSITION_TO_DEFAULT,
71 PE_DRS_SEND_DR_SWAP,
72 PE_PRS_SNK_SRC_SEND_SWAP,
73 PE_PRS_SNK_SRC_TRANSITION_TO_OFF,
74 PE_PRS_SNK_SRC_SOURCE_ON,
75 PE_PRS_SRC_SNK_SEND_SWAP,
76 PE_PRS_SRC_SNK_TRANSITION_TO_OFF,
77 PE_PRS_SRC_SNK_WAIT_SOURCE_ON,
78 PE_VCS_WAIT_FOR_VCONN,
79};
80
81static const char * const usbpd_state_strings[] = {
82 "UNKNOWN",
83 "ERROR_RECOVERY",
84 "SRC_Disabled",
85 "SRC_Startup",
86 "SRC_Send_Capabilities",
87 "SRC_Send_Capabilities (Wait for Request)",
88 "SRC_Negotiate_Capability",
89 "SRC_Transition_Supply",
90 "SRC_Ready",
91 "SRC_Hard_Reset",
92 "SRC_Soft_Reset",
93 "SRC_Send_Soft_Reset",
94 "SRC_Discovery",
95 "SRC_Transition_to_default",
96 "SNK_Startup",
97 "SNK_Discovery",
98 "SNK_Wait_for_Capabilities",
99 "SNK_Evaluate_Capability",
100 "SNK_Select_Capability",
101 "SNK_Transition_Sink",
102 "SNK_Ready",
103 "SNK_Hard_Reset",
104 "SNK_Soft_Reset",
105 "SNK_Send_Soft_Reset",
106 "SNK_Transition_to_default",
107 "DRS_Send_DR_Swap",
108 "PRS_SNK_SRC_Send_Swap",
109 "PRS_SNK_SRC_Transition_to_off",
110 "PRS_SNK_SRC_Source_on",
111 "PRS_SRC_SNK_Send_Swap",
112 "PRS_SRC_SNK_Transition_to_off",
113 "PRS_SRC_SNK_Wait_Source_on",
114 "VCS_Wait_for_VCONN",
115};
116
117enum usbpd_control_msg_type {
118 MSG_RESERVED = 0,
119 MSG_GOODCRC,
120 MSG_GOTOMIN,
121 MSG_ACCEPT,
122 MSG_REJECT,
123 MSG_PING,
124 MSG_PS_RDY,
125 MSG_GET_SOURCE_CAP,
126 MSG_GET_SINK_CAP,
127 MSG_DR_SWAP,
128 MSG_PR_SWAP,
129 MSG_VCONN_SWAP,
130 MSG_WAIT,
131 MSG_SOFT_RESET,
Jack Phamf3c1bd32017-08-02 18:32:23 -0700132 MSG_NOT_SUPPORTED = 0x10,
133 MSG_GET_SOURCE_CAP_EXTENDED,
134 MSG_GET_STATUS,
135 MSG_FR_SWAP,
136 MSG_GET_PPS_STATUS,
137 MSG_GET_COUNTRY_CODES,
Jack Phamf4baeb12017-02-03 19:01:48 -0800138};
139
140enum usbpd_data_msg_type {
141 MSG_SOURCE_CAPABILITIES = 1,
142 MSG_REQUEST,
143 MSG_BIST,
144 MSG_SINK_CAPABILITIES,
Jack Phamf3c1bd32017-08-02 18:32:23 -0700145 MSG_BATTERY_STATUS,
146 MSG_ALERT,
147 MSG_GET_COUNTRY_INFO,
Jack Phamf4baeb12017-02-03 19:01:48 -0800148 MSG_VDM = 0xF,
149};
150
Jack Phamf3c1bd32017-08-02 18:32:23 -0700151enum usbpd_ext_msg_type {
152 MSG_SOURCE_CAPABILITIES_EXTENDED = 1,
153 MSG_STATUS,
154 MSG_GET_BATTERY_CAP,
155 MSG_GET_BATTERY_STATUS,
156 MSG_BATTERY_CAPABILITIES,
157 MSG_GET_MANUFACTURER_INFO,
158 MSG_MANUFACTURER_INFO,
159 MSG_SECURITY_REQUEST,
160 MSG_SECURITY_RESPONSE,
161 MSG_FIRMWARE_UPDATE_REQUEST,
162 MSG_FIRMWARE_UPDATE_RESPONSE,
163 MSG_PPS_STATUS,
164 MSG_COUNTRY_INFO,
165 MSG_COUNTRY_CODES,
166};
167
Jack Phamf4baeb12017-02-03 19:01:48 -0800168enum vdm_state {
169 VDM_NONE,
170 DISCOVERED_ID,
171 DISCOVERED_SVIDS,
172 DISCOVERED_MODES,
173 MODE_ENTERED,
174 MODE_EXITED,
175};
176
177static void *usbpd_ipc_log;
178#define usbpd_dbg(dev, fmt, ...) do { \
179 ipc_log_string(usbpd_ipc_log, "%s: %s: " fmt, dev_name(dev), __func__, \
180 ##__VA_ARGS__); \
181 dev_dbg(dev, fmt, ##__VA_ARGS__); \
182 } while (0)
183
184#define usbpd_info(dev, fmt, ...) do { \
185 ipc_log_string(usbpd_ipc_log, "%s: %s: " fmt, dev_name(dev), __func__, \
186 ##__VA_ARGS__); \
187 dev_info(dev, fmt, ##__VA_ARGS__); \
188 } while (0)
189
190#define usbpd_warn(dev, fmt, ...) do { \
191 ipc_log_string(usbpd_ipc_log, "%s: %s: " fmt, dev_name(dev), __func__, \
192 ##__VA_ARGS__); \
193 dev_warn(dev, fmt, ##__VA_ARGS__); \
194 } while (0)
195
196#define usbpd_err(dev, fmt, ...) do { \
197 ipc_log_string(usbpd_ipc_log, "%s: %s: " fmt, dev_name(dev), __func__, \
198 ##__VA_ARGS__); \
199 dev_err(dev, fmt, ##__VA_ARGS__); \
200 } while (0)
201
202#define NUM_LOG_PAGES 10
203
204/* Timeouts (in ms) */
205#define ERROR_RECOVERY_TIME 25
206#define SENDER_RESPONSE_TIME 26
207#define SINK_WAIT_CAP_TIME 500
208#define PS_TRANSITION_TIME 450
209#define SRC_CAP_TIME 120
210#define SRC_TRANSITION_TIME 25
211#define SRC_RECOVER_TIME 750
212#define PS_HARD_RESET_TIME 25
213#define PS_SOURCE_ON 400
214#define PS_SOURCE_OFF 750
Jack Pham35121342017-07-06 00:12:15 -0700215#define FIRST_SOURCE_CAP_TIME 200
Jack Phamf4baeb12017-02-03 19:01:48 -0800216#define VDM_BUSY_TIME 50
217#define VCONN_ON_TIME 100
218
219/* tPSHardReset + tSafe0V */
220#define SNK_HARD_RESET_VBUS_OFF_TIME (35 + 650)
221
222/* tSrcRecover + tSrcTurnOn */
223#define SNK_HARD_RESET_VBUS_ON_TIME (1000 + 275)
224
225#define PD_CAPS_COUNT 50
226
227#define PD_MAX_MSG_ID 7
228
Hemant Kumar796534e2017-05-30 15:54:55 -0700229#define PD_MAX_DATA_OBJ 7
230
Hemant Kumar018b5982017-08-09 14:14:37 -0700231#define PD_SRC_CAP_EXT_DB_LEN 24
Hemant Kumara1875942017-08-09 16:50:14 -0700232#define PD_STATUS_DB_LEN 5
Hemant Kumar51ded972017-08-09 17:57:24 -0700233#define PD_BATTERY_CAP_DB_LEN 9
Hemant Kumar018b5982017-08-09 14:14:37 -0700234
Jack Phamf3c1bd32017-08-02 18:32:23 -0700235#define PD_MAX_EXT_MSG_LEN 260
236#define PD_MAX_EXT_MSG_LEGACY_LEN 26
237
Jack Phamf4baeb12017-02-03 19:01:48 -0800238#define PD_MSG_HDR(type, dr, pr, id, cnt, rev) \
Jack Phamf3c1bd32017-08-02 18:32:23 -0700239 (((type) & 0x1F) | ((dr) << 5) | (rev << 6) | \
Jack Phamf4baeb12017-02-03 19:01:48 -0800240 ((pr) << 8) | ((id) << 9) | ((cnt) << 12))
Jack Phamf3c1bd32017-08-02 18:32:23 -0700241#define PD_MSG_HDR_COUNT(hdr) (((hdr) >> 12) & 7)
242#define PD_MSG_HDR_TYPE(hdr) ((hdr) & 0x1F)
243#define PD_MSG_HDR_ID(hdr) (((hdr) >> 9) & 7)
244#define PD_MSG_HDR_REV(hdr) (((hdr) >> 6) & 3)
245#define PD_MSG_HDR_EXTENDED BIT(15)
246#define PD_MSG_HDR_IS_EXTENDED(hdr) ((hdr) & PD_MSG_HDR_EXTENDED)
247
248#define PD_MSG_EXT_HDR(chunked, num, req, size) \
249 (((chunked) << 15) | (((num) & 0xF) << 11) | \
250 ((req) << 10) | ((size) & 0x1FF))
251#define PD_MSG_EXT_HDR_IS_CHUNKED(ehdr) ((ehdr) & 0x8000)
252#define PD_MSG_EXT_HDR_CHUNK_NUM(ehdr) (((ehdr) >> 11) & 0xF)
253#define PD_MSG_EXT_HDR_REQ_CHUNK(ehdr) ((ehdr) & 0x400)
254#define PD_MSG_EXT_HDR_DATA_SIZE(ehdr) ((ehdr) & 0x1FF)
Jack Phamf4baeb12017-02-03 19:01:48 -0800255
256#define PD_RDO_FIXED(obj, gb, mismatch, usb_comm, no_usb_susp, curr1, curr2) \
257 (((obj) << 28) | ((gb) << 27) | ((mismatch) << 26) | \
258 ((usb_comm) << 25) | ((no_usb_susp) << 24) | \
259 ((curr1) << 10) | (curr2))
260
261#define PD_RDO_AUGMENTED(obj, mismatch, usb_comm, no_usb_susp, volt, curr) \
262 (((obj) << 28) | ((mismatch) << 26) | ((usb_comm) << 25) | \
263 ((no_usb_susp) << 24) | ((volt) << 9) | (curr))
264
265#define PD_RDO_OBJ_POS(rdo) ((rdo) >> 28 & 7)
266#define PD_RDO_GIVEBACK(rdo) ((rdo) >> 27 & 1)
267#define PD_RDO_MISMATCH(rdo) ((rdo) >> 26 & 1)
268#define PD_RDO_USB_COMM(rdo) ((rdo) >> 25 & 1)
269#define PD_RDO_NO_USB_SUSP(rdo) ((rdo) >> 24 & 1)
270#define PD_RDO_FIXED_CURR(rdo) ((rdo) >> 10 & 0x3FF)
271#define PD_RDO_FIXED_CURR_MINMAX(rdo) ((rdo) & 0x3FF)
272#define PD_RDO_PROG_VOLTAGE(rdo) ((rdo) >> 9 & 0x7FF)
273#define PD_RDO_PROG_CURR(rdo) ((rdo) & 0x7F)
274
275#define PD_SRC_PDO_TYPE(pdo) (((pdo) >> 30) & 3)
276#define PD_SRC_PDO_TYPE_FIXED 0
277#define PD_SRC_PDO_TYPE_BATTERY 1
278#define PD_SRC_PDO_TYPE_VARIABLE 2
279#define PD_SRC_PDO_TYPE_AUGMENTED 3
280
281#define PD_SRC_PDO_FIXED_PR_SWAP(pdo) (((pdo) >> 29) & 1)
282#define PD_SRC_PDO_FIXED_USB_SUSP(pdo) (((pdo) >> 28) & 1)
283#define PD_SRC_PDO_FIXED_EXT_POWERED(pdo) (((pdo) >> 27) & 1)
284#define PD_SRC_PDO_FIXED_USB_COMM(pdo) (((pdo) >> 26) & 1)
285#define PD_SRC_PDO_FIXED_DR_SWAP(pdo) (((pdo) >> 25) & 1)
286#define PD_SRC_PDO_FIXED_PEAK_CURR(pdo) (((pdo) >> 20) & 3)
287#define PD_SRC_PDO_FIXED_VOLTAGE(pdo) (((pdo) >> 10) & 0x3FF)
288#define PD_SRC_PDO_FIXED_MAX_CURR(pdo) ((pdo) & 0x3FF)
289
290#define PD_SRC_PDO_VAR_BATT_MAX_VOLT(pdo) (((pdo) >> 20) & 0x3FF)
291#define PD_SRC_PDO_VAR_BATT_MIN_VOLT(pdo) (((pdo) >> 10) & 0x3FF)
292#define PD_SRC_PDO_VAR_BATT_MAX(pdo) ((pdo) & 0x3FF)
293
294#define PD_APDO_PPS(pdo) (((pdo) >> 28) & 3)
295#define PD_APDO_MAX_VOLT(pdo) (((pdo) >> 17) & 0xFF)
296#define PD_APDO_MIN_VOLT(pdo) (((pdo) >> 8) & 0xFF)
297#define PD_APDO_MAX_CURR(pdo) ((pdo) & 0x7F)
298
299/* Vendor Defined Messages */
300#define MAX_CRC_RECEIVE_TIME 9 /* ~(2 * tReceive_max(1.1ms) * # retry 4) */
301#define MAX_VDM_RESPONSE_TIME 60 /* 2 * tVDMSenderResponse_max(30ms) */
302#define MAX_VDM_BUSY_TIME 100 /* 2 * tVDMBusy (50ms) */
303
Jack Phamee1f9052017-01-26 12:27:07 -0800304#define PD_SNK_PDO_FIXED(prs, hc, uc, usb_comm, drs, volt, curr) \
305 (((prs) << 29) | ((hc) << 28) | ((uc) << 27) | ((usb_comm) << 26) | \
306 ((drs) << 25) | ((volt) << 10) | (curr))
307
Jack Phamf4baeb12017-02-03 19:01:48 -0800308/* VDM header is the first 32-bit object following the 16-bit PD header */
309#define VDM_HDR_SVID(hdr) ((hdr) >> 16)
310#define VDM_IS_SVDM(hdr) ((hdr) & 0x8000)
311#define SVDM_HDR_OBJ_POS(hdr) (((hdr) >> 8) & 0x7)
312#define SVDM_HDR_CMD_TYPE(hdr) (((hdr) >> 6) & 0x3)
313#define SVDM_HDR_CMD(hdr) ((hdr) & 0x1f)
314
315#define SVDM_HDR(svid, ver, obj, cmd_type, cmd) \
316 (((svid) << 16) | (1 << 15) | ((ver) << 13) \
317 | ((obj) << 8) | ((cmd_type) << 6) | (cmd))
318
319/* discover id response vdo bit fields */
320#define ID_HDR_USB_HOST BIT(31)
321#define ID_HDR_USB_DEVICE BIT(30)
322#define ID_HDR_MODAL_OPR BIT(26)
323#define ID_HDR_PRODUCT_TYPE(n) ((n) >> 27)
324#define ID_HDR_PRODUCT_PER_MASK (2 << 27)
325#define ID_HDR_PRODUCT_HUB 1
326#define ID_HDR_PRODUCT_PER 2
327#define ID_HDR_PRODUCT_AMA 5
328#define ID_HDR_VID 0x05c6 /* qcom */
329#define PROD_VDO_PID 0x0a00 /* TBD */
330
331static bool check_vsafe0v = true;
332module_param(check_vsafe0v, bool, 0600);
333
334static int min_sink_current = 900;
335module_param(min_sink_current, int, 0600);
336
337static const u32 default_src_caps[] = { 0x36019096 }; /* VSafe5V @ 1.5A */
Jack Phamee1f9052017-01-26 12:27:07 -0800338static const u32 default_snk_caps[] = { 0x2601912C }; /* VSafe5V @ 3A */
Jack Phamf4baeb12017-02-03 19:01:48 -0800339
340struct vdm_tx {
Jack Phamf3c1bd32017-08-02 18:32:23 -0700341 u32 data[PD_MAX_DATA_OBJ];
Jack Phamf4baeb12017-02-03 19:01:48 -0800342 int size;
343};
344
345struct rx_msg {
Jack Phamf3c1bd32017-08-02 18:32:23 -0700346 u16 hdr;
347 u16 data_len; /* size of payload in bytes */
Jack Phamf4baeb12017-02-03 19:01:48 -0800348 struct list_head entry;
Jack Phamf3c1bd32017-08-02 18:32:23 -0700349 u8 payload[];
Jack Phamf4baeb12017-02-03 19:01:48 -0800350};
351
Jack Phamf3c1bd32017-08-02 18:32:23 -0700352#define IS_DATA(m, t) ((m) && !PD_MSG_HDR_IS_EXTENDED((m)->hdr) && \
353 PD_MSG_HDR_COUNT((m)->hdr) && \
354 (PD_MSG_HDR_TYPE((m)->hdr) == (t)))
355#define IS_CTRL(m, t) ((m) && !PD_MSG_HDR_COUNT((m)->hdr) && \
356 (PD_MSG_HDR_TYPE((m)->hdr) == (t)))
357#define IS_EXT(m, t) ((m) && PD_MSG_HDR_IS_EXTENDED((m)->hdr) && \
358 (PD_MSG_HDR_TYPE((m)->hdr) == (t)))
Jack Phamf4baeb12017-02-03 19:01:48 -0800359
360struct usbpd {
361 struct device dev;
362 struct workqueue_struct *wq;
363 struct work_struct sm_work;
364 struct hrtimer timer;
365 bool sm_queued;
366
367 struct extcon_dev *extcon;
368
369 enum usbpd_state current_state;
370 bool hard_reset_recvd;
371 struct list_head rx_q;
372 spinlock_t rx_lock;
Jack Phamf3c1bd32017-08-02 18:32:23 -0700373 struct rx_msg *rx_ext_msg;
Jack Phamf4baeb12017-02-03 19:01:48 -0800374
Hemant Kumar796534e2017-05-30 15:54:55 -0700375 u32 received_pdos[PD_MAX_DATA_OBJ];
Hemant Kumara1875942017-08-09 16:50:14 -0700376 u32 received_ado;
Jack Phamf6c02da2017-01-31 15:23:56 -0800377 u16 src_cap_id;
Jack Phamf4baeb12017-02-03 19:01:48 -0800378 u8 selected_pdo;
379 u8 requested_pdo;
380 u32 rdo; /* can be either source or sink */
381 int current_voltage; /* uV */
382 int requested_voltage; /* uV */
383 int requested_current; /* mA */
384 bool pd_connected;
385 bool in_explicit_contract;
386 bool peer_usb_comm;
387 bool peer_pr_swap;
388 bool peer_dr_swap;
389
Jack Phamee1f9052017-01-26 12:27:07 -0800390 u32 sink_caps[7];
391 int num_sink_caps;
392
Jack Phamf4baeb12017-02-03 19:01:48 -0800393 struct power_supply *usb_psy;
394 struct notifier_block psy_nb;
395
396 enum power_supply_typec_mode typec_mode;
397 enum power_supply_type psy_type;
398 enum power_supply_typec_power_role forced_pr;
399 bool vbus_present;
400
401 enum pd_spec_rev spec_rev;
402 enum data_role current_dr;
403 enum power_role current_pr;
404 bool in_pr_swap;
405 bool pd_phy_opened;
Jack Phamaf7d3842017-01-26 13:28:19 -0800406 bool send_request;
407 struct completion is_ready;
Jack Phamf3c1bd32017-08-02 18:32:23 -0700408 struct completion tx_chunk_request;
409 u8 next_tx_chunk;
Jack Phamf4baeb12017-02-03 19:01:48 -0800410
Jack Phamaf7d3842017-01-26 13:28:19 -0800411 struct mutex swap_lock;
Jack Phamf4baeb12017-02-03 19:01:48 -0800412 struct dual_role_phy_instance *dual_role;
413 struct dual_role_phy_desc dr_desc;
414 bool send_pr_swap;
415 bool send_dr_swap;
416
417 struct regulator *vbus;
418 struct regulator *vconn;
419 bool vbus_enabled;
420 bool vconn_enabled;
421 bool vconn_is_external;
422
423 u8 tx_msgid;
424 u8 rx_msgid;
425 int caps_count;
426 int hard_reset_count;
427
428 enum vdm_state vdm_state;
429 u16 *discovered_svids;
430 int num_svids;
431 struct vdm_tx *vdm_tx;
432 struct vdm_tx *vdm_tx_retry;
Mayank Rana83443202017-08-31 15:38:03 -0700433 struct mutex svid_handler_lock;
Jack Phamf4baeb12017-02-03 19:01:48 -0800434 struct list_head svid_handlers;
435
436 struct list_head instance;
Mayank Rana6af43422017-07-18 12:09:02 -0700437
438 u16 ss_lane_svid;
Hemant Kumar018b5982017-08-09 14:14:37 -0700439
440 /* ext msg support */
441 bool send_get_src_cap_ext;
442 u8 src_cap_ext_db[PD_SRC_CAP_EXT_DB_LEN];
443 bool send_get_pps_status;
444 u32 pps_status_db;
Hemant Kumara1875942017-08-09 16:50:14 -0700445 u8 status_db[PD_STATUS_DB_LEN];
Hemant Kumar51ded972017-08-09 17:57:24 -0700446 bool send_get_battery_cap;
447 u8 get_battery_cap_db;
448 u8 battery_cap_db[PD_BATTERY_CAP_DB_LEN];
449 u8 get_battery_status_db;
450 bool send_get_battery_status;
451 u32 battery_sts_dobj;
Jack Phamf4baeb12017-02-03 19:01:48 -0800452};
453
454static LIST_HEAD(_usbpd); /* useful for debugging */
455
456static const unsigned int usbpd_extcon_cable[] = {
457 EXTCON_USB,
458 EXTCON_USB_HOST,
Jack Phamf4baeb12017-02-03 19:01:48 -0800459 EXTCON_NONE,
460};
461
462/* EXTCON_USB and EXTCON_USB_HOST are mutually exclusive */
463static const u32 usbpd_extcon_exclusive[] = {0x3, 0};
464
465enum plug_orientation usbpd_get_plug_orientation(struct usbpd *pd)
466{
467 int ret;
468 union power_supply_propval val;
469
470 ret = power_supply_get_property(pd->usb_psy,
471 POWER_SUPPLY_PROP_TYPEC_CC_ORIENTATION, &val);
472 if (ret)
473 return ORIENTATION_NONE;
474
475 return val.intval;
476}
477EXPORT_SYMBOL(usbpd_get_plug_orientation);
478
479static inline void stop_usb_host(struct usbpd *pd)
480{
Jack Pham4e9dff72017-04-04 18:05:53 -0700481 extcon_set_state_sync(pd->extcon, EXTCON_USB_HOST, 0);
Jack Phamf4baeb12017-02-03 19:01:48 -0800482}
483
484static inline void start_usb_host(struct usbpd *pd, bool ss)
485{
486 enum plug_orientation cc = usbpd_get_plug_orientation(pd);
Jack Pham4e9dff72017-04-04 18:05:53 -0700487 union extcon_property_value val;
Jack Phamf4baeb12017-02-03 19:01:48 -0800488
Jack Pham4e9dff72017-04-04 18:05:53 -0700489 val.intval = (cc == ORIENTATION_CC2);
490 extcon_set_property(pd->extcon, EXTCON_USB_HOST,
491 EXTCON_PROP_USB_TYPEC_POLARITY, val);
492
493 val.intval = ss;
494 extcon_set_property(pd->extcon, EXTCON_USB_HOST,
495 EXTCON_PROP_USB_SS, val);
496
497 extcon_set_state_sync(pd->extcon, EXTCON_USB_HOST, 1);
Jack Phamf4baeb12017-02-03 19:01:48 -0800498}
499
500static inline void stop_usb_peripheral(struct usbpd *pd)
501{
Jack Pham4e9dff72017-04-04 18:05:53 -0700502 extcon_set_state_sync(pd->extcon, EXTCON_USB, 0);
Jack Phamf4baeb12017-02-03 19:01:48 -0800503}
504
505static inline void start_usb_peripheral(struct usbpd *pd)
506{
507 enum plug_orientation cc = usbpd_get_plug_orientation(pd);
Jack Pham4e9dff72017-04-04 18:05:53 -0700508 union extcon_property_value val;
Jack Phamf4baeb12017-02-03 19:01:48 -0800509
Jack Pham4e9dff72017-04-04 18:05:53 -0700510 val.intval = (cc == ORIENTATION_CC2);
511 extcon_set_property(pd->extcon, EXTCON_USB,
512 EXTCON_PROP_USB_TYPEC_POLARITY, val);
513
514 val.intval = 1;
515 extcon_set_property(pd->extcon, EXTCON_USB, EXTCON_PROP_USB_SS, val);
516
517 extcon_set_state_sync(pd->extcon, EXTCON_USB, 1);
Jack Phamf4baeb12017-02-03 19:01:48 -0800518}
519
Mayank Rana6af43422017-07-18 12:09:02 -0700520/**
521 * This API allows client driver to request for releasing SS lanes. It should
522 * not be called from atomic context.
523 *
524 * @pd - USBPD handler
525 * @hdlr - client's handler
526 *
527 * @returns int - Success - 0, else negative error code
528 */
529static int usbpd_release_ss_lane(struct usbpd *pd,
530 struct usbpd_svid_handler *hdlr)
531{
532 int ret = 0;
533
534 if (!hdlr || !pd)
535 return -EINVAL;
536
537 usbpd_dbg(&pd->dev, "hdlr:%pK svid:%d", hdlr, hdlr->svid);
538 /*
539 * If USB SS lanes are already used by one client, and other client is
540 * requesting for same or same client requesting again, return -EBUSY.
541 */
542 if (pd->ss_lane_svid) {
543 usbpd_dbg(&pd->dev, "-EBUSY: ss_lanes are already used by(%d)",
544 pd->ss_lane_svid);
545 ret = -EBUSY;
546 goto err_exit;
547 }
548
549 ret = extcon_blocking_sync(pd->extcon, EXTCON_USB_HOST, 0);
550 if (ret) {
551 usbpd_err(&pd->dev, "err(%d) for releasing ss lane", ret);
552 goto err_exit;
553 }
554
555 pd->ss_lane_svid = hdlr->svid;
556
557err_exit:
558 return ret;
559}
560
Jack Phamf4baeb12017-02-03 19:01:48 -0800561static int set_power_role(struct usbpd *pd, enum power_role pr)
562{
563 union power_supply_propval val = {0};
564
565 switch (pr) {
566 case PR_NONE:
567 val.intval = POWER_SUPPLY_TYPEC_PR_NONE;
568 break;
569 case PR_SINK:
570 val.intval = POWER_SUPPLY_TYPEC_PR_SINK;
571 break;
572 case PR_SRC:
573 val.intval = POWER_SUPPLY_TYPEC_PR_SOURCE;
574 break;
575 }
576
577 return power_supply_set_property(pd->usb_psy,
578 POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &val);
579}
580
581static struct usbpd_svid_handler *find_svid_handler(struct usbpd *pd, u16 svid)
582{
583 struct usbpd_svid_handler *handler;
584
Mayank Rana83443202017-08-31 15:38:03 -0700585 mutex_lock(&pd->svid_handler_lock);
586 list_for_each_entry(handler, &pd->svid_handlers, entry) {
587 if (svid == handler->svid) {
588 mutex_unlock(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -0800589 return handler;
Mayank Rana83443202017-08-31 15:38:03 -0700590 }
591 }
Jack Phamf4baeb12017-02-03 19:01:48 -0800592
Mayank Rana83443202017-08-31 15:38:03 -0700593 mutex_unlock(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -0800594 return NULL;
595}
596
597/* Reset protocol layer */
598static inline void pd_reset_protocol(struct usbpd *pd)
599{
600 /*
601 * first Rx ID should be 0; set this to a sentinel of -1 so that in
602 * phy_msg_received() we can check if we had seen it before.
603 */
604 pd->rx_msgid = -1;
605 pd->tx_msgid = 0;
Jack Phamaf7d3842017-01-26 13:28:19 -0800606 pd->send_request = false;
607 pd->send_pr_swap = false;
608 pd->send_dr_swap = false;
Jack Phamf4baeb12017-02-03 19:01:48 -0800609}
610
Jack Phame95cfc72017-08-01 17:36:50 -0700611static int pd_send_msg(struct usbpd *pd, u8 msg_type, const u32 *data,
612 size_t num_data, enum pd_sop_type sop)
Jack Phamf4baeb12017-02-03 19:01:48 -0800613{
614 int ret;
615 u16 hdr;
616
Jack Phame95cfc72017-08-01 17:36:50 -0700617 hdr = PD_MSG_HDR(msg_type, pd->current_dr, pd->current_pr,
Jack Phamf4baeb12017-02-03 19:01:48 -0800618 pd->tx_msgid, num_data, pd->spec_rev);
Jack Phamf4baeb12017-02-03 19:01:48 -0800619
Jack Pham7dfd7612017-08-01 18:04:13 -0700620 ret = pd_phy_write(hdr, (u8 *)data, num_data * sizeof(u32), sop);
621 if (ret)
Jack Phamf4baeb12017-02-03 19:01:48 -0800622 return ret;
Jack Phamcc119752017-06-07 15:35:57 -0700623
624 pd->tx_msgid = (pd->tx_msgid + 1) & PD_MAX_MSG_ID;
Jack Phamf4baeb12017-02-03 19:01:48 -0800625 return 0;
626}
627
Hemant Kumar51ded972017-08-09 17:57:24 -0700628static int pd_send_ext_msg(struct usbpd *pd, u8 msg_type,
629 const u8 *data, size_t data_len, enum pd_sop_type sop)
630{
631 int ret;
632 size_t len_remain, chunk_len;
633 u8 chunked_payload[PD_MAX_DATA_OBJ * sizeof(u32)] = {0};
634 u16 hdr;
635 u16 ext_hdr;
636 u8 num_objs;
637
638 if (data_len > PD_MAX_EXT_MSG_LEN) {
639 usbpd_warn(&pd->dev, "Extended message length exceeds max, truncating...\n");
640 data_len = PD_MAX_EXT_MSG_LEN;
641 }
642
643 pd->next_tx_chunk = 0;
644 len_remain = data_len;
645 do {
646 ext_hdr = PD_MSG_EXT_HDR(1, pd->next_tx_chunk++, 0, data_len);
647 memcpy(chunked_payload, &ext_hdr, sizeof(ext_hdr));
648
649 chunk_len = min_t(size_t, len_remain,
650 PD_MAX_EXT_MSG_LEGACY_LEN);
651 memcpy(chunked_payload + sizeof(ext_hdr), data, chunk_len);
652
653 num_objs = DIV_ROUND_UP(chunk_len + sizeof(u16), sizeof(u32));
654 len_remain -= chunk_len;
655
656 reinit_completion(&pd->tx_chunk_request);
657 hdr = PD_MSG_HDR(msg_type, pd->current_dr, pd->current_pr,
658 pd->tx_msgid, num_objs, pd->spec_rev) |
659 PD_MSG_HDR_EXTENDED;
660 ret = pd_phy_write(hdr, chunked_payload,
661 num_objs * sizeof(u32), sop);
662 if (ret)
663 return ret;
664
665 pd->tx_msgid = (pd->tx_msgid + 1) & PD_MAX_MSG_ID;
666
667 /* Wait for request chunk */
668 if (len_remain &&
669 !wait_for_completion_timeout(&pd->tx_chunk_request,
670 msecs_to_jiffies(SENDER_RESPONSE_TIME))) {
671 usbpd_err(&pd->dev, "Timed out waiting for chunk request\n");
672 return -EPROTO;
673 }
674 } while (len_remain);
675
676 return 0;
677}
678
Jack Phamf4baeb12017-02-03 19:01:48 -0800679static int pd_select_pdo(struct usbpd *pd, int pdo_pos, int uv, int ua)
680{
681 int curr;
682 int max_current;
683 bool mismatch = false;
684 u8 type;
685 u32 pdo = pd->received_pdos[pdo_pos - 1];
686
687 type = PD_SRC_PDO_TYPE(pdo);
688 if (type == PD_SRC_PDO_TYPE_FIXED) {
689 curr = max_current = PD_SRC_PDO_FIXED_MAX_CURR(pdo) * 10;
690
691 /*
692 * Check if the PDO has enough current, otherwise set the
693 * Capability Mismatch flag
694 */
695 if (curr < min_sink_current) {
696 mismatch = true;
697 max_current = min_sink_current;
698 }
699
700 pd->requested_voltage =
701 PD_SRC_PDO_FIXED_VOLTAGE(pdo) * 50 * 1000;
702 pd->rdo = PD_RDO_FIXED(pdo_pos, 0, mismatch, 1, 1, curr / 10,
703 max_current / 10);
704 } else if (type == PD_SRC_PDO_TYPE_AUGMENTED) {
705 if ((uv / 100000) > PD_APDO_MAX_VOLT(pdo) ||
706 (uv / 100000) < PD_APDO_MIN_VOLT(pdo) ||
707 (ua / 50000) > PD_APDO_MAX_CURR(pdo) || (ua < 0)) {
708 usbpd_err(&pd->dev, "uv (%d) and ua (%d) out of range of APDO\n",
709 uv, ua);
710 return -EINVAL;
711 }
712
713 curr = ua / 1000;
714 pd->requested_voltage = uv;
715 pd->rdo = PD_RDO_AUGMENTED(pdo_pos, mismatch, 1, 1,
716 uv / 20000, ua / 50000);
717 } else {
718 usbpd_err(&pd->dev, "Only Fixed or Programmable PDOs supported\n");
719 return -ENOTSUPP;
720 }
721
722 /* Can't sink more than 5V if VCONN is sourced from the VBUS input */
723 if (pd->vconn_enabled && !pd->vconn_is_external &&
724 pd->requested_voltage > 5000000)
725 return -ENOTSUPP;
726
727 pd->requested_current = curr;
728 pd->requested_pdo = pdo_pos;
729
730 return 0;
731}
732
733static int pd_eval_src_caps(struct usbpd *pd)
734{
Hemant Kumarbe746222017-07-20 13:51:49 -0700735 int i;
Jack Phamf4baeb12017-02-03 19:01:48 -0800736 union power_supply_propval val;
737 u32 first_pdo = pd->received_pdos[0];
738
739 if (PD_SRC_PDO_TYPE(first_pdo) != PD_SRC_PDO_TYPE_FIXED) {
740 usbpd_err(&pd->dev, "First src_cap invalid! %08x\n", first_pdo);
741 return -EINVAL;
742 }
743
744 pd->peer_usb_comm = PD_SRC_PDO_FIXED_USB_COMM(first_pdo);
745 pd->peer_pr_swap = PD_SRC_PDO_FIXED_PR_SWAP(first_pdo);
746 pd->peer_dr_swap = PD_SRC_PDO_FIXED_DR_SWAP(first_pdo);
747
748 val.intval = PD_SRC_PDO_FIXED_USB_SUSP(first_pdo);
749 power_supply_set_property(pd->usb_psy,
750 POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED, &val);
751
Hemant Kumarbe746222017-07-20 13:51:49 -0700752 if (pd->spec_rev == USBPD_REV_30 && !rev3_sink_only) {
753 bool pps_found = false;
754
755 /* downgrade to 2.0 if no PPS */
756 for (i = 1; i < PD_MAX_DATA_OBJ; i++) {
757 if ((PD_SRC_PDO_TYPE(pd->received_pdos[i]) ==
Hemant Kumar796534e2017-05-30 15:54:55 -0700758 PD_SRC_PDO_TYPE_AUGMENTED) &&
Hemant Kumarbe746222017-07-20 13:51:49 -0700759 !PD_APDO_PPS(pd->received_pdos[i])) {
760 pps_found = true;
761 break;
762 }
763 }
764 if (!pps_found)
765 pd->spec_rev = USBPD_REV_20;
Hemant Kumar796534e2017-05-30 15:54:55 -0700766 }
767
Jack Phamf4baeb12017-02-03 19:01:48 -0800768 /* Select the first PDO (vSafe5V) immediately. */
769 pd_select_pdo(pd, 1, 0, 0);
770
771 return 0;
772}
773
774static void pd_send_hard_reset(struct usbpd *pd)
775{
Jack Pham857ee682017-05-25 11:53:36 -0700776 union power_supply_propval val = {0};
777
Jack Phamf4baeb12017-02-03 19:01:48 -0800778 usbpd_dbg(&pd->dev, "send hard reset");
779
780 /* Force CC logic to source/sink to keep Rp/Rd unchanged */
781 set_power_role(pd, pd->current_pr);
782 pd->hard_reset_count++;
Jack Pham7dfd7612017-08-01 18:04:13 -0700783 pd_phy_signal(HARD_RESET_SIG);
Jack Phamf4baeb12017-02-03 19:01:48 -0800784 pd->in_pr_swap = false;
Jack Pham857ee682017-05-25 11:53:36 -0700785 power_supply_set_property(pd->usb_psy, POWER_SUPPLY_PROP_PR_SWAP, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -0800786}
787
788static void kick_sm(struct usbpd *pd, int ms)
789{
790 pm_stay_awake(&pd->dev);
791 pd->sm_queued = true;
792
793 if (ms)
794 hrtimer_start(&pd->timer, ms_to_ktime(ms), HRTIMER_MODE_REL);
795 else
796 queue_work(pd->wq, &pd->sm_work);
797}
798
Jack Phame95cfc72017-08-01 17:36:50 -0700799static void phy_sig_received(struct usbpd *pd, enum pd_sig_type sig)
Jack Phamf4baeb12017-02-03 19:01:48 -0800800{
Jack Pham9411cbb2017-06-06 11:10:03 -0700801 union power_supply_propval val = {1};
802
Jack Phame95cfc72017-08-01 17:36:50 -0700803 if (sig != HARD_RESET_SIG) {
804 usbpd_err(&pd->dev, "invalid signal (%d) received\n", sig);
Jack Phamf4baeb12017-02-03 19:01:48 -0800805 return;
806 }
807
808 usbpd_dbg(&pd->dev, "hard reset received\n");
809
810 /* Force CC logic to source/sink to keep Rp/Rd unchanged */
811 set_power_role(pd, pd->current_pr);
812 pd->hard_reset_recvd = true;
Jack Pham9411cbb2017-06-06 11:10:03 -0700813 power_supply_set_property(pd->usb_psy,
814 POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
815
Jack Phamf4baeb12017-02-03 19:01:48 -0800816 kick_sm(pd, 0);
817}
818
Jack Phamf3c1bd32017-08-02 18:32:23 -0700819struct pd_request_chunk {
820 struct work_struct w;
821 struct usbpd *pd;
822 u8 msg_type;
823 u8 chunk_num;
824 enum pd_sop_type sop;
825};
826
827static void pd_request_chunk_work(struct work_struct *w)
828{
829 struct pd_request_chunk *req =
830 container_of(w, struct pd_request_chunk, w);
831 struct usbpd *pd = req->pd;
832 unsigned long flags;
833 int ret;
834 u8 payload[4] = {0}; /* ext_hdr + padding */
835 u16 hdr = PD_MSG_HDR(req->msg_type, pd->current_dr, pd->current_pr,
836 pd->tx_msgid, 1, pd->spec_rev) | PD_MSG_HDR_EXTENDED;
837
838 *(u16 *)payload = PD_MSG_EXT_HDR(1, req->chunk_num, 1, 0);
839
840 ret = pd_phy_write(hdr, payload, sizeof(payload), req->sop);
841 if (!ret) {
842 pd->tx_msgid = (pd->tx_msgid + 1) & PD_MAX_MSG_ID;
843 } else {
844 usbpd_err(&pd->dev, "could not send chunk request\n");
845
846 /* queue what we have anyway */
847 spin_lock_irqsave(&pd->rx_lock, flags);
848 list_add_tail(&pd->rx_ext_msg->entry, &pd->rx_q);
849 spin_unlock_irqrestore(&pd->rx_lock, flags);
850
851 pd->rx_ext_msg = NULL;
852 }
853
854 kfree(req);
855}
856
857static struct rx_msg *pd_ext_msg_received(struct usbpd *pd, u16 header, u8 *buf,
858 size_t len, enum pd_sop_type sop)
859{
860 struct rx_msg *rx_msg;
861 u16 bytes_to_copy;
862 u16 ext_hdr = *(u16 *)buf;
863 u8 chunk_num;
864
865 if (!PD_MSG_EXT_HDR_IS_CHUNKED(ext_hdr)) {
866 usbpd_err(&pd->dev, "unchunked extended messages unsupported\n");
867 return NULL;
868 }
869
870 /* request for next Tx chunk */
871 if (PD_MSG_EXT_HDR_REQ_CHUNK(ext_hdr)) {
872 if (PD_MSG_EXT_HDR_DATA_SIZE(ext_hdr) ||
873 PD_MSG_EXT_HDR_CHUNK_NUM(ext_hdr) !=
874 pd->next_tx_chunk) {
875 usbpd_err(&pd->dev, "invalid request chunk ext header 0x%02x\n",
876 ext_hdr);
877 return NULL;
878 }
879
880 if (!completion_done(&pd->tx_chunk_request))
881 complete(&pd->tx_chunk_request);
882
883 return NULL;
884 }
885
886 chunk_num = PD_MSG_EXT_HDR_CHUNK_NUM(ext_hdr);
887 if (!chunk_num) {
888 /* allocate new message if first chunk */
889 rx_msg = kzalloc(sizeof(*rx_msg) +
890 PD_MSG_EXT_HDR_DATA_SIZE(ext_hdr),
891 GFP_KERNEL);
892 if (!rx_msg)
893 return NULL;
894
895 rx_msg->hdr = header;
896 rx_msg->data_len = PD_MSG_EXT_HDR_DATA_SIZE(ext_hdr);
897
898 if (rx_msg->data_len > PD_MAX_EXT_MSG_LEN) {
899 usbpd_warn(&pd->dev, "Extended message length exceeds max, truncating...\n");
900 rx_msg->data_len = PD_MAX_EXT_MSG_LEN;
901 }
902 } else {
903 if (!pd->rx_ext_msg) {
904 usbpd_err(&pd->dev, "missing first rx_ext_msg chunk\n");
905 return NULL;
906 }
907
908 rx_msg = pd->rx_ext_msg;
909 }
910
911 /*
912 * The amount to copy is derived as follows:
913 *
914 * - if extended data_len < 26, then copy data_len bytes
915 * - for chunks 0..N-2, copy 26 bytes
916 * - for the last chunk (N-1), copy the remainder
917 */
918 bytes_to_copy =
919 min((rx_msg->data_len - chunk_num * PD_MAX_EXT_MSG_LEGACY_LEN),
920 PD_MAX_EXT_MSG_LEGACY_LEN);
921
922 /* check against received length to avoid overrun */
923 if (bytes_to_copy > len - sizeof(ext_hdr)) {
924 usbpd_warn(&pd->dev, "not enough bytes in chunk, expected:%u received:%lu\n",
925 bytes_to_copy, len - sizeof(ext_hdr));
926 bytes_to_copy = len - sizeof(ext_hdr);
927 }
928
929 memcpy(rx_msg->payload + chunk_num * PD_MAX_EXT_MSG_LEGACY_LEN, buf + 2,
930 bytes_to_copy);
931
932 /* request next chunk? */
933 if ((rx_msg->data_len - chunk_num * PD_MAX_EXT_MSG_LEGACY_LEN) >
934 PD_MAX_EXT_MSG_LEGACY_LEN) {
935 struct pd_request_chunk *req;
936
937 if (pd->rx_ext_msg && pd->rx_ext_msg != rx_msg) {
938 usbpd_dbg(&pd->dev, "stale previous rx_ext_msg?\n");
939 kfree(pd->rx_ext_msg);
940 }
941
942 pd->rx_ext_msg = rx_msg;
943
944 req = kzalloc(sizeof(*req), GFP_KERNEL);
945 if (!req)
946 goto queue_rx; /* return what we have anyway */
947
948 INIT_WORK(&req->w, pd_request_chunk_work);
949 req->pd = pd;
950 req->msg_type = PD_MSG_HDR_TYPE(header);
951 req->chunk_num = chunk_num + 1;
952 req->sop = sop;
953 queue_work(pd->wq, &req->w);
954
955 return NULL;
956 }
957
958queue_rx:
959 pd->rx_ext_msg = NULL;
960 return rx_msg; /* queue it for usbpd_sm */
961}
962
Jack Phame95cfc72017-08-01 17:36:50 -0700963static void phy_msg_received(struct usbpd *pd, enum pd_sop_type sop,
Jack Phamf4baeb12017-02-03 19:01:48 -0800964 u8 *buf, size_t len)
965{
966 struct rx_msg *rx_msg;
967 unsigned long flags;
968 u16 header;
969
Jack Phame95cfc72017-08-01 17:36:50 -0700970 if (sop != SOP_MSG) {
Jack Phamf4baeb12017-02-03 19:01:48 -0800971 usbpd_err(&pd->dev, "invalid msg type (%d) received; only SOP supported\n",
Jack Phame95cfc72017-08-01 17:36:50 -0700972 sop);
Jack Phamf4baeb12017-02-03 19:01:48 -0800973 return;
974 }
975
976 if (len < 2) {
977 usbpd_err(&pd->dev, "invalid message received, len=%zd\n", len);
978 return;
979 }
980
981 header = *((u16 *)buf);
982 buf += sizeof(u16);
983 len -= sizeof(u16);
984
985 if (len % 4 != 0) {
986 usbpd_err(&pd->dev, "len=%zd not multiple of 4\n", len);
987 return;
988 }
989
990 /* if MSGID already seen, discard */
991 if (PD_MSG_HDR_ID(header) == pd->rx_msgid &&
992 PD_MSG_HDR_TYPE(header) != MSG_SOFT_RESET) {
993 usbpd_dbg(&pd->dev, "MessageID already seen, discarding\n");
994 return;
995 }
996
997 pd->rx_msgid = PD_MSG_HDR_ID(header);
998
999 /* discard Pings */
1000 if (PD_MSG_HDR_TYPE(header) == MSG_PING && !len)
1001 return;
1002
1003 /* check header's count field to see if it matches len */
1004 if (PD_MSG_HDR_COUNT(header) != (len / 4)) {
1005 usbpd_err(&pd->dev, "header count (%d) mismatch, len=%zd\n",
1006 PD_MSG_HDR_COUNT(header), len);
1007 return;
1008 }
1009
Hemant Kumarbe746222017-07-20 13:51:49 -07001010 /* if spec rev differs (i.e. is older), update PHY */
1011 if (PD_MSG_HDR_REV(header) < pd->spec_rev)
1012 pd->spec_rev = PD_MSG_HDR_REV(header);
1013
Jack Phamf3c1bd32017-08-02 18:32:23 -07001014 usbpd_dbg(&pd->dev, "received message: type(%d) num_objs(%d)\n",
1015 PD_MSG_HDR_TYPE(header), PD_MSG_HDR_COUNT(header));
Jack Phamf4baeb12017-02-03 19:01:48 -08001016
Jack Phamf3c1bd32017-08-02 18:32:23 -07001017 if (!PD_MSG_HDR_IS_EXTENDED(header)) {
1018 rx_msg = kzalloc(sizeof(*rx_msg) + len, GFP_KERNEL);
1019 if (!rx_msg)
1020 return;
1021
1022 rx_msg->hdr = header;
1023 rx_msg->data_len = len;
1024 memcpy(rx_msg->payload, buf, len);
1025 } else {
1026 rx_msg = pd_ext_msg_received(pd, header, buf, len, sop);
1027 if (!rx_msg)
1028 return;
1029 }
Jack Phamf4baeb12017-02-03 19:01:48 -08001030
1031 spin_lock_irqsave(&pd->rx_lock, flags);
1032 list_add_tail(&rx_msg->entry, &pd->rx_q);
1033 spin_unlock_irqrestore(&pd->rx_lock, flags);
1034
Jack Phamf4baeb12017-02-03 19:01:48 -08001035 kick_sm(pd, 0);
1036}
1037
1038static void phy_shutdown(struct usbpd *pd)
1039{
1040 usbpd_dbg(&pd->dev, "shutdown");
Jack Pham0ab02962017-10-12 15:33:50 -07001041
1042 if (pd->vconn_enabled) {
1043 regulator_disable(pd->vconn);
1044 pd->vconn_enabled = false;
1045 }
1046
1047 if (pd->vbus_enabled) {
1048 regulator_disable(pd->vbus);
1049 pd->vbus_enabled = false;
1050 }
Jack Phamf4baeb12017-02-03 19:01:48 -08001051}
1052
1053static enum hrtimer_restart pd_timeout(struct hrtimer *timer)
1054{
1055 struct usbpd *pd = container_of(timer, struct usbpd, timer);
1056
1057 usbpd_dbg(&pd->dev, "timeout");
1058 queue_work(pd->wq, &pd->sm_work);
1059
1060 return HRTIMER_NORESTART;
1061}
1062
1063/* Enters new state and executes actions on entry */
1064static void usbpd_set_state(struct usbpd *pd, enum usbpd_state next_state)
1065{
1066 struct pd_phy_params phy_params = {
1067 .signal_cb = phy_sig_received,
1068 .msg_rx_cb = phy_msg_received,
1069 .shutdown_cb = phy_shutdown,
1070 .frame_filter_val = FRAME_FILTER_EN_SOP |
1071 FRAME_FILTER_EN_HARD_RESET,
Jack Phamf4baeb12017-02-03 19:01:48 -08001072 };
1073 union power_supply_propval val = {0};
1074 unsigned long flags;
1075 int ret;
1076
1077 usbpd_dbg(&pd->dev, "%s -> %s\n",
1078 usbpd_state_strings[pd->current_state],
1079 usbpd_state_strings[next_state]);
1080
1081 pd->current_state = next_state;
1082
1083 switch (next_state) {
1084 case PE_ERROR_RECOVERY: /* perform hard disconnect/reconnect */
1085 pd->in_pr_swap = false;
1086 pd->current_pr = PR_NONE;
1087 set_power_role(pd, PR_NONE);
1088 pd->typec_mode = POWER_SUPPLY_TYPEC_NONE;
1089 kick_sm(pd, 0);
1090 break;
1091
1092 /* Source states */
Jack Phamb9200bb2017-04-19 00:25:32 -07001093 case PE_SRC_DISABLED:
1094 /* are we still connected? */
1095 if (pd->typec_mode == POWER_SUPPLY_TYPEC_NONE) {
1096 pd->current_pr = PR_NONE;
1097 kick_sm(pd, 0);
1098 }
1099
1100 break;
1101
Jack Phamf4baeb12017-02-03 19:01:48 -08001102 case PE_SRC_STARTUP:
1103 if (pd->current_dr == DR_NONE) {
1104 pd->current_dr = DR_DFP;
Mayank Rana38e9b252017-03-23 12:35:57 -07001105 start_usb_host(pd, true);
Mayank Rana6af43422017-07-18 12:09:02 -07001106 pd->ss_lane_svid = 0x0;
Jack Phamf4baeb12017-02-03 19:01:48 -08001107 }
1108
1109 dual_role_instance_changed(pd->dual_role);
1110
1111 /* Set CC back to DRP toggle for the next disconnect */
1112 val.intval = POWER_SUPPLY_TYPEC_PR_DUAL;
1113 power_supply_set_property(pd->usb_psy,
1114 POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &val);
1115
Hemant Kumarbe746222017-07-20 13:51:49 -07001116 /* support only PD 2.0 as a source */
1117 pd->spec_rev = USBPD_REV_20;
Jack Phamf4baeb12017-02-03 19:01:48 -08001118 pd_reset_protocol(pd);
1119
1120 if (!pd->in_pr_swap) {
1121 if (pd->pd_phy_opened) {
1122 pd_phy_close();
1123 pd->pd_phy_opened = false;
1124 }
1125
1126 phy_params.data_role = pd->current_dr;
1127 phy_params.power_role = pd->current_pr;
Jack Phamf4baeb12017-02-03 19:01:48 -08001128
1129 ret = pd_phy_open(&phy_params);
1130 if (ret) {
1131 WARN_ON_ONCE(1);
1132 usbpd_err(&pd->dev, "error opening PD PHY %d\n",
1133 ret);
1134 pd->current_state = PE_UNKNOWN;
1135 return;
1136 }
1137
1138 pd->pd_phy_opened = true;
Jack Phamf4baeb12017-02-03 19:01:48 -08001139 }
1140
Jack Phamf4baeb12017-02-03 19:01:48 -08001141 if (pd->in_pr_swap) {
Jack Phamf4baeb12017-02-03 19:01:48 -08001142 pd->in_pr_swap = false;
Jack Pham857ee682017-05-25 11:53:36 -07001143 val.intval = 0;
1144 power_supply_set_property(pd->usb_psy,
1145 POWER_SUPPLY_PROP_PR_SWAP, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08001146 }
1147
Jack Pham35121342017-07-06 00:12:15 -07001148 /*
1149 * A sink might remove its terminations (during some Type-C
1150 * compliance tests or a sink attempting to do Try.SRC)
1151 * at this point just after we enabled VBUS. Sending PD
1152 * messages now would delay detecting the detach beyond the
1153 * required timing. Instead, delay sending out the first
1154 * source capabilities to allow for the other side to
1155 * completely settle CC debounce and allow HW to detect detach
1156 * sooner in the meantime. PD spec allows up to
1157 * tFirstSourceCap (250ms).
1158 */
1159 pd->current_state = PE_SRC_SEND_CAPABILITIES;
1160 kick_sm(pd, FIRST_SOURCE_CAP_TIME);
1161 break;
Jack Phamf4baeb12017-02-03 19:01:48 -08001162
1163 case PE_SRC_SEND_CAPABILITIES:
1164 kick_sm(pd, 0);
1165 break;
1166
1167 case PE_SRC_NEGOTIATE_CAPABILITY:
1168 if (PD_RDO_OBJ_POS(pd->rdo) != 1 ||
1169 PD_RDO_FIXED_CURR(pd->rdo) >
1170 PD_SRC_PDO_FIXED_MAX_CURR(*default_src_caps) ||
1171 PD_RDO_FIXED_CURR_MINMAX(pd->rdo) >
1172 PD_SRC_PDO_FIXED_MAX_CURR(*default_src_caps)) {
1173 /* send Reject */
1174 ret = pd_send_msg(pd, MSG_REJECT, NULL, 0, SOP_MSG);
1175 if (ret) {
1176 usbpd_err(&pd->dev, "Error sending Reject\n");
1177 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
1178 break;
1179 }
1180
1181 usbpd_err(&pd->dev, "Invalid request: %08x\n", pd->rdo);
1182
1183 if (pd->in_explicit_contract)
1184 usbpd_set_state(pd, PE_SRC_READY);
1185 else
1186 /*
1187 * bypass PE_SRC_Capability_Response and
1188 * PE_SRC_Wait_New_Capabilities in this
1189 * implementation for simplicity.
1190 */
1191 usbpd_set_state(pd, PE_SRC_SEND_CAPABILITIES);
1192 break;
1193 }
1194
1195 /* PE_SRC_TRANSITION_SUPPLY pseudo-state */
1196 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
1197 if (ret) {
1198 usbpd_err(&pd->dev, "Error sending Accept\n");
1199 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
1200 break;
1201 }
1202
1203 /* tSrcTransition required after ACCEPT */
1204 usleep_range(SRC_TRANSITION_TIME * USEC_PER_MSEC,
1205 (SRC_TRANSITION_TIME + 5) * USEC_PER_MSEC);
1206
1207 /*
1208 * Normally a voltage change should occur within tSrcReady
1209 * but since we only support VSafe5V there is nothing more to
1210 * prepare from the power supply so send PS_RDY right away.
1211 */
1212 ret = pd_send_msg(pd, MSG_PS_RDY, NULL, 0, SOP_MSG);
1213 if (ret) {
1214 usbpd_err(&pd->dev, "Error sending PS_RDY\n");
1215 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
1216 break;
1217 }
1218
1219 usbpd_set_state(pd, PE_SRC_READY);
1220 break;
1221
1222 case PE_SRC_READY:
1223 pd->in_explicit_contract = true;
Jack Phambe0f20c2017-10-05 12:51:26 -07001224
1225 if (pd->vdm_tx)
1226 kick_sm(pd, 0);
1227 else if (pd->current_dr == DR_DFP && pd->vdm_state == VDM_NONE)
1228 usbpd_send_svdm(pd, USBPD_SID,
1229 USBPD_SVDM_DISCOVER_IDENTITY,
1230 SVDM_CMD_TYPE_INITIATOR, 0, NULL, 0);
Jack Phamf4baeb12017-02-03 19:01:48 -08001231
1232 kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
Jack Phamaf7d3842017-01-26 13:28:19 -08001233 complete(&pd->is_ready);
Jack Phamf4baeb12017-02-03 19:01:48 -08001234 dual_role_instance_changed(pd->dual_role);
1235 break;
1236
1237 case PE_SRC_HARD_RESET:
1238 case PE_SNK_HARD_RESET:
Jack Phamb9200bb2017-04-19 00:25:32 -07001239 /* are we still connected? */
1240 if (pd->typec_mode == POWER_SUPPLY_TYPEC_NONE)
1241 pd->current_pr = PR_NONE;
1242
Jack Phamf4baeb12017-02-03 19:01:48 -08001243 /* hard reset may sleep; handle it in the workqueue */
1244 kick_sm(pd, 0);
1245 break;
1246
1247 case PE_SRC_SEND_SOFT_RESET:
1248 case PE_SNK_SEND_SOFT_RESET:
1249 pd_reset_protocol(pd);
1250
1251 ret = pd_send_msg(pd, MSG_SOFT_RESET, NULL, 0, SOP_MSG);
1252 if (ret) {
1253 usbpd_err(&pd->dev, "Error sending Soft Reset, do Hard Reset\n");
1254 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
1255 PE_SRC_HARD_RESET : PE_SNK_HARD_RESET);
1256 break;
1257 }
1258
1259 /* wait for ACCEPT */
1260 kick_sm(pd, SENDER_RESPONSE_TIME);
1261 break;
1262
1263 /* Sink states */
1264 case PE_SNK_STARTUP:
1265 if (pd->current_dr == DR_NONE || pd->current_dr == DR_UFP) {
1266 pd->current_dr = DR_UFP;
1267
1268 if (pd->psy_type == POWER_SUPPLY_TYPE_USB ||
Vijayavardhan Vennapusa34a1f1d2017-05-31 12:00:37 +05301269 pd->psy_type == POWER_SUPPLY_TYPE_USB_CDP ||
Hemant Kumarbbf7d052017-07-13 12:08:49 -07001270 pd->psy_type == POWER_SUPPLY_TYPE_USB_FLOAT ||
Vijayavardhan Vennapusa34a1f1d2017-05-31 12:00:37 +05301271 usb_compliance_mode)
Jack Phamf4baeb12017-02-03 19:01:48 -08001272 start_usb_peripheral(pd);
1273 }
1274
1275 dual_role_instance_changed(pd->dual_role);
1276
1277 ret = power_supply_get_property(pd->usb_psy,
1278 POWER_SUPPLY_PROP_PD_ALLOWED, &val);
1279 if (ret) {
1280 usbpd_err(&pd->dev, "Unable to read USB PROP_PD_ALLOWED: %d\n",
1281 ret);
1282 break;
1283 }
1284
Vijayavardhan Vennapusa49f21ce2017-06-05 14:47:56 +05301285 if (!val.intval || disable_usb_pd)
Jack Phamf4baeb12017-02-03 19:01:48 -08001286 break;
1287
Hemant Kumarbe746222017-07-20 13:51:49 -07001288 /*
1289 * support up to PD 3.0 as a sink; if source is 2.0
1290 * phy_msg_received() will handle the downgrade.
1291 */
1292 pd->spec_rev = USBPD_REV_30;
Jack Phamf4baeb12017-02-03 19:01:48 -08001293 pd_reset_protocol(pd);
1294
1295 if (!pd->in_pr_swap) {
1296 if (pd->pd_phy_opened) {
1297 pd_phy_close();
1298 pd->pd_phy_opened = false;
1299 }
1300
1301 phy_params.data_role = pd->current_dr;
1302 phy_params.power_role = pd->current_pr;
Jack Phamf4baeb12017-02-03 19:01:48 -08001303
1304 ret = pd_phy_open(&phy_params);
1305 if (ret) {
1306 WARN_ON_ONCE(1);
1307 usbpd_err(&pd->dev, "error opening PD PHY %d\n",
1308 ret);
1309 pd->current_state = PE_UNKNOWN;
1310 return;
1311 }
1312
1313 pd->pd_phy_opened = true;
Jack Phamf4baeb12017-02-03 19:01:48 -08001314 }
1315
1316 pd->current_voltage = pd->requested_voltage = 5000000;
1317 val.intval = pd->requested_voltage; /* set max range to 5V */
1318 power_supply_set_property(pd->usb_psy,
Nicholas Troast7f55c922017-07-25 13:18:03 -07001319 POWER_SUPPLY_PROP_PD_VOLTAGE_MAX, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08001320
1321 if (!pd->vbus_present) {
1322 pd->current_state = PE_SNK_DISCOVERY;
1323 /* max time for hard reset to turn vbus back on */
1324 kick_sm(pd, SNK_HARD_RESET_VBUS_ON_TIME);
1325 break;
1326 }
1327
1328 pd->current_state = PE_SNK_WAIT_FOR_CAPABILITIES;
1329 /* fall-through */
1330
1331 case PE_SNK_WAIT_FOR_CAPABILITIES:
1332 spin_lock_irqsave(&pd->rx_lock, flags);
1333 if (list_empty(&pd->rx_q))
1334 kick_sm(pd, SINK_WAIT_CAP_TIME);
1335 spin_unlock_irqrestore(&pd->rx_lock, flags);
1336 break;
1337
1338 case PE_SNK_EVALUATE_CAPABILITY:
1339 pd->pd_connected = true; /* we know peer is PD capable */
1340 pd->hard_reset_count = 0;
1341
1342 /* evaluate PDOs and select one */
1343 ret = pd_eval_src_caps(pd);
1344 if (ret < 0) {
1345 usbpd_err(&pd->dev, "Invalid src_caps received. Skipping request\n");
1346 break;
1347 }
1348 pd->current_state = PE_SNK_SELECT_CAPABILITY;
1349 /* fall-through */
1350
1351 case PE_SNK_SELECT_CAPABILITY:
1352 ret = pd_send_msg(pd, MSG_REQUEST, &pd->rdo, 1, SOP_MSG);
1353 if (ret) {
1354 usbpd_err(&pd->dev, "Error sending Request\n");
1355 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
1356 break;
1357 }
1358
1359 /* wait for ACCEPT */
1360 kick_sm(pd, SENDER_RESPONSE_TIME);
1361 break;
1362
1363 case PE_SNK_TRANSITION_SINK:
1364 /* wait for PS_RDY */
1365 kick_sm(pd, PS_TRANSITION_TIME);
1366 break;
1367
1368 case PE_SNK_READY:
1369 pd->in_explicit_contract = true;
Jack Phambe0f20c2017-10-05 12:51:26 -07001370
1371 if (pd->vdm_tx)
1372 kick_sm(pd, 0);
1373 else if (pd->current_dr == DR_DFP && pd->vdm_state == VDM_NONE)
1374 usbpd_send_svdm(pd, USBPD_SID,
1375 USBPD_SVDM_DISCOVER_IDENTITY,
1376 SVDM_CMD_TYPE_INITIATOR, 0, NULL, 0);
1377
Jack Phamf4baeb12017-02-03 19:01:48 -08001378 kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
Jack Phamaf7d3842017-01-26 13:28:19 -08001379 complete(&pd->is_ready);
Jack Phamf4baeb12017-02-03 19:01:48 -08001380 dual_role_instance_changed(pd->dual_role);
1381 break;
1382
1383 case PE_SNK_TRANSITION_TO_DEFAULT:
1384 if (pd->current_dr != DR_UFP) {
1385 stop_usb_host(pd);
1386 start_usb_peripheral(pd);
1387 pd->current_dr = DR_UFP;
1388 pd_phy_update_roles(pd->current_dr, pd->current_pr);
1389 }
1390 if (pd->vconn_enabled) {
1391 regulator_disable(pd->vconn);
1392 pd->vconn_enabled = false;
1393 }
1394
1395 /* max time for hard reset to turn vbus off */
1396 kick_sm(pd, SNK_HARD_RESET_VBUS_OFF_TIME);
1397 break;
1398
1399 case PE_PRS_SNK_SRC_TRANSITION_TO_OFF:
1400 val.intval = pd->requested_current = 0; /* suspend charging */
1401 power_supply_set_property(pd->usb_psy,
1402 POWER_SUPPLY_PROP_PD_CURRENT_MAX, &val);
1403
1404 pd->in_explicit_contract = false;
1405
1406 /*
1407 * need to update PR bit in message header so that
1408 * proper GoodCRC is sent when receiving next PS_RDY
1409 */
1410 pd_phy_update_roles(pd->current_dr, PR_SRC);
1411
1412 /* wait for PS_RDY */
1413 kick_sm(pd, PS_SOURCE_OFF);
1414 break;
1415
1416 default:
1417 usbpd_dbg(&pd->dev, "No action for state %s\n",
1418 usbpd_state_strings[pd->current_state]);
1419 break;
1420 }
1421}
1422
1423int usbpd_register_svid(struct usbpd *pd, struct usbpd_svid_handler *hdlr)
1424{
1425 if (find_svid_handler(pd, hdlr->svid)) {
1426 usbpd_err(&pd->dev, "SVID 0x%04x already registered\n",
1427 hdlr->svid);
1428 return -EINVAL;
1429 }
1430
1431 /* require connect/disconnect callbacks be implemented */
1432 if (!hdlr->connect || !hdlr->disconnect) {
1433 usbpd_err(&pd->dev, "SVID 0x%04x connect/disconnect must be non-NULL\n",
1434 hdlr->svid);
1435 return -EINVAL;
1436 }
1437
Mayank Rana83443202017-08-31 15:38:03 -07001438 usbpd_dbg(&pd->dev, "registered handler(%pK) for SVID 0x%04x\n",
1439 hdlr, hdlr->svid);
1440 mutex_lock(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08001441 list_add_tail(&hdlr->entry, &pd->svid_handlers);
Mayank Rana83443202017-08-31 15:38:03 -07001442 mutex_unlock(&pd->svid_handler_lock);
Mayank Rana6af43422017-07-18 12:09:02 -07001443 hdlr->request_usb_ss_lane = usbpd_release_ss_lane;
Jack Phamf4baeb12017-02-03 19:01:48 -08001444
1445 /* already connected with this SVID discovered? */
1446 if (pd->vdm_state >= DISCOVERED_SVIDS) {
1447 int i;
1448
1449 for (i = 0; i < pd->num_svids; i++) {
1450 if (pd->discovered_svids[i] == hdlr->svid) {
1451 hdlr->connect(hdlr);
1452 hdlr->discovered = true;
1453 break;
1454 }
1455 }
1456 }
1457
1458 return 0;
1459}
1460EXPORT_SYMBOL(usbpd_register_svid);
1461
1462void usbpd_unregister_svid(struct usbpd *pd, struct usbpd_svid_handler *hdlr)
1463{
Mayank Rana83443202017-08-31 15:38:03 -07001464
1465 usbpd_dbg(&pd->dev, "unregistered handler(%pK) for SVID 0x%04x\n",
1466 hdlr, hdlr->svid);
1467 mutex_lock(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08001468 list_del_init(&hdlr->entry);
Mayank Rana83443202017-08-31 15:38:03 -07001469 mutex_unlock(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08001470}
1471EXPORT_SYMBOL(usbpd_unregister_svid);
1472
1473int usbpd_send_vdm(struct usbpd *pd, u32 vdm_hdr, const u32 *vdos, int num_vdos)
1474{
1475 struct vdm_tx *vdm_tx;
1476
1477 if (!pd->in_explicit_contract || pd->vdm_tx)
1478 return -EBUSY;
1479
1480 vdm_tx = kzalloc(sizeof(*vdm_tx), GFP_KERNEL);
1481 if (!vdm_tx)
1482 return -ENOMEM;
1483
1484 vdm_tx->data[0] = vdm_hdr;
1485 if (vdos && num_vdos)
1486 memcpy(&vdm_tx->data[1], vdos, num_vdos * sizeof(u32));
1487 vdm_tx->size = num_vdos + 1; /* include the header */
1488
1489 /* VDM will get sent in PE_SRC/SNK_READY state handling */
1490 pd->vdm_tx = vdm_tx;
1491
1492 /* slight delay before queuing to prioritize handling of incoming VDM */
1493 kick_sm(pd, 2);
1494
1495 return 0;
1496}
1497EXPORT_SYMBOL(usbpd_send_vdm);
1498
1499int usbpd_send_svdm(struct usbpd *pd, u16 svid, u8 cmd,
1500 enum usbpd_svdm_cmd_type cmd_type, int obj_pos,
1501 const u32 *vdos, int num_vdos)
1502{
1503 u32 svdm_hdr = SVDM_HDR(svid, 0, obj_pos, cmd_type, cmd);
1504
1505 usbpd_dbg(&pd->dev, "VDM tx: svid:%x cmd:%x cmd_type:%x svdm_hdr:%x\n",
1506 svid, cmd, cmd_type, svdm_hdr);
1507
1508 return usbpd_send_vdm(pd, svdm_hdr, vdos, num_vdos);
1509}
1510EXPORT_SYMBOL(usbpd_send_svdm);
1511
1512static void handle_vdm_rx(struct usbpd *pd, struct rx_msg *rx_msg)
1513{
Jack Phamf3c1bd32017-08-02 18:32:23 -07001514 u32 vdm_hdr =
1515 rx_msg->data_len >= sizeof(u32) ? ((u32 *)rx_msg->payload)[0] : 0;
1516
1517 u32 *vdos = (u32 *)&rx_msg->payload[sizeof(u32)];
Jack Phamf4baeb12017-02-03 19:01:48 -08001518 u16 svid = VDM_HDR_SVID(vdm_hdr);
1519 u16 *psvid;
Jack Phamf3c1bd32017-08-02 18:32:23 -07001520 u8 i, num_vdos = PD_MSG_HDR_COUNT(rx_msg->hdr) - 1;
Jack Phamf4baeb12017-02-03 19:01:48 -08001521 u8 cmd = SVDM_HDR_CMD(vdm_hdr);
1522 u8 cmd_type = SVDM_HDR_CMD_TYPE(vdm_hdr);
1523 bool has_dp = false;
1524 struct usbpd_svid_handler *handler;
1525
1526 usbpd_dbg(&pd->dev, "VDM rx: svid:%x cmd:%x cmd_type:%x vdm_hdr:%x\n",
1527 svid, cmd, cmd_type, vdm_hdr);
1528
1529 /* if it's a supported SVID, pass the message to the handler */
1530 handler = find_svid_handler(pd, svid);
1531
1532 /* Unstructured VDM */
1533 if (!VDM_IS_SVDM(vdm_hdr)) {
1534 if (handler && handler->vdm_received)
1535 handler->vdm_received(handler, vdm_hdr, vdos, num_vdos);
1536 return;
1537 }
1538
1539 /* if this interrupts a previous exchange, abort queued response */
1540 if (cmd_type == SVDM_CMD_TYPE_INITIATOR && pd->vdm_tx) {
1541 usbpd_dbg(&pd->dev, "Discarding previously queued SVDM tx (SVID:0x%04x)\n",
1542 VDM_HDR_SVID(pd->vdm_tx->data[0]));
1543
1544 kfree(pd->vdm_tx);
1545 pd->vdm_tx = NULL;
1546 }
1547
1548 if (handler && handler->svdm_received) {
1549 handler->svdm_received(handler, cmd, cmd_type, vdos, num_vdos);
1550 return;
1551 }
1552
1553 /* Standard Discovery or unhandled messages go here */
1554 switch (cmd_type) {
1555 case SVDM_CMD_TYPE_INITIATOR:
1556 if (svid == USBPD_SID && cmd == USBPD_SVDM_DISCOVER_IDENTITY) {
1557 u32 tx_vdos[3] = {
1558 ID_HDR_USB_HOST | ID_HDR_USB_DEVICE |
1559 ID_HDR_PRODUCT_PER_MASK | ID_HDR_VID,
1560 0x0, /* TBD: Cert Stat VDO */
1561 (PROD_VDO_PID << 16),
1562 /* TBD: Get these from gadget */
1563 };
1564
1565 usbpd_send_svdm(pd, USBPD_SID, cmd,
1566 SVDM_CMD_TYPE_RESP_ACK, 0, tx_vdos, 3);
1567 } else if (cmd != USBPD_SVDM_ATTENTION) {
1568 usbpd_send_svdm(pd, svid, cmd, SVDM_CMD_TYPE_RESP_NAK,
1569 SVDM_HDR_OBJ_POS(vdm_hdr), NULL, 0);
1570 }
1571 break;
1572
1573 case SVDM_CMD_TYPE_RESP_ACK:
1574 if (svid != USBPD_SID) {
1575 usbpd_err(&pd->dev, "unhandled ACK for SVID:0x%x\n",
1576 svid);
1577 break;
1578 }
1579
1580 switch (cmd) {
1581 case USBPD_SVDM_DISCOVER_IDENTITY:
1582 kfree(pd->vdm_tx_retry);
1583 pd->vdm_tx_retry = NULL;
1584
1585 pd->vdm_state = DISCOVERED_ID;
1586 usbpd_send_svdm(pd, USBPD_SID,
1587 USBPD_SVDM_DISCOVER_SVIDS,
1588 SVDM_CMD_TYPE_INITIATOR, 0, NULL, 0);
1589 break;
1590
1591 case USBPD_SVDM_DISCOVER_SVIDS:
1592 pd->vdm_state = DISCOVERED_SVIDS;
1593
1594 kfree(pd->vdm_tx_retry);
1595 pd->vdm_tx_retry = NULL;
1596
1597 if (!pd->discovered_svids) {
1598 pd->num_svids = 2 * num_vdos;
1599 pd->discovered_svids = kcalloc(pd->num_svids,
1600 sizeof(u16),
1601 GFP_KERNEL);
1602 if (!pd->discovered_svids) {
1603 usbpd_err(&pd->dev, "unable to allocate SVIDs\n");
1604 break;
1605 }
1606
1607 psvid = pd->discovered_svids;
1608 } else { /* handle > 12 SVIDs */
1609 void *ptr;
1610 size_t oldsize = pd->num_svids * sizeof(u16);
1611 size_t newsize = oldsize +
1612 (2 * num_vdos * sizeof(u16));
1613
1614 ptr = krealloc(pd->discovered_svids, newsize,
1615 GFP_KERNEL);
1616 if (!ptr) {
1617 usbpd_err(&pd->dev, "unable to realloc SVIDs\n");
1618 break;
1619 }
1620
1621 pd->discovered_svids = ptr;
1622 psvid = pd->discovered_svids + pd->num_svids;
1623 memset(psvid, 0, (2 * num_vdos));
1624 pd->num_svids += 2 * num_vdos;
1625 }
1626
1627 /* convert 32-bit VDOs to list of 16-bit SVIDs */
1628 for (i = 0; i < num_vdos * 2; i++) {
1629 /*
1630 * Within each 32-bit VDO,
1631 * SVID[i]: upper 16-bits
1632 * SVID[i+1]: lower 16-bits
1633 * where i is even.
1634 */
1635 if (!(i & 1))
1636 svid = vdos[i >> 1] >> 16;
1637 else
1638 svid = vdos[i >> 1] & 0xFFFF;
1639
1640 /*
1641 * There are some devices that incorrectly
1642 * swap the order of SVIDs within a VDO. So in
1643 * case of an odd-number of SVIDs it could end
1644 * up with SVID[i] as 0 while SVID[i+1] is
1645 * non-zero. Just skip over the zero ones.
1646 */
1647 if (svid) {
1648 usbpd_dbg(&pd->dev, "Discovered SVID: 0x%04x\n",
1649 svid);
1650 *psvid++ = svid;
1651 }
1652 }
1653
1654 /* if more than 12 SVIDs, resend the request */
1655 if (num_vdos == 6 && vdos[5] != 0) {
1656 usbpd_send_svdm(pd, USBPD_SID,
1657 USBPD_SVDM_DISCOVER_SVIDS,
1658 SVDM_CMD_TYPE_INITIATOR, 0,
1659 NULL, 0);
1660 break;
1661 }
1662
1663 /* now that all SVIDs are discovered, notify handlers */
1664 for (i = 0; i < pd->num_svids; i++) {
1665 svid = pd->discovered_svids[i];
1666 if (svid) {
1667 handler = find_svid_handler(pd, svid);
1668 if (handler) {
1669 handler->connect(handler);
1670 handler->discovered = true;
1671 }
1672 }
1673
1674 if (svid == 0xFF01)
1675 has_dp = true;
1676 }
Jack Phamf4baeb12017-02-03 19:01:48 -08001677 break;
1678
1679 default:
1680 usbpd_dbg(&pd->dev, "unhandled ACK for command:0x%x\n",
1681 cmd);
1682 break;
1683 }
1684 break;
1685
1686 case SVDM_CMD_TYPE_RESP_NAK:
1687 usbpd_info(&pd->dev, "VDM NAK received for SVID:0x%04x command:0x%x\n",
1688 svid, cmd);
1689
1690 switch (cmd) {
1691 case USBPD_SVDM_DISCOVER_IDENTITY:
1692 case USBPD_SVDM_DISCOVER_SVIDS:
Jack Phamf4baeb12017-02-03 19:01:48 -08001693 break;
1694 default:
1695 break;
1696 }
1697
1698 break;
1699
1700 case SVDM_CMD_TYPE_RESP_BUSY:
1701 switch (cmd) {
1702 case USBPD_SVDM_DISCOVER_IDENTITY:
1703 case USBPD_SVDM_DISCOVER_SVIDS:
1704 if (!pd->vdm_tx_retry) {
1705 usbpd_err(&pd->dev, "Discover command %d VDM was unexpectedly freed\n",
1706 cmd);
1707 break;
1708 }
1709
1710 /* wait tVDMBusy, then retry */
1711 pd->vdm_tx = pd->vdm_tx_retry;
1712 pd->vdm_tx_retry = NULL;
1713 kick_sm(pd, VDM_BUSY_TIME);
1714 break;
1715 default:
1716 break;
1717 }
1718 break;
1719 }
1720}
1721
1722static void handle_vdm_tx(struct usbpd *pd)
1723{
1724 int ret;
1725 unsigned long flags;
1726
1727 /* only send one VDM at a time */
1728 if (pd->vdm_tx) {
1729 u32 vdm_hdr = pd->vdm_tx->data[0];
1730
1731 /* bail out and try again later if a message just arrived */
1732 spin_lock_irqsave(&pd->rx_lock, flags);
1733 if (!list_empty(&pd->rx_q)) {
1734 spin_unlock_irqrestore(&pd->rx_lock, flags);
1735 return;
1736 }
1737 spin_unlock_irqrestore(&pd->rx_lock, flags);
1738
1739 ret = pd_send_msg(pd, MSG_VDM, pd->vdm_tx->data,
1740 pd->vdm_tx->size, SOP_MSG);
1741 if (ret) {
1742 usbpd_err(&pd->dev, "Error (%d) sending VDM command %d\n",
1743 ret, SVDM_HDR_CMD(pd->vdm_tx->data[0]));
1744
1745 /* retry when hitting PE_SRC/SNK_Ready again */
1746 if (ret != -EBUSY)
1747 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
1748 PE_SRC_SEND_SOFT_RESET :
1749 PE_SNK_SEND_SOFT_RESET);
1750
1751 return;
1752 }
1753
1754 /*
1755 * special case: keep initiated Discover ID/SVIDs
1756 * around in case we need to re-try when receiving BUSY
1757 */
1758 if (VDM_IS_SVDM(vdm_hdr) &&
1759 SVDM_HDR_CMD_TYPE(vdm_hdr) == SVDM_CMD_TYPE_INITIATOR &&
1760 SVDM_HDR_CMD(vdm_hdr) <= USBPD_SVDM_DISCOVER_SVIDS) {
1761 if (pd->vdm_tx_retry) {
1762 usbpd_dbg(&pd->dev, "Previous Discover VDM command %d not ACKed/NAKed\n",
1763 SVDM_HDR_CMD(
1764 pd->vdm_tx_retry->data[0]));
1765 kfree(pd->vdm_tx_retry);
1766 }
1767 pd->vdm_tx_retry = pd->vdm_tx;
1768 } else {
1769 kfree(pd->vdm_tx);
1770 }
1771
1772 pd->vdm_tx = NULL;
1773 }
1774}
1775
1776static void reset_vdm_state(struct usbpd *pd)
1777{
1778 struct usbpd_svid_handler *handler;
1779
Mayank Rana83443202017-08-31 15:38:03 -07001780 mutex_lock(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08001781 list_for_each_entry(handler, &pd->svid_handlers, entry) {
1782 if (handler->discovered) {
1783 handler->disconnect(handler);
1784 handler->discovered = false;
1785 }
1786 }
1787
Mayank Rana83443202017-08-31 15:38:03 -07001788 mutex_unlock(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08001789 pd->vdm_state = VDM_NONE;
1790 kfree(pd->vdm_tx_retry);
1791 pd->vdm_tx_retry = NULL;
1792 kfree(pd->discovered_svids);
1793 pd->discovered_svids = NULL;
1794 pd->num_svids = 0;
1795 kfree(pd->vdm_tx);
1796 pd->vdm_tx = NULL;
1797}
1798
1799static void dr_swap(struct usbpd *pd)
1800{
1801 reset_vdm_state(pd);
Mayank Rana45b0bc42017-07-25 15:38:05 -07001802 usbpd_dbg(&pd->dev, "dr_swap: current_dr(%d)\n", pd->current_dr);
Jack Phamf4baeb12017-02-03 19:01:48 -08001803
1804 if (pd->current_dr == DR_DFP) {
1805 stop_usb_host(pd);
1806 start_usb_peripheral(pd);
1807 pd->current_dr = DR_UFP;
1808 } else if (pd->current_dr == DR_UFP) {
1809 stop_usb_peripheral(pd);
Mayank Rana45b0bc42017-07-25 15:38:05 -07001810 start_usb_host(pd, true);
Jack Phamf4baeb12017-02-03 19:01:48 -08001811 pd->current_dr = DR_DFP;
1812
Jack Phamf4baeb12017-02-03 19:01:48 -08001813 usbpd_send_svdm(pd, USBPD_SID, USBPD_SVDM_DISCOVER_IDENTITY,
1814 SVDM_CMD_TYPE_INITIATOR, 0, NULL, 0);
1815 }
1816
1817 pd_phy_update_roles(pd->current_dr, pd->current_pr);
Jack Phame232bde2017-03-02 11:37:00 -08001818 dual_role_instance_changed(pd->dual_role);
Jack Phamf4baeb12017-02-03 19:01:48 -08001819}
1820
1821
1822static void vconn_swap(struct usbpd *pd)
1823{
1824 int ret;
1825
1826 if (pd->vconn_enabled) {
1827 pd->current_state = PE_VCS_WAIT_FOR_VCONN;
1828 kick_sm(pd, VCONN_ON_TIME);
1829 } else {
1830 ret = regulator_enable(pd->vconn);
1831 if (ret) {
1832 usbpd_err(&pd->dev, "Unable to enable vconn\n");
1833 return;
1834 }
1835
1836 pd->vconn_enabled = true;
1837
1838 /*
1839 * Small delay to ensure Vconn has ramped up. This is well
1840 * below tVCONNSourceOn (100ms) so we still send PS_RDY within
1841 * the allowed time.
1842 */
1843 usleep_range(5000, 10000);
1844
1845 ret = pd_send_msg(pd, MSG_PS_RDY, NULL, 0, SOP_MSG);
1846 if (ret) {
1847 usbpd_err(&pd->dev, "Error sending PS_RDY\n");
1848 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
1849 PE_SRC_SEND_SOFT_RESET :
1850 PE_SNK_SEND_SOFT_RESET);
1851 return;
1852 }
1853 }
1854}
1855
1856static int enable_vbus(struct usbpd *pd)
1857{
1858 union power_supply_propval val = {0};
1859 int count = 100;
1860 int ret;
1861
1862 if (!check_vsafe0v)
1863 goto enable_reg;
1864
1865 /*
1866 * Check to make sure there's no lingering charge on
1867 * VBUS before enabling it as a source. If so poll here
1868 * until it goes below VSafe0V (0.8V) before proceeding.
1869 */
1870 while (count--) {
1871 ret = power_supply_get_property(pd->usb_psy,
1872 POWER_SUPPLY_PROP_VOLTAGE_NOW, &val);
1873 if (ret || val.intval <= 800000)
1874 break;
1875 usleep_range(20000, 30000);
1876 }
1877
1878 if (count < 99)
1879 msleep(100); /* need to wait an additional tCCDebounce */
1880
1881enable_reg:
1882 ret = regulator_enable(pd->vbus);
1883 if (ret)
1884 usbpd_err(&pd->dev, "Unable to enable vbus (%d)\n", ret);
1885 else
1886 pd->vbus_enabled = true;
1887
1888 return ret;
1889}
1890
1891static inline void rx_msg_cleanup(struct usbpd *pd)
1892{
1893 struct rx_msg *msg, *tmp;
1894 unsigned long flags;
1895
1896 spin_lock_irqsave(&pd->rx_lock, flags);
1897 list_for_each_entry_safe(msg, tmp, &pd->rx_q, entry) {
1898 list_del(&msg->entry);
1899 kfree(msg);
1900 }
1901 spin_unlock_irqrestore(&pd->rx_lock, flags);
1902}
1903
1904/* For PD 3.0, check SinkTxOk before allowing initiating AMS */
1905static inline bool is_sink_tx_ok(struct usbpd *pd)
1906{
1907 if (pd->spec_rev == USBPD_REV_30)
1908 return pd->typec_mode == POWER_SUPPLY_TYPEC_SOURCE_HIGH;
1909
1910 return true;
1911}
1912
1913/* Handles current state and determines transitions */
1914static void usbpd_sm(struct work_struct *w)
1915{
1916 struct usbpd *pd = container_of(w, struct usbpd, sm_work);
1917 union power_supply_propval val = {0};
1918 int ret;
1919 struct rx_msg *rx_msg = NULL;
1920 unsigned long flags;
1921
1922 usbpd_dbg(&pd->dev, "handle state %s\n",
1923 usbpd_state_strings[pd->current_state]);
1924
1925 hrtimer_cancel(&pd->timer);
1926 pd->sm_queued = false;
1927
1928 spin_lock_irqsave(&pd->rx_lock, flags);
1929 if (!list_empty(&pd->rx_q)) {
1930 rx_msg = list_first_entry(&pd->rx_q, struct rx_msg, entry);
1931 list_del(&rx_msg->entry);
1932 }
1933 spin_unlock_irqrestore(&pd->rx_lock, flags);
1934
1935 /* Disconnect? */
1936 if (pd->current_pr == PR_NONE) {
1937 if (pd->current_state == PE_UNKNOWN)
1938 goto sm_done;
1939
Hemant Kumar86bd10f2017-05-24 12:25:15 -07001940 if (pd->vconn_enabled) {
1941 regulator_disable(pd->vconn);
1942 pd->vconn_enabled = false;
1943 }
1944
Jack Phamf4baeb12017-02-03 19:01:48 -08001945 usbpd_info(&pd->dev, "USB Type-C disconnect\n");
1946
1947 if (pd->pd_phy_opened) {
1948 pd_phy_close();
1949 pd->pd_phy_opened = false;
1950 }
1951
1952 pd->in_pr_swap = false;
1953 pd->pd_connected = false;
1954 pd->in_explicit_contract = false;
1955 pd->hard_reset_recvd = false;
1956 pd->caps_count = 0;
1957 pd->hard_reset_count = 0;
Jack Phamf4baeb12017-02-03 19:01:48 -08001958 pd->requested_voltage = 0;
1959 pd->requested_current = 0;
Jack Phamf6c02da2017-01-31 15:23:56 -08001960 pd->selected_pdo = pd->requested_pdo = 0;
Jack Phamf4baeb12017-02-03 19:01:48 -08001961 memset(&pd->received_pdos, 0, sizeof(pd->received_pdos));
1962 rx_msg_cleanup(pd);
1963
Jack Phamf4baeb12017-02-03 19:01:48 -08001964 power_supply_set_property(pd->usb_psy,
1965 POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
1966
1967 power_supply_set_property(pd->usb_psy,
1968 POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED,
1969 &val);
1970
1971 power_supply_set_property(pd->usb_psy,
1972 POWER_SUPPLY_PROP_PD_ACTIVE, &val);
1973
1974 if (pd->vbus_enabled) {
1975 regulator_disable(pd->vbus);
1976 pd->vbus_enabled = false;
1977 }
1978
Mayank Rana86cb20292017-06-01 11:36:07 -07001979 reset_vdm_state(pd);
Jack Phamf4baeb12017-02-03 19:01:48 -08001980 if (pd->current_dr == DR_UFP)
1981 stop_usb_peripheral(pd);
1982 else if (pd->current_dr == DR_DFP)
1983 stop_usb_host(pd);
1984
Jack Phamf4baeb12017-02-03 19:01:48 -08001985 pd->current_dr = DR_NONE;
1986
Jack Phamf4baeb12017-02-03 19:01:48 -08001987 if (pd->current_state == PE_ERROR_RECOVERY)
1988 /* forced disconnect, wait before resetting to DRP */
1989 usleep_range(ERROR_RECOVERY_TIME * USEC_PER_MSEC,
1990 (ERROR_RECOVERY_TIME + 5) * USEC_PER_MSEC);
1991
Jack Pham01c5cfd2017-06-06 22:22:18 -07001992 val.intval = 0;
1993 power_supply_set_property(pd->usb_psy,
1994 POWER_SUPPLY_PROP_PR_SWAP, &val);
1995
Jack Phamf4baeb12017-02-03 19:01:48 -08001996 /* set due to dual_role class "mode" change */
1997 if (pd->forced_pr != POWER_SUPPLY_TYPEC_PR_NONE)
1998 val.intval = pd->forced_pr;
Hemant Kumarbe746222017-07-20 13:51:49 -07001999 else if (rev3_sink_only)
2000 val.intval = POWER_SUPPLY_TYPEC_PR_SINK;
Jack Phamf4baeb12017-02-03 19:01:48 -08002001 else
2002 /* Set CC back to DRP toggle */
2003 val.intval = POWER_SUPPLY_TYPEC_PR_DUAL;
2004
2005 power_supply_set_property(pd->usb_psy,
2006 POWER_SUPPLY_PROP_TYPEC_POWER_ROLE, &val);
2007 pd->forced_pr = POWER_SUPPLY_TYPEC_PR_NONE;
2008
2009 pd->current_state = PE_UNKNOWN;
2010
2011 kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
2012 dual_role_instance_changed(pd->dual_role);
2013
2014 goto sm_done;
2015 }
2016
2017 /* Hard reset? */
2018 if (pd->hard_reset_recvd) {
2019 pd->hard_reset_recvd = false;
2020
Jack Pham6de20802017-05-24 13:44:56 -07002021 if (pd->requested_current) {
2022 val.intval = pd->requested_current = 0;
2023 power_supply_set_property(pd->usb_psy,
2024 POWER_SUPPLY_PROP_PD_CURRENT_MAX, &val);
2025 }
2026
2027 pd->requested_voltage = 5000000;
2028 val.intval = pd->requested_voltage;
2029 power_supply_set_property(pd->usb_psy,
Nicholas Troast7f55c922017-07-25 13:18:03 -07002030 POWER_SUPPLY_PROP_PD_VOLTAGE_MIN, &val);
Jack Pham6de20802017-05-24 13:44:56 -07002031
Jack Phamf4baeb12017-02-03 19:01:48 -08002032 pd->in_pr_swap = false;
Jack Pham857ee682017-05-25 11:53:36 -07002033 val.intval = 0;
2034 power_supply_set_property(pd->usb_psy,
2035 POWER_SUPPLY_PROP_PR_SWAP, &val);
2036
Jack Phamf6c02da2017-01-31 15:23:56 -08002037 pd->in_explicit_contract = false;
2038 pd->selected_pdo = pd->requested_pdo = 0;
2039 pd->rdo = 0;
Jack Phamf4baeb12017-02-03 19:01:48 -08002040 rx_msg_cleanup(pd);
2041 reset_vdm_state(pd);
Jack Phamf6c02da2017-01-31 15:23:56 -08002042 kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
Jack Phamf4baeb12017-02-03 19:01:48 -08002043
2044 if (pd->current_pr == PR_SINK) {
2045 usbpd_set_state(pd, PE_SNK_TRANSITION_TO_DEFAULT);
2046 } else {
2047 pd->current_state = PE_SRC_TRANSITION_TO_DEFAULT;
2048 kick_sm(pd, PS_HARD_RESET_TIME);
2049 }
2050
2051 goto sm_done;
2052 }
2053
2054 /* Soft reset? */
2055 if (IS_CTRL(rx_msg, MSG_SOFT_RESET)) {
2056 usbpd_dbg(&pd->dev, "Handle soft reset\n");
2057
2058 if (pd->current_pr == PR_SRC)
2059 pd->current_state = PE_SRC_SOFT_RESET;
2060 else if (pd->current_pr == PR_SINK)
2061 pd->current_state = PE_SNK_SOFT_RESET;
2062 }
2063
2064 switch (pd->current_state) {
2065 case PE_UNKNOWN:
Jack Phamc4be61c2017-10-10 16:59:32 -07002066 val.intval = 0;
2067 power_supply_set_property(pd->usb_psy,
2068 POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
2069
Jack Phamf4baeb12017-02-03 19:01:48 -08002070 if (pd->current_pr == PR_SINK) {
2071 usbpd_set_state(pd, PE_SNK_STARTUP);
2072 } else if (pd->current_pr == PR_SRC) {
2073 enable_vbus(pd);
2074 if (!pd->vconn_enabled &&
2075 pd->typec_mode ==
2076 POWER_SUPPLY_TYPEC_SINK_POWERED_CABLE) {
2077 ret = regulator_enable(pd->vconn);
2078 if (ret)
2079 usbpd_err(&pd->dev, "Unable to enable vconn\n");
2080 else
2081 pd->vconn_enabled = true;
2082 }
2083
2084 usbpd_set_state(pd, PE_SRC_STARTUP);
2085 }
2086 break;
2087
2088 case PE_SRC_STARTUP:
2089 usbpd_set_state(pd, PE_SRC_STARTUP);
2090 break;
2091
2092 case PE_SRC_SEND_CAPABILITIES:
2093 ret = pd_send_msg(pd, MSG_SOURCE_CAPABILITIES, default_src_caps,
2094 ARRAY_SIZE(default_src_caps), SOP_MSG);
2095 if (ret) {
2096 pd->caps_count++;
Mayank Rana38e9b252017-03-23 12:35:57 -07002097 if (pd->caps_count >= PD_CAPS_COUNT) {
Jack Phamf4baeb12017-02-03 19:01:48 -08002098 usbpd_dbg(&pd->dev, "Src CapsCounter exceeded, disabling PD\n");
2099 usbpd_set_state(pd, PE_SRC_DISABLED);
2100
2101 val.intval = 0;
2102 power_supply_set_property(pd->usb_psy,
2103 POWER_SUPPLY_PROP_PD_ACTIVE,
2104 &val);
2105 break;
2106 }
2107
2108 kick_sm(pd, SRC_CAP_TIME);
2109 break;
2110 }
2111
2112 /* transmit was successful if GoodCRC was received */
2113 pd->caps_count = 0;
2114 pd->hard_reset_count = 0;
2115 pd->pd_connected = true; /* we know peer is PD capable */
2116
2117 /* wait for REQUEST */
2118 pd->current_state = PE_SRC_SEND_CAPABILITIES_WAIT;
2119 kick_sm(pd, SENDER_RESPONSE_TIME);
2120
2121 val.intval = 1;
2122 power_supply_set_property(pd->usb_psy,
2123 POWER_SUPPLY_PROP_PD_ACTIVE, &val);
2124 break;
2125
2126 case PE_SRC_SEND_CAPABILITIES_WAIT:
2127 if (IS_DATA(rx_msg, MSG_REQUEST)) {
Jack Phamf3c1bd32017-08-02 18:32:23 -07002128 pd->rdo = *(u32 *)rx_msg->payload;
Jack Phamf4baeb12017-02-03 19:01:48 -08002129 usbpd_set_state(pd, PE_SRC_NEGOTIATE_CAPABILITY);
2130 } else if (rx_msg) {
2131 usbpd_err(&pd->dev, "Unexpected message received\n");
2132 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2133 } else {
2134 usbpd_set_state(pd, PE_SRC_HARD_RESET);
2135 }
2136 break;
2137
2138 case PE_SRC_READY:
2139 if (IS_CTRL(rx_msg, MSG_GET_SOURCE_CAP)) {
Hemant Kumaree2db9b2017-05-30 14:52:18 -07002140 pd->current_state = PE_SRC_SEND_CAPABILITIES;
2141 kick_sm(pd, 0);
Jack Phamf4baeb12017-02-03 19:01:48 -08002142 } else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
2143 ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
Jack Phamee1f9052017-01-26 12:27:07 -08002144 pd->sink_caps, pd->num_sink_caps,
2145 SOP_MSG);
Jack Phamf4baeb12017-02-03 19:01:48 -08002146 if (ret) {
2147 usbpd_err(&pd->dev, "Error sending Sink Caps\n");
2148 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2149 }
2150 } else if (IS_DATA(rx_msg, MSG_REQUEST)) {
Jack Phamf3c1bd32017-08-02 18:32:23 -07002151 pd->rdo = *(u32 *)rx_msg->payload;
Jack Phamf4baeb12017-02-03 19:01:48 -08002152 usbpd_set_state(pd, PE_SRC_NEGOTIATE_CAPABILITY);
2153 } else if (IS_CTRL(rx_msg, MSG_DR_SWAP)) {
2154 if (pd->vdm_state == MODE_ENTERED) {
2155 usbpd_set_state(pd, PE_SRC_HARD_RESET);
2156 break;
2157 }
2158
2159 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
2160 if (ret) {
2161 usbpd_err(&pd->dev, "Error sending Accept\n");
2162 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2163 break;
2164 }
2165
2166 dr_swap(pd);
2167 } else if (IS_CTRL(rx_msg, MSG_PR_SWAP)) {
2168 /* lock in current mode */
2169 set_power_role(pd, pd->current_pr);
2170
2171 /* we'll happily accept Src->Sink requests anytime */
2172 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
2173 if (ret) {
2174 usbpd_err(&pd->dev, "Error sending Accept\n");
2175 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2176 break;
2177 }
2178
2179 pd->current_state = PE_PRS_SRC_SNK_TRANSITION_TO_OFF;
2180 kick_sm(pd, SRC_TRANSITION_TIME);
2181 break;
2182 } else if (IS_CTRL(rx_msg, MSG_VCONN_SWAP)) {
2183 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
2184 if (ret) {
2185 usbpd_err(&pd->dev, "Error sending Accept\n");
2186 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2187 break;
2188 }
2189
2190 vconn_swap(pd);
2191 } else if (IS_DATA(rx_msg, MSG_VDM)) {
2192 handle_vdm_rx(pd, rx_msg);
Jack Pham69a427e2017-08-04 12:26:51 -07002193 } else if (rx_msg && pd->spec_rev == USBPD_REV_30) {
2194 /* unhandled messages */
2195 ret = pd_send_msg(pd, MSG_NOT_SUPPORTED, NULL, 0,
2196 SOP_MSG);
2197 if (ret) {
2198 usbpd_err(&pd->dev, "Error sending Not supported\n");
2199 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2200 }
2201 break;
Jack Phamf4baeb12017-02-03 19:01:48 -08002202 } else if (pd->send_pr_swap) {
2203 pd->send_pr_swap = false;
2204 ret = pd_send_msg(pd, MSG_PR_SWAP, NULL, 0, SOP_MSG);
2205 if (ret) {
2206 dev_err(&pd->dev, "Error sending PR Swap\n");
2207 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2208 break;
2209 }
2210
2211 pd->current_state = PE_PRS_SRC_SNK_SEND_SWAP;
2212 kick_sm(pd, SENDER_RESPONSE_TIME);
2213 } else if (pd->send_dr_swap) {
2214 pd->send_dr_swap = false;
2215 ret = pd_send_msg(pd, MSG_DR_SWAP, NULL, 0, SOP_MSG);
2216 if (ret) {
2217 dev_err(&pd->dev, "Error sending DR Swap\n");
2218 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2219 break;
2220 }
2221
2222 pd->current_state = PE_DRS_SEND_DR_SWAP;
2223 kick_sm(pd, SENDER_RESPONSE_TIME);
2224 } else {
2225 handle_vdm_tx(pd);
2226 }
2227 break;
2228
2229 case PE_SRC_TRANSITION_TO_DEFAULT:
2230 if (pd->vconn_enabled)
2231 regulator_disable(pd->vconn);
Jack Phamc4be61c2017-10-10 16:59:32 -07002232 pd->vconn_enabled = false;
2233
Jack Phamf4baeb12017-02-03 19:01:48 -08002234 if (pd->vbus_enabled)
2235 regulator_disable(pd->vbus);
Jack Phamc4be61c2017-10-10 16:59:32 -07002236 pd->vbus_enabled = false;
Jack Phamf4baeb12017-02-03 19:01:48 -08002237
2238 if (pd->current_dr != DR_DFP) {
Jack Pham4e9dff72017-04-04 18:05:53 -07002239 extcon_set_state_sync(pd->extcon, EXTCON_USB, 0);
Jack Phamf4baeb12017-02-03 19:01:48 -08002240 pd->current_dr = DR_DFP;
2241 pd_phy_update_roles(pd->current_dr, pd->current_pr);
2242 }
2243
Jack Phamc4be61c2017-10-10 16:59:32 -07002244 /* PE_UNKNOWN will turn on VBUS and go back to PE_SRC_STARTUP */
2245 pd->current_state = PE_UNKNOWN;
2246 kick_sm(pd, SRC_RECOVER_TIME);
Jack Phamf4baeb12017-02-03 19:01:48 -08002247 break;
2248
2249 case PE_SRC_HARD_RESET:
2250 val.intval = 1;
2251 power_supply_set_property(pd->usb_psy,
2252 POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
2253
2254 pd_send_hard_reset(pd);
2255 pd->in_explicit_contract = false;
Jack Phamf6c02da2017-01-31 15:23:56 -08002256 pd->rdo = 0;
Jack Phamf4baeb12017-02-03 19:01:48 -08002257 rx_msg_cleanup(pd);
2258 reset_vdm_state(pd);
Jack Phamf6c02da2017-01-31 15:23:56 -08002259 kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
Jack Phamf4baeb12017-02-03 19:01:48 -08002260
2261 pd->current_state = PE_SRC_TRANSITION_TO_DEFAULT;
2262 kick_sm(pd, PS_HARD_RESET_TIME);
2263 break;
2264
2265 case PE_SNK_STARTUP:
2266 usbpd_set_state(pd, PE_SNK_STARTUP);
2267 break;
2268
2269 case PE_SNK_DISCOVERY:
2270 if (!rx_msg) {
2271 if (pd->vbus_present)
2272 usbpd_set_state(pd,
2273 PE_SNK_WAIT_FOR_CAPABILITIES);
2274
2275 /*
2276 * Handle disconnection in the middle of PR_Swap.
2277 * Since in psy_changed() if pd->in_pr_swap is true
2278 * we ignore the typec_mode==NONE change since that is
2279 * expected to happen. However if the cable really did
2280 * get disconnected we need to check for it here after
2281 * waiting for VBUS presence times out.
2282 */
2283 if (!pd->typec_mode) {
2284 pd->current_pr = PR_NONE;
2285 kick_sm(pd, 0);
2286 }
2287
2288 break;
2289 }
2290 /* else fall-through */
2291
2292 case PE_SNK_WAIT_FOR_CAPABILITIES:
2293 pd->in_pr_swap = false;
Jack Pham857ee682017-05-25 11:53:36 -07002294 val.intval = 0;
2295 power_supply_set_property(pd->usb_psy,
2296 POWER_SUPPLY_PROP_PR_SWAP, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08002297
2298 if (IS_DATA(rx_msg, MSG_SOURCE_CAPABILITIES)) {
2299 val.intval = 0;
2300 power_supply_set_property(pd->usb_psy,
2301 POWER_SUPPLY_PROP_PD_IN_HARD_RESET,
2302 &val);
2303
2304 /* save the PDOs so userspace can further evaluate */
2305 memcpy(&pd->received_pdos, rx_msg->payload,
2306 sizeof(pd->received_pdos));
2307 pd->src_cap_id++;
2308
2309 usbpd_set_state(pd, PE_SNK_EVALUATE_CAPABILITY);
2310
2311 val.intval = 1;
2312 power_supply_set_property(pd->usb_psy,
2313 POWER_SUPPLY_PROP_PD_ACTIVE, &val);
2314 } else if (pd->hard_reset_count < 3) {
2315 usbpd_set_state(pd, PE_SNK_HARD_RESET);
Jack Phamf4baeb12017-02-03 19:01:48 -08002316 } else {
2317 usbpd_dbg(&pd->dev, "Sink hard reset count exceeded, disabling PD\n");
2318
2319 val.intval = 0;
2320 power_supply_set_property(pd->usb_psy,
2321 POWER_SUPPLY_PROP_PD_IN_HARD_RESET,
2322 &val);
2323
2324 val.intval = 0;
2325 power_supply_set_property(pd->usb_psy,
2326 POWER_SUPPLY_PROP_PD_ACTIVE, &val);
2327 }
2328 break;
2329
2330 case PE_SNK_SELECT_CAPABILITY:
2331 if (IS_CTRL(rx_msg, MSG_ACCEPT)) {
Jack Pham78c869a2017-02-14 16:10:28 -08002332 u32 pdo = pd->received_pdos[pd->requested_pdo - 1];
2333 bool same_pps = (pd->selected_pdo == pd->requested_pdo)
2334 && (PD_SRC_PDO_TYPE(pdo) ==
2335 PD_SRC_PDO_TYPE_AUGMENTED);
2336
Jack Phamf4baeb12017-02-03 19:01:48 -08002337 usbpd_set_state(pd, PE_SNK_TRANSITION_SINK);
2338
2339 /* prepare for voltage increase/decrease */
2340 val.intval = pd->requested_voltage;
2341 power_supply_set_property(pd->usb_psy,
2342 pd->requested_voltage >= pd->current_voltage ?
Nicholas Troast7f55c922017-07-25 13:18:03 -07002343 POWER_SUPPLY_PROP_PD_VOLTAGE_MAX :
2344 POWER_SUPPLY_PROP_PD_VOLTAGE_MIN,
Jack Phamf4baeb12017-02-03 19:01:48 -08002345 &val);
2346
2347 /*
Jack Pham78c869a2017-02-14 16:10:28 -08002348 * if changing voltages (not within the same PPS PDO),
2349 * we must lower input current to pSnkStdby (2.5W).
2350 * Calculate it and set PD_CURRENT_MAX accordingly.
Jack Phamf4baeb12017-02-03 19:01:48 -08002351 */
Jack Pham78c869a2017-02-14 16:10:28 -08002352 if (!same_pps &&
2353 pd->requested_voltage != pd->current_voltage) {
Jack Phamf4baeb12017-02-03 19:01:48 -08002354 int mv = max(pd->requested_voltage,
2355 pd->current_voltage) / 1000;
2356 val.intval = (2500000 / mv) * 1000;
2357 power_supply_set_property(pd->usb_psy,
2358 POWER_SUPPLY_PROP_PD_CURRENT_MAX, &val);
2359 } else {
2360 /* decreasing current? */
2361 ret = power_supply_get_property(pd->usb_psy,
2362 POWER_SUPPLY_PROP_PD_CURRENT_MAX, &val);
2363 if (!ret &&
2364 pd->requested_current < val.intval) {
2365 val.intval =
2366 pd->requested_current * 1000;
2367 power_supply_set_property(pd->usb_psy,
2368 POWER_SUPPLY_PROP_PD_CURRENT_MAX,
2369 &val);
2370 }
2371 }
2372
2373 pd->selected_pdo = pd->requested_pdo;
2374 } else if (IS_CTRL(rx_msg, MSG_REJECT) ||
2375 IS_CTRL(rx_msg, MSG_WAIT)) {
2376 if (pd->in_explicit_contract)
2377 usbpd_set_state(pd, PE_SNK_READY);
2378 else
2379 usbpd_set_state(pd,
2380 PE_SNK_WAIT_FOR_CAPABILITIES);
2381 } else if (rx_msg) {
2382 usbpd_err(&pd->dev, "Invalid response to sink request\n");
2383 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2384 } else {
2385 /* timed out; go to hard reset */
2386 usbpd_set_state(pd, PE_SNK_HARD_RESET);
2387 }
2388 break;
2389
2390 case PE_SNK_TRANSITION_SINK:
2391 if (IS_CTRL(rx_msg, MSG_PS_RDY)) {
2392 val.intval = pd->requested_voltage;
2393 power_supply_set_property(pd->usb_psy,
2394 pd->requested_voltage >= pd->current_voltage ?
Nicholas Troast7f55c922017-07-25 13:18:03 -07002395 POWER_SUPPLY_PROP_PD_VOLTAGE_MIN :
2396 POWER_SUPPLY_PROP_PD_VOLTAGE_MAX, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08002397 pd->current_voltage = pd->requested_voltage;
2398
2399 /* resume charging */
2400 val.intval = pd->requested_current * 1000; /* mA->uA */
2401 power_supply_set_property(pd->usb_psy,
2402 POWER_SUPPLY_PROP_PD_CURRENT_MAX, &val);
2403
2404 usbpd_set_state(pd, PE_SNK_READY);
2405 } else {
2406 /* timed out; go to hard reset */
2407 usbpd_set_state(pd, PE_SNK_HARD_RESET);
2408 }
2409 break;
2410
2411 case PE_SNK_READY:
2412 if (IS_DATA(rx_msg, MSG_SOURCE_CAPABILITIES)) {
2413 /* save the PDOs so userspace can further evaluate */
2414 memcpy(&pd->received_pdos, rx_msg->payload,
2415 sizeof(pd->received_pdos));
2416 pd->src_cap_id++;
2417
2418 usbpd_set_state(pd, PE_SNK_EVALUATE_CAPABILITY);
2419 } else if (IS_CTRL(rx_msg, MSG_GET_SINK_CAP)) {
2420 ret = pd_send_msg(pd, MSG_SINK_CAPABILITIES,
Jack Phamee1f9052017-01-26 12:27:07 -08002421 pd->sink_caps, pd->num_sink_caps,
2422 SOP_MSG);
Jack Phamf4baeb12017-02-03 19:01:48 -08002423 if (ret) {
2424 usbpd_err(&pd->dev, "Error sending Sink Caps\n");
2425 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2426 }
Jack Pham69a427e2017-08-04 12:26:51 -07002427 } else if (IS_CTRL(rx_msg, MSG_GET_SOURCE_CAP) &&
2428 pd->spec_rev == USBPD_REV_20) {
Jack Phamf4baeb12017-02-03 19:01:48 -08002429 ret = pd_send_msg(pd, MSG_SOURCE_CAPABILITIES,
2430 default_src_caps,
2431 ARRAY_SIZE(default_src_caps), SOP_MSG);
2432 if (ret) {
2433 usbpd_err(&pd->dev, "Error sending SRC CAPs\n");
2434 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2435 break;
2436 }
2437 } else if (IS_CTRL(rx_msg, MSG_DR_SWAP)) {
2438 if (pd->vdm_state == MODE_ENTERED) {
2439 usbpd_set_state(pd, PE_SNK_HARD_RESET);
2440 break;
2441 }
2442
2443 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
2444 if (ret) {
2445 usbpd_err(&pd->dev, "Error sending Accept\n");
2446 usbpd_set_state(pd, PE_SRC_SEND_SOFT_RESET);
2447 break;
2448 }
2449
2450 dr_swap(pd);
Jack Pham69a427e2017-08-04 12:26:51 -07002451 } else if (IS_CTRL(rx_msg, MSG_PR_SWAP) &&
2452 pd->spec_rev == USBPD_REV_20) {
Jack Phamf4baeb12017-02-03 19:01:48 -08002453 /* lock in current mode */
2454 set_power_role(pd, pd->current_pr);
2455
2456 /* TODO: should we Reject in certain circumstances? */
2457 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
2458 if (ret) {
2459 usbpd_err(&pd->dev, "Error sending Accept\n");
2460 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2461 break;
2462 }
2463
2464 pd->in_pr_swap = true;
Jack Pham857ee682017-05-25 11:53:36 -07002465 val.intval = 1;
2466 power_supply_set_property(pd->usb_psy,
2467 POWER_SUPPLY_PROP_PR_SWAP, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08002468 usbpd_set_state(pd, PE_PRS_SNK_SRC_TRANSITION_TO_OFF);
2469 break;
Jack Pham69a427e2017-08-04 12:26:51 -07002470 } else if (IS_CTRL(rx_msg, MSG_VCONN_SWAP) &&
2471 pd->spec_rev == USBPD_REV_20) {
Jack Phamf4baeb12017-02-03 19:01:48 -08002472 /*
2473 * if VCONN is connected to VBUS, make sure we are
2474 * not in high voltage contract, otherwise reject.
2475 */
2476 if (!pd->vconn_is_external &&
2477 (pd->requested_voltage > 5000000)) {
2478 ret = pd_send_msg(pd, MSG_REJECT, NULL, 0,
2479 SOP_MSG);
2480 if (ret) {
2481 usbpd_err(&pd->dev, "Error sending Reject\n");
2482 usbpd_set_state(pd,
2483 PE_SNK_SEND_SOFT_RESET);
2484 }
2485
2486 break;
2487 }
2488
2489 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
2490 if (ret) {
2491 usbpd_err(&pd->dev, "Error sending Accept\n");
2492 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2493 break;
2494 }
2495
2496 vconn_swap(pd);
2497 } else if (IS_DATA(rx_msg, MSG_VDM)) {
2498 handle_vdm_rx(pd, rx_msg);
Hemant Kumar018b5982017-08-09 14:14:37 -07002499 } else if (pd->send_get_src_cap_ext && is_sink_tx_ok(pd)) {
2500 pd->send_get_src_cap_ext = false;
2501 ret = pd_send_msg(pd, MSG_GET_SOURCE_CAP_EXTENDED, NULL,
2502 0, SOP_MSG);
2503 if (ret) {
2504 dev_err(&pd->dev,
2505 "Error sending get_src_cap_ext\n");
2506 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2507 break;
2508 }
2509 kick_sm(pd, SENDER_RESPONSE_TIME);
2510 } else if (rx_msg &&
2511 IS_EXT(rx_msg, MSG_SOURCE_CAPABILITIES_EXTENDED)) {
2512 if (rx_msg->data_len != PD_SRC_CAP_EXT_DB_LEN) {
2513 usbpd_err(&pd->dev, "Invalid src cap ext db\n");
2514 break;
2515 }
2516 memcpy(&pd->src_cap_ext_db, rx_msg->payload,
2517 sizeof(pd->src_cap_ext_db));
2518 complete(&pd->is_ready);
2519 } else if (pd->send_get_pps_status && is_sink_tx_ok(pd)) {
2520 pd->send_get_pps_status = false;
2521 ret = pd_send_msg(pd, MSG_GET_PPS_STATUS, NULL,
2522 0, SOP_MSG);
2523 if (ret) {
2524 dev_err(&pd->dev,
2525 "Error sending get_pps_status\n");
2526 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2527 break;
2528 }
2529 kick_sm(pd, SENDER_RESPONSE_TIME);
2530 } else if (rx_msg &&
2531 IS_EXT(rx_msg, MSG_PPS_STATUS)) {
2532 if (rx_msg->data_len != sizeof(pd->pps_status_db)) {
2533 usbpd_err(&pd->dev, "Invalid pps status db\n");
2534 break;
2535 }
2536 memcpy(&pd->pps_status_db, rx_msg->payload,
2537 sizeof(pd->pps_status_db));
2538 complete(&pd->is_ready);
Hemant Kumara1875942017-08-09 16:50:14 -07002539 } else if (IS_DATA(rx_msg, MSG_ALERT)) {
2540 if (rx_msg->data_len != sizeof(pd->received_ado)) {
2541 usbpd_err(&pd->dev, "Invalid ado\n");
2542 break;
2543 }
2544 memcpy(&pd->received_ado, rx_msg->payload,
2545 sizeof(pd->received_ado));
2546 ret = pd_send_msg(pd, MSG_GET_STATUS, NULL,
2547 0, SOP_MSG);
2548 if (ret) {
2549 dev_err(&pd->dev,
2550 "Error sending get_status\n");
2551 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2552 break;
2553 }
2554 kick_sm(pd, SENDER_RESPONSE_TIME);
2555 } else if (rx_msg &&
2556 IS_EXT(rx_msg, MSG_STATUS)) {
2557 if (rx_msg->data_len != PD_STATUS_DB_LEN) {
2558 usbpd_err(&pd->dev, "Invalid status db\n");
2559 break;
2560 }
2561 memcpy(&pd->status_db, rx_msg->payload,
2562 sizeof(pd->status_db));
2563 kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
Hemant Kumar51ded972017-08-09 17:57:24 -07002564 } else if (pd->send_get_battery_cap && is_sink_tx_ok(pd)) {
2565 pd->send_get_battery_cap = false;
2566 ret = pd_send_ext_msg(pd, MSG_GET_BATTERY_CAP,
2567 &pd->get_battery_cap_db, 1, SOP_MSG);
2568 if (ret) {
2569 dev_err(&pd->dev,
2570 "Error sending get_battery_cap\n");
2571 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2572 break;
2573 }
2574 kick_sm(pd, SENDER_RESPONSE_TIME);
2575 } else if (rx_msg &&
2576 IS_EXT(rx_msg, MSG_BATTERY_CAPABILITIES)) {
2577 if (rx_msg->data_len != PD_BATTERY_CAP_DB_LEN) {
2578 usbpd_err(&pd->dev, "Invalid battery cap db\n");
2579 break;
2580 }
2581 memcpy(&pd->battery_cap_db, rx_msg->payload,
2582 sizeof(pd->battery_cap_db));
2583 complete(&pd->is_ready);
2584 } else if (pd->send_get_battery_status && is_sink_tx_ok(pd)) {
2585 pd->send_get_battery_status = false;
2586 ret = pd_send_ext_msg(pd, MSG_GET_BATTERY_STATUS,
2587 &pd->get_battery_status_db, 1, SOP_MSG);
2588 if (ret) {
2589 dev_err(&pd->dev,
2590 "Error sending get_battery_status\n");
2591 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2592 break;
2593 }
2594 kick_sm(pd, SENDER_RESPONSE_TIME);
2595 } else if (rx_msg &&
2596 IS_EXT(rx_msg, MSG_BATTERY_STATUS)) {
2597 if (rx_msg->data_len != sizeof(pd->battery_sts_dobj)) {
2598 usbpd_err(&pd->dev, "Invalid bat sts dobj\n");
2599 break;
2600 }
2601 memcpy(&pd->battery_sts_dobj, rx_msg->payload,
2602 sizeof(pd->battery_sts_dobj));
2603 complete(&pd->is_ready);
Jack Pham69a427e2017-08-04 12:26:51 -07002604 } else if (rx_msg && pd->spec_rev == USBPD_REV_30) {
2605 /* unhandled messages */
2606 ret = pd_send_msg(pd, MSG_NOT_SUPPORTED, NULL, 0,
2607 SOP_MSG);
2608 if (ret) {
2609 usbpd_err(&pd->dev, "Error sending Not supported\n");
2610 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2611 }
2612 break;
Jack Phamaf7d3842017-01-26 13:28:19 -08002613 } else if (pd->send_request) {
2614 pd->send_request = false;
2615 usbpd_set_state(pd, PE_SNK_SELECT_CAPABILITY);
Jack Phamf4baeb12017-02-03 19:01:48 -08002616 } else if (pd->send_pr_swap && is_sink_tx_ok(pd)) {
2617 pd->send_pr_swap = false;
2618 ret = pd_send_msg(pd, MSG_PR_SWAP, NULL, 0, SOP_MSG);
2619 if (ret) {
2620 dev_err(&pd->dev, "Error sending PR Swap\n");
2621 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2622 break;
2623 }
2624
2625 pd->current_state = PE_PRS_SNK_SRC_SEND_SWAP;
2626 kick_sm(pd, SENDER_RESPONSE_TIME);
2627 } else if (pd->send_dr_swap && is_sink_tx_ok(pd)) {
2628 pd->send_dr_swap = false;
2629 ret = pd_send_msg(pd, MSG_DR_SWAP, NULL, 0, SOP_MSG);
2630 if (ret) {
2631 dev_err(&pd->dev, "Error sending DR Swap\n");
2632 usbpd_set_state(pd, PE_SNK_SEND_SOFT_RESET);
2633 break;
2634 }
2635
2636 pd->current_state = PE_DRS_SEND_DR_SWAP;
2637 kick_sm(pd, SENDER_RESPONSE_TIME);
2638 } else if (is_sink_tx_ok(pd)) {
2639 handle_vdm_tx(pd);
2640 }
2641 break;
2642
2643 case PE_SNK_TRANSITION_TO_DEFAULT:
2644 usbpd_set_state(pd, PE_SNK_STARTUP);
2645 break;
2646
2647 case PE_SRC_SOFT_RESET:
2648 case PE_SNK_SOFT_RESET:
2649 pd_reset_protocol(pd);
2650
2651 ret = pd_send_msg(pd, MSG_ACCEPT, NULL, 0, SOP_MSG);
2652 if (ret) {
2653 usbpd_err(&pd->dev, "%s: Error sending Accept, do Hard Reset\n",
2654 usbpd_state_strings[pd->current_state]);
2655 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
2656 PE_SRC_HARD_RESET : PE_SNK_HARD_RESET);
2657 break;
2658 }
2659
2660 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
2661 PE_SRC_SEND_CAPABILITIES :
2662 PE_SNK_WAIT_FOR_CAPABILITIES);
2663 break;
2664
2665 case PE_SRC_SEND_SOFT_RESET:
2666 case PE_SNK_SEND_SOFT_RESET:
2667 if (IS_CTRL(rx_msg, MSG_ACCEPT)) {
2668 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
2669 PE_SRC_SEND_CAPABILITIES :
2670 PE_SNK_WAIT_FOR_CAPABILITIES);
2671 } else {
2672 usbpd_err(&pd->dev, "%s: Did not see Accept, do Hard Reset\n",
2673 usbpd_state_strings[pd->current_state]);
2674 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
2675 PE_SRC_HARD_RESET : PE_SNK_HARD_RESET);
2676 }
2677 break;
2678
2679 case PE_SNK_HARD_RESET:
2680 /* prepare charger for VBUS change */
2681 val.intval = 1;
2682 power_supply_set_property(pd->usb_psy,
2683 POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);
2684
2685 pd->requested_voltage = 5000000;
2686
2687 if (pd->requested_current) {
2688 val.intval = pd->requested_current = 0;
2689 power_supply_set_property(pd->usb_psy,
2690 POWER_SUPPLY_PROP_PD_CURRENT_MAX, &val);
2691 }
2692
2693 val.intval = pd->requested_voltage;
2694 power_supply_set_property(pd->usb_psy,
Nicholas Troast7f55c922017-07-25 13:18:03 -07002695 POWER_SUPPLY_PROP_PD_VOLTAGE_MIN, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08002696
2697 pd_send_hard_reset(pd);
2698 pd->in_explicit_contract = false;
Jack Phamf6c02da2017-01-31 15:23:56 -08002699 pd->selected_pdo = pd->requested_pdo = 0;
2700 pd->rdo = 0;
Jack Phamf4baeb12017-02-03 19:01:48 -08002701 reset_vdm_state(pd);
Jack Phamf6c02da2017-01-31 15:23:56 -08002702 kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
Jack Phamf4baeb12017-02-03 19:01:48 -08002703 usbpd_set_state(pd, PE_SNK_TRANSITION_TO_DEFAULT);
2704 break;
2705
2706 case PE_DRS_SEND_DR_SWAP:
2707 if (IS_CTRL(rx_msg, MSG_ACCEPT))
2708 dr_swap(pd);
2709
2710 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
2711 PE_SRC_READY : PE_SNK_READY);
2712 break;
2713
2714 case PE_PRS_SRC_SNK_SEND_SWAP:
2715 if (!IS_CTRL(rx_msg, MSG_ACCEPT)) {
2716 pd->current_state = PE_SRC_READY;
2717 break;
2718 }
2719
2720 pd->current_state = PE_PRS_SRC_SNK_TRANSITION_TO_OFF;
2721 kick_sm(pd, SRC_TRANSITION_TIME);
2722 break;
2723
2724 case PE_PRS_SRC_SNK_TRANSITION_TO_OFF:
2725 pd->in_pr_swap = true;
Jack Pham857ee682017-05-25 11:53:36 -07002726 val.intval = 1;
2727 power_supply_set_property(pd->usb_psy,
2728 POWER_SUPPLY_PROP_PR_SWAP, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08002729 pd->in_explicit_contract = false;
2730
2731 if (pd->vbus_enabled) {
2732 regulator_disable(pd->vbus);
2733 pd->vbus_enabled = false;
2734 }
2735
2736 /* PE_PRS_SRC_SNK_Assert_Rd */
2737 pd->current_pr = PR_SINK;
2738 set_power_role(pd, pd->current_pr);
2739 pd_phy_update_roles(pd->current_dr, pd->current_pr);
2740
2741 /* allow time for Vbus discharge, must be < tSrcSwapStdby */
2742 msleep(500);
2743
2744 ret = pd_send_msg(pd, MSG_PS_RDY, NULL, 0, SOP_MSG);
2745 if (ret) {
2746 usbpd_err(&pd->dev, "Error sending PS_RDY\n");
2747 usbpd_set_state(pd, PE_ERROR_RECOVERY);
2748 break;
2749 }
2750
2751 pd->current_state = PE_PRS_SRC_SNK_WAIT_SOURCE_ON;
2752 kick_sm(pd, PS_SOURCE_ON);
2753 break;
2754
2755 case PE_PRS_SRC_SNK_WAIT_SOURCE_ON:
2756 if (IS_CTRL(rx_msg, MSG_PS_RDY))
2757 usbpd_set_state(pd, PE_SNK_STARTUP);
2758 else
2759 usbpd_set_state(pd, PE_ERROR_RECOVERY);
2760 break;
2761
2762 case PE_PRS_SNK_SRC_SEND_SWAP:
2763 if (!IS_CTRL(rx_msg, MSG_ACCEPT)) {
2764 pd->current_state = PE_SNK_READY;
2765 break;
2766 }
2767
2768 pd->in_pr_swap = true;
Jack Pham857ee682017-05-25 11:53:36 -07002769 val.intval = 1;
2770 power_supply_set_property(pd->usb_psy,
2771 POWER_SUPPLY_PROP_PR_SWAP, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08002772 usbpd_set_state(pd, PE_PRS_SNK_SRC_TRANSITION_TO_OFF);
2773 break;
2774
2775 case PE_PRS_SNK_SRC_TRANSITION_TO_OFF:
2776 if (!IS_CTRL(rx_msg, MSG_PS_RDY)) {
2777 usbpd_set_state(pd, PE_ERROR_RECOVERY);
2778 break;
2779 }
2780
2781 /* PE_PRS_SNK_SRC_Assert_Rp */
2782 pd->current_pr = PR_SRC;
2783 set_power_role(pd, pd->current_pr);
2784 pd->current_state = PE_PRS_SNK_SRC_SOURCE_ON;
2785
2786 /* fall-through */
2787
2788 case PE_PRS_SNK_SRC_SOURCE_ON:
2789 enable_vbus(pd);
2790 msleep(200); /* allow time VBUS ramp-up, must be < tNewSrc */
2791
2792 ret = pd_send_msg(pd, MSG_PS_RDY, NULL, 0, SOP_MSG);
2793 if (ret) {
2794 usbpd_err(&pd->dev, "Error sending PS_RDY\n");
2795 usbpd_set_state(pd, PE_ERROR_RECOVERY);
2796 break;
2797 }
2798
2799 usbpd_set_state(pd, PE_SRC_STARTUP);
2800 break;
2801
2802 case PE_VCS_WAIT_FOR_VCONN:
2803 if (IS_CTRL(rx_msg, MSG_PS_RDY)) {
2804 /*
2805 * hopefully redundant check but in case not enabled
2806 * avoids unbalanced regulator disable count
2807 */
2808 if (pd->vconn_enabled)
2809 regulator_disable(pd->vconn);
2810 pd->vconn_enabled = false;
2811
2812 pd->current_state = pd->current_pr == PR_SRC ?
2813 PE_SRC_READY : PE_SNK_READY;
2814 } else {
2815 /* timed out; go to hard reset */
2816 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
2817 PE_SRC_HARD_RESET : PE_SNK_HARD_RESET);
2818 }
2819
2820 break;
2821
2822 default:
2823 usbpd_err(&pd->dev, "Unhandled state %s\n",
2824 usbpd_state_strings[pd->current_state]);
2825 break;
2826 }
2827
2828sm_done:
2829 kfree(rx_msg);
2830
Jack Pham564b4172017-05-24 18:41:53 -07002831 spin_lock_irqsave(&pd->rx_lock, flags);
2832 ret = list_empty(&pd->rx_q);
2833 spin_unlock_irqrestore(&pd->rx_lock, flags);
2834
2835 /* requeue if there are any new/pending RX messages */
2836 if (!ret)
2837 kick_sm(pd, 0);
2838
Jack Phamf4baeb12017-02-03 19:01:48 -08002839 if (!pd->sm_queued)
2840 pm_relax(&pd->dev);
2841}
2842
2843static inline const char *src_current(enum power_supply_typec_mode typec_mode)
2844{
2845 switch (typec_mode) {
2846 case POWER_SUPPLY_TYPEC_SOURCE_DEFAULT:
2847 return "default";
2848 case POWER_SUPPLY_TYPEC_SOURCE_MEDIUM:
2849 return "medium - 1.5A";
2850 case POWER_SUPPLY_TYPEC_SOURCE_HIGH:
2851 return "high - 3.0A";
2852 default:
2853 return "";
2854 }
2855}
2856
2857static int psy_changed(struct notifier_block *nb, unsigned long evt, void *ptr)
2858{
2859 struct usbpd *pd = container_of(nb, struct usbpd, psy_nb);
2860 union power_supply_propval val;
2861 enum power_supply_typec_mode typec_mode;
2862 int ret;
2863
2864 if (ptr != pd->usb_psy || evt != PSY_EVENT_PROP_CHANGED)
2865 return 0;
2866
2867 ret = power_supply_get_property(pd->usb_psy,
2868 POWER_SUPPLY_PROP_TYPEC_MODE, &val);
2869 if (ret) {
2870 usbpd_err(&pd->dev, "Unable to read USB TYPEC_MODE: %d\n", ret);
2871 return ret;
2872 }
2873
2874 typec_mode = val.intval;
2875
2876 ret = power_supply_get_property(pd->usb_psy,
2877 POWER_SUPPLY_PROP_PE_START, &val);
2878 if (ret) {
2879 usbpd_err(&pd->dev, "Unable to read USB PROP_PE_START: %d\n",
2880 ret);
2881 return ret;
2882 }
2883
2884 /* Don't proceed if PE_START=0 as other props may still change */
2885 if (!val.intval && !pd->pd_connected &&
2886 typec_mode != POWER_SUPPLY_TYPEC_NONE)
2887 return 0;
2888
2889 ret = power_supply_get_property(pd->usb_psy,
2890 POWER_SUPPLY_PROP_PRESENT, &val);
2891 if (ret) {
2892 usbpd_err(&pd->dev, "Unable to read USB PRESENT: %d\n", ret);
2893 return ret;
2894 }
2895
2896 pd->vbus_present = val.intval;
2897
2898 ret = power_supply_get_property(pd->usb_psy,
Fenglin Wu80826e02017-04-25 21:45:08 +08002899 POWER_SUPPLY_PROP_REAL_TYPE, &val);
Jack Phamf4baeb12017-02-03 19:01:48 -08002900 if (ret) {
2901 usbpd_err(&pd->dev, "Unable to read USB TYPE: %d\n", ret);
2902 return ret;
2903 }
2904
2905 pd->psy_type = val.intval;
2906
2907 /*
2908 * For sink hard reset, state machine needs to know when VBUS changes
2909 * - when in PE_SNK_TRANSITION_TO_DEFAULT, notify when VBUS falls
2910 * - when in PE_SNK_DISCOVERY, notify when VBUS rises
2911 */
2912 if (typec_mode && ((!pd->vbus_present &&
2913 pd->current_state == PE_SNK_TRANSITION_TO_DEFAULT) ||
2914 (pd->vbus_present && pd->current_state == PE_SNK_DISCOVERY))) {
2915 usbpd_dbg(&pd->dev, "hard reset: typec mode:%d present:%d\n",
2916 typec_mode, pd->vbus_present);
2917 pd->typec_mode = typec_mode;
2918 kick_sm(pd, 0);
2919 return 0;
2920 }
2921
2922 if (pd->typec_mode == typec_mode)
2923 return 0;
2924
2925 pd->typec_mode = typec_mode;
2926
2927 usbpd_dbg(&pd->dev, "typec mode:%d present:%d type:%d orientation:%d\n",
2928 typec_mode, pd->vbus_present, pd->psy_type,
2929 usbpd_get_plug_orientation(pd));
2930
2931 switch (typec_mode) {
2932 /* Disconnect */
2933 case POWER_SUPPLY_TYPEC_NONE:
2934 if (pd->in_pr_swap) {
2935 usbpd_dbg(&pd->dev, "Ignoring disconnect due to PR swap\n");
2936 return 0;
2937 }
2938
2939 pd->current_pr = PR_NONE;
2940 break;
2941
2942 /* Sink states */
2943 case POWER_SUPPLY_TYPEC_SOURCE_DEFAULT:
2944 case POWER_SUPPLY_TYPEC_SOURCE_MEDIUM:
2945 case POWER_SUPPLY_TYPEC_SOURCE_HIGH:
2946 usbpd_info(&pd->dev, "Type-C Source (%s) connected\n",
2947 src_current(typec_mode));
2948
2949 /* if waiting for SinkTxOk to start an AMS */
2950 if (pd->spec_rev == USBPD_REV_30 &&
2951 typec_mode == POWER_SUPPLY_TYPEC_SOURCE_HIGH &&
2952 (pd->send_pr_swap || pd->send_dr_swap || pd->vdm_tx))
2953 break;
2954
2955 if (pd->current_pr == PR_SINK)
2956 return 0;
2957
Jack Phamd434a412017-07-24 10:05:05 -07002958 /*
2959 * Unexpected if not in PR swap; need to force disconnect from
2960 * source so we can turn off VBUS, Vconn, PD PHY etc.
2961 */
2962 if (pd->current_pr == PR_SRC) {
2963 usbpd_info(&pd->dev, "Forcing disconnect from source mode\n");
2964 pd->current_pr = PR_NONE;
2965 break;
2966 }
2967
Jack Phamf4baeb12017-02-03 19:01:48 -08002968 pd->current_pr = PR_SINK;
2969 break;
2970
2971 /* Source states */
2972 case POWER_SUPPLY_TYPEC_SINK_POWERED_CABLE:
2973 case POWER_SUPPLY_TYPEC_SINK:
2974 usbpd_info(&pd->dev, "Type-C Sink%s connected\n",
2975 typec_mode == POWER_SUPPLY_TYPEC_SINK ?
2976 "" : " (powered)");
2977
2978 if (pd->current_pr == PR_SRC)
2979 return 0;
2980
2981 pd->current_pr = PR_SRC;
2982 break;
2983
2984 case POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY:
2985 usbpd_info(&pd->dev, "Type-C Debug Accessory connected\n");
2986 break;
2987 case POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER:
2988 usbpd_info(&pd->dev, "Type-C Analog Audio Adapter connected\n");
2989 break;
2990 default:
2991 usbpd_warn(&pd->dev, "Unsupported typec mode:%d\n",
2992 typec_mode);
2993 break;
2994 }
2995
2996 /* queue state machine due to CC state change */
2997 kick_sm(pd, 0);
2998 return 0;
2999}
3000
3001static enum dual_role_property usbpd_dr_properties[] = {
3002 DUAL_ROLE_PROP_SUPPORTED_MODES,
3003 DUAL_ROLE_PROP_MODE,
3004 DUAL_ROLE_PROP_PR,
3005 DUAL_ROLE_PROP_DR,
3006};
3007
3008static int usbpd_dr_get_property(struct dual_role_phy_instance *dual_role,
3009 enum dual_role_property prop, unsigned int *val)
3010{
3011 struct usbpd *pd = dual_role_get_drvdata(dual_role);
3012
3013 if (!pd)
3014 return -ENODEV;
3015
3016 switch (prop) {
3017 case DUAL_ROLE_PROP_MODE:
3018 /* For now associate UFP/DFP with data role only */
3019 if (pd->current_dr == DR_UFP)
3020 *val = DUAL_ROLE_PROP_MODE_UFP;
3021 else if (pd->current_dr == DR_DFP)
3022 *val = DUAL_ROLE_PROP_MODE_DFP;
3023 else
3024 *val = DUAL_ROLE_PROP_MODE_NONE;
3025 break;
3026 case DUAL_ROLE_PROP_PR:
3027 if (pd->current_pr == PR_SRC)
3028 *val = DUAL_ROLE_PROP_PR_SRC;
3029 else if (pd->current_pr == PR_SINK)
3030 *val = DUAL_ROLE_PROP_PR_SNK;
3031 else
3032 *val = DUAL_ROLE_PROP_PR_NONE;
3033 break;
3034 case DUAL_ROLE_PROP_DR:
3035 if (pd->current_dr == DR_UFP)
3036 *val = DUAL_ROLE_PROP_DR_DEVICE;
3037 else if (pd->current_dr == DR_DFP)
3038 *val = DUAL_ROLE_PROP_DR_HOST;
3039 else
3040 *val = DUAL_ROLE_PROP_DR_NONE;
3041 break;
3042 default:
3043 usbpd_warn(&pd->dev, "unsupported property %d\n", prop);
3044 return -ENODATA;
3045 }
3046
3047 return 0;
3048}
3049
3050static int usbpd_dr_set_property(struct dual_role_phy_instance *dual_role,
3051 enum dual_role_property prop, const unsigned int *val)
3052{
3053 struct usbpd *pd = dual_role_get_drvdata(dual_role);
3054 bool do_swap = false;
3055
3056 if (!pd)
3057 return -ENODEV;
3058
3059 switch (prop) {
3060 case DUAL_ROLE_PROP_MODE:
3061 usbpd_dbg(&pd->dev, "Setting mode to %d\n", *val);
3062
3063 /*
3064 * Forces disconnect on CC and re-establishes connection.
3065 * This does not use PD-based PR/DR swap
3066 */
3067 if (*val == DUAL_ROLE_PROP_MODE_UFP)
3068 pd->forced_pr = POWER_SUPPLY_TYPEC_PR_SINK;
3069 else if (*val == DUAL_ROLE_PROP_MODE_DFP)
3070 pd->forced_pr = POWER_SUPPLY_TYPEC_PR_SOURCE;
3071
3072 /* new mode will be applied in disconnect handler */
3073 set_power_role(pd, PR_NONE);
3074
3075 /* wait until it takes effect */
3076 while (pd->forced_pr != POWER_SUPPLY_TYPEC_PR_NONE)
3077 msleep(20);
3078
3079 break;
3080
3081 case DUAL_ROLE_PROP_DR:
3082 usbpd_dbg(&pd->dev, "Setting data_role to %d\n", *val);
3083
3084 if (*val == DUAL_ROLE_PROP_DR_HOST) {
3085 if (pd->current_dr == DR_UFP)
3086 do_swap = true;
3087 } else if (*val == DUAL_ROLE_PROP_DR_DEVICE) {
3088 if (pd->current_dr == DR_DFP)
3089 do_swap = true;
3090 } else {
3091 usbpd_warn(&pd->dev, "setting data_role to 'none' unsupported\n");
3092 return -ENOTSUPP;
3093 }
3094
3095 if (do_swap) {
3096 if (pd->current_state != PE_SRC_READY &&
3097 pd->current_state != PE_SNK_READY) {
3098 usbpd_err(&pd->dev, "data_role swap not allowed: PD not in Ready state\n");
3099 return -EAGAIN;
3100 }
3101
3102 if (pd->current_state == PE_SNK_READY &&
3103 !is_sink_tx_ok(pd)) {
3104 usbpd_err(&pd->dev, "Rp indicates SinkTxNG\n");
3105 return -EAGAIN;
3106 }
3107
Jack Phamaf7d3842017-01-26 13:28:19 -08003108 mutex_lock(&pd->swap_lock);
3109 reinit_completion(&pd->is_ready);
Jack Phamf4baeb12017-02-03 19:01:48 -08003110 pd->send_dr_swap = true;
3111 kick_sm(pd, 0);
3112
3113 /* wait for operation to complete */
Jack Phamaf7d3842017-01-26 13:28:19 -08003114 if (!wait_for_completion_timeout(&pd->is_ready,
Jack Phamf4baeb12017-02-03 19:01:48 -08003115 msecs_to_jiffies(100))) {
3116 usbpd_err(&pd->dev, "data_role swap timed out\n");
Jack Phamaf7d3842017-01-26 13:28:19 -08003117 mutex_unlock(&pd->swap_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08003118 return -ETIMEDOUT;
3119 }
3120
Jack Phamaf7d3842017-01-26 13:28:19 -08003121 mutex_unlock(&pd->swap_lock);
3122
Jack Phamf4baeb12017-02-03 19:01:48 -08003123 if ((*val == DUAL_ROLE_PROP_DR_HOST &&
3124 pd->current_dr != DR_DFP) ||
3125 (*val == DUAL_ROLE_PROP_DR_DEVICE &&
3126 pd->current_dr != DR_UFP)) {
3127 usbpd_err(&pd->dev, "incorrect state (%s) after data_role swap\n",
3128 pd->current_dr == DR_DFP ?
3129 "dfp" : "ufp");
3130 return -EPROTO;
3131 }
3132 }
3133
3134 break;
3135
3136 case DUAL_ROLE_PROP_PR:
3137 usbpd_dbg(&pd->dev, "Setting power_role to %d\n", *val);
3138
3139 if (*val == DUAL_ROLE_PROP_PR_SRC) {
3140 if (pd->current_pr == PR_SINK)
3141 do_swap = true;
3142 } else if (*val == DUAL_ROLE_PROP_PR_SNK) {
3143 if (pd->current_pr == PR_SRC)
3144 do_swap = true;
3145 } else {
3146 usbpd_warn(&pd->dev, "setting power_role to 'none' unsupported\n");
3147 return -ENOTSUPP;
3148 }
3149
3150 if (do_swap) {
3151 if (pd->current_state != PE_SRC_READY &&
3152 pd->current_state != PE_SNK_READY) {
3153 usbpd_err(&pd->dev, "power_role swap not allowed: PD not in Ready state\n");
3154 return -EAGAIN;
3155 }
3156
3157 if (pd->current_state == PE_SNK_READY &&
3158 !is_sink_tx_ok(pd)) {
3159 usbpd_err(&pd->dev, "Rp indicates SinkTxNG\n");
3160 return -EAGAIN;
3161 }
3162
Jack Phamaf7d3842017-01-26 13:28:19 -08003163 mutex_lock(&pd->swap_lock);
3164 reinit_completion(&pd->is_ready);
Jack Phamf4baeb12017-02-03 19:01:48 -08003165 pd->send_pr_swap = true;
3166 kick_sm(pd, 0);
3167
3168 /* wait for operation to complete */
Jack Phamaf7d3842017-01-26 13:28:19 -08003169 if (!wait_for_completion_timeout(&pd->is_ready,
Jack Phamf4baeb12017-02-03 19:01:48 -08003170 msecs_to_jiffies(2000))) {
3171 usbpd_err(&pd->dev, "power_role swap timed out\n");
Jack Phamaf7d3842017-01-26 13:28:19 -08003172 mutex_unlock(&pd->swap_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08003173 return -ETIMEDOUT;
3174 }
3175
Jack Phamaf7d3842017-01-26 13:28:19 -08003176 mutex_unlock(&pd->swap_lock);
3177
Jack Phamf4baeb12017-02-03 19:01:48 -08003178 if ((*val == DUAL_ROLE_PROP_PR_SRC &&
3179 pd->current_pr != PR_SRC) ||
3180 (*val == DUAL_ROLE_PROP_PR_SNK &&
3181 pd->current_pr != PR_SINK)) {
3182 usbpd_err(&pd->dev, "incorrect state (%s) after power_role swap\n",
3183 pd->current_pr == PR_SRC ?
3184 "source" : "sink");
3185 return -EPROTO;
3186 }
3187 }
3188 break;
3189
3190 default:
3191 usbpd_warn(&pd->dev, "unsupported property %d\n", prop);
3192 return -ENOTSUPP;
3193 }
3194
3195 return 0;
3196}
3197
3198static int usbpd_dr_prop_writeable(struct dual_role_phy_instance *dual_role,
3199 enum dual_role_property prop)
3200{
Jack Phame232bde2017-03-02 11:37:00 -08003201 struct usbpd *pd = dual_role_get_drvdata(dual_role);
3202
Jack Phamf4baeb12017-02-03 19:01:48 -08003203 switch (prop) {
3204 case DUAL_ROLE_PROP_MODE:
Jack Phame232bde2017-03-02 11:37:00 -08003205 return 1;
Jack Phamf4baeb12017-02-03 19:01:48 -08003206 case DUAL_ROLE_PROP_DR:
3207 case DUAL_ROLE_PROP_PR:
Jack Phame232bde2017-03-02 11:37:00 -08003208 if (pd)
3209 return pd->current_state == PE_SNK_READY ||
3210 pd->current_state == PE_SRC_READY;
3211 break;
Jack Phamf4baeb12017-02-03 19:01:48 -08003212 default:
3213 break;
3214 }
3215
3216 return 0;
3217}
3218
3219static int usbpd_uevent(struct device *dev, struct kobj_uevent_env *env)
3220{
3221 struct usbpd *pd = dev_get_drvdata(dev);
3222 int i;
3223
3224 add_uevent_var(env, "DATA_ROLE=%s", pd->current_dr == DR_DFP ?
3225 "dfp" : "ufp");
3226
3227 if (pd->current_pr == PR_SINK) {
3228 add_uevent_var(env, "POWER_ROLE=sink");
3229 add_uevent_var(env, "SRC_CAP_ID=%d", pd->src_cap_id);
3230
3231 for (i = 0; i < ARRAY_SIZE(pd->received_pdos); i++)
3232 add_uevent_var(env, "PDO%d=%08x", i,
3233 pd->received_pdos[i]);
3234
3235 add_uevent_var(env, "REQUESTED_PDO=%d", pd->requested_pdo);
3236 add_uevent_var(env, "SELECTED_PDO=%d", pd->selected_pdo);
3237 } else {
3238 add_uevent_var(env, "POWER_ROLE=source");
3239 for (i = 0; i < ARRAY_SIZE(default_src_caps); i++)
3240 add_uevent_var(env, "PDO%d=%08x", i,
3241 default_src_caps[i]);
3242 }
3243
3244 add_uevent_var(env, "RDO=%08x", pd->rdo);
3245 add_uevent_var(env, "CONTRACT=%s", pd->in_explicit_contract ?
3246 "explicit" : "implicit");
3247 add_uevent_var(env, "ALT_MODE=%d", pd->vdm_state == MODE_ENTERED);
3248
Hemant Kumara1875942017-08-09 16:50:14 -07003249 add_uevent_var(env, "ADO=%08x", pd->received_ado);
3250 for (i = 0; i < PD_STATUS_DB_LEN; i++)
3251 add_uevent_var(env, "SDB%d=%08x", i, pd->status_db[i]);
3252
Jack Phamf4baeb12017-02-03 19:01:48 -08003253 return 0;
3254}
3255
3256static ssize_t contract_show(struct device *dev, struct device_attribute *attr,
3257 char *buf)
3258{
3259 struct usbpd *pd = dev_get_drvdata(dev);
3260
3261 return snprintf(buf, PAGE_SIZE, "%s\n",
3262 pd->in_explicit_contract ? "explicit" : "implicit");
3263}
3264static DEVICE_ATTR_RO(contract);
3265
3266static ssize_t current_pr_show(struct device *dev,
3267 struct device_attribute *attr, char *buf)
3268{
3269 struct usbpd *pd = dev_get_drvdata(dev);
3270 const char *pr = "none";
3271
3272 if (pd->current_pr == PR_SINK)
3273 pr = "sink";
3274 else if (pd->current_pr == PR_SRC)
3275 pr = "source";
3276
3277 return snprintf(buf, PAGE_SIZE, "%s\n", pr);
3278}
3279static DEVICE_ATTR_RO(current_pr);
3280
3281static ssize_t initial_pr_show(struct device *dev,
3282 struct device_attribute *attr, char *buf)
3283{
3284 struct usbpd *pd = dev_get_drvdata(dev);
3285 const char *pr = "none";
3286
3287 if (pd->typec_mode >= POWER_SUPPLY_TYPEC_SOURCE_DEFAULT)
3288 pr = "sink";
3289 else if (pd->typec_mode >= POWER_SUPPLY_TYPEC_SINK)
3290 pr = "source";
3291
3292 return snprintf(buf, PAGE_SIZE, "%s\n", pr);
3293}
3294static DEVICE_ATTR_RO(initial_pr);
3295
3296static ssize_t current_dr_show(struct device *dev,
3297 struct device_attribute *attr, char *buf)
3298{
3299 struct usbpd *pd = dev_get_drvdata(dev);
3300 const char *dr = "none";
3301
3302 if (pd->current_dr == DR_UFP)
3303 dr = "ufp";
3304 else if (pd->current_dr == DR_DFP)
3305 dr = "dfp";
3306
3307 return snprintf(buf, PAGE_SIZE, "%s\n", dr);
3308}
3309static DEVICE_ATTR_RO(current_dr);
3310
3311static ssize_t initial_dr_show(struct device *dev,
3312 struct device_attribute *attr, char *buf)
3313{
3314 struct usbpd *pd = dev_get_drvdata(dev);
3315 const char *dr = "none";
3316
3317 if (pd->typec_mode >= POWER_SUPPLY_TYPEC_SOURCE_DEFAULT)
3318 dr = "ufp";
3319 else if (pd->typec_mode >= POWER_SUPPLY_TYPEC_SINK)
3320 dr = "dfp";
3321
3322 return snprintf(buf, PAGE_SIZE, "%s\n", dr);
3323}
3324static DEVICE_ATTR_RO(initial_dr);
3325
3326static ssize_t src_cap_id_show(struct device *dev,
3327 struct device_attribute *attr, char *buf)
3328{
3329 struct usbpd *pd = dev_get_drvdata(dev);
3330
3331 return snprintf(buf, PAGE_SIZE, "%d\n", pd->src_cap_id);
3332}
3333static DEVICE_ATTR_RO(src_cap_id);
3334
3335/* Dump received source PDOs in human-readable format */
3336static ssize_t pdo_h_show(struct device *dev, struct device_attribute *attr,
3337 char *buf)
3338{
3339 struct usbpd *pd = dev_get_drvdata(dev);
3340 int i;
3341 ssize_t cnt = 0;
3342
3343 for (i = 0; i < ARRAY_SIZE(pd->received_pdos); i++) {
3344 u32 pdo = pd->received_pdos[i];
3345
3346 if (pdo == 0)
3347 break;
3348
3349 cnt += scnprintf(&buf[cnt], PAGE_SIZE - cnt, "PDO %d\n", i + 1);
3350
3351 if (PD_SRC_PDO_TYPE(pdo) == PD_SRC_PDO_TYPE_FIXED) {
3352 cnt += scnprintf(&buf[cnt], PAGE_SIZE - cnt,
3353 "\tFixed supply\n"
3354 "\tDual-Role Power:%d\n"
3355 "\tUSB Suspend Supported:%d\n"
3356 "\tExternally Powered:%d\n"
3357 "\tUSB Communications Capable:%d\n"
3358 "\tData Role Swap:%d\n"
3359 "\tPeak Current:%d\n"
3360 "\tVoltage:%d (mV)\n"
3361 "\tMax Current:%d (mA)\n",
3362 PD_SRC_PDO_FIXED_PR_SWAP(pdo),
3363 PD_SRC_PDO_FIXED_USB_SUSP(pdo),
3364 PD_SRC_PDO_FIXED_EXT_POWERED(pdo),
3365 PD_SRC_PDO_FIXED_USB_COMM(pdo),
3366 PD_SRC_PDO_FIXED_DR_SWAP(pdo),
3367 PD_SRC_PDO_FIXED_PEAK_CURR(pdo),
3368 PD_SRC_PDO_FIXED_VOLTAGE(pdo) * 50,
3369 PD_SRC_PDO_FIXED_MAX_CURR(pdo) * 10);
3370 } else if (PD_SRC_PDO_TYPE(pdo) == PD_SRC_PDO_TYPE_BATTERY) {
3371 cnt += scnprintf(&buf[cnt], PAGE_SIZE - cnt,
3372 "\tBattery supply\n"
3373 "\tMax Voltage:%d (mV)\n"
3374 "\tMin Voltage:%d (mV)\n"
3375 "\tMax Power:%d (mW)\n",
3376 PD_SRC_PDO_VAR_BATT_MAX_VOLT(pdo) * 50,
3377 PD_SRC_PDO_VAR_BATT_MIN_VOLT(pdo) * 50,
3378 PD_SRC_PDO_VAR_BATT_MAX(pdo) * 250);
3379 } else if (PD_SRC_PDO_TYPE(pdo) == PD_SRC_PDO_TYPE_VARIABLE) {
3380 cnt += scnprintf(&buf[cnt], PAGE_SIZE - cnt,
3381 "\tVariable supply\n"
3382 "\tMax Voltage:%d (mV)\n"
3383 "\tMin Voltage:%d (mV)\n"
3384 "\tMax Current:%d (mA)\n",
3385 PD_SRC_PDO_VAR_BATT_MAX_VOLT(pdo) * 50,
3386 PD_SRC_PDO_VAR_BATT_MIN_VOLT(pdo) * 50,
3387 PD_SRC_PDO_VAR_BATT_MAX(pdo) * 10);
3388 } else if (PD_SRC_PDO_TYPE(pdo) == PD_SRC_PDO_TYPE_AUGMENTED) {
3389 cnt += scnprintf(&buf[cnt], PAGE_SIZE - cnt,
3390 "\tProgrammable Power supply\n"
3391 "\tMax Voltage:%d (mV)\n"
3392 "\tMin Voltage:%d (mV)\n"
3393 "\tMax Current:%d (mA)\n",
3394 PD_APDO_MAX_VOLT(pdo) * 100,
3395 PD_APDO_MIN_VOLT(pdo) * 100,
3396 PD_APDO_MAX_CURR(pdo) * 50);
3397 } else {
3398 cnt += scnprintf(&buf[cnt], PAGE_SIZE - cnt,
3399 "Invalid PDO\n");
3400 }
3401
3402 buf[cnt++] = '\n';
3403 }
3404
3405 return cnt;
3406}
3407static DEVICE_ATTR_RO(pdo_h);
3408
3409static ssize_t pdo_n_show(struct device *dev, struct device_attribute *attr,
3410 char *buf);
3411
3412#define PDO_ATTR(n) { \
3413 .attr = { .name = __stringify(pdo##n), .mode = 0444 }, \
3414 .show = pdo_n_show, \
3415}
3416static struct device_attribute dev_attr_pdos[] = {
3417 PDO_ATTR(1),
3418 PDO_ATTR(2),
3419 PDO_ATTR(3),
3420 PDO_ATTR(4),
3421 PDO_ATTR(5),
3422 PDO_ATTR(6),
3423 PDO_ATTR(7),
3424};
3425
3426static ssize_t pdo_n_show(struct device *dev, struct device_attribute *attr,
3427 char *buf)
3428{
3429 struct usbpd *pd = dev_get_drvdata(dev);
3430 int i;
3431
3432 for (i = 0; i < ARRAY_SIZE(dev_attr_pdos); i++)
3433 if (attr == &dev_attr_pdos[i])
3434 /* dump the PDO as a hex string */
3435 return snprintf(buf, PAGE_SIZE, "%08x\n",
3436 pd->received_pdos[i]);
3437
3438 usbpd_err(&pd->dev, "Invalid PDO index\n");
3439 return -EINVAL;
3440}
3441
3442static ssize_t select_pdo_store(struct device *dev,
3443 struct device_attribute *attr, const char *buf, size_t size)
3444{
3445 struct usbpd *pd = dev_get_drvdata(dev);
3446 int src_cap_id;
3447 int pdo, uv = 0, ua = 0;
3448 int ret;
3449
Jack Phamaf7d3842017-01-26 13:28:19 -08003450 mutex_lock(&pd->swap_lock);
3451
Jack Phamf4baeb12017-02-03 19:01:48 -08003452 /* Only allowed if we are already in explicit sink contract */
3453 if (pd->current_state != PE_SNK_READY || !is_sink_tx_ok(pd)) {
3454 usbpd_err(&pd->dev, "select_pdo: Cannot select new PDO yet\n");
Jack Phamaf7d3842017-01-26 13:28:19 -08003455 ret = -EBUSY;
3456 goto out;
Jack Phamf4baeb12017-02-03 19:01:48 -08003457 }
3458
3459 ret = sscanf(buf, "%d %d %d %d", &src_cap_id, &pdo, &uv, &ua);
3460 if (ret != 2 && ret != 4) {
3461 usbpd_err(&pd->dev, "select_pdo: Must specify <src cap id> <PDO> [<uV> <uA>]\n");
Jack Phamaf7d3842017-01-26 13:28:19 -08003462 ret = -EINVAL;
3463 goto out;
Jack Phamf4baeb12017-02-03 19:01:48 -08003464 }
3465
3466 if (src_cap_id != pd->src_cap_id) {
3467 usbpd_err(&pd->dev, "select_pdo: src_cap_id mismatch. Requested:%d, current:%d\n",
3468 src_cap_id, pd->src_cap_id);
Jack Phamaf7d3842017-01-26 13:28:19 -08003469 ret = -EINVAL;
3470 goto out;
Jack Phamf4baeb12017-02-03 19:01:48 -08003471 }
3472
3473 if (pdo < 1 || pdo > 7) {
3474 usbpd_err(&pd->dev, "select_pdo: invalid PDO:%d\n", pdo);
Jack Phamaf7d3842017-01-26 13:28:19 -08003475 ret = -EINVAL;
3476 goto out;
Jack Phamf4baeb12017-02-03 19:01:48 -08003477 }
3478
3479 ret = pd_select_pdo(pd, pdo, uv, ua);
3480 if (ret)
Jack Phamaf7d3842017-01-26 13:28:19 -08003481 goto out;
Jack Phamf4baeb12017-02-03 19:01:48 -08003482
Jack Phamaf7d3842017-01-26 13:28:19 -08003483 reinit_completion(&pd->is_ready);
3484 pd->send_request = true;
3485 kick_sm(pd, 0);
Jack Phamf4baeb12017-02-03 19:01:48 -08003486
Jack Phamaf7d3842017-01-26 13:28:19 -08003487 /* wait for operation to complete */
3488 if (!wait_for_completion_timeout(&pd->is_ready,
3489 msecs_to_jiffies(1000))) {
3490 usbpd_err(&pd->dev, "select_pdo: request timed out\n");
3491 ret = -ETIMEDOUT;
3492 goto out;
3493 }
3494
3495 /* determine if request was accepted/rejected */
3496 if (pd->selected_pdo != pd->requested_pdo ||
3497 pd->current_voltage != pd->requested_voltage) {
3498 usbpd_err(&pd->dev, "select_pdo: request rejected\n");
3499 ret = -EINVAL;
3500 }
3501
3502out:
3503 pd->send_request = false;
3504 mutex_unlock(&pd->swap_lock);
3505 return ret ? ret : size;
Jack Phamf4baeb12017-02-03 19:01:48 -08003506}
3507
3508static ssize_t select_pdo_show(struct device *dev,
3509 struct device_attribute *attr, char *buf)
3510{
3511 struct usbpd *pd = dev_get_drvdata(dev);
3512
3513 return snprintf(buf, PAGE_SIZE, "%d\n", pd->selected_pdo);
3514}
3515static DEVICE_ATTR_RW(select_pdo);
3516
3517static ssize_t rdo_show(struct device *dev, struct device_attribute *attr,
3518 char *buf)
3519{
3520 struct usbpd *pd = dev_get_drvdata(dev);
3521
3522 /* dump the RDO as a hex string */
3523 return snprintf(buf, PAGE_SIZE, "%08x\n", pd->rdo);
3524}
3525static DEVICE_ATTR_RO(rdo);
3526
3527static ssize_t rdo_h_show(struct device *dev, struct device_attribute *attr,
3528 char *buf)
3529{
3530 struct usbpd *pd = dev_get_drvdata(dev);
3531 int pos = PD_RDO_OBJ_POS(pd->rdo);
3532 int type = PD_SRC_PDO_TYPE(pd->received_pdos[pos]);
3533 int len;
3534
3535 len = scnprintf(buf, PAGE_SIZE, "Request Data Object\n"
3536 "\tObj Pos:%d\n"
3537 "\tGiveback:%d\n"
3538 "\tCapability Mismatch:%d\n"
3539 "\tUSB Communications Capable:%d\n"
3540 "\tNo USB Suspend:%d\n",
3541 PD_RDO_OBJ_POS(pd->rdo),
3542 PD_RDO_GIVEBACK(pd->rdo),
3543 PD_RDO_MISMATCH(pd->rdo),
3544 PD_RDO_USB_COMM(pd->rdo),
3545 PD_RDO_NO_USB_SUSP(pd->rdo));
3546
3547 switch (type) {
3548 case PD_SRC_PDO_TYPE_FIXED:
3549 case PD_SRC_PDO_TYPE_VARIABLE:
3550 len += scnprintf(buf + len, PAGE_SIZE - len,
3551 "(Fixed/Variable)\n"
3552 "\tOperating Current:%d (mA)\n"
3553 "\t%s Current:%d (mA)\n",
3554 PD_RDO_FIXED_CURR(pd->rdo) * 10,
3555 PD_RDO_GIVEBACK(pd->rdo) ? "Min" : "Max",
3556 PD_RDO_FIXED_CURR_MINMAX(pd->rdo) * 10);
3557 break;
3558
3559 case PD_SRC_PDO_TYPE_BATTERY:
3560 len += scnprintf(buf + len, PAGE_SIZE - len,
3561 "(Battery)\n"
3562 "\tOperating Power:%d (mW)\n"
3563 "\t%s Power:%d (mW)\n",
3564 PD_RDO_FIXED_CURR(pd->rdo) * 250,
3565 PD_RDO_GIVEBACK(pd->rdo) ? "Min" : "Max",
3566 PD_RDO_FIXED_CURR_MINMAX(pd->rdo) * 250);
3567 break;
3568
3569 case PD_SRC_PDO_TYPE_AUGMENTED:
3570 len += scnprintf(buf + len, PAGE_SIZE - len,
3571 "(Programmable)\n"
3572 "\tOutput Voltage:%d (mV)\n"
3573 "\tOperating Current:%d (mA)\n",
3574 PD_RDO_PROG_VOLTAGE(pd->rdo) * 20,
3575 PD_RDO_PROG_CURR(pd->rdo) * 50);
3576 break;
3577 }
3578
3579 return len;
3580}
3581static DEVICE_ATTR_RO(rdo_h);
3582
3583static ssize_t hard_reset_store(struct device *dev,
3584 struct device_attribute *attr, const char *buf, size_t size)
3585{
3586 struct usbpd *pd = dev_get_drvdata(dev);
3587 int val = 0;
3588
3589 if (sscanf(buf, "%d\n", &val) != 1)
3590 return -EINVAL;
3591
3592 if (val)
3593 usbpd_set_state(pd, pd->current_pr == PR_SRC ?
3594 PE_SRC_HARD_RESET : PE_SNK_HARD_RESET);
3595
3596 return size;
3597}
3598static DEVICE_ATTR_WO(hard_reset);
3599
Hemant Kumar018b5982017-08-09 14:14:37 -07003600static int trigger_tx_msg(struct usbpd *pd, bool *msg_tx_flag)
3601{
3602 int ret = 0;
3603
3604 /* Only allowed if we are already in explicit sink contract */
3605 if (pd->current_state != PE_SNK_READY || !is_sink_tx_ok(pd)) {
3606 usbpd_err(&pd->dev, "%s: Cannot send msg\n", __func__);
3607 ret = -EBUSY;
3608 goto out;
3609 }
3610
3611 reinit_completion(&pd->is_ready);
3612 *msg_tx_flag = true;
3613 kick_sm(pd, 0);
3614
3615 /* wait for operation to complete */
3616 if (!wait_for_completion_timeout(&pd->is_ready,
3617 msecs_to_jiffies(1000))) {
3618 usbpd_err(&pd->dev, "%s: request timed out\n", __func__);
3619 ret = -ETIMEDOUT;
3620 }
3621
3622out:
3623 *msg_tx_flag = false;
3624 return ret;
3625
3626}
3627
3628static ssize_t get_src_cap_ext_show(struct device *dev,
3629 struct device_attribute *attr, char *buf)
3630{
3631 int i, ret, len = 0;
3632 struct usbpd *pd = dev_get_drvdata(dev);
3633
3634 if (pd->spec_rev == USBPD_REV_20)
3635 return -EINVAL;
3636
3637 ret = trigger_tx_msg(pd, &pd->send_get_src_cap_ext);
3638 if (ret)
3639 return ret;
3640
3641 for (i = 0; i < PD_SRC_CAP_EXT_DB_LEN; i++)
3642 len += snprintf(buf + len, PAGE_SIZE - len, "%d\n",
3643 pd->src_cap_ext_db[i]);
3644 return len;
3645}
3646static DEVICE_ATTR_RO(get_src_cap_ext);
3647
3648static ssize_t get_pps_status_show(struct device *dev,
3649 struct device_attribute *attr, char *buf)
3650{
3651 int ret;
3652 struct usbpd *pd = dev_get_drvdata(dev);
3653
3654 if (pd->spec_rev == USBPD_REV_20)
3655 return -EINVAL;
3656
3657 ret = trigger_tx_msg(pd, &pd->send_get_pps_status);
3658 if (ret)
3659 return ret;
3660
3661 return snprintf(buf, PAGE_SIZE, "%d\n", pd->pps_status_db);
3662}
3663static DEVICE_ATTR_RO(get_pps_status);
3664
Hemant Kumara1875942017-08-09 16:50:14 -07003665static ssize_t rx_ado_show(struct device *dev, struct device_attribute *attr,
3666 char *buf)
3667{
3668 struct usbpd *pd = dev_get_drvdata(dev);
3669
3670 /* dump the ADO as a hex string */
3671 return snprintf(buf, PAGE_SIZE, "%08x\n", pd->received_ado);
3672}
3673static DEVICE_ATTR_RO(rx_ado);
3674
Hemant Kumar51ded972017-08-09 17:57:24 -07003675static ssize_t get_battery_cap_store(struct device *dev,
3676 struct device_attribute *attr, const char *buf, size_t size)
3677{
3678 struct usbpd *pd = dev_get_drvdata(dev);
3679 int val, ret;
3680
3681 if (pd->spec_rev == USBPD_REV_20 || sscanf(buf, "%d\n", &val) != 1) {
3682 pd->get_battery_cap_db = -EINVAL;
3683 return -EINVAL;
3684 }
3685
3686 pd->get_battery_cap_db = val;
3687
3688 ret = trigger_tx_msg(pd, &pd->send_get_battery_cap);
3689
3690 return ret ? ret : size;
3691}
3692
3693static ssize_t get_battery_cap_show(struct device *dev,
3694 struct device_attribute *attr, char *buf)
3695{
3696 int i, len = 0;
3697 struct usbpd *pd = dev_get_drvdata(dev);
3698
3699 if (pd->get_battery_cap_db == -EINVAL)
3700 return -EINVAL;
3701
3702 for (i = 0; i < PD_BATTERY_CAP_DB_LEN; i++)
3703 len += snprintf(buf + len, PAGE_SIZE - len, "%d\n",
3704 pd->battery_cap_db[i]);
3705 return len;
3706}
3707static DEVICE_ATTR_RW(get_battery_cap);
3708
3709static ssize_t get_battery_status_store(struct device *dev,
3710 struct device_attribute *attr, const char *buf, size_t size)
3711{
3712 struct usbpd *pd = dev_get_drvdata(dev);
3713 int val, ret;
3714
3715 if (pd->spec_rev == USBPD_REV_20 || sscanf(buf, "%d\n", &val) != 1) {
3716 pd->get_battery_status_db = -EINVAL;
3717 return -EINVAL;
3718 }
3719
3720 pd->get_battery_status_db = val;
3721
3722 ret = trigger_tx_msg(pd, &pd->send_get_battery_status);
3723
3724 return ret ? ret : size;
3725}
3726
3727static ssize_t get_battery_status_show(struct device *dev,
3728 struct device_attribute *attr, char *buf)
3729{
3730 struct usbpd *pd = dev_get_drvdata(dev);
3731
3732 if (pd->get_battery_status_db == -EINVAL)
3733 return -EINVAL;
3734
3735 return snprintf(buf, PAGE_SIZE, "%d\n", pd->battery_sts_dobj);
3736}
3737static DEVICE_ATTR_RW(get_battery_status);
3738
Jack Phamf4baeb12017-02-03 19:01:48 -08003739static struct attribute *usbpd_attrs[] = {
3740 &dev_attr_contract.attr,
3741 &dev_attr_initial_pr.attr,
3742 &dev_attr_current_pr.attr,
3743 &dev_attr_initial_dr.attr,
3744 &dev_attr_current_dr.attr,
3745 &dev_attr_src_cap_id.attr,
3746 &dev_attr_pdo_h.attr,
3747 &dev_attr_pdos[0].attr,
3748 &dev_attr_pdos[1].attr,
3749 &dev_attr_pdos[2].attr,
3750 &dev_attr_pdos[3].attr,
3751 &dev_attr_pdos[4].attr,
3752 &dev_attr_pdos[5].attr,
3753 &dev_attr_pdos[6].attr,
3754 &dev_attr_select_pdo.attr,
3755 &dev_attr_rdo.attr,
3756 &dev_attr_rdo_h.attr,
3757 &dev_attr_hard_reset.attr,
Hemant Kumar018b5982017-08-09 14:14:37 -07003758 &dev_attr_get_src_cap_ext.attr,
3759 &dev_attr_get_pps_status.attr,
Hemant Kumara1875942017-08-09 16:50:14 -07003760 &dev_attr_rx_ado.attr,
Hemant Kumar51ded972017-08-09 17:57:24 -07003761 &dev_attr_get_battery_cap.attr,
3762 &dev_attr_get_battery_status.attr,
Jack Phamf4baeb12017-02-03 19:01:48 -08003763 NULL,
3764};
3765ATTRIBUTE_GROUPS(usbpd);
3766
3767static struct class usbpd_class = {
3768 .name = "usbpd",
3769 .owner = THIS_MODULE,
3770 .dev_uevent = usbpd_uevent,
3771 .dev_groups = usbpd_groups,
3772};
3773
3774static int match_usbpd_device(struct device *dev, const void *data)
3775{
3776 return dev->parent == data;
3777}
3778
3779static void devm_usbpd_put(struct device *dev, void *res)
3780{
3781 struct usbpd **ppd = res;
3782
3783 put_device(&(*ppd)->dev);
3784}
3785
3786struct usbpd *devm_usbpd_get_by_phandle(struct device *dev, const char *phandle)
3787{
3788 struct usbpd **ptr, *pd = NULL;
3789 struct device_node *pd_np;
3790 struct platform_device *pdev;
3791 struct device *pd_dev;
3792
3793 if (!usbpd_class.p) /* usbpd_init() not yet called */
3794 return ERR_PTR(-EAGAIN);
3795
3796 if (!dev->of_node)
3797 return ERR_PTR(-EINVAL);
3798
3799 pd_np = of_parse_phandle(dev->of_node, phandle, 0);
3800 if (!pd_np)
3801 return ERR_PTR(-ENXIO);
3802
3803 pdev = of_find_device_by_node(pd_np);
3804 if (!pdev)
3805 return ERR_PTR(-ENODEV);
3806
3807 pd_dev = class_find_device(&usbpd_class, NULL, &pdev->dev,
3808 match_usbpd_device);
3809 if (!pd_dev) {
3810 platform_device_put(pdev);
3811 /* device was found but maybe hadn't probed yet, so defer */
3812 return ERR_PTR(-EPROBE_DEFER);
3813 }
3814
3815 ptr = devres_alloc(devm_usbpd_put, sizeof(*ptr), GFP_KERNEL);
3816 if (!ptr) {
3817 put_device(pd_dev);
3818 platform_device_put(pdev);
3819 return ERR_PTR(-ENOMEM);
3820 }
3821
3822 pd = dev_get_drvdata(pd_dev);
3823 if (!pd)
3824 return ERR_PTR(-EPROBE_DEFER);
3825
3826 *ptr = pd;
3827 devres_add(dev, ptr);
3828
3829 return pd;
3830}
3831EXPORT_SYMBOL(devm_usbpd_get_by_phandle);
3832
3833static int num_pd_instances;
3834
3835/**
3836 * usbpd_create - Create a new instance of USB PD protocol/policy engine
3837 * @parent - parent device to associate with
3838 *
3839 * This creates a new usbpd class device which manages the state of a
3840 * USB PD-capable port. The parent device that is passed in should be
3841 * associated with the physical device port, e.g. a PD PHY.
3842 *
3843 * Return: struct usbpd pointer, or an ERR_PTR value
3844 */
3845struct usbpd *usbpd_create(struct device *parent)
3846{
3847 int ret;
3848 struct usbpd *pd;
3849
3850 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
3851 if (!pd)
3852 return ERR_PTR(-ENOMEM);
3853
3854 device_initialize(&pd->dev);
3855 pd->dev.class = &usbpd_class;
3856 pd->dev.parent = parent;
3857 dev_set_drvdata(&pd->dev, pd);
3858
3859 ret = dev_set_name(&pd->dev, "usbpd%d", num_pd_instances++);
3860 if (ret)
3861 goto free_pd;
3862
3863 ret = device_init_wakeup(&pd->dev, true);
3864 if (ret)
3865 goto free_pd;
3866
3867 ret = device_add(&pd->dev);
3868 if (ret)
3869 goto free_pd;
3870
Hemant Kumar86bd10f2017-05-24 12:25:15 -07003871 pd->wq = alloc_ordered_workqueue("usbpd_wq", WQ_FREEZABLE | WQ_HIGHPRI);
Jack Phamf4baeb12017-02-03 19:01:48 -08003872 if (!pd->wq) {
3873 ret = -ENOMEM;
3874 goto del_pd;
3875 }
3876 INIT_WORK(&pd->sm_work, usbpd_sm);
3877 hrtimer_init(&pd->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
3878 pd->timer.function = pd_timeout;
Jack Phamaf7d3842017-01-26 13:28:19 -08003879 mutex_init(&pd->swap_lock);
Mayank Rana83443202017-08-31 15:38:03 -07003880 mutex_init(&pd->svid_handler_lock);
Jack Phamf4baeb12017-02-03 19:01:48 -08003881
3882 pd->usb_psy = power_supply_get_by_name("usb");
3883 if (!pd->usb_psy) {
3884 usbpd_dbg(&pd->dev, "Could not get USB power_supply, deferring probe\n");
3885 ret = -EPROBE_DEFER;
3886 goto destroy_wq;
3887 }
3888
3889 /*
3890 * associate extcon with the parent dev as it could have a DT
3891 * node which will be useful for extcon_get_edev_by_phandle()
3892 */
3893 pd->extcon = devm_extcon_dev_allocate(parent, usbpd_extcon_cable);
3894 if (IS_ERR(pd->extcon)) {
3895 usbpd_err(&pd->dev, "failed to allocate extcon device\n");
3896 ret = PTR_ERR(pd->extcon);
3897 goto put_psy;
3898 }
3899
3900 pd->extcon->mutually_exclusive = usbpd_extcon_exclusive;
3901 ret = devm_extcon_dev_register(parent, pd->extcon);
3902 if (ret) {
3903 usbpd_err(&pd->dev, "failed to register extcon device\n");
3904 goto put_psy;
3905 }
3906
Jack Pham4e9dff72017-04-04 18:05:53 -07003907 /* Support reporting polarity and speed via properties */
3908 extcon_set_property_capability(pd->extcon, EXTCON_USB,
3909 EXTCON_PROP_USB_TYPEC_POLARITY);
3910 extcon_set_property_capability(pd->extcon, EXTCON_USB,
3911 EXTCON_PROP_USB_SS);
3912 extcon_set_property_capability(pd->extcon, EXTCON_USB_HOST,
3913 EXTCON_PROP_USB_TYPEC_POLARITY);
3914 extcon_set_property_capability(pd->extcon, EXTCON_USB_HOST,
3915 EXTCON_PROP_USB_SS);
3916
Jack Phamf4baeb12017-02-03 19:01:48 -08003917 pd->vbus = devm_regulator_get(parent, "vbus");
3918 if (IS_ERR(pd->vbus)) {
3919 ret = PTR_ERR(pd->vbus);
3920 goto put_psy;
3921 }
3922
3923 pd->vconn = devm_regulator_get(parent, "vconn");
3924 if (IS_ERR(pd->vconn)) {
3925 ret = PTR_ERR(pd->vconn);
3926 goto put_psy;
3927 }
3928
3929 pd->vconn_is_external = device_property_present(parent,
3930 "qcom,vconn-uses-external-source");
3931
Jack Phamee1f9052017-01-26 12:27:07 -08003932 pd->num_sink_caps = device_property_read_u32_array(parent,
3933 "qcom,default-sink-caps", NULL, 0);
Vijayavardhan Vennapusa248d7232017-02-14 15:32:07 +05303934 if (pd->num_sink_caps > 0) {
Jack Phamee1f9052017-01-26 12:27:07 -08003935 int i;
3936 u32 sink_caps[14];
3937
3938 if (pd->num_sink_caps % 2 || pd->num_sink_caps > 14) {
3939 ret = -EINVAL;
3940 usbpd_err(&pd->dev, "default-sink-caps must be be specified as voltage/current, max 7 pairs\n");
3941 goto put_psy;
3942 }
3943
3944 ret = device_property_read_u32_array(parent,
3945 "qcom,default-sink-caps", sink_caps,
3946 pd->num_sink_caps);
3947 if (ret) {
3948 usbpd_err(&pd->dev, "Error reading default-sink-caps\n");
3949 goto put_psy;
3950 }
3951
3952 pd->num_sink_caps /= 2;
3953
3954 for (i = 0; i < pd->num_sink_caps; i++) {
3955 int v = sink_caps[i * 2] / 50;
3956 int c = sink_caps[i * 2 + 1] / 10;
3957
3958 pd->sink_caps[i] =
3959 PD_SNK_PDO_FIXED(0, 0, 0, 0, 0, v, c);
3960 }
3961
3962 /* First PDO includes additional capabilities */
3963 pd->sink_caps[0] |= PD_SNK_PDO_FIXED(1, 0, 0, 1, 1, 0, 0);
3964 } else {
3965 memcpy(pd->sink_caps, default_snk_caps,
3966 sizeof(default_snk_caps));
3967 pd->num_sink_caps = ARRAY_SIZE(default_snk_caps);
3968 }
3969
Jack Phamf4baeb12017-02-03 19:01:48 -08003970 /*
3971 * Register the Android dual-role class (/sys/class/dual_role_usb/).
3972 * The first instance should be named "otg_default" as that's what
3973 * Android expects.
3974 * Note this is different than the /sys/class/usbpd/ created above.
3975 */
3976 pd->dr_desc.name = (num_pd_instances == 1) ?
3977 "otg_default" : dev_name(&pd->dev);
3978 pd->dr_desc.supported_modes = DUAL_ROLE_SUPPORTED_MODES_DFP_AND_UFP;
3979 pd->dr_desc.properties = usbpd_dr_properties;
3980 pd->dr_desc.num_properties = ARRAY_SIZE(usbpd_dr_properties);
3981 pd->dr_desc.get_property = usbpd_dr_get_property;
3982 pd->dr_desc.set_property = usbpd_dr_set_property;
3983 pd->dr_desc.property_is_writeable = usbpd_dr_prop_writeable;
3984
3985 pd->dual_role = devm_dual_role_instance_register(&pd->dev,
3986 &pd->dr_desc);
3987 if (IS_ERR(pd->dual_role)) {
3988 usbpd_err(&pd->dev, "could not register dual_role instance\n");
3989 goto put_psy;
3990 } else {
3991 pd->dual_role->drv_data = pd;
3992 }
3993
3994 pd->current_pr = PR_NONE;
3995 pd->current_dr = DR_NONE;
3996 list_add_tail(&pd->instance, &_usbpd);
3997
3998 spin_lock_init(&pd->rx_lock);
3999 INIT_LIST_HEAD(&pd->rx_q);
4000 INIT_LIST_HEAD(&pd->svid_handlers);
Jack Phamaf7d3842017-01-26 13:28:19 -08004001 init_completion(&pd->is_ready);
Jack Phamf3c1bd32017-08-02 18:32:23 -07004002 init_completion(&pd->tx_chunk_request);
Jack Phamf4baeb12017-02-03 19:01:48 -08004003
4004 pd->psy_nb.notifier_call = psy_changed;
4005 ret = power_supply_reg_notifier(&pd->psy_nb);
4006 if (ret)
4007 goto del_inst;
4008
4009 /* force read initial power_supply values */
4010 psy_changed(&pd->psy_nb, PSY_EVENT_PROP_CHANGED, pd->usb_psy);
4011
4012 return pd;
4013
4014del_inst:
4015 list_del(&pd->instance);
4016put_psy:
4017 power_supply_put(pd->usb_psy);
4018destroy_wq:
4019 destroy_workqueue(pd->wq);
4020del_pd:
4021 device_del(&pd->dev);
4022free_pd:
4023 num_pd_instances--;
4024 kfree(pd);
4025 return ERR_PTR(ret);
4026}
4027EXPORT_SYMBOL(usbpd_create);
4028
4029/**
4030 * usbpd_destroy - Removes and frees a usbpd instance
4031 * @pd: the instance to destroy
4032 */
4033void usbpd_destroy(struct usbpd *pd)
4034{
4035 if (!pd)
4036 return;
4037
4038 list_del(&pd->instance);
4039 power_supply_unreg_notifier(&pd->psy_nb);
4040 power_supply_put(pd->usb_psy);
4041 destroy_workqueue(pd->wq);
4042 device_del(&pd->dev);
4043 kfree(pd);
4044}
4045EXPORT_SYMBOL(usbpd_destroy);
4046
4047static int __init usbpd_init(void)
4048{
4049 usbpd_ipc_log = ipc_log_context_create(NUM_LOG_PAGES, "usb_pd", 0);
4050 return class_register(&usbpd_class);
4051}
4052module_init(usbpd_init);
4053
4054static void __exit usbpd_exit(void)
4055{
4056 class_unregister(&usbpd_class);
4057}
4058module_exit(usbpd_exit);
4059
4060MODULE_DESCRIPTION("USB Power Delivery Policy Engine");
4061MODULE_LICENSE("GPL v2");