1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Cadence USBSS DRD Header File. 4 * 5 * Copyright (C) 2017-2018 NXP 6 * Copyright (C) 2018-2019 Cadence. 7 * 8 * Authors: Peter Chen <peter.chen@nxp.com> 9 * Pawel Laszczak <pawell@cadence.com> 10 */ 11 #include <linux/usb/otg.h> 12 13 #ifndef __LINUX_CDNS3_CORE_H 14 #define __LINUX_CDNS3_CORE_H 15 16 struct cdns3; 17 enum cdns3_roles { 18 CDNS3_ROLE_IDLE = 0, 19 CDNS3_ROLE_HOST, 20 CDNS3_ROLE_GADGET, 21 CDNS3_ROLE_END, 22 }; 23 24 /** 25 * struct cdns3_role_driver - host/gadget role driver 26 * @start: start this role 27 * @stop: stop this role 28 * @suspend: suspend callback for this role 29 * @resume: resume callback for this role 30 * @irq: irq handler for this role 31 * @name: role name string (host/gadget) 32 * @state: current state 33 */ 34 struct cdns3_role_driver { 35 int (*start)(struct cdns3 *cdns); 36 void (*stop)(struct cdns3 *cdns); 37 int (*suspend)(struct cdns3 *cdns, bool do_wakeup); 38 int (*resume)(struct cdns3 *cdns, bool hibernated); 39 const char *name; 40 #define CDNS3_ROLE_STATE_INACTIVE 0 41 #define CDNS3_ROLE_STATE_ACTIVE 1 42 int state; 43 }; 44 45 #define CDNS3_XHCI_RESOURCES_NUM 2 46 /** 47 * struct cdns3 - Representation of Cadence USB3 DRD controller. 48 * @dev: pointer to Cadence device struct 49 * @xhci_regs: pointer to base of xhci registers 50 * @xhci_res: the resource for xhci 51 * @dev_regs: pointer to base of dev registers 52 * @otg_res: the resource for otg 53 * @otg_v0_regs: pointer to base of v0 otg registers 54 * @otg_v1_regs: pointer to base of v1 otg registers 55 * @otg_regs: pointer to base of otg registers 56 * @otg_irq: irq number for otg controller 57 * @dev_irq: irq number for device controller 58 * @roles: array of supported roles for this controller 59 * @role: current role 60 * @host_dev: the child host device pointer for cdns3 core 61 * @gadget_dev: the child gadget device pointer for cdns3 core 62 * @usb2_phy: pointer to USB2 PHY 63 * @usb3_phy: pointer to USB3 PHY 64 * @role_switch_wq: work queue item for role switch 65 * @wakeup_int: the wakeup interrupt 66 * @mutex: the mutex for concurrent code at driver 67 * @dr_mode: supported mode of operation it can be only Host, only Device 68 * or OTG mode that allow to switch between Device and Host mode. 69 * This field based on firmware setting, kernel configuration 70 * and hardware configuration. 71 * @current_dr_mode: current mode of operation when in dual-role mode 72 * @desired_dr_mode: desired mode of operation when in dual-role mode. 73 * This value can be changed during runtime. 74 * Available options depends on dr_mode: 75 * dr_mode | desired_dr_mode and current_dr_mode 76 * ---------------------------------------------------------------- 77 * USB_DR_MODE_HOST | only USB_DR_MODE_HOST 78 * USB_DR_MODE_PERIPHERAL | only USB_DR_MODE_PERIPHERAL 79 * USB_DR_MODE_OTG | USB_DR_MODE_OTG or USB_DR_MODE_HOST or 80 * | USB_DR_MODE_PERIPHERAL 81 * Desired_dr_role can be changed by means of debugfs. 82 * @root: debugfs root folder pointer 83 * @debug_disable: 84 */ 85 struct cdns3 { 86 struct device *dev; 87 void __iomem *xhci_regs; 88 struct resource xhci_res[CDNS3_XHCI_RESOURCES_NUM]; 89 struct cdns3_usb_regs __iomem *dev_regs; 90 91 struct resource otg_res; 92 struct cdns3_otg_legacy_regs *otg_v0_regs; 93 struct cdns3_otg_regs *otg_v1_regs; 94 struct cdns3_otg_common_regs *otg_regs; 95 #define CDNS3_CONTROLLER_V0 0 96 #define CDNS3_CONTROLLER_V1 1 97 u32 version; 98 99 int otg_irq; 100 int dev_irq; 101 struct cdns3_role_driver *roles[CDNS3_ROLE_END]; 102 enum cdns3_roles role; 103 struct platform_device *host_dev; 104 struct cdns3_device *gadget_dev; 105 struct phy *usb2_phy; 106 struct phy *usb3_phy; 107 struct work_struct role_switch_wq; 108 int wakeup_int:1; 109 /* mutext used in workqueue*/ 110 struct mutex mutex; 111 enum usb_dr_mode dr_mode; 112 enum usb_dr_mode current_dr_mode; 113 enum usb_dr_mode desired_dr_mode; 114 struct dentry *root; 115 int debug_disable:1; 116 }; 117 118 void cdns3_role_stop(struct cdns3 *cdns); 119 int cdns3_handshake(void __iomem *ptr, u32 mask, u32 done, int usec); 120 121 #endif /* __LINUX_CDNS3_CORE_H */ 122