Lines Matching refs:host
185 name, __kw_state_names[host->state], isr); \
197 static inline u8 __kw_read_reg(struct pmac_i2c_host_kw *host, reg_t reg) in __kw_read_reg() argument
199 return readb(host->base + (((unsigned int)reg) << host->bsteps)); in __kw_read_reg()
202 static inline void __kw_write_reg(struct pmac_i2c_host_kw *host, in __kw_write_reg() argument
205 writeb(val, host->base + (((unsigned)reg) << host->bsteps)); in __kw_write_reg()
206 (void)__kw_read_reg(host, reg_subaddr); in __kw_write_reg()
209 #define kw_write_reg(reg, val) __kw_write_reg(host, reg, val)
210 #define kw_read_reg(reg) __kw_read_reg(host, reg)
212 static u8 kw_i2c_wait_interrupt(struct pmac_i2c_host_kw *host) in kw_i2c_wait_interrupt() argument
226 if (host->polled) { in kw_i2c_wait_interrupt()
235 static void kw_i2c_do_stop(struct pmac_i2c_host_kw *host, int result) in kw_i2c_do_stop() argument
238 host->state = state_stop; in kw_i2c_do_stop()
239 host->result = result; in kw_i2c_do_stop()
243 static void kw_i2c_handle_interrupt(struct pmac_i2c_host_kw *host, u8 isr) in kw_i2c_handle_interrupt() argument
248 __kw_state_names[host->state], isr); in kw_i2c_handle_interrupt()
250 if (host->state == state_idle) { in kw_i2c_handle_interrupt()
260 if (host->state != state_stop) { in kw_i2c_handle_interrupt()
261 kw_i2c_do_stop(host, -EIO); in kw_i2c_handle_interrupt()
267 host->state = state_idle; in kw_i2c_handle_interrupt()
269 if (!host->polled) in kw_i2c_handle_interrupt()
270 complete(&host->complete); in kw_i2c_handle_interrupt()
276 if (host->state != state_addr) { in kw_i2c_handle_interrupt()
278 kw_i2c_do_stop(host, -EIO); in kw_i2c_handle_interrupt()
281 host->result = -ENXIO; in kw_i2c_handle_interrupt()
282 host->state = state_stop; in kw_i2c_handle_interrupt()
285 if (host->len == 0) in kw_i2c_handle_interrupt()
286 kw_i2c_do_stop(host, 0); in kw_i2c_handle_interrupt()
287 else if (host->rw) { in kw_i2c_handle_interrupt()
288 host->state = state_read; in kw_i2c_handle_interrupt()
289 if (host->len > 1) in kw_i2c_handle_interrupt()
293 host->state = state_write; in kw_i2c_handle_interrupt()
294 kw_write_reg(reg_data, *(host->data++)); in kw_i2c_handle_interrupt()
295 host->len--; in kw_i2c_handle_interrupt()
302 if (host->state == state_read) { in kw_i2c_handle_interrupt()
303 *(host->data++) = kw_read_reg(reg_data); in kw_i2c_handle_interrupt()
304 host->len--; in kw_i2c_handle_interrupt()
306 if (host->len == 0) in kw_i2c_handle_interrupt()
307 host->state = state_stop; in kw_i2c_handle_interrupt()
308 else if (host->len == 1) in kw_i2c_handle_interrupt()
310 } else if (host->state == state_write) { in kw_i2c_handle_interrupt()
314 host->result = -EFBIG; in kw_i2c_handle_interrupt()
315 host->state = state_stop; in kw_i2c_handle_interrupt()
316 } else if (host->len) { in kw_i2c_handle_interrupt()
317 kw_write_reg(reg_data, *(host->data++)); in kw_i2c_handle_interrupt()
318 host->len--; in kw_i2c_handle_interrupt()
320 kw_i2c_do_stop(host, 0); in kw_i2c_handle_interrupt()
323 if (host->state != state_stop) in kw_i2c_handle_interrupt()
324 kw_i2c_do_stop(host, -EIO); in kw_i2c_handle_interrupt()
331 if (host->state != state_stop) { in kw_i2c_handle_interrupt()
333 host->result = -EIO; in kw_i2c_handle_interrupt()
335 host->state = state_idle; in kw_i2c_handle_interrupt()
336 if (!host->polled) in kw_i2c_handle_interrupt()
337 complete(&host->complete); in kw_i2c_handle_interrupt()
349 struct pmac_i2c_host_kw *host = dev_id; in kw_i2c_irq() local
352 spin_lock_irqsave(&host->lock, flags); in kw_i2c_irq()
353 del_timer(&host->timeout_timer); in kw_i2c_irq()
354 kw_i2c_handle_interrupt(host, kw_read_reg(reg_isr)); in kw_i2c_irq()
355 if (host->state != state_idle) { in kw_i2c_irq()
356 host->timeout_timer.expires = jiffies + KW_POLL_TIMEOUT; in kw_i2c_irq()
357 add_timer(&host->timeout_timer); in kw_i2c_irq()
359 spin_unlock_irqrestore(&host->lock, flags); in kw_i2c_irq()
365 struct pmac_i2c_host_kw *host = (struct pmac_i2c_host_kw *)data; in kw_i2c_timeout() local
368 spin_lock_irqsave(&host->lock, flags); in kw_i2c_timeout()
374 if (timer_pending(&host->timeout_timer)) in kw_i2c_timeout()
377 kw_i2c_handle_interrupt(host, kw_read_reg(reg_isr)); in kw_i2c_timeout()
378 if (host->state != state_idle) { in kw_i2c_timeout()
379 host->timeout_timer.expires = jiffies + KW_POLL_TIMEOUT; in kw_i2c_timeout()
380 add_timer(&host->timeout_timer); in kw_i2c_timeout()
383 spin_unlock_irqrestore(&host->lock, flags); in kw_i2c_timeout()
388 struct pmac_i2c_host_kw *host = bus->hostdata; in kw_i2c_open() local
389 mutex_lock(&host->mutex); in kw_i2c_open()
395 struct pmac_i2c_host_kw *host = bus->hostdata; in kw_i2c_close() local
396 mutex_unlock(&host->mutex); in kw_i2c_close()
402 struct pmac_i2c_host_kw *host = bus->hostdata; in kw_i2c_xfer() local
403 u8 mode_reg = host->speed; in kw_i2c_xfer()
404 int use_irq = host->irq && !bus->polled; in kw_i2c_xfer()
443 host->data = data; in kw_i2c_xfer()
444 host->len = len; in kw_i2c_xfer()
445 host->state = state_addr; in kw_i2c_xfer()
446 host->result = 0; in kw_i2c_xfer()
447 host->rw = (addrdir & 1); in kw_i2c_xfer()
448 host->polled = bus->polled; in kw_i2c_xfer()
455 reinit_completion(&host->complete); in kw_i2c_xfer()
459 host->timeout_timer.expires = jiffies + KW_POLL_TIMEOUT; in kw_i2c_xfer()
460 add_timer(&host->timeout_timer); in kw_i2c_xfer()
470 wait_for_completion(&host->complete); in kw_i2c_xfer()
472 while(host->state != state_idle) { in kw_i2c_xfer()
475 u8 isr = kw_i2c_wait_interrupt(host); in kw_i2c_xfer()
476 spin_lock_irqsave(&host->lock, flags); in kw_i2c_xfer()
477 kw_i2c_handle_interrupt(host, isr); in kw_i2c_xfer()
478 spin_unlock_irqrestore(&host->lock, flags); in kw_i2c_xfer()
485 return host->result; in kw_i2c_xfer()
490 struct pmac_i2c_host_kw *host; in kw_i2c_host_init() local
494 host = kzalloc(sizeof(struct pmac_i2c_host_kw), GFP_KERNEL); in kw_i2c_host_init()
495 if (host == NULL) { in kw_i2c_host_init()
509 kfree(host); in kw_i2c_host_init()
512 mutex_init(&host->mutex); in kw_i2c_host_init()
513 init_completion(&host->complete); in kw_i2c_host_init()
514 spin_lock_init(&host->lock); in kw_i2c_host_init()
515 init_timer(&host->timeout_timer); in kw_i2c_host_init()
516 host->timeout_timer.function = kw_i2c_timeout; in kw_i2c_host_init()
517 host->timeout_timer.data = (unsigned long)host; in kw_i2c_host_init()
521 for (host->bsteps = 0; (steps & 0x01) == 0; host->bsteps++) in kw_i2c_host_init()
524 host->speed = KW_I2C_MODE_25KHZ; in kw_i2c_host_init()
528 host->speed = KW_I2C_MODE_100KHZ; in kw_i2c_host_init()
531 host->speed = KW_I2C_MODE_50KHZ; in kw_i2c_host_init()
534 host->speed = KW_I2C_MODE_25KHZ; in kw_i2c_host_init()
537 host->irq = irq_of_parse_and_map(np, 0); in kw_i2c_host_init()
538 if (!host->irq) in kw_i2c_host_init()
543 host->base = ioremap((*addrp), 0x1000); in kw_i2c_host_init()
544 if (host->base == NULL) { in kw_i2c_host_init()
547 kfree(host); in kw_i2c_host_init()
558 if (request_irq(host->irq, kw_i2c_irq, IRQF_NO_SUSPEND, in kw_i2c_host_init()
559 "keywest i2c", host)) in kw_i2c_host_init()
560 host->irq = 0; in kw_i2c_host_init()
563 *addrp, host->irq, np->full_name); in kw_i2c_host_init()
565 return host; in kw_i2c_host_init()
569 static void __init kw_i2c_add(struct pmac_i2c_host_kw *host, in kw_i2c_add() argument
583 bus->hostdata = host; in kw_i2c_add()
604 struct pmac_i2c_host_kw *host; in kw_i2c_probe() local
608 host = kw_i2c_host_init(np); in kw_i2c_probe()
609 if (host == NULL) in kw_i2c_probe()
634 kw_i2c_add(host, np, np, i); in kw_i2c_probe()
642 kw_i2c_add(host, np, child, *reg); in kw_i2c_probe()