static int sec_nfc_open(struct inode *inode, struct file *file) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); int ret = 0; uid_t uid; // Security dev_dbg(info->dev, "%s: info : %p" , __func__, info); // Check process uid = __task_cred(current)->uid; if (g_secnfc_uid != uid) { dev_err(info->dev, "%s: Un-authorized process. No access to device\n", __func__); return -EPERM; } // End of Security mutex_lock(&info->mutex); if (info->state != SEC_NFC_ST_OFF) { dev_err(info->dev, "sec_nfc is busy\n"); ret = -EBUSY; goto out; } #ifdef CONFIG_SEC_NFC_I2C mutex_lock(&info->read_mutex); info->read_irq = SEC_NFC_NONE; mutex_unlock(&info->read_mutex); ret = sec_nfc_set_state(info, SEC_NFC_ST_NORM); #endif out: mutex_unlock(&info->mutex); return ret; }
static int sec_nfc_open(struct inode *inode, struct file *file) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); int ret = 0; dev_dbg(info->dev, "%s: info : %p" , __func__, info); mutex_lock(&info->mutex); if (info->state != SEC_NFC_ST_OFF) { dev_err(info->dev, "sec_nfc is busy\n"); ret = -EBUSY; goto out; } #ifdef CONFIG_SEC_NFC_I2C mutex_lock(&info->read_mutex); info->read_irq = SEC_NFC_NONE; mutex_unlock(&info->read_mutex); #endif ret = sec_nfc_set_state(info, SEC_NFC_ST_NORM); out: mutex_unlock(&info->mutex); return ret; }
static int sec_nfc_reset(struct sec_nfc_info *info) { dev_err(info->dev, "i2c failed. return resatrt to M/W\n"); sec_nfc_set_state(info, SEC_NFC_ST_NORM); return -ERESTART; }
static int sec_nfc_close(struct inode *inode, struct file *file) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); dev_dbg(info->dev, "%s: info : %p" , __func__, info); mutex_lock(&info->mutex); sec_nfc_set_state(info, SEC_NFC_ST_OFF); mutex_unlock(&info->mutex); return 0; }
static long sec_nfc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); unsigned int mode = (unsigned int)arg; int ret = 0; dev_dbg(info->dev, "%s: info: %p, cmd: 0x%x\n", __func__, info, cmd); mutex_lock(&info->mutex); switch (cmd) { case SEC_NFC_SET_MODE: dev_dbg(info->dev, "%s: SEC_NFC_SET_MODE\n", __func__); if (info->state == mode) break; if (mode >= SEC_NFC_ST_COUNT) { dev_err(info->dev, "wrong state (%d)\n", mode); ret = -EFAULT; break; } ret = sec_nfc_set_state(info, mode); if (ret < 0) { dev_err(info->dev, "enable failed\n"); break; } break; default: dev_err(info->dev, "Unknow ioctl 0x%x\n", cmd); ret = -ENOIOCTLCMD; break; } mutex_unlock(&info->mutex); return ret; }
static long sec_nfc_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); unsigned int mode = (unsigned int)arg; int ret = 0; int firm; dev_dbg(info->dev, "%s: info: %p, cmd: 0x%x\n", __func__, info, cmd); mutex_lock(&info->mutex); switch (cmd) { case SEC_NFC_SET_MODE: dev_dbg(info->dev, "%s: SEC_NFC_SET_MODE\n", __func__); if (info->state == mode) break; if (mode >= SEC_NFC_ST_COUNT) { dev_err(info->dev, "wrong state (%d)\n", mode); ret = -EFAULT; break; } ret = sec_nfc_set_state(info, mode); if (ret < 0) { dev_err(info->dev, "enable failed\n"); break; } break; case SEC_NFC_SET_UART_STATE: if (mode >= SEC_NFC_ST_COUNT) { dev_err(info->dev, "wrong state (%d)\n", mode); ret = -EFAULT; break; } firm = gpio_get_value(info->pdata->firm); pr_info("%s: [NFC] Firm pin = %d\n", __func__, firm); if(mode == SEC_NFC_ST_UART_ON) gpio_set_value(info->pdata->firm, STATE_FIRM_HIGH); else if(mode == SEC_NFC_ST_UART_OFF) gpio_set_value(info->pdata->firm, STATE_FIRM_LOW); else ret = -EFAULT; firm = gpio_get_value(info->pdata->firm); pr_info("%s: [NFC] Mode = %d, Firm pin = %d\n", __func__, mode, firm); break; default: dev_err(info->dev, "Unknow ioctl 0x%x\n", cmd); ret = -ENOIOCTLCMD; break; } mutex_unlock(&info->mutex); return ret; }