i2c-mpc.c 19.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * (C) Copyright 2003-2004
 * Humboldt Solutions Ltd, adrian@humboldt.co.uk.

 * This is a combined i2c adapter and algorithm driver for the
 * MPC107/Tsi107 PowerPC northbridge and processors that include
 * the same I2C unit (8240, 8245, 85xx).
 *
 * Release 0.8
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2. This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/init.h>
20 21
#include <linux/of_platform.h>
#include <linux/of_i2c.h>
22
#include <linux/slab.h>
23

24
#include <linux/io.h>
L
Linus Torvalds 已提交
25 26 27 28 29
#include <linux/fsl_devices.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/delay.h>

30 31 32
#include <asm/mpc52xx.h>
#include <sysdev/fsl_soc.h>

33 34
#define DRV_NAME "mpc-i2c"

35 36 37
#define MPC_I2C_CLOCK_LEGACY   0
#define MPC_I2C_CLOCK_PRESERVE (~0U)

38 39 40 41
#define MPC_I2C_FDR   0x04
#define MPC_I2C_CR    0x08
#define MPC_I2C_SR    0x0c
#define MPC_I2C_DR    0x10
L
Linus Torvalds 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#define MPC_I2C_DFSRR 0x14

#define CCR_MEN  0x80
#define CCR_MIEN 0x40
#define CCR_MSTA 0x20
#define CCR_MTX  0x10
#define CCR_TXAK 0x08
#define CCR_RSTA 0x04

#define CSR_MCF  0x80
#define CSR_MAAS 0x40
#define CSR_MBB  0x20
#define CSR_MAL  0x10
#define CSR_SRW  0x04
#define CSR_MIF  0x02
#define CSR_RXAK 0x01

struct mpc_i2c {
60
	struct device *dev;
A
Al Viro 已提交
61
	void __iomem *base;
L
Linus Torvalds 已提交
62 63 64 65
	u32 interrupt;
	wait_queue_head_t queue;
	struct i2c_adapter adap;
	int irq;
66
	u32 real_clk;
67 68 69 70 71 72 73
};

struct mpc_i2c_divider {
	u16 divider;
	u16 fdr;	/* including dfsrr */
};

74
struct mpc_i2c_data {
75 76
	void (*setup)(struct device_node *node, struct mpc_i2c *i2c,
		      u32 clock, u32 prescaler);
77
	u32 prescaler;
L
Linus Torvalds 已提交
78 79
};

80
static inline void writeccr(struct mpc_i2c *i2c, u32 x)
L
Linus Torvalds 已提交
81 82 83 84
{
	writeb(x, i2c->base + MPC_I2C_CR);
}

85
static irqreturn_t mpc_i2c_isr(int irq, void *dev_id)
L
Linus Torvalds 已提交
86 87 88 89 90 91
{
	struct mpc_i2c *i2c = dev_id;
	if (readb(i2c->base + MPC_I2C_SR) & CSR_MIF) {
		/* Read again to allow register to stabilise */
		i2c->interrupt = readb(i2c->base + MPC_I2C_SR);
		writeb(0, i2c->base + MPC_I2C_SR);
92
		wake_up(&i2c->queue);
L
Linus Torvalds 已提交
93 94 95 96
	}
	return IRQ_HANDLED;
}

97 98 99
/* Sometimes 9th clock pulse isn't generated, and slave doesn't release
 * the bus, because it wants to send ACK.
 * Following sequence of enabling/disabling and sending start/stop generates
100
 * the 9 pulses, so it's all OK.
101 102 103
 */
static void mpc_i2c_fixup(struct mpc_i2c *i2c)
{
104 105 106 107 108 109 110 111 112 113 114 115 116
	int k;
	u32 delay_val = 1000000 / i2c->real_clk + 1;

	if (delay_val < 2)
		delay_val = 2;

	for (k = 9; k; k--) {
		writeccr(i2c, 0);
		writeccr(i2c, CCR_MSTA | CCR_MTX | CCR_MEN);
		udelay(delay_val);
		writeccr(i2c, CCR_MEN);
		udelay(delay_val << 1);
	}
117 118
}

L
Linus Torvalds 已提交
119 120 121 122 123 124
static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
{
	unsigned long orig_jiffies = jiffies;
	u32 x;
	int result = 0;

W
Wolfram Sang 已提交
125
	if (!i2c->irq) {
L
Linus Torvalds 已提交
126 127 128
		while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) {
			schedule();
			if (time_after(jiffies, orig_jiffies + timeout)) {
129
				dev_dbg(i2c->dev, "timeout\n");
130
				writeccr(i2c, 0);
L
Linus Torvalds 已提交
131 132 133 134 135 136 137 138
				result = -EIO;
				break;
			}
		}
		x = readb(i2c->base + MPC_I2C_SR);
		writeb(0, i2c->base + MPC_I2C_SR);
	} else {
		/* Interrupt mode */
139
		result = wait_event_timeout(i2c->queue,
140
			(i2c->interrupt & CSR_MIF), timeout);
L
Linus Torvalds 已提交
141

142
		if (unlikely(!(i2c->interrupt & CSR_MIF))) {
143
			dev_dbg(i2c->dev, "wait timeout\n");
144
			writeccr(i2c, 0);
L
Linus Torvalds 已提交
145 146 147 148 149 150 151 152 153 154 155
			result = -ETIMEDOUT;
		}

		x = i2c->interrupt;
		i2c->interrupt = 0;
	}

	if (result < 0)
		return result;

	if (!(x & CSR_MCF)) {
156
		dev_dbg(i2c->dev, "unfinished\n");
L
Linus Torvalds 已提交
157 158 159 160
		return -EIO;
	}

	if (x & CSR_MAL) {
161
		dev_dbg(i2c->dev, "MAL\n");
L
Linus Torvalds 已提交
162 163 164 165
		return -EIO;
	}

	if (writing && (x & CSR_RXAK)) {
166
		dev_dbg(i2c->dev, "No RXAK\n");
L
Linus Torvalds 已提交
167 168 169 170 171 172 173
		/* generate stop */
		writeccr(i2c, CCR_MEN);
		return -EIO;
	}
	return 0;
}

174
#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x)
175
static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] __devinitconst = {
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
	{20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23},
	{28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02},
	{36, 0x26}, {40, 0x27}, {44, 0x04}, {48, 0x28},
	{52, 0x63}, {56, 0x29}, {60, 0x41}, {64, 0x2a},
	{68, 0x07}, {72, 0x2b}, {80, 0x2c}, {88, 0x09},
	{96, 0x2d}, {104, 0x0a}, {112, 0x2e}, {120, 0x81},
	{128, 0x2f}, {136, 0x47}, {144, 0x0c}, {160, 0x30},
	{176, 0x49}, {192, 0x31}, {208, 0x4a}, {224, 0x32},
	{240, 0x0f}, {256, 0x33}, {272, 0x87}, {288, 0x10},
	{320, 0x34}, {352, 0x89}, {384, 0x35}, {416, 0x8a},
	{448, 0x36}, {480, 0x13}, {512, 0x37}, {576, 0x14},
	{640, 0x38}, {768, 0x39}, {896, 0x3a}, {960, 0x17},
	{1024, 0x3b}, {1152, 0x18}, {1280, 0x3c}, {1536, 0x3d},
	{1792, 0x3e}, {1920, 0x1b}, {2048, 0x3f}, {2304, 0x1c},
	{2560, 0x1d}, {3072, 0x1e}, {3584, 0x7e}, {3840, 0x1f},
	{4096, 0x7f}, {4608, 0x5c}, {5120, 0x5d}, {6144, 0x5e},
	{7168, 0xbe}, {7680, 0x5f}, {8192, 0xbf}, {9216, 0x9c},
	{10240, 0x9d}, {12288, 0x9e}, {15360, 0x9f}
};

196
static int __devinit mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
197
					  int prescaler, u32 *real_clk)
198
{
199
	const struct mpc_i2c_divider *div = NULL;
200 201 202 203
	unsigned int pvr = mfspr(SPRN_PVR);
	u32 divider;
	int i;

204 205 206
	if (clock == MPC_I2C_CLOCK_LEGACY) {
		/* see below - default fdr = 0x3f -> div = 2048 */
		*real_clk = mpc5xxx_get_bus_frequency(node) / 2048;
207
		return -EINVAL;
208
	}
209 210

	/* Determine divider value */
211
	divider = mpc5xxx_get_bus_frequency(node) / clock;
212 213 214 215 216

	/*
	 * We want to choose an FDR/DFSR that generates an I2C bus speed that
	 * is equal to or lower than the requested speed.
	 */
217
	for (i = 0; i < ARRAY_SIZE(mpc_i2c_dividers_52xx); i++) {
218 219 220 221 222 223 224 225
		div = &mpc_i2c_dividers_52xx[i];
		/* Old MPC5200 rev A CPUs do not support the high bits */
		if (div->fdr & 0xc0 && pvr == 0x80822011)
			continue;
		if (div->divider >= divider)
			break;
	}

226 227
	*real_clk = mpc5xxx_get_bus_frequency(node) / div->divider;
	return (int)div->fdr;
228 229
}

230 231 232
static void __devinit mpc_i2c_setup_52xx(struct device_node *node,
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
233
{
234 235
	int ret, fdr;

236 237 238 239 240 241
	if (clock == MPC_I2C_CLOCK_PRESERVE) {
		dev_dbg(i2c->dev, "using fdr %d\n",
			readb(i2c->base + MPC_I2C_FDR));
		return;
	}

242
	ret = mpc_i2c_get_fdr_52xx(node, clock, prescaler, &i2c->real_clk);
243
	fdr = (ret >= 0) ? ret : 0x3f; /* backward compatibility */
244 245

	writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR);
246 247

	if (ret >= 0)
248 249
		dev_info(i2c->dev, "clock %u Hz (fdr=%d)\n", i2c->real_clk,
			 fdr);
250
}
251
#else /* !(CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x) */
252 253 254
static void __devinit mpc_i2c_setup_52xx(struct device_node *node,
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
255 256
{
}
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
#endif /* CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x */

#ifdef CONFIG_PPC_MPC512x
static void __devinit mpc_i2c_setup_512x(struct device_node *node,
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
{
	struct device_node *node_ctrl;
	void __iomem *ctrl;
	const u32 *pval;
	u32 idx;

	/* Enable I2C interrupts for mpc5121 */
	node_ctrl = of_find_compatible_node(NULL, NULL,
					    "fsl,mpc5121-i2c-ctrl");
	if (node_ctrl) {
		ctrl = of_iomap(node_ctrl, 0);
		if (ctrl) {
			/* Interrupt enable bits for i2c-0/1/2: bit 24/26/28 */
			pval = of_get_property(node, "reg", NULL);
			idx = (*pval & 0xff) / 0x20;
			setbits32(ctrl, 1 << (24 + idx * 2));
			iounmap(ctrl);
		}
		of_node_put(node_ctrl);
	}

	/* The clock setup for the 52xx works also fine for the 512x */
	mpc_i2c_setup_52xx(node, i2c, clock, prescaler);
}
#else /* CONFIG_PPC_MPC512x */
static void __devinit mpc_i2c_setup_512x(struct device_node *node,
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
{
}
#endif /* CONFIG_PPC_MPC512x */
294 295

#ifdef CONFIG_FSL_SOC
296
static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] __devinitconst = {
297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
	{160, 0x0120}, {192, 0x0121}, {224, 0x0122}, {256, 0x0123},
	{288, 0x0100}, {320, 0x0101}, {352, 0x0601}, {384, 0x0102},
	{416, 0x0602}, {448, 0x0126}, {480, 0x0103}, {512, 0x0127},
	{544, 0x0b03}, {576, 0x0104}, {608, 0x1603}, {640, 0x0105},
	{672, 0x2003}, {704, 0x0b05}, {736, 0x2b03}, {768, 0x0106},
	{800, 0x3603}, {832, 0x0b06}, {896, 0x012a}, {960, 0x0107},
	{1024, 0x012b}, {1088, 0x1607}, {1152, 0x0108}, {1216, 0x2b07},
	{1280, 0x0109}, {1408, 0x1609}, {1536, 0x010a}, {1664, 0x160a},
	{1792, 0x012e}, {1920, 0x010b}, {2048, 0x012f}, {2176, 0x2b0b},
	{2304, 0x010c}, {2560, 0x010d}, {2816, 0x2b0d}, {3072, 0x010e},
	{3328, 0x2b0e}, {3584, 0x0132}, {3840, 0x010f}, {4096, 0x0133},
	{4608, 0x0110}, {5120, 0x0111}, {6144, 0x0112}, {7168, 0x0136},
	{7680, 0x0113}, {8192, 0x0137}, {9216, 0x0114}, {10240, 0x0115},
	{12288, 0x0116}, {14336, 0x013a}, {15360, 0x0117}, {16384, 0x013b},
	{18432, 0x0118}, {20480, 0x0119}, {24576, 0x011a}, {28672, 0x013e},
	{30720, 0x011b}, {32768, 0x013f}, {36864, 0x011c}, {40960, 0x011d},
	{49152, 0x011e}, {61440, 0x011f}
};

316
static u32 __devinit mpc_i2c_get_sec_cfg_8xxx(void)
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
{
	struct device_node *node = NULL;
	u32 __iomem *reg;
	u32 val = 0;

	node = of_find_node_by_name(NULL, "global-utilities");
	if (node) {
		const u32 *prop = of_get_property(node, "reg", NULL);
		if (prop) {
			/*
			 * Map and check POR Device Status Register 2
			 * (PORDEVSR2) at 0xE0014
			 */
			reg = ioremap(get_immrbase() + *prop + 0x14, 0x4);
			if (!reg)
				printk(KERN_ERR
				       "Error: couldn't map PORDEVSR2\n");
			else
				val = in_be32(reg) & 0x00000080; /* sec-cfg */
			iounmap(reg);
		}
	}
	if (node)
		of_node_put(node);

	return val;
}

345
static int __devinit mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock,
346
					  u32 prescaler, u32 *real_clk)
347 348 349 350 351
{
	const struct mpc_i2c_divider *div = NULL;
	u32 divider;
	int i;

352 353 354
	if (clock == MPC_I2C_CLOCK_LEGACY) {
		/* see below - default fdr = 0x1031 -> div = 16 * 3072 */
		*real_clk = fsl_get_sys_freq() / prescaler / (16 * 3072);
355
		return -EINVAL;
356
	}
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378

	/* Determine proper divider value */
	if (of_device_is_compatible(node, "fsl,mpc8544-i2c"))
		prescaler = mpc_i2c_get_sec_cfg_8xxx() ? 3 : 2;
	if (!prescaler)
		prescaler = 1;

	divider = fsl_get_sys_freq() / clock / prescaler;

	pr_debug("I2C: src_clock=%d clock=%d divider=%d\n",
		 fsl_get_sys_freq(), clock, divider);

	/*
	 * We want to choose an FDR/DFSR that generates an I2C bus speed that
	 * is equal to or lower than the requested speed.
	 */
	for (i = 0; i < ARRAY_SIZE(mpc_i2c_dividers_8xxx); i++) {
		div = &mpc_i2c_dividers_8xxx[i];
		if (div->divider >= divider)
			break;
	}

379
	*real_clk = fsl_get_sys_freq() / prescaler / div->divider;
380 381 382
	return div ? (int)div->fdr : -EINVAL;
}

383 384 385
static void __devinit mpc_i2c_setup_8xxx(struct device_node *node,
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
386
{
387 388
	int ret, fdr;

389 390 391 392 393 394 395
	if (clock == MPC_I2C_CLOCK_PRESERVE) {
		dev_dbg(i2c->dev, "using dfsrr %d, fdr %d\n",
			readb(i2c->base + MPC_I2C_DFSRR),
			readb(i2c->base + MPC_I2C_FDR));
		return;
	}

396
	ret = mpc_i2c_get_fdr_8xxx(node, clock, prescaler, &i2c->real_clk);
397
	fdr = (ret >= 0) ? ret : 0x1031; /* backward compatibility */
398 399 400

	writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR);
	writeb((fdr >> 8) & 0xff, i2c->base + MPC_I2C_DFSRR);
401 402 403

	if (ret >= 0)
		dev_info(i2c->dev, "clock %d Hz (dfsrr=%d fdr=%d)\n",
404
			 i2c->real_clk, fdr >> 8, fdr & 0xff);
405 406 407
}

#else /* !CONFIG_FSL_SOC */
408 409 410
static void __devinit mpc_i2c_setup_8xxx(struct device_node *node,
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
L
Linus Torvalds 已提交
411 412
{
}
413
#endif /* CONFIG_FSL_SOC */
L
Linus Torvalds 已提交
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428

static void mpc_i2c_start(struct mpc_i2c *i2c)
{
	/* Clear arbitration */
	writeb(0, i2c->base + MPC_I2C_SR);
	/* Start with MEN */
	writeccr(i2c, CCR_MEN);
}

static void mpc_i2c_stop(struct mpc_i2c *i2c)
{
	writeccr(i2c, CCR_MEN);
}

static int mpc_write(struct mpc_i2c *i2c, int target,
429
		     const u8 *data, int length, int restart)
L
Linus Torvalds 已提交
430
{
431
	int i, result;
L
Linus Torvalds 已提交
432 433 434 435 436 437 438 439
	unsigned timeout = i2c->adap.timeout;
	u32 flags = restart ? CCR_RSTA : 0;

	/* Start as master */
	writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags);
	/* Write target byte */
	writeb((target << 1), i2c->base + MPC_I2C_DR);

440 441 442
	result = i2c_wait(i2c, timeout, 1);
	if (result < 0)
		return result;
L
Linus Torvalds 已提交
443 444 445 446 447

	for (i = 0; i < length; i++) {
		/* Write data byte */
		writeb(data[i], i2c->base + MPC_I2C_DR);

448 449 450
		result = i2c_wait(i2c, timeout, 1);
		if (result < 0)
			return result;
L
Linus Torvalds 已提交
451 452 453 454 455 456
	}

	return 0;
}

static int mpc_read(struct mpc_i2c *i2c, int target,
457
		    u8 *data, int length, int restart, bool recv_len)
L
Linus Torvalds 已提交
458 459
{
	unsigned timeout = i2c->adap.timeout;
460
	int i, result;
L
Linus Torvalds 已提交
461 462 463 464 465 466 467
	u32 flags = restart ? CCR_RSTA : 0;

	/* Switch to read - restart */
	writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags);
	/* Write target address byte - this time with the read flag set */
	writeb((target << 1) | 1, i2c->base + MPC_I2C_DR);

468 469 470
	result = i2c_wait(i2c, timeout, 1);
	if (result < 0)
		return result;
L
Linus Torvalds 已提交
471 472

	if (length) {
473
		if (length == 1 && !recv_len)
L
Linus Torvalds 已提交
474 475 476 477 478 479 480 481
			writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK);
		else
			writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA);
		/* Dummy read */
		readb(i2c->base + MPC_I2C_DR);
	}

	for (i = 0; i < length; i++) {
482 483
		u8 byte;

484 485 486
		result = i2c_wait(i2c, timeout, 0);
		if (result < 0)
			return result;
L
Linus Torvalds 已提交
487

488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
		/*
		 * For block reads, we have to know the total length (1st byte)
		 * before we can determine if we are done.
		 */
		if (i || !recv_len) {
			/* Generate txack on next to last byte */
			if (i == length - 2)
				writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA
					 | CCR_TXAK);
			/* Do not generate stop on last byte */
			if (i == length - 1)
				writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA
					 | CCR_MTX);
		}

		byte = readb(i2c->base + MPC_I2C_DR);

		/*
		 * Adjust length if first received byte is length.
		 * The length is 1 length byte plus actually data length
		 */
		if (i == 0 && recv_len) {
			if (byte == 0 || byte > I2C_SMBUS_BLOCK_MAX)
				return -EPROTO;
			length += byte;
			/*
			 * For block reads, generate txack here if data length
			 * is 1 byte (total length is 2 bytes).
			 */
			if (length == 2)
				writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA
					 | CCR_TXAK);
		}
		data[i] = byte;
L
Linus Torvalds 已提交
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539
	}

	return length;
}

static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
	struct i2c_msg *pmsg;
	int i;
	int ret = 0;
	unsigned long orig_jiffies = jiffies;
	struct mpc_i2c *i2c = i2c_get_adapdata(adap);

	mpc_i2c_start(i2c);

	/* Allow bus up to 1s to become not busy */
	while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) {
		if (signal_pending(current)) {
540
			dev_dbg(i2c->dev, "Interrupted\n");
541
			writeccr(i2c, 0);
L
Linus Torvalds 已提交
542 543 544
			return -EINTR;
		}
		if (time_after(jiffies, orig_jiffies + HZ)) {
545 546
			u8 status = readb(i2c->base + MPC_I2C_SR);

547
			dev_dbg(i2c->dev, "timeout\n");
548 549 550
			if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) {
				writeb(status & ~CSR_MAL,
				       i2c->base + MPC_I2C_SR);
551
				mpc_i2c_fixup(i2c);
552
			}
L
Linus Torvalds 已提交
553 554 555 556 557 558 559
			return -EIO;
		}
		schedule();
	}

	for (i = 0; ret >= 0 && i < num; i++) {
		pmsg = &msgs[i];
560 561 562 563
		dev_dbg(i2c->dev,
			"Doing %s %d bytes to 0x%02x - %d of %d messages\n",
			pmsg->flags & I2C_M_RD ? "read" : "write",
			pmsg->len, pmsg->addr, i + 1, num);
564 565 566 567 568 569 570 571
		if (pmsg->flags & I2C_M_RD) {
			bool recv_len = pmsg->flags & I2C_M_RECV_LEN;

			ret = mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i,
				       recv_len);
			if (recv_len && ret > 0)
				pmsg->len = ret;
		} else {
L
Linus Torvalds 已提交
572 573
			ret =
			    mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i);
574
		}
L
Linus Torvalds 已提交
575 576 577 578 579 580 581
	}
	mpc_i2c_stop(i2c);
	return (ret < 0) ? ret : num;
}

static u32 mpc_functionality(struct i2c_adapter *adap)
{
582 583
	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL
	  | I2C_FUNC_SMBUS_READ_BLOCK_DATA | I2C_FUNC_SMBUS_BLOCK_PROC_CALL;
L
Linus Torvalds 已提交
584 585
}

586
static const struct i2c_algorithm mpc_algo = {
L
Linus Torvalds 已提交
587 588 589 590 591 592 593 594
	.master_xfer = mpc_xfer,
	.functionality = mpc_functionality,
};

static struct i2c_adapter mpc_ops = {
	.owner = THIS_MODULE,
	.name = "MPC adapter",
	.algo = &mpc_algo,
595
	.timeout = HZ,
L
Linus Torvalds 已提交
596 597
};

598
static const struct of_device_id mpc_i2c_of_match[];
599
static int __devinit fsl_i2c_probe(struct platform_device *op)
600
{
601
	const struct of_device_id *match;
602
	struct mpc_i2c *i2c;
603
	const u32 *prop;
604
	u32 clock = MPC_I2C_CLOCK_LEGACY;
605 606
	int result = 0;
	int plen;
607

608 609
	match = of_match_device(mpc_i2c_of_match, &op->dev);
	if (!match)
610 611
		return -EINVAL;

612 613
	i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
	if (!i2c)
614 615
		return -ENOMEM;

616 617
	i2c->dev = &op->dev; /* for debug and error output */

618
	init_waitqueue_head(&i2c->queue);
619

620
	i2c->base = of_iomap(op->dev.of_node, 0);
621
	if (!i2c->base) {
622
		dev_err(i2c->dev, "failed to map controller\n");
623 624 625 626
		result = -ENOMEM;
		goto fail_map;
	}

627
	i2c->irq = irq_of_parse_and_map(op->dev.of_node, 0);
W
Wolfram Sang 已提交
628
	if (i2c->irq) { /* no i2c->irq implies polling */
629 630 631
		result = request_irq(i2c->irq, mpc_i2c_isr,
				     IRQF_SHARED, "i2c-mpc", i2c);
		if (result < 0) {
632
			dev_err(i2c->dev, "failed to attach interrupt\n");
633
			goto fail_request;
634
		}
635
	}
636

637
	if (of_get_property(op->dev.of_node, "fsl,preserve-clocking", NULL)) {
638 639
		clock = MPC_I2C_CLOCK_PRESERVE;
	} else {
640 641
		prop = of_get_property(op->dev.of_node, "clock-frequency",
					&plen);
642 643
		if (prop && plen == sizeof(u32))
			clock = *prop;
644
	}
645

646 647
	if (match->data) {
		struct mpc_i2c_data *data = match->data;
648
		data->setup(op->dev.of_node, i2c, clock, data->prescaler);
649 650
	} else {
		/* Backwards compatibility */
651 652
		if (of_get_property(op->dev.of_node, "dfsrr", NULL))
			mpc_i2c_setup_8xxx(op->dev.of_node, i2c, clock, 0);
653
	}
654

655 656 657 658 659 660 661 662
	prop = of_get_property(op->dev.of_node, "fsl,timeout", &plen);
	if (prop && plen == sizeof(u32)) {
		mpc_ops.timeout = *prop * HZ / 1000000;
		if (mpc_ops.timeout < 5)
			mpc_ops.timeout = 5;
	}
	dev_info(i2c->dev, "timeout %u us\n", mpc_ops.timeout * 1000000 / HZ);

663
	dev_set_drvdata(&op->dev, i2c);
664 665 666

	i2c->adap = mpc_ops;
	i2c_set_adapdata(&i2c->adap, i2c);
667
	i2c->adap.dev.parent = &op->dev;
G
Grant Likely 已提交
668
	i2c->adap.dev.of_node = of_node_get(op->dev.of_node);
669 670 671

	result = i2c_add_adapter(&i2c->adap);
	if (result < 0) {
672
		dev_err(i2c->dev, "failed to add adapter\n");
673 674
		goto fail_add;
	}
675
	of_i2c_register_devices(&i2c->adap);
676 677 678

	return result;

679 680 681 682 683
 fail_add:
	dev_set_drvdata(&op->dev, NULL);
	free_irq(i2c->irq, i2c);
 fail_request:
	irq_dispose_mapping(i2c->irq);
684
	iounmap(i2c->base);
685
 fail_map:
686 687 688 689
	kfree(i2c);
	return result;
};

690
static int __devexit fsl_i2c_remove(struct platform_device *op)
691
{
692
	struct mpc_i2c *i2c = dev_get_drvdata(&op->dev);
693 694

	i2c_del_adapter(&i2c->adap);
695
	dev_set_drvdata(&op->dev, NULL);
696

W
Wolfram Sang 已提交
697
	if (i2c->irq)
698 699
		free_irq(i2c->irq, i2c);

700
	irq_dispose_mapping(i2c->irq);
701 702 703 704 705
	iounmap(i2c->base);
	kfree(i2c);
	return 0;
};

706 707 708 709
static struct mpc_i2c_data mpc_i2c_data_512x __devinitdata = {
	.setup = mpc_i2c_setup_512x,
};

710
static struct mpc_i2c_data mpc_i2c_data_52xx __devinitdata = {
711
	.setup = mpc_i2c_setup_52xx,
712 713 714
};

static struct mpc_i2c_data mpc_i2c_data_8313 __devinitdata = {
715
	.setup = mpc_i2c_setup_8xxx,
716 717 718
};

static struct mpc_i2c_data mpc_i2c_data_8543 __devinitdata = {
719
	.setup = mpc_i2c_setup_8xxx,
720 721 722 723
	.prescaler = 2,
};

static struct mpc_i2c_data mpc_i2c_data_8544 __devinitdata = {
724
	.setup = mpc_i2c_setup_8xxx,
725 726 727
	.prescaler = 3,
};

728
static const struct of_device_id mpc_i2c_of_match[] = {
729 730 731
	{.compatible = "mpc5200-i2c", .data = &mpc_i2c_data_52xx, },
	{.compatible = "fsl,mpc5200b-i2c", .data = &mpc_i2c_data_52xx, },
	{.compatible = "fsl,mpc5200-i2c", .data = &mpc_i2c_data_52xx, },
732
	{.compatible = "fsl,mpc5121-i2c", .data = &mpc_i2c_data_512x, },
733 734 735
	{.compatible = "fsl,mpc8313-i2c", .data = &mpc_i2c_data_8313, },
	{.compatible = "fsl,mpc8543-i2c", .data = &mpc_i2c_data_8543, },
	{.compatible = "fsl,mpc8544-i2c", .data = &mpc_i2c_data_8544, },
736 737
	/* Backward compatibility */
	{.compatible = "fsl-i2c", },
738 739 740 741
	{},
};
MODULE_DEVICE_TABLE(of, mpc_i2c_of_match);

742
/* Structure for a device driver */
743
static struct platform_driver mpc_i2c_driver = {
744 745
	.probe		= fsl_i2c_probe,
	.remove		= __devexit_p(fsl_i2c_remove),
746 747 748 749
	.driver = {
		.owner = THIS_MODULE,
		.name = DRV_NAME,
		.of_match_table = mpc_i2c_of_match,
750
	},
751 752
};

753
module_platform_driver(mpc_i2c_driver);
754

L
Linus Torvalds 已提交
755
MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>");
756
MODULE_DESCRIPTION("I2C-Bus adapter for MPC107 bridge and "
757
		   "MPC824x/83xx/85xx/86xx/512x/52xx processors");
L
Linus Torvalds 已提交
758
MODULE_LICENSE("GPL");