Lines Matching refs:idev

127 static void mchp_corei2c_core_disable(struct mchp_corei2c_dev *idev)  in mchp_corei2c_core_disable()  argument
129 u8 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_disable()
132 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_disable()
135 static void mchp_corei2c_core_enable(struct mchp_corei2c_dev *idev) in mchp_corei2c_core_enable() argument
137 u8 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_enable()
140 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_enable()
143 static void mchp_corei2c_reset(struct mchp_corei2c_dev *idev) in mchp_corei2c_reset() argument
145 mchp_corei2c_core_disable(idev); in mchp_corei2c_reset()
146 mchp_corei2c_core_enable(idev); in mchp_corei2c_reset()
149 static inline void mchp_corei2c_stop(struct mchp_corei2c_dev *idev) in mchp_corei2c_stop() argument
151 u8 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_stop()
154 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_stop()
158 struct mchp_corei2c_dev *idev) in mchp_corei2c_set_divisor() argument
181 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_set_divisor()
184 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_set_divisor()
186 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_set_divisor()
193 static int mchp_corei2c_init(struct mchp_corei2c_dev *idev) in mchp_corei2c_init() argument
195 u32 clk_rate = clk_get_rate(idev->i2c_clk); in mchp_corei2c_init()
196 u32 divisor = clk_rate / idev->bus_clk_rate; in mchp_corei2c_init()
199 ret = mchp_corei2c_set_divisor(divisor, idev); in mchp_corei2c_init()
203 mchp_corei2c_reset(idev); in mchp_corei2c_init()
208 static void mchp_corei2c_empty_rx(struct mchp_corei2c_dev *idev) in mchp_corei2c_empty_rx() argument
212 if (idev->msg_len > 0) { in mchp_corei2c_empty_rx()
213 *idev->buf++ = readb(idev->base + CORE_I2C_DATA); in mchp_corei2c_empty_rx()
214 idev->msg_len--; in mchp_corei2c_empty_rx()
217 if (idev->msg_len <= 1) { in mchp_corei2c_empty_rx()
218 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_empty_rx()
220 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_empty_rx()
224 static int mchp_corei2c_fill_tx(struct mchp_corei2c_dev *idev) in mchp_corei2c_fill_tx() argument
226 if (idev->msg_len > 0) in mchp_corei2c_fill_tx()
227 writeb(*idev->buf++, idev->base + CORE_I2C_DATA); in mchp_corei2c_fill_tx()
228 idev->msg_len--; in mchp_corei2c_fill_tx()
233 static void mchp_corei2c_next_msg(struct mchp_corei2c_dev *idev) in mchp_corei2c_next_msg() argument
238 if (idev->current_num >= idev->total_num) { in mchp_corei2c_next_msg()
239 complete(&idev->msg_complete); in mchp_corei2c_next_msg()
248 if (idev->msg_err) { in mchp_corei2c_next_msg()
249 complete(&idev->msg_complete); in mchp_corei2c_next_msg()
253 this_msg = idev->msg_queue++; in mchp_corei2c_next_msg()
255 if (idev->current_num < (idev->total_num - 1)) { in mchp_corei2c_next_msg()
256 struct i2c_msg *next_msg = idev->msg_queue; in mchp_corei2c_next_msg()
258 idev->restart_needed = next_msg->flags & I2C_M_RD; in mchp_corei2c_next_msg()
260 idev->restart_needed = false; in mchp_corei2c_next_msg()
263 idev->addr = i2c_8bit_addr_from_msg(this_msg); in mchp_corei2c_next_msg()
264 idev->msg_len = this_msg->len; in mchp_corei2c_next_msg()
265 idev->buf = this_msg->buf; in mchp_corei2c_next_msg()
267 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_next_msg()
269 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_next_msg()
271 idev->current_num++; in mchp_corei2c_next_msg()
274 static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev) in mchp_corei2c_handle_isr() argument
276 u32 status = idev->isr_status; in mchp_corei2c_handle_isr()
280 if (!idev->buf) in mchp_corei2c_handle_isr()
286 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
288 writeb(idev->addr, idev->base + CORE_I2C_DATA); in mchp_corei2c_handle_isr()
289 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
292 idev->msg_err = -EAGAIN; in mchp_corei2c_handle_isr()
297 if (idev->msg_len > 0) { in mchp_corei2c_handle_isr()
298 mchp_corei2c_fill_tx(idev); in mchp_corei2c_handle_isr()
300 if (idev->restart_needed) in mchp_corei2c_handle_isr()
309 idev->msg_err = -ENXIO; in mchp_corei2c_handle_isr()
313 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
314 if (idev->msg_len == 1u) { in mchp_corei2c_handle_isr()
316 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
319 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
321 if (idev->msg_len < 1u) in mchp_corei2c_handle_isr()
325 mchp_corei2c_empty_rx(idev); in mchp_corei2c_handle_isr()
328 mchp_corei2c_empty_rx(idev); in mchp_corei2c_handle_isr()
329 if (idev->msg_len == 0) in mchp_corei2c_handle_isr()
338 mchp_corei2c_stop(idev); in mchp_corei2c_handle_isr()
341 mchp_corei2c_next_msg(idev); in mchp_corei2c_handle_isr()
348 struct mchp_corei2c_dev *idev = _dev; in mchp_corei2c_isr() local
352 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_isr()
354 idev->isr_status = readb(idev->base + CORE_I2C_STATUS); in mchp_corei2c_isr()
355 ret = mchp_corei2c_handle_isr(idev); in mchp_corei2c_isr()
358 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_isr()
360 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_isr()
368 struct mchp_corei2c_dev *idev = i2c_get_adapdata(adap); in mchp_corei2c_xfer() local
373 mchp_corei2c_core_enable(idev); in mchp_corei2c_xfer()
379 idev->restart_needed = false; in mchp_corei2c_xfer()
380 idev->msg_queue = msgs; in mchp_corei2c_xfer()
381 idev->total_num = num; in mchp_corei2c_xfer()
382 idev->current_num = 0; in mchp_corei2c_xfer()
388 idev->addr = i2c_8bit_addr_from_msg(this_msg); in mchp_corei2c_xfer()
389 idev->msg_len = this_msg->len; in mchp_corei2c_xfer()
390 idev->buf = this_msg->buf; in mchp_corei2c_xfer()
391 idev->msg_err = 0; in mchp_corei2c_xfer()
393 if (idev->total_num > 1) { in mchp_corei2c_xfer()
396 idev->restart_needed = next_msg->flags & I2C_M_RD; in mchp_corei2c_xfer()
399 idev->current_num++; in mchp_corei2c_xfer()
400 idev->msg_queue++; in mchp_corei2c_xfer()
402 reinit_completion(&idev->msg_complete); in mchp_corei2c_xfer()
407 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_xfer()
409 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_xfer()
411 time_left = wait_for_completion_timeout(&idev->msg_complete, in mchp_corei2c_xfer()
412 idev->adapter.timeout); in mchp_corei2c_xfer()
416 if (idev->msg_err) in mchp_corei2c_xfer()
417 return idev->msg_err; in mchp_corei2c_xfer()
434 struct mchp_corei2c_dev *idev; in mchp_corei2c_probe() local
438 idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL); in mchp_corei2c_probe()
439 if (!idev) in mchp_corei2c_probe()
442 idev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in mchp_corei2c_probe()
443 if (IS_ERR(idev->base)) in mchp_corei2c_probe()
444 return PTR_ERR(idev->base); in mchp_corei2c_probe()
450 idev->i2c_clk = devm_clk_get(&pdev->dev, NULL); in mchp_corei2c_probe()
451 if (IS_ERR(idev->i2c_clk)) in mchp_corei2c_probe()
452 return dev_err_probe(&pdev->dev, PTR_ERR(idev->i2c_clk), in mchp_corei2c_probe()
455 idev->dev = &pdev->dev; in mchp_corei2c_probe()
456 init_completion(&idev->msg_complete); in mchp_corei2c_probe()
458 ret = device_property_read_u32(idev->dev, "clock-frequency", in mchp_corei2c_probe()
459 &idev->bus_clk_rate); in mchp_corei2c_probe()
460 if (ret || !idev->bus_clk_rate) { in mchp_corei2c_probe()
462 idev->bus_clk_rate = 100000; in mchp_corei2c_probe()
465 if (idev->bus_clk_rate > 400000) in mchp_corei2c_probe()
468 idev->bus_clk_rate); in mchp_corei2c_probe()
476 pdev->name, idev); in mchp_corei2c_probe()
481 ret = clk_prepare_enable(idev->i2c_clk); in mchp_corei2c_probe()
486 ret = mchp_corei2c_init(idev); in mchp_corei2c_probe()
488 clk_disable_unprepare(idev->i2c_clk); in mchp_corei2c_probe()
492 i2c_set_adapdata(&idev->adapter, idev); in mchp_corei2c_probe()
493 snprintf(idev->adapter.name, sizeof(idev->adapter.name), in mchp_corei2c_probe()
495 idev->adapter.owner = THIS_MODULE; in mchp_corei2c_probe()
496 idev->adapter.algo = &mchp_corei2c_algo; in mchp_corei2c_probe()
497 idev->adapter.dev.parent = &pdev->dev; in mchp_corei2c_probe()
498 idev->adapter.dev.of_node = pdev->dev.of_node; in mchp_corei2c_probe()
499 idev->adapter.timeout = HZ; in mchp_corei2c_probe()
501 platform_set_drvdata(pdev, idev); in mchp_corei2c_probe()
503 ret = i2c_add_adapter(&idev->adapter); in mchp_corei2c_probe()
505 clk_disable_unprepare(idev->i2c_clk); in mchp_corei2c_probe()
516 struct mchp_corei2c_dev *idev = platform_get_drvdata(pdev); in mchp_corei2c_remove() local
518 clk_disable_unprepare(idev->i2c_clk); in mchp_corei2c_remove()
519 i2c_del_adapter(&idev->adapter); in mchp_corei2c_remove()