Lines Matching refs:idev

119 static void mchp_corei2c_core_disable(struct mchp_corei2c_dev *idev)  in mchp_corei2c_core_disable()  argument
121 u8 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_disable()
124 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_disable()
127 static void mchp_corei2c_core_enable(struct mchp_corei2c_dev *idev) in mchp_corei2c_core_enable() argument
129 u8 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_enable()
132 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_core_enable()
135 static void mchp_corei2c_reset(struct mchp_corei2c_dev *idev) in mchp_corei2c_reset() argument
137 mchp_corei2c_core_disable(idev); in mchp_corei2c_reset()
138 mchp_corei2c_core_enable(idev); in mchp_corei2c_reset()
141 static inline void mchp_corei2c_stop(struct mchp_corei2c_dev *idev) in mchp_corei2c_stop() argument
143 u8 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_stop()
146 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_stop()
150 struct mchp_corei2c_dev *idev) in mchp_corei2c_set_divisor() argument
173 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_set_divisor()
176 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_set_divisor()
178 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_set_divisor()
185 static int mchp_corei2c_init(struct mchp_corei2c_dev *idev) in mchp_corei2c_init() argument
187 u32 clk_rate = clk_get_rate(idev->i2c_clk); in mchp_corei2c_init()
188 u32 divisor = clk_rate / idev->bus_clk_rate; in mchp_corei2c_init()
191 ret = mchp_corei2c_set_divisor(divisor, idev); in mchp_corei2c_init()
195 mchp_corei2c_reset(idev); in mchp_corei2c_init()
200 static void mchp_corei2c_empty_rx(struct mchp_corei2c_dev *idev) in mchp_corei2c_empty_rx() argument
204 if (idev->msg_len > 0) { in mchp_corei2c_empty_rx()
205 *idev->buf++ = readb(idev->base + CORE_I2C_DATA); in mchp_corei2c_empty_rx()
206 idev->msg_len--; in mchp_corei2c_empty_rx()
209 if (idev->msg_len <= 1) { in mchp_corei2c_empty_rx()
210 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_empty_rx()
212 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_empty_rx()
216 static int mchp_corei2c_fill_tx(struct mchp_corei2c_dev *idev) in mchp_corei2c_fill_tx() argument
218 if (idev->msg_len > 0) in mchp_corei2c_fill_tx()
219 writeb(*idev->buf++, idev->base + CORE_I2C_DATA); in mchp_corei2c_fill_tx()
220 idev->msg_len--; in mchp_corei2c_fill_tx()
225 static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev) in mchp_corei2c_handle_isr() argument
227 u32 status = idev->isr_status; in mchp_corei2c_handle_isr()
231 if (!idev->buf) in mchp_corei2c_handle_isr()
237 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
239 writeb(idev->addr, idev->base + CORE_I2C_DATA); in mchp_corei2c_handle_isr()
240 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
241 if (idev->msg_len == 0) in mchp_corei2c_handle_isr()
245 idev->msg_err = -EAGAIN; in mchp_corei2c_handle_isr()
250 if (idev->msg_len > 0) in mchp_corei2c_handle_isr()
251 mchp_corei2c_fill_tx(idev); in mchp_corei2c_handle_isr()
258 idev->msg_err = -ENXIO; in mchp_corei2c_handle_isr()
262 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
263 if (idev->msg_len == 1u) { in mchp_corei2c_handle_isr()
265 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
268 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_handle_isr()
270 if (idev->msg_len < 1u) in mchp_corei2c_handle_isr()
274 mchp_corei2c_empty_rx(idev); in mchp_corei2c_handle_isr()
277 mchp_corei2c_empty_rx(idev); in mchp_corei2c_handle_isr()
278 if (idev->msg_len == 0) in mchp_corei2c_handle_isr()
287 mchp_corei2c_stop(idev); in mchp_corei2c_handle_isr()
290 complete(&idev->msg_complete); in mchp_corei2c_handle_isr()
297 struct mchp_corei2c_dev *idev = _dev; in mchp_corei2c_isr() local
301 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_isr()
303 idev->isr_status = readb(idev->base + CORE_I2C_STATUS); in mchp_corei2c_isr()
304 ret = mchp_corei2c_handle_isr(idev); in mchp_corei2c_isr()
307 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_isr()
309 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_isr()
314 static int mchp_corei2c_xfer_msg(struct mchp_corei2c_dev *idev, in mchp_corei2c_xfer_msg() argument
320 idev->addr = i2c_8bit_addr_from_msg(msg); in mchp_corei2c_xfer_msg()
321 idev->msg_len = msg->len; in mchp_corei2c_xfer_msg()
322 idev->buf = msg->buf; in mchp_corei2c_xfer_msg()
323 idev->msg_err = 0; in mchp_corei2c_xfer_msg()
325 reinit_completion(&idev->msg_complete); in mchp_corei2c_xfer_msg()
327 mchp_corei2c_core_enable(idev); in mchp_corei2c_xfer_msg()
329 ctrl = readb(idev->base + CORE_I2C_CTRL); in mchp_corei2c_xfer_msg()
331 writeb(ctrl, idev->base + CORE_I2C_CTRL); in mchp_corei2c_xfer_msg()
333 time_left = wait_for_completion_timeout(&idev->msg_complete, in mchp_corei2c_xfer_msg()
334 idev->adapter.timeout); in mchp_corei2c_xfer_msg()
338 return idev->msg_err; in mchp_corei2c_xfer_msg()
344 struct mchp_corei2c_dev *idev = i2c_get_adapdata(adap); in mchp_corei2c_xfer() local
348 ret = mchp_corei2c_xfer_msg(idev, msgs++); in mchp_corei2c_xfer()
368 struct mchp_corei2c_dev *idev; in mchp_corei2c_probe() local
372 idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL); in mchp_corei2c_probe()
373 if (!idev) in mchp_corei2c_probe()
376 idev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in mchp_corei2c_probe()
377 if (IS_ERR(idev->base)) in mchp_corei2c_probe()
378 return PTR_ERR(idev->base); in mchp_corei2c_probe()
385 idev->i2c_clk = devm_clk_get(&pdev->dev, NULL); in mchp_corei2c_probe()
386 if (IS_ERR(idev->i2c_clk)) in mchp_corei2c_probe()
387 return dev_err_probe(&pdev->dev, PTR_ERR(idev->i2c_clk), in mchp_corei2c_probe()
390 idev->dev = &pdev->dev; in mchp_corei2c_probe()
391 init_completion(&idev->msg_complete); in mchp_corei2c_probe()
393 ret = device_property_read_u32(idev->dev, "clock-frequency", in mchp_corei2c_probe()
394 &idev->bus_clk_rate); in mchp_corei2c_probe()
395 if (ret || !idev->bus_clk_rate) { in mchp_corei2c_probe()
397 idev->bus_clk_rate = 100000; in mchp_corei2c_probe()
400 if (idev->bus_clk_rate > 400000) in mchp_corei2c_probe()
403 idev->bus_clk_rate); in mchp_corei2c_probe()
411 pdev->name, idev); in mchp_corei2c_probe()
416 ret = clk_prepare_enable(idev->i2c_clk); in mchp_corei2c_probe()
421 ret = mchp_corei2c_init(idev); in mchp_corei2c_probe()
423 clk_disable_unprepare(idev->i2c_clk); in mchp_corei2c_probe()
427 i2c_set_adapdata(&idev->adapter, idev); in mchp_corei2c_probe()
428 snprintf(idev->adapter.name, sizeof(idev->adapter.name), in mchp_corei2c_probe()
430 idev->adapter.owner = THIS_MODULE; in mchp_corei2c_probe()
431 idev->adapter.algo = &mchp_corei2c_algo; in mchp_corei2c_probe()
432 idev->adapter.dev.parent = &pdev->dev; in mchp_corei2c_probe()
433 idev->adapter.dev.of_node = pdev->dev.of_node; in mchp_corei2c_probe()
434 idev->adapter.timeout = HZ; in mchp_corei2c_probe()
436 platform_set_drvdata(pdev, idev); in mchp_corei2c_probe()
438 ret = i2c_add_adapter(&idev->adapter); in mchp_corei2c_probe()
440 clk_disable_unprepare(idev->i2c_clk); in mchp_corei2c_probe()
451 struct mchp_corei2c_dev *idev = platform_get_drvdata(pdev); in mchp_corei2c_remove() local
453 clk_disable_unprepare(idev->i2c_clk); in mchp_corei2c_remove()
454 i2c_del_adapter(&idev->adapter); in mchp_corei2c_remove()