i2c-bfin-twi.c 20.2 KB
Newer Older
1
/*
2
 * Blackfin On-Chip Two Wire Interface Driver
3
 *
4
 * Copyright 2005-2007 Analog Devices Inc.
5
 *
6
 * Enter bugs at http://blackfin.uclinux.org/
7
 *
8
 * Licensed under the GPL-2 or later.
9 10 11 12 13 14
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/i2c.h>
15
#include <linux/slab.h>
16
#include <linux/io.h>
17 18 19 20 21 22
#include <linux/mm.h>
#include <linux/timer.h>
#include <linux/spinlock.h>
#include <linux/completion.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
23
#include <linux/delay.h>
24 25

#include <asm/blackfin.h>
26
#include <asm/portmux.h>
27 28 29
#include <asm/irq.h>

/* SMBus mode*/
30 31 32 33
#define TWI_I2C_MODE_STANDARD		1
#define TWI_I2C_MODE_STANDARDSUB	2
#define TWI_I2C_MODE_COMBINED		3
#define TWI_I2C_MODE_REPEAT		4
34 35 36 37 38 39 40 41 42 43 44 45 46 47

struct bfin_twi_iface {
	int			irq;
	spinlock_t		lock;
	char			read_write;
	u8			command;
	u8			*transPtr;
	int			readNum;
	int			writeNum;
	int			cur_mode;
	int			manual_stop;
	int			result;
	struct i2c_adapter	adap;
	struct completion	complete;
48 49 50
	struct i2c_msg 		*pmsg;
	int			msg_num;
	int			cur_msg;
51 52
	u16			saved_clkdiv;
	u16			saved_control;
53
	void __iomem		*regs_base;
54 55
};

56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

#define DEFINE_TWI_REG(reg, off) \
static inline u16 read_##reg(struct bfin_twi_iface *iface) \
	{ return bfin_read16(iface->regs_base + (off)); } \
static inline void write_##reg(struct bfin_twi_iface *iface, u16 v) \
	{ bfin_write16(iface->regs_base + (off), v); }

DEFINE_TWI_REG(CLKDIV, 0x00)
DEFINE_TWI_REG(CONTROL, 0x04)
DEFINE_TWI_REG(SLAVE_CTL, 0x08)
DEFINE_TWI_REG(SLAVE_STAT, 0x0C)
DEFINE_TWI_REG(SLAVE_ADDR, 0x10)
DEFINE_TWI_REG(MASTER_CTL, 0x14)
DEFINE_TWI_REG(MASTER_STAT, 0x18)
DEFINE_TWI_REG(MASTER_ADDR, 0x1C)
DEFINE_TWI_REG(INT_STAT, 0x20)
DEFINE_TWI_REG(INT_MASK, 0x24)
DEFINE_TWI_REG(FIFO_CTL, 0x28)
DEFINE_TWI_REG(FIFO_STAT, 0x2C)
DEFINE_TWI_REG(XMT_DATA8, 0x80)
DEFINE_TWI_REG(XMT_DATA16, 0x84)
DEFINE_TWI_REG(RCV_DATA8, 0x88)
DEFINE_TWI_REG(RCV_DATA16, 0x8C)
79

80 81 82 83 84
static const u16 pin_req[2][3] = {
	{P_TWI0_SCL, P_TWI0_SDA, 0},
	{P_TWI1_SCL, P_TWI1_SDA, 0},
};

85 86
static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
					unsigned short twi_int_status)
87
{
88
	unsigned short mast_stat = read_MASTER_STAT(iface);
89 90 91 92

	if (twi_int_status & XMTSERV) {
		/* Transmit next data */
		if (iface->writeNum > 0) {
93
			SSYNC();
94
			write_XMT_DATA8(iface, *(iface->transPtr++));
95 96 97 98 99
			iface->writeNum--;
		}
		/* start receive immediately after complete sending in
		 * combine mode.
		 */
100
		else if (iface->cur_mode == TWI_I2C_MODE_COMBINED)
101 102
			write_MASTER_CTL(iface,
				read_MASTER_CTL(iface) | MDIR | RSTART);
103
		else if (iface->manual_stop)
104 105
			write_MASTER_CTL(iface,
				read_MASTER_CTL(iface) | STOP);
106
		else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
107 108 109 110 111 112 113 114
		         iface->cur_msg + 1 < iface->msg_num) {
			if (iface->pmsg[iface->cur_msg + 1].flags & I2C_M_RD)
				write_MASTER_CTL(iface,
					read_MASTER_CTL(iface) | RSTART | MDIR);
			else
				write_MASTER_CTL(iface,
					(read_MASTER_CTL(iface) | RSTART) & ~MDIR);
		}
115 116 117 118
	}
	if (twi_int_status & RCVSERV) {
		if (iface->readNum > 0) {
			/* Receive next data */
119
			*(iface->transPtr) = read_RCV_DATA8(iface);
120 121 122 123 124 125 126 127 128 129 130 131 132
			if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
				/* Change combine mode into sub mode after
				 * read first data.
				 */
				iface->cur_mode = TWI_I2C_MODE_STANDARDSUB;
				/* Get read number from first byte in block
				 * combine mode.
				 */
				if (iface->readNum == 1 && iface->manual_stop)
					iface->readNum = *iface->transPtr + 1;
			}
			iface->transPtr++;
			iface->readNum--;
133 134 135 136 137 138 139 140
		}

		if (iface->readNum == 0) {
			if (iface->manual_stop) {
				/* Temporary workaround to avoid possible bus stall -
				 * Flush FIFO before issuing the STOP condition
				 */
				read_RCV_DATA16(iface);
141
				write_MASTER_CTL(iface,
142 143 144 145 146 147 148 149 150 151
					read_MASTER_CTL(iface) | STOP);
			} else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
					iface->cur_msg + 1 < iface->msg_num) {
				if (iface->pmsg[iface->cur_msg + 1].flags & I2C_M_RD)
					write_MASTER_CTL(iface,
						read_MASTER_CTL(iface) | RSTART | MDIR);
				else
					write_MASTER_CTL(iface,
						(read_MASTER_CTL(iface) | RSTART) & ~MDIR);
			}
152 153 154
		}
	}
	if (twi_int_status & MERR) {
155 156 157
		write_INT_MASK(iface, 0);
		write_MASTER_STAT(iface, 0x3e);
		write_MASTER_CTL(iface, 0);
158
		iface->result = -EIO;
159 160 161 162 163 164 165 166 167 168 169 170

		if (mast_stat & LOSTARB)
			dev_dbg(&iface->adap.dev, "Lost Arbitration\n");
		if (mast_stat & ANAK)
			dev_dbg(&iface->adap.dev, "Address Not Acknowledged\n");
		if (mast_stat & DNAK)
			dev_dbg(&iface->adap.dev, "Data Not Acknowledged\n");
		if (mast_stat & BUFRDERR)
			dev_dbg(&iface->adap.dev, "Buffer Read Error\n");
		if (mast_stat & BUFWRERR)
			dev_dbg(&iface->adap.dev, "Buffer Write Error\n");

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
		/* Faulty slave devices, may drive SDA low after a transfer
		 * finishes. To release the bus this code generates up to 9
		 * extra clocks until SDA is released.
		 */

		if (read_MASTER_STAT(iface) & SDASEN) {
			int cnt = 9;
			do {
				write_MASTER_CTL(iface, SCLOVR);
				udelay(6);
				write_MASTER_CTL(iface, 0);
				udelay(6);
			} while ((read_MASTER_STAT(iface) & SDASEN) && cnt--);

			write_MASTER_CTL(iface, SDAOVR | SCLOVR);
			udelay(6);
			write_MASTER_CTL(iface, SDAOVR);
			udelay(6);
			write_MASTER_CTL(iface, 0);
		}

192 193
		/* If it is a quick transfer, only address without data,
		 * not an err, return 1.
194
		 */
195 196 197 198 199
		if (iface->cur_mode == TWI_I2C_MODE_STANDARD &&
			iface->transPtr == NULL &&
			(twi_int_status & MCOMP) && (mast_stat & DNAK))
			iface->result = 1;

200 201 202 203
		complete(&iface->complete);
		return;
	}
	if (twi_int_status & MCOMP) {
204 205 206 207 208 209 210
		if ((read_MASTER_CTL(iface) & MEN) == 0 &&
			(iface->cur_mode == TWI_I2C_MODE_REPEAT ||
			iface->cur_mode == TWI_I2C_MODE_COMBINED)) {
			iface->result = -1;
			write_INT_MASK(iface, 0);
			write_MASTER_CTL(iface, 0);
		} else if (iface->cur_mode == TWI_I2C_MODE_COMBINED) {
211 212 213 214 215 216
			if (iface->readNum == 0) {
				/* set the read number to 1 and ask for manual
				 * stop in block combine mode
				 */
				iface->readNum = 1;
				iface->manual_stop = 1;
217 218
				write_MASTER_CTL(iface,
					read_MASTER_CTL(iface) | (0xff << 6));
219 220 221 222
			} else {
				/* set the readd number in other
				 * combine mode.
				 */
223 224
				write_MASTER_CTL(iface,
					(read_MASTER_CTL(iface) &
225
					(~(0xff << 6))) |
226
					(iface->readNum << 6));
227 228
			}
			/* remove restart bit and enable master receive */
229 230
			write_MASTER_CTL(iface,
				read_MASTER_CTL(iface) & ~RSTART);
231 232 233 234 235 236 237
		} else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
				iface->cur_msg+1 < iface->msg_num) {
			iface->cur_msg++;
			iface->transPtr = iface->pmsg[iface->cur_msg].buf;
			iface->writeNum = iface->readNum =
				iface->pmsg[iface->cur_msg].len;
			/* Set Transmit device address */
238
			write_MASTER_ADDR(iface,
239 240 241 242 243 244 245
				iface->pmsg[iface->cur_msg].addr);
			if (iface->pmsg[iface->cur_msg].flags & I2C_M_RD)
				iface->read_write = I2C_SMBUS_READ;
			else {
				iface->read_write = I2C_SMBUS_WRITE;
				/* Transmit first data */
				if (iface->writeNum > 0) {
246
					write_XMT_DATA8(iface,
247 248 249 250 251
						*(iface->transPtr++));
					iface->writeNum--;
				}
			}

252 253
			if (iface->pmsg[iface->cur_msg].len <= 255) {
				write_MASTER_CTL(iface,
254 255
					(read_MASTER_CTL(iface) &
					(~(0xff << 6))) |
256 257 258
					(iface->pmsg[iface->cur_msg].len << 6));
				iface->manual_stop = 0;
			} else {
259 260 261
				write_MASTER_CTL(iface,
					(read_MASTER_CTL(iface) |
					(0xff << 6)));
262 263 264
				iface->manual_stop = 1;
			}
			/* remove restart bit and enable master receive */
265 266
			write_MASTER_CTL(iface,
				read_MASTER_CTL(iface) & ~RSTART);
267 268
		} else {
			iface->result = 1;
269 270
			write_INT_MASK(iface, 0);
			write_MASTER_CTL(iface, 0);
271
		}
272
		complete(&iface->complete);
273 274 275 276 277 278 279 280
	}
}

/* Interrupt handler */
static irqreturn_t bfin_twi_interrupt_entry(int irq, void *dev_id)
{
	struct bfin_twi_iface *iface = dev_id;
	unsigned long flags;
281
	unsigned short twi_int_status;
282 283

	spin_lock_irqsave(&iface->lock, flags);
284 285 286 287 288 289 290 291 292
	while (1) {
		twi_int_status = read_INT_STAT(iface);
		if (!twi_int_status)
			break;
		/* Clear interrupt status */
		write_INT_STAT(iface, twi_int_status);
		bfin_twi_handle_interrupt(iface, twi_int_status);
		SSYNC();
	}
293 294 295 296 297
	spin_unlock_irqrestore(&iface->lock, flags);
	return IRQ_HANDLED;
}

/*
298
 * One i2c master transfer
299
 */
300
static int bfin_twi_do_master_xfer(struct i2c_adapter *adap,
301 302 303 304 305 306
				struct i2c_msg *msgs, int num)
{
	struct bfin_twi_iface *iface = adap->algo_data;
	struct i2c_msg *pmsg;
	int rc = 0;

307
	if (!(read_CONTROL(iface) & TWI_ENA))
308 309
		return -ENXIO;

310
	while (read_MASTER_STAT(iface) & BUSBUSY)
311 312
		yield();

313 314 315
	iface->pmsg = msgs;
	iface->msg_num = num;
	iface->cur_msg = 0;
316

317 318 319 320 321
	pmsg = &msgs[0];
	if (pmsg->flags & I2C_M_TEN) {
		dev_err(&adap->dev, "10 bits addr not supported!\n");
		return -EINVAL;
	}
322

323 324 325 326 327
	iface->cur_mode = TWI_I2C_MODE_REPEAT;
	iface->manual_stop = 0;
	iface->transPtr = pmsg->buf;
	iface->writeNum = iface->readNum = pmsg->len;
	iface->result = 0;
328
	init_completion(&(iface->complete));
329
	/* Set Transmit device address */
330
	write_MASTER_ADDR(iface, pmsg->addr);
331 332 333 334

	/* FIFO Initiation. Data in FIFO should be
	 *  discarded before start a new operation.
	 */
335
	write_FIFO_CTL(iface, 0x3);
336
	SSYNC();
337
	write_FIFO_CTL(iface, 0);
338 339 340 341 342 343 344 345
	SSYNC();

	if (pmsg->flags & I2C_M_RD)
		iface->read_write = I2C_SMBUS_READ;
	else {
		iface->read_write = I2C_SMBUS_WRITE;
		/* Transmit first data */
		if (iface->writeNum > 0) {
346
			write_XMT_DATA8(iface, *(iface->transPtr++));
347 348
			iface->writeNum--;
			SSYNC();
349
		}
350
	}
351

352
	/* clear int stat */
353
	write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
354

355
	/* Interrupt mask . Enable XMT, RCV interrupt */
356
	write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV);
357
	SSYNC();
358

359
	if (pmsg->len <= 255)
360
		write_MASTER_CTL(iface, pmsg->len << 6);
361
	else {
362
		write_MASTER_CTL(iface, 0xff << 6);
363 364
		iface->manual_stop = 1;
	}
365

366
	/* Master enable */
367
	write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
368 369 370 371
		((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
		((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
	SSYNC();

372 373 374 375 376 377 378
	while (!iface->result) {
		if (!wait_for_completion_timeout(&iface->complete,
			adap->timeout)) {
			iface->result = -1;
			dev_err(&adap->dev, "master transfer timeout\n");
		}
	}
379

380 381
	if (iface->result == 1)
		rc = iface->cur_msg + 1;
382
	else
383 384 385
		rc = iface->result;

	return rc;
386 387 388
}

/*
389
 * Generic i2c master transfer entrypoint
390
 */
391 392 393
static int bfin_twi_master_xfer(struct i2c_adapter *adap,
				struct i2c_msg *msgs, int num)
{
394
	return bfin_twi_do_master_xfer(adap, msgs, num);
395 396 397 398 399 400
}

/*
 * One I2C SMBus transfer
 */
int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr,
401 402 403 404 405 406
			unsigned short flags, char read_write,
			u8 command, int size, union i2c_smbus_data *data)
{
	struct bfin_twi_iface *iface = adap->algo_data;
	int rc = 0;

407
	if (!(read_CONTROL(iface) & TWI_ENA))
408 409
		return -ENXIO;

410
	while (read_MASTER_STAT(iface) & BUSBUSY)
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
		yield();

	iface->writeNum = 0;
	iface->readNum = 0;

	/* Prepare datas & select mode */
	switch (size) {
	case I2C_SMBUS_QUICK:
		iface->transPtr = NULL;
		iface->cur_mode = TWI_I2C_MODE_STANDARD;
		break;
	case I2C_SMBUS_BYTE:
		if (data == NULL)
			iface->transPtr = NULL;
		else {
			if (read_write == I2C_SMBUS_READ)
				iface->readNum = 1;
			else
				iface->writeNum = 1;
			iface->transPtr = &data->byte;
		}
		iface->cur_mode = TWI_I2C_MODE_STANDARD;
		break;
	case I2C_SMBUS_BYTE_DATA:
		if (read_write == I2C_SMBUS_READ) {
			iface->readNum = 1;
			iface->cur_mode = TWI_I2C_MODE_COMBINED;
		} else {
			iface->writeNum = 1;
			iface->cur_mode = TWI_I2C_MODE_STANDARDSUB;
		}
		iface->transPtr = &data->byte;
		break;
	case I2C_SMBUS_WORD_DATA:
		if (read_write == I2C_SMBUS_READ) {
			iface->readNum = 2;
			iface->cur_mode = TWI_I2C_MODE_COMBINED;
		} else {
			iface->writeNum = 2;
			iface->cur_mode = TWI_I2C_MODE_STANDARDSUB;
		}
		iface->transPtr = (u8 *)&data->word;
		break;
	case I2C_SMBUS_PROC_CALL:
		iface->writeNum = 2;
		iface->readNum = 2;
		iface->cur_mode = TWI_I2C_MODE_COMBINED;
		iface->transPtr = (u8 *)&data->word;
		break;
	case I2C_SMBUS_BLOCK_DATA:
		if (read_write == I2C_SMBUS_READ) {
			iface->readNum = 0;
			iface->cur_mode = TWI_I2C_MODE_COMBINED;
		} else {
			iface->writeNum = data->block[0] + 1;
			iface->cur_mode = TWI_I2C_MODE_STANDARDSUB;
		}
		iface->transPtr = data->block;
		break;
470 471 472 473 474 475 476 477 478 479
	case I2C_SMBUS_I2C_BLOCK_DATA:
		if (read_write == I2C_SMBUS_READ) {
			iface->readNum = data->block[0];
			iface->cur_mode = TWI_I2C_MODE_COMBINED;
		} else {
			iface->writeNum = data->block[0];
			iface->cur_mode = TWI_I2C_MODE_STANDARDSUB;
		}
		iface->transPtr = (u8 *)&data->block[1];
		break;
480 481 482 483 484 485 486 487
	default:
		return -1;
	}

	iface->result = 0;
	iface->manual_stop = 0;
	iface->read_write = read_write;
	iface->command = command;
488
	init_completion(&(iface->complete));
489 490 491 492

	/* FIFO Initiation. Data in FIFO should be discarded before
	 * start a new operation.
	 */
493
	write_FIFO_CTL(iface, 0x3);
494
	SSYNC();
495
	write_FIFO_CTL(iface, 0);
496 497

	/* clear int stat */
498
	write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
499 500

	/* Set Transmit device address */
501
	write_MASTER_ADDR(iface, addr);
502 503 504 505
	SSYNC();

	switch (iface->cur_mode) {
	case TWI_I2C_MODE_STANDARDSUB:
506 507
		write_XMT_DATA8(iface, iface->command);
		write_INT_MASK(iface, MCOMP | MERR |
508 509 510 511 512
			((iface->read_write == I2C_SMBUS_READ) ?
			RCVSERV : XMTSERV));
		SSYNC();

		if (iface->writeNum + 1 <= 255)
513
			write_MASTER_CTL(iface, (iface->writeNum + 1) << 6);
514
		else {
515
			write_MASTER_CTL(iface, 0xff << 6);
516 517 518
			iface->manual_stop = 1;
		}
		/* Master enable */
519
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
520 521 522
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
		break;
	case TWI_I2C_MODE_COMBINED:
523 524
		write_XMT_DATA8(iface, iface->command);
		write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV);
525 526 527
		SSYNC();

		if (iface->writeNum > 0)
528
			write_MASTER_CTL(iface, (iface->writeNum + 1) << 6);
529
		else
530
			write_MASTER_CTL(iface, 0x1 << 6);
531
		/* Master enable */
532
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
533 534 535
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
		break;
	default:
536
		write_MASTER_CTL(iface, 0);
537 538 539 540 541 542
		if (size != I2C_SMBUS_QUICK) {
			/* Don't access xmit data register when this is a
			 * read operation.
			 */
			if (iface->read_write != I2C_SMBUS_READ) {
				if (iface->writeNum > 0) {
543 544
					write_XMT_DATA8(iface,
						*(iface->transPtr++));
545
					if (iface->writeNum <= 255)
546 547
						write_MASTER_CTL(iface,
							iface->writeNum << 6);
548
					else {
549 550
						write_MASTER_CTL(iface,
							0xff << 6);
551 552 553 554
						iface->manual_stop = 1;
					}
					iface->writeNum--;
				} else {
555 556
					write_XMT_DATA8(iface, iface->command);
					write_MASTER_CTL(iface, 1 << 6);
557 558 559
				}
			} else {
				if (iface->readNum > 0 && iface->readNum <= 255)
560 561
					write_MASTER_CTL(iface,
						iface->readNum << 6);
562
				else if (iface->readNum > 255) {
563
					write_MASTER_CTL(iface, 0xff << 6);
564
					iface->manual_stop = 1;
565
				} else
566 567 568
					break;
			}
		}
569
		write_INT_MASK(iface, MCOMP | MERR |
570 571 572 573 574
			((iface->read_write == I2C_SMBUS_READ) ?
			RCVSERV : XMTSERV));
		SSYNC();

		/* Master enable */
575
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
576 577 578 579 580 581
			((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
		break;
	}
	SSYNC();

582 583 584 585 586 587 588
	while (!iface->result) {
		if (!wait_for_completion_timeout(&iface->complete,
			adap->timeout)) {
			iface->result = -1;
			dev_err(&adap->dev, "smbus transfer timeout\n");
		}
	}
589 590 591 592 593 594

	rc = (iface->result >= 0) ? 0 : -1;

	return rc;
}

595 596 597 598 599 600 601
/*
 * Generic I2C SMBus transfer entrypoint
 */
int bfin_twi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
			unsigned short flags, char read_write,
			u8 command, int size, union i2c_smbus_data *data)
{
602
	return bfin_twi_do_smbus_xfer(adap, addr, flags,
603 604 605
			read_write, command, size, data);
}

606 607 608 609 610 611 612 613
/*
 * Return what the adapter supports
 */
static u32 bfin_twi_functionality(struct i2c_adapter *adap)
{
	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
	       I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
	       I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_PROC_CALL |
614
	       I2C_FUNC_I2C | I2C_FUNC_SMBUS_I2C_BLOCK;
615 616 617 618 619 620 621 622
}

static struct i2c_algorithm bfin_twi_algorithm = {
	.master_xfer   = bfin_twi_master_xfer,
	.smbus_xfer    = bfin_twi_smbus_xfer,
	.functionality = bfin_twi_functionality,
};

623
static int i2c_bfin_twi_suspend(struct device *dev)
624
{
625
	struct bfin_twi_iface *iface = dev_get_drvdata(dev);
626 627 628 629 630

	iface->saved_clkdiv = read_CLKDIV(iface);
	iface->saved_control = read_CONTROL(iface);

	free_irq(iface->irq, iface);
631 632

	/* Disable TWI */
633
	write_CONTROL(iface, iface->saved_control & ~TWI_ENA);
634 635 636 637

	return 0;
}

638
static int i2c_bfin_twi_resume(struct device *dev)
639
{
640
	struct bfin_twi_iface *iface = dev_get_drvdata(dev);
641

642
	int rc = request_irq(iface->irq, bfin_twi_interrupt_entry,
643
		0, to_platform_device(dev)->name, iface);
644
	if (rc) {
645
		dev_err(dev, "Can't get IRQ %d !\n", iface->irq);
646 647 648 649 650 651 652 653
		return -ENODEV;
	}

	/* Resume TWI interface clock as specified */
	write_CLKDIV(iface, iface->saved_clkdiv);

	/* Resume TWI */
	write_CONTROL(iface, iface->saved_control);
654 655 656 657

	return 0;
}

658 659 660
static SIMPLE_DEV_PM_OPS(i2c_bfin_twi_pm,
			 i2c_bfin_twi_suspend, i2c_bfin_twi_resume);

661
static int i2c_bfin_twi_probe(struct platform_device *pdev)
662
{
663
	struct bfin_twi_iface *iface;
664
	struct i2c_adapter *p_adap;
665
	struct resource *res;
666
	int rc;
667
	unsigned int clkhilow;
668

669 670 671 672 673 674 675
	iface = kzalloc(sizeof(struct bfin_twi_iface), GFP_KERNEL);
	if (!iface) {
		dev_err(&pdev->dev, "Cannot allocate memory\n");
		rc = -ENOMEM;
		goto out_error_nomem;
	}

676
	spin_lock_init(&(iface->lock));
677 678 679 680 681 682 683 684 685

	/* Find and map our resources */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res == NULL) {
		dev_err(&pdev->dev, "Cannot get IORESOURCE_MEM\n");
		rc = -ENOENT;
		goto out_error_get_res;
	}

L
Linus Walleij 已提交
686
	iface->regs_base = ioremap(res->start, resource_size(res));
687 688 689 690 691 692 693 694 695 696 697 698
	if (iface->regs_base == NULL) {
		dev_err(&pdev->dev, "Cannot map IO\n");
		rc = -ENXIO;
		goto out_error_ioremap;
	}

	iface->irq = platform_get_irq(pdev, 0);
	if (iface->irq < 0) {
		dev_err(&pdev->dev, "No IRQ specified\n");
		rc = -ENOENT;
		goto out_error_no_irq;
	}
699 700

	p_adap = &iface->adap;
701 702
	p_adap->nr = pdev->id;
	strlcpy(p_adap->name, pdev->name, sizeof(p_adap->name));
703 704
	p_adap->algo = &bfin_twi_algorithm;
	p_adap->algo_data = iface;
J
Jean Delvare 已提交
705
	p_adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
706
	p_adap->dev.parent = &pdev->dev;
707 708
	p_adap->timeout = 5 * HZ;
	p_adap->retries = 3;
709

710 711 712 713 714 715
	rc = peripheral_request_list(pin_req[pdev->id], "i2c-bfin-twi");
	if (rc) {
		dev_err(&pdev->dev, "Can't setup pin mux!\n");
		goto out_error_pin_mux;
	}

716
	rc = request_irq(iface->irq, bfin_twi_interrupt_entry,
Y
Yong Zhang 已提交
717
		0, pdev->name, iface);
718
	if (rc) {
719 720 721
		dev_err(&pdev->dev, "Can't get IRQ %d !\n", iface->irq);
		rc = -ENODEV;
		goto out_error_req_irq;
722 723 724
	}

	/* Set TWI internal clock as 10MHz */
S
Sonic Zhang 已提交
725
	write_CONTROL(iface, ((get_sclk() / 1000 / 1000 + 5) / 10) & 0x7F);
726

727 728
	/*
	 * We will not end up with a CLKDIV=0 because no one will specify
S
Sonic Zhang 已提交
729
	 * 20kHz SCL or less in Kconfig now. (5 * 1000 / 20 = 250)
730
	 */
S
Sonic Zhang 已提交
731
	clkhilow = ((10 * 1000 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) + 1) / 2;
732

733
	/* Set Twi interface clock as specified */
734
	write_CLKDIV(iface, (clkhilow << 8) | clkhilow);
735 736

	/* Enable TWI */
737
	write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA);
738 739
	SSYNC();

740
	rc = i2c_add_numbered_adapter(p_adap);
741 742 743 744 745 746
	if (rc < 0) {
		dev_err(&pdev->dev, "Can't add i2c adapter!\n");
		goto out_error_add_adapter;
	}

	platform_set_drvdata(pdev, iface);
747

748 749
	dev_info(&pdev->dev, "Blackfin BF5xx on-chip I2C TWI Contoller, "
		"regs_base@%p\n", iface->regs_base);
750 751 752 753 754 755 756

	return 0;

out_error_add_adapter:
	free_irq(iface->irq, iface);
out_error_req_irq:
out_error_no_irq:
757 758
	peripheral_free_list(pin_req[pdev->id]);
out_error_pin_mux:
759 760 761 762 763
	iounmap(iface->regs_base);
out_error_ioremap:
out_error_get_res:
	kfree(iface);
out_error_nomem:
764 765 766 767 768 769 770 771 772 773 774
	return rc;
}

static int i2c_bfin_twi_remove(struct platform_device *pdev)
{
	struct bfin_twi_iface *iface = platform_get_drvdata(pdev);

	platform_set_drvdata(pdev, NULL);

	i2c_del_adapter(&(iface->adap));
	free_irq(iface->irq, iface);
775
	peripheral_free_list(pin_req[pdev->id]);
776 777
	iounmap(iface->regs_base);
	kfree(iface);
778 779 780 781 782 783 784 785 786 787

	return 0;
}

static struct platform_driver i2c_bfin_twi_driver = {
	.probe		= i2c_bfin_twi_probe,
	.remove		= i2c_bfin_twi_remove,
	.driver		= {
		.name	= "i2c-bfin-twi",
		.owner	= THIS_MODULE,
788
		.pm	= &i2c_bfin_twi_pm,
789 790 791 792 793 794 795 796 797 798 799 800 801
	},
};

static int __init i2c_bfin_twi_init(void)
{
	return platform_driver_register(&i2c_bfin_twi_driver);
}

static void __exit i2c_bfin_twi_exit(void)
{
	platform_driver_unregister(&i2c_bfin_twi_driver);
}

802
subsys_initcall(i2c_bfin_twi_init);
803
module_exit(i2c_bfin_twi_exit);
804 805 806 807

MODULE_AUTHOR("Bryan Wu, Sonic Zhang");
MODULE_DESCRIPTION("Blackfin BF5xx on-chip I2C TWI Contoller Driver");
MODULE_LICENSE("GPL");
808
MODULE_ALIAS("platform:i2c-bfin-twi");