Lines Matching refs:i2c_dev
97 static int wmt_i2c_wait_bus_not_busy(struct wmt_i2c_dev *i2c_dev) in wmt_i2c_wait_bus_not_busy() argument
102 while (!(readw(i2c_dev->base + REG_CSR) & CSR_READY_MASK)) { in wmt_i2c_wait_bus_not_busy()
104 dev_warn(i2c_dev->dev, "timeout waiting for bus ready\n"); in wmt_i2c_wait_bus_not_busy()
113 static int wmt_check_status(struct wmt_i2c_dev *i2c_dev) in wmt_check_status() argument
117 if (i2c_dev->cmd_status & ISR_NACK_ADDR) in wmt_check_status()
120 if (i2c_dev->cmd_status & ISR_SCL_TIMEOUT) in wmt_check_status()
129 struct wmt_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in wmt_i2c_write() local
136 ret = wmt_i2c_wait_bus_not_busy(i2c_dev); in wmt_i2c_write()
147 writew(0, i2c_dev->base + REG_CDR); in wmt_i2c_write()
149 writew(pmsg->buf[0] & 0xFF, i2c_dev->base + REG_CDR); 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()
157 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_write()
159 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_write()
162 reinit_completion(&i2c_dev->complete); in wmt_i2c_write()
164 if (i2c_dev->mode == I2C_MODE_STANDARD) in wmt_i2c_write()
171 writew(tcr_val, i2c_dev->base + REG_TCR); in wmt_i2c_write()
174 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_write()
176 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_write()
180 wait_result = wait_for_completion_timeout(&i2c_dev->complete, in wmt_i2c_write()
186 ret = wmt_check_status(i2c_dev); in wmt_i2c_write()
192 val = readw(i2c_dev->base + REG_CSR); in wmt_i2c_write()
194 dev_dbg(i2c_dev->dev, "write RCV NACK error\n"); in wmt_i2c_write()
200 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_write()
206 writew(CR_ENABLE, i2c_dev->base + REG_CR); in wmt_i2c_write()
208 writew(pmsg->buf[xfer_len] & 0xFF, i2c_dev->base + in wmt_i2c_write()
210 writew(CR_CPU_RDY | CR_ENABLE, i2c_dev->base + REG_CR); in wmt_i2c_write()
220 struct wmt_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in wmt_i2c_read() local
227 ret = wmt_i2c_wait_bus_not_busy(i2c_dev); 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()
236 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
238 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
241 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
243 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
247 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
249 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
252 reinit_completion(&i2c_dev->complete); in wmt_i2c_read()
254 if (i2c_dev->mode == I2C_MODE_STANDARD) in wmt_i2c_read()
261 writew(tcr_val, i2c_dev->base + REG_TCR); in wmt_i2c_read()
264 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
266 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
270 wait_result = wait_for_completion_timeout(&i2c_dev->complete, in wmt_i2c_read()
276 ret = wmt_check_status(i2c_dev); in wmt_i2c_read()
280 pmsg->buf[xfer_len] = readw(i2c_dev->base + REG_CDR) >> 8; 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()
288 val = readw(i2c_dev->base + REG_CR); in wmt_i2c_read()
290 writew(val, i2c_dev->base + REG_CR); in wmt_i2c_read()
330 struct wmt_i2c_dev *i2c_dev = data; in wmt_i2c_isr() local
333 i2c_dev->cmd_status = readw(i2c_dev->base + REG_ISR); in wmt_i2c_isr()
334 writew(i2c_dev->cmd_status, i2c_dev->base + REG_ISR); in wmt_i2c_isr()
336 complete(&i2c_dev->complete); in wmt_i2c_isr()
341 static int wmt_i2c_reset_hardware(struct wmt_i2c_dev *i2c_dev) in wmt_i2c_reset_hardware() argument
345 err = clk_prepare_enable(i2c_dev->clk); in wmt_i2c_reset_hardware()
347 dev_err(i2c_dev->dev, "failed to enable clock\n"); in wmt_i2c_reset_hardware()
351 err = clk_set_rate(i2c_dev->clk, 20000000); in wmt_i2c_reset_hardware()
353 dev_err(i2c_dev->dev, "failed to set clock = 20Mhz\n"); in wmt_i2c_reset_hardware()
354 clk_disable_unprepare(i2c_dev->clk); in wmt_i2c_reset_hardware()
358 writew(0, i2c_dev->base + REG_CR); in wmt_i2c_reset_hardware()
359 writew(MCR_APB_166M, i2c_dev->base + REG_MCR); in wmt_i2c_reset_hardware()
360 writew(ISR_WRITE_ALL, i2c_dev->base + REG_ISR); in wmt_i2c_reset_hardware()
361 writew(IMR_ENABLE_ALL, i2c_dev->base + REG_IMR); in wmt_i2c_reset_hardware()
362 writew(CR_ENABLE, i2c_dev->base + REG_CR); in wmt_i2c_reset_hardware()
363 readw(i2c_dev->base + REG_CSR); /* read clear */ in wmt_i2c_reset_hardware()
364 writew(ISR_WRITE_ALL, i2c_dev->base + REG_ISR); in wmt_i2c_reset_hardware()
366 if (i2c_dev->mode == I2C_MODE_STANDARD) in wmt_i2c_reset_hardware()
367 writew(SCL_TIMEOUT(128) | TR_STD, i2c_dev->base + REG_TR); in wmt_i2c_reset_hardware()
369 writew(SCL_TIMEOUT(128) | TR_HS, i2c_dev->base + REG_TR); in wmt_i2c_reset_hardware()
377 struct wmt_i2c_dev *i2c_dev; in wmt_i2c_probe() local
383 i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); in wmt_i2c_probe()
384 if (!i2c_dev) in wmt_i2c_probe()
388 i2c_dev->base = devm_ioremap_resource(&pdev->dev, res); in wmt_i2c_probe()
389 if (IS_ERR(i2c_dev->base)) in wmt_i2c_probe()
390 return PTR_ERR(i2c_dev->base); in wmt_i2c_probe()
392 i2c_dev->irq = irq_of_parse_and_map(np, 0); in wmt_i2c_probe()
393 if (!i2c_dev->irq) { in wmt_i2c_probe()
398 i2c_dev->clk = of_clk_get(np, 0); in wmt_i2c_probe()
399 if (IS_ERR(i2c_dev->clk)) { in wmt_i2c_probe()
401 return PTR_ERR(i2c_dev->clk); in wmt_i2c_probe()
404 i2c_dev->mode = I2C_MODE_STANDARD; in wmt_i2c_probe()
407 i2c_dev->mode = I2C_MODE_FAST; in wmt_i2c_probe()
409 i2c_dev->dev = &pdev->dev; in wmt_i2c_probe()
411 err = devm_request_irq(&pdev->dev, i2c_dev->irq, wmt_i2c_isr, 0, in wmt_i2c_probe()
412 "i2c", i2c_dev); in wmt_i2c_probe()
414 dev_err(&pdev->dev, "failed to request irq %i\n", i2c_dev->irq); in wmt_i2c_probe()
418 adap = &i2c_dev->adapter; in wmt_i2c_probe()
419 i2c_set_adapdata(adap, i2c_dev); in wmt_i2c_probe()
426 init_completion(&i2c_dev->complete); in wmt_i2c_probe()
428 err = wmt_i2c_reset_hardware(i2c_dev); in wmt_i2c_probe()
440 platform_set_drvdata(pdev, i2c_dev); in wmt_i2c_probe()
447 struct wmt_i2c_dev *i2c_dev = platform_get_drvdata(pdev); in wmt_i2c_remove() local
450 writew(0, i2c_dev->base + REG_IMR); in wmt_i2c_remove()
451 clk_disable_unprepare(i2c_dev->clk); in wmt_i2c_remove()
452 i2c_del_adapter(&i2c_dev->adapter); in wmt_i2c_remove()