cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

i2c-cpm.c (17407B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Freescale CPM1/CPM2 I2C interface.
      4 * Copyright (c) 1999 Dan Malek (dmalek@jlc.net).
      5 *
      6 * moved into proper i2c interface;
      7 * Brad Parker (brad@heeltoe.com)
      8 *
      9 * Parts from dbox2_i2c.c (cvs.tuxbox.org)
     10 * (C) 2000-2001 Felix Domke (tmbinc@gmx.net), Gillem (htoa@gmx.net)
     11 *
     12 * (C) 2007 Montavista Software, Inc.
     13 * Vitaly Bordug <vitb@kernel.crashing.org>
     14 *
     15 * Converted to of_platform_device. Renamed to i2c-cpm.c.
     16 * (C) 2007,2008 Jochen Friedrich <jochen@scram.de>
     17 */
     18
     19#include <linux/kernel.h>
     20#include <linux/module.h>
     21#include <linux/delay.h>
     22#include <linux/slab.h>
     23#include <linux/interrupt.h>
     24#include <linux/errno.h>
     25#include <linux/stddef.h>
     26#include <linux/i2c.h>
     27#include <linux/io.h>
     28#include <linux/dma-mapping.h>
     29#include <linux/of_address.h>
     30#include <linux/of_device.h>
     31#include <linux/of_irq.h>
     32#include <linux/of_platform.h>
     33#include <sysdev/fsl_soc.h>
     34#include <asm/cpm.h>
     35
     36/* Try to define this if you have an older CPU (earlier than rev D4) */
     37/* However, better use a GPIO based bitbang driver in this case :/   */
     38#undef	I2C_CHIP_ERRATA
     39
     40#define CPM_MAX_READ    513
     41#define CPM_MAXBD       4
     42
     43#define I2C_EB			(0x10) /* Big endian mode */
     44#define I2C_EB_CPM2		(0x30) /* Big endian mode, memory snoop */
     45
     46#define DPRAM_BASE		((u8 __iomem __force *)cpm_muram_addr(0))
     47
     48/* I2C parameter RAM. */
     49struct i2c_ram {
     50	ushort  rbase;		/* Rx Buffer descriptor base address */
     51	ushort  tbase;		/* Tx Buffer descriptor base address */
     52	u_char  rfcr;		/* Rx function code */
     53	u_char  tfcr;		/* Tx function code */
     54	ushort  mrblr;		/* Max receive buffer length */
     55	uint    rstate;		/* Internal */
     56	uint    rdp;		/* Internal */
     57	ushort  rbptr;		/* Rx Buffer descriptor pointer */
     58	ushort  rbc;		/* Internal */
     59	uint    rxtmp;		/* Internal */
     60	uint    tstate;		/* Internal */
     61	uint    tdp;		/* Internal */
     62	ushort  tbptr;		/* Tx Buffer descriptor pointer */
     63	ushort  tbc;		/* Internal */
     64	uint    txtmp;		/* Internal */
     65	char    res1[4];	/* Reserved */
     66	ushort  rpbase;		/* Relocation pointer */
     67	char    res2[2];	/* Reserved */
     68	/* The following elements are only for CPM2 */
     69	char    res3[4];	/* Reserved */
     70	uint    sdmatmp;	/* Internal */
     71};
     72
     73#define I2COM_START	0x80
     74#define I2COM_MASTER	0x01
     75#define I2CER_TXE	0x10
     76#define I2CER_BUSY	0x04
     77#define I2CER_TXB	0x02
     78#define I2CER_RXB	0x01
     79#define I2MOD_EN	0x01
     80
     81/* I2C Registers */
     82struct i2c_reg {
     83	u8	i2mod;
     84	u8	res1[3];
     85	u8	i2add;
     86	u8	res2[3];
     87	u8	i2brg;
     88	u8	res3[3];
     89	u8	i2com;
     90	u8	res4[3];
     91	u8	i2cer;
     92	u8	res5[3];
     93	u8	i2cmr;
     94};
     95
     96struct cpm_i2c {
     97	char *base;
     98	struct platform_device *ofdev;
     99	struct i2c_adapter adap;
    100	uint dp_addr;
    101	int version; /* CPM1=1, CPM2=2 */
    102	int irq;
    103	int cp_command;
    104	int freq;
    105	struct i2c_reg __iomem *i2c_reg;
    106	struct i2c_ram __iomem *i2c_ram;
    107	u16 i2c_addr;
    108	wait_queue_head_t i2c_wait;
    109	cbd_t __iomem *tbase;
    110	cbd_t __iomem *rbase;
    111	u_char *txbuf[CPM_MAXBD];
    112	u_char *rxbuf[CPM_MAXBD];
    113	dma_addr_t txdma[CPM_MAXBD];
    114	dma_addr_t rxdma[CPM_MAXBD];
    115};
    116
    117static irqreturn_t cpm_i2c_interrupt(int irq, void *dev_id)
    118{
    119	struct cpm_i2c *cpm;
    120	struct i2c_reg __iomem *i2c_reg;
    121	struct i2c_adapter *adap = dev_id;
    122	int i;
    123
    124	cpm = i2c_get_adapdata(dev_id);
    125	i2c_reg = cpm->i2c_reg;
    126
    127	/* Clear interrupt. */
    128	i = in_8(&i2c_reg->i2cer);
    129	out_8(&i2c_reg->i2cer, i);
    130
    131	dev_dbg(&adap->dev, "Interrupt: %x\n", i);
    132
    133	wake_up(&cpm->i2c_wait);
    134
    135	return i ? IRQ_HANDLED : IRQ_NONE;
    136}
    137
    138static void cpm_reset_i2c_params(struct cpm_i2c *cpm)
    139{
    140	struct i2c_ram __iomem *i2c_ram = cpm->i2c_ram;
    141
    142	/* Set up the I2C parameters in the parameter ram. */
    143	out_be16(&i2c_ram->tbase, (u8 __iomem *)cpm->tbase - DPRAM_BASE);
    144	out_be16(&i2c_ram->rbase, (u8 __iomem *)cpm->rbase - DPRAM_BASE);
    145
    146	if (cpm->version == 1) {
    147		out_8(&i2c_ram->tfcr, I2C_EB);
    148		out_8(&i2c_ram->rfcr, I2C_EB);
    149	} else {
    150		out_8(&i2c_ram->tfcr, I2C_EB_CPM2);
    151		out_8(&i2c_ram->rfcr, I2C_EB_CPM2);
    152	}
    153
    154	out_be16(&i2c_ram->mrblr, CPM_MAX_READ);
    155
    156	out_be32(&i2c_ram->rstate, 0);
    157	out_be32(&i2c_ram->rdp, 0);
    158	out_be16(&i2c_ram->rbptr, 0);
    159	out_be16(&i2c_ram->rbc, 0);
    160	out_be32(&i2c_ram->rxtmp, 0);
    161	out_be32(&i2c_ram->tstate, 0);
    162	out_be32(&i2c_ram->tdp, 0);
    163	out_be16(&i2c_ram->tbptr, 0);
    164	out_be16(&i2c_ram->tbc, 0);
    165	out_be32(&i2c_ram->txtmp, 0);
    166}
    167
    168static void cpm_i2c_force_close(struct i2c_adapter *adap)
    169{
    170	struct cpm_i2c *cpm = i2c_get_adapdata(adap);
    171	struct i2c_reg __iomem *i2c_reg = cpm->i2c_reg;
    172
    173	dev_dbg(&adap->dev, "cpm_i2c_force_close()\n");
    174
    175	cpm_command(cpm->cp_command, CPM_CR_CLOSE_RX_BD);
    176
    177	out_8(&i2c_reg->i2cmr, 0x00);	/* Disable all interrupts */
    178	out_8(&i2c_reg->i2cer, 0xff);
    179}
    180
    181static void cpm_i2c_parse_message(struct i2c_adapter *adap,
    182	struct i2c_msg *pmsg, int num, int tx, int rx)
    183{
    184	cbd_t __iomem *tbdf;
    185	cbd_t __iomem *rbdf;
    186	u_char addr;
    187	u_char *tb;
    188	u_char *rb;
    189	struct cpm_i2c *cpm = i2c_get_adapdata(adap);
    190
    191	tbdf = cpm->tbase + tx;
    192	rbdf = cpm->rbase + rx;
    193
    194	addr = i2c_8bit_addr_from_msg(pmsg);
    195
    196	tb = cpm->txbuf[tx];
    197	rb = cpm->rxbuf[rx];
    198
    199	/* Align read buffer */
    200	rb = (u_char *) (((ulong) rb + 1) & ~1);
    201
    202	tb[0] = addr;		/* Device address byte w/rw flag */
    203
    204	out_be16(&tbdf->cbd_datlen, pmsg->len + 1);
    205	out_be16(&tbdf->cbd_sc, 0);
    206
    207	if (!(pmsg->flags & I2C_M_NOSTART))
    208		setbits16(&tbdf->cbd_sc, BD_I2C_START);
    209
    210	if (tx + 1 == num)
    211		setbits16(&tbdf->cbd_sc, BD_SC_LAST | BD_SC_WRAP);
    212
    213	if (pmsg->flags & I2C_M_RD) {
    214		/*
    215		 * To read, we need an empty buffer of the proper length.
    216		 * All that is used is the first byte for address, the remainder
    217		 * is just used for timing (and doesn't really have to exist).
    218		 */
    219
    220		dev_dbg(&adap->dev, "cpm_i2c_read(abyte=0x%x)\n", addr);
    221
    222		out_be16(&rbdf->cbd_datlen, 0);
    223		out_be16(&rbdf->cbd_sc, BD_SC_EMPTY | BD_SC_INTRPT);
    224
    225		if (rx + 1 == CPM_MAXBD)
    226			setbits16(&rbdf->cbd_sc, BD_SC_WRAP);
    227
    228		eieio();
    229		setbits16(&tbdf->cbd_sc, BD_SC_READY);
    230	} else {
    231		dev_dbg(&adap->dev, "cpm_i2c_write(abyte=0x%x)\n", addr);
    232
    233		memcpy(tb+1, pmsg->buf, pmsg->len);
    234
    235		eieio();
    236		setbits16(&tbdf->cbd_sc, BD_SC_READY | BD_SC_INTRPT);
    237	}
    238}
    239
    240static int cpm_i2c_check_message(struct i2c_adapter *adap,
    241	struct i2c_msg *pmsg, int tx, int rx)
    242{
    243	cbd_t __iomem *tbdf;
    244	cbd_t __iomem *rbdf;
    245	u_char *tb;
    246	u_char *rb;
    247	struct cpm_i2c *cpm = i2c_get_adapdata(adap);
    248
    249	tbdf = cpm->tbase + tx;
    250	rbdf = cpm->rbase + rx;
    251
    252	tb = cpm->txbuf[tx];
    253	rb = cpm->rxbuf[rx];
    254
    255	/* Align read buffer */
    256	rb = (u_char *) (((uint) rb + 1) & ~1);
    257
    258	eieio();
    259	if (pmsg->flags & I2C_M_RD) {
    260		dev_dbg(&adap->dev, "tx sc 0x%04x, rx sc 0x%04x\n",
    261			in_be16(&tbdf->cbd_sc), in_be16(&rbdf->cbd_sc));
    262
    263		if (in_be16(&tbdf->cbd_sc) & BD_SC_NAK) {
    264			dev_dbg(&adap->dev, "I2C read; No ack\n");
    265			return -ENXIO;
    266		}
    267		if (in_be16(&rbdf->cbd_sc) & BD_SC_EMPTY) {
    268			dev_err(&adap->dev,
    269				"I2C read; complete but rbuf empty\n");
    270			return -EREMOTEIO;
    271		}
    272		if (in_be16(&rbdf->cbd_sc) & BD_SC_OV) {
    273			dev_err(&adap->dev, "I2C read; Overrun\n");
    274			return -EREMOTEIO;
    275		}
    276		memcpy(pmsg->buf, rb, pmsg->len);
    277	} else {
    278		dev_dbg(&adap->dev, "tx sc %d 0x%04x\n", tx,
    279			in_be16(&tbdf->cbd_sc));
    280
    281		if (in_be16(&tbdf->cbd_sc) & BD_SC_NAK) {
    282			dev_dbg(&adap->dev, "I2C write; No ack\n");
    283			return -ENXIO;
    284		}
    285		if (in_be16(&tbdf->cbd_sc) & BD_SC_UN) {
    286			dev_err(&adap->dev, "I2C write; Underrun\n");
    287			return -EIO;
    288		}
    289		if (in_be16(&tbdf->cbd_sc) & BD_SC_CL) {
    290			dev_err(&adap->dev, "I2C write; Collision\n");
    291			return -EIO;
    292		}
    293	}
    294	return 0;
    295}
    296
    297static int cpm_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
    298{
    299	struct cpm_i2c *cpm = i2c_get_adapdata(adap);
    300	struct i2c_reg __iomem *i2c_reg = cpm->i2c_reg;
    301	struct i2c_ram __iomem *i2c_ram = cpm->i2c_ram;
    302	struct i2c_msg *pmsg;
    303	int ret;
    304	int tptr;
    305	int rptr;
    306	cbd_t __iomem *tbdf;
    307	cbd_t __iomem *rbdf;
    308
    309	/* Reset to use first buffer */
    310	out_be16(&i2c_ram->rbptr, in_be16(&i2c_ram->rbase));
    311	out_be16(&i2c_ram->tbptr, in_be16(&i2c_ram->tbase));
    312
    313	tbdf = cpm->tbase;
    314	rbdf = cpm->rbase;
    315
    316	tptr = 0;
    317	rptr = 0;
    318
    319	/*
    320	 * If there was a collision in the last i2c transaction,
    321	 * Set I2COM_MASTER as it was cleared during collision.
    322	 */
    323	if (in_be16(&tbdf->cbd_sc) & BD_SC_CL) {
    324		out_8(&cpm->i2c_reg->i2com, I2COM_MASTER);
    325	}
    326
    327	while (tptr < num) {
    328		pmsg = &msgs[tptr];
    329		dev_dbg(&adap->dev, "R: %d T: %d\n", rptr, tptr);
    330
    331		cpm_i2c_parse_message(adap, pmsg, num, tptr, rptr);
    332		if (pmsg->flags & I2C_M_RD)
    333			rptr++;
    334		tptr++;
    335	}
    336	/* Start transfer now */
    337	/* Enable RX/TX/Error interupts */
    338	out_8(&i2c_reg->i2cmr, I2CER_TXE | I2CER_TXB | I2CER_RXB);
    339	out_8(&i2c_reg->i2cer, 0xff);	/* Clear interrupt status */
    340	/* Chip bug, set enable here */
    341	setbits8(&i2c_reg->i2mod, I2MOD_EN);	/* Enable */
    342	/* Begin transmission */
    343	setbits8(&i2c_reg->i2com, I2COM_START);
    344
    345	tptr = 0;
    346	rptr = 0;
    347
    348	while (tptr < num) {
    349		/* Check for outstanding messages */
    350		dev_dbg(&adap->dev, "test ready.\n");
    351		pmsg = &msgs[tptr];
    352		if (pmsg->flags & I2C_M_RD)
    353			ret = wait_event_timeout(cpm->i2c_wait,
    354				(in_be16(&tbdf[tptr].cbd_sc) & BD_SC_NAK) ||
    355				!(in_be16(&rbdf[rptr].cbd_sc) & BD_SC_EMPTY),
    356				1 * HZ);
    357		else
    358			ret = wait_event_timeout(cpm->i2c_wait,
    359				!(in_be16(&tbdf[tptr].cbd_sc) & BD_SC_READY),
    360				1 * HZ);
    361		if (ret == 0) {
    362			ret = -EREMOTEIO;
    363			dev_err(&adap->dev, "I2C transfer: timeout\n");
    364			goto out_err;
    365		}
    366		if (ret > 0) {
    367			dev_dbg(&adap->dev, "ready.\n");
    368			ret = cpm_i2c_check_message(adap, pmsg, tptr, rptr);
    369			tptr++;
    370			if (pmsg->flags & I2C_M_RD)
    371				rptr++;
    372			if (ret)
    373				goto out_err;
    374		}
    375	}
    376#ifdef I2C_CHIP_ERRATA
    377	/*
    378	 * Chip errata, clear enable. This is not needed on rev D4 CPUs.
    379	 * Disabling I2C too early may cause too short stop condition
    380	 */
    381	udelay(4);
    382	clrbits8(&i2c_reg->i2mod, I2MOD_EN);
    383#endif
    384	return (num);
    385
    386out_err:
    387	cpm_i2c_force_close(adap);
    388#ifdef I2C_CHIP_ERRATA
    389	/*
    390	 * Chip errata, clear enable. This is not needed on rev D4 CPUs.
    391	 */
    392	clrbits8(&i2c_reg->i2mod, I2MOD_EN);
    393#endif
    394	return ret;
    395}
    396
    397static u32 cpm_i2c_func(struct i2c_adapter *adap)
    398{
    399	return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
    400}
    401
    402/* -----exported algorithm data: -------------------------------------	*/
    403
    404static const struct i2c_algorithm cpm_i2c_algo = {
    405	.master_xfer = cpm_i2c_xfer,
    406	.functionality = cpm_i2c_func,
    407};
    408
    409/* CPM_MAX_READ is also limiting writes according to the code! */
    410static const struct i2c_adapter_quirks cpm_i2c_quirks = {
    411	.max_num_msgs = CPM_MAXBD,
    412	.max_read_len = CPM_MAX_READ,
    413	.max_write_len = CPM_MAX_READ,
    414};
    415
    416static const struct i2c_adapter cpm_ops = {
    417	.owner		= THIS_MODULE,
    418	.name		= "i2c-cpm",
    419	.algo		= &cpm_i2c_algo,
    420	.quirks		= &cpm_i2c_quirks,
    421};
    422
    423static int cpm_i2c_setup(struct cpm_i2c *cpm)
    424{
    425	struct platform_device *ofdev = cpm->ofdev;
    426	const u32 *data;
    427	int len, ret, i;
    428	void __iomem *i2c_base;
    429	cbd_t __iomem *tbdf;
    430	cbd_t __iomem *rbdf;
    431	unsigned char brg;
    432
    433	dev_dbg(&cpm->ofdev->dev, "cpm_i2c_setup()\n");
    434
    435	init_waitqueue_head(&cpm->i2c_wait);
    436
    437	cpm->irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
    438	if (!cpm->irq)
    439		return -EINVAL;
    440
    441	/* Install interrupt handler. */
    442	ret = request_irq(cpm->irq, cpm_i2c_interrupt, 0, "cpm_i2c",
    443			  &cpm->adap);
    444	if (ret)
    445		return ret;
    446
    447	/* I2C parameter RAM */
    448	i2c_base = of_iomap(ofdev->dev.of_node, 1);
    449	if (i2c_base == NULL) {
    450		ret = -EINVAL;
    451		goto out_irq;
    452	}
    453
    454	if (of_device_is_compatible(ofdev->dev.of_node, "fsl,cpm1-i2c")) {
    455
    456		/* Check for and use a microcode relocation patch. */
    457		cpm->i2c_ram = i2c_base;
    458		cpm->i2c_addr = in_be16(&cpm->i2c_ram->rpbase);
    459
    460		/*
    461		 * Maybe should use cpm_muram_alloc instead of hardcoding
    462		 * this in micropatch.c
    463		 */
    464		if (cpm->i2c_addr) {
    465			cpm->i2c_ram = cpm_muram_addr(cpm->i2c_addr);
    466			iounmap(i2c_base);
    467		}
    468
    469		cpm->version = 1;
    470
    471	} else if (of_device_is_compatible(ofdev->dev.of_node, "fsl,cpm2-i2c")) {
    472		cpm->i2c_addr = cpm_muram_alloc(sizeof(struct i2c_ram), 64);
    473		cpm->i2c_ram = cpm_muram_addr(cpm->i2c_addr);
    474		out_be16(i2c_base, cpm->i2c_addr);
    475		iounmap(i2c_base);
    476
    477		cpm->version = 2;
    478
    479	} else {
    480		iounmap(i2c_base);
    481		ret = -EINVAL;
    482		goto out_irq;
    483	}
    484
    485	/* I2C control/status registers */
    486	cpm->i2c_reg = of_iomap(ofdev->dev.of_node, 0);
    487	if (cpm->i2c_reg == NULL) {
    488		ret = -EINVAL;
    489		goto out_ram;
    490	}
    491
    492	data = of_get_property(ofdev->dev.of_node, "fsl,cpm-command", &len);
    493	if (!data || len != 4) {
    494		ret = -EINVAL;
    495		goto out_reg;
    496	}
    497	cpm->cp_command = *data;
    498
    499	data = of_get_property(ofdev->dev.of_node, "linux,i2c-class", &len);
    500	if (data && len == 4)
    501		cpm->adap.class = *data;
    502
    503	data = of_get_property(ofdev->dev.of_node, "clock-frequency", &len);
    504	if (data && len == 4)
    505		cpm->freq = *data;
    506	else
    507		cpm->freq = 60000; /* use 60kHz i2c clock by default */
    508
    509	/*
    510	 * Allocate space for CPM_MAXBD transmit and receive buffer
    511	 * descriptors in the DP ram.
    512	 */
    513	cpm->dp_addr = cpm_muram_alloc(sizeof(cbd_t) * 2 * CPM_MAXBD, 8);
    514	if (!cpm->dp_addr) {
    515		ret = -ENOMEM;
    516		goto out_reg;
    517	}
    518
    519	cpm->tbase = cpm_muram_addr(cpm->dp_addr);
    520	cpm->rbase = cpm_muram_addr(cpm->dp_addr + sizeof(cbd_t) * CPM_MAXBD);
    521
    522	/* Allocate TX and RX buffers */
    523
    524	tbdf = cpm->tbase;
    525	rbdf = cpm->rbase;
    526
    527	for (i = 0; i < CPM_MAXBD; i++) {
    528		cpm->rxbuf[i] = dma_alloc_coherent(&cpm->ofdev->dev,
    529						   CPM_MAX_READ + 1,
    530						   &cpm->rxdma[i], GFP_KERNEL);
    531		if (!cpm->rxbuf[i]) {
    532			ret = -ENOMEM;
    533			goto out_muram;
    534		}
    535		out_be32(&rbdf[i].cbd_bufaddr, ((cpm->rxdma[i] + 1) & ~1));
    536
    537		cpm->txbuf[i] = dma_alloc_coherent(&cpm->ofdev->dev,
    538						   CPM_MAX_READ + 1,
    539						   &cpm->txdma[i], GFP_KERNEL);
    540		if (!cpm->txbuf[i]) {
    541			ret = -ENOMEM;
    542			goto out_muram;
    543		}
    544		out_be32(&tbdf[i].cbd_bufaddr, cpm->txdma[i]);
    545	}
    546
    547	/* Initialize Tx/Rx parameters. */
    548
    549	cpm_reset_i2c_params(cpm);
    550
    551	dev_dbg(&cpm->ofdev->dev, "i2c_ram 0x%p, i2c_addr 0x%04x, freq %d\n",
    552		cpm->i2c_ram, cpm->i2c_addr, cpm->freq);
    553	dev_dbg(&cpm->ofdev->dev, "tbase 0x%04x, rbase 0x%04x\n",
    554		(u8 __iomem *)cpm->tbase - DPRAM_BASE,
    555		(u8 __iomem *)cpm->rbase - DPRAM_BASE);
    556
    557	cpm_command(cpm->cp_command, CPM_CR_INIT_TRX);
    558
    559	/*
    560	 * Select an invalid address. Just make sure we don't use loopback mode
    561	 */
    562	out_8(&cpm->i2c_reg->i2add, 0x7f << 1);
    563
    564	/*
    565	 * PDIV is set to 00 in i2mod, so brgclk/32 is used as input to the
    566	 * i2c baud rate generator. This is divided by 2 x (DIV + 3) to get
    567	 * the actual i2c bus frequency.
    568	 */
    569	brg = get_brgfreq() / (32 * 2 * cpm->freq) - 3;
    570	out_8(&cpm->i2c_reg->i2brg, brg);
    571
    572	out_8(&cpm->i2c_reg->i2mod, 0x00);
    573	out_8(&cpm->i2c_reg->i2com, I2COM_MASTER);	/* Master mode */
    574
    575	/* Disable interrupts. */
    576	out_8(&cpm->i2c_reg->i2cmr, 0);
    577	out_8(&cpm->i2c_reg->i2cer, 0xff);
    578
    579	return 0;
    580
    581out_muram:
    582	for (i = 0; i < CPM_MAXBD; i++) {
    583		if (cpm->rxbuf[i])
    584			dma_free_coherent(&cpm->ofdev->dev, CPM_MAX_READ + 1,
    585				cpm->rxbuf[i], cpm->rxdma[i]);
    586		if (cpm->txbuf[i])
    587			dma_free_coherent(&cpm->ofdev->dev, CPM_MAX_READ + 1,
    588				cpm->txbuf[i], cpm->txdma[i]);
    589	}
    590	cpm_muram_free(cpm->dp_addr);
    591out_reg:
    592	iounmap(cpm->i2c_reg);
    593out_ram:
    594	if ((cpm->version == 1) && (!cpm->i2c_addr))
    595		iounmap(cpm->i2c_ram);
    596	if (cpm->version == 2)
    597		cpm_muram_free(cpm->i2c_addr);
    598out_irq:
    599	free_irq(cpm->irq, &cpm->adap);
    600	return ret;
    601}
    602
    603static void cpm_i2c_shutdown(struct cpm_i2c *cpm)
    604{
    605	int i;
    606
    607	/* Shut down I2C. */
    608	clrbits8(&cpm->i2c_reg->i2mod, I2MOD_EN);
    609
    610	/* Disable interrupts */
    611	out_8(&cpm->i2c_reg->i2cmr, 0);
    612	out_8(&cpm->i2c_reg->i2cer, 0xff);
    613
    614	free_irq(cpm->irq, &cpm->adap);
    615
    616	/* Free all memory */
    617	for (i = 0; i < CPM_MAXBD; i++) {
    618		dma_free_coherent(&cpm->ofdev->dev, CPM_MAX_READ + 1,
    619			cpm->rxbuf[i], cpm->rxdma[i]);
    620		dma_free_coherent(&cpm->ofdev->dev, CPM_MAX_READ + 1,
    621			cpm->txbuf[i], cpm->txdma[i]);
    622	}
    623
    624	cpm_muram_free(cpm->dp_addr);
    625	iounmap(cpm->i2c_reg);
    626
    627	if ((cpm->version == 1) && (!cpm->i2c_addr))
    628		iounmap(cpm->i2c_ram);
    629	if (cpm->version == 2)
    630		cpm_muram_free(cpm->i2c_addr);
    631}
    632
    633static int cpm_i2c_probe(struct platform_device *ofdev)
    634{
    635	int result, len;
    636	struct cpm_i2c *cpm;
    637	const u32 *data;
    638
    639	cpm = kzalloc(sizeof(struct cpm_i2c), GFP_KERNEL);
    640	if (!cpm)
    641		return -ENOMEM;
    642
    643	cpm->ofdev = ofdev;
    644
    645	platform_set_drvdata(ofdev, cpm);
    646
    647	cpm->adap = cpm_ops;
    648	i2c_set_adapdata(&cpm->adap, cpm);
    649	cpm->adap.dev.parent = &ofdev->dev;
    650	cpm->adap.dev.of_node = of_node_get(ofdev->dev.of_node);
    651
    652	result = cpm_i2c_setup(cpm);
    653	if (result) {
    654		dev_err(&ofdev->dev, "Unable to init hardware\n");
    655		goto out_free;
    656	}
    657
    658	/* register new adapter to i2c module... */
    659
    660	data = of_get_property(ofdev->dev.of_node, "linux,i2c-index", &len);
    661	cpm->adap.nr = (data && len == 4) ? be32_to_cpup(data) : -1;
    662	result = i2c_add_numbered_adapter(&cpm->adap);
    663
    664	if (result < 0)
    665		goto out_shut;
    666
    667	dev_dbg(&ofdev->dev, "hw routines for %s registered.\n",
    668		cpm->adap.name);
    669
    670	return 0;
    671out_shut:
    672	cpm_i2c_shutdown(cpm);
    673out_free:
    674	kfree(cpm);
    675
    676	return result;
    677}
    678
    679static int cpm_i2c_remove(struct platform_device *ofdev)
    680{
    681	struct cpm_i2c *cpm = platform_get_drvdata(ofdev);
    682
    683	i2c_del_adapter(&cpm->adap);
    684
    685	cpm_i2c_shutdown(cpm);
    686
    687	kfree(cpm);
    688
    689	return 0;
    690}
    691
    692static const struct of_device_id cpm_i2c_match[] = {
    693	{
    694		.compatible = "fsl,cpm1-i2c",
    695	},
    696	{
    697		.compatible = "fsl,cpm2-i2c",
    698	},
    699	{},
    700};
    701
    702MODULE_DEVICE_TABLE(of, cpm_i2c_match);
    703
    704static struct platform_driver cpm_i2c_driver = {
    705	.probe		= cpm_i2c_probe,
    706	.remove		= cpm_i2c_remove,
    707	.driver = {
    708		.name = "fsl-i2c-cpm",
    709		.of_match_table = cpm_i2c_match,
    710	},
    711};
    712
    713module_platform_driver(cpm_i2c_driver);
    714
    715MODULE_AUTHOR("Jochen Friedrich <jochen@scram.de>");
    716MODULE_DESCRIPTION("I2C-Bus adapter routines for CPM boards");
    717MODULE_LICENSE("GPL");