static ssize_t sec_nfc_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); int ret = 0; dev_err(info->dev, "%s: info: %p, count %zu\n", __func__, info, count); mutex_lock(&info->mutex); if (info->state == SEC_NFC_ST_OFF) { dev_err(info->dev, "sec_nfc is not enabled\n"); ret = -ENODEV; goto out; } if (count > info->buflen) count = info->buflen; if (count < SEC_NFC_MSG_MIN_SIZE || count > SEC_NFC_MSG_MAX_SIZE) { dev_err(info->dev, "user required wrong size\n"); ret = -EINVAL; goto out; } if (copy_from_user(info->buf, buf, count)) { dev_err(info->dev, "copy failed from user\n"); ret = -EFAULT; goto out; } // usleep_range(6000, 10000); usleep_range(600, 1000); ret = i2c_master_send(info->i2c_dev, info->buf, count); if (ret == -EREMOTEIO) { ret = sec_nfc_reset(info); goto out; } if (ret != count) { dev_err(info->dev, "send failed: return: %d count: %d\n", ret, count); ret = -EREMOTEIO; } out: mutex_unlock(&info->mutex); return ret; }
static ssize_t sec_nfc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); enum sec_nfc_irq irq; int ret = 0; dev_dbg(info->dev, "%s: info: %p, count: %zu\n", __func__, info, count); mutex_lock(&info->mutex); if (info->state == SEC_NFC_ST_OFF) { dev_err(info->dev, "sec_nfc is not enabled\n"); ret = -ENODEV; goto out; } mutex_lock(&info->read_mutex); irq = info->read_irq; mutex_unlock(&info->read_mutex); if (irq == SEC_NFC_NONE) { if (file->f_flags & O_NONBLOCK) { dev_err(info->dev, "it is nonblock\n"); ret = -EAGAIN; goto out; } } dev_err(info->dev, "LWK irq %d\n", irq); /* i2c recv */ if (count > info->buflen) count = info->buflen; if (count < SEC_NFC_MSG_MIN_SIZE || count > SEC_NFC_MSG_MAX_SIZE) { dev_err(info->dev, "user required wrong size\n"); ret = -EINVAL; goto out; } mutex_lock(&info->read_mutex); ret = i2c_master_recv(info->i2c_dev, info->buf, count); dev_err(info->dev, "recv size : %d\n", ret); if (ret == -EREMOTEIO) { ret = sec_nfc_reset(info); goto read_error; } else if (ret != count) { dev_err(info->dev, "read failed: return: %d count: %d\n", ret, count); //ret = -EREMOTEIO; goto read_error; } info->read_irq = SEC_NFC_NONE; mutex_unlock(&info->read_mutex); if (copy_to_user(buf, info->buf, ret)) { dev_err(info->dev, "copy failed to user\n"); ret = -EFAULT; } goto out; read_error: info->read_irq = SEC_NFC_NONE; mutex_unlock(&info->read_mutex); out: mutex_unlock(&info->mutex); return ret; }
static ssize_t sec_nfc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct sec_nfc_info *info = container_of(file->private_data, struct sec_nfc_info, miscdev); enum sec_nfc_irq irq; int ret = 0; /* dev_dbg(info->dev, "%s: info: %p, count: %zu\n", __func__, info, count); */ #if LOG_OUT pr_info("[NFC] %s: info: %p, count: %zu\n", __func__, info, count); #endif mutex_lock(&info->mutex); if (info->state == SEC_NFC_ST_OFF) { /* dev_err(info->dev, "sec_nfc is not enabled\n"); */ pr_err("[NFC] sec_nfc is not enabled\n"); ret = -ENODEV; goto out; } mutex_lock(&info->read_mutex); irq = info->read_irq; mutex_unlock(&info->read_mutex); if (irq == SEC_NFC_NONE) { if (file->f_flags & O_NONBLOCK) { /* dev_err(info->dev, "it is nonblock\n"); */ pr_err("[NFC] it is nonblock\n"); ret = -EAGAIN; goto out; } if (info->state == SEC_NFC_ST_FIRM) { #if LOG_OUT pr_info("[NFC] READ : FIRMWARE DOWNLOAD MODE"); #endif if (wait_event_interruptible(info->read_wait, (info->read_irq == SEC_NFC_INT))) { ret = -ERESTARTSYS; goto out; } } } /* i2c recv */ if (count > info->buflen) count = info->buflen; if (count < SEC_NFC_MSG_MIN_SIZE || count > SEC_NFC_MSG_MAX_SIZE) { /* dev_err(info->dev, "user required wrong size\n"); */ pr_err("[NFC] user required wrong size\n"); ret = -EINVAL; goto out; } mutex_lock(&info->read_mutex); ret = i2c_master_recv(info->i2c_dev, info->buf, count); /* dev_dbg(info->dev, "recv size : %d\n", ret); */ #if LOG_OUT pr_info("[NFC] recv size : %d\n", ret); #endif if (ret == -EREMOTEIO) { ret = sec_nfc_reset(info); goto read_error; } else if (ret != count) { pr_err("[NFC] read failed: return: %d count: %d\n", ret, count); /* ret = -EREMOTEIO; */ goto read_error; } if (info->state == SEC_NFC_ST_FIRM && ret == SEC_NFC_MSG_FW_PACK_HDR) /* Firmware download read twice by one interrupt */ info->read_irq = SEC_NFC_INT; else info->read_irq = SEC_NFC_NONE; mutex_unlock(&info->read_mutex); if (copy_to_user(buf, info->buf, ret)) { /* dev_err(info->dev, "copy failed to user\n"); */ pr_err("[NFC] copy failed to user\n"); ret = -EFAULT; } goto out; read_error: info->read_irq = SEC_NFC_NONE; mutex_unlock(&info->read_mutex); out: mutex_unlock(&info->mutex); #if LOG_OUT pr_info("[NFC] read function finish\n"); #endif return ret; }