i2c-ocores.c 18.5 KB
Newer Older
F
Federico Vaga 已提交
1
// SPDX-License-Identifier: GPL-2.0
2 3
/*
 * i2c-ocores.c: I2C bus driver for OpenCores I2C controller
4
 * (https://opencores.org/project/i2c/overview)
5
 *
6
 * Peter Korsgaard <peter@korsgaard.com>
7
 *
8 9
 * Support for the GRLIB port of the controller by
 * Andreas Larsson <andreas@gaisler.com>
10 11
 */

12
#include <linux/clk.h>
13
#include <linux/delay.h>
14
#include <linux/err.h>
15 16 17 18 19 20 21
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/interrupt.h>
#include <linux/wait.h>
22
#include <linux/platform_data/i2c-ocores.h>
23
#include <linux/slab.h>
24
#include <linux/io.h>
25
#include <linux/log2.h>
26
#include <linux/spinlock.h>
27 28 29
#include <linux/jiffies.h>

#define OCORES_FLAG_POLL BIT(0)
30

31 32 33
/*
 * 'process_lock' exists because ocores_process() and ocores_process_timeout()
 * can't run in parallel.
34
 */
35 36
struct ocores_i2c {
	void __iomem *base;
37
	int iobase;
38
	u32 reg_shift;
39
	u32 reg_io_width;
40
	unsigned long flags;
41 42 43 44 45 46
	wait_queue_head_t wait;
	struct i2c_adapter adap;
	struct i2c_msg *msg;
	int pos;
	int nmsgs;
	int state; /* see STATE_ */
47
	spinlock_t process_lock;
48
	struct clk *clk;
49 50
	int ip_clock_khz;
	int bus_clock_khz;
51 52
	void (*setreg)(struct ocores_i2c *i2c, int reg, u8 value);
	u8 (*getreg)(struct ocores_i2c *i2c, int reg);
53 54 55 56 57 58 59
};

/* registers */
#define OCI2C_PRELOW		0
#define OCI2C_PREHIGH		1
#define OCI2C_CONTROL		2
#define OCI2C_DATA		3
60 61
#define OCI2C_CMD		4 /* write only */
#define OCI2C_STATUS		4 /* read only, same address as OCI2C_CMD */
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

#define OCI2C_CTRL_IEN		0x40
#define OCI2C_CTRL_EN		0x80

#define OCI2C_CMD_START		0x91
#define OCI2C_CMD_STOP		0x41
#define OCI2C_CMD_READ		0x21
#define OCI2C_CMD_WRITE		0x11
#define OCI2C_CMD_READ_ACK	0x21
#define OCI2C_CMD_READ_NACK	0x29
#define OCI2C_CMD_IACK		0x01

#define OCI2C_STAT_IF		0x01
#define OCI2C_STAT_TIP		0x02
#define OCI2C_STAT_ARBLOST	0x20
#define OCI2C_STAT_BUSY		0x40
#define OCI2C_STAT_NACK		0x80

#define STATE_DONE		0
#define STATE_START		1
#define STATE_WRITE		2
#define STATE_READ		3
#define STATE_ERROR		4

86 87 88 89
#define TYPE_OCORES		0
#define TYPE_GRLIB		1

static void oc_setreg_8(struct ocores_i2c *i2c, int reg, u8 value)
90
{
91 92 93 94 95 96 97 98 99 100 101 102 103
	iowrite8(value, i2c->base + (reg << i2c->reg_shift));
}

static void oc_setreg_16(struct ocores_i2c *i2c, int reg, u8 value)
{
	iowrite16(value, i2c->base + (reg << i2c->reg_shift));
}

static void oc_setreg_32(struct ocores_i2c *i2c, int reg, u8 value)
{
	iowrite32(value, i2c->base + (reg << i2c->reg_shift));
}

104 105 106 107 108 109 110 111 112 113
static void oc_setreg_16be(struct ocores_i2c *i2c, int reg, u8 value)
{
	iowrite16be(value, i2c->base + (reg << i2c->reg_shift));
}

static void oc_setreg_32be(struct ocores_i2c *i2c, int reg, u8 value)
{
	iowrite32be(value, i2c->base + (reg << i2c->reg_shift));
}

114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
static inline u8 oc_getreg_8(struct ocores_i2c *i2c, int reg)
{
	return ioread8(i2c->base + (reg << i2c->reg_shift));
}

static inline u8 oc_getreg_16(struct ocores_i2c *i2c, int reg)
{
	return ioread16(i2c->base + (reg << i2c->reg_shift));
}

static inline u8 oc_getreg_32(struct ocores_i2c *i2c, int reg)
{
	return ioread32(i2c->base + (reg << i2c->reg_shift));
}

129 130 131 132 133 134 135 136 137 138
static inline u8 oc_getreg_16be(struct ocores_i2c *i2c, int reg)
{
	return ioread16be(i2c->base + (reg << i2c->reg_shift));
}

static inline u8 oc_getreg_32be(struct ocores_i2c *i2c, int reg)
{
	return ioread32be(i2c->base + (reg << i2c->reg_shift));
}

139 140 141 142 143 144 145 146 147 148
static void oc_setreg_io_8(struct ocores_i2c *i2c, int reg, u8 value)
{
	outb(value, i2c->iobase + reg);
}

static inline u8 oc_getreg_io_8(struct ocores_i2c *i2c, int reg)
{
	return inb(i2c->iobase + reg);
}

149 150
static inline void oc_setreg(struct ocores_i2c *i2c, int reg, u8 value)
{
151
	i2c->setreg(i2c, reg, value);
152 153 154 155
}

static inline u8 oc_getreg(struct ocores_i2c *i2c, int reg)
{
156
	return i2c->getreg(i2c, reg);
157 158
}

159
static void ocores_process(struct ocores_i2c *i2c, u8 stat)
160 161
{
	struct i2c_msg *msg = i2c->msg;
162 163 164 165 166 167 168
	unsigned long flags;

	/*
	 * If we spin here is because we are in timeout, so we are going
	 * to be in STATE_ERROR. See ocores_process_timeout()
	 */
	spin_lock_irqsave(&i2c->process_lock, flags);
169 170 171 172 173

	if ((i2c->state == STATE_DONE) || (i2c->state == STATE_ERROR)) {
		/* stop has been sent */
		oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
		wake_up(&i2c->wait);
174
		goto out;
175 176 177 178 179 180
	}

	/* error? */
	if (stat & OCI2C_STAT_ARBLOST) {
		i2c->state = STATE_ERROR;
		oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
181
		goto out;
182 183 184 185 186 187 188 189 190
	}

	if ((i2c->state == STATE_START) || (i2c->state == STATE_WRITE)) {
		i2c->state =
			(msg->flags & I2C_M_RD) ? STATE_READ : STATE_WRITE;

		if (stat & OCI2C_STAT_NACK) {
			i2c->state = STATE_ERROR;
			oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
191
			goto out;
192
		}
F
Federico Vaga 已提交
193
	} else {
194
		msg->buf[i2c->pos++] = oc_getreg(i2c, OCI2C_DATA);
F
Federico Vaga 已提交
195
	}
196 197 198 199 200 201 202 203 204 205 206

	/* end of msg? */
	if (i2c->pos == msg->len) {
		i2c->nmsgs--;
		i2c->msg++;
		i2c->pos = 0;
		msg = i2c->msg;

		if (i2c->nmsgs) {	/* end? */
			/* send start? */
			if (!(msg->flags & I2C_M_NOSTART)) {
207
				u8 addr = i2c_8bit_addr_from_msg(msg);
208 209 210 211

				i2c->state = STATE_START;

				oc_setreg(i2c, OCI2C_DATA, addr);
F
Federico Vaga 已提交
212
				oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START);
213
				goto out;
F
Federico Vaga 已提交
214 215 216
			}
			i2c->state = (msg->flags & I2C_M_RD)
				? STATE_READ : STATE_WRITE;
217 218 219
		} else {
			i2c->state = STATE_DONE;
			oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
220
			goto out;
221 222 223 224 225 226 227 228 229 230
		}
	}

	if (i2c->state == STATE_READ) {
		oc_setreg(i2c, OCI2C_CMD, i2c->pos == (msg->len-1) ?
			  OCI2C_CMD_READ_NACK : OCI2C_CMD_READ_ACK);
	} else {
		oc_setreg(i2c, OCI2C_DATA, msg->buf[i2c->pos++]);
		oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_WRITE);
	}
231 232 233

out:
	spin_unlock_irqrestore(&i2c->process_lock, flags);
234 235
}

236
static irqreturn_t ocores_isr(int irq, void *dev_id)
237 238
{
	struct ocores_i2c *i2c = dev_id;
239 240 241 242
	u8 stat = oc_getreg(i2c, OCI2C_STATUS);

	if (!(stat & OCI2C_STAT_IF))
		return IRQ_NONE;
243

244
	ocores_process(i2c, stat);
245 246 247 248

	return IRQ_HANDLED;
}

249 250 251 252 253 254 255 256 257 258 259 260 261 262
/**
 * Process timeout event
 * @i2c: ocores I2C device instance
 */
static void ocores_process_timeout(struct ocores_i2c *i2c)
{
	unsigned long flags;

	spin_lock_irqsave(&i2c->process_lock, flags);
	i2c->state = STATE_ERROR;
	oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_STOP);
	spin_unlock_irqrestore(&i2c->process_lock, flags);
}

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 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 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 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
/**
 * Wait until something change in a given register
 * @i2c: ocores I2C device instance
 * @reg: register to query
 * @mask: bitmask to apply on register value
 * @val: expected result
 * @timeout: timeout in jiffies
 *
 * Timeout is necessary to avoid to stay here forever when the chip
 * does not answer correctly.
 *
 * Return: 0 on success, -ETIMEDOUT on timeout
 */
static int ocores_wait(struct ocores_i2c *i2c,
		       int reg, u8 mask, u8 val,
		       const unsigned long timeout)
{
	unsigned long j;

	j = jiffies + timeout;
	while (1) {
		u8 status = oc_getreg(i2c, reg);

		if ((status & mask) == val)
			break;

		if (time_after(jiffies, j))
			return -ETIMEDOUT;
	}
	return 0;
}

/**
 * Wait until is possible to process some data
 * @i2c: ocores I2C device instance
 *
 * Used when the device is in polling mode (interrupts disabled).
 *
 * Return: 0 on success, -ETIMEDOUT on timeout
 */
static int ocores_poll_wait(struct ocores_i2c *i2c)
{
	u8 mask;
	int err;

	if (i2c->state == STATE_DONE || i2c->state == STATE_ERROR) {
		/* transfer is over */
		mask = OCI2C_STAT_BUSY;
	} else {
		/* on going transfer */
		mask = OCI2C_STAT_TIP;
		/*
		 * We wait for the data to be transferred (8bit),
		 * then we start polling on the ACK/NACK bit
		 */
		udelay((8 * 1000) / i2c->bus_clock_khz);
	}

	/*
	 * once we are here we expect to get the expected result immediately
	 * so if after 1ms we timeout then something is broken.
	 */
	err = ocores_wait(i2c, OCI2C_STATUS, mask, 0, msecs_to_jiffies(1));
	if (err)
		dev_warn(i2c->adap.dev.parent,
			 "%s: STATUS timeout, bit 0x%x did not clear in 1ms\n",
			 __func__, mask);
	return err;
}

/**
 * It handles an IRQ-less transfer
 * @i2c: ocores I2C device instance
 *
 * Even if IRQ are disabled, the I2C OpenCore IP behavior is exactly the same
 * (only that IRQ are not produced). This means that we can re-use entirely
 * ocores_isr(), we just add our polling code around it.
 *
 * It can run in atomic context
 */
static void ocores_process_polling(struct ocores_i2c *i2c)
{
	while (1) {
		irqreturn_t ret;
		int err;

		err = ocores_poll_wait(i2c);
		if (err) {
			i2c->state = STATE_ERROR;
			break; /* timeout */
		}

		ret = ocores_isr(-1, i2c);
		if (ret == IRQ_NONE)
			break; /* all messages have been transferred */
	}
}

static int ocores_xfer_core(struct ocores_i2c *i2c,
			    struct i2c_msg *msgs, int num,
			    bool polling)
364
{
365
	int ret;
366 367 368 369 370 371 372
	u8 ctrl;

	ctrl = oc_getreg(i2c, OCI2C_CONTROL);
	if (polling)
		oc_setreg(i2c, OCI2C_CONTROL, ctrl & ~OCI2C_CTRL_IEN);
	else
		oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_IEN);
373 374 375 376 377 378

	i2c->msg = msgs;
	i2c->pos = 0;
	i2c->nmsgs = num;
	i2c->state = STATE_START;

379
	oc_setreg(i2c, OCI2C_DATA, i2c_8bit_addr_from_msg(i2c->msg));
380 381
	oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_START);

382 383 384 385 386 387 388 389 390 391
	if (polling) {
		ocores_process_polling(i2c);
	} else {
		ret = wait_event_timeout(i2c->wait,
					 (i2c->state == STATE_ERROR) ||
					 (i2c->state == STATE_DONE), HZ);
		if (ret == 0) {
			ocores_process_timeout(i2c);
			return -ETIMEDOUT;
		}
392 393 394
	}

	return (i2c->state == STATE_DONE) ? num : -EIO;
395 396
}

397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
static int ocores_xfer_polling(struct i2c_adapter *adap,
			       struct i2c_msg *msgs, int num)
{
	return ocores_xfer_core(i2c_get_adapdata(adap), msgs, num, true);
}

static int ocores_xfer(struct i2c_adapter *adap,
		       struct i2c_msg *msgs, int num)
{
	struct ocores_i2c *i2c = i2c_get_adapdata(adap);

	if (i2c->flags & OCORES_FLAG_POLL)
		return ocores_xfer_polling(adap, msgs, num);
	return ocores_xfer_core(i2c, msgs, num, false);
}

413
static int ocores_init(struct device *dev, struct ocores_i2c *i2c)
414 415
{
	int prescale;
416
	int diff;
417 418 419
	u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL);

	/* make sure the device is disabled */
420 421
	ctrl &= ~(OCI2C_CTRL_EN | OCI2C_CTRL_IEN);
	oc_setreg(i2c, OCI2C_CONTROL, ctrl);
422

423 424 425 426 427 428 429 430 431 432 433
	prescale = (i2c->ip_clock_khz / (5 * i2c->bus_clock_khz)) - 1;
	prescale = clamp(prescale, 0, 0xffff);

	diff = i2c->ip_clock_khz / (5 * (prescale + 1)) - i2c->bus_clock_khz;
	if (abs(diff) > i2c->bus_clock_khz / 10) {
		dev_err(dev,
			"Unsupported clock settings: core: %d KHz, bus: %d KHz\n",
			i2c->ip_clock_khz, i2c->bus_clock_khz);
		return -EINVAL;
	}

434 435 436 437 438
	oc_setreg(i2c, OCI2C_PRELOW, prescale & 0xff);
	oc_setreg(i2c, OCI2C_PREHIGH, prescale >> 8);

	/* Init the device */
	oc_setreg(i2c, OCI2C_CMD, OCI2C_CMD_IACK);
439
	oc_setreg(i2c, OCI2C_CONTROL, ctrl | OCI2C_CTRL_EN);
440 441

	return 0;
442 443 444 445 446 447 448 449
}


static u32 ocores_func(struct i2c_adapter *adap)
{
	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}

450
static const struct i2c_algorithm ocores_algorithm = {
451 452
	.master_xfer = ocores_xfer,
	.functionality = ocores_func,
453 454
};

455
static const struct i2c_adapter ocores_adapter = {
456 457 458 459
	.owner = THIS_MODULE,
	.name = "i2c-ocores",
	.class = I2C_CLASS_DEPRECATED,
	.algo = &ocores_algorithm,
460 461
};

J
Jingoo Han 已提交
462
static const struct of_device_id ocores_i2c_match[] = {
463 464 465 466 467 468 469 470 471 472 473 474
	{
		.compatible = "opencores,i2c-ocores",
		.data = (void *)TYPE_OCORES,
	},
	{
		.compatible = "aeroflexgaisler,i2cmst",
		.data = (void *)TYPE_GRLIB,
	},
	{},
};
MODULE_DEVICE_TABLE(of, ocores_i2c_match);

J
Jonas Bonn 已提交
475
#ifdef CONFIG_OF
F
Federico Vaga 已提交
476 477
/*
 * Read and write functions for the GRLIB port of the controller. Registers are
478
 * 32-bit big endian and the PRELOW and PREHIGH registers are merged into one
F
Federico Vaga 已提交
479 480
 * register. The subsequent registers have their offsets decreased accordingly.
 */
481 482 483 484
static u8 oc_getreg_grlib(struct ocores_i2c *i2c, int reg)
{
	u32 rd;
	int rreg = reg;
F
Federico Vaga 已提交
485

486 487 488 489 490 491 492 493 494 495 496 497 498
	if (reg != OCI2C_PRELOW)
		rreg--;
	rd = ioread32be(i2c->base + (rreg << i2c->reg_shift));
	if (reg == OCI2C_PREHIGH)
		return (u8)(rd >> 8);
	else
		return (u8)rd;
}

static void oc_setreg_grlib(struct ocores_i2c *i2c, int reg, u8 value)
{
	u32 curr, wr;
	int rreg = reg;
F
Federico Vaga 已提交
499

500 501 502 503 504 505 506 507 508 509 510 511 512 513
	if (reg != OCI2C_PRELOW)
		rreg--;
	if (reg == OCI2C_PRELOW || reg == OCI2C_PREHIGH) {
		curr = ioread32be(i2c->base + (rreg << i2c->reg_shift));
		if (reg == OCI2C_PRELOW)
			wr = (curr & 0xff00) | value;
		else
			wr = (((u32)value) << 8) | (curr & 0xff);
	} else {
		wr = value;
	}
	iowrite32be(wr, i2c->base + (rreg << i2c->reg_shift));
}

514 515
static int ocores_i2c_of_probe(struct platform_device *pdev,
				struct ocores_i2c *i2c)
J
Jonas Bonn 已提交
516
{
517
	struct device_node *np = pdev->dev.of_node;
518
	const struct of_device_id *match;
519
	u32 val;
520 521
	u32 clock_frequency;
	bool clock_frequency_present;
522 523 524 525 526 527 528 529 530 531 532 533 534

	if (of_property_read_u32(np, "reg-shift", &i2c->reg_shift)) {
		/* no 'reg-shift', check for deprecated 'regstep' */
		if (!of_property_read_u32(np, "regstep", &val)) {
			if (!is_power_of_2(val)) {
				dev_err(&pdev->dev, "invalid regstep %d\n",
					val);
				return -EINVAL;
			}
			i2c->reg_shift = ilog2(val);
			dev_warn(&pdev->dev,
				"regstep property deprecated, use reg-shift\n");
		}
J
Jonas Bonn 已提交
535 536
	}

537 538 539 540
	clock_frequency_present = !of_property_read_u32(np, "clock-frequency",
							&clock_frequency);
	i2c->bus_clock_khz = 100;

541 542 543 544 545 546 547 548 549 550 551 552 553
	i2c->clk = devm_clk_get(&pdev->dev, NULL);

	if (!IS_ERR(i2c->clk)) {
		int ret = clk_prepare_enable(i2c->clk);

		if (ret) {
			dev_err(&pdev->dev,
				"clk_prepare_enable failed: %d\n", ret);
			return ret;
		}
		i2c->ip_clock_khz = clk_get_rate(i2c->clk) / 1000;
		if (clock_frequency_present)
			i2c->bus_clock_khz = clock_frequency / 1000;
554 555 556 557 558 559 560 561
	}

	if (i2c->ip_clock_khz == 0) {
		if (of_property_read_u32(np, "opencores,ip-clock-frequency",
						&val)) {
			if (!clock_frequency_present) {
				dev_err(&pdev->dev,
					"Missing required parameter 'opencores,ip-clock-frequency'\n");
562
				clk_disable_unprepare(i2c->clk);
563 564 565 566 567 568 569 570 571
				return -ENODEV;
			}
			i2c->ip_clock_khz = clock_frequency / 1000;
			dev_warn(&pdev->dev,
				 "Deprecated usage of the 'clock-frequency' property, please update to 'opencores,ip-clock-frequency'\n");
		} else {
			i2c->ip_clock_khz = val / 1000;
			if (clock_frequency_present)
				i2c->bus_clock_khz = clock_frequency / 1000;
572
		}
J
Jonas Bonn 已提交
573 574
	}

575 576
	of_property_read_u32(pdev->dev.of_node, "reg-io-width",
				&i2c->reg_io_width);
577 578

	match = of_match_node(ocores_i2c_match, pdev->dev.of_node);
579
	if (match && (long)match->data == TYPE_GRLIB) {
580 581 582 583 584
		dev_dbg(&pdev->dev, "GRLIB variant of i2c-ocores\n");
		i2c->setreg = oc_setreg_grlib;
		i2c->getreg = oc_getreg_grlib;
	}

J
Jonas Bonn 已提交
585 586 587
	return 0;
}
#else
F
Federico Vaga 已提交
588
#define ocores_i2c_of_probe(pdev, i2c) -ENODEV
J
Jonas Bonn 已提交
589
#endif
590

591
static int ocores_i2c_probe(struct platform_device *pdev)
592 593 594
{
	struct ocores_i2c *i2c;
	struct ocores_i2c_platform_data *pdata;
595 596
	struct resource *res;
	int irq;
597
	int ret;
598
	int i;
599

600
	i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL);
601 602 603
	if (!i2c)
		return -ENOMEM;

604 605
	spin_lock_init(&i2c->process_lock);

606
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
	if (res) {
		i2c->base = devm_ioremap_resource(&pdev->dev, res);
		if (IS_ERR(i2c->base))
			return PTR_ERR(i2c->base);
	} else {
		res = platform_get_resource(pdev, IORESOURCE_IO, 0);
		if (!res)
			return -EINVAL;
		i2c->iobase = res->start;
		if (!devm_request_region(&pdev->dev, res->start,
					 resource_size(res),
					 pdev->name)) {
			dev_err(&pdev->dev, "Can't get I/O resource.\n");
			return -EBUSY;
		}
		i2c->setreg = oc_setreg_io_8;
		i2c->getreg = oc_getreg_io_8;
	}
625

J
Jingoo Han 已提交
626
	pdata = dev_get_platdata(&pdev->dev);
J
Jonas Bonn 已提交
627
	if (pdata) {
628
		i2c->reg_shift = pdata->reg_shift;
629
		i2c->reg_io_width = pdata->reg_io_width;
630
		i2c->ip_clock_khz = pdata->clock_khz;
631 632 633 634
		if (pdata->bus_khz)
			i2c->bus_clock_khz = pdata->bus_khz;
		else
			i2c->bus_clock_khz = 100;
J
Jonas Bonn 已提交
635 636 637 638 639 640
	} else {
		ret = ocores_i2c_of_probe(pdev, i2c);
		if (ret)
			return ret;
	}

641 642 643
	if (i2c->reg_io_width == 0)
		i2c->reg_io_width = 1; /* Set to default value */

644
	if (!i2c->setreg || !i2c->getreg) {
645 646 647
		bool be = pdata ? pdata->big_endian :
			of_device_is_big_endian(pdev->dev.of_node);

648 649 650 651 652 653 654
		switch (i2c->reg_io_width) {
		case 1:
			i2c->setreg = oc_setreg_8;
			i2c->getreg = oc_getreg_8;
			break;

		case 2:
655 656
			i2c->setreg = be ? oc_setreg_16be : oc_setreg_16;
			i2c->getreg = be ? oc_getreg_16be : oc_getreg_16;
657 658 659
			break;

		case 4:
660 661
			i2c->setreg = be ? oc_setreg_32be : oc_setreg_32;
			i2c->getreg = be ? oc_getreg_32be : oc_getreg_32;
662 663 664 665 666
			break;

		default:
			dev_err(&pdev->dev, "Unsupported I/O width (%d)\n",
				i2c->reg_io_width);
667 668
			ret = -EINVAL;
			goto err_clk;
669 670 671
		}
	}

672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690
	init_waitqueue_head(&i2c->wait);

	irq = platform_get_irq(pdev, 0);
	if (irq == -ENXIO) {
		i2c->flags |= OCORES_FLAG_POLL;
	} else {
		if (irq < 0)
			return irq;
	}

	if (!(i2c->flags & OCORES_FLAG_POLL)) {
		ret = devm_request_irq(&pdev->dev, irq, ocores_isr, 0,
				       pdev->name, i2c);
		if (ret) {
			dev_err(&pdev->dev, "Cannot claim IRQ\n");
			goto err_clk;
		}
	}

691 692
	ret = ocores_init(&pdev->dev, i2c);
	if (ret)
693
		goto err_clk;
694 695 696 697 698 699

	/* hook up driver to tree */
	platform_set_drvdata(pdev, i2c);
	i2c->adap = ocores_adapter;
	i2c_set_adapdata(&i2c->adap, i2c);
	i2c->adap.dev.parent = &pdev->dev;
J
Jonas Bonn 已提交
700
	i2c->adap.dev.of_node = pdev->dev.of_node;
701 702 703

	/* add i2c adapter to i2c tree */
	ret = i2c_add_adapter(&i2c->adap);
704
	if (ret)
705
		goto err_clk;
706

707
	/* add in known devices to the bus */
J
Jonas Bonn 已提交
708 709 710 711
	if (pdata) {
		for (i = 0; i < pdata->num_devices; i++)
			i2c_new_device(&i2c->adap, pdata->devices + i);
	}
712

713
	return 0;
714 715 716 717

err_clk:
	clk_disable_unprepare(i2c->clk);
	return ret;
718 719
}

720
static int ocores_i2c_remove(struct platform_device *pdev)
721 722
{
	struct ocores_i2c *i2c = platform_get_drvdata(pdev);
F
Federico Vaga 已提交
723
	u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL);
724 725

	/* disable i2c logic */
F
Federico Vaga 已提交
726 727
	ctrl &= ~(OCI2C_CTRL_EN | OCI2C_CTRL_IEN);
	oc_setreg(i2c, OCI2C_CONTROL, ctrl);
728 729 730 731

	/* remove adapter & data */
	i2c_del_adapter(&i2c->adap);

732 733 734
	if (!IS_ERR(i2c->clk))
		clk_disable_unprepare(i2c->clk);

735 736 737
	return 0;
}

738
#ifdef CONFIG_PM_SLEEP
739
static int ocores_i2c_suspend(struct device *dev)
M
Manuel Lauss 已提交
740
{
741
	struct ocores_i2c *i2c = dev_get_drvdata(dev);
M
Manuel Lauss 已提交
742 743 744
	u8 ctrl = oc_getreg(i2c, OCI2C_CONTROL);

	/* make sure the device is disabled */
F
Federico Vaga 已提交
745 746
	ctrl &= ~(OCI2C_CTRL_EN | OCI2C_CTRL_IEN);
	oc_setreg(i2c, OCI2C_CONTROL, ctrl);
M
Manuel Lauss 已提交
747

748 749
	if (!IS_ERR(i2c->clk))
		clk_disable_unprepare(i2c->clk);
M
Manuel Lauss 已提交
750 751 752
	return 0;
}

753
static int ocores_i2c_resume(struct device *dev)
M
Manuel Lauss 已提交
754
{
755
	struct ocores_i2c *i2c = dev_get_drvdata(dev);
M
Manuel Lauss 已提交
756

757
	if (!IS_ERR(i2c->clk)) {
758
		unsigned long rate;
759 760 761 762 763 764 765
		int ret = clk_prepare_enable(i2c->clk);

		if (ret) {
			dev_err(dev,
				"clk_prepare_enable failed: %d\n", ret);
			return ret;
		}
766 767 768
		rate = clk_get_rate(i2c->clk) / 1000;
		if (rate)
			i2c->ip_clock_khz = rate;
769
	}
770
	return ocores_init(dev, i2c);
M
Manuel Lauss 已提交
771
}
772 773 774

static SIMPLE_DEV_PM_OPS(ocores_i2c_pm, ocores_i2c_suspend, ocores_i2c_resume);
#define OCORES_I2C_PM	(&ocores_i2c_pm)
M
Manuel Lauss 已提交
775
#else
776
#define OCORES_I2C_PM	NULL
M
Manuel Lauss 已提交
777 778
#endif

779
static struct platform_driver ocores_i2c_driver = {
M
Manuel Lauss 已提交
780
	.probe   = ocores_i2c_probe,
781
	.remove  = ocores_i2c_remove,
M
Manuel Lauss 已提交
782
	.driver  = {
783
		.name = "ocores-i2c",
784
		.of_match_table = ocores_i2c_match,
785
		.pm = OCORES_I2C_PM,
786 787 788
	},
};

789
module_platform_driver(ocores_i2c_driver);
790

791
MODULE_AUTHOR("Peter Korsgaard <peter@korsgaard.com>");
792 793
MODULE_DESCRIPTION("OpenCores I2C bus driver");
MODULE_LICENSE("GPL");
794
MODULE_ALIAS("platform:ocores-i2c");