Lines Matching refs:dev

214 static int flush_i2c_fifo(struct nmk_i2c_dev *dev)  in flush_i2c_fifo()  argument
227 writel((I2C_CR_FTX | I2C_CR_FRX), dev->virtbase + I2C_CR); in flush_i2c_fifo()
230 timeout = jiffies + dev->adap.timeout; in flush_i2c_fifo()
233 if ((readl(dev->virtbase + I2C_CR) & in flush_i2c_fifo()
239 dev_err(&dev->adev->dev, in flush_i2c_fifo()
250 static void disable_all_interrupts(struct nmk_i2c_dev *dev) in disable_all_interrupts() argument
253 writel(mask, dev->virtbase + I2C_IMSCR); in disable_all_interrupts()
260 static void clear_all_interrupts(struct nmk_i2c_dev *dev) in clear_all_interrupts() argument
264 writel(mask, dev->virtbase + I2C_ICR); in clear_all_interrupts()
271 static int init_hw(struct nmk_i2c_dev *dev) in init_hw() argument
275 stat = flush_i2c_fifo(dev); in init_hw()
280 i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE); in init_hw()
282 disable_all_interrupts(dev); in init_hw()
284 clear_all_interrupts(dev); in init_hw()
286 dev->cli.operation = I2C_NO_OPERATION; in init_hw()
300 static u32 load_i2c_mcr_reg(struct nmk_i2c_dev *dev, u16 flags) in load_i2c_mcr_reg() argument
305 mcr |= GEN_MASK(dev->cli.slave_adr, I2C_MCR_A7, 1); in load_i2c_mcr_reg()
316 slave_adr_3msb_bits = (dev->cli.slave_adr >> 7) & 0x7; in load_i2c_mcr_reg()
328 if (dev->cli.operation == I2C_WRITE) in load_i2c_mcr_reg()
334 if (dev->stop) in load_i2c_mcr_reg()
339 mcr |= GEN_MASK(dev->cli.count, I2C_MCR_LENGTH, 15); in load_i2c_mcr_reg()
348 static void setup_i2c_controller(struct nmk_i2c_dev *dev) in setup_i2c_controller() argument
355 writel(0x0, dev->virtbase + I2C_CR); in setup_i2c_controller()
356 writel(0x0, dev->virtbase + I2C_HSMCR); in setup_i2c_controller()
357 writel(0x0, dev->virtbase + I2C_TFTR); in setup_i2c_controller()
358 writel(0x0, dev->virtbase + I2C_RFTR); in setup_i2c_controller()
359 writel(0x0, dev->virtbase + I2C_DMAR); in setup_i2c_controller()
361 i2c_clk = clk_get_rate(dev->clk); in setup_i2c_controller()
376 switch (dev->sm) { in setup_i2c_controller()
391 dev_dbg(&dev->adev->dev, "calculated SLSU = %04x\n", slsu); in setup_i2c_controller()
392 writel(slsu << 16, dev->virtbase + I2C_SCR); in setup_i2c_controller()
399 div = (dev->clk_freq > I2C_MAX_STANDARD_MODE_FREQ) ? 3 : 2; in setup_i2c_controller()
409 brcr2 = (i2c_clk/(dev->clk_freq * div)) & 0xffff; in setup_i2c_controller()
412 writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR); in setup_i2c_controller()
420 if (dev->sm > I2C_FREQ_MODE_FAST) { in setup_i2c_controller()
421 dev_err(&dev->adev->dev, in setup_i2c_controller()
424 writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR); in setup_i2c_controller()
426 dev->virtbase + I2C_CR); in setup_i2c_controller()
428 writel(dev->sm << 4, dev->virtbase + I2C_CR); in setup_i2c_controller()
431 writel(dev->tft, dev->virtbase + I2C_TFTR); in setup_i2c_controller()
432 writel(dev->rft, dev->virtbase + I2C_RFTR); in setup_i2c_controller()
444 static int read_i2c(struct nmk_i2c_dev *dev, u16 flags) in read_i2c() argument
450 mcr = load_i2c_mcr_reg(dev, flags); in read_i2c()
451 writel(mcr, dev->virtbase + I2C_MCR); in read_i2c()
454 writel(readl(dev->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR, in read_i2c()
455 dev->virtbase + I2C_CR); in read_i2c()
458 i2c_set_bit(dev->virtbase + I2C_CR, I2C_CR_PE); in read_i2c()
460 init_completion(&dev->xfer_complete); in read_i2c()
466 if (dev->stop || !dev->vendor->has_mtdws) in read_i2c()
473 writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask, in read_i2c()
474 dev->virtbase + I2C_IMSCR); in read_i2c()
477 &dev->xfer_complete, dev->adap.timeout); in read_i2c()
481 dev_err(&dev->adev->dev, "read from slave 0x%x timed out\n", in read_i2c()
482 dev->cli.slave_adr); in read_i2c()
488 static void fill_tx_fifo(struct nmk_i2c_dev *dev, int no_bytes) in fill_tx_fifo() argument
494 (dev->cli.count != 0); in fill_tx_fifo()
497 writeb(*dev->cli.buffer, in fill_tx_fifo()
498 dev->virtbase + I2C_TFR); in fill_tx_fifo()
499 dev->cli.buffer++; in fill_tx_fifo()
500 dev->cli.count--; in fill_tx_fifo()
501 dev->cli.xfer_bytes++; in fill_tx_fifo()
513 static int write_i2c(struct nmk_i2c_dev *dev, u16 flags) in write_i2c() argument
519 mcr = load_i2c_mcr_reg(dev, flags); in write_i2c()
521 writel(mcr, dev->virtbase + I2C_MCR); in write_i2c()
524 writel(readl(dev->virtbase + I2C_CR) | DEFAULT_I2C_REG_CR, in write_i2c()
525 dev->virtbase + I2C_CR); in write_i2c()
528 i2c_set_bit(dev->virtbase + I2C_CR, I2C_CR_PE); in write_i2c()
530 init_completion(&dev->xfer_complete); in write_i2c()
536 fill_tx_fifo(dev, MAX_I2C_FIFO_THRESHOLD); in write_i2c()
538 if (dev->cli.count != 0) in write_i2c()
546 if (dev->stop || !dev->vendor->has_mtdws) in write_i2c()
553 writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask, in write_i2c()
554 dev->virtbase + I2C_IMSCR); in write_i2c()
557 &dev->xfer_complete, dev->adap.timeout); in write_i2c()
561 dev_err(&dev->adev->dev, "write to slave 0x%x timed out\n", in write_i2c()
562 dev->cli.slave_adr); in write_i2c()
574 static int nmk_i2c_xfer_one(struct nmk_i2c_dev *dev, u16 flags) in nmk_i2c_xfer_one() argument
580 dev->cli.operation = I2C_READ; in nmk_i2c_xfer_one()
581 status = read_i2c(dev, flags); in nmk_i2c_xfer_one()
584 dev->cli.operation = I2C_WRITE; in nmk_i2c_xfer_one()
585 status = write_i2c(dev, flags); in nmk_i2c_xfer_one()
588 if (status || (dev->result)) { in nmk_i2c_xfer_one()
592 i2c_sr = readl(dev->virtbase + I2C_SR); in nmk_i2c_xfer_one()
600 dev_err(&dev->adev->dev, "%s\n", in nmk_i2c_xfer_one()
606 (void) init_hw(dev); in nmk_i2c_xfer_one()
608 status = status ? status : dev->result; in nmk_i2c_xfer_one()
666 struct nmk_i2c_dev *dev = i2c_get_adapdata(i2c_adap); in nmk_i2c_xfer() local
669 pm_runtime_get_sync(&dev->adev->dev); in nmk_i2c_xfer()
674 setup_i2c_controller(dev); in nmk_i2c_xfer()
677 dev->cli.slave_adr = msgs[i].addr; in nmk_i2c_xfer()
678 dev->cli.buffer = msgs[i].buf; in nmk_i2c_xfer()
679 dev->cli.count = msgs[i].len; in nmk_i2c_xfer()
680 dev->stop = (i < (num_msgs - 1)) ? 0 : 1; in nmk_i2c_xfer()
681 dev->result = 0; in nmk_i2c_xfer()
683 status = nmk_i2c_xfer_one(dev, msgs[i].flags); in nmk_i2c_xfer()
691 pm_runtime_put_sync(&dev->adev->dev); in nmk_i2c_xfer()
705 static int disable_interrupts(struct nmk_i2c_dev *dev, u32 irq) in disable_interrupts() argument
708 writel(readl(dev->virtbase + I2C_IMSCR) & ~(I2C_CLEAR_ALL_INTS & irq), in disable_interrupts()
709 dev->virtbase + I2C_IMSCR); in disable_interrupts()
726 struct nmk_i2c_dev *dev = arg; in i2c_irq_handler() local
732 tft = readl(dev->virtbase + I2C_TFTR); in i2c_irq_handler()
733 rft = readl(dev->virtbase + I2C_RFTR); in i2c_irq_handler()
736 misr = readl(dev->virtbase + I2C_MISR); in i2c_irq_handler()
744 if (dev->cli.operation == I2C_READ) { in i2c_irq_handler()
749 disable_interrupts(dev, I2C_IT_TXFNE); in i2c_irq_handler()
751 fill_tx_fifo(dev, (MAX_I2C_FIFO_THRESHOLD - tft)); in i2c_irq_handler()
756 if (dev->cli.count == 0) in i2c_irq_handler()
757 disable_interrupts(dev, I2C_IT_TXFNE); in i2c_irq_handler()
771 *dev->cli.buffer = readb(dev->virtbase + I2C_RFR); in i2c_irq_handler()
772 dev->cli.buffer++; in i2c_irq_handler()
774 dev->cli.count -= rft; in i2c_irq_handler()
775 dev->cli.xfer_bytes += rft; in i2c_irq_handler()
781 *dev->cli.buffer = readb(dev->virtbase + I2C_RFR); in i2c_irq_handler()
782 dev->cli.buffer++; in i2c_irq_handler()
784 dev->cli.count -= MAX_I2C_FIFO_THRESHOLD; in i2c_irq_handler()
785 dev->cli.xfer_bytes += MAX_I2C_FIFO_THRESHOLD; in i2c_irq_handler()
791 if (dev->cli.operation == I2C_READ) { in i2c_irq_handler()
792 while (!(readl(dev->virtbase + I2C_RISR) in i2c_irq_handler()
794 if (dev->cli.count == 0) in i2c_irq_handler()
796 *dev->cli.buffer = in i2c_irq_handler()
797 readb(dev->virtbase + I2C_RFR); in i2c_irq_handler()
798 dev->cli.buffer++; in i2c_irq_handler()
799 dev->cli.count--; in i2c_irq_handler()
800 dev->cli.xfer_bytes++; in i2c_irq_handler()
804 disable_all_interrupts(dev); in i2c_irq_handler()
805 clear_all_interrupts(dev); in i2c_irq_handler()
807 if (dev->cli.count) { in i2c_irq_handler()
808 dev->result = -EIO; in i2c_irq_handler()
809 dev_err(&dev->adev->dev, in i2c_irq_handler()
811 dev->cli.count); in i2c_irq_handler()
812 (void) init_hw(dev); in i2c_irq_handler()
814 complete(&dev->xfer_complete); in i2c_irq_handler()
820 dev->result = -EIO; in i2c_irq_handler()
821 (void) init_hw(dev); in i2c_irq_handler()
823 i2c_set_bit(dev->virtbase + I2C_ICR, I2C_IT_MAL); in i2c_irq_handler()
824 complete(&dev->xfer_complete); in i2c_irq_handler()
834 dev->result = -EIO; in i2c_irq_handler()
836 if (((readl(dev->virtbase + I2C_SR) >> 2) & 0x3) == I2C_ABORT) in i2c_irq_handler()
837 (void) init_hw(dev); in i2c_irq_handler()
839 i2c_set_bit(dev->virtbase + I2C_ICR, I2C_IT_BERR); in i2c_irq_handler()
840 complete(&dev->xfer_complete); in i2c_irq_handler()
850 dev->result = -EIO; in i2c_irq_handler()
851 (void) init_hw(dev); in i2c_irq_handler()
853 dev_err(&dev->adev->dev, "Tx Fifo Over run\n"); in i2c_irq_handler()
854 complete(&dev->xfer_complete); in i2c_irq_handler()
866 dev_err(&dev->adev->dev, "unhandled Interrupt\n"); in i2c_irq_handler()
869 dev_err(&dev->adev->dev, "spurious Interrupt..\n"); in i2c_irq_handler()
876 static int nmk_i2c_suspend_late(struct device *dev) in nmk_i2c_suspend_late() argument
880 ret = pm_runtime_force_suspend(dev); in nmk_i2c_suspend_late()
884 pinctrl_pm_select_sleep_state(dev); in nmk_i2c_suspend_late()
888 static int nmk_i2c_resume_early(struct device *dev) in nmk_i2c_resume_early() argument
890 return pm_runtime_force_resume(dev); in nmk_i2c_resume_early()
893 static int nmk_i2c_runtime_suspend(struct device *dev) in nmk_i2c_runtime_suspend() argument
895 struct amba_device *adev = to_amba_device(dev); in nmk_i2c_runtime_suspend()
899 pinctrl_pm_select_idle_state(dev); in nmk_i2c_runtime_suspend()
903 static int nmk_i2c_runtime_resume(struct device *dev) in nmk_i2c_runtime_resume() argument
905 struct amba_device *adev = to_amba_device(dev); in nmk_i2c_runtime_resume()
911 dev_err(dev, "can't prepare_enable clock\n"); in nmk_i2c_runtime_resume()
915 pinctrl_pm_select_default_state(dev); in nmk_i2c_runtime_resume()
920 pinctrl_pm_select_idle_state(dev); in nmk_i2c_runtime_resume()
961 struct device_node *np = adev->dev.of_node; in nmk_i2c_probe()
962 struct nmk_i2c_dev *dev; in nmk_i2c_probe() local
967 dev = devm_kzalloc(&adev->dev, sizeof(*dev), GFP_KERNEL); in nmk_i2c_probe()
968 if (!dev) in nmk_i2c_probe()
971 dev->vendor = vendor; in nmk_i2c_probe()
972 dev->adev = adev; in nmk_i2c_probe()
973 nmk_i2c_of_probe(np, dev); in nmk_i2c_probe()
975 if (dev->tft > max_fifo_threshold) { in nmk_i2c_probe()
976 dev_warn(&adev->dev, "requested TX FIFO threshold %u, adjusted down to %u\n", in nmk_i2c_probe()
977 dev->tft, max_fifo_threshold); in nmk_i2c_probe()
978 dev->tft = max_fifo_threshold; in nmk_i2c_probe()
981 if (dev->rft > max_fifo_threshold) { in nmk_i2c_probe()
982 dev_warn(&adev->dev, "requested RX FIFO threshold %u, adjusted down to %u\n", in nmk_i2c_probe()
983 dev->rft, max_fifo_threshold); in nmk_i2c_probe()
984 dev->rft = max_fifo_threshold; in nmk_i2c_probe()
987 amba_set_drvdata(adev, dev); in nmk_i2c_probe()
989 dev->virtbase = devm_ioremap(&adev->dev, adev->res.start, in nmk_i2c_probe()
991 if (!dev->virtbase) in nmk_i2c_probe()
994 dev->irq = adev->irq[0]; in nmk_i2c_probe()
995 ret = devm_request_irq(&adev->dev, dev->irq, i2c_irq_handler, 0, in nmk_i2c_probe()
996 DRIVER_NAME, dev); in nmk_i2c_probe()
998 return dev_err_probe(&adev->dev, ret, in nmk_i2c_probe()
999 "cannot claim the irq %d\n", dev->irq); in nmk_i2c_probe()
1001 dev->clk = devm_clk_get_enabled(&adev->dev, NULL); in nmk_i2c_probe()
1002 if (IS_ERR(dev->clk)) in nmk_i2c_probe()
1003 return dev_err_probe(&adev->dev, PTR_ERR(dev->clk), in nmk_i2c_probe()
1006 init_hw(dev); in nmk_i2c_probe()
1008 adap = &dev->adap; in nmk_i2c_probe()
1009 adap->dev.of_node = np; in nmk_i2c_probe()
1010 adap->dev.parent = &adev->dev; in nmk_i2c_probe()
1014 adap->timeout = msecs_to_jiffies(dev->timeout); in nmk_i2c_probe()
1018 i2c_set_adapdata(adap, dev); in nmk_i2c_probe()
1020 dev_info(&adev->dev, in nmk_i2c_probe()
1022 adap->name, dev->virtbase); in nmk_i2c_probe()
1028 pm_runtime_put(&adev->dev); in nmk_i2c_probe()
1035 struct nmk_i2c_dev *dev = amba_get_drvdata(adev); in nmk_i2c_remove() local
1037 i2c_del_adapter(&dev->adap); in nmk_i2c_remove()
1038 flush_i2c_fifo(dev); in nmk_i2c_remove()
1039 disable_all_interrupts(dev); in nmk_i2c_remove()
1040 clear_all_interrupts(dev); in nmk_i2c_remove()
1042 i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE); in nmk_i2c_remove()