• Home
  • Raw
  • Download

Lines Matching refs:i2c

89 static void i2c_lpc2k_reset(struct lpc2k_i2c *i2c)  in i2c_lpc2k_reset()  argument
92 writel(LPC24XX_CLEAR_ALL, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_reset()
93 writel(0, i2c->base + LPC24XX_I2ADDR); in i2c_lpc2k_reset()
94 writel(LPC24XX_I2EN, i2c->base + LPC24XX_I2CONSET); in i2c_lpc2k_reset()
97 static int i2c_lpc2k_clear_arb(struct lpc2k_i2c *i2c) in i2c_lpc2k_clear_arb() argument
105 writel(LPC24XX_STO, i2c->base + LPC24XX_I2CONSET); in i2c_lpc2k_clear_arb()
108 while (readl(i2c->base + LPC24XX_I2STAT) != M_I2C_IDLE) { in i2c_lpc2k_clear_arb()
111 i2c_lpc2k_reset(i2c); in i2c_lpc2k_clear_arb()
121 static void i2c_lpc2k_pump_msg(struct lpc2k_i2c *i2c) in i2c_lpc2k_pump_msg() argument
130 status = readl(i2c->base + LPC24XX_I2STAT); in i2c_lpc2k_pump_msg()
136 data = i2c_8bit_addr_from_msg(i2c->msg); in i2c_lpc2k_pump_msg()
138 writel(data, i2c->base + LPC24XX_I2DAT); in i2c_lpc2k_pump_msg()
139 writel(LPC24XX_STA, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
148 if (i2c->msg_idx < i2c->msg->len) { in i2c_lpc2k_pump_msg()
149 writel(i2c->msg->buf[i2c->msg_idx], in i2c_lpc2k_pump_msg()
150 i2c->base + LPC24XX_I2DAT); in i2c_lpc2k_pump_msg()
151 } else if (i2c->is_last) { in i2c_lpc2k_pump_msg()
153 writel(LPC24XX_STO_AA, i2c->base + LPC24XX_I2CONSET); in i2c_lpc2k_pump_msg()
154 writel(LPC24XX_SI, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
155 i2c->msg_status = 0; in i2c_lpc2k_pump_msg()
156 disable_irq_nosync(i2c->irq); in i2c_lpc2k_pump_msg()
158 i2c->msg_status = 0; in i2c_lpc2k_pump_msg()
159 disable_irq_nosync(i2c->irq); in i2c_lpc2k_pump_msg()
162 i2c->msg_idx++; in i2c_lpc2k_pump_msg()
167 if (i2c->msg->len == 1) { in i2c_lpc2k_pump_msg()
169 writel(LPC24XX_AA, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
172 writel(LPC24XX_AA, i2c->base + LPC24XX_I2CONSET); in i2c_lpc2k_pump_msg()
175 writel(LPC24XX_STA, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
186 if (i2c->msg_idx < i2c->msg->len) { in i2c_lpc2k_pump_msg()
187 i2c->msg->buf[i2c->msg_idx] = in i2c_lpc2k_pump_msg()
188 readl(i2c->base + LPC24XX_I2DAT); in i2c_lpc2k_pump_msg()
192 if (i2c->msg_idx >= i2c->msg->len - 1 && i2c->is_last) { in i2c_lpc2k_pump_msg()
193 writel(LPC24XX_STO_AA, i2c->base + LPC24XX_I2CONSET); in i2c_lpc2k_pump_msg()
194 writel(LPC24XX_SI, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
195 i2c->msg_status = 0; in i2c_lpc2k_pump_msg()
199 if (i2c->msg_idx >= i2c->msg->len - 1) { in i2c_lpc2k_pump_msg()
200 i2c->msg_status = 0; in i2c_lpc2k_pump_msg()
201 disable_irq_nosync(i2c->irq); in i2c_lpc2k_pump_msg()
208 if (i2c->msg_idx >= i2c->msg->len - 2) { in i2c_lpc2k_pump_msg()
210 writel(LPC24XX_AA, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
213 writel(LPC24XX_AA, i2c->base + LPC24XX_I2CONSET); in i2c_lpc2k_pump_msg()
216 writel(LPC24XX_STA, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
217 i2c->msg_idx++; in i2c_lpc2k_pump_msg()
224 writel(LPC24XX_STO_AA, i2c->base + LPC24XX_I2CONSET); in i2c_lpc2k_pump_msg()
225 i2c->msg_status = -ENXIO; in i2c_lpc2k_pump_msg()
226 disable_irq_nosync(i2c->irq); in i2c_lpc2k_pump_msg()
231 i2c->msg_status = -EAGAIN; in i2c_lpc2k_pump_msg()
234 writel(LPC24XX_STA | LPC24XX_STO, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
235 disable_irq_nosync(i2c->irq); in i2c_lpc2k_pump_msg()
240 i2c->msg_status = -EIO; in i2c_lpc2k_pump_msg()
241 disable_irq_nosync(i2c->irq); in i2c_lpc2k_pump_msg()
246 if (i2c->msg_status != -EBUSY) in i2c_lpc2k_pump_msg()
247 wake_up(&i2c->wait); in i2c_lpc2k_pump_msg()
253 if (i2c->msg_status != 0) in i2c_lpc2k_pump_msg()
254 writel(LPC24XX_SI, i2c->base + LPC24XX_I2CONCLR); in i2c_lpc2k_pump_msg()
257 static int lpc2k_process_msg(struct lpc2k_i2c *i2c, int msgidx) in lpc2k_process_msg() argument
261 writel(LPC24XX_STA, i2c->base + LPC24XX_I2CONSET); in lpc2k_process_msg()
268 if (unlikely(i2c->msg->flags & I2C_M_NOSTART)) { in lpc2k_process_msg()
269 WARN_ON(i2c->msg->len == 0); in lpc2k_process_msg()
271 if (!(i2c->msg->flags & I2C_M_RD)) { in lpc2k_process_msg()
273 writel(i2c->msg->buf[0], in lpc2k_process_msg()
274 i2c->base + LPC24XX_I2DAT); in lpc2k_process_msg()
275 i2c->msg_idx++; in lpc2k_process_msg()
279 writel(LPC24XX_STA, i2c->base + LPC24XX_I2CONSET); in lpc2k_process_msg()
282 writel(LPC24XX_SI, i2c->base + LPC24XX_I2CONCLR); in lpc2k_process_msg()
285 enable_irq(i2c->irq); in lpc2k_process_msg()
288 if (wait_event_timeout(i2c->wait, i2c->msg_status != -EBUSY, in lpc2k_process_msg()
290 disable_irq_nosync(i2c->irq); in lpc2k_process_msg()
295 return i2c->msg_status; in lpc2k_process_msg()
301 struct lpc2k_i2c *i2c = i2c_get_adapdata(adap); in i2c_lpc2k_xfer() local
306 stat = readl(i2c->base + LPC24XX_I2STAT); in i2c_lpc2k_xfer()
309 return i2c_lpc2k_clear_arb(i2c); in i2c_lpc2k_xfer()
315 i2c->msg = &msgs[i]; in i2c_lpc2k_xfer()
316 i2c->msg_idx = 0; in i2c_lpc2k_xfer()
317 i2c->msg_status = -EBUSY; in i2c_lpc2k_xfer()
318 i2c->is_last = (i == (msg_num - 1)); in i2c_lpc2k_xfer()
320 ret = lpc2k_process_msg(i2c, i); in i2c_lpc2k_xfer()
330 struct lpc2k_i2c *i2c = dev_id; in i2c_lpc2k_handler() local
332 if (readl(i2c->base + LPC24XX_I2CONSET) & LPC24XX_SI) { in i2c_lpc2k_handler()
333 i2c_lpc2k_pump_msg(i2c); in i2c_lpc2k_handler()
353 struct lpc2k_i2c *i2c; in i2c_lpc2k_probe() local
360 i2c = devm_kzalloc(&pdev->dev, sizeof(*i2c), GFP_KERNEL); in i2c_lpc2k_probe()
361 if (!i2c) in i2c_lpc2k_probe()
365 i2c->base = devm_ioremap_resource(&pdev->dev, res); in i2c_lpc2k_probe()
366 if (IS_ERR(i2c->base)) in i2c_lpc2k_probe()
367 return PTR_ERR(i2c->base); in i2c_lpc2k_probe()
369 i2c->irq = platform_get_irq(pdev, 0); in i2c_lpc2k_probe()
370 if (i2c->irq < 0) { in i2c_lpc2k_probe()
372 return i2c->irq; in i2c_lpc2k_probe()
375 init_waitqueue_head(&i2c->wait); in i2c_lpc2k_probe()
377 i2c->clk = devm_clk_get(&pdev->dev, NULL); in i2c_lpc2k_probe()
378 if (IS_ERR(i2c->clk)) { in i2c_lpc2k_probe()
380 return PTR_ERR(i2c->clk); in i2c_lpc2k_probe()
383 ret = clk_prepare_enable(i2c->clk); in i2c_lpc2k_probe()
389 ret = devm_request_irq(&pdev->dev, i2c->irq, i2c_lpc2k_handler, 0, in i2c_lpc2k_probe()
390 dev_name(&pdev->dev), i2c); in i2c_lpc2k_probe()
396 disable_irq_nosync(i2c->irq); in i2c_lpc2k_probe()
399 i2c_lpc2k_reset(i2c); in i2c_lpc2k_probe()
406 clkrate = clk_get_rate(i2c->clk); in i2c_lpc2k_probe()
422 writel(scl_high, i2c->base + LPC24XX_I2SCLH); in i2c_lpc2k_probe()
423 writel(clkrate - scl_high, i2c->base + LPC24XX_I2SCLL); in i2c_lpc2k_probe()
425 platform_set_drvdata(pdev, i2c); in i2c_lpc2k_probe()
427 i2c_set_adapdata(&i2c->adap, i2c); in i2c_lpc2k_probe()
428 i2c->adap.owner = THIS_MODULE; in i2c_lpc2k_probe()
429 strlcpy(i2c->adap.name, "LPC2K I2C adapter", sizeof(i2c->adap.name)); in i2c_lpc2k_probe()
430 i2c->adap.algo = &i2c_lpc2k_algorithm; in i2c_lpc2k_probe()
431 i2c->adap.dev.parent = &pdev->dev; in i2c_lpc2k_probe()
432 i2c->adap.dev.of_node = pdev->dev.of_node; in i2c_lpc2k_probe()
434 ret = i2c_add_adapter(&i2c->adap); in i2c_lpc2k_probe()
443 clk_disable_unprepare(i2c->clk); in i2c_lpc2k_probe()
449 struct lpc2k_i2c *i2c = platform_get_drvdata(dev); in i2c_lpc2k_remove() local
451 i2c_del_adapter(&i2c->adap); in i2c_lpc2k_remove()
452 clk_disable_unprepare(i2c->clk); in i2c_lpc2k_remove()
460 struct lpc2k_i2c *i2c = dev_get_drvdata(dev); in i2c_lpc2k_suspend() local
462 clk_disable(i2c->clk); in i2c_lpc2k_suspend()
469 struct lpc2k_i2c *i2c = dev_get_drvdata(dev); in i2c_lpc2k_resume() local
471 clk_enable(i2c->clk); in i2c_lpc2k_resume()
472 i2c_lpc2k_reset(i2c); in i2c_lpc2k_resume()