0057-driver-spi-Fix-DSPI-bug-after-adding-exceed-16MB-for.patch 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. From 0ff26c3761e5a17d21e7ee0bd9a2068f55c84d55 Mon Sep 17 00:00:00 2001
  2. From: Yunhui Cui <[email protected]>
  3. Date: Wed, 15 Jun 2016 14:57:08 +0800
  4. Subject: [PATCH 57/93] driver: spi: Fix DSPI bug after adding exceed 16MB for
  5. QSPI
  6. => sf probe 1:0
  7. SF: Detected N25Q128A with page size 256 Bytes, erase size 64 KiB, total
  8. 16 MiB
  9. => mw.l 80000000 55555555 1100
  10. => mw.l 80020000 aaaaaaaa 1100
  11. => sf erase 0 +1100
  12. SF: 65536 bytes @ 0x0 Erased: OK
  13. => sf write 80020000 0 1100
  14. device 0 offset 0x0, size 0x1100
  15. SF: 4352 bytes @ 0x0 Written: OK
  16. => sf read 80000000 0 1100
  17. device 0 offset 0x0, size 0x1100
  18. SF: 4352 bytes @ 0x0 Read: OK
  19. => cmp.b 80000000 80020000 1100
  20. byte at 0x00000000800010fe (0xff) != byte at 0x00000000800210fe (0xaa)
  21. Total of 4350 byte(s) were the same
  22. Signed-off-by: Yunhui Cui <[email protected]>
  23. ---
  24. drivers/mtd/spi/spi_flash.c | 21 +++++++++++++++------
  25. 1 file changed, 15 insertions(+), 6 deletions(-)
  26. diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
  27. index b0f09ab..e04bd55 100644
  28. --- a/drivers/mtd/spi/spi_flash.c
  29. +++ b/drivers/mtd/spi/spi_flash.c
  30. @@ -326,8 +326,11 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
  31. return -EINVAL;
  32. }
  33. }
  34. + if (flash->size > SPI_FLASH_16MB_BOUN)
  35. + cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
  36. + else
  37. + cmdsz = SPI_FLASH_CMD_LEN;
  38. - cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
  39. cmd = calloc(1, cmdsz);
  40. if (!cmd) {
  41. debug("SF: Failed to allocate cmd\n");
  42. @@ -353,7 +356,7 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
  43. debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
  44. cmd[2], cmd[3], erase_addr);
  45. - ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
  46. + ret = spi_flash_write_common(flash, cmd, cmdsz, NULL, 0);
  47. if (ret < 0) {
  48. debug("SF: erase failed\n");
  49. break;
  50. @@ -385,8 +388,10 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
  51. return -EINVAL;
  52. }
  53. }
  54. -
  55. - cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
  56. + if (flash->size > SPI_FLASH_16MB_BOUN)
  57. + cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
  58. + else
  59. + cmdsz = SPI_FLASH_CMD_LEN;
  60. cmd = calloc(1, cmdsz);
  61. if (!cmd) {
  62. debug("SF: Failed to allocate cmd\n");
  63. @@ -418,7 +423,7 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
  64. debug("SF: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
  65. buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
  66. - ret = spi_flash_write_common(flash, cmd, sizeof(cmd),
  67. + ret = spi_flash_write_common(flash, cmd, cmdsz,
  68. buf + actual, chunk_len);
  69. if (ret < 0) {
  70. debug("SF: write failed\n");
  71. @@ -482,7 +487,11 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
  72. return 0;
  73. }
  74. - cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
  75. + if (flash->size > SPI_FLASH_16MB_BOUN)
  76. + cmdsz = SPI_FLASH_CMD_LEN_EXT + flash->dummy_byte;
  77. + else
  78. + cmdsz = SPI_FLASH_CMD_LEN + flash->dummy_byte;
  79. +
  80. cmd = calloc(1, cmdsz);
  81. if (!cmd) {
  82. debug("SF: Failed to allocate cmd\n");
  83. --
  84. 1.7.9.5