Lines Matching refs:i2c_dev
93 static int wmt_i2c_wait_bus_not_busy(struct wmt_i2c_dev *i2c_dev) in wmt_i2c_wait_bus_not_busy() argument
98 while (!(readw(i2c_dev->base + REG_CSR) & CSR_READY_MASK)) { in wmt_i2c_wait_bus_not_busy()
100 dev_warn(i2c_dev->dev, "timeout waiting for bus ready\n"); in wmt_i2c_wait_bus_not_busy()
109 static int wmt_check_status(struct wmt_i2c_dev *i2c_dev) in wmt_check_status() argument
113 if (i2c_dev->cmd_status & ISR_NACK_ADDR) in wmt_check_status()
116 if (i2c_dev->cmd_status & ISR_SCL_TIMEOUT) in wmt_check_status()
125 struct wmt_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in wmt_i2c_write() local
132 ret = wmt_i2c_wait_bus_not_busy(i2c_dev); in wmt_i2c_write()
143 writew(0, i2c_dev->base + REG_CDR); in wmt_i2c_write()
145 writew(pmsg->buf[0] & 0xFF, i2c_dev->base + REG_CDR); in wmt_i2c_write()
149 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_write()
151 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_write()
153 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_write()
155 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_write()
158 reinit_completion(&i2c_dev->complete); in wmt_i2c_write()
160 if (i2c_dev->mode == I2C_MODE_STANDARD) in wmt_i2c_write()
167 writew(tcr_val, i2c_dev->base + REG_TCR); in wmt_i2c_write()
170 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_write()
172 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_write()
176 wait_result = wait_for_completion_timeout(&i2c_dev->complete, in wmt_i2c_write()
182 ret = wmt_check_status(i2c_dev); in wmt_i2c_write()
188 val = readw(i2c_dev->base + REG_CSR); in wmt_i2c_write()
190 dev_dbg(i2c_dev->dev, "write RCV NACK error\n"); in wmt_i2c_write()
196 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_write()
202 writew(CR_ENABLE, i2c_dev->base + REG_CR); in wmt_i2c_write()
204 writew(pmsg->buf[xfer_len] & 0xFF, i2c_dev->base + in wmt_i2c_write()
206 writew(CR_CPU_RDY | CR_ENABLE, i2c_dev->base + REG_CR); in wmt_i2c_write()
216 struct wmt_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in wmt_i2c_read() local
223 ret = wmt_i2c_wait_bus_not_busy(i2c_dev); in wmt_i2c_read()
228 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
230 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
232 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
234 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
237 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
239 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
243 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
245 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
248 reinit_completion(&i2c_dev->complete); in wmt_i2c_read()
250 if (i2c_dev->mode == I2C_MODE_STANDARD) in wmt_i2c_read()
257 writew(tcr_val, i2c_dev->base + REG_TCR); in wmt_i2c_read()
260 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
262 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
266 wait_result = wait_for_completion_timeout(&i2c_dev->complete, in wmt_i2c_read()
272 ret = wmt_check_status(i2c_dev); in wmt_i2c_read()
276 pmsg->buf[xfer_len] = readw(i2c_dev->base + REG_CDR) >> 8; in wmt_i2c_read()
280 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
282 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
284 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
286 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
326 struct wmt_i2c_dev *i2c_dev = data; in wmt_i2c_isr() local
329 i2c_dev->cmd_status = readw(i2c_dev->base + REG_ISR); in wmt_i2c_isr()
330 writew(i2c_dev->cmd_status, i2c_dev->base + REG_ISR); in wmt_i2c_isr()
332 complete(&i2c_dev->complete); in wmt_i2c_isr()
337 static int wmt_i2c_reset_hardware(struct wmt_i2c_dev *i2c_dev) in wmt_i2c_reset_hardware() argument
341 err = clk_prepare_enable(i2c_dev->clk); in wmt_i2c_reset_hardware()
343 dev_err(i2c_dev->dev, "failed to enable clock\n"); in wmt_i2c_reset_hardware()
347 err = clk_set_rate(i2c_dev->clk, 20000000); in wmt_i2c_reset_hardware()
349 dev_err(i2c_dev->dev, "failed to set clock = 20Mhz\n"); in wmt_i2c_reset_hardware()
350 clk_disable_unprepare(i2c_dev->clk); in wmt_i2c_reset_hardware()
354 writew(0, i2c_dev->base + REG_CR); in wmt_i2c_reset_hardware()
355 writew(MCR_APB_166M, i2c_dev->base + REG_MCR); in wmt_i2c_reset_hardware()
356 writew(ISR_WRITE_ALL, i2c_dev->base + REG_ISR); in wmt_i2c_reset_hardware()
357 writew(IMR_ENABLE_ALL, i2c_dev->base + REG_IMR); in wmt_i2c_reset_hardware()
358 writew(CR_ENABLE, i2c_dev->base + REG_CR); in wmt_i2c_reset_hardware()
359 readw(i2c_dev->base + REG_CSR); /* read clear */ in wmt_i2c_reset_hardware()
360 writew(ISR_WRITE_ALL, i2c_dev->base + REG_ISR); in wmt_i2c_reset_hardware()
362 if (i2c_dev->mode == I2C_MODE_STANDARD) in wmt_i2c_reset_hardware()
363 writew(SCL_TIMEOUT(128) | TR_STD, i2c_dev->base + REG_TR); in wmt_i2c_reset_hardware()
365 writew(SCL_TIMEOUT(128) | TR_HS, i2c_dev->base + REG_TR); in wmt_i2c_reset_hardware()
373 struct wmt_i2c_dev *i2c_dev; in wmt_i2c_probe() local
379 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); in wmt_i2c_probe()
380 if (!i2c_dev) in wmt_i2c_probe()
384 i2c_dev->base = devm_ioremap_resource(&pdev->dev, res); in wmt_i2c_probe()
385 if (IS_ERR(i2c_dev->base)) in wmt_i2c_probe()
386 return PTR_ERR(i2c_dev->base); in wmt_i2c_probe()
388 i2c_dev->irq = irq_of_parse_and_map(np, 0); in wmt_i2c_probe()
389 if (!i2c_dev->irq) { in wmt_i2c_probe()
394 i2c_dev->clk = of_clk_get(np, 0); in wmt_i2c_probe()
395 if (IS_ERR(i2c_dev->clk)) { in wmt_i2c_probe()
397 return PTR_ERR(i2c_dev->clk); in wmt_i2c_probe()
400 i2c_dev->mode = I2C_MODE_STANDARD; in wmt_i2c_probe()
403 i2c_dev->mode = I2C_MODE_FAST; in wmt_i2c_probe()
405 i2c_dev->dev = &pdev->dev; in wmt_i2c_probe()
407 err = devm_request_irq(&pdev->dev, i2c_dev->irq, wmt_i2c_isr, 0, in wmt_i2c_probe()
408 "i2c", i2c_dev); in wmt_i2c_probe()
410 dev_err(&pdev->dev, "failed to request irq %i\n", i2c_dev->irq); in wmt_i2c_probe()
414 adap = &i2c_dev->adapter; in wmt_i2c_probe()
415 i2c_set_adapdata(adap, i2c_dev); in wmt_i2c_probe()
422 init_completion(&i2c_dev->complete); in wmt_i2c_probe()
424 err = wmt_i2c_reset_hardware(i2c_dev); in wmt_i2c_probe()
434 platform_set_drvdata(pdev, i2c_dev); in wmt_i2c_probe()
441 struct wmt_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in wmt_i2c_remove() local
444 writew(0, i2c_dev->base + REG_IMR); in wmt_i2c_remove()
445 clk_disable_unprepare(i2c_dev->clk); in wmt_i2c_remove()
446 i2c_del_adapter(&i2c_dev->adapter); in wmt_i2c_remove()