params.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435
  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. u8 val8;
  239. u16 val16;
  240. u32 val32;
  241. switch (size) {
  242. case 0:
  243. *value = device_property_read_bool(hsotg->dev, property);
  244. break;
  245. case 1:
  246. if (device_property_read_u8(hsotg->dev, property, &val8))
  247. return;
  248. *value = val8;
  249. break;
  250. case 2:
  251. if (device_property_read_u16(hsotg->dev, property, &val16))
  252. return;
  253. *value = val16;
  254. break;
  255. case 4:
  256. if (device_property_read_u32(hsotg->dev, property, &val32))
  257. return;
  258. *value = val32;
  259. break;
  260. case 8:
  261. if (device_property_read_u64(hsotg->dev, property, value))
  262. return;
  263. break;
  264. default:
  265. /*
  266. * The size is checked by the only function that calls
  267. * this so this should never happen.
  268. */
  269. WARN_ON(1);
  270. return;
  271. }
  272. }
  273. static void dwc2_set_core_param(void *param, u8 size, u64 value)
  274. {
  275. switch (size) {
  276. case 0:
  277. *((bool *)param) = !!value;
  278. break;
  279. case 1:
  280. *((u8 *)param) = (u8)value;
  281. break;
  282. case 2:
  283. *((u16 *)param) = (u16)value;
  284. break;
  285. case 4:
  286. *((u32 *)param) = (u32)value;
  287. break;
  288. case 8:
  289. *((u64 *)param) = (u64)value;
  290. break;
  291. default:
  292. /*
  293. * The size is checked by the only function that calls
  294. * this so this should never happen.
  295. */
  296. WARN_ON(1);
  297. return;
  298. }
  299. }
  300. /**
  301. * dwc2_set_param() - Set a core parameter
  302. *
  303. * @hsotg: Programming view of the DWC_otg controller
  304. * @param: Pointer to the parameter to set
  305. * @lookup: True if the property should be looked up
  306. * @property: The device property to read
  307. * @legacy: The param value to set if @property is not available. This
  308. * will typically be the legacy value set in the static
  309. * params structure.
  310. * @def: The default value
  311. * @min: The minimum value
  312. * @max: The maximum value
  313. * @size: The size of the core parameter in bytes, or 0 for bool.
  314. *
  315. * This function looks up @property and sets the @param to that value.
  316. * If the property doesn't exist it uses the passed-in @value. It will
  317. * verify that the value falls between @min and @max. If it doesn't,
  318. * it will output an error and set the parameter to either @def or,
  319. * failing that, to @min.
  320. *
  321. * The @size is used to write to @param and to query the device
  322. * properties so that this same function can be used with different
  323. * types of parameters.
  324. */
  325. static void dwc2_set_param(struct dwc2_hsotg *hsotg, void *param,
  326. bool lookup, char *property, u64 legacy,
  327. u64 def, u64 min, u64 max, u8 size)
  328. {
  329. u64 sizemax;
  330. u64 value;
  331. if (WARN_ON(!hsotg || !param || !property))
  332. return;
  333. if (WARN((size > 8) || ((size & (size - 1)) != 0),
  334. "Invalid size %d for %s\n", size, property))
  335. return;
  336. dev_vdbg(hsotg->dev, "%s: Setting %s: legacy=%llu, def=%llu, min=%llu, max=%llu, size=%d\n",
  337. __func__, property, legacy, def, min, max, size);
  338. sizemax = (1ULL << (size * 8)) - 1;
  339. value = legacy;
  340. /* Override legacy settings. */
  341. if (lookup)
  342. dwc2_get_device_property(hsotg, property, size, &value);
  343. /*
  344. * While the value is not valid, try setting it to the default
  345. * value, and failing that, set it to the minimum.
  346. */
  347. while ((value < min) || (value > max)) {
  348. /* Print an error unless the value is set to auto. */
  349. if (value != sizemax)
  350. dev_err(hsotg->dev, "Invalid value %llu for param %s\n",
  351. value, property);
  352. /*
  353. * If we are already the default, just set it to the
  354. * minimum.
  355. */
  356. if (value == def) {
  357. dev_vdbg(hsotg->dev, "%s: setting value to min=%llu\n",
  358. __func__, min);
  359. value = min;
  360. break;
  361. }
  362. /* Try the default value */
  363. dev_vdbg(hsotg->dev, "%s: setting value to default=%llu\n",
  364. __func__, def);
  365. value = def;
  366. }
  367. dev_dbg(hsotg->dev, "Setting %s to %llu\n", property, value);
  368. dwc2_set_core_param(param, size, value);
  369. }
  370. /**
  371. * dwc2_set_param_u16() - Set a u16 parameter
  372. *
  373. * See dwc2_set_param().
  374. */
  375. static void dwc2_set_param_u16(struct dwc2_hsotg *hsotg, u16 *param,
  376. bool lookup, char *property, u16 legacy,
  377. u16 def, u16 min, u16 max)
  378. {
  379. dwc2_set_param(hsotg, param, lookup, property,
  380. legacy, def, min, max, 2);
  381. }
  382. /**
  383. * dwc2_set_param_bool() - Set a bool parameter
  384. *
  385. * See dwc2_set_param().
  386. *
  387. * Note: there is no 'legacy' argument here because there is no legacy
  388. * source of bool params.
  389. */
  390. static void dwc2_set_param_bool(struct dwc2_hsotg *hsotg, bool *param,
  391. bool lookup, char *property,
  392. bool def, bool min, bool max)
  393. {
  394. dwc2_set_param(hsotg, param, lookup, property,
  395. def, def, min, max, 0);
  396. }
  397. #define DWC2_OUT_OF_BOUNDS(a, b, c) ((a) < (b) || (a) > (c))
  398. /* Parameter access functions */
  399. static void dwc2_set_param_otg_cap(struct dwc2_hsotg *hsotg, int val)
  400. {
  401. int valid = 1;
  402. switch (val) {
  403. case DWC2_CAP_PARAM_HNP_SRP_CAPABLE:
  404. if (hsotg->hw_params.op_mode != GHWCFG2_OP_MODE_HNP_SRP_CAPABLE)
  405. valid = 0;
  406. break;
  407. case DWC2_CAP_PARAM_SRP_ONLY_CAPABLE:
  408. switch (hsotg->hw_params.op_mode) {
  409. case GHWCFG2_OP_MODE_HNP_SRP_CAPABLE:
  410. case GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE:
  411. case GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE:
  412. case GHWCFG2_OP_MODE_SRP_CAPABLE_HOST:
  413. break;
  414. default:
  415. valid = 0;
  416. break;
  417. }
  418. break;
  419. case DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE:
  420. /* always valid */
  421. break;
  422. default:
  423. valid = 0;
  424. break;
  425. }
  426. if (!valid) {
  427. if (val >= 0)
  428. dev_err(hsotg->dev,
  429. "%d invalid for otg_cap parameter. Check HW configuration.\n",
  430. val);
  431. switch (hsotg->hw_params.op_mode) {
  432. case GHWCFG2_OP_MODE_HNP_SRP_CAPABLE:
  433. val = DWC2_CAP_PARAM_HNP_SRP_CAPABLE;
  434. break;
  435. case GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE:
  436. case GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE:
  437. case GHWCFG2_OP_MODE_SRP_CAPABLE_HOST:
  438. val = DWC2_CAP_PARAM_SRP_ONLY_CAPABLE;
  439. break;
  440. default:
  441. val = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE;
  442. break;
  443. }
  444. dev_dbg(hsotg->dev, "Setting otg_cap to %d\n", val);
  445. }
  446. hsotg->params.otg_cap = val;
  447. }
  448. static void dwc2_set_param_dma_desc_enable(struct dwc2_hsotg *hsotg, int val)
  449. {
  450. int valid = 1;
  451. if (val > 0 && (hsotg->params.host_dma <= 0 ||
  452. !hsotg->hw_params.dma_desc_enable))
  453. valid = 0;
  454. if (val < 0)
  455. valid = 0;
  456. if (!valid) {
  457. if (val >= 0)
  458. dev_err(hsotg->dev,
  459. "%d invalid for dma_desc_enable parameter. Check HW configuration.\n",
  460. val);
  461. val = (hsotg->params.host_dma > 0 &&
  462. hsotg->hw_params.dma_desc_enable);
  463. dev_dbg(hsotg->dev, "Setting dma_desc_enable to %d\n", val);
  464. }
  465. hsotg->params.dma_desc_enable = val;
  466. }
  467. static void dwc2_set_param_dma_desc_fs_enable(struct dwc2_hsotg *hsotg, int val)
  468. {
  469. int valid = 1;
  470. if (val > 0 && (hsotg->params.host_dma <= 0 ||
  471. !hsotg->hw_params.dma_desc_enable))
  472. valid = 0;
  473. if (val < 0)
  474. valid = 0;
  475. if (!valid) {
  476. if (val >= 0)
  477. dev_err(hsotg->dev,
  478. "%d invalid for dma_desc_fs_enable parameter. Check HW configuration.\n",
  479. val);
  480. val = (hsotg->params.host_dma > 0 &&
  481. hsotg->hw_params.dma_desc_enable);
  482. }
  483. hsotg->params.dma_desc_fs_enable = val;
  484. dev_dbg(hsotg->dev, "Setting dma_desc_fs_enable to %d\n", val);
  485. }
  486. static void
  487. dwc2_set_param_host_support_fs_ls_low_power(struct dwc2_hsotg *hsotg,
  488. int val)
  489. {
  490. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  491. if (val >= 0) {
  492. dev_err(hsotg->dev,
  493. "Wrong value for host_support_fs_low_power\n");
  494. dev_err(hsotg->dev,
  495. "host_support_fs_low_power must be 0 or 1\n");
  496. }
  497. val = 0;
  498. dev_dbg(hsotg->dev,
  499. "Setting host_support_fs_low_power to %d\n", val);
  500. }
  501. hsotg->params.host_support_fs_ls_low_power = val;
  502. }
  503. static void dwc2_set_param_enable_dynamic_fifo(struct dwc2_hsotg *hsotg,
  504. int val)
  505. {
  506. int valid = 1;
  507. if (val > 0 && !hsotg->hw_params.enable_dynamic_fifo)
  508. valid = 0;
  509. if (val < 0)
  510. valid = 0;
  511. if (!valid) {
  512. if (val >= 0)
  513. dev_err(hsotg->dev,
  514. "%d invalid for enable_dynamic_fifo parameter. Check HW configuration.\n",
  515. val);
  516. val = hsotg->hw_params.enable_dynamic_fifo;
  517. dev_dbg(hsotg->dev, "Setting enable_dynamic_fifo to %d\n", val);
  518. }
  519. hsotg->params.enable_dynamic_fifo = val;
  520. }
  521. static void dwc2_set_param_host_rx_fifo_size(struct dwc2_hsotg *hsotg, int val)
  522. {
  523. int valid = 1;
  524. if (val < 16 || val > hsotg->hw_params.rx_fifo_size)
  525. valid = 0;
  526. if (!valid) {
  527. if (val >= 0)
  528. dev_err(hsotg->dev,
  529. "%d invalid for host_rx_fifo_size. Check HW configuration.\n",
  530. val);
  531. val = hsotg->hw_params.rx_fifo_size;
  532. dev_dbg(hsotg->dev, "Setting host_rx_fifo_size to %d\n", val);
  533. }
  534. hsotg->params.host_rx_fifo_size = val;
  535. }
  536. static void dwc2_set_param_host_nperio_tx_fifo_size(struct dwc2_hsotg *hsotg,
  537. int val)
  538. {
  539. int valid = 1;
  540. if (val < 16 || val > hsotg->hw_params.host_nperio_tx_fifo_size)
  541. valid = 0;
  542. if (!valid) {
  543. if (val >= 0)
  544. dev_err(hsotg->dev,
  545. "%d invalid for host_nperio_tx_fifo_size. Check HW configuration.\n",
  546. val);
  547. val = hsotg->hw_params.host_nperio_tx_fifo_size;
  548. dev_dbg(hsotg->dev, "Setting host_nperio_tx_fifo_size to %d\n",
  549. val);
  550. }
  551. hsotg->params.host_nperio_tx_fifo_size = val;
  552. }
  553. static void dwc2_set_param_host_perio_tx_fifo_size(struct dwc2_hsotg *hsotg,
  554. int val)
  555. {
  556. int valid = 1;
  557. if (val < 16 || val > hsotg->hw_params.host_perio_tx_fifo_size)
  558. valid = 0;
  559. if (!valid) {
  560. if (val >= 0)
  561. dev_err(hsotg->dev,
  562. "%d invalid for host_perio_tx_fifo_size. Check HW configuration.\n",
  563. val);
  564. val = hsotg->hw_params.host_perio_tx_fifo_size;
  565. dev_dbg(hsotg->dev, "Setting host_perio_tx_fifo_size to %d\n",
  566. val);
  567. }
  568. hsotg->params.host_perio_tx_fifo_size = val;
  569. }
  570. static void dwc2_set_param_max_transfer_size(struct dwc2_hsotg *hsotg, int val)
  571. {
  572. int valid = 1;
  573. if (val < 2047 || val > hsotg->hw_params.max_transfer_size)
  574. valid = 0;
  575. if (!valid) {
  576. if (val >= 0)
  577. dev_err(hsotg->dev,
  578. "%d invalid for max_transfer_size. Check HW configuration.\n",
  579. val);
  580. val = hsotg->hw_params.max_transfer_size;
  581. dev_dbg(hsotg->dev, "Setting max_transfer_size to %d\n", val);
  582. }
  583. hsotg->params.max_transfer_size = val;
  584. }
  585. static void dwc2_set_param_max_packet_count(struct dwc2_hsotg *hsotg, int val)
  586. {
  587. int valid = 1;
  588. if (val < 15 || val > hsotg->hw_params.max_packet_count)
  589. valid = 0;
  590. if (!valid) {
  591. if (val >= 0)
  592. dev_err(hsotg->dev,
  593. "%d invalid for max_packet_count. Check HW configuration.\n",
  594. val);
  595. val = hsotg->hw_params.max_packet_count;
  596. dev_dbg(hsotg->dev, "Setting max_packet_count to %d\n", val);
  597. }
  598. hsotg->params.max_packet_count = val;
  599. }
  600. static void dwc2_set_param_host_channels(struct dwc2_hsotg *hsotg, int val)
  601. {
  602. int valid = 1;
  603. if (val < 1 || val > hsotg->hw_params.host_channels)
  604. valid = 0;
  605. if (!valid) {
  606. if (val >= 0)
  607. dev_err(hsotg->dev,
  608. "%d invalid for host_channels. Check HW configuration.\n",
  609. val);
  610. val = hsotg->hw_params.host_channels;
  611. dev_dbg(hsotg->dev, "Setting host_channels to %d\n", val);
  612. }
  613. hsotg->params.host_channels = val;
  614. }
  615. static void dwc2_set_param_phy_type(struct dwc2_hsotg *hsotg, int val)
  616. {
  617. int valid = 0;
  618. u32 hs_phy_type, fs_phy_type;
  619. if (DWC2_OUT_OF_BOUNDS(val, DWC2_PHY_TYPE_PARAM_FS,
  620. DWC2_PHY_TYPE_PARAM_ULPI)) {
  621. if (val >= 0) {
  622. dev_err(hsotg->dev, "Wrong value for phy_type\n");
  623. dev_err(hsotg->dev, "phy_type must be 0, 1 or 2\n");
  624. }
  625. valid = 0;
  626. }
  627. hs_phy_type = hsotg->hw_params.hs_phy_type;
  628. fs_phy_type = hsotg->hw_params.fs_phy_type;
  629. if (val == DWC2_PHY_TYPE_PARAM_UTMI &&
  630. (hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI ||
  631. hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI))
  632. valid = 1;
  633. else if (val == DWC2_PHY_TYPE_PARAM_ULPI &&
  634. (hs_phy_type == GHWCFG2_HS_PHY_TYPE_ULPI ||
  635. hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI))
  636. valid = 1;
  637. else if (val == DWC2_PHY_TYPE_PARAM_FS &&
  638. fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED)
  639. valid = 1;
  640. if (!valid) {
  641. if (val >= 0)
  642. dev_err(hsotg->dev,
  643. "%d invalid for phy_type. Check HW configuration.\n",
  644. val);
  645. val = DWC2_PHY_TYPE_PARAM_FS;
  646. if (hs_phy_type != GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED) {
  647. if (hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI ||
  648. hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI)
  649. val = DWC2_PHY_TYPE_PARAM_UTMI;
  650. else
  651. val = DWC2_PHY_TYPE_PARAM_ULPI;
  652. }
  653. dev_dbg(hsotg->dev, "Setting phy_type to %d\n", val);
  654. }
  655. hsotg->params.phy_type = val;
  656. }
  657. static int dwc2_get_param_phy_type(struct dwc2_hsotg *hsotg)
  658. {
  659. return hsotg->params.phy_type;
  660. }
  661. static void dwc2_set_param_speed(struct dwc2_hsotg *hsotg, int val)
  662. {
  663. int valid = 1;
  664. if (DWC2_OUT_OF_BOUNDS(val, 0, 2)) {
  665. if (val >= 0) {
  666. dev_err(hsotg->dev, "Wrong value for speed parameter\n");
  667. dev_err(hsotg->dev, "max_speed parameter must be 0, 1, or 2\n");
  668. }
  669. valid = 0;
  670. }
  671. if (dwc2_is_hs_iot(hsotg) &&
  672. val == DWC2_SPEED_PARAM_LOW)
  673. valid = 0;
  674. if (val == DWC2_SPEED_PARAM_HIGH &&
  675. dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS)
  676. valid = 0;
  677. if (!valid) {
  678. if (val >= 0)
  679. dev_err(hsotg->dev,
  680. "%d invalid for speed parameter. Check HW configuration.\n",
  681. val);
  682. val = dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS ?
  683. DWC2_SPEED_PARAM_FULL : DWC2_SPEED_PARAM_HIGH;
  684. dev_dbg(hsotg->dev, "Setting speed to %d\n", val);
  685. }
  686. hsotg->params.speed = val;
  687. }
  688. static void dwc2_set_param_host_ls_low_power_phy_clk(struct dwc2_hsotg *hsotg,
  689. int val)
  690. {
  691. int valid = 1;
  692. if (DWC2_OUT_OF_BOUNDS(val, DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ,
  693. DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ)) {
  694. if (val >= 0) {
  695. dev_err(hsotg->dev,
  696. "Wrong value for host_ls_low_power_phy_clk parameter\n");
  697. dev_err(hsotg->dev,
  698. "host_ls_low_power_phy_clk must be 0 or 1\n");
  699. }
  700. valid = 0;
  701. }
  702. if (val == DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ &&
  703. dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS)
  704. valid = 0;
  705. if (!valid) {
  706. if (val >= 0)
  707. dev_err(hsotg->dev,
  708. "%d invalid for host_ls_low_power_phy_clk. Check HW configuration.\n",
  709. val);
  710. val = dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS
  711. ? DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ
  712. : DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ;
  713. dev_dbg(hsotg->dev, "Setting host_ls_low_power_phy_clk to %d\n",
  714. val);
  715. }
  716. hsotg->params.host_ls_low_power_phy_clk = val;
  717. }
  718. static void dwc2_set_param_phy_ulpi_ddr(struct dwc2_hsotg *hsotg, int val)
  719. {
  720. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  721. if (val >= 0) {
  722. dev_err(hsotg->dev, "Wrong value for phy_ulpi_ddr\n");
  723. dev_err(hsotg->dev, "phy_upli_ddr must be 0 or 1\n");
  724. }
  725. val = 0;
  726. dev_dbg(hsotg->dev, "Setting phy_upli_ddr to %d\n", val);
  727. }
  728. hsotg->params.phy_ulpi_ddr = val;
  729. }
  730. static void dwc2_set_param_phy_ulpi_ext_vbus(struct dwc2_hsotg *hsotg, int val)
  731. {
  732. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  733. if (val >= 0) {
  734. dev_err(hsotg->dev,
  735. "Wrong value for phy_ulpi_ext_vbus\n");
  736. dev_err(hsotg->dev,
  737. "phy_ulpi_ext_vbus must be 0 or 1\n");
  738. }
  739. val = 0;
  740. dev_dbg(hsotg->dev, "Setting phy_ulpi_ext_vbus to %d\n", val);
  741. }
  742. hsotg->params.phy_ulpi_ext_vbus = val;
  743. }
  744. static void dwc2_set_param_phy_utmi_width(struct dwc2_hsotg *hsotg, int val)
  745. {
  746. int valid = 0;
  747. switch (hsotg->hw_params.utmi_phy_data_width) {
  748. case GHWCFG4_UTMI_PHY_DATA_WIDTH_8:
  749. valid = (val == 8);
  750. break;
  751. case GHWCFG4_UTMI_PHY_DATA_WIDTH_16:
  752. valid = (val == 16);
  753. break;
  754. case GHWCFG4_UTMI_PHY_DATA_WIDTH_8_OR_16:
  755. valid = (val == 8 || val == 16);
  756. break;
  757. }
  758. if (!valid) {
  759. if (val >= 0) {
  760. dev_err(hsotg->dev,
  761. "%d invalid for phy_utmi_width. Check HW configuration.\n",
  762. val);
  763. }
  764. val = (hsotg->hw_params.utmi_phy_data_width ==
  765. GHWCFG4_UTMI_PHY_DATA_WIDTH_8) ? 8 : 16;
  766. dev_dbg(hsotg->dev, "Setting phy_utmi_width to %d\n", val);
  767. }
  768. hsotg->params.phy_utmi_width = val;
  769. }
  770. static void dwc2_set_param_ulpi_fs_ls(struct dwc2_hsotg *hsotg, int val)
  771. {
  772. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  773. if (val >= 0) {
  774. dev_err(hsotg->dev, "Wrong value for ulpi_fs_ls\n");
  775. dev_err(hsotg->dev, "ulpi_fs_ls must be 0 or 1\n");
  776. }
  777. val = 0;
  778. dev_dbg(hsotg->dev, "Setting ulpi_fs_ls to %d\n", val);
  779. }
  780. hsotg->params.ulpi_fs_ls = val;
  781. }
  782. static void dwc2_set_param_ts_dline(struct dwc2_hsotg *hsotg, int val)
  783. {
  784. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  785. if (val >= 0) {
  786. dev_err(hsotg->dev, "Wrong value for ts_dline\n");
  787. dev_err(hsotg->dev, "ts_dline must be 0 or 1\n");
  788. }
  789. val = 0;
  790. dev_dbg(hsotg->dev, "Setting ts_dline to %d\n", val);
  791. }
  792. hsotg->params.ts_dline = val;
  793. }
  794. static void dwc2_set_param_i2c_enable(struct dwc2_hsotg *hsotg, int val)
  795. {
  796. int valid = 1;
  797. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  798. if (val >= 0) {
  799. dev_err(hsotg->dev, "Wrong value for i2c_enable\n");
  800. dev_err(hsotg->dev, "i2c_enable must be 0 or 1\n");
  801. }
  802. valid = 0;
  803. }
  804. if (val == 1 && !(hsotg->hw_params.i2c_enable))
  805. valid = 0;
  806. if (!valid) {
  807. if (val >= 0)
  808. dev_err(hsotg->dev,
  809. "%d invalid for i2c_enable. Check HW configuration.\n",
  810. val);
  811. val = hsotg->hw_params.i2c_enable;
  812. dev_dbg(hsotg->dev, "Setting i2c_enable to %d\n", val);
  813. }
  814. hsotg->params.i2c_enable = val;
  815. }
  816. static void dwc2_set_param_en_multiple_tx_fifo(struct dwc2_hsotg *hsotg,
  817. int val)
  818. {
  819. int valid = 1;
  820. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  821. if (val >= 0) {
  822. dev_err(hsotg->dev,
  823. "Wrong value for en_multiple_tx_fifo,\n");
  824. dev_err(hsotg->dev,
  825. "en_multiple_tx_fifo must be 0 or 1\n");
  826. }
  827. valid = 0;
  828. }
  829. if (val == 1 && !hsotg->hw_params.en_multiple_tx_fifo)
  830. valid = 0;
  831. if (!valid) {
  832. if (val >= 0)
  833. dev_err(hsotg->dev,
  834. "%d invalid for parameter en_multiple_tx_fifo. Check HW configuration.\n",
  835. val);
  836. val = hsotg->hw_params.en_multiple_tx_fifo;
  837. dev_dbg(hsotg->dev, "Setting en_multiple_tx_fifo to %d\n", val);
  838. }
  839. hsotg->params.en_multiple_tx_fifo = val;
  840. }
  841. static void dwc2_set_param_reload_ctl(struct dwc2_hsotg *hsotg, int val)
  842. {
  843. int valid = 1;
  844. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  845. if (val >= 0) {
  846. dev_err(hsotg->dev,
  847. "'%d' invalid for parameter reload_ctl\n", val);
  848. dev_err(hsotg->dev, "reload_ctl must be 0 or 1\n");
  849. }
  850. valid = 0;
  851. }
  852. if (val == 1 && hsotg->hw_params.snpsid < DWC2_CORE_REV_2_92a)
  853. valid = 0;
  854. if (!valid) {
  855. if (val >= 0)
  856. dev_err(hsotg->dev,
  857. "%d invalid for parameter reload_ctl. Check HW configuration.\n",
  858. val);
  859. val = hsotg->hw_params.snpsid >= DWC2_CORE_REV_2_92a;
  860. dev_dbg(hsotg->dev, "Setting reload_ctl to %d\n", val);
  861. }
  862. hsotg->params.reload_ctl = val;
  863. }
  864. static void dwc2_set_param_ahbcfg(struct dwc2_hsotg *hsotg, int val)
  865. {
  866. if (val != -1)
  867. hsotg->params.ahbcfg = val;
  868. else
  869. hsotg->params.ahbcfg = GAHBCFG_HBSTLEN_INCR4 <<
  870. GAHBCFG_HBSTLEN_SHIFT;
  871. }
  872. static void dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val)
  873. {
  874. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  875. if (val >= 0) {
  876. dev_err(hsotg->dev,
  877. "'%d' invalid for parameter otg_ver\n", val);
  878. dev_err(hsotg->dev,
  879. "otg_ver must be 0 (for OTG 1.3 support) or 1 (for OTG 2.0 support)\n");
  880. }
  881. val = 0;
  882. dev_dbg(hsotg->dev, "Setting otg_ver to %d\n", val);
  883. }
  884. hsotg->params.otg_ver = val;
  885. }
  886. static void dwc2_set_param_uframe_sched(struct dwc2_hsotg *hsotg, int val)
  887. {
  888. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  889. if (val >= 0) {
  890. dev_err(hsotg->dev,
  891. "'%d' invalid for parameter uframe_sched\n",
  892. val);
  893. dev_err(hsotg->dev, "uframe_sched must be 0 or 1\n");
  894. }
  895. val = 1;
  896. dev_dbg(hsotg->dev, "Setting uframe_sched to %d\n", val);
  897. }
  898. hsotg->params.uframe_sched = val;
  899. }
  900. static void dwc2_set_param_external_id_pin_ctl(struct dwc2_hsotg *hsotg,
  901. int val)
  902. {
  903. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  904. if (val >= 0) {
  905. dev_err(hsotg->dev,
  906. "'%d' invalid for parameter external_id_pin_ctl\n",
  907. val);
  908. dev_err(hsotg->dev, "external_id_pin_ctl must be 0 or 1\n");
  909. }
  910. val = 0;
  911. dev_dbg(hsotg->dev, "Setting external_id_pin_ctl to %d\n", val);
  912. }
  913. hsotg->params.external_id_pin_ctl = val;
  914. }
  915. static void dwc2_set_param_hibernation(struct dwc2_hsotg *hsotg,
  916. int val)
  917. {
  918. if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
  919. if (val >= 0) {
  920. dev_err(hsotg->dev,
  921. "'%d' invalid for parameter hibernation\n",
  922. val);
  923. dev_err(hsotg->dev, "hibernation must be 0 or 1\n");
  924. }
  925. val = 0;
  926. dev_dbg(hsotg->dev, "Setting hibernation to %d\n", val);
  927. }
  928. hsotg->params.hibernation = val;
  929. }
  930. static void dwc2_set_param_tx_fifo_sizes(struct dwc2_hsotg *hsotg)
  931. {
  932. int i;
  933. int num;
  934. char *property = "g-tx-fifo-size";
  935. struct dwc2_core_params *p = &hsotg->params;
  936. memset(p->g_tx_fifo_size, 0, sizeof(p->g_tx_fifo_size));
  937. /* Read tx fifo sizes */
  938. num = device_property_read_u32_array(hsotg->dev, property, NULL, 0);
  939. if (num > 0) {
  940. device_property_read_u32_array(hsotg->dev, property,
  941. &p->g_tx_fifo_size[1],
  942. num);
  943. } else {
  944. u32 p_tx_fifo[] = DWC2_G_P_LEGACY_TX_FIFO_SIZE;
  945. memcpy(&p->g_tx_fifo_size[1],
  946. p_tx_fifo,
  947. sizeof(p_tx_fifo));
  948. num = ARRAY_SIZE(p_tx_fifo);
  949. }
  950. for (i = 0; i < num; i++) {
  951. if ((i + 1) >= ARRAY_SIZE(p->g_tx_fifo_size))
  952. break;
  953. dev_dbg(hsotg->dev, "Setting %s[%d] to %d\n",
  954. property, i + 1, p->g_tx_fifo_size[i + 1]);
  955. }
  956. }
  957. static void dwc2_set_gadget_dma(struct dwc2_hsotg *hsotg)
  958. {
  959. struct dwc2_hw_params *hw = &hsotg->hw_params;
  960. struct dwc2_core_params *p = &hsotg->params;
  961. bool dma_capable = !(hw->arch == GHWCFG2_SLAVE_ONLY_ARCH);
  962. /* Buffer DMA */
  963. dwc2_set_param_bool(hsotg, &p->g_dma,
  964. false, "gadget-dma",
  965. true, false,
  966. dma_capable);
  967. /* DMA Descriptor */
  968. dwc2_set_param_bool(hsotg, &p->g_dma_desc, false,
  969. "gadget-dma-desc",
  970. p->g_dma, false,
  971. !!hw->dma_desc_enable);
  972. }
  973. /**
  974. * dwc2_set_parameters() - Set all core parameters.
  975. *
  976. * @hsotg: Programming view of the DWC_otg controller
  977. * @params: The parameters to set
  978. */
  979. static void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
  980. const struct dwc2_core_params *params)
  981. {
  982. struct dwc2_hw_params *hw = &hsotg->hw_params;
  983. struct dwc2_core_params *p = &hsotg->params;
  984. bool dma_capable = !(hw->arch == GHWCFG2_SLAVE_ONLY_ARCH);
  985. dwc2_set_param_otg_cap(hsotg, params->otg_cap);
  986. if ((hsotg->dr_mode == USB_DR_MODE_HOST) ||
  987. (hsotg->dr_mode == USB_DR_MODE_OTG)) {
  988. dev_dbg(hsotg->dev, "Setting HOST parameters\n");
  989. dwc2_set_param_bool(hsotg, &p->host_dma,
  990. false, "host-dma",
  991. true, false,
  992. dma_capable);
  993. }
  994. dwc2_set_param_dma_desc_enable(hsotg, params->dma_desc_enable);
  995. dwc2_set_param_dma_desc_fs_enable(hsotg, params->dma_desc_fs_enable);
  996. dwc2_set_param_host_support_fs_ls_low_power(hsotg,
  997. params->host_support_fs_ls_low_power);
  998. dwc2_set_param_enable_dynamic_fifo(hsotg,
  999. params->enable_dynamic_fifo);
  1000. dwc2_set_param_host_rx_fifo_size(hsotg,
  1001. params->host_rx_fifo_size);
  1002. dwc2_set_param_host_nperio_tx_fifo_size(hsotg,
  1003. params->host_nperio_tx_fifo_size);
  1004. dwc2_set_param_host_perio_tx_fifo_size(hsotg,
  1005. params->host_perio_tx_fifo_size);
  1006. dwc2_set_param_max_transfer_size(hsotg,
  1007. params->max_transfer_size);
  1008. dwc2_set_param_max_packet_count(hsotg,
  1009. params->max_packet_count);
  1010. dwc2_set_param_host_channels(hsotg, params->host_channels);
  1011. dwc2_set_param_phy_type(hsotg, params->phy_type);
  1012. dwc2_set_param_speed(hsotg, params->speed);
  1013. dwc2_set_param_host_ls_low_power_phy_clk(hsotg,
  1014. params->host_ls_low_power_phy_clk);
  1015. dwc2_set_param_phy_ulpi_ddr(hsotg, params->phy_ulpi_ddr);
  1016. dwc2_set_param_phy_ulpi_ext_vbus(hsotg,
  1017. params->phy_ulpi_ext_vbus);
  1018. dwc2_set_param_phy_utmi_width(hsotg, params->phy_utmi_width);
  1019. dwc2_set_param_ulpi_fs_ls(hsotg, params->ulpi_fs_ls);
  1020. dwc2_set_param_ts_dline(hsotg, params->ts_dline);
  1021. dwc2_set_param_i2c_enable(hsotg, params->i2c_enable);
  1022. dwc2_set_param_en_multiple_tx_fifo(hsotg,
  1023. params->en_multiple_tx_fifo);
  1024. dwc2_set_param_reload_ctl(hsotg, params->reload_ctl);
  1025. dwc2_set_param_ahbcfg(hsotg, params->ahbcfg);
  1026. dwc2_set_param_otg_ver(hsotg, params->otg_ver);
  1027. dwc2_set_param_uframe_sched(hsotg, params->uframe_sched);
  1028. dwc2_set_param_external_id_pin_ctl(hsotg, params->external_id_pin_ctl);
  1029. dwc2_set_param_hibernation(hsotg, params->hibernation);
  1030. /*
  1031. * Set devicetree-only parameters. These parameters do not
  1032. * take any values from @params.
  1033. */
  1034. if ((hsotg->dr_mode == USB_DR_MODE_PERIPHERAL) ||
  1035. (hsotg->dr_mode == USB_DR_MODE_OTG)) {
  1036. dev_dbg(hsotg->dev, "Setting peripheral device properties\n");
  1037. dwc2_set_gadget_dma(hsotg);
  1038. /*
  1039. * The values for g_rx_fifo_size (2048) and
  1040. * g_np_tx_fifo_size (1024) come from the legacy s3c
  1041. * gadget driver. These defaults have been hard-coded
  1042. * for some time so many platforms depend on these
  1043. * values. Leave them as defaults for now and only
  1044. * auto-detect if the hardware does not support the
  1045. * default.
  1046. */
  1047. dwc2_set_param_u16(hsotg, &p->g_rx_fifo_size,
  1048. true, "g-rx-fifo-size", 2048,
  1049. hw->rx_fifo_size,
  1050. 16, hw->rx_fifo_size);
  1051. dwc2_set_param_u16(hsotg, &p->g_np_tx_fifo_size,
  1052. true, "g-np-tx-fifo-size", 1024,
  1053. hw->dev_nperio_tx_fifo_size,
  1054. 16, hw->dev_nperio_tx_fifo_size);
  1055. dwc2_set_param_tx_fifo_sizes(hsotg);
  1056. }
  1057. }
  1058. /*
  1059. * Gets host hardware parameters. Forces host mode if not currently in
  1060. * host mode. Should be called immediately after a core soft reset in
  1061. * order to get the reset values.
  1062. */
  1063. static void dwc2_get_host_hwparams(struct dwc2_hsotg *hsotg)
  1064. {
  1065. struct dwc2_hw_params *hw = &hsotg->hw_params;
  1066. u32 gnptxfsiz;
  1067. u32 hptxfsiz;
  1068. bool forced;
  1069. if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
  1070. return;
  1071. forced = dwc2_force_mode_if_needed(hsotg, true);
  1072. gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ);
  1073. hptxfsiz = dwc2_readl(hsotg->regs + HPTXFSIZ);
  1074. dev_dbg(hsotg->dev, "gnptxfsiz=%08x\n", gnptxfsiz);
  1075. dev_dbg(hsotg->dev, "hptxfsiz=%08x\n", hptxfsiz);
  1076. if (forced)
  1077. dwc2_clear_force_mode(hsotg);
  1078. hw->host_nperio_tx_fifo_size = (gnptxfsiz & FIFOSIZE_DEPTH_MASK) >>
  1079. FIFOSIZE_DEPTH_SHIFT;
  1080. hw->host_perio_tx_fifo_size = (hptxfsiz & FIFOSIZE_DEPTH_MASK) >>
  1081. FIFOSIZE_DEPTH_SHIFT;
  1082. }
  1083. /*
  1084. * Gets device hardware parameters. Forces device mode if not
  1085. * currently in device mode. Should be called immediately after a core
  1086. * soft reset in order to get the reset values.
  1087. */
  1088. static void dwc2_get_dev_hwparams(struct dwc2_hsotg *hsotg)
  1089. {
  1090. struct dwc2_hw_params *hw = &hsotg->hw_params;
  1091. bool forced;
  1092. u32 gnptxfsiz;
  1093. if (hsotg->dr_mode == USB_DR_MODE_HOST)
  1094. return;
  1095. forced = dwc2_force_mode_if_needed(hsotg, false);
  1096. gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ);
  1097. dev_dbg(hsotg->dev, "gnptxfsiz=%08x\n", gnptxfsiz);
  1098. if (forced)
  1099. dwc2_clear_force_mode(hsotg);
  1100. hw->dev_nperio_tx_fifo_size = (gnptxfsiz & FIFOSIZE_DEPTH_MASK) >>
  1101. FIFOSIZE_DEPTH_SHIFT;
  1102. }
  1103. /**
  1104. * During device initialization, read various hardware configuration
  1105. * registers and interpret the contents.
  1106. */
  1107. int dwc2_get_hwparams(struct dwc2_hsotg *hsotg)
  1108. {
  1109. struct dwc2_hw_params *hw = &hsotg->hw_params;
  1110. unsigned int width;
  1111. u32 hwcfg1, hwcfg2, hwcfg3, hwcfg4;
  1112. u32 grxfsiz;
  1113. /*
  1114. * Attempt to ensure this device is really a DWC_otg Controller.
  1115. * Read and verify the GSNPSID register contents. The value should be
  1116. * 0x45f42xxx or 0x45f43xxx, which corresponds to either "OT2" or "OT3",
  1117. * as in "OTG version 2.xx" or "OTG version 3.xx".
  1118. */
  1119. hw->snpsid = dwc2_readl(hsotg->regs + GSNPSID);
  1120. if ((hw->snpsid & 0xfffff000) != 0x4f542000 &&
  1121. (hw->snpsid & 0xfffff000) != 0x4f543000 &&
  1122. (hw->snpsid & 0xffff0000) != 0x55310000 &&
  1123. (hw->snpsid & 0xffff0000) != 0x55320000) {
  1124. dev_err(hsotg->dev, "Bad value for GSNPSID: 0x%08x\n",
  1125. hw->snpsid);
  1126. return -ENODEV;
  1127. }
  1128. dev_dbg(hsotg->dev, "Core Release: %1x.%1x%1x%1x (snpsid=%x)\n",
  1129. hw->snpsid >> 12 & 0xf, hw->snpsid >> 8 & 0xf,
  1130. hw->snpsid >> 4 & 0xf, hw->snpsid & 0xf, hw->snpsid);
  1131. hwcfg1 = dwc2_readl(hsotg->regs + GHWCFG1);
  1132. hwcfg2 = dwc2_readl(hsotg->regs + GHWCFG2);
  1133. hwcfg3 = dwc2_readl(hsotg->regs + GHWCFG3);
  1134. hwcfg4 = dwc2_readl(hsotg->regs + GHWCFG4);
  1135. grxfsiz = dwc2_readl(hsotg->regs + GRXFSIZ);
  1136. dev_dbg(hsotg->dev, "hwcfg1=%08x\n", hwcfg1);
  1137. dev_dbg(hsotg->dev, "hwcfg2=%08x\n", hwcfg2);
  1138. dev_dbg(hsotg->dev, "hwcfg3=%08x\n", hwcfg3);
  1139. dev_dbg(hsotg->dev, "hwcfg4=%08x\n", hwcfg4);
  1140. dev_dbg(hsotg->dev, "grxfsiz=%08x\n", grxfsiz);
  1141. /*
  1142. * Host specific hardware parameters. Reading these parameters
  1143. * requires the controller to be in host mode. The mode will
  1144. * be forced, if necessary, to read these values.
  1145. */
  1146. dwc2_get_host_hwparams(hsotg);
  1147. dwc2_get_dev_hwparams(hsotg);
  1148. /* hwcfg1 */
  1149. hw->dev_ep_dirs = hwcfg1;
  1150. /* hwcfg2 */
  1151. hw->op_mode = (hwcfg2 & GHWCFG2_OP_MODE_MASK) >>
  1152. GHWCFG2_OP_MODE_SHIFT;
  1153. hw->arch = (hwcfg2 & GHWCFG2_ARCHITECTURE_MASK) >>
  1154. GHWCFG2_ARCHITECTURE_SHIFT;
  1155. hw->enable_dynamic_fifo = !!(hwcfg2 & GHWCFG2_DYNAMIC_FIFO);
  1156. hw->host_channels = 1 + ((hwcfg2 & GHWCFG2_NUM_HOST_CHAN_MASK) >>
  1157. GHWCFG2_NUM_HOST_CHAN_SHIFT);
  1158. hw->hs_phy_type = (hwcfg2 & GHWCFG2_HS_PHY_TYPE_MASK) >>
  1159. GHWCFG2_HS_PHY_TYPE_SHIFT;
  1160. hw->fs_phy_type = (hwcfg2 & GHWCFG2_FS_PHY_TYPE_MASK) >>
  1161. GHWCFG2_FS_PHY_TYPE_SHIFT;
  1162. hw->num_dev_ep = (hwcfg2 & GHWCFG2_NUM_DEV_EP_MASK) >>
  1163. GHWCFG2_NUM_DEV_EP_SHIFT;
  1164. hw->nperio_tx_q_depth =
  1165. (hwcfg2 & GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK) >>
  1166. GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT << 1;
  1167. hw->host_perio_tx_q_depth =
  1168. (hwcfg2 & GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK) >>
  1169. GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT << 1;
  1170. hw->dev_token_q_depth =
  1171. (hwcfg2 & GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK) >>
  1172. GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT;
  1173. /* hwcfg3 */
  1174. width = (hwcfg3 & GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK) >>
  1175. GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT;
  1176. hw->max_transfer_size = (1 << (width + 11)) - 1;
  1177. width = (hwcfg3 & GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK) >>
  1178. GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT;
  1179. hw->max_packet_count = (1 << (width + 4)) - 1;
  1180. hw->i2c_enable = !!(hwcfg3 & GHWCFG3_I2C);
  1181. hw->total_fifo_size = (hwcfg3 & GHWCFG3_DFIFO_DEPTH_MASK) >>
  1182. GHWCFG3_DFIFO_DEPTH_SHIFT;
  1183. /* hwcfg4 */
  1184. hw->en_multiple_tx_fifo = !!(hwcfg4 & GHWCFG4_DED_FIFO_EN);
  1185. hw->num_dev_perio_in_ep = (hwcfg4 & GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK) >>
  1186. GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT;
  1187. hw->dma_desc_enable = !!(hwcfg4 & GHWCFG4_DESC_DMA);
  1188. hw->power_optimized = !!(hwcfg4 & GHWCFG4_POWER_OPTIMIZ);
  1189. hw->utmi_phy_data_width = (hwcfg4 & GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK) >>
  1190. GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT;
  1191. /* fifo sizes */
  1192. hw->rx_fifo_size = (grxfsiz & GRXFSIZ_DEPTH_MASK) >>
  1193. GRXFSIZ_DEPTH_SHIFT;
  1194. dev_dbg(hsotg->dev, "Detected values from hardware:\n");
  1195. dev_dbg(hsotg->dev, " op_mode=%d\n",
  1196. hw->op_mode);
  1197. dev_dbg(hsotg->dev, " arch=%d\n",
  1198. hw->arch);
  1199. dev_dbg(hsotg->dev, " dma_desc_enable=%d\n",
  1200. hw->dma_desc_enable);
  1201. dev_dbg(hsotg->dev, " power_optimized=%d\n",
  1202. hw->power_optimized);
  1203. dev_dbg(hsotg->dev, " i2c_enable=%d\n",
  1204. hw->i2c_enable);
  1205. dev_dbg(hsotg->dev, " hs_phy_type=%d\n",
  1206. hw->hs_phy_type);
  1207. dev_dbg(hsotg->dev, " fs_phy_type=%d\n",
  1208. hw->fs_phy_type);
  1209. dev_dbg(hsotg->dev, " utmi_phy_data_width=%d\n",
  1210. hw->utmi_phy_data_width);
  1211. dev_dbg(hsotg->dev, " num_dev_ep=%d\n",
  1212. hw->num_dev_ep);
  1213. dev_dbg(hsotg->dev, " num_dev_perio_in_ep=%d\n",
  1214. hw->num_dev_perio_in_ep);
  1215. dev_dbg(hsotg->dev, " host_channels=%d\n",
  1216. hw->host_channels);
  1217. dev_dbg(hsotg->dev, " max_transfer_size=%d\n",
  1218. hw->max_transfer_size);
  1219. dev_dbg(hsotg->dev, " max_packet_count=%d\n",
  1220. hw->max_packet_count);
  1221. dev_dbg(hsotg->dev, " nperio_tx_q_depth=0x%0x\n",
  1222. hw->nperio_tx_q_depth);
  1223. dev_dbg(hsotg->dev, " host_perio_tx_q_depth=0x%0x\n",
  1224. hw->host_perio_tx_q_depth);
  1225. dev_dbg(hsotg->dev, " dev_token_q_depth=0x%0x\n",
  1226. hw->dev_token_q_depth);
  1227. dev_dbg(hsotg->dev, " enable_dynamic_fifo=%d\n",
  1228. hw->enable_dynamic_fifo);
  1229. dev_dbg(hsotg->dev, " en_multiple_tx_fifo=%d\n",
  1230. hw->en_multiple_tx_fifo);
  1231. dev_dbg(hsotg->dev, " total_fifo_size=%d\n",
  1232. hw->total_fifo_size);
  1233. dev_dbg(hsotg->dev, " rx_fifo_size=%d\n",
  1234. hw->rx_fifo_size);
  1235. dev_dbg(hsotg->dev, " host_nperio_tx_fifo_size=%d\n",
  1236. hw->host_nperio_tx_fifo_size);
  1237. dev_dbg(hsotg->dev, " host_perio_tx_fifo_size=%d\n",
  1238. hw->host_perio_tx_fifo_size);
  1239. dev_dbg(hsotg->dev, "\n");
  1240. return 0;
  1241. }
  1242. int dwc2_init_params(struct dwc2_hsotg *hsotg)
  1243. {
  1244. const struct of_device_id *match;
  1245. struct dwc2_core_params params;
  1246. match = of_match_device(dwc2_of_match_table, hsotg->dev);
  1247. if (match && match->data)
  1248. params = *((struct dwc2_core_params *)match->data);
  1249. else
  1250. params = params_default;
  1251. if (dwc2_is_fs_iot(hsotg)) {
  1252. params.speed = DWC2_SPEED_PARAM_FULL;
  1253. params.phy_type = DWC2_PHY_TYPE_PARAM_FS;
  1254. }
  1255. dwc2_set_parameters(hsotg, &params);
  1256. return 0;
  1257. }