i2c-bfin-twi.c 19.4 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
#include <asm/irq.h>
28
#include <asm/bfin_twi.h>
29 30

/* SMBus mode*/
31 32 33 34
#define TWI_I2C_MODE_STANDARD		1
#define TWI_I2C_MODE_STANDARDSUB	2
#define TWI_I2C_MODE_COMBINED		3
#define TWI_I2C_MODE_REPEAT		4
35

36 37
static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface,
					unsigned short twi_int_status)
38
{
39
	unsigned short mast_stat = read_MASTER_STAT(iface);
40 41

	if (twi_int_status & XMTSERV) {
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
		if (iface->writeNum <= 0) {
			/* start receive immediately after complete sending in
			 * combine mode.
			 */
			if (iface->cur_mode == TWI_I2C_MODE_COMBINED)
				write_MASTER_CTL(iface,
					read_MASTER_CTL(iface) | MDIR);
			else if (iface->manual_stop)
				write_MASTER_CTL(iface,
					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) |
						MDIR);
				else
					write_MASTER_CTL(iface,
						read_MASTER_CTL(iface) &
						~MDIR);
			}
		}
65
		/* Transmit next data */
66 67
		while (iface->writeNum > 0 &&
			(read_FIFO_STAT(iface) & XMTSTAT) != XMT_FULL) {
68
			SSYNC();
69
			write_XMT_DATA8(iface, *(iface->transPtr++));
70 71 72 73
			iface->writeNum--;
		}
	}
	if (twi_int_status & RCVSERV) {
74 75
		while (iface->readNum > 0 &&
			(read_FIFO_STAT(iface) & RCVSTAT)) {
76
			/* Receive next data */
77
			*(iface->transPtr) = read_RCV_DATA8(iface);
78 79 80 81 82 83 84 85 86 87 88 89 90
			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--;
91 92 93 94 95 96 97 98
		}

		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);
99
				write_MASTER_CTL(iface,
100 101 102 103 104
					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,
105
						read_MASTER_CTL(iface) | MDIR);
106 107
				else
					write_MASTER_CTL(iface,
108
						read_MASTER_CTL(iface) & ~MDIR);
109
			}
110 111 112
		}
	}
	if (twi_int_status & MERR) {
113 114 115
		write_INT_MASK(iface, 0);
		write_MASTER_STAT(iface, 0x3e);
		write_MASTER_CTL(iface, 0);
116
		iface->result = -EIO;
117 118 119 120 121 122 123 124 125 126 127 128

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

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
		/* 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);
		}

150 151
		/* If it is a quick transfer, only address without data,
		 * not an err, return 1.
152
		 */
153 154 155 156 157
		if (iface->cur_mode == TWI_I2C_MODE_STANDARD &&
			iface->transPtr == NULL &&
			(twi_int_status & MCOMP) && (mast_stat & DNAK))
			iface->result = 1;

158 159 160 161
		complete(&iface->complete);
		return;
	}
	if (twi_int_status & MCOMP) {
162 163
		if (twi_int_status & (XMTSERV | RCVSERV) &&
			(read_MASTER_CTL(iface) & MEN) == 0 &&
164 165 166 167 168 169
			(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) {
170 171 172 173 174 175
			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;
176 177
				write_MASTER_CTL(iface,
					read_MASTER_CTL(iface) | (0xff << 6));
178 179 180 181
			} else {
				/* set the readd number in other
				 * combine mode.
				 */
182 183
				write_MASTER_CTL(iface,
					(read_MASTER_CTL(iface) &
184
					(~(0xff << 6))) |
185
					(iface->readNum << 6));
186 187
			}
			/* remove restart bit and enable master receive */
188 189
			write_MASTER_CTL(iface,
				read_MASTER_CTL(iface) & ~RSTART);
190
		} else if (iface->cur_mode == TWI_I2C_MODE_REPEAT &&
191
				iface->cur_msg + 1 < iface->msg_num) {
192 193 194 195 196
			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 */
197
			write_MASTER_ADDR(iface,
198 199 200 201 202 203 204
				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) {
205
					write_XMT_DATA8(iface,
206 207 208 209 210
						*(iface->transPtr++));
					iface->writeNum--;
				}
			}

211 212
			if (iface->pmsg[iface->cur_msg].len <= 255) {
				write_MASTER_CTL(iface,
213 214
					(read_MASTER_CTL(iface) &
					(~(0xff << 6))) |
215 216 217
					(iface->pmsg[iface->cur_msg].len << 6));
				iface->manual_stop = 0;
			} else {
218 219 220
				write_MASTER_CTL(iface,
					(read_MASTER_CTL(iface) |
					(0xff << 6)));
221 222
				iface->manual_stop = 1;
			}
223 224 225 226
			/* remove restart bit before last message */
			if (iface->cur_msg + 1 == iface->msg_num)
				write_MASTER_CTL(iface,
					read_MASTER_CTL(iface) & ~RSTART);
227 228
		} else {
			iface->result = 1;
229 230
			write_INT_MASK(iface, 0);
			write_MASTER_CTL(iface, 0);
231
		}
232
		complete(&iface->complete);
233 234 235 236 237 238 239 240
	}
}

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

	spin_lock_irqsave(&iface->lock, flags);
244 245 246 247 248 249 250 251 252
	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();
	}
253 254 255 256 257
	spin_unlock_irqrestore(&iface->lock, flags);
	return IRQ_HANDLED;
}

/*
258
 * One i2c master transfer
259
 */
260
static int bfin_twi_do_master_xfer(struct i2c_adapter *adap,
261 262 263 264 265 266
				struct i2c_msg *msgs, int num)
{
	struct bfin_twi_iface *iface = adap->algo_data;
	struct i2c_msg *pmsg;
	int rc = 0;

267
	if (!(read_CONTROL(iface) & TWI_ENA))
268 269
		return -ENXIO;

270 271
	if (read_MASTER_STAT(iface) & BUSBUSY)
		return -EAGAIN;
272

273 274 275
	iface->pmsg = msgs;
	iface->msg_num = num;
	iface->cur_msg = 0;
276

277 278 279 280 281
	pmsg = &msgs[0];
	if (pmsg->flags & I2C_M_TEN) {
		dev_err(&adap->dev, "10 bits addr not supported!\n");
		return -EINVAL;
	}
282

283 284
	if (iface->msg_num > 1)
		iface->cur_mode = TWI_I2C_MODE_REPEAT;
285 286 287 288
	iface->manual_stop = 0;
	iface->transPtr = pmsg->buf;
	iface->writeNum = iface->readNum = pmsg->len;
	iface->result = 0;
289
	init_completion(&(iface->complete));
290
	/* Set Transmit device address */
291
	write_MASTER_ADDR(iface, pmsg->addr);
292 293 294 295

	/* FIFO Initiation. Data in FIFO should be
	 *  discarded before start a new operation.
	 */
296
	write_FIFO_CTL(iface, 0x3);
297
	SSYNC();
298
	write_FIFO_CTL(iface, 0);
299 300 301 302 303 304 305 306
	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) {
307
			write_XMT_DATA8(iface, *(iface->transPtr++));
308 309
			iface->writeNum--;
			SSYNC();
310
		}
311
	}
312

313
	/* clear int stat */
314
	write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
315

316
	/* Interrupt mask . Enable XMT, RCV interrupt */
317
	write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV);
318
	SSYNC();
319

320
	if (pmsg->len <= 255)
321
		write_MASTER_CTL(iface, pmsg->len << 6);
322
	else {
323
		write_MASTER_CTL(iface, 0xff << 6);
324 325
		iface->manual_stop = 1;
	}
326

327
	/* Master enable */
328
	write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
329
		(iface->msg_num > 1 ? RSTART : 0) |
330 331 332 333
		((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
		((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
	SSYNC();

334 335 336 337 338 339 340
	while (!iface->result) {
		if (!wait_for_completion_timeout(&iface->complete,
			adap->timeout)) {
			iface->result = -1;
			dev_err(&adap->dev, "master transfer timeout\n");
		}
	}
341

342 343
	if (iface->result == 1)
		rc = iface->cur_msg + 1;
344
	else
345 346 347
		rc = iface->result;

	return rc;
348 349 350
}

/*
351
 * Generic i2c master transfer entrypoint
352
 */
353 354 355
static int bfin_twi_master_xfer(struct i2c_adapter *adap,
				struct i2c_msg *msgs, int num)
{
356
	return bfin_twi_do_master_xfer(adap, msgs, num);
357 358 359 360 361 362
}

/*
 * One I2C SMBus transfer
 */
int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr,
363 364 365 366 367 368
			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;

369
	if (!(read_CONTROL(iface) & TWI_ENA))
370 371
		return -ENXIO;

372 373
	if (read_MASTER_STAT(iface) & BUSBUSY)
		return -EAGAIN;
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431

	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;
432 433 434 435 436 437 438 439 440 441
	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;
442 443 444 445 446 447 448 449
	default:
		return -1;
	}

	iface->result = 0;
	iface->manual_stop = 0;
	iface->read_write = read_write;
	iface->command = command;
450
	init_completion(&(iface->complete));
451 452 453 454

	/* FIFO Initiation. Data in FIFO should be discarded before
	 * start a new operation.
	 */
455
	write_FIFO_CTL(iface, 0x3);
456
	SSYNC();
457
	write_FIFO_CTL(iface, 0);
458 459

	/* clear int stat */
460
	write_INT_STAT(iface, MERR | MCOMP | XMTSERV | RCVSERV);
461 462

	/* Set Transmit device address */
463
	write_MASTER_ADDR(iface, addr);
464 465 466 467
	SSYNC();

	switch (iface->cur_mode) {
	case TWI_I2C_MODE_STANDARDSUB:
468 469
		write_XMT_DATA8(iface, iface->command);
		write_INT_MASK(iface, MCOMP | MERR |
470 471 472 473 474
			((iface->read_write == I2C_SMBUS_READ) ?
			RCVSERV : XMTSERV));
		SSYNC();

		if (iface->writeNum + 1 <= 255)
475
			write_MASTER_CTL(iface, (iface->writeNum + 1) << 6);
476
		else {
477
			write_MASTER_CTL(iface, 0xff << 6);
478 479 480
			iface->manual_stop = 1;
		}
		/* Master enable */
481
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
482 483 484
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
		break;
	case TWI_I2C_MODE_COMBINED:
485 486
		write_XMT_DATA8(iface, iface->command);
		write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV);
487 488 489
		SSYNC();

		if (iface->writeNum > 0)
490
			write_MASTER_CTL(iface, (iface->writeNum + 1) << 6);
491
		else
492
			write_MASTER_CTL(iface, 0x1 << 6);
493
		/* Master enable */
494
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN | RSTART |
495 496 497
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ>100) ? FAST : 0));
		break;
	default:
498
		write_MASTER_CTL(iface, 0);
499 500 501 502 503 504
		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) {
505 506
					write_XMT_DATA8(iface,
						*(iface->transPtr++));
507
					if (iface->writeNum <= 255)
508 509
						write_MASTER_CTL(iface,
							iface->writeNum << 6);
510
					else {
511 512
						write_MASTER_CTL(iface,
							0xff << 6);
513 514 515 516
						iface->manual_stop = 1;
					}
					iface->writeNum--;
				} else {
517 518
					write_XMT_DATA8(iface, iface->command);
					write_MASTER_CTL(iface, 1 << 6);
519 520 521
				}
			} else {
				if (iface->readNum > 0 && iface->readNum <= 255)
522 523
					write_MASTER_CTL(iface,
						iface->readNum << 6);
524
				else if (iface->readNum > 255) {
525
					write_MASTER_CTL(iface, 0xff << 6);
526
					iface->manual_stop = 1;
527
				} else
528 529 530
					break;
			}
		}
531
		write_INT_MASK(iface, MCOMP | MERR |
532 533 534 535 536
			((iface->read_write == I2C_SMBUS_READ) ?
			RCVSERV : XMTSERV));
		SSYNC();

		/* Master enable */
537
		write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN |
538 539 540 541 542 543
			((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) |
			((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
		break;
	}
	SSYNC();

544 545 546 547 548 549 550
	while (!iface->result) {
		if (!wait_for_completion_timeout(&iface->complete,
			adap->timeout)) {
			iface->result = -1;
			dev_err(&adap->dev, "smbus transfer timeout\n");
		}
	}
551 552 553 554 555 556

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

	return rc;
}

557 558 559 560 561 562 563
/*
 * 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)
{
564
	return bfin_twi_do_smbus_xfer(adap, addr, flags,
565 566 567
			read_write, command, size, data);
}

568 569 570 571 572 573 574 575
/*
 * 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 |
576
	       I2C_FUNC_I2C | I2C_FUNC_SMBUS_I2C_BLOCK;
577 578 579 580 581 582 583 584
}

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

585
#ifdef CONFIG_PM_SLEEP
586
static int i2c_bfin_twi_suspend(struct device *dev)
587
{
588
	struct bfin_twi_iface *iface = dev_get_drvdata(dev);
589 590 591 592 593

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

	free_irq(iface->irq, iface);
594 595

	/* Disable TWI */
596
	write_CONTROL(iface, iface->saved_control & ~TWI_ENA);
597 598 599 600

	return 0;
}

601
static int i2c_bfin_twi_resume(struct device *dev)
602
{
603
	struct bfin_twi_iface *iface = dev_get_drvdata(dev);
604

605
	int rc = request_irq(iface->irq, bfin_twi_interrupt_entry,
606
		0, to_platform_device(dev)->name, iface);
607
	if (rc) {
608
		dev_err(dev, "Can't get IRQ %d !\n", iface->irq);
609 610 611 612 613 614 615 616
		return -ENODEV;
	}

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

	/* Resume TWI */
	write_CONTROL(iface, iface->saved_control);
617 618 619 620

	return 0;
}

621 622
static SIMPLE_DEV_PM_OPS(i2c_bfin_twi_pm,
			 i2c_bfin_twi_suspend, i2c_bfin_twi_resume);
623 624 625 626
#define I2C_BFIN_TWI_PM_OPS	(&i2c_bfin_twi_pm)
#else
#define I2C_BFIN_TWI_PM_OPS	NULL
#endif
627

628
static int i2c_bfin_twi_probe(struct platform_device *pdev)
629
{
630
	struct bfin_twi_iface *iface;
631
	struct i2c_adapter *p_adap;
632
	struct resource *res;
633
	int rc;
634
	unsigned int clkhilow;
635

636 637 638 639 640 641 642
	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;
	}

643
	spin_lock_init(&(iface->lock));
644 645 646 647 648 649 650 651 652

	/* 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 已提交
653
	iface->regs_base = ioremap(res->start, resource_size(res));
654 655 656 657 658 659 660 661 662 663 664 665
	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;
	}
666 667

	p_adap = &iface->adap;
668 669
	p_adap->nr = pdev->id;
	strlcpy(p_adap->name, pdev->name, sizeof(p_adap->name));
670 671
	p_adap->algo = &bfin_twi_algorithm;
	p_adap->algo_data = iface;
J
Jean Delvare 已提交
672
	p_adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
673
	p_adap->dev.parent = &pdev->dev;
674 675
	p_adap->timeout = 5 * HZ;
	p_adap->retries = 3;
676

J
Jingoo Han 已提交
677 678 679
	rc = peripheral_request_list(
			(unsigned short *)dev_get_platdata(&pdev->dev),
			"i2c-bfin-twi");
680 681 682 683 684
	if (rc) {
		dev_err(&pdev->dev, "Can't setup pin mux!\n");
		goto out_error_pin_mux;
	}

685
	rc = request_irq(iface->irq, bfin_twi_interrupt_entry,
Y
Yong Zhang 已提交
686
		0, pdev->name, iface);
687
	if (rc) {
688 689 690
		dev_err(&pdev->dev, "Can't get IRQ %d !\n", iface->irq);
		rc = -ENODEV;
		goto out_error_req_irq;
691 692 693
	}

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

696 697
	/*
	 * We will not end up with a CLKDIV=0 because no one will specify
S
Sonic Zhang 已提交
698
	 * 20kHz SCL or less in Kconfig now. (5 * 1000 / 20 = 250)
699
	 */
S
Sonic Zhang 已提交
700
	clkhilow = ((10 * 1000 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) + 1) / 2;
701

702
	/* Set Twi interface clock as specified */
703
	write_CLKDIV(iface, (clkhilow << 8) | clkhilow);
704 705

	/* Enable TWI */
706
	write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA);
707 708
	SSYNC();

709
	rc = i2c_add_numbered_adapter(p_adap);
710 711 712 713 714 715
	if (rc < 0) {
		dev_err(&pdev->dev, "Can't add i2c adapter!\n");
		goto out_error_add_adapter;
	}

	platform_set_drvdata(pdev, iface);
716

717 718
	dev_info(&pdev->dev, "Blackfin BF5xx on-chip I2C TWI Contoller, "
		"regs_base@%p\n", iface->regs_base);
719 720 721 722 723 724 725

	return 0;

out_error_add_adapter:
	free_irq(iface->irq, iface);
out_error_req_irq:
out_error_no_irq:
J
Jingoo Han 已提交
726
	peripheral_free_list((unsigned short *)dev_get_platdata(&pdev->dev));
727
out_error_pin_mux:
728 729 730 731 732
	iounmap(iface->regs_base);
out_error_ioremap:
out_error_get_res:
	kfree(iface);
out_error_nomem:
733 734 735 736 737 738 739 740 741
	return rc;
}

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

	i2c_del_adapter(&(iface->adap));
	free_irq(iface->irq, iface);
J
Jingoo Han 已提交
742
	peripheral_free_list((unsigned short *)dev_get_platdata(&pdev->dev));
743 744
	iounmap(iface->regs_base);
	kfree(iface);
745 746 747 748 749 750 751 752 753 754

	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,
755
		.pm	= I2C_BFIN_TWI_PM_OPS,
756 757 758 759 760 761 762 763 764 765 766 767 768
	},
};

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

769
subsys_initcall(i2c_bfin_twi_init);
770
module_exit(i2c_bfin_twi_exit);
771 772 773 774

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