Lines Matching refs:idev

129 static void mchp_corei2c_core_disable(struct mchp_corei2c_dev *idev)
131 u8 ctrl = readb(idev->base + CORE_I2C_CTRL);
134 writeb(ctrl, idev->base + CORE_I2C_CTRL);
137 static void mchp_corei2c_core_enable(struct mchp_corei2c_dev *idev)
139 u8 ctrl = readb(idev->base + CORE_I2C_CTRL);
142 writeb(ctrl, idev->base + CORE_I2C_CTRL);
145 static void mchp_corei2c_reset(struct mchp_corei2c_dev *idev)
147 mchp_corei2c_core_disable(idev);
148 mchp_corei2c_core_enable(idev);
151 static inline void mchp_corei2c_stop(struct mchp_corei2c_dev *idev)
153 u8 ctrl = readb(idev->base + CORE_I2C_CTRL);
156 writeb(ctrl, idev->base + CORE_I2C_CTRL);
160 struct mchp_corei2c_dev *idev)
183 ctrl = readb(idev->base + CORE_I2C_CTRL);
186 writeb(ctrl, idev->base + CORE_I2C_CTRL);
188 ctrl = readb(idev->base + CORE_I2C_CTRL);
195 static int mchp_corei2c_init(struct mchp_corei2c_dev *idev)
197 u32 clk_rate = clk_get_rate(idev->i2c_clk);
198 u32 divisor = clk_rate / idev->bus_clk_rate;
201 ret = mchp_corei2c_set_divisor(divisor, idev);
205 mchp_corei2c_reset(idev);
210 static void mchp_corei2c_empty_rx(struct mchp_corei2c_dev *idev)
214 if (idev->msg_len > 0) {
215 *idev->buf++ = readb(idev->base + CORE_I2C_DATA);
216 idev->msg_len--;
219 if (idev->msg_len <= 1) {
220 ctrl = readb(idev->base + CORE_I2C_CTRL);
222 writeb(ctrl, idev->base + CORE_I2C_CTRL);
226 static int mchp_corei2c_fill_tx(struct mchp_corei2c_dev *idev)
228 if (idev->msg_len > 0)
229 writeb(*idev->buf++, idev->base + CORE_I2C_DATA);
230 idev->msg_len--;
235 static void mchp_corei2c_next_msg(struct mchp_corei2c_dev *idev)
240 if (idev->current_num >= idev->total_num) {
241 complete(&idev->msg_complete);
250 if (idev->msg_err) {
251 complete(&idev->msg_complete);
255 this_msg = idev->msg_queue++;
257 if (idev->current_num < (idev->total_num - 1)) {
258 struct i2c_msg *next_msg = idev->msg_queue;
260 idev->restart_needed = next_msg->flags & I2C_M_RD;
262 idev->restart_needed = false;
265 idev->addr = i2c_8bit_addr_from_msg(this_msg);
266 idev->msg_len = this_msg->len;
267 idev->buf = this_msg->buf;
269 ctrl = readb(idev->base + CORE_I2C_CTRL);
271 writeb(ctrl, idev->base + CORE_I2C_CTRL);
273 idev->current_num++;
276 static irqreturn_t mchp_corei2c_handle_isr(struct mchp_corei2c_dev *idev)
278 u32 status = idev->isr_status;
282 if (!idev->buf)
288 ctrl = readb(idev->base + CORE_I2C_CTRL);
290 writeb(idev->addr, idev->base + CORE_I2C_DATA);
291 writeb(ctrl, idev->base + CORE_I2C_CTRL);
294 idev->msg_err = -EAGAIN;
299 if (idev->msg_len > 0) {
300 mchp_corei2c_fill_tx(idev);
302 if (idev->restart_needed)
311 idev->msg_err = -ENXIO;
315 ctrl = readb(idev->base + CORE_I2C_CTRL);
316 if (idev->msg_len == 1u) {
318 writeb(ctrl, idev->base + CORE_I2C_CTRL);
321 writeb(ctrl, idev->base + CORE_I2C_CTRL);
323 if (idev->msg_len < 1u)
327 mchp_corei2c_empty_rx(idev);
330 mchp_corei2c_empty_rx(idev);
331 if (idev->msg_len == 0)
340 mchp_corei2c_stop(idev);
343 mchp_corei2c_next_msg(idev);
350 struct mchp_corei2c_dev *idev = _dev;
354 ctrl = readb(idev->base + CORE_I2C_CTRL);
356 idev->isr_status = readb(idev->base + CORE_I2C_STATUS);
357 ret = mchp_corei2c_handle_isr(idev);
360 ctrl = readb(idev->base + CORE_I2C_CTRL);
362 writeb(ctrl, idev->base + CORE_I2C_CTRL);
370 struct mchp_corei2c_dev *idev = i2c_get_adapdata(adap);
375 mchp_corei2c_core_enable(idev);
381 idev->restart_needed = false;
382 idev->msg_queue = msgs;
383 idev->total_num = num;
384 idev->current_num = 0;
390 idev->addr = i2c_8bit_addr_from_msg(this_msg);
391 idev->msg_len = this_msg->len;
392 idev->buf = this_msg->buf;
393 idev->msg_err = 0;
395 if (idev->total_num > 1) {
398 idev->restart_needed = next_msg->flags & I2C_M_RD;
401 idev->current_num++;
402 idev->msg_queue++;
404 reinit_completion(&idev->msg_complete);
409 ctrl = readb(idev->base + CORE_I2C_CTRL);
411 writeb(ctrl, idev->base + CORE_I2C_CTRL);
413 time_left = wait_for_completion_timeout(&idev->msg_complete,
414 idev->adapter.timeout);
418 if (idev->msg_err)
419 return idev->msg_err;
434 struct mchp_corei2c_dev *idev = i2c_get_adapdata(adap);
509 ret = mchp_corei2c_xfer(&idev->adapter, msgs, num_msgs);
540 struct mchp_corei2c_dev *idev;
544 idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL);
545 if (!idev)
548 idev->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
549 if (IS_ERR(idev->base))
550 return PTR_ERR(idev->base);
556 idev->i2c_clk = devm_clk_get(&pdev->dev, NULL);
557 if (IS_ERR(idev->i2c_clk))
558 return dev_err_probe(&pdev->dev, PTR_ERR(idev->i2c_clk),
561 idev->dev = &pdev->dev;
562 init_completion(&idev->msg_complete);
564 ret = device_property_read_u32(idev->dev, "clock-frequency",
565 &idev->bus_clk_rate);
566 if (ret || !idev->bus_clk_rate) {
568 idev->bus_clk_rate = 100000;
571 if (idev->bus_clk_rate > 400000)
574 idev->bus_clk_rate);
582 pdev->name, idev);
587 ret = clk_prepare_enable(idev->i2c_clk);
592 ret = mchp_corei2c_init(idev);
594 clk_disable_unprepare(idev->i2c_clk);
598 i2c_set_adapdata(&idev->adapter, idev);
599 snprintf(idev->adapter.name, sizeof(idev->adapter.name),
601 idev->adapter.owner = THIS_MODULE;
602 idev->adapter.algo = &mchp_corei2c_algo;
603 idev->adapter.dev.parent = &pdev->dev;
604 idev->adapter.dev.of_node = pdev->dev.of_node;
605 idev->adapter.timeout = HZ;
607 platform_set_drvdata(pdev, idev);
609 ret = i2c_add_adapter(&idev->adapter);
611 clk_disable_unprepare(idev->i2c_clk);
622 struct mchp_corei2c_dev *idev = platform_get_drvdata(pdev);
624 clk_disable_unprepare(idev->i2c_clk);
625 i2c_del_adapter(&idev->adapter);