11ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*
21ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Copyright (C) 2012-2014 NXP Semiconductors
31ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
41ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Licensed under the Apache License, Version 2.0 (the "License");
51ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * you may not use this file except in compliance with the License.
61ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * You may obtain a copy of the License at
71ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
81ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *      http://www.apache.org/licenses/LICENSE-2.0
91ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
101ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Unless required by applicable law or agreed to in writing, software
111ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * distributed under the License is distributed on an "AS IS" BASIS,
121ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * See the License for the specific language governing permissions and
141ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * limitations under the License.
151ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao */
161ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
171ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#define LOG_TAG "NxpNfcNciHal"
181ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
191ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <errno.h>
201ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <hardware/hardware.h>
211ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <hardware/nfc.h>
2292b8c4fc092fd0b25450c414d118cf6f73d4e11eSteven Moreland#include <log/log.h>
231ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <phNxpNciHal_Adaptation.h>
246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <stdlib.h>
256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include <string.h>
261ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
271ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*****************************************************************************
281ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * NXP NCI HAL Function implementations.
291ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *****************************************************************************/
301ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
311ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
321ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
331ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         hal_open
341ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
351ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      It opens and initialzes the physical connection with NFCC.
361ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
371ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
381ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
391ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int hal_open(const struct nfc_nci_device* p_dev,
416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    nfc_stack_callback_t p_hal_cback,
426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    nfc_stack_data_callback_t* p_hal_data_callback) {
436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
441ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  retval = phNxpNciHal_open(p_hal_cback, p_hal_data_callback);
471ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
491ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
501ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
511ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
521ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
531ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         hal_write
541ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
551ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Write the data to NFCC.
561ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
571ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          Number of bytes successfully written to NFCC.
581ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
591ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int hal_write(const struct nfc_nci_device* p_dev, uint16_t data_len,
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     const uint8_t* p_data) {
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  retval = phNxpNciHal_write(data_len, p_data);
666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
671ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
681ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
691ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
701ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
711ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         hal_core_initialized
721ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
731ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Notify NFCC after successful initialization of NFCC.
741ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**                  All proprietary settings can be done here.
751ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
761ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
771ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
781ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int hal_core_initialized(const struct nfc_nci_device* p_dev,
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                uint8_t* p_core_init_rsp_params) {
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  retval = phNxpNciHal_core_initialized(p_core_init_rsp_params);
856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
861ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
871ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
881ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
891ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
901ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         hal_pre_discover
911ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
921ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Notify NFCC before start discovery.
931ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
941ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
951ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
961ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int hal_pre_discover(const struct nfc_nci_device* p_dev) {
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
1001ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  retval = phNxpNciHal_pre_discover();
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
1031ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
1041ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1051ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
1061ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1071ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         hal_close
1081ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1091ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Close the NFCC interface and free all resources.
1101ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1111ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
1121ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1131ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int hal_close(const struct nfc_nci_device* p_dev) {
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
1171ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  retval = phNxpNciHal_close();
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
1201ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
1211ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1221ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
1231ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1241ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         hal_control_granted
1251ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1261ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Notify NFCC that control is granted to HAL.
1271ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1281ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
1291ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1301ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int hal_control_granted(const struct nfc_nci_device* p_dev) {
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
1341ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  retval = phNxpNciHal_control_granted();
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
1371ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
1381ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1391ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
1401ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1411ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         hal_power_cycle
1421ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1431ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Notify power cycling has performed.
1441ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1451ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
1461ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1471ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int hal_power_cycle(const struct nfc_nci_device* p_dev) {
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  pn547_dev_t* dev = (pn547_dev_t*)p_dev;
1511ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  retval = phNxpNciHal_power_cycle();
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
1541ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
1551ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1561ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*************************************
1571ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Generic device handling.
1581ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *************************************/
1591ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1601ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
1611ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1621ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         nfc_close
1631ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1641ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Close the nfc device instance.
1651ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1661ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
1671ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1681ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic int nfc_close(hw_device_t* dev) {
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0;
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  free(dev);
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
1731ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
1741ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
1751ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
1761ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1771ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         nfc_open
1781ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1791ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Open the nfc device instance.
1801ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1811ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          0 if successful
1821ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
1831ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
1841ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liaostatic int nfc_open(const hw_module_t* module, const char* name,
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    hw_device_t** device) {
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: enter; name=%s", __func__, name);
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  int retval = 0; /* 0 is ok; -1 is error */
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (strcmp(name, NFC_NCI_CONTROLLER) == 0) {
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    pn547_dev_t* dev = calloc(1, sizeof(pn547_dev_t));
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Common hw_device_t fields */
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.common.tag = HARDWARE_DEVICE_TAG;
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.common.version =
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        0x00010000; /* [31:16] major, [15:0] minor */
1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.common.module = (struct hw_module_t*)module;
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.common.close = nfc_close;
1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* NCI HAL method pointers */
2006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.open = hal_open;
2016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.write = hal_write;
2026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.core_initialized = hal_core_initialized;
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.pre_discover = hal_pre_discover;
2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.close = hal_close;
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.control_granted = hal_control_granted;
2066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    dev->nci_device.power_cycle = hal_power_cycle;
2076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *device = (hw_device_t*)dev;
2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    retval = -EINVAL;
2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
2126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  ALOGD("%s: exit %d", __func__, retval);
2146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return retval;
2151ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
2161ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
2171ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* Android hardware module definition */
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic struct hw_module_methods_t nfc_module_methods = {
2191ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    .open = nfc_open,
2201ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao};
2211ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
2221ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/* NFC module definition */
2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistruct nfc_nci_module_t HAL_MODULE_INFO_SYM = {
2241ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    .common =
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        {
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            .tag = HARDWARE_MODULE_TAG,
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            .module_api_version = 0x0100, /* [15:8] major, [7:0] minor (1.0) */
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            .hal_api_version = 0x00,      /* 0 is only valid value */
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            .id = NFC_NCI_HARDWARE_MODULE_ID,
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            .name = "NXP PN54X NFC NCI HW HAL",
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            .author = "NXP Semiconductors",
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            .methods = &nfc_module_methods,
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        },
2341ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao};
235