xref: /OK3568_Linux_fs/kernel/drivers/i2c/busses/i2c-pnx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Provides I2C support for Philips PNX010x/PNX4008 boards.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Authors: Dennis Kovalev <dkovalev@ru.mvista.com>
5*4882a593Smuzhiyun  *	    Vitaly Wool <vwool@ru.mvista.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * 2004-2006 (c) MontaVista Software, Inc. This file is licensed under
8*4882a593Smuzhiyun  * the terms of the GNU General Public License version 2. This program
9*4882a593Smuzhiyun  * is licensed "as is" without any warranty of any kind, whether express
10*4882a593Smuzhiyun  * or implied.
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/module.h>
14*4882a593Smuzhiyun #include <linux/interrupt.h>
15*4882a593Smuzhiyun #include <linux/ioport.h>
16*4882a593Smuzhiyun #include <linux/delay.h>
17*4882a593Smuzhiyun #include <linux/i2c.h>
18*4882a593Smuzhiyun #include <linux/timer.h>
19*4882a593Smuzhiyun #include <linux/completion.h>
20*4882a593Smuzhiyun #include <linux/platform_device.h>
21*4882a593Smuzhiyun #include <linux/io.h>
22*4882a593Smuzhiyun #include <linux/err.h>
23*4882a593Smuzhiyun #include <linux/clk.h>
24*4882a593Smuzhiyun #include <linux/slab.h>
25*4882a593Smuzhiyun #include <linux/of.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define I2C_PNX_TIMEOUT_DEFAULT		10 /* msec */
28*4882a593Smuzhiyun #define I2C_PNX_SPEED_KHZ_DEFAULT	100
29*4882a593Smuzhiyun #define I2C_PNX_REGION_SIZE		0x100
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun struct i2c_pnx_mif {
32*4882a593Smuzhiyun 	int			ret;		/* Return value */
33*4882a593Smuzhiyun 	int			mode;		/* Interface mode */
34*4882a593Smuzhiyun 	struct completion	complete;	/* I/O completion */
35*4882a593Smuzhiyun 	struct timer_list	timer;		/* Timeout */
36*4882a593Smuzhiyun 	u8 *			buf;		/* Data buffer */
37*4882a593Smuzhiyun 	int			len;		/* Length of data buffer */
38*4882a593Smuzhiyun 	int			order;		/* RX Bytes to order via TX */
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun struct i2c_pnx_algo_data {
42*4882a593Smuzhiyun 	void __iomem		*ioaddr;
43*4882a593Smuzhiyun 	struct i2c_pnx_mif	mif;
44*4882a593Smuzhiyun 	int			last;
45*4882a593Smuzhiyun 	struct clk		*clk;
46*4882a593Smuzhiyun 	struct i2c_adapter	adapter;
47*4882a593Smuzhiyun 	int			irq;
48*4882a593Smuzhiyun 	u32			timeout;
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun enum {
52*4882a593Smuzhiyun 	mstatus_tdi = 0x00000001,
53*4882a593Smuzhiyun 	mstatus_afi = 0x00000002,
54*4882a593Smuzhiyun 	mstatus_nai = 0x00000004,
55*4882a593Smuzhiyun 	mstatus_drmi = 0x00000008,
56*4882a593Smuzhiyun 	mstatus_active = 0x00000020,
57*4882a593Smuzhiyun 	mstatus_scl = 0x00000040,
58*4882a593Smuzhiyun 	mstatus_sda = 0x00000080,
59*4882a593Smuzhiyun 	mstatus_rff = 0x00000100,
60*4882a593Smuzhiyun 	mstatus_rfe = 0x00000200,
61*4882a593Smuzhiyun 	mstatus_tff = 0x00000400,
62*4882a593Smuzhiyun 	mstatus_tfe = 0x00000800,
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun enum {
66*4882a593Smuzhiyun 	mcntrl_tdie = 0x00000001,
67*4882a593Smuzhiyun 	mcntrl_afie = 0x00000002,
68*4882a593Smuzhiyun 	mcntrl_naie = 0x00000004,
69*4882a593Smuzhiyun 	mcntrl_drmie = 0x00000008,
70*4882a593Smuzhiyun 	mcntrl_drsie = 0x00000010,
71*4882a593Smuzhiyun 	mcntrl_rffie = 0x00000020,
72*4882a593Smuzhiyun 	mcntrl_daie = 0x00000040,
73*4882a593Smuzhiyun 	mcntrl_tffie = 0x00000080,
74*4882a593Smuzhiyun 	mcntrl_reset = 0x00000100,
75*4882a593Smuzhiyun 	mcntrl_cdbmode = 0x00000400,
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun enum {
79*4882a593Smuzhiyun 	rw_bit = 1 << 0,
80*4882a593Smuzhiyun 	start_bit = 1 << 8,
81*4882a593Smuzhiyun 	stop_bit = 1 << 9,
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define I2C_REG_RX(a)	((a)->ioaddr)		/* Rx FIFO reg (RO) */
85*4882a593Smuzhiyun #define I2C_REG_TX(a)	((a)->ioaddr)		/* Tx FIFO reg (WO) */
86*4882a593Smuzhiyun #define I2C_REG_STS(a)	((a)->ioaddr + 0x04)	/* Status reg (RO) */
87*4882a593Smuzhiyun #define I2C_REG_CTL(a)	((a)->ioaddr + 0x08)	/* Ctl reg */
88*4882a593Smuzhiyun #define I2C_REG_CKL(a)	((a)->ioaddr + 0x0c)	/* Clock divider low */
89*4882a593Smuzhiyun #define I2C_REG_CKH(a)	((a)->ioaddr + 0x10)	/* Clock divider high */
90*4882a593Smuzhiyun #define I2C_REG_ADR(a)	((a)->ioaddr + 0x14)	/* I2C address */
91*4882a593Smuzhiyun #define I2C_REG_RFL(a)	((a)->ioaddr + 0x18)	/* Rx FIFO level (RO) */
92*4882a593Smuzhiyun #define I2C_REG_TFL(a)	((a)->ioaddr + 0x1c)	/* Tx FIFO level (RO) */
93*4882a593Smuzhiyun #define I2C_REG_RXB(a)	((a)->ioaddr + 0x20)	/* Num of bytes Rx-ed (RO) */
94*4882a593Smuzhiyun #define I2C_REG_TXB(a)	((a)->ioaddr + 0x24)	/* Num of bytes Tx-ed (RO) */
95*4882a593Smuzhiyun #define I2C_REG_TXS(a)	((a)->ioaddr + 0x28)	/* Tx slave FIFO (RO) */
96*4882a593Smuzhiyun #define I2C_REG_STFL(a)	((a)->ioaddr + 0x2c)	/* Tx slave FIFO level (RO) */
97*4882a593Smuzhiyun 
wait_timeout(struct i2c_pnx_algo_data * data)98*4882a593Smuzhiyun static inline int wait_timeout(struct i2c_pnx_algo_data *data)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	long timeout = data->timeout;
101*4882a593Smuzhiyun 	while (timeout > 0 &&
102*4882a593Smuzhiyun 			(ioread32(I2C_REG_STS(data)) & mstatus_active)) {
103*4882a593Smuzhiyun 		mdelay(1);
104*4882a593Smuzhiyun 		timeout--;
105*4882a593Smuzhiyun 	}
106*4882a593Smuzhiyun 	return (timeout <= 0);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
wait_reset(struct i2c_pnx_algo_data * data)109*4882a593Smuzhiyun static inline int wait_reset(struct i2c_pnx_algo_data *data)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	long timeout = data->timeout;
112*4882a593Smuzhiyun 	while (timeout > 0 &&
113*4882a593Smuzhiyun 			(ioread32(I2C_REG_CTL(data)) & mcntrl_reset)) {
114*4882a593Smuzhiyun 		mdelay(1);
115*4882a593Smuzhiyun 		timeout--;
116*4882a593Smuzhiyun 	}
117*4882a593Smuzhiyun 	return (timeout <= 0);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
i2c_pnx_arm_timer(struct i2c_pnx_algo_data * alg_data)120*4882a593Smuzhiyun static inline void i2c_pnx_arm_timer(struct i2c_pnx_algo_data *alg_data)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	struct timer_list *timer = &alg_data->mif.timer;
123*4882a593Smuzhiyun 	unsigned long expires = msecs_to_jiffies(alg_data->timeout);
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 	if (expires <= 1)
126*4882a593Smuzhiyun 		expires = 2;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	del_timer_sync(timer);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "Timer armed at %lu plus %lu jiffies.\n",
131*4882a593Smuzhiyun 		jiffies, expires);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	timer->expires = jiffies + expires;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	add_timer(timer);
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /**
139*4882a593Smuzhiyun  * i2c_pnx_start - start a device
140*4882a593Smuzhiyun  * @slave_addr:		slave address
141*4882a593Smuzhiyun  * @adap:		pointer to adapter structure
142*4882a593Smuzhiyun  *
143*4882a593Smuzhiyun  * Generate a START signal in the desired mode.
144*4882a593Smuzhiyun  */
i2c_pnx_start(unsigned char slave_addr,struct i2c_pnx_algo_data * alg_data)145*4882a593Smuzhiyun static int i2c_pnx_start(unsigned char slave_addr,
146*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): addr 0x%x mode %d\n", __func__,
149*4882a593Smuzhiyun 		slave_addr, alg_data->mif.mode);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	/* Check for 7 bit slave addresses only */
152*4882a593Smuzhiyun 	if (slave_addr & ~0x7f) {
153*4882a593Smuzhiyun 		dev_err(&alg_data->adapter.dev,
154*4882a593Smuzhiyun 			"%s: Invalid slave address %x. Only 7-bit addresses are supported\n",
155*4882a593Smuzhiyun 			alg_data->adapter.name, slave_addr);
156*4882a593Smuzhiyun 		return -EINVAL;
157*4882a593Smuzhiyun 	}
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	/* First, make sure bus is idle */
160*4882a593Smuzhiyun 	if (wait_timeout(alg_data)) {
161*4882a593Smuzhiyun 		/* Somebody else is monopolizing the bus */
162*4882a593Smuzhiyun 		dev_err(&alg_data->adapter.dev,
163*4882a593Smuzhiyun 			"%s: Bus busy. Slave addr = %02x, cntrl = %x, stat = %x\n",
164*4882a593Smuzhiyun 			alg_data->adapter.name, slave_addr,
165*4882a593Smuzhiyun 			ioread32(I2C_REG_CTL(alg_data)),
166*4882a593Smuzhiyun 			ioread32(I2C_REG_STS(alg_data)));
167*4882a593Smuzhiyun 		return -EBUSY;
168*4882a593Smuzhiyun 	} else if (ioread32(I2C_REG_STS(alg_data)) & mstatus_afi) {
169*4882a593Smuzhiyun 		/* Sorry, we lost the bus */
170*4882a593Smuzhiyun 		dev_err(&alg_data->adapter.dev,
171*4882a593Smuzhiyun 		        "%s: Arbitration failure. Slave addr = %02x\n",
172*4882a593Smuzhiyun 			alg_data->adapter.name, slave_addr);
173*4882a593Smuzhiyun 		return -EIO;
174*4882a593Smuzhiyun 	}
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	/*
177*4882a593Smuzhiyun 	 * OK, I2C is enabled and we have the bus.
178*4882a593Smuzhiyun 	 * Clear the current TDI and AFI status flags.
179*4882a593Smuzhiyun 	 */
180*4882a593Smuzhiyun 	iowrite32(ioread32(I2C_REG_STS(alg_data)) | mstatus_tdi | mstatus_afi,
181*4882a593Smuzhiyun 		  I2C_REG_STS(alg_data));
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): sending %#x\n", __func__,
184*4882a593Smuzhiyun 		(slave_addr << 1) | start_bit | alg_data->mif.mode);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	/* Write the slave address, START bit and R/W bit */
187*4882a593Smuzhiyun 	iowrite32((slave_addr << 1) | start_bit | alg_data->mif.mode,
188*4882a593Smuzhiyun 		  I2C_REG_TX(alg_data));
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): exit\n", __func__);
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	return 0;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /**
196*4882a593Smuzhiyun  * i2c_pnx_stop - stop a device
197*4882a593Smuzhiyun  * @adap:		pointer to I2C adapter structure
198*4882a593Smuzhiyun  *
199*4882a593Smuzhiyun  * Generate a STOP signal to terminate the master transaction.
200*4882a593Smuzhiyun  */
i2c_pnx_stop(struct i2c_pnx_algo_data * alg_data)201*4882a593Smuzhiyun static void i2c_pnx_stop(struct i2c_pnx_algo_data *alg_data)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun 	/* Only 1 msec max timeout due to interrupt context */
204*4882a593Smuzhiyun 	long timeout = 1000;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): entering: stat = %04x.\n",
207*4882a593Smuzhiyun 		__func__, ioread32(I2C_REG_STS(alg_data)));
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	/* Write a STOP bit to TX FIFO */
210*4882a593Smuzhiyun 	iowrite32(0xff | stop_bit, I2C_REG_TX(alg_data));
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	/* Wait until the STOP is seen. */
213*4882a593Smuzhiyun 	while (timeout > 0 &&
214*4882a593Smuzhiyun 	       (ioread32(I2C_REG_STS(alg_data)) & mstatus_active)) {
215*4882a593Smuzhiyun 		/* may be called from interrupt context */
216*4882a593Smuzhiyun 		udelay(1);
217*4882a593Smuzhiyun 		timeout--;
218*4882a593Smuzhiyun 	}
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): exiting: stat = %04x.\n",
221*4882a593Smuzhiyun 		__func__, ioread32(I2C_REG_STS(alg_data)));
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /**
225*4882a593Smuzhiyun  * i2c_pnx_master_xmit - transmit data to slave
226*4882a593Smuzhiyun  * @adap:		pointer to I2C adapter structure
227*4882a593Smuzhiyun  *
228*4882a593Smuzhiyun  * Sends one byte of data to the slave
229*4882a593Smuzhiyun  */
i2c_pnx_master_xmit(struct i2c_pnx_algo_data * alg_data)230*4882a593Smuzhiyun static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data *alg_data)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun 	u32 val;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): entering: stat = %04x.\n",
235*4882a593Smuzhiyun 		__func__, ioread32(I2C_REG_STS(alg_data)));
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	if (alg_data->mif.len > 0) {
238*4882a593Smuzhiyun 		/* We still have something to talk about... */
239*4882a593Smuzhiyun 		val = *alg_data->mif.buf++;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 		if (alg_data->mif.len == 1)
242*4882a593Smuzhiyun 			val |= stop_bit;
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 		alg_data->mif.len--;
245*4882a593Smuzhiyun 		iowrite32(val, I2C_REG_TX(alg_data));
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 		dev_dbg(&alg_data->adapter.dev, "%s(): xmit %#x [%d]\n",
248*4882a593Smuzhiyun 			__func__, val, alg_data->mif.len + 1);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 		if (alg_data->mif.len == 0) {
251*4882a593Smuzhiyun 			if (alg_data->last) {
252*4882a593Smuzhiyun 				/* Wait until the STOP is seen. */
253*4882a593Smuzhiyun 				if (wait_timeout(alg_data))
254*4882a593Smuzhiyun 					dev_err(&alg_data->adapter.dev,
255*4882a593Smuzhiyun 						"The bus is still active after timeout\n");
256*4882a593Smuzhiyun 			}
257*4882a593Smuzhiyun 			/* Disable master interrupts */
258*4882a593Smuzhiyun 			iowrite32(ioread32(I2C_REG_CTL(alg_data)) &
259*4882a593Smuzhiyun 				~(mcntrl_afie | mcntrl_naie | mcntrl_drmie),
260*4882a593Smuzhiyun 				  I2C_REG_CTL(alg_data));
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 			del_timer_sync(&alg_data->mif.timer);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 			dev_dbg(&alg_data->adapter.dev,
265*4882a593Smuzhiyun 				"%s(): Waking up xfer routine.\n",
266*4882a593Smuzhiyun 				__func__);
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 			complete(&alg_data->mif.complete);
269*4882a593Smuzhiyun 		}
270*4882a593Smuzhiyun 	} else if (alg_data->mif.len == 0) {
271*4882a593Smuzhiyun 		/* zero-sized transfer */
272*4882a593Smuzhiyun 		i2c_pnx_stop(alg_data);
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 		/* Disable master interrupts. */
275*4882a593Smuzhiyun 		iowrite32(ioread32(I2C_REG_CTL(alg_data)) &
276*4882a593Smuzhiyun 			~(mcntrl_afie | mcntrl_naie | mcntrl_drmie),
277*4882a593Smuzhiyun 			  I2C_REG_CTL(alg_data));
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 		/* Stop timer. */
280*4882a593Smuzhiyun 		del_timer_sync(&alg_data->mif.timer);
281*4882a593Smuzhiyun 		dev_dbg(&alg_data->adapter.dev,
282*4882a593Smuzhiyun 			"%s(): Waking up xfer routine after zero-xfer.\n",
283*4882a593Smuzhiyun 			__func__);
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 		complete(&alg_data->mif.complete);
286*4882a593Smuzhiyun 	}
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): exiting: stat = %04x.\n",
289*4882a593Smuzhiyun 		__func__, ioread32(I2C_REG_STS(alg_data)));
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	return 0;
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun /**
295*4882a593Smuzhiyun  * i2c_pnx_master_rcv - receive data from slave
296*4882a593Smuzhiyun  * @adap:		pointer to I2C adapter structure
297*4882a593Smuzhiyun  *
298*4882a593Smuzhiyun  * Reads one byte data from the slave
299*4882a593Smuzhiyun  */
i2c_pnx_master_rcv(struct i2c_pnx_algo_data * alg_data)300*4882a593Smuzhiyun static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data *alg_data)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	unsigned int val = 0;
303*4882a593Smuzhiyun 	u32 ctl = 0;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): entering: stat = %04x.\n",
306*4882a593Smuzhiyun 		__func__, ioread32(I2C_REG_STS(alg_data)));
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	/* Check, whether there is already data,
309*4882a593Smuzhiyun 	 * or we didn't 'ask' for it yet.
310*4882a593Smuzhiyun 	 */
311*4882a593Smuzhiyun 	if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) {
312*4882a593Smuzhiyun 		/* 'Asking' is done asynchronously, e.g. dummy TX of several
313*4882a593Smuzhiyun 		 * bytes is done before the first actual RX arrives in FIFO.
314*4882a593Smuzhiyun 		 * Therefore, ordered bytes (via TX) are counted separately.
315*4882a593Smuzhiyun 		 */
316*4882a593Smuzhiyun 		if (alg_data->mif.order) {
317*4882a593Smuzhiyun 			dev_dbg(&alg_data->adapter.dev,
318*4882a593Smuzhiyun 				"%s(): Write dummy data to fill Rx-fifo...\n",
319*4882a593Smuzhiyun 				__func__);
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 			if (alg_data->mif.order == 1) {
322*4882a593Smuzhiyun 				/* Last byte, do not acknowledge next rcv. */
323*4882a593Smuzhiyun 				val |= stop_bit;
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 				/*
326*4882a593Smuzhiyun 				 * Enable interrupt RFDAIE (data in Rx fifo),
327*4882a593Smuzhiyun 				 * and disable DRMIE (need data for Tx)
328*4882a593Smuzhiyun 				 */
329*4882a593Smuzhiyun 				ctl = ioread32(I2C_REG_CTL(alg_data));
330*4882a593Smuzhiyun 				ctl |= mcntrl_rffie | mcntrl_daie;
331*4882a593Smuzhiyun 				ctl &= ~mcntrl_drmie;
332*4882a593Smuzhiyun 				iowrite32(ctl, I2C_REG_CTL(alg_data));
333*4882a593Smuzhiyun 			}
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 			/*
336*4882a593Smuzhiyun 			 * Now we'll 'ask' for data:
337*4882a593Smuzhiyun 			 * For each byte we want to receive, we must
338*4882a593Smuzhiyun 			 * write a (dummy) byte to the Tx-FIFO.
339*4882a593Smuzhiyun 			 */
340*4882a593Smuzhiyun 			iowrite32(val, I2C_REG_TX(alg_data));
341*4882a593Smuzhiyun 			alg_data->mif.order--;
342*4882a593Smuzhiyun 		}
343*4882a593Smuzhiyun 		return 0;
344*4882a593Smuzhiyun 	}
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 	/* Handle data. */
347*4882a593Smuzhiyun 	if (alg_data->mif.len > 0) {
348*4882a593Smuzhiyun 		val = ioread32(I2C_REG_RX(alg_data));
349*4882a593Smuzhiyun 		*alg_data->mif.buf++ = (u8) (val & 0xff);
350*4882a593Smuzhiyun 		dev_dbg(&alg_data->adapter.dev, "%s(): rcv 0x%x [%d]\n",
351*4882a593Smuzhiyun 			__func__, val, alg_data->mif.len);
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun 		alg_data->mif.len--;
354*4882a593Smuzhiyun 		if (alg_data->mif.len == 0) {
355*4882a593Smuzhiyun 			if (alg_data->last)
356*4882a593Smuzhiyun 				/* Wait until the STOP is seen. */
357*4882a593Smuzhiyun 				if (wait_timeout(alg_data))
358*4882a593Smuzhiyun 					dev_err(&alg_data->adapter.dev,
359*4882a593Smuzhiyun 						"The bus is still active after timeout\n");
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 			/* Disable master interrupts */
362*4882a593Smuzhiyun 			ctl = ioread32(I2C_REG_CTL(alg_data));
363*4882a593Smuzhiyun 			ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie |
364*4882a593Smuzhiyun 				 mcntrl_drmie | mcntrl_daie);
365*4882a593Smuzhiyun 			iowrite32(ctl, I2C_REG_CTL(alg_data));
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 			/* Kill timer. */
368*4882a593Smuzhiyun 			del_timer_sync(&alg_data->mif.timer);
369*4882a593Smuzhiyun 			complete(&alg_data->mif.complete);
370*4882a593Smuzhiyun 		}
371*4882a593Smuzhiyun 	}
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): exiting: stat = %04x.\n",
374*4882a593Smuzhiyun 		__func__, ioread32(I2C_REG_STS(alg_data)));
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	return 0;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun 
i2c_pnx_interrupt(int irq,void * dev_id)379*4882a593Smuzhiyun static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
380*4882a593Smuzhiyun {
381*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data = dev_id;
382*4882a593Smuzhiyun 	u32 stat, ctl;
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev,
385*4882a593Smuzhiyun 		"%s(): mstat = %x mctrl = %x, mode = %d\n",
386*4882a593Smuzhiyun 		__func__,
387*4882a593Smuzhiyun 		ioread32(I2C_REG_STS(alg_data)),
388*4882a593Smuzhiyun 		ioread32(I2C_REG_CTL(alg_data)),
389*4882a593Smuzhiyun 		alg_data->mif.mode);
390*4882a593Smuzhiyun 	stat = ioread32(I2C_REG_STS(alg_data));
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	/* let's see what kind of event this is */
393*4882a593Smuzhiyun 	if (stat & mstatus_afi) {
394*4882a593Smuzhiyun 		/* We lost arbitration in the midst of a transfer */
395*4882a593Smuzhiyun 		alg_data->mif.ret = -EIO;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 		/* Disable master interrupts. */
398*4882a593Smuzhiyun 		ctl = ioread32(I2C_REG_CTL(alg_data));
399*4882a593Smuzhiyun 		ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie |
400*4882a593Smuzhiyun 			 mcntrl_drmie);
401*4882a593Smuzhiyun 		iowrite32(ctl, I2C_REG_CTL(alg_data));
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 		/* Stop timer, to prevent timeout. */
404*4882a593Smuzhiyun 		del_timer_sync(&alg_data->mif.timer);
405*4882a593Smuzhiyun 		complete(&alg_data->mif.complete);
406*4882a593Smuzhiyun 	} else if (stat & mstatus_nai) {
407*4882a593Smuzhiyun 		/* Slave did not acknowledge, generate a STOP */
408*4882a593Smuzhiyun 		dev_dbg(&alg_data->adapter.dev,
409*4882a593Smuzhiyun 			"%s(): Slave did not acknowledge, generating a STOP.\n",
410*4882a593Smuzhiyun 			__func__);
411*4882a593Smuzhiyun 		i2c_pnx_stop(alg_data);
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun 		/* Disable master interrupts. */
414*4882a593Smuzhiyun 		ctl = ioread32(I2C_REG_CTL(alg_data));
415*4882a593Smuzhiyun 		ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie |
416*4882a593Smuzhiyun 			 mcntrl_drmie);
417*4882a593Smuzhiyun 		iowrite32(ctl, I2C_REG_CTL(alg_data));
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 		/* Our return value. */
420*4882a593Smuzhiyun 		alg_data->mif.ret = -EIO;
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 		/* Stop timer, to prevent timeout. */
423*4882a593Smuzhiyun 		del_timer_sync(&alg_data->mif.timer);
424*4882a593Smuzhiyun 		complete(&alg_data->mif.complete);
425*4882a593Smuzhiyun 	} else {
426*4882a593Smuzhiyun 		/*
427*4882a593Smuzhiyun 		 * Two options:
428*4882a593Smuzhiyun 		 * - Master Tx needs data.
429*4882a593Smuzhiyun 		 * - There is data in the Rx-fifo
430*4882a593Smuzhiyun 		 * The latter is only the case if we have requested for data,
431*4882a593Smuzhiyun 		 * via a dummy write. (See 'i2c_pnx_master_rcv'.)
432*4882a593Smuzhiyun 		 * We therefore check, as a sanity check, whether that interrupt
433*4882a593Smuzhiyun 		 * has been enabled.
434*4882a593Smuzhiyun 		 */
435*4882a593Smuzhiyun 		if ((stat & mstatus_drmi) || !(stat & mstatus_rfe)) {
436*4882a593Smuzhiyun 			if (alg_data->mif.mode == I2C_SMBUS_WRITE) {
437*4882a593Smuzhiyun 				i2c_pnx_master_xmit(alg_data);
438*4882a593Smuzhiyun 			} else if (alg_data->mif.mode == I2C_SMBUS_READ) {
439*4882a593Smuzhiyun 				i2c_pnx_master_rcv(alg_data);
440*4882a593Smuzhiyun 			}
441*4882a593Smuzhiyun 		}
442*4882a593Smuzhiyun 	}
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	/* Clear TDI and AFI bits */
445*4882a593Smuzhiyun 	stat = ioread32(I2C_REG_STS(alg_data));
446*4882a593Smuzhiyun 	iowrite32(stat | mstatus_tdi | mstatus_afi, I2C_REG_STS(alg_data));
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev,
449*4882a593Smuzhiyun 		"%s(): exiting, stat = %x ctrl = %x.\n",
450*4882a593Smuzhiyun 		 __func__, ioread32(I2C_REG_STS(alg_data)),
451*4882a593Smuzhiyun 		 ioread32(I2C_REG_CTL(alg_data)));
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	return IRQ_HANDLED;
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun 
i2c_pnx_timeout(struct timer_list * t)456*4882a593Smuzhiyun static void i2c_pnx_timeout(struct timer_list *t)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data = from_timer(alg_data, t, mif.timer);
459*4882a593Smuzhiyun 	u32 ctl;
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun 	dev_err(&alg_data->adapter.dev,
462*4882a593Smuzhiyun 		"Master timed out. stat = %04x, cntrl = %04x. Resetting master...\n",
463*4882a593Smuzhiyun 		ioread32(I2C_REG_STS(alg_data)),
464*4882a593Smuzhiyun 		ioread32(I2C_REG_CTL(alg_data)));
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	/* Reset master and disable interrupts */
467*4882a593Smuzhiyun 	ctl = ioread32(I2C_REG_CTL(alg_data));
468*4882a593Smuzhiyun 	ctl &= ~(mcntrl_afie | mcntrl_naie | mcntrl_rffie | mcntrl_drmie);
469*4882a593Smuzhiyun 	iowrite32(ctl, I2C_REG_CTL(alg_data));
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	ctl |= mcntrl_reset;
472*4882a593Smuzhiyun 	iowrite32(ctl, I2C_REG_CTL(alg_data));
473*4882a593Smuzhiyun 	wait_reset(alg_data);
474*4882a593Smuzhiyun 	alg_data->mif.ret = -EIO;
475*4882a593Smuzhiyun 	complete(&alg_data->mif.complete);
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun 
bus_reset_if_active(struct i2c_pnx_algo_data * alg_data)478*4882a593Smuzhiyun static inline void bus_reset_if_active(struct i2c_pnx_algo_data *alg_data)
479*4882a593Smuzhiyun {
480*4882a593Smuzhiyun 	u32 stat;
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun 	if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_active) {
483*4882a593Smuzhiyun 		dev_err(&alg_data->adapter.dev,
484*4882a593Smuzhiyun 			"%s: Bus is still active after xfer. Reset it...\n",
485*4882a593Smuzhiyun 			alg_data->adapter.name);
486*4882a593Smuzhiyun 		iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_reset,
487*4882a593Smuzhiyun 			  I2C_REG_CTL(alg_data));
488*4882a593Smuzhiyun 		wait_reset(alg_data);
489*4882a593Smuzhiyun 	} else if (!(stat & mstatus_rfe) || !(stat & mstatus_tfe)) {
490*4882a593Smuzhiyun 		/* If there is data in the fifo's after transfer,
491*4882a593Smuzhiyun 		 * flush fifo's by reset.
492*4882a593Smuzhiyun 		 */
493*4882a593Smuzhiyun 		iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_reset,
494*4882a593Smuzhiyun 			  I2C_REG_CTL(alg_data));
495*4882a593Smuzhiyun 		wait_reset(alg_data);
496*4882a593Smuzhiyun 	} else if (stat & mstatus_nai) {
497*4882a593Smuzhiyun 		iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_reset,
498*4882a593Smuzhiyun 			  I2C_REG_CTL(alg_data));
499*4882a593Smuzhiyun 		wait_reset(alg_data);
500*4882a593Smuzhiyun 	}
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun /**
504*4882a593Smuzhiyun  * i2c_pnx_xfer - generic transfer entry point
505*4882a593Smuzhiyun  * @adap:		pointer to I2C adapter structure
506*4882a593Smuzhiyun  * @msgs:		array of messages
507*4882a593Smuzhiyun  * @num:		number of messages
508*4882a593Smuzhiyun  *
509*4882a593Smuzhiyun  * Initiates the transfer
510*4882a593Smuzhiyun  */
511*4882a593Smuzhiyun static int
i2c_pnx_xfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)512*4882a593Smuzhiyun i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
513*4882a593Smuzhiyun {
514*4882a593Smuzhiyun 	struct i2c_msg *pmsg;
515*4882a593Smuzhiyun 	int rc = 0, completed = 0, i;
516*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data = adap->algo_data;
517*4882a593Smuzhiyun 	u32 stat;
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev,
520*4882a593Smuzhiyun 		"%s(): entering: %d messages, stat = %04x.\n",
521*4882a593Smuzhiyun 		__func__, num, ioread32(I2C_REG_STS(alg_data)));
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun 	bus_reset_if_active(alg_data);
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun 	/* Process transactions in a loop. */
526*4882a593Smuzhiyun 	for (i = 0; rc >= 0 && i < num; i++) {
527*4882a593Smuzhiyun 		u8 addr;
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 		pmsg = &msgs[i];
530*4882a593Smuzhiyun 		addr = pmsg->addr;
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 		if (pmsg->flags & I2C_M_TEN) {
533*4882a593Smuzhiyun 			dev_err(&alg_data->adapter.dev,
534*4882a593Smuzhiyun 				"%s: 10 bits addr not supported!\n",
535*4882a593Smuzhiyun 				alg_data->adapter.name);
536*4882a593Smuzhiyun 			rc = -EINVAL;
537*4882a593Smuzhiyun 			break;
538*4882a593Smuzhiyun 		}
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun 		alg_data->mif.buf = pmsg->buf;
541*4882a593Smuzhiyun 		alg_data->mif.len = pmsg->len;
542*4882a593Smuzhiyun 		alg_data->mif.order = pmsg->len;
543*4882a593Smuzhiyun 		alg_data->mif.mode = (pmsg->flags & I2C_M_RD) ?
544*4882a593Smuzhiyun 			I2C_SMBUS_READ : I2C_SMBUS_WRITE;
545*4882a593Smuzhiyun 		alg_data->mif.ret = 0;
546*4882a593Smuzhiyun 		alg_data->last = (i == num - 1);
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 		dev_dbg(&alg_data->adapter.dev, "%s(): mode %d, %d bytes\n",
549*4882a593Smuzhiyun 			__func__, alg_data->mif.mode, alg_data->mif.len);
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun 		i2c_pnx_arm_timer(alg_data);
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 		/* initialize the completion var */
554*4882a593Smuzhiyun 		init_completion(&alg_data->mif.complete);
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 		/* Enable master interrupt */
557*4882a593Smuzhiyun 		iowrite32(ioread32(I2C_REG_CTL(alg_data)) | mcntrl_afie |
558*4882a593Smuzhiyun 				mcntrl_naie | mcntrl_drmie,
559*4882a593Smuzhiyun 			  I2C_REG_CTL(alg_data));
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 		/* Put start-code and slave-address on the bus. */
562*4882a593Smuzhiyun 		rc = i2c_pnx_start(addr, alg_data);
563*4882a593Smuzhiyun 		if (rc < 0)
564*4882a593Smuzhiyun 			break;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 		/* Wait for completion */
567*4882a593Smuzhiyun 		wait_for_completion(&alg_data->mif.complete);
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 		if (!(rc = alg_data->mif.ret))
570*4882a593Smuzhiyun 			completed++;
571*4882a593Smuzhiyun 		dev_dbg(&alg_data->adapter.dev,
572*4882a593Smuzhiyun 			"%s(): Complete, return code = %d.\n",
573*4882a593Smuzhiyun 			__func__, rc);
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 		/* Clear TDI and AFI bits in case they are set. */
576*4882a593Smuzhiyun 		if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_tdi) {
577*4882a593Smuzhiyun 			dev_dbg(&alg_data->adapter.dev,
578*4882a593Smuzhiyun 				"%s: TDI still set... clearing now.\n",
579*4882a593Smuzhiyun 				alg_data->adapter.name);
580*4882a593Smuzhiyun 			iowrite32(stat, I2C_REG_STS(alg_data));
581*4882a593Smuzhiyun 		}
582*4882a593Smuzhiyun 		if ((stat = ioread32(I2C_REG_STS(alg_data))) & mstatus_afi) {
583*4882a593Smuzhiyun 			dev_dbg(&alg_data->adapter.dev,
584*4882a593Smuzhiyun 				"%s: AFI still set... clearing now.\n",
585*4882a593Smuzhiyun 				alg_data->adapter.name);
586*4882a593Smuzhiyun 			iowrite32(stat, I2C_REG_STS(alg_data));
587*4882a593Smuzhiyun 		}
588*4882a593Smuzhiyun 	}
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	bus_reset_if_active(alg_data);
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun 	/* Cleanup to be sure... */
593*4882a593Smuzhiyun 	alg_data->mif.buf = NULL;
594*4882a593Smuzhiyun 	alg_data->mif.len = 0;
595*4882a593Smuzhiyun 	alg_data->mif.order = 0;
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	dev_dbg(&alg_data->adapter.dev, "%s(): exiting, stat = %x\n",
598*4882a593Smuzhiyun 		__func__, ioread32(I2C_REG_STS(alg_data)));
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 	if (completed != num)
601*4882a593Smuzhiyun 		return ((rc < 0) ? rc : -EREMOTEIO);
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun 	return num;
604*4882a593Smuzhiyun }
605*4882a593Smuzhiyun 
i2c_pnx_func(struct i2c_adapter * adapter)606*4882a593Smuzhiyun static u32 i2c_pnx_func(struct i2c_adapter *adapter)
607*4882a593Smuzhiyun {
608*4882a593Smuzhiyun 	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun static const struct i2c_algorithm pnx_algorithm = {
612*4882a593Smuzhiyun 	.master_xfer = i2c_pnx_xfer,
613*4882a593Smuzhiyun 	.functionality = i2c_pnx_func,
614*4882a593Smuzhiyun };
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
i2c_pnx_controller_suspend(struct device * dev)617*4882a593Smuzhiyun static int i2c_pnx_controller_suspend(struct device *dev)
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data = dev_get_drvdata(dev);
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun 	clk_disable_unprepare(alg_data->clk);
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	return 0;
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun 
i2c_pnx_controller_resume(struct device * dev)626*4882a593Smuzhiyun static int i2c_pnx_controller_resume(struct device *dev)
627*4882a593Smuzhiyun {
628*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data = dev_get_drvdata(dev);
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun 	return clk_prepare_enable(alg_data->clk);
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(i2c_pnx_pm,
634*4882a593Smuzhiyun 			 i2c_pnx_controller_suspend, i2c_pnx_controller_resume);
635*4882a593Smuzhiyun #define PNX_I2C_PM	(&i2c_pnx_pm)
636*4882a593Smuzhiyun #else
637*4882a593Smuzhiyun #define PNX_I2C_PM	NULL
638*4882a593Smuzhiyun #endif
639*4882a593Smuzhiyun 
i2c_pnx_probe(struct platform_device * pdev)640*4882a593Smuzhiyun static int i2c_pnx_probe(struct platform_device *pdev)
641*4882a593Smuzhiyun {
642*4882a593Smuzhiyun 	unsigned long tmp;
643*4882a593Smuzhiyun 	int ret = 0;
644*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data;
645*4882a593Smuzhiyun 	unsigned long freq;
646*4882a593Smuzhiyun 	struct resource *res;
647*4882a593Smuzhiyun 	u32 speed = I2C_PNX_SPEED_KHZ_DEFAULT * 1000;
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun 	alg_data = devm_kzalloc(&pdev->dev, sizeof(*alg_data), GFP_KERNEL);
650*4882a593Smuzhiyun 	if (!alg_data)
651*4882a593Smuzhiyun 		return -ENOMEM;
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun 	platform_set_drvdata(pdev, alg_data);
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun 	alg_data->adapter.dev.parent = &pdev->dev;
656*4882a593Smuzhiyun 	alg_data->adapter.algo = &pnx_algorithm;
657*4882a593Smuzhiyun 	alg_data->adapter.algo_data = alg_data;
658*4882a593Smuzhiyun 	alg_data->adapter.nr = pdev->id;
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 	alg_data->timeout = I2C_PNX_TIMEOUT_DEFAULT;
661*4882a593Smuzhiyun #ifdef CONFIG_OF
662*4882a593Smuzhiyun 	alg_data->adapter.dev.of_node = of_node_get(pdev->dev.of_node);
663*4882a593Smuzhiyun 	if (pdev->dev.of_node) {
664*4882a593Smuzhiyun 		of_property_read_u32(pdev->dev.of_node, "clock-frequency",
665*4882a593Smuzhiyun 				     &speed);
666*4882a593Smuzhiyun 		/*
667*4882a593Smuzhiyun 		 * At this point, it is planned to add an OF timeout property.
668*4882a593Smuzhiyun 		 * As soon as there is a consensus about how to call and handle
669*4882a593Smuzhiyun 		 * this, sth. like the following can be put here:
670*4882a593Smuzhiyun 		 *
671*4882a593Smuzhiyun 		 * of_property_read_u32(pdev->dev.of_node, "timeout",
672*4882a593Smuzhiyun 		 *                      &alg_data->timeout);
673*4882a593Smuzhiyun 		 */
674*4882a593Smuzhiyun 	}
675*4882a593Smuzhiyun #endif
676*4882a593Smuzhiyun 	alg_data->clk = devm_clk_get(&pdev->dev, NULL);
677*4882a593Smuzhiyun 	if (IS_ERR(alg_data->clk))
678*4882a593Smuzhiyun 		return PTR_ERR(alg_data->clk);
679*4882a593Smuzhiyun 
680*4882a593Smuzhiyun 	timer_setup(&alg_data->mif.timer, i2c_pnx_timeout, 0);
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	snprintf(alg_data->adapter.name, sizeof(alg_data->adapter.name),
683*4882a593Smuzhiyun 		 "%s", pdev->name);
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun 	/* Register I/O resource */
686*4882a593Smuzhiyun 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
687*4882a593Smuzhiyun 	alg_data->ioaddr = devm_ioremap_resource(&pdev->dev, res);
688*4882a593Smuzhiyun 	if (IS_ERR(alg_data->ioaddr))
689*4882a593Smuzhiyun 		return PTR_ERR(alg_data->ioaddr);
690*4882a593Smuzhiyun 
691*4882a593Smuzhiyun 	ret = clk_prepare_enable(alg_data->clk);
692*4882a593Smuzhiyun 	if (ret)
693*4882a593Smuzhiyun 		return ret;
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	freq = clk_get_rate(alg_data->clk);
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun 	/*
698*4882a593Smuzhiyun 	 * Clock Divisor High This value is the number of system clocks
699*4882a593Smuzhiyun 	 * the serial clock (SCL) will be high.
700*4882a593Smuzhiyun 	 * For example, if the system clock period is 50 ns and the maximum
701*4882a593Smuzhiyun 	 * desired serial period is 10000 ns (100 kHz), then CLKHI would be
702*4882a593Smuzhiyun 	 * set to 0.5*(f_sys/f_i2c)-2=0.5*(20e6/100e3)-2=98. The actual value
703*4882a593Smuzhiyun 	 * programmed into CLKHI will vary from this slightly due to
704*4882a593Smuzhiyun 	 * variations in the output pad's rise and fall times as well as
705*4882a593Smuzhiyun 	 * the deglitching filter length.
706*4882a593Smuzhiyun 	 */
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun 	tmp = (freq / speed) / 2 - 2;
709*4882a593Smuzhiyun 	if (tmp > 0x3FF)
710*4882a593Smuzhiyun 		tmp = 0x3FF;
711*4882a593Smuzhiyun 	iowrite32(tmp, I2C_REG_CKH(alg_data));
712*4882a593Smuzhiyun 	iowrite32(tmp, I2C_REG_CKL(alg_data));
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun 	iowrite32(mcntrl_reset, I2C_REG_CTL(alg_data));
715*4882a593Smuzhiyun 	if (wait_reset(alg_data)) {
716*4882a593Smuzhiyun 		ret = -ENODEV;
717*4882a593Smuzhiyun 		goto out_clock;
718*4882a593Smuzhiyun 	}
719*4882a593Smuzhiyun 	init_completion(&alg_data->mif.complete);
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 	alg_data->irq = platform_get_irq(pdev, 0);
722*4882a593Smuzhiyun 	if (alg_data->irq < 0) {
723*4882a593Smuzhiyun 		ret = alg_data->irq;
724*4882a593Smuzhiyun 		goto out_clock;
725*4882a593Smuzhiyun 	}
726*4882a593Smuzhiyun 	ret = devm_request_irq(&pdev->dev, alg_data->irq, i2c_pnx_interrupt,
727*4882a593Smuzhiyun 			       0, pdev->name, alg_data);
728*4882a593Smuzhiyun 	if (ret)
729*4882a593Smuzhiyun 		goto out_clock;
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun 	/* Register this adapter with the I2C subsystem */
732*4882a593Smuzhiyun 	ret = i2c_add_numbered_adapter(&alg_data->adapter);
733*4882a593Smuzhiyun 	if (ret < 0)
734*4882a593Smuzhiyun 		goto out_clock;
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	dev_dbg(&pdev->dev, "%s: Master at %pap, irq %d.\n",
737*4882a593Smuzhiyun 		alg_data->adapter.name, &res->start, alg_data->irq);
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun 	return 0;
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun out_clock:
742*4882a593Smuzhiyun 	clk_disable_unprepare(alg_data->clk);
743*4882a593Smuzhiyun 	return ret;
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun 
i2c_pnx_remove(struct platform_device * pdev)746*4882a593Smuzhiyun static int i2c_pnx_remove(struct platform_device *pdev)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun 	struct i2c_pnx_algo_data *alg_data = platform_get_drvdata(pdev);
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun 	i2c_del_adapter(&alg_data->adapter);
751*4882a593Smuzhiyun 	clk_disable_unprepare(alg_data->clk);
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	return 0;
754*4882a593Smuzhiyun }
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun #ifdef CONFIG_OF
757*4882a593Smuzhiyun static const struct of_device_id i2c_pnx_of_match[] = {
758*4882a593Smuzhiyun 	{ .compatible = "nxp,pnx-i2c" },
759*4882a593Smuzhiyun 	{ },
760*4882a593Smuzhiyun };
761*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, i2c_pnx_of_match);
762*4882a593Smuzhiyun #endif
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun static struct platform_driver i2c_pnx_driver = {
765*4882a593Smuzhiyun 	.driver = {
766*4882a593Smuzhiyun 		.name = "pnx-i2c",
767*4882a593Smuzhiyun 		.of_match_table = of_match_ptr(i2c_pnx_of_match),
768*4882a593Smuzhiyun 		.pm = PNX_I2C_PM,
769*4882a593Smuzhiyun 	},
770*4882a593Smuzhiyun 	.probe = i2c_pnx_probe,
771*4882a593Smuzhiyun 	.remove = i2c_pnx_remove,
772*4882a593Smuzhiyun };
773*4882a593Smuzhiyun 
i2c_adap_pnx_init(void)774*4882a593Smuzhiyun static int __init i2c_adap_pnx_init(void)
775*4882a593Smuzhiyun {
776*4882a593Smuzhiyun 	return platform_driver_register(&i2c_pnx_driver);
777*4882a593Smuzhiyun }
778*4882a593Smuzhiyun 
i2c_adap_pnx_exit(void)779*4882a593Smuzhiyun static void __exit i2c_adap_pnx_exit(void)
780*4882a593Smuzhiyun {
781*4882a593Smuzhiyun 	platform_driver_unregister(&i2c_pnx_driver);
782*4882a593Smuzhiyun }
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun MODULE_AUTHOR("Vitaly Wool");
785*4882a593Smuzhiyun MODULE_AUTHOR("Dennis Kovalev <source@mvista.com>");
786*4882a593Smuzhiyun MODULE_DESCRIPTION("I2C driver for Philips IP3204-based I2C busses");
787*4882a593Smuzhiyun MODULE_LICENSE("GPL");
788*4882a593Smuzhiyun MODULE_ALIAS("platform:pnx-i2c");
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun /* We need to make sure I2C is initialized before USB */
791*4882a593Smuzhiyun subsys_initcall(i2c_adap_pnx_init);
792*4882a593Smuzhiyun module_exit(i2c_adap_pnx_exit);
793