spi-imx.c 23.1 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
#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

48 49 50
#define MX3_CSPISTAT		0x14
#define MX3_CSPISTAT_RR		(1 << 3)

51 52 53 54
/* 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 */

55
struct spi_imx_config {
56 57 58
	unsigned int speed_hz;
	unsigned int bpw;
	unsigned int mode;
59
	u8 cs;
60 61
};

62 63 64 65 66 67
enum spi_imx_devtype {
	SPI_IMX_VER_IMX1,
	SPI_IMX_VER_0_0,
	SPI_IMX_VER_0_4,
	SPI_IMX_VER_0_5,
	SPI_IMX_VER_0_7,
68
	SPI_IMX_VER_2_3,
69 70 71 72 73 74 75 76 77
};

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 *);
78
	void (*reset)(struct spi_imx_data *);
79
	unsigned int fifosize;
80 81
};

82
struct spi_imx_data {
83 84 85 86 87 88 89 90 91 92
	struct spi_bitbang bitbang;

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

	unsigned int count;
93 94
	void (*tx)(struct spi_imx_data *);
	void (*rx)(struct spi_imx_data *);
95 96 97 98
	void *rx_buf;
	const void *tx_buf;
	unsigned int txfifo; /* number of words pushed in tx FIFO */

99
	struct spi_imx_devtype_data *devtype_data;
100 101 102
};

#define MXC_SPI_BUF_RX(type)						\
103
static void spi_imx_buf_rx_##type(struct spi_imx_data *spi_imx)		\
104
{									\
105
	unsigned int val = readl(spi_imx->base + MXC_CSPIRXDATA);	\
106
									\
107 108 109
	if (spi_imx->rx_buf) {						\
		*(type *)spi_imx->rx_buf = val;				\
		spi_imx->rx_buf += sizeof(type);			\
110 111 112 113
	}								\
}

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

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 */
142
static unsigned int spi_imx_clkdiv_1(unsigned int fin,
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
		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;
}

159
/* MX1, MX31, MX35, MX51 CSPI */
160
static unsigned int spi_imx_clkdiv_2(unsigned int fin,
161 162 163 164 165 166 167 168 169 170 171 172 173
		unsigned int fspi)
{
	int i, div = 4;

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

	return 7;
}

174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
#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)
195 196

/* MX51 eCSPI */
197
static unsigned int mx51_ecspi_clkdiv(unsigned int fin, unsigned int fspi)
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
{
	/*
	 * 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);
225 226
	return (pre << MX51_ECSPI_CTRL_PREDIV_OFFSET) |
		(post << MX51_ECSPI_CTRL_POSTDIV_OFFSET);
227 228
}

229
static void __maybe_unused mx51_ecspi_intctrl(struct spi_imx_data *spi_imx, int enable)
230 231 232 233
{
	unsigned val = 0;

	if (enable & MXC_INT_TE)
234
		val |= MX51_ECSPI_INT_TEEN;
235 236

	if (enable & MXC_INT_RR)
237
		val |= MX51_ECSPI_INT_RREN;
238

239
	writel(val, spi_imx->base + MX51_ECSPI_INT);
240 241
}

242
static void __maybe_unused mx51_ecspi_trigger(struct spi_imx_data *spi_imx)
243 244 245
{
	u32 reg;

246 247 248
	reg = readl(spi_imx->base + MX51_ECSPI_CTRL);
	reg |= MX51_ECSPI_CTRL_XCH;
	writel(reg, spi_imx->base + MX51_ECSPI_CTRL);
249 250
}

251
static int __maybe_unused mx51_ecspi_config(struct spi_imx_data *spi_imx,
252 253
		struct spi_imx_config *config)
{
254
	u32 ctrl = MX51_ECSPI_CTRL_ENABLE, cfg = 0;
255

256 257 258 259 260 261 262
	/*
	 * 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.
	 */
263
	ctrl |= MX51_ECSPI_CTRL_MODE_MASK;
264 265

	/* set clock speed */
266
	ctrl |= mx51_ecspi_clkdiv(spi_imx->spi_clk, config->speed_hz);
267 268

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

271
	ctrl |= (config->bpw - 1) << MX51_ECSPI_CTRL_BL_OFFSET;
272

273
	cfg |= MX51_ECSPI_CONFIG_SBBCTRL(config->cs);
274 275

	if (config->mode & SPI_CPHA)
276
		cfg |= MX51_ECSPI_CONFIG_SCLKPHA(config->cs);
277 278

	if (config->mode & SPI_CPOL)
279
		cfg |= MX51_ECSPI_CONFIG_SCLKPOL(config->cs);
280 281

	if (config->mode & SPI_CS_HIGH)
282
		cfg |= MX51_ECSPI_CONFIG_SSBPOL(config->cs);
283

284 285
	writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL);
	writel(cfg, spi_imx->base + MX51_ECSPI_CONFIG);
286 287 288 289

	return 0;
}

290
static int __maybe_unused mx51_ecspi_rx_available(struct spi_imx_data *spi_imx)
291
{
292
	return readl(spi_imx->base + MX51_ECSPI_STAT) & MX51_ECSPI_STAT_RR;
293 294
}

295
static void __maybe_unused mx51_ecspi_reset(struct spi_imx_data *spi_imx)
296 297
{
	/* drain receive buffer */
298
	while (mx51_ecspi_rx_available(spi_imx))
299 300 301
		readl(spi_imx->base + MXC_CSPIRXDATA);
}

302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
#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.
 */
325
static void __maybe_unused mx31_intctrl(struct spi_imx_data *spi_imx, int enable)
326 327 328 329 330 331 332 333
{
	unsigned int val = 0;

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

334
	writel(val, spi_imx->base + MXC_CSPIINT);
335 336
}

337
static void __maybe_unused mx31_trigger(struct spi_imx_data *spi_imx)
338 339 340
{
	unsigned int reg;

341
	reg = readl(spi_imx->base + MXC_CSPICTRL);
342
	reg |= MX31_CSPICTRL_XCH;
343
	writel(reg, spi_imx->base + MXC_CSPICTRL);
344 345
}

346
static int __maybe_unused spi_imx0_4_config(struct spi_imx_data *spi_imx,
347
		struct spi_imx_config *config)
348 349
{
	unsigned int reg = MX31_CSPICTRL_ENABLE | MX31_CSPICTRL_MASTER;
350
	int cs = spi_imx->chipselect[config->cs];
351

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

355
	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 364
	if (cs < 0)
		reg |= (cs + 32) << MX31_CSPICTRL_CS_SHIFT;
365

366
	writel(reg, spi_imx->base + MXC_CSPICTRL);
367 368 369 370

	return 0;
}

371 372 373 374
static int __maybe_unused spi_imx0_7_config(struct spi_imx_data *spi_imx,
		struct spi_imx_config *config)
{
	unsigned int reg = MX31_CSPICTRL_ENABLE | MX31_CSPICTRL_MASTER;
375
	int cs = spi_imx->chipselect[config->cs];
376 377 378 379 380 381 382 383 384 385 386 387 388

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

	reg |= (config->bpw - 1) << MX35_CSPICTRL_BL_SHIFT;
	reg |= MX31_CSPICTRL_SSCTL;

	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;
389 390
	if (cs < 0)
		reg |= (cs + 32) << MX35_CSPICTRL_CS_SHIFT;
391 392 393 394 395 396

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

	return 0;
}

397
static int __maybe_unused mx31_rx_available(struct spi_imx_data *spi_imx)
398
{
399
	return readl(spi_imx->base + MX31_CSPISTATUS) & MX31_STATUS_RR;
400 401
}

402 403 404 405 406 407 408
static void __maybe_unused spi_imx0_4_reset(struct spi_imx_data *spi_imx)
{
	/* drain receive buffer */
	while (readl(spi_imx->base + MX3_CSPISTAT) & MX3_CSPISTAT_RR)
		readl(spi_imx->base + MXC_CSPIRXDATA);
}

409 410 411 412 413 414 415 416 417 418 419 420 421 422
#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)
423 424 425 426
{
	unsigned int val = 0;

	if (enable & MXC_INT_TE)
427
		val |= MX21_INTREG_TEEN;
428
	if (enable & MXC_INT_RR)
429
		val |= MX21_INTREG_RREN;
430

431
	writel(val, spi_imx->base + MXC_CSPIINT);
432 433
}

434
static void __maybe_unused mx21_trigger(struct spi_imx_data *spi_imx)
435 436 437
{
	unsigned int reg;

438
	reg = readl(spi_imx->base + MXC_CSPICTRL);
439
	reg |= MX21_CSPICTRL_XCH;
440
	writel(reg, spi_imx->base + MXC_CSPICTRL);
441 442
}

443
static int __maybe_unused mx21_config(struct spi_imx_data *spi_imx,
444
		struct spi_imx_config *config)
445
{
446
	unsigned int reg = MX21_CSPICTRL_ENABLE | MX21_CSPICTRL_MASTER;
447
	int cs = spi_imx->chipselect[config->cs];
448

449
	reg |= spi_imx_clkdiv_1(spi_imx->spi_clk, config->speed_hz) <<
450
		MX21_CSPICTRL_DR_SHIFT;
451 452 453
	reg |= config->bpw - 1;

	if (config->mode & SPI_CPHA)
454
		reg |= MX21_CSPICTRL_PHA;
455
	if (config->mode & SPI_CPOL)
456
		reg |= MX21_CSPICTRL_POL;
457
	if (config->mode & SPI_CS_HIGH)
458
		reg |= MX21_CSPICTRL_SSPOL;
459
	if (cs < 0)
460
		reg |= (cs + 32) << MX21_CSPICTRL_CS_SHIFT;
461

462
	writel(reg, spi_imx->base + MXC_CSPICTRL);
463 464 465 466

	return 0;
}

467
static int __maybe_unused mx21_rx_available(struct spi_imx_data *spi_imx)
468
{
469
	return readl(spi_imx->base + MXC_CSPIINT) & MX21_INTREG_RR;
470 471
}

472
static void __maybe_unused mx21_reset(struct spi_imx_data *spi_imx)
473 474 475 476
{
	writel(1, spi_imx->base + MXC_RESET);
}

477 478 479 480 481 482 483 484 485 486 487
#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

488
static void __maybe_unused mx1_intctrl(struct spi_imx_data *spi_imx, int enable)
489 490 491 492 493 494 495 496
{
	unsigned int val = 0;

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

497
	writel(val, spi_imx->base + MXC_CSPIINT);
498 499
}

500
static void __maybe_unused mx1_trigger(struct spi_imx_data *spi_imx)
501 502 503
{
	unsigned int reg;

504
	reg = readl(spi_imx->base + MXC_CSPICTRL);
505
	reg |= MX1_CSPICTRL_XCH;
506
	writel(reg, spi_imx->base + MXC_CSPICTRL);
507 508
}

509
static int __maybe_unused mx1_config(struct spi_imx_data *spi_imx,
510
		struct spi_imx_config *config)
511 512 513
{
	unsigned int reg = MX1_CSPICTRL_ENABLE | MX1_CSPICTRL_MASTER;

514
	reg |= spi_imx_clkdiv_2(spi_imx->spi_clk, config->speed_hz) <<
515 516 517 518 519 520 521 522
		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;

523
	writel(reg, spi_imx->base + MXC_CSPICTRL);
524 525 526 527

	return 0;
}

528
static int __maybe_unused mx1_rx_available(struct spi_imx_data *spi_imx)
529
{
530
	return readl(spi_imx->base + MXC_CSPIINT) & MX1_INTREG_RR;
531 532
}

533 534 535 536 537
static void __maybe_unused mx1_reset(struct spi_imx_data *spi_imx)
{
	writel(1, spi_imx->base + MXC_RESET);
}

538 539 540 541
/*
 * These version numbers are taken from the Freescale driver.  Unfortunately it
 * doesn't support i.MX1, so this entry doesn't match the scheme. :-(
 */
542
static struct spi_imx_devtype_data spi_imx_devtype_data[] = {
543 544 545 546 547 548
#ifdef CONFIG_SPI_IMX_VER_IMX1
	[SPI_IMX_VER_IMX1] = {
		.intctrl = mx1_intctrl,
		.config = mx1_config,
		.trigger = mx1_trigger,
		.rx_available = mx1_rx_available,
549
		.reset = mx1_reset,
550
		.fifosize = 8,
551 552 553 554
	},
#endif
#ifdef CONFIG_SPI_IMX_VER_0_0
	[SPI_IMX_VER_0_0] = {
555 556 557 558 559
		.intctrl = mx21_intctrl,
		.config = mx21_config,
		.trigger = mx21_trigger,
		.rx_available = mx21_rx_available,
		.reset = mx21_reset,
560
		.fifosize = 8,
561 562 563 564 565
	},
#endif
#ifdef CONFIG_SPI_IMX_VER_0_4
	[SPI_IMX_VER_0_4] = {
		.intctrl = mx31_intctrl,
566
		.config = spi_imx0_4_config,
567 568
		.trigger = mx31_trigger,
		.rx_available = mx31_rx_available,
569
		.reset = spi_imx0_4_reset,
570
		.fifosize = 8,
571 572 573 574 575
	},
#endif
#ifdef CONFIG_SPI_IMX_VER_0_7
	[SPI_IMX_VER_0_7] = {
		.intctrl = mx31_intctrl,
576
		.config = spi_imx0_7_config,
577 578
		.trigger = mx31_trigger,
		.rx_available = mx31_rx_available,
579
		.reset = spi_imx0_4_reset,
580
		.fifosize = 8,
581 582
	},
#endif
583 584
#ifdef CONFIG_SPI_IMX_VER_2_3
	[SPI_IMX_VER_2_3] = {
585 586 587 588 589
		.intctrl = mx51_ecspi_intctrl,
		.config = mx51_ecspi_config,
		.trigger = mx51_ecspi_trigger,
		.rx_available = mx51_ecspi_rx_available,
		.reset = mx51_ecspi_reset,
590
		.fifosize = 64,
591 592
	},
#endif
593 594
};

595
static void spi_imx_chipselect(struct spi_device *spi, int is_active)
596
{
597 598
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
	int gpio = spi_imx->chipselect[spi->chip_select];
599 600
	int active = is_active != BITBANG_CS_INACTIVE;
	int dev_is_lowactive = !(spi->mode & SPI_CS_HIGH);
601

602
	if (gpio < 0)
603 604
		return;

605
	gpio_set_value(gpio, dev_is_lowactive ^ active);
606 607
}

608
static void spi_imx_push(struct spi_imx_data *spi_imx)
609
{
610
	while (spi_imx->txfifo < spi_imx->devtype_data->fifosize) {
611
		if (!spi_imx->count)
612
			break;
613 614
		spi_imx->tx(spi_imx);
		spi_imx->txfifo++;
615 616
	}

617
	spi_imx->devtype_data->trigger(spi_imx);
618 619
}

620
static irqreturn_t spi_imx_isr(int irq, void *dev_id)
621
{
622
	struct spi_imx_data *spi_imx = dev_id;
623

624
	while (spi_imx->devtype_data->rx_available(spi_imx)) {
625 626
		spi_imx->rx(spi_imx);
		spi_imx->txfifo--;
627 628
	}

629 630
	if (spi_imx->count) {
		spi_imx_push(spi_imx);
631 632 633
		return IRQ_HANDLED;
	}

634
	if (spi_imx->txfifo) {
635 636 637
		/* No data left to push, but still waiting for rx data,
		 * enable receive data available interrupt.
		 */
638
		spi_imx->devtype_data->intctrl(
639
				spi_imx, MXC_INT_RR);
640 641 642
		return IRQ_HANDLED;
	}

643
	spi_imx->devtype_data->intctrl(spi_imx, 0);
644
	complete(&spi_imx->xfer_done);
645 646 647 648

	return IRQ_HANDLED;
}

649
static int spi_imx_setupxfer(struct spi_device *spi,
650 651
				 struct spi_transfer *t)
{
652 653
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
	struct spi_imx_config config;
654 655 656 657

	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;
658
	config.cs = spi->chip_select;
659

S
Sascha Hauer 已提交
660 661 662 663 664 665 666
	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;

667 668 669 670 671 672 673 674 675 676 677 678 679
	/* 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();

680
	spi_imx->devtype_data->config(spi_imx, &config);
681 682 683 684

	return 0;
}

685
static int spi_imx_transfer(struct spi_device *spi,
686 687
				struct spi_transfer *transfer)
{
688
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
689

690 691 692 693
	spi_imx->tx_buf = transfer->tx_buf;
	spi_imx->rx_buf = transfer->rx_buf;
	spi_imx->count = transfer->len;
	spi_imx->txfifo = 0;
694

695
	init_completion(&spi_imx->xfer_done);
696

697
	spi_imx_push(spi_imx);
698

699
	spi_imx->devtype_data->intctrl(spi_imx, MXC_INT_TE);
700

701
	wait_for_completion(&spi_imx->xfer_done);
702 703 704 705

	return transfer->len;
}

706
static int spi_imx_setup(struct spi_device *spi)
707
{
708 709 710
	struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);
	int gpio = spi_imx->chipselect[spi->chip_select];

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

714 715 716
	if (gpio >= 0)
		gpio_direction_output(gpio, spi->mode & SPI_CS_HIGH ? 0 : 1);

717
	spi_imx_chipselect(spi, BITBANG_CS_INACTIVE);
718 719 720 721

	return 0;
}

722
static void spi_imx_cleanup(struct spi_device *spi)
723 724 725
{
}

726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744
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",
		.driver_data = SPI_IMX_VER_0_7,
	}, {
		.name = "imx27-cspi",
		.driver_data = SPI_IMX_VER_0_0,
	}, {
		.name = "imx31-cspi",
		.driver_data = SPI_IMX_VER_0_4,
	}, {
		.name = "imx35-cspi",
		.driver_data = SPI_IMX_VER_0_7,
745 746 747 748 749 750
	}, {
		.name = "imx51-cspi",
		.driver_data = SPI_IMX_VER_0_7,
	}, {
		.name = "imx51-ecspi",
		.driver_data = SPI_IMX_VER_2_3,
Y
Yong Shen 已提交
751 752 753 754 755 756
	}, {
		.name = "imx53-cspi",
		.driver_data = SPI_IMX_VER_0_7,
	}, {
		.name = "imx53-ecspi",
		.driver_data = SPI_IMX_VER_2_3,
757 758 759 760 761
	}, {
		/* sentinel */
	}
};

762
static int __devinit spi_imx_probe(struct platform_device *pdev)
763 764 765
{
	struct spi_imx_master *mxc_platform_info;
	struct spi_master *master;
766
	struct spi_imx_data *spi_imx;
767 768 769
	struct resource *res;
	int i, ret;

770
	mxc_platform_info = dev_get_platdata(&pdev->dev);
771 772 773 774 775
	if (!mxc_platform_info) {
		dev_err(&pdev->dev, "can't get the platform data\n");
		return -EINVAL;
	}

776
	master = spi_alloc_master(&pdev->dev, sizeof(struct spi_imx_data));
777 778 779 780 781 782 783 784
	if (!master)
		return -ENOMEM;

	platform_set_drvdata(pdev, master);

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

785 786 787
	spi_imx = spi_master_get_devdata(master);
	spi_imx->bitbang.master = spi_master_get(master);
	spi_imx->chipselect = mxc_platform_info->chipselect;
788 789

	for (i = 0; i < master->num_chipselect; i++) {
790
		if (spi_imx->chipselect[i] < 0)
791
			continue;
792
		ret = gpio_request(spi_imx->chipselect[i], DRIVER_NAME);
793
		if (ret) {
794 795
			while (i > 0) {
				i--;
796
				if (spi_imx->chipselect[i] >= 0)
797 798 799
					gpio_free(spi_imx->chipselect[i]);
			}
			dev_err(&pdev->dev, "can't get cs gpios\n");
800 801 802 803
			goto out_master_put;
		}
	}

804 805 806 807 808
	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;
809
	spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
810

811
	init_completion(&spi_imx->xfer_done);
812

U
Uwe Kleine-König 已提交
813
	spi_imx->devtype_data =
814
		&spi_imx_devtype_data[pdev->id_entry->driver_data];
815

816 817 818 819 820 821 822 823 824 825 826 827 828
	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;
	}

829 830
	spi_imx->base = ioremap(res->start, resource_size(res));
	if (!spi_imx->base) {
831 832 833 834
		ret = -EINVAL;
		goto out_release_mem;
	}

835
	spi_imx->irq = platform_get_irq(pdev, 0);
836
	if (spi_imx->irq < 0) {
837 838 839 840
		ret = -EINVAL;
		goto out_iounmap;
	}

841
	ret = request_irq(spi_imx->irq, spi_imx_isr, 0, DRIVER_NAME, spi_imx);
842
	if (ret) {
843
		dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret);
844 845 846
		goto out_iounmap;
	}

847 848
	spi_imx->clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(spi_imx->clk)) {
849
		dev_err(&pdev->dev, "unable to get clock\n");
850
		ret = PTR_ERR(spi_imx->clk);
851 852 853
		goto out_free_irq;
	}

854 855
	clk_enable(spi_imx->clk);
	spi_imx->spi_clk = clk_get_rate(spi_imx->clk);
856

857
	spi_imx->devtype_data->reset(spi_imx);
858

859
	spi_imx->devtype_data->intctrl(spi_imx, 0);
860

861
	ret = spi_bitbang_start(&spi_imx->bitbang);
862 863 864 865 866 867 868 869 870 871
	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:
872 873
	clk_disable(spi_imx->clk);
	clk_put(spi_imx->clk);
874
out_free_irq:
875
	free_irq(spi_imx->irq, spi_imx);
876
out_iounmap:
877
	iounmap(spi_imx->base);
878 879 880 881
out_release_mem:
	release_mem_region(res->start, resource_size(res));
out_gpio_free:
	for (i = 0; i < master->num_chipselect; i++)
882 883
		if (spi_imx->chipselect[i] >= 0)
			gpio_free(spi_imx->chipselect[i]);
884 885 886 887 888 889 890
out_master_put:
	spi_master_put(master);
	kfree(master);
	platform_set_drvdata(pdev, NULL);
	return ret;
}

891
static int __devexit spi_imx_remove(struct platform_device *pdev)
892 893 894
{
	struct spi_master *master = platform_get_drvdata(pdev);
	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
895
	struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
896 897
	int i;

898
	spi_bitbang_stop(&spi_imx->bitbang);
899

900 901 902 903 904
	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);
905 906

	for (i = 0; i < master->num_chipselect; i++)
907 908
		if (spi_imx->chipselect[i] >= 0)
			gpio_free(spi_imx->chipselect[i]);
909 910 911 912 913 914 915 916 917 918

	spi_master_put(master);

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

	platform_set_drvdata(pdev, NULL);

	return 0;
}

919
static struct platform_driver spi_imx_driver = {
920 921 922 923
	.driver = {
		   .name = DRIVER_NAME,
		   .owner = THIS_MODULE,
		   },
924
	.id_table = spi_imx_devtype,
925
	.probe = spi_imx_probe,
926
	.remove = __devexit_p(spi_imx_remove),
927 928
};

929
static int __init spi_imx_init(void)
930
{
931
	return platform_driver_register(&spi_imx_driver);
932 933
}

934
static void __exit spi_imx_exit(void)
935
{
936
	platform_driver_unregister(&spi_imx_driver);
937 938
}

939 940
module_init(spi_imx_init);
module_exit(spi_imx_exit);
941 942 943 944

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