Lines Matching refs:drv_data
114 mv64xxx_i2c_hw_init(struct mv64xxx_i2c_data *drv_data) in mv64xxx_i2c_hw_init() argument
116 writel(0, drv_data->reg_base + MV64XXX_I2C_REG_SOFT_RESET); in mv64xxx_i2c_hw_init()
117 writel((((drv_data->freq_m & 0xf) << 3) | (drv_data->freq_n & 0x7)), in mv64xxx_i2c_hw_init()
118 drv_data->reg_base + MV64XXX_I2C_REG_BAUD); in mv64xxx_i2c_hw_init()
119 writel(0, drv_data->reg_base + MV64XXX_I2C_REG_SLAVE_ADDR); in mv64xxx_i2c_hw_init()
120 writel(0, drv_data->reg_base + MV64XXX_I2C_REG_EXT_SLAVE_ADDR); in mv64xxx_i2c_hw_init()
122 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_hw_init()
123 drv_data->state = MV64XXX_I2C_STATE_IDLE; in mv64xxx_i2c_hw_init()
127 mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status) in mv64xxx_i2c_fsm() argument
134 if (drv_data->state == MV64XXX_I2C_STATE_IDLE) { in mv64xxx_i2c_fsm()
135 drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; in mv64xxx_i2c_fsm()
144 drv_data->action = MV64XXX_I2C_ACTION_SEND_ADDR_1; in mv64xxx_i2c_fsm()
145 drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_ADDR_1_ACK; in mv64xxx_i2c_fsm()
150 if (drv_data->msg->flags & I2C_M_TEN) { in mv64xxx_i2c_fsm()
151 drv_data->action = MV64XXX_I2C_ACTION_SEND_ADDR_2; in mv64xxx_i2c_fsm()
152 drv_data->state = in mv64xxx_i2c_fsm()
159 if ((drv_data->bytes_left == 0) in mv64xxx_i2c_fsm()
160 || (drv_data->aborting in mv64xxx_i2c_fsm()
161 && (drv_data->byte_posn != 0))) { in mv64xxx_i2c_fsm()
162 drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; in mv64xxx_i2c_fsm()
163 drv_data->state = MV64XXX_I2C_STATE_IDLE; in mv64xxx_i2c_fsm()
165 drv_data->action = MV64XXX_I2C_ACTION_SEND_DATA; in mv64xxx_i2c_fsm()
166 drv_data->state = in mv64xxx_i2c_fsm()
168 drv_data->bytes_left--; in mv64xxx_i2c_fsm()
174 if (drv_data->msg->flags & I2C_M_TEN) { in mv64xxx_i2c_fsm()
175 drv_data->action = MV64XXX_I2C_ACTION_SEND_ADDR_2; in mv64xxx_i2c_fsm()
176 drv_data->state = in mv64xxx_i2c_fsm()
182 if (drv_data->bytes_left == 0) { in mv64xxx_i2c_fsm()
183 drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; in mv64xxx_i2c_fsm()
184 drv_data->state = MV64XXX_I2C_STATE_IDLE; in mv64xxx_i2c_fsm()
190 drv_data->action = MV64XXX_I2C_ACTION_CONTINUE; in mv64xxx_i2c_fsm()
192 drv_data->action = MV64XXX_I2C_ACTION_RCV_DATA; in mv64xxx_i2c_fsm()
193 drv_data->bytes_left--; in mv64xxx_i2c_fsm()
195 drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_DATA; in mv64xxx_i2c_fsm()
197 if ((drv_data->bytes_left == 1) || drv_data->aborting) in mv64xxx_i2c_fsm()
198 drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_ACK; in mv64xxx_i2c_fsm()
202 drv_data->action = MV64XXX_I2C_ACTION_RCV_DATA_STOP; in mv64xxx_i2c_fsm()
203 drv_data->state = MV64XXX_I2C_STATE_IDLE; in mv64xxx_i2c_fsm()
210 drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; in mv64xxx_i2c_fsm()
211 drv_data->state = MV64XXX_I2C_STATE_IDLE; in mv64xxx_i2c_fsm()
212 drv_data->rc = -ENODEV; in mv64xxx_i2c_fsm()
216 dev_err(&drv_data->adapter.dev, in mv64xxx_i2c_fsm()
219 drv_data->state, status, drv_data->msg->addr, in mv64xxx_i2c_fsm()
220 drv_data->msg->flags); in mv64xxx_i2c_fsm()
221 drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; in mv64xxx_i2c_fsm()
222 mv64xxx_i2c_hw_init(drv_data); in mv64xxx_i2c_fsm()
223 drv_data->rc = -EIO; in mv64xxx_i2c_fsm()
228 mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) in mv64xxx_i2c_do_action() argument
230 switch(drv_data->action) { in mv64xxx_i2c_do_action()
232 writel(drv_data->cntl_bits, in mv64xxx_i2c_do_action()
233 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
237 writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, in mv64xxx_i2c_do_action()
238 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
242 writel(drv_data->addr1, in mv64xxx_i2c_do_action()
243 drv_data->reg_base + MV64XXX_I2C_REG_DATA); in mv64xxx_i2c_do_action()
244 writel(drv_data->cntl_bits, in mv64xxx_i2c_do_action()
245 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
249 writel(drv_data->addr2, in mv64xxx_i2c_do_action()
250 drv_data->reg_base + MV64XXX_I2C_REG_DATA); in mv64xxx_i2c_do_action()
251 writel(drv_data->cntl_bits, in mv64xxx_i2c_do_action()
252 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
256 writel(drv_data->msg->buf[drv_data->byte_posn++], in mv64xxx_i2c_do_action()
257 drv_data->reg_base + MV64XXX_I2C_REG_DATA); in mv64xxx_i2c_do_action()
258 writel(drv_data->cntl_bits, in mv64xxx_i2c_do_action()
259 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
263 drv_data->msg->buf[drv_data->byte_posn++] = in mv64xxx_i2c_do_action()
264 readl(drv_data->reg_base + MV64XXX_I2C_REG_DATA); in mv64xxx_i2c_do_action()
265 writel(drv_data->cntl_bits, in mv64xxx_i2c_do_action()
266 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
270 drv_data->msg->buf[drv_data->byte_posn++] = in mv64xxx_i2c_do_action()
271 readl(drv_data->reg_base + MV64XXX_I2C_REG_DATA); in mv64xxx_i2c_do_action()
272 drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_INTEN; in mv64xxx_i2c_do_action()
273 writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP, in mv64xxx_i2c_do_action()
274 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
275 drv_data->block = 0; in mv64xxx_i2c_do_action()
276 wake_up_interruptible(&drv_data->waitq); in mv64xxx_i2c_do_action()
281 dev_err(&drv_data->adapter.dev, in mv64xxx_i2c_do_action()
283 drv_data->action); in mv64xxx_i2c_do_action()
284 drv_data->rc = -EIO; in mv64xxx_i2c_do_action()
287 drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_INTEN; in mv64xxx_i2c_do_action()
288 writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP, in mv64xxx_i2c_do_action()
289 drv_data->reg_base + MV64XXX_I2C_REG_CONTROL); in mv64xxx_i2c_do_action()
290 drv_data->block = 0; in mv64xxx_i2c_do_action()
291 wake_up_interruptible(&drv_data->waitq); in mv64xxx_i2c_do_action()
299 struct mv64xxx_i2c_data *drv_data = dev_id; in mv64xxx_i2c_intr() local
304 spin_lock_irqsave(&drv_data->lock, flags); in mv64xxx_i2c_intr()
305 while (readl(drv_data->reg_base + MV64XXX_I2C_REG_CONTROL) & in mv64xxx_i2c_intr()
307 status = readl(drv_data->reg_base + MV64XXX_I2C_REG_STATUS); in mv64xxx_i2c_intr()
308 mv64xxx_i2c_fsm(drv_data, status); in mv64xxx_i2c_intr()
309 mv64xxx_i2c_do_action(drv_data); in mv64xxx_i2c_intr()
312 spin_unlock_irqrestore(&drv_data->lock, flags); in mv64xxx_i2c_intr()
325 mv64xxx_i2c_prepare_for_io(struct mv64xxx_i2c_data *drv_data, in mv64xxx_i2c_prepare_for_io() argument
330 drv_data->msg = msg; in mv64xxx_i2c_prepare_for_io()
331 drv_data->byte_posn = 0; in mv64xxx_i2c_prepare_for_io()
332 drv_data->bytes_left = msg->len; in mv64xxx_i2c_prepare_for_io()
333 drv_data->aborting = 0; in mv64xxx_i2c_prepare_for_io()
334 drv_data->rc = 0; in mv64xxx_i2c_prepare_for_io()
335 drv_data->cntl_bits = MV64XXX_I2C_REG_CONTROL_ACK | in mv64xxx_i2c_prepare_for_io()
345 drv_data->addr1 = 0xf0 | (((u32)msg->addr & 0x300) >> 7) | dir; in mv64xxx_i2c_prepare_for_io()
346 drv_data->addr2 = (u32)msg->addr & 0xff; in mv64xxx_i2c_prepare_for_io()
348 drv_data->addr1 = ((u32)msg->addr & 0x7f) << 1 | dir; in mv64xxx_i2c_prepare_for_io()
349 drv_data->addr2 = 0; in mv64xxx_i2c_prepare_for_io()
354 mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data) in mv64xxx_i2c_wait_for_completion() argument
360 time_left = wait_event_interruptible_timeout(drv_data->waitq, in mv64xxx_i2c_wait_for_completion()
361 !drv_data->block, msecs_to_jiffies(drv_data->adapter.timeout)); in mv64xxx_i2c_wait_for_completion()
363 spin_lock_irqsave(&drv_data->lock, flags); in mv64xxx_i2c_wait_for_completion()
365 drv_data->rc = -ETIMEDOUT; in mv64xxx_i2c_wait_for_completion()
368 drv_data->rc = time_left; /* errno value */ in mv64xxx_i2c_wait_for_completion()
372 if (abort && drv_data->block) { in mv64xxx_i2c_wait_for_completion()
373 drv_data->aborting = 1; in mv64xxx_i2c_wait_for_completion()
374 spin_unlock_irqrestore(&drv_data->lock, flags); in mv64xxx_i2c_wait_for_completion()
376 time_left = wait_event_timeout(drv_data->waitq, in mv64xxx_i2c_wait_for_completion()
377 !drv_data->block, in mv64xxx_i2c_wait_for_completion()
378 msecs_to_jiffies(drv_data->adapter.timeout)); in mv64xxx_i2c_wait_for_completion()
380 if ((time_left <= 0) && drv_data->block) { in mv64xxx_i2c_wait_for_completion()
381 drv_data->state = MV64XXX_I2C_STATE_IDLE; in mv64xxx_i2c_wait_for_completion()
382 dev_err(&drv_data->adapter.dev, in mv64xxx_i2c_wait_for_completion()
384 "time_left: %d\n", drv_data->block, in mv64xxx_i2c_wait_for_completion()
386 mv64xxx_i2c_hw_init(drv_data); in mv64xxx_i2c_wait_for_completion()
389 spin_unlock_irqrestore(&drv_data->lock, flags); in mv64xxx_i2c_wait_for_completion()
393 mv64xxx_i2c_execute_msg(struct mv64xxx_i2c_data *drv_data, struct i2c_msg *msg) in mv64xxx_i2c_execute_msg() argument
397 spin_lock_irqsave(&drv_data->lock, flags); in mv64xxx_i2c_execute_msg()
398 mv64xxx_i2c_prepare_for_io(drv_data, msg); in mv64xxx_i2c_execute_msg()
401 if (drv_data->msg->flags & I2C_M_RD) { in mv64xxx_i2c_execute_msg()
403 drv_data->action = MV64XXX_I2C_ACTION_CONTINUE; in mv64xxx_i2c_execute_msg()
404 drv_data->state = in mv64xxx_i2c_execute_msg()
407 drv_data->action = MV64XXX_I2C_ACTION_SEND_DATA; in mv64xxx_i2c_execute_msg()
408 drv_data->state = in mv64xxx_i2c_execute_msg()
410 drv_data->bytes_left--; in mv64xxx_i2c_execute_msg()
413 drv_data->action = MV64XXX_I2C_ACTION_SEND_START; in mv64xxx_i2c_execute_msg()
414 drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND; in mv64xxx_i2c_execute_msg()
417 drv_data->block = 1; in mv64xxx_i2c_execute_msg()
418 mv64xxx_i2c_do_action(drv_data); in mv64xxx_i2c_execute_msg()
419 spin_unlock_irqrestore(&drv_data->lock, flags); in mv64xxx_i2c_execute_msg()
421 mv64xxx_i2c_wait_for_completion(drv_data); in mv64xxx_i2c_execute_msg()
422 return drv_data->rc; in mv64xxx_i2c_execute_msg()
441 struct mv64xxx_i2c_data *drv_data = i2c_get_adapdata(adap); in mv64xxx_i2c_xfer() local
445 if ((rc = mv64xxx_i2c_execute_msg(drv_data, &msgs[i])) < 0) in mv64xxx_i2c_xfer()
465 struct mv64xxx_i2c_data *drv_data) in mv64xxx_i2c_map_regs() argument
475 if (!request_mem_region(r->start, size, drv_data->adapter.name)) in mv64xxx_i2c_map_regs()
478 drv_data->reg_base = ioremap(r->start, size); in mv64xxx_i2c_map_regs()
479 drv_data->reg_base_p = r->start; in mv64xxx_i2c_map_regs()
480 drv_data->reg_size = size; in mv64xxx_i2c_map_regs()
486 mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data) in mv64xxx_i2c_unmap_regs() argument
488 if (drv_data->reg_base) { in mv64xxx_i2c_unmap_regs()
489 iounmap(drv_data->reg_base); in mv64xxx_i2c_unmap_regs()
490 release_mem_region(drv_data->reg_base_p, drv_data->reg_size); in mv64xxx_i2c_unmap_regs()
493 drv_data->reg_base = NULL; in mv64xxx_i2c_unmap_regs()
494 drv_data->reg_base_p = 0; in mv64xxx_i2c_unmap_regs()
500 struct mv64xxx_i2c_data *drv_data; in mv64xxx_i2c_probe() local
507 drv_data = kzalloc(sizeof(struct mv64xxx_i2c_data), GFP_KERNEL); in mv64xxx_i2c_probe()
508 if (!drv_data) in mv64xxx_i2c_probe()
511 if (mv64xxx_i2c_map_regs(pd, drv_data)) { in mv64xxx_i2c_probe()
516 strlcpy(drv_data->adapter.name, MV64XXX_I2C_CTLR_NAME " adapter", in mv64xxx_i2c_probe()
517 sizeof(drv_data->adapter.name)); in mv64xxx_i2c_probe()
519 init_waitqueue_head(&drv_data->waitq); in mv64xxx_i2c_probe()
520 spin_lock_init(&drv_data->lock); in mv64xxx_i2c_probe()
522 drv_data->freq_m = pdata->freq_m; in mv64xxx_i2c_probe()
523 drv_data->freq_n = pdata->freq_n; in mv64xxx_i2c_probe()
524 drv_data->irq = platform_get_irq(pd, 0); in mv64xxx_i2c_probe()
525 if (drv_data->irq < 0) { in mv64xxx_i2c_probe()
529 drv_data->adapter.dev.parent = &pd->dev; in mv64xxx_i2c_probe()
530 drv_data->adapter.algo = &mv64xxx_i2c_algo; in mv64xxx_i2c_probe()
531 drv_data->adapter.owner = THIS_MODULE; in mv64xxx_i2c_probe()
532 drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD; in mv64xxx_i2c_probe()
533 drv_data->adapter.timeout = pdata->timeout; in mv64xxx_i2c_probe()
534 drv_data->adapter.nr = pd->id; in mv64xxx_i2c_probe()
535 platform_set_drvdata(pd, drv_data); in mv64xxx_i2c_probe()
536 i2c_set_adapdata(&drv_data->adapter, drv_data); in mv64xxx_i2c_probe()
538 mv64xxx_i2c_hw_init(drv_data); in mv64xxx_i2c_probe()
540 if (request_irq(drv_data->irq, mv64xxx_i2c_intr, 0, in mv64xxx_i2c_probe()
541 MV64XXX_I2C_CTLR_NAME, drv_data)) { in mv64xxx_i2c_probe()
542 dev_err(&drv_data->adapter.dev, in mv64xxx_i2c_probe()
544 drv_data->irq); in mv64xxx_i2c_probe()
547 } else if ((rc = i2c_add_numbered_adapter(&drv_data->adapter)) != 0) { in mv64xxx_i2c_probe()
548 dev_err(&drv_data->adapter.dev, in mv64xxx_i2c_probe()
556 free_irq(drv_data->irq, drv_data); in mv64xxx_i2c_probe()
558 mv64xxx_i2c_unmap_regs(drv_data); in mv64xxx_i2c_probe()
560 kfree(drv_data); in mv64xxx_i2c_probe()
567 struct mv64xxx_i2c_data *drv_data = platform_get_drvdata(dev); in mv64xxx_i2c_remove() local
570 rc = i2c_del_adapter(&drv_data->adapter); in mv64xxx_i2c_remove()
571 free_irq(drv_data->irq, drv_data); in mv64xxx_i2c_remove()
572 mv64xxx_i2c_unmap_regs(drv_data); in mv64xxx_i2c_remove()
573 kfree(drv_data); in mv64xxx_i2c_remove()