xref: /openbmc/linux/drivers/usb/cdns3/drd.h (revision 11f656fc)
17733f6c3SPawel Laszczak /* SPDX-License-Identifier: GPL-2.0 */
27733f6c3SPawel Laszczak /*
3db8892bbSPawel Laszczak  * Cadence USB3 and USBSSP DRD header file.
47733f6c3SPawel Laszczak  *
5db8892bbSPawel Laszczak  * Copyright (C) 2018-2020 Cadence.
67733f6c3SPawel Laszczak  *
77733f6c3SPawel Laszczak  * Author: Pawel Laszczak <pawell@cadence.com>
87733f6c3SPawel Laszczak  */
97733f6c3SPawel Laszczak #ifndef __LINUX_CDNS3_DRD
107733f6c3SPawel Laszczak #define __LINUX_CDNS3_DRD
117733f6c3SPawel Laszczak 
127733f6c3SPawel Laszczak #include <linux/usb/otg.h>
137733f6c3SPawel Laszczak #include "core.h"
147733f6c3SPawel Laszczak 
15db8892bbSPawel Laszczak /*  DRD register interface for version v1 of cdns3 driver. */
167733f6c3SPawel Laszczak struct cdns3_otg_regs {
177733f6c3SPawel Laszczak 	__le32 did;
187733f6c3SPawel Laszczak 	__le32 rid;
197733f6c3SPawel Laszczak 	__le32 capabilities;
207733f6c3SPawel Laszczak 	__le32 reserved1;
217733f6c3SPawel Laszczak 	__le32 cmd;
227733f6c3SPawel Laszczak 	__le32 sts;
237733f6c3SPawel Laszczak 	__le32 state;
247733f6c3SPawel Laszczak 	__le32 reserved2;
257733f6c3SPawel Laszczak 	__le32 ien;
267733f6c3SPawel Laszczak 	__le32 ivect;
277733f6c3SPawel Laszczak 	__le32 refclk;
287733f6c3SPawel Laszczak 	__le32 tmr;
297733f6c3SPawel Laszczak 	__le32 reserved3[4];
307733f6c3SPawel Laszczak 	__le32 simulate;
317733f6c3SPawel Laszczak 	__le32 override;
327733f6c3SPawel Laszczak 	__le32 susp_ctrl;
332eae2dfdSPawel Laszczak 	__le32 phyrst_cfg;
347733f6c3SPawel Laszczak 	__le32 anasts;
357733f6c3SPawel Laszczak 	__le32 adp_ramp_time;
367733f6c3SPawel Laszczak 	__le32 ctrl1;
377733f6c3SPawel Laszczak 	__le32 ctrl2;
387733f6c3SPawel Laszczak };
397733f6c3SPawel Laszczak 
40db8892bbSPawel Laszczak /*  DRD register interface for version v0 of cdns3 driver. */
417733f6c3SPawel Laszczak struct cdns3_otg_legacy_regs {
427733f6c3SPawel Laszczak 	__le32 cmd;
437733f6c3SPawel Laszczak 	__le32 sts;
447733f6c3SPawel Laszczak 	__le32 state;
457733f6c3SPawel Laszczak 	__le32 refclk;
467733f6c3SPawel Laszczak 	__le32 ien;
477733f6c3SPawel Laszczak 	__le32 ivect;
487733f6c3SPawel Laszczak 	__le32 reserved1[3];
497733f6c3SPawel Laszczak 	__le32 tmr;
507733f6c3SPawel Laszczak 	__le32 reserved2[2];
517733f6c3SPawel Laszczak 	__le32 version;
527733f6c3SPawel Laszczak 	__le32 capabilities;
537733f6c3SPawel Laszczak 	__le32 reserved3[2];
547733f6c3SPawel Laszczak 	__le32 simulate;
557733f6c3SPawel Laszczak 	__le32 reserved4[5];
567733f6c3SPawel Laszczak 	__le32 ctrl1;
577733f6c3SPawel Laszczak };
587733f6c3SPawel Laszczak 
59db8892bbSPawel Laszczak /* DRD register interface for cdnsp driver */
60db8892bbSPawel Laszczak struct cdnsp_otg_regs {
61db8892bbSPawel Laszczak 	__le32 did;
62db8892bbSPawel Laszczak 	__le32 rid;
63db8892bbSPawel Laszczak 	__le32 cfgs1;
64db8892bbSPawel Laszczak 	__le32 cfgs2;
65db8892bbSPawel Laszczak 	__le32 cmd;
66db8892bbSPawel Laszczak 	__le32 sts;
67db8892bbSPawel Laszczak 	__le32 state;
68db8892bbSPawel Laszczak 	__le32 ien;
69db8892bbSPawel Laszczak 	__le32 ivect;
70db8892bbSPawel Laszczak 	__le32 tmr;
71db8892bbSPawel Laszczak 	__le32 simulate;
72db8892bbSPawel Laszczak 	__le32 adpbc_sts;
73db8892bbSPawel Laszczak 	__le32 adp_ramp_time;
74db8892bbSPawel Laszczak 	__le32 adpbc_ctrl1;
75db8892bbSPawel Laszczak 	__le32 adpbc_ctrl2;
76db8892bbSPawel Laszczak 	__le32 override;
77db8892bbSPawel Laszczak 	__le32 vbusvalid_dbnc_cfg;
78db8892bbSPawel Laszczak 	__le32 sessvalid_dbnc_cfg;
79db8892bbSPawel Laszczak 	__le32 susp_timing_ctrl;
80db8892bbSPawel Laszczak };
81db8892bbSPawel Laszczak 
82*11f656fcSPawel Laszczak /* CDNSP driver supports 0x000403xx Cadence USB controller family. */
83*11f656fcSPawel Laszczak #define OTG_CDNSP_CHECK_DID(did) (((did) & GENMASK(31, 8)) == 0x00040300)
84*11f656fcSPawel Laszczak 
85*11f656fcSPawel Laszczak /* CDNS3 driver supports 0x000402xx Cadence USB controller family. */
86*11f656fcSPawel Laszczak #define OTG_CDNS3_CHECK_DID(did) (((did) & GENMASK(31, 8)) == 0x00040200)
87db8892bbSPawel Laszczak 
887733f6c3SPawel Laszczak /*
89db8892bbSPawel Laszczak  * Common registers interface for both CDNS3 and CDNSP version of DRD.
907733f6c3SPawel Laszczak  */
910b490046SPawel Laszczak struct cdns_otg_common_regs {
927733f6c3SPawel Laszczak 	__le32 cmd;
937733f6c3SPawel Laszczak 	__le32 sts;
947733f6c3SPawel Laszczak 	__le32 state;
95db8892bbSPawel Laszczak };
96db8892bbSPawel Laszczak 
97db8892bbSPawel Laszczak /*
98db8892bbSPawel Laszczak  * Interrupt related registers. This registers are mapped in different
99db8892bbSPawel Laszczak  * location for CDNSP controller.
100db8892bbSPawel Laszczak  */
1010b490046SPawel Laszczak struct cdns_otg_irq_regs {
1027733f6c3SPawel Laszczak 	__le32 ien;
1037733f6c3SPawel Laszczak 	__le32 ivect;
1047733f6c3SPawel Laszczak };
1057733f6c3SPawel Laszczak 
1067733f6c3SPawel Laszczak /* CDNS_RID - bitmasks */
1077733f6c3SPawel Laszczak #define CDNS_RID(p)			((p) & GENMASK(15, 0))
1087733f6c3SPawel Laszczak 
1097733f6c3SPawel Laszczak /* CDNS_VID - bitmasks */
1107733f6c3SPawel Laszczak #define CDNS_DID(p)			((p) & GENMASK(31, 0))
1117733f6c3SPawel Laszczak 
1127733f6c3SPawel Laszczak /* OTGCMD - bitmasks */
1137733f6c3SPawel Laszczak /* "Request the bus for Device mode. */
1147733f6c3SPawel Laszczak #define OTGCMD_DEV_BUS_REQ		BIT(0)
1157733f6c3SPawel Laszczak /* Request the bus for Host mode */
1167733f6c3SPawel Laszczak #define OTGCMD_HOST_BUS_REQ		BIT(1)
1177733f6c3SPawel Laszczak /* Enable OTG mode. */
1187733f6c3SPawel Laszczak #define OTGCMD_OTG_EN			BIT(2)
1197733f6c3SPawel Laszczak /* Disable OTG mode */
1207733f6c3SPawel Laszczak #define OTGCMD_OTG_DIS			BIT(3)
1217733f6c3SPawel Laszczak /*"Configure OTG as A-Device. */
1227733f6c3SPawel Laszczak #define OTGCMD_A_DEV_EN			BIT(4)
1237733f6c3SPawel Laszczak /*"Configure OTG as A-Device. */
1247733f6c3SPawel Laszczak #define OTGCMD_A_DEV_DIS		BIT(5)
1257733f6c3SPawel Laszczak /* Drop the bus for Device mod	e. */
1267733f6c3SPawel Laszczak #define OTGCMD_DEV_BUS_DROP		BIT(8)
1277733f6c3SPawel Laszczak /* Drop the bus for Host mode*/
1287733f6c3SPawel Laszczak #define OTGCMD_HOST_BUS_DROP		BIT(9)
129db8892bbSPawel Laszczak /* Power Down USBSS-DEV - only for CDNS3.*/
1307733f6c3SPawel Laszczak #define OTGCMD_DEV_POWER_OFF		BIT(11)
131db8892bbSPawel Laszczak /* Power Down CDNSXHCI - only for CDNS3. */
1327733f6c3SPawel Laszczak #define OTGCMD_HOST_POWER_OFF		BIT(12)
1337733f6c3SPawel Laszczak 
1347733f6c3SPawel Laszczak /* OTGIEN - bitmasks */
1357733f6c3SPawel Laszczak /* ID change interrupt enable */
1367733f6c3SPawel Laszczak #define OTGIEN_ID_CHANGE_INT		BIT(0)
1377733f6c3SPawel Laszczak /* Vbusvalid fall detected interrupt enable.*/
1387733f6c3SPawel Laszczak #define OTGIEN_VBUSVALID_RISE_INT	BIT(4)
1397733f6c3SPawel Laszczak /* Vbusvalid fall detected interrupt enable */
1407733f6c3SPawel Laszczak #define OTGIEN_VBUSVALID_FALL_INT	BIT(5)
1417733f6c3SPawel Laszczak 
1427733f6c3SPawel Laszczak /* OTGSTS - bitmasks */
1437733f6c3SPawel Laszczak /*
1447733f6c3SPawel Laszczak  * Current value of the ID pin. It is only valid when idpullup in
1457733f6c3SPawel Laszczak  *  OTGCTRL1_TYPE register is set to '1'.
1467733f6c3SPawel Laszczak  */
1477733f6c3SPawel Laszczak #define OTGSTS_ID_VALUE			BIT(0)
1487733f6c3SPawel Laszczak /* Current value of the vbus_valid */
1497733f6c3SPawel Laszczak #define OTGSTS_VBUS_VALID		BIT(1)
1507733f6c3SPawel Laszczak /* Current value of the b_sess_vld */
1517733f6c3SPawel Laszczak #define OTGSTS_SESSION_VALID		BIT(2)
1527733f6c3SPawel Laszczak /*Device mode is active*/
1537733f6c3SPawel Laszczak #define OTGSTS_DEV_ACTIVE		BIT(3)
1547733f6c3SPawel Laszczak /* Host mode is active. */
1557733f6c3SPawel Laszczak #define OTGSTS_HOST_ACTIVE		BIT(4)
1567733f6c3SPawel Laszczak /* OTG Controller not ready. */
1577733f6c3SPawel Laszczak #define OTGSTS_OTG_NRDY_MASK		BIT(11)
1587733f6c3SPawel Laszczak #define OTGSTS_OTG_NRDY(p)		((p) & OTGSTS_OTG_NRDY_MASK)
1597733f6c3SPawel Laszczak /*
160db8892bbSPawel Laszczak  * Value of the strap pins for:
161db8892bbSPawel Laszczak  * CDNS3:
1627733f6c3SPawel Laszczak  * 000 - no default configuration
1637733f6c3SPawel Laszczak  * 010 - Controller initiall configured as Host
1647733f6c3SPawel Laszczak  * 100 - Controller initially configured as Device
165db8892bbSPawel Laszczak  * CDNSP:
166db8892bbSPawel Laszczak  * 000 - No default configuration.
167db8892bbSPawel Laszczak  * 010 - Controller initiall configured as Host.
168db8892bbSPawel Laszczak  * 100 - Controller initially configured as Device.
1697733f6c3SPawel Laszczak  */
1707733f6c3SPawel Laszczak #define OTGSTS_STRAP(p)			(((p) & GENMASK(14, 12)) >> 12)
1717733f6c3SPawel Laszczak #define OTGSTS_STRAP_NO_DEFAULT_CFG	0x00
1727733f6c3SPawel Laszczak #define OTGSTS_STRAP_HOST_OTG		0x01
1737733f6c3SPawel Laszczak #define OTGSTS_STRAP_HOST		0x02
1747733f6c3SPawel Laszczak #define OTGSTS_STRAP_GADGET		0x04
175db8892bbSPawel Laszczak #define OTGSTS_CDNSP_STRAP_HOST		0x01
176db8892bbSPawel Laszczak #define OTGSTS_CDNSP_STRAP_GADGET	0x02
177db8892bbSPawel Laszczak 
1787733f6c3SPawel Laszczak /* Host mode is turned on. */
179db8892bbSPawel Laszczak #define OTGSTS_CDNS3_XHCI_READY		BIT(26)
180db8892bbSPawel Laszczak #define OTGSTS_CDNSP_XHCI_READY		BIT(27)
181db8892bbSPawel Laszczak 
1827733f6c3SPawel Laszczak /* "Device mode is turned on .*/
183db8892bbSPawel Laszczak #define OTGSTS_CDNS3_DEV_READY		BIT(27)
184db8892bbSPawel Laszczak #define OTGSTS_CDNSP_DEV_READY		BIT(26)
1857733f6c3SPawel Laszczak 
1867733f6c3SPawel Laszczak /* OTGSTATE- bitmasks */
1877733f6c3SPawel Laszczak #define OTGSTATE_DEV_STATE_MASK		GENMASK(2, 0)
1887733f6c3SPawel Laszczak #define OTGSTATE_HOST_STATE_MASK	GENMASK(5, 3)
1897733f6c3SPawel Laszczak #define OTGSTATE_HOST_STATE_IDLE	0x0
1907733f6c3SPawel Laszczak #define OTGSTATE_HOST_STATE_VBUS_FALL	0x7
1917733f6c3SPawel Laszczak #define OTGSTATE_HOST_STATE(p)		(((p) & OTGSTATE_HOST_STATE_MASK) >> 3)
1927733f6c3SPawel Laszczak 
1937733f6c3SPawel Laszczak /* OTGREFCLK - bitmasks */
1947733f6c3SPawel Laszczak #define OTGREFCLK_STB_CLK_SWITCH_EN	BIT(31)
1957733f6c3SPawel Laszczak 
1967733f6c3SPawel Laszczak /* OVERRIDE - bitmasks */
1977733f6c3SPawel Laszczak #define OVERRIDE_IDPULLUP		BIT(0)
1987733f6c3SPawel Laszczak /* Only for CDNS3_CONTROLLER_V0 version */
1997733f6c3SPawel Laszczak #define OVERRIDE_IDPULLUP_V0		BIT(24)
200db8892bbSPawel Laszczak /* Vbusvalid/Sesvalid override select. */
201db8892bbSPawel Laszczak #define OVERRIDE_SESS_VLD_SEL		BIT(10)
2027733f6c3SPawel Laszczak 
2032eae2dfdSPawel Laszczak /* PHYRST_CFG - bitmasks */
2042eae2dfdSPawel Laszczak #define PHYRST_CFG_PHYRST_A_ENABLE     BIT(0)
2052eae2dfdSPawel Laszczak 
20608c35dd3SPawel Laszczak #define CDNS3_ID_PERIPHERAL		1
20708c35dd3SPawel Laszczak #define CDNS3_ID_HOST			0
20808c35dd3SPawel Laszczak 
2090b490046SPawel Laszczak bool cdns_is_host(struct cdns *cdns);
2100b490046SPawel Laszczak bool cdns_is_device(struct cdns *cdns);
2110b490046SPawel Laszczak int cdns_get_id(struct cdns *cdns);
2120b490046SPawel Laszczak int cdns_get_vbus(struct cdns *cdns);
2133d829045SPawel Laszczak void cdns_clear_vbus(struct cdns *cdns);
2143d829045SPawel Laszczak void cdns_set_vbus(struct cdns *cdns);
2150b490046SPawel Laszczak int cdns_drd_init(struct cdns *cdns);
2160b490046SPawel Laszczak int cdns_drd_exit(struct cdns *cdns);
2170b490046SPawel Laszczak int cdns_drd_update_mode(struct cdns *cdns);
2180b490046SPawel Laszczak int cdns_drd_gadget_on(struct cdns *cdns);
2190b490046SPawel Laszczak void cdns_drd_gadget_off(struct cdns *cdns);
2200b490046SPawel Laszczak int cdns_drd_host_on(struct cdns *cdns);
2210b490046SPawel Laszczak void cdns_drd_host_off(struct cdns *cdns);
2222cf2581cSFrank Li bool cdns_power_is_lost(struct cdns *cdns);
2237733f6c3SPawel Laszczak #endif /* __LINUX_CDNS3_DRD */
224