Exemple #1
0
ssize_t rws_write(struct file *file, const char __user *data, size_t len, loff_t *ppos)
{
	char rws_val;

	MFC_DRV_DBG_LOG("START");

	if (data == NULL) {
		MFC_DRV_ERR_LOG("rws_write param err");
		return -EIO;
	}

	if ( len < 1 ) {
		MFC_DRV_ERR_LOG("length check len = %d", len);
		return -EIO;
	}
	
	if (copy_from_user(&rws_val, data, 1)) {
		MFC_DRV_ERR_LOG("copy_from_user");
		return -EFAULT;
	}

	g_rws_data = rws_val;

	MFC_DRV_DBG_LOG("END rws_val = %d, g_rws_data = %d", rws_val, g_rws_data);

	return 1;
}
Exemple #2
0
/*
 * function_pon
 */
ssize_t pon_write(struct file *file, const char __user *data,
		       size_t len, loff_t *ppos)
{
	char on;
	int seton;
	
	MFC_DRV_DBG_LOG("START");
	
	if ( len < 1 ) {
		MFC_DRV_ERR_LOG("length check len = %d", len);
		return -EIO;
	}
	
	if (copy_from_user(&on, data, 1)) {
		MFC_DRV_ERR_LOG("copy_from_user");
		return -EFAULT;
	}

	if (on == D_PON_DEV_HIGH){
		seton = D_PON_DEV_HIGH;
		MFC_DRV_DBG_LOG("pon high.\n");
	}else if (on == D_PON_DEV_LOW){
		MFC_DRV_DBG_LOG("pon low.\n");
		seton = D_PON_DEV_LOW;
	}else {
		MFC_DRV_DBG_LOG("pon err value = %x \n",on );
		return -EFAULT;
	}

	gpio_set_value(MFD_PON_GPIO_NUM , seton );

	MFC_DRV_DBG_LOG("END on = %d, seton = %d", on, seton);
	
	return len;
}
Exemple #3
0
/* rws device	*/
ssize_t rws_read(struct file *file, char __user * buf, size_t len, loff_t * ppos)
{
	char rws_val;
	
	MFC_DRV_DBG_LOG("START");

	if (buf == NULL) {
		MFC_DRV_ERR_LOG("rws_read param err");
		return -EIO;
	}

	if ( len < 1 ) {
		MFC_DRV_ERR_LOG("length check len = %d", len);
		return -EIO;
	}

	rws_val = g_rws_data;

	if (copy_to_user(buf, &rws_val, 1)) {
		MFC_DRV_ERR_LOG("copy_to_user");
		return -EFAULT;
	}

	MFC_DRV_DBG_LOG("END rws_val = %d, len = %d", rws_val, len);

	return 1;
}
Exemple #4
0
static ssize_t intu_poll_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
{
	int ret;
	char on[2];

	MFC_DRV_DBG_LOG("START");

	/* length check */
	if (len < 1) {
		MFC_DRV_ERR_LOG("length check len = %d", len);
		return -EIO;
	}

	if (!g_intu_d.irq_handler_done) {
		if (filp->f_flags & O_NONBLOCK) {
			MFC_DRV_ERR_LOG("NONBLOCK");
			return -EAGAIN;
		}
		/* wait irq handler */
		ret = wait_event_interruptible(g_intu_d.read_wait,
		                               g_intu_d.irq_handler_done == 1);
		if (-ERESTARTSYS == ret) {
			MFC_DRV_DBG_LOG("wait_event_interruptible ret = %d", ret);
			return -EINTR;
		}
	}

	/* read failed */
	if (g_intu_d.read_error) {
		g_intu_d.irq_handler_done = 0;
		g_intu_d.read_error = 0;
		MFC_DRV_ERR_LOG("g_intu_d.read_error = %d", g_intu_d.read_error);
		return -EIO;
	}

	/* set readed data */
	if (g_intu_d.device_status == D_INTU_DEV_HIGH) {
		on[0] = D_INTU_DEV_HIGH;
	} else {
		on[0] = D_INTU_DEV_LOW;
	}
	on[1] = 0x00;

	if (len > 2)
		len = 2;

	if (copy_to_user(buf, on, len)) {
		MFC_DRV_ERR_LOG("copy_to_user");
		return -EFAULT;
	}

	g_intu_d.irq_handler_done = 0;

	MFC_DRV_DBG_LOG("END len = %d, on[0] = %d", len, on[0]);

	return len;
}
Exemple #5
0
static int intu_poll_open(struct inode *inode, struct file *filp)
{
	unsigned long irqflag = 0;
	int ret = 0;

	MFC_DRV_DBG_LOG("START");

	if (!(snfc_available())) {
		MFC_DRV_ERR_LOG("snfc_available");
		return -EIO;
	}

	/* only one time success */
	if (g_intu_d.open_flag) {
		MFC_DRV_ERR_LOG("only one time");
		return -EBUSY;
	}
	g_intu_d.open_flag = 1;

	/* preparation of anti-chattering */
	ret = gpio_get_value_cansleep(D_INTU_GPIO_NO);
	if (ret < 0) {
		g_intu_d.open_flag = 0;
		MFC_DRV_ERR_LOG("gpio_get_value_cansleep ret = %d", ret);
		return -EIO;
	}
	g_intu_d.device_status = ret;

	/* set irq handler */
	if (g_intu_d.device_status == D_INTU_DEV_LOW) {
		irqflag = IRQF_TRIGGER_HIGH | IRQF_SHARED;
	} else {
		irqflag = IRQF_TRIGGER_LOW | IRQF_SHARED;
	}

	if (request_irq(gpio_to_irq(D_INTU_GPIO_NO),
					intu_poll_irq_handler,
					irqflag,
					D_INTU_POLL_DEV_NAME,
					(void*)&g_intu_d)) {
		g_intu_d.open_flag = 0;
		MFC_DRV_ERR_LOG("request_irq irqflag = %ld", irqflag);
		return -EIO;
	}

	if (enable_irq_wake(gpio_to_irq(D_INTU_GPIO_NO))) {
		MFC_DRV_ERR_LOG("enable_irq_wake");
		free_irq(gpio_to_irq(D_INTU_GPIO_NO), (void *)&g_intu_d);
		return -EIO;
	}

	g_intu_d.irq_handler_done = 0;

	MFC_DRV_DBG_LOG("END");

	return 0;
}
Exemple #6
0
static int int_poll_open(struct inode *inode, struct file *file)
{
	struct poll_data *int_d = g_int_d;
	unsigned long irqflag = 0;
	int ret = 0;
	
	MFC_DRV_DBG_LOG("START");
	
	if (int_d->open_flag) {
		MFC_DRV_ERR_LOG("only one time");
		return -EBUSY;
	}
	int_d->open_flag = 1;
	
	ret = gpio_get_value(D_INT_POLL_GPIO_NO);
	if (ret < 0) {
		int_d->open_flag = 0;
		MFC_DRV_ERR_LOG("gpio_get_value ret = %d", ret);
		return -EIO;
	}
	int_d->device_status = ret;
	
	if (int_d->device_status == D_INT_DEV_LOW)
		irqflag = IRQF_TRIGGER_HIGH | IRQF_SHARED;
	else
		irqflag = IRQF_TRIGGER_LOW | IRQF_SHARED;
	
	if (request_irq(gpio_to_irq(D_INT_POLL_GPIO_NO),
	                int_poll_irq_handler,
	                irqflag,
	                D_INT_POLL_DEV_NAME,
	                (void*)int_d)) {
		
		int_d->open_flag = 0;
		
		MFC_DRV_ERR_LOG("request_irq irqflag = %ld", irqflag);
		
		return -EIO;
	}
	
	if (enable_irq_wake(gpio_to_irq(D_INT_POLL_GPIO_NO))){
		
		MFC_DRV_ERR_LOG("enable_irq_wake");
		
		free_irq(gpio_to_irq(D_INT_POLL_GPIO_NO), (void *)int_d);
		
		return -EIO;
	}
	
	int_d->irq_handler_done = 0;
	
	MFC_DRV_DBG_LOG("END");
	
	return 0;
}
Exemple #7
0
ssize_t int_poll_read(struct file *file, char __user * buf,
		      size_t len, loff_t * ppos)
{
	struct poll_data *int_d = g_int_d;
	int ret;
	char on[2];
	
	MFC_DRV_DBG_LOG("START");
	
	if ( len < 1 ) {
		MFC_DRV_ERR_LOG("length check len = %d", len);
		return -EIO;
	}
	
	if (!int_d->irq_handler_done) {
		if (file->f_flags & O_NONBLOCK) {
			MFC_DRV_ERR_LOG("NONBLOCK");
			return -EAGAIN;
		}
		MFC_DRV_DBG_LOG("FeliCa int_poll wait irq");
		ret = wait_event_interruptible(int_d->read_wait,
		                               int_d->irq_handler_done == 1);
		if (-ERESTARTSYS == ret) {
			MFC_DRV_DBG_LOG("wait_event_interruptible ret = %d", ret);
			return -EINTR;
		}
	}
	
	if (int_d->read_error) {
		int_d->irq_handler_done = 0;
		int_d->read_error = 0;
		MFC_DRV_ERR_LOG("int_d->read_error = %d", int_d->read_error);
		return -EIO;
	}
	
	if (int_d->device_status == D_INT_DEV_HIGH)
		on[0] = SHMFD_INT_STATUS_HIGH;
	else
		on[0] = SHMFD_INT_STATUS_LOW;
	
	on[1] = 0x00;
	
	if (len > 2)
		len = 2;
	if (copy_to_user(buf, on, len)) {
		MFC_DRV_ERR_LOG("copy_to_user");
		return -EFAULT;
	}
	int_d->irq_handler_done = 0;
	
	MFC_DRV_DBG_LOG("END len = %d, on[0] = %d", len, on[0]);
	
	return len;
}
Exemple #8
0
static int available_open(struct inode *inode, struct file *filp)
{
	int ret = 0, status = 0;

	MFC_DRV_DBG_LOG("START");

	if (!(snfc_available())) {
		MFC_DRV_ERR_LOG("snfc_available");
		return -EIO;
	}

	/* only one time success */
	if (g_available_d.open_flag) {
		MFC_DRV_ERR_LOG("only one time");
		return -EBUSY;
	}

	ret = get_cen_value();
	if (ret == CEN_LOCK_OFF) {
		status |= NFC_AVAILABLE_CEN;
	} else if (ret == CEN_LOCK_ON) {
		/* nothing to do */
	} else {
		MFC_DRV_ERR_LOG("get_cen_value ret = %d", ret);
		return -EIO;
	}

	if (g_current_state != SUCC_STATE_FELICA) {
		status |= NFC_AVAILABLE_FELICA;
	}

	if (mfc_rws_sts == D_RWS_RW_ENABLE) {
		status |= NFC_AVAILABLE_RWS;
	}

	/* request rfs irq */
	ret = request_notify_rfs_irq(&available_on_rfs_irq);
	if (ret == D_RFS_DEV_HIGH) {
		status |= NFC_AVAILABLE_RFS;
	} else if (ret == D_RFS_DEV_LOW) {
		/* nothing to do */
	} else {
		MFC_DRV_ERR_LOG("request_notify_rfs_irq ret = %d", ret);
		return -EIO;
	}

	g_available_d.device_status = status;
	g_available_d.open_flag = 1;

	MFC_DRV_DBG_LOG("END status = %d", status);

	return 0;
}
Exemple #9
0
static int intu_poll_init(void)
{
	int result = 0;
	struct device *class_dev;

	dev_t dev = MKDEV(MISC_MAJOR, 0);

	MFC_DRV_DBG_LOG("START");

	/* get major number */
	result = alloc_chrdev_region(&dev, 0, D_INTU_POLL_DEVS, D_INTU_POLL_DEV_NAME);
	if (result) {
		MFC_DRV_ERR_LOG("alloc_chrdev_region result = %d", result);
		return result;
	}

	/* initialize INTU */
	cdev_init(&intu_poll_cdev, &intu_poll_fileops);
	intu_poll_cdev.owner = THIS_MODULE;

	/* add INTU */
	result = cdev_add(&intu_poll_cdev, dev, D_INTU_POLL_DEVS);
	if (result) {
		unregister_chrdev_region(dev, D_INTU_POLL_DEVS);
		MFC_DRV_ERR_LOG("cdev_add result = %d", result);
		return result;
	}

	/* create INTU */
	class_dev = device_create(snfc_class, NULL, dev, NULL, D_INTU_POLL_DEV_NAME);
	if (IS_ERR(class_dev)) {
		cdev_del(&intu_poll_cdev);
		unregister_chrdev_region(dev, D_INTU_POLL_DEVS);
		result = PTR_ERR(class_dev);
		MFC_DRV_ERR_LOG("device_create result = %d", result);
		return result;
	}

	/* initialize poll_data */
	memset(&g_intu_d, 0x00, sizeof(struct poll_data));
	/* initialize workqueue */
	INIT_DELAYED_WORK(&g_intu_d.work, intu_poll_work_func);
	/* initialize waitqueue */
	init_waitqueue_head(&g_intu_d.read_wait);

	g_intu_d.open_flag = 0;

	MFC_DRV_DBG_LOG("END");

	return result;
}
Exemple #10
0
static int available_init(void)
{
	int result = 0;
	struct device *class_dev;

	dev_t dev = MKDEV(MISC_MAJOR, 0);

	MFC_DRV_DBG_LOG("START");

	/* get major number */
	result = alloc_chrdev_region(&dev, 0, D_AVAILABLE_DEVS, D_AVAILABLE_DEV_NAME);
	if (result) {
		MFC_DRV_ERR_LOG("alloc_chrdev_region result = %d", result);
		return result;
	}

	/* initialize Available */
	cdev_init(&available_cdev, &available_fileops);
	available_cdev.owner = THIS_MODULE;

	/* add Available */
	result = cdev_add(&available_cdev, dev, D_AVAILABLE_DEVS);
	if (result) {
		unregister_chrdev_region(dev, D_AVAILABLE_DEVS);
		MFC_DRV_ERR_LOG("cdev_add result = %d", result);
		return result;
	}

	/* create Available */
	class_dev = device_create(snfc_class, NULL, dev, NULL, D_AVAILABLE_DEV_NAME);
	if (IS_ERR(class_dev)) {
		cdev_del(&available_cdev);
		unregister_chrdev_region(dev, D_AVAILABLE_DEVS);
		result = PTR_ERR(class_dev);
		MFC_DRV_ERR_LOG("device_create result = %d", result);
		return result;
	}

	/* initialize available_data */
	memset(&g_available_d, 0, sizeof(g_available_d));
	/* initialize waitqueue */
	init_waitqueue_head(&g_available_d.read_wait);

	g_available_d.open_flag = 0;

	MFC_DRV_DBG_LOG("END");

	return result;
}
Exemple #11
0
static int succ_actOpenNfc(int flags)
{
	MFC_DRV_DBG_LOG("ENTER");

	if (flags & SHSNFC_UCC_FLAG_RWS_CHECK) {
		if (mfc_rws_sts == D_RWS_RW_DISABLE) {
			MFC_DRV_DBG_LOG("rws disable");
			succ_handle_event(SUCC_EVENT_END_NFC, flags);
			return SUCC_RETVAL_BUSY;
		}
	}

	set_hsel_value(D_HSEL_DEV_HIGH);
	if (set_pon_value(D_PON_DEV_HIGH) != 0) {
		MFC_DRV_ERR_LOG("set pon failed");
		succ_handle_event(SUCC_EVENT_END_NFC, flags);
		return SUCC_RETVAL_BUSY;
	}

	if (flags & SHSNFC_UCC_FLAG_PON_WAIT) {
		usleep(D_SUCC_PON_WAIT_USEC);
	} else if (flags & SHSNFC_UCC_FLAG_PON_WAIT_NO_RFS) {
		if (get_rfs_value() == D_RFS_DEV_HIGH) {
			usleep(D_SUCC_PON_WAIT_USEC);
		}
	} else {
		/* nothing to do */
	}

	return SUCC_RETVAL_OK;
}
Exemple #12
0
static int int_poll_init(void)
{
	int sdResult = 0;
	struct device *class_dev;
	
	dev_t dev = MKDEV(MISC_MAJOR, 0);
	
	MFC_DRV_DBG_LOG("START");
	
	sdResult = alloc_chrdev_region(&dev , 0 , D_INT_POLL_DEVS, D_INT_POLL_DEV_NAME);
	if (sdResult) {
		MFC_DRV_ERR_LOG("alloc_chrdev_region sdResult = %d", sdResult);
		return sdResult;
	}
	
	cdev_init(&int_poll_cdev, &int_poll_fileops);
	int_poll_cdev.owner = THIS_MODULE;
	
	sdResult = cdev_add(&int_poll_cdev, dev, D_INT_POLL_DEVS);
	if (sdResult) {
		unregister_chrdev_region(dev, D_INT_POLL_DEVS);
		MFC_DRV_ERR_LOG("cdev_add sdResult = %d",sdResult);
		return sdResult;
	}
	
	class_dev = device_create(felica_class, NULL, dev, NULL, D_INT_POLL_DEV_NAME);
	if (IS_ERR(class_dev)) {
		cdev_del(&int_poll_cdev);
		unregister_chrdev_region(dev, D_INT_POLL_DEVS);
		sdResult = PTR_ERR(class_dev);
		MFC_DRV_ERR_LOG("device_create sdResult = %d", sdResult);
		return sdResult;
	}
	
	memset(g_int_d, 0x00, sizeof(struct poll_data));

	INIT_DELAYED_WORK(&g_int_d->work, int_poll_work_func);

	init_waitqueue_head(&g_int_d->read_wait);
	
	g_int_d->open_flag = 0;
	
	MFC_DRV_DBG_LOG("END");
	
	return sdResult;
}
Exemple #13
0
/*
 * function_hsel
 */
int set_hsel_value(int value)
{
	if (!(snfc_available())) {
		MFC_DRV_ERR_LOG("snfc_available");
		return -EIO;
	}

	gpio_set_value(D_HSEL_GPIO_NO, value);
	return 0;
}
Exemple #14
0
static int succ_open(struct inode *inode, struct file *filp)
{
	MFC_DRV_DBG_LOG("");

	if (!(snfc_available())) {
		MFC_DRV_ERR_LOG("snfc_available");
		return -EIO;
	}

	return 0;
}
Exemple #15
0
/*
 * function_succ
 */
static long succ_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	int event, result, flags;
	MFC_DRV_DBG_LOG("START cmd = %u, arg = %lu", cmd, arg);

	if (!(snfc_available())) {
		MFC_DRV_ERR_LOG("snfc_available");
		return -EIO;
	}

	if (copy_from_user(&flags, (int __user *)arg, sizeof(flags))) {
		MFC_DRV_ERR_LOG("copy_from_user");
		return -EFAULT;
	}

	switch (cmd) {
	case SHSNFC_UCC_REQ_AUTOPOLL:
		event = SUCC_EVENT_AUTOPOLL;
		break;
	case SHSNFC_UCC_REQ_START_NFC:
		event = SUCC_EVENT_START_NFC;
		break;
	case SHSNFC_UCC_REQ_END_PROC:
		event = SUCC_EVENT_END_NFC;
		break;
	default:
		MFC_DRV_ERR_LOG("cmd unhandled");
		return -EINVAL;
	}

	result = succ_handle_event(event, flags);

	if (copy_to_user((int __user *)arg, &result, sizeof(result))) {
		MFC_DRV_ERR_LOG("copy_to_user");
		return -EFAULT;
	}

	MFC_DRV_DBG_LOG("END");

	return 0;
}
Exemple #16
0
ssize_t rate_read(struct file *file, char __user * buf, size_t len, loff_t * ppos)
{
	int rate_val;
	
	MFC_DRV_DBG_LOG("START");
	
	if ( len < 4 ) {
		MFC_DRV_ERR_LOG("length check len = %d", len);
		return -EIO;
	}

	rate_val = g_unrate;
	if (copy_to_user(buf, &rate_val, 4)) {
		MFC_DRV_ERR_LOG("copy_to_user");
		return -EFAULT;
	}

	MFC_DRV_DBG_LOG("END rate_val = %d, len = %d", rate_val, len);

	return 4;
}
Exemple #17
0
static int succ_init(void)
{
	int result = 0;
	struct device *class_dev;

	dev_t dev = MKDEV(MISC_MAJOR, 0);

	MFC_DRV_DBG_LOG("START");

	result = alloc_chrdev_region(&dev, 0, D_SUCC_DEVS, D_SUCC_DEV_NAME);
	if (result) {
		MFC_DRV_ERR_LOG("alloc_chrdev_region result = %d", result);
		return result;
	}

	cdev_init(&succ_cdev, &succ_fileops);
	succ_cdev.owner = THIS_MODULE;

	result = cdev_add(&succ_cdev, dev, D_SUCC_DEVS);
	if (result) {
		unregister_chrdev_region(dev, D_SUCC_DEVS);
		MFC_DRV_ERR_LOG("cdev_add result = %d", result);
		return result;
	}

	class_dev = device_create(snfc_class, NULL, dev, NULL, D_SUCC_DEV_NAME);
	if (IS_ERR(class_dev)) {
		cdev_del(&succ_cdev);
		unregister_chrdev_region(dev, D_SUCC_DEVS);
		result = PTR_ERR(class_dev);
		MFC_DRV_ERR_LOG("device_create result = %d", result);
		return result;
	}

	MFC_DRV_DBG_LOG("END");

	return result;
}
Exemple #18
0
/*
 * function_rfs
 */
ssize_t rfs_read(struct file *file, char __user * buf,
		      size_t len, loff_t * ppos)
{
	int ret;
	char on[2];
	
	MFC_DRV_DBG_LOG("START");
	
	if ( len < 1 ) {
		MFC_DRV_ERR_LOG("length check len = %d", len);
		return -EIO;
	}
	ret = gpio_get_value_cansleep( PM8058_GPIO_PM_TO_SYS(MFD_RFS_PM_GPIO_NUM-1) );

	if (ret < 0) {
		MFC_DRV_ERR_LOG("gpio_get_value ret = %d", ret);
		return ret;
	}
	
	if (ret == D_RFS_DEV_HIGH)
		on[0] = SHMFD_RFS_STATUS_HIGH;
	else
		on[0] = SHMFD_RFS_STATUS_LOW;
	
	on[1] = 0x00;
	
	if (len > 2)
		len = 2;
	
	if (copy_to_user(buf, on, len)) {
		MFC_DRV_ERR_LOG("copy_to_user");
		return -EFAULT;
	}
	
	MFC_DRV_DBG_LOG("END on[0] = %d, len = %d", on[0], len);
	
	return len;
}
Exemple #19
0
static int pon_init(void)
{
	int sdResult = 0;
	struct device *class_dev;
	
	dev_t dev = MKDEV(MISC_MAJOR, 0);
	
	MFC_DRV_DBG_LOG("START");
	
	sdResult = alloc_chrdev_region(&dev , 0 , D_PON_DEVS, D_PON_DEV_NAME);
	if (sdResult) {
		MFC_DRV_ERR_LOG("alloc_chrdev_region sdResult = %d", sdResult);
		return sdResult;
	}
	
	cdev_init(&pon_cdev, &pon_fileops);
	pon_cdev.owner = THIS_MODULE;
	
	sdResult = cdev_add(&pon_cdev, dev, D_PON_DEVS);
	if (sdResult) {
		unregister_chrdev_region(dev, D_PON_DEVS);
		MFC_DRV_ERR_LOG("cdev_add sdResult = %d", sdResult);
		return sdResult;
	}
	
	class_dev = device_create(felica_class, NULL, dev, NULL, D_PON_DEV_NAME);
	if (IS_ERR(class_dev)) {
		cdev_del(&pon_cdev);
		unregister_chrdev_region(dev, D_PON_DEVS);
		sdResult = PTR_ERR(class_dev);
		MFC_DRV_ERR_LOG("device_create sdResult = %d", sdResult);
		return sdResult;
	}

	MFC_DRV_DBG_LOG("END");
	
	return sdResult;
}
Exemple #20
0
/*
 * function_intu_poll
 */
static void intu_poll_work_func(struct work_struct *work)
{
	int read_value = 0, old_value = 0;
	unsigned long irqflag = 0;

	MFC_DRV_DBG_LOG("START");

	old_value = g_intu_d.device_status;

	read_value = gpio_get_value_cansleep(D_INTU_GPIO_NO);

	MFC_DRV_DBG_LOG("read_value = %d old_value = %d", read_value, old_value);

	/* read error */
	if (read_value < 0) {
		g_intu_d.read_error = read_value;
	/* read changed data */
	} else if (read_value != old_value) {
		g_intu_d.device_status = read_value;
		g_intu_d.read_error = 0;

		/* change irq flag */
		if (g_intu_d.device_status == D_INTU_DEV_LOW)
			irqflag = IRQF_TRIGGER_HIGH | IRQF_SHARED;
		else
			irqflag = IRQF_TRIGGER_LOW | IRQF_SHARED;
/* COORDINATOR Qualcomm1021 BUILDERR MODIFY start */
		if (irq_set_irq_type(gpio_to_irq(D_INTU_GPIO_NO), irqflag))
			MFC_DRV_ERR_LOG("set_irq_type irqflag = %ld", irqflag);
/* COORDINATOR Qualcomm1021 BUILDERR MODIFY end */
	}

	/* enable irq handler */
	enable_irq(gpio_to_irq(D_INTU_GPIO_NO));

	/* read changed data or error */
	if (read_value != old_value || g_intu_d.read_error) {
		if ((snfc_available()) && (snfc_available_wake_up())) {
			/* wakeup poll and read */
			g_intu_d.irq_handler_done = 1;
			wake_up_interruptible(&g_intu_d.read_wait);
		}
	}

	MFC_DRV_DBG_LOG("END read_value = %d, old_value = %d, g_intu_d.read_error = %d"
					, read_value, old_value, g_intu_d.read_error);
}
Exemple #21
0
void int_poll_work_func(struct work_struct *work)
{
	struct poll_data *int_d = g_int_d;
	int read_value = 0, old_value = 0, i = 0;
	unsigned long irqflag = 0;
	
	MFC_DRV_DBG_LOG("START");
	
	old_value = int_d->device_status;
	for (i = 0; i < D_INT_POLL_SLEEP_NUM; i++) {
		read_value = gpio_get_value(D_INT_POLL_GPIO_NO);

		if (read_value < 0 || read_value == old_value)
			break;
		
		msleep(D_INT_POLL_SLEEP_MSEC);
	}
	
	MFC_DRV_DBG_LOG("read_value = %d old_value = %d", read_value, old_value);
	
	if (read_value < 0) {
		int_d->read_error = read_value;
	} else if (read_value != old_value) {
		int_d->device_status = read_value;
		int_d->read_error = 0;
		
		if (int_d->device_status == D_INT_DEV_LOW)
			irqflag = IRQF_TRIGGER_HIGH | IRQF_SHARED;
		else
			irqflag = IRQF_TRIGGER_LOW | IRQF_SHARED;

		if (set_irq_type(gpio_to_irq(D_INT_POLL_GPIO_NO), irqflag))
			MFC_DRV_ERR_LOG("set_irq_type irqflag = %ld", irqflag);
	}
	
	enable_irq(gpio_to_irq(D_INT_POLL_GPIO_NO));
	
	if (read_value != old_value || int_d->read_error) {
		int_d->irq_handler_done = 1;
		wake_up_interruptible(&int_d->read_wait);
	}
	
	MFC_DRV_DBG_LOG("END read_value = %d, old_value = %d, int_d->read_error = %d"
					, read_value, old_value, int_d->read_error);
}
Exemple #22
0
static int intu_poll_release(struct inode *inode, struct file *filp)
{
	MFC_DRV_DBG_LOG("START");

	/* clear workqueue */
	cancel_delayed_work(&g_intu_d.work);

	if (disable_irq_wake(gpio_to_irq(D_INTU_GPIO_NO)))
		MFC_DRV_ERR_LOG("disable_irq_wake");

	free_irq(gpio_to_irq(D_INTU_GPIO_NO), (void *)&g_intu_d);

	g_intu_d.open_flag = 0;

	MFC_DRV_DBG_LOG("END");

	return 0;
}
Exemple #23
0
static int int_poll_release(struct inode *inode, struct file *file)
{
	struct poll_data *int_d = g_int_d;
	
	MFC_DRV_DBG_LOG("START");
	
	cancel_delayed_work(&int_d->work);
	
	if (disable_irq_wake(gpio_to_irq(D_INT_POLL_GPIO_NO)))
		MFC_DRV_ERR_LOG("disable_irq_wake");
	
	free_irq(gpio_to_irq(D_INT_POLL_GPIO_NO), (void *)int_d);
	
	int_d->open_flag = 0;
	
	MFC_DRV_DBG_LOG("END");
	
	return 0;
}
Exemple #24
0
static ssize_t available_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
{
	int ret, available;
	char on[2];

	MFC_DRV_DBG_LOG("START");

	if (!(snfc_available())) {
		MFC_DRV_ERR_LOG("snfc_available");
		return -EIO;
	}

	/* length check */
	if (len < 1) {
		MFC_DRV_ERR_LOG("len = %d", len);
		return -EIO;
	}

	available = is_nfc_available();
	if (!available) {
		g_available_d.irq_handler_done = 0;

		MFC_DRV_DBG_LOG("start read_wait");

		if (filp->f_flags & O_NONBLOCK) {
			MFC_DRV_ERR_LOG("NONBLOCK");
			return -EAGAIN;
		}

		if (g_available_d.irq_handler_done == 0) {
			/* wait irq handler */
			ret = wait_event_interruptible(g_available_d.read_wait,
											g_available_d.irq_handler_done == 1);
			if (ret == -ERESTARTSYS) {
				MFC_DRV_DBG_LOG("wait_event_interruptible ret = %d", ret);
				return -EINTR;
			}
		}

		/* read failed */
		if (g_available_d.read_error) {
			g_available_d.read_error = 0;
			MFC_DRV_ERR_LOG("read_error = %d", g_available_d.read_error);
			return -EIO;
		}

		available = is_nfc_available();
		MFC_DRV_DBG_LOG("end read_wait available = %d", available);
	}

	/* set readed data */
	if (available) {
		on[0] = 1;
	} else {
		on[0] = 0;
	}
	on[1] = 0;

	if (len > 2)
		len = 2;

	if (copy_to_user(buf, on, len)) {
		MFC_DRV_ERR_LOG("copy_to_user");
		return -EFAULT;
	}

	MFC_DRV_DBG_LOG("END len = %d, on[0] = %d", len, on[0]);

	return len;
}