[go: nahoru, domu]

Lines Matching defs:drv_data

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