linux/drivers/spi/spi-mtk-nor.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// Mediatek SPI NOR controller driver
   4//
   5// Copyright (C) 2020 Chuanhong Guo <gch981213@gmail.com>
   6
   7#include <linux/bits.h>
   8#include <linux/clk.h>
   9#include <linux/completion.h>
  10#include <linux/dma-mapping.h>
  11#include <linux/interrupt.h>
  12#include <linux/io.h>
  13#include <linux/iopoll.h>
  14#include <linux/kernel.h>
  15#include <linux/module.h>
  16#include <linux/of_device.h>
  17#include <linux/pm_runtime.h>
  18#include <linux/spi/spi.h>
  19#include <linux/spi/spi-mem.h>
  20#include <linux/string.h>
  21
  22#define DRIVER_NAME "mtk-spi-nor"
  23
  24#define MTK_NOR_REG_CMD                 0x00
  25#define MTK_NOR_CMD_WRITE               BIT(4)
  26#define MTK_NOR_CMD_PROGRAM             BIT(2)
  27#define MTK_NOR_CMD_READ                BIT(0)
  28#define MTK_NOR_CMD_MASK                GENMASK(5, 0)
  29
  30#define MTK_NOR_REG_PRG_CNT             0x04
  31#define MTK_NOR_PRG_CNT_MAX             56
  32#define MTK_NOR_REG_RDATA               0x0c
  33
  34#define MTK_NOR_REG_RADR0               0x10
  35#define MTK_NOR_REG_RADR(n)             (MTK_NOR_REG_RADR0 + 4 * (n))
  36#define MTK_NOR_REG_RADR3               0xc8
  37
  38#define MTK_NOR_REG_WDATA               0x1c
  39
  40#define MTK_NOR_REG_PRGDATA0            0x20
  41#define MTK_NOR_REG_PRGDATA(n)          (MTK_NOR_REG_PRGDATA0 + 4 * (n))
  42#define MTK_NOR_REG_PRGDATA_MAX         5
  43
  44#define MTK_NOR_REG_SHIFT0              0x38
  45#define MTK_NOR_REG_SHIFT(n)            (MTK_NOR_REG_SHIFT0 + 4 * (n))
  46#define MTK_NOR_REG_SHIFT_MAX           9
  47
  48#define MTK_NOR_REG_CFG1                0x60
  49#define MTK_NOR_FAST_READ               BIT(0)
  50
  51#define MTK_NOR_REG_CFG2                0x64
  52#define MTK_NOR_WR_CUSTOM_OP_EN         BIT(4)
  53#define MTK_NOR_WR_BUF_EN               BIT(0)
  54
  55#define MTK_NOR_REG_PP_DATA             0x98
  56
  57#define MTK_NOR_REG_IRQ_STAT            0xa8
  58#define MTK_NOR_REG_IRQ_EN              0xac
  59#define MTK_NOR_IRQ_DMA                 BIT(7)
  60#define MTK_NOR_IRQ_MASK                GENMASK(7, 0)
  61
  62#define MTK_NOR_REG_CFG3                0xb4
  63#define MTK_NOR_DISABLE_WREN            BIT(7)
  64#define MTK_NOR_DISABLE_SR_POLL         BIT(5)
  65
  66#define MTK_NOR_REG_WP                  0xc4
  67#define MTK_NOR_ENABLE_SF_CMD           0x30
  68
  69#define MTK_NOR_REG_BUSCFG              0xcc
  70#define MTK_NOR_4B_ADDR                 BIT(4)
  71#define MTK_NOR_QUAD_ADDR               BIT(3)
  72#define MTK_NOR_QUAD_READ               BIT(2)
  73#define MTK_NOR_DUAL_ADDR               BIT(1)
  74#define MTK_NOR_DUAL_READ               BIT(0)
  75#define MTK_NOR_BUS_MODE_MASK           GENMASK(4, 0)
  76
  77#define MTK_NOR_REG_DMA_CTL             0x718
  78#define MTK_NOR_DMA_START               BIT(0)
  79
  80#define MTK_NOR_REG_DMA_FADR            0x71c
  81#define MTK_NOR_REG_DMA_DADR            0x720
  82#define MTK_NOR_REG_DMA_END_DADR        0x724
  83#define MTK_NOR_REG_DMA_DADR_HB         0x738
  84#define MTK_NOR_REG_DMA_END_DADR_HB     0x73c
  85
  86#define MTK_NOR_PRG_MAX_SIZE            6
  87// Reading DMA src/dst addresses have to be 16-byte aligned
  88#define MTK_NOR_DMA_ALIGN               16
  89#define MTK_NOR_DMA_ALIGN_MASK          (MTK_NOR_DMA_ALIGN - 1)
  90// and we allocate a bounce buffer if destination address isn't aligned.
  91#define MTK_NOR_BOUNCE_BUF_SIZE         PAGE_SIZE
  92
  93// Buffered page program can do one 128-byte transfer
  94#define MTK_NOR_PP_SIZE                 128
  95
  96#define CLK_TO_US(sp, clkcnt)           DIV_ROUND_UP(clkcnt, sp->spi_freq / 1000000)
  97
  98struct mtk_nor {
  99        struct spi_controller *ctlr;
 100        struct device *dev;
 101        void __iomem *base;
 102        u8 *buffer;
 103        dma_addr_t buffer_dma;
 104        struct clk *spi_clk;
 105        struct clk *ctlr_clk;
 106        struct clk *axi_clk;
 107        unsigned int spi_freq;
 108        bool wbuf_en;
 109        bool has_irq;
 110        bool high_dma;
 111        struct completion op_done;
 112};
 113
 114static inline void mtk_nor_rmw(struct mtk_nor *sp, u32 reg, u32 set, u32 clr)
 115{
 116        u32 val = readl(sp->base + reg);
 117
 118        val &= ~clr;
 119        val |= set;
 120        writel(val, sp->base + reg);
 121}
 122
 123static inline int mtk_nor_cmd_exec(struct mtk_nor *sp, u32 cmd, ulong clk)
 124{
 125        ulong delay = CLK_TO_US(sp, clk);
 126        u32 reg;
 127        int ret;
 128
 129        writel(cmd, sp->base + MTK_NOR_REG_CMD);
 130        ret = readl_poll_timeout(sp->base + MTK_NOR_REG_CMD, reg, !(reg & cmd),
 131                                 delay / 3, (delay + 1) * 200);
 132        if (ret < 0)
 133                dev_err(sp->dev, "command %u timeout.\n", cmd);
 134        return ret;
 135}
 136
 137static void mtk_nor_set_addr(struct mtk_nor *sp, const struct spi_mem_op *op)
 138{
 139        u32 addr = op->addr.val;
 140        int i;
 141
 142        for (i = 0; i < 3; i++) {
 143                writeb(addr & 0xff, sp->base + MTK_NOR_REG_RADR(i));
 144                addr >>= 8;
 145        }
 146        if (op->addr.nbytes == 4) {
 147                writeb(addr & 0xff, sp->base + MTK_NOR_REG_RADR3);
 148                mtk_nor_rmw(sp, MTK_NOR_REG_BUSCFG, MTK_NOR_4B_ADDR, 0);
 149        } else {
 150                mtk_nor_rmw(sp, MTK_NOR_REG_BUSCFG, 0, MTK_NOR_4B_ADDR);
 151        }
 152}
 153
 154static bool need_bounce(struct mtk_nor *sp, const struct spi_mem_op *op)
 155{
 156        return ((uintptr_t)op->data.buf.in & MTK_NOR_DMA_ALIGN_MASK);
 157}
 158
 159static bool mtk_nor_match_read(const struct spi_mem_op *op)
 160{
 161        int dummy = 0;
 162
 163        if (op->dummy.buswidth)
 164                dummy = op->dummy.nbytes * BITS_PER_BYTE / op->dummy.buswidth;
 165
 166        if ((op->data.buswidth == 2) || (op->data.buswidth == 4)) {
 167                if (op->addr.buswidth == 1)
 168                        return dummy == 8;
 169                else if (op->addr.buswidth == 2)
 170                        return dummy == 4;
 171                else if (op->addr.buswidth == 4)
 172                        return dummy == 6;
 173        } else if ((op->addr.buswidth == 1) && (op->data.buswidth == 1)) {
 174                if (op->cmd.opcode == 0x03)
 175                        return dummy == 0;
 176                else if (op->cmd.opcode == 0x0b)
 177                        return dummy == 8;
 178        }
 179        return false;
 180}
 181
 182static bool mtk_nor_match_prg(const struct spi_mem_op *op)
 183{
 184        int tx_len, rx_len, prg_len, prg_left;
 185
 186        // prg mode is spi-only.
 187        if ((op->cmd.buswidth > 1) || (op->addr.buswidth > 1) ||
 188            (op->dummy.buswidth > 1) || (op->data.buswidth > 1))
 189                return false;
 190
 191        tx_len = op->cmd.nbytes + op->addr.nbytes;
 192
 193        if (op->data.dir == SPI_MEM_DATA_OUT) {
 194                // count dummy bytes only if we need to write data after it
 195                tx_len += op->dummy.nbytes;
 196
 197                // leave at least one byte for data
 198                if (tx_len > MTK_NOR_REG_PRGDATA_MAX)
 199                        return false;
 200
 201                // if there's no addr, meaning adjust_op_size is impossible,
 202                // check data length as well.
 203                if ((!op->addr.nbytes) &&
 204                    (tx_len + op->data.nbytes > MTK_NOR_REG_PRGDATA_MAX + 1))
 205                        return false;
 206        } else if (op->data.dir == SPI_MEM_DATA_IN) {
 207                if (tx_len > MTK_NOR_REG_PRGDATA_MAX + 1)
 208                        return false;
 209
 210                rx_len = op->data.nbytes;
 211                prg_left = MTK_NOR_PRG_CNT_MAX / 8 - tx_len - op->dummy.nbytes;
 212                if (prg_left > MTK_NOR_REG_SHIFT_MAX + 1)
 213                        prg_left = MTK_NOR_REG_SHIFT_MAX + 1;
 214                if (rx_len > prg_left) {
 215                        if (!op->addr.nbytes)
 216                                return false;
 217                        rx_len = prg_left;
 218                }
 219
 220                prg_len = tx_len + op->dummy.nbytes + rx_len;
 221                if (prg_len > MTK_NOR_PRG_CNT_MAX / 8)
 222                        return false;
 223        } else {
 224                prg_len = tx_len + op->dummy.nbytes;
 225                if (prg_len > MTK_NOR_PRG_CNT_MAX / 8)
 226                        return false;
 227        }
 228        return true;
 229}
 230
 231static void mtk_nor_adj_prg_size(struct spi_mem_op *op)
 232{
 233        int tx_len, tx_left, prg_left;
 234
 235        tx_len = op->cmd.nbytes + op->addr.nbytes;
 236        if (op->data.dir == SPI_MEM_DATA_OUT) {
 237                tx_len += op->dummy.nbytes;
 238                tx_left = MTK_NOR_REG_PRGDATA_MAX + 1 - tx_len;
 239                if (op->data.nbytes > tx_left)
 240                        op->data.nbytes = tx_left;
 241        } else if (op->data.dir == SPI_MEM_DATA_IN) {
 242                prg_left = MTK_NOR_PRG_CNT_MAX / 8 - tx_len - op->dummy.nbytes;
 243                if (prg_left > MTK_NOR_REG_SHIFT_MAX + 1)
 244                        prg_left = MTK_NOR_REG_SHIFT_MAX + 1;
 245                if (op->data.nbytes > prg_left)
 246                        op->data.nbytes = prg_left;
 247        }
 248}
 249
 250static int mtk_nor_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
 251{
 252        struct mtk_nor *sp = spi_controller_get_devdata(mem->spi->master);
 253
 254        if (!op->data.nbytes)
 255                return 0;
 256
 257        if ((op->addr.nbytes == 3) || (op->addr.nbytes == 4)) {
 258                if ((op->data.dir == SPI_MEM_DATA_IN) &&
 259                    mtk_nor_match_read(op)) {
 260                        // limit size to prevent timeout calculation overflow
 261                        if (op->data.nbytes > 0x400000)
 262                                op->data.nbytes = 0x400000;
 263
 264                        if ((op->addr.val & MTK_NOR_DMA_ALIGN_MASK) ||
 265                            (op->data.nbytes < MTK_NOR_DMA_ALIGN))
 266                                op->data.nbytes = 1;
 267                        else if (!need_bounce(sp, op))
 268                                op->data.nbytes &= ~MTK_NOR_DMA_ALIGN_MASK;
 269                        else if (op->data.nbytes > MTK_NOR_BOUNCE_BUF_SIZE)
 270                                op->data.nbytes = MTK_NOR_BOUNCE_BUF_SIZE;
 271                        return 0;
 272                } else if (op->data.dir == SPI_MEM_DATA_OUT) {
 273                        if (op->data.nbytes >= MTK_NOR_PP_SIZE)
 274                                op->data.nbytes = MTK_NOR_PP_SIZE;
 275                        else
 276                                op->data.nbytes = 1;
 277                        return 0;
 278                }
 279        }
 280
 281        mtk_nor_adj_prg_size(op);
 282        return 0;
 283}
 284
 285static bool mtk_nor_supports_op(struct spi_mem *mem,
 286                                const struct spi_mem_op *op)
 287{
 288        if (!spi_mem_default_supports_op(mem, op))
 289                return false;
 290
 291        if (op->cmd.buswidth != 1)
 292                return false;
 293
 294        if ((op->addr.nbytes == 3) || (op->addr.nbytes == 4)) {
 295                switch (op->data.dir) {
 296                case SPI_MEM_DATA_IN:
 297                        if (mtk_nor_match_read(op))
 298                                return true;
 299                        break;
 300                case SPI_MEM_DATA_OUT:
 301                        if ((op->addr.buswidth == 1) &&
 302                            (op->dummy.nbytes == 0) &&
 303                            (op->data.buswidth == 1))
 304                                return true;
 305                        break;
 306                default:
 307                        break;
 308                }
 309        }
 310
 311        return mtk_nor_match_prg(op);
 312}
 313
 314static void mtk_nor_setup_bus(struct mtk_nor *sp, const struct spi_mem_op *op)
 315{
 316        u32 reg = 0;
 317
 318        if (op->addr.nbytes == 4)
 319                reg |= MTK_NOR_4B_ADDR;
 320
 321        if (op->data.buswidth == 4) {
 322                reg |= MTK_NOR_QUAD_READ;
 323                writeb(op->cmd.opcode, sp->base + MTK_NOR_REG_PRGDATA(4));
 324                if (op->addr.buswidth == 4)
 325                        reg |= MTK_NOR_QUAD_ADDR;
 326        } else if (op->data.buswidth == 2) {
 327                reg |= MTK_NOR_DUAL_READ;
 328                writeb(op->cmd.opcode, sp->base + MTK_NOR_REG_PRGDATA(3));
 329                if (op->addr.buswidth == 2)
 330                        reg |= MTK_NOR_DUAL_ADDR;
 331        } else {
 332                if (op->cmd.opcode == 0x0b)
 333                        mtk_nor_rmw(sp, MTK_NOR_REG_CFG1, MTK_NOR_FAST_READ, 0);
 334                else
 335                        mtk_nor_rmw(sp, MTK_NOR_REG_CFG1, 0, MTK_NOR_FAST_READ);
 336        }
 337        mtk_nor_rmw(sp, MTK_NOR_REG_BUSCFG, reg, MTK_NOR_BUS_MODE_MASK);
 338}
 339
 340static int mtk_nor_dma_exec(struct mtk_nor *sp, u32 from, unsigned int length,
 341                            dma_addr_t dma_addr)
 342{
 343        int ret = 0;
 344        ulong delay;
 345        u32 reg;
 346
 347        writel(from, sp->base + MTK_NOR_REG_DMA_FADR);
 348        writel(dma_addr, sp->base + MTK_NOR_REG_DMA_DADR);
 349        writel(dma_addr + length, sp->base + MTK_NOR_REG_DMA_END_DADR);
 350
 351        if (sp->high_dma) {
 352                writel(upper_32_bits(dma_addr),
 353                       sp->base + MTK_NOR_REG_DMA_DADR_HB);
 354                writel(upper_32_bits(dma_addr + length),
 355                       sp->base + MTK_NOR_REG_DMA_END_DADR_HB);
 356        }
 357
 358        if (sp->has_irq) {
 359                reinit_completion(&sp->op_done);
 360                mtk_nor_rmw(sp, MTK_NOR_REG_IRQ_EN, MTK_NOR_IRQ_DMA, 0);
 361        }
 362
 363        mtk_nor_rmw(sp, MTK_NOR_REG_DMA_CTL, MTK_NOR_DMA_START, 0);
 364
 365        delay = CLK_TO_US(sp, (length + 5) * BITS_PER_BYTE);
 366
 367        if (sp->has_irq) {
 368                if (!wait_for_completion_timeout(&sp->op_done,
 369                                                 (delay + 1) * 100))
 370                        ret = -ETIMEDOUT;
 371        } else {
 372                ret = readl_poll_timeout(sp->base + MTK_NOR_REG_DMA_CTL, reg,
 373                                         !(reg & MTK_NOR_DMA_START), delay / 3,
 374                                         (delay + 1) * 100);
 375        }
 376
 377        if (ret < 0)
 378                dev_err(sp->dev, "dma read timeout.\n");
 379
 380        return ret;
 381}
 382
 383static int mtk_nor_read_bounce(struct mtk_nor *sp, const struct spi_mem_op *op)
 384{
 385        unsigned int rdlen;
 386        int ret;
 387
 388        if (op->data.nbytes & MTK_NOR_DMA_ALIGN_MASK)
 389                rdlen = (op->data.nbytes + MTK_NOR_DMA_ALIGN) & ~MTK_NOR_DMA_ALIGN_MASK;
 390        else
 391                rdlen = op->data.nbytes;
 392
 393        ret = mtk_nor_dma_exec(sp, op->addr.val, rdlen, sp->buffer_dma);
 394
 395        if (!ret)
 396                memcpy(op->data.buf.in, sp->buffer, op->data.nbytes);
 397
 398        return ret;
 399}
 400
 401static int mtk_nor_read_dma(struct mtk_nor *sp, const struct spi_mem_op *op)
 402{
 403        int ret;
 404        dma_addr_t dma_addr;
 405
 406        if (need_bounce(sp, op))
 407                return mtk_nor_read_bounce(sp, op);
 408
 409        dma_addr = dma_map_single(sp->dev, op->data.buf.in,
 410                                  op->data.nbytes, DMA_FROM_DEVICE);
 411
 412        if (dma_mapping_error(sp->dev, dma_addr))
 413                return -EINVAL;
 414
 415        ret = mtk_nor_dma_exec(sp, op->addr.val, op->data.nbytes, dma_addr);
 416
 417        dma_unmap_single(sp->dev, dma_addr, op->data.nbytes, DMA_FROM_DEVICE);
 418
 419        return ret;
 420}
 421
 422static int mtk_nor_read_pio(struct mtk_nor *sp, const struct spi_mem_op *op)
 423{
 424        u8 *buf = op->data.buf.in;
 425        int ret;
 426
 427        ret = mtk_nor_cmd_exec(sp, MTK_NOR_CMD_READ, 6 * BITS_PER_BYTE);
 428        if (!ret)
 429                buf[0] = readb(sp->base + MTK_NOR_REG_RDATA);
 430        return ret;
 431}
 432
 433static int mtk_nor_write_buffer_enable(struct mtk_nor *sp)
 434{
 435        int ret;
 436        u32 val;
 437
 438        if (sp->wbuf_en)
 439                return 0;
 440
 441        val = readl(sp->base + MTK_NOR_REG_CFG2);
 442        writel(val | MTK_NOR_WR_BUF_EN, sp->base + MTK_NOR_REG_CFG2);
 443        ret = readl_poll_timeout(sp->base + MTK_NOR_REG_CFG2, val,
 444                                 val & MTK_NOR_WR_BUF_EN, 0, 10000);
 445        if (!ret)
 446                sp->wbuf_en = true;
 447        return ret;
 448}
 449
 450static int mtk_nor_write_buffer_disable(struct mtk_nor *sp)
 451{
 452        int ret;
 453        u32 val;
 454
 455        if (!sp->wbuf_en)
 456                return 0;
 457        val = readl(sp->base + MTK_NOR_REG_CFG2);
 458        writel(val & ~MTK_NOR_WR_BUF_EN, sp->base + MTK_NOR_REG_CFG2);
 459        ret = readl_poll_timeout(sp->base + MTK_NOR_REG_CFG2, val,
 460                                 !(val & MTK_NOR_WR_BUF_EN), 0, 10000);
 461        if (!ret)
 462                sp->wbuf_en = false;
 463        return ret;
 464}
 465
 466static int mtk_nor_pp_buffered(struct mtk_nor *sp, const struct spi_mem_op *op)
 467{
 468        const u8 *buf = op->data.buf.out;
 469        u32 val;
 470        int ret, i;
 471
 472        ret = mtk_nor_write_buffer_enable(sp);
 473        if (ret < 0)
 474                return ret;
 475
 476        for (i = 0; i < op->data.nbytes; i += 4) {
 477                val = buf[i + 3] << 24 | buf[i + 2] << 16 | buf[i + 1] << 8 |
 478                      buf[i];
 479                writel(val, sp->base + MTK_NOR_REG_PP_DATA);
 480        }
 481        return mtk_nor_cmd_exec(sp, MTK_NOR_CMD_WRITE,
 482                                (op->data.nbytes + 5) * BITS_PER_BYTE);
 483}
 484
 485static int mtk_nor_pp_unbuffered(struct mtk_nor *sp,
 486                                 const struct spi_mem_op *op)
 487{
 488        const u8 *buf = op->data.buf.out;
 489        int ret;
 490
 491        ret = mtk_nor_write_buffer_disable(sp);
 492        if (ret < 0)
 493                return ret;
 494        writeb(buf[0], sp->base + MTK_NOR_REG_WDATA);
 495        return mtk_nor_cmd_exec(sp, MTK_NOR_CMD_WRITE, 6 * BITS_PER_BYTE);
 496}
 497
 498static int mtk_nor_spi_mem_prg(struct mtk_nor *sp, const struct spi_mem_op *op)
 499{
 500        int rx_len = 0;
 501        int reg_offset = MTK_NOR_REG_PRGDATA_MAX;
 502        int tx_len, prg_len;
 503        int i, ret;
 504        void __iomem *reg;
 505        u8 bufbyte;
 506
 507        tx_len = op->cmd.nbytes + op->addr.nbytes;
 508
 509        // count dummy bytes only if we need to write data after it
 510        if (op->data.dir == SPI_MEM_DATA_OUT)
 511                tx_len += op->dummy.nbytes + op->data.nbytes;
 512        else if (op->data.dir == SPI_MEM_DATA_IN)
 513                rx_len = op->data.nbytes;
 514
 515        prg_len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes +
 516                  op->data.nbytes;
 517
 518        // an invalid op may reach here if the caller calls exec_op without
 519        // adjust_op_size. return -EINVAL instead of -ENOTSUPP so that
 520        // spi-mem won't try this op again with generic spi transfers.
 521        if ((tx_len > MTK_NOR_REG_PRGDATA_MAX + 1) ||
 522            (rx_len > MTK_NOR_REG_SHIFT_MAX + 1) ||
 523            (prg_len > MTK_NOR_PRG_CNT_MAX / 8))
 524                return -EINVAL;
 525
 526        // fill tx data
 527        for (i = op->cmd.nbytes; i > 0; i--, reg_offset--) {
 528                reg = sp->base + MTK_NOR_REG_PRGDATA(reg_offset);
 529                bufbyte = (op->cmd.opcode >> ((i - 1) * BITS_PER_BYTE)) & 0xff;
 530                writeb(bufbyte, reg);
 531        }
 532
 533        for (i = op->addr.nbytes; i > 0; i--, reg_offset--) {
 534                reg = sp->base + MTK_NOR_REG_PRGDATA(reg_offset);
 535                bufbyte = (op->addr.val >> ((i - 1) * BITS_PER_BYTE)) & 0xff;
 536                writeb(bufbyte, reg);
 537        }
 538
 539        if (op->data.dir == SPI_MEM_DATA_OUT) {
 540                for (i = 0; i < op->dummy.nbytes; i++, reg_offset--) {
 541                        reg = sp->base + MTK_NOR_REG_PRGDATA(reg_offset);
 542                        writeb(0, reg);
 543                }
 544
 545                for (i = 0; i < op->data.nbytes; i++, reg_offset--) {
 546                        reg = sp->base + MTK_NOR_REG_PRGDATA(reg_offset);
 547                        writeb(((const u8 *)(op->data.buf.out))[i], reg);
 548                }
 549        }
 550
 551        for (; reg_offset >= 0; reg_offset--) {
 552                reg = sp->base + MTK_NOR_REG_PRGDATA(reg_offset);
 553                writeb(0, reg);
 554        }
 555
 556        // trigger op
 557        writel(prg_len * BITS_PER_BYTE, sp->base + MTK_NOR_REG_PRG_CNT);
 558        ret = mtk_nor_cmd_exec(sp, MTK_NOR_CMD_PROGRAM,
 559                               prg_len * BITS_PER_BYTE);
 560        if (ret)
 561                return ret;
 562
 563        // fetch read data
 564        reg_offset = 0;
 565        if (op->data.dir == SPI_MEM_DATA_IN) {
 566                for (i = op->data.nbytes - 1; i >= 0; i--, reg_offset++) {
 567                        reg = sp->base + MTK_NOR_REG_SHIFT(reg_offset);
 568                        ((u8 *)(op->data.buf.in))[i] = readb(reg);
 569                }
 570        }
 571
 572        return 0;
 573}
 574
 575static int mtk_nor_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
 576{
 577        struct mtk_nor *sp = spi_controller_get_devdata(mem->spi->master);
 578        int ret;
 579
 580        if ((op->data.nbytes == 0) ||
 581            ((op->addr.nbytes != 3) && (op->addr.nbytes != 4)))
 582                return mtk_nor_spi_mem_prg(sp, op);
 583
 584        if (op->data.dir == SPI_MEM_DATA_OUT) {
 585                mtk_nor_set_addr(sp, op);
 586                writeb(op->cmd.opcode, sp->base + MTK_NOR_REG_PRGDATA0);
 587                if (op->data.nbytes == MTK_NOR_PP_SIZE)
 588                        return mtk_nor_pp_buffered(sp, op);
 589                return mtk_nor_pp_unbuffered(sp, op);
 590        }
 591
 592        if ((op->data.dir == SPI_MEM_DATA_IN) && mtk_nor_match_read(op)) {
 593                ret = mtk_nor_write_buffer_disable(sp);
 594                if (ret < 0)
 595                        return ret;
 596                mtk_nor_setup_bus(sp, op);
 597                if (op->data.nbytes == 1) {
 598                        mtk_nor_set_addr(sp, op);
 599                        return mtk_nor_read_pio(sp, op);
 600                } else {
 601                        return mtk_nor_read_dma(sp, op);
 602                }
 603        }
 604
 605        return mtk_nor_spi_mem_prg(sp, op);
 606}
 607
 608static int mtk_nor_setup(struct spi_device *spi)
 609{
 610        struct mtk_nor *sp = spi_controller_get_devdata(spi->master);
 611
 612        if (spi->max_speed_hz && (spi->max_speed_hz < sp->spi_freq)) {
 613                dev_err(&spi->dev, "spi clock should be %u Hz.\n",
 614                        sp->spi_freq);
 615                return -EINVAL;
 616        }
 617        spi->max_speed_hz = sp->spi_freq;
 618
 619        return 0;
 620}
 621
 622static int mtk_nor_transfer_one_message(struct spi_controller *master,
 623                                        struct spi_message *m)
 624{
 625        struct mtk_nor *sp = spi_controller_get_devdata(master);
 626        struct spi_transfer *t = NULL;
 627        unsigned long trx_len = 0;
 628        int stat = 0;
 629        int reg_offset = MTK_NOR_REG_PRGDATA_MAX;
 630        void __iomem *reg;
 631        const u8 *txbuf;
 632        u8 *rxbuf;
 633        int i;
 634
 635        list_for_each_entry(t, &m->transfers, transfer_list) {
 636                txbuf = t->tx_buf;
 637                for (i = 0; i < t->len; i++, reg_offset--) {
 638                        reg = sp->base + MTK_NOR_REG_PRGDATA(reg_offset);
 639                        if (txbuf)
 640                                writeb(txbuf[i], reg);
 641                        else
 642                                writeb(0, reg);
 643                }
 644                trx_len += t->len;
 645        }
 646
 647        writel(trx_len * BITS_PER_BYTE, sp->base + MTK_NOR_REG_PRG_CNT);
 648
 649        stat = mtk_nor_cmd_exec(sp, MTK_NOR_CMD_PROGRAM,
 650                                trx_len * BITS_PER_BYTE);
 651        if (stat < 0)
 652                goto msg_done;
 653
 654        reg_offset = trx_len - 1;
 655        list_for_each_entry(t, &m->transfers, transfer_list) {
 656                rxbuf = t->rx_buf;
 657                for (i = 0; i < t->len; i++, reg_offset--) {
 658                        reg = sp->base + MTK_NOR_REG_SHIFT(reg_offset);
 659                        if (rxbuf)
 660                                rxbuf[i] = readb(reg);
 661                }
 662        }
 663
 664        m->actual_length = trx_len;
 665msg_done:
 666        m->status = stat;
 667        spi_finalize_current_message(master);
 668
 669        return 0;
 670}
 671
 672static void mtk_nor_disable_clk(struct mtk_nor *sp)
 673{
 674        clk_disable_unprepare(sp->spi_clk);
 675        clk_disable_unprepare(sp->ctlr_clk);
 676        clk_disable_unprepare(sp->axi_clk);
 677}
 678
 679static int mtk_nor_enable_clk(struct mtk_nor *sp)
 680{
 681        int ret;
 682
 683        ret = clk_prepare_enable(sp->spi_clk);
 684        if (ret)
 685                return ret;
 686
 687        ret = clk_prepare_enable(sp->ctlr_clk);
 688        if (ret) {
 689                clk_disable_unprepare(sp->spi_clk);
 690                return ret;
 691        }
 692
 693        ret = clk_prepare_enable(sp->axi_clk);
 694        if (ret) {
 695                clk_disable_unprepare(sp->spi_clk);
 696                clk_disable_unprepare(sp->ctlr_clk);
 697                return ret;
 698        }
 699
 700        return 0;
 701}
 702
 703static void mtk_nor_init(struct mtk_nor *sp)
 704{
 705        writel(0, sp->base + MTK_NOR_REG_IRQ_EN);
 706        writel(MTK_NOR_IRQ_MASK, sp->base + MTK_NOR_REG_IRQ_STAT);
 707
 708        writel(MTK_NOR_ENABLE_SF_CMD, sp->base + MTK_NOR_REG_WP);
 709        mtk_nor_rmw(sp, MTK_NOR_REG_CFG2, MTK_NOR_WR_CUSTOM_OP_EN, 0);
 710        mtk_nor_rmw(sp, MTK_NOR_REG_CFG3,
 711                    MTK_NOR_DISABLE_WREN | MTK_NOR_DISABLE_SR_POLL, 0);
 712}
 713
 714static irqreturn_t mtk_nor_irq_handler(int irq, void *data)
 715{
 716        struct mtk_nor *sp = data;
 717        u32 irq_status, irq_enabled;
 718
 719        irq_status = readl(sp->base + MTK_NOR_REG_IRQ_STAT);
 720        irq_enabled = readl(sp->base + MTK_NOR_REG_IRQ_EN);
 721        // write status back to clear interrupt
 722        writel(irq_status, sp->base + MTK_NOR_REG_IRQ_STAT);
 723
 724        if (!(irq_status & irq_enabled))
 725                return IRQ_NONE;
 726
 727        if (irq_status & MTK_NOR_IRQ_DMA) {
 728                complete(&sp->op_done);
 729                writel(0, sp->base + MTK_NOR_REG_IRQ_EN);
 730        }
 731
 732        return IRQ_HANDLED;
 733}
 734
 735static size_t mtk_max_msg_size(struct spi_device *spi)
 736{
 737        return MTK_NOR_PRG_MAX_SIZE;
 738}
 739
 740static const struct spi_controller_mem_ops mtk_nor_mem_ops = {
 741        .adjust_op_size = mtk_nor_adjust_op_size,
 742        .supports_op = mtk_nor_supports_op,
 743        .exec_op = mtk_nor_exec_op
 744};
 745
 746static const struct of_device_id mtk_nor_match[] = {
 747        { .compatible = "mediatek,mt8192-nor", .data = (void *)36 },
 748        { .compatible = "mediatek,mt8173-nor", .data = (void *)32 },
 749        { /* sentinel */ }
 750};
 751MODULE_DEVICE_TABLE(of, mtk_nor_match);
 752
 753static int mtk_nor_probe(struct platform_device *pdev)
 754{
 755        struct spi_controller *ctlr;
 756        struct mtk_nor *sp;
 757        void __iomem *base;
 758        struct clk *spi_clk, *ctlr_clk, *axi_clk;
 759        int ret, irq;
 760        unsigned long dma_bits;
 761
 762        base = devm_platform_ioremap_resource(pdev, 0);
 763        if (IS_ERR(base))
 764                return PTR_ERR(base);
 765
 766        spi_clk = devm_clk_get(&pdev->dev, "spi");
 767        if (IS_ERR(spi_clk))
 768                return PTR_ERR(spi_clk);
 769
 770        ctlr_clk = devm_clk_get(&pdev->dev, "sf");
 771        if (IS_ERR(ctlr_clk))
 772                return PTR_ERR(ctlr_clk);
 773
 774        axi_clk = devm_clk_get_optional(&pdev->dev, "axi");
 775        if (IS_ERR(axi_clk))
 776                return PTR_ERR(axi_clk);
 777
 778        dma_bits = (unsigned long)of_device_get_match_data(&pdev->dev);
 779        if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(dma_bits))) {
 780                dev_err(&pdev->dev, "failed to set dma mask(%lu)\n", dma_bits);
 781                return -EINVAL;
 782        }
 783
 784        ctlr = devm_spi_alloc_master(&pdev->dev, sizeof(*sp));
 785        if (!ctlr) {
 786                dev_err(&pdev->dev, "failed to allocate spi controller\n");
 787                return -ENOMEM;
 788        }
 789
 790        ctlr->bits_per_word_mask = SPI_BPW_MASK(8);
 791        ctlr->dev.of_node = pdev->dev.of_node;
 792        ctlr->max_message_size = mtk_max_msg_size;
 793        ctlr->mem_ops = &mtk_nor_mem_ops;
 794        ctlr->mode_bits = SPI_RX_DUAL | SPI_RX_QUAD | SPI_TX_DUAL | SPI_TX_QUAD;
 795        ctlr->num_chipselect = 1;
 796        ctlr->setup = mtk_nor_setup;
 797        ctlr->transfer_one_message = mtk_nor_transfer_one_message;
 798        ctlr->auto_runtime_pm = true;
 799
 800        dev_set_drvdata(&pdev->dev, ctlr);
 801
 802        sp = spi_controller_get_devdata(ctlr);
 803        sp->base = base;
 804        sp->has_irq = false;
 805        sp->wbuf_en = false;
 806        sp->ctlr = ctlr;
 807        sp->dev = &pdev->dev;
 808        sp->spi_clk = spi_clk;
 809        sp->ctlr_clk = ctlr_clk;
 810        sp->axi_clk = axi_clk;
 811        sp->high_dma = (dma_bits > 32);
 812        sp->buffer = dmam_alloc_coherent(&pdev->dev,
 813                                MTK_NOR_BOUNCE_BUF_SIZE + MTK_NOR_DMA_ALIGN,
 814                                &sp->buffer_dma, GFP_KERNEL);
 815        if (!sp->buffer)
 816                return -ENOMEM;
 817
 818        if ((uintptr_t)sp->buffer & MTK_NOR_DMA_ALIGN_MASK) {
 819                dev_err(sp->dev, "misaligned allocation of internal buffer.\n");
 820                return -ENOMEM;
 821        }
 822
 823        ret = mtk_nor_enable_clk(sp);
 824        if (ret < 0)
 825                return ret;
 826
 827        sp->spi_freq = clk_get_rate(sp->spi_clk);
 828
 829        mtk_nor_init(sp);
 830
 831        irq = platform_get_irq_optional(pdev, 0);
 832
 833        if (irq < 0) {
 834                dev_warn(sp->dev, "IRQ not available.");
 835        } else {
 836                ret = devm_request_irq(sp->dev, irq, mtk_nor_irq_handler, 0,
 837                                       pdev->name, sp);
 838                if (ret < 0) {
 839                        dev_warn(sp->dev, "failed to request IRQ.");
 840                } else {
 841                        init_completion(&sp->op_done);
 842                        sp->has_irq = true;
 843                }
 844        }
 845
 846        pm_runtime_set_autosuspend_delay(&pdev->dev, -1);
 847        pm_runtime_use_autosuspend(&pdev->dev);
 848        pm_runtime_set_active(&pdev->dev);
 849        pm_runtime_enable(&pdev->dev);
 850        pm_runtime_get_noresume(&pdev->dev);
 851
 852        ret = devm_spi_register_controller(&pdev->dev, ctlr);
 853        if (ret < 0)
 854                goto err_probe;
 855
 856        pm_runtime_mark_last_busy(&pdev->dev);
 857        pm_runtime_put_autosuspend(&pdev->dev);
 858
 859        dev_info(&pdev->dev, "spi frequency: %d Hz\n", sp->spi_freq);
 860
 861        return 0;
 862
 863err_probe:
 864        pm_runtime_disable(&pdev->dev);
 865        pm_runtime_set_suspended(&pdev->dev);
 866        pm_runtime_dont_use_autosuspend(&pdev->dev);
 867
 868        mtk_nor_disable_clk(sp);
 869
 870        return ret;
 871}
 872
 873static int mtk_nor_remove(struct platform_device *pdev)
 874{
 875        struct spi_controller *ctlr = dev_get_drvdata(&pdev->dev);
 876        struct mtk_nor *sp = spi_controller_get_devdata(ctlr);
 877
 878        pm_runtime_disable(&pdev->dev);
 879        pm_runtime_set_suspended(&pdev->dev);
 880        pm_runtime_dont_use_autosuspend(&pdev->dev);
 881
 882        mtk_nor_disable_clk(sp);
 883
 884        return 0;
 885}
 886
 887static int __maybe_unused mtk_nor_runtime_suspend(struct device *dev)
 888{
 889        struct spi_controller *ctlr = dev_get_drvdata(dev);
 890        struct mtk_nor *sp = spi_controller_get_devdata(ctlr);
 891
 892        mtk_nor_disable_clk(sp);
 893
 894        return 0;
 895}
 896
 897static int __maybe_unused mtk_nor_runtime_resume(struct device *dev)
 898{
 899        struct spi_controller *ctlr = dev_get_drvdata(dev);
 900        struct mtk_nor *sp = spi_controller_get_devdata(ctlr);
 901
 902        return mtk_nor_enable_clk(sp);
 903}
 904
 905static int __maybe_unused mtk_nor_suspend(struct device *dev)
 906{
 907        return pm_runtime_force_suspend(dev);
 908}
 909
 910static int __maybe_unused mtk_nor_resume(struct device *dev)
 911{
 912        return pm_runtime_force_resume(dev);
 913}
 914
 915static const struct dev_pm_ops mtk_nor_pm_ops = {
 916        SET_RUNTIME_PM_OPS(mtk_nor_runtime_suspend,
 917                           mtk_nor_runtime_resume, NULL)
 918        SET_SYSTEM_SLEEP_PM_OPS(mtk_nor_suspend, mtk_nor_resume)
 919};
 920
 921static struct platform_driver mtk_nor_driver = {
 922        .driver = {
 923                .name = DRIVER_NAME,
 924                .of_match_table = mtk_nor_match,
 925                .pm = &mtk_nor_pm_ops,
 926        },
 927        .probe = mtk_nor_probe,
 928        .remove = mtk_nor_remove,
 929};
 930
 931module_platform_driver(mtk_nor_driver);
 932
 933MODULE_DESCRIPTION("Mediatek SPI NOR controller driver");
 934MODULE_AUTHOR("Chuanhong Guo <gch981213@gmail.com>");
 935MODULE_LICENSE("GPL v2");
 936MODULE_ALIAS("platform:" DRIVER_NAME);
 937