Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge patch series "scsi: ufs: renesas: Add support for R-Car S4-8 ES1.2"

Geert Uytterhoeven <geert+renesas@glider.be> says:

Hi all,

Initialization of the UFS controller on R-Car S4-8 ES1.0 requires only
static values. However, other UFS controller variants (R-Car S4-8 ES 1.2)
require dynamic values, like those obtained from E-FUSE, and downloading
firmware.

Hence this patch series refactors the initialization code to prepare for
this, and adds support for the UFS controller on R-Car S4-8 ES1.2.
The accompanying DTS change is available at [1].

This has been tested on:
- Renesas Spider with R-Car S4-8 ES1.0 (broken before/after),
- Renesas S4 Starter Kit with R-Car S4-8 ES1.2 (works after).

Thanks for your comments!

[1] "[PATCH] arm64: dts: renesas: r8a779f4: Add UFS tuning parameters in
E-FUSE"
https://lore.kernel.org/3e4fca228eb049d54a1ae520104558505dbdf803.1741179629.git.geert+renesas@glider.be
[2] "[PATCH v2 0/5] scsi: ufs: renesas: Refactor code for other UFS
controller"
https://lore.kernel.org/20240709023550.1750333-1-yoshihiro.shimoda.uh@renesas.com
[3] "[PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS
controller"
https://lore.kernel.org/20240708120931.1703956-1-yoshihiro.shimoda.uh@renesas.com

Link: https://lore.kernel.org/r/cover.1741179611.git.geert+renesas@glider.be
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

+447 -292
+12
Documentation/devicetree/bindings/ufs/renesas,ufs.yaml
··· 33 33 resets: 34 34 maxItems: 1 35 35 36 + nvmem-cells: 37 + maxItems: 1 38 + 39 + nvmem-cell-names: 40 + items: 41 + - const: calibration 42 + 43 + dependencies: 44 + nvmem-cells: [ nvmem-cell-names ] 45 + 36 46 required: 37 47 - compatible 38 48 - reg ··· 68 58 freq-table-hz = <200000000 200000000>, <38400000 38400000>; 69 59 power-domains = <&sysc R8A779F0_PD_ALWAYS_ON>; 70 60 resets = <&cpg 1514>; 61 + nvmem-cells = <&ufs_tune>; 62 + nvmem-cell-names = "calibration"; 71 63 };
+435 -292
drivers/ufs/host/ufs-renesas.c
··· 9 9 #include <linux/delay.h> 10 10 #include <linux/dma-mapping.h> 11 11 #include <linux/err.h> 12 + #include <linux/firmware.h> 12 13 #include <linux/iopoll.h> 13 14 #include <linux/kernel.h> 14 15 #include <linux/module.h> 16 + #include <linux/nvmem-consumer.h> 15 17 #include <linux/of.h> 16 18 #include <linux/platform_device.h> 17 19 #include <linux/pm_runtime.h> 20 + #include <linux/sys_soc.h> 18 21 #include <ufs/ufshcd.h> 19 22 20 23 #include "ufshcd-pltfrm.h" 21 24 25 + #define EFUSE_CALIB_SIZE 8 26 + 22 27 struct ufs_renesas_priv { 28 + const struct firmware *fw; 29 + void (*pre_init)(struct ufs_hba *hba); 23 30 bool initialized; /* The hardware needs initialization once */ 31 + u8 calib[EFUSE_CALIB_SIZE]; 24 32 }; 25 33 26 - enum { 27 - SET_PHY_INDEX_LO = 0, 28 - SET_PHY_INDEX_HI, 29 - TIMER_INDEX, 30 - MAX_INDEX 31 - }; 32 - 33 - enum ufs_renesas_init_param_mode { 34 - MODE_RESTORE, 35 - MODE_SET, 36 - MODE_SAVE, 37 - MODE_POLL, 38 - MODE_WAIT, 39 - MODE_WRITE, 40 - }; 41 - 42 - #define PARAM_RESTORE(_reg, _index) \ 43 - { .mode = MODE_RESTORE, .reg = _reg, .index = _index } 44 - #define PARAM_SET(_index, _set) \ 45 - { .mode = MODE_SET, .index = _index, .u.set = _set } 46 - #define PARAM_SAVE(_reg, _mask, _index) \ 47 - { .mode = MODE_SAVE, .reg = _reg, .mask = (u32)(_mask), \ 48 - .index = _index } 49 - #define PARAM_POLL(_reg, _expected, _mask) \ 50 - { .mode = MODE_POLL, .reg = _reg, .u.expected = _expected, \ 51 - .mask = (u32)(_mask) } 52 - #define PARAM_WAIT(_delay_us) \ 53 - { .mode = MODE_WAIT, .u.delay_us = _delay_us } 54 - 55 - #define PARAM_WRITE(_reg, _val) \ 56 - { .mode = MODE_WRITE, .reg = _reg, .u.val = _val } 57 - 58 - #define PARAM_WRITE_D0_D4(_d0, _d4) \ 59 - PARAM_WRITE(0xd0, _d0), PARAM_WRITE(0xd4, _d4) 60 - 61 - #define PARAM_WRITE_800_80C_POLL(_addr, _data_800) \ 62 - PARAM_WRITE_D0_D4(0x0000080c, 0x00000100), \ 63 - PARAM_WRITE_D0_D4(0x00000800, ((_data_800) << 16) | BIT(8) | (_addr)), \ 64 - PARAM_WRITE(0xd0, 0x0000080c), \ 65 - PARAM_POLL(0xd4, BIT(8), BIT(8)) 66 - 67 - #define PARAM_RESTORE_800_80C_POLL(_index) \ 68 - PARAM_WRITE_D0_D4(0x0000080c, 0x00000100), \ 69 - PARAM_WRITE(0xd0, 0x00000800), \ 70 - PARAM_RESTORE(0xd4, _index), \ 71 - PARAM_WRITE(0xd0, 0x0000080c), \ 72 - PARAM_POLL(0xd4, BIT(8), BIT(8)) 73 - 74 - #define PARAM_WRITE_804_80C_POLL(_addr, _data_804) \ 75 - PARAM_WRITE_D0_D4(0x0000080c, 0x00000100), \ 76 - PARAM_WRITE_D0_D4(0x00000804, ((_data_804) << 16) | BIT(8) | (_addr)), \ 77 - PARAM_WRITE(0xd0, 0x0000080c), \ 78 - PARAM_POLL(0xd4, BIT(8), BIT(8)) 79 - 80 - #define PARAM_WRITE_828_82C_POLL(_data_828) \ 81 - PARAM_WRITE_D0_D4(0x0000082c, 0x0f000000), \ 82 - PARAM_WRITE_D0_D4(0x00000828, _data_828), \ 83 - PARAM_WRITE(0xd0, 0x0000082c), \ 84 - PARAM_POLL(0xd4, _data_828, _data_828) 85 - 86 - #define PARAM_WRITE_PHY(_addr16, _data16) \ 87 - PARAM_WRITE(0xf0, 1), \ 88 - PARAM_WRITE_800_80C_POLL(0x16, (_addr16) & 0xff), \ 89 - PARAM_WRITE_800_80C_POLL(0x17, ((_addr16) >> 8) & 0xff), \ 90 - PARAM_WRITE_800_80C_POLL(0x18, (_data16) & 0xff), \ 91 - PARAM_WRITE_800_80C_POLL(0x19, ((_data16) >> 8) & 0xff), \ 92 - PARAM_WRITE_800_80C_POLL(0x1c, 0x01), \ 93 - PARAM_WRITE_828_82C_POLL(0x0f000000), \ 94 - PARAM_WRITE(0xf0, 0) 95 - 96 - #define PARAM_SET_PHY(_addr16, _data16) \ 97 - PARAM_WRITE(0xf0, 1), \ 98 - PARAM_WRITE_800_80C_POLL(0x16, (_addr16) & 0xff), \ 99 - PARAM_WRITE_800_80C_POLL(0x17, ((_addr16) >> 8) & 0xff), \ 100 - PARAM_WRITE_800_80C_POLL(0x1c, 0x01), \ 101 - PARAM_WRITE_828_82C_POLL(0x0f000000), \ 102 - PARAM_WRITE_804_80C_POLL(0x1a, 0), \ 103 - PARAM_WRITE(0xd0, 0x00000808), \ 104 - PARAM_SAVE(0xd4, 0xff, SET_PHY_INDEX_LO), \ 105 - PARAM_WRITE_804_80C_POLL(0x1b, 0), \ 106 - PARAM_WRITE(0xd0, 0x00000808), \ 107 - PARAM_SAVE(0xd4, 0xff, SET_PHY_INDEX_HI), \ 108 - PARAM_WRITE_828_82C_POLL(0x0f000000), \ 109 - PARAM_WRITE(0xf0, 0), \ 110 - PARAM_WRITE(0xf0, 1), \ 111 - PARAM_WRITE_800_80C_POLL(0x16, (_addr16) & 0xff), \ 112 - PARAM_WRITE_800_80C_POLL(0x17, ((_addr16) >> 8) & 0xff), \ 113 - PARAM_SET(SET_PHY_INDEX_LO, ((_data16 & 0xff) << 16) | BIT(8) | 0x18), \ 114 - PARAM_RESTORE_800_80C_POLL(SET_PHY_INDEX_LO), \ 115 - PARAM_SET(SET_PHY_INDEX_HI, (((_data16 >> 8) & 0xff) << 16) | BIT(8) | 0x19), \ 116 - PARAM_RESTORE_800_80C_POLL(SET_PHY_INDEX_HI), \ 117 - PARAM_WRITE_800_80C_POLL(0x1c, 0x01), \ 118 - PARAM_WRITE_828_82C_POLL(0x0f000000), \ 119 - PARAM_WRITE(0xf0, 0) 120 - 121 - #define PARAM_INDIRECT_WRITE(_gpio, _addr, _data_800) \ 122 - PARAM_WRITE(0xf0, _gpio), \ 123 - PARAM_WRITE_800_80C_POLL(_addr, _data_800), \ 124 - PARAM_WRITE_828_82C_POLL(0x0f000000), \ 125 - PARAM_WRITE(0xf0, 0) 126 - 127 - #define PARAM_INDIRECT_POLL(_gpio, _addr, _expected, _mask) \ 128 - PARAM_WRITE(0xf0, _gpio), \ 129 - PARAM_WRITE_800_80C_POLL(_addr, 0), \ 130 - PARAM_WRITE(0xd0, 0x00000808), \ 131 - PARAM_POLL(0xd4, _expected, _mask), \ 132 - PARAM_WRITE(0xf0, 0) 133 - 134 - struct ufs_renesas_init_param { 135 - enum ufs_renesas_init_param_mode mode; 136 - u32 reg; 137 - union { 138 - u32 expected; 139 - u32 delay_us; 140 - u32 set; 141 - u32 val; 142 - } u; 143 - u32 mask; 144 - u32 index; 145 - }; 146 - 147 - /* This setting is for SERIES B */ 148 - static const struct ufs_renesas_init_param ufs_param[] = { 149 - PARAM_WRITE(0xc0, 0x49425308), 150 - PARAM_WRITE_D0_D4(0x00000104, 0x00000002), 151 - PARAM_WAIT(1), 152 - PARAM_WRITE_D0_D4(0x00000828, 0x00000200), 153 - PARAM_WAIT(1), 154 - PARAM_WRITE_D0_D4(0x00000828, 0x00000000), 155 - PARAM_WRITE_D0_D4(0x00000104, 0x00000001), 156 - PARAM_WRITE_D0_D4(0x00000940, 0x00000001), 157 - PARAM_WAIT(1), 158 - PARAM_WRITE_D0_D4(0x00000940, 0x00000000), 159 - 160 - PARAM_WRITE(0xc0, 0x49425308), 161 - PARAM_WRITE(0xc0, 0x41584901), 162 - 163 - PARAM_WRITE_D0_D4(0x0000080c, 0x00000100), 164 - PARAM_WRITE_D0_D4(0x00000804, 0x00000000), 165 - PARAM_WRITE(0xd0, 0x0000080c), 166 - PARAM_POLL(0xd4, BIT(8), BIT(8)), 167 - 168 - PARAM_WRITE(REG_CONTROLLER_ENABLE, 0x00000001), 169 - 170 - PARAM_WRITE(0xd0, 0x00000804), 171 - PARAM_POLL(0xd4, BIT(8) | BIT(6) | BIT(0), BIT(8) | BIT(6) | BIT(0)), 172 - 173 - PARAM_WRITE(0xd0, 0x00000d00), 174 - PARAM_SAVE(0xd4, 0x0000ffff, TIMER_INDEX), 175 - PARAM_WRITE(0xd4, 0x00000000), 176 - PARAM_WRITE_D0_D4(0x0000082c, 0x0f000000), 177 - PARAM_WRITE_D0_D4(0x00000828, 0x08000000), 178 - PARAM_WRITE(0xd0, 0x0000082c), 179 - PARAM_POLL(0xd4, BIT(27), BIT(27)), 180 - PARAM_WRITE(0xd0, 0x00000d2c), 181 - PARAM_POLL(0xd4, BIT(0), BIT(0)), 182 - 183 - /* phy setup */ 184 - PARAM_INDIRECT_WRITE(1, 0x01, 0x001f), 185 - PARAM_INDIRECT_WRITE(7, 0x5d, 0x0014), 186 - PARAM_INDIRECT_WRITE(7, 0x5e, 0x0014), 187 - PARAM_INDIRECT_WRITE(7, 0x0d, 0x0003), 188 - PARAM_INDIRECT_WRITE(7, 0x0e, 0x0007), 189 - PARAM_INDIRECT_WRITE(7, 0x5f, 0x0003), 190 - PARAM_INDIRECT_WRITE(7, 0x60, 0x0003), 191 - PARAM_INDIRECT_WRITE(7, 0x5b, 0x00a6), 192 - PARAM_INDIRECT_WRITE(7, 0x5c, 0x0003), 193 - 194 - PARAM_INDIRECT_POLL(7, 0x3c, 0, BIT(7)), 195 - PARAM_INDIRECT_POLL(7, 0x4c, 0, BIT(4)), 196 - 197 - PARAM_INDIRECT_WRITE(1, 0x32, 0x0080), 198 - PARAM_INDIRECT_WRITE(1, 0x1f, 0x0001), 199 - PARAM_INDIRECT_WRITE(0, 0x2c, 0x0001), 200 - PARAM_INDIRECT_WRITE(0, 0x32, 0x0087), 201 - 202 - PARAM_INDIRECT_WRITE(1, 0x4d, 0x0061), 203 - PARAM_INDIRECT_WRITE(4, 0x9b, 0x0009), 204 - PARAM_INDIRECT_WRITE(4, 0xa6, 0x0005), 205 - PARAM_INDIRECT_WRITE(4, 0xa5, 0x0058), 206 - PARAM_INDIRECT_WRITE(1, 0x39, 0x0027), 207 - PARAM_INDIRECT_WRITE(1, 0x47, 0x004c), 208 - 209 - PARAM_INDIRECT_WRITE(7, 0x0d, 0x0002), 210 - PARAM_INDIRECT_WRITE(7, 0x0e, 0x0007), 211 - 212 - PARAM_WRITE_PHY(0x0028, 0x0061), 213 - PARAM_WRITE_PHY(0x4014, 0x0061), 214 - PARAM_SET_PHY(0x401c, BIT(2)), 215 - PARAM_WRITE_PHY(0x4000, 0x0000), 216 - PARAM_WRITE_PHY(0x4001, 0x0000), 217 - 218 - PARAM_WRITE_PHY(0x10ae, 0x0001), 219 - PARAM_WRITE_PHY(0x10ad, 0x0000), 220 - PARAM_WRITE_PHY(0x10af, 0x0001), 221 - PARAM_WRITE_PHY(0x10b6, 0x0001), 222 - PARAM_WRITE_PHY(0x10ae, 0x0000), 223 - 224 - PARAM_WRITE_PHY(0x10ae, 0x0001), 225 - PARAM_WRITE_PHY(0x10ad, 0x0000), 226 - PARAM_WRITE_PHY(0x10af, 0x0002), 227 - PARAM_WRITE_PHY(0x10b6, 0x0001), 228 - PARAM_WRITE_PHY(0x10ae, 0x0000), 229 - 230 - PARAM_WRITE_PHY(0x10ae, 0x0001), 231 - PARAM_WRITE_PHY(0x10ad, 0x0080), 232 - PARAM_WRITE_PHY(0x10af, 0x0000), 233 - PARAM_WRITE_PHY(0x10b6, 0x0001), 234 - PARAM_WRITE_PHY(0x10ae, 0x0000), 235 - 236 - PARAM_WRITE_PHY(0x10ae, 0x0001), 237 - PARAM_WRITE_PHY(0x10ad, 0x0080), 238 - PARAM_WRITE_PHY(0x10af, 0x001a), 239 - PARAM_WRITE_PHY(0x10b6, 0x0001), 240 - PARAM_WRITE_PHY(0x10ae, 0x0000), 241 - 242 - PARAM_INDIRECT_WRITE(7, 0x70, 0x0016), 243 - PARAM_INDIRECT_WRITE(7, 0x71, 0x0016), 244 - PARAM_INDIRECT_WRITE(7, 0x72, 0x0014), 245 - PARAM_INDIRECT_WRITE(7, 0x73, 0x0014), 246 - PARAM_INDIRECT_WRITE(7, 0x74, 0x0000), 247 - PARAM_INDIRECT_WRITE(7, 0x75, 0x0000), 248 - PARAM_INDIRECT_WRITE(7, 0x76, 0x0010), 249 - PARAM_INDIRECT_WRITE(7, 0x77, 0x0010), 250 - PARAM_INDIRECT_WRITE(7, 0x78, 0x00ff), 251 - PARAM_INDIRECT_WRITE(7, 0x79, 0x0000), 252 - 253 - PARAM_INDIRECT_WRITE(7, 0x19, 0x0007), 254 - 255 - PARAM_INDIRECT_WRITE(7, 0x1a, 0x0007), 256 - 257 - PARAM_INDIRECT_WRITE(7, 0x24, 0x000c), 258 - 259 - PARAM_INDIRECT_WRITE(7, 0x25, 0x000c), 260 - 261 - PARAM_INDIRECT_WRITE(7, 0x62, 0x0000), 262 - PARAM_INDIRECT_WRITE(7, 0x63, 0x0000), 263 - PARAM_INDIRECT_WRITE(7, 0x5d, 0x0014), 264 - PARAM_INDIRECT_WRITE(7, 0x5e, 0x0017), 265 - PARAM_INDIRECT_WRITE(7, 0x5d, 0x0004), 266 - PARAM_INDIRECT_WRITE(7, 0x5e, 0x0017), 267 - PARAM_INDIRECT_POLL(7, 0x55, 0, BIT(6)), 268 - PARAM_INDIRECT_POLL(7, 0x41, 0, BIT(7)), 269 - /* end of phy setup */ 270 - 271 - PARAM_WRITE(0xf0, 0), 272 - PARAM_WRITE(0xd0, 0x00000d00), 273 - PARAM_RESTORE(0xd4, TIMER_INDEX), 274 - }; 34 + #define UFS_RENESAS_FIRMWARE_NAME "r8a779f0_ufs.bin" 35 + MODULE_FIRMWARE(UFS_RENESAS_FIRMWARE_NAME); 275 36 276 37 static void ufs_renesas_dbg_register_dump(struct ufs_hba *hba) 277 38 { 278 39 ufshcd_dump_regs(hba, 0xc0, 0x40, "regs: 0xc0 + "); 279 40 } 280 41 281 - static void ufs_renesas_reg_control(struct ufs_hba *hba, 282 - const struct ufs_renesas_init_param *p) 42 + static void ufs_renesas_poll(struct ufs_hba *hba, u32 reg, u32 expected, u32 mask) 283 43 { 284 - static u32 save[MAX_INDEX]; 285 44 int ret; 286 45 u32 val; 287 46 288 - WARN_ON(p->index >= MAX_INDEX); 289 - 290 - switch (p->mode) { 291 - case MODE_RESTORE: 292 - ufshcd_writel(hba, save[p->index], p->reg); 293 - break; 294 - case MODE_SET: 295 - save[p->index] |= p->u.set; 296 - break; 297 - case MODE_SAVE: 298 - save[p->index] = ufshcd_readl(hba, p->reg) & p->mask; 299 - break; 300 - case MODE_POLL: 301 - ret = readl_poll_timeout_atomic(hba->mmio_base + p->reg, 302 - val, 303 - (val & p->mask) == p->u.expected, 304 - 10, 1000); 305 - if (ret) 306 - dev_err(hba->dev, "%s: poll failed %d (%08x, %08x, %08x)\n", 307 - __func__, ret, val, p->mask, p->u.expected); 308 - break; 309 - case MODE_WAIT: 310 - if (p->u.delay_us > 1000) 311 - mdelay(DIV_ROUND_UP(p->u.delay_us, 1000)); 312 - else 313 - udelay(p->u.delay_us); 314 - break; 315 - case MODE_WRITE: 316 - ufshcd_writel(hba, p->u.val, p->reg); 317 - break; 318 - default: 319 - break; 320 - } 47 + ret = readl_poll_timeout_atomic(hba->mmio_base + reg, 48 + val, (val & mask) == expected, 49 + 10, 1000); 50 + if (ret) 51 + dev_err(hba->dev, "%s: poll failed %d (%08x, %08x, %08x)\n", 52 + __func__, ret, val, mask, expected); 321 53 } 322 54 323 - static void ufs_renesas_pre_init(struct ufs_hba *hba) 55 + static u32 ufs_renesas_read(struct ufs_hba *hba, u32 reg) 324 56 { 325 - const struct ufs_renesas_init_param *p = ufs_param; 326 - unsigned int i; 57 + return ufshcd_readl(hba, reg); 58 + } 327 59 328 - for (i = 0; i < ARRAY_SIZE(ufs_param); i++) 329 - ufs_renesas_reg_control(hba, &p[i]); 60 + static void ufs_renesas_write(struct ufs_hba *hba, u32 reg, u32 value) 61 + { 62 + ufshcd_writel(hba, value, reg); 63 + } 64 + 65 + static void ufs_renesas_write_d0_d4(struct ufs_hba *hba, u32 data_d0, u32 data_d4) 66 + { 67 + ufs_renesas_write(hba, 0xd0, data_d0); 68 + ufs_renesas_write(hba, 0xd4, data_d4); 69 + } 70 + 71 + static void ufs_renesas_write_800_80c_poll(struct ufs_hba *hba, u32 addr, 72 + u32 data_800) 73 + { 74 + ufs_renesas_write_d0_d4(hba, 0x0000080c, 0x00000100); 75 + ufs_renesas_write_d0_d4(hba, 0x00000800, (data_800 << 16) | BIT(8) | addr); 76 + ufs_renesas_write(hba, 0xd0, 0x0000080c); 77 + ufs_renesas_poll(hba, 0xd4, BIT(8), BIT(8)); 78 + } 79 + 80 + static void ufs_renesas_write_804_80c_poll(struct ufs_hba *hba, u32 addr, u32 data_804) 81 + { 82 + ufs_renesas_write_d0_d4(hba, 0x0000080c, 0x00000100); 83 + ufs_renesas_write_d0_d4(hba, 0x00000804, (data_804 << 16) | BIT(8) | addr); 84 + ufs_renesas_write(hba, 0xd0, 0x0000080c); 85 + ufs_renesas_poll(hba, 0xd4, BIT(8), BIT(8)); 86 + } 87 + 88 + static void ufs_renesas_write_828_82c_poll(struct ufs_hba *hba, u32 data_828) 89 + { 90 + ufs_renesas_write_d0_d4(hba, 0x0000082c, 0x0f000000); 91 + ufs_renesas_write_d0_d4(hba, 0x00000828, data_828); 92 + ufs_renesas_write(hba, 0xd0, 0x0000082c); 93 + ufs_renesas_poll(hba, 0xd4, data_828, data_828); 94 + } 95 + 96 + static void ufs_renesas_write_phy(struct ufs_hba *hba, u32 addr16, u32 data16) 97 + { 98 + ufs_renesas_write(hba, 0xf0, 1); 99 + ufs_renesas_write_800_80c_poll(hba, 0x16, addr16 & 0xff); 100 + ufs_renesas_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff); 101 + ufs_renesas_write_800_80c_poll(hba, 0x18, data16 & 0xff); 102 + ufs_renesas_write_800_80c_poll(hba, 0x19, (data16 >> 8) & 0xff); 103 + ufs_renesas_write_800_80c_poll(hba, 0x1c, 0x01); 104 + ufs_renesas_write_828_82c_poll(hba, 0x0f000000); 105 + ufs_renesas_write(hba, 0xf0, 0); 106 + } 107 + 108 + static void ufs_renesas_set_phy(struct ufs_hba *hba, u32 addr16, u32 data16) 109 + { 110 + u32 low, high; 111 + 112 + ufs_renesas_write(hba, 0xf0, 1); 113 + ufs_renesas_write_800_80c_poll(hba, 0x16, addr16 & 0xff); 114 + ufs_renesas_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff); 115 + ufs_renesas_write_800_80c_poll(hba, 0x1c, 0x01); 116 + ufs_renesas_write_828_82c_poll(hba, 0x0f000000); 117 + ufs_renesas_write_804_80c_poll(hba, 0x1a, 0); 118 + ufs_renesas_write(hba, 0xd0, 0x00000808); 119 + low = ufs_renesas_read(hba, 0xd4) & 0xff; 120 + ufs_renesas_write_804_80c_poll(hba, 0x1b, 0); 121 + ufs_renesas_write(hba, 0xd0, 0x00000808); 122 + high = ufs_renesas_read(hba, 0xd4) & 0xff; 123 + ufs_renesas_write_828_82c_poll(hba, 0x0f000000); 124 + ufs_renesas_write(hba, 0xf0, 0); 125 + 126 + data16 |= (high << 8) | low; 127 + ufs_renesas_write_phy(hba, addr16, data16); 128 + } 129 + 130 + static void ufs_renesas_reset_indirect_write(struct ufs_hba *hba, int gpio, 131 + u32 addr, u32 data) 132 + { 133 + ufs_renesas_write(hba, 0xf0, gpio); 134 + ufs_renesas_write_800_80c_poll(hba, addr, data); 135 + } 136 + 137 + static void ufs_renesas_reset_indirect_update(struct ufs_hba *hba) 138 + { 139 + ufs_renesas_write_d0_d4(hba, 0x0000082c, 0x0f000000); 140 + ufs_renesas_write_d0_d4(hba, 0x00000828, 0x0f000000); 141 + ufs_renesas_write(hba, 0xd0, 0x0000082c); 142 + ufs_renesas_poll(hba, 0xd4, BIT(27) | BIT(26) | BIT(24), BIT(27) | BIT(26) | BIT(24)); 143 + ufs_renesas_write(hba, 0xf0, 0); 144 + } 145 + 146 + static void ufs_renesas_indirect_write(struct ufs_hba *hba, u32 gpio, u32 addr, 147 + u32 data_800) 148 + { 149 + ufs_renesas_write(hba, 0xf0, gpio); 150 + ufs_renesas_write_800_80c_poll(hba, addr, data_800); 151 + ufs_renesas_write_828_82c_poll(hba, 0x0f000000); 152 + ufs_renesas_write(hba, 0xf0, 0); 153 + } 154 + 155 + static void ufs_renesas_indirect_poll(struct ufs_hba *hba, u32 gpio, u32 addr, 156 + u32 expected, u32 mask) 157 + { 158 + ufs_renesas_write(hba, 0xf0, gpio); 159 + ufs_renesas_write_800_80c_poll(hba, addr, 0); 160 + ufs_renesas_write(hba, 0xd0, 0x00000808); 161 + ufs_renesas_poll(hba, 0xd4, expected, mask); 162 + ufs_renesas_write(hba, 0xf0, 0); 163 + } 164 + 165 + static void ufs_renesas_init_step1_to_3(struct ufs_hba *hba, bool init108) 166 + { 167 + ufs_renesas_write(hba, 0xc0, 0x49425308); 168 + ufs_renesas_write_d0_d4(hba, 0x00000104, 0x00000002); 169 + if (init108) 170 + ufs_renesas_write_d0_d4(hba, 0x00000108, 0x00000002); 171 + udelay(1); 172 + ufs_renesas_write_d0_d4(hba, 0x00000828, 0x00000200); 173 + udelay(1); 174 + ufs_renesas_write_d0_d4(hba, 0x00000828, 0x00000000); 175 + ufs_renesas_write_d0_d4(hba, 0x00000104, 0x00000001); 176 + if (init108) 177 + ufs_renesas_write_d0_d4(hba, 0x00000108, 0x00000001); 178 + ufs_renesas_write_d0_d4(hba, 0x00000940, 0x00000001); 179 + udelay(1); 180 + ufs_renesas_write_d0_d4(hba, 0x00000940, 0x00000000); 181 + 182 + ufs_renesas_write(hba, 0xc0, 0x49425308); 183 + ufs_renesas_write(hba, 0xc0, 0x41584901); 184 + } 185 + 186 + static void ufs_renesas_init_step4_to_6(struct ufs_hba *hba) 187 + { 188 + ufs_renesas_write_d0_d4(hba, 0x0000080c, 0x00000100); 189 + ufs_renesas_write_d0_d4(hba, 0x00000804, 0x00000000); 190 + ufs_renesas_write(hba, 0xd0, 0x0000080c); 191 + ufs_renesas_poll(hba, 0xd4, BIT(8), BIT(8)); 192 + 193 + ufs_renesas_write(hba, REG_CONTROLLER_ENABLE, 0x00000001); 194 + 195 + ufs_renesas_write(hba, 0xd0, 0x00000804); 196 + ufs_renesas_poll(hba, 0xd4, BIT(8) | BIT(6) | BIT(0), BIT(8) | BIT(6) | BIT(0)); 197 + } 198 + 199 + static u32 ufs_renesas_init_disable_timer(struct ufs_hba *hba) 200 + { 201 + u32 timer_val; 202 + 203 + ufs_renesas_write(hba, 0xd0, 0x00000d00); 204 + timer_val = ufs_renesas_read(hba, 0xd4) & 0x0000ffff; 205 + ufs_renesas_write(hba, 0xd4, 0x00000000); 206 + ufs_renesas_write_d0_d4(hba, 0x0000082c, 0x0f000000); 207 + ufs_renesas_write_d0_d4(hba, 0x00000828, 0x08000000); 208 + ufs_renesas_write(hba, 0xd0, 0x0000082c); 209 + ufs_renesas_poll(hba, 0xd4, BIT(27), BIT(27)); 210 + ufs_renesas_write(hba, 0xd0, 0x00000d2c); 211 + ufs_renesas_poll(hba, 0xd4, BIT(0), BIT(0)); 212 + 213 + return timer_val; 214 + } 215 + 216 + static void ufs_renesas_init_enable_timer(struct ufs_hba *hba, u32 timer_val) 217 + { 218 + ufs_renesas_write(hba, 0xf0, 0); 219 + ufs_renesas_write(hba, 0xd0, 0x00000d00); 220 + ufs_renesas_write(hba, 0xd4, timer_val); 221 + } 222 + 223 + static void ufs_renesas_write_phy_10ad_10af(struct ufs_hba *hba, 224 + u32 data_10ad, u32 data_10af) 225 + { 226 + ufs_renesas_write_phy(hba, 0x10ae, 0x0001); 227 + ufs_renesas_write_phy(hba, 0x10ad, data_10ad); 228 + ufs_renesas_write_phy(hba, 0x10af, data_10af); 229 + ufs_renesas_write_phy(hba, 0x10b6, 0x0001); 230 + ufs_renesas_write_phy(hba, 0x10ae, 0x0000); 231 + } 232 + 233 + static void ufs_renesas_init_compensation_and_slicers(struct ufs_hba *hba) 234 + { 235 + ufs_renesas_write_phy_10ad_10af(hba, 0x0000, 0x0001); 236 + ufs_renesas_write_phy_10ad_10af(hba, 0x0000, 0x0002); 237 + ufs_renesas_write_phy_10ad_10af(hba, 0x0080, 0x0000); 238 + ufs_renesas_write_phy_10ad_10af(hba, 0x0080, 0x001a); 239 + } 240 + 241 + static void ufs_renesas_r8a779f0_es10_pre_init(struct ufs_hba *hba) 242 + { 243 + u32 timer_val; 244 + 245 + /* This setting is for SERIES B */ 246 + ufs_renesas_init_step1_to_3(hba, false); 247 + 248 + ufs_renesas_init_step4_to_6(hba); 249 + 250 + timer_val = ufs_renesas_init_disable_timer(hba); 251 + 252 + /* phy setup */ 253 + ufs_renesas_indirect_write(hba, 1, 0x01, 0x001f); 254 + ufs_renesas_indirect_write(hba, 7, 0x5d, 0x0014); 255 + ufs_renesas_indirect_write(hba, 7, 0x5e, 0x0014); 256 + ufs_renesas_indirect_write(hba, 7, 0x0d, 0x0003); 257 + ufs_renesas_indirect_write(hba, 7, 0x0e, 0x0007); 258 + ufs_renesas_indirect_write(hba, 7, 0x5f, 0x0003); 259 + ufs_renesas_indirect_write(hba, 7, 0x60, 0x0003); 260 + ufs_renesas_indirect_write(hba, 7, 0x5b, 0x00a6); 261 + ufs_renesas_indirect_write(hba, 7, 0x5c, 0x0003); 262 + 263 + ufs_renesas_indirect_poll(hba, 7, 0x3c, 0, BIT(7)); 264 + ufs_renesas_indirect_poll(hba, 7, 0x4c, 0, BIT(4)); 265 + 266 + ufs_renesas_indirect_write(hba, 1, 0x32, 0x0080); 267 + ufs_renesas_indirect_write(hba, 1, 0x1f, 0x0001); 268 + ufs_renesas_indirect_write(hba, 0, 0x2c, 0x0001); 269 + ufs_renesas_indirect_write(hba, 0, 0x32, 0x0087); 270 + 271 + ufs_renesas_indirect_write(hba, 1, 0x4d, 0x0061); 272 + ufs_renesas_indirect_write(hba, 4, 0x9b, 0x0009); 273 + ufs_renesas_indirect_write(hba, 4, 0xa6, 0x0005); 274 + ufs_renesas_indirect_write(hba, 4, 0xa5, 0x0058); 275 + ufs_renesas_indirect_write(hba, 1, 0x39, 0x0027); 276 + ufs_renesas_indirect_write(hba, 1, 0x47, 0x004c); 277 + 278 + ufs_renesas_indirect_write(hba, 7, 0x0d, 0x0002); 279 + ufs_renesas_indirect_write(hba, 7, 0x0e, 0x0007); 280 + 281 + ufs_renesas_write_phy(hba, 0x0028, 0x0061); 282 + ufs_renesas_write_phy(hba, 0x4014, 0x0061); 283 + ufs_renesas_set_phy(hba, 0x401c, BIT(2)); 284 + ufs_renesas_write_phy(hba, 0x4000, 0x0000); 285 + ufs_renesas_write_phy(hba, 0x4001, 0x0000); 286 + 287 + ufs_renesas_init_compensation_and_slicers(hba); 288 + 289 + ufs_renesas_indirect_write(hba, 7, 0x70, 0x0016); 290 + ufs_renesas_indirect_write(hba, 7, 0x71, 0x0016); 291 + ufs_renesas_indirect_write(hba, 7, 0x72, 0x0014); 292 + ufs_renesas_indirect_write(hba, 7, 0x73, 0x0014); 293 + ufs_renesas_indirect_write(hba, 7, 0x74, 0x0000); 294 + ufs_renesas_indirect_write(hba, 7, 0x75, 0x0000); 295 + ufs_renesas_indirect_write(hba, 7, 0x76, 0x0010); 296 + ufs_renesas_indirect_write(hba, 7, 0x77, 0x0010); 297 + ufs_renesas_indirect_write(hba, 7, 0x78, 0x00ff); 298 + ufs_renesas_indirect_write(hba, 7, 0x79, 0x0000); 299 + 300 + ufs_renesas_indirect_write(hba, 7, 0x19, 0x0007); 301 + ufs_renesas_indirect_write(hba, 7, 0x1a, 0x0007); 302 + ufs_renesas_indirect_write(hba, 7, 0x24, 0x000c); 303 + ufs_renesas_indirect_write(hba, 7, 0x25, 0x000c); 304 + ufs_renesas_indirect_write(hba, 7, 0x62, 0x0000); 305 + ufs_renesas_indirect_write(hba, 7, 0x63, 0x0000); 306 + ufs_renesas_indirect_write(hba, 7, 0x5d, 0x0014); 307 + ufs_renesas_indirect_write(hba, 7, 0x5e, 0x0017); 308 + ufs_renesas_indirect_write(hba, 7, 0x5d, 0x0004); 309 + ufs_renesas_indirect_write(hba, 7, 0x5e, 0x0017); 310 + ufs_renesas_indirect_poll(hba, 7, 0x55, 0, BIT(6)); 311 + ufs_renesas_indirect_poll(hba, 7, 0x41, 0, BIT(7)); 312 + /* end of phy setup */ 313 + 314 + ufs_renesas_init_enable_timer(hba, timer_val); 315 + } 316 + 317 + static void ufs_renesas_r8a779f0_init_step3_add(struct ufs_hba *hba, bool assert) 318 + { 319 + u32 val_2x = 0, val_3x = 0, val_4x = 0; 320 + 321 + if (assert) { 322 + val_2x = 0x0001; 323 + val_3x = 0x0003; 324 + val_4x = 0x0001; 325 + } 326 + 327 + ufs_renesas_reset_indirect_write(hba, 7, 0x20, val_2x); 328 + ufs_renesas_reset_indirect_write(hba, 7, 0x4a, val_4x); 329 + ufs_renesas_reset_indirect_write(hba, 7, 0x35, val_3x); 330 + ufs_renesas_reset_indirect_update(hba); 331 + ufs_renesas_reset_indirect_write(hba, 7, 0x21, val_2x); 332 + ufs_renesas_reset_indirect_write(hba, 7, 0x4b, val_4x); 333 + ufs_renesas_reset_indirect_write(hba, 7, 0x36, val_3x); 334 + ufs_renesas_reset_indirect_update(hba); 335 + } 336 + 337 + static void ufs_renesas_r8a779f0_pre_init(struct ufs_hba *hba) 338 + { 339 + struct ufs_renesas_priv *priv = ufshcd_get_variant(hba); 340 + u32 timer_val; 341 + u32 data; 342 + int i; 343 + 344 + /* This setting is for SERIES B */ 345 + ufs_renesas_init_step1_to_3(hba, true); 346 + 347 + ufs_renesas_r8a779f0_init_step3_add(hba, true); 348 + ufs_renesas_reset_indirect_write(hba, 7, 0x5f, 0x0063); 349 + ufs_renesas_reset_indirect_update(hba); 350 + ufs_renesas_reset_indirect_write(hba, 7, 0x60, 0x0003); 351 + ufs_renesas_reset_indirect_update(hba); 352 + ufs_renesas_reset_indirect_write(hba, 7, 0x5b, 0x00a6); 353 + ufs_renesas_reset_indirect_update(hba); 354 + ufs_renesas_reset_indirect_write(hba, 7, 0x5c, 0x0003); 355 + ufs_renesas_reset_indirect_update(hba); 356 + ufs_renesas_r8a779f0_init_step3_add(hba, false); 357 + 358 + ufs_renesas_init_step4_to_6(hba); 359 + 360 + timer_val = ufs_renesas_init_disable_timer(hba); 361 + 362 + ufs_renesas_indirect_write(hba, 1, 0x01, 0x001f); 363 + ufs_renesas_indirect_write(hba, 7, 0x5d, 0x0014); 364 + ufs_renesas_indirect_write(hba, 7, 0x5e, 0x0014); 365 + ufs_renesas_indirect_write(hba, 7, 0x0d, 0x0007); 366 + ufs_renesas_indirect_write(hba, 7, 0x0e, 0x0007); 367 + 368 + ufs_renesas_indirect_poll(hba, 7, 0x3c, 0, BIT(7)); 369 + ufs_renesas_indirect_poll(hba, 7, 0x4c, 0, BIT(4)); 370 + 371 + ufs_renesas_indirect_write(hba, 1, 0x32, 0x0080); 372 + ufs_renesas_indirect_write(hba, 1, 0x1f, 0x0001); 373 + ufs_renesas_indirect_write(hba, 1, 0x2c, 0x0001); 374 + ufs_renesas_indirect_write(hba, 1, 0x32, 0x0087); 375 + 376 + ufs_renesas_indirect_write(hba, 1, 0x4d, priv->calib[2]); 377 + ufs_renesas_indirect_write(hba, 1, 0x4e, priv->calib[3]); 378 + ufs_renesas_indirect_write(hba, 1, 0x0d, 0x0006); 379 + ufs_renesas_indirect_write(hba, 1, 0x0e, 0x0007); 380 + ufs_renesas_write_phy(hba, 0x0028, priv->calib[3]); 381 + ufs_renesas_write_phy(hba, 0x4014, priv->calib[3]); 382 + 383 + ufs_renesas_set_phy(hba, 0x401c, BIT(2)); 384 + 385 + ufs_renesas_write_phy(hba, 0x4000, priv->calib[6]); 386 + ufs_renesas_write_phy(hba, 0x4001, priv->calib[7]); 387 + 388 + ufs_renesas_indirect_write(hba, 1, 0x14, 0x0001); 389 + 390 + ufs_renesas_init_compensation_and_slicers(hba); 391 + 392 + ufs_renesas_indirect_write(hba, 7, 0x79, 0x0000); 393 + ufs_renesas_indirect_write(hba, 7, 0x24, 0x000c); 394 + ufs_renesas_indirect_write(hba, 7, 0x25, 0x000c); 395 + ufs_renesas_indirect_write(hba, 7, 0x62, 0x00c0); 396 + ufs_renesas_indirect_write(hba, 7, 0x63, 0x0001); 397 + 398 + for (i = 0; i < priv->fw->size / 2; i++) { 399 + data = (priv->fw->data[i * 2 + 1] << 8) | priv->fw->data[i * 2]; 400 + ufs_renesas_write_phy(hba, 0xc000 + i, data); 401 + } 402 + 403 + ufs_renesas_indirect_write(hba, 7, 0x0d, 0x0002); 404 + ufs_renesas_indirect_write(hba, 7, 0x0e, 0x0007); 405 + 406 + ufs_renesas_indirect_write(hba, 7, 0x5d, 0x0014); 407 + ufs_renesas_indirect_write(hba, 7, 0x5e, 0x0017); 408 + ufs_renesas_indirect_write(hba, 7, 0x5d, 0x0004); 409 + ufs_renesas_indirect_write(hba, 7, 0x5e, 0x0017); 410 + ufs_renesas_indirect_poll(hba, 7, 0x55, 0, BIT(6)); 411 + ufs_renesas_indirect_poll(hba, 7, 0x41, 0, BIT(7)); 412 + 413 + ufs_renesas_init_enable_timer(hba, timer_val); 330 414 } 331 415 332 416 static int ufs_renesas_hce_enable_notify(struct ufs_hba *hba, ··· 422 338 return 0; 423 339 424 340 if (status == PRE_CHANGE) 425 - ufs_renesas_pre_init(hba); 341 + priv->pre_init(hba); 426 342 427 343 priv->initialized = true; 428 344 ··· 440 356 return 0; 441 357 } 442 358 359 + static const struct soc_device_attribute ufs_fallback[] = { 360 + { .soc_id = "r8a779f0", .revision = "ES1.[01]" }, 361 + { /* Sentinel */ } 362 + }; 363 + 443 364 static int ufs_renesas_init(struct ufs_hba *hba) 444 365 { 366 + const struct soc_device_attribute *attr; 367 + struct nvmem_cell *cell = NULL; 368 + struct device *dev = hba->dev; 445 369 struct ufs_renesas_priv *priv; 370 + u8 *data = NULL; 371 + size_t len; 372 + int ret; 446 373 447 - priv = devm_kzalloc(hba->dev, sizeof(*priv), GFP_KERNEL); 374 + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 448 375 if (!priv) 449 376 return -ENOMEM; 450 377 ufshcd_set_variant(hba, priv); 451 378 452 379 hba->quirks |= UFSHCD_QUIRK_HIBERN_FASTAUTO; 453 380 381 + attr = soc_device_match(ufs_fallback); 382 + if (attr) 383 + goto fallback; 384 + 385 + ret = request_firmware(&priv->fw, UFS_RENESAS_FIRMWARE_NAME, dev); 386 + if (ret) { 387 + dev_warn(dev, "Failed to load firmware\n"); 388 + goto fallback; 389 + } 390 + 391 + cell = nvmem_cell_get(dev, "calibration"); 392 + if (IS_ERR(cell)) { 393 + dev_warn(dev, "No calibration data specified\n"); 394 + goto fallback; 395 + } 396 + 397 + data = nvmem_cell_read(cell, &len); 398 + if (IS_ERR(data)) { 399 + dev_warn(dev, "Failed to read calibration data: %pe\n", data); 400 + goto fallback; 401 + } 402 + 403 + if (len != EFUSE_CALIB_SIZE) { 404 + dev_warn(dev, "Invalid calibration data size %zu\n", len); 405 + goto fallback; 406 + } 407 + 408 + memcpy(priv->calib, data, EFUSE_CALIB_SIZE); 409 + priv->pre_init = ufs_renesas_r8a779f0_pre_init; 410 + goto out; 411 + 412 + fallback: 413 + dev_info(dev, "Using ES1.0 init code\n"); 414 + priv->pre_init = ufs_renesas_r8a779f0_es10_pre_init; 415 + 416 + out: 417 + kfree(data); 418 + if (!IS_ERR_OR_NULL(cell)) 419 + nvmem_cell_put(cell); 420 + 454 421 return 0; 422 + } 423 + 424 + static void ufs_renesas_exit(struct ufs_hba *hba) 425 + { 426 + struct ufs_renesas_priv *priv = ufshcd_get_variant(hba); 427 + 428 + release_firmware(priv->fw); 455 429 } 456 430 457 431 static int ufs_renesas_set_dma_mask(struct ufs_hba *hba) ··· 520 378 static const struct ufs_hba_variant_ops ufs_renesas_vops = { 521 379 .name = "renesas", 522 380 .init = ufs_renesas_init, 381 + .exit = ufs_renesas_exit, 523 382 .set_dma_mask = ufs_renesas_set_dma_mask, 524 383 .setup_clocks = ufs_renesas_setup_clocks, 525 384 .hce_enable_notify = ufs_renesas_hce_enable_notify,