Lines Matching refs:drv_data
110 bfin_sport_spi_enable(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_enable() argument
112 bfin_write_or(&drv_data->regs->tcr1, TSPEN); in bfin_sport_spi_enable()
113 bfin_write_or(&drv_data->regs->rcr1, TSPEN); in bfin_sport_spi_enable()
118 bfin_sport_spi_disable(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_disable() argument
120 bfin_write_and(&drv_data->regs->tcr1, ~TSPEN); in bfin_sport_spi_disable()
121 bfin_write_and(&drv_data->regs->rcr1, ~TSPEN); in bfin_sport_spi_disable()
160 bfin_sport_spi_stat_poll_complete(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_stat_poll_complete() argument
163 while (!(bfin_read(&drv_data->regs->stat) & RXNE)) { in bfin_sport_spi_stat_poll_complete()
170 bfin_sport_spi_u8_writer(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_u8_writer() argument
174 while (drv_data->tx < drv_data->tx_end) { in bfin_sport_spi_u8_writer()
175 bfin_write(&drv_data->regs->tx16, *drv_data->tx8++); in bfin_sport_spi_u8_writer()
176 bfin_sport_spi_stat_poll_complete(drv_data); in bfin_sport_spi_u8_writer()
177 dummy = bfin_read(&drv_data->regs->rx16); in bfin_sport_spi_u8_writer()
182 bfin_sport_spi_u8_reader(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_u8_reader() argument
184 u16 tx_val = drv_data->cur_chip->idle_tx_val; in bfin_sport_spi_u8_reader()
186 while (drv_data->rx < drv_data->rx_end) { in bfin_sport_spi_u8_reader()
187 bfin_write(&drv_data->regs->tx16, tx_val); in bfin_sport_spi_u8_reader()
188 bfin_sport_spi_stat_poll_complete(drv_data); in bfin_sport_spi_u8_reader()
189 *drv_data->rx8++ = bfin_read(&drv_data->regs->rx16); in bfin_sport_spi_u8_reader()
194 bfin_sport_spi_u8_duplex(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_u8_duplex() argument
196 while (drv_data->rx < drv_data->rx_end) { in bfin_sport_spi_u8_duplex()
197 bfin_write(&drv_data->regs->tx16, *drv_data->tx8++); in bfin_sport_spi_u8_duplex()
198 bfin_sport_spi_stat_poll_complete(drv_data); in bfin_sport_spi_u8_duplex()
199 *drv_data->rx8++ = bfin_read(&drv_data->regs->rx16); in bfin_sport_spi_u8_duplex()
210 bfin_sport_spi_u16_writer(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_u16_writer() argument
214 while (drv_data->tx < drv_data->tx_end) { in bfin_sport_spi_u16_writer()
215 bfin_write(&drv_data->regs->tx16, *drv_data->tx16++); in bfin_sport_spi_u16_writer()
216 bfin_sport_spi_stat_poll_complete(drv_data); in bfin_sport_spi_u16_writer()
217 dummy = bfin_read(&drv_data->regs->rx16); in bfin_sport_spi_u16_writer()
222 bfin_sport_spi_u16_reader(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_u16_reader() argument
224 u16 tx_val = drv_data->cur_chip->idle_tx_val; in bfin_sport_spi_u16_reader()
226 while (drv_data->rx < drv_data->rx_end) { in bfin_sport_spi_u16_reader()
227 bfin_write(&drv_data->regs->tx16, tx_val); in bfin_sport_spi_u16_reader()
228 bfin_sport_spi_stat_poll_complete(drv_data); in bfin_sport_spi_u16_reader()
229 *drv_data->rx16++ = bfin_read(&drv_data->regs->rx16); in bfin_sport_spi_u16_reader()
234 bfin_sport_spi_u16_duplex(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_u16_duplex() argument
236 while (drv_data->rx < drv_data->rx_end) { in bfin_sport_spi_u16_duplex()
237 bfin_write(&drv_data->regs->tx16, *drv_data->tx16++); in bfin_sport_spi_u16_duplex()
238 bfin_sport_spi_stat_poll_complete(drv_data); in bfin_sport_spi_u16_duplex()
239 *drv_data->rx16++ = bfin_read(&drv_data->regs->rx16); in bfin_sport_spi_u16_duplex()
251 bfin_sport_spi_restore_state(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_restore_state() argument
253 struct bfin_sport_spi_slave_data *chip = drv_data->cur_chip; in bfin_sport_spi_restore_state()
255 bfin_sport_spi_disable(drv_data); in bfin_sport_spi_restore_state()
256 dev_dbg(drv_data->dev, "restoring spi ctl state\n"); in bfin_sport_spi_restore_state()
258 bfin_write(&drv_data->regs->tcr1, chip->ctl_reg); in bfin_sport_spi_restore_state()
259 bfin_write(&drv_data->regs->tclkdiv, chip->baud); in bfin_sport_spi_restore_state()
262 bfin_write(&drv_data->regs->rcr1, chip->ctl_reg & ~(ITCLK | ITFS)); in bfin_sport_spi_restore_state()
270 bfin_sport_spi_next_transfer(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_next_transfer() argument
272 struct spi_message *msg = drv_data->cur_msg; in bfin_sport_spi_next_transfer()
273 struct spi_transfer *trans = drv_data->cur_transfer; in bfin_sport_spi_next_transfer()
277 drv_data->cur_transfer = in bfin_sport_spi_next_transfer()
291 bfin_sport_spi_giveback(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_giveback() argument
293 struct bfin_sport_spi_slave_data *chip = drv_data->cur_chip; in bfin_sport_spi_giveback()
297 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_giveback()
298 msg = drv_data->cur_msg; in bfin_sport_spi_giveback()
299 drv_data->state = START_STATE; in bfin_sport_spi_giveback()
300 drv_data->cur_msg = NULL; in bfin_sport_spi_giveback()
301 drv_data->cur_transfer = NULL; in bfin_sport_spi_giveback()
302 drv_data->cur_chip = NULL; in bfin_sport_spi_giveback()
303 queue_work(drv_data->workqueue, &drv_data->pump_messages); in bfin_sport_spi_giveback()
304 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_giveback()
306 if (!drv_data->cs_change) in bfin_sport_spi_giveback()
316 struct bfin_sport_spi_master_data *drv_data = dev_id; in sport_err_handler() local
319 dev_dbg(drv_data->dev, "%s enter\n", __func__); in sport_err_handler()
320 status = bfin_read(&drv_data->regs->stat) & (TOVF | TUVF | ROVF | RUVF); in sport_err_handler()
323 bfin_write(&drv_data->regs->stat, status); in sport_err_handler()
326 bfin_sport_spi_disable(drv_data); in sport_err_handler()
327 dev_err(drv_data->dev, "status error:%s%s%s%s\n", in sport_err_handler()
340 struct bfin_sport_spi_master_data *drv_data = (void *)data; in bfin_sport_spi_pump_transfers() local
351 message = drv_data->cur_msg; in bfin_sport_spi_pump_transfers()
352 transfer = drv_data->cur_transfer; in bfin_sport_spi_pump_transfers()
353 chip = drv_data->cur_chip; in bfin_sport_spi_pump_transfers()
359 bfin_write(&drv_data->regs->tclkdiv, transfer_speed); in bfin_sport_spi_pump_transfers()
367 if (drv_data->state == ERROR_STATE) { in bfin_sport_spi_pump_transfers()
368 dev_dbg(drv_data->dev, "transfer: we've hit an error\n"); in bfin_sport_spi_pump_transfers()
370 bfin_sport_spi_giveback(drv_data); in bfin_sport_spi_pump_transfers()
375 if (drv_data->state == DONE_STATE) { in bfin_sport_spi_pump_transfers()
376 dev_dbg(drv_data->dev, "transfer: all done!\n"); in bfin_sport_spi_pump_transfers()
378 bfin_sport_spi_giveback(drv_data); in bfin_sport_spi_pump_transfers()
383 if (drv_data->state == RUNNING_STATE) { in bfin_sport_spi_pump_transfers()
384 dev_dbg(drv_data->dev, "transfer: still running ...\n"); in bfin_sport_spi_pump_transfers()
393 drv_data->state = bfin_sport_spi_next_transfer(drv_data); in bfin_sport_spi_pump_transfers()
395 tasklet_schedule(&drv_data->pump_transfers); in bfin_sport_spi_pump_transfers()
399 drv_data->tx = (void *)transfer->tx_buf; in bfin_sport_spi_pump_transfers()
400 drv_data->tx_end = drv_data->tx + transfer->len; in bfin_sport_spi_pump_transfers()
401 dev_dbg(drv_data->dev, "tx_buf is %p, tx_end is %p\n", in bfin_sport_spi_pump_transfers()
402 transfer->tx_buf, drv_data->tx_end); in bfin_sport_spi_pump_transfers()
404 drv_data->tx = NULL; in bfin_sport_spi_pump_transfers()
408 drv_data->rx = transfer->rx_buf; in bfin_sport_spi_pump_transfers()
409 drv_data->rx_end = drv_data->rx + transfer->len; in bfin_sport_spi_pump_transfers()
410 dev_dbg(drv_data->dev, "rx_buf is %p, rx_end is %p\n", in bfin_sport_spi_pump_transfers()
411 transfer->rx_buf, drv_data->rx_end); in bfin_sport_spi_pump_transfers()
413 drv_data->rx = NULL; in bfin_sport_spi_pump_transfers()
415 drv_data->cs_change = transfer->cs_change; in bfin_sport_spi_pump_transfers()
420 drv_data->ops = &bfin_sport_transfer_ops_u16; in bfin_sport_spi_pump_transfers()
422 drv_data->ops = &bfin_sport_transfer_ops_u8; in bfin_sport_spi_pump_transfers()
423 bfin_write(&drv_data->regs->tcr2, bits_per_word - 1); in bfin_sport_spi_pump_transfers()
424 bfin_write(&drv_data->regs->tfsdiv, bits_per_word - 1); in bfin_sport_spi_pump_transfers()
425 bfin_write(&drv_data->regs->rcr2, bits_per_word - 1); in bfin_sport_spi_pump_transfers()
427 drv_data->state = RUNNING_STATE; in bfin_sport_spi_pump_transfers()
429 if (drv_data->cs_change) in bfin_sport_spi_pump_transfers()
432 dev_dbg(drv_data->dev, in bfin_sport_spi_pump_transfers()
437 dev_dbg(drv_data->dev, "doing IO transfer\n"); in bfin_sport_spi_pump_transfers()
439 bfin_sport_spi_enable(drv_data); in bfin_sport_spi_pump_transfers()
442 BUG_ON((drv_data->tx_end - drv_data->tx) != in bfin_sport_spi_pump_transfers()
443 (drv_data->rx_end - drv_data->rx)); in bfin_sport_spi_pump_transfers()
444 drv_data->ops->duplex(drv_data); in bfin_sport_spi_pump_transfers()
446 if (drv_data->tx != drv_data->tx_end) in bfin_sport_spi_pump_transfers()
448 } else if (drv_data->tx != NULL) { in bfin_sport_spi_pump_transfers()
451 drv_data->ops->write(drv_data); in bfin_sport_spi_pump_transfers()
453 if (drv_data->tx != drv_data->tx_end) in bfin_sport_spi_pump_transfers()
455 } else if (drv_data->rx != NULL) { in bfin_sport_spi_pump_transfers()
458 drv_data->ops->read(drv_data); in bfin_sport_spi_pump_transfers()
459 if (drv_data->rx != drv_data->rx_end) in bfin_sport_spi_pump_transfers()
462 bfin_sport_spi_disable(drv_data); in bfin_sport_spi_pump_transfers()
465 dev_dbg(drv_data->dev, "IO write error!\n"); in bfin_sport_spi_pump_transfers()
466 drv_data->state = ERROR_STATE; in bfin_sport_spi_pump_transfers()
471 drv_data->state = bfin_sport_spi_next_transfer(drv_data); in bfin_sport_spi_pump_transfers()
472 if (drv_data->cs_change) in bfin_sport_spi_pump_transfers()
477 tasklet_schedule(&drv_data->pump_transfers); in bfin_sport_spi_pump_transfers()
484 struct bfin_sport_spi_master_data *drv_data; in bfin_sport_spi_pump_messages() local
488 drv_data = container_of(work, struct bfin_sport_spi_master_data, pump_messages); in bfin_sport_spi_pump_messages()
491 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
492 if (list_empty(&drv_data->queue) || !drv_data->run) { in bfin_sport_spi_pump_messages()
494 drv_data->busy = 0; in bfin_sport_spi_pump_messages()
495 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
500 if (drv_data->cur_msg) { in bfin_sport_spi_pump_messages()
501 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
506 next_msg = list_entry(drv_data->queue.next, in bfin_sport_spi_pump_messages()
509 drv_data->cur_msg = next_msg; in bfin_sport_spi_pump_messages()
512 drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); in bfin_sport_spi_pump_messages()
514 list_del_init(&drv_data->cur_msg->queue); in bfin_sport_spi_pump_messages()
517 drv_data->cur_msg->state = START_STATE; in bfin_sport_spi_pump_messages()
518 drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, in bfin_sport_spi_pump_messages()
520 bfin_sport_spi_restore_state(drv_data); in bfin_sport_spi_pump_messages()
521 dev_dbg(drv_data->dev, "got a message to pump, " in bfin_sport_spi_pump_messages()
523 drv_data->cur_chip->baud, drv_data->cur_chip->cs_gpio, in bfin_sport_spi_pump_messages()
524 drv_data->cur_chip->ctl_reg); in bfin_sport_spi_pump_messages()
526 dev_dbg(drv_data->dev, in bfin_sport_spi_pump_messages()
528 drv_data->cur_transfer->len); in bfin_sport_spi_pump_messages()
531 tasklet_schedule(&drv_data->pump_transfers); in bfin_sport_spi_pump_messages()
533 drv_data->busy = 1; in bfin_sport_spi_pump_messages()
534 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
544 struct bfin_sport_spi_master_data *drv_data = spi_master_get_devdata(spi->master); in bfin_sport_spi_transfer() local
547 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_transfer()
549 if (!drv_data->run) { in bfin_sport_spi_transfer()
550 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_transfer()
559 list_add_tail(&msg->queue, &drv_data->queue); in bfin_sport_spi_transfer()
561 if (drv_data->run && !drv_data->busy) in bfin_sport_spi_transfer()
562 queue_work(drv_data->workqueue, &drv_data->pump_messages); in bfin_sport_spi_transfer()
564 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_transfer()
660 bfin_sport_spi_init_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_init_queue() argument
662 INIT_LIST_HEAD(&drv_data->queue); in bfin_sport_spi_init_queue()
663 spin_lock_init(&drv_data->lock); in bfin_sport_spi_init_queue()
665 drv_data->run = false; in bfin_sport_spi_init_queue()
666 drv_data->busy = 0; in bfin_sport_spi_init_queue()
669 tasklet_init(&drv_data->pump_transfers, in bfin_sport_spi_init_queue()
670 bfin_sport_spi_pump_transfers, (unsigned long)drv_data); in bfin_sport_spi_init_queue()
673 INIT_WORK(&drv_data->pump_messages, bfin_sport_spi_pump_messages); in bfin_sport_spi_init_queue()
674 drv_data->workqueue = in bfin_sport_spi_init_queue()
675 create_singlethread_workqueue(dev_name(drv_data->master->dev.parent)); in bfin_sport_spi_init_queue()
676 if (drv_data->workqueue == NULL) in bfin_sport_spi_init_queue()
683 bfin_sport_spi_start_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_start_queue() argument
687 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_start_queue()
689 if (drv_data->run || drv_data->busy) { in bfin_sport_spi_start_queue()
690 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_start_queue()
694 drv_data->run = true; in bfin_sport_spi_start_queue()
695 drv_data->cur_msg = NULL; in bfin_sport_spi_start_queue()
696 drv_data->cur_transfer = NULL; in bfin_sport_spi_start_queue()
697 drv_data->cur_chip = NULL; in bfin_sport_spi_start_queue()
698 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_start_queue()
700 queue_work(drv_data->workqueue, &drv_data->pump_messages); in bfin_sport_spi_start_queue()
706 bfin_sport_spi_stop_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_stop_queue() argument
712 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
720 drv_data->run = false; in bfin_sport_spi_stop_queue()
721 while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { in bfin_sport_spi_stop_queue()
722 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
724 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
727 if (!list_empty(&drv_data->queue) || drv_data->busy) in bfin_sport_spi_stop_queue()
730 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
736 bfin_sport_spi_destroy_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_destroy_queue() argument
740 status = bfin_sport_spi_stop_queue(drv_data); in bfin_sport_spi_destroy_queue()
744 destroy_workqueue(drv_data->workqueue); in bfin_sport_spi_destroy_queue()
755 struct bfin_sport_spi_master_data *drv_data; in bfin_sport_spi_probe() local
767 drv_data = spi_master_get_devdata(master); in bfin_sport_spi_probe()
768 drv_data->master = master; in bfin_sport_spi_probe()
769 drv_data->dev = dev; in bfin_sport_spi_probe()
770 drv_data->pin_req = platform_info->pin_req; in bfin_sport_spi_probe()
788 drv_data->regs = ioremap(res->start, resource_size(res)); in bfin_sport_spi_probe()
789 if (drv_data->regs == NULL) { in bfin_sport_spi_probe()
801 drv_data->err_irq = ires->start; in bfin_sport_spi_probe()
804 status = bfin_sport_spi_init_queue(drv_data); in bfin_sport_spi_probe()
810 status = bfin_sport_spi_start_queue(drv_data); in bfin_sport_spi_probe()
816 status = request_irq(drv_data->err_irq, sport_err_handler, in bfin_sport_spi_probe()
817 0, "sport_spi_err", drv_data); in bfin_sport_spi_probe()
823 status = peripheral_request_list(drv_data->pin_req, DRV_NAME); in bfin_sport_spi_probe()
830 platform_set_drvdata(pdev, drv_data); in bfin_sport_spi_probe()
837 dev_info(dev, "%s, regs_base@%p\n", DRV_DESC, drv_data->regs); in bfin_sport_spi_probe()
841 peripheral_free_list(drv_data->pin_req); in bfin_sport_spi_probe()
843 free_irq(drv_data->err_irq, drv_data); in bfin_sport_spi_probe()
846 bfin_sport_spi_destroy_queue(drv_data); in bfin_sport_spi_probe()
848 iounmap(drv_data->regs); in bfin_sport_spi_probe()
859 struct bfin_sport_spi_master_data *drv_data = platform_get_drvdata(pdev); in bfin_sport_spi_remove() local
862 if (!drv_data) in bfin_sport_spi_remove()
866 status = bfin_sport_spi_destroy_queue(drv_data); in bfin_sport_spi_remove()
871 bfin_sport_spi_disable(drv_data); in bfin_sport_spi_remove()
874 spi_unregister_master(drv_data->master); in bfin_sport_spi_remove()
876 peripheral_free_list(drv_data->pin_req); in bfin_sport_spi_remove()
884 struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev); in bfin_sport_spi_suspend() local
887 status = bfin_sport_spi_stop_queue(drv_data); in bfin_sport_spi_suspend()
892 bfin_sport_spi_disable(drv_data); in bfin_sport_spi_suspend()
899 struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev); in bfin_sport_spi_resume() local
903 bfin_sport_spi_enable(drv_data); in bfin_sport_spi_resume()
906 status = bfin_sport_spi_start_queue(drv_data); in bfin_sport_spi_resume()
908 dev_err(drv_data->dev, "problem resuming queue\n"); in bfin_sport_spi_resume()