1*f6ce6072SVignesh Raghavendra /* SPDX-License-Identifier: GPL-2.0 */ 2*f6ce6072SVignesh Raghavendra /* 3*f6ce6072SVignesh Raghavendra * Cadence USBSS DRD Header File. 4*f6ce6072SVignesh Raghavendra * 5*f6ce6072SVignesh Raghavendra * Copyright (C) 2017-2018 NXP 6*f6ce6072SVignesh Raghavendra * Copyright (C) 2018-2019 Cadence. 7*f6ce6072SVignesh Raghavendra * 8*f6ce6072SVignesh Raghavendra * Authors: Peter Chen <peter.chen@nxp.com> 9*f6ce6072SVignesh Raghavendra * Pawel Laszczak <pawell@cadence.com> 10*f6ce6072SVignesh Raghavendra */ 11*f6ce6072SVignesh Raghavendra #include <linux/compiler.h> 12*f6ce6072SVignesh Raghavendra #include <linux/types.h> 13*f6ce6072SVignesh Raghavendra #include <linux/usb/otg.h> 14*f6ce6072SVignesh Raghavendra #include <generic-phy.h> 15*f6ce6072SVignesh Raghavendra 16*f6ce6072SVignesh Raghavendra #ifndef __LINUX_CDNS3_CORE_H 17*f6ce6072SVignesh Raghavendra #define __LINUX_CDNS3_CORE_H 18*f6ce6072SVignesh Raghavendra 19*f6ce6072SVignesh Raghavendra enum usb_role { 20*f6ce6072SVignesh Raghavendra USB_ROLE_NONE, 21*f6ce6072SVignesh Raghavendra USB_ROLE_HOST, 22*f6ce6072SVignesh Raghavendra USB_ROLE_DEVICE, 23*f6ce6072SVignesh Raghavendra }; 24*f6ce6072SVignesh Raghavendra 25*f6ce6072SVignesh Raghavendra struct cdns3; 26*f6ce6072SVignesh Raghavendra 27*f6ce6072SVignesh Raghavendra /** 28*f6ce6072SVignesh Raghavendra * struct cdns3_role_driver - host/gadget role driver 29*f6ce6072SVignesh Raghavendra * @start: start this role 30*f6ce6072SVignesh Raghavendra * @stop: stop this role 31*f6ce6072SVignesh Raghavendra * @suspend: suspend callback for this role 32*f6ce6072SVignesh Raghavendra * @resume: resume callback for this role 33*f6ce6072SVignesh Raghavendra * @irq: irq handler for this role 34*f6ce6072SVignesh Raghavendra * @name: role name string (host/gadget) 35*f6ce6072SVignesh Raghavendra * @state: current state 36*f6ce6072SVignesh Raghavendra */ 37*f6ce6072SVignesh Raghavendra struct cdns3_role_driver { 38*f6ce6072SVignesh Raghavendra int (*start)(struct cdns3 *cdns); 39*f6ce6072SVignesh Raghavendra void (*stop)(struct cdns3 *cdns); 40*f6ce6072SVignesh Raghavendra int (*suspend)(struct cdns3 *cdns, bool do_wakeup); 41*f6ce6072SVignesh Raghavendra int (*resume)(struct cdns3 *cdns, bool hibernated); 42*f6ce6072SVignesh Raghavendra const char *name; 43*f6ce6072SVignesh Raghavendra #define CDNS3_ROLE_STATE_INACTIVE 0 44*f6ce6072SVignesh Raghavendra #define CDNS3_ROLE_STATE_ACTIVE 1 45*f6ce6072SVignesh Raghavendra int state; 46*f6ce6072SVignesh Raghavendra }; 47*f6ce6072SVignesh Raghavendra 48*f6ce6072SVignesh Raghavendra #define CDNS3_XHCI_RESOURCES_NUM 2 49*f6ce6072SVignesh Raghavendra /** 50*f6ce6072SVignesh Raghavendra * struct cdns3 - Representation of Cadence USB3 DRD controller. 51*f6ce6072SVignesh Raghavendra * @dev: pointer to Cadence device struct 52*f6ce6072SVignesh Raghavendra * @xhci_regs: pointer to base of xhci registers 53*f6ce6072SVignesh Raghavendra * @dev_regs: pointer to base of dev registers 54*f6ce6072SVignesh Raghavendra * @otg_v0_regs: pointer to base of v0 otg registers 55*f6ce6072SVignesh Raghavendra * @otg_v1_regs: pointer to base of v1 otg registers 56*f6ce6072SVignesh Raghavendra * @otg_regs: pointer to base of otg registers 57*f6ce6072SVignesh Raghavendra * @otg_irq: irq number for otg controller 58*f6ce6072SVignesh Raghavendra * @dev_irq: irq number for device controller 59*f6ce6072SVignesh Raghavendra * @roles: array of supported roles for this controller 60*f6ce6072SVignesh Raghavendra * @role: current role 61*f6ce6072SVignesh Raghavendra * @host_dev: the child host device pointer for cdns3 core 62*f6ce6072SVignesh Raghavendra * @gadget_dev: the child gadget device pointer for cdns3 core 63*f6ce6072SVignesh Raghavendra * @usb2_phy: pointer to USB2 PHY 64*f6ce6072SVignesh Raghavendra * @usb3_phy: pointer to USB3 PHY 65*f6ce6072SVignesh Raghavendra * @mutex: the mutex for concurrent code at driver 66*f6ce6072SVignesh Raghavendra * @dr_mode: supported mode of operation it can be only Host, only Device 67*f6ce6072SVignesh Raghavendra * or OTG mode that allow to switch between Device and Host mode. 68*f6ce6072SVignesh Raghavendra * This field based on firmware setting, kernel configuration 69*f6ce6072SVignesh Raghavendra * and hardware configuration. 70*f6ce6072SVignesh Raghavendra * @role_sw: pointer to role switch object. 71*f6ce6072SVignesh Raghavendra * @role_override: set 1 if role rely on SW. 72*f6ce6072SVignesh Raghavendra */ 73*f6ce6072SVignesh Raghavendra struct cdns3 { 74*f6ce6072SVignesh Raghavendra struct udevice *dev; 75*f6ce6072SVignesh Raghavendra void __iomem *xhci_regs; 76*f6ce6072SVignesh Raghavendra struct cdns3_usb_regs __iomem *dev_regs; 77*f6ce6072SVignesh Raghavendra 78*f6ce6072SVignesh Raghavendra struct cdns3_otg_legacy_regs *otg_v0_regs; 79*f6ce6072SVignesh Raghavendra struct cdns3_otg_regs *otg_v1_regs; 80*f6ce6072SVignesh Raghavendra struct cdns3_otg_common_regs *otg_regs; 81*f6ce6072SVignesh Raghavendra #define CDNS3_CONTROLLER_V0 0 82*f6ce6072SVignesh Raghavendra #define CDNS3_CONTROLLER_V1 1 83*f6ce6072SVignesh Raghavendra u32 version; 84*f6ce6072SVignesh Raghavendra 85*f6ce6072SVignesh Raghavendra int otg_irq; 86*f6ce6072SVignesh Raghavendra int dev_irq; 87*f6ce6072SVignesh Raghavendra struct cdns3_role_driver *roles[USB_ROLE_DEVICE + 1]; 88*f6ce6072SVignesh Raghavendra enum usb_role role; 89*f6ce6072SVignesh Raghavendra struct cdns3_device *gadget_dev; 90*f6ce6072SVignesh Raghavendra struct phy usb2_phy; 91*f6ce6072SVignesh Raghavendra struct phy usb3_phy; 92*f6ce6072SVignesh Raghavendra /* mutext used in workqueue*/ 93*f6ce6072SVignesh Raghavendra struct mutex mutex; 94*f6ce6072SVignesh Raghavendra enum usb_dr_mode dr_mode; 95*f6ce6072SVignesh Raghavendra int role_override; 96*f6ce6072SVignesh Raghavendra }; 97*f6ce6072SVignesh Raghavendra 98*f6ce6072SVignesh Raghavendra int cdns3_hw_role_switch(struct cdns3 *cdns); 99*f6ce6072SVignesh Raghavendra 100*f6ce6072SVignesh Raghavendra /** 101*f6ce6072SVignesh Raghavendra * cdns3_bind - generic bind function 102*f6ce6072SVignesh Raghavendra * @parent - pointer to parent udevice of which cdns3 USB controller 103*f6ce6072SVignesh Raghavendra * node is child of 104*f6ce6072SVignesh Raghavendra * 105*f6ce6072SVignesh Raghavendra * return 0 on success, negative errno otherwise 106*f6ce6072SVignesh Raghavendra */ 107*f6ce6072SVignesh Raghavendra int cdns3_bind(struct udevice *dev); 108*f6ce6072SVignesh Raghavendra #endif /* __LINUX_CDNS3_CORE_H */ 109