Lines Matching +full:spi +full:- +full:tx +full:- +full:delay +full:- +full:us

4  *	Driver for Marvell SPI WLAN cards.
12 * Inspired by if_sdio.c, Copyright 2007-2008 Pierre Ossman
30 #include <linux/spi/libertas_spi.h>
31 #include <linux/spi/spi.h>
46 struct spi_device *spi; member
61 /* Handles all SPI communication (except for FW load) */
86 list_for_each_safe(cursor, next, &card->cmd_packet_list) { in free_if_spi_card()
88 list_del(&packet->list); in free_if_spi_card()
91 list_for_each_safe(cursor, next, &card->data_packet_list) { in free_if_spi_card()
93 list_del(&packet->list); in free_if_spi_card()
96 spi_set_drvdata(card->spi, NULL); in free_if_spi_card()
124 * SPI Interface Unit Routines
136 if (!time_after(jiffies, card->prev_xfer_time + 1)) { in spu_transaction_init()
137 /* Unfortunately, the SPU requires a delay between successive in spu_transaction_init()
140 * If not, we have to busy-wait to be on the safe side. */ in spu_transaction_init()
147 card->prev_xfer_time = jiffies; in spu_transaction_finish()
151 * Write out a byte buffer to an SPI register,
152 * using a series of 16-bit transfers.
182 err = spi_sync(card->spi, &m); in spu_write()
209 unsigned int delay; in spu_read() local
235 delay = spu_reg_is_port_reg(reg) ? card->spu_port_delay : in spu_read()
236 card->spu_reg_delay; in spu_read()
237 if (card->use_dummy_writes) { in spu_read()
239 dummy_trans.len = delay / 8; in spu_read()
242 /* Busy-wait while the SPU fills the FIFO */ in spu_read()
244 DIV_ROUND_UP((100 + (delay * 10)), 1000); in spu_read()
252 err = spi_sync(card->spi, &m); in spu_read()
257 /* Read 16 bits from an SPI register */
270 * Read 32 bits from an SPI register.
285 * Keep reading 16 bits from an SPI register until you get the correct result.
287 * If mask = 0, the correct result is any non-zero number.
291 * Returns -ETIMEDOUT if a second passes without the correct result.
314 return -ETIMEDOUT; in spu_wait_for_u16()
320 * Read 16 bits from an SPI register until you receive a specific value.
321 * Returns -ETIMEDOUT if a 4 tries pass without success.
335 return -ETIMEDOUT; in spu_wait_for_u32()
364 * If auto-interrupts are on, the completion of certain transactions in spu_set_interrupt_mode()
365 * will trigger an interrupt automatically. If auto-interrupts in spu_set_interrupt_mode()
412 return -EIO; in spu_set_bus_mode()
420 u32 delay; in spu_init() local
423 * We have to start up in timed delay mode so that we can safely in spu_init()
424 * read the Delay Read Register. in spu_init()
426 card->use_dummy_writes = 0; in spu_init()
433 card->spu_port_delay = 1000; in spu_init()
434 card->spu_reg_delay = 1000; in spu_init()
435 err = spu_read_u32(card, IF_SPI_DELAY_READ_REG, &delay); in spu_init()
438 card->spu_port_delay = delay & 0x0000ffff; in spu_init()
439 card->spu_reg_delay = (delay & 0xffff0000) >> 16; in spu_init()
441 /* If dummy clock delay mode has been requested, switch to it now */ in spu_init()
443 card->use_dummy_writes = 1; in spu_init()
454 card->spu_port_delay, card->spu_reg_delay); in spu_init()
476 bytes_remaining = firmware->size; in if_spi_prog_helper_firmware()
477 fw = firmware->data; in if_spi_prog_helper_firmware()
517 bytes_remaining -= HELPER_FW_LOAD_CHUNK_SZ; in if_spi_prog_helper_firmware()
542 * Returns the length of the next packet the firmware expects us to send.
571 return -EIO; in if_spi_prog_main_firmware_check_len()
586 struct lbs_private *priv = card->priv; in if_spi_prog_main_firmware()
600 netdev_err(priv->dev, in if_spi_prog_main_firmware()
608 bytes = firmware->size; in if_spi_prog_main_firmware()
609 fw = firmware->data; in if_spi_prog_main_firmware()
620 netdev_err(priv->dev, in if_spi_prog_main_firmware()
628 err = -EIO; in if_spi_prog_main_firmware()
633 bytes -= prev_len; in if_spi_prog_main_firmware()
637 memset(card->cmd_buffer, 0, len); in if_spi_prog_main_firmware()
638 memcpy(card->cmd_buffer, fw, bytes); in if_spi_prog_main_firmware()
640 memcpy(card->cmd_buffer, fw, len); in if_spi_prog_main_firmware()
646 card->cmd_buffer, len); in if_spi_prog_main_firmware()
675 * SPI Transfer Thread
677 * The SPI worker handles all SPI transfers, so there is no need for a lock.
683 struct lbs_private *priv = card->priv; in if_spi_c2h_cmd()
710 netdev_err(priv->dev, "%s: error: card has no data for host\n", in if_spi_c2h_cmd()
712 err = -EINVAL; in if_spi_c2h_cmd()
715 netdev_err(priv->dev, in if_spi_c2h_cmd()
718 err = -EINVAL; in if_spi_c2h_cmd()
724 card->cmd_buffer, ALIGN(len, 4)); in if_spi_c2h_cmd()
728 spin_lock_irqsave(&priv->driver_lock, flags); in if_spi_c2h_cmd()
729 i = (priv->resp_idx == 0) ? 1 : 0; in if_spi_c2h_cmd()
730 BUG_ON(priv->resp_len[i]); in if_spi_c2h_cmd()
731 priv->resp_len[i] = len; in if_spi_c2h_cmd()
732 memcpy(priv->resp_buf[i], card->cmd_buffer, len); in if_spi_c2h_cmd()
734 spin_unlock_irqrestore(&priv->driver_lock, flags); in if_spi_c2h_cmd()
738 netdev_err(priv->dev, "%s: err=%d\n", __func__, err); in if_spi_c2h_cmd()
746 struct lbs_private *priv = card->priv; in if_spi_c2h_data()
759 netdev_err(priv->dev, "%s: error: card has no data for host\n", in if_spi_c2h_data()
761 err = -EINVAL; in if_spi_c2h_data()
764 netdev_err(priv->dev, in if_spi_c2h_data()
767 err = -EINVAL; in if_spi_c2h_data()
774 err = -ENOBUFS; in if_spi_c2h_data()
786 err = lbs_process_rxed_packet(card->priv, skb); in if_spi_c2h_data()
797 netdev_err(priv->dev, "%s: err=%d\n", __func__, err); in if_spi_c2h_data()
806 struct lbs_private *priv = card->priv; in if_spi_h2c()
820 netdev_err(priv->dev, "can't transfer buffer of type %d\n", in if_spi_h2c()
822 err = -EINVAL; in if_spi_h2c()
827 err = spu_write(card, port_reg, packet->buffer, packet->blen); in if_spi_h2c()
835 netdev_err(priv->dev, "%s: error %d\n", __func__, err); in if_spi_h2c()
843 struct lbs_private *priv = card->priv; in if_spi_e2h()
849 /* re-enable the card event interrupt */ in if_spi_e2h()
859 netdev_err(priv->dev, "%s: error %d\n", __func__, err); in if_spi_e2h()
872 priv = card->priv; in if_spi_host_to_card_worker()
883 netdev_err(priv->dev, "I/O error\n"); in if_spi_host_to_card_worker()
900 * Download Ready bit, but it sets TX Download Ready. in if_spi_host_to_card_worker()
903 (card->priv->psstate != PS_STATE_FULL_POWER && in if_spi_host_to_card_worker()
912 lbs_host_to_card_done(card->priv); in if_spi_host_to_card_worker()
916 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
917 if (!list_empty(&card->cmd_packet_list)) { in if_spi_host_to_card_worker()
918 packet = (struct if_spi_packet *)(card-> in if_spi_host_to_card_worker()
920 list_del(&packet->list); in if_spi_host_to_card_worker()
922 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
930 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
931 if (!list_empty(&card->data_packet_list)) { in if_spi_host_to_card_worker()
932 packet = (struct if_spi_packet *)(card-> in if_spi_host_to_card_worker()
934 list_del(&packet->list); in if_spi_host_to_card_worker()
936 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
946 netdev_err(priv->dev, "%s: got error %d\n", __func__, err); in if_spi_host_to_card_worker()
962 struct if_spi_card *card = priv->card; in if_spi_host_to_card()
969 netdev_err(priv->dev, "%s: invalid size requested: %d\n", in if_spi_host_to_card()
971 err = -EINVAL; in if_spi_host_to_card()
977 err = -ENOMEM; in if_spi_host_to_card()
980 packet->blen = blen; in if_spi_host_to_card()
981 memcpy(packet->buffer, buf, nb); in if_spi_host_to_card()
982 memset(packet->buffer + nb, 0, blen - nb); in if_spi_host_to_card()
986 priv->dnld_sent = DNLD_CMD_SENT; in if_spi_host_to_card()
987 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card()
988 list_add_tail(&packet->list, &card->cmd_packet_list); in if_spi_host_to_card()
989 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card()
992 priv->dnld_sent = DNLD_DATA_SENT; in if_spi_host_to_card()
993 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card()
994 list_add_tail(&packet->list, &card->data_packet_list); in if_spi_host_to_card()
995 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card()
999 netdev_err(priv->dev, "can't transfer buffer of type %d\n", in if_spi_host_to_card()
1001 err = -EINVAL; in if_spi_host_to_card()
1005 /* Queue spi xfer work */ in if_spi_host_to_card()
1006 queue_work(card->workqueue, &card->packet_work); in if_spi_host_to_card()
1016 * don't try to talk on the SPI bus, just queue the SPI xfer work.
1022 queue_work(card->workqueue, &card->packet_work); in if_spi_host_interrupt()
1028 * SPI callbacks
1033 struct lbs_private *priv = card->priv; in if_spi_init_card()
1041 err = spu_init(card, card->pdata->use_dummy_writes); in if_spi_init_card()
1044 err = spu_get_chip_revision(card, &card->card_id, &card->card_rev); in if_spi_init_card()
1057 if (card->card_id == fw_table[i].model) in if_spi_init_card()
1061 netdev_err(priv->dev, "Unsupported chip_id: 0x%02x\n", in if_spi_init_card()
1062 card->card_id); in if_spi_init_card()
1063 err = -ENODEV; in if_spi_init_card()
1067 err = lbs_get_firmware(&card->spi->dev, NULL, NULL, in if_spi_init_card()
1068 card->card_id, &fw_table[0], &helper, in if_spi_init_card()
1071 netdev_err(priv->dev, "failed to find firmware (%d)\n", in if_spi_init_card()
1078 "attached to SPI bus_num %d, chip_select %d. " in if_spi_init_card()
1079 "spi->max_speed_hz=%d\n", in if_spi_init_card()
1080 card->card_id, card->card_rev, in if_spi_init_card()
1081 card->spi->master->bus_num, in if_spi_init_card()
1082 card->spi->chip_select, in if_spi_init_card()
1083 card->spi->max_speed_hz); in if_spi_init_card()
1114 if (card->suspended) { in if_spi_resume_worker()
1115 if (card->pdata->setup) in if_spi_resume_worker()
1116 card->pdata->setup(card->spi); in if_spi_resume_worker()
1121 enable_irq(card->spi->irq); in if_spi_resume_worker()
1124 lbs_resume(card->priv); in if_spi_resume_worker()
1126 card->suspended = 0; in if_spi_resume_worker()
1130 static int __devinit if_spi_probe(struct spi_device *spi) in if_spi_probe() argument
1134 struct libertas_spi_platform_data *pdata = spi->dev.platform_data; in if_spi_probe()
1140 err = -EINVAL; in if_spi_probe()
1144 if (pdata->setup) { in if_spi_probe()
1145 err = pdata->setup(spi); in if_spi_probe()
1153 err = -ENOMEM; in if_spi_probe()
1156 spi_set_drvdata(spi, card); in if_spi_probe()
1157 card->pdata = pdata; in if_spi_probe()
1158 card->spi = spi; in if_spi_probe()
1159 card->prev_xfer_time = jiffies; in if_spi_probe()
1161 INIT_LIST_HEAD(&card->cmd_packet_list); in if_spi_probe()
1162 INIT_LIST_HEAD(&card->data_packet_list); in if_spi_probe()
1163 spin_lock_init(&card->buffer_lock); in if_spi_probe()
1165 /* Initialize the SPI Interface Unit */ in if_spi_probe()
1176 priv = lbs_add_card(card, &spi->dev); in if_spi_probe()
1178 err = -ENOMEM; in if_spi_probe()
1181 card->priv = priv; in if_spi_probe()
1182 priv->setup_fw_on_resume = 1; in if_spi_probe()
1183 priv->card = card; in if_spi_probe()
1184 priv->hw_host_to_card = if_spi_host_to_card; in if_spi_probe()
1185 priv->enter_deep_sleep = NULL; in if_spi_probe()
1186 priv->exit_deep_sleep = NULL; in if_spi_probe()
1187 priv->reset_deep_sleep_wakeup = NULL; in if_spi_probe()
1188 priv->fw_ready = 1; in if_spi_probe()
1191 card->workqueue = create_workqueue("libertas_spi"); in if_spi_probe()
1192 INIT_WORK(&card->packet_work, if_spi_host_to_card_worker); in if_spi_probe()
1193 INIT_WORK(&card->resume_work, if_spi_resume_worker); in if_spi_probe()
1195 err = request_irq(spi->irq, if_spi_host_interrupt, in if_spi_probe()
1198 pr_err("can't get host irq line-- request_irq failed\n"); in if_spi_probe()
1217 free_irq(spi->irq, card); in if_spi_probe()
1219 flush_workqueue(card->workqueue); in if_spi_probe()
1220 destroy_workqueue(card->workqueue); in if_spi_probe()
1225 if (pdata->teardown) in if_spi_probe()
1226 pdata->teardown(spi); in if_spi_probe()
1232 static int __devexit libertas_spi_remove(struct spi_device *spi) in libertas_spi_remove() argument
1234 struct if_spi_card *card = spi_get_drvdata(spi); in libertas_spi_remove()
1235 struct lbs_private *priv = card->priv; in libertas_spi_remove()
1240 cancel_work_sync(&card->resume_work); in libertas_spi_remove()
1245 free_irq(spi->irq, card); in libertas_spi_remove()
1246 flush_workqueue(card->workqueue); in libertas_spi_remove()
1247 destroy_workqueue(card->workqueue); in libertas_spi_remove()
1248 if (card->pdata->teardown) in libertas_spi_remove()
1249 card->pdata->teardown(spi); in libertas_spi_remove()
1257 struct spi_device *spi = to_spi_device(dev); in if_spi_suspend() local
1258 struct if_spi_card *card = spi_get_drvdata(spi); in if_spi_suspend()
1260 if (!card->suspended) { in if_spi_suspend()
1261 lbs_suspend(card->priv); in if_spi_suspend()
1262 flush_workqueue(card->workqueue); in if_spi_suspend()
1263 disable_irq(spi->irq); in if_spi_suspend()
1265 if (card->pdata->teardown) in if_spi_suspend()
1266 card->pdata->teardown(spi); in if_spi_suspend()
1267 card->suspended = 1; in if_spi_suspend()
1275 struct spi_device *spi = to_spi_device(dev); in if_spi_resume() local
1276 struct if_spi_card *card = spi_get_drvdata(spi); in if_spi_resume()
1279 schedule_work(&card->resume_work); in if_spi_resume()
1307 printk(KERN_INFO "libertas_spi: Libertas SPI driver\n"); in if_spi_init_module()
1323 MODULE_DESCRIPTION("Libertas SPI WLAN Driver");
1327 MODULE_ALIAS("spi:libertas_spi");