Lines Matching refs:phy

203 static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)  in pn544_hci_i2c_platform_init()  argument
209 nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n"); in pn544_hci_i2c_platform_init()
212 gpio_set_value_cansleep(phy->gpio_fw, 0); in pn544_hci_i2c_platform_init()
215 phy->en_polarity = polarity; in pn544_hci_i2c_platform_init()
219 gpio_set_value_cansleep(phy->gpio_en, in pn544_hci_i2c_platform_init()
220 !phy->en_polarity); in pn544_hci_i2c_platform_init()
224 gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity); in pn544_hci_i2c_platform_init()
228 dev_dbg(&phy->i2c_dev->dev, "Sending reset cmd\n"); in pn544_hci_i2c_platform_init()
229 ret = i2c_master_send(phy->i2c_dev, rset_cmd, count); in pn544_hci_i2c_platform_init()
231 nfc_info(&phy->i2c_dev->dev, in pn544_hci_i2c_platform_init()
239 nfc_err(&phy->i2c_dev->dev, in pn544_hci_i2c_platform_init()
243 gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity); in pn544_hci_i2c_platform_init()
246 static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode) in pn544_hci_i2c_enable_mode() argument
248 gpio_set_value_cansleep(phy->gpio_fw, in pn544_hci_i2c_enable_mode()
250 gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity); in pn544_hci_i2c_enable_mode()
253 phy->run_mode = run_mode; in pn544_hci_i2c_enable_mode()
258 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_enable() local
262 pn544_hci_i2c_enable_mode(phy, PN544_HCI_MODE); in pn544_hci_i2c_enable()
264 phy->powered = 1; in pn544_hci_i2c_enable()
271 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_disable() local
273 gpio_set_value_cansleep(phy->gpio_fw, 0); in pn544_hci_i2c_disable()
274 gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity); in pn544_hci_i2c_disable()
277 gpio_set_value_cansleep(phy->gpio_en, phy->en_polarity); in pn544_hci_i2c_disable()
280 gpio_set_value_cansleep(phy->gpio_en, !phy->en_polarity); in pn544_hci_i2c_disable()
283 phy->powered = 0; in pn544_hci_i2c_disable()
314 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_write() local
315 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_write()
317 if (phy->hard_fault != 0) in pn544_hci_i2c_write()
318 return phy->hard_fault; in pn544_hci_i2c_write()
374 static int pn544_hci_i2c_read(struct pn544_i2c_phy *phy, struct sk_buff **skb) in pn544_hci_i2c_read() argument
379 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_read()
433 static int pn544_hci_i2c_fw_read_status(struct pn544_i2c_phy *phy) in pn544_hci_i2c_fw_read_status() argument
437 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_fw_read_status()
500 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_irq_thread_fn() local
505 if (!phy || irq != phy->i2c_dev->irq) { in pn544_hci_i2c_irq_thread_fn()
510 client = phy->i2c_dev; in pn544_hci_i2c_irq_thread_fn()
513 if (phy->hard_fault != 0) in pn544_hci_i2c_irq_thread_fn()
516 if (phy->run_mode == PN544_FW_MODE) { in pn544_hci_i2c_irq_thread_fn()
517 phy->fw_cmd_result = pn544_hci_i2c_fw_read_status(phy); in pn544_hci_i2c_irq_thread_fn()
518 schedule_work(&phy->fw_work); in pn544_hci_i2c_irq_thread_fn()
520 r = pn544_hci_i2c_read(phy, &skb); in pn544_hci_i2c_irq_thread_fn()
522 phy->hard_fault = r; in pn544_hci_i2c_irq_thread_fn()
524 nfc_hci_recv_frame(phy->hdev, NULL); in pn544_hci_i2c_irq_thread_fn()
531 nfc_hci_recv_frame(phy->hdev, skb); in pn544_hci_i2c_irq_thread_fn()
545 struct pn544_i2c_phy *phy = phy_id; in pn544_hci_i2c_fw_download() local
549 strcpy(phy->firmware_name, firmware_name); in pn544_hci_i2c_fw_download()
551 phy->hw_variant = hw_variant; in pn544_hci_i2c_fw_download()
552 phy->fw_work_state = FW_WORK_STATE_START; in pn544_hci_i2c_fw_download()
554 schedule_work(&phy->fw_work); in pn544_hci_i2c_fw_download()
559 static void pn544_hci_i2c_fw_work_complete(struct pn544_i2c_phy *phy, in pn544_hci_i2c_fw_work_complete() argument
564 pn544_hci_i2c_disable(phy); in pn544_hci_i2c_fw_work_complete()
566 phy->fw_work_state = FW_WORK_STATE_IDLE; in pn544_hci_i2c_fw_work_complete()
568 if (phy->fw) { in pn544_hci_i2c_fw_work_complete()
569 release_firmware(phy->fw); in pn544_hci_i2c_fw_work_complete()
570 phy->fw = NULL; in pn544_hci_i2c_fw_work_complete()
573 nfc_fw_download_done(phy->hdev->ndev, phy->firmware_name, (u32) -result); in pn544_hci_i2c_fw_work_complete()
656 static int pn544_hci_i2c_fw_write_chunk(struct pn544_i2c_phy *phy) in pn544_hci_i2c_fw_write_chunk() argument
660 r = pn544_hci_i2c_fw_write_cmd(phy->i2c_dev, in pn544_hci_i2c_fw_write_chunk()
661 phy->fw_blob_dest_addr + phy->fw_written, in pn544_hci_i2c_fw_write_chunk()
662 phy->fw_blob_data + phy->fw_written, in pn544_hci_i2c_fw_write_chunk()
663 phy->fw_blob_size - phy->fw_written); in pn544_hci_i2c_fw_write_chunk()
667 phy->fw_written += r; in pn544_hci_i2c_fw_write_chunk()
668 phy->fw_work_state = FW_WORK_STATE_WAIT_WRITE_ANSWER; in pn544_hci_i2c_fw_write_chunk()
673 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
694 r = i2c_master_send(phy->i2c_dev, buf, chunklen); in pn544_hci_i2c_fw_secure_write_frame_cmd()
705 static int pn544_hci_i2c_fw_secure_write_frame(struct pn544_i2c_phy *phy) in pn544_hci_i2c_fw_secure_write_frame() argument
710 framep = (struct pn544_i2c_fw_secure_frame *) phy->fw_blob_data; in pn544_hci_i2c_fw_secure_write_frame()
711 if (phy->fw_written == 0) in pn544_hci_i2c_fw_secure_write_frame()
712 phy->fw_blob_size = get_unaligned_be16(&framep->be_datalen) in pn544_hci_i2c_fw_secure_write_frame()
716 if (phy->fw_blob_size > PN544_FW_I2C_MAX_PAYLOAD && in pn544_hci_i2c_fw_secure_write_frame()
721 if (phy->fw_blob_size < PN544_FW_I2C_MAX_PAYLOAD) { in pn544_hci_i2c_fw_secure_write_frame()
722 r = i2c_master_send(phy->i2c_dev, in pn544_hci_i2c_fw_secure_write_frame()
723 (const char *) phy->fw_blob_data, phy->fw_blob_size); in pn544_hci_i2c_fw_secure_write_frame()
725 if (r == phy->fw_blob_size) in pn544_hci_i2c_fw_secure_write_frame()
733 r = pn544_hci_i2c_fw_secure_write_frame_cmd(phy, in pn544_hci_i2c_fw_secure_write_frame()
734 phy->fw_blob_data + phy->fw_written, in pn544_hci_i2c_fw_secure_write_frame()
735 phy->fw_blob_size - phy->fw_written); in pn544_hci_i2c_fw_secure_write_frame()
740 phy->fw_written += r; in pn544_hci_i2c_fw_secure_write_frame()
741 phy->fw_work_state = FW_WORK_STATE_WAIT_SECURE_WRITE_ANSWER; in pn544_hci_i2c_fw_secure_write_frame()
745 pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE); in pn544_hci_i2c_fw_secure_write_frame()
746 phy->fw_cmd_result = 0; in pn544_hci_i2c_fw_secure_write_frame()
747 schedule_work(&phy->fw_work); in pn544_hci_i2c_fw_secure_write_frame()
755 struct pn544_i2c_phy *phy = container_of(work, struct pn544_i2c_phy, in pn544_hci_i2c_fw_work() local
761 switch (phy->fw_work_state) { in pn544_hci_i2c_fw_work()
763 pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE); in pn544_hci_i2c_fw_work()
765 r = request_firmware(&phy->fw, phy->firmware_name, in pn544_hci_i2c_fw_work()
766 &phy->i2c_dev->dev); in pn544_hci_i2c_fw_work()
770 phy->fw_written = 0; in pn544_hci_i2c_fw_work()
772 switch (phy->hw_variant) { in pn544_hci_i2c_fw_work()
774 blob = (struct pn544_i2c_fw_blob *) phy->fw->data; in pn544_hci_i2c_fw_work()
775 phy->fw_blob_size = get_unaligned_be32(&blob->be_size); in pn544_hci_i2c_fw_work()
776 phy->fw_blob_dest_addr = get_unaligned_be32( in pn544_hci_i2c_fw_work()
778 phy->fw_blob_data = blob->data; in pn544_hci_i2c_fw_work()
780 r = pn544_hci_i2c_fw_write_chunk(phy); in pn544_hci_i2c_fw_work()
784 phy->fw->data; in pn544_hci_i2c_fw_work()
785 phy->fw_blob_data = secure_blob->data; in pn544_hci_i2c_fw_work()
786 phy->fw_size = phy->fw->size; in pn544_hci_i2c_fw_work()
787 r = pn544_hci_i2c_fw_secure_write_frame(phy); in pn544_hci_i2c_fw_work()
796 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
800 r = phy->fw_cmd_result; in pn544_hci_i2c_fw_work()
804 if (phy->fw_written == phy->fw_blob_size) { in pn544_hci_i2c_fw_work()
805 r = pn544_hci_i2c_fw_check_cmd(phy->i2c_dev, in pn544_hci_i2c_fw_work()
806 phy->fw_blob_dest_addr, in pn544_hci_i2c_fw_work()
807 phy->fw_blob_data, in pn544_hci_i2c_fw_work()
808 phy->fw_blob_size); in pn544_hci_i2c_fw_work()
811 phy->fw_work_state = FW_WORK_STATE_WAIT_CHECK_ANSWER; in pn544_hci_i2c_fw_work()
815 r = pn544_hci_i2c_fw_write_chunk(phy); in pn544_hci_i2c_fw_work()
819 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
823 r = phy->fw_cmd_result; in pn544_hci_i2c_fw_work()
827 blob = (struct pn544_i2c_fw_blob *) (phy->fw_blob_data + in pn544_hci_i2c_fw_work()
828 phy->fw_blob_size); in pn544_hci_i2c_fw_work()
829 phy->fw_blob_size = get_unaligned_be32(&blob->be_size); in pn544_hci_i2c_fw_work()
830 if (phy->fw_blob_size != 0) { in pn544_hci_i2c_fw_work()
831 phy->fw_blob_dest_addr = in pn544_hci_i2c_fw_work()
833 phy->fw_blob_data = blob->data; in pn544_hci_i2c_fw_work()
835 phy->fw_written = 0; in pn544_hci_i2c_fw_work()
836 r = pn544_hci_i2c_fw_write_chunk(phy); in pn544_hci_i2c_fw_work()
840 if (r < 0 || phy->fw_blob_size == 0) in pn544_hci_i2c_fw_work()
841 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
845 r = phy->fw_cmd_result; in pn544_hci_i2c_fw_work()
850 r = pn544_hci_i2c_fw_secure_write_frame(phy); in pn544_hci_i2c_fw_work()
854 if (phy->fw_written == phy->fw_blob_size) { in pn544_hci_i2c_fw_work()
856 (phy->fw_blob_data + phy->fw_blob_size); in pn544_hci_i2c_fw_work()
857 phy->fw_size -= phy->fw_blob_size + in pn544_hci_i2c_fw_work()
859 if (phy->fw_size >= PN544_FW_SECURE_BLOB_HEADER_LEN in pn544_hci_i2c_fw_work()
861 phy->fw_blob_data = secure_blob->data; in pn544_hci_i2c_fw_work()
863 phy->fw_written = 0; in pn544_hci_i2c_fw_work()
864 r = pn544_hci_i2c_fw_secure_write_frame(phy); in pn544_hci_i2c_fw_work()
869 if (r < 0 || phy->fw_size == 0) in pn544_hci_i2c_fw_work()
870 pn544_hci_i2c_fw_work_complete(phy, r); in pn544_hci_i2c_fw_work()
880 struct pn544_i2c_phy *phy = i2c_get_clientdata(client); in pn544_hci_i2c_acpi_request_resources() local
905 phy->gpio_en = desc_to_gpio(gpiod_en); in pn544_hci_i2c_acpi_request_resources()
922 phy->gpio_fw = desc_to_gpio(gpiod_fw); in pn544_hci_i2c_acpi_request_resources()
939 phy->gpio_irq = desc_to_gpio(gpiod_irq); in pn544_hci_i2c_acpi_request_resources()
966 struct pn544_i2c_phy *phy = i2c_get_clientdata(client); in pn544_hci_i2c_of_request_resources() local
984 phy->gpio_en = ret; in pn544_hci_i2c_of_request_resources()
987 ret = gpio_request(phy->gpio_en, PN544_GPIO_NAME_EN); in pn544_hci_i2c_of_request_resources()
992 ret = gpio_direction_output(phy->gpio_en, 0); in pn544_hci_i2c_of_request_resources()
1006 phy->gpio_fw = ret; in pn544_hci_i2c_of_request_resources()
1009 ret = gpio_request(phy->gpio_fw, PN544_GPIO_NAME_FW); in pn544_hci_i2c_of_request_resources()
1014 ret = gpio_direction_output(phy->gpio_fw, 0); in pn544_hci_i2c_of_request_resources()
1032 gpio_free(phy->gpio_fw); in pn544_hci_i2c_of_request_resources()
1034 gpio_free(phy->gpio_en); in pn544_hci_i2c_of_request_resources()
1051 struct pn544_i2c_phy *phy; in pn544_hci_i2c_probe() local
1063 phy = devm_kzalloc(&client->dev, sizeof(struct pn544_i2c_phy), in pn544_hci_i2c_probe()
1065 if (!phy) in pn544_hci_i2c_probe()
1068 INIT_WORK(&phy->fw_work, pn544_hci_i2c_fw_work); in pn544_hci_i2c_probe()
1069 phy->fw_work_state = FW_WORK_STATE_IDLE; in pn544_hci_i2c_probe()
1071 phy->i2c_dev = client; in pn544_hci_i2c_probe()
1072 i2c_set_clientdata(client, phy); in pn544_hci_i2c_probe()
1098 phy->gpio_en = pdata->get_gpio(NFC_GPIO_ENABLE); in pn544_hci_i2c_probe()
1099 phy->gpio_fw = pdata->get_gpio(NFC_GPIO_FW_RESET); in pn544_hci_i2c_probe()
1100 phy->gpio_irq = pdata->get_gpio(NFC_GPIO_IRQ); in pn544_hci_i2c_probe()
1114 pn544_hci_i2c_platform_init(phy); in pn544_hci_i2c_probe()
1118 PN544_HCI_I2C_DRIVER_NAME, phy); in pn544_hci_i2c_probe()
1124 r = pn544_hci_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME, in pn544_hci_i2c_probe()
1127 pn544_hci_i2c_fw_download, &phy->hdev); in pn544_hci_i2c_probe()
1134 free_irq(client->irq, phy); in pn544_hci_i2c_probe()
1138 gpio_free(phy->gpio_en); in pn544_hci_i2c_probe()
1139 gpio_free(phy->gpio_fw); in pn544_hci_i2c_probe()
1149 struct pn544_i2c_phy *phy = i2c_get_clientdata(client); in pn544_hci_i2c_remove() local
1154 cancel_work_sync(&phy->fw_work); in pn544_hci_i2c_remove()
1155 if (phy->fw_work_state != FW_WORK_STATE_IDLE) in pn544_hci_i2c_remove()
1156 pn544_hci_i2c_fw_work_complete(phy, -ENODEV); in pn544_hci_i2c_remove()
1158 pn544_hci_remove(phy->hdev); in pn544_hci_i2c_remove()
1160 if (phy->powered) in pn544_hci_i2c_remove()
1161 pn544_hci_i2c_disable(phy); in pn544_hci_i2c_remove()
1163 free_irq(client->irq, phy); in pn544_hci_i2c_remove()
1167 gpio_free(phy->gpio_en); in pn544_hci_i2c_remove()
1168 gpio_free(phy->gpio_fw); in pn544_hci_i2c_remove()