Lines Matching refs:riic
107 static inline void riic_clear_set_bit(struct riic_dev *riic, u8 clear, u8 set, u8 reg) in riic_clear_set_bit() argument
109 writeb((readb(riic->base + reg) & ~clear) | set, riic->base + reg); in riic_clear_set_bit()
114 struct riic_dev *riic = i2c_get_adapdata(adap); in riic_xfer() local
121 if (readb(riic->base + RIIC_ICCR2) & ICCR2_BBSY) { in riic_xfer()
122 riic->err = -EBUSY; in riic_xfer()
126 reinit_completion(&riic->msg_done); in riic_xfer()
127 riic->err = 0; in riic_xfer()
129 writeb(0, riic->base + RIIC_ICSR2); in riic_xfer()
132 riic->bytes_left = RIIC_INIT_MSG; in riic_xfer()
133 riic->buf = msgs[i].buf; in riic_xfer()
134 riic->msg = &msgs[i]; in riic_xfer()
135 riic->is_last = (i == num - 1); in riic_xfer()
137 writeb(ICIER_NAKIE | ICIER_TIE, riic->base + RIIC_ICIER); in riic_xfer()
139 writeb(start_bit, riic->base + RIIC_ICCR2); in riic_xfer()
141 time_left = wait_for_completion_timeout(&riic->msg_done, riic->adapter.timeout); in riic_xfer()
143 riic->err = -ETIMEDOUT; in riic_xfer()
145 if (riic->err) in riic_xfer()
154 return riic->err ?: num; in riic_xfer()
159 struct riic_dev *riic = data; in riic_tdre_isr() local
162 if (!riic->bytes_left) in riic_tdre_isr()
165 if (riic->bytes_left == RIIC_INIT_MSG) { in riic_tdre_isr()
166 if (riic->msg->flags & I2C_M_RD) in riic_tdre_isr()
168 riic_clear_set_bit(riic, ICIER_TIE, ICIER_RIE, RIIC_ICIER); in riic_tdre_isr()
171 riic->bytes_left = riic->msg->len; in riic_tdre_isr()
173 val = i2c_8bit_addr_from_msg(riic->msg); in riic_tdre_isr()
175 val = *riic->buf; in riic_tdre_isr()
176 riic->buf++; in riic_tdre_isr()
177 riic->bytes_left--; in riic_tdre_isr()
185 if (riic->bytes_left == 0) in riic_tdre_isr()
186 riic_clear_set_bit(riic, ICIER_TIE, ICIER_TEIE, RIIC_ICIER); in riic_tdre_isr()
193 writeb(val, riic->base + RIIC_ICDRT); in riic_tdre_isr()
200 struct riic_dev *riic = data; in riic_tend_isr() local
202 if (readb(riic->base + RIIC_ICSR2) & ICSR2_NACKF) { in riic_tend_isr()
204 readb(riic->base + RIIC_ICDRR); /* dummy read */ in riic_tend_isr()
205 riic_clear_set_bit(riic, ICSR2_NACKF, 0, RIIC_ICSR2); in riic_tend_isr()
206 riic->err = -ENXIO; in riic_tend_isr()
207 } else if (riic->bytes_left) { in riic_tend_isr()
211 if (riic->is_last || riic->err) { in riic_tend_isr()
212 riic_clear_set_bit(riic, ICIER_TEIE, ICIER_SPIE, RIIC_ICIER); in riic_tend_isr()
213 writeb(ICCR2_SP, riic->base + RIIC_ICCR2); in riic_tend_isr()
216 riic_clear_set_bit(riic, ICIER_TEIE, 0, RIIC_ICIER); in riic_tend_isr()
217 complete(&riic->msg_done); in riic_tend_isr()
225 struct riic_dev *riic = data; in riic_rdrf_isr() local
227 if (!riic->bytes_left) in riic_rdrf_isr()
230 if (riic->bytes_left == RIIC_INIT_MSG) { in riic_rdrf_isr()
231 riic->bytes_left = riic->msg->len; in riic_rdrf_isr()
232 readb(riic->base + RIIC_ICDRR); /* dummy read */ in riic_rdrf_isr()
236 if (riic->bytes_left == 1) { in riic_rdrf_isr()
238 if (riic->is_last) { in riic_rdrf_isr()
239 riic_clear_set_bit(riic, 0, ICIER_SPIE, RIIC_ICIER); in riic_rdrf_isr()
240 writeb(ICCR2_SP, riic->base + RIIC_ICCR2); in riic_rdrf_isr()
243 riic_clear_set_bit(riic, 0, ICMR3_ACKBT, RIIC_ICMR3); in riic_rdrf_isr()
246 riic_clear_set_bit(riic, ICMR3_ACKBT, 0, RIIC_ICMR3); in riic_rdrf_isr()
250 *riic->buf = readb(riic->base + RIIC_ICDRR); in riic_rdrf_isr()
251 riic->buf++; in riic_rdrf_isr()
252 riic->bytes_left--; in riic_rdrf_isr()
259 struct riic_dev *riic = data; in riic_stop_isr() local
262 writeb(0, riic->base + RIIC_ICSR2); in riic_stop_isr()
263 readb(riic->base + RIIC_ICSR2); in riic_stop_isr()
264 writeb(0, riic->base + RIIC_ICIER); in riic_stop_isr()
265 readb(riic->base + RIIC_ICIER); in riic_stop_isr()
267 complete(&riic->msg_done); in riic_stop_isr()
282 static int riic_init_hw(struct riic_dev *riic, struct i2c_timings *t) in riic_init_hw() argument
288 pm_runtime_get_sync(riic->adapter.dev.parent); in riic_init_hw()
291 dev_err(&riic->adapter.dev, in riic_init_hw()
298 rate = clk_get_rate(riic->clk); in riic_init_hw()
331 dev_err(&riic->adapter.dev, "invalid speed (%lu). Too slow.\n", in riic_init_hw()
367 writeb(ICCR1_IICRST | ICCR1_SOWP, riic->base + RIIC_ICCR1); in riic_init_hw()
368 riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1); in riic_init_hw()
370 writeb(ICMR1_CKS(cks), riic->base + RIIC_ICMR1); in riic_init_hw()
371 writeb(brh | ICBR_RESERVED, riic->base + RIIC_ICBRH); in riic_init_hw()
372 writeb(brl | ICBR_RESERVED, riic->base + RIIC_ICBRL); in riic_init_hw()
374 writeb(0, riic->base + RIIC_ICSER); in riic_init_hw()
375 writeb(ICMR3_ACKWP | ICMR3_RDRFS, riic->base + RIIC_ICMR3); in riic_init_hw()
377 riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1); in riic_init_hw()
380 pm_runtime_put(riic->adapter.dev.parent); in riic_init_hw()
394 struct riic_dev *riic; in riic_i2c_probe() local
400 riic = devm_kzalloc(&pdev->dev, sizeof(*riic), GFP_KERNEL); in riic_i2c_probe()
401 if (!riic) in riic_i2c_probe()
405 riic->base = devm_ioremap_resource(&pdev->dev, res); in riic_i2c_probe()
406 if (IS_ERR(riic->base)) in riic_i2c_probe()
407 return PTR_ERR(riic->base); in riic_i2c_probe()
409 riic->clk = devm_clk_get(&pdev->dev, NULL); in riic_i2c_probe()
410 if (IS_ERR(riic->clk)) { in riic_i2c_probe()
412 return PTR_ERR(riic->clk); in riic_i2c_probe()
421 0, riic_irqs[i].name, riic); in riic_i2c_probe()
428 adap = &riic->adapter; in riic_i2c_probe()
429 i2c_set_adapdata(adap, riic); in riic_i2c_probe()
436 init_completion(&riic->msg_done); in riic_i2c_probe()
442 ret = riic_init_hw(riic, &i2c_t); in riic_i2c_probe()
450 platform_set_drvdata(pdev, riic); in riic_i2c_probe()
463 struct riic_dev *riic = platform_get_drvdata(pdev); in riic_i2c_remove() local
466 writeb(0, riic->base + RIIC_ICIER); in riic_i2c_remove()
468 i2c_del_adapter(&riic->adapter); in riic_i2c_remove()