162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Cadence USB3 and USBSSP DRD header file. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2018-2020 Cadence. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Pawel Laszczak <pawell@cadence.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#ifndef __LINUX_CDNS3_DRD 1062306a36Sopenharmony_ci#define __LINUX_CDNS3_DRD 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <linux/usb/otg.h> 1362306a36Sopenharmony_ci#include "core.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* DRD register interface for version v1 of cdns3 driver. */ 1662306a36Sopenharmony_cistruct cdns3_otg_regs { 1762306a36Sopenharmony_ci __le32 did; 1862306a36Sopenharmony_ci __le32 rid; 1962306a36Sopenharmony_ci __le32 capabilities; 2062306a36Sopenharmony_ci __le32 reserved1; 2162306a36Sopenharmony_ci __le32 cmd; 2262306a36Sopenharmony_ci __le32 sts; 2362306a36Sopenharmony_ci __le32 state; 2462306a36Sopenharmony_ci __le32 reserved2; 2562306a36Sopenharmony_ci __le32 ien; 2662306a36Sopenharmony_ci __le32 ivect; 2762306a36Sopenharmony_ci __le32 refclk; 2862306a36Sopenharmony_ci __le32 tmr; 2962306a36Sopenharmony_ci __le32 reserved3[4]; 3062306a36Sopenharmony_ci __le32 simulate; 3162306a36Sopenharmony_ci __le32 override; 3262306a36Sopenharmony_ci __le32 susp_ctrl; 3362306a36Sopenharmony_ci __le32 phyrst_cfg; 3462306a36Sopenharmony_ci __le32 anasts; 3562306a36Sopenharmony_ci __le32 adp_ramp_time; 3662306a36Sopenharmony_ci __le32 ctrl1; 3762306a36Sopenharmony_ci __le32 ctrl2; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* DRD register interface for version v0 of cdns3 driver. */ 4162306a36Sopenharmony_cistruct cdns3_otg_legacy_regs { 4262306a36Sopenharmony_ci __le32 cmd; 4362306a36Sopenharmony_ci __le32 sts; 4462306a36Sopenharmony_ci __le32 state; 4562306a36Sopenharmony_ci __le32 refclk; 4662306a36Sopenharmony_ci __le32 ien; 4762306a36Sopenharmony_ci __le32 ivect; 4862306a36Sopenharmony_ci __le32 reserved1[3]; 4962306a36Sopenharmony_ci __le32 tmr; 5062306a36Sopenharmony_ci __le32 reserved2[2]; 5162306a36Sopenharmony_ci __le32 version; 5262306a36Sopenharmony_ci __le32 capabilities; 5362306a36Sopenharmony_ci __le32 reserved3[2]; 5462306a36Sopenharmony_ci __le32 simulate; 5562306a36Sopenharmony_ci __le32 reserved4[5]; 5662306a36Sopenharmony_ci __le32 ctrl1; 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* DRD register interface for cdnsp driver */ 6062306a36Sopenharmony_cistruct cdnsp_otg_regs { 6162306a36Sopenharmony_ci __le32 did; 6262306a36Sopenharmony_ci __le32 rid; 6362306a36Sopenharmony_ci __le32 cfgs1; 6462306a36Sopenharmony_ci __le32 cfgs2; 6562306a36Sopenharmony_ci __le32 cmd; 6662306a36Sopenharmony_ci __le32 sts; 6762306a36Sopenharmony_ci __le32 state; 6862306a36Sopenharmony_ci __le32 ien; 6962306a36Sopenharmony_ci __le32 ivect; 7062306a36Sopenharmony_ci __le32 tmr; 7162306a36Sopenharmony_ci __le32 simulate; 7262306a36Sopenharmony_ci __le32 adpbc_sts; 7362306a36Sopenharmony_ci __le32 adp_ramp_time; 7462306a36Sopenharmony_ci __le32 adpbc_ctrl1; 7562306a36Sopenharmony_ci __le32 adpbc_ctrl2; 7662306a36Sopenharmony_ci __le32 override; 7762306a36Sopenharmony_ci __le32 vbusvalid_dbnc_cfg; 7862306a36Sopenharmony_ci __le32 sessvalid_dbnc_cfg; 7962306a36Sopenharmony_ci __le32 susp_timing_ctrl; 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci/* CDNSP driver supports 0x000403xx Cadence USB controller family. */ 8362306a36Sopenharmony_ci#define OTG_CDNSP_CHECK_DID(did) (((did) & GENMASK(31, 8)) == 0x00040300) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci/* CDNS3 driver supports 0x000402xx Cadence USB controller family. */ 8662306a36Sopenharmony_ci#define OTG_CDNS3_CHECK_DID(did) (((did) & GENMASK(31, 8)) == 0x00040200) 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* 8962306a36Sopenharmony_ci * Common registers interface for both CDNS3 and CDNSP version of DRD. 9062306a36Sopenharmony_ci */ 9162306a36Sopenharmony_cistruct cdns_otg_common_regs { 9262306a36Sopenharmony_ci __le32 cmd; 9362306a36Sopenharmony_ci __le32 sts; 9462306a36Sopenharmony_ci __le32 state; 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* 9862306a36Sopenharmony_ci * Interrupt related registers. This registers are mapped in different 9962306a36Sopenharmony_ci * location for CDNSP controller. 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_cistruct cdns_otg_irq_regs { 10262306a36Sopenharmony_ci __le32 ien; 10362306a36Sopenharmony_ci __le32 ivect; 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/* CDNS_RID - bitmasks */ 10762306a36Sopenharmony_ci#define CDNS_RID(p) ((p) & GENMASK(15, 0)) 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* CDNS_VID - bitmasks */ 11062306a36Sopenharmony_ci#define CDNS_DID(p) ((p) & GENMASK(31, 0)) 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* OTGCMD - bitmasks */ 11362306a36Sopenharmony_ci/* "Request the bus for Device mode. */ 11462306a36Sopenharmony_ci#define OTGCMD_DEV_BUS_REQ BIT(0) 11562306a36Sopenharmony_ci/* Request the bus for Host mode */ 11662306a36Sopenharmony_ci#define OTGCMD_HOST_BUS_REQ BIT(1) 11762306a36Sopenharmony_ci/* Enable OTG mode. */ 11862306a36Sopenharmony_ci#define OTGCMD_OTG_EN BIT(2) 11962306a36Sopenharmony_ci/* Disable OTG mode */ 12062306a36Sopenharmony_ci#define OTGCMD_OTG_DIS BIT(3) 12162306a36Sopenharmony_ci/*"Configure OTG as A-Device. */ 12262306a36Sopenharmony_ci#define OTGCMD_A_DEV_EN BIT(4) 12362306a36Sopenharmony_ci/*"Configure OTG as A-Device. */ 12462306a36Sopenharmony_ci#define OTGCMD_A_DEV_DIS BIT(5) 12562306a36Sopenharmony_ci/* Drop the bus for Device mod e. */ 12662306a36Sopenharmony_ci#define OTGCMD_DEV_BUS_DROP BIT(8) 12762306a36Sopenharmony_ci/* Drop the bus for Host mode*/ 12862306a36Sopenharmony_ci#define OTGCMD_HOST_BUS_DROP BIT(9) 12962306a36Sopenharmony_ci/* Power Down USBSS-DEV - only for CDNS3.*/ 13062306a36Sopenharmony_ci#define OTGCMD_DEV_POWER_OFF BIT(11) 13162306a36Sopenharmony_ci/* Power Down CDNSXHCI - only for CDNS3. */ 13262306a36Sopenharmony_ci#define OTGCMD_HOST_POWER_OFF BIT(12) 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci/* OTGIEN - bitmasks */ 13562306a36Sopenharmony_ci/* ID change interrupt enable */ 13662306a36Sopenharmony_ci#define OTGIEN_ID_CHANGE_INT BIT(0) 13762306a36Sopenharmony_ci/* Vbusvalid fall detected interrupt enable.*/ 13862306a36Sopenharmony_ci#define OTGIEN_VBUSVALID_RISE_INT BIT(4) 13962306a36Sopenharmony_ci/* Vbusvalid fall detected interrupt enable */ 14062306a36Sopenharmony_ci#define OTGIEN_VBUSVALID_FALL_INT BIT(5) 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci/* OTGSTS - bitmasks */ 14362306a36Sopenharmony_ci/* 14462306a36Sopenharmony_ci * Current value of the ID pin. It is only valid when idpullup in 14562306a36Sopenharmony_ci * OTGCTRL1_TYPE register is set to '1'. 14662306a36Sopenharmony_ci */ 14762306a36Sopenharmony_ci#define OTGSTS_ID_VALUE BIT(0) 14862306a36Sopenharmony_ci/* Current value of the vbus_valid */ 14962306a36Sopenharmony_ci#define OTGSTS_VBUS_VALID BIT(1) 15062306a36Sopenharmony_ci/* Current value of the b_sess_vld */ 15162306a36Sopenharmony_ci#define OTGSTS_SESSION_VALID BIT(2) 15262306a36Sopenharmony_ci/*Device mode is active*/ 15362306a36Sopenharmony_ci#define OTGSTS_DEV_ACTIVE BIT(3) 15462306a36Sopenharmony_ci/* Host mode is active. */ 15562306a36Sopenharmony_ci#define OTGSTS_HOST_ACTIVE BIT(4) 15662306a36Sopenharmony_ci/* OTG Controller not ready. */ 15762306a36Sopenharmony_ci#define OTGSTS_OTG_NRDY_MASK BIT(11) 15862306a36Sopenharmony_ci#define OTGSTS_OTG_NRDY(p) ((p) & OTGSTS_OTG_NRDY_MASK) 15962306a36Sopenharmony_ci/* 16062306a36Sopenharmony_ci * Value of the strap pins for: 16162306a36Sopenharmony_ci * CDNS3: 16262306a36Sopenharmony_ci * 000 - no default configuration 16362306a36Sopenharmony_ci * 010 - Controller initiall configured as Host 16462306a36Sopenharmony_ci * 100 - Controller initially configured as Device 16562306a36Sopenharmony_ci * CDNSP: 16662306a36Sopenharmony_ci * 000 - No default configuration. 16762306a36Sopenharmony_ci * 010 - Controller initiall configured as Host. 16862306a36Sopenharmony_ci * 100 - Controller initially configured as Device. 16962306a36Sopenharmony_ci */ 17062306a36Sopenharmony_ci#define OTGSTS_STRAP(p) (((p) & GENMASK(14, 12)) >> 12) 17162306a36Sopenharmony_ci#define OTGSTS_STRAP_NO_DEFAULT_CFG 0x00 17262306a36Sopenharmony_ci#define OTGSTS_STRAP_HOST_OTG 0x01 17362306a36Sopenharmony_ci#define OTGSTS_STRAP_HOST 0x02 17462306a36Sopenharmony_ci#define OTGSTS_STRAP_GADGET 0x04 17562306a36Sopenharmony_ci#define OTGSTS_CDNSP_STRAP_HOST 0x01 17662306a36Sopenharmony_ci#define OTGSTS_CDNSP_STRAP_GADGET 0x02 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci/* Host mode is turned on. */ 17962306a36Sopenharmony_ci#define OTGSTS_CDNS3_XHCI_READY BIT(26) 18062306a36Sopenharmony_ci#define OTGSTS_CDNSP_XHCI_READY BIT(27) 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* "Device mode is turned on .*/ 18362306a36Sopenharmony_ci#define OTGSTS_CDNS3_DEV_READY BIT(27) 18462306a36Sopenharmony_ci#define OTGSTS_CDNSP_DEV_READY BIT(26) 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/* OTGSTATE- bitmasks */ 18762306a36Sopenharmony_ci#define OTGSTATE_DEV_STATE_MASK GENMASK(2, 0) 18862306a36Sopenharmony_ci#define OTGSTATE_HOST_STATE_MASK GENMASK(5, 3) 18962306a36Sopenharmony_ci#define OTGSTATE_HOST_STATE_IDLE 0x0 19062306a36Sopenharmony_ci#define OTGSTATE_HOST_STATE_VBUS_FALL 0x7 19162306a36Sopenharmony_ci#define OTGSTATE_HOST_STATE(p) (((p) & OTGSTATE_HOST_STATE_MASK) >> 3) 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci/* OTGREFCLK - bitmasks */ 19462306a36Sopenharmony_ci#define OTGREFCLK_STB_CLK_SWITCH_EN BIT(31) 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci/* OVERRIDE - bitmasks */ 19762306a36Sopenharmony_ci#define OVERRIDE_IDPULLUP BIT(0) 19862306a36Sopenharmony_ci/* Only for CDNS3_CONTROLLER_V0 version */ 19962306a36Sopenharmony_ci#define OVERRIDE_IDPULLUP_V0 BIT(24) 20062306a36Sopenharmony_ci/* Vbusvalid/Sesvalid override select. */ 20162306a36Sopenharmony_ci#define OVERRIDE_SESS_VLD_SEL BIT(10) 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci/* PHYRST_CFG - bitmasks */ 20462306a36Sopenharmony_ci#define PHYRST_CFG_PHYRST_A_ENABLE BIT(0) 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci#define CDNS3_ID_PERIPHERAL 1 20762306a36Sopenharmony_ci#define CDNS3_ID_HOST 0 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cibool cdns_is_host(struct cdns *cdns); 21062306a36Sopenharmony_cibool cdns_is_device(struct cdns *cdns); 21162306a36Sopenharmony_ciint cdns_get_id(struct cdns *cdns); 21262306a36Sopenharmony_ciint cdns_get_vbus(struct cdns *cdns); 21362306a36Sopenharmony_civoid cdns_clear_vbus(struct cdns *cdns); 21462306a36Sopenharmony_civoid cdns_set_vbus(struct cdns *cdns); 21562306a36Sopenharmony_ciint cdns_drd_init(struct cdns *cdns); 21662306a36Sopenharmony_ciint cdns_drd_exit(struct cdns *cdns); 21762306a36Sopenharmony_ciint cdns_drd_update_mode(struct cdns *cdns); 21862306a36Sopenharmony_ciint cdns_drd_gadget_on(struct cdns *cdns); 21962306a36Sopenharmony_civoid cdns_drd_gadget_off(struct cdns *cdns); 22062306a36Sopenharmony_ciint cdns_drd_host_on(struct cdns *cdns); 22162306a36Sopenharmony_civoid cdns_drd_host_off(struct cdns *cdns); 22262306a36Sopenharmony_cibool cdns_power_is_lost(struct cdns *cdns); 22362306a36Sopenharmony_ci#endif /* __LINUX_CDNS3_DRD */ 224