ulpi.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*
  2. * Generic ULPI interface.
  3. *
  4. * Copyright (C) 2011 Jana Rapava <fermata7@gmail.com>
  5. * Copyright (C) 2011 CompuLab, Ltd. <www.compulab.co.il>
  6. *
  7. * Authors: Jana Rapava <fermata7@gmail.com>
  8. * Igor Grinberg <grinberg@compulab.co.il>
  9. *
  10. * Register offsets taken from:
  11. * linux/include/linux/usb/ulpi.h
  12. *
  13. * Original Copyrights follow:
  14. * Copyright (C) 2010 Nokia Corporation
  15. *
  16. * This software is distributed under the terms of the GNU General
  17. * Public License ("GPL") as published by the Free Software Foundation,
  18. * version 2 of that License.
  19. */
  20. #ifndef __USB_ULPI_H__
  21. #define __USB_ULPI_H__
  22. #define ULPI_ERROR (1 << 8) /* overflow from any register value */
  23. #ifndef CONFIG_USB_ULPI_TIMEOUT
  24. #define CONFIG_USB_ULPI_TIMEOUT 1000 /* timeout in us */
  25. #endif
  26. /*
  27. * ulpi view port address and
  28. * Port_number that can be passed.
  29. * Any additional data to be passed can
  30. * be extended from this structure
  31. */
  32. struct ulpi_viewport {
  33. u32 viewport_addr;
  34. u32 port_num;
  35. };
  36. /*
  37. * Initialize the ULPI transciever and check the interface integrity.
  38. * @ulpi_vp - structure containing ULPI viewport data
  39. *
  40. * returns 0 on success, ULPI_ERROR on failure.
  41. */
  42. int ulpi_init(struct ulpi_viewport *ulpi_vp);
  43. /*
  44. * Select transceiver speed.
  45. * @speed - ULPI_FC_HIGH_SPEED, ULPI_FC_FULL_SPEED (default),
  46. * ULPI_FC_LOW_SPEED, ULPI_FC_FS4LS
  47. * returns 0 on success, ULPI_ERROR on failure.
  48. */
  49. int ulpi_select_transceiver(struct ulpi_viewport *ulpi_vp, unsigned speed);
  50. /*
  51. * Enable/disable VBUS.
  52. * @ext_power - external VBUS supply is used (default is false)
  53. * @ext_indicator - external VBUS over-current indicator is used
  54. *
  55. * returns 0 on success, ULPI_ERROR on failure.
  56. */
  57. int ulpi_enable_vbus(struct ulpi_viewport *ulpi_vp,
  58. int on, int ext_power, int ext_ind);
  59. /*
  60. * Enable/disable pull-down resistors on D+ and D- USB lines.
  61. *
  62. * returns 0 on success, ULPI_ERROR on failure.
  63. */
  64. int ulpi_set_pd(struct ulpi_viewport *ulpi_vp, int enable);
  65. /*
  66. * Select OpMode.
  67. * @opmode - ULPI_FC_OPMODE_NORMAL (default), ULPI_FC_OPMODE_NONDRIVING,
  68. * ULPI_FC_OPMODE_DISABLE_NRZI, ULPI_FC_OPMODE_NOSYNC_NOEOP
  69. *
  70. * returns 0 on success, ULPI_ERROR on failure.
  71. */
  72. int ulpi_opmode_sel(struct ulpi_viewport *ulpi_vp, unsigned opmode);
  73. /*
  74. * Switch to Serial Mode.
  75. * @smode - ULPI_IFACE_6_PIN_SERIAL_MODE or ULPI_IFACE_3_PIN_SERIAL_MODE
  76. *
  77. * returns 0 on success, ULPI_ERROR on failure.
  78. *
  79. * Notes:
  80. * Switches immediately to Serial Mode.
  81. * To return from Serial Mode, STP line needs to be asserted.
  82. */
  83. int ulpi_serial_mode_enable(struct ulpi_viewport *ulpi_vp, unsigned smode);
  84. /*
  85. * Put PHY into low power mode.
  86. *
  87. * returns 0 on success, ULPI_ERROR on failure.
  88. *
  89. * Notes:
  90. * STP line must be driven low to keep the PHY in suspend.
  91. * To resume the PHY, STP line needs to be asserted.
  92. */
  93. int ulpi_suspend(struct ulpi_viewport *ulpi_vp);
  94. /*
  95. * Reset the transceiver. ULPI interface and registers are not affected.
  96. *
  97. * returns 0 on success, ULPI_ERROR on failure.
  98. */
  99. int ulpi_reset(struct ulpi_viewport *ulpi_vp);
  100. /* ULPI access methods below must be implemented for each ULPI viewport. */
  101. /*
  102. * Write to the ULPI PHY register via the viewport.
  103. * @reg - the ULPI register (one of the fields in struct ulpi_regs).
  104. * @value - the value - only 8 lower bits are used, others ignored.
  105. *
  106. * returns 0 on success, ULPI_ERROR on failure.
  107. */
  108. int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value);
  109. /*
  110. * Read the ULPI PHY register content via the viewport.
  111. * @reg - the ULPI register (one of the fields in struct ulpi_regs).
  112. *
  113. * returns register content on success, ULPI_ERROR on failure.
  114. */
  115. u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg);
  116. /*
  117. * Wait for the reset to complete.
  118. * The Link must not attempt to access the PHY until the reset has
  119. * completed and DIR line is de-asserted.
  120. */
  121. int ulpi_reset_wait(struct ulpi_viewport *ulpi_vp);
  122. /* Access Extended Register Set (indicator) */
  123. #define ACCESS_EXT_REGS_OFFSET 0x2f /* read-write */
  124. /* Vendor-specific */
  125. #define VENDOR_SPEC_OFFSET 0x30
  126. /*
  127. * Extended Register Set
  128. *
  129. * Addresses 0x00-0x3F map directly to Immediate Register Set.
  130. * Addresses 0x40-0x7F are reserved.
  131. * Addresses 0x80-0xff are vendor-specific.
  132. */
  133. #define EXT_VENDOR_SPEC_OFFSET 0x80
  134. /* ULPI registers, bits and offsets definitions */
  135. struct ulpi_regs {
  136. /* Vendor ID and Product ID: 0x00 - 0x03 Read-only */
  137. u8 vendor_id_low;
  138. u8 vendor_id_high;
  139. u8 product_id_low;
  140. u8 product_id_high;
  141. /* Function Control: 0x04 - 0x06 Read */
  142. u8 function_ctrl; /* 0x04 Write */
  143. u8 function_ctrl_set; /* 0x05 Set */
  144. u8 function_ctrl_clear; /* 0x06 Clear */
  145. /* Interface Control: 0x07 - 0x09 Read */
  146. u8 iface_ctrl; /* 0x07 Write */
  147. u8 iface_ctrl_set; /* 0x08 Set */
  148. u8 iface_ctrl_clear; /* 0x09 Clear */
  149. /* OTG Control: 0x0A - 0x0C Read */
  150. u8 otg_ctrl; /* 0x0A Write */
  151. u8 otg_ctrl_set; /* 0x0B Set */
  152. u8 otg_ctrl_clear; /* 0x0C Clear */
  153. /* USB Interrupt Enable Rising: 0x0D - 0x0F Read */
  154. u8 usb_ie_rising; /* 0x0D Write */
  155. u8 usb_ie_rising_set; /* 0x0E Set */
  156. u8 usb_ie_rising_clear; /* 0x0F Clear */
  157. /* USB Interrupt Enable Falling: 0x10 - 0x12 Read */
  158. u8 usb_ie_falling; /* 0x10 Write */
  159. u8 usb_ie_falling_set; /* 0x11 Set */
  160. u8 usb_ie_falling_clear; /* 0x12 Clear */
  161. /* USB Interrupt Status: 0x13 Read-only */
  162. u8 usb_int_status;
  163. /* USB Interrupt Latch: 0x14 Read-only with auto-clear */
  164. u8 usb_int_latch;
  165. /* Debug: 0x15 Read-only */
  166. u8 debug;
  167. /* Scratch Register: 0x16 - 0x18 Read */
  168. u8 scratch; /* 0x16 Write */
  169. u8 scratch_set; /* 0x17 Set */
  170. u8 scratch_clear; /* 0x18 Clear */
  171. /*
  172. * Optional Carkit registers:
  173. * Carkit Control: 0x19 - 0x1B Read
  174. */
  175. u8 carkit_ctrl; /* 0x19 Write */
  176. u8 carkit_ctrl_set; /* 0x1A Set */
  177. u8 carkit_ctrl_clear; /* 0x1B Clear */
  178. /* Carkit Interrupt Delay: 0x1C Read, Write */
  179. u8 carkit_int_delay;
  180. /* Carkit Interrupt Enable: 0x1D - 0x1F Read */
  181. u8 carkit_ie; /* 0x1D Write */
  182. u8 carkit_ie_set; /* 0x1E Set */
  183. u8 carkit_ie_clear; /* 0x1F Clear */
  184. /* Carkit Interrupt Status: 0x20 Read-only */
  185. u8 carkit_int_status;
  186. /* Carkit Interrupt Latch: 0x21 Read-only with auto-clear */
  187. u8 carkit_int_latch;
  188. /* Carkit Pulse Control: 0x22 - 0x24 Read */
  189. u8 carkit_pulse_ctrl; /* 0x22 Write */
  190. u8 carkit_pulse_ctrl_set; /* 0x23 Set */
  191. u8 carkit_pulse_ctrl_clear; /* 0x24 Clear */
  192. /*
  193. * Other optional registers:
  194. * Transmit Positive Width: 0x25 Read, Write
  195. */
  196. u8 transmit_pos_width;
  197. /* Transmit Negative Width: 0x26 Read, Write */
  198. u8 transmit_neg_width;
  199. /* Receive Polarity Recovery: 0x27 Read, Write */
  200. u8 recv_pol_recovery;
  201. /*
  202. * Addresses 0x28 - 0x2E are reserved, so we use offsets
  203. * for immediate registers with higher addresses
  204. */
  205. };
  206. /*
  207. * Register Bits
  208. */
  209. /* Function Control */
  210. #define ULPI_FC_XCVRSEL_MASK (3 << 0)
  211. #define ULPI_FC_HIGH_SPEED (0 << 0)
  212. #define ULPI_FC_FULL_SPEED (1 << 0)
  213. #define ULPI_FC_LOW_SPEED (2 << 0)
  214. #define ULPI_FC_FS4LS (3 << 0)
  215. #define ULPI_FC_TERMSELECT (1 << 2)
  216. #define ULPI_FC_OPMODE_MASK (3 << 3)
  217. #define ULPI_FC_OPMODE_NORMAL (0 << 3)
  218. #define ULPI_FC_OPMODE_NONDRIVING (1 << 3)
  219. #define ULPI_FC_OPMODE_DISABLE_NRZI (2 << 3)
  220. #define ULPI_FC_OPMODE_NOSYNC_NOEOP (3 << 3)
  221. #define ULPI_FC_RESET (1 << 5)
  222. #define ULPI_FC_SUSPENDM (1 << 6)
  223. /* Interface Control */
  224. #define ULPI_IFACE_6_PIN_SERIAL_MODE (1 << 0)
  225. #define ULPI_IFACE_3_PIN_SERIAL_MODE (1 << 1)
  226. #define ULPI_IFACE_CARKITMODE (1 << 2)
  227. #define ULPI_IFACE_CLOCKSUSPENDM (1 << 3)
  228. #define ULPI_IFACE_AUTORESUME (1 << 4)
  229. #define ULPI_IFACE_EXTVBUS_COMPLEMENT (1 << 5)
  230. #define ULPI_IFACE_PASSTHRU (1 << 6)
  231. #define ULPI_IFACE_PROTECT_IFC_DISABLE (1 << 7)
  232. /* OTG Control */
  233. #define ULPI_OTG_ID_PULLUP (1 << 0)
  234. #define ULPI_OTG_DP_PULLDOWN (1 << 1)
  235. #define ULPI_OTG_DM_PULLDOWN (1 << 2)
  236. #define ULPI_OTG_DISCHRGVBUS (1 << 3)
  237. #define ULPI_OTG_CHRGVBUS (1 << 4)
  238. #define ULPI_OTG_DRVVBUS (1 << 5)
  239. #define ULPI_OTG_DRVVBUS_EXT (1 << 6)
  240. #define ULPI_OTG_EXTVBUSIND (1 << 7)
  241. /*
  242. * USB Interrupt Enable Rising,
  243. * USB Interrupt Enable Falling,
  244. * USB Interrupt Status and
  245. * USB Interrupt Latch
  246. */
  247. #define ULPI_INT_HOST_DISCONNECT (1 << 0)
  248. #define ULPI_INT_VBUS_VALID (1 << 1)
  249. #define ULPI_INT_SESS_VALID (1 << 2)
  250. #define ULPI_INT_SESS_END (1 << 3)
  251. #define ULPI_INT_IDGRD (1 << 4)
  252. /* Debug */
  253. #define ULPI_DEBUG_LINESTATE0 (1 << 0)
  254. #define ULPI_DEBUG_LINESTATE1 (1 << 1)
  255. /* Carkit Control */
  256. #define ULPI_CARKIT_CTRL_CARKITPWR (1 << 0)
  257. #define ULPI_CARKIT_CTRL_IDGNDDRV (1 << 1)
  258. #define ULPI_CARKIT_CTRL_TXDEN (1 << 2)
  259. #define ULPI_CARKIT_CTRL_RXDEN (1 << 3)
  260. #define ULPI_CARKIT_CTRL_SPKLEFTEN (1 << 4)
  261. #define ULPI_CARKIT_CTRL_SPKRIGHTEN (1 << 5)
  262. #define ULPI_CARKIT_CTRL_MICEN (1 << 6)
  263. /* Carkit Interrupt Enable */
  264. #define ULPI_CARKIT_INT_EN_IDFLOAT_RISE (1 << 0)
  265. #define ULPI_CARKIT_INT_EN_IDFLOAT_FALL (1 << 1)
  266. #define ULPI_CARKIT_INT_EN_CARINTDET (1 << 2)
  267. #define ULPI_CARKIT_INT_EN_DP_RISE (1 << 3)
  268. #define ULPI_CARKIT_INT_EN_DP_FALL (1 << 4)
  269. /* Carkit Interrupt Status and Latch */
  270. #define ULPI_CARKIT_INT_IDFLOAT (1 << 0)
  271. #define ULPI_CARKIT_INT_CARINTDET (1 << 1)
  272. #define ULPI_CARKIT_INT_DP (1 << 2)
  273. /* Carkit Pulse Control*/
  274. #define ULPI_CARKIT_PLS_CTRL_TXPLSEN (1 << 0)
  275. #define ULPI_CARKIT_PLS_CTRL_RXPLSEN (1 << 1)
  276. #define ULPI_CARKIT_PLS_CTRL_SPKRLEFT_BIASEN (1 << 2)
  277. #define ULPI_CARKIT_PLS_CTRL_SPKRRIGHT_BIASEN (1 << 3)
  278. #endif /* __USB_ULPI_H__ */