Lines Matching refs:riic
113 static inline void riic_clear_set_bit(struct riic_dev *riic, u8 clear, u8 set, u8 reg) in riic_clear_set_bit() argument
115 writeb((readb(riic->base + reg) & ~clear) | set, riic->base + reg); in riic_clear_set_bit()
120 struct riic_dev *riic = i2c_get_adapdata(adap); in riic_xfer() local
125 ret = clk_prepare_enable(riic->clk); in riic_xfer()
129 if (readb(riic->base + RIIC_ICCR2) & ICCR2_BBSY) { in riic_xfer()
130 riic->err = -EBUSY; in riic_xfer()
134 reinit_completion(&riic->msg_done); in riic_xfer()
135 riic->err = 0; in riic_xfer()
137 writeb(0, riic->base + RIIC_ICSR2); in riic_xfer()
140 riic->bytes_left = RIIC_INIT_MSG; in riic_xfer()
141 riic->buf = msgs[i].buf; in riic_xfer()
142 riic->msg = &msgs[i]; in riic_xfer()
143 riic->is_last = (i == num - 1); in riic_xfer()
145 writeb(ICIER_NAKIE | ICIER_TIE, riic->base + RIIC_ICIER); in riic_xfer()
147 writeb(start_bit, riic->base + RIIC_ICCR2); in riic_xfer()
149 time_left = wait_for_completion_timeout(&riic->msg_done, riic->adapter.timeout); in riic_xfer()
151 riic->err = -ETIMEDOUT; in riic_xfer()
153 if (riic->err) in riic_xfer()
160 clk_disable_unprepare(riic->clk); in riic_xfer()
162 return riic->err ?: num; in riic_xfer()
167 struct riic_dev *riic = data; in riic_tdre_isr() local
170 if (!riic->bytes_left) in riic_tdre_isr()
173 if (riic->bytes_left == RIIC_INIT_MSG) { in riic_tdre_isr()
174 val = !!(riic->msg->flags & I2C_M_RD); in riic_tdre_isr()
177 riic_clear_set_bit(riic, ICIER_TIE, ICIER_RIE, RIIC_ICIER); in riic_tdre_isr()
180 riic->bytes_left = riic->msg->len; in riic_tdre_isr()
182 val |= (riic->msg->addr << 1); in riic_tdre_isr()
184 val = *riic->buf; in riic_tdre_isr()
185 riic->buf++; in riic_tdre_isr()
186 riic->bytes_left--; in riic_tdre_isr()
194 if (riic->bytes_left == 0) in riic_tdre_isr()
195 riic_clear_set_bit(riic, ICIER_TIE, ICIER_TEIE, RIIC_ICIER); in riic_tdre_isr()
202 writeb(val, riic->base + RIIC_ICDRT); in riic_tdre_isr()
209 struct riic_dev *riic = data; in riic_tend_isr() local
211 if (readb(riic->base + RIIC_ICSR2) & ICSR2_NACKF) { in riic_tend_isr()
213 readb(riic->base + RIIC_ICDRR); /* dummy read */ in riic_tend_isr()
214 riic->err = -ENXIO; in riic_tend_isr()
215 } else if (riic->bytes_left) { in riic_tend_isr()
219 if (riic->is_last || riic->err) in riic_tend_isr()
220 writeb(ICCR2_SP, riic->base + RIIC_ICCR2); in riic_tend_isr()
222 writeb(0, riic->base + RIIC_ICIER); in riic_tend_isr()
223 complete(&riic->msg_done); in riic_tend_isr()
230 struct riic_dev *riic = data; in riic_rdrf_isr() local
232 if (!riic->bytes_left) in riic_rdrf_isr()
235 if (riic->bytes_left == RIIC_INIT_MSG) { in riic_rdrf_isr()
236 riic->bytes_left = riic->msg->len; in riic_rdrf_isr()
237 readb(riic->base + RIIC_ICDRR); /* dummy read */ in riic_rdrf_isr()
241 if (riic->bytes_left == 1) { in riic_rdrf_isr()
243 if (riic->is_last) in riic_rdrf_isr()
244 writeb(ICCR2_SP, riic->base + RIIC_ICCR2); in riic_rdrf_isr()
246 riic_clear_set_bit(riic, 0, ICMR3_ACKBT, RIIC_ICMR3); in riic_rdrf_isr()
248 writeb(0, riic->base + RIIC_ICIER); in riic_rdrf_isr()
249 complete(&riic->msg_done); in riic_rdrf_isr()
251 riic_clear_set_bit(riic, ICMR3_ACKBT, 0, RIIC_ICMR3); in riic_rdrf_isr()
255 *riic->buf = readb(riic->base + RIIC_ICDRR); in riic_rdrf_isr()
256 riic->buf++; in riic_rdrf_isr()
257 riic->bytes_left--; in riic_rdrf_isr()
272 static int riic_init_hw(struct riic_dev *riic, u32 spd) in riic_init_hw() argument
277 ret = clk_prepare_enable(riic->clk); in riic_init_hw()
285 rate = clk_get_rate(riic->clk); in riic_init_hw()
287 dev_err(&riic->adapter.dev, in riic_init_hw()
289 clk_disable_unprepare(riic->clk); in riic_init_hw()
294 writeb(ICCR1_IICRST | ICCR1_SOWP, riic->base + RIIC_ICCR1); in riic_init_hw()
295 riic_clear_set_bit(riic, 0, ICCR1_ICE, RIIC_ICCR1); in riic_init_hw()
299 writeb(ICMR1_CKS(3), riic->base + RIIC_ICMR1); in riic_init_hw()
300 writeb(ICBRH_SP100K, riic->base + RIIC_ICBRH); in riic_init_hw()
301 writeb(ICBRL_SP100K, riic->base + RIIC_ICBRL); in riic_init_hw()
304 writeb(ICMR1_CKS(1), riic->base + RIIC_ICMR1); in riic_init_hw()
305 writeb(ICBRH_SP400K, riic->base + RIIC_ICBRH); in riic_init_hw()
306 writeb(ICBRL_SP400K, riic->base + RIIC_ICBRL); in riic_init_hw()
309 dev_err(&riic->adapter.dev, in riic_init_hw()
311 clk_disable_unprepare(riic->clk); in riic_init_hw()
315 writeb(0, riic->base + RIIC_ICSER); in riic_init_hw()
316 writeb(ICMR3_ACKWP | ICMR3_RDRFS, riic->base + RIIC_ICMR3); in riic_init_hw()
318 riic_clear_set_bit(riic, ICCR1_IICRST, 0, RIIC_ICCR1); in riic_init_hw()
320 clk_disable_unprepare(riic->clk); in riic_init_hw()
335 struct riic_dev *riic; in riic_i2c_probe() local
341 riic = devm_kzalloc(&pdev->dev, sizeof(*riic), GFP_KERNEL); in riic_i2c_probe()
342 if (!riic) in riic_i2c_probe()
346 riic->base = devm_ioremap_resource(&pdev->dev, res); in riic_i2c_probe()
347 if (IS_ERR(riic->base)) in riic_i2c_probe()
348 return PTR_ERR(riic->base); in riic_i2c_probe()
350 riic->clk = devm_clk_get(&pdev->dev, NULL); in riic_i2c_probe()
351 if (IS_ERR(riic->clk)) { in riic_i2c_probe()
353 return PTR_ERR(riic->clk); in riic_i2c_probe()
362 0, riic_irqs[i].name, riic); in riic_i2c_probe()
369 adap = &riic->adapter; in riic_i2c_probe()
370 i2c_set_adapdata(adap, riic); in riic_i2c_probe()
377 init_completion(&riic->msg_done); in riic_i2c_probe()
380 ret = riic_init_hw(riic, bus_rate); in riic_i2c_probe()
391 platform_set_drvdata(pdev, riic); in riic_i2c_probe()
399 struct riic_dev *riic = platform_get_drvdata(pdev); in riic_i2c_remove() local
401 writeb(0, riic->base + RIIC_ICIER); in riic_i2c_remove()
402 i2c_del_adapter(&riic->adapter); in riic_i2c_remove()