Lines Matching refs:card
81 static void free_if_spi_card(struct if_spi_card *card) in free_if_spi_card() argument
86 list_for_each_safe(cursor, next, &card->cmd_packet_list) { in free_if_spi_card()
91 list_for_each_safe(cursor, next, &card->data_packet_list) { in free_if_spi_card()
96 kfree(card); in free_if_spi_card()
133 static void spu_transaction_init(struct if_spi_card *card) in spu_transaction_init() argument
135 if (!time_after(jiffies, card->prev_xfer_time + 1)) { in spu_transaction_init()
144 static void spu_transaction_finish(struct if_spi_card *card) in spu_transaction_finish() argument
146 card->prev_xfer_time = jiffies; in spu_transaction_finish()
153 static int spu_write(struct if_spi_card *card, u16 reg, const u8 *buf, int len) in spu_write() argument
169 spu_transaction_init(card); in spu_write()
181 err = spi_sync(card->spi, &m); in spu_write()
182 spu_transaction_finish(card); in spu_write()
186 static inline int spu_write_u16(struct if_spi_card *card, u16 reg, u16 val) in spu_write_u16() argument
191 return spu_write(card, reg, (u8 *)&buff, sizeof(u16)); in spu_write_u16()
206 static int spu_read(struct if_spi_card *card, u16 reg, u8 *buf, int len) in spu_read() argument
222 spu_transaction_init(card); in spu_read()
234 delay = spu_reg_is_port_reg(reg) ? card->spu_port_delay : in spu_read()
235 card->spu_reg_delay; in spu_read()
236 if (card->use_dummy_writes) { in spu_read()
251 err = spi_sync(card->spi, &m); in spu_read()
252 spu_transaction_finish(card); in spu_read()
257 static inline int spu_read_u16(struct if_spi_card *card, u16 reg, u16 *val) in spu_read_u16() argument
262 ret = spu_read(card, reg, (u8 *)&buf, sizeof(buf)); in spu_read_u16()
272 static int spu_read_u32(struct if_spi_card *card, u16 reg, u32 *val) in spu_read_u32() argument
277 err = spu_read(card, reg, (u8 *)&buf, sizeof(buf)); in spu_read_u32()
292 static int spu_wait_for_u16(struct if_spi_card *card, u16 reg, in spu_wait_for_u16() argument
299 err = spu_read_u16(card, reg, &val); in spu_wait_for_u16()
322 static int spu_wait_for_u32(struct if_spi_card *card, u32 reg, u32 target) in spu_wait_for_u32() argument
327 err = spu_read_u32(card, reg, &val); in spu_wait_for_u32()
337 static int spu_set_interrupt_mode(struct if_spi_card *card, in spu_set_interrupt_mode() argument
348 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_MASK_REG, 0); in spu_set_interrupt_mode()
352 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_MASK_REG, in spu_set_interrupt_mode()
369 err = spu_write_u16(card, IF_SPI_HOST_INT_CTRL_REG, in spu_set_interrupt_mode()
377 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_MASK_REG, 0); in spu_set_interrupt_mode()
384 static int spu_get_chip_revision(struct if_spi_card *card, in spu_get_chip_revision() argument
389 err = spu_read_u32(card, IF_SPI_DEVICEID_CTRL_REG, &dev_ctrl); in spu_get_chip_revision()
397 static int spu_set_bus_mode(struct if_spi_card *card, u16 mode) in spu_set_bus_mode() argument
402 err = spu_write_u16(card, IF_SPI_SPU_BUS_MODE_REG, mode); in spu_set_bus_mode()
406 err = spu_read_u16(card, IF_SPI_SPU_BUS_MODE_REG, &rval); in spu_set_bus_mode()
416 static int spu_init(struct if_spi_card *card, int use_dummy_writes) in spu_init() argument
425 card->use_dummy_writes = 0; in spu_init()
426 err = spu_set_bus_mode(card, in spu_init()
432 card->spu_port_delay = 1000; in spu_init()
433 card->spu_reg_delay = 1000; in spu_init()
434 err = spu_read_u32(card, IF_SPI_DELAY_READ_REG, &delay); in spu_init()
437 card->spu_port_delay = delay & 0x0000ffff; in spu_init()
438 card->spu_reg_delay = (delay & 0xffff0000) >> 16; in spu_init()
442 card->use_dummy_writes = 1; in spu_init()
443 err = spu_set_bus_mode(card, in spu_init()
453 card->spu_port_delay, card->spu_reg_delay); in spu_init()
461 static int if_spi_prog_helper_firmware(struct if_spi_card *card, in if_spi_prog_helper_firmware() argument
471 err = spu_set_interrupt_mode(card, 1, 0); in if_spi_prog_helper_firmware()
484 err = spu_write_u16(card, IF_SPI_SCRATCH_1_REG, in if_spi_prog_helper_firmware()
489 err = spu_wait_for_u16(card, IF_SPI_HOST_INT_STATUS_REG, in if_spi_prog_helper_firmware()
503 err = spu_write(card, IF_SPI_CMD_RDWRPORT_REG, in if_spi_prog_helper_firmware()
509 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0); in if_spi_prog_helper_firmware()
512 err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, in if_spi_prog_helper_firmware()
525 err = spu_write_u16(card, IF_SPI_SCRATCH_1_REG, FIRMWARE_DNLD_OK); in if_spi_prog_helper_firmware()
528 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0); in if_spi_prog_helper_firmware()
531 err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, in if_spi_prog_helper_firmware()
544 static int if_spi_prog_main_firmware_check_len(struct if_spi_card *card, in if_spi_prog_main_firmware_check_len() argument
554 err = spu_wait_for_u16(card, IF_SPI_HOST_INT_STATUS_REG, in if_spi_prog_main_firmware_check_len()
563 err = spu_read_u16(card, IF_SPI_SCRATCH_1_REG, &len); in if_spi_prog_main_firmware_check_len()
582 static int if_spi_prog_main_firmware(struct if_spi_card *card, in if_spi_prog_main_firmware() argument
585 struct lbs_private *priv = card->priv; in if_spi_prog_main_firmware()
593 err = spu_set_interrupt_mode(card, 1, 0); in if_spi_prog_main_firmware()
597 err = spu_wait_for_u16(card, IF_SPI_SCRATCH_1_REG, 0, 0); in if_spi_prog_main_firmware()
609 while ((len = if_spi_prog_main_firmware_check_len(card, &crc_err))) { in if_spi_prog_main_firmware()
636 memset(card->cmd_buffer, 0, len); in if_spi_prog_main_firmware()
637 memcpy(card->cmd_buffer, fw, bytes); in if_spi_prog_main_firmware()
639 memcpy(card->cmd_buffer, fw, len); in if_spi_prog_main_firmware()
641 err = spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, 0); in if_spi_prog_main_firmware()
644 err = spu_write(card, IF_SPI_CMD_RDWRPORT_REG, in if_spi_prog_main_firmware()
645 card->cmd_buffer, len); in if_spi_prog_main_firmware()
648 err = spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG , in if_spi_prog_main_firmware()
659 err = spu_wait_for_u32(card, IF_SPI_SCRATCH_4_REG, in if_spi_prog_main_firmware()
680 static int if_spi_c2h_cmd(struct if_spi_card *card) in if_spi_c2h_cmd() argument
682 struct lbs_private *priv = card->priv; in if_spi_c2h_cmd()
705 err = spu_read_u16(card, IF_SPI_SCRATCH_2_REG, &len); in if_spi_c2h_cmd()
722 err = spu_read(card, IF_SPI_CMD_RDWRPORT_REG, in if_spi_c2h_cmd()
723 card->cmd_buffer, ALIGN(len, 4)); in if_spi_c2h_cmd()
731 memcpy(priv->resp_buf[i], card->cmd_buffer, len); in if_spi_c2h_cmd()
743 static int if_spi_c2h_data(struct if_spi_card *card) in if_spi_c2h_data() argument
745 struct lbs_private *priv = card->priv; in if_spi_c2h_data()
754 err = spu_read_u16(card, IF_SPI_SCRATCH_1_REG, &len); in if_spi_c2h_data()
780 err = spu_read(card, IF_SPI_DATA_RDWRPORT_REG, data, ALIGN(len, 4)); in if_spi_c2h_data()
785 err = lbs_process_rxed_packet(card->priv, skb); in if_spi_c2h_data()
802 static void if_spi_h2c(struct if_spi_card *card, in if_spi_h2c() argument
805 struct lbs_private *priv = card->priv; in if_spi_h2c()
826 err = spu_write(card, port_reg, packet->buffer, packet->blen); in if_spi_h2c()
838 static void if_spi_e2h(struct if_spi_card *card) in if_spi_e2h() argument
842 struct lbs_private *priv = card->priv; in if_spi_e2h()
844 err = spu_read_u32(card, IF_SPI_SCRATCH_3_REG, &cause); in if_spi_e2h()
849 spu_write_u16(card, IF_SPI_HOST_INT_STATUS_REG, in if_spi_e2h()
853 spu_write_u16(card, IF_SPI_CARD_INT_CAUSE_REG, IF_SPI_CIC_HOST_EVENT); in if_spi_e2h()
864 struct if_spi_card *card; in if_spi_host_to_card_worker() local
870 card = container_of(work, struct if_spi_card, packet_work); in if_spi_host_to_card_worker()
871 priv = card->priv; in if_spi_host_to_card_worker()
879 err = spu_read_u16(card, IF_SPI_HOST_INT_STATUS_REG, in if_spi_host_to_card_worker()
887 err = if_spi_c2h_cmd(card); in if_spi_host_to_card_worker()
892 err = if_spi_c2h_data(card); in if_spi_host_to_card_worker()
902 (card->priv->psstate != PS_STATE_FULL_POWER && in if_spi_host_to_card_worker()
911 lbs_host_to_card_done(card->priv); in if_spi_host_to_card_worker()
915 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
916 if (!list_empty(&card->cmd_packet_list)) { in if_spi_host_to_card_worker()
917 packet = (struct if_spi_packet *)(card-> in if_spi_host_to_card_worker()
921 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
924 if_spi_h2c(card, packet, MVMS_CMD); in if_spi_host_to_card_worker()
929 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
930 if (!list_empty(&card->data_packet_list)) { in if_spi_host_to_card_worker()
931 packet = (struct if_spi_packet *)(card-> in if_spi_host_to_card_worker()
935 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card_worker()
938 if_spi_h2c(card, packet, MVMS_DAT); in if_spi_host_to_card_worker()
941 if_spi_e2h(card); in if_spi_host_to_card_worker()
961 struct if_spi_card *card = priv->card; in if_spi_host_to_card() local
986 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card()
987 list_add_tail(&packet->list, &card->cmd_packet_list); in if_spi_host_to_card()
988 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card()
992 spin_lock_irqsave(&card->buffer_lock, flags); in if_spi_host_to_card()
993 list_add_tail(&packet->list, &card->data_packet_list); in if_spi_host_to_card()
994 spin_unlock_irqrestore(&card->buffer_lock, flags); in if_spi_host_to_card()
1005 queue_work(card->workqueue, &card->packet_work); in if_spi_host_to_card()
1019 struct if_spi_card *card = dev_id; in if_spi_host_interrupt() local
1021 queue_work(card->workqueue, &card->packet_work); in if_spi_host_interrupt()
1030 static int if_spi_init_card(struct if_spi_card *card) in if_spi_init_card() argument
1032 struct lbs_private *priv = card->priv; in if_spi_init_card()
1040 err = spu_init(card, card->pdata->use_dummy_writes); in if_spi_init_card()
1043 err = spu_get_chip_revision(card, &card->card_id, &card->card_rev); in if_spi_init_card()
1047 err = spu_read_u32(card, IF_SPI_SCRATCH_4_REG, &scratch); in if_spi_init_card()
1056 if (card->card_id == fw_table[i].model) in if_spi_init_card()
1061 card->card_id); in if_spi_init_card()
1066 err = lbs_get_firmware(&card->spi->dev, card->card_id, in if_spi_init_card()
1078 card->card_id, card->card_rev, in if_spi_init_card()
1079 card->spi->master->bus_num, in if_spi_init_card()
1080 card->spi->chip_select, in if_spi_init_card()
1081 card->spi->max_speed_hz); in if_spi_init_card()
1082 err = if_spi_prog_helper_firmware(card, helper); in if_spi_init_card()
1085 err = if_spi_prog_main_firmware(card, mainfw); in if_spi_init_card()
1091 err = spu_set_interrupt_mode(card, 0, 1); in if_spi_init_card()
1102 struct if_spi_card *card; in if_spi_resume_worker() local
1104 card = container_of(work, struct if_spi_card, resume_work); in if_spi_resume_worker()
1106 if (card->suspended) { in if_spi_resume_worker()
1107 if (card->pdata->setup) in if_spi_resume_worker()
1108 card->pdata->setup(card->spi); in if_spi_resume_worker()
1111 if_spi_init_card(card); in if_spi_resume_worker()
1113 enable_irq(card->spi->irq); in if_spi_resume_worker()
1116 lbs_resume(card->priv); in if_spi_resume_worker()
1118 card->suspended = 0; in if_spi_resume_worker()
1124 struct if_spi_card *card; in if_spi_probe() local
1143 card = kzalloc(sizeof(struct if_spi_card), GFP_KERNEL); in if_spi_probe()
1144 if (!card) { in if_spi_probe()
1148 spi_set_drvdata(spi, card); in if_spi_probe()
1149 card->pdata = pdata; in if_spi_probe()
1150 card->spi = spi; in if_spi_probe()
1151 card->prev_xfer_time = jiffies; in if_spi_probe()
1153 INIT_LIST_HEAD(&card->cmd_packet_list); in if_spi_probe()
1154 INIT_LIST_HEAD(&card->data_packet_list); in if_spi_probe()
1155 spin_lock_init(&card->buffer_lock); in if_spi_probe()
1160 err = if_spi_init_card(card); in if_spi_probe()
1168 priv = lbs_add_card(card, &spi->dev); in if_spi_probe()
1173 card->priv = priv; in if_spi_probe()
1175 priv->card = card; in if_spi_probe()
1183 card->workqueue = create_workqueue("libertas_spi"); in if_spi_probe()
1184 INIT_WORK(&card->packet_work, if_spi_host_to_card_worker); in if_spi_probe()
1185 INIT_WORK(&card->resume_work, if_spi_resume_worker); in if_spi_probe()
1188 IRQF_TRIGGER_FALLING, "libertas_spi", card); in if_spi_probe()
1209 free_irq(spi->irq, card); in if_spi_probe()
1211 flush_workqueue(card->workqueue); in if_spi_probe()
1212 destroy_workqueue(card->workqueue); in if_spi_probe()
1215 free_if_spi_card(card); in if_spi_probe()
1226 struct if_spi_card *card = spi_get_drvdata(spi); in libertas_spi_remove() local
1227 struct lbs_private *priv = card->priv; in libertas_spi_remove()
1232 cancel_work_sync(&card->resume_work); in libertas_spi_remove()
1237 free_irq(spi->irq, card); in libertas_spi_remove()
1238 flush_workqueue(card->workqueue); in libertas_spi_remove()
1239 destroy_workqueue(card->workqueue); in libertas_spi_remove()
1240 if (card->pdata->teardown) in libertas_spi_remove()
1241 card->pdata->teardown(spi); in libertas_spi_remove()
1242 free_if_spi_card(card); in libertas_spi_remove()
1250 struct if_spi_card *card = spi_get_drvdata(spi); in if_spi_suspend() local
1252 if (!card->suspended) { in if_spi_suspend()
1253 lbs_suspend(card->priv); in if_spi_suspend()
1254 flush_workqueue(card->workqueue); in if_spi_suspend()
1257 if (card->pdata->teardown) in if_spi_suspend()
1258 card->pdata->teardown(spi); in if_spi_suspend()
1259 card->suspended = 1; in if_spi_suspend()
1268 struct if_spi_card *card = spi_get_drvdata(spi); in if_spi_resume() local
1271 schedule_work(&card->resume_work); in if_spi_resume()