gpio-msc313.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (C) 2020 Daniel Palmer<[email protected]> */
  3. #include <linux/bitops.h>
  4. #include <linux/kernel.h>
  5. #include <linux/types.h>
  6. #include <linux/io.h>
  7. #include <linux/of.h>
  8. #include <linux/of_device.h>
  9. #include <linux/of_irq.h>
  10. #include <linux/gpio/driver.h>
  11. #include <linux/module.h>
  12. #include <linux/platform_device.h>
  13. #include <dt-bindings/gpio/msc313-gpio.h>
  14. #include <dt-bindings/interrupt-controller/arm-gic.h>
  15. #define DRIVER_NAME "gpio-msc313"
  16. #define MSC313_GPIO_IN BIT(0)
  17. #define MSC313_GPIO_OUT BIT(4)
  18. #define MSC313_GPIO_OEN BIT(5)
  19. /*
  20. * These bits need to be saved to correctly restore the
  21. * gpio state when resuming from suspend to memory.
  22. */
  23. #define MSC313_GPIO_BITSTOSAVE (MSC313_GPIO_OUT | MSC313_GPIO_OEN)
  24. /* pad names for fuart, same for all SoCs so far */
  25. #define MSC313_PINNAME_FUART_RX "fuart_rx"
  26. #define MSC313_PINNAME_FUART_TX "fuart_tx"
  27. #define MSC313_PINNAME_FUART_CTS "fuart_cts"
  28. #define MSC313_PINNAME_FUART_RTS "fuart_rts"
  29. /* pad names for sr, mercury5 is different */
  30. #define MSC313_PINNAME_SR_IO2 "sr_io2"
  31. #define MSC313_PINNAME_SR_IO3 "sr_io3"
  32. #define MSC313_PINNAME_SR_IO4 "sr_io4"
  33. #define MSC313_PINNAME_SR_IO5 "sr_io5"
  34. #define MSC313_PINNAME_SR_IO6 "sr_io6"
  35. #define MSC313_PINNAME_SR_IO7 "sr_io7"
  36. #define MSC313_PINNAME_SR_IO8 "sr_io8"
  37. #define MSC313_PINNAME_SR_IO9 "sr_io9"
  38. #define MSC313_PINNAME_SR_IO10 "sr_io10"
  39. #define MSC313_PINNAME_SR_IO11 "sr_io11"
  40. #define MSC313_PINNAME_SR_IO12 "sr_io12"
  41. #define MSC313_PINNAME_SR_IO13 "sr_io13"
  42. #define MSC313_PINNAME_SR_IO14 "sr_io14"
  43. #define MSC313_PINNAME_SR_IO15 "sr_io15"
  44. #define MSC313_PINNAME_SR_IO16 "sr_io16"
  45. #define MSC313_PINNAME_SR_IO17 "sr_io17"
  46. /* pad names for sd, same for all SoCs so far */
  47. #define MSC313_PINNAME_SD_CLK "sd_clk"
  48. #define MSC313_PINNAME_SD_CMD "sd_cmd"
  49. #define MSC313_PINNAME_SD_D0 "sd_d0"
  50. #define MSC313_PINNAME_SD_D1 "sd_d1"
  51. #define MSC313_PINNAME_SD_D2 "sd_d2"
  52. #define MSC313_PINNAME_SD_D3 "sd_d3"
  53. /* pad names for i2c1, same for all SoCs so for */
  54. #define MSC313_PINNAME_I2C1_SCL "i2c1_scl"
  55. #define MSC313_PINNAME_I2C1_SCA "i2c1_sda"
  56. /* pad names for spi0, same for all SoCs so far */
  57. #define MSC313_PINNAME_SPI0_CZ "spi0_cz"
  58. #define MSC313_PINNAME_SPI0_CK "spi0_ck"
  59. #define MSC313_PINNAME_SPI0_DI "spi0_di"
  60. #define MSC313_PINNAME_SPI0_DO "spi0_do"
  61. #define FUART_NAMES \
  62. MSC313_PINNAME_FUART_RX, \
  63. MSC313_PINNAME_FUART_TX, \
  64. MSC313_PINNAME_FUART_CTS, \
  65. MSC313_PINNAME_FUART_RTS
  66. #define OFF_FUART_RX 0x50
  67. #define OFF_FUART_TX 0x54
  68. #define OFF_FUART_CTS 0x58
  69. #define OFF_FUART_RTS 0x5c
  70. #define FUART_OFFSETS \
  71. OFF_FUART_RX, \
  72. OFF_FUART_TX, \
  73. OFF_FUART_CTS, \
  74. OFF_FUART_RTS
  75. #define SR_NAMES \
  76. MSC313_PINNAME_SR_IO2, \
  77. MSC313_PINNAME_SR_IO3, \
  78. MSC313_PINNAME_SR_IO4, \
  79. MSC313_PINNAME_SR_IO5, \
  80. MSC313_PINNAME_SR_IO6, \
  81. MSC313_PINNAME_SR_IO7, \
  82. MSC313_PINNAME_SR_IO8, \
  83. MSC313_PINNAME_SR_IO9, \
  84. MSC313_PINNAME_SR_IO10, \
  85. MSC313_PINNAME_SR_IO11, \
  86. MSC313_PINNAME_SR_IO12, \
  87. MSC313_PINNAME_SR_IO13, \
  88. MSC313_PINNAME_SR_IO14, \
  89. MSC313_PINNAME_SR_IO15, \
  90. MSC313_PINNAME_SR_IO16, \
  91. MSC313_PINNAME_SR_IO17
  92. #define OFF_SR_IO2 0x88
  93. #define OFF_SR_IO3 0x8c
  94. #define OFF_SR_IO4 0x90
  95. #define OFF_SR_IO5 0x94
  96. #define OFF_SR_IO6 0x98
  97. #define OFF_SR_IO7 0x9c
  98. #define OFF_SR_IO8 0xa0
  99. #define OFF_SR_IO9 0xa4
  100. #define OFF_SR_IO10 0xa8
  101. #define OFF_SR_IO11 0xac
  102. #define OFF_SR_IO12 0xb0
  103. #define OFF_SR_IO13 0xb4
  104. #define OFF_SR_IO14 0xb8
  105. #define OFF_SR_IO15 0xbc
  106. #define OFF_SR_IO16 0xc0
  107. #define OFF_SR_IO17 0xc4
  108. #define SR_OFFSETS \
  109. OFF_SR_IO2, \
  110. OFF_SR_IO3, \
  111. OFF_SR_IO4, \
  112. OFF_SR_IO5, \
  113. OFF_SR_IO6, \
  114. OFF_SR_IO7, \
  115. OFF_SR_IO8, \
  116. OFF_SR_IO9, \
  117. OFF_SR_IO10, \
  118. OFF_SR_IO11, \
  119. OFF_SR_IO12, \
  120. OFF_SR_IO13, \
  121. OFF_SR_IO14, \
  122. OFF_SR_IO15, \
  123. OFF_SR_IO16, \
  124. OFF_SR_IO17
  125. #define SD_NAMES \
  126. MSC313_PINNAME_SD_CLK, \
  127. MSC313_PINNAME_SD_CMD, \
  128. MSC313_PINNAME_SD_D0, \
  129. MSC313_PINNAME_SD_D1, \
  130. MSC313_PINNAME_SD_D2, \
  131. MSC313_PINNAME_SD_D3
  132. #define OFF_SD_CLK 0x140
  133. #define OFF_SD_CMD 0x144
  134. #define OFF_SD_D0 0x148
  135. #define OFF_SD_D1 0x14c
  136. #define OFF_SD_D2 0x150
  137. #define OFF_SD_D3 0x154
  138. #define SD_OFFSETS \
  139. OFF_SD_CLK, \
  140. OFF_SD_CMD, \
  141. OFF_SD_D0, \
  142. OFF_SD_D1, \
  143. OFF_SD_D2, \
  144. OFF_SD_D3
  145. #define I2C1_NAMES \
  146. MSC313_PINNAME_I2C1_SCL, \
  147. MSC313_PINNAME_I2C1_SCA
  148. #define OFF_I2C1_SCL 0x188
  149. #define OFF_I2C1_SCA 0x18c
  150. #define I2C1_OFFSETS \
  151. OFF_I2C1_SCL, \
  152. OFF_I2C1_SCA
  153. #define SPI0_NAMES \
  154. MSC313_PINNAME_SPI0_CZ, \
  155. MSC313_PINNAME_SPI0_CK, \
  156. MSC313_PINNAME_SPI0_DI, \
  157. MSC313_PINNAME_SPI0_DO
  158. #define OFF_SPI0_CZ 0x1c0
  159. #define OFF_SPI0_CK 0x1c4
  160. #define OFF_SPI0_DI 0x1c8
  161. #define OFF_SPI0_DO 0x1cc
  162. #define SPI0_OFFSETS \
  163. OFF_SPI0_CZ, \
  164. OFF_SPI0_CK, \
  165. OFF_SPI0_DI, \
  166. OFF_SPI0_DO
  167. struct msc313_gpio_data {
  168. const char * const *names;
  169. const unsigned int *offsets;
  170. const unsigned int num;
  171. };
  172. #define MSC313_GPIO_CHIPDATA(_chip) \
  173. static const struct msc313_gpio_data _chip##_data = { \
  174. .names = _chip##_names, \
  175. .offsets = _chip##_offsets, \
  176. .num = ARRAY_SIZE(_chip##_offsets), \
  177. }
  178. #ifdef CONFIG_MACH_INFINITY
  179. static const char * const msc313_names[] = {
  180. FUART_NAMES,
  181. SR_NAMES,
  182. SD_NAMES,
  183. I2C1_NAMES,
  184. SPI0_NAMES,
  185. };
  186. static const unsigned int msc313_offsets[] = {
  187. FUART_OFFSETS,
  188. SR_OFFSETS,
  189. SD_OFFSETS,
  190. I2C1_OFFSETS,
  191. SPI0_OFFSETS,
  192. };
  193. MSC313_GPIO_CHIPDATA(msc313);
  194. /*
  195. * Unlike the msc313(e) the ssd20xd have a bunch of pins
  196. * that are actually called gpio probably because they
  197. * have no dedicated function.
  198. */
  199. #define SSD20XD_PINNAME_GPIO0 "gpio0"
  200. #define SSD20XD_PINNAME_GPIO1 "gpio1"
  201. #define SSD20XD_PINNAME_GPIO2 "gpio2"
  202. #define SSD20XD_PINNAME_GPIO3 "gpio3"
  203. #define SSD20XD_PINNAME_GPIO4 "gpio4"
  204. #define SSD20XD_PINNAME_GPIO5 "gpio5"
  205. #define SSD20XD_PINNAME_GPIO6 "gpio6"
  206. #define SSD20XD_PINNAME_GPIO7 "gpio7"
  207. #define SSD20XD_PINNAME_GPIO10 "gpio10"
  208. #define SSD20XD_PINNAME_GPIO11 "gpio11"
  209. #define SSD20XD_PINNAME_GPIO12 "gpio12"
  210. #define SSD20XD_PINNAME_GPIO13 "gpio13"
  211. #define SSD20XD_PINNAME_GPIO14 "gpio14"
  212. #define SSD20XD_PINNAME_GPIO85 "gpio85"
  213. #define SSD20XD_PINNAME_GPIO86 "gpio86"
  214. #define SSD20XD_PINNAME_GPIO90 "gpio90"
  215. #define SSD20XD_GPIO_NAMES SSD20XD_PINNAME_GPIO0, \
  216. SSD20XD_PINNAME_GPIO1, \
  217. SSD20XD_PINNAME_GPIO2, \
  218. SSD20XD_PINNAME_GPIO3, \
  219. SSD20XD_PINNAME_GPIO4, \
  220. SSD20XD_PINNAME_GPIO5, \
  221. SSD20XD_PINNAME_GPIO6, \
  222. SSD20XD_PINNAME_GPIO7, \
  223. SSD20XD_PINNAME_GPIO10, \
  224. SSD20XD_PINNAME_GPIO11, \
  225. SSD20XD_PINNAME_GPIO12, \
  226. SSD20XD_PINNAME_GPIO13, \
  227. SSD20XD_PINNAME_GPIO14, \
  228. SSD20XD_PINNAME_GPIO85, \
  229. SSD20XD_PINNAME_GPIO86, \
  230. SSD20XD_PINNAME_GPIO90
  231. #define SSD20XD_GPIO_OFF_GPIO0 0x0
  232. #define SSD20XD_GPIO_OFF_GPIO1 0x4
  233. #define SSD20XD_GPIO_OFF_GPIO2 0x8
  234. #define SSD20XD_GPIO_OFF_GPIO3 0xc
  235. #define SSD20XD_GPIO_OFF_GPIO4 0x10
  236. #define SSD20XD_GPIO_OFF_GPIO5 0x14
  237. #define SSD20XD_GPIO_OFF_GPIO6 0x18
  238. #define SSD20XD_GPIO_OFF_GPIO7 0x1c
  239. #define SSD20XD_GPIO_OFF_GPIO10 0x28
  240. #define SSD20XD_GPIO_OFF_GPIO11 0x2c
  241. #define SSD20XD_GPIO_OFF_GPIO12 0x30
  242. #define SSD20XD_GPIO_OFF_GPIO13 0x34
  243. #define SSD20XD_GPIO_OFF_GPIO14 0x38
  244. #define SSD20XD_GPIO_OFF_GPIO85 0x100
  245. #define SSD20XD_GPIO_OFF_GPIO86 0x104
  246. #define SSD20XD_GPIO_OFF_GPIO90 0x114
  247. #define SSD20XD_GPIO_OFFSETS SSD20XD_GPIO_OFF_GPIO0, \
  248. SSD20XD_GPIO_OFF_GPIO1, \
  249. SSD20XD_GPIO_OFF_GPIO2, \
  250. SSD20XD_GPIO_OFF_GPIO3, \
  251. SSD20XD_GPIO_OFF_GPIO4, \
  252. SSD20XD_GPIO_OFF_GPIO5, \
  253. SSD20XD_GPIO_OFF_GPIO6, \
  254. SSD20XD_GPIO_OFF_GPIO7, \
  255. SSD20XD_GPIO_OFF_GPIO10, \
  256. SSD20XD_GPIO_OFF_GPIO11, \
  257. SSD20XD_GPIO_OFF_GPIO12, \
  258. SSD20XD_GPIO_OFF_GPIO13, \
  259. SSD20XD_GPIO_OFF_GPIO14, \
  260. SSD20XD_GPIO_OFF_GPIO85, \
  261. SSD20XD_GPIO_OFF_GPIO86, \
  262. SSD20XD_GPIO_OFF_GPIO90
  263. /* "ttl" pins lcd interface pins */
  264. #define SSD20XD_PINNAME_TTL0 "ttl0"
  265. #define SSD20XD_PINNAME_TTL1 "ttl1"
  266. #define SSD20XD_PINNAME_TTL2 "ttl2"
  267. #define SSD20XD_PINNAME_TTL3 "ttl3"
  268. #define SSD20XD_PINNAME_TTL4 "ttl4"
  269. #define SSD20XD_PINNAME_TTL5 "ttl5"
  270. #define SSD20XD_PINNAME_TTL6 "ttl6"
  271. #define SSD20XD_PINNAME_TTL7 "ttl7"
  272. #define SSD20XD_PINNAME_TTL8 "ttl8"
  273. #define SSD20XD_PINNAME_TTL9 "ttl9"
  274. #define SSD20XD_PINNAME_TTL10 "ttl10"
  275. #define SSD20XD_PINNAME_TTL11 "ttl11"
  276. #define SSD20XD_PINNAME_TTL12 "ttl12"
  277. #define SSD20XD_PINNAME_TTL13 "ttl13"
  278. #define SSD20XD_PINNAME_TTL14 "ttl14"
  279. #define SSD20XD_PINNAME_TTL15 "ttl15"
  280. #define SSD20XD_PINNAME_TTL16 "ttl16"
  281. #define SSD20XD_PINNAME_TTL17 "ttl17"
  282. #define SSD20XD_PINNAME_TTL18 "ttl18"
  283. #define SSD20XD_PINNAME_TTL19 "ttl19"
  284. #define SSD20XD_PINNAME_TTL20 "ttl20"
  285. #define SSD20XD_PINNAME_TTL21 "ttl21"
  286. #define SSD20XD_PINNAME_TTL22 "ttl22"
  287. #define SSD20XD_PINNAME_TTL23 "ttl23"
  288. #define SSD20XD_PINNAME_TTL24 "ttl24"
  289. #define SSD20XD_PINNAME_TTL25 "ttl25"
  290. #define SSD20XD_PINNAME_TTL26 "ttl26"
  291. #define SSD20XD_PINNAME_TTL27 "ttl27"
  292. #define SSD20XD_TTL_PINNAMES SSD20XD_PINNAME_TTL0, \
  293. SSD20XD_PINNAME_TTL1, \
  294. SSD20XD_PINNAME_TTL2, \
  295. SSD20XD_PINNAME_TTL3, \
  296. SSD20XD_PINNAME_TTL4, \
  297. SSD20XD_PINNAME_TTL5, \
  298. SSD20XD_PINNAME_TTL6, \
  299. SSD20XD_PINNAME_TTL7, \
  300. SSD20XD_PINNAME_TTL8, \
  301. SSD20XD_PINNAME_TTL9, \
  302. SSD20XD_PINNAME_TTL10, \
  303. SSD20XD_PINNAME_TTL11, \
  304. SSD20XD_PINNAME_TTL12, \
  305. SSD20XD_PINNAME_TTL13, \
  306. SSD20XD_PINNAME_TTL14, \
  307. SSD20XD_PINNAME_TTL15, \
  308. SSD20XD_PINNAME_TTL16, \
  309. SSD20XD_PINNAME_TTL17, \
  310. SSD20XD_PINNAME_TTL18, \
  311. SSD20XD_PINNAME_TTL19, \
  312. SSD20XD_PINNAME_TTL20, \
  313. SSD20XD_PINNAME_TTL21, \
  314. SSD20XD_PINNAME_TTL22, \
  315. SSD20XD_PINNAME_TTL23, \
  316. SSD20XD_PINNAME_TTL24, \
  317. SSD20XD_PINNAME_TTL25, \
  318. SSD20XD_PINNAME_TTL26, \
  319. SSD20XD_PINNAME_TTL27
  320. #define SSD20XD_TTL_OFFSET_TTL0 0x80
  321. #define SSD20XD_TTL_OFFSET_TTL1 0x84
  322. #define SSD20XD_TTL_OFFSET_TTL2 0x88
  323. #define SSD20XD_TTL_OFFSET_TTL3 0x8c
  324. #define SSD20XD_TTL_OFFSET_TTL4 0x90
  325. #define SSD20XD_TTL_OFFSET_TTL5 0x94
  326. #define SSD20XD_TTL_OFFSET_TTL6 0x98
  327. #define SSD20XD_TTL_OFFSET_TTL7 0x9c
  328. #define SSD20XD_TTL_OFFSET_TTL8 0xa0
  329. #define SSD20XD_TTL_OFFSET_TTL9 0xa4
  330. #define SSD20XD_TTL_OFFSET_TTL10 0xa8
  331. #define SSD20XD_TTL_OFFSET_TTL11 0xac
  332. #define SSD20XD_TTL_OFFSET_TTL12 0xb0
  333. #define SSD20XD_TTL_OFFSET_TTL13 0xb4
  334. #define SSD20XD_TTL_OFFSET_TTL14 0xb8
  335. #define SSD20XD_TTL_OFFSET_TTL15 0xbc
  336. #define SSD20XD_TTL_OFFSET_TTL16 0xc0
  337. #define SSD20XD_TTL_OFFSET_TTL17 0xc4
  338. #define SSD20XD_TTL_OFFSET_TTL18 0xc8
  339. #define SSD20XD_TTL_OFFSET_TTL19 0xcc
  340. #define SSD20XD_TTL_OFFSET_TTL20 0xd0
  341. #define SSD20XD_TTL_OFFSET_TTL21 0xd4
  342. #define SSD20XD_TTL_OFFSET_TTL22 0xd8
  343. #define SSD20XD_TTL_OFFSET_TTL23 0xdc
  344. #define SSD20XD_TTL_OFFSET_TTL24 0xe0
  345. #define SSD20XD_TTL_OFFSET_TTL25 0xe4
  346. #define SSD20XD_TTL_OFFSET_TTL26 0xe8
  347. #define SSD20XD_TTL_OFFSET_TTL27 0xec
  348. #define SSD20XD_TTL_OFFSETS SSD20XD_TTL_OFFSET_TTL0, \
  349. SSD20XD_TTL_OFFSET_TTL1, \
  350. SSD20XD_TTL_OFFSET_TTL2, \
  351. SSD20XD_TTL_OFFSET_TTL3, \
  352. SSD20XD_TTL_OFFSET_TTL4, \
  353. SSD20XD_TTL_OFFSET_TTL5, \
  354. SSD20XD_TTL_OFFSET_TTL6, \
  355. SSD20XD_TTL_OFFSET_TTL7, \
  356. SSD20XD_TTL_OFFSET_TTL8, \
  357. SSD20XD_TTL_OFFSET_TTL9, \
  358. SSD20XD_TTL_OFFSET_TTL10, \
  359. SSD20XD_TTL_OFFSET_TTL11, \
  360. SSD20XD_TTL_OFFSET_TTL12, \
  361. SSD20XD_TTL_OFFSET_TTL13, \
  362. SSD20XD_TTL_OFFSET_TTL14, \
  363. SSD20XD_TTL_OFFSET_TTL15, \
  364. SSD20XD_TTL_OFFSET_TTL16, \
  365. SSD20XD_TTL_OFFSET_TTL17, \
  366. SSD20XD_TTL_OFFSET_TTL18, \
  367. SSD20XD_TTL_OFFSET_TTL19, \
  368. SSD20XD_TTL_OFFSET_TTL20, \
  369. SSD20XD_TTL_OFFSET_TTL21, \
  370. SSD20XD_TTL_OFFSET_TTL22, \
  371. SSD20XD_TTL_OFFSET_TTL23, \
  372. SSD20XD_TTL_OFFSET_TTL24, \
  373. SSD20XD_TTL_OFFSET_TTL25, \
  374. SSD20XD_TTL_OFFSET_TTL26, \
  375. SSD20XD_TTL_OFFSET_TTL27
  376. /* On the ssd20xd the two normal uarts have dedicated pins */
  377. #define SSD20XD_PINNAME_UART0_RX "uart0_rx"
  378. #define SSD20XD_PINNAME_UART0_TX "uart0_tx"
  379. #define SSD20XD_UART0_NAMES \
  380. SSD20XD_PINNAME_UART0_RX, \
  381. SSD20XD_PINNAME_UART0_TX
  382. #define SSD20XD_PINNAME_UART1_RX "uart1_rx"
  383. #define SSD20XD_PINNAME_UART1_TX "uart1_tx"
  384. #define SSD20XD_UART1_NAMES \
  385. SSD20XD_PINNAME_UART1_RX, \
  386. SSD20XD_PINNAME_UART1_TX
  387. #define SSD20XD_OFF_UART0_RX 0x60
  388. #define SSD20XD_OFF_UART0_TX 0x64
  389. #define SSD20XD_UART0_OFFSETS \
  390. SSD20XD_OFF_UART0_RX, \
  391. SSD20XD_OFF_UART0_TX
  392. #define SSD20XD_OFF_UART1_RX 0x68
  393. #define SSD20XD_OFF_UART1_TX 0x6c
  394. #define SSD20XD_UART1_OFFSETS \
  395. SSD20XD_OFF_UART1_RX, \
  396. SSD20XD_OFF_UART1_TX
  397. /*
  398. * ssd20x has the same pin names but different ordering
  399. * of the registers that control the gpio.
  400. */
  401. #define SSD20XD_OFF_SD_D0 0x140
  402. #define SSD20XD_OFF_SD_D1 0x144
  403. #define SSD20XD_OFF_SD_D2 0x148
  404. #define SSD20XD_OFF_SD_D3 0x14c
  405. #define SSD20XD_OFF_SD_CMD 0x150
  406. #define SSD20XD_OFF_SD_CLK 0x154
  407. #define SSD20XD_SD_OFFSETS SSD20XD_OFF_SD_CLK, \
  408. SSD20XD_OFF_SD_CMD, \
  409. SSD20XD_OFF_SD_D0, \
  410. SSD20XD_OFF_SD_D1, \
  411. SSD20XD_OFF_SD_D2, \
  412. SSD20XD_OFF_SD_D3
  413. static const char * const ssd20xd_names[] = {
  414. FUART_NAMES,
  415. SD_NAMES,
  416. SSD20XD_UART0_NAMES,
  417. SSD20XD_UART1_NAMES,
  418. SSD20XD_TTL_PINNAMES,
  419. SSD20XD_GPIO_NAMES,
  420. };
  421. static const unsigned int ssd20xd_offsets[] = {
  422. FUART_OFFSETS,
  423. SSD20XD_SD_OFFSETS,
  424. SSD20XD_UART0_OFFSETS,
  425. SSD20XD_UART1_OFFSETS,
  426. SSD20XD_TTL_OFFSETS,
  427. SSD20XD_GPIO_OFFSETS,
  428. };
  429. MSC313_GPIO_CHIPDATA(ssd20xd);
  430. #endif
  431. struct msc313_gpio {
  432. void __iomem *base;
  433. const struct msc313_gpio_data *gpio_data;
  434. u8 *saved;
  435. };
  436. static void msc313_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
  437. {
  438. struct msc313_gpio *gpio = gpiochip_get_data(chip);
  439. u8 gpioreg = readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]);
  440. if (value)
  441. gpioreg |= MSC313_GPIO_OUT;
  442. else
  443. gpioreg &= ~MSC313_GPIO_OUT;
  444. writeb_relaxed(gpioreg, gpio->base + gpio->gpio_data->offsets[offset]);
  445. }
  446. static int msc313_gpio_get(struct gpio_chip *chip, unsigned int offset)
  447. {
  448. struct msc313_gpio *gpio = gpiochip_get_data(chip);
  449. return readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]) & MSC313_GPIO_IN;
  450. }
  451. static int msc313_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
  452. {
  453. struct msc313_gpio *gpio = gpiochip_get_data(chip);
  454. u8 gpioreg = readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]);
  455. gpioreg |= MSC313_GPIO_OEN;
  456. writeb_relaxed(gpioreg, gpio->base + gpio->gpio_data->offsets[offset]);
  457. return 0;
  458. }
  459. static int msc313_gpio_direction_output(struct gpio_chip *chip, unsigned int offset, int value)
  460. {
  461. struct msc313_gpio *gpio = gpiochip_get_data(chip);
  462. u8 gpioreg = readb_relaxed(gpio->base + gpio->gpio_data->offsets[offset]);
  463. gpioreg &= ~MSC313_GPIO_OEN;
  464. if (value)
  465. gpioreg |= MSC313_GPIO_OUT;
  466. else
  467. gpioreg &= ~MSC313_GPIO_OUT;
  468. writeb_relaxed(gpioreg, gpio->base + gpio->gpio_data->offsets[offset]);
  469. return 0;
  470. }
  471. /*
  472. * The interrupt handling happens in the parent interrupt controller,
  473. * we don't do anything here.
  474. */
  475. static struct irq_chip msc313_gpio_irqchip = {
  476. .name = "GPIO",
  477. .irq_eoi = irq_chip_eoi_parent,
  478. .irq_mask = irq_chip_mask_parent,
  479. .irq_unmask = irq_chip_unmask_parent,
  480. .irq_set_type = irq_chip_set_type_parent,
  481. .irq_set_affinity = irq_chip_set_affinity_parent,
  482. };
  483. /*
  484. * The parent interrupt controller needs the GIC interrupt type set to GIC_SPI
  485. * so we need to provide the fwspec. Essentially gpiochip_populate_parent_fwspec_twocell
  486. * that puts GIC_SPI into the first cell.
  487. */
  488. static int msc313_gpio_populate_parent_fwspec(struct gpio_chip *gc,
  489. union gpio_irq_fwspec *gfwspec,
  490. unsigned int parent_hwirq,
  491. unsigned int parent_type)
  492. {
  493. struct irq_fwspec *fwspec = &gfwspec->fwspec;
  494. fwspec->fwnode = gc->irq.parent_domain->fwnode;
  495. fwspec->param_count = 3;
  496. fwspec->param[0] = GIC_SPI;
  497. fwspec->param[1] = parent_hwirq;
  498. fwspec->param[2] = parent_type;
  499. return 0;
  500. }
  501. static int msc313e_gpio_child_to_parent_hwirq(struct gpio_chip *chip,
  502. unsigned int child,
  503. unsigned int child_type,
  504. unsigned int *parent,
  505. unsigned int *parent_type)
  506. {
  507. struct msc313_gpio *priv = gpiochip_get_data(chip);
  508. unsigned int offset = priv->gpio_data->offsets[child];
  509. /*
  510. * only the spi0 pins have interrupts on the parent
  511. * on all of the known chips and so far they are all
  512. * mapped to the same place
  513. */
  514. if (offset >= OFF_SPI0_CZ && offset <= OFF_SPI0_DO) {
  515. *parent_type = child_type;
  516. *parent = ((offset - OFF_SPI0_CZ) >> 2) + 28;
  517. return 0;
  518. }
  519. return -EINVAL;
  520. }
  521. static int msc313_gpio_probe(struct platform_device *pdev)
  522. {
  523. const struct msc313_gpio_data *match_data;
  524. struct msc313_gpio *gpio;
  525. struct gpio_chip *gpiochip;
  526. struct gpio_irq_chip *gpioirqchip;
  527. struct irq_domain *parent_domain;
  528. struct device_node *parent_node;
  529. struct device *dev = &pdev->dev;
  530. match_data = of_device_get_match_data(dev);
  531. if (!match_data)
  532. return -EINVAL;
  533. parent_node = of_irq_find_parent(dev->of_node);
  534. if (!parent_node)
  535. return -ENODEV;
  536. parent_domain = irq_find_host(parent_node);
  537. if (!parent_domain)
  538. return -ENODEV;
  539. gpio = devm_kzalloc(dev, sizeof(*gpio), GFP_KERNEL);
  540. if (!gpio)
  541. return -ENOMEM;
  542. gpio->gpio_data = match_data;
  543. gpio->saved = devm_kcalloc(dev, gpio->gpio_data->num, sizeof(*gpio->saved), GFP_KERNEL);
  544. if (!gpio->saved)
  545. return -ENOMEM;
  546. gpio->base = devm_platform_ioremap_resource(pdev, 0);
  547. if (IS_ERR(gpio->base))
  548. return PTR_ERR(gpio->base);
  549. platform_set_drvdata(pdev, gpio);
  550. gpiochip = devm_kzalloc(dev, sizeof(*gpiochip), GFP_KERNEL);
  551. if (!gpiochip)
  552. return -ENOMEM;
  553. gpiochip->label = DRIVER_NAME;
  554. gpiochip->parent = dev;
  555. gpiochip->request = gpiochip_generic_request;
  556. gpiochip->free = gpiochip_generic_free;
  557. gpiochip->direction_input = msc313_gpio_direction_input;
  558. gpiochip->direction_output = msc313_gpio_direction_output;
  559. gpiochip->get = msc313_gpio_get;
  560. gpiochip->set = msc313_gpio_set;
  561. gpiochip->base = -1;
  562. gpiochip->ngpio = gpio->gpio_data->num;
  563. gpiochip->names = gpio->gpio_data->names;
  564. gpioirqchip = &gpiochip->irq;
  565. gpioirqchip->chip = &msc313_gpio_irqchip;
  566. gpioirqchip->fwnode = of_node_to_fwnode(dev->of_node);
  567. gpioirqchip->parent_domain = parent_domain;
  568. gpioirqchip->child_to_parent_hwirq = msc313e_gpio_child_to_parent_hwirq;
  569. gpioirqchip->populate_parent_alloc_arg = msc313_gpio_populate_parent_fwspec;
  570. gpioirqchip->handler = handle_bad_irq;
  571. gpioirqchip->default_type = IRQ_TYPE_NONE;
  572. return devm_gpiochip_add_data(dev, gpiochip, gpio);
  573. }
  574. static int msc313_gpio_remove(struct platform_device *pdev)
  575. {
  576. return 0;
  577. }
  578. static const struct of_device_id msc313_gpio_of_match[] = {
  579. #ifdef CONFIG_MACH_INFINITY
  580. {
  581. .compatible = "mstar,msc313-gpio",
  582. .data = &msc313_data,
  583. },
  584. {
  585. .compatible = "sstar,ssd20xd-gpio",
  586. .data = &ssd20xd_data,
  587. },
  588. #endif
  589. { }
  590. };
  591. /*
  592. * The GPIO controller loses the state of the registers when the
  593. * SoC goes into suspend to memory mode so we need to save some
  594. * of the register bits before suspending and put it back when resuming
  595. */
  596. static int __maybe_unused msc313_gpio_suspend(struct device *dev)
  597. {
  598. struct msc313_gpio *gpio = dev_get_drvdata(dev);
  599. int i;
  600. for (i = 0; i < gpio->gpio_data->num; i++)
  601. gpio->saved[i] = readb_relaxed(gpio->base + gpio->gpio_data->offsets[i]) & MSC313_GPIO_BITSTOSAVE;
  602. return 0;
  603. }
  604. static int __maybe_unused msc313_gpio_resume(struct device *dev)
  605. {
  606. struct msc313_gpio *gpio = dev_get_drvdata(dev);
  607. int i;
  608. for (i = 0; i < gpio->gpio_data->num; i++)
  609. writeb_relaxed(gpio->saved[i], gpio->base + gpio->gpio_data->offsets[i]);
  610. return 0;
  611. }
  612. static SIMPLE_DEV_PM_OPS(msc313_gpio_ops, msc313_gpio_suspend, msc313_gpio_resume);
  613. static struct platform_driver msc313_gpio_driver = {
  614. .driver = {
  615. .name = DRIVER_NAME,
  616. .of_match_table = msc313_gpio_of_match,
  617. .pm = &msc313_gpio_ops,
  618. },
  619. .probe = msc313_gpio_probe,
  620. .remove = msc313_gpio_remove,
  621. };
  622. builtin_platform_driver(msc313_gpio_driver);