rtl838x-nor.c 15 KB

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