1// SPDX-License-Identifier: GPL-2.0
2/*
3 * * extcon-rtk-type-c.c - Realtek Extcon Type C driver
4 *
5 * Copyright (C) 2023 Realtek Semiconductor Corporation
6 *
7 */
8
9#include <linux/module.h>
10#include <linux/kernel.h>
11#include <linux/slab.h>
12#include <linux/platform_device.h>
13#include <linux/of.h>
14#include <linux/of_address.h>
15#include <linux/of_irq.h>
16#include <linux/of_gpio.h>
17#include <linux/io.h>
18#include <linux/interrupt.h>
19#include <linux/syscalls.h>
20#include <linux/suspend.h>
21#include <linux/debugfs.h>
22#include <linux/extcon.h>
23#include <linux/extcon-provider.h>
24#include <linux/sys_soc.h>
25#include <linux/nvmem-consumer.h>
26#include <linux/gpio/consumer.h>
27#include <linux/usb/otg.h>
28#include <linux/usb/typec.h>
29
30struct cc_param {
31 u32 rp_4p7k_code;
32 u32 rp_36k_code;
33 u32 rp_12k_code;
34 u32 rd_code;
35 u32 ra_code;
36 u32 vref_2p6v;
37 u32 vref_1p23v;
38 u32 vref_0p8v;
39 u32 vref_0p66v;
40 u32 vref_0p4v;
41 u32 vref_0p2v;
42 u32 vref_1_1p6v;
43 u32 vref_0_1p6v;
44};
45
46struct type_c_cfg {
47 int parameter_ver; /* Parameter version */
48 int cc_dfp_mode;
49 struct cc_param cc1_param;
50 struct cc_param cc2_param;
51
52 u32 debounce_val;
53 bool use_defalut_parameter;
54};
55
56struct type_c_data {
57 void __iomem *reg_base;
58 struct device *dev;
59 struct extcon_dev *edev;
60
61 u32 irq;
62
63 /* rd control GPIO only for rtd1295 */
64 struct gpio_desc *rd_ctrl_gpio_desc;
65
66 /* Parameters */
67 struct type_c_cfg *type_c_cfg;
68 u32 dfp_mode_rp_en;
69 u32 ufp_mode_rd_en;
70 u32 cc1_code;
71 u32 cc2_code;
72 u32 cc1_vref;
73 u32 cc2_vref;
74 u32 debounce; /* 1b,1us 7f,4.7us */
75
76 /* type_c state */
77 int connect_change;
78#define CONNECT_CHANGE 1
79#define CONNECT_NO_CHANGE 0
80 int cc_mode; /* cc is host or device */
81#define IN_HOST_MODE 0x10
82#define IN_DEVICE_MODE 0x20
83 int is_attach;
84#define IN_ATTACH 1
85#define TO_ATTACH 1
86#define IN_DETACH 0
87#define TO_DETACH 0
88 int at_cc1;
89#define AT_CC1 1
90#define AT_CC2 0
91
92 u32 int_status;
93 u32 cc_status;
94 /* protect the data member */
95 spinlock_t lock;
96 struct delayed_work delayed_work;
97
98 bool rd_en_at_first;
99
100 struct dentry *debug_dir;
101
102 struct typec_port *port;
103};
104
105/* Type C register offset */
106#define USB_TYPEC_CTRL_CC1_0 0x0
107#define USB_TYPEC_CTRL_CC1_1 0x4
108#define USB_TYPEC_CTRL_CC2_0 0x8
109#define USB_TYPEC_CTRL_CC2_1 0xC
110#define USB_TYPEC_STS 0x10
111#define USB_TYPEC_CTRL 0x14
112#define USB_DBUS_PWR_CTRL 0x18
113
114#define ENABLE_CC1 0x1
115#define ENABLE_CC2 0x2
116#define DISABLE_CC 0x0
117
118/* Bit mapping USB_TYPEC_CTRL_CC1_0 and USB_TYPEC_CTRL_CC2_0 */
119#define PLR_EN BIT(29)
120#define CC_SWITCH_MASK (BIT(29) | BIT(28) | BIT(27))
121#define CC_CODE_MASK (0xfffff << 7)
122#define rp4pk_code(val) ((0x1f & (val)) << 22)
123#define code_rp4pk(val) (((val) >> 22) & 0x1f)
124#define rp36k_code(val) ((0x1f & (val)) << 17)
125#define code_rp36k(val) (((val) >> 17) & 0x1f)
126#define rp12k_code(val) ((0x1f & (val)) << 12)
127#define code_rp12k(val) (((val) >> 12) & 0x1f)
128#define rd_code(val) ((0x1f & (val)) << 7)
129#define code_rd(val) (((val) >> 7) & 0x1f)
130#define dfp_mode(val) ((0x3 & (val)) << 5)
131#define EN_RP4P7K BIT(4)
132#define EN_RP36K BIT(3)
133#define EN_RP12K BIT(2)
134#define EN_RD BIT(1)
135#define EN_CC_DET BIT(0)
136
137#define CC_MODE_UFP 0x0
138#define CC_MODE_DFP_USB 0x1
139#define CC_MODE_DFP_1_5 0x2
140#define CC_MODE_DFP_3_0 0x3
141
142/*
143 * PARAMETER_V0:
144 * Realtek Kylin rtd1295
145 * Realtek Hercules rtd1395
146 * Realtek Thor rtd1619
147 * Realtek Hank rtd1319
148 * Realtek Groot rtd1312c
149 * PARAMETER_V1:
150 * Realtek Stark rtd1619b
151 * Realtek Parker rtd1319d
152 * Realtek Danvers rtd1315e
153 */
154enum parameter_version {
155 PARAMETER_V0 = 0,
156 PARAMETER_V1 = 1,
157};
158
159/* Bit mapping USB_TYPEC_CTRL_CC1_1 and USB_TYPEC_CTRL_CC2_1 */
160#define V0_vref_2p6v(val) ((0xf & (val)) << 26) /* Bit 29 for groot */
161#define V0_vref_1p23v(val) ((0xf & (val)) << 22)
162#define V0_vref_0p8v(val) ((0xf & (val)) << 18)
163#define V0_vref_0p66v(val) ((0xf & (val)) << 14)
164#define V0_vref_0p4v(val) ((0x7 & (val)) << 11)
165#define V0_vref_0p2v(val) ((0x7 & (val)) << 8)
166#define V0_vref_1_1p6v(val) ((0xf & (val)) << 4)
167#define V0_vref_0_1p6v(val) ((0xf & (val)) << 0)
168
169#define V0_decode_2p6v(val) (((val) >> 26) & 0xf) /* Bit 29 for groot */
170#define V0_decode_1p23v(val) (((val) >> 22) & 0xf)
171#define V0_decode_0p8v(val) (((val) >> 18) & 0xf)
172#define V0_decode_0p66v(val) (((val) >> 14) & 0xf)
173#define V0_decode_0p4v(val) (((val) >> 11) & 0x7)
174#define V0_decode_0p2v(val) (((val) >> 8) & 0x7)
175#define V0_decode_1_1p6v(val) (((val) >> 4) & 0xf)
176#define V0_decode_0_1p6v(val) (((val) >> 0) & 0xf)
177
178/* new Bit mapping USB_TYPEC_CTRL_CC1_1 and USB_TYPEC_CTRL_CC2_1 */
179#define V1_vref_2p6v(val) ((0xf & (val)) << 28)
180#define V1_vref_1p23v(val) ((0xf & (val)) << 24)
181#define V1_vref_0p8v(val) ((0xf & (val)) << 20)
182#define V1_vref_0p66v(val) ((0xf & (val)) << 16)
183#define V1_vref_0p4v(val) ((0xf & (val)) << 12)
184#define V1_vref_0p2v(val) ((0xf & (val)) << 8)
185#define V1_vref_1_1p6v(val) ((0xf & (val)) << 4)
186#define V1_vref_0_1p6v(val) ((0xf & (val)) << 0)
187
188#define V1_decode_2p6v(val) (((val) >> 28) & 0xf)
189#define V1_decode_1p23v(val) (((val) >> 24) & 0xf)
190#define V1_decode_0p8v(val) (((val) >> 20) & 0xf)
191#define V1_decode_0p66v(val) (((val) >> 16) & 0xf)
192#define V1_decode_0p4v(val) (((val) >> 12) & 0xf)
193#define V1_decode_0p2v(val) (((val) >> 8) & 0xf)
194#define V1_decode_1_1p6v(val) (((val) >> 4) & 0xf)
195#define V1_decode_0_1p6v(val) (((val) >> 0) & 0xf)
196
197/* Bit mapping USB_TYPEC_STS */
198#define DET_STS 0x7
199#define CC1_DET_STS (DET_STS)
200#define CC2_DET_STS (DET_STS << 3)
201#define DET_STS_RA 0x1
202#define DET_STS_RD 0x3
203#define DET_STS_RP 0x1
204#define CC1_DET_STS_RA (DET_STS_RA)
205#define CC1_DET_STS_RD (DET_STS_RD)
206#define CC1_DET_STS_RP (DET_STS_RP)
207#define CC2_DET_STS_RA (DET_STS_RA << 3)
208#define CC2_DET_STS_RD (DET_STS_RD << 3)
209#define CC2_DET_STS_RP (DET_STS_RP << 3)
210
211/* Bit mapping USB_TYPEC_CTRL */
212#define CC2_INT_EN BIT(11)
213#define CC1_INT_EN BIT(10)
214#define CC2_INT_STS BIT(9)
215#define CC1_INT_STS BIT(8)
216#define DEBOUNCE_TIME_MASK 0xff
217#define DEBOUNCE_EN BIT(0)
218#define ENABLE_TYPE_C_DETECT (CC1_INT_EN | CC2_INT_EN)
219#define ALL_CC_INT_STS (CC1_INT_STS | CC2_INT_STS)
220
221/* Parameter */
222#define DETECT_TIME 50 /* ms */
223
224static const unsigned int usb_type_c_cable[] = {
225 EXTCON_USB,
226 EXTCON_USB_HOST,
227 EXTCON_NONE,
228};
229
230enum usb_data_roles {
231 DR_NONE,
232 DR_HOST,
233 DR_DEVICE,
234};
235
236static const struct soc_device_attribute rtk_soc_kylin[] = {
237 { .family = "Realtek Kylin", },
238 { /* empty */ }
239};
240
241static int rtd129x_switch_type_c_plug_config(struct type_c_data *type_c,
242 int dr_mode, int cc)
243{
244 void __iomem *reg = type_c->reg_base + USB_TYPEC_CTRL_CC1_0;
245 int val_cc;
246
247#define TYPE_C_EN_SWITCH BIT(29)
248#define TYPE_C_TXRX_SEL (BIT(28) | BIT(27))
249#define TYPE_C_SWITCH_MASK (TYPE_C_EN_SWITCH | TYPE_C_TXRX_SEL)
250#define TYPE_C_ENABLE_CC1 TYPE_C_EN_SWITCH
251#define TYPE_C_ENABLE_CC2 (TYPE_C_EN_SWITCH | TYPE_C_TXRX_SEL)
252#define TYPE_C_DISABLE_CC ~TYPE_C_SWITCH_MASK
253
254 val_cc = readl(addr: reg);
255 val_cc &= ~TYPE_C_SWITCH_MASK;
256
257 if (cc == DISABLE_CC) {
258 val_cc &= TYPE_C_DISABLE_CC;
259 } else if (cc == ENABLE_CC1) {
260 val_cc |= TYPE_C_ENABLE_CC1;
261 } else if (cc == ENABLE_CC2) {
262 val_cc |= TYPE_C_ENABLE_CC2;
263 } else {
264 dev_err(type_c->dev, "%s: Error cc setting cc=0x%x\n", __func__, cc);
265 return -EINVAL;
266 }
267 writel(val: val_cc, addr: reg);
268
269 /* waiting cc stable for enable/disable */
270 mdelay(1);
271
272 dev_dbg(type_c->dev, "%s: cc=0x%x val_cc=0x%x usb_typec_ctrl_cc1_0=0x%x\n",
273 __func__, cc, val_cc, readl(reg));
274
275 return 0;
276}
277
278static inline void switch_type_c_plug_config(struct type_c_data *type_c,
279 int dr_mode, int cc)
280{
281 int ret = 0;
282
283 if (soc_device_match(matches: rtk_soc_kylin))
284 ret = rtd129x_switch_type_c_plug_config(type_c, dr_mode, cc);
285
286 if (ret < 0)
287 dev_err(type_c->dev, "%s: Error set type c plug config\n",
288 __func__);
289}
290
291static void switch_type_c_dr_mode(struct type_c_data *type_c, int dr_mode, int cc)
292{
293 bool is_host = false;
294 bool is_device = false;
295 bool polarity = false;
296 bool vbus = false;
297 bool ss = true;
298
299 switch_type_c_plug_config(type_c, dr_mode, cc);
300 if (cc == ENABLE_CC2)
301 polarity = true;
302
303 switch (dr_mode) {
304 case USB_DR_MODE_HOST:
305 is_host = true;
306 break;
307 case USB_DR_MODE_PERIPHERAL:
308 is_device = true;
309 vbus = true;
310 break;
311 default:
312 dev_dbg(type_c->dev, "%s dr_mode=%d ==> no host or device\n",
313 __func__, dr_mode);
314 break;
315 }
316
317 dev_dbg(type_c->dev, "%s is_host=%d is_device=%d vbus=%d polarity=%d\n",
318 __func__, is_host, is_device, vbus, polarity);
319
320 /* for EXTCON_USB device mode */
321 extcon_set_state(edev: type_c->edev, EXTCON_USB, state: is_device);
322 extcon_set_property(edev: type_c->edev, EXTCON_USB,
323 EXTCON_PROP_USB_VBUS,
324 prop_val: (union extcon_property_value)(int)vbus);
325 extcon_set_property(edev: type_c->edev, EXTCON_USB,
326 EXTCON_PROP_USB_TYPEC_POLARITY,
327 prop_val: (union extcon_property_value)(int)polarity);
328 extcon_set_property(edev: type_c->edev, EXTCON_USB,
329 EXTCON_PROP_USB_SS,
330 prop_val: (union extcon_property_value)(int)ss);
331
332 /* for EXTCON_USB_HOST host mode */
333 extcon_set_state(edev: type_c->edev, EXTCON_USB_HOST, state: is_host);
334 extcon_set_property(edev: type_c->edev, EXTCON_USB_HOST,
335 EXTCON_PROP_USB_VBUS,
336 prop_val: (union extcon_property_value)(int)vbus);
337 extcon_set_property(edev: type_c->edev, EXTCON_USB_HOST,
338 EXTCON_PROP_USB_TYPEC_POLARITY,
339 prop_val: (union extcon_property_value)(int)polarity);
340 extcon_set_property(edev: type_c->edev, EXTCON_USB_HOST,
341 EXTCON_PROP_USB_SS,
342 prop_val: (union extcon_property_value)(int)ss);
343
344 /* sync EXTCON_USB and EXTCON_USB_HOST */
345 extcon_sync(edev: type_c->edev, EXTCON_USB);
346 extcon_sync(edev: type_c->edev, EXTCON_USB_HOST);
347
348 if (type_c->port) {
349 switch (dr_mode) {
350 case USB_DR_MODE_HOST:
351 typec_set_data_role(port: type_c->port, role: TYPEC_HOST);
352 typec_set_pwr_role(port: type_c->port, role: TYPEC_SOURCE);
353 break;
354 case USB_DR_MODE_PERIPHERAL:
355 typec_set_data_role(port: type_c->port, role: TYPEC_DEVICE);
356 typec_set_pwr_role(port: type_c->port, role: TYPEC_SINK);
357 break;
358 default:
359 dev_dbg(type_c->dev, "%s unknown dr_mode=%d\n",
360 __func__, dr_mode);
361 break;
362 }
363 }
364}
365
366/* connector attached/detached */
367static int connector_attached(struct type_c_data *type_c, u32 cc, int dr_mode)
368{
369 void __iomem *reg = type_c->reg_base + USB_TYPEC_CTRL;
370
371 cancel_delayed_work(dwork: &type_c->delayed_work);
372
373 switch_type_c_dr_mode(type_c, dr_mode, cc);
374
375 writel(ENABLE_TYPE_C_DETECT | readl(addr: reg), addr: reg);
376
377 return 0;
378}
379
380static int connector_detached(struct type_c_data *type_c, u32 cc, int dr_mode)
381{
382 void __iomem *reg = type_c->reg_base + USB_TYPEC_CTRL;
383
384 writel(val: ~ENABLE_TYPE_C_DETECT & readl(addr: reg), addr: reg);
385
386 switch_type_c_dr_mode(type_c, dr_mode: 0, cc);
387
388 schedule_delayed_work(dwork: &type_c->delayed_work, delay: msecs_to_jiffies(DETECT_TIME));
389
390 return 0;
391}
392
393/* detect host device switch */
394static int __detect_host_device(struct type_c_data *type_c, u32 rp_or_rd_en)
395{
396 struct device *dev = type_c->dev;
397 void __iomem *reg_base = type_c->reg_base;
398 u32 cc1_config, cc2_config, default_ctrl;
399 u32 cc1_switch = 0;
400
401 default_ctrl = readl(addr: reg_base + USB_TYPEC_CTRL) & DEBOUNCE_TIME_MASK;
402 writel(val: default_ctrl, addr: reg_base + USB_TYPEC_CTRL);
403
404 cc1_config = readl(addr: reg_base + USB_TYPEC_CTRL_CC1_0);
405 cc2_config = readl(addr: reg_base + USB_TYPEC_CTRL_CC2_0);
406
407 cc1_config &= ~EN_CC_DET;
408 cc2_config &= ~EN_CC_DET;
409 writel(val: cc1_config, addr: reg_base + USB_TYPEC_CTRL_CC1_0);
410 writel(val: cc2_config, addr: reg_base + USB_TYPEC_CTRL_CC2_0);
411
412 if (soc_device_match(matches: rtk_soc_kylin))
413 cc1_switch = cc1_config & CC_SWITCH_MASK;
414
415 cc1_config &= CC_CODE_MASK;
416 cc1_config |= rp_or_rd_en | cc1_switch;
417 cc2_config &= CC_CODE_MASK;
418 cc2_config |= rp_or_rd_en;
419 writel(val: cc2_config, addr: reg_base + USB_TYPEC_CTRL_CC2_0);
420 writel(val: cc1_config, addr: reg_base + USB_TYPEC_CTRL_CC1_0);
421
422 /* For kylin to disable external rd control gpio */
423 if (soc_device_match(matches: rtk_soc_kylin)) {
424 struct gpio_desc *gpio = type_c->rd_ctrl_gpio_desc;
425
426 if (gpio && gpiod_direction_output(desc: gpio, value: 1))
427 dev_err(dev, "%s ERROR set rd_ctrl_gpio_desc fail\n", __func__);
428 }
429
430 cc1_config |= EN_CC_DET;
431 cc2_config |= EN_CC_DET;
432 writel(val: cc1_config, addr: reg_base + USB_TYPEC_CTRL_CC1_0);
433 writel(val: cc2_config, addr: reg_base + USB_TYPEC_CTRL_CC2_0);
434
435 return 0;
436}
437
438static int detect_device(struct type_c_data *type_c)
439{
440 return __detect_host_device(type_c, rp_or_rd_en: type_c->dfp_mode_rp_en);
441}
442
443static int detect_host(struct type_c_data *type_c)
444{
445 return __detect_host_device(type_c, rp_or_rd_en: type_c->ufp_mode_rd_en);
446}
447
448static int host_device_switch_detection(struct type_c_data *type_c)
449{
450 if (type_c->cc_mode == IN_HOST_MODE) {
451 type_c->cc_mode = IN_DEVICE_MODE;
452 detect_host(type_c);
453 } else {
454 type_c->cc_mode = IN_HOST_MODE;
455 detect_device(type_c);
456 }
457
458 return 0;
459}
460
461static int detect_type_c_state(struct type_c_data *type_c)
462{
463 struct device *dev = type_c->dev;
464 void __iomem *reg_base = type_c->reg_base;
465 u32 int_status, cc_status, cc_status_check;
466 unsigned long flags;
467
468 spin_lock_irqsave(&type_c->lock, flags);
469
470 int_status = readl(addr: reg_base + USB_TYPEC_CTRL);
471 cc_status = readl(addr: reg_base + USB_TYPEC_STS);
472
473 type_c->connect_change = CONNECT_NO_CHANGE;
474
475 switch (type_c->cc_mode | type_c->is_attach) {
476 case IN_HOST_MODE | IN_ATTACH:
477 if (((cc_status & CC1_DET_STS) == CC1_DET_STS) && type_c->at_cc1 == AT_CC1) {
478 dev_dbg(dev, "IN host mode and cc1 device detach (cc_status=0x%x)",
479 cc_status);
480 type_c->is_attach = TO_DETACH;
481 type_c->connect_change = CONNECT_CHANGE;
482 } else if (((cc_status & CC2_DET_STS) == CC2_DET_STS) &&
483 type_c->at_cc1 == AT_CC2) {
484 dev_dbg(dev, "IN host mode and cc2 device detach (cc_status=0x%x)",
485 cc_status);
486 type_c->is_attach = TO_DETACH;
487 type_c->connect_change = CONNECT_CHANGE;
488 }
489 break;
490 case IN_HOST_MODE | IN_DETACH:
491 cc_status_check = readl(addr: reg_base + USB_TYPEC_STS);
492 if (cc_status_check != (CC1_DET_STS | CC2_DET_STS)) {
493 if (in_interrupt()) {
494 /* Add delay time to avoid capacitive effect of cable. */
495 mdelay(300);
496 } else {
497 spin_unlock_irqrestore(lock: &type_c->lock, flags);
498 /* Add delay time to avoid capacitive effect of cable. */
499 msleep(msecs: 300);
500 spin_lock_irqsave(&type_c->lock, flags);
501 }
502 cc_status_check = readl(addr: reg_base + USB_TYPEC_STS);
503 }
504 if (cc_status != cc_status_check) {
505 dev_warn(dev, "IN_HOST_MODE: cc_status (0x%x) != cc_status_check (0x%x)\n",
506 cc_status, cc_status_check);
507 cc_status = readl(addr: reg_base + USB_TYPEC_STS);
508 }
509
510 if ((cc_status & CC1_DET_STS) == CC1_DET_STS_RD) {
511 dev_dbg(dev, "IN host mode and cc1 device attach (cc_status=0x%x)",
512 cc_status);
513 type_c->is_attach = TO_ATTACH;
514 type_c->at_cc1 = AT_CC1;
515 type_c->connect_change = CONNECT_CHANGE;
516 } else if ((cc_status & CC2_DET_STS) == CC2_DET_STS_RD) {
517 dev_dbg(dev, "In host mode and cc2 device attach (cc_status=0x%x)",
518 cc_status);
519 type_c->is_attach = TO_ATTACH;
520 type_c->at_cc1 = AT_CC2;
521 type_c->connect_change = CONNECT_CHANGE;
522 }
523 break;
524 case IN_DEVICE_MODE | IN_ATTACH:
525 if ((cc_status & CC1_DET_STS) < CC1_DET_STS_RP ||
526 (cc_status & CC2_DET_STS) < CC2_DET_STS_RP) {
527 /* Add a sw debounce to filter cc signal sent from apple pd adapter */
528 mdelay(5);
529 cc_status_check = readl(addr: reg_base + USB_TYPEC_STS);
530
531 if (cc_status != cc_status_check) {
532 dev_dbg(dev, "IN_DEVICE_MODE: cc_status (0x%x) != cc_status_check (0x%x) maybe use a pd adapter\n",
533 cc_status, cc_status_check);
534 cc_status = cc_status_check;
535 }
536 }
537
538 if ((cc_status & CC1_DET_STS) < CC1_DET_STS_RP && type_c->at_cc1 == AT_CC1) {
539 dev_dbg(dev, "IN device mode and cc1 host disconnect (cc_status=0x%x)",
540 cc_status);
541 type_c->is_attach = TO_DETACH;
542 type_c->connect_change = CONNECT_CHANGE;
543 } else if ((cc_status & CC2_DET_STS) < CC2_DET_STS_RP &&
544 type_c->at_cc1 == AT_CC2) {
545 dev_dbg(dev, "IN device mode and cc2 host disconnect (cc_status=0x%x)",
546 cc_status);
547 type_c->is_attach = TO_DETACH;
548 type_c->connect_change = CONNECT_CHANGE;
549 }
550 break;
551 case IN_DEVICE_MODE | IN_DETACH:
552 cc_status_check = readl(addr: reg_base + USB_TYPEC_STS);
553 if (cc_status_check != 0x0) {
554 if (in_interrupt()) {
555 /* Add delay time to avoid capacitive effect of cable. */
556 mdelay(300);
557 } else {
558 spin_unlock_irqrestore(lock: &type_c->lock, flags);
559 /* Add delay time to avoid capacitive effect of cable. */
560 msleep(msecs: 300);
561 spin_lock_irqsave(&type_c->lock, flags);
562 }
563 cc_status_check = readl(addr: reg_base + USB_TYPEC_STS);
564 }
565
566 if (cc_status != cc_status_check) {
567 dev_warn(dev, "IN_DEVICE_MODE: cc_status (0x%x) != cc_status_check (0x%x)\n",
568 cc_status, cc_status_check);
569 cc_status = readl(addr: reg_base + USB_TYPEC_STS);
570 }
571
572 if ((cc_status & CC1_DET_STS) >= CC1_DET_STS_RP) {
573 dev_dbg(dev, "IN device mode and cc1 host connect (cc_status=0x%x)",
574 cc_status);
575 type_c->at_cc1 = AT_CC1;
576 type_c->is_attach = TO_ATTACH;
577 type_c->connect_change = CONNECT_CHANGE;
578 } else if ((cc_status & CC2_DET_STS) >= CC2_DET_STS_RP) {
579 dev_dbg(dev, "IN device mode and cc2 host connect (cc_status=0x%x)",
580 cc_status);
581 type_c->at_cc1 = AT_CC2;
582 type_c->is_attach = TO_ATTACH;
583 type_c->connect_change = CONNECT_CHANGE;
584 }
585 break;
586 default:
587 dev_err(dev, "error host or device mode (cc_mode=%d, is_attach=%d) ",
588 type_c->cc_mode, type_c->is_attach);
589 }
590
591 type_c->int_status = int_status;
592 type_c->cc_status = cc_status;
593
594 spin_unlock_irqrestore(lock: &type_c->lock, flags);
595 return 0;
596}
597
598static void host_device_switch(struct work_struct *work)
599{
600 struct type_c_data *type_c = container_of(work, struct type_c_data,
601 delayed_work.work);
602 struct device *dev = type_c->dev;
603 unsigned long flags;
604 int connect_change = 0;
605 int cc_mode = 0;
606 int is_attach = 0;
607 int at_cc1 = 0;
608
609 spin_lock_irqsave(&type_c->lock, flags);
610 if (type_c->connect_change)
611 connect_change = type_c->connect_change;
612 spin_unlock_irqrestore(lock: &type_c->lock, flags);
613
614 if (!connect_change)
615 detect_type_c_state(type_c);
616
617 spin_lock_irqsave(&type_c->lock, flags);
618 if (type_c->connect_change) {
619 connect_change = type_c->connect_change;
620 cc_mode = type_c->cc_mode;
621 is_attach = type_c->is_attach;
622 at_cc1 = type_c->at_cc1;
623 type_c->connect_change = CONNECT_NO_CHANGE;
624 } else {
625 host_device_switch_detection(type_c);
626
627 schedule_delayed_work(dwork: &type_c->delayed_work, delay: msecs_to_jiffies(DETECT_TIME));
628 }
629 spin_unlock_irqrestore(lock: &type_c->lock, flags);
630
631 if (!connect_change)
632 return;
633
634 dev_dbg(dev, "%s: usb cable connection change\n", __func__);
635 if (cc_mode == IN_HOST_MODE) {
636 if (is_attach && at_cc1)
637 connector_attached(type_c, ENABLE_CC1, dr_mode: USB_DR_MODE_HOST);
638 else if (is_attach && !at_cc1)
639 connector_attached(type_c, ENABLE_CC2, dr_mode: USB_DR_MODE_HOST);
640 else
641 connector_detached(type_c, DISABLE_CC, dr_mode: USB_DR_MODE_HOST);
642 } else if (cc_mode == IN_DEVICE_MODE) {
643 if (is_attach && at_cc1)
644 connector_attached(type_c, ENABLE_CC1, dr_mode: USB_DR_MODE_PERIPHERAL);
645 else if (is_attach && !at_cc1)
646 connector_attached(type_c, ENABLE_CC2, dr_mode: USB_DR_MODE_PERIPHERAL);
647 else
648 connector_detached(type_c, DISABLE_CC, dr_mode: USB_DR_MODE_PERIPHERAL);
649 } else {
650 dev_err(dev, "Error: IN unknown mode %d to %s at %s (cc_status=0x%x)\n",
651 cc_mode, is_attach ? "attach" : "detach",
652 at_cc1 ? "cc1" : "cc2", type_c->cc_status);
653 }
654 dev_info(dev, "Connection change OK: IN %s mode to %s at %s (cc_status=0x%x)\n",
655 cc_mode == IN_HOST_MODE ? "host" : "device",
656 is_attach ? "attach" : "detach",
657 at_cc1 ? "cc1" : "cc2", type_c->cc_status);
658}
659
660static irqreturn_t type_c_detect_irq(int irq, void *__data)
661{
662 struct type_c_data *type_c = (struct type_c_data *)__data;
663 struct device *dev = type_c->dev;
664 void __iomem *reg = type_c->reg_base + USB_TYPEC_CTRL;
665 unsigned long flags;
666
667 detect_type_c_state(type_c);
668
669 spin_lock_irqsave(&type_c->lock, flags);
670
671 if (type_c->connect_change) {
672 dev_dbg(dev, "%s: IN %s mode to %s (at %s interrupt) int_status=0x%x, cc_status=0x%x",
673 __func__,
674 type_c->cc_mode == IN_HOST_MODE ? "host" : "device",
675 type_c->is_attach ? "attach" : "detach",
676 type_c->at_cc1 ? "cc1" : "cc2",
677 type_c->int_status, type_c->cc_status);
678
679 /* clear interrupt status */
680 writel(val: ~ALL_CC_INT_STS & readl(addr: reg), addr: reg);
681
682 cancel_delayed_work(dwork: &type_c->delayed_work);
683 schedule_delayed_work(dwork: &type_c->delayed_work, delay: msecs_to_jiffies(m: 0));
684 } else {
685 static int local_count;
686
687 /* if no connect_change, we keep the status to avoid status lose */
688 if (local_count++ > 10) {
689 /* clear interrupt status */
690 writel(val: ~ALL_CC_INT_STS & readl(addr: reg), addr: reg);
691 local_count = 0;
692 }
693 }
694
695 spin_unlock_irqrestore(lock: &type_c->lock, flags);
696
697 return IRQ_HANDLED;
698}
699
700static int type_c_port_dr_set(struct typec_port *port,
701 enum typec_data_role role)
702{
703 struct type_c_data *type_c = typec_get_drvdata(port);
704 u32 enable_cc;
705 unsigned long flags;
706
707 spin_lock_irqsave(&type_c->lock, flags);
708 enable_cc = type_c->at_cc1 ? ENABLE_CC1 : ENABLE_CC2;
709 spin_unlock_irqrestore(lock: &type_c->lock, flags);
710
711 if (role == TYPEC_HOST)
712 switch_type_c_dr_mode(type_c, dr_mode: USB_DR_MODE_HOST, cc: enable_cc);
713 else if (role == TYPEC_DEVICE)
714 switch_type_c_dr_mode(type_c, dr_mode: USB_DR_MODE_PERIPHERAL, cc: enable_cc);
715 else
716 switch_type_c_dr_mode(type_c, dr_mode: 0, DISABLE_CC);
717
718 return 0;
719}
720
721static const struct typec_operations type_c_port_ops = {
722 .dr_set = type_c_port_dr_set,
723};
724
725#ifdef CONFIG_DEBUG_FS
726static int type_c_parameter_show(struct seq_file *s, void *unused)
727{
728 struct type_c_data *type_c = s->private;
729 struct type_c_cfg *type_c_cfg = type_c->type_c_cfg;
730 struct cc_param *cc_param;
731 unsigned long flags;
732
733 spin_lock_irqsave(&type_c->lock, flags);
734
735 seq_printf(m: s, fmt: "cc_dfp_mode %s\n",
736 ({ char *tmp;
737 switch (type_c_cfg->cc_dfp_mode) {
738 case CC_MODE_DFP_USB:
739 tmp = "CC_MODE_DFP_USB"; break;
740 case CC_MODE_DFP_1_5:
741 tmp = "CC_MODE_DFP_1_5"; break;
742 case CC_MODE_DFP_3_0:
743 tmp = "CC_MODE_DFP_3_0"; break;
744 default:
745 tmp = "?"; break;
746 } tmp; }));
747
748 seq_printf(m: s, fmt: "dfp_mode_rp_en 0x%x\n", type_c->dfp_mode_rp_en);
749 seq_printf(m: s, fmt: "ufp_mode_rd_en 0x%x\n", type_c->ufp_mode_rd_en);
750 seq_printf(m: s, fmt: "cc1_code 0x%x\n", type_c->cc1_code);
751 seq_printf(m: s, fmt: "cc2_code 0x%x\n", type_c->cc2_code);
752 seq_printf(m: s, fmt: "cc1_vref 0x%x\n", type_c->cc1_vref);
753 seq_printf(m: s, fmt: "cc2_vref 0x%x\n", type_c->cc2_vref);
754 seq_printf(m: s, fmt: "debounce 0x%x\n", type_c->debounce);
755 seq_puts(m: s, s: "\n");
756
757 cc_param = &type_c_cfg->cc1_param;
758 seq_puts(m: s, s: "cc1_param:\n");
759 seq_printf(m: s, fmt: " rp_4p7k_code 0x%x\n", cc_param->rp_4p7k_code);
760 seq_printf(m: s, fmt: " rp_36k_code 0x%x\n", cc_param->rp_36k_code);
761 seq_printf(m: s, fmt: " rp_12k_code 0x%x\n", cc_param->rp_12k_code);
762 seq_printf(m: s, fmt: " rd_code 0x%x\n", cc_param->rd_code);
763 seq_printf(m: s, fmt: " vref_2p6v 0x%x\n", cc_param->vref_2p6v);
764 seq_printf(m: s, fmt: " vref_1p23v 0x%x\n", cc_param->vref_1p23v);
765 seq_printf(m: s, fmt: " vref_0p8v 0x%x\n", cc_param->vref_0p8v);
766 seq_printf(m: s, fmt: " vref_0p66v 0x%x\n", cc_param->vref_0p66v);
767 seq_printf(m: s, fmt: " vref_0p4v 0x%x\n", cc_param->vref_0p4v);
768 seq_printf(m: s, fmt: " vref_0p2v 0x%x\n", cc_param->vref_0p2v);
769 seq_printf(m: s, fmt: " vref_1_1p6v 0x%x\n", cc_param->vref_1_1p6v);
770 seq_printf(m: s, fmt: " vref_0_1p6v 0x%x\n", cc_param->vref_0_1p6v);
771
772 cc_param = &type_c_cfg->cc2_param;
773 seq_puts(m: s, s: "cc2_param:\n");
774 seq_printf(m: s, fmt: " rp_4p7k_code 0x%x\n", cc_param->rp_4p7k_code);
775 seq_printf(m: s, fmt: " rp_36k_code 0x%x\n", cc_param->rp_36k_code);
776 seq_printf(m: s, fmt: " rp_12k_code 0x%x\n", cc_param->rp_12k_code);
777 seq_printf(m: s, fmt: " rd_code 0x%x\n", cc_param->rd_code);
778 seq_printf(m: s, fmt: " vref_2p6v 0x%x\n", cc_param->vref_2p6v);
779 seq_printf(m: s, fmt: " vref_1p23v 0x%x\n", cc_param->vref_1p23v);
780 seq_printf(m: s, fmt: " vref_0p8v 0x%x\n", cc_param->vref_0p8v);
781 seq_printf(m: s, fmt: " vref_0p66v 0x%x\n", cc_param->vref_0p66v);
782 seq_printf(m: s, fmt: " vref_0p4v 0x%x\n", cc_param->vref_0p4v);
783 seq_printf(m: s, fmt: " vref_0p2v 0x%x\n", cc_param->vref_0p2v);
784 seq_printf(m: s, fmt: " vref_1_1p6v 0x%x\n", cc_param->vref_1_1p6v);
785 seq_printf(m: s, fmt: " vref_0_1p6v 0x%x\n", cc_param->vref_0_1p6v);
786
787 spin_unlock_irqrestore(lock: &type_c->lock, flags);
788
789 return 0;
790}
791
792static int type_c_parameter_open(struct inode *inode, struct file *file)
793{
794 return single_open(file, type_c_parameter_show, inode->i_private);
795}
796
797static const struct file_operations type_c_parameter_fops = {
798 .open = type_c_parameter_open,
799 .read = seq_read,
800 .llseek = seq_lseek,
801 .release = single_release,
802};
803
804static int type_c_status_show(struct seq_file *s, void *unused)
805{
806 struct type_c_data *type_c = s->private;
807 unsigned long flags;
808
809 spin_lock_irqsave(&type_c->lock, flags);
810
811 seq_printf(m: s, fmt: "In %s mode %s at %s (cc_status=0x%x)\n",
812 type_c->cc_mode == IN_HOST_MODE ? "host" : "device",
813 type_c->is_attach ? "attach" : "detach",
814 type_c->at_cc1 ? "cc1" : "cc2", type_c->cc_status);
815
816 seq_printf(m: s, fmt: "Read Register (type_c_ctrl_cc1_0=0x%x)\n",
817 readl(addr: type_c->reg_base + 0x0));
818 seq_printf(m: s, fmt: "Read Register (type_c_ctrl_cc1_1=0x%x)\n",
819 readl(addr: type_c->reg_base + 0x4));
820 seq_printf(m: s, fmt: "Read Register (type_c_ctrl_cc2_0=0x%x)\n",
821 readl(addr: type_c->reg_base + 0x8));
822 seq_printf(m: s, fmt: "Read Register (type_c_ctrl_cc2_1=0x%x)\n",
823 readl(addr: type_c->reg_base + 0xc));
824 seq_printf(m: s, fmt: "Read Register (type_c_status=0x%x)\n",
825 readl(addr: type_c->reg_base + 0x10));
826 seq_printf(m: s, fmt: "Read Register (type_c_ctrl=0x%x)\n",
827 readl(addr: type_c->reg_base + 0x14));
828
829 spin_unlock_irqrestore(lock: &type_c->lock, flags);
830
831 return 0;
832}
833
834static int type_c_status_open(struct inode *inode, struct file *file)
835{
836 return single_open(file, type_c_status_show, inode->i_private);
837}
838
839static const struct file_operations type_c_status_fops = {
840 .open = type_c_status_open,
841 .read = seq_read,
842 .llseek = seq_lseek,
843 .release = single_release,
844};
845
846static inline void create_debug_files(struct type_c_data *type_c)
847{
848 type_c->debug_dir = debugfs_create_dir(name: "type_c", parent: usb_debug_root);
849
850 debugfs_create_file(name: "parameter", mode: 0444, parent: type_c->debug_dir, data: type_c,
851 fops: &type_c_parameter_fops);
852
853 debugfs_create_file(name: "status", mode: 0444, parent: type_c->debug_dir, data: type_c,
854 fops: &type_c_status_fops);
855}
856
857static inline void remove_debug_files(struct type_c_data *type_c)
858{
859 debugfs_remove_recursive(dentry: type_c->debug_dir);
860}
861#else
862static inline void create_debug_files(struct type_c_data *type_c) { }
863static inline void remove_debug_files(struct type_c_data *type_c) { }
864#endif /* CONFIG_DEBUG_FS */
865
866/* Init and probe */
867
868static inline s8 get_value(s8 value)
869{
870 return (((s8)value & 0x8) ? (-(s8)(0x7 & value)) : ((s8)(value)));
871}
872
873static int __updated_type_c_parameter_by_efuse(struct type_c_data *type_c)
874{
875 struct type_c_cfg *type_c_cfg = type_c->type_c_cfg;
876 struct cc_param *cc_param;
877 struct nvmem_cell *cell;
878 s8 cc1_4p7k = 0;
879 s8 cc1_12k = 0;
880 s8 cc1_0p2v = 0;
881 s8 cc1_0p8v = 0;
882 s8 cc1_2p6v = 0;
883 s8 cc1_0p66v = 0;
884 s8 cc1_1p23v = 0;
885 s8 cc2_4p7k = 0;
886 s8 cc2_12k = 0;
887 s8 cc2_0p2v = 0;
888 s8 cc2_0p8v = 0;
889 s8 cc2_2p6v = 0;
890 s8 cc2_0p66v = 0;
891 s8 cc2_1p23v = 0;
892
893 cell = nvmem_cell_get(dev: type_c->dev, id: "usb-cal");
894 if (IS_ERR(ptr: cell)) {
895 dev_warn(type_c->dev, "%s failed to get usb-cal: %ld\n",
896 __func__, PTR_ERR(cell));
897 } else {
898 unsigned char *buf;
899 size_t buf_size;
900 int value_size = 4;
901 int value_mask = (BIT(value_size) - 1);
902
903 buf = nvmem_cell_read(cell, len: &buf_size);
904 if (!IS_ERR(ptr: buf)) {
905 cc1_0p2v = get_value(value: (buf[0] >> value_size * 0) & value_mask);
906 cc1_0p8v = get_value(value: (buf[0] >> value_size * 1) & value_mask);
907 cc1_2p6v = get_value(value: (buf[1] >> value_size * 0) & value_mask);
908 cc1_0p66v = get_value(value: (buf[1] >> value_size * 1) & value_mask);
909 cc1_1p23v = get_value(value: (buf[2] >> value_size * 0) & value_mask);
910
911 cc2_0p2v = get_value(value: (buf[3] >> value_size * 0) & value_mask);
912 cc2_0p8v = get_value(value: (buf[3] >> value_size * 1) & value_mask);
913 cc2_2p6v = get_value(value: (buf[4] >> value_size * 0) & value_mask);
914 cc2_0p66v = get_value(value: (buf[4] >> value_size * 1) & value_mask);
915 cc2_1p23v = get_value(value: (buf[5] >> value_size * 0) & value_mask);
916
917 cc1_4p7k = get_value(value: (buf[6] >> value_size * 0) & value_mask);
918 cc1_12k = get_value(value: (buf[6] >> value_size * 1) & value_mask);
919 cc2_4p7k = get_value(value: (buf[7] >> value_size * 0) & value_mask);
920 cc2_12k = get_value(value: (buf[7] >> value_size * 1) & value_mask);
921
922 kfree(objp: buf);
923 }
924 nvmem_cell_put(cell);
925 }
926
927 dev_dbg(type_c->dev, "check efuse cc1_4p7k=%d cc1_12k=%d cc2_4p7k=%d cc2_12k=%d\n",
928 cc1_4p7k, cc1_12k, cc2_4p7k, cc2_12k);
929 dev_dbg(type_c->dev, "check efuse cc1_0p2v=%d cc1_0p8v=%d cc1_2p6v=%d cc1_0p66v=%d cc1_1p23v=%d\n",
930 cc1_0p2v, cc1_0p8v, cc1_2p6v, cc1_0p66v, cc1_1p23v);
931 dev_dbg(type_c->dev, "check efuse cc2_0p2v=%d cc2_0p8v=%d cc2_2p6v=%d cc2_0p66v=%d cc2_1p23v=%d\n",
932 cc2_0p2v, cc2_0p8v, cc2_2p6v, cc2_0p66v, cc2_1p23v);
933
934 cc_param = &type_c_cfg->cc1_param;
935 cc_param->rp_4p7k_code = cc_param->rp_4p7k_code + cc1_4p7k;
936 cc_param->rp_12k_code = cc_param->rp_12k_code + cc1_12k;
937
938 cc_param->vref_1p23v = cc_param->vref_1p23v + cc1_1p23v;
939 cc_param->vref_0p66v = cc_param->vref_0p66v + cc1_0p66v;
940 cc_param->vref_2p6v = cc_param->vref_2p6v + cc1_2p6v;
941 cc_param->vref_0p8v = cc_param->vref_0p8v + cc1_0p8v;
942 cc_param->vref_0p2v = cc_param->vref_0p2v + cc1_0p2v;
943
944 cc_param = &type_c_cfg->cc2_param;
945 cc_param->rp_4p7k_code = cc_param->rp_4p7k_code + cc2_4p7k;
946 cc_param->rp_12k_code = cc_param->rp_12k_code + cc2_12k;
947
948 cc_param->vref_1p23v = cc_param->vref_1p23v + cc2_1p23v;
949 cc_param->vref_0p66v = cc_param->vref_0p66v + cc2_0p66v;
950 cc_param->vref_2p6v = cc_param->vref_2p6v + cc2_2p6v;
951 cc_param->vref_0p8v = cc_param->vref_0p8v + cc2_0p8v;
952 cc_param->vref_0p2v = cc_param->vref_0p2v + cc2_0p2v;
953
954 return 0;
955}
956
957static int __updated_type_c_parameter_by_efuse_v2(struct type_c_data *type_c)
958{
959 struct type_c_cfg *type_c_cfg = type_c->type_c_cfg;
960 struct cc_param *cc_param;
961 struct nvmem_cell *cell;
962 s8 cc1_4p7k = 0;
963 s8 cc1_12k = 0;
964 s8 cc1_0p2v = 0;
965 s8 cc1_0p8v = 0;
966 s8 cc1_2p6v = 0;
967 s8 cc1_0p66v = 0;
968 s8 cc1_1p23v = 0;
969 s8 cc2_4p7k = 0;
970 s8 cc2_12k = 0;
971 s8 cc2_0p2v = 0;
972 s8 cc2_0p8v = 0;
973 s8 cc2_2p6v = 0;
974 s8 cc2_0p66v = 0;
975 s8 cc2_1p23v = 0;
976
977 cell = nvmem_cell_get(dev: type_c->dev, id: "usb-type-c-cal");
978 if (IS_ERR(ptr: cell)) {
979 dev_warn(type_c->dev, "%s failed to get usb-type-c-cal: %ld\n",
980 __func__, PTR_ERR(cell));
981 } else {
982 unsigned char *buf;
983 size_t buf_size;
984 int value_size = 0;
985 int value_mask = (BIT(value_size) - 1);
986
987 buf = nvmem_cell_read(cell, len: &buf_size);
988 if (!IS_ERR(ptr: buf)) {
989 value_size = 5;
990 value_mask = (BIT(value_size) - 1);
991 cc1_4p7k = buf[0] & value_mask;
992 cc1_12k = buf[1] & value_mask;
993 cc2_4p7k = buf[2] & value_mask;
994 cc2_12k = buf[3] & value_mask;
995
996 value_size = 4;
997 value_mask = (BIT(value_size) - 1);
998 cc1_0p2v = (buf[4] >> value_size * 0) & value_mask;
999 cc1_0p66v = (buf[4] >> value_size * 1) & value_mask;
1000 cc1_0p8v = (buf[5] >> value_size * 0) & value_mask;
1001 cc1_1p23v = (buf[5] >> value_size * 1) & value_mask;
1002 cc1_2p6v = (buf[6] >> value_size * 0) & value_mask;
1003
1004 cc2_0p2v = (buf[6] >> value_size * 1) & value_mask;
1005 cc2_0p66v = (buf[7] >> value_size * 0) & value_mask;
1006 cc2_0p8v = (buf[7] >> value_size * 1) & value_mask;
1007 cc2_1p23v = (buf[8] >> value_size * 0) & value_mask;
1008 cc2_2p6v = (buf[8] >> value_size * 1) & value_mask;
1009
1010 kfree(objp: buf);
1011 }
1012 nvmem_cell_put(cell);
1013 }
1014
1015 dev_dbg(type_c->dev, "check efuse v2 cc1_4p7k=%d cc1_12k=%d cc2_4p7k=%d cc2_12k=%d\n",
1016 cc1_4p7k, cc1_12k, cc2_4p7k, cc2_12k);
1017 dev_dbg(type_c->dev, "check efuse v2 cc1_0p2v=%d cc1_0p8v=%d cc1_2p6v=%d cc1_0p66v=%d cc1_1p23v=%d\n",
1018 cc1_0p2v, cc1_0p8v, cc1_2p6v, cc1_0p66v, cc1_1p23v);
1019 dev_dbg(type_c->dev, "check efuse v2 cc2_0p2v=%d cc2_0p8v=%d cc2_2p6v=%d cc2_0p66v=%d cc2_1p23v=%d\n",
1020 cc2_0p2v, cc2_0p8v, cc2_2p6v, cc2_0p66v, cc2_1p23v);
1021
1022 cc_param = &type_c_cfg->cc1_param;
1023 if (cc1_4p7k)
1024 cc_param->rp_4p7k_code = cc1_4p7k;
1025 if (cc1_12k)
1026 cc_param->rp_12k_code = cc1_12k;
1027
1028 if (cc1_1p23v)
1029 cc_param->vref_1p23v = cc1_1p23v;
1030 if (cc1_0p66v)
1031 cc_param->vref_0p66v = cc1_0p66v;
1032 if (cc1_2p6v)
1033 cc_param->vref_2p6v = cc1_2p6v;
1034 if (cc1_0p8v)
1035 cc_param->vref_0p8v = cc1_0p8v;
1036 if (cc1_0p2v)
1037 cc_param->vref_0p2v = cc1_0p2v;
1038
1039 cc_param = &type_c_cfg->cc2_param;
1040 if (cc2_4p7k)
1041 cc_param->rp_4p7k_code = cc2_4p7k;
1042 if (cc2_12k)
1043 cc_param->rp_12k_code = cc2_12k;
1044
1045 if (cc2_1p23v)
1046 cc_param->vref_1p23v = cc2_1p23v;
1047 if (cc2_0p66v)
1048 cc_param->vref_0p66v = cc2_0p66v;
1049 if (cc2_2p6v)
1050 cc_param->vref_2p6v = cc2_2p6v;
1051 if (cc2_0p8v)
1052 cc_param->vref_0p8v = cc2_0p8v;
1053 if (cc2_0p2v)
1054 cc_param->vref_0p2v = cc2_0p2v;
1055
1056 return 0;
1057}
1058
1059static void get_default_type_c_parameter(struct type_c_data *type_c)
1060{
1061 void __iomem *reg;
1062 int val;
1063
1064 type_c->dfp_mode_rp_en = dfp_mode(CC_MODE_DFP_3_0) | EN_RP4P7K;
1065 type_c->ufp_mode_rd_en = EN_RD;
1066
1067 reg = type_c->reg_base + USB_TYPEC_CTRL_CC1_0;
1068 val = readl(addr: reg);
1069 type_c->cc1_code = CC_CODE_MASK & val;
1070
1071 reg = type_c->reg_base + USB_TYPEC_CTRL_CC2_0;
1072 val = readl(addr: reg);
1073 type_c->cc2_code = CC_CODE_MASK & val;
1074
1075 reg = type_c->reg_base + USB_TYPEC_CTRL_CC1_1;
1076 val = readl(addr: reg);
1077 type_c->cc1_vref = val;
1078
1079 reg = type_c->reg_base + USB_TYPEC_CTRL_CC2_1;
1080 val = readl(addr: reg);
1081 type_c->cc2_vref = val;
1082
1083 reg = type_c->reg_base + USB_TYPEC_CTRL;
1084 val = readl(addr: reg);
1085 type_c->debounce = DEBOUNCE_TIME_MASK & val;
1086}
1087
1088static int setup_type_c_parameter(struct type_c_data *type_c)
1089{
1090 struct type_c_cfg *type_c_cfg = type_c->type_c_cfg;
1091 struct cc_param *cc_param;
1092 struct soc_device_attribute rtk_soc_efuse_v1[] = {
1093 { .family = "Realtek Phoenix",},
1094 { .family = "Realtek Kylin",},
1095 { .family = "Realtek Hercules",},
1096 { .family = "Realtek Thor",},
1097 { .family = "Realtek Hank",},
1098 { .family = "Realtek Groot",},
1099 { .family = "Realtek Stark",},
1100 { .family = "Realtek Parker",},
1101 { /* empty */ }
1102 };
1103
1104 if (type_c_cfg->use_defalut_parameter) {
1105 get_default_type_c_parameter(type_c);
1106 return 0;
1107 }
1108
1109 if (soc_device_match(matches: rtk_soc_efuse_v1))
1110 __updated_type_c_parameter_by_efuse(type_c);
1111 else
1112 __updated_type_c_parameter_by_efuse_v2(type_c);
1113
1114 /*
1115 * UFP rd vref_ufp : 1p23v, 0p66v, 0p2v
1116 * DFP_USB rp36k vref_dfp_usb: 0_1p6v, 0p2v, unused
1117 * DFP_1.5 rp12k vref_dfp_1_5: 1_1p6v, 0p4v, 0p2v
1118 * DFP_3.0 rp4p7k vref_dfp_3_0: 2p6v, 0p8v, 0p2v
1119 */
1120
1121 switch (type_c_cfg->cc_dfp_mode) {
1122 case CC_MODE_DFP_USB:
1123 type_c->dfp_mode_rp_en = dfp_mode(CC_MODE_DFP_USB) | EN_RP36K;
1124 break;
1125 case CC_MODE_DFP_1_5:
1126 type_c->dfp_mode_rp_en = dfp_mode(CC_MODE_DFP_1_5) | EN_RP12K;
1127 break;
1128 case CC_MODE_DFP_3_0:
1129 type_c->dfp_mode_rp_en = dfp_mode(CC_MODE_DFP_3_0) | EN_RP4P7K;
1130 break;
1131 default:
1132 dev_err(type_c->dev, "%s: unknown cc_dfp_mode %d\n",
1133 __func__, type_c_cfg->cc_dfp_mode);
1134 }
1135
1136 type_c->ufp_mode_rd_en = EN_RD;
1137
1138 cc_param = &type_c_cfg->cc1_param;
1139 type_c->cc1_code = rp4pk_code(cc_param->rp_4p7k_code) |
1140 rp36k_code(cc_param->rp_36k_code) |
1141 rp12k_code(cc_param->rp_12k_code) |
1142 rd_code(cc_param->rd_code);
1143
1144 if (type_c_cfg->parameter_ver == PARAMETER_V0)
1145 type_c->cc1_vref = V0_vref_2p6v(cc_param->vref_2p6v) |
1146 V0_vref_1p23v(cc_param->vref_1p23v) |
1147 V0_vref_0p8v(cc_param->vref_0p8v) |
1148 V0_vref_0p66v(cc_param->vref_0p66v) |
1149 V0_vref_0p4v(cc_param->vref_0p4v) |
1150 V0_vref_0p2v(cc_param->vref_0p2v) |
1151 V0_vref_1_1p6v(cc_param->vref_1_1p6v) |
1152 V0_vref_0_1p6v(cc_param->vref_0_1p6v);
1153 else if (type_c_cfg->parameter_ver == PARAMETER_V1)
1154 type_c->cc1_vref = V1_vref_2p6v(cc_param->vref_2p6v) |
1155 V1_vref_1p23v(cc_param->vref_1p23v) |
1156 V1_vref_0p8v(cc_param->vref_0p8v) |
1157 V1_vref_0p66v(cc_param->vref_0p66v) |
1158 V1_vref_0p4v(cc_param->vref_0p4v) |
1159 V1_vref_0p2v(cc_param->vref_0p2v) |
1160 V1_vref_1_1p6v(cc_param->vref_1_1p6v) |
1161 V1_vref_0_1p6v(cc_param->vref_0_1p6v);
1162 else
1163 dev_err(type_c->dev, "%s: unknown parameter_ver %d\n",
1164 __func__, type_c_cfg->parameter_ver);
1165
1166 cc_param = &type_c_cfg->cc2_param;
1167 type_c->cc2_code = rp4pk_code(cc_param->rp_4p7k_code)
1168 | rp36k_code(cc_param->rp_36k_code)
1169 | rp12k_code(cc_param->rp_12k_code)
1170 | rd_code(cc_param->rd_code);
1171
1172 if (type_c_cfg->parameter_ver == PARAMETER_V0)
1173 type_c->cc2_vref = V0_vref_2p6v(cc_param->vref_2p6v) |
1174 V0_vref_1p23v(cc_param->vref_1p23v) |
1175 V0_vref_0p8v(cc_param->vref_0p8v) |
1176 V0_vref_0p66v(cc_param->vref_0p66v) |
1177 V0_vref_0p4v(cc_param->vref_0p4v) |
1178 V0_vref_0p2v(cc_param->vref_0p2v) |
1179 V0_vref_1_1p6v(cc_param->vref_1_1p6v) |
1180 V0_vref_0_1p6v(cc_param->vref_0_1p6v);
1181 else if (type_c_cfg->parameter_ver == PARAMETER_V1)
1182 type_c->cc2_vref = V1_vref_2p6v(cc_param->vref_2p6v) |
1183 V1_vref_1p23v(cc_param->vref_1p23v) |
1184 V1_vref_0p8v(cc_param->vref_0p8v) |
1185 V1_vref_0p66v(cc_param->vref_0p66v) |
1186 V1_vref_0p4v(cc_param->vref_0p4v) |
1187 V1_vref_0p2v(cc_param->vref_0p2v) |
1188 V1_vref_1_1p6v(cc_param->vref_1_1p6v) |
1189 V1_vref_0_1p6v(cc_param->vref_0_1p6v);
1190 else
1191 dev_err(type_c->dev, "%s: unknown parameter_ver %d\n",
1192 __func__, type_c_cfg->parameter_ver);
1193
1194 type_c->debounce = (type_c_cfg->debounce_val << 1) | DEBOUNCE_EN;
1195
1196 return 0;
1197}
1198
1199static int extcon_rtk_type_c_init(struct type_c_data *type_c)
1200{
1201 struct device *dev = type_c->dev;
1202 unsigned long flags;
1203 void __iomem *reg;
1204 int val;
1205
1206 spin_lock_irqsave(&type_c->lock, flags);
1207
1208 /* set parameter */
1209 reg = type_c->reg_base + USB_TYPEC_CTRL_CC1_0;
1210 val = readl(addr: reg);
1211 val = (~CC_CODE_MASK & val) | (type_c->cc1_code & CC_CODE_MASK);
1212 writel(val, addr: reg);
1213
1214 reg = type_c->reg_base + USB_TYPEC_CTRL_CC2_0;
1215 val = readl(addr: reg);
1216 val = (~CC_CODE_MASK & val) | (type_c->cc2_code & CC_CODE_MASK);
1217
1218 reg = type_c->reg_base + USB_TYPEC_CTRL_CC1_1;
1219 writel(val: type_c->cc1_vref, addr: reg);
1220
1221 reg = type_c->reg_base + USB_TYPEC_CTRL_CC2_1;
1222 writel(val: type_c->cc2_vref, addr: reg);
1223
1224 reg = type_c->reg_base + USB_TYPEC_CTRL;
1225 val = readl(addr: reg);
1226 val = (~DEBOUNCE_TIME_MASK & val) | (type_c->debounce & DEBOUNCE_TIME_MASK);
1227
1228 dev_info(dev, "First check USB_DR_MODE_PERIPHERAL");
1229 type_c->cc_mode = IN_DEVICE_MODE;
1230 type_c->is_attach = IN_DETACH;
1231 type_c->connect_change = CONNECT_NO_CHANGE;
1232
1233 detect_host(type_c);
1234
1235 spin_unlock_irqrestore(lock: &type_c->lock, flags);
1236
1237 schedule_delayed_work(dwork: &type_c->delayed_work, delay: msecs_to_jiffies(m: 0));
1238
1239 if (!type_c->port) {
1240 struct typec_capability typec_cap = { };
1241 struct fwnode_handle *fwnode;
1242 const char *buf;
1243 int ret;
1244
1245 typec_cap.revision = USB_TYPEC_REV_1_0;
1246 typec_cap.prefer_role = TYPEC_NO_PREFERRED_ROLE;
1247 typec_cap.driver_data = type_c;
1248 typec_cap.ops = &type_c_port_ops;
1249
1250 fwnode = device_get_named_child_node(dev, childname: "connector");
1251 if (!fwnode)
1252 return -EINVAL;
1253
1254 ret = fwnode_property_read_string(fwnode, propname: "power-role", val: &buf);
1255 if (ret) {
1256 dev_err(dev, "power-role not found: %d\n", ret);
1257 return ret;
1258 }
1259
1260 ret = typec_find_port_power_role(name: buf);
1261 if (ret < 0)
1262 return ret;
1263 typec_cap.type = ret;
1264
1265 ret = fwnode_property_read_string(fwnode, propname: "data-role", val: &buf);
1266 if (ret) {
1267 dev_err(dev, "data-role not found: %d\n", ret);
1268 return ret;
1269 }
1270
1271 ret = typec_find_port_data_role(name: buf);
1272 if (ret < 0)
1273 return ret;
1274 typec_cap.data = ret;
1275
1276 type_c->port = typec_register_port(parent: type_c->dev, cap: &typec_cap);
1277 if (IS_ERR(ptr: type_c->port))
1278 return PTR_ERR(ptr: type_c->port);
1279 }
1280
1281 return 0;
1282}
1283
1284static int extcon_rtk_type_c_edev_register(struct type_c_data *type_c)
1285{
1286 struct device *dev = type_c->dev;
1287 int ret = 0;
1288
1289 type_c->edev = devm_extcon_dev_allocate(dev, cable: usb_type_c_cable);
1290 if (IS_ERR(ptr: type_c->edev)) {
1291 dev_err(dev, "failed to allocate extcon device\n");
1292 return -ENOMEM;
1293 }
1294
1295 ret = devm_extcon_dev_register(dev, edev: type_c->edev);
1296 if (ret < 0) {
1297 dev_err(dev, "failed to register extcon device\n");
1298 return ret;
1299 }
1300
1301 extcon_set_property_capability(edev: type_c->edev, EXTCON_USB,
1302 EXTCON_PROP_USB_VBUS);
1303 extcon_set_property_capability(edev: type_c->edev, EXTCON_USB,
1304 EXTCON_PROP_USB_TYPEC_POLARITY);
1305 extcon_set_property_capability(edev: type_c->edev, EXTCON_USB,
1306 EXTCON_PROP_USB_SS);
1307
1308 extcon_set_property_capability(edev: type_c->edev, EXTCON_USB_HOST,
1309 EXTCON_PROP_USB_VBUS);
1310 extcon_set_property_capability(edev: type_c->edev, EXTCON_USB_HOST,
1311 EXTCON_PROP_USB_TYPEC_POLARITY);
1312 extcon_set_property_capability(edev: type_c->edev, EXTCON_USB_HOST,
1313 EXTCON_PROP_USB_SS);
1314
1315 return ret;
1316}
1317
1318static int extcon_rtk_type_c_probe(struct platform_device *pdev)
1319{
1320 struct device *dev = &pdev->dev;
1321 struct type_c_data *type_c;
1322 const struct type_c_cfg *type_c_cfg;
1323 int ret = 0;
1324
1325 type_c = devm_kzalloc(dev, size: sizeof(*type_c), GFP_KERNEL);
1326 if (!type_c)
1327 return -ENOMEM;
1328
1329 type_c->reg_base = devm_platform_ioremap_resource(pdev, index: 0);
1330 if (IS_ERR(ptr: type_c->reg_base))
1331 return PTR_ERR(ptr: type_c->reg_base);
1332
1333 type_c->dev = dev;
1334
1335 type_c->irq = irq_of_parse_and_map(node: pdev->dev.of_node, index: 0);
1336 if (type_c->irq <= 0) {
1337 dev_err(&pdev->dev, "Type C driver with no IRQ. Check %s setup!\n",
1338 dev_name(&pdev->dev));
1339 ret = -ENODEV;
1340 goto err;
1341 }
1342
1343 ret = devm_request_irq(dev, irq: type_c->irq, handler: type_c_detect_irq,
1344 IRQF_SHARED, devname: "type_c_detect", dev_id: type_c);
1345
1346 spin_lock_init(&type_c->lock);
1347
1348 type_c->rd_ctrl_gpio_desc = NULL;
1349 if (soc_device_match(matches: rtk_soc_kylin)) {
1350 struct gpio_desc *gpio;
1351
1352 gpio = fwnode_gpiod_get_index(of_fwnode_handle(dev->of_node),
1353 con_id: "realtek,rd-ctrl-gpios",
1354 index: 0, flags: GPIOD_OUT_HIGH, label: "rd-ctrl-gpio");
1355 if (IS_ERR(ptr: gpio)) {
1356 dev_err(dev, "Error rd_ctrl-gpios no found (err=%d)\n",
1357 (int)PTR_ERR(gpio));
1358 } else {
1359 type_c->rd_ctrl_gpio_desc = gpio;
1360 dev_dbg(dev, "%s get rd-ctrl-gpios (id=%d) OK\n",
1361 __func__, desc_to_gpio(gpio));
1362 }
1363 }
1364
1365 type_c_cfg = of_device_get_match_data(dev);
1366 if (!type_c_cfg) {
1367 dev_err(dev, "type_c config are not assigned!\n");
1368 ret = -EINVAL;
1369 goto err;
1370 }
1371
1372 type_c->type_c_cfg = devm_kzalloc(dev, size: sizeof(*type_c_cfg), GFP_KERNEL);
1373
1374 memcpy(type_c->type_c_cfg, type_c_cfg, sizeof(*type_c_cfg));
1375
1376 if (setup_type_c_parameter(type_c)) {
1377 dev_err(dev, "ERROR: %s to setup type c parameter!!", __func__);
1378 ret = -EINVAL;
1379 goto err;
1380 }
1381
1382 INIT_DELAYED_WORK(&type_c->delayed_work, host_device_switch);
1383
1384 ret = extcon_rtk_type_c_init(type_c);
1385 if (ret) {
1386 dev_err(dev, "%s failed to init type_c\n", __func__);
1387 goto err;
1388 }
1389
1390 platform_set_drvdata(pdev, data: type_c);
1391
1392 ret = extcon_rtk_type_c_edev_register(type_c);
1393
1394 create_debug_files(type_c);
1395
1396 return 0;
1397
1398err:
1399 dev_err(&pdev->dev, "%s: Probe fail, %d\n", __func__, ret);
1400
1401 return ret;
1402}
1403
1404static void extcon_rtk_type_c_remove(struct platform_device *pdev)
1405{
1406 struct device *dev = &pdev->dev;
1407 struct type_c_data *type_c = dev_get_drvdata(dev);
1408 u32 default_ctrl;
1409 unsigned long flags;
1410
1411 remove_debug_files(type_c);
1412
1413 if (type_c->port) {
1414 typec_unregister_port(port: type_c->port);
1415 type_c->port = NULL;
1416 }
1417
1418 cancel_delayed_work_sync(dwork: &type_c->delayed_work);
1419 flush_delayed_work(dwork: &type_c->delayed_work);
1420 WARN_ON_ONCE(delayed_work_pending(&type_c->delayed_work));
1421
1422 spin_lock_irqsave(&type_c->lock, flags);
1423 /* disable interrupt */
1424 default_ctrl = readl(addr: type_c->reg_base + USB_TYPEC_CTRL) &
1425 DEBOUNCE_TIME_MASK;
1426 writel(val: default_ctrl, addr: type_c->reg_base + USB_TYPEC_CTRL);
1427
1428 /* disable cc detect, rp, rd */
1429 writel(PLR_EN, addr: type_c->reg_base + USB_TYPEC_CTRL_CC1_0);
1430 writel(val: 0, addr: type_c->reg_base + USB_TYPEC_CTRL_CC2_0);
1431
1432 spin_unlock_irqrestore(lock: &type_c->lock, flags);
1433
1434 if (type_c->rd_ctrl_gpio_desc)
1435 gpiod_put(desc: type_c->rd_ctrl_gpio_desc);
1436 type_c->rd_ctrl_gpio_desc = NULL;
1437
1438 free_irq(type_c->irq, type_c);
1439}
1440
1441static const struct type_c_cfg rtd1295_type_c_cfg = {
1442 .parameter_ver = PARAMETER_V0,
1443 .cc_dfp_mode = CC_MODE_DFP_3_0,
1444 .cc1_param = { .rp_4p7k_code = 0xb,
1445 .rp_36k_code = 0x17,
1446 .rp_12k_code = 0x10,
1447 .rd_code = 0,
1448 .ra_code = 0,
1449 .vref_2p6v = 0x0,
1450 .vref_1p23v = 0x0,
1451 .vref_0p8v = 0x3,
1452 .vref_0p66v = 0x0,
1453 .vref_0p4v = 0x0,
1454 .vref_0p2v = 0x4,
1455 .vref_1_1p6v = 0,
1456 .vref_0_1p6v = 0 },
1457 .cc2_param = { .rp_4p7k_code = 0xc,
1458 .rp_36k_code = 0x17,
1459 .rp_12k_code = 0x12,
1460 .rd_code = 0,
1461 .ra_code = 0,
1462 .vref_2p6v = 0x2,
1463 .vref_1p23v = 0x0,
1464 .vref_0p8v = 0x3,
1465 .vref_0p66v = 0x0,
1466 .vref_0p4v = 0x0,
1467 .vref_0p2v = 0x5,
1468 .vref_1_1p6v = 0,
1469 .vref_0_1p6v = 0 },
1470 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1471 .use_defalut_parameter = false,
1472};
1473
1474static const struct type_c_cfg rtd1395_type_c_cfg = {
1475 .parameter_ver = PARAMETER_V0,
1476 .cc_dfp_mode = CC_MODE_DFP_3_0,
1477 .cc1_param = { .rp_4p7k_code = 0xc,
1478 .rp_36k_code = 0xb,
1479 .rp_12k_code = 0xe,
1480 .rd_code = 0x10,
1481 .ra_code = 0x0,
1482 .vref_2p6v = 0x0,
1483 .vref_1p23v = 0x1,
1484 .vref_0p8v = 0x0,
1485 .vref_0p66v = 0x0,
1486 .vref_0p4v = 0x3,
1487 .vref_0p2v = 0x0,
1488 .vref_1_1p6v = 0x7,
1489 .vref_0_1p6v = 0x7 },
1490 .cc2_param = { .rp_4p7k_code = 0xb,
1491 .rp_36k_code = 0x9,
1492 .rp_12k_code = 0xe,
1493 .rd_code = 0xf,
1494 .ra_code = 0x0,
1495 .vref_2p6v = 0x1,
1496 .vref_1p23v = 0x3,
1497 .vref_0p8v = 0x3,
1498 .vref_0p66v = 0x2,
1499 .vref_0p4v = 0x3,
1500 .vref_0p2v = 0x2,
1501 .vref_1_1p6v = 0x7,
1502 .vref_0_1p6v = 0x7 },
1503 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1504 .use_defalut_parameter = false,
1505};
1506
1507static const struct type_c_cfg rtd1619_type_c_cfg = {
1508 .parameter_ver = PARAMETER_V0,
1509 .cc_dfp_mode = CC_MODE_DFP_3_0,
1510 .cc1_param = { .rp_4p7k_code = 0xc,
1511 .rp_36k_code = 0xf,
1512 .rp_12k_code = 0xe,
1513 .rd_code = 0x11,
1514 .ra_code = 0x0,
1515 .vref_2p6v = 0x5,
1516 .vref_1p23v = 0x7,
1517 .vref_0p8v = 0xa,
1518 .vref_0p66v = 0xa,
1519 .vref_0p4v = 0x3,
1520 .vref_0p2v = 0x2,
1521 .vref_1_1p6v = 0x7,
1522 .vref_0_1p6v = 0x7 },
1523 .cc2_param = { .rp_4p7k_code = 0xc,
1524 .rp_36k_code = 0xf,
1525 .rp_12k_code = 0xe,
1526 .rd_code = 0xf,
1527 .ra_code = 0x0,
1528 .vref_2p6v = 0x5,
1529 .vref_1p23v = 0x8,
1530 .vref_0p8v = 0xa,
1531 .vref_0p66v = 0xa,
1532 .vref_0p4v = 0x3,
1533 .vref_0p2v = 0x2,
1534 .vref_1_1p6v = 0x7,
1535 .vref_0_1p6v = 0x7 },
1536 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1537 .use_defalut_parameter = false,
1538};
1539
1540static const struct type_c_cfg rtd1319_type_c_cfg = {
1541 .parameter_ver = PARAMETER_V0,
1542 .cc_dfp_mode = CC_MODE_DFP_1_5,
1543 .cc1_param = { .rp_4p7k_code = 0x9,
1544 .rp_36k_code = 0xe,
1545 .rp_12k_code = 0x9,
1546 .rd_code = 0x9,
1547 .ra_code = 0x7,
1548 .vref_2p6v = 0x3,
1549 .vref_1p23v = 0x7,
1550 .vref_0p8v = 0x7,
1551 .vref_0p66v = 0x6,
1552 .vref_0p4v = 0x2,
1553 .vref_0p2v = 0x3,
1554 .vref_1_1p6v = 0x4,
1555 .vref_0_1p6v = 0x7 },
1556 .cc2_param = { .rp_4p7k_code = 0x8,
1557 .rp_36k_code = 0xe,
1558 .rp_12k_code = 0x9,
1559 .rd_code = 0x9,
1560 .ra_code = 0x7,
1561 .vref_2p6v = 0x3,
1562 .vref_1p23v = 0x7,
1563 .vref_0p8v = 0x7,
1564 .vref_0p66v = 0x6,
1565 .vref_0p4v = 0x3,
1566 .vref_0p2v = 0x3,
1567 .vref_1_1p6v = 0x6,
1568 .vref_0_1p6v = 0x7 },
1569 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1570 .use_defalut_parameter = false,
1571};
1572
1573static const struct type_c_cfg rtd1312c_type_c_cfg = {
1574 .parameter_ver = PARAMETER_V0,
1575 .cc_dfp_mode = CC_MODE_DFP_1_5,
1576 .cc1_param = { .rp_4p7k_code = 0xe,
1577 .rp_36k_code = 0xc,
1578 .rp_12k_code = 0xc,
1579 .rd_code = 0xa,
1580 .ra_code = 0x3,
1581 .vref_2p6v = 0xa,
1582 .vref_1p23v = 0x7,
1583 .vref_0p8v = 0x7,
1584 .vref_0p66v = 0x7,
1585 .vref_0p4v = 0x4,
1586 .vref_0p2v = 0x4,
1587 .vref_1_1p6v = 0x7,
1588 .vref_0_1p6v = 0x7 },
1589 .cc2_param = { .rp_4p7k_code = 0xe,
1590 .rp_36k_code = 0xc,
1591 .rp_12k_code = 0xc,
1592 .rd_code = 0xa,
1593 .ra_code = 0x3,
1594 .vref_2p6v = 0xa,
1595 .vref_1p23v = 0x7,
1596 .vref_0p8v = 0x7,
1597 .vref_0p66v = 0x7,
1598 .vref_0p4v = 0x4,
1599 .vref_0p2v = 0x4,
1600 .vref_1_1p6v = 0x7,
1601 .vref_0_1p6v = 0x7 },
1602 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1603 .use_defalut_parameter = false,
1604};
1605
1606static const struct type_c_cfg rtd1619b_type_c_cfg = {
1607 .parameter_ver = PARAMETER_V1,
1608 .cc_dfp_mode = CC_MODE_DFP_1_5,
1609 .cc1_param = { .rp_4p7k_code = 0xf,
1610 .rp_36k_code = 0xf,
1611 .rp_12k_code = 0xf,
1612 .rd_code = 0xf,
1613 .ra_code = 0x7,
1614 .vref_2p6v = 0x9,
1615 .vref_1p23v = 0x7,
1616 .vref_0p8v = 0x9,
1617 .vref_0p66v = 0x8,
1618 .vref_0p4v = 0x7,
1619 .vref_0p2v = 0x9,
1620 .vref_1_1p6v = 0x7,
1621 .vref_0_1p6v = 0x7 },
1622 .cc2_param = { .rp_4p7k_code = 0xf,
1623 .rp_36k_code = 0xf,
1624 .rp_12k_code = 0xf,
1625 .rd_code = 0xf,
1626 .ra_code = 0x7,
1627 .vref_1p23v = 0x7,
1628 .vref_0p8v = 0x9,
1629 .vref_0p66v = 0x8,
1630 .vref_0p4v = 0x7,
1631 .vref_0p2v = 0x8,
1632 .vref_1_1p6v = 0x7,
1633 .vref_0_1p6v = 0x7 },
1634 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1635 .use_defalut_parameter = false,
1636};
1637
1638static const struct type_c_cfg rtd1319d_type_c_cfg = {
1639 .parameter_ver = PARAMETER_V1,
1640 .cc_dfp_mode = CC_MODE_DFP_1_5,
1641 .cc1_param = { .rp_4p7k_code = 0xe,
1642 .rp_36k_code = 0x3,
1643 .rp_12k_code = 0xe,
1644 .rd_code = 0xf,
1645 .ra_code = 0x6,
1646 .vref_2p6v = 0x7,
1647 .vref_1p23v = 0x7,
1648 .vref_0p8v = 0x8,
1649 .vref_0p66v = 0x7,
1650 .vref_0p4v = 0x7,
1651 .vref_0p2v = 0x7,
1652 .vref_1_1p6v = 0x7,
1653 .vref_0_1p6v = 0x7 },
1654 .cc2_param = { .rp_4p7k_code = 0xe,
1655 .rp_36k_code = 0x3,
1656 .rp_12k_code = 0xe,
1657 .rd_code = 0xf,
1658 .ra_code = 0x6,
1659 .vref_2p6v = 0x7,
1660 .vref_1p23v = 0x7,
1661 .vref_0p8v = 0x8,
1662 .vref_0p66v = 0x7,
1663 .vref_0p4v = 0x7,
1664 .vref_0p2v = 0x8,
1665 .vref_1_1p6v = 0x7,
1666 .vref_0_1p6v = 0x7 },
1667 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1668 .use_defalut_parameter = false,
1669};
1670
1671static const struct type_c_cfg rtd1315e_type_c_cfg = {
1672 .parameter_ver = PARAMETER_V1,
1673 .cc_dfp_mode = CC_MODE_DFP_1_5,
1674 .cc1_param = { .rp_4p7k_code = 0xe,
1675 .rp_36k_code = 0x3,
1676 .rp_12k_code = 0xe,
1677 .rd_code = 0xf,
1678 .ra_code = 0x6,
1679 .vref_2p6v = 0x7,
1680 .vref_1p23v = 0x7,
1681 .vref_0p8v = 0x8,
1682 .vref_0p66v = 0x7,
1683 .vref_0p4v = 0x7,
1684 .vref_0p2v = 0x7,
1685 .vref_1_1p6v = 0x7,
1686 .vref_0_1p6v = 0x7 },
1687 .cc2_param = { .rp_4p7k_code = 0xe,
1688 .rp_36k_code = 0x3,
1689 .rp_12k_code = 0xe,
1690 .rd_code = 0xf,
1691 .ra_code = 0x6,
1692 .vref_2p6v = 0x7,
1693 .vref_1p23v = 0x7,
1694 .vref_0p8v = 0x8,
1695 .vref_0p66v = 0x7,
1696 .vref_0p4v = 0x7,
1697 .vref_0p2v = 0x8,
1698 .vref_1_1p6v = 0x7,
1699 .vref_0_1p6v = 0x7 },
1700 .debounce_val = 0x7f, /* 1b,1us 7f,4.7us */
1701 .use_defalut_parameter = false,
1702};
1703
1704static const struct of_device_id extcon_rtk_type_c_match[] = {
1705 { .compatible = "realtek,rtd1295-type-c", .data = &rtd1295_type_c_cfg },
1706 { .compatible = "realtek,rtd1312c-type-c", .data = &rtd1312c_type_c_cfg },
1707 { .compatible = "realtek,rtd1315e-type-c", .data = &rtd1315e_type_c_cfg },
1708 { .compatible = "realtek,rtd1319-type-c", .data = &rtd1319_type_c_cfg },
1709 { .compatible = "realtek,rtd1319d-type-c", .data = &rtd1319d_type_c_cfg },
1710 { .compatible = "realtek,rtd1395-type-c", .data = &rtd1395_type_c_cfg },
1711 { .compatible = "realtek,rtd1619-type-c", .data = &rtd1619_type_c_cfg },
1712 { .compatible = "realtek,rtd1619b-type-c", .data = &rtd1619b_type_c_cfg },
1713 {},
1714};
1715MODULE_DEVICE_TABLE(of, extcon_rtk_type_c_match);
1716
1717#ifdef CONFIG_PM_SLEEP
1718static int extcon_rtk_type_c_prepare(struct device *dev)
1719{
1720 struct type_c_data *type_c = dev_get_drvdata(dev);
1721 u32 default_ctrl;
1722 unsigned long flags;
1723
1724 cancel_delayed_work_sync(dwork: &type_c->delayed_work);
1725 flush_delayed_work(dwork: &type_c->delayed_work);
1726 WARN_ON_ONCE(delayed_work_pending(&type_c->delayed_work));
1727
1728 spin_lock_irqsave(&type_c->lock, flags);
1729 /* disable interrupt */
1730 default_ctrl = readl(addr: type_c->reg_base + USB_TYPEC_CTRL) &
1731 DEBOUNCE_TIME_MASK;
1732 writel(val: default_ctrl, addr: type_c->reg_base + USB_TYPEC_CTRL);
1733
1734 /* disable cc detect, rp, rd */
1735 writel(PLR_EN, addr: type_c->reg_base + USB_TYPEC_CTRL_CC1_0);
1736 writel(val: 0, addr: type_c->reg_base + USB_TYPEC_CTRL_CC2_0);
1737
1738 spin_unlock_irqrestore(lock: &type_c->lock, flags);
1739
1740 return 0;
1741}
1742
1743static void extcon_rtk_type_c_complete(struct device *dev)
1744{
1745 /* nothing */
1746}
1747
1748static int extcon_rtk_type_c_suspend(struct device *dev)
1749{
1750 /* nothing */
1751
1752 return 0;
1753}
1754
1755static int extcon_rtk_type_c_resume(struct device *dev)
1756{
1757 struct type_c_data *type_c = dev_get_drvdata(dev);
1758 int ret;
1759
1760 ret = extcon_rtk_type_c_init(type_c);
1761 if (ret) {
1762 dev_err(dev, "%s failed to init type_c\n", __func__);
1763 return ret;
1764 }
1765
1766 return 0;
1767}
1768
1769static const struct dev_pm_ops extcon_rtk_type_c_pm_ops = {
1770 SET_LATE_SYSTEM_SLEEP_PM_OPS(extcon_rtk_type_c_suspend, extcon_rtk_type_c_resume)
1771 .prepare = extcon_rtk_type_c_prepare,
1772 .complete = extcon_rtk_type_c_complete,
1773};
1774
1775#define DEV_PM_OPS (&extcon_rtk_type_c_pm_ops)
1776#else
1777#define DEV_PM_OPS NULL
1778#endif /* CONFIG_PM_SLEEP */
1779
1780static struct platform_driver extcon_rtk_type_c_driver = {
1781 .probe = extcon_rtk_type_c_probe,
1782 .remove_new = extcon_rtk_type_c_remove,
1783 .driver = {
1784 .name = "extcon-rtk-type_c",
1785 .of_match_table = extcon_rtk_type_c_match,
1786 .pm = DEV_PM_OPS,
1787 },
1788};
1789
1790module_platform_driver(extcon_rtk_type_c_driver);
1791
1792MODULE_DESCRIPTION("Realtek Extcon Type C driver");
1793MODULE_AUTHOR("Stanley Chang <stanley_chang@realtek.com>");
1794MODULE_LICENSE("GPL");
1795

source code of linux/drivers/extcon/extcon-rtk-type-c.c