i2c-bfin-twi.c 20.3 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
			write_MASTER_CTL(iface,
102
				read_MASTER_CTL(iface) | MDIR);
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
		         iface->cur_msg + 1 < iface->msg_num) {
			if (iface->pmsg[iface->cur_msg + 1].flags & I2C_M_RD)
				write_MASTER_CTL(iface,
110
					read_MASTER_CTL(iface) | MDIR);
111 112
			else
				write_MASTER_CTL(iface,
113
					read_MASTER_CTL(iface) & ~MDIR);
114
		}
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
					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,
147
						read_MASTER_CTL(iface) | MDIR);
148 149
				else
					write_MASTER_CTL(iface,
150
						read_MASTER_CTL(iface) & ~MDIR);
151
			}
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
		if (twi_int_status & (XMTSERV | RCVSERV) &&
			(read_MASTER_CTL(iface) & MEN) == 0 &&
206 207 208 209 210 211
			(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) {
212 213 214 215 216 217
			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;
218 219
				write_MASTER_CTL(iface,
					read_MASTER_CTL(iface) | (0xff << 6));
220 221 222 223
			} else {
				/* set the readd number in other
				 * combine mode.
				 */
224 225
				write_MASTER_CTL(iface,
					(read_MASTER_CTL(iface) &
226
					(~(0xff << 6))) |
227
					(iface->readNum << 6));
228 229
			}
			/* remove restart bit and enable master receive */
230 231
			write_MASTER_CTL(iface,
				read_MASTER_CTL(iface) & ~RSTART);
232
		} else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
233
				iface->cur_msg + 1 < iface->msg_num) {
234 235 236 237 238
			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 */
239
			write_MASTER_ADDR(iface,
240 241 242 243 244 245 246
				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) {
247
					write_XMT_DATA8(iface,
248 249 250 251 252
						*(iface->transPtr++));
					iface->writeNum--;
				}
			}

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

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

	spin_lock_irqsave(&iface->lock, flags);
286 287 288 289 290 291 292 293 294
	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();
	}
295 296 297 298 299
	spin_unlock_irqrestore(&iface->lock, flags);
	return IRQ_HANDLED;
}

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

309
	if (!(read_CONTROL(iface) & TWI_ENA))
310 311
		return -ENXIO;

312 313
	if (read_MASTER_STAT(iface) & BUSBUSY)
		return -EAGAIN;
314

315 316 317
	iface->pmsg = msgs;
	iface->msg_num = num;
	iface->cur_msg = 0;
318

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

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

	/* FIFO Initiation. Data in FIFO should be
	 *  discarded before start a new operation.
	 */
338
	write_FIFO_CTL(iface, 0x3);
339
	SSYNC();
340
	write_FIFO_CTL(iface, 0);
341 342 343 344 345 346 347 348
	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) {
349
			write_XMT_DATA8(iface, *(iface->transPtr++));
350 351
			iface->writeNum--;
			SSYNC();
352
		}
353
	}
354

355
	/* clear int stat */
356
	write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
357

358
	/* Interrupt mask . Enable XMT, RCV interrupt */
359
	write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV);
360
	SSYNC();
361

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

369
	/* Master enable */
370
	write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
371
		(iface->msg_num > 1 ? RSTART : 0) |
372 373 374 375
		((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
		((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
	SSYNC();

376 377 378 379 380 381 382
	while (!iface->result) {
		if (!wait_for_completion_timeout(&iface->complete,
			adap->timeout)) {
			iface->result = -1;
			dev_err(&adap->dev, "master transfer timeout\n");
		}
	}
383

384 385
	if (iface->result == 1)
		rc = iface->cur_msg + 1;
386
	else
387 388 389
		rc = iface->result;

	return rc;
390 391 392
}

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

/*
 * One I2C SMBus transfer
 */
int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr,
405 406 407 408 409 410
			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;

411
	if (!(read_CONTROL(iface) & TWI_ENA))
412 413
		return -ENXIO;

414 415
	if (read_MASTER_STAT(iface) & BUSBUSY)
		return -EAGAIN;
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 470 471 472 473

	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;
474 475 476 477 478 479 480 481 482 483
	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;
484 485 486 487 488 489 490 491
	default:
		return -1;
	}

	iface->result = 0;
	iface->manual_stop = 0;
	iface->read_write = read_write;
	iface->command = command;
492
	init_completion(&(iface->complete));
493 494 495 496

	/* FIFO Initiation. Data in FIFO should be discarded before
	 * start a new operation.
	 */
497
	write_FIFO_CTL(iface, 0x3);
498
	SSYNC();
499
	write_FIFO_CTL(iface, 0);
500 501

	/* clear int stat */
502
	write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
503 504

	/* Set Transmit device address */
505
	write_MASTER_ADDR(iface, addr);
506 507 508 509
	SSYNC();

	switch (iface->cur_mode) {
	case TWI_I2C_MODE_STANDARDSUB:
510 511
		write_XMT_DATA8(iface, iface->command);
		write_INT_MASK(iface, MCOMP | MERR |
512 513 514 515 516
			((iface->read_write == I2C_SMBUS_READ) ?
			RCVSERV : XMTSERV));
		SSYNC();

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

		if (iface->writeNum > 0)
532
			write_MASTER_CTL(iface, (iface->writeNum + 1) << 6);
533
		else
534
			write_MASTER_CTL(iface, 0x1 << 6);
535
		/* Master enable */
536
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN | RSTART |
537 538 539
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
		break;
	default:
540
		write_MASTER_CTL(iface, 0);
541 542 543 544 545 546
		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) {
547 548
					write_XMT_DATA8(iface,
						*(iface->transPtr++));
549
					if (iface->writeNum <= 255)
550 551
						write_MASTER_CTL(iface,
							iface->writeNum << 6);
552
					else {
553 554
						write_MASTER_CTL(iface,
							0xff << 6);
555 556 557 558
						iface->manual_stop = 1;
					}
					iface->writeNum--;
				} else {
559 560
					write_XMT_DATA8(iface, iface->command);
					write_MASTER_CTL(iface, 1 << 6);
561 562 563
				}
			} else {
				if (iface->readNum > 0 && iface->readNum <= 255)
564 565
					write_MASTER_CTL(iface,
						iface->readNum << 6);
566
				else if (iface->readNum > 255) {
567
					write_MASTER_CTL(iface, 0xff << 6);
568
					iface->manual_stop = 1;
569
				} else
570 571 572
					break;
			}
		}
573
		write_INT_MASK(iface, MCOMP | MERR |
574 575 576 577 578
			((iface->read_write == I2C_SMBUS_READ) ?
			RCVSERV : XMTSERV));
		SSYNC();

		/* Master enable */
579
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
580 581 582 583 584 585
			((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
		break;
	}
	SSYNC();

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

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

	return rc;
}

599 600 601 602 603 604 605
/*
 * 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)
{
606
	return bfin_twi_do_smbus_xfer(adap, addr, flags,
607 608 609
			read_write, command, size, data);
}

610 611 612 613 614 615 616 617
/*
 * 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 |
618
	       I2C_FUNC_I2C | I2C_FUNC_SMBUS_I2C_BLOCK;
619 620 621 622 623 624 625 626
}

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

627
static int i2c_bfin_twi_suspend(struct device *dev)
628
{
629
	struct bfin_twi_iface *iface = dev_get_drvdata(dev);
630 631 632 633 634

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

	free_irq(iface->irq, iface);
635 636

	/* Disable TWI */
637
	write_CONTROL(iface, iface->saved_control & ~TWI_ENA);
638 639 640 641

	return 0;
}

642
static int i2c_bfin_twi_resume(struct device *dev)
643
{
644
	struct bfin_twi_iface *iface = dev_get_drvdata(dev);
645

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

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

	/* Resume TWI */
	write_CONTROL(iface, iface->saved_control);
658 659 660 661

	return 0;
}

662 663 664
static SIMPLE_DEV_PM_OPS(i2c_bfin_twi_pm,
			 i2c_bfin_twi_suspend, i2c_bfin_twi_resume);

665
static int i2c_bfin_twi_probe(struct platform_device *pdev)
666
{
667
	struct bfin_twi_iface *iface;
668
	struct i2c_adapter *p_adap;
669
	struct resource *res;
670
	int rc;
671
	unsigned int clkhilow;
672

673 674 675 676 677 678 679
	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;
	}

680
	spin_lock_init(&(iface->lock));
681 682 683 684 685 686 687 688 689

	/* 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 已提交
690
	iface->regs_base = ioremap(res->start, resource_size(res));
691 692 693 694 695 696 697 698 699 700 701 702
	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;
	}
703 704

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

714 715 716 717 718 719
	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;
	}

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

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

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

737
	/* Set Twi interface clock as specified */
738
	write_CLKDIV(iface, (clkhilow << 8) | clkhilow);
739 740

	/* Enable TWI */
741
	write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA);
742 743
	SSYNC();

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

	platform_set_drvdata(pdev, iface);
751

752 753
	dev_info(&pdev->dev, "Blackfin BF5xx on-chip I2C TWI Contoller, "
		"regs_base@%p\n", iface->regs_base);
754 755 756 757 758 759 760

	return 0;

out_error_add_adapter:
	free_irq(iface->irq, iface);
out_error_req_irq:
out_error_no_irq:
761 762
	peripheral_free_list(pin_req[pdev->id]);
out_error_pin_mux:
763 764 765 766 767
	iounmap(iface->regs_base);
out_error_ioremap:
out_error_get_res:
	kfree(iface);
out_error_nomem:
768 769 770 771 772 773 774 775 776 777 778
	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);
779
	peripheral_free_list(pin_req[pdev->id]);
780 781
	iounmap(iface->regs_base);
	kfree(iface);
782 783 784 785 786 787 788 789 790 791

	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,
792
		.pm	= &i2c_bfin_twi_pm,
793 794 795 796 797 798 799 800 801 802 803 804 805
	},
};

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

806
subsys_initcall(i2c_bfin_twi_init);
807
module_exit(i2c_bfin_twi_exit);
808 809 810 811

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