Lines Matching refs:i2c
42 static int wmt_i2c_reset_hardware(struct viai2c *i2c) in wmt_i2c_reset_hardware() argument
46 err = clk_prepare_enable(i2c->clk); in wmt_i2c_reset_hardware()
48 return dev_err_probe(i2c->dev, err, "failed to enable clock\n"); in wmt_i2c_reset_hardware()
50 err = clk_set_rate(i2c->clk, 20000000); in wmt_i2c_reset_hardware()
52 clk_disable_unprepare(i2c->clk); in wmt_i2c_reset_hardware()
53 return dev_err_probe(i2c->dev, err, "failed to set clock = 20Mhz\n"); in wmt_i2c_reset_hardware()
56 writew(0, i2c->base + VIAI2C_REG_CR); in wmt_i2c_reset_hardware()
57 writew(MCR_APB_166M, i2c->base + VIAI2C_REG_MCR); in wmt_i2c_reset_hardware()
58 writew(VIAI2C_ISR_MASK_ALL, i2c->base + VIAI2C_REG_ISR); in wmt_i2c_reset_hardware()
59 writew(VIAI2C_IMR_ENABLE_ALL, i2c->base + VIAI2C_REG_IMR); in wmt_i2c_reset_hardware()
60 writew(VIAI2C_CR_ENABLE, i2c->base + VIAI2C_REG_CR); in wmt_i2c_reset_hardware()
61 readw(i2c->base + VIAI2C_REG_CSR); /* read clear */ in wmt_i2c_reset_hardware()
62 writew(VIAI2C_ISR_MASK_ALL, i2c->base + VIAI2C_REG_ISR); in wmt_i2c_reset_hardware()
64 if (i2c->tcr == VIAI2C_TCR_FAST) in wmt_i2c_reset_hardware()
65 writew(SCL_TIMEOUT(128) | TR_HS, i2c->base + VIAI2C_REG_TR); in wmt_i2c_reset_hardware()
67 writew(SCL_TIMEOUT(128) | TR_STD, i2c->base + VIAI2C_REG_TR); in wmt_i2c_reset_hardware()
74 struct viai2c *i2c = data; in wmt_i2c_isr() local
78 status = readw(i2c->base + VIAI2C_REG_ISR); in wmt_i2c_isr()
79 writew(status, i2c->base + VIAI2C_REG_ISR); in wmt_i2c_isr()
81 i2c->ret = 0; in wmt_i2c_isr()
83 i2c->ret = -EIO; in wmt_i2c_isr()
86 i2c->ret = -ETIMEDOUT; in wmt_i2c_isr()
88 if (!i2c->ret) in wmt_i2c_isr()
89 i2c->ret = viai2c_irq_xfer(i2c); in wmt_i2c_isr()
92 if (i2c->ret) in wmt_i2c_isr()
93 complete(&i2c->complete); in wmt_i2c_isr()
101 struct viai2c *i2c; in wmt_i2c_probe() local
106 err = viai2c_init(pdev, &i2c, VIAI2C_PLAT_WMT); in wmt_i2c_probe()
110 i2c->irq = platform_get_irq(pdev, 0); in wmt_i2c_probe()
111 if (i2c->irq < 0) in wmt_i2c_probe()
112 return i2c->irq; in wmt_i2c_probe()
114 err = devm_request_irq(&pdev->dev, i2c->irq, wmt_i2c_isr, in wmt_i2c_probe()
115 0, pdev->name, i2c); in wmt_i2c_probe()
118 "failed to request irq %i\n", i2c->irq); in wmt_i2c_probe()
120 i2c->clk = of_clk_get(np, 0); in wmt_i2c_probe()
121 if (IS_ERR(i2c->clk)) in wmt_i2c_probe()
122 return dev_err_probe(&pdev->dev, PTR_ERR(i2c->clk), in wmt_i2c_probe()
127 i2c->tcr = VIAI2C_TCR_FAST; in wmt_i2c_probe()
129 adap = &i2c->adapter; in wmt_i2c_probe()
130 i2c_set_adapdata(adap, i2c); in wmt_i2c_probe()
137 err = wmt_i2c_reset_hardware(i2c); in wmt_i2c_probe()
144 clk_disable_unprepare(i2c->clk); in wmt_i2c_probe()
151 struct viai2c *i2c = platform_get_drvdata(pdev); in wmt_i2c_remove() local
154 writew(0, i2c->base + VIAI2C_REG_IMR); in wmt_i2c_remove()
155 clk_disable_unprepare(i2c->clk); in wmt_i2c_remove()
156 i2c_del_adapter(&i2c->adapter); in wmt_i2c_remove()