aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-exynos/midas-nfc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-exynos/midas-nfc.c')
-rw-r--r--arch/arm/mach-exynos/midas-nfc.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/arch/arm/mach-exynos/midas-nfc.c b/arch/arm/mach-exynos/midas-nfc.c
new file mode 100644
index 0000000..c9c05f5
--- /dev/null
+++ b/arch/arm/mach-exynos/midas-nfc.c
@@ -0,0 +1,78 @@
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/nfc/pn65n.h>
+
+#include <plat/gpio-cfg.h>
+#include <mach/regs-gpio.h>
+#include <mach/gpio.h>
+#include "midas.h"
+
+/* GPIO_LEVEL_NONE = 2, GPIO_LEVEL_LOW = 0 */
+static unsigned int nfc_gpio_table[][4] = {
+ {GPIO_NFC_IRQ, S3C_GPIO_INPUT, 2, S3C_GPIO_PULL_DOWN},
+ {GPIO_NFC_EN, S3C_GPIO_OUTPUT, 0, S3C_GPIO_PULL_NONE},
+ {GPIO_NFC_FIRMWARE, S3C_GPIO_OUTPUT, 0, S3C_GPIO_PULL_NONE},
+};
+
+static inline void nfc_setup_gpio(void)
+{
+ int array_size = ARRAY_SIZE(nfc_gpio_table);
+ u32 i, gpio;
+ for (i = 0; i < array_size; i++) {
+ gpio = nfc_gpio_table[i][0];
+ s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(nfc_gpio_table[i][1]));
+ s3c_gpio_setpull(gpio, nfc_gpio_table[i][3]);
+ if (nfc_gpio_table[i][2] != 2)
+ gpio_set_value(gpio, nfc_gpio_table[i][2]);
+ }
+}
+
+static struct pn65n_i2c_platform_data pn65n_pdata = {
+ .irq_gpio = GPIO_NFC_IRQ,
+ .ven_gpio = GPIO_NFC_EN,
+ .firm_gpio = GPIO_NFC_FIRMWARE,
+};
+
+static struct i2c_board_info i2c_dev_pn65n __initdata = {
+ I2C_BOARD_INFO("pn65n", 0x2b),
+ .irq = IRQ_EINT(15),
+ .platform_data = &pn65n_pdata,
+};
+
+#ifdef CONFIG_SLP
+/* In SLP Kernel, i2c_bus number is decided at board file. */
+int __init midas_nfc_init(int i2c_bus)
+{
+ nfc_setup_gpio();
+
+ i2c_register_board_info(i2c_bus, &i2c_dev_pn65n, 1);
+
+ return 0;
+}
+#else
+static int __init midas_nfc_init(void)
+{
+ int ret = 0;
+#if defined(CONFIG_MACH_C1) || defined(CONFIG_MACH_C1VZW) || \
+ defined(CONFIG_MACH_M3) || defined(CONFIG_MACH_M0_CTC)
+#define I2C_BUSNUM_PN65N (system_rev == 3 ? 0 : 5)
+#elif defined(CONFIG_MACH_M0) || \
+ defined(CONFIG_MACH_JENGA) || defined(CONFIG_MACH_S2PLUS)
+#define I2C_BUSNUM_PN65N (system_rev == 3 ? 12 : 5)
+#else
+#define I2C_BUSNUM_PN65N 12
+#endif
+
+ nfc_setup_gpio();
+
+ ret = i2c_add_devices(I2C_BUSNUM_PN65N, &i2c_dev_pn65n, 1);
+ if (ret < 0) {
+ pr_err("%s, i2c%d adding i2c fail(err=%d)\n",
+ __func__, I2C_BUSNUM_PN65N, ret);
+ return ret;
+ }
+
+ return ret;
+}
+module_init(midas_nfc_init);
+#endif