spi-fsl-spi.c 27.7 KB
Newer Older
1
/*
2
 * Freescale SPI controller driver.
3 4 5 6
 *
 * Maintainer: Kumar Gala
 *
 * Copyright (C) 2006 Polycom, Inc.
7
 * Copyright 2010 Freescale Semiconductor, Inc.
8
 *
9 10 11 12
 * CPM SPI and QE buffer descriptors mode support:
 * Copyright (c) 2009  MontaVista Software, Inc.
 * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
 *
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 * This program is free software; you can redistribute  it and/or modify it
 * under  the terms of  the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the  License, or (at your
 * option) any later version.
 */
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
#include <linux/platform_device.h>
#include <linux/fsl_devices.h>
28 29 30
#include <linux/dma-mapping.h>
#include <linux/mm.h>
#include <linux/mutex.h>
31 32 33 34
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/gpio.h>
#include <linux/of_gpio.h>
35

36
#include <sysdev/fsl_soc.h>
37 38
#include <asm/cpm.h>
#include <asm/qe.h>
39

G
Grant Likely 已提交
40
#include "spi-fsl-lib.h"
41

42 43 44 45 46 47 48 49 50
/* CPM1 and CPM2 are mutually exclusive. */
#ifdef CONFIG_CPM1
#include <asm/cpm1.h>
#define CPM_SPI_CMD mk_cr_cmd(CPM_CR_CH_SPI, 0)
#else
#include <asm/cpm2.h>
#define CPM_SPI_CMD mk_cr_cmd(CPM_CR_SPI_PAGE, CPM_CR_SPI_SBLOCK, 0, 0)
#endif

51
/* SPI Controller registers */
52
struct fsl_spi_reg {
53 54 55 56 57 58 59 60 61 62
	u8 res1[0x20];
	__be32 mode;
	__be32 event;
	__be32 mask;
	__be32 command;
	__be32 transmit;
	__be32 receive;
};

/* SPI Controller mode register definitions */
63
#define	SPMODE_LOOP		(1 << 30)
64 65 66 67 68 69 70 71
#define	SPMODE_CI_INACTIVEHIGH	(1 << 29)
#define	SPMODE_CP_BEGIN_EDGECLK	(1 << 28)
#define	SPMODE_DIV16		(1 << 27)
#define	SPMODE_REV		(1 << 26)
#define	SPMODE_MS		(1 << 25)
#define	SPMODE_ENABLE		(1 << 24)
#define	SPMODE_LEN(x)		((x) << 20)
#define	SPMODE_PM(x)		((x) << 16)
72
#define	SPMODE_OP		(1 << 14)
73
#define	SPMODE_CG(x)		((x) << 7)
74 75 76

/*
 * Default for SPI Mode:
77
 *	SPI MODE 0 (inactive low, phase middle, MSB, 8-bit length, slow clk
78 79 80 81 82 83 84 85 86 87 88 89
 */
#define	SPMODE_INIT_VAL (SPMODE_CI_INACTIVEHIGH | SPMODE_DIV16 | SPMODE_REV | \
			 SPMODE_MS | SPMODE_LEN(7) | SPMODE_PM(0xf))

/* SPIE register values */
#define	SPIE_NE		0x00000200	/* Not empty */
#define	SPIE_NF		0x00000100	/* Not full */

/* SPIM register values */
#define	SPIM_NE		0x00000200	/* Not empty */
#define	SPIM_NF		0x00000100	/* Not full */

90 91 92 93 94 95 96 97 98
#define	SPIE_TXB	0x00000200	/* Last char is written to tx fifo */
#define	SPIE_RXB	0x00000100	/* Last char is written to rx buf */

/* SPCOM register values */
#define	SPCOM_STR	(1 << 23)	/* Start transmit */

#define	SPI_PRAM_SIZE	0x100
#define	SPI_MRBLR	((unsigned int)PAGE_SIZE)

99 100 101
static void *fsl_dummy_rx;
static DEFINE_MUTEX(fsl_dummy_rx_lock);
static int fsl_dummy_rx_refcnt;
102

103
static void fsl_spi_change_mode(struct spi_device *spi)
104 105 106
{
	struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
	struct spi_mpc8xxx_cs *cs = spi->controller_state;
107 108
	struct fsl_spi_reg *reg_base = mspi->reg_base;
	__be32 __iomem *mode = &reg_base->mode;
109 110 111 112 113 114 115 116 117 118 119
	unsigned long flags;

	if (cs->hw_mode == mpc8xxx_spi_read_reg(mode))
		return;

	/* Turn off IRQs locally to minimize time that SPI is disabled. */
	local_irq_save(flags);

	/* Turn off SPI unit prior changing mode */
	mpc8xxx_spi_write_reg(mode, cs->hw_mode & ~SPMODE_ENABLE);

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
	/* When in CPM mode, we need to reinit tx and rx. */
	if (mspi->flags & SPI_CPM_MODE) {
		if (mspi->flags & SPI_QE) {
			qe_issue_cmd(QE_INIT_TX_RX, mspi->subblock,
				     QE_CR_PROTOCOL_UNSPECIFIED, 0);
		} else {
			cpm_command(CPM_SPI_CMD, CPM_CR_INIT_TRX);
			if (mspi->flags & SPI_CPM1) {
				out_be16(&mspi->pram->rbptr,
					 in_be16(&mspi->pram->rbase));
				out_be16(&mspi->pram->tbptr,
					 in_be16(&mspi->pram->tbase));
			}
		}
	}
135
	mpc8xxx_spi_write_reg(mode, cs->hw_mode);
136 137 138
	local_irq_restore(flags);
}

139
static void fsl_spi_chipselect(struct spi_device *spi, int value)
140
{
A
Anton Vorontsov 已提交
141
	struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
142
	struct fsl_spi_platform_data *pdata;
143
	bool pol = spi->mode & SPI_CS_HIGH;
A
Anton Vorontsov 已提交
144
	struct spi_mpc8xxx_cs	*cs = spi->controller_state;
145

146 147
	pdata = spi->dev.parent->parent->platform_data;

148
	if (value == BITBANG_CS_INACTIVE) {
149 150
		if (pdata->cs_control)
			pdata->cs_control(spi, !pol);
151 152 153
	}

	if (value == BITBANG_CS_ACTIVE) {
A
Anton Vorontsov 已提交
154 155 156 157
		mpc8xxx_spi->rx_shift = cs->rx_shift;
		mpc8xxx_spi->tx_shift = cs->tx_shift;
		mpc8xxx_spi->get_rx = cs->get_rx;
		mpc8xxx_spi->get_tx = cs->get_tx;
158

159
		fsl_spi_change_mode(spi);
160

161 162
		if (pdata->cs_control)
			pdata->cs_control(spi, pol);
163 164 165
	}
}

166 167 168 169
static int mspi_apply_cpu_mode_quirks(struct spi_mpc8xxx_cs *cs,
				struct spi_device *spi,
				struct mpc8xxx_spi *mpc8xxx_spi,
				int bits_per_word)
170
{
171 172
	cs->rx_shift = 0;
	cs->tx_shift = 0;
173
	if (bits_per_word <= 8) {
A
Anton Vorontsov 已提交
174 175
		cs->get_rx = mpc8xxx_spi_rx_buf_u8;
		cs->get_tx = mpc8xxx_spi_tx_buf_u8;
176
		if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) {
177 178
			cs->rx_shift = 16;
			cs->tx_shift = 24;
179
		}
180
	} else if (bits_per_word <= 16) {
A
Anton Vorontsov 已提交
181 182
		cs->get_rx = mpc8xxx_spi_rx_buf_u16;
		cs->get_tx = mpc8xxx_spi_tx_buf_u16;
183
		if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) {
184 185
			cs->rx_shift = 16;
			cs->tx_shift = 16;
186
		}
187
	} else if (bits_per_word <= 32) {
A
Anton Vorontsov 已提交
188 189
		cs->get_rx = mpc8xxx_spi_rx_buf_u32;
		cs->get_tx = mpc8xxx_spi_tx_buf_u32;
190 191 192
	} else
		return -EINVAL;

193
	if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE &&
194
	    spi->mode & SPI_LSB_FIRST) {
195
		cs->tx_shift = 0;
196
		if (bits_per_word <= 8)
197
			cs->rx_shift = 8;
198
		else
199
			cs->rx_shift = 0;
200
	}
A
Anton Vorontsov 已提交
201 202 203 204
	mpc8xxx_spi->rx_shift = cs->rx_shift;
	mpc8xxx_spi->tx_shift = cs->tx_shift;
	mpc8xxx_spi->get_rx = cs->get_rx;
	mpc8xxx_spi->get_tx = cs->get_tx;
205

206 207 208
	return bits_per_word;
}

209 210 211
static int mspi_apply_qe_mode_quirks(struct spi_mpc8xxx_cs *cs,
				struct spi_device *spi,
				int bits_per_word)
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
{
	/* QE uses Little Endian for words > 8
	 * so transform all words > 8 into 8 bits
	 * Unfortnatly that doesn't work for LSB so
	 * reject these for now */
	/* Note: 32 bits word, LSB works iff
	 * tfcr/rfcr is set to CPMFCR_GBL */
	if (spi->mode & SPI_LSB_FIRST &&
	    bits_per_word > 8)
		return -EINVAL;
	if (bits_per_word > 8)
		return 8; /* pretend its 8 bits */
	return bits_per_word;
}

227 228
static int fsl_spi_setup_transfer(struct spi_device *spi,
					struct spi_transfer *t)
229 230
{
	struct mpc8xxx_spi *mpc8xxx_spi;
231
	int bits_per_word = 0;
232
	u8 pm;
233
	u32 hz = 0;
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
	struct spi_mpc8xxx_cs	*cs = spi->controller_state;

	mpc8xxx_spi = spi_master_get_devdata(spi->master);

	if (t) {
		bits_per_word = t->bits_per_word;
		hz = t->speed_hz;
	}

	/* spi_transfer level calls that work per-word */
	if (!bits_per_word)
		bits_per_word = spi->bits_per_word;

	/* Make sure its a bit width we support [4..16, 32] */
	if ((bits_per_word < 4)
	    || ((bits_per_word > 16) && (bits_per_word != 32)))
		return -EINVAL;

	if (!hz)
		hz = spi->max_speed_hz;

	if (!(mpc8xxx_spi->flags & SPI_CPM_MODE))
		bits_per_word = mspi_apply_cpu_mode_quirks(cs, spi,
							   mpc8xxx_spi,
							   bits_per_word);
	else if (mpc8xxx_spi->flags & SPI_QE)
		bits_per_word = mspi_apply_qe_mode_quirks(cs, spi,
							  bits_per_word);

	if (bits_per_word < 0)
		return bits_per_word;

266 267 268 269 270
	if (bits_per_word == 32)
		bits_per_word = 0;
	else
		bits_per_word = bits_per_word - 1;

271
	/* mask out bits we are going to set */
272 273 274 275 276
	cs->hw_mode &= ~(SPMODE_LEN(0xF) | SPMODE_DIV16
				  | SPMODE_PM(0xF));

	cs->hw_mode |= SPMODE_LEN(bits_per_word);

A
Anton Vorontsov 已提交
277
	if ((mpc8xxx_spi->spibrg / hz) > 64) {
278
		cs->hw_mode |= SPMODE_DIV16;
279
		pm = (mpc8xxx_spi->spibrg - 1) / (hz * 64) + 1;
280 281 282

		WARN_ONCE(pm > 16, "%s: Requested speed is too low: %d Hz. "
			  "Will use %d Hz instead.\n", dev_name(&spi->dev),
A
Anton Vorontsov 已提交
283
			  hz, mpc8xxx_spi->spibrg / 1024);
284
		if (pm > 16)
285
			pm = 16;
286
	} else {
287
		pm = (mpc8xxx_spi->spibrg - 1) / (hz * 4) + 1;
288
	}
C
Chen Gong 已提交
289 290 291 292
	if (pm)
		pm--;

	cs->hw_mode |= SPMODE_PM(pm);
293

294
	fsl_spi_change_mode(spi);
295 296
	return 0;
}
297

298
static void fsl_spi_cpm_bufs_start(struct mpc8xxx_spi *mspi)
299
{
300 301 302 303
	struct cpm_buf_desc __iomem *tx_bd = mspi->tx_bd;
	struct cpm_buf_desc __iomem *rx_bd = mspi->rx_bd;
	unsigned int xfer_len = min(mspi->count, SPI_MRBLR);
	unsigned int xfer_ofs;
304
	struct fsl_spi_reg *reg_base = mspi->reg_base;
305

306 307
	xfer_ofs = mspi->xfer_in_progress->len - mspi->count;

308 309 310 311
	if (mspi->rx_dma == mspi->dma_dummy_rx)
		out_be32(&rx_bd->cbd_bufaddr, mspi->rx_dma);
	else
		out_be32(&rx_bd->cbd_bufaddr, mspi->rx_dma + xfer_ofs);
312 313 314
	out_be16(&rx_bd->cbd_datlen, 0);
	out_be16(&rx_bd->cbd_sc, BD_SC_EMPTY | BD_SC_INTRPT | BD_SC_WRAP);

315 316 317 318
	if (mspi->tx_dma == mspi->dma_dummy_tx)
		out_be32(&tx_bd->cbd_bufaddr, mspi->tx_dma);
	else
		out_be32(&tx_bd->cbd_bufaddr, mspi->tx_dma + xfer_ofs);
319 320 321 322 323
	out_be16(&tx_bd->cbd_datlen, xfer_len);
	out_be16(&tx_bd->cbd_sc, BD_SC_READY | BD_SC_INTRPT | BD_SC_WRAP |
				 BD_SC_LAST);

	/* start transfer */
324
	mpc8xxx_spi_write_reg(&reg_base->command, SPCOM_STR);
325 326
}

327
static int fsl_spi_cpm_bufs(struct mpc8xxx_spi *mspi,
328 329 330
				struct spi_transfer *t, bool is_dma_mapped)
{
	struct device *dev = mspi->dev;
331
	struct fsl_spi_reg *reg_base = mspi->reg_base;
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359

	if (is_dma_mapped) {
		mspi->map_tx_dma = 0;
		mspi->map_rx_dma = 0;
	} else {
		mspi->map_tx_dma = 1;
		mspi->map_rx_dma = 1;
	}

	if (!t->tx_buf) {
		mspi->tx_dma = mspi->dma_dummy_tx;
		mspi->map_tx_dma = 0;
	}

	if (!t->rx_buf) {
		mspi->rx_dma = mspi->dma_dummy_rx;
		mspi->map_rx_dma = 0;
	}

	if (mspi->map_tx_dma) {
		void *nonconst_tx = (void *)mspi->tx; /* shut up gcc */

		mspi->tx_dma = dma_map_single(dev, nonconst_tx, t->len,
					      DMA_TO_DEVICE);
		if (dma_mapping_error(dev, mspi->tx_dma)) {
			dev_err(dev, "unable to map tx dma\n");
			return -ENOMEM;
		}
360
	} else if (t->tx_buf) {
361 362 363 364 365 366 367 368 369 370
		mspi->tx_dma = t->tx_dma;
	}

	if (mspi->map_rx_dma) {
		mspi->rx_dma = dma_map_single(dev, mspi->rx, t->len,
					      DMA_FROM_DEVICE);
		if (dma_mapping_error(dev, mspi->rx_dma)) {
			dev_err(dev, "unable to map rx dma\n");
			goto err_rx_dma;
		}
371
	} else if (t->rx_buf) {
372 373 374 375
		mspi->rx_dma = t->rx_dma;
	}

	/* enable rx ints */
376
	mpc8xxx_spi_write_reg(&reg_base->mask, SPIE_RXB);
377 378 379 380 381

	mspi->xfer_in_progress = t;
	mspi->count = t->len;

	/* start CPM transfers */
382
	fsl_spi_cpm_bufs_start(mspi);
383 384 385 386 387 388 389 390 391

	return 0;

err_rx_dma:
	if (mspi->map_tx_dma)
		dma_unmap_single(dev, mspi->tx_dma, t->len, DMA_TO_DEVICE);
	return -ENOMEM;
}

392
static void fsl_spi_cpm_bufs_complete(struct mpc8xxx_spi *mspi)
393 394 395 396 397 398
{
	struct device *dev = mspi->dev;
	struct spi_transfer *t = mspi->xfer_in_progress;

	if (mspi->map_tx_dma)
		dma_unmap_single(dev, mspi->tx_dma, t->len, DMA_TO_DEVICE);
399
	if (mspi->map_rx_dma)
400 401 402 403
		dma_unmap_single(dev, mspi->rx_dma, t->len, DMA_FROM_DEVICE);
	mspi->xfer_in_progress = NULL;
}

404
static int fsl_spi_cpu_bufs(struct mpc8xxx_spi *mspi,
405 406 407
				struct spi_transfer *t, unsigned int len)
{
	u32 word;
408
	struct fsl_spi_reg *reg_base = mspi->reg_base;
409 410 411 412

	mspi->count = len;

	/* enable rx ints */
413
	mpc8xxx_spi_write_reg(&reg_base->mask, SPIM_NE);
414 415 416

	/* transmit word */
	word = mspi->get_tx(mspi);
417
	mpc8xxx_spi_write_reg(&reg_base->transmit, word);
418 419 420 421

	return 0;
}

422
static int fsl_spi_bufs(struct spi_device *spi, struct spi_transfer *t,
423 424 425
			    bool is_dma_mapped)
{
	struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
426
	struct fsl_spi_reg *reg_base;
427 428 429
	unsigned int len = t->len;
	u8 bits_per_word;
	int ret;
430

431
	reg_base = mpc8xxx_spi->reg_base;
432 433 434
	bits_per_word = spi->bits_per_word;
	if (t->bits_per_word)
		bits_per_word = t->bits_per_word;
435

436 437 438 439
	if (bits_per_word > 8) {
		/* invalid length? */
		if (len & 1)
			return -EINVAL;
440
		len /= 2;
441 442 443 444 445
	}
	if (bits_per_word > 16) {
		/* invalid length? */
		if (len & 1)
			return -EINVAL;
446
		len /= 2;
447 448
	}

449 450
	mpc8xxx_spi->tx = t->tx_buf;
	mpc8xxx_spi->rx = t->rx_buf;
451

452
	INIT_COMPLETION(mpc8xxx_spi->done);
453

454
	if (mpc8xxx_spi->flags & SPI_CPM_MODE)
455
		ret = fsl_spi_cpm_bufs(mpc8xxx_spi, t, is_dma_mapped);
456
	else
457
		ret = fsl_spi_cpu_bufs(mpc8xxx_spi, t, len);
458 459
	if (ret)
		return ret;
460

A
Anton Vorontsov 已提交
461
	wait_for_completion(&mpc8xxx_spi->done);
462 463

	/* disable rx ints */
464
	mpc8xxx_spi_write_reg(&reg_base->mask, 0);
465

466
	if (mpc8xxx_spi->flags & SPI_CPM_MODE)
467
		fsl_spi_cpm_bufs_complete(mpc8xxx_spi);
468

A
Anton Vorontsov 已提交
469
	return mpc8xxx_spi->count;
470 471
}

472
static void fsl_spi_do_one_msg(struct spi_message *m)
473
{
474 475 476 477 478 479 480 481 482 483 484 485 486 487
	struct spi_device *spi = m->spi;
	struct spi_transfer *t;
	unsigned int cs_change;
	const int nsecs = 50;
	int status;

	cs_change = 1;
	status = 0;
	list_for_each_entry(t, &m->transfers, transfer_list) {
		if (t->bits_per_word || t->speed_hz) {
			/* Don't allow changes if CS is active */
			status = -EINVAL;

			if (cs_change)
488
				status = fsl_spi_setup_transfer(spi, t);
489
			if (status < 0)
490
				break;
491
		}
492

493
		if (cs_change) {
494
			fsl_spi_chipselect(spi, BITBANG_CS_ACTIVE);
495 496 497 498
			ndelay(nsecs);
		}
		cs_change = t->cs_change;
		if (t->len)
499
			status = fsl_spi_bufs(spi, t, m->is_dma_mapped);
500 501 502
		if (status) {
			status = -EMSGSIZE;
			break;
503
		}
504
		m->actual_length += t->len;
505

506 507
		if (t->delay_usecs)
			udelay(t->delay_usecs);
508

509
		if (cs_change) {
510
			ndelay(nsecs);
511
			fsl_spi_chipselect(spi, BITBANG_CS_INACTIVE);
512
			ndelay(nsecs);
513
		}
514 515 516 517 518 519 520
	}

	m->status = status;
	m->complete(m->context);

	if (status || !cs_change) {
		ndelay(nsecs);
521
		fsl_spi_chipselect(spi, BITBANG_CS_INACTIVE);
522 523
	}

524
	fsl_spi_setup_transfer(spi, NULL);
525 526
}

527
static int fsl_spi_setup(struct spi_device *spi)
528
{
A
Anton Vorontsov 已提交
529
	struct mpc8xxx_spi *mpc8xxx_spi;
530
	struct fsl_spi_reg *reg_base;
531
	int retval;
532
	u32 hw_mode;
A
Anton Vorontsov 已提交
533
	struct spi_mpc8xxx_cs	*cs = spi->controller_state;
534 535 536 537

	if (!spi->max_speed_hz)
		return -EINVAL;

538 539 540 541 542 543
	if (!cs) {
		cs = kzalloc(sizeof *cs, GFP_KERNEL);
		if (!cs)
			return -ENOMEM;
		spi->controller_state = cs;
	}
A
Anton Vorontsov 已提交
544
	mpc8xxx_spi = spi_master_get_devdata(spi->master);
545

546 547
	reg_base = mpc8xxx_spi->reg_base;

T
Thomas Weber 已提交
548
	hw_mode = cs->hw_mode; /* Save original settings */
549
	cs->hw_mode = mpc8xxx_spi_read_reg(&reg_base->mode);
550 551 552 553 554 555 556 557 558 559 560 561 562
	/* mask out bits we are going to set */
	cs->hw_mode &= ~(SPMODE_CP_BEGIN_EDGECLK | SPMODE_CI_INACTIVEHIGH
			 | SPMODE_REV | SPMODE_LOOP);

	if (spi->mode & SPI_CPHA)
		cs->hw_mode |= SPMODE_CP_BEGIN_EDGECLK;
	if (spi->mode & SPI_CPOL)
		cs->hw_mode |= SPMODE_CI_INACTIVEHIGH;
	if (!(spi->mode & SPI_LSB_FIRST))
		cs->hw_mode |= SPMODE_REV;
	if (spi->mode & SPI_LOOP)
		cs->hw_mode |= SPMODE_LOOP;

563
	retval = fsl_spi_setup_transfer(spi, NULL);
564 565
	if (retval < 0) {
		cs->hw_mode = hw_mode; /* Restore settings */
566
		return retval;
567
	}
568 569 570
	return 0;
}

571
static void fsl_spi_cpm_irq(struct mpc8xxx_spi *mspi, u32 events)
572
{
573
	u16 len;
574
	struct fsl_spi_reg *reg_base = mspi->reg_base;
575

576 577
	dev_dbg(mspi->dev, "%s: bd datlen %d, count %d\n", __func__,
		in_be16(&mspi->rx_bd->cbd_datlen), mspi->count);
578

579 580 581 582 583
	len = in_be16(&mspi->rx_bd->cbd_datlen);
	if (len > mspi->count) {
		WARN_ON(1);
		len = mspi->count;
	}
584

585
	/* Clear the events */
586
	mpc8xxx_spi_write_reg(&reg_base->event, events);
587

588 589
	mspi->count -= len;
	if (mspi->count)
590
		fsl_spi_cpm_bufs_start(mspi);
591 592 593 594
	else
		complete(&mspi->done);
}

595
static void fsl_spi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
596
{
597 598
	struct fsl_spi_reg *reg_base = mspi->reg_base;

599 600
	/* We need handle RX first */
	if (events & SPIE_NE) {
601
		u32 rx_data = mpc8xxx_spi_read_reg(&reg_base->receive);
602 603 604

		if (mspi->rx)
			mspi->get_rx(rx_data, mspi);
605 606
	}

607
	if ((events & SPIE_NF) == 0)
608
		/* spin until TX is done */
609
		while (((events =
610
			mpc8xxx_spi_read_reg(&reg_base->event)) &
611
						SPIE_NF) == 0)
612
			cpu_relax();
613

614
	/* Clear the events */
615
	mpc8xxx_spi_write_reg(&reg_base->event, events);
616 617 618 619 620

	mspi->count -= 1;
	if (mspi->count) {
		u32 word = mspi->get_tx(mspi);

621
		mpc8xxx_spi_write_reg(&reg_base->transmit, word);
622
	} else {
623
		complete(&mspi->done);
624
	}
625
}
626

627
static irqreturn_t fsl_spi_irq(s32 irq, void *context_data)
628 629 630 631
{
	struct mpc8xxx_spi *mspi = context_data;
	irqreturn_t ret = IRQ_NONE;
	u32 events;
632
	struct fsl_spi_reg *reg_base = mspi->reg_base;
633 634

	/* Get interrupt events(tx/rx) */
635
	events = mpc8xxx_spi_read_reg(&reg_base->event);
636 637 638 639 640 641
	if (events)
		ret = IRQ_HANDLED;

	dev_dbg(mspi->dev, "%s: events %x\n", __func__, events);

	if (mspi->flags & SPI_CPM_MODE)
642
		fsl_spi_cpm_irq(mspi, events);
643
	else
644
		fsl_spi_cpu_irq(mspi, events);
645 646 647

	return ret;
}
648

649
static void *fsl_spi_alloc_dummy_rx(void)
650
{
651
	mutex_lock(&fsl_dummy_rx_lock);
652

653 654 655 656
	if (!fsl_dummy_rx)
		fsl_dummy_rx = kmalloc(SPI_MRBLR, GFP_KERNEL);
	if (fsl_dummy_rx)
		fsl_dummy_rx_refcnt++;
657

658
	mutex_unlock(&fsl_dummy_rx_lock);
659

660
	return fsl_dummy_rx;
661 662
}

663
static void fsl_spi_free_dummy_rx(void)
664
{
665
	mutex_lock(&fsl_dummy_rx_lock);
666

667
	switch (fsl_dummy_rx_refcnt) {
668 669 670 671
	case 0:
		WARN_ON(1);
		break;
	case 1:
672 673
		kfree(fsl_dummy_rx);
		fsl_dummy_rx = NULL;
674 675
		/* fall through */
	default:
676
		fsl_dummy_rx_refcnt--;
677 678 679
		break;
	}

680
	mutex_unlock(&fsl_dummy_rx_lock);
681 682
}

683
static unsigned long fsl_spi_cpm_get_pram(struct mpc8xxx_spi *mspi)
684 685
{
	struct device *dev = mspi->dev;
686
	struct device_node *np = dev->of_node;
687 688
	const u32 *iprop;
	int size;
H
Holger Brunck 已提交
689
	void __iomem *spi_base;
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
	unsigned long pram_ofs = -ENOMEM;

	/* Can't use of_address_to_resource(), QE muram isn't at 0. */
	iprop = of_get_property(np, "reg", &size);

	/* QE with a fixed pram location? */
	if (mspi->flags & SPI_QE && iprop && size == sizeof(*iprop) * 4)
		return cpm_muram_alloc_fixed(iprop[2], SPI_PRAM_SIZE);

	/* QE but with a dynamic pram location? */
	if (mspi->flags & SPI_QE) {
		pram_ofs = cpm_muram_alloc(SPI_PRAM_SIZE, 64);
		qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, mspi->subblock,
				QE_CR_PROTOCOL_UNSPECIFIED, pram_ofs);
		return pram_ofs;
	}

H
Holger Brunck 已提交
707 708 709
	spi_base = of_iomap(np, 1);
	if (spi_base == NULL)
		return -EINVAL;
710 711 712

	if (mspi->flags & SPI_CPM2) {
		pram_ofs = cpm_muram_alloc(SPI_PRAM_SIZE, 64);
H
Holger Brunck 已提交
713
		out_be16(spi_base, pram_ofs);
714
	} else {
H
Holger Brunck 已提交
715
		struct spi_pram __iomem *pram = spi_base;
716 717 718 719 720
		u16 rpbase = in_be16(&pram->rpbase);

		/* Microcode relocation patch applied? */
		if (rpbase)
			pram_ofs = rpbase;
H
Holger Brunck 已提交
721 722 723 724
		else {
			pram_ofs = cpm_muram_alloc(SPI_PRAM_SIZE, 64);
			out_be16(spi_base, pram_ofs);
		}
725 726
	}

H
Holger Brunck 已提交
727
	iounmap(spi_base);
728 729 730
	return pram_ofs;
}

731
static int fsl_spi_cpm_init(struct mpc8xxx_spi *mspi)
732 733
{
	struct device *dev = mspi->dev;
734
	struct device_node *np = dev->of_node;
735 736 737 738 739 740 741 742
	const u32 *iprop;
	int size;
	unsigned long pram_ofs;
	unsigned long bds_ofs;

	if (!(mspi->flags & SPI_CPM_MODE))
		return 0;

743
	if (!fsl_spi_alloc_dummy_rx())
744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
		return -ENOMEM;

	if (mspi->flags & SPI_QE) {
		iprop = of_get_property(np, "cell-index", &size);
		if (iprop && size == sizeof(*iprop))
			mspi->subblock = *iprop;

		switch (mspi->subblock) {
		default:
			dev_warn(dev, "cell-index unspecified, assuming SPI1");
			/* fall through */
		case 0:
			mspi->subblock = QE_CR_SUBBLOCK_SPI1;
			break;
		case 1:
			mspi->subblock = QE_CR_SUBBLOCK_SPI2;
			break;
		}
	}

764
	pram_ofs = fsl_spi_cpm_get_pram(mspi);
765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
	if (IS_ERR_VALUE(pram_ofs)) {
		dev_err(dev, "can't allocate spi parameter ram\n");
		goto err_pram;
	}

	bds_ofs = cpm_muram_alloc(sizeof(*mspi->tx_bd) +
				  sizeof(*mspi->rx_bd), 8);
	if (IS_ERR_VALUE(bds_ofs)) {
		dev_err(dev, "can't allocate bds\n");
		goto err_bds;
	}

	mspi->dma_dummy_tx = dma_map_single(dev, empty_zero_page, PAGE_SIZE,
					    DMA_TO_DEVICE);
	if (dma_mapping_error(dev, mspi->dma_dummy_tx)) {
		dev_err(dev, "unable to map dummy tx buffer\n");
		goto err_dummy_tx;
	}

784
	mspi->dma_dummy_rx = dma_map_single(dev, fsl_dummy_rx, SPI_MRBLR,
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821
					    DMA_FROM_DEVICE);
	if (dma_mapping_error(dev, mspi->dma_dummy_rx)) {
		dev_err(dev, "unable to map dummy rx buffer\n");
		goto err_dummy_rx;
	}

	mspi->pram = cpm_muram_addr(pram_ofs);

	mspi->tx_bd = cpm_muram_addr(bds_ofs);
	mspi->rx_bd = cpm_muram_addr(bds_ofs + sizeof(*mspi->tx_bd));

	/* Initialize parameter ram. */
	out_be16(&mspi->pram->tbase, cpm_muram_offset(mspi->tx_bd));
	out_be16(&mspi->pram->rbase, cpm_muram_offset(mspi->rx_bd));
	out_8(&mspi->pram->tfcr, CPMFCR_EB | CPMFCR_GBL);
	out_8(&mspi->pram->rfcr, CPMFCR_EB | CPMFCR_GBL);
	out_be16(&mspi->pram->mrblr, SPI_MRBLR);
	out_be32(&mspi->pram->rstate, 0);
	out_be32(&mspi->pram->rdp, 0);
	out_be16(&mspi->pram->rbptr, 0);
	out_be16(&mspi->pram->rbc, 0);
	out_be32(&mspi->pram->rxtmp, 0);
	out_be32(&mspi->pram->tstate, 0);
	out_be32(&mspi->pram->tdp, 0);
	out_be16(&mspi->pram->tbptr, 0);
	out_be16(&mspi->pram->tbc, 0);
	out_be32(&mspi->pram->txtmp, 0);

	return 0;

err_dummy_rx:
	dma_unmap_single(dev, mspi->dma_dummy_tx, PAGE_SIZE, DMA_TO_DEVICE);
err_dummy_tx:
	cpm_muram_free(bds_ofs);
err_bds:
	cpm_muram_free(pram_ofs);
err_pram:
822
	fsl_spi_free_dummy_rx();
823 824 825
	return -ENOMEM;
}

826
static void fsl_spi_cpm_free(struct mpc8xxx_spi *mspi)
827 828 829
{
	struct device *dev = mspi->dev;

830 831 832
	if (!(mspi->flags & SPI_CPM_MODE))
		return;

833 834 835 836
	dma_unmap_single(dev, mspi->dma_dummy_rx, SPI_MRBLR, DMA_FROM_DEVICE);
	dma_unmap_single(dev, mspi->dma_dummy_tx, PAGE_SIZE, DMA_TO_DEVICE);
	cpm_muram_free(cpm_muram_offset(mspi->tx_bd));
	cpm_muram_free(cpm_muram_offset(mspi->pram));
837
	fsl_spi_free_dummy_rx();
838 839
}

840
static void fsl_spi_remove(struct mpc8xxx_spi *mspi)
841
{
842 843
	iounmap(mspi->reg_base);
	fsl_spi_cpm_free(mspi);
844 845
}

846
static struct spi_master * fsl_spi_probe(struct device *dev,
847
		struct resource *mem, unsigned int irq)
848
{
849
	struct fsl_spi_platform_data *pdata = dev->platform_data;
850
	struct spi_master *master;
A
Anton Vorontsov 已提交
851
	struct mpc8xxx_spi *mpc8xxx_spi;
852
	struct fsl_spi_reg *reg_base;
853 854 855
	u32 regval;
	int ret = 0;

A
Anton Vorontsov 已提交
856
	master = spi_alloc_master(dev, sizeof(struct mpc8xxx_spi));
857 858 859 860 861
	if (master == NULL) {
		ret = -ENOMEM;
		goto err;
	}

862
	dev_set_drvdata(dev, master);
863

864 865 866
	ret = mpc8xxx_spi_probe(dev, mem, irq);
	if (ret)
		goto err_probe;
867

868
	master->setup = fsl_spi_setup;
A
Anton Vorontsov 已提交
869 870

	mpc8xxx_spi = spi_master_get_devdata(master);
871 872 873
	mpc8xxx_spi->spi_do_one_msg = fsl_spi_do_one_msg;
	mpc8xxx_spi->spi_remove = fsl_spi_remove;

A
Anton Vorontsov 已提交
874

875
	ret = fsl_spi_cpm_init(mpc8xxx_spi);
876 877 878
	if (ret)
		goto err_cpm_init;

879
	if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE) {
A
Anton Vorontsov 已提交
880 881
		mpc8xxx_spi->rx_shift = 16;
		mpc8xxx_spi->tx_shift = 24;
882 883
	}

884 885
	mpc8xxx_spi->reg_base = ioremap(mem->start, resource_size(mem));
	if (mpc8xxx_spi->reg_base == NULL) {
886
		ret = -ENOMEM;
887
		goto err_ioremap;
888 889 890
	}

	/* Register for SPI Interrupt */
891 892
	ret = request_irq(mpc8xxx_spi->irq, fsl_spi_irq,
			  0, "fsl_spi", mpc8xxx_spi);
893 894

	if (ret != 0)
895
		goto free_irq;
896

897
	reg_base = mpc8xxx_spi->reg_base;
898 899

	/* SPI controller initializations */
900 901 902 903
	mpc8xxx_spi_write_reg(&reg_base->mode, 0);
	mpc8xxx_spi_write_reg(&reg_base->mask, 0);
	mpc8xxx_spi_write_reg(&reg_base->command, 0);
	mpc8xxx_spi_write_reg(&reg_base->event, 0xffffffff);
904 905 906

	/* Enable SPI interface */
	regval = pdata->initial_spmode | SPMODE_INIT_VAL | SPMODE_ENABLE;
907
	if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE)
908 909
		regval |= SPMODE_OP;

910
	mpc8xxx_spi_write_reg(&reg_base->mode, regval);
911 912 913 914

	ret = spi_register_master(master);
	if (ret < 0)
		goto unreg_master;
915

916
	dev_info(dev, "at 0x%p (irq = %d), %s mode\n", reg_base,
917
		 mpc8xxx_spi->irq, mpc8xxx_spi_strmode(mpc8xxx_spi->flags));
918

919
	return master;
920

921
unreg_master:
A
Anton Vorontsov 已提交
922
	free_irq(mpc8xxx_spi->irq, mpc8xxx_spi);
923 924
free_irq:
	iounmap(mpc8xxx_spi->reg_base);
925
err_ioremap:
926
	fsl_spi_cpm_free(mpc8xxx_spi);
927
err_cpm_init:
928
err_probe:
929 930
	spi_master_put(master);
err:
931
	return ERR_PTR(ret);
932 933
}

934
static void fsl_spi_cs_control(struct spi_device *spi, bool on)
935
{
936
	struct device *dev = spi->dev.parent->parent;
A
Anton Vorontsov 已提交
937
	struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(dev->platform_data);
938 939 940 941 942 943 944
	u16 cs = spi->chip_select;
	int gpio = pinfo->gpios[cs];
	bool alow = pinfo->alow_flags[cs];

	gpio_set_value(gpio, on ^ alow);
}

945
static int of_fsl_spi_get_chipselects(struct device *dev)
946
{
947
	struct device_node *np = dev->of_node;
948
	struct fsl_spi_platform_data *pdata = dev->platform_data;
A
Anton Vorontsov 已提交
949
	struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(pdata);
950
	int ngpios;
951 952 953 954
	int i = 0;
	int ret;

	ngpios = of_gpio_count(np);
955
	if (ngpios <= 0) {
956 957 958 959 960 961 962 963
		/*
		 * SPI w/o chip-select line. One SPI device is still permitted
		 * though.
		 */
		pdata->max_chipselect = 1;
		return 0;
	}

964
	pinfo->gpios = kmalloc(ngpios * sizeof(*pinfo->gpios), GFP_KERNEL);
965 966
	if (!pinfo->gpios)
		return -ENOMEM;
967
	memset(pinfo->gpios, -1, ngpios * sizeof(*pinfo->gpios));
968

969
	pinfo->alow_flags = kzalloc(ngpios * sizeof(*pinfo->alow_flags),
970 971 972 973 974 975 976 977 978 979 980 981 982
				    GFP_KERNEL);
	if (!pinfo->alow_flags) {
		ret = -ENOMEM;
		goto err_alloc_flags;
	}

	for (; i < ngpios; i++) {
		int gpio;
		enum of_gpio_flags flags;

		gpio = of_get_gpio_flags(np, i, &flags);
		if (!gpio_is_valid(gpio)) {
			dev_err(dev, "invalid gpio #%d: %d\n", i, gpio);
983
			ret = gpio;
984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005
			goto err_loop;
		}

		ret = gpio_request(gpio, dev_name(dev));
		if (ret) {
			dev_err(dev, "can't request gpio #%d: %d\n", i, ret);
			goto err_loop;
		}

		pinfo->gpios[i] = gpio;
		pinfo->alow_flags[i] = flags & OF_GPIO_ACTIVE_LOW;

		ret = gpio_direction_output(pinfo->gpios[i],
					    pinfo->alow_flags[i]);
		if (ret) {
			dev_err(dev, "can't set output direction for gpio "
				"#%d: %d\n", i, ret);
			goto err_loop;
		}
	}

	pdata->max_chipselect = ngpios;
1006
	pdata->cs_control = fsl_spi_cs_control;
1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024

	return 0;

err_loop:
	while (i >= 0) {
		if (gpio_is_valid(pinfo->gpios[i]))
			gpio_free(pinfo->gpios[i]);
		i--;
	}

	kfree(pinfo->alow_flags);
	pinfo->alow_flags = NULL;
err_alloc_flags:
	kfree(pinfo->gpios);
	pinfo->gpios = NULL;
	return ret;
}

1025
static int of_fsl_spi_free_chipselects(struct device *dev)
1026 1027
{
	struct fsl_spi_platform_data *pdata = dev->platform_data;
A
Anton Vorontsov 已提交
1028
	struct mpc8xxx_spi_probe_info *pinfo = to_of_pinfo(pdata);
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
	int i;

	if (!pinfo->gpios)
		return 0;

	for (i = 0; i < pdata->max_chipselect; i++) {
		if (gpio_is_valid(pinfo->gpios[i]))
			gpio_free(pinfo->gpios[i]);
	}

	kfree(pinfo->gpios);
	kfree(pinfo->alow_flags);
	return 0;
}

1044
static int of_fsl_spi_probe(struct platform_device *ofdev)
1045 1046
{
	struct device *dev = &ofdev->dev;
1047
	struct device_node *np = ofdev->dev.of_node;
1048 1049 1050 1051 1052
	struct spi_master *master;
	struct resource mem;
	struct resource irq;
	int ret = -ENOMEM;

1053
	ret = of_mpc8xxx_spi_probe(ofdev);
1054 1055
	if (ret)
		return ret;
1056

1057
	ret = of_fsl_spi_get_chipselects(dev);
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
	if (ret)
		goto err;

	ret = of_address_to_resource(np, 0, &mem);
	if (ret)
		goto err;

	ret = of_irq_to_resource(np, 0, &irq);
	if (!ret) {
		ret = -EINVAL;
		goto err;
	}

1071
	master = fsl_spi_probe(dev, &mem, irq.start);
1072 1073 1074 1075 1076 1077 1078 1079
	if (IS_ERR(master)) {
		ret = PTR_ERR(master);
		goto err;
	}

	return 0;

err:
1080
	of_fsl_spi_free_chipselects(dev);
1081 1082 1083
	return ret;
}

1084
static int of_fsl_spi_remove(struct platform_device *ofdev)
1085 1086 1087
{
	int ret;

A
Anton Vorontsov 已提交
1088
	ret = mpc8xxx_spi_remove(&ofdev->dev);
1089 1090
	if (ret)
		return ret;
1091
	of_fsl_spi_free_chipselects(&ofdev->dev);
1092 1093 1094
	return 0;
}

1095
static const struct of_device_id of_fsl_spi_match[] = {
1096
	{ .compatible = "fsl,spi" },
1097
	{}
1098
};
1099
MODULE_DEVICE_TABLE(of, of_fsl_spi_match);
1100

1101
static struct platform_driver of_fsl_spi_driver = {
1102
	.driver = {
1103
		.name = "fsl_spi",
1104
		.owner = THIS_MODULE,
1105
		.of_match_table = of_fsl_spi_match,
1106
	},
1107
	.probe		= of_fsl_spi_probe,
1108
	.remove		= of_fsl_spi_remove,
1109 1110 1111 1112
};

#ifdef CONFIG_MPC832x_RDB
/*
1113
 * XXX XXX XXX
1114 1115 1116 1117 1118
 * This is "legacy" platform driver, was used by the MPC8323E-RDB boards
 * only. The driver should go away soon, since newer MPC8323E-RDB's device
 * tree can work with OpenFirmware driver. But for now we support old trees
 * as well.
 */
1119
static int plat_mpc8xxx_spi_probe(struct platform_device *pdev)
1120 1121
{
	struct resource *mem;
1122
	int irq;
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
	struct spi_master *master;

	if (!pdev->dev.platform_data)
		return -EINVAL;

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem)
		return -EINVAL;

	irq = platform_get_irq(pdev, 0);
1133
	if (irq <= 0)
1134 1135
		return -EINVAL;

1136
	master = fsl_spi_probe(&pdev->dev, mem, irq);
1137 1138 1139 1140 1141
	if (IS_ERR(master))
		return PTR_ERR(master);
	return 0;
}

1142
static int plat_mpc8xxx_spi_remove(struct platform_device *pdev)
1143
{
A
Anton Vorontsov 已提交
1144
	return mpc8xxx_spi_remove(&pdev->dev);
1145 1146
}

A
Anton Vorontsov 已提交
1147 1148 1149
MODULE_ALIAS("platform:mpc8xxx_spi");
static struct platform_driver mpc8xxx_spi_driver = {
	.probe = plat_mpc8xxx_spi_probe,
1150
	.remove = plat_mpc8xxx_spi_remove,
1151
	.driver = {
A
Anton Vorontsov 已提交
1152
		.name = "mpc8xxx_spi",
1153
		.owner = THIS_MODULE,
1154 1155 1156
	},
};

1157 1158 1159 1160
static bool legacy_driver_failed;

static void __init legacy_driver_register(void)
{
A
Anton Vorontsov 已提交
1161
	legacy_driver_failed = platform_driver_register(&mpc8xxx_spi_driver);
1162 1163 1164 1165 1166 1167
}

static void __exit legacy_driver_unregister(void)
{
	if (legacy_driver_failed)
		return;
A
Anton Vorontsov 已提交
1168
	platform_driver_unregister(&mpc8xxx_spi_driver);
1169 1170 1171 1172 1173 1174
}
#else
static void __init legacy_driver_register(void) {}
static void __exit legacy_driver_unregister(void) {}
#endif /* CONFIG_MPC832x_RDB */

1175
static int __init fsl_spi_init(void)
1176
{
1177
	legacy_driver_register();
1178
	return platform_driver_register(&of_fsl_spi_driver);
1179
}
1180
module_init(fsl_spi_init);
1181

1182
static void __exit fsl_spi_exit(void)
1183
{
1184
	platform_driver_unregister(&of_fsl_spi_driver);
1185
	legacy_driver_unregister();
1186
}
1187
module_exit(fsl_spi_exit);
1188 1189

MODULE_AUTHOR("Kumar Gala");
1190
MODULE_DESCRIPTION("Simple Freescale SPI Driver");
1191
MODULE_LICENSE("GPL");