cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

spi-armada-3700.c (24174B)


      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_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);