1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2e443b333SAlexander Shishkin /* 3e443b333SAlexander Shishkin * Platform data for the chipidea USB dual role controller 4e443b333SAlexander Shishkin */ 5e443b333SAlexander Shishkin 6e443b333SAlexander Shishkin #ifndef __LINUX_USB_CHIPIDEA_H 7e443b333SAlexander Shishkin #define __LINUX_USB_CHIPIDEA_H 8e443b333SAlexander Shishkin 93ecb3e09SIvan T. Ivanov #include <linux/extcon.h> 10a2c3d690SRichard Zhao #include <linux/usb/otg.h> 11a2c3d690SRichard Zhao 128e22978cSAlexander Shishkin struct ci_hdrc; 133ecb3e09SIvan T. Ivanov 143ecb3e09SIvan T. Ivanov /** 153ecb3e09SIvan T. Ivanov * struct ci_hdrc_cable - structure for external connector cable state tracking 165cc49268SStephen Boyd * @connected: true if cable is connected, false otherwise 173ecb3e09SIvan T. Ivanov * @changed: set to true when extcon event happen 18a89b94b5SStephen Boyd * @enabled: set to true if we've enabled the vbus or id interrupt 193ecb3e09SIvan T. Ivanov * @edev: device which generate events 203ecb3e09SIvan T. Ivanov * @ci: driver state of the chipidea device 213ecb3e09SIvan T. Ivanov * @nb: hold event notification callback 223ecb3e09SIvan T. Ivanov * @conn: used for notification registration 233ecb3e09SIvan T. Ivanov */ 243ecb3e09SIvan T. Ivanov struct ci_hdrc_cable { 255cc49268SStephen Boyd bool connected; 263ecb3e09SIvan T. Ivanov bool changed; 27a89b94b5SStephen Boyd bool enabled; 283ecb3e09SIvan T. Ivanov struct extcon_dev *edev; 293ecb3e09SIvan T. Ivanov struct ci_hdrc *ci; 303ecb3e09SIvan T. Ivanov struct notifier_block nb; 313ecb3e09SIvan T. Ivanov }; 323ecb3e09SIvan T. Ivanov 338e22978cSAlexander Shishkin struct ci_hdrc_platform_data { 34e443b333SAlexander Shishkin const char *name; 35e443b333SAlexander Shishkin /* offset of the capability registers */ 36e443b333SAlexander Shishkin uintptr_t capoffset; 37bd841986SAlexander Shishkin unsigned power_budget; 381e5e2d3dSAntoine Tenart struct phy *phy; 391e5e2d3dSAntoine Tenart /* old usb_phy interface */ 40ef44cb42SAntoine Tenart struct usb_phy *usb_phy; 4140dcd0e8SMichael Grzeschik enum usb_phy_interface phy_mode; 42e443b333SAlexander Shishkin unsigned long flags; 438e22978cSAlexander Shishkin #define CI_HDRC_REGS_SHARED BIT(0) 448022d3d5SPeter Chen #define CI_HDRC_DISABLE_DEVICE_STREAMING BIT(1) 451f874edcSPeter Chen #define CI_HDRC_SUPPORTS_RUNTIME_PM BIT(2) 468022d3d5SPeter Chen #define CI_HDRC_DISABLE_HOST_STREAMING BIT(3) 478022d3d5SPeter Chen #define CI_HDRC_DISABLE_STREAMING (CI_HDRC_DISABLE_DEVICE_STREAMING | \ 488022d3d5SPeter Chen CI_HDRC_DISABLE_HOST_STREAMING) 49577b232fSPeter Chen /* 50577b232fSPeter Chen * Only set it when DCCPARAMS.DC==1 and DCCPARAMS.HC==1, 51577b232fSPeter Chen * but otg is not supported (no register otgsc). 52577b232fSPeter Chen */ 53577b232fSPeter Chen #define CI_HDRC_DUAL_ROLE_NOT_OTG BIT(4) 54ed8f8318SPeter Chen #define CI_HDRC_IMX28_WRITE_FIX BIT(5) 554f6743d5SMichael Grzeschik #define CI_HDRC_FORCE_FULLSPEED BIT(6) 566adb9b7bSLi Jun #define CI_HDRC_TURN_VBUS_EARLY_ON BIT(7) 5728362673SPeter Chen #define CI_HDRC_SET_NON_ZERO_TTHA BIT(8) 5865668718SPeter Chen #define CI_HDRC_OVERRIDE_AHB_BURST BIT(9) 5996625eadSPeter Chen #define CI_HDRC_OVERRIDE_TX_BURST BIT(10) 6096625eadSPeter Chen #define CI_HDRC_OVERRIDE_RX_BURST BIT(11) 618feb3680SStephen Boyd #define CI_HDRC_OVERRIDE_PHY_CONTROL BIT(12) /* Glue layer manages phy */ 62581821aeSDmitry Osipenko #define CI_HDRC_REQUIRES_ALIGNED_DMA BIT(13) 63014abe34SPeter Chen #define CI_HDRC_IMX_IS_HSIC BIT(14) 64d1609c31SPeter Chen #define CI_HDRC_PMQOS BIT(15) 6566d1c802SPiyush Mehta #define CI_HDRC_PHY_VBUS_CONTROL BIT(16) 6612e6ac69SXu Yang #define CI_HDRC_HAS_PORTSC_PEC_MISSED BIT(17) 672978cc1fSTomer Maimon #define CI_HDRC_FORCE_VBUS_ACTIVE_ALWAYS BIT(18) 68*ec841b8dSXu Yang #define CI_HDRC_HAS_SHORT_PKT_LIMIT BIT(19) 69691962d1SSascha Hauer enum usb_dr_mode dr_mode; 708e22978cSAlexander Shishkin #define CI_HDRC_CONTROLLER_RESET_EVENT 0 718e22978cSAlexander Shishkin #define CI_HDRC_CONTROLLER_STOPPED_EVENT 1 72014abe34SPeter Chen #define CI_HDRC_IMX_HSIC_ACTIVE_EVENT 2 73014abe34SPeter Chen #define CI_HDRC_IMX_HSIC_SUSPEND_EVENT 3 74d755cdb1SPeter Chen #define CI_HDRC_CONTROLLER_VBUS_EVENT 4 7511893daeSStephen Boyd int (*notify_event) (struct ci_hdrc *ci, unsigned event); 761542d9c3SPeter Chen struct regulator *reg_vbus; 7779742351SLi Jun struct usb_otg_caps ci_otg_caps; 78f6a9ff07SPeter Chen bool tpl_support; 79df96ed8dSPeter Chen /* interrupt threshold setting */ 80df96ed8dSPeter Chen u32 itc_setting; 8165668718SPeter Chen u32 ahb_burst_config; 8296625eadSPeter Chen u32 tx_burst_size; 8396625eadSPeter Chen u32 rx_burst_size; 843ecb3e09SIvan T. Ivanov 853ecb3e09SIvan T. Ivanov /* VBUS and ID signal state tracking, using extcon framework */ 863ecb3e09SIvan T. Ivanov struct ci_hdrc_cable vbus_extcon; 873ecb3e09SIvan T. Ivanov struct ci_hdrc_cable id_extcon; 881fbf4628SFabio Estevam u32 phy_clkgate_delay_us; 8916caf1faSLoic Poulain 9016caf1faSLoic Poulain /* pins */ 9116caf1faSLoic Poulain struct pinctrl *pctl; 9216caf1faSLoic Poulain struct pinctrl_state *pins_default; 9316caf1faSLoic Poulain struct pinctrl_state *pins_host; 9416caf1faSLoic Poulain struct pinctrl_state *pins_device; 95fc53d527SPeter Geis 96fc53d527SPeter Geis /* platform-specific hooks */ 97fc53d527SPeter Geis int (*hub_control)(struct ci_hdrc *ci, u16 typeReq, u16 wValue, 98fc53d527SPeter Geis u16 wIndex, char *buf, u16 wLength, 99fc53d527SPeter Geis bool *done, unsigned long *flags); 100fc53d527SPeter Geis void (*enter_lpm)(struct ci_hdrc *ci, bool enable); 101e443b333SAlexander Shishkin }; 102e443b333SAlexander Shishkin 103e443b333SAlexander Shishkin /* Default offset of capability registers */ 104e443b333SAlexander Shishkin #define DEF_CAPOFFSET 0x100 105e443b333SAlexander Shishkin 1068e22978cSAlexander Shishkin /* Add ci hdrc device */ 1078e22978cSAlexander Shishkin struct platform_device *ci_hdrc_add_device(struct device *dev, 108cbc6dc2aSRichard Zhao struct resource *res, int nres, 1098e22978cSAlexander Shishkin struct ci_hdrc_platform_data *platdata); 1108e22978cSAlexander Shishkin /* Remove ci hdrc device */ 1118e22978cSAlexander Shishkin void ci_hdrc_remove_device(struct platform_device *pdev); 11262b98258SPeter Chen /* Get current available role */ 11362b98258SPeter Chen enum usb_dr_mode ci_hdrc_query_available_role(struct platform_device *pdev); 114cbc6dc2aSRichard Zhao 115e443b333SAlexander Shishkin #endif 116