linux/drivers/spi/spi-armada-3700.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Marvell Armada-3700 SPI controller driver
   4 *
   5 * Copyright (C) 2016 Marvell Ltd.
   6 *
   7 * Author: Wilson Ding <dingwei@marvell.com>
   8 * Author: Romain Perier <romain.perier@free-electrons.com>
   9 */
  10
  11#include <linux/clk.h>
  12#include <linux/completion.h>
  13#include <linux/delay.h>
  14#include <linux/err.h>
  15#include <linux/interrupt.h>
  16#include <linux/io.h>
  17#include <linux/kernel.h>
  18#include <linux/module.h>
  19#include <linux/of.h>
  20#include <linux/of_irq.h>
  21#include <linux/of_device.h>
  22#include <linux/pinctrl/consumer.h>
  23#include <linux/spi/spi.h>
  24
  25#define DRIVER_NAME                     "armada_3700_spi"
  26
  27#define A3700_SPI_MAX_SPEED_HZ          100000000
  28#define A3700_SPI_MAX_PRESCALE          30
  29#define A3700_SPI_TIMEOUT               10
  30
  31/* SPI Register Offest */
  32#define A3700_SPI_IF_CTRL_REG           0x00
  33#define A3700_SPI_IF_CFG_REG            0x04
  34#define A3700_SPI_DATA_OUT_REG          0x08
  35#define A3700_SPI_DATA_IN_REG           0x0C
  36#define A3700_SPI_IF_INST_REG           0x10
  37#define A3700_SPI_IF_ADDR_REG           0x14
  38#define A3700_SPI_IF_RMODE_REG          0x18
  39#define A3700_SPI_IF_HDR_CNT_REG        0x1C
  40#define A3700_SPI_IF_DIN_CNT_REG        0x20
  41#define A3700_SPI_IF_TIME_REG           0x24
  42#define A3700_SPI_INT_STAT_REG          0x28
  43#define A3700_SPI_INT_MASK_REG          0x2C
  44
  45/* A3700_SPI_IF_CTRL_REG */
  46#define A3700_SPI_EN                    BIT(16)
  47#define A3700_SPI_ADDR_NOT_CONFIG       BIT(12)
  48#define A3700_SPI_WFIFO_OVERFLOW        BIT(11)
  49#define A3700_SPI_WFIFO_UNDERFLOW       BIT(10)
  50#define A3700_SPI_RFIFO_OVERFLOW        BIT(9)
  51#define A3700_SPI_RFIFO_UNDERFLOW       BIT(8)
  52#define A3700_SPI_WFIFO_FULL            BIT(7)
  53#define A3700_SPI_WFIFO_EMPTY           BIT(6)
  54#define A3700_SPI_RFIFO_FULL            BIT(5)
  55#define A3700_SPI_RFIFO_EMPTY           BIT(4)
  56#define A3700_SPI_WFIFO_RDY             BIT(3)
  57#define A3700_SPI_RFIFO_RDY             BIT(2)
  58#define A3700_SPI_XFER_RDY              BIT(1)
  59#define A3700_SPI_XFER_DONE             BIT(0)
  60
  61/* A3700_SPI_IF_CFG_REG */
  62#define A3700_SPI_WFIFO_THRS            BIT(28)
  63#define A3700_SPI_RFIFO_THRS            BIT(24)
  64#define A3700_SPI_AUTO_CS               BIT(20)
  65#define A3700_SPI_DMA_RD_EN             BIT(18)
  66#define A3700_SPI_FIFO_MODE             BIT(17)
  67#define A3700_SPI_SRST                  BIT(16)
  68#define A3700_SPI_XFER_START            BIT(15)
  69#define A3700_SPI_XFER_STOP             BIT(14)
  70#define A3700_SPI_INST_PIN              BIT(13)
  71#define A3700_SPI_ADDR_PIN              BIT(12)
  72#define A3700_SPI_DATA_PIN1             BIT(11)
  73#define A3700_SPI_DATA_PIN0             BIT(10)
  74#define A3700_SPI_FIFO_FLUSH            BIT(9)
  75#define A3700_SPI_RW_EN                 BIT(8)
  76#define A3700_SPI_CLK_POL               BIT(7)
  77#define A3700_SPI_CLK_PHA               BIT(6)
  78#define A3700_SPI_BYTE_LEN              BIT(5)
  79#define A3700_SPI_CLK_PRESCALE          BIT(0)
  80#define A3700_SPI_CLK_PRESCALE_MASK     (0x1f)
  81#define A3700_SPI_CLK_EVEN_OFFS         (0x10)
  82
  83#define A3700_SPI_WFIFO_THRS_BIT        28
  84#define A3700_SPI_RFIFO_THRS_BIT        24
  85#define A3700_SPI_FIFO_THRS_MASK        0x7
  86
  87#define A3700_SPI_DATA_PIN_MASK         0x3
  88
  89/* A3700_SPI_IF_HDR_CNT_REG */
  90#define A3700_SPI_DUMMY_CNT_BIT         12
  91#define A3700_SPI_DUMMY_CNT_MASK        0x7
  92#define A3700_SPI_RMODE_CNT_BIT         8
  93#define A3700_SPI_RMODE_CNT_MASK        0x3
  94#define A3700_SPI_ADDR_CNT_BIT          4
  95#define A3700_SPI_ADDR_CNT_MASK         0x7
  96#define A3700_SPI_INSTR_CNT_BIT         0
  97#define A3700_SPI_INSTR_CNT_MASK        0x3
  98
  99/* A3700_SPI_IF_TIME_REG */
 100#define A3700_SPI_CLK_CAPT_EDGE         BIT(7)
 101
 102struct a3700_spi {
 103        struct spi_master *master;
 104        void __iomem *base;
 105        struct clk *clk;
 106        unsigned int irq;
 107        unsigned int flags;
 108        bool xmit_data;
 109        const u8 *tx_buf;
 110        u8 *rx_buf;
 111        size_t buf_len;
 112        u8 byte_len;
 113        u32 wait_mask;
 114        struct completion done;
 115};
 116
 117static u32 spireg_read(struct a3700_spi *a3700_spi, u32 offset)
 118{
 119        return readl(a3700_spi->base + offset);
 120}
 121
 122static void spireg_write(struct a3700_spi *a3700_spi, u32 offset, u32 data)
 123{
 124        writel(data, a3700_spi->base + offset);
 125}
 126
 127static void a3700_spi_auto_cs_unset(struct a3700_spi *a3700_spi)
 128{
 129        u32 val;
 130
 131        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 132        val &= ~A3700_SPI_AUTO_CS;
 133        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 134}
 135
 136static void a3700_spi_activate_cs(struct a3700_spi *a3700_spi, unsigned int cs)
 137{
 138        u32 val;
 139
 140        val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG);
 141        val |= (A3700_SPI_EN << cs);
 142        spireg_write(a3700_spi, A3700_SPI_IF_CTRL_REG, val);
 143}
 144
 145static void a3700_spi_deactivate_cs(struct a3700_spi *a3700_spi,
 146                                    unsigned int cs)
 147{
 148        u32 val;
 149
 150        val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG);
 151        val &= ~(A3700_SPI_EN << cs);
 152        spireg_write(a3700_spi, A3700_SPI_IF_CTRL_REG, val);
 153}
 154
 155static int a3700_spi_pin_mode_set(struct a3700_spi *a3700_spi,
 156                                  unsigned int pin_mode, bool receiving)
 157{
 158        u32 val;
 159
 160        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 161        val &= ~(A3700_SPI_INST_PIN | A3700_SPI_ADDR_PIN);
 162        val &= ~(A3700_SPI_DATA_PIN0 | A3700_SPI_DATA_PIN1);
 163
 164        switch (pin_mode) {
 165        case SPI_NBITS_SINGLE:
 166                break;
 167        case SPI_NBITS_DUAL:
 168                val |= A3700_SPI_DATA_PIN0;
 169                break;
 170        case SPI_NBITS_QUAD:
 171                val |= A3700_SPI_DATA_PIN1;
 172                /* RX during address reception uses 4-pin */
 173                if (receiving)
 174                        val |= A3700_SPI_ADDR_PIN;
 175                break;
 176        default:
 177                dev_err(&a3700_spi->master->dev, "wrong pin mode %u", pin_mode);
 178                return -EINVAL;
 179        }
 180
 181        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 182
 183        return 0;
 184}
 185
 186static void a3700_spi_fifo_mode_set(struct a3700_spi *a3700_spi, bool enable)
 187{
 188        u32 val;
 189
 190        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 191        if (enable)
 192                val |= A3700_SPI_FIFO_MODE;
 193        else
 194                val &= ~A3700_SPI_FIFO_MODE;
 195        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 196}
 197
 198static void a3700_spi_mode_set(struct a3700_spi *a3700_spi,
 199                               unsigned int mode_bits)
 200{
 201        u32 val;
 202
 203        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 204
 205        if (mode_bits & SPI_CPOL)
 206                val |= A3700_SPI_CLK_POL;
 207        else
 208                val &= ~A3700_SPI_CLK_POL;
 209
 210        if (mode_bits & SPI_CPHA)
 211                val |= A3700_SPI_CLK_PHA;
 212        else
 213                val &= ~A3700_SPI_CLK_PHA;
 214
 215        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 216}
 217
 218static void a3700_spi_clock_set(struct a3700_spi *a3700_spi,
 219                                unsigned int speed_hz)
 220{
 221        u32 val;
 222        u32 prescale;
 223
 224        prescale = DIV_ROUND_UP(clk_get_rate(a3700_spi->clk), speed_hz);
 225
 226        /* For prescaler values over 15, we can only set it by steps of 2.
 227         * Starting from A3700_SPI_CLK_EVEN_OFFS, we set values from 0 up to
 228         * 30. We only use this range from 16 to 30.
 229         */
 230        if (prescale > 15)
 231                prescale = A3700_SPI_CLK_EVEN_OFFS + DIV_ROUND_UP(prescale, 2);
 232
 233        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 234        val = val & ~A3700_SPI_CLK_PRESCALE_MASK;
 235
 236        val = val | (prescale & A3700_SPI_CLK_PRESCALE_MASK);
 237        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 238
 239        if (prescale <= 2) {
 240                val = spireg_read(a3700_spi, A3700_SPI_IF_TIME_REG);
 241                val |= A3700_SPI_CLK_CAPT_EDGE;
 242                spireg_write(a3700_spi, A3700_SPI_IF_TIME_REG, val);
 243        }
 244}
 245
 246static void a3700_spi_bytelen_set(struct a3700_spi *a3700_spi, unsigned int len)
 247{
 248        u32 val;
 249
 250        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 251        if (len == 4)
 252                val |= A3700_SPI_BYTE_LEN;
 253        else
 254                val &= ~A3700_SPI_BYTE_LEN;
 255        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 256
 257        a3700_spi->byte_len = len;
 258}
 259
 260static int a3700_spi_fifo_flush(struct a3700_spi *a3700_spi)
 261{
 262        int timeout = A3700_SPI_TIMEOUT;
 263        u32 val;
 264
 265        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 266        val |= A3700_SPI_FIFO_FLUSH;
 267        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 268
 269        while (--timeout) {
 270                val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 271                if (!(val & A3700_SPI_FIFO_FLUSH))
 272                        return 0;
 273                udelay(1);
 274        }
 275
 276        return -ETIMEDOUT;
 277}
 278
 279static void a3700_spi_init(struct a3700_spi *a3700_spi)
 280{
 281        struct spi_master *master = a3700_spi->master;
 282        u32 val;
 283        int i;
 284
 285        /* Reset SPI unit */
 286        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 287        val |= A3700_SPI_SRST;
 288        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 289
 290        udelay(A3700_SPI_TIMEOUT);
 291
 292        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 293        val &= ~A3700_SPI_SRST;
 294        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 295
 296        /* Disable AUTO_CS and deactivate all chip-selects */
 297        a3700_spi_auto_cs_unset(a3700_spi);
 298        for (i = 0; i < master->num_chipselect; i++)
 299                a3700_spi_deactivate_cs(a3700_spi, i);
 300
 301        /* Enable FIFO mode */
 302        a3700_spi_fifo_mode_set(a3700_spi, true);
 303
 304        /* Set SPI mode */
 305        a3700_spi_mode_set(a3700_spi, master->mode_bits);
 306
 307        /* Reset counters */
 308        spireg_write(a3700_spi, A3700_SPI_IF_HDR_CNT_REG, 0);
 309        spireg_write(a3700_spi, A3700_SPI_IF_DIN_CNT_REG, 0);
 310
 311        /* Mask the interrupts and clear cause bits */
 312        spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG, 0);
 313        spireg_write(a3700_spi, A3700_SPI_INT_STAT_REG, ~0U);
 314}
 315
 316static irqreturn_t a3700_spi_interrupt(int irq, void *dev_id)
 317{
 318        struct spi_master *master = dev_id;
 319        struct a3700_spi *a3700_spi;
 320        u32 cause;
 321
 322        a3700_spi = spi_master_get_devdata(master);
 323
 324        /* Get interrupt causes */
 325        cause = spireg_read(a3700_spi, A3700_SPI_INT_STAT_REG);
 326
 327        if (!cause || !(a3700_spi->wait_mask & cause))
 328                return IRQ_NONE;
 329
 330        /* mask and acknowledge the SPI interrupts */
 331        spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG, 0);
 332        spireg_write(a3700_spi, A3700_SPI_INT_STAT_REG, cause);
 333
 334        /* Wake up the transfer */
 335        complete(&a3700_spi->done);
 336
 337        return IRQ_HANDLED;
 338}
 339
 340static bool a3700_spi_wait_completion(struct spi_device *spi)
 341{
 342        struct a3700_spi *a3700_spi;
 343        unsigned int timeout;
 344        unsigned int ctrl_reg;
 345        unsigned long timeout_jiffies;
 346
 347        a3700_spi = spi_master_get_devdata(spi->master);
 348
 349        /* SPI interrupt is edge-triggered, which means an interrupt will
 350         * be generated only when detecting a specific status bit changed
 351         * from '0' to '1'. So when we start waiting for a interrupt, we
 352         * need to check status bit in control reg first, if it is already 1,
 353         * then we do not need to wait for interrupt
 354         */
 355        ctrl_reg = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG);
 356        if (a3700_spi->wait_mask & ctrl_reg)
 357                return true;
 358
 359        reinit_completion(&a3700_spi->done);
 360
 361        spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG,
 362                     a3700_spi->wait_mask);
 363
 364        timeout_jiffies = msecs_to_jiffies(A3700_SPI_TIMEOUT);
 365        timeout = wait_for_completion_timeout(&a3700_spi->done,
 366                                              timeout_jiffies);
 367
 368        a3700_spi->wait_mask = 0;
 369
 370        if (timeout)
 371                return true;
 372
 373        /* there might be the case that right after we checked the
 374         * status bits in this routine and before start to wait for
 375         * interrupt by wait_for_completion_timeout, the interrupt
 376         * happens, to avoid missing it we need to double check
 377         * status bits in control reg, if it is already 1, then
 378         * consider that we have the interrupt successfully and
 379         * return true.
 380         */
 381        ctrl_reg = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG);
 382        if (a3700_spi->wait_mask & ctrl_reg)
 383                return true;
 384
 385        spireg_write(a3700_spi, A3700_SPI_INT_MASK_REG, 0);
 386
 387        /* Timeout was reached */
 388        return false;
 389}
 390
 391static bool a3700_spi_transfer_wait(struct spi_device *spi,
 392                                    unsigned int bit_mask)
 393{
 394        struct a3700_spi *a3700_spi;
 395
 396        a3700_spi = spi_master_get_devdata(spi->master);
 397        a3700_spi->wait_mask = bit_mask;
 398
 399        return a3700_spi_wait_completion(spi);
 400}
 401
 402static void a3700_spi_fifo_thres_set(struct a3700_spi *a3700_spi,
 403                                     unsigned int bytes)
 404{
 405        u32 val;
 406
 407        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 408        val &= ~(A3700_SPI_FIFO_THRS_MASK << A3700_SPI_RFIFO_THRS_BIT);
 409        val |= (bytes - 1) << A3700_SPI_RFIFO_THRS_BIT;
 410        val &= ~(A3700_SPI_FIFO_THRS_MASK << A3700_SPI_WFIFO_THRS_BIT);
 411        val |= (7 - bytes) << A3700_SPI_WFIFO_THRS_BIT;
 412        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 413}
 414
 415static void a3700_spi_transfer_setup(struct spi_device *spi,
 416                                     struct spi_transfer *xfer)
 417{
 418        struct a3700_spi *a3700_spi;
 419
 420        a3700_spi = spi_master_get_devdata(spi->master);
 421
 422        a3700_spi_clock_set(a3700_spi, xfer->speed_hz);
 423
 424        /* Use 4 bytes long transfers. Each transfer method has its way to deal
 425         * with the remaining bytes for non 4-bytes aligned transfers.
 426         */
 427        a3700_spi_bytelen_set(a3700_spi, 4);
 428
 429        /* Initialize the working buffers */
 430        a3700_spi->tx_buf  = xfer->tx_buf;
 431        a3700_spi->rx_buf  = xfer->rx_buf;
 432        a3700_spi->buf_len = xfer->len;
 433}
 434
 435static void a3700_spi_set_cs(struct spi_device *spi, bool enable)
 436{
 437        struct a3700_spi *a3700_spi = spi_master_get_devdata(spi->master);
 438
 439        if (!enable)
 440                a3700_spi_activate_cs(a3700_spi, spi->chip_select);
 441        else
 442                a3700_spi_deactivate_cs(a3700_spi, spi->chip_select);
 443}
 444
 445static void a3700_spi_header_set(struct a3700_spi *a3700_spi)
 446{
 447        unsigned int addr_cnt;
 448        u32 val = 0;
 449
 450        /* Clear the header registers */
 451        spireg_write(a3700_spi, A3700_SPI_IF_INST_REG, 0);
 452        spireg_write(a3700_spi, A3700_SPI_IF_ADDR_REG, 0);
 453        spireg_write(a3700_spi, A3700_SPI_IF_RMODE_REG, 0);
 454        spireg_write(a3700_spi, A3700_SPI_IF_HDR_CNT_REG, 0);
 455
 456        /* Set header counters */
 457        if (a3700_spi->tx_buf) {
 458                /*
 459                 * when tx data is not 4 bytes aligned, there will be unexpected
 460                 * bytes out of SPI output register, since it always shifts out
 461                 * as whole 4 bytes. This might cause incorrect transaction with
 462                 * some devices. To avoid that, use SPI header count feature to
 463                 * transfer up to 3 bytes of data first, and then make the rest
 464                 * of data 4-byte aligned.
 465                 */
 466                addr_cnt = a3700_spi->buf_len % 4;
 467                if (addr_cnt) {
 468                        val = (addr_cnt & A3700_SPI_ADDR_CNT_MASK)
 469                                << A3700_SPI_ADDR_CNT_BIT;
 470                        spireg_write(a3700_spi, A3700_SPI_IF_HDR_CNT_REG, val);
 471
 472                        /* Update the buffer length to be transferred */
 473                        a3700_spi->buf_len -= addr_cnt;
 474
 475                        /* transfer 1~3 bytes through address count */
 476                        val = 0;
 477                        while (addr_cnt--) {
 478                                val = (val << 8) | a3700_spi->tx_buf[0];
 479                                a3700_spi->tx_buf++;
 480                        }
 481                        spireg_write(a3700_spi, A3700_SPI_IF_ADDR_REG, val);
 482                }
 483        }
 484}
 485
 486static int a3700_is_wfifo_full(struct a3700_spi *a3700_spi)
 487{
 488        u32 val;
 489
 490        val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG);
 491        return (val & A3700_SPI_WFIFO_FULL);
 492}
 493
 494static int a3700_spi_fifo_write(struct a3700_spi *a3700_spi)
 495{
 496        u32 val;
 497
 498        while (!a3700_is_wfifo_full(a3700_spi) && a3700_spi->buf_len) {
 499                val = *(u32 *)a3700_spi->tx_buf;
 500                spireg_write(a3700_spi, A3700_SPI_DATA_OUT_REG, val);
 501                a3700_spi->buf_len -= 4;
 502                a3700_spi->tx_buf += 4;
 503        }
 504
 505        return 0;
 506}
 507
 508static int a3700_is_rfifo_empty(struct a3700_spi *a3700_spi)
 509{
 510        u32 val = spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG);
 511
 512        return (val & A3700_SPI_RFIFO_EMPTY);
 513}
 514
 515static int a3700_spi_fifo_read(struct a3700_spi *a3700_spi)
 516{
 517        u32 val;
 518
 519        while (!a3700_is_rfifo_empty(a3700_spi) && a3700_spi->buf_len) {
 520                val = spireg_read(a3700_spi, A3700_SPI_DATA_IN_REG);
 521                if (a3700_spi->buf_len >= 4) {
 522
 523                        memcpy(a3700_spi->rx_buf, &val, 4);
 524
 525                        a3700_spi->buf_len -= 4;
 526                        a3700_spi->rx_buf += 4;
 527                } else {
 528                        /*
 529                         * When remain bytes is not larger than 4, we should
 530                         * avoid memory overwriting and just write the left rx
 531                         * buffer bytes.
 532                         */
 533                        while (a3700_spi->buf_len) {
 534                                *a3700_spi->rx_buf = val & 0xff;
 535                                val >>= 8;
 536
 537                                a3700_spi->buf_len--;
 538                                a3700_spi->rx_buf++;
 539                        }
 540                }
 541        }
 542
 543        return 0;
 544}
 545
 546static void a3700_spi_transfer_abort_fifo(struct a3700_spi *a3700_spi)
 547{
 548        int timeout = A3700_SPI_TIMEOUT;
 549        u32 val;
 550
 551        val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 552        val |= A3700_SPI_XFER_STOP;
 553        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 554
 555        while (--timeout) {
 556                val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 557                if (!(val & A3700_SPI_XFER_START))
 558                        break;
 559                udelay(1);
 560        }
 561
 562        a3700_spi_fifo_flush(a3700_spi);
 563
 564        val &= ~A3700_SPI_XFER_STOP;
 565        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 566}
 567
 568static int a3700_spi_prepare_message(struct spi_master *master,
 569                                     struct spi_message *message)
 570{
 571        struct a3700_spi *a3700_spi = spi_master_get_devdata(master);
 572        struct spi_device *spi = message->spi;
 573        int ret;
 574
 575        ret = clk_enable(a3700_spi->clk);
 576        if (ret) {
 577                dev_err(&spi->dev, "failed to enable clk with error %d\n", ret);
 578                return ret;
 579        }
 580
 581        /* Flush the FIFOs */
 582        ret = a3700_spi_fifo_flush(a3700_spi);
 583        if (ret)
 584                return ret;
 585
 586        a3700_spi_mode_set(a3700_spi, spi->mode);
 587
 588        return 0;
 589}
 590
 591static int a3700_spi_transfer_one_fifo(struct spi_master *master,
 592                                  struct spi_device *spi,
 593                                  struct spi_transfer *xfer)
 594{
 595        struct a3700_spi *a3700_spi = spi_master_get_devdata(master);
 596        int ret = 0, timeout = A3700_SPI_TIMEOUT;
 597        unsigned int nbits = 0, byte_len;
 598        u32 val;
 599
 600        /* Make sure we use FIFO mode */
 601        a3700_spi_fifo_mode_set(a3700_spi, true);
 602
 603        /* Configure FIFO thresholds */
 604        byte_len = xfer->bits_per_word >> 3;
 605        a3700_spi_fifo_thres_set(a3700_spi, byte_len);
 606
 607        if (xfer->tx_buf)
 608                nbits = xfer->tx_nbits;
 609        else if (xfer->rx_buf)
 610                nbits = xfer->rx_nbits;
 611
 612        a3700_spi_pin_mode_set(a3700_spi, nbits, xfer->rx_buf ? true : false);
 613
 614        /* Flush the FIFOs */
 615        a3700_spi_fifo_flush(a3700_spi);
 616
 617        /* Transfer first bytes of data when buffer is not 4-byte aligned */
 618        a3700_spi_header_set(a3700_spi);
 619
 620        if (xfer->rx_buf) {
 621                /* Clear WFIFO, since it's last 2 bytes are shifted out during
 622                 * a read operation
 623                 */
 624                spireg_write(a3700_spi, A3700_SPI_DATA_OUT_REG, 0);
 625
 626                /* Set read data length */
 627                spireg_write(a3700_spi, A3700_SPI_IF_DIN_CNT_REG,
 628                             a3700_spi->buf_len);
 629                /* Start READ transfer */
 630                val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 631                val &= ~A3700_SPI_RW_EN;
 632                val |= A3700_SPI_XFER_START;
 633                spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 634        } else if (xfer->tx_buf) {
 635                /* Start Write transfer */
 636                val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 637                val |= (A3700_SPI_XFER_START | A3700_SPI_RW_EN);
 638                spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 639
 640                /*
 641                 * If there are data to be written to the SPI device, xmit_data
 642                 * flag is set true; otherwise the instruction in SPI_INSTR does
 643                 * not require data to be written to the SPI device, then
 644                 * xmit_data flag is set false.
 645                 */
 646                a3700_spi->xmit_data = (a3700_spi->buf_len != 0);
 647        }
 648
 649        while (a3700_spi->buf_len) {
 650                if (a3700_spi->tx_buf) {
 651                        /* Wait wfifo ready */
 652                        if (!a3700_spi_transfer_wait(spi,
 653                                                     A3700_SPI_WFIFO_RDY)) {
 654                                dev_err(&spi->dev,
 655                                        "wait wfifo ready timed out\n");
 656                                ret = -ETIMEDOUT;
 657                                goto error;
 658                        }
 659                        /* Fill up the wfifo */
 660                        ret = a3700_spi_fifo_write(a3700_spi);
 661                        if (ret)
 662                                goto error;
 663                } else if (a3700_spi->rx_buf) {
 664                        /* Wait rfifo ready */
 665                        if (!a3700_spi_transfer_wait(spi,
 666                                                     A3700_SPI_RFIFO_RDY)) {
 667                                dev_err(&spi->dev,
 668                                        "wait rfifo ready timed out\n");
 669                                ret = -ETIMEDOUT;
 670                                goto error;
 671                        }
 672                        /* Drain out the rfifo */
 673                        ret = a3700_spi_fifo_read(a3700_spi);
 674                        if (ret)
 675                                goto error;
 676                }
 677        }
 678
 679        /*
 680         * Stop a write transfer in fifo mode:
 681         *      - wait all the bytes in wfifo to be shifted out
 682         *       - set XFER_STOP bit
 683         *      - wait XFER_START bit clear
 684         *      - clear XFER_STOP bit
 685         * Stop a read transfer in fifo mode:
 686         *      - the hardware is to reset the XFER_START bit
 687         *         after the number of bytes indicated in DIN_CNT
 688         *         register
 689         *      - just wait XFER_START bit clear
 690         */
 691        if (a3700_spi->tx_buf) {
 692                if (a3700_spi->xmit_data) {
 693                        /*
 694                         * If there are data written to the SPI device, wait
 695                         * until SPI_WFIFO_EMPTY is 1 to wait for all data to
 696                         * transfer out of write FIFO.
 697                         */
 698                        if (!a3700_spi_transfer_wait(spi,
 699                                                     A3700_SPI_WFIFO_EMPTY)) {
 700                                dev_err(&spi->dev, "wait wfifo empty timed out\n");
 701                                return -ETIMEDOUT;
 702                        }
 703                }
 704
 705                if (!a3700_spi_transfer_wait(spi, A3700_SPI_XFER_RDY)) {
 706                        dev_err(&spi->dev, "wait xfer ready timed out\n");
 707                        return -ETIMEDOUT;
 708                }
 709
 710                val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 711                val |= A3700_SPI_XFER_STOP;
 712                spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 713        }
 714
 715        while (--timeout) {
 716                val = spireg_read(a3700_spi, A3700_SPI_IF_CFG_REG);
 717                if (!(val & A3700_SPI_XFER_START))
 718                        break;
 719                udelay(1);
 720        }
 721
 722        if (timeout == 0) {
 723                dev_err(&spi->dev, "wait transfer start clear timed out\n");
 724                ret = -ETIMEDOUT;
 725                goto error;
 726        }
 727
 728        val &= ~A3700_SPI_XFER_STOP;
 729        spireg_write(a3700_spi, A3700_SPI_IF_CFG_REG, val);
 730        goto out;
 731
 732error:
 733        a3700_spi_transfer_abort_fifo(a3700_spi);
 734out:
 735        spi_finalize_current_transfer(master);
 736
 737        return ret;
 738}
 739
 740static int a3700_spi_transfer_one_full_duplex(struct spi_master *master,
 741                                  struct spi_device *spi,
 742                                  struct spi_transfer *xfer)
 743{
 744        struct a3700_spi *a3700_spi = spi_master_get_devdata(master);
 745        u32 val;
 746
 747        /* Disable FIFO mode */
 748        a3700_spi_fifo_mode_set(a3700_spi, false);
 749
 750        while (a3700_spi->buf_len) {
 751
 752                /* When we have less than 4 bytes to transfer, switch to 1 byte
 753                 * mode. This is reset after each transfer
 754                 */
 755                if (a3700_spi->buf_len < 4)
 756                        a3700_spi_bytelen_set(a3700_spi, 1);
 757
 758                if (a3700_spi->byte_len == 1)
 759                        val = *a3700_spi->tx_buf;
 760                else
 761                        val = *(u32 *)a3700_spi->tx_buf;
 762
 763                spireg_write(a3700_spi, A3700_SPI_DATA_OUT_REG, val);
 764
 765                /* Wait for all the data to be shifted in / out */
 766                while (!(spireg_read(a3700_spi, A3700_SPI_IF_CTRL_REG) &
 767                                A3700_SPI_XFER_DONE))
 768                        cpu_relax();
 769
 770                val = spireg_read(a3700_spi, A3700_SPI_DATA_IN_REG);
 771
 772                memcpy(a3700_spi->rx_buf, &val, a3700_spi->byte_len);
 773
 774                a3700_spi->buf_len -= a3700_spi->byte_len;
 775                a3700_spi->tx_buf += a3700_spi->byte_len;
 776                a3700_spi->rx_buf += a3700_spi->byte_len;
 777
 778        }
 779
 780        spi_finalize_current_transfer(master);
 781
 782        return 0;
 783}
 784
 785static int a3700_spi_transfer_one(struct spi_master *master,
 786                                  struct spi_device *spi,
 787                                  struct spi_transfer *xfer)
 788{
 789        a3700_spi_transfer_setup(spi, xfer);
 790
 791        if (xfer->tx_buf && xfer->rx_buf)
 792                return a3700_spi_transfer_one_full_duplex(master, spi, xfer);
 793
 794        return a3700_spi_transfer_one_fifo(master, spi, xfer);
 795}
 796
 797static int a3700_spi_unprepare_message(struct spi_master *master,
 798                                       struct spi_message *message)
 799{
 800        struct a3700_spi *a3700_spi = spi_master_get_devdata(master);
 801
 802        clk_disable(a3700_spi->clk);
 803
 804        return 0;
 805}
 806
 807static const struct of_device_id a3700_spi_dt_ids[] = {
 808        { .compatible = "marvell,armada-3700-spi", .data = NULL },
 809        {},
 810};
 811
 812MODULE_DEVICE_TABLE(of, a3700_spi_dt_ids);
 813
 814static int a3700_spi_probe(struct platform_device *pdev)
 815{
 816        struct device *dev = &pdev->dev;
 817        struct device_node *of_node = dev->of_node;
 818        struct spi_master *master;
 819        struct a3700_spi *spi;
 820        u32 num_cs = 0;
 821        int irq, ret = 0;
 822
 823        master = spi_alloc_master(dev, sizeof(*spi));
 824        if (!master) {
 825                dev_err(dev, "master allocation failed\n");
 826                ret = -ENOMEM;
 827                goto out;
 828        }
 829
 830        if (of_property_read_u32(of_node, "num-cs", &num_cs)) {
 831                dev_err(dev, "could not find num-cs\n");
 832                ret = -ENXIO;
 833                goto error;
 834        }
 835
 836        master->bus_num = pdev->id;
 837        master->dev.of_node = of_node;
 838        master->mode_bits = SPI_MODE_3;
 839        master->num_chipselect = num_cs;
 840        master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(32);
 841        master->prepare_message =  a3700_spi_prepare_message;
 842        master->transfer_one = a3700_spi_transfer_one;
 843        master->unprepare_message = a3700_spi_unprepare_message;
 844        master->set_cs = a3700_spi_set_cs;
 845        master->mode_bits |= (SPI_RX_DUAL | SPI_TX_DUAL |
 846                              SPI_RX_QUAD | SPI_TX_QUAD);
 847
 848        platform_set_drvdata(pdev, master);
 849
 850        spi = spi_master_get_devdata(master);
 851
 852        spi->master = master;
 853
 854        spi->base = devm_platform_ioremap_resource(pdev, 0);
 855        if (IS_ERR(spi->base)) {
 856                ret = PTR_ERR(spi->base);
 857                goto error;
 858        }
 859
 860        irq = platform_get_irq(pdev, 0);
 861        if (irq < 0) {
 862                ret = -ENXIO;
 863                goto error;
 864        }
 865        spi->irq = irq;
 866
 867        init_completion(&spi->done);
 868
 869        spi->clk = devm_clk_get(dev, NULL);
 870        if (IS_ERR(spi->clk)) {
 871                dev_err(dev, "could not find clk: %ld\n", PTR_ERR(spi->clk));
 872                goto error;
 873        }
 874
 875        ret = clk_prepare(spi->clk);
 876        if (ret) {
 877                dev_err(dev, "could not prepare clk: %d\n", ret);
 878                goto error;
 879        }
 880
 881        master->max_speed_hz = min_t(unsigned long, A3700_SPI_MAX_SPEED_HZ,
 882                                        clk_get_rate(spi->clk));
 883        master->min_speed_hz = DIV_ROUND_UP(clk_get_rate(spi->clk),
 884                                                A3700_SPI_MAX_PRESCALE);
 885
 886        a3700_spi_init(spi);
 887
 888        ret = devm_request_irq(dev, spi->irq, a3700_spi_interrupt, 0,
 889                               dev_name(dev), master);
 890        if (ret) {
 891                dev_err(dev, "could not request IRQ: %d\n", ret);
 892                goto error_clk;
 893        }
 894
 895        ret = devm_spi_register_master(dev, master);
 896        if (ret) {
 897                dev_err(dev, "Failed to register master\n");
 898                goto error_clk;
 899        }
 900
 901        return 0;
 902
 903error_clk:
 904        clk_disable_unprepare(spi->clk);
 905error:
 906        spi_master_put(master);
 907out:
 908        return ret;
 909}
 910
 911static int a3700_spi_remove(struct platform_device *pdev)
 912{
 913        struct spi_master *master = platform_get_drvdata(pdev);
 914        struct a3700_spi *spi = spi_master_get_devdata(master);
 915
 916        clk_unprepare(spi->clk);
 917
 918        return 0;
 919}
 920
 921static struct platform_driver a3700_spi_driver = {
 922        .driver = {
 923                .name   = DRIVER_NAME,
 924                .of_match_table = of_match_ptr(a3700_spi_dt_ids),
 925        },
 926        .probe          = a3700_spi_probe,
 927        .remove         = a3700_spi_remove,
 928};
 929
 930module_platform_driver(a3700_spi_driver);
 931
 932MODULE_DESCRIPTION("Armada-3700 SPI driver");
 933MODULE_AUTHOR("Wilson Ding <dingwei@marvell.com>");
 934MODULE_LICENSE("GPL");
 935MODULE_ALIAS("platform:" DRIVER_NAME);
 936