merge in ics-mr1-release history after reset to ics-mr1
diff --git a/Android.mk b/Android.mk
index af260ce..b45f78b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -129,7 +129,7 @@
 
 LOCAL_MODULE:= libnfc
 LOCAL_MODULE_TAGS := optional
-LOCAL_SHARED_LIBRARIES := libcutils libnfc_ndef libdl
+LOCAL_SHARED_LIBRARIES := libcutils libnfc_ndef libdl libhardware
 
 include $(BUILD_SHARED_LIBRARY)
 
diff --git a/Linux_x86/phDal4Nfc.c b/Linux_x86/phDal4Nfc.c
index 8b4f687..3e031f1 100644
--- a/Linux_x86/phDal4Nfc.c
+++ b/Linux_x86/phDal4Nfc.c
@@ -48,11 +48,9 @@
 #include <phDal4Nfc_i2c.h>
 #include <phDal4Nfc_link.h>
 #include <phDal4Nfc_messageQueueLib.h>
+#include <hardware/hardware.h>
+#include <hardware/nfc.h>
 
-/*-----------------------------------------------------------------------------------
-                                  MISC DEFINITIONS
-------------------------------------------------------------------------------------*/
-#define DEFAULT_LINK_TYPE             ENUM_DAL_LINK_TYPE_COM1
 
 /*-----------------------------------------------------------------------------------
                                        TYPES
@@ -269,7 +267,7 @@
         else
         {
             static phDal4Nfc_sConfig_t hw_config;
-            hw_config.nLinkType = DEFAULT_LINK_TYPE;
+            hw_config.deviceNode = NULL;
             result = phDal4Nfc_Config(&hw_config, pHwRef );
         }
     }
@@ -351,6 +349,9 @@
       /* Close the link */
       gLinkFunc.close();
 
+      if (gDalContext.pDev != NULL) {
+          nfc_pn544_close(gDalContext.pDev);
+      }
       /* Reset the Read Writer context to NULL */
       memset((void *)&gReadWriteContext,0,sizeof(gReadWriteContext));
       /* Reset the DAL context values to NULL */
@@ -533,22 +534,40 @@
 NFCSTATUS phDal4Nfc_Config(pphDal4Nfc_sConfig_t config,void **phwref)
 {
    NFCSTATUS                       retstatus = NFCSTATUS_SUCCESS;
+   const hw_module_t* hw_module;
+   nfc_pn544_device_t* pn544_dev;
+   uint8_t num_eeprom_settings;
+   uint8_t* eeprom_settings;
+   int ret;
+
+   /* Retrieve the hw module from the Android NFC HAL */
+   ret = hw_get_module(NFC_HARDWARE_MODULE_ID, &hw_module);
+   if (ret) {
+       LOGE("hw_get_module() failed");
+       return NFCSTATUS_FAILED;
+   }
+   ret = nfc_pn544_open(hw_module, &pn544_dev);
+   if (ret) {
+       LOGE("Could not open pn544 hw_module");
+       return NFCSTATUS_FAILED;
+   }
+   config->deviceNode = pn544_dev->device_node;
+   if (config->deviceNode == NULL) {
+       LOGE("deviceNode NULL");
+       return NFCSTATUS_FAILED;
+   }
 
    DAL_PRINT("phDal4Nfc_Config");
 
-   if ((config == NULL) || (phwref == NULL) || (config->nClientId == -1))
+   if ((config == NULL) || (phwref == NULL))
       return NFCSTATUS_INVALID_PARAMETER;
 
    /* Register the link callbacks */
    memset(&gLinkFunc, 0, sizeof(phDal4Nfc_link_cbk_interface_t));
-   switch(config->nLinkType)
+   switch(pn544_dev->linktype)
    {
-      case ENUM_DAL_LINK_TYPE_COM1:
-      case ENUM_DAL_LINK_TYPE_COM2:
-      case ENUM_DAL_LINK_TYPE_COM3:
-      case ENUM_DAL_LINK_TYPE_COM4:
-      case ENUM_DAL_LINK_TYPE_COM5:
-      case ENUM_DAL_LINK_TYPE_USB:
+      case PN544_LINK_TYPE_UART:
+      case PN544_LINK_TYPE_USB:
       {
 	 DAL_PRINT("UART link Config");
          /* Uart link interface */
@@ -564,7 +583,7 @@
       }
       break;
 
-      case ENUM_DAL_LINK_TYPE_I2C:
+      case PN544_LINK_TYPE_I2C:
       {
 	 DAL_PRINT("I2C link Config");
          /* i2c link interface */
@@ -608,6 +627,9 @@
 #else
    nDeferedCallMessageQueueId = config->nClientId;
 #endif
+
+   gDalContext.pDev = pn544_dev;
+
    /* Start Read and Write Threads */
    if(NFCSTATUS_SUCCESS != phDal4Nfc_StartThreads())
    {
@@ -615,7 +637,6 @@
    }
 
    gDalContext.hw_valid = TRUE;
-
    phDal4Nfc_Reset(1);
    phDal4Nfc_Reset(0);
    phDal4Nfc_Reset(1);
@@ -696,6 +717,13 @@
     phOsalNfc_Message_t      OsalMsg ;
     int i;
     int i2c_error_count;
+    int i2c_workaround;
+    if (gDalContext.pDev != NULL) {
+        i2c_workaround = gDalContext.pDev->enable_i2c_workaround;
+    } else {
+        LOGE("gDalContext.pDev is not set");
+        return NFCSTATUS_FAILED;
+    }
 
     pthread_setname_np(pthread_self(), "reader");
 
@@ -730,12 +758,12 @@
 	/* Wait for IRQ !!!  */
     gReadWriteContext.nNbOfBytesRead = gLinkFunc.read(gReadWriteContext.pReadBuffer, gReadWriteContext.nNbOfBytesToRead);
 
-    /* TODO: Remove this hack
-     * Reading the value 0x57 indicates a HW I2C error at I2C address 0x57
+    /* Reading the value 0x57 indicates a HW I2C error at I2C address 0x57
      * (pn544). There should not be false positives because a read of length 1
      * must be a HCI length read, and a length of 0x57 is impossible (max is 33).
      */
-    if(gReadWriteContext.nNbOfBytesToRead == 1 && gReadWriteContext.pReadBuffer[0] == 0x57)
+    if(i2c_workaround && gReadWriteContext.nNbOfBytesToRead == 1 &&
+            gReadWriteContext.pReadBuffer[0] == 0x57)
     {
         i2c_error_count++;
         DAL_DEBUG("RX Thread Read 0x57 %d times\n", i2c_error_count);
diff --git a/Linux_x86/phDal4Nfc_i2c.c b/Linux_x86/phDal4Nfc_i2c.c
index 72da8e7..8b742d9 100644
--- a/Linux_x86/phDal4Nfc_i2c.c
+++ b/Linux_x86/phDal4Nfc_i2c.c
@@ -24,7 +24,7 @@
 
 #define LOG_TAG "NFC_i2c"
 #include <cutils/log.h>
-
+#include <hardware/nfc.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -144,24 +144,12 @@
 
 NFCSTATUS phDal4Nfc_i2c_open_and_configure(pphDal4Nfc_sConfig_t pConfig, void ** pLinkHandle)
 {
-   char *       pComPort;
-
    DAL_ASSERT_STR(gI2cPortContext.nOpened==0, "Trying to open but already done!");
 
-   switch(pConfig->nLinkType)
-   {
-       case ENUM_DAL_LINK_TYPE_I2C:
-          pComPort = "/dev/pn544";
-          break;
-       default:
-          DAL_DEBUG("Open failed: unknown type %d\n", pConfig->nLinkType);
-          return NFCSTATUS_INVALID_PARAMETER;
-   }
-
-   DAL_DEBUG("Opening port=%s\n", pComPort);
+   DAL_DEBUG("Opening port=%s\n", pConfig->deviceNode);
 
    /* open port */
-   gI2cPortContext.nHandle = open(pComPort, O_RDWR | O_NOCTTY);
+   gI2cPortContext.nHandle = open(pConfig->deviceNode, O_RDWR | O_NOCTTY);
    if (gI2cPortContext.nHandle < 0)
    {
        DAL_DEBUG("Open failed: open() returned %d\n", gI2cPortContext.nHandle);
diff --git a/Linux_x86/phDal4Nfc_uart.c b/Linux_x86/phDal4Nfc_uart.c
index a2f6db3..b19c5c5 100644
--- a/Linux_x86/phDal4Nfc_uart.c
+++ b/Linux_x86/phDal4Nfc_uart.c
@@ -28,7 +28,7 @@
 
 #define LOG_TAG "NFC_uart"
 #include <cutils/log.h>
-
+#include <hardware/nfc.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <fcntl.h>
@@ -159,7 +159,6 @@
 
 NFCSTATUS phDal4Nfc_uart_open_and_configure(pphDal4Nfc_sConfig_t pConfig, void ** pLinkHandle)
 {
-   char *       pComPort;
    int          nComStatus;
    NFCSTATUS    nfcret = NFCSTATUS_SUCCESS;
    int          ret;
@@ -168,41 +167,8 @@
 
    srand(time(NULL));
 
-   switch(pConfig->nLinkType)
-   {
-     case ENUM_DAL_LINK_TYPE_COM1:
-      pComPort = "/dev/ttyO0";
-      break;
-     case ENUM_DAL_LINK_TYPE_COM2:
-      pComPort = "/dev/ttyO1";
-      break;
-     case ENUM_DAL_LINK_TYPE_COM3:
-      pComPort = "/dev/ttyO2";
-      break;
-     case ENUM_DAL_LINK_TYPE_COM4:
-      pComPort = "/dev/ttyO3";
-      break;
-     case ENUM_DAL_LINK_TYPE_COM5:
-      pComPort = "/dev/ttyO4";
-      break;
-     case ENUM_DAL_LINK_TYPE_COM6:
-      pComPort = "/dev/ttyO5";
-      break;
-     case ENUM_DAL_LINK_TYPE_COM7:
-      pComPort = "/dev/ttyO6";
-      break;
-     case ENUM_DAL_LINK_TYPE_COM8:
-      pComPort = "/dev/ttyO7";
-      break;
-     case ENUM_DAL_LINK_TYPE_USB:
-      pComPort = "/dev/ttyUSB0";
-      break;
-     default:
-      return NFCSTATUS_INVALID_PARAMETER;
-   }
-
    /* open communication port handle */
-   gComPortContext.nHandle = open(pComPort, O_RDWR | O_NOCTTY);
+   gComPortContext.nHandle = open(pConfig->deviceNode, O_RDWR | O_NOCTTY);
    if (gComPortContext.nHandle < 0)
    {
       *pLinkHandle = NULL;
diff --git a/inc/phNfcTypes.h b/inc/phNfcTypes.h
index 989cfe8..1f0fe1c 100644
--- a/inc/phNfcTypes.h
+++ b/inc/phNfcTypes.h
@@ -222,28 +222,6 @@
     uint32_t            length;
 } phNfc_sData_t;
 
-
-/**
- *\brief Possible Hardware Configuration exposed to upper layer.
- * Typically this should be port name (Ex:"COM1","COM2") to which PN544 is connected.
- */
-typedef enum
-{
-   ENUM_LINK_TYPE_COM1,
-   ENUM_LINK_TYPE_COM2,
-   ENUM_LINK_TYPE_COM3,
-   ENUM_LINK_TYPE_COM4,
-   ENUM_LINK_TYPE_COM5,
-   ENUM_LINK_TYPE_COM6,
-   ENUM_LINK_TYPE_COM7,
-   ENUM_LINK_TYPE_COM8,
-   ENUM_LINK_TYPE_I2C,
-   ENUM_LINK_TYPE_USB,
-   ENUM_LINK_TYPE_TCP,
-
-   ENUM_LINK_TYPE_NB,
-} phLibNfc_eConfigLinkType;
-
 /**
  * \brief Possible Hardware Configuration exposed to upper layer.
  * Typically this should be at least the communication link (Ex:"COM1","COM2")
@@ -251,8 +229,8 @@
  */   
 typedef struct phLibNfc_sConfig_t
 {
-   /** Hardware communication link to the controller */
-   phLibNfc_eConfigLinkType  nLinkType;
+   /** Device node of the controller */
+   const char*               deviceNode;
    /** The client ID (thread ID or message queue ID) */
    unsigned int              nClientId;
 } phLibNfc_sConfig_t, *pphLibNfc_sConfig_t;
diff --git a/src/phDal4Nfc.h b/src/phDal4Nfc.h
index 0913c5e..3cbb585 100644
--- a/src/phDal4Nfc.h
+++ b/src/phDal4Nfc.h
@@ -49,6 +49,7 @@
  *
  *
  */
+#include <hardware/nfc.h>
 /**< Basic type definitions */
 #include <phNfcTypes.h>
 /**< Generic Interface Layer Function Definitions */
@@ -75,6 +76,7 @@
 	phNfcIF_sCallBack_t		cb_if;		/**<Callback info registered by upper layer*/
 	volatile uint8_t		hw_valid;	/**<Flag - shows Hardware present or not */
 	void					*pHwRef;	/**<Hardware Reference*/
+	nfc_pn544_device_t		*pDev;		/**<Android HAL reference*/
 }phDal4Nfc_SContext_t,*pphDal4Nfc_SContext_t;
 
 /**
@@ -123,26 +125,6 @@
     pphNfcIF_Transact_Completion_CB_t   writeCbPtr;
 } phDal4Nfc_Message_t,*pphDal4Nfc_Message_t;
 
-/**
- * \ingroup grp_nfc_dal
- *\brief Possible DAL Configuration exposed to upper layer.
- * Typically this should be port name (Ex:"COM1","COM2") to which PN544 is connected.
- */
-#define   ENUM_DAL_LINK_TYPE_COM1 ENUM_LINK_TYPE_COM1
-#define   ENUM_DAL_LINK_TYPE_COM2 ENUM_LINK_TYPE_COM2
-#define   ENUM_DAL_LINK_TYPE_COM3 ENUM_LINK_TYPE_COM3
-#define   ENUM_DAL_LINK_TYPE_COM4 ENUM_LINK_TYPE_COM4
-#define   ENUM_DAL_LINK_TYPE_COM5 ENUM_LINK_TYPE_COM5
-#define   ENUM_DAL_LINK_TYPE_COM6 ENUM_LINK_TYPE_COM6
-#define   ENUM_DAL_LINK_TYPE_COM7 ENUM_LINK_TYPE_COM7
-#define   ENUM_DAL_LINK_TYPE_COM8 ENUM_LINK_TYPE_COM8
-#define   ENUM_DAL_LINK_TYPE_I2C ENUM_LINK_TYPE_I2C
-#define   ENUM_DAL_LINK_TYPE_USB ENUM_LINK_TYPE_USB
-#define   ENUM_DAL_LINK_TYPE_TCP ENUM_LINK_TYPE_TCP
-
-#define   ENUM_DAL_LINK_TYPE_NB ENUM_LINK_TYPE_NB
-typedef phLibNfc_eConfigLinkType phDal4Nfc_eConfigLinkType;
-
 typedef phLibNfc_sConfig_t phDal4Nfc_sConfig_t;
 typedef phLibNfc_sConfig_t *pphDal4Nfc_sConfig_t;