21
21
22
22
struct tcpci {
23
23
struct device * dev ;
24
- struct i2c_client * client ;
25
24
26
25
struct tcpm_port * port ;
27
26
@@ -30,15 +29,20 @@ struct tcpci {
30
29
bool controls_vbus ;
31
30
32
31
struct tcpc_dev tcpc ;
32
+ struct tcpci_data * data ;
33
+ };
34
+
35
+ struct tcpci_chip {
36
+ struct tcpci * tcpci ;
37
+ struct tcpci_data data ;
33
38
};
34
39
35
40
static inline struct tcpci * tcpc_to_tcpci (struct tcpc_dev * tcpc )
36
41
{
37
42
return container_of (tcpc , struct tcpci , tcpc );
38
43
}
39
44
40
- static int tcpci_read16 (struct tcpci * tcpci , unsigned int reg ,
41
- u16 * val )
45
+ static int tcpci_read16 (struct tcpci * tcpci , unsigned int reg , u16 * val )
42
46
{
43
47
return regmap_raw_read (tcpci -> regmap , reg , val , sizeof (u16 ));
44
48
}
@@ -98,9 +102,17 @@ static int tcpci_set_cc(struct tcpc_dev *tcpc, enum typec_cc_status cc)
98
102
static int tcpci_start_drp_toggling (struct tcpc_dev * tcpc ,
99
103
enum typec_cc_status cc )
100
104
{
105
+ int ret ;
101
106
struct tcpci * tcpci = tcpc_to_tcpci (tcpc );
102
107
unsigned int reg = TCPC_ROLE_CTRL_DRP ;
103
108
109
+ /* Handle vendor drp toggling */
110
+ if (tcpci -> data -> start_drp_toggling ) {
111
+ ret = tcpci -> data -> start_drp_toggling (tcpci , tcpci -> data , cc );
112
+ if (ret < 0 )
113
+ return ret ;
114
+ }
115
+
104
116
switch (cc ) {
105
117
default :
106
118
case TYPEC_CC_RP_DEF :
@@ -117,7 +129,17 @@ static int tcpci_start_drp_toggling(struct tcpc_dev *tcpc,
117
129
break ;
118
130
}
119
131
120
- return regmap_write (tcpci -> regmap , TCPC_ROLE_CTRL , reg );
132
+ if (cc == TYPEC_CC_RD )
133
+ reg |= (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC1_SHIFT ) |
134
+ (TCPC_ROLE_CTRL_CC_RD << TCPC_ROLE_CTRL_CC2_SHIFT );
135
+ else
136
+ reg |= (TCPC_ROLE_CTRL_CC_RP << TCPC_ROLE_CTRL_CC1_SHIFT ) |
137
+ (TCPC_ROLE_CTRL_CC_RP << TCPC_ROLE_CTRL_CC2_SHIFT );
138
+ ret = regmap_write (tcpci -> regmap , TCPC_ROLE_CTRL , reg );
139
+ if (ret < 0 )
140
+ return ret ;
141
+ return regmap_write (tcpci -> regmap , TCPC_COMMAND ,
142
+ TCPC_CMD_LOOK4CONNECTION );
121
143
}
122
144
123
145
static enum typec_cc_status tcpci_to_typec_cc (unsigned int cc , bool sink )
@@ -178,6 +200,13 @@ static int tcpci_set_vconn(struct tcpc_dev *tcpc, bool enable)
178
200
struct tcpci * tcpci = tcpc_to_tcpci (tcpc );
179
201
int ret ;
180
202
203
+ /* Handle vendor set vconn */
204
+ if (tcpci -> data -> set_vconn ) {
205
+ ret = tcpci -> data -> set_vconn (tcpci , tcpci -> data , enable );
206
+ if (ret < 0 )
207
+ return ret ;
208
+ }
209
+
181
210
ret = regmap_write (tcpci -> regmap , TCPC_POWER_CTRL ,
182
211
enable ? TCPC_POWER_CTRL_VCONN_ENABLE : 0 );
183
212
if (ret < 0 )
@@ -323,6 +352,13 @@ static int tcpci_init(struct tcpc_dev *tcpc)
323
352
if (time_after (jiffies , timeout ))
324
353
return - ETIMEDOUT ;
325
354
355
+ /* Handle vendor init */
356
+ if (tcpci -> data -> init ) {
357
+ ret = tcpci -> data -> init (tcpci , tcpci -> data );
358
+ if (ret < 0 )
359
+ return ret ;
360
+ }
361
+
326
362
/* Clear all events */
327
363
ret = tcpci_write16 (tcpci , TCPC_ALERT , 0xffff );
328
364
if (ret < 0 )
@@ -344,9 +380,8 @@ static int tcpci_init(struct tcpc_dev *tcpc)
344
380
return tcpci_write16 (tcpci , TCPC_ALERT_MASK , reg );
345
381
}
346
382
347
- static irqreturn_t tcpci_irq (int irq , void * dev_id )
383
+ irqreturn_t tcpci_irq (struct tcpci * tcpci )
348
384
{
349
- struct tcpci * tcpci = dev_id ;
350
385
u16 status ;
351
386
352
387
tcpci_read16 (tcpci , TCPC_ALERT , & status );
@@ -412,6 +447,14 @@ static irqreturn_t tcpci_irq(int irq, void *dev_id)
412
447
413
448
return IRQ_HANDLED ;
414
449
}
450
+ EXPORT_SYMBOL_GPL (tcpci_irq );
451
+
452
+ static irqreturn_t _tcpci_irq (int irq , void * dev_id )
453
+ {
454
+ struct tcpci * tcpci = dev_id ;
455
+
456
+ return tcpci_irq (tcpci );
457
+ }
415
458
416
459
static const struct regmap_config tcpci_regmap_config = {
417
460
.reg_bits = 8 ,
@@ -435,22 +478,18 @@ static int tcpci_parse_config(struct tcpci *tcpci)
435
478
return 0 ;
436
479
}
437
480
438
- static int tcpci_probe (struct i2c_client * client ,
439
- const struct i2c_device_id * i2c_id )
481
+ struct tcpci * tcpci_register_port (struct device * dev , struct tcpci_data * data )
440
482
{
441
483
struct tcpci * tcpci ;
442
484
int err ;
443
485
444
- tcpci = devm_kzalloc (& client -> dev , sizeof (* tcpci ), GFP_KERNEL );
486
+ tcpci = devm_kzalloc (dev , sizeof (* tcpci ), GFP_KERNEL );
445
487
if (!tcpci )
446
- return - ENOMEM ;
488
+ return ERR_PTR ( - ENOMEM ) ;
447
489
448
- tcpci -> client = client ;
449
- tcpci -> dev = & client -> dev ;
450
- i2c_set_clientdata (client , tcpci );
451
- tcpci -> regmap = devm_regmap_init_i2c (client , & tcpci_regmap_config );
452
- if (IS_ERR (tcpci -> regmap ))
453
- return PTR_ERR (tcpci -> regmap );
490
+ tcpci -> dev = dev ;
491
+ tcpci -> data = data ;
492
+ tcpci -> regmap = data -> regmap ;
454
493
455
494
tcpci -> tcpc .init = tcpci_init ;
456
495
tcpci -> tcpc .get_vbus = tcpci_get_vbus ;
@@ -467,27 +506,63 @@ static int tcpci_probe(struct i2c_client *client,
467
506
468
507
err = tcpci_parse_config (tcpci );
469
508
if (err < 0 )
470
- return err ;
509
+ return ERR_PTR (err );
510
+
511
+ tcpci -> port = tcpm_register_port (tcpci -> dev , & tcpci -> tcpc );
512
+ if (PTR_ERR_OR_ZERO (tcpci -> port ))
513
+ return ERR_CAST (tcpci -> port );
514
+
515
+ return tcpci ;
516
+ }
517
+ EXPORT_SYMBOL_GPL (tcpci_register_port );
518
+
519
+ void tcpci_unregister_port (struct tcpci * tcpci )
520
+ {
521
+ tcpm_unregister_port (tcpci -> port );
522
+ }
523
+ EXPORT_SYMBOL_GPL (tcpci_unregister_port );
524
+
525
+ static int tcpci_probe (struct i2c_client * client ,
526
+ const struct i2c_device_id * i2c_id )
527
+ {
528
+ struct tcpci_chip * chip ;
529
+ int err ;
530
+ u16 val = 0 ;
471
531
472
- /* Disable chip interrupts */
473
- tcpci_write16 (tcpci , TCPC_ALERT_MASK , 0 );
532
+ chip = devm_kzalloc (& client -> dev , sizeof (* chip ), GFP_KERNEL );
533
+ if (!chip )
534
+ return - ENOMEM ;
535
+
536
+ chip -> data .regmap = devm_regmap_init_i2c (client , & tcpci_regmap_config );
537
+ if (IS_ERR (chip -> data .regmap ))
538
+ return PTR_ERR (chip -> data .regmap );
474
539
475
- err = devm_request_threaded_irq (tcpci -> dev , client -> irq , NULL ,
476
- tcpci_irq ,
540
+ /* Disable chip interrupts before requesting irq */
541
+ err = regmap_raw_write (chip -> data .regmap , TCPC_ALERT_MASK , & val ,
542
+ sizeof (u16 ));
543
+ if (err < 0 )
544
+ return err ;
545
+
546
+ err = devm_request_threaded_irq (& client -> dev , client -> irq , NULL ,
547
+ _tcpci_irq ,
477
548
IRQF_ONESHOT | IRQF_TRIGGER_LOW ,
478
- dev_name (tcpci -> dev ), tcpci );
549
+ dev_name (& client -> dev ), chip );
479
550
if (err < 0 )
480
551
return err ;
481
552
482
- tcpci -> port = tcpm_register_port (tcpci -> dev , & tcpci -> tcpc );
483
- return PTR_ERR_OR_ZERO (tcpci -> port );
553
+ chip -> tcpci = tcpci_register_port (& client -> dev , & chip -> data );
554
+ if (PTR_ERR_OR_ZERO (chip -> tcpci ))
555
+ return PTR_ERR (chip -> tcpci );
556
+
557
+ i2c_set_clientdata (client , chip );
558
+ return 0 ;
484
559
}
485
560
486
561
static int tcpci_remove (struct i2c_client * client )
487
562
{
488
- struct tcpci * tcpci = i2c_get_clientdata (client );
563
+ struct tcpci_chip * chip = i2c_get_clientdata (client );
489
564
490
- tcpm_unregister_port ( tcpci -> port );
565
+ tcpci_unregister_port ( chip -> tcpci );
491
566
492
567
return 0 ;
493
568
}
0 commit comments