pinctrl-rockchip.c 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-3-08 GuEe-GUI the first version
  9. */
  10. #include <rtthread.h>
  11. #include <rtdevice.h>
  12. #define DBG_TAG "pinctrl.rockchip"
  13. #define DBG_LVL DBG_INFO
  14. #include <rtdbg.h>
  15. #include "pinctrl-rockchip.h"
  16. #define WRITE_MASK_VAL(h, l, v) \
  17. (RT_GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & RT_GENMASK((h), (l))))
  18. /*
  19. * Encode variants of iomux registers into a type variable
  20. */
  21. #define IOMUX_GPIO_ONLY RT_BIT(0)
  22. #define IOMUX_WIDTH_4BIT RT_BIT(1)
  23. #define IOMUX_SOURCE_PMU RT_BIT(2)
  24. #define IOMUX_UNROUTED RT_BIT(3)
  25. #define IOMUX_WIDTH_3BIT RT_BIT(4)
  26. #define IOMUX_WIDTH_2BIT RT_BIT(5)
  27. #define IOMUX_L_SOURCE_PMU RT_BIT(6)
  28. #define PIN_BANK_IOMUX_FLAGS(ID, PINS, \
  29. LABEL, IOM0, IOM1, IOM2, IOM3) \
  30. { \
  31. .bank_num = ID, \
  32. .nr_pins = PINS, \
  33. .name = LABEL, \
  34. .iomux = \
  35. { \
  36. { .type = IOM0, .offset = -1 }, \
  37. { .type = IOM1, .offset = -1 }, \
  38. { .type = IOM2, .offset = -1 }, \
  39. { .type = IOM3, .offset = -1 }, \
  40. }, \
  41. }
  42. #define PIN_BANK_MUX_ROUTE_FLAGS( \
  43. ID, PIN, FUNC, REG, VAL, FLAG) \
  44. { \
  45. .bank_num = ID, \
  46. .pin = PIN, \
  47. .func = FUNC, \
  48. .route_offset = REG, \
  49. .route_val = VAL, \
  50. .route_location = FLAG, \
  51. }
  52. #define PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, \
  53. PINS, LABEL, IOM0, IOM1, IOM2, IOM3, \
  54. PULL0, PULL1, PULL2, PULL3) \
  55. { \
  56. .bank_num = ID, \
  57. .nr_pins = PINS, \
  58. .name = LABEL, \
  59. .iomux = \
  60. { \
  61. { .type = IOM0, .offset = -1 }, \
  62. { .type = IOM1, .offset = -1 }, \
  63. { .type = IOM2, .offset = -1 }, \
  64. { .type = IOM3, .offset = -1 }, \
  65. }, \
  66. .pull_type[0] = PULL0, \
  67. .pull_type[1] = PULL1, \
  68. .pull_type[2] = PULL2, \
  69. .pull_type[3] = PULL3, \
  70. }
  71. #define PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS( \
  72. ID, PINS, LABEL, IOM0, IOM1, IOM2, IOM3, \
  73. OFFSET0, OFFSET1, OFFSET2, OFFSET3, PULL0, \
  74. PULL1, PULL2, PULL3) \
  75. { \
  76. .bank_num = ID, \
  77. .nr_pins = PINS, \
  78. .name = LABEL, \
  79. .iomux = \
  80. { \
  81. { .type = IOM0, .offset = OFFSET0 }, \
  82. { .type = IOM1, .offset = OFFSET1 }, \
  83. { .type = IOM2, .offset = OFFSET2 }, \
  84. { .type = IOM3, .offset = OFFSET3 }, \
  85. }, \
  86. .pull_type[0] = PULL0, \
  87. .pull_type[1] = PULL1, \
  88. .pull_type[2] = PULL2, \
  89. .pull_type[3] = PULL3, \
  90. }
  91. #define RK_MUXROUTE_SAME(ID, PIN, FUNC, REG, VAL) \
  92. PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_SAME)
  93. #define RK_MUXROUTE_GRF(ID, PIN, FUNC, REG, VAL) \
  94. PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_GRF)
  95. #define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL) \
  96. PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU)
  97. #define PIN_BANK_FLAGS_IOMUX_PULL(ID, PIN, LABEL, M, P) \
  98. PIN_BANK_IOMUX_FLAGS_PULL_FLAGS(ID, PIN, LABEL, M, M, M, M, P, P, P, P)
  99. #define PIN_BANK_OFFSET4(ID, LABEL, OFFSET0, OFFSET1, OFFSET2, OFFSET3) \
  100. PIN_BANK_IOMUX_FLAGS_OFFSET_PULL_FLAGS(ID, 32, LABEL, \
  101. IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, \
  102. IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, \
  103. OFFSET0, OFFSET1, OFFSET2, OFFSET3, \
  104. PULL_TYPE_IO_1, PULL_TYPE_IO_1, \
  105. PULL_TYPE_IO_1, PULL_TYPE_IO_1)
  106. #define RK_RECALCED_DATA( \
  107. NUM, PIN, REG, BIT, MASK) \
  108. { \
  109. .num = NUM, \
  110. .pin = PIN, \
  111. .reg = REG, \
  112. .bit = BIT, \
  113. .mask = MASK, \
  114. }
  115. static int rockchip_pull_list[PULL_TYPE_MAX][4] =
  116. {
  117. {
  118. PIN_CONFIG_BIAS_DISABLE,
  119. PIN_CONFIG_BIAS_PULL_UP,
  120. PIN_CONFIG_BIAS_PULL_DOWN,
  121. PIN_CONFIG_BIAS_BUS_HOLD
  122. },
  123. {
  124. PIN_CONFIG_BIAS_DISABLE,
  125. PIN_CONFIG_BIAS_PULL_DOWN,
  126. PIN_CONFIG_BIAS_DISABLE,
  127. PIN_CONFIG_BIAS_PULL_UP
  128. },
  129. };
  130. static int rockchip_translate_pull_value(int type, int pull)
  131. {
  132. int res = -RT_EINVAL;
  133. for (int i = 0; i < RT_ARRAY_SIZE(rockchip_pull_list[type]); ++i)
  134. {
  135. if (rockchip_pull_list[type][i] == pull)
  136. {
  137. res = i;
  138. break;
  139. }
  140. }
  141. return res;
  142. }
  143. static void rockchip_translate_recalced_mux(struct rockchip_pin_bank *pin_bank,
  144. int pin, int *reg, rt_uint8_t *bit, int *mask)
  145. {
  146. int i;
  147. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  148. struct rockchip_pin_ctrl *pinctrl = drvdata->pinctrl;
  149. struct rockchip_mux_recalced_data *data;
  150. for (i = 0; i < pinctrl->niomux_recalced; ++i)
  151. {
  152. data = &pinctrl->iomux_recalced[i];
  153. if (data->num == pin_bank->bank_num && data->pin == pin)
  154. {
  155. break;
  156. }
  157. }
  158. if (i >= pinctrl->niomux_recalced)
  159. {
  160. return;
  161. }
  162. *reg = data->reg;
  163. *mask = data->mask;
  164. *bit = data->bit;
  165. }
  166. static rt_bool_t rockchip_translate_mux_route(struct rockchip_pin_bank *pin_bank,
  167. int pin, int mux, rt_uint32_t *loc, rt_uint32_t *reg, rt_uint32_t *value)
  168. {
  169. int i;
  170. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  171. struct rockchip_pin_ctrl *pinctrl = drvdata->pinctrl;
  172. struct rockchip_mux_route_data *data;
  173. for (i = 0; i < pinctrl->niomux_routes; ++i)
  174. {
  175. data = &pinctrl->iomux_routes[i];
  176. if (data->bank_num == pin_bank->bank_num && data->pin == pin && data->func == mux)
  177. {
  178. break;
  179. }
  180. }
  181. if (i >= pinctrl->niomux_routes)
  182. {
  183. return RT_FALSE;
  184. }
  185. *loc = data->route_location;
  186. *reg = data->route_offset;
  187. *value = data->route_val;
  188. return RT_TRUE;
  189. }
  190. static struct rockchip_mux_route_data rk3308_mux_route_data[] =
  191. {
  192. RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, RT_BIT(16 + 0) | RT_BIT(0)), /* rtc_clk */
  193. RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, RT_BIT(16 + 2) | RT_BIT(16 + 3)), /* uart2_rxm0 */
  194. RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, RT_BIT(16 + 2) | RT_BIT(16 + 3) | RT_BIT(2)), /* uart2_rxm1 */
  195. RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, RT_BIT(16 + 8) | RT_BIT(16 + 9)), /* i2c3_sdam0 */
  196. RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, RT_BIT(16 + 8) | RT_BIT(16 + 9) | RT_BIT(8)), /* i2c3_sdam1 */
  197. RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, RT_BIT(16 + 8) | RT_BIT(16 + 9) | RT_BIT(9)), /* i2c3_sdam2 */
  198. RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, RT_BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
  199. RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, RT_BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
  200. RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, RT_BIT(16 + 3) | RT_BIT(3)), /* i2s-8ch-1-sclktxm1 */
  201. RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x308, RT_BIT(16 + 3) | RT_BIT(3)), /* i2s-8ch-1-sclkrxm1 */
  202. RK_MUXROUTE_SAME(1, RK_PA4, 3, 0x308, RT_BIT(16 + 12) | RT_BIT(16 + 13)), /* pdm-clkm0 */
  203. RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, RT_BIT(16 + 12) | RT_BIT(16 + 13) | RT_BIT(12)), /* pdm-clkm1 */
  204. RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, RT_BIT(16 + 12) | RT_BIT(16 + 13) | RT_BIT(13)), /* pdm-clkm2 */
  205. RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, RT_BIT(16 + 2) | RT_BIT(2)), /* pdm-clkm-m2 */
  206. RK_MUXROUTE_SAME(3, RK_PB2, 3, 0x314, RT_BIT(16 + 9)), /* spi1_miso */
  207. RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x314, RT_BIT(16 + 9) | RT_BIT(9)), /* spi1_miso_m1 */
  208. RK_MUXROUTE_SAME(0, RK_PB3, 3, 0x314, RT_BIT(16 + 10) | RT_BIT(16 + 11)), /* owire_m0 */
  209. RK_MUXROUTE_SAME(1, RK_PC6, 7, 0x314, RT_BIT(16 + 10) | RT_BIT(16 + 11) | RT_BIT(10)), /* owire_m1 */
  210. RK_MUXROUTE_SAME(2, RK_PA2, 5, 0x314, RT_BIT(16 + 10) | RT_BIT(16 + 11) | RT_BIT(11)), /* owire_m2 */
  211. RK_MUXROUTE_SAME(0, RK_PB3, 2, 0x314, RT_BIT(16 + 12) | RT_BIT(16 + 13)), /* can_rxd_m0 */
  212. RK_MUXROUTE_SAME(1, RK_PC6, 5, 0x314, RT_BIT(16 + 12) | RT_BIT(16 + 13) | RT_BIT(12)), /* can_rxd_m1 */
  213. RK_MUXROUTE_SAME(2, RK_PA2, 4, 0x314, RT_BIT(16 + 12) | RT_BIT(16 + 13) | RT_BIT(13)), /* can_rxd_m2 */
  214. RK_MUXROUTE_SAME(1, RK_PC4, 3, 0x314, RT_BIT(16 + 14)), /* mac_rxd0_m0 */
  215. RK_MUXROUTE_SAME(4, RK_PA2, 2, 0x314, RT_BIT(16 + 14) | RT_BIT(14)), /* mac_rxd0_m1 */
  216. RK_MUXROUTE_SAME(3, RK_PB4, 4, 0x314, RT_BIT(16 + 15)), /* uart3_rx */
  217. RK_MUXROUTE_SAME(0, RK_PC1, 3, 0x314, RT_BIT(16 + 15) | RT_BIT(15)), /* uart3_rx_m1 */
  218. };
  219. static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] =
  220. {
  221. RK_RECALCED_DATA(1, 14, 0x28, 12, 0xf), /* gpio1b6_sel */
  222. RK_RECALCED_DATA(1, 15, 0x2c, 0, 0x3), /* gpio1b7_sel */
  223. RK_RECALCED_DATA(1, 18, 0x30, 4, 0xf), /* gpio1c2_sel */
  224. RK_RECALCED_DATA(1, 19, 0x30, 8, 0xf), /* gpio1c3_sel */
  225. RK_RECALCED_DATA(1, 20, 0x30, 12, 0xf), /* gpio1c4_sel */
  226. RK_RECALCED_DATA(1, 21, 0x34, 0, 0xf), /* gpio1c5_sel */
  227. RK_RECALCED_DATA(1, 22, 0x34, 4, 0xf), /* gpio1c6_sel */
  228. RK_RECALCED_DATA(1, 23, 0x34, 8, 0xf), /* gpio1c7_sel */
  229. RK_RECALCED_DATA(2, 2, 0x40, 4, 0x3), /* gpio2a2_sel */
  230. RK_RECALCED_DATA(2, 3, 0x40, 6, 0x3), /* gpio2a3_sel */
  231. RK_RECALCED_DATA(2, 16, 0x50, 0, 0x3), /* gpio2c0_sel */
  232. RK_RECALCED_DATA(3, 10, 0x68, 4, 0x3), /* gpio3b2_sel */
  233. RK_RECALCED_DATA(3, 11, 0x68, 6, 0x3), /* gpio3b3_sel */
  234. RK_RECALCED_DATA(3, 12, 0x68, 8, 0xf), /* gpio3b4_sel */
  235. RK_RECALCED_DATA(3, 13, 0x68, 12, 0xf), /* gpio3b5_sel */
  236. };
  237. static rt_err_t rk3308_set_mux(struct rockchip_pin_bank *pin_bank, int pin, int mux)
  238. {
  239. rt_uint8_t bit;
  240. rt_uint32_t data;
  241. int iomux_num = (pin / 8), reg, mask;
  242. struct rt_syscon *regmap;
  243. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  244. if ((pin_bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU))
  245. {
  246. regmap = drvdata->regmap_pmu;
  247. }
  248. else
  249. {
  250. regmap = drvdata->regmap_base;
  251. }
  252. reg = pin_bank->iomux[iomux_num].offset;
  253. if (pin_bank->iomux[iomux_num].type & IOMUX_WIDTH_4BIT)
  254. {
  255. if ((pin % 8) >= 4)
  256. {
  257. reg += 0x4;
  258. }
  259. bit = (pin % 4) * 4;
  260. mask = 0xf;
  261. }
  262. else
  263. {
  264. bit = (pin % 8) * 2;
  265. mask = 0x3;
  266. }
  267. if (pin_bank->recalced_mask & RT_BIT(pin))
  268. {
  269. rockchip_translate_recalced_mux(pin_bank, pin, &reg, &bit, &mask);
  270. }
  271. data = (mask << (bit + 16));
  272. data |= (mux & mask) << bit;
  273. return rt_syscon_write(regmap, reg, data);
  274. }
  275. #define RK3308_PULL_OFFSET 0xa0
  276. #define RK3308_PULL_BITS_PER_PIN 2
  277. #define RK3308_PULL_PINS_PER_REG 8
  278. #define RK3308_PULL_BANK_STRIDE 16
  279. static rt_err_t rk3308_set_pull(struct rockchip_pin_bank *pin_bank, int pin, int pull)
  280. {
  281. int reg, pull_value;
  282. rt_uint32_t data;
  283. rt_uint8_t bit, type;
  284. struct rt_syscon *regmap;
  285. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  286. if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
  287. {
  288. return -RT_ENOSYS;
  289. }
  290. regmap = drvdata->regmap_base;
  291. reg = RK3308_PULL_OFFSET;
  292. reg += pin_bank->bank_num * RK3308_PULL_BANK_STRIDE;
  293. reg += ((pin / RK3308_PULL_PINS_PER_REG) * 4);
  294. bit = (pin % RK3308_PULL_PINS_PER_REG);
  295. bit *= RK3308_PULL_BITS_PER_PIN;
  296. type = pin_bank->pull_type[pin / 8];
  297. pull_value = rockchip_translate_pull_value(type, pull);
  298. if (pull_value < 0)
  299. {
  300. LOG_E("Not supported pull = %d, fixup the code or firmware", pull);
  301. return pull_value;
  302. }
  303. /* enable the write to the equivalent lower bits */
  304. data = ((1 << ROCKCHIP_PULL_BITS_PER_PIN) - 1) << (bit + 16);
  305. data |= (pull_value << bit);
  306. return rt_syscon_write(regmap, reg, data);
  307. }
  308. #define RK3308_DRV_GRF_OFFSET 0x100
  309. #define RK3308_DRV_BITS_PER_PIN 2
  310. #define RK3308_DRV_PINS_PER_REG 8
  311. #define RK3308_DRV_BANK_STRIDE 16
  312. static rt_err_t rk3308_set_drive(struct rockchip_pin_bank *pin_bank, int pin, int strength)
  313. {
  314. int reg;
  315. rt_uint8_t bit;
  316. rt_uint32_t data;
  317. struct rt_syscon *regmap;
  318. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  319. regmap = drvdata->regmap_base;
  320. reg = RK3308_DRV_GRF_OFFSET;
  321. reg += pin_bank->bank_num * RK3308_DRV_BANK_STRIDE;
  322. reg += ((pin / RK3308_DRV_PINS_PER_REG) * 4);
  323. bit = (pin % RK3308_DRV_PINS_PER_REG);
  324. bit *= RK3308_DRV_BITS_PER_PIN;
  325. /* enable the write to the equivalent lower bits */
  326. data = ((1 << ROCKCHIP_DRV_BITS_PER_PIN) - 1) << (bit + 16);
  327. data |= (strength << bit);
  328. return rt_syscon_write(regmap, reg, data);
  329. }
  330. #define RK3308_SCHMITT_PINS_PER_REG 8
  331. #define RK3308_SCHMITT_BANK_STRIDE 16
  332. #define RK3308_SCHMITT_GRF_OFFSET 0x1a0
  333. static rt_err_t rk3308_set_schmitt(struct rockchip_pin_bank *pin_bank, int pin, int enable)
  334. {
  335. int reg;
  336. rt_uint8_t bit;
  337. rt_uint32_t data;
  338. struct rt_syscon *regmap;
  339. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  340. regmap = drvdata->regmap_base;
  341. reg = RK3308_SCHMITT_GRF_OFFSET;
  342. reg += pin_bank->bank_num * RK3308_SCHMITT_BANK_STRIDE;
  343. reg += ((pin / RK3308_SCHMITT_PINS_PER_REG) * 4);
  344. bit = pin % RK3308_SCHMITT_PINS_PER_REG;
  345. /* enable the write to the equivalent lower bits */
  346. data = RT_BIT(bit + 16) | (enable << bit);
  347. return rt_syscon_write(regmap, reg, data);
  348. }
  349. static struct rockchip_pin_bank rk3308_pin_banks[] =
  350. {
  351. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT),
  352. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT),
  353. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT),
  354. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT),
  355. PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT),
  356. };
  357. static struct rockchip_pin_ctrl rk3308_pin_ctrl =
  358. {
  359. .pin_banks = rk3308_pin_banks,
  360. .banks_nr = RT_ARRAY_SIZE(rk3308_pin_banks),
  361. .label = "RK3308-GPIO",
  362. .type = RK3308,
  363. .grf_mux_offset = 0x0,
  364. .grf_drv_offset = RK3308_DRV_GRF_OFFSET,
  365. .iomux_recalced = rk3308_mux_recalced_data,
  366. .niomux_recalced = RT_ARRAY_SIZE(rk3308_mux_recalced_data),
  367. .iomux_routes = rk3308_mux_route_data,
  368. .niomux_routes = RT_ARRAY_SIZE(rk3308_mux_route_data),
  369. .set_mux = rk3308_set_mux,
  370. .set_pull = rk3308_set_pull,
  371. .set_drive = rk3308_set_drive,
  372. .set_schmitt = rk3308_set_schmitt,
  373. };
  374. static struct rockchip_mux_route_data rk3568_mux_route_data[] =
  375. {
  376. RK_MUXROUTE_PMU(0, RK_PB7, 1, 0x0110, WRITE_MASK_VAL(1, 0, 0)), /* PWM0 IO mux M0 */
  377. RK_MUXROUTE_PMU(0, RK_PC7, 2, 0x0110, WRITE_MASK_VAL(1, 0, 1)), /* PWM0 IO mux M1 */
  378. RK_MUXROUTE_PMU(0, RK_PC0, 1, 0x0110, WRITE_MASK_VAL(3, 2, 0)), /* PWM1 IO mux M0 */
  379. RK_MUXROUTE_PMU(0, RK_PB5, 4, 0x0110, WRITE_MASK_VAL(3, 2, 1)), /* PWM1 IO mux M1 */
  380. RK_MUXROUTE_PMU(0, RK_PC1, 1, 0x0110, WRITE_MASK_VAL(5, 4, 0)), /* PWM2 IO mux M0 */
  381. RK_MUXROUTE_PMU(0, RK_PB6, 4, 0x0110, WRITE_MASK_VAL(5, 4, 1)), /* PWM2 IO mux M1 */
  382. RK_MUXROUTE_GRF(0, RK_PB3, 2, 0x0300, WRITE_MASK_VAL(0, 0, 0)), /* CAN0 IO mux M0 */
  383. RK_MUXROUTE_GRF(2, RK_PA1, 4, 0x0300, WRITE_MASK_VAL(0, 0, 1)), /* CAN0 IO mux M1 */
  384. RK_MUXROUTE_GRF(1, RK_PA1, 3, 0x0300, WRITE_MASK_VAL(2, 2, 0)), /* CAN1 IO mux M0 */
  385. RK_MUXROUTE_GRF(4, RK_PC3, 3, 0x0300, WRITE_MASK_VAL(2, 2, 1)), /* CAN1 IO mux M1 */
  386. RK_MUXROUTE_GRF(4, RK_PB5, 3, 0x0300, WRITE_MASK_VAL(4, 4, 0)), /* CAN2 IO mux M0 */
  387. RK_MUXROUTE_GRF(2, RK_PB2, 4, 0x0300, WRITE_MASK_VAL(4, 4, 1)), /* CAN2 IO mux M1 */
  388. RK_MUXROUTE_GRF(4, RK_PC4, 1, 0x0300, WRITE_MASK_VAL(6, 6, 0)), /* HPDIN IO mux M0 */
  389. RK_MUXROUTE_GRF(0, RK_PC2, 2, 0x0300, WRITE_MASK_VAL(6, 6, 1)), /* HPDIN IO mux M1 */
  390. RK_MUXROUTE_GRF(3, RK_PB1, 3, 0x0300, WRITE_MASK_VAL(8, 8, 0)), /* GMAC1 IO mux M0 */
  391. RK_MUXROUTE_GRF(4, RK_PA7, 3, 0x0300, WRITE_MASK_VAL(8, 8, 1)), /* GMAC1 IO mux M1 */
  392. RK_MUXROUTE_GRF(4, RK_PD1, 1, 0x0300, WRITE_MASK_VAL(10, 10, 0)), /* HDMITX IO mux M0 */
  393. RK_MUXROUTE_GRF(0, RK_PC7, 1, 0x0300, WRITE_MASK_VAL(10, 10, 1)), /* HDMITX IO mux M1 */
  394. RK_MUXROUTE_GRF(0, RK_PB6, 1, 0x0300, WRITE_MASK_VAL(14, 14, 0)), /* I2C2 IO mux M0 */
  395. RK_MUXROUTE_GRF(4, RK_PB4, 1, 0x0300, WRITE_MASK_VAL(14, 14, 1)), /* I2C2 IO mux M1 */
  396. RK_MUXROUTE_GRF(1, RK_PA0, 1, 0x0304, WRITE_MASK_VAL(0, 0, 0)), /* I2C3 IO mux M0 */
  397. RK_MUXROUTE_GRF(3, RK_PB6, 4, 0x0304, WRITE_MASK_VAL(0, 0, 1)), /* I2C3 IO mux M1 */
  398. RK_MUXROUTE_GRF(4, RK_PB2, 1, 0x0304, WRITE_MASK_VAL(2, 2, 0)), /* I2C4 IO mux M0 */
  399. RK_MUXROUTE_GRF(2, RK_PB1, 2, 0x0304, WRITE_MASK_VAL(2, 2, 1)), /* I2C4 IO mux M1 */
  400. RK_MUXROUTE_GRF(3, RK_PB4, 4, 0x0304, WRITE_MASK_VAL(4, 4, 0)), /* I2C5 IO mux M0 */
  401. RK_MUXROUTE_GRF(4, RK_PD0, 2, 0x0304, WRITE_MASK_VAL(4, 4, 1)), /* I2C5 IO mux M1 */
  402. RK_MUXROUTE_GRF(3, RK_PB1, 5, 0x0304, WRITE_MASK_VAL(14, 14, 0)), /* PWM8 IO mux M0 */
  403. RK_MUXROUTE_GRF(1, RK_PD5, 4, 0x0304, WRITE_MASK_VAL(14, 14, 1)), /* PWM8 IO mux M1 */
  404. RK_MUXROUTE_GRF(3, RK_PB2, 5, 0x0308, WRITE_MASK_VAL(0, 0, 0)), /* PWM9 IO mux M0 */
  405. RK_MUXROUTE_GRF(1, RK_PD6, 4, 0x0308, WRITE_MASK_VAL(0, 0, 1)), /* PWM9 IO mux M1 */
  406. RK_MUXROUTE_GRF(3, RK_PB5, 5, 0x0308, WRITE_MASK_VAL(2, 2, 0)), /* PWM10 IO mux M0 */
  407. RK_MUXROUTE_GRF(2, RK_PA1, 2, 0x0308, WRITE_MASK_VAL(2, 2, 1)), /* PWM10 IO mux M1 */
  408. RK_MUXROUTE_GRF(3, RK_PB6, 5, 0x0308, WRITE_MASK_VAL(4, 4, 0)), /* PWM11 IO mux M0 */
  409. RK_MUXROUTE_GRF(4, RK_PC0, 3, 0x0308, WRITE_MASK_VAL(4, 4, 1)), /* PWM11 IO mux M1 */
  410. RK_MUXROUTE_GRF(3, RK_PB7, 2, 0x0308, WRITE_MASK_VAL(6, 6, 0)), /* PWM12 IO mux M0 */
  411. RK_MUXROUTE_GRF(4, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(6, 6, 1)), /* PWM12 IO mux M1 */
  412. RK_MUXROUTE_GRF(3, RK_PC0, 2, 0x0308, WRITE_MASK_VAL(8, 8, 0)), /* PWM13 IO mux M0 */
  413. RK_MUXROUTE_GRF(4, RK_PC6, 1, 0x0308, WRITE_MASK_VAL(8, 8, 1)), /* PWM13 IO mux M1 */
  414. RK_MUXROUTE_GRF(3, RK_PC4, 1, 0x0308, WRITE_MASK_VAL(10, 10, 0)), /* PWM14 IO mux M0 */
  415. RK_MUXROUTE_GRF(4, RK_PC2, 1, 0x0308, WRITE_MASK_VAL(10, 10, 1)), /* PWM14 IO mux M1 */
  416. RK_MUXROUTE_GRF(3, RK_PC5, 1, 0x0308, WRITE_MASK_VAL(12, 12, 0)), /* PWM15 IO mux M0 */
  417. RK_MUXROUTE_GRF(4, RK_PC3, 1, 0x0308, WRITE_MASK_VAL(12, 12, 1)), /* PWM15 IO mux M1 */
  418. RK_MUXROUTE_GRF(3, RK_PD2, 3, 0x0308, WRITE_MASK_VAL(14, 14, 0)), /* SDMMC2 IO mux M0 */
  419. RK_MUXROUTE_GRF(3, RK_PA5, 5, 0x0308, WRITE_MASK_VAL(14, 14, 1)), /* SDMMC2 IO mux M1 */
  420. RK_MUXROUTE_GRF(0, RK_PB5, 2, 0x030c, WRITE_MASK_VAL(0, 0, 0)), /* SPI0 IO mux M0 */
  421. RK_MUXROUTE_GRF(2, RK_PD3, 3, 0x030c, WRITE_MASK_VAL(0, 0, 1)), /* SPI0 IO mux M1 */
  422. RK_MUXROUTE_GRF(2, RK_PB5, 3, 0x030c, WRITE_MASK_VAL(2, 2, 0)), /* SPI1 IO mux M0 */
  423. RK_MUXROUTE_GRF(3, RK_PC3, 3, 0x030c, WRITE_MASK_VAL(2, 2, 1)), /* SPI1 IO mux M1 */
  424. RK_MUXROUTE_GRF(2, RK_PC1, 4, 0x030c, WRITE_MASK_VAL(4, 4, 0)), /* SPI2 IO mux M0 */
  425. RK_MUXROUTE_GRF(3, RK_PA0, 3, 0x030c, WRITE_MASK_VAL(4, 4, 1)), /* SPI2 IO mux M1 */
  426. RK_MUXROUTE_GRF(4, RK_PB3, 4, 0x030c, WRITE_MASK_VAL(6, 6, 0)), /* SPI3 IO mux M0 */
  427. RK_MUXROUTE_GRF(4, RK_PC2, 2, 0x030c, WRITE_MASK_VAL(6, 6, 1)), /* SPI3 IO mux M1 */
  428. RK_MUXROUTE_GRF(2, RK_PB4, 2, 0x030c, WRITE_MASK_VAL(8, 8, 0)), /* UART1 IO mux M0 */
  429. RK_MUXROUTE_GRF(3, RK_PD6, 4, 0x030c, WRITE_MASK_VAL(8, 8, 1)), /* UART1 IO mux M1 */
  430. RK_MUXROUTE_GRF(0, RK_PD1, 1, 0x030c, WRITE_MASK_VAL(10, 10, 0)), /* UART2 IO mux M0 */
  431. RK_MUXROUTE_GRF(1, RK_PD5, 2, 0x030c, WRITE_MASK_VAL(10, 10, 1)), /* UART2 IO mux M1 */
  432. RK_MUXROUTE_GRF(1, RK_PA1, 2, 0x030c, WRITE_MASK_VAL(12, 12, 0)), /* UART3 IO mux M0 */
  433. RK_MUXROUTE_GRF(3, RK_PB7, 4, 0x030c, WRITE_MASK_VAL(12, 12, 1)), /* UART3 IO mux M1 */
  434. RK_MUXROUTE_GRF(1, RK_PA6, 2, 0x030c, WRITE_MASK_VAL(14, 14, 0)), /* UART4 IO mux M0 */
  435. RK_MUXROUTE_GRF(3, RK_PB2, 4, 0x030c, WRITE_MASK_VAL(14, 14, 1)), /* UART4 IO mux M1 */
  436. RK_MUXROUTE_GRF(2, RK_PA2, 3, 0x0310, WRITE_MASK_VAL(0, 0, 0)), /* UART5 IO mux M0 */
  437. RK_MUXROUTE_GRF(3, RK_PC2, 4, 0x0310, WRITE_MASK_VAL(0, 0, 1)), /* UART5 IO mux M1 */
  438. RK_MUXROUTE_GRF(2, RK_PA4, 3, 0x0310, WRITE_MASK_VAL(2, 2, 0)), /* UART6 IO mux M0 */
  439. RK_MUXROUTE_GRF(1, RK_PD5, 3, 0x0310, WRITE_MASK_VAL(2, 2, 1)), /* UART6 IO mux M1 */
  440. RK_MUXROUTE_GRF(2, RK_PA6, 3, 0x0310, WRITE_MASK_VAL(5, 4, 0)), /* UART7 IO mux M0 */
  441. RK_MUXROUTE_GRF(3, RK_PC4, 4, 0x0310, WRITE_MASK_VAL(5, 4, 1)), /* UART7 IO mux M1 */
  442. RK_MUXROUTE_GRF(4, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(5, 4, 2)), /* UART7 IO mux M2 */
  443. RK_MUXROUTE_GRF(2, RK_PC5, 3, 0x0310, WRITE_MASK_VAL(6, 6, 0)), /* UART8 IO mux M0 */
  444. RK_MUXROUTE_GRF(2, RK_PD7, 4, 0x0310, WRITE_MASK_VAL(6, 6, 1)), /* UART8 IO mux M1 */
  445. RK_MUXROUTE_GRF(2, RK_PB0, 3, 0x0310, WRITE_MASK_VAL(9, 8, 0)), /* UART9 IO mux M0 */
  446. RK_MUXROUTE_GRF(4, RK_PC5, 4, 0x0310, WRITE_MASK_VAL(9, 8, 1)), /* UART9 IO mux M1 */
  447. RK_MUXROUTE_GRF(4, RK_PA4, 4, 0x0310, WRITE_MASK_VAL(9, 8, 2)), /* UART9 IO mux M2 */
  448. RK_MUXROUTE_GRF(1, RK_PA2, 1, 0x0310, WRITE_MASK_VAL(11, 10, 0)), /* I2S1 IO mux M0 */
  449. RK_MUXROUTE_GRF(3, RK_PC6, 4, 0x0310, WRITE_MASK_VAL(11, 10, 1)), /* I2S1 IO mux M1 */
  450. RK_MUXROUTE_GRF(2, RK_PD0, 5, 0x0310, WRITE_MASK_VAL(11, 10, 2)), /* I2S1 IO mux M2 */
  451. RK_MUXROUTE_GRF(2, RK_PC1, 1, 0x0310, WRITE_MASK_VAL(12, 12, 0)), /* I2S2 IO mux M0 */
  452. RK_MUXROUTE_GRF(4, RK_PB6, 5, 0x0310, WRITE_MASK_VAL(12, 12, 1)), /* I2S2 IO mux M1 */
  453. RK_MUXROUTE_GRF(3, RK_PA2, 4, 0x0310, WRITE_MASK_VAL(14, 14, 0)), /* I2S3 IO mux M0 */
  454. RK_MUXROUTE_GRF(4, RK_PC2, 5, 0x0310, WRITE_MASK_VAL(14, 14, 1)), /* I2S3 IO mux M1 */
  455. RK_MUXROUTE_GRF(1, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
  456. RK_MUXROUTE_GRF(1, RK_PA6, 3, 0x0314, WRITE_MASK_VAL(1, 0, 0)), /* PDM IO mux M0 */
  457. RK_MUXROUTE_GRF(3, RK_PD6, 5, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
  458. RK_MUXROUTE_GRF(4, RK_PA0, 4, 0x0314, WRITE_MASK_VAL(1, 0, 1)), /* PDM IO mux M1 */
  459. RK_MUXROUTE_GRF(3, RK_PC4, 5, 0x0314, WRITE_MASK_VAL(1, 0, 2)), /* PDM IO mux M2 */
  460. RK_MUXROUTE_GRF(0, RK_PA5, 3, 0x0314, WRITE_MASK_VAL(3, 2, 0)), /* PCIE20 IO mux M0 */
  461. RK_MUXROUTE_GRF(2, RK_PD0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 1)), /* PCIE20 IO mux M1 */
  462. RK_MUXROUTE_GRF(1, RK_PB0, 4, 0x0314, WRITE_MASK_VAL(3, 2, 2)), /* PCIE20 IO mux M2 */
  463. RK_MUXROUTE_GRF(0, RK_PA4, 3, 0x0314, WRITE_MASK_VAL(5, 4, 0)), /* PCIE30X1 IO mux M0 */
  464. RK_MUXROUTE_GRF(2, RK_PD2, 4, 0x0314, WRITE_MASK_VAL(5, 4, 1)), /* PCIE30X1 IO mux M1 */
  465. RK_MUXROUTE_GRF(1, RK_PA5, 4, 0x0314, WRITE_MASK_VAL(5, 4, 2)), /* PCIE30X1 IO mux M2 */
  466. RK_MUXROUTE_GRF(0, RK_PA6, 2, 0x0314, WRITE_MASK_VAL(7, 6, 0)), /* PCIE30X2 IO mux M0 */
  467. RK_MUXROUTE_GRF(2, RK_PD4, 4, 0x0314, WRITE_MASK_VAL(7, 6, 1)), /* PCIE30X2 IO mux M1 */
  468. RK_MUXROUTE_GRF(4, RK_PC2, 4, 0x0314, WRITE_MASK_VAL(7, 6, 2)), /* PCIE30X2 IO mux M2 */
  469. };
  470. static rt_err_t rk3568_set_mux(struct rockchip_pin_bank *pin_bank, int pin, int mux)
  471. {
  472. rt_uint8_t bit;
  473. rt_uint32_t data;
  474. rt_uint32_t route_location, route_reg, route_val;
  475. int iomux_num = (pin / 8), reg, mask;
  476. struct rt_syscon *regmap;
  477. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  478. if ((pin_bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU))
  479. {
  480. regmap = drvdata->regmap_pmu;
  481. }
  482. else
  483. {
  484. regmap = drvdata->regmap_base;
  485. }
  486. reg = pin_bank->iomux[iomux_num].offset;
  487. if ((pin % 8) >= 4)
  488. {
  489. reg += 0x4;
  490. }
  491. bit = (pin % 4) * 4;
  492. mask = 0xf;
  493. if (pin_bank->route_mask & RT_BIT(pin))
  494. {
  495. if (rockchip_translate_mux_route(pin_bank, pin, mux, &route_location,
  496. &route_reg, &route_val))
  497. {
  498. rt_err_t err;
  499. struct rt_syscon *route_regmap;
  500. /* handle special locations */
  501. switch (route_location)
  502. {
  503. case ROCKCHIP_ROUTE_PMU:
  504. route_regmap = drvdata->regmap_pmu;
  505. break;
  506. case ROCKCHIP_ROUTE_GRF:
  507. route_regmap = drvdata->regmap_base;
  508. break;
  509. default:
  510. route_regmap = regmap;
  511. break;
  512. }
  513. if ((err = rt_syscon_write(route_regmap, route_reg, route_val)))
  514. {
  515. return err;
  516. }
  517. }
  518. }
  519. data = (mask << (bit + 16));
  520. data |= (mux & mask) << bit;
  521. return rt_syscon_write(regmap, reg, data);
  522. }
  523. #define RK3568_PULL_PMU_OFFSET 0x20
  524. #define RK3568_PULL_GRF_OFFSET 0x80
  525. #define RK3568_PULL_BITS_PER_PIN 2
  526. #define RK3568_PULL_PINS_PER_REG 8
  527. #define RK3568_PULL_BANK_STRIDE 0x10
  528. static rt_err_t rk3568_set_pull(struct rockchip_pin_bank *pin_bank, int pin, int pull)
  529. {
  530. int reg, pull_value;
  531. rt_uint32_t data;
  532. rt_uint8_t bit, type;
  533. struct rt_syscon *regmap;
  534. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  535. if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
  536. {
  537. return -RT_ENOSYS;
  538. }
  539. if (pin_bank->bank_num == 0)
  540. {
  541. regmap = drvdata->regmap_pmu;
  542. reg = RK3568_PULL_PMU_OFFSET;
  543. reg += pin_bank->bank_num * RK3568_PULL_BANK_STRIDE;
  544. }
  545. else
  546. {
  547. regmap = drvdata->regmap_base;
  548. reg = RK3568_PULL_GRF_OFFSET;
  549. reg += (pin_bank->bank_num - 1) * RK3568_PULL_BANK_STRIDE;
  550. }
  551. reg += ((pin / RK3568_PULL_PINS_PER_REG) * 4);
  552. bit = (pin % RK3568_PULL_PINS_PER_REG);
  553. bit *= RK3568_PULL_BITS_PER_PIN;
  554. type = pin_bank->pull_type[pin / 8];
  555. pull_value = rockchip_translate_pull_value(type, pull);
  556. /*
  557. * pull-up being 1 for everything except the GPIO0_D3-D6,
  558. * where that pull up value becomes 3
  559. */
  560. if (pin_bank->bank_num == 0 && pin >= RK_GPIO0_D3 && pin <= RK_GPIO0_D6)
  561. {
  562. if (pull_value == 1)
  563. {
  564. pull_value = 3;
  565. }
  566. }
  567. if (pull_value < 0)
  568. {
  569. LOG_E("Not supported pull = %d, fixup the code or firmware", pull);
  570. return pull_value;
  571. }
  572. /* enable the write to the equivalent lower bits */
  573. data = ((1 << ROCKCHIP_PULL_BITS_PER_PIN) - 1) << (bit + 16);
  574. data |= (pull_value << bit);
  575. return rt_syscon_write(regmap, reg, data);
  576. }
  577. #define RK3568_DRV_PMU_OFFSET 0x70
  578. #define RK3568_DRV_GRF_OFFSET 0x200
  579. #define RK3568_DRV_BITS_PER_PIN 8
  580. #define RK3568_DRV_PINS_PER_REG 2
  581. #define RK3568_DRV_BANK_STRIDE 0x40
  582. #define RK3568_GRF_GPIO1C5_DS 0x840
  583. #define RK3568_GRF_GPIO2A2_DS 0x844
  584. #define RK3568_GRF_GPIO2B0_DS 0x848
  585. #define RK3568_GRF_GPIO3A0_DS 0x84c
  586. #define RK3568_GRF_GPIO3A6_DS 0x850
  587. #define RK3568_GRF_GPIO4A0_DS 0x854
  588. static rt_err_t rk3568_set_drive(struct rockchip_pin_bank *pin_bank, int pin, int strength)
  589. {
  590. rt_err_t err;
  591. rt_uint8_t bit;
  592. rt_uint32_t data;
  593. int reg, drv = (1 << (strength + 1)) - 1;
  594. struct rt_syscon *regmap;
  595. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  596. if (pin_bank->bank_num == 0)
  597. {
  598. regmap = drvdata->regmap_pmu;
  599. reg = RK3568_DRV_PMU_OFFSET;
  600. }
  601. else
  602. {
  603. regmap = drvdata->regmap_base;
  604. reg = RK3568_DRV_GRF_OFFSET;
  605. reg += (pin_bank->bank_num - 1) * RK3568_DRV_BANK_STRIDE;
  606. }
  607. reg += ((pin / RK3568_DRV_PINS_PER_REG) * 4);
  608. bit = (pin % RK3568_DRV_PINS_PER_REG);
  609. bit *= RK3568_DRV_BITS_PER_PIN;
  610. /* enable the write to the equivalent lower bits */
  611. data = ((1 << RK3568_DRV_BITS_PER_PIN) - 1) << (bit + 16);
  612. data |= (drv << bit);
  613. if ((err = rt_syscon_write(regmap, reg, data)))
  614. {
  615. return err;
  616. }
  617. if (pin_bank->bank_num == RK_GPIO1 && pin == RK_PC5)
  618. {
  619. reg = RK3568_GRF_GPIO1C5_DS;
  620. }
  621. else if (pin_bank->bank_num == RK_GPIO2 && pin == RK_PA2)
  622. {
  623. reg = RK3568_GRF_GPIO2A2_DS;
  624. }
  625. else if (pin_bank->bank_num == RK_GPIO2 && pin == RK_PB0)
  626. {
  627. reg = RK3568_GRF_GPIO2B0_DS;
  628. }
  629. else if (pin_bank->bank_num == RK_GPIO3 && pin == RK_PA0)
  630. {
  631. reg = RK3568_GRF_GPIO3A0_DS;
  632. }
  633. else if (pin_bank->bank_num == RK_GPIO3 && pin == RK_PA6)
  634. {
  635. reg = RK3568_GRF_GPIO3A6_DS;
  636. }
  637. else if (pin_bank->bank_num == RK_GPIO4 && pin == RK_PA0)
  638. {
  639. reg = RK3568_GRF_GPIO4A0_DS;
  640. }
  641. else
  642. {
  643. return RT_EOK;
  644. }
  645. data = ((1 << RK3568_DRV_BITS_PER_PIN) - 1) << 16;
  646. data |= drv;
  647. return rt_syscon_write(regmap, reg, data);
  648. }
  649. #define RK3568_SCHMITT_BITS_PER_PIN 2
  650. #define RK3568_SCHMITT_PINS_PER_REG 8
  651. #define RK3568_SCHMITT_BANK_STRIDE 0x10
  652. #define RK3568_SCHMITT_GRF_OFFSET 0xc0
  653. #define RK3568_SCHMITT_PMUGRF_OFFSET 0x30
  654. static rt_err_t rk3568_set_schmitt(struct rockchip_pin_bank *pin_bank, int pin, int enable)
  655. {
  656. int reg;
  657. rt_uint8_t bit;
  658. rt_uint32_t data;
  659. struct rt_syscon *regmap;
  660. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  661. if (pin_bank->bank_num == 0)
  662. {
  663. regmap = drvdata->regmap_pmu;
  664. reg = RK3568_SCHMITT_PMUGRF_OFFSET;
  665. }
  666. else
  667. {
  668. regmap = drvdata->regmap_base;
  669. reg = RK3568_SCHMITT_GRF_OFFSET;
  670. reg += (pin_bank->bank_num - 1) * RK3568_SCHMITT_BANK_STRIDE;
  671. }
  672. reg += ((pin / RK3568_SCHMITT_PINS_PER_REG) * 4);
  673. bit = pin % RK3568_SCHMITT_PINS_PER_REG;
  674. bit *= RK3568_SCHMITT_BITS_PER_PIN;
  675. /* enable the write to the equivalent lower bits */
  676. data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
  677. data |= (enable << bit);
  678. return rt_syscon_write(regmap, reg, data);
  679. }
  680. static struct rockchip_pin_bank rk3568_pin_banks[] =
  681. {
  682. PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
  683. IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT),
  684. PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT),
  685. PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT),
  686. PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT),
  687. PIN_BANK_IOMUX_FLAGS(4, 32, "gpio4", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT),
  688. };
  689. static struct rockchip_pin_ctrl rk3568_pin_ctrl =
  690. {
  691. .pin_banks = rk3568_pin_banks,
  692. .banks_nr = RT_ARRAY_SIZE(rk3568_pin_banks),
  693. .label = "RK3568-GPIO",
  694. .type = RK3568,
  695. .grf_mux_offset = 0x0,
  696. .pmu_mux_offset = 0x0,
  697. .grf_drv_offset = RK3568_DRV_GRF_OFFSET,
  698. .pmu_drv_offset = RK3568_DRV_PMU_OFFSET,
  699. .iomux_routes = rk3568_mux_route_data,
  700. .niomux_routes = RT_ARRAY_SIZE(rk3568_mux_route_data),
  701. .set_mux = rk3568_set_mux,
  702. .set_pull = rk3568_set_pull,
  703. .set_drive = rk3568_set_drive,
  704. .set_schmitt = rk3568_set_schmitt,
  705. };
  706. static rt_err_t rk3576_set_mux(struct rockchip_pin_bank *pin_bank, int pin, int mux)
  707. {
  708. rt_uint8_t bit;
  709. rt_uint32_t data;
  710. int iomux_num = (pin / 8), reg, mask;
  711. struct rt_syscon *regmap;
  712. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  713. regmap = drvdata->regmap_base;
  714. reg = pin_bank->iomux[iomux_num].offset;
  715. if ((pin % 8) >= 4)
  716. {
  717. reg += 0x4;
  718. }
  719. bit = (pin % 4) * 4;
  720. mask = 0xf;
  721. data = (mask << (bit + 16));
  722. data |= (mux & mask) << bit;
  723. if (pin_bank->bank_num == 0 && pin >= RK_PB4 && pin <= RK_PB7)
  724. {
  725. /* GPIO0_IOC_GPIO0B_IOMUX_SEL_H */
  726. reg += 0x1ff4;
  727. }
  728. return rt_syscon_write(regmap, reg, data);
  729. }
  730. #define RK3576_DRV_BITS_PER_PIN 4
  731. #define RK3576_DRV_PINS_PER_REG 4
  732. #define RK3576_DRV_GPIO0_AL_OFFSET 0x10
  733. #define RK3576_DRV_GPIO0_BH_OFFSET 0x2014
  734. #define RK3576_DRV_GPIO1_OFFSET 0x6020
  735. #define RK3576_DRV_GPIO2_OFFSET 0x6040
  736. #define RK3576_DRV_GPIO3_OFFSET 0x6060
  737. #define RK3576_DRV_GPIO4_AL_OFFSET 0x6080
  738. #define RK3576_DRV_GPIO4_CL_OFFSET 0xa090
  739. #define RK3576_DRV_GPIO4_DL_OFFSET 0xb098
  740. static rt_err_t rk3576_set_drive(struct rockchip_pin_bank *pin_bank, int pin_num, int strength)
  741. {
  742. rt_uint8_t bit;
  743. rt_uint32_t data;
  744. int reg, drv = ((strength & RT_BIT(2)) >> 2) | ((strength & RT_BIT(0)) << 2) | (strength & RT_BIT(1));
  745. struct rt_syscon *regmap;
  746. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  747. regmap = drvdata->regmap_base;
  748. if (pin_bank->bank_num == 0 && pin_num < 12)
  749. {
  750. reg = RK3576_DRV_GPIO0_AL_OFFSET;
  751. }
  752. else if (pin_bank->bank_num == 0)
  753. {
  754. reg = RK3576_DRV_GPIO0_BH_OFFSET - 0xc;
  755. }
  756. else if (pin_bank->bank_num == 1)
  757. {
  758. reg = RK3576_DRV_GPIO1_OFFSET;
  759. }
  760. else if (pin_bank->bank_num == 2)
  761. {
  762. reg = RK3576_DRV_GPIO2_OFFSET;
  763. }
  764. else if (pin_bank->bank_num == 3)
  765. {
  766. reg = RK3576_DRV_GPIO3_OFFSET;
  767. }
  768. else if (pin_bank->bank_num == 4 && pin_num < 16)
  769. {
  770. reg = RK3576_DRV_GPIO4_AL_OFFSET;
  771. }
  772. else if (pin_bank->bank_num == 4 && pin_num < 24)
  773. {
  774. reg = RK3576_DRV_GPIO4_CL_OFFSET - 0x10;
  775. }
  776. else if (pin_bank->bank_num == 4)
  777. {
  778. reg = RK3576_DRV_GPIO4_DL_OFFSET - 0x18;
  779. }
  780. else
  781. {
  782. reg = 0;
  783. LOG_E("Unsupported bank_num %d", pin_bank->bank_num);
  784. }
  785. reg += ((pin_num / RK3576_DRV_PINS_PER_REG) * 4);
  786. bit = pin_num % RK3576_DRV_PINS_PER_REG;
  787. bit *= RK3576_DRV_BITS_PER_PIN;
  788. /* enable the write to the equivalent lower bits */
  789. data = ((1 << RK3576_DRV_BITS_PER_PIN) - 1) << (bit + 16);
  790. data |= (drv << bit);
  791. return rt_syscon_write(regmap, reg, data);
  792. }
  793. #define RK3576_PULL_BITS_PER_PIN 2
  794. #define RK3576_PULL_PINS_PER_REG 8
  795. #define RK3576_PULL_GPIO0_AL_OFFSET 0x20
  796. #define RK3576_PULL_GPIO0_BH_OFFSET 0x2028
  797. #define RK3576_PULL_GPIO1_OFFSET 0x6110
  798. #define RK3576_PULL_GPIO2_OFFSET 0x6120
  799. #define RK3576_PULL_GPIO3_OFFSET 0x6130
  800. #define RK3576_PULL_GPIO4_AL_OFFSET 0x6140
  801. #define RK3576_PULL_GPIO4_CL_OFFSET 0xa148
  802. #define RK3576_PULL_GPIO4_DL_OFFSET 0xb14c
  803. static rt_err_t rk3576_set_pull(struct rockchip_pin_bank *pin_bank, int pin_num, int pull)
  804. {
  805. int reg, pull_value;
  806. rt_uint32_t data;
  807. rt_uint8_t bit, type;
  808. struct rt_syscon *regmap;
  809. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  810. if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
  811. {
  812. return -RT_ENOSYS;
  813. }
  814. regmap = drvdata->regmap_base;
  815. if (pin_bank->bank_num == 0 && pin_num < 12)
  816. {
  817. reg = RK3576_PULL_GPIO0_AL_OFFSET;
  818. }
  819. else if (pin_bank->bank_num == 0)
  820. {
  821. reg = RK3576_PULL_GPIO0_BH_OFFSET - 0x4;
  822. }
  823. else if (pin_bank->bank_num == 1)
  824. {
  825. reg = RK3576_PULL_GPIO1_OFFSET;
  826. }
  827. else if (pin_bank->bank_num == 2)
  828. {
  829. reg = RK3576_PULL_GPIO2_OFFSET;
  830. }
  831. else if (pin_bank->bank_num == 3)
  832. {
  833. reg = RK3576_PULL_GPIO3_OFFSET;
  834. }
  835. else if (pin_bank->bank_num == 4 && pin_num < 16)
  836. {
  837. reg = RK3576_PULL_GPIO4_AL_OFFSET;
  838. }
  839. else if (pin_bank->bank_num == 4 && pin_num < 24)
  840. {
  841. reg = RK3576_PULL_GPIO4_CL_OFFSET - 0x8;
  842. }
  843. else if (pin_bank->bank_num == 4)
  844. {
  845. reg = RK3576_PULL_GPIO4_DL_OFFSET - 0xc;
  846. }
  847. else
  848. {
  849. reg = 0;
  850. LOG_E("Unsupported bank_num %d", pin_bank->bank_num);
  851. }
  852. reg += ((pin_num / RK3576_PULL_PINS_PER_REG) * 4);
  853. bit = pin_num % RK3576_PULL_PINS_PER_REG;
  854. bit *= RK3576_PULL_BITS_PER_PIN;
  855. type = pin_bank->pull_type[pin_num / 8];
  856. pull_value = rockchip_translate_pull_value(type, pull);
  857. if (pull_value < 0)
  858. {
  859. LOG_E("Not supported pull = %d, fixup the code or firmware", pull);
  860. return pull_value;
  861. }
  862. /* enable the write to the equivalent lower bits */
  863. data = ((1 << RK3576_PULL_BITS_PER_PIN) - 1) << (bit + 16);
  864. data |= (pull_value << bit);
  865. return rt_syscon_write(regmap, reg, data);
  866. }
  867. #define RK3576_SMT_BITS_PER_PIN 1
  868. #define RK3576_SMT_PINS_PER_REG 8
  869. #define RK3576_SMT_GPIO0_AL_OFFSET 0x30
  870. #define RK3576_SMT_GPIO0_BH_OFFSET 0x2040
  871. #define RK3576_SMT_GPIO1_OFFSET 0x6210
  872. #define RK3576_SMT_GPIO2_OFFSET 0x6220
  873. #define RK3576_SMT_GPIO3_OFFSET 0x6230
  874. #define RK3576_SMT_GPIO4_AL_OFFSET 0x6240
  875. #define RK3576_SMT_GPIO4_CL_OFFSET 0xA248
  876. #define RK3576_SMT_GPIO4_DL_OFFSET 0xB24C
  877. static rt_err_t rk3576_set_schmitt(struct rockchip_pin_bank *pin_bank, int pin_num, int enable)
  878. {
  879. int reg;
  880. rt_uint8_t bit;
  881. rt_uint32_t data;
  882. struct rt_syscon *regmap;
  883. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  884. regmap = drvdata->regmap_base;
  885. if (pin_bank->bank_num == 0 && pin_num < 12)
  886. {
  887. reg = RK3576_SMT_GPIO0_AL_OFFSET;
  888. }
  889. else if (pin_bank->bank_num == 0)
  890. {
  891. reg = RK3576_SMT_GPIO0_BH_OFFSET - 0x4;
  892. }
  893. else if (pin_bank->bank_num == 1)
  894. {
  895. reg = RK3576_SMT_GPIO1_OFFSET;
  896. }
  897. else if (pin_bank->bank_num == 2)
  898. {
  899. reg = RK3576_SMT_GPIO2_OFFSET;
  900. }
  901. else if (pin_bank->bank_num == 3)
  902. {
  903. reg = RK3576_SMT_GPIO3_OFFSET;
  904. }
  905. else if (pin_bank->bank_num == 4 && pin_num < 16)
  906. {
  907. reg = RK3576_SMT_GPIO4_AL_OFFSET;
  908. }
  909. else if (pin_bank->bank_num == 4 && pin_num < 24)
  910. {
  911. reg = RK3576_SMT_GPIO4_CL_OFFSET - 0x8;
  912. }
  913. else if (pin_bank->bank_num == 4)
  914. {
  915. reg = RK3576_SMT_GPIO4_DL_OFFSET - 0xc;
  916. }
  917. else
  918. {
  919. reg = 0;
  920. LOG_E("Unsupported bank_num %d", pin_bank->bank_num);
  921. }
  922. reg += ((pin_num / RK3576_SMT_PINS_PER_REG) * 4);
  923. bit = pin_num % RK3576_SMT_PINS_PER_REG;
  924. bit *= RK3576_SMT_BITS_PER_PIN;
  925. /* enable the write to the equivalent lower bits */
  926. data = ((1 << RK3576_SMT_BITS_PER_PIN) - 1) << (bit + 16);
  927. data |= (enable << bit);
  928. return rt_syscon_write(regmap, reg, data);
  929. }
  930. static struct rockchip_pin_bank rk3576_pin_banks[] =
  931. {
  932. PIN_BANK_OFFSET4(0, "gpio0", 0, 0x8, 0x2004, 0x200C),
  933. PIN_BANK_OFFSET4(1, "gpio1", 0x4020, 0x4028, 0x4030, 0x4038),
  934. PIN_BANK_OFFSET4(2, "gpio2", 0x4040, 0x4048, 0x4050, 0x4058),
  935. PIN_BANK_OFFSET4(3, "gpio3", 0x4060, 0x4068, 0x4070, 0x4078),
  936. PIN_BANK_OFFSET4(4, "gpio4", 0x4080, 0x4088, 0xA390, 0xB398),
  937. };
  938. static const struct rockchip_pin_ctrl rk3576_pin_ctrl =
  939. {
  940. .pin_banks = rk3576_pin_banks,
  941. .banks_nr = RT_ARRAY_SIZE(rk3576_pin_banks),
  942. .pins_nr = 160,
  943. .grf_mux_offset = 0x0,
  944. .set_mux = rk3576_set_mux,
  945. .set_pull = rk3576_set_pull,
  946. .set_drive = rk3576_set_drive,
  947. .set_schmitt = rk3576_set_schmitt,
  948. };
  949. static rt_err_t rk3588_set_mux(struct rockchip_pin_bank *pin_bank, int pin, int mux)
  950. {
  951. rt_err_t err;
  952. rt_uint8_t bit;
  953. rt_uint32_t data;
  954. int iomux_num = (pin / 8), reg, mask;
  955. struct rt_syscon *regmap;
  956. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  957. regmap = drvdata->regmap_base;
  958. reg = pin_bank->iomux[iomux_num].offset;
  959. if (pin % 8 >= 4)
  960. {
  961. reg += 0x4;
  962. }
  963. bit = (pin % 4) * 4;
  964. mask = 0xf;
  965. if (pin_bank->bank_num == 0)
  966. {
  967. if (pin >= RK_PB4 && pin <= RK_PD7)
  968. {
  969. rt_uint32_t reg0 = 0;
  970. if (mux < 8)
  971. {
  972. /* PMU2_IOC_BASE */
  973. reg0 = reg + 0x4000 - 0xc;
  974. data = mask << (bit + 16);
  975. data |= (mux & mask) << bit;
  976. err = rt_syscon_write(regmap, reg0, data);
  977. /* BUS_IOC_BASE */
  978. reg0 = reg + 0x8000;
  979. data = (mask << (bit + 16));
  980. rt_syscon_write(regmap, reg0, data);
  981. }
  982. else
  983. {
  984. /* PMU2_IOC_BASE */
  985. reg0 = reg + 0x4000 - 0xc;
  986. data = mask << (bit + 16);
  987. data |= 8 << bit;
  988. err = rt_syscon_write(regmap, reg0, data);
  989. /* BUS_IOC_BASE */
  990. reg0 = reg + 0x8000;
  991. data = mask << (bit + 16);
  992. data |= mux << bit;
  993. rt_syscon_write(regmap, reg0, data);
  994. }
  995. }
  996. else
  997. {
  998. data = mask << (bit + 16);
  999. data |= (mux & mask) << bit;
  1000. err = rt_syscon_write(regmap, reg, data);
  1001. }
  1002. return err;
  1003. }
  1004. else if (pin_bank->bank_num > 0)
  1005. {
  1006. /* BUS_IOC_BASE */
  1007. reg += 0x8000;
  1008. }
  1009. data = mask << (bit + 16);
  1010. data |= (mux & mask) << bit;
  1011. return rt_syscon_write(regmap, reg, data);
  1012. }
  1013. #define RK3588_PMU1_IOC_REG 0x0000
  1014. #define RK3588_PMU2_IOC_REG 0x4000
  1015. #define RK3588_BUS_IOC_REG 0x8000
  1016. #define RK3588_VCCIO1_4_IOC_REG 0x9000
  1017. #define RK3588_VCCIO3_5_IOC_REG 0xa000
  1018. #define RK3588_VCCIO2_IOC_REG 0xb000
  1019. #define RK3588_VCCIO6_IOC_REG 0xc000
  1020. #define RK3588_EMMC_IOC_REG 0xd000
  1021. #define RK3588_PULL_BITS_PER_PIN 2
  1022. #define RK3588_PULL_PINS_PER_REG 8
  1023. static const rt_uint32_t rk3588_pull_regs[][2] =
  1024. {
  1025. { RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0020 },
  1026. { RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0024 },
  1027. { RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0028 },
  1028. { RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x002c },
  1029. { RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0030 },
  1030. { RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0110 },
  1031. { RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0114 },
  1032. { RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0118 },
  1033. { RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x011c },
  1034. { RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0120 },
  1035. { RK_GPIO2_A6, RK3588_VCCIO3_5_IOC_REG + 0x0120 },
  1036. { RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0124 },
  1037. { RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0128 },
  1038. { RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x012c },
  1039. { RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0130 },
  1040. { RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0134 },
  1041. { RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0138 },
  1042. { RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x013c },
  1043. { RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0140 },
  1044. { RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0144 },
  1045. { RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0148 },
  1046. { RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0148 },
  1047. { RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x014c },
  1048. };
  1049. static rt_err_t rk3588_set_pull(struct rockchip_pin_bank *pin_bank, int pin, int pull)
  1050. {
  1051. int reg, pull_value;
  1052. rt_uint32_t data;
  1053. rt_uint8_t bit, type;
  1054. struct rt_syscon *regmap;
  1055. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  1056. if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT)
  1057. {
  1058. return -RT_ENOSYS;
  1059. }
  1060. for (int i = RT_ARRAY_SIZE(rk3588_pull_regs) - 1; i >= 0; --i)
  1061. {
  1062. if (pin >= rk3588_pull_regs[i][0])
  1063. {
  1064. reg = rk3588_pull_regs[i][1];
  1065. reg += ((pin - rk3588_pull_regs[i][0]) / RK3588_PULL_PINS_PER_REG) * 4;
  1066. bit = ((pin % 32) % RK3588_PULL_PINS_PER_REG) * RK3588_PULL_BITS_PER_PIN;
  1067. goto _find;
  1068. }
  1069. }
  1070. return -RT_EINVAL;
  1071. _find:
  1072. regmap = drvdata->regmap_base;
  1073. type = pin_bank->pull_type[pin / 8];
  1074. pull_value = rockchip_translate_pull_value(type, pull);
  1075. if (pull_value < 0)
  1076. {
  1077. LOG_E("Not supported pull = %d, fixup the code or firmware", pull);
  1078. return pull_value;
  1079. }
  1080. /* enable the write to the equivalent lower bits */
  1081. data = ((1 << ROCKCHIP_PULL_BITS_PER_PIN) - 1) << (bit + 16);
  1082. data |= pull_value << bit;
  1083. return rt_syscon_write(regmap, reg, data);
  1084. }
  1085. #define RK3588_DRV_BITS_PER_PIN 4
  1086. #define RK3588_DRV_PINS_PER_REG 4
  1087. static const rt_uint32_t rk3588_drive_regs[][2] =
  1088. {
  1089. { RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0010 },
  1090. { RK_GPIO0_A4, RK3588_PMU1_IOC_REG + 0x0014 },
  1091. { RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0018 },
  1092. { RK_GPIO0_B4, RK3588_PMU2_IOC_REG + 0x0014 },
  1093. { RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0018 },
  1094. { RK_GPIO0_C4, RK3588_PMU2_IOC_REG + 0x001c },
  1095. { RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0020 },
  1096. { RK_GPIO0_D4, RK3588_PMU2_IOC_REG + 0x0024 },
  1097. { RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0020 },
  1098. { RK_GPIO1_A4, RK3588_VCCIO1_4_IOC_REG + 0x0024 },
  1099. { RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0028 },
  1100. { RK_GPIO1_B4, RK3588_VCCIO1_4_IOC_REG + 0x002c },
  1101. { RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0030 },
  1102. { RK_GPIO1_C4, RK3588_VCCIO1_4_IOC_REG + 0x0034 },
  1103. { RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x0038 },
  1104. { RK_GPIO1_D4, RK3588_VCCIO1_4_IOC_REG + 0x003c },
  1105. { RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0040 },
  1106. { RK_GPIO2_A4, RK3588_VCCIO3_5_IOC_REG + 0x0044 },
  1107. { RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0048 },
  1108. { RK_GPIO2_B4, RK3588_VCCIO3_5_IOC_REG + 0x004c },
  1109. { RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0050 },
  1110. { RK_GPIO2_C4, RK3588_VCCIO3_5_IOC_REG + 0x0054 },
  1111. { RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x0058 },
  1112. { RK_GPIO2_D4, RK3588_EMMC_IOC_REG + 0x005c },
  1113. { RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0060 },
  1114. { RK_GPIO3_A4, RK3588_VCCIO3_5_IOC_REG + 0x0064 },
  1115. { RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0068 },
  1116. { RK_GPIO3_B4, RK3588_VCCIO3_5_IOC_REG + 0x006c },
  1117. { RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0070 },
  1118. { RK_GPIO3_C4, RK3588_VCCIO3_5_IOC_REG + 0x0074 },
  1119. { RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x0078 },
  1120. { RK_GPIO3_D4, RK3588_VCCIO3_5_IOC_REG + 0x007c },
  1121. { RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0080 },
  1122. { RK_GPIO4_A4, RK3588_VCCIO6_IOC_REG + 0x0084 },
  1123. { RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0088 },
  1124. { RK_GPIO4_B4, RK3588_VCCIO6_IOC_REG + 0x008c },
  1125. { RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0090 },
  1126. { RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0090 },
  1127. { RK_GPIO4_C4, RK3588_VCCIO3_5_IOC_REG + 0x0094 },
  1128. { RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x0098 },
  1129. { RK_GPIO4_D4, RK3588_VCCIO2_IOC_REG + 0x009c },
  1130. };
  1131. static rt_err_t rk3588_set_drive(struct rockchip_pin_bank *pin_bank, int pin, int strength)
  1132. {
  1133. int reg;
  1134. rt_uint8_t bit;
  1135. rt_uint32_t data;
  1136. struct rt_syscon *regmap;
  1137. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  1138. for (int i = RT_ARRAY_SIZE(rk3588_drive_regs) - 1; i >= 0; --i)
  1139. {
  1140. if (pin >= rk3588_drive_regs[i][0])
  1141. {
  1142. reg = rk3588_drive_regs[i][1];
  1143. reg += ((pin - rk3588_drive_regs[i][0]) / RK3588_DRV_PINS_PER_REG) * 4;
  1144. bit = ((pin % 32) % RK3588_DRV_PINS_PER_REG) * RK3588_DRV_BITS_PER_PIN;
  1145. goto _find;
  1146. }
  1147. }
  1148. return -RT_EINVAL;
  1149. _find:
  1150. regmap = drvdata->regmap_base;
  1151. /* enable the write to the equivalent lower bits */
  1152. data = ((1 << ROCKCHIP_DRV_BITS_PER_PIN) - 1) << (bit + 16);
  1153. data |= (strength << bit);
  1154. return rt_syscon_write(regmap, reg, data);
  1155. }
  1156. #define RK3588_SMT_BITS_PER_PIN 1
  1157. #define RK3588_SMT_PINS_PER_REG 8
  1158. static const rt_uint32_t rk3588_schmitt_regs[][2] =
  1159. {
  1160. { RK_GPIO0_A0, RK3588_PMU1_IOC_REG + 0x0030 },
  1161. { RK_GPIO0_B0, RK3588_PMU1_IOC_REG + 0x0034 },
  1162. { RK_GPIO0_B5, RK3588_PMU2_IOC_REG + 0x0040 },
  1163. { RK_GPIO0_C0, RK3588_PMU2_IOC_REG + 0x0044 },
  1164. { RK_GPIO0_D0, RK3588_PMU2_IOC_REG + 0x0048 },
  1165. { RK_GPIO1_A0, RK3588_VCCIO1_4_IOC_REG + 0x0210 },
  1166. { RK_GPIO1_B0, RK3588_VCCIO1_4_IOC_REG + 0x0214 },
  1167. { RK_GPIO1_C0, RK3588_VCCIO1_4_IOC_REG + 0x0218 },
  1168. { RK_GPIO1_D0, RK3588_VCCIO1_4_IOC_REG + 0x021c },
  1169. { RK_GPIO2_A0, RK3588_EMMC_IOC_REG + 0x0220 },
  1170. { RK_GPIO2_A6, RK3588_VCCIO3_5_IOC_REG + 0x0220 },
  1171. { RK_GPIO2_B0, RK3588_VCCIO3_5_IOC_REG + 0x0224 },
  1172. { RK_GPIO2_C0, RK3588_VCCIO3_5_IOC_REG + 0x0228 },
  1173. { RK_GPIO2_D0, RK3588_EMMC_IOC_REG + 0x022c },
  1174. { RK_GPIO3_A0, RK3588_VCCIO3_5_IOC_REG + 0x0230 },
  1175. { RK_GPIO3_B0, RK3588_VCCIO3_5_IOC_REG + 0x0234 },
  1176. { RK_GPIO3_C0, RK3588_VCCIO3_5_IOC_REG + 0x0238 },
  1177. { RK_GPIO3_D0, RK3588_VCCIO3_5_IOC_REG + 0x023c },
  1178. { RK_GPIO4_A0, RK3588_VCCIO6_IOC_REG + 0x0240 },
  1179. { RK_GPIO4_B0, RK3588_VCCIO6_IOC_REG + 0x0244 },
  1180. { RK_GPIO4_C0, RK3588_VCCIO6_IOC_REG + 0x0248 },
  1181. { RK_GPIO4_C2, RK3588_VCCIO3_5_IOC_REG + 0x0248 },
  1182. { RK_GPIO4_D0, RK3588_VCCIO2_IOC_REG + 0x024c },
  1183. };
  1184. static rt_err_t rk3588_set_schmitt(struct rockchip_pin_bank *pin_bank, int pin, int enable)
  1185. {
  1186. int reg;
  1187. rt_uint8_t bit;
  1188. rt_uint32_t data;
  1189. struct rt_syscon *regmap;
  1190. struct rockchip_pin_data *drvdata = pin_bank->drvdata;
  1191. for (int i = RT_ARRAY_SIZE(rk3588_schmitt_regs) - 1; i >= 0; --i)
  1192. {
  1193. if (pin >= rk3588_schmitt_regs[i][0])
  1194. {
  1195. reg = rk3588_schmitt_regs[i][1];
  1196. reg += ((pin - rk3588_schmitt_regs[i][0]) / RK3588_SMT_PINS_PER_REG) * 4;
  1197. bit = ((pin % 32) % RK3588_SMT_PINS_PER_REG) * RK3588_SMT_BITS_PER_PIN;
  1198. goto _find;
  1199. }
  1200. }
  1201. return -RT_EINVAL;
  1202. _find:
  1203. regmap = drvdata->regmap_base;
  1204. /* enable the write to the equivalent lower bits */
  1205. data = ((1 << RK3588_SMT_BITS_PER_PIN) - 1) << (bit + 16);
  1206. data |= (enable << bit);
  1207. return rt_syscon_write(regmap, reg, data);
  1208. }
  1209. static struct rockchip_pin_bank rk3588_pin_banks[] =
  1210. {
  1211. PIN_BANK_FLAGS_IOMUX_PULL(0, 32, "gpio0", IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  1212. PIN_BANK_FLAGS_IOMUX_PULL(1, 32, "gpio1", IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  1213. PIN_BANK_FLAGS_IOMUX_PULL(2, 32, "gpio2", IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  1214. PIN_BANK_FLAGS_IOMUX_PULL(3, 32, "gpio3", IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  1215. PIN_BANK_FLAGS_IOMUX_PULL(4, 32, "gpio4", IOMUX_WIDTH_4BIT, PULL_TYPE_IO_1V8_ONLY),
  1216. };
  1217. static struct rockchip_pin_ctrl rk3588_pin_ctrl =
  1218. {
  1219. .pin_banks = rk3588_pin_banks,
  1220. .banks_nr = RT_ARRAY_SIZE(rk3588_pin_banks),
  1221. .label = "RK3588-GPIO",
  1222. .type = RK3588,
  1223. .set_mux = rk3588_set_mux,
  1224. .set_pull = rk3588_set_pull,
  1225. .set_drive = rk3588_set_drive,
  1226. .set_schmitt = rk3588_set_schmitt,
  1227. };
  1228. static const struct rt_pin_ctrl_conf_params rockchip_conf_params[] =
  1229. {
  1230. { "bias-disable", PIN_CONFIG_BIAS_DISABLE, 0 },
  1231. { "bias-bus-hold", PIN_CONFIG_BIAS_BUS_HOLD, 0 },
  1232. { "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
  1233. { "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
  1234. { "bias-pull-pin-default", PIN_CONFIG_BIAS_PULL_PIN_DEFAULT, 1 },
  1235. { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
  1236. { "input-schmitt-disable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 0 },
  1237. { "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
  1238. };
  1239. static int rockchip_pinconf_prop_name_to_param(const char *propname, rt_uint32_t *default_value)
  1240. {
  1241. const struct rt_pin_ctrl_conf_params *params = rockchip_conf_params;
  1242. for (int i = 0; i < RT_ARRAY_SIZE(rockchip_conf_params); ++i, ++params)
  1243. {
  1244. if (!rt_strcmp(params->propname, propname))
  1245. {
  1246. *default_value = params->default_value;
  1247. return params->param;
  1248. }
  1249. }
  1250. return -RT_ENOSYS;
  1251. }
  1252. static rt_err_t rockchip_pinconf_pull_apply(struct rockchip_pin_ctrl *pinctrl,
  1253. struct rockchip_pin_bank *pin_bank, rt_uint32_t pin, rt_uint32_t param, rt_uint32_t arg)
  1254. {
  1255. rt_err_t err = RT_EOK;
  1256. switch (param)
  1257. {
  1258. case PIN_CONFIG_BIAS_DISABLE:
  1259. case PIN_CONFIG_BIAS_PULL_UP:
  1260. case PIN_CONFIG_BIAS_PULL_DOWN:
  1261. case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
  1262. case PIN_CONFIG_BIAS_BUS_HOLD:
  1263. if (pinctrl->set_pull)
  1264. {
  1265. err = pinctrl->set_pull(pin_bank, pin, param);
  1266. }
  1267. else
  1268. {
  1269. err = -RT_ENOSYS;
  1270. }
  1271. break;
  1272. case PIN_CONFIG_DRIVE_STRENGTH:
  1273. if (pinctrl->set_drive)
  1274. {
  1275. err = pinctrl->set_drive(pin_bank, pin, arg);
  1276. }
  1277. else
  1278. {
  1279. err = -RT_ENOSYS;
  1280. }
  1281. break;
  1282. case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
  1283. if (pinctrl->set_schmitt)
  1284. {
  1285. err = pinctrl->set_schmitt(pin_bank, pin, arg);
  1286. }
  1287. else
  1288. {
  1289. err = -RT_ENOSYS;
  1290. }
  1291. break;
  1292. default:
  1293. break;
  1294. }
  1295. return err;
  1296. }
  1297. static rt_err_t rockchip_pinctrl_confs_apply(struct rt_device *device, void *fw_conf_np)
  1298. {
  1299. rt_err_t err = RT_EOK;
  1300. const fdt32_t *cell;
  1301. int pin, function, param;
  1302. rt_uint32_t value, default_value, arg;
  1303. struct rt_ofw_prop *prop, *pin_prop;
  1304. struct rt_ofw_node *pull_np, *conf_np = fw_conf_np;
  1305. struct rockchip_pin_ctrl *pinctrl;
  1306. struct rockchip_pin_bank *pin_bank;
  1307. struct rockchip_pinctrl_device *pinctrl_dev;
  1308. LOG_D("Pinctrl apply '%s'", rt_ofw_node_full_name(conf_np));
  1309. pinctrl_dev = rt_container_of(device, struct rockchip_pinctrl_device, parent);
  1310. pinctrl = pinctrl_dev->pinctrl;
  1311. rt_ofw_foreach_prop_u32(conf_np, "rockchip,pins", prop, cell, value)
  1312. {
  1313. /* bank -> pin -> function -> pull */
  1314. pin_bank = &pinctrl->pin_banks[value];
  1315. cell = rt_ofw_prop_next_u32(prop, cell, &value);
  1316. pin = value;
  1317. cell = rt_ofw_prop_next_u32(prop, cell, &value);
  1318. function = value;
  1319. cell = rt_ofw_prop_next_u32(prop, cell, &value);
  1320. pull_np = rt_ofw_find_node_by_phandle(value);
  1321. if (!pull_np)
  1322. {
  1323. err = -RT_ERROR;
  1324. LOG_E("Firmware ref error in '%s'", rt_ofw_node_full_name(conf_np));
  1325. break;
  1326. }
  1327. if (pinctrl->set_mux)
  1328. {
  1329. LOG_D("IOMUX from GPIO%d-%c%d to function(%d)",
  1330. pin_bank->bank_num, 'A' + (pin % 32) / 8, pin % 8, function);
  1331. err = pinctrl->set_mux(pin_bank, pin, function);
  1332. if (err)
  1333. {
  1334. break;
  1335. }
  1336. }
  1337. rt_ofw_foreach_prop(pull_np, pin_prop)
  1338. {
  1339. if (!rt_strcmp(pin_prop->name, "phandle"))
  1340. {
  1341. continue;
  1342. }
  1343. param = rockchip_pinconf_prop_name_to_param(pin_prop->name, &default_value);
  1344. if (param < 0)
  1345. {
  1346. err = param;
  1347. break;
  1348. }
  1349. if (pin_prop->length < sizeof(*cell))
  1350. {
  1351. arg = default_value;
  1352. }
  1353. else
  1354. {
  1355. rt_ofw_prop_next_u32(pin_prop, RT_NULL, &arg);
  1356. }
  1357. err = rockchip_pinconf_pull_apply(pinctrl, pin_bank, pin, param, arg);
  1358. if (err && err != -RT_ENOSYS)
  1359. {
  1360. break;
  1361. }
  1362. }
  1363. rt_ofw_node_put(pull_np);
  1364. }
  1365. return err;
  1366. }
  1367. static const struct rt_pin_ops rockchip_pinctrl_ops =
  1368. {
  1369. .pin_ctrl_confs_apply = rockchip_pinctrl_confs_apply,
  1370. };
  1371. static rt_err_t rockchip_pinctrl_probe(struct rt_platform_device *pdev)
  1372. {
  1373. rt_err_t err = RT_EOK;
  1374. int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs;
  1375. struct rockchip_pin_data *drvdata = RT_NULL;
  1376. struct rt_ofw_node *np = pdev->parent.ofw_node;
  1377. struct rockchip_pin_ctrl *pinctrl = (typeof(pinctrl))pdev->id->data;
  1378. struct rockchip_pin_bank *pin_bank = pinctrl->pin_banks;
  1379. struct rockchip_pinctrl_device *pinctrl_dev = rt_malloc(sizeof(*pinctrl_dev));
  1380. if (!pinctrl_dev)
  1381. {
  1382. return -RT_ENOMEM;
  1383. }
  1384. drvdata = &pinctrl_dev->drvdata;
  1385. if (!(drvdata->regmap_base = rt_syscon_find_by_ofw_phandle(np, "rockchip,grf")))
  1386. {
  1387. err = -RT_EIO;
  1388. goto _fail;
  1389. }
  1390. drvdata->regmap_pmu = rt_syscon_find_by_ofw_phandle(np, "rockchip,pmu");
  1391. drvdata->pinctrl = pinctrl;
  1392. pinctrl_dev->parent.ops = &rockchip_pinctrl_ops;
  1393. pinctrl_dev->pinctrl = pinctrl;
  1394. pinctrl->pins_nr = 0;
  1395. grf_offs = pinctrl->grf_mux_offset;
  1396. pmu_offs = pinctrl->pmu_mux_offset;
  1397. drv_pmu_offs = pinctrl->pmu_drv_offset;
  1398. drv_grf_offs = pinctrl->grf_drv_offset;
  1399. pin_bank = pinctrl->pin_banks;
  1400. for (int i = 0; i < pinctrl->banks_nr; ++i, ++pin_bank)
  1401. {
  1402. for (int bank_pins = 0, j = 0; j < 4; ++j)
  1403. {
  1404. int inc;
  1405. struct rockchip_drv *drv = &pin_bank->drv[j];
  1406. struct rockchip_iomux *iomux = &pin_bank->iomux[j];
  1407. if (bank_pins >= pin_bank->nr_pins)
  1408. {
  1409. break;
  1410. }
  1411. /* Preset iomux offset value, set new start value */
  1412. if (iomux->offset >= 0)
  1413. {
  1414. if ((iomux->type & IOMUX_SOURCE_PMU) || (iomux->type & IOMUX_L_SOURCE_PMU))
  1415. {
  1416. pmu_offs = iomux->offset;
  1417. }
  1418. else
  1419. {
  1420. grf_offs = iomux->offset;
  1421. }
  1422. }
  1423. else
  1424. {
  1425. /* Set current iomux offset */
  1426. iomux->offset = ((iomux->type & IOMUX_SOURCE_PMU) || (iomux->type & IOMUX_L_SOURCE_PMU)) ?
  1427. pmu_offs : grf_offs;
  1428. }
  1429. /* Preset drv offset value, set new start value */
  1430. if (drv->offset >= 0)
  1431. {
  1432. if (iomux->type & IOMUX_SOURCE_PMU)
  1433. {
  1434. drv_pmu_offs = drv->offset;
  1435. }
  1436. else
  1437. {
  1438. drv_grf_offs = drv->offset;
  1439. }
  1440. }
  1441. else
  1442. {
  1443. /* Set current drv offset */
  1444. drv->offset = (iomux->type & IOMUX_SOURCE_PMU) ? drv_pmu_offs : drv_grf_offs;
  1445. }
  1446. /*
  1447. * Increase offset according to iomux width.
  1448. * 4bit iomux'es are spread over two registers.
  1449. */
  1450. inc = (iomux->type & (IOMUX_WIDTH_4BIT | IOMUX_WIDTH_3BIT | IOMUX_WIDTH_2BIT)) ? 8 : 4;
  1451. /* Preset drv offset value, set new start value */
  1452. if ((iomux->type & IOMUX_SOURCE_PMU) || (iomux->type & IOMUX_L_SOURCE_PMU))
  1453. {
  1454. pmu_offs += inc;
  1455. }
  1456. else
  1457. {
  1458. grf_offs += inc;
  1459. }
  1460. /*
  1461. * Increase offset according to drv width.
  1462. * 3bit drive-strenth'es are spread over two registers.
  1463. */
  1464. inc = ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || (drv->drv_type == DRV_TYPE_IO_3V3_ONLY)) ? 8 : 4;
  1465. if (iomux->type & IOMUX_SOURCE_PMU)
  1466. {
  1467. drv_pmu_offs += inc;
  1468. }
  1469. else
  1470. {
  1471. drv_grf_offs += inc;
  1472. }
  1473. bank_pins += 8;
  1474. }
  1475. /* calculate the per-bank recalced_mask */
  1476. for (int pin = 0, j = 0; j < pinctrl->niomux_recalced; ++j)
  1477. {
  1478. if (pinctrl->iomux_recalced[j].num == pin_bank->bank_num)
  1479. {
  1480. pin = pinctrl->iomux_recalced[j].pin;
  1481. pin_bank->recalced_mask |= RT_BIT(pin);
  1482. }
  1483. }
  1484. /* calculate the per-bank route_mask */
  1485. for (int pin = 0, j = 0; j < pinctrl->niomux_routes; ++j)
  1486. {
  1487. if (pinctrl->iomux_routes[j].bank_num == pin_bank->bank_num)
  1488. {
  1489. pin = pinctrl->iomux_routes[j].pin;
  1490. pin_bank->route_mask |= RT_BIT(pin);
  1491. }
  1492. }
  1493. pin_bank->drvdata = drvdata;
  1494. rt_spin_lock_init(&pin_bank->spinlock);
  1495. pinctrl->pins_nr += pin_bank->nr_pins;
  1496. }
  1497. rt_ofw_data(np) = &pinctrl_dev->parent;
  1498. return RT_EOK;
  1499. _fail:
  1500. rt_free(pinctrl_dev);
  1501. return err;
  1502. }
  1503. static const struct rt_ofw_node_id rockchip_pinctrl_ofw_ids[] =
  1504. {
  1505. { .compatible = "rockchip,rk3308-pinctrl", .data = &rk3308_pin_ctrl },
  1506. { .compatible = "rockchip,rk3568-pinctrl", .data = &rk3568_pin_ctrl },
  1507. { .compatible = "rockchip,rk3576-pinctrl", .data = &rk3576_pin_ctrl },
  1508. { .compatible = "rockchip,rk3588-pinctrl", .data = &rk3588_pin_ctrl },
  1509. { /* sentinel */ }
  1510. };
  1511. static struct rt_platform_driver rockchip_pinctrl_driver =
  1512. {
  1513. .name = "pinctrl-rockchip",
  1514. .ids = rockchip_pinctrl_ofw_ids,
  1515. .probe = rockchip_pinctrl_probe,
  1516. };
  1517. static int rockchip_pinctrl_register(void)
  1518. {
  1519. rt_platform_driver_register(&rockchip_pinctrl_driver);
  1520. return 0;
  1521. }
  1522. INIT_SUBSYS_EXPORT(rockchip_pinctrl_register);