Lines Matching full:phy

188 static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)  in pn544_hci_i2c_platform_init()  argument
194 nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n"); in pn544_hci_i2c_platform_init()
197 gpiod_set_value_cansleep(phy->gpiod_fw, 0); in pn544_hci_i2c_platform_init()
200 phy->en_polarity = polarity; in pn544_hci_i2c_platform_init()
204 gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity); in pn544_hci_i2c_platform_init()
208 gpiod_set_value_cansleep(phy->gpiod_en, phy->en_polarity); in pn544_hci_i2c_platform_init()
212 dev_dbg(&phy->i2c_dev->dev, "Sending reset cmd\n"); in pn544_hci_i2c_platform_init()
213 ret = i2c_master_send(phy->i2c_dev, rset_cmd, count); in pn544_hci_i2c_platform_init()
215 nfc_info(&phy->i2c_dev->dev, in pn544_hci_i2c_platform_init()
223 nfc_err(&phy->i2c_dev->dev, in pn544_hci_i2c_platform_init()
227 gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity); in pn544_hci_i2c_platform_init()
230 static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode) in pn544_hci_i2c_enable_mode() argument
232 gpiod_set_value_cansleep(phy->gpiod_fw, run_mode == PN544_FW_MODE ? 1 : 0); in pn544_hci_i2c_enable_mode()
233 gpiod_set_value_cansleep(phy->gpiod_en, phy->en_polarity); in pn544_hci_i2c_enable_mode()
236 phy->run_mode = run_mode; in pn544_hci_i2c_enable_mode()
241 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_enable() local
245 pn544_hci_i2c_enable_mode(phy, PN544_HCI_MODE); in pn544_hci_i2c_enable()
247 phy->powered = 1; in pn544_hci_i2c_enable()
254 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_disable() local
256 gpiod_set_value_cansleep(phy->gpiod_fw, 0); in pn544_hci_i2c_disable()
257 gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity); in pn544_hci_i2c_disable()
260 gpiod_set_value_cansleep(phy->gpiod_en, phy->en_polarity); in pn544_hci_i2c_disable()
263 gpiod_set_value_cansleep(phy->gpiod_en, !phy->en_polarity); in pn544_hci_i2c_disable()
266 phy->powered = 0; in pn544_hci_i2c_disable()
297 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_write() local
298 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_write()
300 if (phy->hard_fault != 0) in pn544_hci_i2c_write()
301 return phy->hard_fault; in pn544_hci_i2c_write()
357 static int pn544_hci_i2c_read(struct pn544_i2c_phy *phy, struct sk_buff **skb) in pn544_hci_i2c_read() argument
362 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_read()
416 static int pn544_hci_i2c_fw_read_status(struct pn544_i2c_phy *phy) in pn544_hci_i2c_fw_read_status() argument
420 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_fw_read_status()
483 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_irq_thread_fn() local
488 if (!phy || irq != phy->i2c_dev->irq) { in pn544_hci_i2c_irq_thread_fn()
493 client = phy->i2c_dev; in pn544_hci_i2c_irq_thread_fn()
496 if (phy->hard_fault != 0) in pn544_hci_i2c_irq_thread_fn()
499 if (phy->run_mode == PN544_FW_MODE) { in pn544_hci_i2c_irq_thread_fn()
500 phy->fw_cmd_result = pn544_hci_i2c_fw_read_status(phy); in pn544_hci_i2c_irq_thread_fn()
501 schedule_work(&phy->fw_work); in pn544_hci_i2c_irq_thread_fn()
503 r = pn544_hci_i2c_read(phy, &skb); in pn544_hci_i2c_irq_thread_fn()
505 phy->hard_fault = r; in pn544_hci_i2c_irq_thread_fn()
507 nfc_hci_recv_frame(phy->hdev, NULL); in pn544_hci_i2c_irq_thread_fn()
514 nfc_hci_recv_frame(phy->hdev, skb); in pn544_hci_i2c_irq_thread_fn()
528 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_fw_download() local
532 strcpy(phy->firmware_name, firmware_name); in pn544_hci_i2c_fw_download()
534 phy->hw_variant = hw_variant; in pn544_hci_i2c_fw_download()
535 phy->fw_work_state = FW_WORK_STATE_START; in pn544_hci_i2c_fw_download()
537 schedule_work(&phy->fw_work); in pn544_hci_i2c_fw_download()
542 static void pn544_hci_i2c_fw_work_complete(struct pn544_i2c_phy *phy, in pn544_hci_i2c_fw_work_complete() argument
547 pn544_hci_i2c_disable(phy); in pn544_hci_i2c_fw_work_complete()
549 phy->fw_work_state = FW_WORK_STATE_IDLE; in pn544_hci_i2c_fw_work_complete()
551 if (phy->fw) { in pn544_hci_i2c_fw_work_complete()
552 release_firmware(phy->fw); in pn544_hci_i2c_fw_work_complete()
553 phy->fw = NULL; in pn544_hci_i2c_fw_work_complete()
556 nfc_fw_download_done(phy->hdev->ndev, phy->firmware_name, (u32) -result); in pn544_hci_i2c_fw_work_complete()
639 static int pn544_hci_i2c_fw_write_chunk(struct pn544_i2c_phy *phy) in pn544_hci_i2c_fw_write_chunk() argument
643 r = pn544_hci_i2c_fw_write_cmd(phy->i2c_dev, in pn544_hci_i2c_fw_write_chunk()
644 phy->fw_blob_dest_addr + phy->fw_written, in pn544_hci_i2c_fw_write_chunk()
645 phy->fw_blob_data + phy->fw_written, in pn544_hci_i2c_fw_write_chunk()
646 phy->fw_blob_size - phy->fw_written); in pn544_hci_i2c_fw_write_chunk()
650 phy->fw_written += r; in pn544_hci_i2c_fw_write_chunk()
651 phy->fw_work_state = FW_WORK_STATE_WAIT_WRITE_ANSWER; in pn544_hci_i2c_fw_write_chunk()
656 static int pn544_hci_i2c_fw_secure_write_frame_cmd(struct pn544_i2c_phy *phy, in pn544_hci_i2c_fw_secure_write_frame_cmd() argument
677 r = i2c_master_send(phy->i2c_dev, buf, chunklen); in pn544_hci_i2c_fw_secure_write_frame_cmd()
688 static int pn544_hci_i2c_fw_secure_write_frame(struct pn544_i2c_phy *phy) in pn544_hci_i2c_fw_secure_write_frame() argument
693 framep = (struct pn544_i2c_fw_secure_frame *) phy->fw_blob_data; in pn544_hci_i2c_fw_secure_write_frame()
694 if (phy->fw_written == 0) in pn544_hci_i2c_fw_secure_write_frame()
695 phy->fw_blob_size = get_unaligned_be16(&framep->be_datalen) in pn544_hci_i2c_fw_secure_write_frame()
699 if (phy->fw_blob_size > PN544_FW_I2C_MAX_PAYLOAD && in pn544_hci_i2c_fw_secure_write_frame()
704 if (phy->fw_blob_size < PN544_FW_I2C_MAX_PAYLOAD) { in pn544_hci_i2c_fw_secure_write_frame()
705 r = i2c_master_send(phy->i2c_dev, in pn544_hci_i2c_fw_secure_write_frame()
706 (const char *) phy->fw_blob_data, phy->fw_blob_size); in pn544_hci_i2c_fw_secure_write_frame()
708 if (r == phy->fw_blob_size) in pn544_hci_i2c_fw_secure_write_frame()
716 r = pn544_hci_i2c_fw_secure_write_frame_cmd(phy, in pn544_hci_i2c_fw_secure_write_frame()
717 phy->fw_blob_data + phy->fw_written, in pn544_hci_i2c_fw_secure_write_frame()
718 phy->fw_blob_size - phy->fw_written); in pn544_hci_i2c_fw_secure_write_frame()
723 phy->fw_written += r; in pn544_hci_i2c_fw_secure_write_frame()
724 phy->fw_work_state = FW_WORK_STATE_WAIT_SECURE_WRITE_ANSWER; in pn544_hci_i2c_fw_secure_write_frame()
728 pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE); in pn544_hci_i2c_fw_secure_write_frame()
729 phy->fw_cmd_result = 0; in pn544_hci_i2c_fw_secure_write_frame()
730 schedule_work(&phy->fw_work); in pn544_hci_i2c_fw_secure_write_frame()
738 struct pn544_i2c_phy *phy = container_of(work, struct pn544_i2c_phy, in pn544_hci_i2c_fw_work() local
744 switch (phy->fw_work_state) { in pn544_hci_i2c_fw_work()
746 pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE); in pn544_hci_i2c_fw_work()
748 r = request_firmware(&phy->fw, phy->firmware_name, in pn544_hci_i2c_fw_work()
749 &phy->i2c_dev->dev); in pn544_hci_i2c_fw_work()
753 phy->fw_written = 0; in pn544_hci_i2c_fw_work()
755 switch (phy->hw_variant) { in pn544_hci_i2c_fw_work()
757 blob = (struct pn544_i2c_fw_blob *) phy->fw->data; in pn544_hci_i2c_fw_work()
758 phy->fw_blob_size = get_unaligned_be32(&blob->be_size); in pn544_hci_i2c_fw_work()
759 phy->fw_blob_dest_addr = get_unaligned_be32( in pn544_hci_i2c_fw_work()
761 phy->fw_blob_data = blob->data; in pn544_hci_i2c_fw_work()
763 r = pn544_hci_i2c_fw_write_chunk(phy); in pn544_hci_i2c_fw_work()
767 phy->fw->data; in pn544_hci_i2c_fw_work()
768 phy->fw_blob_data = secure_blob->data; in pn544_hci_i2c_fw_work()
769 phy->fw_size = phy->fw->size; in pn544_hci_i2c_fw_work()
770 r = pn544_hci_i2c_fw_secure_write_frame(phy); in pn544_hci_i2c_fw_work()
779 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
783 r = phy->fw_cmd_result; in pn544_hci_i2c_fw_work()
787 if (phy->fw_written == phy->fw_blob_size) { in pn544_hci_i2c_fw_work()
788 r = pn544_hci_i2c_fw_check_cmd(phy->i2c_dev, in pn544_hci_i2c_fw_work()
789 phy->fw_blob_dest_addr, in pn544_hci_i2c_fw_work()
790 phy->fw_blob_data, in pn544_hci_i2c_fw_work()
791 phy->fw_blob_size); in pn544_hci_i2c_fw_work()
794 phy->fw_work_state = FW_WORK_STATE_WAIT_CHECK_ANSWER; in pn544_hci_i2c_fw_work()
798 r = pn544_hci_i2c_fw_write_chunk(phy); in pn544_hci_i2c_fw_work()
802 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
806 r = phy->fw_cmd_result; in pn544_hci_i2c_fw_work()
810 blob = (struct pn544_i2c_fw_blob *) (phy->fw_blob_data + in pn544_hci_i2c_fw_work()
811 phy->fw_blob_size); in pn544_hci_i2c_fw_work()
812 phy->fw_blob_size = get_unaligned_be32(&blob->be_size); in pn544_hci_i2c_fw_work()
813 if (phy->fw_blob_size != 0) { in pn544_hci_i2c_fw_work()
814 phy->fw_blob_dest_addr = in pn544_hci_i2c_fw_work()
816 phy->fw_blob_data = blob->data; in pn544_hci_i2c_fw_work()
818 phy->fw_written = 0; in pn544_hci_i2c_fw_work()
819 r = pn544_hci_i2c_fw_write_chunk(phy); in pn544_hci_i2c_fw_work()
823 if (r < 0 || phy->fw_blob_size == 0) in pn544_hci_i2c_fw_work()
824 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
828 r = phy->fw_cmd_result; in pn544_hci_i2c_fw_work()
833 r = pn544_hci_i2c_fw_secure_write_frame(phy); in pn544_hci_i2c_fw_work()
837 if (phy->fw_written == phy->fw_blob_size) { in pn544_hci_i2c_fw_work()
839 (phy->fw_blob_data + phy->fw_blob_size); in pn544_hci_i2c_fw_work()
840 phy->fw_size -= phy->fw_blob_size + in pn544_hci_i2c_fw_work()
842 if (phy->fw_size >= PN544_FW_SECURE_BLOB_HEADER_LEN in pn544_hci_i2c_fw_work()
844 phy->fw_blob_data = secure_blob->data; in pn544_hci_i2c_fw_work()
846 phy->fw_written = 0; in pn544_hci_i2c_fw_work()
847 r = pn544_hci_i2c_fw_secure_write_frame(phy); in pn544_hci_i2c_fw_work()
852 if (r < 0 || phy->fw_size == 0) in pn544_hci_i2c_fw_work()
853 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
874 struct pn544_i2c_phy *phy; in pn544_hci_i2c_probe() local
885 phy = devm_kzalloc(&client->dev, sizeof(struct pn544_i2c_phy), in pn544_hci_i2c_probe()
887 if (!phy) in pn544_hci_i2c_probe()
890 INIT_WORK(&phy->fw_work, pn544_hci_i2c_fw_work); in pn544_hci_i2c_probe()
891 phy->fw_work_state = FW_WORK_STATE_IDLE; in pn544_hci_i2c_probe()
893 phy->i2c_dev = client; in pn544_hci_i2c_probe()
894 i2c_set_clientdata(client, phy); in pn544_hci_i2c_probe()
901 phy->gpiod_en = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); in pn544_hci_i2c_probe()
902 if (IS_ERR(phy->gpiod_en)) { in pn544_hci_i2c_probe()
904 return PTR_ERR(phy->gpiod_en); in pn544_hci_i2c_probe()
908 phy->gpiod_fw = devm_gpiod_get(dev, "firmware", GPIOD_OUT_LOW); in pn544_hci_i2c_probe()
909 if (IS_ERR(phy->gpiod_fw)) { in pn544_hci_i2c_probe()
911 return PTR_ERR(phy->gpiod_fw); in pn544_hci_i2c_probe()
914 pn544_hci_i2c_platform_init(phy); in pn544_hci_i2c_probe()
919 PN544_HCI_I2C_DRIVER_NAME, phy); in pn544_hci_i2c_probe()
925 r = pn544_hci_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME, in pn544_hci_i2c_probe()
928 pn544_hci_i2c_fw_download, &phy->hdev); in pn544_hci_i2c_probe()
937 struct pn544_i2c_phy *phy = i2c_get_clientdata(client); in pn544_hci_i2c_remove() local
941 cancel_work_sync(&phy->fw_work); in pn544_hci_i2c_remove()
942 if (phy->fw_work_state != FW_WORK_STATE_IDLE) in pn544_hci_i2c_remove()
943 pn544_hci_i2c_fw_work_complete(phy, -ENODEV); in pn544_hci_i2c_remove()
945 pn544_hci_remove(phy->hdev); in pn544_hci_i2c_remove()
947 if (phy->powered) in pn544_hci_i2c_remove()
948 pn544_hci_i2c_disable(phy); in pn544_hci_i2c_remove()