params.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423
  1. /*
  2. * Copyright (C) 2004-2016 Synopsys, Inc.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions
  6. * are met:
  7. * 1. Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions, and the following disclaimer,
  9. * without modification.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 3. The names of the above-listed copyright holders may not be used
  14. * to endorse or promote products derived from this software without
  15. * specific prior written permission.
  16. *
  17. * ALTERNATIVELY, this software may be distributed under the terms of the
  18. * GNU General Public License ("GPL") as published by the Free Software
  19. * Foundation; either version 2 of the License, or (at your option) any
  20. * later version.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  23. * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  24. * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  25. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  26. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  27. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  28. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  29. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  30. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  31. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  32. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. */
  34. #include <linux/kernel.h>
  35. #include <linux/module.h>
  36. #include <linux/of_device.h>
  37. #include "core.h"
  38. static const struct dwc2_core_params params_hi6220 = {
  39. .otg_cap = 2, /* No HNP/SRP capable */
  40. .otg_ver = 0, /* 1.3 */
  41. .dma_desc_enable = 0,
  42. .dma_desc_fs_enable = 0,
  43. .speed = 0, /* High Speed */
  44. .enable_dynamic_fifo = 1,
  45. .en_multiple_tx_fifo = 1,
  46. .host_rx_fifo_size = 512,
  47. .host_nperio_tx_fifo_size = 512,
  48. .host_perio_tx_fifo_size = 512,
  49. .max_transfer_size = 65535,
  50. .max_packet_count = 511,
  51. .host_channels = 16,
  52. .phy_type = 1, /* UTMI */
  53. .phy_utmi_width = 8,
  54. .phy_ulpi_ddr = 0, /* Single */
  55. .phy_ulpi_ext_vbus = 0,
  56. .i2c_enable = 0,
  57. .ulpi_fs_ls = 0,
  58. .host_support_fs_ls_low_power = 0,
  59. .host_ls_low_power_phy_clk = 0, /* 48 MHz */
  60. .ts_dline = 0,
  61. .reload_ctl = 0,
  62. .ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
  63. GAHBCFG_HBSTLEN_SHIFT,
  64. .uframe_sched = 0,
  65. .external_id_pin_ctl = -1,
  66. .hibernation = -1,
  67. };
  68. static const struct dwc2_core_params params_bcm2835 = {
  69. .otg_cap = 0, /* HNP/SRP capable */
  70. .otg_ver = 0, /* 1.3 */
  71. .dma_desc_enable = 0,
  72. .dma_desc_fs_enable = 0,
  73. .speed = 0, /* High Speed */
  74. .enable_dynamic_fifo = 1,
  75. .en_multiple_tx_fifo = 1,
  76. .host_rx_fifo_size = 774, /* 774 DWORDs */
  77. .host_nperio_tx_fifo_size = 256, /* 256 DWORDs */
  78. .host_perio_tx_fifo_size = 512, /* 512 DWORDs */
  79. .max_transfer_size = 65535,
  80. .max_packet_count = 511,
  81. .host_channels = 8,
  82. .phy_type = 1, /* UTMI */
  83. .phy_utmi_width = 8, /* 8 bits */
  84. .phy_ulpi_ddr = 0, /* Single */
  85. .phy_ulpi_ext_vbus = 0,
  86. .i2c_enable = 0,
  87. .ulpi_fs_ls = 0,
  88. .host_support_fs_ls_low_power = 0,
  89. .host_ls_low_power_phy_clk = 0, /* 48 MHz */
  90. .ts_dline = 0,
  91. .reload_ctl = 0,
  92. .ahbcfg = 0x10,
  93. .uframe_sched = 0,
  94. .external_id_pin_ctl = -1,
  95. .hibernation = -1,
  96. };
  97. static const struct dwc2_core_params params_rk3066 = {
  98. .otg_cap = 2, /* non-HNP/non-SRP */
  99. .otg_ver = -1,
  100. .dma_desc_enable = 0,
  101. .dma_desc_fs_enable = 0,
  102. .speed = -1,
  103. .enable_dynamic_fifo = 1,
  104. .en_multiple_tx_fifo = -1,
  105. .host_rx_fifo_size = 525, /* 525 DWORDs */
  106. .host_nperio_tx_fifo_size = 128, /* 128 DWORDs */
  107. .host_perio_tx_fifo_size = 256, /* 256 DWORDs */
  108. .max_transfer_size = -1,
  109. .max_packet_count = -1,
  110. .host_channels = -1,
  111. .phy_type = -1,
  112. .phy_utmi_width = -1,
  113. .phy_ulpi_ddr = -1,
  114. .phy_ulpi_ext_vbus = -1,
  115. .i2c_enable = -1,
  116. .ulpi_fs_ls = -1,
  117. .host_support_fs_ls_low_power = -1,
  118. .host_ls_low_power_phy_clk = -1,
  119. .ts_dline = -1,
  120. .reload_ctl = -1,
  121. .ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
  122. GAHBCFG_HBSTLEN_SHIFT,
  123. .uframe_sched = -1,
  124. .external_id_pin_ctl = -1,
  125. .hibernation = -1,
  126. };
  127. static const struct dwc2_core_params params_ltq = {
  128. .otg_cap = 2, /* non-HNP/non-SRP */
  129. .otg_ver = -1,
  130. .dma_desc_enable = -1,
  131. .dma_desc_fs_enable = -1,
  132. .speed = -1,
  133. .enable_dynamic_fifo = -1,
  134. .en_multiple_tx_fifo = -1,
  135. .host_rx_fifo_size = 288, /* 288 DWORDs */
  136. .host_nperio_tx_fifo_size = 128, /* 128 DWORDs */
  137. .host_perio_tx_fifo_size = 96, /* 96 DWORDs */
  138. .max_transfer_size = 65535,
  139. .max_packet_count = 511,
  140. .host_channels = -1,
  141. .phy_type = -1,
  142. .phy_utmi_width = -1,
  143. .phy_ulpi_ddr = -1,
  144. .phy_ulpi_ext_vbus = -1,
  145. .i2c_enable = -1,
  146. .ulpi_fs_ls = -1,
  147. .host_support_fs_ls_low_power = -1,
  148. .host_ls_low_power_phy_clk = -1,
  149. .ts_dline = -1,
  150. .reload_ctl = -1,
  151. .ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
  152. GAHBCFG_HBSTLEN_SHIFT,
  153. .uframe_sched = -1,
  154. .external_id_pin_ctl = -1,
  155. .hibernation = -1,
  156. };
  157. static const struct dwc2_core_params params_amlogic = {
  158. .otg_cap = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE,
  159. .otg_ver = -1,
  160. .dma_desc_enable = 0,
  161. .dma_desc_fs_enable = 0,
  162. .speed = DWC2_SPEED_PARAM_HIGH,
  163. .enable_dynamic_fifo = 1,
  164. .en_multiple_tx_fifo = -1,
  165. .host_rx_fifo_size = 512,
  166. .host_nperio_tx_fifo_size = 500,
  167. .host_perio_tx_fifo_size = 500,
  168. .max_transfer_size = -1,
  169. .max_packet_count = -1,
  170. .host_channels = 16,
  171. .phy_type = DWC2_PHY_TYPE_PARAM_UTMI,
  172. .phy_utmi_width = -1,
  173. .phy_ulpi_ddr = -1,
  174. .phy_ulpi_ext_vbus = -1,
  175. .i2c_enable = -1,
  176. .ulpi_fs_ls = -1,
  177. .host_support_fs_ls_low_power = -1,
  178. .host_ls_low_power_phy_clk = -1,
  179. .ts_dline = -1,
  180. .reload_ctl = 1,
  181. .ahbcfg = GAHBCFG_HBSTLEN_INCR8 <<
  182. GAHBCFG_HBSTLEN_SHIFT,
  183. .uframe_sched = 0,
  184. .external_id_pin_ctl = -1,
  185. .hibernation = -1,
  186. };
  187. static const struct dwc2_core_params params_default = {
  188. .otg_cap = -1,
  189. .otg_ver = -1,
  190. /*
  191. * Disable descriptor dma mode by default as the HW can support
  192. * it, but does not support it for SPLIT transactions.
  193. * Disable it for FS devices as well.
  194. */
  195. .dma_desc_enable = 0,
  196. .dma_desc_fs_enable = 0,
  197. .speed = -1,
  198. .enable_dynamic_fifo = -1,
  199. .en_multiple_tx_fifo = -1,
  200. .host_rx_fifo_size = -1,
  201. .host_nperio_tx_fifo_size = -1,
  202. .host_perio_tx_fifo_size = -1,
  203. .max_transfer_size = -1,
  204. .max_packet_count = -1,
  205. .host_channels = -1,
  206. .phy_type = -1,
  207. .phy_utmi_width = -1,
  208. .phy_ulpi_ddr = -1,
  209. .phy_ulpi_ext_vbus = -1,
  210. .i2c_enable = -1,
  211. .ulpi_fs_ls = -1,
  212. .host_support_fs_ls_low_power = -1,
  213. .host_ls_low_power_phy_clk = -1,
  214. .ts_dline = -1,
  215. .reload_ctl = -1,
  216. .ahbcfg = -1,
  217. .uframe_sched = -1,
  218. .external_id_pin_ctl = -1,
  219. .hibernation = -1,
  220. };
  221. const struct of_device_id dwc2_of_match_table[] = {
  222. { .compatible = "brcm,bcm2835-usb", .data = &params_bcm2835 },
  223. { .compatible = "hisilicon,hi6220-usb", .data = &params_hi6220 },
  224. { .compatible = "rockchip,rk3066-usb", .data = &params_rk3066 },
  225. { .compatible = "lantiq,arx100-usb", .data = &params_ltq },
  226. { .compatible = "lantiq,xrx200-usb", .data = &params_ltq },
  227. { .compatible = "snps,dwc2", .data = NULL },
  228. { .compatible = "samsung,s3c6400-hsotg", .data = NULL},
  229. { .compatible = "amlogic,meson8b-usb", .data = &params_amlogic },
  230. { .compatible = "amlogic,meson-gxbb-usb", .data = &params_amlogic },
  231. { .compatible = "amcc,dwc-otg", .data = NULL },
  232. {},
  233. };
  234. MODULE_DEVICE_TABLE(of, dwc2_of_match_table);
  235. static void dwc2_get_device_property(struct dwc2_hsotg *hsotg,
  236. char *property, u8 size, u64 *value)
  237. {
  238. u32 val32;
  239. switch (size) {
  240. case 0:
  241. *value = device_property_read_bool(hsotg->dev, property);
  242. break;
  243. case 1:
  244. case 2:
  245. case 4:
  246. if (device_property_read_u32(hsotg->dev, property, &val32))
  247. return;
  248. *value = val32;
  249. break;
  250. case 8:
  251. if (device_property_read_u64(hsotg->dev, property, value))
  252. return;
  253. break;
  254. default:
  255. /*
  256. * The size is checked by the only function that calls
  257. * this so this should never happen.
  258. */
  259. WARN_ON(1);
  260. return;
  261. }
  262. }
  263. static void dwc2_set_core_param(void *param, u8 size, u64 value)
  264. {
  265. switch (size) {
  266. case 0:
  267. *((bool *)param) = !!value;
  268. break;
  269. case 1:
  270. *((u8 *)param) = (u8)value;
  271. break;
  272. case 2:
  273. *((u16 *)param) = (u16)value;
  274. break;
  275. case 4:
  276. *((u32 *)param) = (u32)value;
  277. break;
  278. case 8:
  279. *((u64 *)param) = (u64)value;
  280. break;
  281. default:
  282. /*
  283. * The size is checked by the only function that calls
  284. * this so this should never happen.
  285. */
  286. WARN_ON(1);
  287. return;
  288. }
  289. }
  290. /**
  291. * dwc2_set_param() - Set a core parameter
  292. *
  293. * @hsotg: Programming view of the DWC_otg controller
  294. * @param: Pointer to the parameter to set
  295. * @lookup: True if the property should be looked up
  296. * @property: The device property to read
  297. * @legacy: The param value to set if @property is not available. This
  298. * will typically be the legacy value set in the static
  299. * params structure.
  300. * @def: The default value
  301. * @min: The minimum value
  302. * @max: The maximum value
  303. * @size: The size of the core parameter in bytes, or 0 for bool.
  304. *
  305. * This function looks up @property and sets the @param to that value.
  306. * If the property doesn't exist it uses the passed-in @value. It will
  307. * verify that the value falls between @min and @max. If it doesn't,
  308. * it will output an error and set the parameter to either @def or,
  309. * failing that, to @min.
  310. *
  311. * The @size is used to write to @param and to query the device
  312. * properties so that this same function can be used with different
  313. * types of parameters.
  314. */
  315. static void dwc2_set_param(struct dwc2_hsotg *hsotg, void *param,
  316. bool lookup, char *property, u64 legacy,
  317. u64 def, u64 min, u64 max, u8 size)
  318. {
  319. u64 sizemax;
  320. u64 value;
  321. if (WARN_ON(!hsotg || !param || !property))
  322. return;
  323. if (WARN((size > 8) || ((size & (size - 1)) != 0),
  324. "Invalid size %d for %s\n", size, property))
  325. return;
  326. dev_vdbg(hsotg->dev, "%s: Setting %s: legacy=%llu, def=%llu, min=%llu, max=%llu, size=%d\n",
  327. __func__, property, legacy, def, min, max, size);
  328. sizemax = (1ULL << (size * 8)) - 1;
  329. value = legacy;
  330. /* Override legacy settings. */
  331. if (lookup)
  332. dwc2_get_device_property(hsotg, property, size, &value);
  333. /*
  334. * While the value is not valid, try setting it to the default
  335. * value, and failing that, set it to the minimum.
  336. */
  337. while ((value < min) || (value > max)) {
  338. /* Print an error unless the value is set to auto. */
  339. if (value != sizemax)
  340. dev_err(hsotg->dev, "Invalid value %llu for param %s\n",
  341. value, property);
  342. /*
  343. * If we are already the default, just set it to the
  344. * minimum.
  345. */
  346. if (value == def) {
  347. dev_vdbg(hsotg->dev, "%s: setting value to min=%llu\n",
  348. __func__, min);
  349. value = min;
  350. break;
  351. }
  352. /* Try the default value */
  353. dev_vdbg(hsotg->dev, "%s: setting value to default=%llu\n",
  354. __func__, def);
  355. value = def;
  356. }
  357. dev_dbg(hsotg->dev, "Setting %s to %llu\n", property, value);
  358. dwc2_set_core_param(param, size, value);
  359. }
  360. /**
  361. * dwc2_set_param_u32() - Set a u32 parameter
  362. *
  363. * See dwc2_set_param().
  364. */
  365. static void dwc2_set_param_u32(struct dwc2_hsotg *hsotg, u32 *param,
  366. bool lookup, char *property, u16 legacy,
  367. u16 def, u16 min, u16 max)
  368. {
  369. dwc2_set_param(hsotg, param, lookup, property,
  370. legacy, def, min, max, 4);
  371. }
  372. /**
  373. * dwc2_set_param_bool() - Set a bool parameter
  374. *
  375. * See dwc2_set_param().
  376. *
  377. * Note: there is no 'legacy' argument here because there is no legacy
  378. * source of bool params.
  379. */
  380. static void dwc2_set_param_bool(struct dwc2_hsotg *hsotg, bool *param,
  381. bool lookup, char *property,
  382. bool def, bool min, bool max)
  383. {
  384. dwc2_set_param(hsotg, param, lookup, property,
  385. def, def, min, max, 0);
  386. }
  387. #define DWC2_OUT_OF_BOUNDS(a, b, c) ((a) < (b) || (a) > (c))
  388. /* Parameter access functions */
  389. static void dwc2_set_param_otg_cap(struct dwc2_hsotg *hsotg, int val)
  390. {
  391. int valid = 1;
  392. switch (val) {
  393. case DWC2_CAP_PARAM_HNP_SRP_CAPABLE:
  394. if (hsotg->hw_params.op_mode != GHWCFG2_OP_MODE_HNP_SRP_CAPABLE)
  395. valid = 0;
  396. break;
  397. case DWC2_CAP_PARAM_SRP_ONLY_CAPABLE:
  398. switch (hsotg->hw_params.op_mode) {
  399. case GHWCFG2_OP_MODE_HNP_SRP_CAPABLE:
  400. case GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE:
  401. case GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE:
  402. case GHWCFG2_OP_MODE_SRP_CAPABLE_HOST:
  403. break;
  404. default:
  405. valid = 0;
  406. break;
  407. }
  408. break;
  409. case DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE:
  410. /* always valid */
  411. break;
  412. default:
  413. valid = 0;
  414. break;
  415. }
  416. if (!valid) {
  417. if (val >= 0)
  418. dev_err(hsotg->dev,
  419. "%d invalid for otg_cap parameter. Check HW configuration.\n",
  420. val);
  421. switch (hsotg->hw_params.op_mode) {
  422. case GHWCFG2_OP_MODE_HNP_SRP_CAPABLE:
  423. val = DWC2_CAP_PARAM_HNP_SRP_CAPABLE;
  424. break;
  425. case GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE:
  426. case GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE:
  427. case GHWCFG2_OP_MODE_SRP_CAPABLE_HOST:
  428. val = DWC2_CAP_PARAM_SRP_ONLY_CAPABLE;
  429. break;
  430. default:
  431. val = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE;
  432. break;
  433. }
  434. dev_dbg(hsotg->dev, "Setting otg_cap to %d\n", val);
  435. }
  436. hsotg->params.otg_cap = val;
  437. }
  438. static void dwc2_set_param_dma_desc_enable(struct dwc2_hsotg *hsotg, int val)
  439. {
  440. int valid = 1;
  441. if (val > 0 && (hsotg->params.host_dma <= 0 ||
  442. !hsotg->hw_params.dma_desc_enable))
  443. valid = 0;
  444. if (val < 0)
  445. valid = 0;
  446. if (!valid) {
  447. if (val >= 0)
  448. dev_err(hsotg->dev,
  449. "%d invalid for dma_desc_enable parameter. Check HW configuration.\n",
  450. val);
  451. val = (hsotg->params.host_dma > 0 &&
  452. hsotg->hw_params.dma_desc_enable);
  453. dev_dbg(hsotg->dev, "Setting dma_desc_enable to %d\n", val);
  454. }
  455. hsotg->params.dma_desc_enable = val;
  456. }
  457. static void dwc2_set_param_dma_desc_fs_enable(struct dwc2_hsotg *hsotg, int val)
  458. {
  459. int valid = 1;
  460. if (val > 0 && (hsotg->params.host_dma <= 0 ||
  461. !hsotg->hw_params.dma_desc_enable))
  462. valid = 0;
  463. if (val < 0)
  464. valid = 0;
  465. if (!valid) {
  466. if (val >= 0)
  467. dev_err(hsotg->dev,
  468. "%d invalid for dma_desc_fs_enable parameter. Check HW configuration.\n",
  469. val);
  470. val = (hsotg->params.host_dma > 0 &&
  471. hsotg->hw_params.dma_desc_enable);
  472. }
  473. hsotg->params.dma_desc_fs_enable = val;
  474. dev_dbg(hsotg->dev, "Setting dma_desc_fs_enable to %d\n", val);
  475. }
  476. static void
  477. dwc2_set_param_host_support_fs_ls_low_power(struct dwc2_hsotg *hsotg,
  478. int val)
  479. {
  480. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  481. if (val >= 0) {
  482. dev_err(hsotg->dev,
  483. "Wrong value for host_support_fs_low_power\n");
  484. dev_err(hsotg->dev,
  485. "host_support_fs_low_power must be 0 or 1\n");
  486. }
  487. val = 0;
  488. dev_dbg(hsotg->dev,
  489. "Setting host_support_fs_low_power to %d\n", val);
  490. }
  491. hsotg->params.host_support_fs_ls_low_power = val;
  492. }
  493. static void dwc2_set_param_enable_dynamic_fifo(struct dwc2_hsotg *hsotg,
  494. int val)
  495. {
  496. int valid = 1;
  497. if (val > 0 && !hsotg->hw_params.enable_dynamic_fifo)
  498. valid = 0;
  499. if (val < 0)
  500. valid = 0;
  501. if (!valid) {
  502. if (val >= 0)
  503. dev_err(hsotg->dev,
  504. "%d invalid for enable_dynamic_fifo parameter. Check HW configuration.\n",
  505. val);
  506. val = hsotg->hw_params.enable_dynamic_fifo;
  507. dev_dbg(hsotg->dev, "Setting enable_dynamic_fifo to %d\n", val);
  508. }
  509. hsotg->params.enable_dynamic_fifo = val;
  510. }
  511. static void dwc2_set_param_host_rx_fifo_size(struct dwc2_hsotg *hsotg, int val)
  512. {
  513. int valid = 1;
  514. if (val < 16 || val > hsotg->hw_params.rx_fifo_size)
  515. valid = 0;
  516. if (!valid) {
  517. if (val >= 0)
  518. dev_err(hsotg->dev,
  519. "%d invalid for host_rx_fifo_size. Check HW configuration.\n",
  520. val);
  521. val = hsotg->hw_params.rx_fifo_size;
  522. dev_dbg(hsotg->dev, "Setting host_rx_fifo_size to %d\n", val);
  523. }
  524. hsotg->params.host_rx_fifo_size = val;
  525. }
  526. static void dwc2_set_param_host_nperio_tx_fifo_size(struct dwc2_hsotg *hsotg,
  527. int val)
  528. {
  529. int valid = 1;
  530. if (val < 16 || val > hsotg->hw_params.host_nperio_tx_fifo_size)
  531. valid = 0;
  532. if (!valid) {
  533. if (val >= 0)
  534. dev_err(hsotg->dev,
  535. "%d invalid for host_nperio_tx_fifo_size. Check HW configuration.\n",
  536. val);
  537. val = hsotg->hw_params.host_nperio_tx_fifo_size;
  538. dev_dbg(hsotg->dev, "Setting host_nperio_tx_fifo_size to %d\n",
  539. val);
  540. }
  541. hsotg->params.host_nperio_tx_fifo_size = val;
  542. }
  543. static void dwc2_set_param_host_perio_tx_fifo_size(struct dwc2_hsotg *hsotg,
  544. int val)
  545. {
  546. int valid = 1;
  547. if (val < 16 || val > hsotg->hw_params.host_perio_tx_fifo_size)
  548. valid = 0;
  549. if (!valid) {
  550. if (val >= 0)
  551. dev_err(hsotg->dev,
  552. "%d invalid for host_perio_tx_fifo_size. Check HW configuration.\n",
  553. val);
  554. val = hsotg->hw_params.host_perio_tx_fifo_size;
  555. dev_dbg(hsotg->dev, "Setting host_perio_tx_fifo_size to %d\n",
  556. val);
  557. }
  558. hsotg->params.host_perio_tx_fifo_size = val;
  559. }
  560. static void dwc2_set_param_max_transfer_size(struct dwc2_hsotg *hsotg, int val)
  561. {
  562. int valid = 1;
  563. if (val < 2047 || val > hsotg->hw_params.max_transfer_size)
  564. valid = 0;
  565. if (!valid) {
  566. if (val >= 0)
  567. dev_err(hsotg->dev,
  568. "%d invalid for max_transfer_size. Check HW configuration.\n",
  569. val);
  570. val = hsotg->hw_params.max_transfer_size;
  571. dev_dbg(hsotg->dev, "Setting max_transfer_size to %d\n", val);
  572. }
  573. hsotg->params.max_transfer_size = val;
  574. }
  575. static void dwc2_set_param_max_packet_count(struct dwc2_hsotg *hsotg, int val)
  576. {
  577. int valid = 1;
  578. if (val < 15 || val > hsotg->hw_params.max_packet_count)
  579. valid = 0;
  580. if (!valid) {
  581. if (val >= 0)
  582. dev_err(hsotg->dev,
  583. "%d invalid for max_packet_count. Check HW configuration.\n",
  584. val);
  585. val = hsotg->hw_params.max_packet_count;
  586. dev_dbg(hsotg->dev, "Setting max_packet_count to %d\n", val);
  587. }
  588. hsotg->params.max_packet_count = val;
  589. }
  590. static void dwc2_set_param_host_channels(struct dwc2_hsotg *hsotg, int val)
  591. {
  592. int valid = 1;
  593. if (val < 1 || val > hsotg->hw_params.host_channels)
  594. valid = 0;
  595. if (!valid) {
  596. if (val >= 0)
  597. dev_err(hsotg->dev,
  598. "%d invalid for host_channels. Check HW configuration.\n",
  599. val);
  600. val = hsotg->hw_params.host_channels;
  601. dev_dbg(hsotg->dev, "Setting host_channels to %d\n", val);
  602. }
  603. hsotg->params.host_channels = val;
  604. }
  605. static void dwc2_set_param_phy_type(struct dwc2_hsotg *hsotg, int val)
  606. {
  607. int valid = 0;
  608. u32 hs_phy_type, fs_phy_type;
  609. if (DWC2_OUT_OF_BOUNDS(val, DWC2_PHY_TYPE_PARAM_FS,
  610. DWC2_PHY_TYPE_PARAM_ULPI)) {
  611. if (val >= 0) {
  612. dev_err(hsotg->dev, "Wrong value for phy_type\n");
  613. dev_err(hsotg->dev, "phy_type must be 0, 1 or 2\n");
  614. }
  615. valid = 0;
  616. }
  617. hs_phy_type = hsotg->hw_params.hs_phy_type;
  618. fs_phy_type = hsotg->hw_params.fs_phy_type;
  619. if (val == DWC2_PHY_TYPE_PARAM_UTMI &&
  620. (hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI ||
  621. hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI))
  622. valid = 1;
  623. else if (val == DWC2_PHY_TYPE_PARAM_ULPI &&
  624. (hs_phy_type == GHWCFG2_HS_PHY_TYPE_ULPI ||
  625. hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI))
  626. valid = 1;
  627. else if (val == DWC2_PHY_TYPE_PARAM_FS &&
  628. fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED)
  629. valid = 1;
  630. if (!valid) {
  631. if (val >= 0)
  632. dev_err(hsotg->dev,
  633. "%d invalid for phy_type. Check HW configuration.\n",
  634. val);
  635. val = DWC2_PHY_TYPE_PARAM_FS;
  636. if (hs_phy_type != GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED) {
  637. if (hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI ||
  638. hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI)
  639. val = DWC2_PHY_TYPE_PARAM_UTMI;
  640. else
  641. val = DWC2_PHY_TYPE_PARAM_ULPI;
  642. }
  643. dev_dbg(hsotg->dev, "Setting phy_type to %d\n", val);
  644. }
  645. hsotg->params.phy_type = val;
  646. }
  647. static int dwc2_get_param_phy_type(struct dwc2_hsotg *hsotg)
  648. {
  649. return hsotg->params.phy_type;
  650. }
  651. static void dwc2_set_param_speed(struct dwc2_hsotg *hsotg, int val)
  652. {
  653. int valid = 1;
  654. if (DWC2_OUT_OF_BOUNDS(val, 0, 2)) {
  655. if (val >= 0) {
  656. dev_err(hsotg->dev, "Wrong value for speed parameter\n");
  657. dev_err(hsotg->dev, "max_speed parameter must be 0, 1, or 2\n");
  658. }
  659. valid = 0;
  660. }
  661. if (dwc2_is_hs_iot(hsotg) &&
  662. val == DWC2_SPEED_PARAM_LOW)
  663. valid = 0;
  664. if (val == DWC2_SPEED_PARAM_HIGH &&
  665. dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS)
  666. valid = 0;
  667. if (!valid) {
  668. if (val >= 0)
  669. dev_err(hsotg->dev,
  670. "%d invalid for speed parameter. Check HW configuration.\n",
  671. val);
  672. val = dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS ?
  673. DWC2_SPEED_PARAM_FULL : DWC2_SPEED_PARAM_HIGH;
  674. dev_dbg(hsotg->dev, "Setting speed to %d\n", val);
  675. }
  676. hsotg->params.speed = val;
  677. }
  678. static void dwc2_set_param_host_ls_low_power_phy_clk(struct dwc2_hsotg *hsotg,
  679. int val)
  680. {
  681. int valid = 1;
  682. if (DWC2_OUT_OF_BOUNDS(val, DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ,
  683. DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ)) {
  684. if (val >= 0) {
  685. dev_err(hsotg->dev,
  686. "Wrong value for host_ls_low_power_phy_clk parameter\n");
  687. dev_err(hsotg->dev,
  688. "host_ls_low_power_phy_clk must be 0 or 1\n");
  689. }
  690. valid = 0;
  691. }
  692. if (val == DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ &&
  693. dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS)
  694. valid = 0;
  695. if (!valid) {
  696. if (val >= 0)
  697. dev_err(hsotg->dev,
  698. "%d invalid for host_ls_low_power_phy_clk. Check HW configuration.\n",
  699. val);
  700. val = dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS
  701. ? DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ
  702. : DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ;
  703. dev_dbg(hsotg->dev, "Setting host_ls_low_power_phy_clk to %d\n",
  704. val);
  705. }
  706. hsotg->params.host_ls_low_power_phy_clk = val;
  707. }
  708. static void dwc2_set_param_phy_ulpi_ddr(struct dwc2_hsotg *hsotg, int val)
  709. {
  710. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  711. if (val >= 0) {
  712. dev_err(hsotg->dev, "Wrong value for phy_ulpi_ddr\n");
  713. dev_err(hsotg->dev, "phy_upli_ddr must be 0 or 1\n");
  714. }
  715. val = 0;
  716. dev_dbg(hsotg->dev, "Setting phy_upli_ddr to %d\n", val);
  717. }
  718. hsotg->params.phy_ulpi_ddr = val;
  719. }
  720. static void dwc2_set_param_phy_ulpi_ext_vbus(struct dwc2_hsotg *hsotg, int val)
  721. {
  722. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  723. if (val >= 0) {
  724. dev_err(hsotg->dev,
  725. "Wrong value for phy_ulpi_ext_vbus\n");
  726. dev_err(hsotg->dev,
  727. "phy_ulpi_ext_vbus must be 0 or 1\n");
  728. }
  729. val = 0;
  730. dev_dbg(hsotg->dev, "Setting phy_ulpi_ext_vbus to %d\n", val);
  731. }
  732. hsotg->params.phy_ulpi_ext_vbus = val;
  733. }
  734. static void dwc2_set_param_phy_utmi_width(struct dwc2_hsotg *hsotg, int val)
  735. {
  736. int valid = 0;
  737. switch (hsotg->hw_params.utmi_phy_data_width) {
  738. case GHWCFG4_UTMI_PHY_DATA_WIDTH_8:
  739. valid = (val == 8);
  740. break;
  741. case GHWCFG4_UTMI_PHY_DATA_WIDTH_16:
  742. valid = (val == 16);
  743. break;
  744. case GHWCFG4_UTMI_PHY_DATA_WIDTH_8_OR_16:
  745. valid = (val == 8 || val == 16);
  746. break;
  747. }
  748. if (!valid) {
  749. if (val >= 0) {
  750. dev_err(hsotg->dev,
  751. "%d invalid for phy_utmi_width. Check HW configuration.\n",
  752. val);
  753. }
  754. val = (hsotg->hw_params.utmi_phy_data_width ==
  755. GHWCFG4_UTMI_PHY_DATA_WIDTH_8) ? 8 : 16;
  756. dev_dbg(hsotg->dev, "Setting phy_utmi_width to %d\n", val);
  757. }
  758. hsotg->params.phy_utmi_width = val;
  759. }
  760. static void dwc2_set_param_ulpi_fs_ls(struct dwc2_hsotg *hsotg, int val)
  761. {
  762. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  763. if (val >= 0) {
  764. dev_err(hsotg->dev, "Wrong value for ulpi_fs_ls\n");
  765. dev_err(hsotg->dev, "ulpi_fs_ls must be 0 or 1\n");
  766. }
  767. val = 0;
  768. dev_dbg(hsotg->dev, "Setting ulpi_fs_ls to %d\n", val);
  769. }
  770. hsotg->params.ulpi_fs_ls = val;
  771. }
  772. static void dwc2_set_param_ts_dline(struct dwc2_hsotg *hsotg, int val)
  773. {
  774. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  775. if (val >= 0) {
  776. dev_err(hsotg->dev, "Wrong value for ts_dline\n");
  777. dev_err(hsotg->dev, "ts_dline must be 0 or 1\n");
  778. }
  779. val = 0;
  780. dev_dbg(hsotg->dev, "Setting ts_dline to %d\n", val);
  781. }
  782. hsotg->params.ts_dline = val;
  783. }
  784. static void dwc2_set_param_i2c_enable(struct dwc2_hsotg *hsotg, int val)
  785. {
  786. int valid = 1;
  787. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  788. if (val >= 0) {
  789. dev_err(hsotg->dev, "Wrong value for i2c_enable\n");
  790. dev_err(hsotg->dev, "i2c_enable must be 0 or 1\n");
  791. }
  792. valid = 0;
  793. }
  794. if (val == 1 && !(hsotg->hw_params.i2c_enable))
  795. valid = 0;
  796. if (!valid) {
  797. if (val >= 0)
  798. dev_err(hsotg->dev,
  799. "%d invalid for i2c_enable. Check HW configuration.\n",
  800. val);
  801. val = hsotg->hw_params.i2c_enable;
  802. dev_dbg(hsotg->dev, "Setting i2c_enable to %d\n", val);
  803. }
  804. hsotg->params.i2c_enable = val;
  805. }
  806. static void dwc2_set_param_en_multiple_tx_fifo(struct dwc2_hsotg *hsotg,
  807. int val)
  808. {
  809. int valid = 1;
  810. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  811. if (val >= 0) {
  812. dev_err(hsotg->dev,
  813. "Wrong value for en_multiple_tx_fifo,\n");
  814. dev_err(hsotg->dev,
  815. "en_multiple_tx_fifo must be 0 or 1\n");
  816. }
  817. valid = 0;
  818. }
  819. if (val == 1 && !hsotg->hw_params.en_multiple_tx_fifo)
  820. valid = 0;
  821. if (!valid) {
  822. if (val >= 0)
  823. dev_err(hsotg->dev,
  824. "%d invalid for parameter en_multiple_tx_fifo. Check HW configuration.\n",
  825. val);
  826. val = hsotg->hw_params.en_multiple_tx_fifo;
  827. dev_dbg(hsotg->dev, "Setting en_multiple_tx_fifo to %d\n", val);
  828. }
  829. hsotg->params.en_multiple_tx_fifo = val;
  830. }
  831. static void dwc2_set_param_reload_ctl(struct dwc2_hsotg *hsotg, int val)
  832. {
  833. int valid = 1;
  834. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  835. if (val >= 0) {
  836. dev_err(hsotg->dev,
  837. "'%d' invalid for parameter reload_ctl\n", val);
  838. dev_err(hsotg->dev, "reload_ctl must be 0 or 1\n");
  839. }
  840. valid = 0;
  841. }
  842. if (val == 1 && hsotg->hw_params.snpsid < DWC2_CORE_REV_2_92a)
  843. valid = 0;
  844. if (!valid) {
  845. if (val >= 0)
  846. dev_err(hsotg->dev,
  847. "%d invalid for parameter reload_ctl. Check HW configuration.\n",
  848. val);
  849. val = hsotg->hw_params.snpsid >= DWC2_CORE_REV_2_92a;
  850. dev_dbg(hsotg->dev, "Setting reload_ctl to %d\n", val);
  851. }
  852. hsotg->params.reload_ctl = val;
  853. }
  854. static void dwc2_set_param_ahbcfg(struct dwc2_hsotg *hsotg, int val)
  855. {
  856. if (val != -1)
  857. hsotg->params.ahbcfg = val;
  858. else
  859. hsotg->params.ahbcfg = GAHBCFG_HBSTLEN_INCR4 <<
  860. GAHBCFG_HBSTLEN_SHIFT;
  861. }
  862. static void dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val)
  863. {
  864. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  865. if (val >= 0) {
  866. dev_err(hsotg->dev,
  867. "'%d' invalid for parameter otg_ver\n", val);
  868. dev_err(hsotg->dev,
  869. "otg_ver must be 0 (for OTG 1.3 support) or 1 (for OTG 2.0 support)\n");
  870. }
  871. val = 0;
  872. dev_dbg(hsotg->dev, "Setting otg_ver to %d\n", val);
  873. }
  874. hsotg->params.otg_ver = val;
  875. }
  876. static void dwc2_set_param_uframe_sched(struct dwc2_hsotg *hsotg, int val)
  877. {
  878. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  879. if (val >= 0) {
  880. dev_err(hsotg->dev,
  881. "'%d' invalid for parameter uframe_sched\n",
  882. val);
  883. dev_err(hsotg->dev, "uframe_sched must be 0 or 1\n");
  884. }
  885. val = 1;
  886. dev_dbg(hsotg->dev, "Setting uframe_sched to %d\n", val);
  887. }
  888. hsotg->params.uframe_sched = val;
  889. }
  890. static void dwc2_set_param_external_id_pin_ctl(struct dwc2_hsotg *hsotg,
  891. int val)
  892. {
  893. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  894. if (val >= 0) {
  895. dev_err(hsotg->dev,
  896. "'%d' invalid for parameter external_id_pin_ctl\n",
  897. val);
  898. dev_err(hsotg->dev, "external_id_pin_ctl must be 0 or 1\n");
  899. }
  900. val = 0;
  901. dev_dbg(hsotg->dev, "Setting external_id_pin_ctl to %d\n", val);
  902. }
  903. hsotg->params.external_id_pin_ctl = val;
  904. }
  905. static void dwc2_set_param_hibernation(struct dwc2_hsotg *hsotg,
  906. int val)
  907. {
  908. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  909. if (val >= 0) {
  910. dev_err(hsotg->dev,
  911. "'%d' invalid for parameter hibernation\n",
  912. val);
  913. dev_err(hsotg->dev, "hibernation must be 0 or 1\n");
  914. }
  915. val = 0;
  916. dev_dbg(hsotg->dev, "Setting hibernation to %d\n", val);
  917. }
  918. hsotg->params.hibernation = val;
  919. }
  920. static void dwc2_set_param_tx_fifo_sizes(struct dwc2_hsotg *hsotg)
  921. {
  922. int i;
  923. int num;
  924. char *property = "g-tx-fifo-size";
  925. struct dwc2_core_params *p = &hsotg->params;
  926. memset(p->g_tx_fifo_size, 0, sizeof(p->g_tx_fifo_size));
  927. /* Read tx fifo sizes */
  928. num = device_property_read_u32_array(hsotg->dev, property, NULL, 0);
  929. if (num > 0) {
  930. device_property_read_u32_array(hsotg->dev, property,
  931. &p->g_tx_fifo_size[1],
  932. num);
  933. } else {
  934. u32 p_tx_fifo[] = DWC2_G_P_LEGACY_TX_FIFO_SIZE;
  935. memcpy(&p->g_tx_fifo_size[1],
  936. p_tx_fifo,
  937. sizeof(p_tx_fifo));
  938. num = ARRAY_SIZE(p_tx_fifo);
  939. }
  940. for (i = 0; i < num; i++) {
  941. if ((i + 1) >= ARRAY_SIZE(p->g_tx_fifo_size))
  942. break;
  943. dev_dbg(hsotg->dev, "Setting %s[%d] to %d\n",
  944. property, i + 1, p->g_tx_fifo_size[i + 1]);
  945. }
  946. }
  947. static void dwc2_set_gadget_dma(struct dwc2_hsotg *hsotg)
  948. {
  949. struct dwc2_hw_params *hw = &hsotg->hw_params;
  950. struct dwc2_core_params *p = &hsotg->params;
  951. bool dma_capable = !(hw->arch == GHWCFG2_SLAVE_ONLY_ARCH);
  952. /* Buffer DMA */
  953. dwc2_set_param_bool(hsotg, &p->g_dma,
  954. false, "gadget-dma",
  955. dma_capable, false,
  956. dma_capable);
  957. /* DMA Descriptor */
  958. dwc2_set_param_bool(hsotg, &p->g_dma_desc, false,
  959. "gadget-dma-desc",
  960. !!hw->dma_desc_enable, false,
  961. !!hw->dma_desc_enable);
  962. }
  963. /**
  964. * dwc2_set_parameters() - Set all core parameters.
  965. *
  966. * @hsotg: Programming view of the DWC_otg controller
  967. * @params: The parameters to set
  968. */
  969. static void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
  970. const struct dwc2_core_params *params)
  971. {
  972. struct dwc2_hw_params *hw = &hsotg->hw_params;
  973. struct dwc2_core_params *p = &hsotg->params;
  974. bool dma_capable = !(hw->arch == GHWCFG2_SLAVE_ONLY_ARCH);
  975. dwc2_set_param_otg_cap(hsotg, params->otg_cap);
  976. if ((hsotg->dr_mode == USB_DR_MODE_HOST) ||
  977. (hsotg->dr_mode == USB_DR_MODE_OTG)) {
  978. dev_dbg(hsotg->dev, "Setting HOST parameters\n");
  979. dwc2_set_param_bool(hsotg, &p->host_dma,
  980. false, "host-dma",
  981. dma_capable, false,
  982. dma_capable);
  983. dwc2_set_param_host_rx_fifo_size(hsotg,
  984. params->host_rx_fifo_size);
  985. dwc2_set_param_host_nperio_tx_fifo_size(hsotg,
  986. params->host_nperio_tx_fifo_size);
  987. dwc2_set_param_host_perio_tx_fifo_size(hsotg,
  988. params->host_perio_tx_fifo_size);
  989. }
  990. dwc2_set_param_dma_desc_enable(hsotg, params->dma_desc_enable);
  991. dwc2_set_param_dma_desc_fs_enable(hsotg, params->dma_desc_fs_enable);
  992. dwc2_set_param_host_support_fs_ls_low_power(hsotg,
  993. params->host_support_fs_ls_low_power);
  994. dwc2_set_param_enable_dynamic_fifo(hsotg,
  995. params->enable_dynamic_fifo);
  996. dwc2_set_param_max_transfer_size(hsotg,
  997. params->max_transfer_size);
  998. dwc2_set_param_max_packet_count(hsotg,
  999. params->max_packet_count);
  1000. dwc2_set_param_host_channels(hsotg, params->host_channels);
  1001. dwc2_set_param_phy_type(hsotg, params->phy_type);
  1002. dwc2_set_param_speed(hsotg, params->speed);
  1003. dwc2_set_param_host_ls_low_power_phy_clk(hsotg,
  1004. params->host_ls_low_power_phy_clk);
  1005. dwc2_set_param_phy_ulpi_ddr(hsotg, params->phy_ulpi_ddr);
  1006. dwc2_set_param_phy_ulpi_ext_vbus(hsotg,
  1007. params->phy_ulpi_ext_vbus);
  1008. dwc2_set_param_phy_utmi_width(hsotg, params->phy_utmi_width);
  1009. dwc2_set_param_ulpi_fs_ls(hsotg, params->ulpi_fs_ls);
  1010. dwc2_set_param_ts_dline(hsotg, params->ts_dline);
  1011. dwc2_set_param_i2c_enable(hsotg, params->i2c_enable);
  1012. dwc2_set_param_en_multiple_tx_fifo(hsotg,
  1013. params->en_multiple_tx_fifo);
  1014. dwc2_set_param_reload_ctl(hsotg, params->reload_ctl);
  1015. dwc2_set_param_ahbcfg(hsotg, params->ahbcfg);
  1016. dwc2_set_param_otg_ver(hsotg, params->otg_ver);
  1017. dwc2_set_param_uframe_sched(hsotg, params->uframe_sched);
  1018. dwc2_set_param_external_id_pin_ctl(hsotg, params->external_id_pin_ctl);
  1019. dwc2_set_param_hibernation(hsotg, params->hibernation);
  1020. /*
  1021. * Set devicetree-only parameters. These parameters do not
  1022. * take any values from @params.
  1023. */
  1024. if ((hsotg->dr_mode == USB_DR_MODE_PERIPHERAL) ||
  1025. (hsotg->dr_mode == USB_DR_MODE_OTG)) {
  1026. dev_dbg(hsotg->dev, "Setting peripheral device properties\n");
  1027. dwc2_set_gadget_dma(hsotg);
  1028. /*
  1029. * The values for g_rx_fifo_size (2048) and
  1030. * g_np_tx_fifo_size (1024) come from the legacy s3c
  1031. * gadget driver. These defaults have been hard-coded
  1032. * for some time so many platforms depend on these
  1033. * values. Leave them as defaults for now and only
  1034. * auto-detect if the hardware does not support the
  1035. * default.
  1036. */
  1037. dwc2_set_param_u32(hsotg, &p->g_rx_fifo_size,
  1038. true, "g-rx-fifo-size", 2048,
  1039. hw->rx_fifo_size,
  1040. 16, hw->rx_fifo_size);
  1041. dwc2_set_param_u32(hsotg, &p->g_np_tx_fifo_size,
  1042. true, "g-np-tx-fifo-size", 1024,
  1043. hw->dev_nperio_tx_fifo_size,
  1044. 16, hw->dev_nperio_tx_fifo_size);
  1045. dwc2_set_param_tx_fifo_sizes(hsotg);
  1046. }
  1047. }
  1048. /*
  1049. * Gets host hardware parameters. Forces host mode if not currently in
  1050. * host mode. Should be called immediately after a core soft reset in
  1051. * order to get the reset values.
  1052. */
  1053. static void dwc2_get_host_hwparams(struct dwc2_hsotg *hsotg)
  1054. {
  1055. struct dwc2_hw_params *hw = &hsotg->hw_params;
  1056. u32 gnptxfsiz;
  1057. u32 hptxfsiz;
  1058. bool forced;
  1059. if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
  1060. return;
  1061. forced = dwc2_force_mode_if_needed(hsotg, true);
  1062. gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ);
  1063. hptxfsiz = dwc2_readl(hsotg->regs + HPTXFSIZ);
  1064. dev_dbg(hsotg->dev, "gnptxfsiz=%08x\n", gnptxfsiz);
  1065. dev_dbg(hsotg->dev, "hptxfsiz=%08x\n", hptxfsiz);
  1066. if (forced)
  1067. dwc2_clear_force_mode(hsotg);
  1068. hw->host_nperio_tx_fifo_size = (gnptxfsiz & FIFOSIZE_DEPTH_MASK) >>
  1069. FIFOSIZE_DEPTH_SHIFT;
  1070. hw->host_perio_tx_fifo_size = (hptxfsiz & FIFOSIZE_DEPTH_MASK) >>
  1071. FIFOSIZE_DEPTH_SHIFT;
  1072. }
  1073. /*
  1074. * Gets device hardware parameters. Forces device mode if not
  1075. * currently in device mode. Should be called immediately after a core
  1076. * soft reset in order to get the reset values.
  1077. */
  1078. static void dwc2_get_dev_hwparams(struct dwc2_hsotg *hsotg)
  1079. {
  1080. struct dwc2_hw_params *hw = &hsotg->hw_params;
  1081. bool forced;
  1082. u32 gnptxfsiz;
  1083. if (hsotg->dr_mode == USB_DR_MODE_HOST)
  1084. return;
  1085. forced = dwc2_force_mode_if_needed(hsotg, false);
  1086. gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ);
  1087. dev_dbg(hsotg->dev, "gnptxfsiz=%08x\n", gnptxfsiz);
  1088. if (forced)
  1089. dwc2_clear_force_mode(hsotg);
  1090. hw->dev_nperio_tx_fifo_size = (gnptxfsiz & FIFOSIZE_DEPTH_MASK) >>
  1091. FIFOSIZE_DEPTH_SHIFT;
  1092. }
  1093. /**
  1094. * During device initialization, read various hardware configuration
  1095. * registers and interpret the contents.
  1096. */
  1097. int dwc2_get_hwparams(struct dwc2_hsotg *hsotg)
  1098. {
  1099. struct dwc2_hw_params *hw = &hsotg->hw_params;
  1100. unsigned int width;
  1101. u32 hwcfg1, hwcfg2, hwcfg3, hwcfg4;
  1102. u32 grxfsiz;
  1103. /*
  1104. * Attempt to ensure this device is really a DWC_otg Controller.
  1105. * Read and verify the GSNPSID register contents. The value should be
  1106. * 0x45f42xxx or 0x45f43xxx, which corresponds to either "OT2" or "OT3",
  1107. * as in "OTG version 2.xx" or "OTG version 3.xx".
  1108. */
  1109. hw->snpsid = dwc2_readl(hsotg->regs + GSNPSID);
  1110. if ((hw->snpsid & 0xfffff000) != 0x4f542000 &&
  1111. (hw->snpsid & 0xfffff000) != 0x4f543000 &&
  1112. (hw->snpsid & 0xffff0000) != 0x55310000 &&
  1113. (hw->snpsid & 0xffff0000) != 0x55320000) {
  1114. dev_err(hsotg->dev, "Bad value for GSNPSID: 0x%08x\n",
  1115. hw->snpsid);
  1116. return -ENODEV;
  1117. }
  1118. dev_dbg(hsotg->dev, "Core Release: %1x.%1x%1x%1x (snpsid=%x)\n",
  1119. hw->snpsid >> 12 & 0xf, hw->snpsid >> 8 & 0xf,
  1120. hw->snpsid >> 4 & 0xf, hw->snpsid & 0xf, hw->snpsid);
  1121. hwcfg1 = dwc2_readl(hsotg->regs + GHWCFG1);
  1122. hwcfg2 = dwc2_readl(hsotg->regs + GHWCFG2);
  1123. hwcfg3 = dwc2_readl(hsotg->regs + GHWCFG3);
  1124. hwcfg4 = dwc2_readl(hsotg->regs + GHWCFG4);
  1125. grxfsiz = dwc2_readl(hsotg->regs + GRXFSIZ);
  1126. dev_dbg(hsotg->dev, "hwcfg1=%08x\n", hwcfg1);
  1127. dev_dbg(hsotg->dev, "hwcfg2=%08x\n", hwcfg2);
  1128. dev_dbg(hsotg->dev, "hwcfg3=%08x\n", hwcfg3);
  1129. dev_dbg(hsotg->dev, "hwcfg4=%08x\n", hwcfg4);
  1130. dev_dbg(hsotg->dev, "grxfsiz=%08x\n", grxfsiz);
  1131. /*
  1132. * Host specific hardware parameters. Reading these parameters
  1133. * requires the controller to be in host mode. The mode will
  1134. * be forced, if necessary, to read these values.
  1135. */
  1136. dwc2_get_host_hwparams(hsotg);
  1137. dwc2_get_dev_hwparams(hsotg);
  1138. /* hwcfg1 */
  1139. hw->dev_ep_dirs = hwcfg1;
  1140. /* hwcfg2 */
  1141. hw->op_mode = (hwcfg2 & GHWCFG2_OP_MODE_MASK) >>
  1142. GHWCFG2_OP_MODE_SHIFT;
  1143. hw->arch = (hwcfg2 & GHWCFG2_ARCHITECTURE_MASK) >>
  1144. GHWCFG2_ARCHITECTURE_SHIFT;
  1145. hw->enable_dynamic_fifo = !!(hwcfg2 & GHWCFG2_DYNAMIC_FIFO);
  1146. hw->host_channels = 1 + ((hwcfg2 & GHWCFG2_NUM_HOST_CHAN_MASK) >>
  1147. GHWCFG2_NUM_HOST_CHAN_SHIFT);
  1148. hw->hs_phy_type = (hwcfg2 & GHWCFG2_HS_PHY_TYPE_MASK) >>
  1149. GHWCFG2_HS_PHY_TYPE_SHIFT;
  1150. hw->fs_phy_type = (hwcfg2 & GHWCFG2_FS_PHY_TYPE_MASK) >>
  1151. GHWCFG2_FS_PHY_TYPE_SHIFT;
  1152. hw->num_dev_ep = (hwcfg2 & GHWCFG2_NUM_DEV_EP_MASK) >>
  1153. GHWCFG2_NUM_DEV_EP_SHIFT;
  1154. hw->nperio_tx_q_depth =
  1155. (hwcfg2 & GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK) >>
  1156. GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT << 1;
  1157. hw->host_perio_tx_q_depth =
  1158. (hwcfg2 & GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK) >>
  1159. GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT << 1;
  1160. hw->dev_token_q_depth =
  1161. (hwcfg2 & GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK) >>
  1162. GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT;
  1163. /* hwcfg3 */
  1164. width = (hwcfg3 & GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK) >>
  1165. GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT;
  1166. hw->max_transfer_size = (1 << (width + 11)) - 1;
  1167. width = (hwcfg3 & GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK) >>
  1168. GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT;
  1169. hw->max_packet_count = (1 << (width + 4)) - 1;
  1170. hw->i2c_enable = !!(hwcfg3 & GHWCFG3_I2C);
  1171. hw->total_fifo_size = (hwcfg3 & GHWCFG3_DFIFO_DEPTH_MASK) >>
  1172. GHWCFG3_DFIFO_DEPTH_SHIFT;
  1173. /* hwcfg4 */
  1174. hw->en_multiple_tx_fifo = !!(hwcfg4 & GHWCFG4_DED_FIFO_EN);
  1175. hw->num_dev_perio_in_ep = (hwcfg4 & GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK) >>
  1176. GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT;
  1177. hw->dma_desc_enable = !!(hwcfg4 & GHWCFG4_DESC_DMA);
  1178. hw->power_optimized = !!(hwcfg4 & GHWCFG4_POWER_OPTIMIZ);
  1179. hw->utmi_phy_data_width = (hwcfg4 & GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK) >>
  1180. GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT;
  1181. /* fifo sizes */
  1182. hw->rx_fifo_size = (grxfsiz & GRXFSIZ_DEPTH_MASK) >>
  1183. GRXFSIZ_DEPTH_SHIFT;
  1184. dev_dbg(hsotg->dev, "Detected values from hardware:\n");
  1185. dev_dbg(hsotg->dev, " op_mode=%d\n",
  1186. hw->op_mode);
  1187. dev_dbg(hsotg->dev, " arch=%d\n",
  1188. hw->arch);
  1189. dev_dbg(hsotg->dev, " dma_desc_enable=%d\n",
  1190. hw->dma_desc_enable);
  1191. dev_dbg(hsotg->dev, " power_optimized=%d\n",
  1192. hw->power_optimized);
  1193. dev_dbg(hsotg->dev, " i2c_enable=%d\n",
  1194. hw->i2c_enable);
  1195. dev_dbg(hsotg->dev, " hs_phy_type=%d\n",
  1196. hw->hs_phy_type);
  1197. dev_dbg(hsotg->dev, " fs_phy_type=%d\n",
  1198. hw->fs_phy_type);
  1199. dev_dbg(hsotg->dev, " utmi_phy_data_width=%d\n",
  1200. hw->utmi_phy_data_width);
  1201. dev_dbg(hsotg->dev, " num_dev_ep=%d\n",
  1202. hw->num_dev_ep);
  1203. dev_dbg(hsotg->dev, " num_dev_perio_in_ep=%d\n",
  1204. hw->num_dev_perio_in_ep);
  1205. dev_dbg(hsotg->dev, " host_channels=%d\n",
  1206. hw->host_channels);
  1207. dev_dbg(hsotg->dev, " max_transfer_size=%d\n",
  1208. hw->max_transfer_size);
  1209. dev_dbg(hsotg->dev, " max_packet_count=%d\n",
  1210. hw->max_packet_count);
  1211. dev_dbg(hsotg->dev, " nperio_tx_q_depth=0x%0x\n",
  1212. hw->nperio_tx_q_depth);
  1213. dev_dbg(hsotg->dev, " host_perio_tx_q_depth=0x%0x\n",
  1214. hw->host_perio_tx_q_depth);
  1215. dev_dbg(hsotg->dev, " dev_token_q_depth=0x%0x\n",
  1216. hw->dev_token_q_depth);
  1217. dev_dbg(hsotg->dev, " enable_dynamic_fifo=%d\n",
  1218. hw->enable_dynamic_fifo);
  1219. dev_dbg(hsotg->dev, " en_multiple_tx_fifo=%d\n",
  1220. hw->en_multiple_tx_fifo);
  1221. dev_dbg(hsotg->dev, " total_fifo_size=%d\n",
  1222. hw->total_fifo_size);
  1223. dev_dbg(hsotg->dev, " rx_fifo_size=%d\n",
  1224. hw->rx_fifo_size);
  1225. dev_dbg(hsotg->dev, " host_nperio_tx_fifo_size=%d\n",
  1226. hw->host_nperio_tx_fifo_size);
  1227. dev_dbg(hsotg->dev, " host_perio_tx_fifo_size=%d\n",
  1228. hw->host_perio_tx_fifo_size);
  1229. dev_dbg(hsotg->dev, "\n");
  1230. return 0;
  1231. }
  1232. int dwc2_init_params(struct dwc2_hsotg *hsotg)
  1233. {
  1234. const struct of_device_id *match;
  1235. struct dwc2_core_params params;
  1236. match = of_match_device(dwc2_of_match_table, hsotg->dev);
  1237. if (match && match->data)
  1238. params = *((struct dwc2_core_params *)match->data);
  1239. else
  1240. params = params_default;
  1241. if (dwc2_is_fs_iot(hsotg)) {
  1242. params.speed = DWC2_SPEED_PARAM_FULL;
  1243. params.phy_type = DWC2_PHY_TYPE_PARAM_FS;
  1244. }
  1245. dwc2_set_parameters(hsotg, &params);
  1246. return 0;
  1247. }