Lines Matching refs:dev
169 static int stu300_init_hw(struct stu300_dev *dev);
190 static void stu300_irq_enable(struct stu300_dev *dev) in stu300_irq_enable() argument
193 val = stu300_r8(dev->virtbase + I2C_CR); in stu300_irq_enable()
196 stu300_wr8(val, dev->virtbase + I2C_CR); in stu300_irq_enable()
197 stu300_wr8(val, dev->virtbase + I2C_CR); in stu300_irq_enable()
200 static void stu300_irq_disable(struct stu300_dev *dev) in stu300_irq_disable() argument
203 val = stu300_r8(dev->virtbase + I2C_CR); in stu300_irq_disable()
206 stu300_wr8(val, dev->virtbase + I2C_CR); in stu300_irq_disable()
207 stu300_wr8(val, dev->virtbase + I2C_CR); in stu300_irq_disable()
223 static int stu300_event_occurred(struct stu300_dev *dev, in stu300_event_occurred() argument
229 status1 = stu300_r8(dev->virtbase + I2C_SR1); in stu300_event_occurred()
235 status2 = stu300_r8(dev->virtbase + I2C_SR2); in stu300_event_occurred()
238 stu300_irq_disable(dev); in stu300_event_occurred()
242 dev->cmd_err = STU300_ERROR_ACKNOWLEDGE_FAILURE; in stu300_event_occurred()
245 dev->cmd_err = STU300_ERROR_BUS_ERROR; in stu300_event_occurred()
248 dev->cmd_err = STU300_ERROR_ARBITRATION_LOST; in stu300_event_occurred()
292 dev->cmd_err = STU300_ERROR_UNKNOWN; in stu300_event_occurred()
293 dev_err(&dev->pdev->dev, in stu300_event_occurred()
301 struct stu300_dev *dev = data; in stu300_irh() local
305 clk_enable(dev->clk); in stu300_irh()
308 spin_lock(&dev->cmd_issue_lock); in stu300_irh()
310 res = stu300_event_occurred(dev, dev->cmd_event); in stu300_irh()
311 if (res || dev->cmd_err != STU300_ERROR_NONE) in stu300_irh()
312 complete(&dev->cmd_complete); in stu300_irh()
314 spin_unlock(&dev->cmd_issue_lock); in stu300_irh()
316 clk_disable(dev->clk); in stu300_irh()
325 static int stu300_start_and_await_event(struct stu300_dev *dev, in stu300_start_and_await_event() argument
338 spin_lock_irq(&dev->cmd_issue_lock); in stu300_start_and_await_event()
339 init_completion(&dev->cmd_complete); in stu300_start_and_await_event()
340 dev->cmd_err = STU300_ERROR_NONE; in stu300_start_and_await_event()
341 dev->cmd_event = mr_event; in stu300_start_and_await_event()
342 spin_unlock_irq(&dev->cmd_issue_lock); in stu300_start_and_await_event()
346 stu300_wr8(cr_value, dev->virtbase + I2C_CR); in stu300_start_and_await_event()
347 ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, in stu300_start_and_await_event()
350 dev_err(&dev->pdev->dev, in stu300_start_and_await_event()
357 dev_err(&dev->pdev->dev, "controller timed out " in stu300_start_and_await_event()
359 (void) stu300_init_hw(dev); in stu300_start_and_await_event()
363 if (dev->cmd_err != STU300_ERROR_NONE) { in stu300_start_and_await_event()
364 dev_err(&dev->pdev->dev, "controller (start) " in stu300_start_and_await_event()
366 dev->cmd_err, mr_event); in stu300_start_and_await_event()
367 (void) stu300_init_hw(dev); in stu300_start_and_await_event()
378 static int stu300_await_event(struct stu300_dev *dev, in stu300_await_event() argument
385 dev_err(&dev->pdev->dev, "irqs are disabled on this " in stu300_await_event()
391 spin_lock_irq(&dev->cmd_issue_lock); in stu300_await_event()
392 dev->cmd_err = STU300_ERROR_NONE; in stu300_await_event()
393 dev->cmd_event = mr_event; in stu300_await_event()
395 init_completion(&dev->cmd_complete); in stu300_await_event()
398 stu300_irq_enable(dev); in stu300_await_event()
401 spin_unlock_irq(&dev->cmd_issue_lock); in stu300_await_event()
403 ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, in stu300_await_event()
406 dev_err(&dev->pdev->dev, in stu300_await_event()
414 dev_err(&dev->pdev->dev, "controller " in stu300_await_event()
417 (void) stu300_init_hw(dev); in stu300_await_event()
422 if (dev->cmd_err != STU300_ERROR_NONE) { in stu300_await_event()
424 dev_err(&dev->pdev->dev, "controller " in stu300_await_event()
426 "reinit hardware\n", dev->cmd_err, mr_event); in stu300_await_event()
427 (void) stu300_init_hw(dev); in stu300_await_event()
439 static int stu300_wait_while_busy(struct stu300_dev *dev) in stu300_wait_while_busy() argument
449 if ((stu300_r8(dev->virtbase + I2C_SR1) & in stu300_wait_while_busy()
455 dev_err(&dev->pdev->dev, "transaction timed out " in stu300_wait_while_busy()
459 dev_err(&dev->pdev->dev, "base address = " in stu300_wait_while_busy()
460 "0x%08x, reinit hardware\n", (u32) dev->virtbase); in stu300_wait_while_busy()
462 (void) stu300_init_hw(dev); in stu300_wait_while_busy()
465 dev_err(&dev->pdev->dev, "giving up after %d attempts " in stu300_wait_while_busy()
490 static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate) in stu300_set_clk() argument
502 dev_err(&dev->pdev->dev, "too %s clock rate requested " in stu300_set_clk()
508 dev->virtbase + I2C_OAR2); in stu300_set_clk()
510 dev_dbg(&dev->pdev->dev, "Clock rate %lu Hz, I2C bus speed %d Hz " in stu300_set_clk()
511 "virtbase %p\n", clkrate, dev->speed, dev->virtbase); in stu300_set_clk()
513 if (dev->speed > 100000) in stu300_set_clk()
515 val = ((clkrate/dev->speed) - 9)/3 + 1; in stu300_set_clk()
518 val = ((clkrate/dev->speed) - 7)/2 + 1; in stu300_set_clk()
522 dev_err(&dev->pdev->dev, "too low clock rate (%lu Hz).\n", in stu300_set_clk()
529 dev_err(&dev->pdev->dev, "too high clock rate (%lu Hz).\n", in stu300_set_clk()
534 if (dev->speed > 100000) { in stu300_set_clk()
537 dev->virtbase + I2C_CCR); in stu300_set_clk()
538 dev_dbg(&dev->pdev->dev, "set clock divider to 0x%08x, " in stu300_set_clk()
543 dev->virtbase + I2C_CCR); in stu300_set_clk()
544 dev_dbg(&dev->pdev->dev, "set clock divider to " in stu300_set_clk()
550 dev->virtbase + I2C_ECCR); in stu300_set_clk()
556 static int stu300_init_hw(struct stu300_dev *dev) in stu300_init_hw() argument
563 stu300_wr8(0x00, dev->virtbase + I2C_CR); in stu300_init_hw()
568 stu300_wr8(0x00, dev->virtbase + I2C_OAR1); in stu300_init_hw()
576 clkrate = clk_get_rate(dev->clk); in stu300_init_hw()
577 ret = stu300_set_clk(dev, clkrate); in stu300_init_hw()
586 dev->virtbase + I2C_CR); in stu300_init_hw()
588 dev->virtbase + I2C_CR); in stu300_init_hw()
590 dummy = stu300_r8(dev->virtbase + I2C_SR2); in stu300_init_hw()
591 dummy = stu300_r8(dev->virtbase + I2C_SR1); in stu300_init_hw()
599 static int stu300_send_address(struct stu300_dev *dev, in stu300_send_address() argument
616 dev_dbg(&dev->pdev->dev, "read resend\n"); in stu300_send_address()
618 dev_dbg(&dev->pdev->dev, "write resend\n"); in stu300_send_address()
619 stu300_wr8(val, dev->virtbase + I2C_DR); in stu300_send_address()
623 ret = stu300_await_event(dev, STU300_EVENT_9); in stu300_send_address()
630 stu300_wr8(val, dev->virtbase + I2C_DR); in stu300_send_address()
639 dev_dbg(&dev->pdev->dev, "await event 6\n"); in stu300_send_address()
640 ret = stu300_await_event(dev, STU300_EVENT_6); in stu300_send_address()
646 val = stu300_r8(dev->virtbase + I2C_CR); in stu300_send_address()
648 stu300_wr8(val, dev->virtbase + I2C_CR); in stu300_send_address()
661 struct stu300_dev *dev = i2c_get_adapdata(adap); in stu300_xfer_msg() local
663 clk_enable(dev->clk); in stu300_xfer_msg()
667 dev_dbg(&dev->pdev->dev, "I2C message to: 0x%04x, len: %d, " in stu300_xfer_msg()
686 dev_dbg(&dev->pdev->dev, "wait while busy\n"); in stu300_xfer_msg()
688 ret = stu300_wait_while_busy(dev); in stu300_xfer_msg()
693 dev_dbg(&dev->pdev->dev, "re-int hw\n"); in stu300_xfer_msg()
698 ret = stu300_init_hw(dev); in stu300_xfer_msg()
713 dev_dbg(&dev->pdev->dev, "send start event\n"); in stu300_xfer_msg()
714 ret = stu300_start_and_await_event(dev, cr, in stu300_xfer_msg()
719 dev_dbg(&dev->pdev->dev, "send address\n"); in stu300_xfer_msg()
723 ret = stu300_send_address(dev, msg, attempts != 0); in stu300_xfer_msg()
727 dev_dbg(&dev->pdev->dev, "failed sending address, " in stu300_xfer_msg()
729 attempts, dev->msg_index, dev->msg_len); in stu300_xfer_msg()
735 dev_dbg(&dev->pdev->dev, "managed to get address " in stu300_xfer_msg()
738 dev_dbg(&dev->pdev->dev, "I give up, tried %d times " in stu300_xfer_msg()
759 dev->virtbase + I2C_CR); in stu300_xfer_msg()
762 ret = stu300_await_event(dev, STU300_EVENT_7); in stu300_xfer_msg()
766 msg->buf[i] = (u8) stu300_r8(dev->virtbase + I2C_DR); in stu300_xfer_msg()
773 dev->virtbase + I2C_DR); in stu300_xfer_msg()
775 ret = stu300_await_event(dev, STU300_EVENT_8); in stu300_xfer_msg()
778 dev_err(&dev->pdev->dev, "error awaiting " in stu300_xfer_msg()
785 if (stu300_r8(dev->virtbase + I2C_SR2) & in stu300_xfer_msg()
787 dev_err(&dev->pdev->dev, "I2C payload " in stu300_xfer_msg()
797 stu300_wr8(val, dev->virtbase + I2C_CR); in stu300_xfer_msg()
802 ret = stu300_wait_while_busy(dev); in stu300_xfer_msg()
804 dev_err(&dev->pdev->dev, "timeout waiting for transfer " in stu300_xfer_msg()
810 val = stu300_r8(dev->virtbase + I2C_SR2); in stu300_xfer_msg()
811 val = stu300_r8(dev->virtbase + I2C_SR1); in stu300_xfer_msg()
816 stu300_wr8(0x00, dev->virtbase + I2C_CR); in stu300_xfer_msg()
817 clk_disable(dev->clk); in stu300_xfer_msg()
827 struct stu300_dev *dev = i2c_get_adapdata(adap); in stu300_xfer() local
828 dev->msg_len = num; in stu300_xfer()
838 dev->msg_index = i; in stu300_xfer()
864 struct stu300_dev *dev; in stu300_probe() local
870 dev = devm_kzalloc(&pdev->dev, sizeof(struct stu300_dev), GFP_KERNEL); in stu300_probe()
871 if (!dev) in stu300_probe()
875 dev->clk = devm_clk_get(&pdev->dev, NULL); in stu300_probe()
876 if (IS_ERR(dev->clk)) { in stu300_probe()
877 dev_err(&pdev->dev, "could not retrieve i2c bus clock\n"); in stu300_probe()
878 return PTR_ERR(dev->clk); in stu300_probe()
881 dev->pdev = pdev; in stu300_probe()
883 dev->virtbase = devm_ioremap_resource(&pdev->dev, res); in stu300_probe()
884 dev_dbg(&pdev->dev, "initialize bus device I2C%d on virtual " in stu300_probe()
885 "base %p\n", bus_nr, dev->virtbase); in stu300_probe()
886 if (IS_ERR(dev->virtbase)) in stu300_probe()
887 return PTR_ERR(dev->virtbase); in stu300_probe()
889 dev->irq = platform_get_irq(pdev, 0); in stu300_probe()
890 ret = devm_request_irq(&pdev->dev, dev->irq, stu300_irh, 0, NAME, dev); in stu300_probe()
894 dev->speed = scl_frequency; in stu300_probe()
896 clk_prepare_enable(dev->clk); in stu300_probe()
897 ret = stu300_init_hw(dev); in stu300_probe()
898 clk_disable(dev->clk); in stu300_probe()
900 dev_err(&dev->pdev->dev, "error initializing hardware.\n"); in stu300_probe()
905 spin_lock_init(&dev->cmd_issue_lock); in stu300_probe()
906 dev->cmd_event = STU300_EVENT_NONE; in stu300_probe()
907 dev->cmd_err = STU300_ERROR_NONE; in stu300_probe()
909 adap = &dev->adapter; in stu300_probe()
917 adap->dev.parent = &pdev->dev; in stu300_probe()
918 adap->dev.of_node = pdev->dev.of_node; in stu300_probe()
919 i2c_set_adapdata(adap, dev); in stu300_probe()
924 dev_err(&pdev->dev, "failure adding ST Micro DDC " in stu300_probe()
929 platform_set_drvdata(pdev, dev); in stu300_probe()
930 dev_info(&pdev->dev, "ST DDC I2C @ %p, irq %d\n", in stu300_probe()
931 dev->virtbase, dev->irq); in stu300_probe()
939 struct stu300_dev *dev = dev_get_drvdata(device); in stu300_suspend() local
942 stu300_wr8(0x00, dev->virtbase + I2C_CR); in stu300_suspend()
949 struct stu300_dev *dev = dev_get_drvdata(device); in stu300_resume() local
951 clk_enable(dev->clk); in stu300_resume()
952 ret = stu300_init_hw(dev); in stu300_resume()
953 clk_disable(dev->clk); in stu300_resume()
968 struct stu300_dev *dev = platform_get_drvdata(pdev); in stu300_remove() local
970 i2c_del_adapter(&dev->adapter); in stu300_remove()
972 stu300_wr8(0x00, dev->virtbase + I2C_CR); in stu300_remove()