Lines Matching +full:firmware +full:- +full:initialized
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* -------------------------------------------------------------------------
3 * Copyright (C) 2014-2016, Intel Corporation
5 * -------------------------------------------------------------------------
12 #include <linux/firmware.h>
45 const struct firmware *otp_patch;
46 const struct firmware *ram_patch;
92 r = nci_core_conn_create(info->ndev, FDP_PATCH_CONN_DEST, 1, in fdp_nci_create_conn()
127 delta = 24 * fc - nd * clock_freq; in fdp_nci_set_clock()
148 info->setup_patch_sent = 1; in fdp_nci_send_patch_cb()
149 wake_up(&info->setup_wq); in fdp_nci_send_patch_cb()
155 * We have no other way of knowing when all firmware packets were sent out
163 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_set_data_pkt_counter()
166 atomic_set(&info->data_pkt_counter, count); in fdp_nci_set_data_pkt_counter()
167 info->data_pkt_counter_cb = cb; in fdp_nci_set_data_pkt_counter()
172 * have the PBF flag set to 0x0 (last packet) even if the firmware
174 * whole firmware to nci_send_data it will segment it and it will set
177 * The firmware will be analyzed and applied when we send NCI_OP_PROP_PATCH_CMD
184 const struct firmware *fw; in fdp_nci_send_patch()
190 if ((type == NCI_PATCH_TYPE_OTP && !info->otp_patch) || in fdp_nci_send_patch()
191 (type == NCI_PATCH_TYPE_RAM && !info->ram_patch)) in fdp_nci_send_patch()
192 return -EINVAL; in fdp_nci_send_patch()
195 fw = info->otp_patch; in fdp_nci_send_patch()
197 fw = info->ram_patch; in fdp_nci_send_patch()
201 return -EINVAL; in fdp_nci_send_patch()
203 len = fw->size; in fdp_nci_send_patch()
206 DIV_ROUND_UP(fw->size, max_size)); in fdp_nci_send_patch()
216 return -ENOMEM; in fdp_nci_send_patch()
222 skb_put_data(skb, fw->data + (fw->size - len), payload_size); in fdp_nci_send_patch()
231 len -= payload_size; in fdp_nci_send_patch()
242 r = info->phy_ops->enable(info->phy); in fdp_nci_open()
257 if (atomic_dec_and_test(&info->data_pkt_counter)) in fdp_nci_send()
258 info->data_pkt_counter_cb(ndev); in fdp_nci_send()
260 ret = info->phy_ops->write(info->phy, skb); in fdp_nci_send()
273 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_request_firmware()
277 r = request_firmware(&info->ram_patch, FDP_RAM_PATCH_NAME, dev); in fdp_nci_request_firmware()
283 data = (u8 *) info->ram_patch->data; in fdp_nci_request_firmware()
284 info->ram_patch_version = in fdp_nci_request_firmware()
291 info->ram_patch_version, (int) info->ram_patch->size); in fdp_nci_request_firmware()
294 r = request_firmware(&info->otp_patch, FDP_OTP_PATCH_NAME, dev); in fdp_nci_request_firmware()
300 data = (u8 *) info->otp_patch->data; in fdp_nci_request_firmware()
301 info->otp_patch_version = in fdp_nci_request_firmware()
308 info->otp_patch_version, (int) info->otp_patch->size); in fdp_nci_request_firmware()
319 if (info->otp_patch) { in fdp_nci_release_firmware()
320 release_firmware(info->otp_patch); in fdp_nci_release_firmware()
321 info->otp_patch = NULL; in fdp_nci_release_firmware()
324 if (info->ram_patch) { in fdp_nci_release_firmware()
325 release_firmware(info->ram_patch); in fdp_nci_release_firmware()
326 info->ram_patch = NULL; in fdp_nci_release_firmware()
333 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_patch_otp()
337 if (info->otp_version >= info->otp_patch_version) in fdp_nci_patch_otp()
340 info->setup_patch_sent = 0; in fdp_nci_patch_otp()
341 info->setup_reset_ntf = 0; in fdp_nci_patch_otp()
342 info->setup_patch_ntf = 0; in fdp_nci_patch_otp()
362 wait_event_interruptible(info->setup_wq, in fdp_nci_patch_otp()
363 info->setup_patch_sent == 1); in fdp_nci_patch_otp()
369 r = nci_core_conn_close(info->ndev, conn_id); in fdp_nci_patch_otp()
376 r = -EINVAL; in fdp_nci_patch_otp()
381 wait_event_interruptible(info->setup_wq, info->setup_patch_ntf); in fdp_nci_patch_otp()
384 r = info->setup_patch_status; in fdp_nci_patch_otp()
387 r = -EINVAL; in fdp_nci_patch_otp()
395 wait_event_interruptible(info->setup_wq, info->setup_reset_ntf); in fdp_nci_patch_otp()
404 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_patch_ram()
408 if (info->ram_version >= info->ram_patch_version) in fdp_nci_patch_ram()
411 info->setup_patch_sent = 0; in fdp_nci_patch_ram()
412 info->setup_reset_ntf = 0; in fdp_nci_patch_ram()
413 info->setup_patch_ntf = 0; in fdp_nci_patch_ram()
433 wait_event_interruptible(info->setup_wq, in fdp_nci_patch_ram()
434 info->setup_patch_sent == 1); in fdp_nci_patch_ram()
440 r = nci_core_conn_close(info->ndev, conn_id); in fdp_nci_patch_ram()
447 r = -EINVAL; in fdp_nci_patch_ram()
452 wait_event_interruptible(info->setup_wq, info->setup_patch_ntf); in fdp_nci_patch_ram()
455 r = info->setup_patch_status; in fdp_nci_patch_ram()
458 r = -EINVAL; in fdp_nci_patch_ram()
466 wait_event_interruptible(info->setup_wq, info->setup_reset_ntf); in fdp_nci_patch_ram()
476 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_setup()
489 /* Load firmware from disk */ in fdp_nci_setup()
495 if (info->otp_version < info->otp_patch_version) { in fdp_nci_setup()
503 if (info->ram_version < info->ram_patch_version) { in fdp_nci_setup()
510 /* Release the firmware buffers */ in fdp_nci_setup()
523 if (info->otp_version != info->otp_patch_version || in fdp_nci_setup()
524 info->ram_version != info->ram_patch_version) { in fdp_nci_setup()
525 nfc_err(dev, "Firmware update failed"); in fdp_nci_setup()
526 r = -EINVAL; in fdp_nci_setup()
532 * We initialized the devices but the NFC subsystem expects in fdp_nci_setup()
533 * it to not be initialized. in fdp_nci_setup()
546 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_post_setup()
550 if (info->fw_vsc_cfg && info->fw_vsc_cfg[0]) { in fdp_nci_post_setup()
553 r = fdp_nci_set_production_data(ndev, info->fw_vsc_cfg[3], in fdp_nci_post_setup()
554 &info->fw_vsc_cfg[4]); in fdp_nci_post_setup()
563 r = fdp_nci_set_clock(ndev, info->clock_type, info->clock_freq); in fdp_nci_post_setup()
577 * The nci core was initialized when post setup was called in fdp_nci_post_setup()
588 info->setup_reset_ntf = 1; in fdp_nci_core_reset_ntf_packet()
589 wake_up(&info->setup_wq); in fdp_nci_core_reset_ntf_packet()
599 info->setup_patch_ntf = 1; in fdp_nci_prop_patch_ntf_packet()
600 info->setup_patch_status = skb->data[0]; in fdp_nci_prop_patch_ntf_packet()
601 wake_up(&info->setup_wq); in fdp_nci_prop_patch_ntf_packet()
610 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_prop_patch_rsp_packet()
611 u8 status = skb->data[0]; in fdp_nci_prop_patch_rsp_packet()
623 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_prop_set_production_data_rsp_packet()
624 u8 status = skb->data[0]; in fdp_nci_prop_set_production_data_rsp_packet()
636 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_core_get_config_rsp_packet()
637 struct nci_core_get_config_rsp *rsp = (void *) skb->data; in fdp_nci_core_get_config_rsp_packet()
640 if (rsp->status == NCI_STATUS_OK) { in fdp_nci_core_get_config_rsp_packet()
642 p = rsp->data; in fdp_nci_core_get_config_rsp_packet()
648 info->ram_version = le32_to_cpup((__le32 *) p); in fdp_nci_core_get_config_rsp_packet()
653 info->otp_version = le32_to_cpup((__le32 *) p); in fdp_nci_core_get_config_rsp_packet()
658 info->otp_version = le32_to_cpup((__le32 *) p); in fdp_nci_core_get_config_rsp_packet()
663 info->key_index = *p++; in fdp_nci_core_get_config_rsp_packet()
668 dev_dbg(dev, "OTP version %d\n", info->otp_version); in fdp_nci_core_get_config_rsp_packet()
669 dev_dbg(dev, "RAM version %d\n", info->ram_version); in fdp_nci_core_get_config_rsp_packet()
670 dev_dbg(dev, "key index %d\n", info->key_index); in fdp_nci_core_get_config_rsp_packet()
671 dev_dbg(dev, "%s: status 0x%x\n", __func__, rsp->status); in fdp_nci_core_get_config_rsp_packet()
673 nci_req_complete(ndev, rsp->status); in fdp_nci_core_get_config_rsp_packet()
719 struct device *dev = &phy->i2c_dev->dev; in fdp_nci_probe()
727 return -ENOMEM; in fdp_nci_probe()
729 info->phy = phy; in fdp_nci_probe()
730 info->phy_ops = phy_ops; in fdp_nci_probe()
731 info->clock_type = clock_type; in fdp_nci_probe()
732 info->clock_freq = clock_freq; in fdp_nci_probe()
733 info->fw_vsc_cfg = fw_vsc_cfg; in fdp_nci_probe()
735 init_waitqueue_head(&info->setup_wq); in fdp_nci_probe()
749 return -ENOMEM; in fdp_nci_probe()
757 info->ndev = ndev; in fdp_nci_probe()