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()
356 bfin_write(&drv_data->regs->tclkdiv, transfer_speed); in bfin_sport_spi_pump_transfers()
364 if (drv_data->state == ERROR_STATE) { in bfin_sport_spi_pump_transfers()
365 dev_dbg(drv_data->dev, "transfer: we've hit an error\n"); in bfin_sport_spi_pump_transfers()
367 bfin_sport_spi_giveback(drv_data); in bfin_sport_spi_pump_transfers()
372 if (drv_data->state == DONE_STATE) { in bfin_sport_spi_pump_transfers()
373 dev_dbg(drv_data->dev, "transfer: all done!\n"); in bfin_sport_spi_pump_transfers()
375 bfin_sport_spi_giveback(drv_data); in bfin_sport_spi_pump_transfers()
380 if (drv_data->state == RUNNING_STATE) { in bfin_sport_spi_pump_transfers()
381 dev_dbg(drv_data->dev, "transfer: still running ...\n"); in bfin_sport_spi_pump_transfers()
390 drv_data->state = bfin_sport_spi_next_transfer(drv_data); in bfin_sport_spi_pump_transfers()
392 tasklet_schedule(&drv_data->pump_transfers); in bfin_sport_spi_pump_transfers()
396 drv_data->tx = (void *)transfer->tx_buf; in bfin_sport_spi_pump_transfers()
397 drv_data->tx_end = drv_data->tx + transfer->len; in bfin_sport_spi_pump_transfers()
398 dev_dbg(drv_data->dev, "tx_buf is %p, tx_end is %p\n", in bfin_sport_spi_pump_transfers()
399 transfer->tx_buf, drv_data->tx_end); in bfin_sport_spi_pump_transfers()
401 drv_data->tx = NULL; in bfin_sport_spi_pump_transfers()
405 drv_data->rx = transfer->rx_buf; in bfin_sport_spi_pump_transfers()
406 drv_data->rx_end = drv_data->rx + transfer->len; in bfin_sport_spi_pump_transfers()
407 dev_dbg(drv_data->dev, "rx_buf is %p, rx_end is %p\n", in bfin_sport_spi_pump_transfers()
408 transfer->rx_buf, drv_data->rx_end); in bfin_sport_spi_pump_transfers()
410 drv_data->rx = NULL; in bfin_sport_spi_pump_transfers()
412 drv_data->cs_change = transfer->cs_change; in bfin_sport_spi_pump_transfers()
417 drv_data->ops = &bfin_sport_transfer_ops_u16; in bfin_sport_spi_pump_transfers()
419 drv_data->ops = &bfin_sport_transfer_ops_u8; in bfin_sport_spi_pump_transfers()
420 bfin_write(&drv_data->regs->tcr2, bits_per_word - 1); in bfin_sport_spi_pump_transfers()
421 bfin_write(&drv_data->regs->tfsdiv, bits_per_word - 1); in bfin_sport_spi_pump_transfers()
422 bfin_write(&drv_data->regs->rcr2, bits_per_word - 1); in bfin_sport_spi_pump_transfers()
424 drv_data->state = RUNNING_STATE; in bfin_sport_spi_pump_transfers()
426 if (drv_data->cs_change) in bfin_sport_spi_pump_transfers()
429 dev_dbg(drv_data->dev, in bfin_sport_spi_pump_transfers()
434 dev_dbg(drv_data->dev, "doing IO transfer\n"); in bfin_sport_spi_pump_transfers()
436 bfin_sport_spi_enable(drv_data); in bfin_sport_spi_pump_transfers()
439 BUG_ON((drv_data->tx_end - drv_data->tx) != in bfin_sport_spi_pump_transfers()
440 (drv_data->rx_end - drv_data->rx)); in bfin_sport_spi_pump_transfers()
441 drv_data->ops->duplex(drv_data); in bfin_sport_spi_pump_transfers()
443 if (drv_data->tx != drv_data->tx_end) in bfin_sport_spi_pump_transfers()
445 } else if (drv_data->tx != NULL) { in bfin_sport_spi_pump_transfers()
448 drv_data->ops->write(drv_data); in bfin_sport_spi_pump_transfers()
450 if (drv_data->tx != drv_data->tx_end) in bfin_sport_spi_pump_transfers()
452 } else if (drv_data->rx != NULL) { in bfin_sport_spi_pump_transfers()
455 drv_data->ops->read(drv_data); in bfin_sport_spi_pump_transfers()
456 if (drv_data->rx != drv_data->rx_end) in bfin_sport_spi_pump_transfers()
459 bfin_sport_spi_disable(drv_data); in bfin_sport_spi_pump_transfers()
462 dev_dbg(drv_data->dev, "IO write error!\n"); in bfin_sport_spi_pump_transfers()
463 drv_data->state = ERROR_STATE; in bfin_sport_spi_pump_transfers()
468 drv_data->state = bfin_sport_spi_next_transfer(drv_data); in bfin_sport_spi_pump_transfers()
469 if (drv_data->cs_change) in bfin_sport_spi_pump_transfers()
474 tasklet_schedule(&drv_data->pump_transfers); in bfin_sport_spi_pump_transfers()
481 struct bfin_sport_spi_master_data *drv_data; in bfin_sport_spi_pump_messages() local
485 drv_data = container_of(work, struct bfin_sport_spi_master_data, pump_messages); in bfin_sport_spi_pump_messages()
488 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
489 if (list_empty(&drv_data->queue) || !drv_data->run) { in bfin_sport_spi_pump_messages()
491 drv_data->busy = 0; in bfin_sport_spi_pump_messages()
492 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
497 if (drv_data->cur_msg) { in bfin_sport_spi_pump_messages()
498 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
503 next_msg = list_entry(drv_data->queue.next, in bfin_sport_spi_pump_messages()
506 drv_data->cur_msg = next_msg; in bfin_sport_spi_pump_messages()
509 drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi); in bfin_sport_spi_pump_messages()
511 list_del_init(&drv_data->cur_msg->queue); in bfin_sport_spi_pump_messages()
514 drv_data->cur_msg->state = START_STATE; in bfin_sport_spi_pump_messages()
515 drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next, in bfin_sport_spi_pump_messages()
517 bfin_sport_spi_restore_state(drv_data); in bfin_sport_spi_pump_messages()
518 dev_dbg(drv_data->dev, "got a message to pump, " in bfin_sport_spi_pump_messages()
520 drv_data->cur_chip->baud, drv_data->cur_chip->cs_gpio, in bfin_sport_spi_pump_messages()
521 drv_data->cur_chip->ctl_reg); in bfin_sport_spi_pump_messages()
523 dev_dbg(drv_data->dev, in bfin_sport_spi_pump_messages()
525 drv_data->cur_transfer->len); in bfin_sport_spi_pump_messages()
528 tasklet_schedule(&drv_data->pump_transfers); in bfin_sport_spi_pump_messages()
530 drv_data->busy = 1; in bfin_sport_spi_pump_messages()
531 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_pump_messages()
541 struct bfin_sport_spi_master_data *drv_data = spi_master_get_devdata(spi->master); in bfin_sport_spi_transfer() local
544 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_transfer()
546 if (!drv_data->run) { in bfin_sport_spi_transfer()
547 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_transfer()
556 list_add_tail(&msg->queue, &drv_data->queue); in bfin_sport_spi_transfer()
558 if (drv_data->run && !drv_data->busy) in bfin_sport_spi_transfer()
559 queue_work(drv_data->workqueue, &drv_data->pump_messages); in bfin_sport_spi_transfer()
561 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_transfer()
657 bfin_sport_spi_init_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_init_queue() argument
659 INIT_LIST_HEAD(&drv_data->queue); in bfin_sport_spi_init_queue()
660 spin_lock_init(&drv_data->lock); in bfin_sport_spi_init_queue()
662 drv_data->run = false; in bfin_sport_spi_init_queue()
663 drv_data->busy = 0; in bfin_sport_spi_init_queue()
666 tasklet_init(&drv_data->pump_transfers, in bfin_sport_spi_init_queue()
667 bfin_sport_spi_pump_transfers, (unsigned long)drv_data); in bfin_sport_spi_init_queue()
670 INIT_WORK(&drv_data->pump_messages, bfin_sport_spi_pump_messages); in bfin_sport_spi_init_queue()
671 drv_data->workqueue = in bfin_sport_spi_init_queue()
672 create_singlethread_workqueue(dev_name(drv_data->master->dev.parent)); in bfin_sport_spi_init_queue()
673 if (drv_data->workqueue == NULL) in bfin_sport_spi_init_queue()
680 bfin_sport_spi_start_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_start_queue() argument
684 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_start_queue()
686 if (drv_data->run || drv_data->busy) { in bfin_sport_spi_start_queue()
687 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_start_queue()
691 drv_data->run = true; in bfin_sport_spi_start_queue()
692 drv_data->cur_msg = NULL; in bfin_sport_spi_start_queue()
693 drv_data->cur_transfer = NULL; in bfin_sport_spi_start_queue()
694 drv_data->cur_chip = NULL; in bfin_sport_spi_start_queue()
695 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_start_queue()
697 queue_work(drv_data->workqueue, &drv_data->pump_messages); in bfin_sport_spi_start_queue()
703 bfin_sport_spi_stop_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_stop_queue() argument
709 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
717 drv_data->run = false; in bfin_sport_spi_stop_queue()
718 while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) { in bfin_sport_spi_stop_queue()
719 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
721 spin_lock_irqsave(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
724 if (!list_empty(&drv_data->queue) || drv_data->busy) in bfin_sport_spi_stop_queue()
727 spin_unlock_irqrestore(&drv_data->lock, flags); in bfin_sport_spi_stop_queue()
733 bfin_sport_spi_destroy_queue(struct bfin_sport_spi_master_data *drv_data) in bfin_sport_spi_destroy_queue() argument
737 status = bfin_sport_spi_stop_queue(drv_data); in bfin_sport_spi_destroy_queue()
741 destroy_workqueue(drv_data->workqueue); in bfin_sport_spi_destroy_queue()
752 struct bfin_sport_spi_master_data *drv_data; in bfin_sport_spi_probe() local
764 drv_data = spi_master_get_devdata(master); in bfin_sport_spi_probe()
765 drv_data->master = master; in bfin_sport_spi_probe()
766 drv_data->dev = dev; in bfin_sport_spi_probe()
767 drv_data->pin_req = platform_info->pin_req; in bfin_sport_spi_probe()
785 drv_data->regs = ioremap(res->start, resource_size(res)); in bfin_sport_spi_probe()
786 if (drv_data->regs == NULL) { in bfin_sport_spi_probe()
798 drv_data->err_irq = ires->start; in bfin_sport_spi_probe()
801 status = bfin_sport_spi_init_queue(drv_data); in bfin_sport_spi_probe()
807 status = bfin_sport_spi_start_queue(drv_data); in bfin_sport_spi_probe()
813 status = request_irq(drv_data->err_irq, sport_err_handler, in bfin_sport_spi_probe()
814 0, "sport_spi_err", drv_data); in bfin_sport_spi_probe()
820 status = peripheral_request_list(drv_data->pin_req, DRV_NAME); in bfin_sport_spi_probe()
827 platform_set_drvdata(pdev, drv_data); in bfin_sport_spi_probe()
834 dev_info(dev, "%s, regs_base@%p\n", DRV_DESC, drv_data->regs); in bfin_sport_spi_probe()
838 peripheral_free_list(drv_data->pin_req); in bfin_sport_spi_probe()
840 free_irq(drv_data->err_irq, drv_data); in bfin_sport_spi_probe()
843 bfin_sport_spi_destroy_queue(drv_data); in bfin_sport_spi_probe()
845 iounmap(drv_data->regs); in bfin_sport_spi_probe()
856 struct bfin_sport_spi_master_data *drv_data = platform_get_drvdata(pdev); in bfin_sport_spi_remove() local
859 if (!drv_data) in bfin_sport_spi_remove()
863 status = bfin_sport_spi_destroy_queue(drv_data); in bfin_sport_spi_remove()
868 bfin_sport_spi_disable(drv_data); in bfin_sport_spi_remove()
871 spi_unregister_master(drv_data->master); in bfin_sport_spi_remove()
873 peripheral_free_list(drv_data->pin_req); in bfin_sport_spi_remove()
881 struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev); in bfin_sport_spi_suspend() local
884 status = bfin_sport_spi_stop_queue(drv_data); in bfin_sport_spi_suspend()
889 bfin_sport_spi_disable(drv_data); in bfin_sport_spi_suspend()
896 struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev); in bfin_sport_spi_resume() local
900 bfin_sport_spi_enable(drv_data); in bfin_sport_spi_resume()
903 status = bfin_sport_spi_start_queue(drv_data); in bfin_sport_spi_resume()
905 dev_err(drv_data->dev, "problem resuming queue\n"); in bfin_sport_spi_resume()