0002-mediatek-snfi-adjust-pin-drive-strength-for-Fidelix-.patch 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. From 6470986f037880ce76960c369d6e5a5270e7ce32 Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Sun, 10 Mar 2024 15:39:07 +0000
  4. Subject: [PATCH 2/3] mediatek: snfi: adjust pin drive strength for Fidelix
  5. SPI-NAND
  6. It seems like we might need to adjust the pin driver strength to 12mA
  7. for Fidelix SPI-NAND chip on MT7622 to avoid SPI data corruption on
  8. some devices.
  9. Signed-off-by: Daniel Golle <[email protected]>
  10. ---
  11. .../apsoc_common/drivers/snfi/mtk-snand-def.h | 7 +++++
  12. .../apsoc_common/drivers/snfi/mtk-snand-ids.c | 4 ++-
  13. .../apsoc_common/drivers/snfi/mtk-snand.c | 30 +++++++++++++++++++
  14. 3 files changed, 40 insertions(+), 1 deletion(-)
  15. --- a/plat/mediatek/apsoc_common/drivers/snfi/mtk-snand-def.h
  16. +++ b/plat/mediatek/apsoc_common/drivers/snfi/mtk-snand-def.h
  17. @@ -86,6 +86,12 @@ struct snand_mem_org {
  18. typedef int (*snand_select_die_t)(struct mtk_snand *snf, uint32_t dieidx);
  19. +enum snand_drv {
  20. + SNAND_DRV_NO_CHANGE = 0,
  21. + SNAND_DRV_8mA = 8,
  22. + SNAND_DRV_12mA = 12,
  23. +};
  24. +
  25. struct snand_flash_info {
  26. const char *model;
  27. struct snand_id id;
  28. @@ -93,6 +99,7 @@ struct snand_flash_info {
  29. const struct snand_io_cap *cap_rd;
  30. const struct snand_io_cap *cap_pl;
  31. snand_select_die_t select_die;
  32. + enum snand_drv drv;
  33. };
  34. #define SNAND_INFO(_model, _id, _memorg, _cap_rd, _cap_pl, ...) \
  35. --- a/plat/mediatek/apsoc_common/drivers/snfi/mtk-snand-ids.c
  36. +++ b/plat/mediatek/apsoc_common/drivers/snfi/mtk-snand-ids.c
  37. @@ -424,7 +424,9 @@ static const struct snand_flash_info sna
  38. SNAND_INFO("FM35Q1GA", SNAND_ID(SNAND_ID_DYMMY, 0xe5, 0x71),
  39. SNAND_MEMORG_1G_2K_64,
  40. &snand_cap_read_from_cache_x4_only,
  41. - &snand_cap_program_load_x4),
  42. + &snand_cap_program_load_x4,
  43. + NULL,
  44. + SNAND_DRV_12mA),
  45. SNAND_INFO("PN26G01A", SNAND_ID(SNAND_ID_DYMMY, 0xa1, 0xe1),
  46. SNAND_MEMORG_1G_2K_128,
  47. --- a/plat/mediatek/apsoc_common/drivers/snfi/mtk-snand.c
  48. +++ b/plat/mediatek/apsoc_common/drivers/snfi/mtk-snand.c
  49. @@ -1845,6 +1845,33 @@ static int mtk_snand_id_probe(struct mtk
  50. return -EINVAL;
  51. }
  52. +#define MT7622_GPIO_BASE (void *)0x10211000
  53. +#define MT7622_GPIO_DRIV(x) (MT7622_GPIO_BASE + 0x900 + 0x10 * x)
  54. +
  55. +void mtk_mt7622_snand_adjust_drive(void *dev, enum snand_drv drv)
  56. +{
  57. + uint32_t e4, e8;
  58. +
  59. + e4 = readl(MT7622_GPIO_DRIV(6)) & ~(0x3f00);
  60. + e8 = readl(MT7622_GPIO_DRIV(7)) & ~(0x3f00);
  61. +
  62. + switch (drv) {
  63. + case SNAND_DRV_8mA:
  64. + e4 |= 0x3f00;
  65. + break;
  66. + case SNAND_DRV_12mA:
  67. + e8 |= 0x3f00;
  68. + break;
  69. + default:
  70. + return;
  71. + }
  72. +
  73. + snand_log_chip(dev, "adjusting SPI-NAND pin drive strength to %umA\n", drv);
  74. +
  75. + writel(e4, MT7622_GPIO_DRIV(6));
  76. + writel(e8, MT7622_GPIO_DRIV(7));
  77. +}
  78. +
  79. int mtk_snand_init(void *dev, const struct mtk_snand_platdata *pdata,
  80. struct mtk_snand **psnf)
  81. {
  82. @@ -1888,6 +1915,9 @@ int mtk_snand_init(void *dev, const stru
  83. if (ret)
  84. return ret;
  85. + if (pdata->soc == SNAND_SOC_MT7622 && snand_info->drv)
  86. + mtk_mt7622_snand_adjust_drive(dev, snand_info->drv);
  87. +
  88. rawpage_size = snand_info->memorg.pagesize +
  89. snand_info->memorg.sparesize;