rtl838x-nor.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/device.h>
  3. #include <linux/init.h>
  4. #include <linux/module.h>
  5. #include <linux/mutex.h>
  6. #include <linux/of.h>
  7. #include <linux/of_device.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/slab.h>
  10. #include <linux/mtd/mtd.h>
  11. #include <linux/mtd/partitions.h>
  12. #include <linux/mtd/spi-nor.h>
  13. #include "rtl838x-spi.h"
  14. #include <asm/mach-rtl838x/mach-rtl83xx.h>
  15. extern struct rtl83xx_soc_info soc_info;
  16. struct rtl838x_nor {
  17. struct spi_nor nor;
  18. struct device *dev;
  19. volatile void __iomem *base;
  20. bool fourByteMode;
  21. u32 chipSize;
  22. uint32_t flags;
  23. uint32_t io_status;
  24. };
  25. static uint32_t spi_prep(struct rtl838x_nor *rtl838x_nor)
  26. {
  27. /* Needed because of MMU constraints */
  28. SPI_WAIT_READY;
  29. spi_w32w(SPI_CS_INIT, SFCSR); //deactivate CS0, CS1
  30. spi_w32w(0, SFCSR); //activate CS0,CS1
  31. spi_w32w(SPI_CS_INIT, SFCSR); //deactivate CS0, CS1
  32. return (CS0 & rtl838x_nor->flags) ? (SPI_eCS0 & SPI_LEN_INIT)
  33. : ((SPI_eCS1 & SPI_LEN_INIT) | SFCSR_CHIP_SEL);
  34. }
  35. static uint32_t rtl838x_nor_get_SR(struct rtl838x_nor *rtl838x_nor)
  36. {
  37. uint32_t sfcsr, sfdr;
  38. sfcsr = spi_prep(rtl838x_nor);
  39. sfdr = (SPINOR_OP_RDSR)<<24;
  40. pr_debug("%s: rdid,sfcsr_val = %.8x,SFDR = %.8x\n", __func__, sfcsr, sfdr);
  41. pr_debug("rdid,sfcsr = %.8x\n", sfcsr | SPI_LEN4);
  42. spi_w32w(sfcsr, SFCSR);
  43. spi_w32w(sfdr, SFDR);
  44. spi_w32_mask(0, SPI_LEN4, SFCSR);
  45. SPI_WAIT_READY;
  46. return spi_r32(SFDR);
  47. }
  48. static void spi_write_disable(struct rtl838x_nor *rtl838x_nor)
  49. {
  50. uint32_t sfcsr, sfdr;
  51. sfcsr = spi_prep(rtl838x_nor);
  52. sfdr = (SPINOR_OP_WRDI) << 24;
  53. spi_w32w(sfcsr, SFCSR);
  54. spi_w32w(sfdr, SFDR);
  55. pr_debug("%s: sfcsr_val = %.8x,SFDR = %.8x", __func__, sfcsr, sfdr);
  56. spi_prep(rtl838x_nor);
  57. }
  58. static void spi_write_enable(struct rtl838x_nor *rtl838x_nor)
  59. {
  60. uint32_t sfcsr, sfdr;
  61. sfcsr = spi_prep(rtl838x_nor);
  62. sfdr = (SPINOR_OP_WREN) << 24;
  63. spi_w32w(sfcsr, SFCSR);
  64. spi_w32w(sfdr, SFDR);
  65. pr_debug("%s: sfcsr_val = %.8x,SFDR = %.8x", __func__, sfcsr, sfdr);
  66. spi_prep(rtl838x_nor);
  67. }
  68. static void spi_4b_set(struct rtl838x_nor *rtl838x_nor, bool enable)
  69. {
  70. uint32_t sfcsr, sfdr;
  71. sfcsr = spi_prep(rtl838x_nor);
  72. if (enable)
  73. sfdr = (SPINOR_OP_EN4B) << 24;
  74. else
  75. sfdr = (SPINOR_OP_EX4B) << 24;
  76. spi_w32w(sfcsr, SFCSR);
  77. spi_w32w(sfdr, SFDR);
  78. pr_debug("%s: sfcsr_val = %.8x,SFDR = %.8x", __func__, sfcsr, sfdr);
  79. spi_prep(rtl838x_nor);
  80. }
  81. static int rtl838x_get_addr_mode(struct rtl838x_nor *rtl838x_nor)
  82. {
  83. int res = 3;
  84. u32 reg;
  85. sw_w32(0x3, RTL838X_INT_RW_CTRL);
  86. if (!sw_r32(RTL838X_EXT_VERSION)) {
  87. if (sw_r32(RTL838X_STRAP_DBG) & (1 << 29))
  88. res = 4;
  89. } else {
  90. reg = sw_r32(RTL838X_PLL_CML_CTRL);
  91. if ((reg & (1 << 30)) && (reg & (1 << 31)))
  92. res = 4;
  93. if ((!(reg & (1 << 30)))
  94. && sw_r32(RTL838X_STRAP_DBG) & (1 << 29))
  95. res = 4;
  96. }
  97. sw_w32(0x0, RTL838X_INT_RW_CTRL);
  98. return res;
  99. }
  100. static int rtl8390_get_addr_mode(struct rtl838x_nor *rtl838x_nor)
  101. {
  102. if (spi_r32(RTL8390_SOC_SPI_MMIO_CONF) & (1 << 9))
  103. return 4;
  104. return 3;
  105. }
  106. ssize_t rtl838x_do_read(struct rtl838x_nor *rtl838x_nor, loff_t from,
  107. size_t length, u_char *buffer, uint8_t command)
  108. {
  109. uint32_t sfcsr, sfdr;
  110. uint32_t len = length;
  111. sfcsr = spi_prep(rtl838x_nor);
  112. sfdr = command << 24;
  113. /* Perform SPINOR_OP_READ: 1 byte command & 3 byte addr*/
  114. sfcsr |= SPI_LEN4;
  115. sfdr |= from;
  116. spi_w32w(sfcsr, SFCSR);
  117. spi_w32w(sfdr, SFDR);
  118. /* Read Data, 4 bytes at a time */
  119. while (length >= 4) {
  120. SPI_WAIT_READY;
  121. *((uint32_t *) buffer) = spi_r32(SFDR);
  122. buffer += 4;
  123. length -= 4;
  124. }
  125. /* The rest needs to be read 1 byte a time */
  126. sfcsr &= SPI_LEN_INIT|SPI_LEN1;
  127. SPI_WAIT_READY;
  128. spi_w32w(sfcsr, SFCSR);
  129. while (length > 0) {
  130. SPI_WAIT_READY;
  131. *(buffer) = spi_r32(SFDR) >> 24;
  132. buffer++;
  133. length--;
  134. }
  135. return len;
  136. }
  137. /*
  138. * Do fast read in 3 or 4 Byte addressing mode
  139. */
  140. static ssize_t rtl838x_do_4bf_read(struct rtl838x_nor *rtl838x_nor, loff_t from,
  141. size_t length, u_char *buffer, uint8_t command)
  142. {
  143. int sfcsr_addr_len = rtl838x_nor->fourByteMode ? 0x3 : 0x2;
  144. int sfdr_addr_shift = rtl838x_nor->fourByteMode ? 0 : 8;
  145. uint32_t sfcsr;
  146. uint32_t len = length;
  147. pr_debug("Fast read from %llx, len %x, shift %d\n",
  148. from, sfcsr_addr_len, sfdr_addr_shift);
  149. sfcsr = spi_prep(rtl838x_nor);
  150. /* Send read command */
  151. spi_w32w(sfcsr | SPI_LEN1, SFCSR);
  152. spi_w32w(command << 24, SFDR);
  153. /* Send address */
  154. spi_w32w(sfcsr | (sfcsr_addr_len << 28), SFCSR);
  155. spi_w32w(from << sfdr_addr_shift, SFDR);
  156. /* Dummy cycles */
  157. spi_w32w(sfcsr | SPI_LEN1, SFCSR);
  158. spi_w32w(0, SFDR);
  159. /* Start reading */
  160. spi_w32w(sfcsr | SPI_LEN4, SFCSR);
  161. /* Read Data, 4 bytes at a time */
  162. while (length >= 4) {
  163. SPI_WAIT_READY;
  164. *((uint32_t *) buffer) = spi_r32(SFDR);
  165. buffer += 4;
  166. length -= 4;
  167. }
  168. /* The rest needs to be read 1 byte a time */
  169. sfcsr &= SPI_LEN_INIT|SPI_LEN1;
  170. SPI_WAIT_READY;
  171. spi_w32w(sfcsr, SFCSR);
  172. while (length > 0) {
  173. SPI_WAIT_READY;
  174. *(buffer) = spi_r32(SFDR) >> 24;
  175. buffer++;
  176. length--;
  177. }
  178. return len;
  179. }
  180. /*
  181. * Do write (Page Programming) in 3 or 4 Byte addressing mode
  182. */
  183. static ssize_t rtl838x_do_4b_write(struct rtl838x_nor *rtl838x_nor, loff_t to,
  184. size_t length, const u_char *buffer,
  185. uint8_t command)
  186. {
  187. int sfcsr_addr_len = rtl838x_nor->fourByteMode ? 0x3 : 0x2;
  188. int sfdr_addr_shift = rtl838x_nor->fourByteMode ? 0 : 8;
  189. uint32_t sfcsr;
  190. uint32_t len = length;
  191. pr_debug("Write to %llx, len %x, shift %d\n",
  192. to, sfcsr_addr_len, sfdr_addr_shift);
  193. sfcsr = spi_prep(rtl838x_nor);
  194. /* Send write command, command IO-width is 1 (bit 25/26) */
  195. spi_w32w(sfcsr | SPI_LEN1 | (0 << 25), SFCSR);
  196. spi_w32w(command << 24, SFDR);
  197. /* Send address */
  198. spi_w32w(sfcsr | (sfcsr_addr_len << 28) | (0 << 25), SFCSR);
  199. spi_w32w(to << sfdr_addr_shift, SFDR);
  200. /* Write Data, 1 byte at a time, if we are not 4-byte aligned */
  201. if (((long)buffer) % 4) {
  202. spi_w32w(sfcsr | SPI_LEN1, SFCSR);
  203. while (length > 0 && (((long)buffer) % 4)) {
  204. SPI_WAIT_READY;
  205. spi_w32(*(buffer) << 24, SFDR);
  206. buffer += 1;
  207. length -= 1;
  208. }
  209. }
  210. /* Now we can write 4 bytes at a time */
  211. SPI_WAIT_READY;
  212. spi_w32w(sfcsr | SPI_LEN4, SFCSR);
  213. while (length >= 4) {
  214. SPI_WAIT_READY;
  215. spi_w32(*((uint32_t *)buffer), SFDR);
  216. buffer += 4;
  217. length -= 4;
  218. }
  219. /* Final bytes might need to be written 1 byte at a time, again */
  220. SPI_WAIT_READY;
  221. spi_w32w(sfcsr | SPI_LEN1, SFCSR);
  222. while (length > 0) {
  223. SPI_WAIT_READY;
  224. spi_w32(*(buffer) << 24, SFDR);
  225. buffer++;
  226. length--;
  227. }
  228. return len;
  229. }
  230. static ssize_t rtl838x_nor_write(struct spi_nor *nor, loff_t to, size_t len,
  231. const u_char *buffer)
  232. {
  233. int ret = 0;
  234. uint32_t offset = 0;
  235. struct rtl838x_nor *rtl838x_nor = nor->priv;
  236. size_t l = len;
  237. uint8_t cmd = SPINOR_OP_PP;
  238. /* Do write in 4-byte mode on large Macronix chips */
  239. if (rtl838x_nor->fourByteMode) {
  240. cmd = SPINOR_OP_PP_4B;
  241. spi_4b_set(rtl838x_nor, true);
  242. }
  243. pr_debug("In %s %8x to: %llx\n", __func__,
  244. (unsigned int) rtl838x_nor, to);
  245. while (l >= SPI_MAX_TRANSFER_SIZE) {
  246. while
  247. (rtl838x_nor_get_SR(rtl838x_nor) & SPI_WIP);
  248. do {
  249. spi_write_enable(rtl838x_nor);
  250. } while (!(rtl838x_nor_get_SR(rtl838x_nor) & SPI_WEL));
  251. ret = rtl838x_do_4b_write(rtl838x_nor, to + offset,
  252. SPI_MAX_TRANSFER_SIZE, buffer+offset, cmd);
  253. l -= SPI_MAX_TRANSFER_SIZE;
  254. offset += SPI_MAX_TRANSFER_SIZE;
  255. }
  256. if (l > 0) {
  257. while
  258. (rtl838x_nor_get_SR(rtl838x_nor) & SPI_WIP);
  259. do {
  260. spi_write_enable(rtl838x_nor);
  261. } while (!(rtl838x_nor_get_SR(rtl838x_nor) & SPI_WEL));
  262. ret = rtl838x_do_4b_write(rtl838x_nor, to+offset,
  263. len, buffer+offset, cmd);
  264. }
  265. return len;
  266. }
  267. static ssize_t rtl838x_nor_read(struct spi_nor *nor, loff_t from,
  268. size_t length, u_char *buffer)
  269. {
  270. uint32_t offset = 0;
  271. uint8_t cmd = SPINOR_OP_READ_FAST;
  272. size_t l = length;
  273. struct rtl838x_nor *rtl838x_nor = nor->priv;
  274. /* Do fast read in 3, or 4-byte mode on large Macronix chips */
  275. if (rtl838x_nor->fourByteMode) {
  276. cmd = SPINOR_OP_READ_FAST_4B;
  277. spi_4b_set(rtl838x_nor, true);
  278. }
  279. /* TODO: do timeout and return error */
  280. pr_debug("Waiting for pending writes\n");
  281. while
  282. (rtl838x_nor_get_SR(rtl838x_nor) & SPI_WIP);
  283. do {
  284. spi_write_enable(rtl838x_nor);
  285. } while (!(rtl838x_nor_get_SR(rtl838x_nor) & SPI_WEL));
  286. pr_debug("cmd is %d\n", cmd);
  287. pr_debug("%s: addr %.8llx to addr %.8x, cmd %.8x, size %d\n", __func__,
  288. from, (u32)buffer, (u32)cmd, length);
  289. while (l >= SPI_MAX_TRANSFER_SIZE) {
  290. rtl838x_do_4bf_read(rtl838x_nor, from + offset,
  291. SPI_MAX_TRANSFER_SIZE, buffer+offset, cmd);
  292. l -= SPI_MAX_TRANSFER_SIZE;
  293. offset += SPI_MAX_TRANSFER_SIZE;
  294. }
  295. if (l > 0)
  296. rtl838x_do_4bf_read(rtl838x_nor, from + offset, l, buffer+offset, cmd);
  297. return length;
  298. }
  299. static int rtl838x_erase(struct spi_nor *nor, loff_t offs)
  300. {
  301. struct rtl838x_nor *rtl838x_nor = nor->priv;
  302. int sfcsr_addr_len = rtl838x_nor->fourByteMode ? 0x3 : 0x2;
  303. int sfdr_addr_shift = rtl838x_nor->fourByteMode ? 0 : 8;
  304. uint32_t sfcsr;
  305. uint8_t cmd = SPINOR_OP_SE;
  306. pr_debug("Erasing sector at %llx\n", offs);
  307. /* Do erase in 4-byte mode on large Macronix chips */
  308. if (rtl838x_nor->fourByteMode) {
  309. cmd = SPINOR_OP_SE_4B;
  310. spi_4b_set(rtl838x_nor, true);
  311. }
  312. /* TODO: do timeout and return error */
  313. while
  314. (rtl838x_nor_get_SR(rtl838x_nor) & SPI_WIP);
  315. do {
  316. spi_write_enable(rtl838x_nor);
  317. } while (!(rtl838x_nor_get_SR(rtl838x_nor) & SPI_WEL));
  318. sfcsr = spi_prep(rtl838x_nor);
  319. /* Send erase command, command IO-width is 1 (bit 25/26) */
  320. spi_w32w(sfcsr | SPI_LEN1 | (0 << 25), SFCSR);
  321. spi_w32w(cmd << 24, SFDR);
  322. /* Send address */
  323. spi_w32w(sfcsr | (sfcsr_addr_len << 28) | (0 << 25), SFCSR);
  324. spi_w32w(offs << sfdr_addr_shift, SFDR);
  325. return 0;
  326. }
  327. static int rtl838x_nor_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
  328. {
  329. int length = len;
  330. u8 *buffer = buf;
  331. uint32_t sfcsr, sfdr;
  332. struct rtl838x_nor *rtl838x_nor = nor->priv;
  333. pr_debug("In %s: opcode %x, len %x\n", __func__, opcode, len);
  334. sfcsr = spi_prep(rtl838x_nor);
  335. sfdr = opcode << 24;
  336. sfcsr |= SPI_LEN1;
  337. spi_w32w(sfcsr, SFCSR);
  338. spi_w32w(sfdr, SFDR);
  339. while (length > 0) {
  340. SPI_WAIT_READY;
  341. *(buffer) = spi_r32(SFDR) >> 24;
  342. buffer++;
  343. length--;
  344. }
  345. return len;
  346. }
  347. static int rtl838x_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
  348. {
  349. uint32_t sfcsr, sfdr;
  350. struct rtl838x_nor *rtl838x_nor = nor->priv;
  351. pr_debug("In %s, opcode %x, len %x\n", __func__, opcode, len);
  352. sfcsr = spi_prep(rtl838x_nor);
  353. sfdr = opcode << 24;
  354. if (len == 1) { /* SPINOR_OP_WRSR */
  355. sfdr |= buf[0];
  356. sfcsr |= SPI_LEN2;
  357. }
  358. spi_w32w(sfcsr, SFCSR);
  359. spi_w32w(sfdr, SFDR);
  360. return 0;
  361. }
  362. static int spi_enter_sio(struct spi_nor *nor)
  363. {
  364. uint32_t sfcsr, sfcr2, sfdr;
  365. uint32_t ret = 0, reg = 0, size_bits;
  366. struct rtl838x_nor *rtl838x_nor = nor->priv;
  367. pr_debug("In %s\n", __func__);
  368. rtl838x_nor->io_status = 0;
  369. sfdr = SPI_C_RSTQIO << 24;
  370. sfcsr = spi_prep(rtl838x_nor);
  371. reg = spi_r32(SFCR2);
  372. pr_debug("SFCR2: %x, size %x, rdopt: %x\n", reg, SFCR2_GETSIZE(reg),
  373. (reg & SFCR2_RDOPT));
  374. size_bits = rtl838x_nor->fourByteMode ? SFCR2_SIZE(0x6) : SFCR2_SIZE(0x7);
  375. sfcr2 = SFCR2_HOLD_TILL_SFDR2 | size_bits
  376. | (reg & SFCR2_RDOPT) | SFCR2_CMDIO(0)
  377. | SFCR2_ADDRIO(0) | SFCR2_DUMMYCYCLE(4)
  378. | SFCR2_DATAIO(0) | SFCR2_SFCMD(SPINOR_OP_READ_FAST);
  379. pr_debug("SFCR2: %x, size %x\n", reg, SFCR2_GETSIZE(reg));
  380. SPI_WAIT_READY;
  381. spi_w32w(sfcr2, SFCR2);
  382. spi_w32w(sfcsr, SFCSR);
  383. spi_w32w(sfdr, SFDR);
  384. spi_w32_mask(SFCR2_HOLD_TILL_SFDR2, 0, SFCR2);
  385. rtl838x_nor->io_status &= ~IOSTATUS_CIO_MASK;
  386. rtl838x_nor->io_status |= CIO1;
  387. spi_prep(rtl838x_nor);
  388. return ret;
  389. }
  390. int rtl838x_spi_nor_scan(struct spi_nor *nor, const char *name)
  391. {
  392. static const struct spi_nor_hwcaps hwcaps = {
  393. .mask = SNOR_HWCAPS_READ | SNOR_HWCAPS_PP
  394. | SNOR_HWCAPS_READ_FAST
  395. };
  396. struct rtl838x_nor *rtl838x_nor = nor->priv;
  397. pr_debug("In %s\n", __func__);
  398. spi_w32_mask(0, SFCR_EnableWBO, SFCR);
  399. spi_w32_mask(0, SFCR_EnableRBO, SFCR);
  400. rtl838x_nor->flags = CS0 | R_MODE;
  401. spi_nor_scan(nor, NULL, &hwcaps);
  402. pr_debug("------------- Got size: %llx\n", nor->mtd.size);
  403. return 0;
  404. }
  405. int rtl838x_nor_init(struct rtl838x_nor *rtl838x_nor,
  406. struct device_node *flash_node)
  407. {
  408. int ret;
  409. struct spi_nor *nor;
  410. pr_info("%s called\n", __func__);
  411. nor = &rtl838x_nor->nor;
  412. nor->dev = rtl838x_nor->dev;
  413. nor->priv = rtl838x_nor;
  414. spi_nor_set_flash_node(nor, flash_node);
  415. nor->read_reg = rtl838x_nor_read_reg;
  416. nor->write_reg = rtl838x_nor_write_reg;
  417. nor->read = rtl838x_nor_read;
  418. nor->write = rtl838x_nor_write;
  419. nor->erase = rtl838x_erase;
  420. nor->mtd.name = "rtl838x_nor";
  421. nor->erase_opcode = rtl838x_nor->fourByteMode ? SPINOR_OP_SE_4B
  422. : SPINOR_OP_SE;
  423. /* initialized with NULL */
  424. ret = rtl838x_spi_nor_scan(nor, NULL);
  425. if (ret)
  426. return ret;
  427. spi_enter_sio(nor);
  428. spi_write_disable(rtl838x_nor);
  429. ret = mtd_device_parse_register(&nor->mtd, NULL, NULL, NULL, 0);
  430. return ret;
  431. }
  432. static int rtl838x_nor_drv_probe(struct platform_device *pdev)
  433. {
  434. struct device_node *flash_np;
  435. struct resource *res;
  436. int ret;
  437. struct rtl838x_nor *rtl838x_nor;
  438. int addrMode;
  439. pr_info("Initializing rtl838x_nor_driver\n");
  440. if (!pdev->dev.of_node) {
  441. dev_err(&pdev->dev, "No DT found\n");
  442. return -EINVAL;
  443. }
  444. rtl838x_nor = devm_kzalloc(&pdev->dev, sizeof(*rtl838x_nor), GFP_KERNEL);
  445. if (!rtl838x_nor)
  446. return -ENOMEM;
  447. platform_set_drvdata(pdev, rtl838x_nor);
  448. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  449. rtl838x_nor->base = devm_ioremap_resource(&pdev->dev, res);
  450. if (IS_ERR((void *)rtl838x_nor->base))
  451. return PTR_ERR((void *)rtl838x_nor->base);
  452. pr_info("SPI resource base is %08x\n", (u32)rtl838x_nor->base);
  453. rtl838x_nor->dev = &pdev->dev;
  454. /* only support one attached flash */
  455. flash_np = of_get_next_available_child(pdev->dev.of_node, NULL);
  456. if (!flash_np) {
  457. dev_err(&pdev->dev, "no SPI flash device to configure\n");
  458. ret = -ENODEV;
  459. goto nor_free;
  460. }
  461. /* Get the 3/4 byte address mode as configure by bootloader */
  462. if (soc_info.family == RTL8390_FAMILY_ID)
  463. addrMode = rtl8390_get_addr_mode(rtl838x_nor);
  464. else
  465. addrMode = rtl838x_get_addr_mode(rtl838x_nor);
  466. pr_info("Address mode is %d bytes\n", addrMode);
  467. if (addrMode == 4)
  468. rtl838x_nor->fourByteMode = true;
  469. ret = rtl838x_nor_init(rtl838x_nor, flash_np);
  470. nor_free:
  471. return ret;
  472. }
  473. static int rtl838x_nor_drv_remove(struct platform_device *pdev)
  474. {
  475. /* struct rtl8xx_nor *rtl838x_nor = platform_get_drvdata(pdev); */
  476. return 0;
  477. }
  478. static const struct of_device_id rtl838x_nor_of_ids[] = {
  479. { .compatible = "realtek,rtl838x-nor"},
  480. { /* sentinel */ }
  481. };
  482. MODULE_DEVICE_TABLE(of, rtl838x_nor_of_ids);
  483. static struct platform_driver rtl838x_nor_driver = {
  484. .probe = rtl838x_nor_drv_probe,
  485. .remove = rtl838x_nor_drv_remove,
  486. .driver = {
  487. .name = "rtl838x-nor",
  488. .pm = NULL,
  489. .of_match_table = rtl838x_nor_of_ids,
  490. },
  491. };
  492. module_platform_driver(rtl838x_nor_driver);
  493. MODULE_LICENSE("GPL v2");
  494. MODULE_DESCRIPTION("RTL838x SPI NOR Flash Driver");