Lines Matching refs:phy

189 static void pn544_hci_i2c_platform_init(struct pn544_i2c_phy *phy)
195 nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n");
198 gpio_set_value(phy->gpio_fw, 0);
201 phy->en_polarity = polarity;
205 gpio_set_value(phy->gpio_en, !phy->en_polarity);
209 gpio_set_value(phy->gpio_en, phy->en_polarity);
213 dev_dbg(&phy->i2c_dev->dev, "Sending reset cmd\n");
214 ret = i2c_master_send(phy->i2c_dev, rset_cmd, count);
216 nfc_info(&phy->i2c_dev->dev,
224 nfc_err(&phy->i2c_dev->dev,
228 gpio_set_value(phy->gpio_en, !phy->en_polarity);
231 static void pn544_hci_i2c_enable_mode(struct pn544_i2c_phy *phy, int run_mode)
233 gpio_set_value(phy->gpio_fw, run_mode == PN544_FW_MODE ? 1 : 0);
234 gpio_set_value(phy->gpio_en, phy->en_polarity);
237 phy->run_mode = run_mode;
242 struct pn544_i2c_phy *phy = phy_id;
246 pn544_hci_i2c_enable_mode(phy, PN544_HCI_MODE);
248 phy->powered = 1;
255 struct pn544_i2c_phy *phy = phy_id;
257 gpio_set_value(phy->gpio_fw, 0);
258 gpio_set_value(phy->gpio_en, !phy->en_polarity);
261 gpio_set_value(phy->gpio_en, phy->en_polarity);
264 gpio_set_value(phy->gpio_en, !phy->en_polarity);
267 phy->powered = 0;
298 struct pn544_i2c_phy *phy = phy_id;
299 struct i2c_client *client = phy->i2c_dev;
301 if (phy->hard_fault != 0)
302 return phy->hard_fault;
358 static int pn544_hci_i2c_read(struct pn544_i2c_phy *phy, struct sk_buff **skb)
363 struct i2c_client *client = phy->i2c_dev;
417 static int pn544_hci_i2c_fw_read_status(struct pn544_i2c_phy *phy)
421 struct i2c_client *client = phy->i2c_dev;
484 struct pn544_i2c_phy *phy = phy_id;
489 if (!phy || irq != phy->i2c_dev->irq) {
494 client = phy->i2c_dev;
497 if (phy->hard_fault != 0)
500 if (phy->run_mode == PN544_FW_MODE) {
501 phy->fw_cmd_result = pn544_hci_i2c_fw_read_status(phy);
502 schedule_work(&phy->fw_work);
504 r = pn544_hci_i2c_read(phy, &skb);
506 phy->hard_fault = r;
508 nfc_hci_recv_frame(phy->hdev, NULL);
515 nfc_hci_recv_frame(phy->hdev, skb);
529 struct pn544_i2c_phy *phy = phy_id;
533 strcpy(phy->firmware_name, firmware_name);
535 phy->hw_variant = hw_variant;
536 phy->fw_work_state = FW_WORK_STATE_START;
538 schedule_work(&phy->fw_work);
543 static void pn544_hci_i2c_fw_work_complete(struct pn544_i2c_phy *phy,
548 pn544_hci_i2c_disable(phy);
550 phy->fw_work_state = FW_WORK_STATE_IDLE;
552 if (phy->fw) {
553 release_firmware(phy->fw);
554 phy->fw = NULL;
557 nfc_fw_download_done(phy->hdev->ndev, phy->firmware_name, (u32) -result);
640 static int pn544_hci_i2c_fw_write_chunk(struct pn544_i2c_phy *phy)
644 r = pn544_hci_i2c_fw_write_cmd(phy->i2c_dev,
645 phy->fw_blob_dest_addr + phy->fw_written,
646 phy->fw_blob_data + phy->fw_written,
647 phy->fw_blob_size - phy->fw_written);
651 phy->fw_written += r;
652 phy->fw_work_state = FW_WORK_STATE_WAIT_WRITE_ANSWER;
657 static int pn544_hci_i2c_fw_secure_write_frame_cmd(struct pn544_i2c_phy *phy,
678 r = i2c_master_send(phy->i2c_dev, buf, chunklen);
689 static int pn544_hci_i2c_fw_secure_write_frame(struct pn544_i2c_phy *phy)
694 framep = (struct pn544_i2c_fw_secure_frame *) phy->fw_blob_data;
695 if (phy->fw_written == 0)
696 phy->fw_blob_size = get_unaligned_be16(&framep->be_datalen)
700 if (phy->fw_blob_size > PN544_FW_I2C_MAX_PAYLOAD &&
705 if (phy->fw_blob_size < PN544_FW_I2C_MAX_PAYLOAD) {
706 r = i2c_master_send(phy->i2c_dev,
707 (const char *) phy->fw_blob_data, phy->fw_blob_size);
709 if (r == phy->fw_blob_size)
717 r = pn544_hci_i2c_fw_secure_write_frame_cmd(phy,
718 phy->fw_blob_data + phy->fw_written,
719 phy->fw_blob_size - phy->fw_written);
724 phy->fw_written += r;
725 phy->fw_work_state = FW_WORK_STATE_WAIT_SECURE_WRITE_ANSWER;
729 pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE);
730 phy->fw_cmd_result = 0;
731 schedule_work(&phy->fw_work);
739 struct pn544_i2c_phy *phy = container_of(work, struct pn544_i2c_phy,
745 switch (phy->fw_work_state) {
747 pn544_hci_i2c_enable_mode(phy, PN544_FW_MODE);
749 r = request_firmware(&phy->fw, phy->firmware_name,
750 &phy->i2c_dev->dev);
754 phy->fw_written = 0;
756 switch (phy->hw_variant) {
758 blob = (struct pn544_i2c_fw_blob *) phy->fw->data;
759 phy->fw_blob_size = get_unaligned_be32(&blob->be_size);
760 phy->fw_blob_dest_addr = get_unaligned_be32(
762 phy->fw_blob_data = blob->data;
764 r = pn544_hci_i2c_fw_write_chunk(phy);
768 phy->fw->data;
769 phy->fw_blob_data = secure_blob->data;
770 phy->fw_size = phy->fw->size;
771 r = pn544_hci_i2c_fw_secure_write_frame(phy);
780 pn544_hci_i2c_fw_work_complete(phy, r);
784 r = phy->fw_cmd_result;
788 if (phy->fw_written == phy->fw_blob_size) {
789 r = pn544_hci_i2c_fw_check_cmd(phy->i2c_dev,
790 phy->fw_blob_dest_addr,
791 phy->fw_blob_data,
792 phy->fw_blob_size);
795 phy->fw_work_state = FW_WORK_STATE_WAIT_CHECK_ANSWER;
799 r = pn544_hci_i2c_fw_write_chunk(phy);
803 pn544_hci_i2c_fw_work_complete(phy, r);
807 r = phy->fw_cmd_result;
811 blob = (struct pn544_i2c_fw_blob *) (phy->fw_blob_data +
812 phy->fw_blob_size);
813 phy->fw_blob_size = get_unaligned_be32(&blob->be_size);
814 if (phy->fw_blob_size != 0) {
815 phy->fw_blob_dest_addr =
817 phy->fw_blob_data = blob->data;
819 phy->fw_written = 0;
820 r = pn544_hci_i2c_fw_write_chunk(phy);
824 if (r < 0 || phy->fw_blob_size == 0)
825 pn544_hci_i2c_fw_work_complete(phy, r);
829 r = phy->fw_cmd_result;
834 r = pn544_hci_i2c_fw_secure_write_frame(phy);
838 if (phy->fw_written == phy->fw_blob_size) {
840 (phy->fw_blob_data + phy->fw_blob_size);
841 phy->fw_size -= phy->fw_blob_size +
843 if (phy->fw_size >= PN544_FW_SECURE_BLOB_HEADER_LEN
845 phy->fw_blob_data = secure_blob->data;
847 phy->fw_written = 0;
848 r = pn544_hci_i2c_fw_secure_write_frame(phy);
853 if (r < 0 || phy->fw_size == 0)
854 pn544_hci_i2c_fw_work_complete(phy, r);
866 struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
884 phy->gpio_en = ret;
887 ret = gpio_request(phy->gpio_en, "pn544_en");
892 ret = gpio_direction_output(phy->gpio_en, 0);
906 phy->gpio_fw = ret;
909 ret = gpio_request(phy->gpio_fw, "pn544_fw");
914 ret = gpio_direction_output(phy->gpio_fw, 0);
932 gpio_free(phy->gpio_fw);
934 gpio_free(phy->gpio_en);
951 struct pn544_i2c_phy *phy;
963 phy = devm_kzalloc(&client->dev, sizeof(struct pn544_i2c_phy),
965 if (!phy) {
967 "Cannot allocate memory for pn544 i2c phy.\n");
971 INIT_WORK(&phy->fw_work, pn544_hci_i2c_fw_work);
972 phy->fw_work_state = FW_WORK_STATE_IDLE;
974 phy->i2c_dev = client;
975 i2c_set_clientdata(client, phy);
1001 phy->gpio_en = pdata->get_gpio(NFC_GPIO_ENABLE);
1002 phy->gpio_fw = pdata->get_gpio(NFC_GPIO_FW_RESET);
1003 phy->gpio_irq = pdata->get_gpio(NFC_GPIO_IRQ);
1009 pn544_hci_i2c_platform_init(phy);
1013 PN544_HCI_I2C_DRIVER_NAME, phy);
1019 r = pn544_hci_probe(phy, &i2c_phy_ops, LLC_SHDLC_NAME,
1022 pn544_hci_i2c_fw_download, &phy->hdev);
1029 free_irq(client->irq, phy);
1033 gpio_free(phy->gpio_en);
1034 gpio_free(phy->gpio_fw);
1044 struct pn544_i2c_phy *phy = i2c_get_clientdata(client);
1049 cancel_work_sync(&phy->fw_work);
1050 if (phy->fw_work_state != FW_WORK_STATE_IDLE)
1051 pn544_hci_i2c_fw_work_complete(phy, -ENODEV);
1053 pn544_hci_remove(phy->hdev);
1055 if (phy->powered)
1056 pn544_hci_i2c_disable(phy);
1058 free_irq(client->irq, phy);
1062 gpio_free(phy->gpio_en);
1063 gpio_free(phy->gpio_fw);