1e443b333SAlexander Shishkin /* 2e443b333SAlexander Shishkin * Platform data for the chipidea USB dual role controller 3e443b333SAlexander Shishkin */ 4e443b333SAlexander Shishkin 5e443b333SAlexander Shishkin #ifndef __LINUX_USB_CHIPIDEA_H 6e443b333SAlexander Shishkin #define __LINUX_USB_CHIPIDEA_H 7e443b333SAlexander Shishkin 8*3ecb3e09SIvan T. Ivanov #include <linux/extcon.h> 9a2c3d690SRichard Zhao #include <linux/usb/otg.h> 10a2c3d690SRichard Zhao 118e22978cSAlexander Shishkin struct ci_hdrc; 12*3ecb3e09SIvan T. Ivanov 13*3ecb3e09SIvan T. Ivanov /** 14*3ecb3e09SIvan T. Ivanov * struct ci_hdrc_cable - structure for external connector cable state tracking 15*3ecb3e09SIvan T. Ivanov * @state: current state of the line 16*3ecb3e09SIvan T. Ivanov * @changed: set to true when extcon event happen 17*3ecb3e09SIvan T. Ivanov * @edev: device which generate events 18*3ecb3e09SIvan T. Ivanov * @ci: driver state of the chipidea device 19*3ecb3e09SIvan T. Ivanov * @nb: hold event notification callback 20*3ecb3e09SIvan T. Ivanov * @conn: used for notification registration 21*3ecb3e09SIvan T. Ivanov */ 22*3ecb3e09SIvan T. Ivanov struct ci_hdrc_cable { 23*3ecb3e09SIvan T. Ivanov bool state; 24*3ecb3e09SIvan T. Ivanov bool changed; 25*3ecb3e09SIvan T. Ivanov struct extcon_dev *edev; 26*3ecb3e09SIvan T. Ivanov struct ci_hdrc *ci; 27*3ecb3e09SIvan T. Ivanov struct notifier_block nb; 28*3ecb3e09SIvan T. Ivanov }; 29*3ecb3e09SIvan T. Ivanov 308e22978cSAlexander Shishkin struct ci_hdrc_platform_data { 31e443b333SAlexander Shishkin const char *name; 32e443b333SAlexander Shishkin /* offset of the capability registers */ 33e443b333SAlexander Shishkin uintptr_t capoffset; 34bd841986SAlexander Shishkin unsigned power_budget; 351e5e2d3dSAntoine Tenart struct phy *phy; 361e5e2d3dSAntoine Tenart /* old usb_phy interface */ 37ef44cb42SAntoine Tenart struct usb_phy *usb_phy; 3840dcd0e8SMichael Grzeschik enum usb_phy_interface phy_mode; 39e443b333SAlexander Shishkin unsigned long flags; 408e22978cSAlexander Shishkin #define CI_HDRC_REGS_SHARED BIT(0) 418022d3d5SPeter Chen #define CI_HDRC_DISABLE_DEVICE_STREAMING BIT(1) 421f874edcSPeter Chen #define CI_HDRC_SUPPORTS_RUNTIME_PM BIT(2) 438022d3d5SPeter Chen #define CI_HDRC_DISABLE_HOST_STREAMING BIT(3) 448022d3d5SPeter Chen #define CI_HDRC_DISABLE_STREAMING (CI_HDRC_DISABLE_DEVICE_STREAMING | \ 458022d3d5SPeter Chen CI_HDRC_DISABLE_HOST_STREAMING) 46577b232fSPeter Chen /* 47577b232fSPeter Chen * Only set it when DCCPARAMS.DC==1 and DCCPARAMS.HC==1, 48577b232fSPeter Chen * but otg is not supported (no register otgsc). 49577b232fSPeter Chen */ 50577b232fSPeter Chen #define CI_HDRC_DUAL_ROLE_NOT_OTG BIT(4) 51ed8f8318SPeter Chen #define CI_HDRC_IMX28_WRITE_FIX BIT(5) 524f6743d5SMichael Grzeschik #define CI_HDRC_FORCE_FULLSPEED BIT(6) 536adb9b7bSLi Jun #define CI_HDRC_TURN_VBUS_EARLY_ON BIT(7) 5428362673SPeter Chen #define CI_HDRC_SET_NON_ZERO_TTHA BIT(8) 5565668718SPeter Chen #define CI_HDRC_OVERRIDE_AHB_BURST BIT(9) 5696625eadSPeter Chen #define CI_HDRC_OVERRIDE_TX_BURST BIT(10) 5796625eadSPeter Chen #define CI_HDRC_OVERRIDE_RX_BURST BIT(11) 58691962d1SSascha Hauer enum usb_dr_mode dr_mode; 598e22978cSAlexander Shishkin #define CI_HDRC_CONTROLLER_RESET_EVENT 0 608e22978cSAlexander Shishkin #define CI_HDRC_CONTROLLER_STOPPED_EVENT 1 618e22978cSAlexander Shishkin void (*notify_event) (struct ci_hdrc *ci, unsigned event); 621542d9c3SPeter Chen struct regulator *reg_vbus; 6379742351SLi Jun struct usb_otg_caps ci_otg_caps; 64f6a9ff07SPeter Chen bool tpl_support; 65df96ed8dSPeter Chen /* interrupt threshold setting */ 66df96ed8dSPeter Chen u32 itc_setting; 6765668718SPeter Chen u32 ahb_burst_config; 6896625eadSPeter Chen u32 tx_burst_size; 6996625eadSPeter Chen u32 rx_burst_size; 70*3ecb3e09SIvan T. Ivanov 71*3ecb3e09SIvan T. Ivanov /* VBUS and ID signal state tracking, using extcon framework */ 72*3ecb3e09SIvan T. Ivanov struct ci_hdrc_cable vbus_extcon; 73*3ecb3e09SIvan T. Ivanov struct ci_hdrc_cable id_extcon; 74e443b333SAlexander Shishkin }; 75e443b333SAlexander Shishkin 76e443b333SAlexander Shishkin /* Default offset of capability registers */ 77e443b333SAlexander Shishkin #define DEF_CAPOFFSET 0x100 78e443b333SAlexander Shishkin 798e22978cSAlexander Shishkin /* Add ci hdrc device */ 808e22978cSAlexander Shishkin struct platform_device *ci_hdrc_add_device(struct device *dev, 81cbc6dc2aSRichard Zhao struct resource *res, int nres, 828e22978cSAlexander Shishkin struct ci_hdrc_platform_data *platdata); 838e22978cSAlexander Shishkin /* Remove ci hdrc device */ 848e22978cSAlexander Shishkin void ci_hdrc_remove_device(struct platform_device *pdev); 85cbc6dc2aSRichard Zhao 86e443b333SAlexander Shishkin #endif 87