linux/drivers/spi/spi-slave-mt27xx.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2// Copyright (c) 2018 MediaTek Inc.
   3
   4#include <linux/clk.h>
   5#include <linux/device.h>
   6#include <linux/dma-mapping.h>
   7#include <linux/err.h>
   8#include <linux/interrupt.h>
   9#include <linux/module.h>
  10#include <linux/platform_device.h>
  11#include <linux/pm_runtime.h>
  12#include <linux/spi/spi.h>
  13#include <linux/of.h>
  14
  15
  16#define SPIS_IRQ_EN_REG         0x0
  17#define SPIS_IRQ_CLR_REG        0x4
  18#define SPIS_IRQ_ST_REG         0x8
  19#define SPIS_IRQ_MASK_REG       0xc
  20#define SPIS_CFG_REG            0x10
  21#define SPIS_RX_DATA_REG        0x14
  22#define SPIS_TX_DATA_REG        0x18
  23#define SPIS_RX_DST_REG         0x1c
  24#define SPIS_TX_SRC_REG         0x20
  25#define SPIS_DMA_CFG_REG        0x30
  26#define SPIS_SOFT_RST_REG       0x40
  27
  28/* SPIS_IRQ_EN_REG */
  29#define DMA_DONE_EN             BIT(7)
  30#define DATA_DONE_EN            BIT(2)
  31#define RSTA_DONE_EN            BIT(1)
  32#define CMD_INVALID_EN          BIT(0)
  33
  34/* SPIS_IRQ_ST_REG */
  35#define DMA_DONE_ST             BIT(7)
  36#define DATA_DONE_ST            BIT(2)
  37#define RSTA_DONE_ST            BIT(1)
  38#define CMD_INVALID_ST          BIT(0)
  39
  40/* SPIS_IRQ_MASK_REG */
  41#define DMA_DONE_MASK           BIT(7)
  42#define DATA_DONE_MASK          BIT(2)
  43#define RSTA_DONE_MASK          BIT(1)
  44#define CMD_INVALID_MASK        BIT(0)
  45
  46/* SPIS_CFG_REG */
  47#define SPIS_TX_ENDIAN          BIT(7)
  48#define SPIS_RX_ENDIAN          BIT(6)
  49#define SPIS_TXMSBF             BIT(5)
  50#define SPIS_RXMSBF             BIT(4)
  51#define SPIS_CPHA               BIT(3)
  52#define SPIS_CPOL               BIT(2)
  53#define SPIS_TX_EN              BIT(1)
  54#define SPIS_RX_EN              BIT(0)
  55
  56/* SPIS_DMA_CFG_REG */
  57#define TX_DMA_TRIG_EN          BIT(31)
  58#define TX_DMA_EN               BIT(30)
  59#define RX_DMA_EN               BIT(29)
  60#define TX_DMA_LEN              0xfffff
  61
  62/* SPIS_SOFT_RST_REG */
  63#define SPIS_DMA_ADDR_EN        BIT(1)
  64#define SPIS_SOFT_RST           BIT(0)
  65
  66struct mtk_spi_slave {
  67        struct device *dev;
  68        void __iomem *base;
  69        struct clk *spi_clk;
  70        struct completion xfer_done;
  71        struct spi_transfer *cur_transfer;
  72        bool slave_aborted;
  73        const struct mtk_spi_compatible *dev_comp;
  74};
  75
  76struct mtk_spi_compatible {
  77        const u32 max_fifo_size;
  78        bool must_rx;
  79};
  80
  81static const struct mtk_spi_compatible mt2712_compat = {
  82        .max_fifo_size = 512,
  83};
  84static const struct mtk_spi_compatible mt8195_compat = {
  85        .max_fifo_size = 128,
  86        .must_rx = true,
  87};
  88
  89static const struct of_device_id mtk_spi_slave_of_match[] = {
  90        { .compatible = "mediatek,mt2712-spi-slave",
  91          .data = (void *)&mt2712_compat,},
  92        { .compatible = "mediatek,mt8195-spi-slave",
  93          .data = (void *)&mt8195_compat,},
  94        {}
  95};
  96MODULE_DEVICE_TABLE(of, mtk_spi_slave_of_match);
  97
  98static void mtk_spi_slave_disable_dma(struct mtk_spi_slave *mdata)
  99{
 100        u32 reg_val;
 101
 102        reg_val = readl(mdata->base + SPIS_DMA_CFG_REG);
 103        reg_val &= ~RX_DMA_EN;
 104        reg_val &= ~TX_DMA_EN;
 105        writel(reg_val, mdata->base + SPIS_DMA_CFG_REG);
 106}
 107
 108static void mtk_spi_slave_disable_xfer(struct mtk_spi_slave *mdata)
 109{
 110        u32 reg_val;
 111
 112        reg_val = readl(mdata->base + SPIS_CFG_REG);
 113        reg_val &= ~SPIS_TX_EN;
 114        reg_val &= ~SPIS_RX_EN;
 115        writel(reg_val, mdata->base + SPIS_CFG_REG);
 116}
 117
 118static int mtk_spi_slave_wait_for_completion(struct mtk_spi_slave *mdata)
 119{
 120        if (wait_for_completion_interruptible(&mdata->xfer_done) ||
 121            mdata->slave_aborted) {
 122                dev_err(mdata->dev, "interrupted\n");
 123                return -EINTR;
 124        }
 125
 126        return 0;
 127}
 128
 129static int mtk_spi_slave_prepare_message(struct spi_controller *ctlr,
 130                                         struct spi_message *msg)
 131{
 132        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 133        struct spi_device *spi = msg->spi;
 134        bool cpha, cpol;
 135        u32 reg_val;
 136
 137        cpha = spi->mode & SPI_CPHA ? 1 : 0;
 138        cpol = spi->mode & SPI_CPOL ? 1 : 0;
 139
 140        reg_val = readl(mdata->base + SPIS_CFG_REG);
 141        if (cpha)
 142                reg_val |= SPIS_CPHA;
 143        else
 144                reg_val &= ~SPIS_CPHA;
 145        if (cpol)
 146                reg_val |= SPIS_CPOL;
 147        else
 148                reg_val &= ~SPIS_CPOL;
 149
 150        if (spi->mode & SPI_LSB_FIRST)
 151                reg_val &= ~(SPIS_TXMSBF | SPIS_RXMSBF);
 152        else
 153                reg_val |= SPIS_TXMSBF | SPIS_RXMSBF;
 154
 155        reg_val &= ~SPIS_TX_ENDIAN;
 156        reg_val &= ~SPIS_RX_ENDIAN;
 157        writel(reg_val, mdata->base + SPIS_CFG_REG);
 158
 159        return 0;
 160}
 161
 162static int mtk_spi_slave_fifo_transfer(struct spi_controller *ctlr,
 163                                       struct spi_device *spi,
 164                                       struct spi_transfer *xfer)
 165{
 166        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 167        int reg_val, cnt, remainder, ret;
 168
 169        writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG);
 170
 171        reg_val = readl(mdata->base + SPIS_CFG_REG);
 172        if (xfer->rx_buf)
 173                reg_val |= SPIS_RX_EN;
 174        if (xfer->tx_buf)
 175                reg_val |= SPIS_TX_EN;
 176        writel(reg_val, mdata->base + SPIS_CFG_REG);
 177
 178        cnt = xfer->len / 4;
 179        if (xfer->tx_buf)
 180                iowrite32_rep(mdata->base + SPIS_TX_DATA_REG,
 181                              xfer->tx_buf, cnt);
 182
 183        remainder = xfer->len % 4;
 184        if (xfer->tx_buf && remainder > 0) {
 185                reg_val = 0;
 186                memcpy(&reg_val, xfer->tx_buf + cnt * 4, remainder);
 187                writel(reg_val, mdata->base + SPIS_TX_DATA_REG);
 188        }
 189
 190        ret = mtk_spi_slave_wait_for_completion(mdata);
 191        if (ret) {
 192                mtk_spi_slave_disable_xfer(mdata);
 193                writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG);
 194        }
 195
 196        return ret;
 197}
 198
 199static int mtk_spi_slave_dma_transfer(struct spi_controller *ctlr,
 200                                      struct spi_device *spi,
 201                                      struct spi_transfer *xfer)
 202{
 203        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 204        struct device *dev = mdata->dev;
 205        int reg_val, ret;
 206
 207        writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG);
 208
 209        if (xfer->tx_buf) {
 210                /* tx_buf is a const void* where we need a void * for
 211                 * the dma mapping
 212                 */
 213                void *nonconst_tx = (void *)xfer->tx_buf;
 214
 215                xfer->tx_dma = dma_map_single(dev, nonconst_tx,
 216                                              xfer->len, DMA_TO_DEVICE);
 217                if (dma_mapping_error(dev, xfer->tx_dma)) {
 218                        ret = -ENOMEM;
 219                        goto disable_transfer;
 220                }
 221        }
 222
 223        if (xfer->rx_buf) {
 224                xfer->rx_dma = dma_map_single(dev, xfer->rx_buf,
 225                                              xfer->len, DMA_FROM_DEVICE);
 226                if (dma_mapping_error(dev, xfer->rx_dma)) {
 227                        ret = -ENOMEM;
 228                        goto unmap_txdma;
 229                }
 230        }
 231
 232        writel(xfer->tx_dma, mdata->base + SPIS_TX_SRC_REG);
 233        writel(xfer->rx_dma, mdata->base + SPIS_RX_DST_REG);
 234
 235        writel(SPIS_DMA_ADDR_EN, mdata->base + SPIS_SOFT_RST_REG);
 236
 237        /* enable config reg tx rx_enable */
 238        reg_val = readl(mdata->base + SPIS_CFG_REG);
 239        if (xfer->tx_buf)
 240                reg_val |= SPIS_TX_EN;
 241        if (xfer->rx_buf)
 242                reg_val |= SPIS_RX_EN;
 243        writel(reg_val, mdata->base + SPIS_CFG_REG);
 244
 245        /* config dma */
 246        reg_val = 0;
 247        reg_val |= (xfer->len - 1) & TX_DMA_LEN;
 248        writel(reg_val, mdata->base + SPIS_DMA_CFG_REG);
 249
 250        reg_val = readl(mdata->base + SPIS_DMA_CFG_REG);
 251        if (xfer->tx_buf)
 252                reg_val |= TX_DMA_EN;
 253        if (xfer->rx_buf)
 254                reg_val |= RX_DMA_EN;
 255        reg_val |= TX_DMA_TRIG_EN;
 256        writel(reg_val, mdata->base + SPIS_DMA_CFG_REG);
 257
 258        ret = mtk_spi_slave_wait_for_completion(mdata);
 259        if (ret)
 260                goto unmap_rxdma;
 261
 262        return 0;
 263
 264unmap_rxdma:
 265        if (xfer->rx_buf)
 266                dma_unmap_single(dev, xfer->rx_dma,
 267                                 xfer->len, DMA_FROM_DEVICE);
 268
 269unmap_txdma:
 270        if (xfer->tx_buf)
 271                dma_unmap_single(dev, xfer->tx_dma,
 272                                 xfer->len, DMA_TO_DEVICE);
 273
 274disable_transfer:
 275        mtk_spi_slave_disable_dma(mdata);
 276        mtk_spi_slave_disable_xfer(mdata);
 277        writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG);
 278
 279        return ret;
 280}
 281
 282static int mtk_spi_slave_transfer_one(struct spi_controller *ctlr,
 283                                      struct spi_device *spi,
 284                                      struct spi_transfer *xfer)
 285{
 286        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 287
 288        reinit_completion(&mdata->xfer_done);
 289        mdata->slave_aborted = false;
 290        mdata->cur_transfer = xfer;
 291
 292        if (xfer->len > mdata->dev_comp->max_fifo_size)
 293                return mtk_spi_slave_dma_transfer(ctlr, spi, xfer);
 294        else
 295                return mtk_spi_slave_fifo_transfer(ctlr, spi, xfer);
 296}
 297
 298static int mtk_spi_slave_setup(struct spi_device *spi)
 299{
 300        struct mtk_spi_slave *mdata = spi_controller_get_devdata(spi->master);
 301        u32 reg_val;
 302
 303        reg_val = DMA_DONE_EN | DATA_DONE_EN |
 304                  RSTA_DONE_EN | CMD_INVALID_EN;
 305        writel(reg_val, mdata->base + SPIS_IRQ_EN_REG);
 306
 307        reg_val = DMA_DONE_MASK | DATA_DONE_MASK |
 308                  RSTA_DONE_MASK | CMD_INVALID_MASK;
 309        writel(reg_val, mdata->base + SPIS_IRQ_MASK_REG);
 310
 311        mtk_spi_slave_disable_dma(mdata);
 312        mtk_spi_slave_disable_xfer(mdata);
 313
 314        return 0;
 315}
 316
 317static int mtk_slave_abort(struct spi_controller *ctlr)
 318{
 319        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 320
 321        mdata->slave_aborted = true;
 322        complete(&mdata->xfer_done);
 323
 324        return 0;
 325}
 326
 327static irqreturn_t mtk_spi_slave_interrupt(int irq, void *dev_id)
 328{
 329        struct spi_controller *ctlr = dev_id;
 330        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 331        struct spi_transfer *trans = mdata->cur_transfer;
 332        u32 int_status, reg_val, cnt, remainder;
 333
 334        int_status = readl(mdata->base + SPIS_IRQ_ST_REG);
 335        writel(int_status, mdata->base + SPIS_IRQ_CLR_REG);
 336
 337        if (!trans)
 338                return IRQ_NONE;
 339
 340        if ((int_status & DMA_DONE_ST) &&
 341            ((int_status & DATA_DONE_ST) ||
 342            (int_status & RSTA_DONE_ST))) {
 343                writel(SPIS_SOFT_RST, mdata->base + SPIS_SOFT_RST_REG);
 344
 345                if (trans->tx_buf)
 346                        dma_unmap_single(mdata->dev, trans->tx_dma,
 347                                         trans->len, DMA_TO_DEVICE);
 348                if (trans->rx_buf)
 349                        dma_unmap_single(mdata->dev, trans->rx_dma,
 350                                         trans->len, DMA_FROM_DEVICE);
 351
 352                mtk_spi_slave_disable_dma(mdata);
 353                mtk_spi_slave_disable_xfer(mdata);
 354        }
 355
 356        if ((!(int_status & DMA_DONE_ST)) &&
 357            ((int_status & DATA_DONE_ST) ||
 358            (int_status & RSTA_DONE_ST))) {
 359                cnt = trans->len / 4;
 360                if (trans->rx_buf)
 361                        ioread32_rep(mdata->base + SPIS_RX_DATA_REG,
 362                                     trans->rx_buf, cnt);
 363                remainder = trans->len % 4;
 364                if (trans->rx_buf && remainder > 0) {
 365                        reg_val = readl(mdata->base + SPIS_RX_DATA_REG);
 366                        memcpy(trans->rx_buf + (cnt * 4),
 367                               &reg_val, remainder);
 368                }
 369
 370                mtk_spi_slave_disable_xfer(mdata);
 371        }
 372
 373        if (int_status & CMD_INVALID_ST) {
 374                dev_warn(&ctlr->dev, "cmd invalid\n");
 375                return IRQ_NONE;
 376        }
 377
 378        mdata->cur_transfer = NULL;
 379        complete(&mdata->xfer_done);
 380
 381        return IRQ_HANDLED;
 382}
 383
 384static int mtk_spi_slave_probe(struct platform_device *pdev)
 385{
 386        struct spi_controller *ctlr;
 387        struct mtk_spi_slave *mdata;
 388        int irq, ret;
 389        const struct of_device_id *of_id;
 390
 391        ctlr = spi_alloc_slave(&pdev->dev, sizeof(*mdata));
 392        if (!ctlr) {
 393                dev_err(&pdev->dev, "failed to alloc spi slave\n");
 394                return -ENOMEM;
 395        }
 396
 397        ctlr->auto_runtime_pm = true;
 398        ctlr->dev.of_node = pdev->dev.of_node;
 399        ctlr->mode_bits = SPI_CPOL | SPI_CPHA;
 400        ctlr->mode_bits |= SPI_LSB_FIRST;
 401
 402        ctlr->prepare_message = mtk_spi_slave_prepare_message;
 403        ctlr->transfer_one = mtk_spi_slave_transfer_one;
 404        ctlr->setup = mtk_spi_slave_setup;
 405        ctlr->slave_abort = mtk_slave_abort;
 406
 407        of_id = of_match_node(mtk_spi_slave_of_match, pdev->dev.of_node);
 408        if (!of_id) {
 409                dev_err(&pdev->dev, "failed to probe of_node\n");
 410                ret = -EINVAL;
 411                goto err_put_ctlr;
 412        }
 413        mdata = spi_controller_get_devdata(ctlr);
 414        mdata->dev_comp = of_id->data;
 415
 416        if (mdata->dev_comp->must_rx)
 417                ctlr->flags = SPI_MASTER_MUST_RX;
 418
 419        platform_set_drvdata(pdev, ctlr);
 420
 421        init_completion(&mdata->xfer_done);
 422        mdata->dev = &pdev->dev;
 423        mdata->base = devm_platform_ioremap_resource(pdev, 0);
 424        if (IS_ERR(mdata->base)) {
 425                ret = PTR_ERR(mdata->base);
 426                goto err_put_ctlr;
 427        }
 428
 429        irq = platform_get_irq(pdev, 0);
 430        if (irq < 0) {
 431                ret = irq;
 432                goto err_put_ctlr;
 433        }
 434
 435        ret = devm_request_irq(&pdev->dev, irq, mtk_spi_slave_interrupt,
 436                               IRQF_TRIGGER_NONE, dev_name(&pdev->dev), ctlr);
 437        if (ret) {
 438                dev_err(&pdev->dev, "failed to register irq (%d)\n", ret);
 439                goto err_put_ctlr;
 440        }
 441
 442        mdata->spi_clk = devm_clk_get(&pdev->dev, "spi");
 443        if (IS_ERR(mdata->spi_clk)) {
 444                ret = PTR_ERR(mdata->spi_clk);
 445                dev_err(&pdev->dev, "failed to get spi-clk: %d\n", ret);
 446                goto err_put_ctlr;
 447        }
 448
 449        ret = clk_prepare_enable(mdata->spi_clk);
 450        if (ret < 0) {
 451                dev_err(&pdev->dev, "failed to enable spi_clk (%d)\n", ret);
 452                goto err_put_ctlr;
 453        }
 454
 455        pm_runtime_enable(&pdev->dev);
 456
 457        ret = devm_spi_register_controller(&pdev->dev, ctlr);
 458        if (ret) {
 459                dev_err(&pdev->dev,
 460                        "failed to register slave controller(%d)\n", ret);
 461                clk_disable_unprepare(mdata->spi_clk);
 462                goto err_disable_runtime_pm;
 463        }
 464
 465        clk_disable_unprepare(mdata->spi_clk);
 466
 467        return 0;
 468
 469err_disable_runtime_pm:
 470        pm_runtime_disable(&pdev->dev);
 471err_put_ctlr:
 472        spi_controller_put(ctlr);
 473
 474        return ret;
 475}
 476
 477static int mtk_spi_slave_remove(struct platform_device *pdev)
 478{
 479        pm_runtime_disable(&pdev->dev);
 480
 481        return 0;
 482}
 483
 484#ifdef CONFIG_PM_SLEEP
 485static int mtk_spi_slave_suspend(struct device *dev)
 486{
 487        struct spi_controller *ctlr = dev_get_drvdata(dev);
 488        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 489        int ret;
 490
 491        ret = spi_controller_suspend(ctlr);
 492        if (ret)
 493                return ret;
 494
 495        if (!pm_runtime_suspended(dev))
 496                clk_disable_unprepare(mdata->spi_clk);
 497
 498        return ret;
 499}
 500
 501static int mtk_spi_slave_resume(struct device *dev)
 502{
 503        struct spi_controller *ctlr = dev_get_drvdata(dev);
 504        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 505        int ret;
 506
 507        if (!pm_runtime_suspended(dev)) {
 508                ret = clk_prepare_enable(mdata->spi_clk);
 509                if (ret < 0) {
 510                        dev_err(dev, "failed to enable spi_clk (%d)\n", ret);
 511                        return ret;
 512                }
 513        }
 514
 515        ret = spi_controller_resume(ctlr);
 516        if (ret < 0)
 517                clk_disable_unprepare(mdata->spi_clk);
 518
 519        return ret;
 520}
 521#endif /* CONFIG_PM_SLEEP */
 522
 523#ifdef CONFIG_PM
 524static int mtk_spi_slave_runtime_suspend(struct device *dev)
 525{
 526        struct spi_controller *ctlr = dev_get_drvdata(dev);
 527        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 528
 529        clk_disable_unprepare(mdata->spi_clk);
 530
 531        return 0;
 532}
 533
 534static int mtk_spi_slave_runtime_resume(struct device *dev)
 535{
 536        struct spi_controller *ctlr = dev_get_drvdata(dev);
 537        struct mtk_spi_slave *mdata = spi_controller_get_devdata(ctlr);
 538        int ret;
 539
 540        ret = clk_prepare_enable(mdata->spi_clk);
 541        if (ret < 0) {
 542                dev_err(dev, "failed to enable spi_clk (%d)\n", ret);
 543                return ret;
 544        }
 545
 546        return 0;
 547}
 548#endif /* CONFIG_PM */
 549
 550static const struct dev_pm_ops mtk_spi_slave_pm = {
 551        SET_SYSTEM_SLEEP_PM_OPS(mtk_spi_slave_suspend, mtk_spi_slave_resume)
 552        SET_RUNTIME_PM_OPS(mtk_spi_slave_runtime_suspend,
 553                           mtk_spi_slave_runtime_resume, NULL)
 554};
 555
 556static struct platform_driver mtk_spi_slave_driver = {
 557        .driver = {
 558                .name = "mtk-spi-slave",
 559                .pm     = &mtk_spi_slave_pm,
 560                .of_match_table = mtk_spi_slave_of_match,
 561        },
 562        .probe = mtk_spi_slave_probe,
 563        .remove = mtk_spi_slave_remove,
 564};
 565
 566module_platform_driver(mtk_spi_slave_driver);
 567
 568MODULE_DESCRIPTION("MTK SPI Slave Controller driver");
 569MODULE_AUTHOR("Leilk Liu <leilk.liu@mediatek.com>");
 570MODULE_LICENSE("GPL v2");
 571MODULE_ALIAS("platform:mtk-spi-slave");
 572