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

Configure Feed

Select the types of activity you want to include in your feed.

at v6.16-rc5 1106 lines 28 kB view raw
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (c) 2024 AIROHA Inc 4 * Author: Lorenzo Bianconi <lorenzo@kernel.org> 5 * Author: Ray Liu <ray.liu@airoha.com> 6 */ 7 8#include <linux/bitfield.h> 9#include <linux/clk.h> 10#include <linux/delay.h> 11#include <linux/device.h> 12#include <linux/dma-mapping.h> 13#include <linux/errno.h> 14#include <linux/limits.h> 15#include <linux/math.h> 16#include <linux/minmax.h> 17#include <linux/module.h> 18#include <linux/mutex.h> 19#include <linux/platform_device.h> 20#include <linux/property.h> 21#include <linux/regmap.h> 22#include <linux/sizes.h> 23#include <linux/spi/spi.h> 24#include <linux/spi/spi-mem.h> 25#include <linux/types.h> 26#include <linux/unaligned.h> 27 28/* SPI */ 29#define REG_SPI_CTRL_BASE 0x1FA10000 30 31#define REG_SPI_CTRL_READ_MODE 0x0000 32#define REG_SPI_CTRL_READ_IDLE_EN 0x0004 33#define REG_SPI_CTRL_SIDLY 0x0008 34#define REG_SPI_CTRL_CSHEXT 0x000c 35#define REG_SPI_CTRL_CSLEXT 0x0010 36 37#define REG_SPI_CTRL_MTX_MODE_TOG 0x0014 38#define SPI_CTRL_MTX_MODE_TOG GENMASK(3, 0) 39 40#define REG_SPI_CTRL_RDCTL_FSM 0x0018 41#define SPI_CTRL_RDCTL_FSM GENMASK(3, 0) 42 43#define REG_SPI_CTRL_MACMUX_SEL 0x001c 44 45#define REG_SPI_CTRL_MANUAL_EN 0x0020 46#define SPI_CTRL_MANUAL_EN BIT(0) 47 48#define REG_SPI_CTRL_OPFIFO_EMPTY 0x0024 49#define SPI_CTRL_OPFIFO_EMPTY BIT(0) 50 51#define REG_SPI_CTRL_OPFIFO_WDATA 0x0028 52#define SPI_CTRL_OPFIFO_LEN GENMASK(8, 0) 53#define SPI_CTRL_OPFIFO_OP GENMASK(13, 9) 54 55#define REG_SPI_CTRL_OPFIFO_FULL 0x002c 56#define SPI_CTRL_OPFIFO_FULL BIT(0) 57 58#define REG_SPI_CTRL_OPFIFO_WR 0x0030 59#define SPI_CTRL_OPFIFO_WR BIT(0) 60 61#define REG_SPI_CTRL_DFIFO_FULL 0x0034 62#define SPI_CTRL_DFIFO_FULL BIT(0) 63 64#define REG_SPI_CTRL_DFIFO_WDATA 0x0038 65#define SPI_CTRL_DFIFO_WDATA GENMASK(7, 0) 66 67#define REG_SPI_CTRL_DFIFO_EMPTY 0x003c 68#define SPI_CTRL_DFIFO_EMPTY BIT(0) 69 70#define REG_SPI_CTRL_DFIFO_RD 0x0040 71#define SPI_CTRL_DFIFO_RD BIT(0) 72 73#define REG_SPI_CTRL_DFIFO_RDATA 0x0044 74#define SPI_CTRL_DFIFO_RDATA GENMASK(7, 0) 75 76#define REG_SPI_CTRL_DUMMY 0x0080 77#define SPI_CTRL_CTRL_DUMMY GENMASK(3, 0) 78 79#define REG_SPI_CTRL_PROBE_SEL 0x0088 80#define REG_SPI_CTRL_INTERRUPT 0x0090 81#define REG_SPI_CTRL_INTERRUPT_EN 0x0094 82#define REG_SPI_CTRL_SI_CK_SEL 0x009c 83#define REG_SPI_CTRL_SW_CFGNANDADDR_VAL 0x010c 84#define REG_SPI_CTRL_SW_CFGNANDADDR_EN 0x0110 85#define REG_SPI_CTRL_SFC_STRAP 0x0114 86 87#define REG_SPI_CTRL_NFI2SPI_EN 0x0130 88#define SPI_CTRL_NFI2SPI_EN BIT(0) 89 90/* NFI2SPI */ 91#define REG_SPI_NFI_CNFG 0x0000 92#define SPI_NFI_DMA_MODE BIT(0) 93#define SPI_NFI_READ_MODE BIT(1) 94#define SPI_NFI_DMA_BURST_EN BIT(2) 95#define SPI_NFI_HW_ECC_EN BIT(8) 96#define SPI_NFI_AUTO_FDM_EN BIT(9) 97#define SPI_NFI_OPMODE GENMASK(14, 12) 98 99#define REG_SPI_NFI_PAGEFMT 0x0004 100#define SPI_NFI_PAGE_SIZE GENMASK(1, 0) 101#define SPI_NFI_SPARE_SIZE GENMASK(5, 4) 102 103#define REG_SPI_NFI_CON 0x0008 104#define SPI_NFI_FIFO_FLUSH BIT(0) 105#define SPI_NFI_RST BIT(1) 106#define SPI_NFI_RD_TRIG BIT(8) 107#define SPI_NFI_WR_TRIG BIT(9) 108#define SPI_NFI_SEC_NUM GENMASK(15, 12) 109 110#define REG_SPI_NFI_INTR_EN 0x0010 111#define SPI_NFI_RD_DONE_EN BIT(0) 112#define SPI_NFI_WR_DONE_EN BIT(1) 113#define SPI_NFI_RST_DONE_EN BIT(2) 114#define SPI_NFI_ERASE_DONE_EN BIT(3) 115#define SPI_NFI_BUSY_RETURN_EN BIT(4) 116#define SPI_NFI_ACCESS_LOCK_EN BIT(5) 117#define SPI_NFI_AHB_DONE_EN BIT(6) 118#define SPI_NFI_ALL_IRQ_EN \ 119 (SPI_NFI_RD_DONE_EN | SPI_NFI_WR_DONE_EN | \ 120 SPI_NFI_RST_DONE_EN | SPI_NFI_ERASE_DONE_EN | \ 121 SPI_NFI_BUSY_RETURN_EN | SPI_NFI_ACCESS_LOCK_EN | \ 122 SPI_NFI_AHB_DONE_EN) 123 124#define REG_SPI_NFI_INTR 0x0014 125#define SPI_NFI_AHB_DONE BIT(6) 126 127#define REG_SPI_NFI_CMD 0x0020 128 129#define REG_SPI_NFI_ADDR_NOB 0x0030 130#define SPI_NFI_ROW_ADDR_NOB GENMASK(6, 4) 131 132#define REG_SPI_NFI_STA 0x0060 133#define REG_SPI_NFI_FIFOSTA 0x0064 134#define REG_SPI_NFI_STRADDR 0x0080 135#define REG_SPI_NFI_FDM0L 0x00a0 136#define REG_SPI_NFI_FDM0M 0x00a4 137#define REG_SPI_NFI_FDM7L 0x00d8 138#define REG_SPI_NFI_FDM7M 0x00dc 139#define REG_SPI_NFI_FIFODATA0 0x0190 140#define REG_SPI_NFI_FIFODATA1 0x0194 141#define REG_SPI_NFI_FIFODATA2 0x0198 142#define REG_SPI_NFI_FIFODATA3 0x019c 143#define REG_SPI_NFI_MASTERSTA 0x0224 144 145#define REG_SPI_NFI_SECCUS_SIZE 0x022c 146#define SPI_NFI_CUS_SEC_SIZE GENMASK(12, 0) 147#define SPI_NFI_CUS_SEC_SIZE_EN BIT(16) 148 149#define REG_SPI_NFI_RD_CTL2 0x0510 150#define REG_SPI_NFI_RD_CTL3 0x0514 151 152#define REG_SPI_NFI_PG_CTL1 0x0524 153#define SPI_NFI_PG_LOAD_CMD GENMASK(15, 8) 154 155#define REG_SPI_NFI_PG_CTL2 0x0528 156#define REG_SPI_NFI_NOR_PROG_ADDR 0x052c 157#define REG_SPI_NFI_NOR_RD_ADDR 0x0534 158 159#define REG_SPI_NFI_SNF_MISC_CTL 0x0538 160#define SPI_NFI_DATA_READ_WR_MODE GENMASK(18, 16) 161 162#define REG_SPI_NFI_SNF_MISC_CTL2 0x053c 163#define SPI_NFI_READ_DATA_BYTE_NUM GENMASK(12, 0) 164#define SPI_NFI_PROG_LOAD_BYTE_NUM GENMASK(28, 16) 165 166#define REG_SPI_NFI_SNF_STA_CTL1 0x0550 167#define SPI_NFI_READ_FROM_CACHE_DONE BIT(25) 168#define SPI_NFI_LOAD_TO_CACHE_DONE BIT(26) 169 170#define REG_SPI_NFI_SNF_STA_CTL2 0x0554 171 172#define REG_SPI_NFI_SNF_NFI_CNFG 0x055c 173#define SPI_NFI_SPI_MODE BIT(0) 174 175/* SPI NAND Protocol OP */ 176#define SPI_NAND_OP_GET_FEATURE 0x0f 177#define SPI_NAND_OP_SET_FEATURE 0x1f 178#define SPI_NAND_OP_PAGE_READ 0x13 179#define SPI_NAND_OP_READ_FROM_CACHE_SINGLE 0x03 180#define SPI_NAND_OP_READ_FROM_CACHE_SINGLE_FAST 0x0b 181#define SPI_NAND_OP_READ_FROM_CACHE_DUAL 0x3b 182#define SPI_NAND_OP_READ_FROM_CACHE_QUAD 0x6b 183#define SPI_NAND_OP_WRITE_ENABLE 0x06 184#define SPI_NAND_OP_WRITE_DISABLE 0x04 185#define SPI_NAND_OP_PROGRAM_LOAD_SINGLE 0x02 186#define SPI_NAND_OP_PROGRAM_LOAD_QUAD 0x32 187#define SPI_NAND_OP_PROGRAM_LOAD_RAMDOM_SINGLE 0x84 188#define SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD 0x34 189#define SPI_NAND_OP_PROGRAM_EXECUTE 0x10 190#define SPI_NAND_OP_READ_ID 0x9f 191#define SPI_NAND_OP_BLOCK_ERASE 0xd8 192#define SPI_NAND_OP_RESET 0xff 193#define SPI_NAND_OP_DIE_SELECT 0xc2 194 195#define SPI_NAND_CACHE_SIZE (SZ_4K + SZ_256) 196#define SPI_MAX_TRANSFER_SIZE 511 197 198enum airoha_snand_mode { 199 SPI_MODE_AUTO, 200 SPI_MODE_MANUAL, 201 SPI_MODE_DMA, 202}; 203 204enum airoha_snand_cs { 205 SPI_CHIP_SEL_HIGH, 206 SPI_CHIP_SEL_LOW, 207}; 208 209struct airoha_snand_ctrl { 210 struct device *dev; 211 struct regmap *regmap_ctrl; 212 struct regmap *regmap_nfi; 213 struct clk *spi_clk; 214 215 struct { 216 size_t page_size; 217 size_t sec_size; 218 u8 sec_num; 219 u8 spare_size; 220 } nfi_cfg; 221}; 222 223static int airoha_snand_set_fifo_op(struct airoha_snand_ctrl *as_ctrl, 224 u8 op_cmd, int op_len) 225{ 226 int err; 227 u32 val; 228 229 err = regmap_write(as_ctrl->regmap_ctrl, REG_SPI_CTRL_OPFIFO_WDATA, 230 FIELD_PREP(SPI_CTRL_OPFIFO_LEN, op_len) | 231 FIELD_PREP(SPI_CTRL_OPFIFO_OP, op_cmd)); 232 if (err) 233 return err; 234 235 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl, 236 REG_SPI_CTRL_OPFIFO_FULL, 237 val, !(val & SPI_CTRL_OPFIFO_FULL), 238 0, 250 * USEC_PER_MSEC); 239 if (err) 240 return err; 241 242 err = regmap_write(as_ctrl->regmap_ctrl, REG_SPI_CTRL_OPFIFO_WR, 243 SPI_CTRL_OPFIFO_WR); 244 if (err) 245 return err; 246 247 return regmap_read_poll_timeout(as_ctrl->regmap_ctrl, 248 REG_SPI_CTRL_OPFIFO_EMPTY, 249 val, (val & SPI_CTRL_OPFIFO_EMPTY), 250 0, 250 * USEC_PER_MSEC); 251} 252 253static int airoha_snand_set_cs(struct airoha_snand_ctrl *as_ctrl, u8 cs) 254{ 255 return airoha_snand_set_fifo_op(as_ctrl, cs, sizeof(cs)); 256} 257 258static int airoha_snand_write_data_to_fifo(struct airoha_snand_ctrl *as_ctrl, 259 const u8 *data, int len) 260{ 261 int i; 262 263 for (i = 0; i < len; i++) { 264 int err; 265 u32 val; 266 267 /* 1. Wait until dfifo is not full */ 268 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl, 269 REG_SPI_CTRL_DFIFO_FULL, val, 270 !(val & SPI_CTRL_DFIFO_FULL), 271 0, 250 * USEC_PER_MSEC); 272 if (err) 273 return err; 274 275 /* 2. Write data to register DFIFO_WDATA */ 276 err = regmap_write(as_ctrl->regmap_ctrl, 277 REG_SPI_CTRL_DFIFO_WDATA, 278 FIELD_PREP(SPI_CTRL_DFIFO_WDATA, data[i])); 279 if (err) 280 return err; 281 282 /* 3. Wait until dfifo is not full */ 283 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl, 284 REG_SPI_CTRL_DFIFO_FULL, val, 285 !(val & SPI_CTRL_DFIFO_FULL), 286 0, 250 * USEC_PER_MSEC); 287 if (err) 288 return err; 289 } 290 291 return 0; 292} 293 294static int airoha_snand_read_data_from_fifo(struct airoha_snand_ctrl *as_ctrl, 295 u8 *ptr, int len) 296{ 297 int i; 298 299 for (i = 0; i < len; i++) { 300 int err; 301 u32 val; 302 303 /* 1. wait until dfifo is not empty */ 304 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl, 305 REG_SPI_CTRL_DFIFO_EMPTY, val, 306 !(val & SPI_CTRL_DFIFO_EMPTY), 307 0, 250 * USEC_PER_MSEC); 308 if (err) 309 return err; 310 311 /* 2. read from dfifo to register DFIFO_RDATA */ 312 err = regmap_read(as_ctrl->regmap_ctrl, 313 REG_SPI_CTRL_DFIFO_RDATA, &val); 314 if (err) 315 return err; 316 317 ptr[i] = FIELD_GET(SPI_CTRL_DFIFO_RDATA, val); 318 /* 3. enable register DFIFO_RD to read next byte */ 319 err = regmap_write(as_ctrl->regmap_ctrl, 320 REG_SPI_CTRL_DFIFO_RD, SPI_CTRL_DFIFO_RD); 321 if (err) 322 return err; 323 } 324 325 return 0; 326} 327 328static int airoha_snand_set_mode(struct airoha_snand_ctrl *as_ctrl, 329 enum airoha_snand_mode mode) 330{ 331 int err; 332 333 switch (mode) { 334 case SPI_MODE_MANUAL: { 335 u32 val; 336 337 err = regmap_write(as_ctrl->regmap_ctrl, 338 REG_SPI_CTRL_NFI2SPI_EN, 0); 339 if (err) 340 return err; 341 342 err = regmap_write(as_ctrl->regmap_ctrl, 343 REG_SPI_CTRL_READ_IDLE_EN, 0); 344 if (err) 345 return err; 346 347 err = regmap_read_poll_timeout(as_ctrl->regmap_ctrl, 348 REG_SPI_CTRL_RDCTL_FSM, val, 349 !(val & SPI_CTRL_RDCTL_FSM), 350 0, 250 * USEC_PER_MSEC); 351 if (err) 352 return err; 353 354 err = regmap_write(as_ctrl->regmap_ctrl, 355 REG_SPI_CTRL_MTX_MODE_TOG, 9); 356 if (err) 357 return err; 358 359 err = regmap_write(as_ctrl->regmap_ctrl, 360 REG_SPI_CTRL_MANUAL_EN, SPI_CTRL_MANUAL_EN); 361 if (err) 362 return err; 363 break; 364 } 365 case SPI_MODE_DMA: 366 err = regmap_write(as_ctrl->regmap_ctrl, 367 REG_SPI_CTRL_NFI2SPI_EN, 368 SPI_CTRL_MANUAL_EN); 369 if (err < 0) 370 return err; 371 372 err = regmap_write(as_ctrl->regmap_ctrl, 373 REG_SPI_CTRL_MTX_MODE_TOG, 0x0); 374 if (err < 0) 375 return err; 376 377 err = regmap_write(as_ctrl->regmap_ctrl, 378 REG_SPI_CTRL_MANUAL_EN, 0x0); 379 if (err < 0) 380 return err; 381 break; 382 case SPI_MODE_AUTO: 383 default: 384 break; 385 } 386 387 return regmap_write(as_ctrl->regmap_ctrl, REG_SPI_CTRL_DUMMY, 0); 388} 389 390static int airoha_snand_write_data(struct airoha_snand_ctrl *as_ctrl, u8 cmd, 391 const u8 *data, int len) 392{ 393 int i, data_len; 394 395 for (i = 0; i < len; i += data_len) { 396 int err; 397 398 data_len = min(len - i, SPI_MAX_TRANSFER_SIZE); 399 err = airoha_snand_set_fifo_op(as_ctrl, cmd, data_len); 400 if (err) 401 return err; 402 403 err = airoha_snand_write_data_to_fifo(as_ctrl, &data[i], 404 data_len); 405 if (err < 0) 406 return err; 407 } 408 409 return 0; 410} 411 412static int airoha_snand_read_data(struct airoha_snand_ctrl *as_ctrl, u8 *data, 413 int len) 414{ 415 int i, data_len; 416 417 for (i = 0; i < len; i += data_len) { 418 int err; 419 420 data_len = min(len - i, SPI_MAX_TRANSFER_SIZE); 421 err = airoha_snand_set_fifo_op(as_ctrl, 0xc, data_len); 422 if (err) 423 return err; 424 425 err = airoha_snand_read_data_from_fifo(as_ctrl, &data[i], 426 data_len); 427 if (err < 0) 428 return err; 429 } 430 431 return 0; 432} 433 434static int airoha_snand_nfi_init(struct airoha_snand_ctrl *as_ctrl) 435{ 436 int err; 437 438 /* switch to SNFI mode */ 439 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_NFI_CNFG, 440 SPI_NFI_SPI_MODE); 441 if (err) 442 return err; 443 444 /* Enable DMA */ 445 return regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR_EN, 446 SPI_NFI_ALL_IRQ_EN, SPI_NFI_AHB_DONE_EN); 447} 448 449static int airoha_snand_nfi_config(struct airoha_snand_ctrl *as_ctrl) 450{ 451 int err; 452 u32 val; 453 454 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, 455 SPI_NFI_FIFO_FLUSH | SPI_NFI_RST); 456 if (err) 457 return err; 458 459 /* auto FDM */ 460 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 461 SPI_NFI_AUTO_FDM_EN); 462 if (err) 463 return err; 464 465 /* HW ECC */ 466 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 467 SPI_NFI_HW_ECC_EN); 468 if (err) 469 return err; 470 471 /* DMA Burst */ 472 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 473 SPI_NFI_DMA_BURST_EN); 474 if (err) 475 return err; 476 477 /* page format */ 478 switch (as_ctrl->nfi_cfg.spare_size) { 479 case 26: 480 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x1); 481 break; 482 case 27: 483 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x2); 484 break; 485 case 28: 486 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x3); 487 break; 488 default: 489 val = FIELD_PREP(SPI_NFI_SPARE_SIZE, 0x0); 490 break; 491 } 492 493 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_PAGEFMT, 494 SPI_NFI_SPARE_SIZE, val); 495 if (err) 496 return err; 497 498 switch (as_ctrl->nfi_cfg.page_size) { 499 case 2048: 500 val = FIELD_PREP(SPI_NFI_PAGE_SIZE, 0x1); 501 break; 502 case 4096: 503 val = FIELD_PREP(SPI_NFI_PAGE_SIZE, 0x2); 504 break; 505 default: 506 val = FIELD_PREP(SPI_NFI_PAGE_SIZE, 0x0); 507 break; 508 } 509 510 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_PAGEFMT, 511 SPI_NFI_PAGE_SIZE, val); 512 if (err) 513 return err; 514 515 /* sec num */ 516 val = FIELD_PREP(SPI_NFI_SEC_NUM, as_ctrl->nfi_cfg.sec_num); 517 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, 518 SPI_NFI_SEC_NUM, val); 519 if (err) 520 return err; 521 522 /* enable cust sec size */ 523 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SECCUS_SIZE, 524 SPI_NFI_CUS_SEC_SIZE_EN); 525 if (err) 526 return err; 527 528 /* set cust sec size */ 529 val = FIELD_PREP(SPI_NFI_CUS_SEC_SIZE, as_ctrl->nfi_cfg.sec_size); 530 return regmap_update_bits(as_ctrl->regmap_nfi, 531 REG_SPI_NFI_SECCUS_SIZE, 532 SPI_NFI_CUS_SEC_SIZE, val); 533} 534 535static bool airoha_snand_is_page_ops(const struct spi_mem_op *op) 536{ 537 if (op->addr.nbytes != 2) 538 return false; 539 540 if (op->addr.buswidth != 1 && op->addr.buswidth != 2 && 541 op->addr.buswidth != 4) 542 return false; 543 544 switch (op->data.dir) { 545 case SPI_MEM_DATA_IN: 546 if (op->dummy.nbytes * BITS_PER_BYTE / op->dummy.buswidth > 0xf) 547 return false; 548 549 /* quad in / quad out */ 550 if (op->addr.buswidth == 4) 551 return op->data.buswidth == 4; 552 553 if (op->addr.buswidth == 2) 554 return op->data.buswidth == 2; 555 556 /* standard spi */ 557 return op->data.buswidth == 4 || op->data.buswidth == 2 || 558 op->data.buswidth == 1; 559 case SPI_MEM_DATA_OUT: 560 return !op->dummy.nbytes && op->addr.buswidth == 1 && 561 (op->data.buswidth == 4 || op->data.buswidth == 1); 562 default: 563 return false; 564 } 565} 566 567static int airoha_snand_adjust_op_size(struct spi_mem *mem, 568 struct spi_mem_op *op) 569{ 570 size_t max_len; 571 572 if (airoha_snand_is_page_ops(op)) { 573 struct airoha_snand_ctrl *as_ctrl; 574 575 as_ctrl = spi_controller_get_devdata(mem->spi->controller); 576 max_len = as_ctrl->nfi_cfg.sec_size; 577 max_len += as_ctrl->nfi_cfg.spare_size; 578 max_len *= as_ctrl->nfi_cfg.sec_num; 579 580 if (op->data.nbytes > max_len) 581 op->data.nbytes = max_len; 582 } else { 583 max_len = 1 + op->addr.nbytes + op->dummy.nbytes; 584 if (max_len >= 160) 585 return -EOPNOTSUPP; 586 587 if (op->data.nbytes > 160 - max_len) 588 op->data.nbytes = 160 - max_len; 589 } 590 591 return 0; 592} 593 594static bool airoha_snand_supports_op(struct spi_mem *mem, 595 const struct spi_mem_op *op) 596{ 597 if (!spi_mem_default_supports_op(mem, op)) 598 return false; 599 600 if (op->cmd.buswidth != 1) 601 return false; 602 603 if (airoha_snand_is_page_ops(op)) 604 return true; 605 606 return (!op->addr.nbytes || op->addr.buswidth == 1) && 607 (!op->dummy.nbytes || op->dummy.buswidth == 1) && 608 (!op->data.nbytes || op->data.buswidth == 1); 609} 610 611static int airoha_snand_dirmap_create(struct spi_mem_dirmap_desc *desc) 612{ 613 u8 *txrx_buf = spi_get_ctldata(desc->mem->spi); 614 615 if (!txrx_buf) 616 return -EINVAL; 617 618 if (desc->info.offset + desc->info.length > U32_MAX) 619 return -EINVAL; 620 621 if (!airoha_snand_supports_op(desc->mem, &desc->info.op_tmpl)) 622 return -EOPNOTSUPP; 623 624 return 0; 625} 626 627static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc, 628 u64 offs, size_t len, void *buf) 629{ 630 struct spi_mem_op *op = &desc->info.op_tmpl; 631 struct spi_device *spi = desc->mem->spi; 632 struct airoha_snand_ctrl *as_ctrl; 633 u8 *txrx_buf = spi_get_ctldata(spi); 634 dma_addr_t dma_addr; 635 u32 val, rd_mode; 636 int err; 637 638 switch (op->cmd.opcode) { 639 case SPI_NAND_OP_READ_FROM_CACHE_DUAL: 640 rd_mode = 1; 641 break; 642 case SPI_NAND_OP_READ_FROM_CACHE_QUAD: 643 rd_mode = 2; 644 break; 645 default: 646 rd_mode = 0; 647 break; 648 } 649 650 as_ctrl = spi_controller_get_devdata(spi->controller); 651 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA); 652 if (err < 0) 653 return err; 654 655 err = airoha_snand_nfi_config(as_ctrl); 656 if (err) 657 return err; 658 659 dma_addr = dma_map_single(as_ctrl->dev, txrx_buf, SPI_NAND_CACHE_SIZE, 660 DMA_FROM_DEVICE); 661 err = dma_mapping_error(as_ctrl->dev, dma_addr); 662 if (err) 663 return err; 664 665 /* set dma addr */ 666 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR, 667 dma_addr); 668 if (err) 669 goto error_dma_unmap; 670 671 /* set cust sec size */ 672 val = as_ctrl->nfi_cfg.sec_size * as_ctrl->nfi_cfg.sec_num; 673 val = FIELD_PREP(SPI_NFI_READ_DATA_BYTE_NUM, val); 674 err = regmap_update_bits(as_ctrl->regmap_nfi, 675 REG_SPI_NFI_SNF_MISC_CTL2, 676 SPI_NFI_READ_DATA_BYTE_NUM, val); 677 if (err) 678 goto error_dma_unmap; 679 680 /* set read command */ 681 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL2, 682 op->cmd.opcode); 683 if (err) 684 goto error_dma_unmap; 685 686 /* set read mode */ 687 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL, 688 FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, rd_mode)); 689 if (err) 690 goto error_dma_unmap; 691 692 /* set read addr */ 693 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_RD_CTL3, 0x0); 694 if (err) 695 goto error_dma_unmap; 696 697 /* set nfi read */ 698 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 699 SPI_NFI_OPMODE, 700 FIELD_PREP(SPI_NFI_OPMODE, 6)); 701 if (err) 702 goto error_dma_unmap; 703 704 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 705 SPI_NFI_READ_MODE | SPI_NFI_DMA_MODE); 706 if (err) 707 goto error_dma_unmap; 708 709 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CMD, 0x0); 710 if (err) 711 goto error_dma_unmap; 712 713 /* trigger dma start read */ 714 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, 715 SPI_NFI_RD_TRIG); 716 if (err) 717 goto error_dma_unmap; 718 719 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, 720 SPI_NFI_RD_TRIG); 721 if (err) 722 goto error_dma_unmap; 723 724 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, 725 REG_SPI_NFI_SNF_STA_CTL1, val, 726 (val & SPI_NFI_READ_FROM_CACHE_DONE), 727 0, 1 * USEC_PER_SEC); 728 if (err) 729 goto error_dma_unmap; 730 731 /* 732 * SPI_NFI_READ_FROM_CACHE_DONE bit must be written at the end 733 * of dirmap_read operation even if it is already set. 734 */ 735 err = regmap_write_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1, 736 SPI_NFI_READ_FROM_CACHE_DONE, 737 SPI_NFI_READ_FROM_CACHE_DONE); 738 if (err) 739 goto error_dma_unmap; 740 741 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR, 742 val, (val & SPI_NFI_AHB_DONE), 0, 743 1 * USEC_PER_SEC); 744 if (err) 745 goto error_dma_unmap; 746 747 /* DMA read need delay for data ready from controller to DRAM */ 748 udelay(1); 749 750 dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE, 751 DMA_FROM_DEVICE); 752 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL); 753 if (err < 0) 754 return err; 755 756 memcpy(buf, txrx_buf + offs, len); 757 758 return len; 759 760error_dma_unmap: 761 dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE, 762 DMA_FROM_DEVICE); 763 return err; 764} 765 766static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc, 767 u64 offs, size_t len, const void *buf) 768{ 769 struct spi_mem_op *op = &desc->info.op_tmpl; 770 struct spi_device *spi = desc->mem->spi; 771 u8 *txrx_buf = spi_get_ctldata(spi); 772 struct airoha_snand_ctrl *as_ctrl; 773 dma_addr_t dma_addr; 774 u32 wr_mode, val; 775 int err; 776 777 as_ctrl = spi_controller_get_devdata(spi->controller); 778 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL); 779 if (err < 0) 780 return err; 781 782 memcpy(txrx_buf + offs, buf, len); 783 dma_addr = dma_map_single(as_ctrl->dev, txrx_buf, SPI_NAND_CACHE_SIZE, 784 DMA_TO_DEVICE); 785 err = dma_mapping_error(as_ctrl->dev, dma_addr); 786 if (err) 787 return err; 788 789 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_DMA); 790 if (err < 0) 791 goto error_dma_unmap; 792 793 err = airoha_snand_nfi_config(as_ctrl); 794 if (err) 795 goto error_dma_unmap; 796 797 if (op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_QUAD || 798 op->cmd.opcode == SPI_NAND_OP_PROGRAM_LOAD_RAMDON_QUAD) 799 wr_mode = BIT(1); 800 else 801 wr_mode = 0; 802 803 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_STRADDR, 804 dma_addr); 805 if (err) 806 goto error_dma_unmap; 807 808 val = FIELD_PREP(SPI_NFI_PROG_LOAD_BYTE_NUM, 809 as_ctrl->nfi_cfg.sec_size * as_ctrl->nfi_cfg.sec_num); 810 err = regmap_update_bits(as_ctrl->regmap_nfi, 811 REG_SPI_NFI_SNF_MISC_CTL2, 812 SPI_NFI_PROG_LOAD_BYTE_NUM, val); 813 if (err) 814 goto error_dma_unmap; 815 816 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL1, 817 FIELD_PREP(SPI_NFI_PG_LOAD_CMD, 818 op->cmd.opcode)); 819 if (err) 820 goto error_dma_unmap; 821 822 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_MISC_CTL, 823 FIELD_PREP(SPI_NFI_DATA_READ_WR_MODE, wr_mode)); 824 if (err) 825 goto error_dma_unmap; 826 827 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_PG_CTL2, 0x0); 828 if (err) 829 goto error_dma_unmap; 830 831 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 832 SPI_NFI_READ_MODE); 833 if (err) 834 goto error_dma_unmap; 835 836 err = regmap_update_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 837 SPI_NFI_OPMODE, 838 FIELD_PREP(SPI_NFI_OPMODE, 3)); 839 if (err) 840 goto error_dma_unmap; 841 842 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CNFG, 843 SPI_NFI_DMA_MODE); 844 if (err) 845 goto error_dma_unmap; 846 847 err = regmap_write(as_ctrl->regmap_nfi, REG_SPI_NFI_CMD, 0x80); 848 if (err) 849 goto error_dma_unmap; 850 851 err = regmap_clear_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, 852 SPI_NFI_WR_TRIG); 853 if (err) 854 goto error_dma_unmap; 855 856 err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, 857 SPI_NFI_WR_TRIG); 858 if (err) 859 goto error_dma_unmap; 860 861 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, REG_SPI_NFI_INTR, 862 val, (val & SPI_NFI_AHB_DONE), 0, 863 1 * USEC_PER_SEC); 864 if (err) 865 goto error_dma_unmap; 866 867 err = regmap_read_poll_timeout(as_ctrl->regmap_nfi, 868 REG_SPI_NFI_SNF_STA_CTL1, val, 869 (val & SPI_NFI_LOAD_TO_CACHE_DONE), 870 0, 1 * USEC_PER_SEC); 871 if (err) 872 goto error_dma_unmap; 873 874 /* 875 * SPI_NFI_LOAD_TO_CACHE_DONE bit must be written at the end 876 * of dirmap_write operation even if it is already set. 877 */ 878 err = regmap_write_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1, 879 SPI_NFI_LOAD_TO_CACHE_DONE, 880 SPI_NFI_LOAD_TO_CACHE_DONE); 881 if (err) 882 goto error_dma_unmap; 883 884 dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE, 885 DMA_TO_DEVICE); 886 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL); 887 if (err < 0) 888 return err; 889 890 return len; 891 892error_dma_unmap: 893 dma_unmap_single(as_ctrl->dev, dma_addr, SPI_NAND_CACHE_SIZE, 894 DMA_TO_DEVICE); 895 return err; 896} 897 898static int airoha_snand_exec_op(struct spi_mem *mem, 899 const struct spi_mem_op *op) 900{ 901 u8 data[8], cmd, opcode = op->cmd.opcode; 902 struct airoha_snand_ctrl *as_ctrl; 903 int i, err; 904 905 as_ctrl = spi_controller_get_devdata(mem->spi->controller); 906 907 /* switch to manual mode */ 908 err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL); 909 if (err < 0) 910 return err; 911 912 err = airoha_snand_set_cs(as_ctrl, SPI_CHIP_SEL_LOW); 913 if (err < 0) 914 return err; 915 916 /* opcode */ 917 err = airoha_snand_write_data(as_ctrl, 0x8, &opcode, sizeof(opcode)); 918 if (err) 919 return err; 920 921 /* addr part */ 922 cmd = opcode == SPI_NAND_OP_GET_FEATURE ? 0x11 : 0x8; 923 put_unaligned_be64(op->addr.val, data); 924 925 for (i = ARRAY_SIZE(data) - op->addr.nbytes; 926 i < ARRAY_SIZE(data); i++) { 927 err = airoha_snand_write_data(as_ctrl, cmd, &data[i], 928 sizeof(data[0])); 929 if (err) 930 return err; 931 } 932 933 /* dummy */ 934 data[0] = 0xff; 935 for (i = 0; i < op->dummy.nbytes; i++) { 936 err = airoha_snand_write_data(as_ctrl, 0x8, &data[0], 937 sizeof(data[0])); 938 if (err) 939 return err; 940 } 941 942 /* data */ 943 if (op->data.dir == SPI_MEM_DATA_IN) { 944 err = airoha_snand_read_data(as_ctrl, op->data.buf.in, 945 op->data.nbytes); 946 if (err) 947 return err; 948 } else { 949 err = airoha_snand_write_data(as_ctrl, 0x8, op->data.buf.out, 950 op->data.nbytes); 951 if (err) 952 return err; 953 } 954 955 return airoha_snand_set_cs(as_ctrl, SPI_CHIP_SEL_HIGH); 956} 957 958static const struct spi_controller_mem_ops airoha_snand_mem_ops = { 959 .adjust_op_size = airoha_snand_adjust_op_size, 960 .supports_op = airoha_snand_supports_op, 961 .exec_op = airoha_snand_exec_op, 962 .dirmap_create = airoha_snand_dirmap_create, 963 .dirmap_read = airoha_snand_dirmap_read, 964 .dirmap_write = airoha_snand_dirmap_write, 965}; 966 967static int airoha_snand_setup(struct spi_device *spi) 968{ 969 struct airoha_snand_ctrl *as_ctrl; 970 u8 *txrx_buf; 971 972 /* prepare device buffer */ 973 as_ctrl = spi_controller_get_devdata(spi->controller); 974 txrx_buf = devm_kzalloc(as_ctrl->dev, SPI_NAND_CACHE_SIZE, 975 GFP_KERNEL); 976 if (!txrx_buf) 977 return -ENOMEM; 978 979 spi_set_ctldata(spi, txrx_buf); 980 981 return 0; 982} 983 984static int airoha_snand_nfi_setup(struct airoha_snand_ctrl *as_ctrl) 985{ 986 u32 val, sec_size, sec_num; 987 int err; 988 989 err = regmap_read(as_ctrl->regmap_nfi, REG_SPI_NFI_CON, &val); 990 if (err) 991 return err; 992 993 sec_num = FIELD_GET(SPI_NFI_SEC_NUM, val); 994 995 err = regmap_read(as_ctrl->regmap_nfi, REG_SPI_NFI_SECCUS_SIZE, &val); 996 if (err) 997 return err; 998 999 sec_size = FIELD_GET(SPI_NFI_CUS_SEC_SIZE, val); 1000 1001 /* init default value */ 1002 as_ctrl->nfi_cfg.sec_size = sec_size; 1003 as_ctrl->nfi_cfg.sec_num = sec_num; 1004 as_ctrl->nfi_cfg.page_size = round_down(sec_size * sec_num, 1024); 1005 as_ctrl->nfi_cfg.spare_size = 16; 1006 1007 err = airoha_snand_nfi_init(as_ctrl); 1008 if (err) 1009 return err; 1010 1011 return airoha_snand_nfi_config(as_ctrl); 1012} 1013 1014static const struct regmap_config spi_ctrl_regmap_config = { 1015 .name = "ctrl", 1016 .reg_bits = 32, 1017 .val_bits = 32, 1018 .reg_stride = 4, 1019 .max_register = REG_SPI_CTRL_NFI2SPI_EN, 1020}; 1021 1022static const struct regmap_config spi_nfi_regmap_config = { 1023 .name = "nfi", 1024 .reg_bits = 32, 1025 .val_bits = 32, 1026 .reg_stride = 4, 1027 .max_register = REG_SPI_NFI_SNF_NFI_CNFG, 1028}; 1029 1030static const struct of_device_id airoha_snand_ids[] = { 1031 { .compatible = "airoha,en7581-snand" }, 1032 { /* sentinel */ } 1033}; 1034MODULE_DEVICE_TABLE(of, airoha_snand_ids); 1035 1036static int airoha_snand_probe(struct platform_device *pdev) 1037{ 1038 struct airoha_snand_ctrl *as_ctrl; 1039 struct device *dev = &pdev->dev; 1040 struct spi_controller *ctrl; 1041 void __iomem *base; 1042 int err; 1043 1044 ctrl = devm_spi_alloc_host(dev, sizeof(*as_ctrl)); 1045 if (!ctrl) 1046 return -ENOMEM; 1047 1048 as_ctrl = spi_controller_get_devdata(ctrl); 1049 as_ctrl->dev = dev; 1050 1051 base = devm_platform_ioremap_resource(pdev, 0); 1052 if (IS_ERR(base)) 1053 return PTR_ERR(base); 1054 1055 as_ctrl->regmap_ctrl = devm_regmap_init_mmio(dev, base, 1056 &spi_ctrl_regmap_config); 1057 if (IS_ERR(as_ctrl->regmap_ctrl)) 1058 return dev_err_probe(dev, PTR_ERR(as_ctrl->regmap_ctrl), 1059 "failed to init spi ctrl regmap\n"); 1060 1061 base = devm_platform_ioremap_resource(pdev, 1); 1062 if (IS_ERR(base)) 1063 return PTR_ERR(base); 1064 1065 as_ctrl->regmap_nfi = devm_regmap_init_mmio(dev, base, 1066 &spi_nfi_regmap_config); 1067 if (IS_ERR(as_ctrl->regmap_nfi)) 1068 return dev_err_probe(dev, PTR_ERR(as_ctrl->regmap_nfi), 1069 "failed to init spi nfi regmap\n"); 1070 1071 as_ctrl->spi_clk = devm_clk_get_enabled(dev, "spi"); 1072 if (IS_ERR(as_ctrl->spi_clk)) 1073 return dev_err_probe(dev, PTR_ERR(as_ctrl->spi_clk), 1074 "unable to get spi clk\n"); 1075 1076 err = dma_set_mask(as_ctrl->dev, DMA_BIT_MASK(32)); 1077 if (err) 1078 return err; 1079 1080 ctrl->num_chipselect = 2; 1081 ctrl->mem_ops = &airoha_snand_mem_ops; 1082 ctrl->bits_per_word_mask = SPI_BPW_MASK(8); 1083 ctrl->mode_bits = SPI_RX_DUAL; 1084 ctrl->setup = airoha_snand_setup; 1085 device_set_node(&ctrl->dev, dev_fwnode(dev)); 1086 1087 err = airoha_snand_nfi_setup(as_ctrl); 1088 if (err) 1089 return err; 1090 1091 return devm_spi_register_controller(dev, ctrl); 1092} 1093 1094static struct platform_driver airoha_snand_driver = { 1095 .driver = { 1096 .name = "airoha-spi", 1097 .of_match_table = airoha_snand_ids, 1098 }, 1099 .probe = airoha_snand_probe, 1100}; 1101module_platform_driver(airoha_snand_driver); 1102 1103MODULE_DESCRIPTION("Airoha SPI-NAND Flash Controller Driver"); 1104MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>"); 1105MODULE_AUTHOR("Ray Liu <ray.liu@airoha.com>"); 1106MODULE_LICENSE("GPL");