• Home
  • Raw
  • Download

Lines Matching refs:i2c

61 static __inline__ void writeccr(struct mpc_i2c *i2c, u32 x)  in writeccr()  argument
63 writeb(x, i2c->base + MPC_I2C_CR); in writeccr()
68 struct mpc_i2c *i2c = dev_id; in mpc_i2c_isr() local
69 if (readb(i2c->base + MPC_I2C_SR) & CSR_MIF) { in mpc_i2c_isr()
71 i2c->interrupt = readb(i2c->base + MPC_I2C_SR); in mpc_i2c_isr()
72 writeb(0, i2c->base + MPC_I2C_SR); in mpc_i2c_isr()
73 wake_up_interruptible(&i2c->queue); in mpc_i2c_isr()
83 static void mpc_i2c_fixup(struct mpc_i2c *i2c) in mpc_i2c_fixup() argument
85 writeccr(i2c, 0); in mpc_i2c_fixup()
87 writeccr(i2c, CCR_MEN); in mpc_i2c_fixup()
89 writeccr(i2c, CCR_MSTA | CCR_MTX); in mpc_i2c_fixup()
91 writeccr(i2c, CCR_MSTA | CCR_MTX | CCR_MEN); in mpc_i2c_fixup()
93 writeccr(i2c, CCR_MEN); in mpc_i2c_fixup()
97 static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) in i2c_wait() argument
103 if (i2c->irq == NO_IRQ) in i2c_wait()
105 while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) { in i2c_wait()
109 writeccr(i2c, 0); in i2c_wait()
114 x = readb(i2c->base + MPC_I2C_SR); in i2c_wait()
115 writeb(0, i2c->base + MPC_I2C_SR); in i2c_wait()
118 result = wait_event_interruptible_timeout(i2c->queue, in i2c_wait()
119 (i2c->interrupt & CSR_MIF), timeout * HZ); in i2c_wait()
123 writeccr(i2c, 0); in i2c_wait()
124 } else if (unlikely(!(i2c->interrupt & CSR_MIF))) { in i2c_wait()
126 writeccr(i2c, 0); in i2c_wait()
130 x = i2c->interrupt; in i2c_wait()
131 i2c->interrupt = 0; in i2c_wait()
150 writeccr(i2c, CCR_MEN); in i2c_wait()
156 static void mpc_i2c_setclock(struct mpc_i2c *i2c) in mpc_i2c_setclock() argument
159 if (i2c->flags & FSL_I2C_DEV_SEPARATE_DFSRR) { in mpc_i2c_setclock()
160 writeb(0x31, i2c->base + MPC_I2C_FDR); in mpc_i2c_setclock()
161 writeb(0x10, i2c->base + MPC_I2C_DFSRR); in mpc_i2c_setclock()
162 } else if (i2c->flags & FSL_I2C_DEV_CLOCK_5200) in mpc_i2c_setclock()
163 writeb(0x3f, i2c->base + MPC_I2C_FDR); in mpc_i2c_setclock()
165 writel(0x1031, i2c->base + MPC_I2C_FDR); in mpc_i2c_setclock()
168 static void mpc_i2c_start(struct mpc_i2c *i2c) in mpc_i2c_start() argument
171 writeb(0, i2c->base + MPC_I2C_SR); in mpc_i2c_start()
173 writeccr(i2c, CCR_MEN); in mpc_i2c_start()
176 static void mpc_i2c_stop(struct mpc_i2c *i2c) in mpc_i2c_stop() argument
178 writeccr(i2c, CCR_MEN); in mpc_i2c_stop()
181 static int mpc_write(struct mpc_i2c *i2c, int target, in mpc_write() argument
185 unsigned timeout = i2c->adap.timeout; in mpc_write()
190 writeccr(i2c, CCR_MEN); in mpc_write()
192 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); in mpc_write()
194 writeb((target << 1), i2c->base + MPC_I2C_DR); in mpc_write()
196 result = i2c_wait(i2c, timeout, 1); in mpc_write()
202 writeb(data[i], i2c->base + MPC_I2C_DR); in mpc_write()
204 result = i2c_wait(i2c, timeout, 1); in mpc_write()
212 static int mpc_read(struct mpc_i2c *i2c, int target, in mpc_read() argument
215 unsigned timeout = i2c->adap.timeout; in mpc_read()
221 writeccr(i2c, CCR_MEN); in mpc_read()
223 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); in mpc_read()
225 writeb((target << 1) | 1, i2c->base + MPC_I2C_DR); in mpc_read()
227 result = i2c_wait(i2c, timeout, 1); in mpc_read()
233 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); in mpc_read()
235 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA); in mpc_read()
237 readb(i2c->base + MPC_I2C_DR); in mpc_read()
241 result = i2c_wait(i2c, timeout, 0); in mpc_read()
247 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); in mpc_read()
250 writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_TXAK); in mpc_read()
251 data[i] = readb(i2c->base + MPC_I2C_DR); in mpc_read()
263 struct mpc_i2c *i2c = i2c_get_adapdata(adap); in mpc_xfer() local
265 mpc_i2c_start(i2c); in mpc_xfer()
268 while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) { in mpc_xfer()
271 writeccr(i2c, 0); in mpc_xfer()
276 if (readb(i2c->base + MPC_I2C_SR) == in mpc_xfer()
278 mpc_i2c_fixup(i2c); in mpc_xfer()
291 mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i); in mpc_xfer()
294 mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i); in mpc_xfer()
296 mpc_i2c_stop(i2c); in mpc_xfer()
320 struct mpc_i2c *i2c; in fsl_i2c_probe() local
322 i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); in fsl_i2c_probe()
323 if (!i2c) in fsl_i2c_probe()
327 i2c->flags |= FSL_I2C_DEV_SEPARATE_DFSRR; in fsl_i2c_probe()
331 i2c->flags |= FSL_I2C_DEV_CLOCK_5200; in fsl_i2c_probe()
333 init_waitqueue_head(&i2c->queue); in fsl_i2c_probe()
335 i2c->base = of_iomap(op->node, 0); in fsl_i2c_probe()
336 if (!i2c->base) { in fsl_i2c_probe()
342 i2c->irq = irq_of_parse_and_map(op->node, 0); in fsl_i2c_probe()
343 if (i2c->irq != NO_IRQ) { /* i2c->irq = NO_IRQ implies polling */ in fsl_i2c_probe()
344 result = request_irq(i2c->irq, mpc_i2c_isr, in fsl_i2c_probe()
345 IRQF_SHARED, "i2c-mpc", i2c); in fsl_i2c_probe()
352 mpc_i2c_setclock(i2c); in fsl_i2c_probe()
354 dev_set_drvdata(&op->dev, i2c); in fsl_i2c_probe()
356 i2c->adap = mpc_ops; in fsl_i2c_probe()
357 i2c_set_adapdata(&i2c->adap, i2c); in fsl_i2c_probe()
358 i2c->adap.dev.parent = &op->dev; in fsl_i2c_probe()
360 result = i2c_add_adapter(&i2c->adap); in fsl_i2c_probe()
365 of_register_i2c_devices(&i2c->adap, op->node); in fsl_i2c_probe()
371 free_irq(i2c->irq, i2c); in fsl_i2c_probe()
373 irq_dispose_mapping(i2c->irq); in fsl_i2c_probe()
374 iounmap(i2c->base); in fsl_i2c_probe()
376 kfree(i2c); in fsl_i2c_probe()
382 struct mpc_i2c *i2c = dev_get_drvdata(&op->dev); in fsl_i2c_remove() local
384 i2c_del_adapter(&i2c->adap); in fsl_i2c_remove()
387 if (i2c->irq != NO_IRQ) in fsl_i2c_remove()
388 free_irq(i2c->irq, i2c); in fsl_i2c_remove()
390 irq_dispose_mapping(i2c->irq); in fsl_i2c_remove()
391 iounmap(i2c->base); in fsl_i2c_remove()
392 kfree(i2c); in fsl_i2c_remove()