core.h 4.0 KB

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