Esempio n. 1
0
static long bcm2079x_dev_unlocked_ioctl(struct file *filp,
					 unsigned int cmd, unsigned long arg)
{
	struct bcm2079x_dev *bcm2079x_dev = filp->private_data;

	switch (cmd) {
	case BCMNFC_READ_FULL_PACKET:
		break;
	case BCMNFC_READ_MULTI_PACKETS:
		break;
	case BCMNFC_CHANGE_ADDR:
		dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_CHANGE_ADDR (%x, %lx):\n", __func__, cmd,
			 arg);
		return change_client_addr(bcm2079x_dev, arg);
	case BCMNFC_POWER_CTL:
		gpio_set_value(bcm2079x_dev->en_gpio, arg);
		break;
	case BCMNFC_WAKE_CTL:
		gpio_set_value(bcm2079x_dev->wake_gpio, arg);
		break;
	default:
		dev_err(&bcm2079x_dev->client->dev,
			"%s, unknown cmd (%x, %lx)\n", __func__, cmd, arg);
		return 0;
	}

	return 0;
}
static long bcm2079x_dev_unlocked_ioctl(struct file *filp,
                     unsigned int cmd, unsigned long arg)
{
    struct bcm2079x_dev *bcm2079x_dev = filp->private_data;
    // LGE_START [email protected] 2013-07-21 Modify for IRQ Exception Handle
    unsigned long flags;
    // LGE_END [email protected] 2013-07-21 Modify for IRQ Exception Handle

    switch (cmd) {
    case BCMNFC_READ_FULL_PACKET:
        break;
    case BCMNFC_READ_MULTI_PACKETS:
        break;
    case BCMNFC_CHANGE_ADDR:
        dev_info(&bcm2079x_dev->client->dev,
             "%s, BCMNFC_CHANGE_ADDR (%x, %lx):\n", __func__, cmd,
             arg);
        return change_client_addr(bcm2079x_dev, arg);
    case BCMNFC_POWER_CTL:
        // LGE_START [email protected] 2013-07-21 Modify for IRQ Exception Handle
        gpio_set_value(bcm2079x_dev->en_gpio, arg);

        //dev_info(&bcm2079x_dev->client->dev,"BCMNFC_POWER_CTL (%x, %lx):\n", cmd, arg);
        if ((sPowerState == NFC_POWER_ON) && (arg == 0)) {
            spin_lock_irqsave(&bcm2079x_dev->irq_enabled_lock, flags);
            //dev_info(&bcm2079x_dev->client->dev,"NFC_POWER_OFF\n");
            if (bcm2079x_dev->count_irq > 0) {
                dev_err(&bcm2079x_dev->client->dev,"Clear IRQ\n");
                bcm2079x_dev->count_irq = 0;
                wake_unlock(&nfc_wake_lock);
            }
            sPowerState = NFC_POWER_OFF;
            spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
        }
        else if ((sPowerState == NFC_POWER_OFF) && (arg == 1)) {
            spin_lock_irqsave(&bcm2079x_dev->irq_enabled_lock, flags);
            //dev_info(&bcm2079x_dev->client->dev,"NFC_POWER_ON\n");
            sPowerState = NFC_POWER_ON;
            spin_unlock_irqrestore(&bcm2079x_dev->irq_enabled_lock, flags);
        }
        //dev_info(&bcm2079x_dev->client->dev,"count_irq = %d\n", bcm2079x_dev->count_irq);
        // LGE_END [email protected] 2013-07-21 Modify for IRQ Exception Handle
        break;
    case BCMNFC_WAKE_CTL:
        gpio_set_value(bcm2079x_dev->wake_gpio, arg);
        break;
    default:
        dev_err(&bcm2079x_dev->client->dev,
            "%s, unknown cmd (%x, %lx)\n", __func__, cmd, arg);
        return 0;
    }

    return 0;
}
static int bcmi2cnfc_dev_ioctl(struct inode *inode, struct file *filp,
                               unsigned int cmd, unsigned long arg)
#endif
{
    struct bcmi2cnfc_dev *bcmi2cnfc_dev = filp->private_data;

    switch (cmd) {
    case BCMNFC_SET_WAKE_ACTIVE_STATE:
        dev_info(&bcmi2cnfc_dev->client->dev,
                 "%s, BCMNFC_SET_WAKE_ACTIVE_STATE (%x, %lx):\n", __func__, cmd, arg);
        bcmi2cnfc_dev->wake_active_state = arg;
        break;
    case BCMNFC_READ_FULL_PACKET:
        dev_info(&bcmi2cnfc_dev->client->dev,
                 "%s, BCMNFC_READ_FULL_PACKET (%x, %lx):\n", __func__, cmd, arg);
        bcmi2cnfc_dev->packet_size = arg;
        break;
    case BCMNFC_READ_MULTI_PACKETS:
        dev_info(&bcmi2cnfc_dev->client->dev,
                 "%s, BCMNFC_READ_MULTI_PACKETS (%x, %lx):\n", __func__, cmd, arg);
        bcmi2cnfc_dev->read_multiple_packets = arg;
        break;
#if CHANGE_CLIENT_ADDR
    case BCMNFC_CHANGE_ADDR:
        dev_info(&bcmi2cnfc_dev->client->dev,
                 "%s, BCMNFC_CHANGE_ADDR (%x, %lx):\n", __func__, cmd, arg);
        change_client_addr(bcmi2cnfc_dev, arg);
        break;
#endif
    case BCMNFC_POWER_CTL:
        dev_info(&bcmi2cnfc_dev->client->dev,
                 "%s, BCMNFC_POWER_CTL (%x, %lx):\n", __func__, cmd, arg);
        if (arg == BCMNFC_POWER_OFF) {
            bcmi2cnfc_disable_irq(bcmi2cnfc_dev);
            dev_info(&bcmi2cnfc_dev->client->dev,"irq disabled \n");
        } else if (arg == BCMNFC_POWER_ON) {
            bcmi2cnfc_enable_irq(bcmi2cnfc_dev);
        }
        gpio_set_value(bcmi2cnfc_dev->en_gpio, arg);
        break;
    case BCMNFC_WAKE_CTL:
        dev_info(&bcmi2cnfc_dev->client->dev,
                 "%s, BCMNFC_WAKE_CTL (%x, %lx):\n", __func__, cmd, arg);
        gpio_set_value(bcmi2cnfc_dev->wake_gpio, arg);
        break;
    default:
        dev_err(&bcmi2cnfc_dev->client->dev,
                "%s, unknown cmd (%x, %lx)\n", __func__, cmd, arg);
        return 0;
    }

    return 0;
}
static long bcm2079x_dev_compat_unlocked_ioctl(struct file *filp,
					 unsigned int cmd, unsigned long arg)
{
	struct bcm2079x_dev *bcm2079x_dev = filp->private_data;
	printk("[dsc-test]bcm2079x_dev_compat_unlocked_ioctl\n");
	arg = (compat_u64)arg;
	switch (cmd) {
	case BCMNFC_READ_FULL_PACKET:
		break;
	case BCMNFC_READ_MULTI_PACKETS:
		break;
	case BCMNFC_CHANGE_ADDR:
		dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_CHANGE_ADDR (%x, %lx):\n", __func__, cmd,
			 arg);
		change_client_addr(bcm2079x_dev, arg);
		break;
	case BCMNFC_POWER_CTL:
		dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_POWER_CTL (%x, %lx):\n", __func__, cmd,
			 arg);
		if (arg != 1)
			set_client_addr(bcm2079x_dev, bcm2079x_dev->original_address);
		gpio_set_value(bcm2079x_dev->en_gpio, arg);
		break;
	case BCMNFC_WAKE_CTL:
		dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_WAKE_CTL (%x, %lx):\n", __func__, cmd,
			 arg);
		//printk("zhanglongbo:arg is %lx\n",arg);
#ifdef USE_WAKE_LOCK
		if(arg != 0)
		{
			while(wake_lock_active(&bcm2079x_dev->wake_lock ))
			{
				printk("release wake lock!!!\n");
				wake_unlock(&bcm2079x_dev->wake_lock);
			}
			wake_lock_timeout(&bcm2079x_dev->wake_lock, HZ*2);
		}
#endif
		gpio_set_value(bcm2079x_dev->wake_gpio, arg);
		break;
	default:
		dev_err(&bcm2079x_dev->client->dev,
			"%s, unknown cmd (%x, %lx)\n", __func__, cmd, arg);
		return 0;
	}

	return 0;
}
Esempio n. 5
0
static long bcm2079x_dev_unlocked_ioctl(struct file *filp,
					 unsigned int cmd, unsigned long arg)
{
	struct bcm2079x_dev *bcm2079x_dev = filp->private_data;

	switch (cmd) {
	case BCMNFC_READ_FULL_PACKET:
		DBG(dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_READ_FULL_PACKET (%x, %lx):\n", __func__,
			 cmd, arg));
		break;
	case BCMNFC_READ_MULTI_PACKETS:
		DBG(dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_READ_MULTI_PACKETS (%x, %lx):\n", __func__,
			 cmd, arg));
		break;
	case BCMNFC_CHANGE_ADDR:
		DBG(dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_CHANGE_ADDR (%x, %lx):\n", __func__, cmd,
			 arg));
		change_client_addr(bcm2079x_dev, arg);
		break;
	case BCMNFC_POWER_CTL:
		DBG(dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_POWER_CTL (%x, %lx):\n", __func__, cmd,
			 arg));
		if (arg == 1) {	/* Power On */

			gpio_set_value(bcm2079x_dev->en_gpio, 1);
			if (bcm2079x_dev->irq_enabled == FALSE) {
				bcm2079x_dev->count_irq = 0;
				enable_irq(bcm2079x_dev->client->irq);
				bcm2079x_dev->irq_enabled = true;
			}
		} else {
			if (bcm2079x_dev->irq_enabled == true) {
				bcm2079x_dev->irq_enabled = FALSE;
				disable_irq_nosync(bcm2079x_dev->client->irq);
				if (bcm2079x_dev->count_irq > 0)
					wake_unlock(&nfc_wake_lock);
				}
			gpio_set_value(bcm2079x_dev->en_gpio, 0);
			set_client_addr(bcm2079x_dev,
				bcm2079x_dev->original_address);
		}
		break;
	case BCMNFC_WAKE_CTL:
		DBG(dev_info(&bcm2079x_dev->client->dev,
			 "%s, BCMNFC_WAKE_CTL (%x, %lx):\n", __func__, cmd,
			 arg));

#ifdef CONFIG_HAS_WAKELOCK
		if (arg == 0) {
			wake_lock(&nfc_wake_lock);
			DBG(dev_info(&bcm2079x_dev->client->dev, "%s: got wake lock", __func__));
		}
#endif

		gpio_set_value(bcm2079x_dev->wake_gpio, arg);

#ifdef CONFIG_HAS_WAKELOCK
		if (arg == 1) {
			wake_unlock(&nfc_wake_lock);
			DBG(dev_info(&bcm2079x_dev->client->dev, "%s: release wake lock, count_irq = %d",
						__func__, bcm2079x_dev->count_irq));
		}
#endif
		break;
	default:
		dev_err(&bcm2079x_dev->client->dev,
			"%s, unknown cmd (%x, %lx)\n", __func__, cmd, arg);
		return 0;
	}

	return 0;
}