0005-sf-make-calculatiom-of-address-bytes-completely-conf.patch 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. From 6fb5f86b094756d94de8abe7425e3d290ff22dd2 Mon Sep 17 00:00:00 2001
  2. From: Daniel Schwierzeck <[email protected]>
  3. Date: Sun, 13 Oct 2013 15:09:28 +0200
  4. Subject: sf: make calculatiom of address bytes completely configurable
  5. Signed-off-by: Daniel Schwierzeck <[email protected]>
  6. diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c
  7. index d34747b..207adf5 100644
  8. --- a/drivers/mtd/spi/sf_ops.c
  9. +++ b/drivers/mtd/spi/sf_ops.c
  10. @@ -15,12 +15,17 @@
  11. #include "sf_internal.h"
  12. -static void spi_flash_addr(u32 addr, u8 *cmd)
  13. +static void spi_flash_addr(const struct spi_flash *flash, u32 addr, u8 *cmd)
  14. {
  15. /* cmd[0] is actual command */
  16. - cmd[1] = addr >> 16;
  17. - cmd[2] = addr >> 8;
  18. - cmd[3] = addr >> 0;
  19. + cmd[1] = addr >> (flash->addr_width * 8 - 8);
  20. + cmd[2] = addr >> (flash->addr_width * 8 - 16);
  21. + cmd[3] = addr >> (flash->addr_width * 8 - 24);
  22. +}
  23. +
  24. +static int spi_flash_cmdsz(const struct spi_flash *flash)
  25. +{
  26. + return 1 + flash->addr_width;
  27. }
  28. int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)
  29. @@ -158,7 +163,7 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
  30. int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
  31. {
  32. u32 erase_size;
  33. - u8 cmd[4];
  34. + u8 cmd[4], cmd_len;
  35. int ret = -1;
  36. erase_size = flash->erase_size;
  37. @@ -180,12 +185,13 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
  38. if (ret < 0)
  39. goto done;
  40. #endif
  41. - spi_flash_addr(offset, cmd);
  42. + spi_flash_addr(flash, offset, cmd);
  43. + cmd_len = spi_flash_cmdsz(flash);
  44. debug("SF: erase %2x %2x %2x %2x (%x)\n", cmd[0], cmd[1],
  45. cmd[2], cmd[3], offset);
  46. - ret = spi_flash_write_common(flash, cmd, sizeof(cmd), NULL, 0);
  47. + ret = spi_flash_write_common(flash, cmd, cmd_len, NULL, 0);
  48. if (ret < 0) {
  49. debug("SF: erase failed\n");
  50. goto done;
  51. @@ -206,7 +212,7 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
  52. {
  53. unsigned long byte_addr, page_size;
  54. size_t chunk_len, actual;
  55. - u8 cmd[4];
  56. + u8 cmd[4], cmd_len;
  57. int ret = -1;
  58. ret = spi_claim_bus(flash->spi);
  59. @@ -230,12 +236,13 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,
  60. if (flash->spi->max_write_size)
  61. chunk_len = min(chunk_len, flash->spi->max_write_size);
  62. - spi_flash_addr(offset, cmd);
  63. + spi_flash_addr(flash, offset, cmd);
  64. + cmd_len = spi_flash_cmdsz(flash);
  65. debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
  66. buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
  67. - ret = spi_flash_write_common(flash, cmd, sizeof(cmd),
  68. + ret = spi_flash_write_common(flash, cmd, cmd_len,
  69. buf + actual, chunk_len);
  70. if (ret < 0) {
  71. debug("SF: write failed\n");
  72. @@ -269,7 +276,7 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
  73. int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
  74. size_t len, void *data)
  75. {
  76. - u8 cmd[5], bank_sel = 0;
  77. + u8 cmd[5], cmd_len, bank_sel = 0;
  78. u32 remain_len, read_len;
  79. int ret = -1;
  80. @@ -288,7 +295,6 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
  81. }
  82. cmd[0] = CMD_READ_ARRAY_FAST;
  83. - cmd[4] = 0x00;
  84. while (len) {
  85. #ifdef CONFIG_SPI_FLASH_BAR
  86. @@ -306,9 +312,11 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
  87. else
  88. read_len = remain_len;
  89. - spi_flash_addr(offset, cmd);
  90. + spi_flash_addr(flash, offset, cmd);
  91. + cmd_len = spi_flash_cmdsz(flash);
  92. + cmd[cmd_len] = 0x00;
  93. - ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
  94. + ret = spi_flash_read_common(flash, cmd, cmd_len + 1,
  95. data, read_len);
  96. if (ret < 0) {
  97. debug("SF: read failed\n");
  98. diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
  99. index 380aa09..84289db 100644
  100. --- a/drivers/mtd/spi/sf_probe.c
  101. +++ b/drivers/mtd/spi/sf_probe.c
  102. @@ -218,6 +218,9 @@ static int spi_flash_validate_params(struct spi_flash *flash,
  103. flash->poll_cmd = CMD_FLAG_STATUS;
  104. #endif
  105. + /* Configure default 3-byte addressing */
  106. + flash->addr_width = 3;
  107. +
  108. /* Configure the BAR - discover bank cmds and read current bank */
  109. #ifdef CONFIG_SPI_FLASH_BAR
  110. u8 curr_bank = 0;
  111. diff --git a/include/spi_flash.h b/include/spi_flash.h
  112. index 411dd1b..cc9398b 100644
  113. --- a/include/spi_flash.h
  114. +++ b/include/spi_flash.h
  115. @@ -57,6 +57,7 @@ struct spi_flash {
  116. #endif
  117. u8 poll_cmd;
  118. u8 erase_cmd;
  119. + u8 addr_width;
  120. void *memory_map;
  121. int (*read)(struct spi_flash *flash, u32 offset, size_t len, void *buf);
  122. --
  123. 1.8.3.2