i2c-mpc.c 21.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * (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>
18
#include <linux/sched/signal.h>
19 20
#include <linux/of_address.h>
#include <linux/of_irq.h>
21
#include <linux/of_platform.h>
22
#include <linux/slab.h>
23

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

31
#include <asm/mpc52xx.h>
32
#include <asm/mpc85xx.h>
33 34
#include <sysdev/fsl_soc.h>

35 36
#define DRV_NAME "mpc-i2c"

37 38 39
#define MPC_I2C_CLOCK_LEGACY   0
#define MPC_I2C_CLOCK_PRESERVE (~0U)

40 41 42 43
#define MPC_I2C_FDR   0x04
#define MPC_I2C_CR    0x08
#define MPC_I2C_SR    0x0c
#define MPC_I2C_DR    0x10
L
Linus Torvalds 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#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 {
62
	struct device *dev;
A
Al Viro 已提交
63
	void __iomem *base;
L
Linus Torvalds 已提交
64 65 66 67
	u32 interrupt;
	wait_queue_head_t queue;
	struct i2c_adapter adap;
	int irq;
68
	u32 real_clk;
69
#ifdef CONFIG_PM_SLEEP
70 71
	u8 fdr, dfsrr;
#endif
G
Gerhard Sittig 已提交
72
	struct clk *clk_per;
73 74 75 76 77 78 79
};

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

80
struct mpc_i2c_data {
81 82
	void (*setup)(struct device_node *node, struct mpc_i2c *i2c,
		      u32 clock, u32 prescaler);
83
	u32 prescaler;
L
Linus Torvalds 已提交
84 85
};

86
static inline void writeccr(struct mpc_i2c *i2c, u32 x)
L
Linus Torvalds 已提交
87 88 89 90
{
	writeb(x, i2c->base + MPC_I2C_CR);
}

91
static irqreturn_t mpc_i2c_isr(int irq, void *dev_id)
L
Linus Torvalds 已提交
92 93 94 95 96 97
{
	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);
98
		wake_up(&i2c->queue);
A
Amit Tomar 已提交
99
		return IRQ_HANDLED;
L
Linus Torvalds 已提交
100
	}
A
Amit Tomar 已提交
101
	return IRQ_NONE;
L
Linus Torvalds 已提交
102 103
}

104 105 106
/* 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
107
 * the 9 pulses, so it's all OK.
108 109 110
 */
static void mpc_i2c_fixup(struct mpc_i2c *i2c)
{
111 112 113 114 115 116 117 118 119
	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);
120
		readb(i2c->base + MPC_I2C_DR);
121 122 123
		writeccr(i2c, CCR_MEN);
		udelay(delay_val << 1);
	}
124 125
}

L
Linus Torvalds 已提交
126 127 128
static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
{
	unsigned long orig_jiffies = jiffies;
129
	u32 cmd_err;
L
Linus Torvalds 已提交
130 131
	int result = 0;

W
Wolfram Sang 已提交
132
	if (!i2c->irq) {
L
Linus Torvalds 已提交
133 134 135
		while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) {
			schedule();
			if (time_after(jiffies, orig_jiffies + timeout)) {
136
				dev_dbg(i2c->dev, "timeout\n");
137
				writeccr(i2c, 0);
138
				result = -ETIMEDOUT;
L
Linus Torvalds 已提交
139 140 141
				break;
			}
		}
142
		cmd_err = readb(i2c->base + MPC_I2C_SR);
L
Linus Torvalds 已提交
143 144 145
		writeb(0, i2c->base + MPC_I2C_SR);
	} else {
		/* Interrupt mode */
146
		result = wait_event_timeout(i2c->queue,
147
			(i2c->interrupt & CSR_MIF), timeout);
L
Linus Torvalds 已提交
148

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

155
		cmd_err = i2c->interrupt;
L
Linus Torvalds 已提交
156 157 158 159 160 161
		i2c->interrupt = 0;
	}

	if (result < 0)
		return result;

162
	if (!(cmd_err & CSR_MCF)) {
163
		dev_dbg(i2c->dev, "unfinished\n");
L
Linus Torvalds 已提交
164 165 166
		return -EIO;
	}

167
	if (cmd_err & CSR_MAL) {
168
		dev_dbg(i2c->dev, "MAL\n");
169
		return -EAGAIN;
L
Linus Torvalds 已提交
170 171
	}

172
	if (writing && (cmd_err & CSR_RXAK)) {
173
		dev_dbg(i2c->dev, "No RXAK\n");
L
Linus Torvalds 已提交
174 175
		/* generate stop */
		writeccr(i2c, CCR_MEN);
176
		return -ENXIO;
L
Linus Torvalds 已提交
177 178 179 180
	}
	return 0;
}

181
#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x)
182
static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = {
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
	{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}
};

203
static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
204
					  int prescaler, u32 *real_clk)
205
{
206
	const struct mpc_i2c_divider *div = NULL;
207 208 209 210
	unsigned int pvr = mfspr(SPRN_PVR);
	u32 divider;
	int i;

211 212 213
	if (clock == MPC_I2C_CLOCK_LEGACY) {
		/* see below - default fdr = 0x3f -> div = 2048 */
		*real_clk = mpc5xxx_get_bus_frequency(node) / 2048;
214
		return -EINVAL;
215
	}
216 217

	/* Determine divider value */
218
	divider = mpc5xxx_get_bus_frequency(node) / clock;
219 220 221 222 223

	/*
	 * We want to choose an FDR/DFSR that generates an I2C bus speed that
	 * is equal to or lower than the requested speed.
	 */
224
	for (i = 0; i < ARRAY_SIZE(mpc_i2c_dividers_52xx); i++) {
225 226 227 228 229 230 231 232
		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;
	}

233 234
	*real_clk = mpc5xxx_get_bus_frequency(node) / div->divider;
	return (int)div->fdr;
235 236
}

237
static void mpc_i2c_setup_52xx(struct device_node *node,
238 239
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
240
{
241 242
	int ret, fdr;

243 244 245 246 247 248
	if (clock == MPC_I2C_CLOCK_PRESERVE) {
		dev_dbg(i2c->dev, "using fdr %d\n",
			readb(i2c->base + MPC_I2C_FDR));
		return;
	}

249
	ret = mpc_i2c_get_fdr_52xx(node, clock, prescaler, &i2c->real_clk);
250
	fdr = (ret >= 0) ? ret : 0x3f; /* backward compatibility */
251 252

	writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR);
253 254

	if (ret >= 0)
255 256
		dev_info(i2c->dev, "clock %u Hz (fdr=%d)\n", i2c->real_clk,
			 fdr);
257
}
258
#else /* !(CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x) */
259
static void mpc_i2c_setup_52xx(struct device_node *node,
260 261
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
262 263
{
}
264 265 266
#endif /* CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x */

#ifdef CONFIG_PPC_MPC512x
267
static void mpc_i2c_setup_512x(struct device_node *node,
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 294
					 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 */
295
static void mpc_i2c_setup_512x(struct device_node *node,
296 297 298 299 300
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
{
}
#endif /* CONFIG_PPC_MPC512x */
301 302

#ifdef CONFIG_FSL_SOC
303
static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] = {
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322
	{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}
};

323
static u32 mpc_i2c_get_sec_cfg_8xxx(void)
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
{
	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);
		}
	}
346
	of_node_put(node);
347 348 349 350

	return val;
}

351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
static u32 mpc_i2c_get_prescaler_8xxx(void)
{
	/* mpc83xx and mpc82xx all have prescaler 1 */
	u32 prescaler = 1;

	/* mpc85xx */
	if (pvr_version_is(PVR_VER_E500V1) || pvr_version_is(PVR_VER_E500V2)
		|| pvr_version_is(PVR_VER_E500MC)
		|| pvr_version_is(PVR_VER_E5500)
		|| pvr_version_is(PVR_VER_E6500)) {
		unsigned int svr = mfspr(SPRN_SVR);

		if ((SVR_SOC_VER(svr) == SVR_8540)
			|| (SVR_SOC_VER(svr) == SVR_8541)
			|| (SVR_SOC_VER(svr) == SVR_8560)
			|| (SVR_SOC_VER(svr) == SVR_8555)
			|| (SVR_SOC_VER(svr) == SVR_8610))
			/* the above 85xx SoCs have prescaler 1 */
			prescaler = 1;
		else
			/* all the other 85xx have prescaler 2 */
			prescaler = 2;
	}

	return prescaler;
}

378
static int mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock,
379
					  u32 prescaler, u32 *real_clk)
380 381 382 383 384
{
	const struct mpc_i2c_divider *div = NULL;
	u32 divider;
	int i;

385 386 387
	if (clock == MPC_I2C_CLOCK_LEGACY) {
		/* see below - default fdr = 0x1031 -> div = 16 * 3072 */
		*real_clk = fsl_get_sys_freq() / prescaler / (16 * 3072);
388
		return -EINVAL;
389
	}
390 391 392 393 394

	/* Determine proper divider value */
	if (of_device_is_compatible(node, "fsl,mpc8544-i2c"))
		prescaler = mpc_i2c_get_sec_cfg_8xxx() ? 3 : 2;
	if (!prescaler)
395
		prescaler = mpc_i2c_get_prescaler_8xxx();
396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411

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

412
	*real_clk = fsl_get_sys_freq() / prescaler / div->divider;
413 414 415
	return div ? (int)div->fdr : -EINVAL;
}

416
static void mpc_i2c_setup_8xxx(struct device_node *node,
417 418
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
419
{
420 421
	int ret, fdr;

422 423 424 425 426 427 428
	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;
	}

429
	ret = mpc_i2c_get_fdr_8xxx(node, clock, prescaler, &i2c->real_clk);
430
	fdr = (ret >= 0) ? ret : 0x1031; /* backward compatibility */
431 432 433

	writeb(fdr & 0xff, i2c->base + MPC_I2C_FDR);
	writeb((fdr >> 8) & 0xff, i2c->base + MPC_I2C_DFSRR);
434 435 436

	if (ret >= 0)
		dev_info(i2c->dev, "clock %d Hz (dfsrr=%d fdr=%d)\n",
437
			 i2c->real_clk, fdr >> 8, fdr & 0xff);
438 439 440
}

#else /* !CONFIG_FSL_SOC */
441
static void mpc_i2c_setup_8xxx(struct device_node *node,
442 443
					 struct mpc_i2c *i2c,
					 u32 clock, u32 prescaler)
L
Linus Torvalds 已提交
444 445
{
}
446
#endif /* CONFIG_FSL_SOC */
L
Linus Torvalds 已提交
447 448 449 450 451 452 453 454 455 456 457 458 459 460 461

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,
462
		     const u8 *data, int length, int restart)
L
Linus Torvalds 已提交
463
{
464
	int i, result;
L
Linus Torvalds 已提交
465 466 467 468 469 470 471 472
	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);

473 474 475
	result = i2c_wait(i2c, timeout, 1);
	if (result < 0)
		return result;
L
Linus Torvalds 已提交
476 477 478 479 480

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

481 482 483
		result = i2c_wait(i2c, timeout, 1);
		if (result < 0)
			return result;
L
Linus Torvalds 已提交
484 485 486 487 488 489
	}

	return 0;
}

static int mpc_read(struct mpc_i2c *i2c, int target,
490
		    u8 *data, int length, int restart, bool recv_len)
L
Linus Torvalds 已提交
491 492
{
	unsigned timeout = i2c->adap.timeout;
493
	int i, result;
L
Linus Torvalds 已提交
494 495 496 497 498 499 500
	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);

501 502 503
	result = i2c_wait(i2c, timeout, 1);
	if (result < 0)
		return result;
L
Linus Torvalds 已提交
504 505

	if (length) {
506
		if (length == 1 && !recv_len)
L
Linus Torvalds 已提交
507 508 509 510 511 512 513 514
			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++) {
515 516
		u8 byte;

517 518 519
		result = i2c_wait(i2c, timeout, 0);
		if (result < 0)
			return result;
L
Linus Torvalds 已提交
520

521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
		/*
		 * 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 已提交
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
	}

	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)) {
573
			dev_dbg(i2c->dev, "Interrupted\n");
574
			writeccr(i2c, 0);
L
Linus Torvalds 已提交
575 576 577
			return -EINTR;
		}
		if (time_after(jiffies, orig_jiffies + HZ)) {
578 579
			u8 status = readb(i2c->base + MPC_I2C_SR);

580
			dev_dbg(i2c->dev, "timeout\n");
581 582 583
			if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) {
				writeb(status & ~CSR_MAL,
				       i2c->base + MPC_I2C_SR);
584
				mpc_i2c_fixup(i2c);
585
			}
L
Linus Torvalds 已提交
586 587 588 589 590 591 592
			return -EIO;
		}
		schedule();
	}

	for (i = 0; ret >= 0 && i < num; i++) {
		pmsg = &msgs[i];
593 594 595 596
		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);
597 598 599 600 601 602 603 604
		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 已提交
605 606
			ret =
			    mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i);
607
		}
L
Linus Torvalds 已提交
608
	}
609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
	mpc_i2c_stop(i2c); /* Initiate STOP */
	orig_jiffies = jiffies;
	/* Wait until STOP is seen, allow up to 1 s */
	while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) {
		if (time_after(jiffies, orig_jiffies + HZ)) {
			u8 status = readb(i2c->base + MPC_I2C_SR);

			dev_dbg(i2c->dev, "timeout\n");
			if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) {
				writeb(status & ~CSR_MAL,
				       i2c->base + MPC_I2C_SR);
				mpc_i2c_fixup(i2c);
			}
			return -EIO;
		}
		cond_resched();
	}
L
Linus Torvalds 已提交
626 627 628 629 630
	return (ret < 0) ? ret : num;
}

static u32 mpc_functionality(struct i2c_adapter *adap)
{
631 632
	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL
	  | I2C_FUNC_SMBUS_READ_BLOCK_DATA | I2C_FUNC_SMBUS_BLOCK_PROC_CALL;
L
Linus Torvalds 已提交
633 634
}

635
static const struct i2c_algorithm mpc_algo = {
L
Linus Torvalds 已提交
636 637 638 639 640 641 642
	.master_xfer = mpc_xfer,
	.functionality = mpc_functionality,
};

static struct i2c_adapter mpc_ops = {
	.owner = THIS_MODULE,
	.algo = &mpc_algo,
643
	.timeout = HZ,
L
Linus Torvalds 已提交
644 645
};

646
static const struct of_device_id mpc_i2c_of_match[];
647
static int fsl_i2c_probe(struct platform_device *op)
648
{
649
	const struct of_device_id *match;
650
	struct mpc_i2c *i2c;
651
	const u32 *prop;
652
	u32 clock = MPC_I2C_CLOCK_LEGACY;
653 654
	int result = 0;
	int plen;
655
	struct resource res;
G
Gerhard Sittig 已提交
656 657
	struct clk *clk;
	int err;
658

659 660
	match = of_match_device(mpc_i2c_of_match, &op->dev);
	if (!match)
661 662
		return -EINVAL;

663 664
	i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
	if (!i2c)
665 666
		return -ENOMEM;

667 668
	i2c->dev = &op->dev; /* for debug and error output */

669
	init_waitqueue_head(&i2c->queue);
670

671
	i2c->base = of_iomap(op->dev.of_node, 0);
672
	if (!i2c->base) {
673
		dev_err(i2c->dev, "failed to map controller\n");
674 675 676 677
		result = -ENOMEM;
		goto fail_map;
	}

678
	i2c->irq = irq_of_parse_and_map(op->dev.of_node, 0);
W
Wolfram Sang 已提交
679
	if (i2c->irq) { /* no i2c->irq implies polling */
680 681 682
		result = request_irq(i2c->irq, mpc_i2c_isr,
				     IRQF_SHARED, "i2c-mpc", i2c);
		if (result < 0) {
683
			dev_err(i2c->dev, "failed to attach interrupt\n");
684
			goto fail_request;
685
		}
686
	}
687

G
Gerhard Sittig 已提交
688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
	/*
	 * enable clock for the I2C peripheral (non fatal),
	 * keep a reference upon successful allocation
	 */
	clk = devm_clk_get(&op->dev, NULL);
	if (!IS_ERR(clk)) {
		err = clk_prepare_enable(clk);
		if (err) {
			dev_err(&op->dev, "failed to enable clock\n");
			goto fail_request;
		} else {
			i2c->clk_per = clk;
		}
	}

J
Julia Lawall 已提交
703
	if (of_property_read_bool(op->dev.of_node, "fsl,preserve-clocking")) {
704 705
		clock = MPC_I2C_CLOCK_PRESERVE;
	} else {
706 707
		prop = of_get_property(op->dev.of_node, "clock-frequency",
					&plen);
708 709
		if (prop && plen == sizeof(u32))
			clock = *prop;
710
	}
711

712
	if (match->data) {
713
		const struct mpc_i2c_data *data = match->data;
714
		data->setup(op->dev.of_node, i2c, clock, data->prescaler);
715 716
	} else {
		/* Backwards compatibility */
717 718
		if (of_get_property(op->dev.of_node, "dfsrr", NULL))
			mpc_i2c_setup_8xxx(op->dev.of_node, i2c, clock, 0);
719
	}
720

721 722 723 724 725 726 727 728
	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);

729
	platform_set_drvdata(op, i2c);
730 731

	i2c->adap = mpc_ops;
732 733 734
	of_address_to_resource(op->dev.of_node, 0, &res);
	scnprintf(i2c->adap.name, sizeof(i2c->adap.name),
		  "MPC adapter at 0x%llx", (unsigned long long)res.start);
735
	i2c_set_adapdata(&i2c->adap, i2c);
736
	i2c->adap.dev.parent = &op->dev;
G
Grant Likely 已提交
737
	i2c->adap.dev.of_node = of_node_get(op->dev.of_node);
738 739

	result = i2c_add_adapter(&i2c->adap);
740
	if (result < 0)
741 742 743 744
		goto fail_add;

	return result;

745
 fail_add:
G
Gerhard Sittig 已提交
746 747
	if (i2c->clk_per)
		clk_disable_unprepare(i2c->clk_per);
748 749 750
	free_irq(i2c->irq, i2c);
 fail_request:
	irq_dispose_mapping(i2c->irq);
751
	iounmap(i2c->base);
752
 fail_map:
753 754 755 756
	kfree(i2c);
	return result;
};

757
static int fsl_i2c_remove(struct platform_device *op)
758
{
759
	struct mpc_i2c *i2c = platform_get_drvdata(op);
760 761 762

	i2c_del_adapter(&i2c->adap);

G
Gerhard Sittig 已提交
763 764 765
	if (i2c->clk_per)
		clk_disable_unprepare(i2c->clk_per);

W
Wolfram Sang 已提交
766
	if (i2c->irq)
767 768
		free_irq(i2c->irq, i2c);

769
	irq_dispose_mapping(i2c->irq);
770 771 772 773 774
	iounmap(i2c->base);
	kfree(i2c);
	return 0;
};

775
#ifdef CONFIG_PM_SLEEP
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795
static int mpc_i2c_suspend(struct device *dev)
{
	struct mpc_i2c *i2c = dev_get_drvdata(dev);

	i2c->fdr = readb(i2c->base + MPC_I2C_FDR);
	i2c->dfsrr = readb(i2c->base + MPC_I2C_DFSRR);

	return 0;
}

static int mpc_i2c_resume(struct device *dev)
{
	struct mpc_i2c *i2c = dev_get_drvdata(dev);

	writeb(i2c->fdr, i2c->base + MPC_I2C_FDR);
	writeb(i2c->dfsrr, i2c->base + MPC_I2C_DFSRR);

	return 0;
}

796 797 798 799
static SIMPLE_DEV_PM_OPS(mpc_i2c_pm_ops, mpc_i2c_suspend, mpc_i2c_resume);
#define MPC_I2C_PM_OPS	(&mpc_i2c_pm_ops)
#else
#define MPC_I2C_PM_OPS	NULL
800 801
#endif

802
static const struct mpc_i2c_data mpc_i2c_data_512x = {
803 804 805
	.setup = mpc_i2c_setup_512x,
};

806
static const struct mpc_i2c_data mpc_i2c_data_52xx = {
807
	.setup = mpc_i2c_setup_52xx,
808 809
};

810
static const struct mpc_i2c_data mpc_i2c_data_8313 = {
811
	.setup = mpc_i2c_setup_8xxx,
812 813
};

814
static const struct mpc_i2c_data mpc_i2c_data_8543 = {
815
	.setup = mpc_i2c_setup_8xxx,
816 817 818
	.prescaler = 2,
};

819
static const struct mpc_i2c_data mpc_i2c_data_8544 = {
820
	.setup = mpc_i2c_setup_8xxx,
821 822 823
	.prescaler = 3,
};

824
static const struct of_device_id mpc_i2c_of_match[] = {
825 826 827
	{.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, },
828
	{.compatible = "fsl,mpc5121-i2c", .data = &mpc_i2c_data_512x, },
829 830 831
	{.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, },
832 833
	/* Backward compatibility */
	{.compatible = "fsl-i2c", },
834 835 836 837
	{},
};
MODULE_DEVICE_TABLE(of, mpc_i2c_of_match);

838
/* Structure for a device driver */
839
static struct platform_driver mpc_i2c_driver = {
840
	.probe		= fsl_i2c_probe,
841
	.remove		= fsl_i2c_remove,
842 843 844
	.driver = {
		.name = DRV_NAME,
		.of_match_table = mpc_i2c_of_match,
845
		.pm = MPC_I2C_PM_OPS,
846
	},
847 848
};

849
module_platform_driver(mpc_i2c_driver);
850

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