spi-imx.c 22.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
 * Copyright (C) 2008 Juergen Beisert
 *
 * 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.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the
 * Free Software Foundation
 * 51 Franklin Street, Fifth Floor
 * Boston, MA  02110-1301, USA.
 */

#include <linux/clk.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
33
#include <linux/slab.h>
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h>
#include <linux/types.h>

#include <mach/spi.h>

#define DRIVER_NAME "spi_imx"

#define MXC_CSPIRXDATA		0x00
#define MXC_CSPITXDATA		0x04
#define MXC_CSPICTRL		0x08
#define MXC_CSPIINT		0x0c
#define MXC_RESET		0x1c

/* generic defines to abstract from the different register layouts */
#define MXC_INT_RR	(1 << 0) /* Receive data ready interrupt */
#define MXC_INT_TE	(1 << 1) /* Transmit FIFO empty interrupt */

52
struct spi_imx_config {
53 54 55
	unsigned int speed_hz;
	unsigned int bpw;
	unsigned int mode;
56
	u8 cs;
57 58
};

59 60 61 62
enum spi_imx_devtype {
	SPI_IMX_VER_IMX1,
	SPI_IMX_VER_0_0,
	SPI_IMX_VER_0_4,
63
	SPI_IMX_VER_2_3,
64 65 66 67 68 69 70 71 72
};

struct spi_imx_data;

struct spi_imx_devtype_data {
	void (*intctrl)(struct spi_imx_data *, int);
	int (*config)(struct spi_imx_data *, struct spi_imx_config *);
	void (*trigger)(struct spi_imx_data *);
	int (*rx_available)(struct spi_imx_data *);
73
	void (*reset)(struct spi_imx_data *);
74
	unsigned int fifosize;
75 76
};

77
struct spi_imx_data {
78 79 80 81 82 83 84 85 86 87
	struct spi_bitbang bitbang;

	struct completion xfer_done;
	void *base;
	int irq;
	struct clk *clk;
	unsigned long spi_clk;
	int *chipselect;

	unsigned int count;
88 89
	void (*tx)(struct spi_imx_data *);
	void (*rx)(struct spi_imx_data *);
90 91 92 93
	void *rx_buf;
	const void *tx_buf;
	unsigned int txfifo; /* number of words pushed in tx FIFO */

94
	struct spi_imx_devtype_data *devtype_data;
95 96 97
};

#define MXC_SPI_BUF_RX(type)						\
98
static void spi_imx_buf_rx_##type(struct spi_imx_data *spi_imx)		\
99
{									\
100
	unsigned int val = readl(spi_imx->base + MXC_CSPIRXDATA);	\
101
									\
102 103 104
	if (spi_imx->rx_buf) {						\
		*(type *)spi_imx->rx_buf = val;				\
		spi_imx->rx_buf += sizeof(type);			\
105 106 107 108
	}								\
}

#define MXC_SPI_BUF_TX(type)						\
109
static void spi_imx_buf_tx_##type(struct spi_imx_data *spi_imx)		\
110 111 112
{									\
	type val = 0;							\
									\
113 114 115
	if (spi_imx->tx_buf) {						\
		val = *(type *)spi_imx->tx_buf;				\
		spi_imx->tx_buf += sizeof(type);			\
116 117
	}								\
									\
118
	spi_imx->count -= sizeof(type);					\
119
									\
120
	writel(val, spi_imx->base + MXC_CSPITXDATA);			\
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
}

MXC_SPI_BUF_RX(u8)
MXC_SPI_BUF_TX(u8)
MXC_SPI_BUF_RX(u16)
MXC_SPI_BUF_TX(u16)
MXC_SPI_BUF_RX(u32)
MXC_SPI_BUF_TX(u32)

/* First entry is reserved, second entry is valid only if SDHC_SPIEN is set
 * (which is currently not the case in this driver)
 */
static int mxc_clkdivs[] = {0, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192,
	256, 384, 512, 768, 1024};

/* MX21, MX27 */
137
static unsigned int spi_imx_clkdiv_1(unsigned int fin,
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
		unsigned int fspi)
{
	int i, max;

	if (cpu_is_mx21())
		max = 18;
	else
		max = 16;

	for (i = 2; i < max; i++)
		if (fspi * mxc_clkdivs[i] >= fin)
			return i;

	return max;
}

154
/* MX1, MX31, MX35, MX51 CSPI */
155
static unsigned int spi_imx_clkdiv_2(unsigned int fin,
156 157 158 159 160 161 162 163 164 165 166 167 168
		unsigned int fspi)
{
	int i, div = 4;

	for (i = 0; i < 7; i++) {
		if (fspi * div >= fin)
			return i;
		div <<= 1;
	}

	return 7;
}

169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
#define MX51_ECSPI_CTRL		0x08
#define MX51_ECSPI_CTRL_ENABLE		(1 <<  0)
#define MX51_ECSPI_CTRL_XCH		(1 <<  2)
#define MX51_ECSPI_CTRL_MODE_MASK	(0xf << 4)
#define MX51_ECSPI_CTRL_POSTDIV_OFFSET	8
#define MX51_ECSPI_CTRL_PREDIV_OFFSET	12
#define MX51_ECSPI_CTRL_CS(cs)		((cs) << 18)
#define MX51_ECSPI_CTRL_BL_OFFSET	20

#define MX51_ECSPI_CONFIG	0x0c
#define MX51_ECSPI_CONFIG_SCLKPHA(cs)	(1 << ((cs) +  0))
#define MX51_ECSPI_CONFIG_SCLKPOL(cs)	(1 << ((cs) +  4))
#define MX51_ECSPI_CONFIG_SBBCTRL(cs)	(1 << ((cs) +  8))
#define MX51_ECSPI_CONFIG_SSBPOL(cs)	(1 << ((cs) + 12))

#define MX51_ECSPI_INT		0x10
#define MX51_ECSPI_INT_TEEN		(1 <<  0)
#define MX51_ECSPI_INT_RREN		(1 <<  3)

#define MX51_ECSPI_STAT		0x18
#define MX51_ECSPI_STAT_RR		(1 <<  3)
190 191

/* MX51 eCSPI */
192
static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi)
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
{
	/*
	 * there are two 4-bit dividers, the pre-divider divides by
	 * $pre, the post-divider by 2^$post
	 */
	unsigned int pre, post;

	if (unlikely(fspi > fin))
		return 0;

	post = fls(fin) - fls(fspi);
	if (fin > fspi << post)
		post++;

	/* now we have: (fin <= fspi << post) with post being minimal */

	post = max(4U, post) - 4;
	if (unlikely(post > 0xf)) {
		pr_err("%s: cannot set clock freq: %u (base freq: %u)\n",
				__func__, fspi, fin);
		return 0xff;
	}

	pre = DIV_ROUND_UP(fin, fspi << post) - 1;

	pr_debug("%s: fin: %u, fspi: %u, post: %u, pre: %u\n",
			__func__, fin, fspi, post, pre);
220 221
	return (pre << MX51_ECSPI_CTRL_PREDIV_OFFSET) |
		(post << MX51_ECSPI_CTRL_POSTDIV_OFFSET);
222 223
}

224
static void __maybe_unused mx51_ecspi_intctrl(struct spi_imx_data *spi_imx, int enable)
225 226 227 228
{
	unsigned val = 0;

	if (enable & MXC_INT_TE)
229
		val |= MX51_ECSPI_INT_TEEN;
230 231

	if (enable & MXC_INT_RR)
232
		val |= MX51_ECSPI_INT_RREN;
233

234
	writel(val, spi_imx->base + MX51_ECSPI_INT);
235 236
}

237
static void __maybe_unused mx51_ecspi_trigger(struct spi_imx_data *spi_imx)
238 239 240
{
	u32 reg;

241 242 243
	reg = readl(spi_imx->base + MX51_ECSPI_CTRL);
	reg |= MX51_ECSPI_CTRL_XCH;
	writel(reg, spi_imx->base + MX51_ECSPI_CTRL);
244 245
}

246
static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
247 248
		struct spi_imx_config *config)
{
249
	u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0;
250

251 252 253 254 255 256 257
	/*
	 * The hardware seems to have a race condition when changing modes. The
	 * current assumption is that the selection of the channel arrives
	 * earlier in the hardware than the mode bits when they are written at
	 * the same time.
	 * So set master mode for all channels as we do not support slave mode.
	 */
258
	ctrl |= MX51_ECSPI_CTRL_MODE_MASK;
259 260

	/* set clock speed */
261
	ctrl |= mx51_ecspi_clkdiv(spi_imx->spi_clk, config->speed_hz);
262 263

	/* set chip select to use */
264
	ctrl |= MX51_ECSPI_CTRL_CS(config->cs);
265

266
	ctrl |= (config->bpw - 1) << MX51_ECSPI_CTRL_BL_OFFSET;
267

268
	cfg |= MX51_ECSPI_CONFIG_SBBCTRL(config->cs);
269 270

	if (config->mode & SPI_CPHA)
271
		cfg |= MX51_ECSPI_CONFIG_SCLKPHA(config->cs);
272 273

	if (config->mode & SPI_CPOL)
274
		cfg |= MX51_ECSPI_CONFIG_SCLKPOL(config->cs);
275 276

	if (config->mode & SPI_CS_HIGH)
277
		cfg |= MX51_ECSPI_CONFIG_SSBPOL(config->cs);
278

279 280
	writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
	writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
281 282 283 284

	return 0;
}

285
static int __maybe_unused mx51_ecspi_rx_available(struct spi_imx_data *spi_imx)
286
{
287
	return readl(spi_imx->base + MX51_ECSPI_STAT) & MX51_ECSPI_STAT_RR;
288 289
}

290
static void __maybe_unused mx51_ecspi_reset(struct spi_imx_data *spi_imx)
291 292
{
	/* drain receive buffer */
293
	while (mx51_ecspi_rx_available(spi_imx))
294 295 296
		readl(spi_imx->base + MXC_CSPIRXDATA);
}

297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
#define MX31_INTREG_TEEN	(1 << 0)
#define MX31_INTREG_RREN	(1 << 3)

#define MX31_CSPICTRL_ENABLE	(1 << 0)
#define MX31_CSPICTRL_MASTER	(1 << 1)
#define MX31_CSPICTRL_XCH	(1 << 2)
#define MX31_CSPICTRL_POL	(1 << 4)
#define MX31_CSPICTRL_PHA	(1 << 5)
#define MX31_CSPICTRL_SSCTL	(1 << 6)
#define MX31_CSPICTRL_SSPOL	(1 << 7)
#define MX31_CSPICTRL_BC_SHIFT	8
#define MX35_CSPICTRL_BL_SHIFT	20
#define MX31_CSPICTRL_CS_SHIFT	24
#define MX35_CSPICTRL_CS_SHIFT	12
#define MX31_CSPICTRL_DR_SHIFT	16

#define MX31_CSPISTATUS		0x14
#define MX31_STATUS_RR		(1 << 3)

/* These functions also work for the i.MX35, but be aware that
 * the i.MX35 has a slightly different register layout for bits
 * we do not use here.
 */
320
static void __maybe_unused mx31_intctrl(struct spi_imx_data *spi_imx, int enable)
321 322 323 324 325 326 327 328
{
	unsigned int val = 0;

	if (enable & MXC_INT_TE)
		val |= MX31_INTREG_TEEN;
	if (enable & MXC_INT_RR)
		val |= MX31_INTREG_RREN;

329
	writel(val, spi_imx->base + MXC_CSPIINT);
330 331
}

332
static void __maybe_unused mx31_trigger(struct spi_imx_data *spi_imx)
333 334 335
{
	unsigned int reg;

336
	reg = readl(spi_imx->base + MXC_CSPICTRL);
337
	reg |= MX31_CSPICTRL_XCH;
338
	writel(reg, spi_imx->base + MXC_CSPICTRL);
339 340
}

341
static int __maybe_unused mx31_config(struct spi_imx_data *spi_imx,
342 343 344
		struct spi_imx_config *config)
{
	unsigned int reg = MX31_CSPICTRL_ENABLE | MX31_CSPICTRL_MASTER;
345
	int cs = spi_imx->chipselect[config->cs];
346 347 348 349

	reg |= spi_imx_clkdiv_2(spi_imx->spi_clk, config->speed_hz) <<
		MX31_CSPICTRL_DR_SHIFT;

350 351 352 353 354 355
	if (cpu_is_mx35()) {
		reg |= (config->bpw - 1) << MX35_CSPICTRL_BL_SHIFT;
		reg |= MX31_CSPICTRL_SSCTL;
	} else {
		reg |= (config->bpw - 1) << MX31_CSPICTRL_BC_SHIFT;
	}
356 357 358 359 360 361 362

	if (config->mode & SPI_CPHA)
		reg |= MX31_CSPICTRL_PHA;
	if (config->mode & SPI_CPOL)
		reg |= MX31_CSPICTRL_POL;
	if (config->mode & SPI_CS_HIGH)
		reg |= MX31_CSPICTRL_SSPOL;
363
	if (cs < 0)
364 365 366
		reg |= (cs + 32) <<
			(cpu_is_mx35() ? MX35_CSPICTRL_CS_SHIFT :
					 MX31_CSPICTRL_CS_SHIFT);
367 368 369 370 371 372

	writel(reg, spi_imx->base + MXC_CSPICTRL);

	return 0;
}

373
static int __maybe_unused mx31_rx_available(struct spi_imx_data *spi_imx)
374
{
375
	return readl(spi_imx->base + MX31_CSPISTATUS) & MX31_STATUS_RR;
376 377
}

378
static void __maybe_unused mx31_reset(struct spi_imx_data *spi_imx)
379 380
{
	/* drain receive buffer */
381
	while (readl(spi_imx->base + MX31_CSPISTATUS) & MX31_STATUS_RR)
382 383 384
		readl(spi_imx->base + MXC_CSPIRXDATA);
}

385 386 387 388 389 390 391 392 393 394 395 396 397 398
#define MX21_INTREG_RR		(1 << 4)
#define MX21_INTREG_TEEN	(1 << 9)
#define MX21_INTREG_RREN	(1 << 13)

#define MX21_CSPICTRL_POL	(1 << 5)
#define MX21_CSPICTRL_PHA	(1 << 6)
#define MX21_CSPICTRL_SSPOL	(1 << 8)
#define MX21_CSPICTRL_XCH	(1 << 9)
#define MX21_CSPICTRL_ENABLE	(1 << 10)
#define MX21_CSPICTRL_MASTER	(1 << 11)
#define MX21_CSPICTRL_DR_SHIFT	14
#define MX21_CSPICTRL_CS_SHIFT	19

static void __maybe_unused mx21_intctrl(struct spi_imx_data *spi_imx, int enable)
399 400 401 402
{
	unsigned int val = 0;

	if (enable & MXC_INT_TE)
403
		val |= MX21_INTREG_TEEN;
404
	if (enable & MXC_INT_RR)
405
		val |= MX21_INTREG_RREN;
406

407
	writel(val, spi_imx->base + MXC_CSPIINT);
408 409
}

410
static void __maybe_unused mx21_trigger(struct spi_imx_data *spi_imx)
411 412 413
{
	unsigned int reg;

414
	reg = readl(spi_imx->base + MXC_CSPICTRL);
415
	reg |= MX21_CSPICTRL_XCH;
416
	writel(reg, spi_imx->base + MXC_CSPICTRL);
417 418
}

419
static int __maybe_unused mx21_config(struct spi_imx_data *spi_imx,
420
		struct spi_imx_config *config)
421
{
422
	unsigned int reg = MX21_CSPICTRL_ENABLE | MX21_CSPICTRL_MASTER;
423
	int cs = spi_imx->chipselect[config->cs];
424

425
	reg |= spi_imx_clkdiv_1(spi_imx->spi_clk, config->speed_hz) <<
426
		MX21_CSPICTRL_DR_SHIFT;
427 428 429
	reg |= config->bpw - 1;

	if (config->mode & SPI_CPHA)
430
		reg |= MX21_CSPICTRL_PHA;
431
	if (config->mode & SPI_CPOL)
432
		reg |= MX21_CSPICTRL_POL;
433
	if (config->mode & SPI_CS_HIGH)
434
		reg |= MX21_CSPICTRL_SSPOL;
435
	if (cs < 0)
436
		reg |= (cs + 32) << MX21_CSPICTRL_CS_SHIFT;
437

438
	writel(reg, spi_imx->base + MXC_CSPICTRL);
439 440 441 442

	return 0;
}

443
static int __maybe_unused mx21_rx_available(struct spi_imx_data *spi_imx)
444
{
445
	return readl(spi_imx->base + MXC_CSPIINT) & MX21_INTREG_RR;
446 447
}

448
static void __maybe_unused mx21_reset(struct spi_imx_data *spi_imx)
449 450 451 452
{
	writel(1, spi_imx->base + MXC_RESET);
}

453 454 455 456 457 458 459 460 461 462 463
#define MX1_INTREG_RR		(1 << 3)
#define MX1_INTREG_TEEN		(1 << 8)
#define MX1_INTREG_RREN		(1 << 11)

#define MX1_CSPICTRL_POL	(1 << 4)
#define MX1_CSPICTRL_PHA	(1 << 5)
#define MX1_CSPICTRL_XCH	(1 << 8)
#define MX1_CSPICTRL_ENABLE	(1 << 9)
#define MX1_CSPICTRL_MASTER	(1 << 10)
#define MX1_CSPICTRL_DR_SHIFT	13

464
static void __maybe_unused mx1_intctrl(struct spi_imx_data *spi_imx, int enable)
465 466 467 468 469 470 471 472
{
	unsigned int val = 0;

	if (enable & MXC_INT_TE)
		val |= MX1_INTREG_TEEN;
	if (enable & MXC_INT_RR)
		val |= MX1_INTREG_RREN;

473
	writel(val, spi_imx->base + MXC_CSPIINT);
474 475
}

476
static void __maybe_unused mx1_trigger(struct spi_imx_data *spi_imx)
477 478 479
{
	unsigned int reg;

480
	reg = readl(spi_imx->base + MXC_CSPICTRL);
481
	reg |= MX1_CSPICTRL_XCH;
482
	writel(reg, spi_imx->base + MXC_CSPICTRL);
483 484
}

485
static int __maybe_unused mx1_config(struct spi_imx_data *spi_imx,
486
		struct spi_imx_config *config)
487 488 489
{
	unsigned int reg = MX1_CSPICTRL_ENABLE | MX1_CSPICTRL_MASTER;

490
	reg |= spi_imx_clkdiv_2(spi_imx->spi_clk, config->speed_hz) <<
491 492 493 494 495 496 497 498
		MX1_CSPICTRL_DR_SHIFT;
	reg |= config->bpw - 1;

	if (config->mode & SPI_CPHA)
		reg |= MX1_CSPICTRL_PHA;
	if (config->mode & SPI_CPOL)
		reg |= MX1_CSPICTRL_POL;

499
	writel(reg, spi_imx->base + MXC_CSPICTRL);
500 501 502 503

	return 0;
}

504
static int __maybe_unused mx1_rx_available(struct spi_imx_data *spi_imx)
505
{
506
	return readl(spi_imx->base + MXC_CSPIINT) & MX1_INTREG_RR;
507 508
}

509 510 511 512 513
static void __maybe_unused mx1_reset(struct spi_imx_data *spi_imx)
{
	writel(1, spi_imx->base + MXC_RESET);
}

514 515 516 517
/*
 * These version numbers are taken from the Freescale driver.  Unfortunately it
 * doesn't support i.MX1, so this entry doesn't match the scheme. :-(
 */
518
static struct spi_imx_devtype_data spi_imx_devtype_data[] = {
519 520 521 522 523 524
#ifdef CONFIG_SPI_IMX_VER_IMX1
	[SPI_IMX_VER_IMX1] = {
		.intctrl = mx1_intctrl,
		.config = mx1_config,
		.trigger = mx1_trigger,
		.rx_available = mx1_rx_available,
525
		.reset = mx1_reset,
526
		.fifosize = 8,
527 528 529 530
	},
#endif
#ifdef CONFIG_SPI_IMX_VER_0_0
	[SPI_IMX_VER_0_0] = {
531 532 533 534 535
		.intctrl = mx21_intctrl,
		.config = mx21_config,
		.trigger = mx21_trigger,
		.rx_available = mx21_rx_available,
		.reset = mx21_reset,
536
		.fifosize = 8,
537 538 539 540 541
	},
#endif
#ifdef CONFIG_SPI_IMX_VER_0_4
	[SPI_IMX_VER_0_4] = {
		.intctrl = mx31_intctrl,
542
		.config = mx31_config,
543 544
		.trigger = mx31_trigger,
		.rx_available = mx31_rx_available,
545
		.reset = mx31_reset,
546
		.fifosize = 8,
547 548
	},
#endif
549 550
#ifdef CONFIG_SPI_IMX_VER_2_3
	[SPI_IMX_VER_2_3] = {
551 552 553 554 555
		.intctrl = mx51_ecspi_intctrl,
		.config = mx51_ecspi_config,
		.trigger = mx51_ecspi_trigger,
		.rx_available = mx51_ecspi_rx_available,
		.reset = mx51_ecspi_reset,
556
		.fifosize = 64,
557 558
	},
#endif
559 560
};

561
static void spi_imx_chipselect(struct spi_device *spi, int is_active)
562
{
563 564
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
	int gpio = spi_imx->chipselect[spi->chip_select];
565 566
	int active = is_active != BITBANG_CS_INACTIVE;
	int dev_is_lowactive = !(spi->mode & SPI_CS_HIGH);
567

568
	if (gpio < 0)
569 570
		return;

571
	gpio_set_value(gpio, dev_is_lowactive ^ active);
572 573
}

574
static void spi_imx_push(struct spi_imx_data *spi_imx)
575
{
576
	while (spi_imx->txfifo < spi_imx->devtype_data->fifosize) {
577
		if (!spi_imx->count)
578
			break;
579 580
		spi_imx->tx(spi_imx);
		spi_imx->txfifo++;
581 582
	}

583
	spi_imx->devtype_data->trigger(spi_imx);
584 585
}

586
static irqreturn_t spi_imx_isr(int irq, void *dev_id)
587
{
588
	struct spi_imx_data *spi_imx = dev_id;
589

590
	while (spi_imx->devtype_data->rx_available(spi_imx)) {
591 592
		spi_imx->rx(spi_imx);
		spi_imx->txfifo--;
593 594
	}

595 596
	if (spi_imx->count) {
		spi_imx_push(spi_imx);
597 598 599
		return IRQ_HANDLED;
	}

600
	if (spi_imx->txfifo) {
601 602 603
		/* No data left to push, but still waiting for rx data,
		 * enable receive data available interrupt.
		 */
604
		spi_imx->devtype_data->intctrl(
605
				spi_imx, MXC_INT_RR);
606 607 608
		return IRQ_HANDLED;
	}

609
	spi_imx->devtype_data->intctrl(spi_imx, 0);
610
	complete(&spi_imx->xfer_done);
611 612 613 614

	return IRQ_HANDLED;
}

615
static int spi_imx_setupxfer(struct spi_device *spi,
616 617
				 struct spi_transfer *t)
{
618 619
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
	struct spi_imx_config config;
620 621 622 623

	config.bpw = t ? t->bits_per_word : spi->bits_per_word;
	config.speed_hz  = t ? t->speed_hz : spi->max_speed_hz;
	config.mode = spi->mode;
624
	config.cs = spi->chip_select;
625

S
Sascha Hauer 已提交
626 627 628 629 630 631 632
	if (!config.speed_hz)
		config.speed_hz = spi->max_speed_hz;
	if (!config.bpw)
		config.bpw = spi->bits_per_word;
	if (!config.speed_hz)
		config.speed_hz = spi->max_speed_hz;

633 634 635 636 637 638 639 640 641 642 643 644 645
	/* Initialize the functions for transfer */
	if (config.bpw <= 8) {
		spi_imx->rx = spi_imx_buf_rx_u8;
		spi_imx->tx = spi_imx_buf_tx_u8;
	} else if (config.bpw <= 16) {
		spi_imx->rx = spi_imx_buf_rx_u16;
		spi_imx->tx = spi_imx_buf_tx_u16;
	} else if (config.bpw <= 32) {
		spi_imx->rx = spi_imx_buf_rx_u32;
		spi_imx->tx = spi_imx_buf_tx_u32;
	} else
		BUG();

646
	spi_imx->devtype_data->config(spi_imx, &config);
647 648 649 650

	return 0;
}

651
static int spi_imx_transfer(struct spi_device *spi,
652 653
				struct spi_transfer *transfer)
{
654
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
655

656 657 658 659
	spi_imx->tx_buf = transfer->tx_buf;
	spi_imx->rx_buf = transfer->rx_buf;
	spi_imx->count = transfer->len;
	spi_imx->txfifo = 0;
660

661
	init_completion(&spi_imx->xfer_done);
662

663
	spi_imx_push(spi_imx);
664

665
	spi_imx->devtype_data->intctrl(spi_imx, MXC_INT_TE);
666

667
	wait_for_completion(&spi_imx->xfer_done);
668 669 670 671

	return transfer->len;
}

672
static int spi_imx_setup(struct spi_device *spi)
673
{
674 675 676
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
	int gpio = spi_imx->chipselect[spi->chip_select];

677
	dev_dbg(&spi->dev, "%s: mode %d, %u bpw, %d hz\n", __func__,
678 679
		 spi->mode, spi->bits_per_word, spi->max_speed_hz);

680 681 682
	if (gpio >= 0)
		gpio_direction_output(gpio, spi->mode & SPI_CS_HIGH ? 0 : 1);

683
	spi_imx_chipselect(spi, BITBANG_CS_INACTIVE);
684 685 686 687

	return 0;
}

688
static void spi_imx_cleanup(struct spi_device *spi)
689 690 691
{
}

692 693 694 695 696 697 698 699 700
static struct platform_device_id spi_imx_devtype[] = {
	{
		.name = "imx1-cspi",
		.driver_data = SPI_IMX_VER_IMX1,
	}, {
		.name = "imx21-cspi",
		.driver_data = SPI_IMX_VER_0_0,
	}, {
		.name = "imx25-cspi",
701
		.driver_data = SPI_IMX_VER_0_4,
702 703 704 705 706 707 708 709
	}, {
		.name = "imx27-cspi",
		.driver_data = SPI_IMX_VER_0_0,
	}, {
		.name = "imx31-cspi",
		.driver_data = SPI_IMX_VER_0_4,
	}, {
		.name = "imx35-cspi",
710
		.driver_data = SPI_IMX_VER_0_4,
711 712
	}, {
		.name = "imx51-cspi",
713
		.driver_data = SPI_IMX_VER_0_4,
714 715 716
	}, {
		.name = "imx51-ecspi",
		.driver_data = SPI_IMX_VER_2_3,
Y
Yong Shen 已提交
717 718
	}, {
		.name = "imx53-cspi",
719
		.driver_data = SPI_IMX_VER_0_4,
Y
Yong Shen 已提交
720 721 722
	}, {
		.name = "imx53-ecspi",
		.driver_data = SPI_IMX_VER_2_3,
723 724 725 726 727
	}, {
		/* sentinel */
	}
};

728
static int __devinit spi_imx_probe(struct platform_device *pdev)
729 730 731
{
	struct spi_imx_master *mxc_platform_info;
	struct spi_master *master;
732
	struct spi_imx_data *spi_imx;
733 734 735
	struct resource *res;
	int i, ret;

736
	mxc_platform_info = dev_get_platdata(&pdev->dev);
737 738 739 740 741
	if (!mxc_platform_info) {
		dev_err(&pdev->dev, "can't get the platform data\n");
		return -EINVAL;
	}

742
	master = spi_alloc_master(&pdev->dev, sizeof(struct spi_imx_data));
743 744 745 746 747 748 749 750
	if (!master)
		return -ENOMEM;

	platform_set_drvdata(pdev, master);

	master->bus_num = pdev->id;
	master->num_chipselect = mxc_platform_info->num_chipselect;

751 752 753
	spi_imx = spi_master_get_devdata(master);
	spi_imx->bitbang.master = spi_master_get(master);
	spi_imx->chipselect = mxc_platform_info->chipselect;
754 755

	for (i = 0; i < master->num_chipselect; i++) {
756
		if (spi_imx->chipselect[i] < 0)
757
			continue;
758
		ret = gpio_request(spi_imx->chipselect[i], DRIVER_NAME);
759
		if (ret) {
760 761
			while (i > 0) {
				i--;
762
				if (spi_imx->chipselect[i] >= 0)
763 764 765
					gpio_free(spi_imx->chipselect[i]);
			}
			dev_err(&pdev->dev, "can't get cs gpios\n");
766 767 768 769
			goto out_master_put;
		}
	}

770 771 772 773 774
	spi_imx->bitbang.chipselect = spi_imx_chipselect;
	spi_imx->bitbang.setup_transfer = spi_imx_setupxfer;
	spi_imx->bitbang.txrx_bufs = spi_imx_transfer;
	spi_imx->bitbang.master->setup = spi_imx_setup;
	spi_imx->bitbang.master->cleanup = spi_imx_cleanup;
775
	spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
776

777
	init_completion(&spi_imx->xfer_done);
778

U
Uwe Kleine-König 已提交
779
	spi_imx->devtype_data =
780
		&spi_imx_devtype_data[pdev->id_entry->driver_data];
781

782 783 784 785 786 787 788 789 790 791 792 793 794
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(&pdev->dev, "can't get platform resource\n");
		ret = -ENOMEM;
		goto out_gpio_free;
	}

	if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
		dev_err(&pdev->dev, "request_mem_region failed\n");
		ret = -EBUSY;
		goto out_gpio_free;
	}

795 796
	spi_imx->base = ioremap(res->start, resource_size(res));
	if (!spi_imx->base) {
797 798 799 800
		ret = -EINVAL;
		goto out_release_mem;
	}

801
	spi_imx->irq = platform_get_irq(pdev, 0);
802
	if (spi_imx->irq < 0) {
803 804 805 806
		ret = -EINVAL;
		goto out_iounmap;
	}

807
	ret = request_irq(spi_imx->irq, spi_imx_isr, 0, DRIVER_NAME, spi_imx);
808
	if (ret) {
809
		dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret);
810 811 812
		goto out_iounmap;
	}

813 814
	spi_imx->clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(spi_imx->clk)) {
815
		dev_err(&pdev->dev, "unable to get clock\n");
816
		ret = PTR_ERR(spi_imx->clk);
817 818 819
		goto out_free_irq;
	}

820 821
	clk_enable(spi_imx->clk);
	spi_imx->spi_clk = clk_get_rate(spi_imx->clk);
822

823
	spi_imx->devtype_data->reset(spi_imx);
824

825
	spi_imx->devtype_data->intctrl(spi_imx, 0);
826

827
	ret = spi_bitbang_start(&spi_imx->bitbang);
828 829 830 831 832 833 834 835 836 837
	if (ret) {
		dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
		goto out_clk_put;
	}

	dev_info(&pdev->dev, "probed\n");

	return ret;

out_clk_put:
838 839
	clk_disable(spi_imx->clk);
	clk_put(spi_imx->clk);
840
out_free_irq:
841
	free_irq(spi_imx->irq, spi_imx);
842
out_iounmap:
843
	iounmap(spi_imx->base);
844 845 846 847
out_release_mem:
	release_mem_region(res->start, resource_size(res));
out_gpio_free:
	for (i = 0; i < master->num_chipselect; i++)
848 849
		if (spi_imx->chipselect[i] >= 0)
			gpio_free(spi_imx->chipselect[i]);
850 851 852 853 854 855 856
out_master_put:
	spi_master_put(master);
	kfree(master);
	platform_set_drvdata(pdev, NULL);
	return ret;
}

857
static int __devexit spi_imx_remove(struct platform_device *pdev)
858 859 860
{
	struct spi_master *master = platform_get_drvdata(pdev);
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
861
	struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
862 863
	int i;

864
	spi_bitbang_stop(&spi_imx->bitbang);
865

866 867 868 869 870
	writel(0, spi_imx->base + MXC_CSPICTRL);
	clk_disable(spi_imx->clk);
	clk_put(spi_imx->clk);
	free_irq(spi_imx->irq, spi_imx);
	iounmap(spi_imx->base);
871 872

	for (i = 0; i < master->num_chipselect; i++)
873 874
		if (spi_imx->chipselect[i] >= 0)
			gpio_free(spi_imx->chipselect[i]);
875 876 877 878 879 880 881 882 883 884

	spi_master_put(master);

	release_mem_region(res->start, resource_size(res));

	platform_set_drvdata(pdev, NULL);

	return 0;
}

885
static struct platform_driver spi_imx_driver = {
886 887 888 889
	.driver = {
		   .name = DRIVER_NAME,
		   .owner = THIS_MODULE,
		   },
890
	.id_table = spi_imx_devtype,
891
	.probe = spi_imx_probe,
892
	.remove = __devexit_p(spi_imx_remove),
893 894
};

895
static int __init spi_imx_init(void)
896
{
897
	return platform_driver_register(&spi_imx_driver);
898 899
}

900
static void __exit spi_imx_exit(void)
901
{
902
	platform_driver_unregister(&spi_imx_driver);
903 904
}

905 906
module_init(spi_imx_init);
module_exit(spi_imx_exit);
907 908 909 910

MODULE_DESCRIPTION("SPI Master Controller driver");
MODULE_AUTHOR("Sascha Hauer, Pengutronix");
MODULE_LICENSE("GPL");