Skip to content

Commit 51a9b2c

Browse files
smaeulvinodkoul
authored andcommitted
phy: rockchip-inno-usb2: Handle ID IRQ
This supports detecting host mode for the OTG port without an extcon. The rv1108 properties are not updated due to lack of documentation. Signed-off-by: Samuel Holland <[email protected]> Tested-by: Michael Riesch <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent 21a4706 commit 51a9b2c

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

drivers/phy/rockchip/phy-rockchip-inno-usb2.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,15 @@ struct rockchip_chg_det_reg {
116116
* @bvalid_det_en: vbus valid rise detection enable register.
117117
* @bvalid_det_st: vbus valid rise detection status register.
118118
* @bvalid_det_clr: vbus valid rise detection clear register.
119+
* @id_det_en: id detection enable register.
120+
* @id_det_st: id detection state register.
121+
* @id_det_clr: id detection clear register.
119122
* @ls_det_en: linestate detection enable register.
120123
* @ls_det_st: linestate detection state register.
121124
* @ls_det_clr: linestate detection clear register.
122125
* @utmi_avalid: utmi vbus avalid status register.
123126
* @utmi_bvalid: utmi vbus bvalid status register.
127+
* @utmi_id: utmi id state register.
124128
* @utmi_ls: utmi linestate state register.
125129
* @utmi_hstdet: utmi host disconnect register.
126130
*/
@@ -129,11 +133,15 @@ struct rockchip_usb2phy_port_cfg {
129133
struct usb2phy_reg bvalid_det_en;
130134
struct usb2phy_reg bvalid_det_st;
131135
struct usb2phy_reg bvalid_det_clr;
136+
struct usb2phy_reg id_det_en;
137+
struct usb2phy_reg id_det_st;
138+
struct usb2phy_reg id_det_clr;
132139
struct usb2phy_reg ls_det_en;
133140
struct usb2phy_reg ls_det_st;
134141
struct usb2phy_reg ls_det_clr;
135142
struct usb2phy_reg utmi_avalid;
136143
struct usb2phy_reg utmi_bvalid;
144+
struct usb2phy_reg utmi_id;
137145
struct usb2phy_reg utmi_ls;
138146
struct usb2phy_reg utmi_hstdet;
139147
};
@@ -161,6 +169,7 @@ struct rockchip_usb2phy_cfg {
161169
* @suspended: phy suspended flag.
162170
* @vbus_attached: otg device vbus status.
163171
* @bvalid_irq: IRQ number assigned for vbus valid rise detection.
172+
* @id_irq: IRQ number assigned for ID pin detection.
164173
* @ls_irq: IRQ number assigned for linestate detection.
165174
* @otg_mux_irq: IRQ number which multiplex otg-id/otg-bvalid/linestate
166175
* irqs to one irq in otg-port.
@@ -179,6 +188,7 @@ struct rockchip_usb2phy_port {
179188
bool suspended;
180189
bool vbus_attached;
181190
int bvalid_irq;
191+
int id_irq;
182192
int ls_irq;
183193
int otg_mux_irq;
184194
struct mutex mutex;
@@ -419,6 +429,19 @@ static int rockchip_usb2phy_init(struct phy *phy)
419429
if (ret)
420430
goto out;
421431

432+
/* clear id status and enable id detect irq */
433+
ret = property_enable(rphy->grf,
434+
&rport->port_cfg->id_det_clr,
435+
true);
436+
if (ret)
437+
goto out;
438+
439+
ret = property_enable(rphy->grf,
440+
&rport->port_cfg->id_det_en,
441+
true);
442+
if (ret)
443+
goto out;
444+
422445
schedule_delayed_work(&rport->otg_sm_work,
423446
OTG_SCHEDULE_DELAY * 3);
424447
} else {
@@ -913,11 +936,30 @@ static irqreturn_t rockchip_usb2phy_bvalid_irq(int irq, void *data)
913936
return IRQ_HANDLED;
914937
}
915938

939+
static irqreturn_t rockchip_usb2phy_id_irq(int irq, void *data)
940+
{
941+
struct rockchip_usb2phy_port *rport = data;
942+
struct rockchip_usb2phy *rphy = dev_get_drvdata(rport->phy->dev.parent);
943+
bool id;
944+
945+
if (!property_enabled(rphy->grf, &rport->port_cfg->id_det_st))
946+
return IRQ_NONE;
947+
948+
/* clear id detect irq pending status */
949+
property_enable(rphy->grf, &rport->port_cfg->id_det_clr, true);
950+
951+
id = property_enabled(rphy->grf, &rport->port_cfg->utmi_id);
952+
extcon_set_state_sync(rphy->edev, EXTCON_USB_HOST, !id);
953+
954+
return IRQ_HANDLED;
955+
}
956+
916957
static irqreturn_t rockchip_usb2phy_otg_mux_irq(int irq, void *data)
917958
{
918959
irqreturn_t ret = IRQ_NONE;
919960

920961
ret |= rockchip_usb2phy_bvalid_irq(irq, data);
962+
ret |= rockchip_usb2phy_id_irq(irq, data);
921963

922964
return ret;
923965
}
@@ -1015,6 +1057,25 @@ static int rockchip_usb2phy_port_irq_init(struct rockchip_usb2phy *rphy,
10151057
"failed to request otg-bvalid irq handle\n");
10161058
return ret;
10171059
}
1060+
1061+
rport->id_irq = of_irq_get_byname(child_np, "otg-id");
1062+
if (rport->id_irq < 0) {
1063+
dev_err(rphy->dev, "no otg-id irq provided\n");
1064+
ret = rport->id_irq;
1065+
return ret;
1066+
}
1067+
1068+
ret = devm_request_threaded_irq(rphy->dev, rport->id_irq,
1069+
NULL,
1070+
rockchip_usb2phy_id_irq,
1071+
IRQF_ONESHOT,
1072+
"rockchip_usb2phy_id",
1073+
rport);
1074+
if (ret) {
1075+
dev_err(rphy->dev,
1076+
"failed to request otg-id irq handle\n");
1077+
return ret;
1078+
}
10181079
}
10191080
break;
10201081
default:
@@ -1289,10 +1350,14 @@ static const struct rockchip_usb2phy_cfg rk3228_phy_cfgs[] = {
12891350
.bvalid_det_en = { 0x0680, 3, 3, 0, 1 },
12901351
.bvalid_det_st = { 0x0690, 3, 3, 0, 1 },
12911352
.bvalid_det_clr = { 0x06a0, 3, 3, 0, 1 },
1353+
.id_det_en = { 0x0680, 6, 5, 0, 3 },
1354+
.id_det_st = { 0x0690, 6, 5, 0, 3 },
1355+
.id_det_clr = { 0x06a0, 6, 5, 0, 3 },
12921356
.ls_det_en = { 0x0680, 2, 2, 0, 1 },
12931357
.ls_det_st = { 0x0690, 2, 2, 0, 1 },
12941358
.ls_det_clr = { 0x06a0, 2, 2, 0, 1 },
12951359
.utmi_bvalid = { 0x0480, 4, 4, 0, 1 },
1360+
.utmi_id = { 0x0480, 1, 1, 0, 1 },
12961361
.utmi_ls = { 0x0480, 3, 2, 0, 1 },
12971362
},
12981363
[USB2PHY_PORT_HOST] = {
@@ -1348,11 +1413,15 @@ static const struct rockchip_usb2phy_cfg rk3308_phy_cfgs[] = {
13481413
.bvalid_det_en = { 0x3020, 3, 2, 0, 3 },
13491414
.bvalid_det_st = { 0x3024, 3, 2, 0, 3 },
13501415
.bvalid_det_clr = { 0x3028, 3, 2, 0, 3 },
1416+
.id_det_en = { 0x3020, 5, 4, 0, 3 },
1417+
.id_det_st = { 0x3024, 5, 4, 0, 3 },
1418+
.id_det_clr = { 0x3028, 5, 4, 0, 3 },
13511419
.ls_det_en = { 0x3020, 0, 0, 0, 1 },
13521420
.ls_det_st = { 0x3024, 0, 0, 0, 1 },
13531421
.ls_det_clr = { 0x3028, 0, 0, 0, 1 },
13541422
.utmi_avalid = { 0x0120, 10, 10, 0, 1 },
13551423
.utmi_bvalid = { 0x0120, 9, 9, 0, 1 },
1424+
.utmi_id = { 0x0120, 6, 6, 0, 1 },
13561425
.utmi_ls = { 0x0120, 5, 4, 0, 1 },
13571426
},
13581427
[USB2PHY_PORT_HOST] = {
@@ -1391,11 +1460,15 @@ static const struct rockchip_usb2phy_cfg rk3328_phy_cfgs[] = {
13911460
.bvalid_det_en = { 0x0110, 3, 2, 0, 3 },
13921461
.bvalid_det_st = { 0x0114, 3, 2, 0, 3 },
13931462
.bvalid_det_clr = { 0x0118, 3, 2, 0, 3 },
1463+
.id_det_en = { 0x0110, 5, 4, 0, 3 },
1464+
.id_det_st = { 0x0114, 5, 4, 0, 3 },
1465+
.id_det_clr = { 0x0118, 5, 4, 0, 3 },
13941466
.ls_det_en = { 0x0110, 0, 0, 0, 1 },
13951467
.ls_det_st = { 0x0114, 0, 0, 0, 1 },
13961468
.ls_det_clr = { 0x0118, 0, 0, 0, 1 },
13971469
.utmi_avalid = { 0x0120, 10, 10, 0, 1 },
13981470
.utmi_bvalid = { 0x0120, 9, 9, 0, 1 },
1471+
.utmi_id = { 0x0120, 6, 6, 0, 1 },
13991472
.utmi_ls = { 0x0120, 5, 4, 0, 1 },
14001473
},
14011474
[USB2PHY_PORT_HOST] = {
@@ -1453,8 +1526,12 @@ static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = {
14531526
.bvalid_det_en = { 0xe3c0, 3, 3, 0, 1 },
14541527
.bvalid_det_st = { 0xe3e0, 3, 3, 0, 1 },
14551528
.bvalid_det_clr = { 0xe3d0, 3, 3, 0, 1 },
1529+
.id_det_en = { 0xe3c0, 5, 4, 0, 3 },
1530+
.id_det_st = { 0xe3e0, 5, 4, 0, 3 },
1531+
.id_det_clr = { 0xe3d0, 5, 4, 0, 3 },
14561532
.utmi_avalid = { 0xe2ac, 7, 7, 0, 1 },
14571533
.utmi_bvalid = { 0xe2ac, 12, 12, 0, 1 },
1534+
.utmi_id = { 0xe2ac, 8, 8, 0, 1 },
14581535
},
14591536
[USB2PHY_PORT_HOST] = {
14601537
.phy_sus = { 0xe458, 1, 0, 0x2, 0x1 },
@@ -1488,8 +1565,12 @@ static const struct rockchip_usb2phy_cfg rk3399_phy_cfgs[] = {
14881565
.bvalid_det_en = { 0xe3c0, 8, 8, 0, 1 },
14891566
.bvalid_det_st = { 0xe3e0, 8, 8, 0, 1 },
14901567
.bvalid_det_clr = { 0xe3d0, 8, 8, 0, 1 },
1568+
.id_det_en = { 0xe3c0, 10, 9, 0, 3 },
1569+
.id_det_st = { 0xe3e0, 10, 9, 0, 3 },
1570+
.id_det_clr = { 0xe3d0, 10, 9, 0, 3 },
14911571
.utmi_avalid = { 0xe2ac, 10, 10, 0, 1 },
14921572
.utmi_bvalid = { 0xe2ac, 16, 16, 0, 1 },
1573+
.utmi_id = { 0xe2ac, 11, 11, 0, 1 },
14931574
},
14941575
[USB2PHY_PORT_HOST] = {
14951576
.phy_sus = { 0xe468, 1, 0, 0x2, 0x1 },
@@ -1515,8 +1596,12 @@ static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
15151596
.bvalid_det_en = { 0x0080, 3, 2, 0, 3 },
15161597
.bvalid_det_st = { 0x0084, 3, 2, 0, 3 },
15171598
.bvalid_det_clr = { 0x0088, 3, 2, 0, 3 },
1599+
.id_det_en = { 0x0080, 5, 4, 0, 3 },
1600+
.id_det_st = { 0x0084, 5, 4, 0, 3 },
1601+
.id_det_clr = { 0x0088, 5, 4, 0, 3 },
15181602
.utmi_avalid = { 0x00c0, 10, 10, 0, 1 },
15191603
.utmi_bvalid = { 0x00c0, 9, 9, 0, 1 },
1604+
.utmi_id = { 0x00c0, 6, 6, 0, 1 },
15201605
},
15211606
[USB2PHY_PORT_HOST] = {
15221607
/* Select suspend control from controller */

0 commit comments

Comments
 (0)