Ejemplo n.º 1
0
static long pn547_dev_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
    struct pn547_dev *pn547_dev = filp->private_data;
    unsigned long flags;

    switch (cmd) {
    case pn547_SET_PWR:
        if (arg == 2) {
            /*
            power on with firmware download (requires hw reset)
            */
            dprintk(PN547_DRV_NAME ":%s power on with firmware\n", __func__);

            gpio_set_value(pn547_dev->ven_gpio, 1);
            gpio_set_value(pn547_dev->firm_gpio, 1);
            msleep(10);
            gpio_set_value(pn547_dev->ven_gpio, 0);
            msleep(10);
            gpio_set_value(pn547_dev->ven_gpio, 1);
            msleep(10);
        } else if (arg == 1) {
            /* power on */
            pr_info(PN547_DRV_NAME ":%s power on\n", __func__);
            if (sPowerState == NFC_POWER_OFF) {
#ifdef CONFIG_LGE_NFC_USE_PMIC
                if(clk_source == CLKS_PMIC)
                    pn547_change_clk(pn547_dev, CLK_PIN);
#endif
                gpio_set_value(pn547_dev->firm_gpio, 0);
                gpio_set_value(pn547_dev->ven_gpio, 1);
                msleep(10);

                spin_lock_irqsave(&pn547_dev->irq_enabled_lock, flags);
#ifdef CONFIG_LGE_NFC_SET_IRQ_WAKEUP
                if (sIrqState == false) {
                    irq_set_irq_wake(pn547_dev->client->irq,1);
                    sIrqState = true;
                    pr_info(PN547_DRV_NAME ":%s enable IRQ\n", __func__);
                }
                else {
                    pr_err("%s IRQ is already enabled!\n", __func__);
                }
#endif
                //pr_err("%s NFC_POWER_ON\n", __func__); // for debug
                sPowerState = NFC_POWER_ON;
                spin_unlock_irqrestore(&pn547_dev->irq_enabled_lock, flags);
            }
            else {
                pr_err("%s NFC is alread On!\n", __func__);
            }
        } else  if (arg == 0) {
            /* power off */
            pr_info(PN547_DRV_NAME ":%s power off\n", __func__);
            if (sPowerState == NFC_POWER_ON) {
#ifdef CONFIG_LGE_NFC_USE_PMIC
                if(clk_source == CLKS_PMIC)
                    pn547_change_clk(pn547_dev, CLK_DISABLE);
#endif
                gpio_set_value(pn547_dev->firm_gpio, 0);
                gpio_set_value(pn547_dev->ven_gpio, 0);
                msleep(10);

                spin_lock_irqsave(&pn547_dev->irq_enabled_lock, flags);
#ifdef CONFIG_LGE_NFC_SET_IRQ_WAKEUP
                if (sIrqState == true) {
                    irq_set_irq_wake(pn547_dev->client->irq,0);
                    sIrqState = false;
                    dprintk(PN547_DRV_NAME ":%s disable IRQ\n", __func__);
                }
                else {
                    pr_err("%s IRQ is already disabled!\n", __func__);
                }
#endif
                if (sIsWakeLocked == true) {
                    pr_err("%s: Release Wake_Lock\n", __func__);
                    wake_unlock(&nfc_wake_lock);
                    sIsWakeLocked = false;
                }
                //pr_err("%s NFC_POWER_OFF\n", __func__); // for debug
                sPowerState = NFC_POWER_OFF;
                spin_unlock_irqrestore(&pn547_dev->irq_enabled_lock, flags);
            }
            else {
                pr_err("%s NFC is alread Off!\n", __func__);
            }
        } else {
                pr_err("%s bad arg %ld\n", __func__, arg);
            return -EINVAL;
        }
        break;
    case pn547_HW_REVISION:
        {
            return pn547_get_hw_revision();
        }
#ifdef CONFIG_LGE_NFC_USE_PMIC
    case pn547_CLKS_SET:
        {
            if(arg == 0){
                clk_source = CLKS_XO;
                dprintk(PN547_DRV_NAME "%s: clock source X-tal set!\n", __func__);
            }else if(arg == 1){
                clk_source = CLKS_PMIC;
                dprintk(PN547_DRV_NAME "%s: clock source PMIC set!\n", __func__);
            }else{
                pr_err("%s: wrong clock source set clk source : %ld\n", __func__, arg);
                return -1;
            }
        }
        break;
#endif
    default:
        pr_err("%s bad ioctl %d\n", __func__, cmd);
        return -EINVAL;
    }

    return 0;
}
static long pn547_dev_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
    struct pn547_dev *pn547_dev = filp->private_data;
    unsigned long flags;

    switch (cmd) {
    case pn547_SET_PWR:
        if (arg == 2) {
            /*
            power on with firmware download (requires hw reset)
            */
            dprintk(PN547_DRV_NAME ":%s power on with firmware\n", __func__);

            gpio_set_value(pn547_dev->ven_gpio, 1);
            gpio_set_value(pn547_dev->firm_gpio, 1);
            msleep(10);
            gpio_set_value(pn547_dev->ven_gpio, 0);
            msleep(10);
            gpio_set_value(pn547_dev->ven_gpio, 1);
            msleep(10);
        } else if (arg == 1) {
            /* power on */
            dprintk(PN547_DRV_NAME ":%s power on\n", __func__);
            if (sPowerState == NFC_POWER_OFF) {
                gpio_set_value(pn547_dev->firm_gpio, 0);
                gpio_set_value(pn547_dev->ven_gpio, 1);
                msleep(10);

                spin_lock_irqsave(&pn547_dev->irq_enabled_lock, flags);
#ifdef CONFIG_LGE_NFC_SET_IRQ_WAKEUP
                if (sIrqState == false) {
                    irq_set_irq_wake(pn547_dev->client->irq,1);
                    sIrqState = true;
                    dprintk(PN547_DRV_NAME ":%s enable IRQ\n", __func__);
                }
                else {
                    pr_err("%s IRQ is already enabled!\n", __func__);
                }
#endif
                //pr_err("%s NFC_POWER_ON\n", __func__); // for debug
                sPowerState = NFC_POWER_ON;
                sReadSequence = NFC_PACKET_HEADER;
                spin_unlock_irqrestore(&pn547_dev->irq_enabled_lock, flags);
            }
            else {
                pr_err("%s NFC is alread On!\n", __func__);
            }
        } else  if (arg == 0) {
            /* power off */
            dprintk(PN547_DRV_NAME ":%s power off\n", __func__);
            if (sPowerState == NFC_POWER_ON) {
                gpio_set_value(pn547_dev->firm_gpio, 0);
                gpio_set_value(pn547_dev->ven_gpio, 0);
                msleep(10);

                spin_lock_irqsave(&pn547_dev->irq_enabled_lock, flags);
#ifdef CONFIG_LGE_NFC_SET_IRQ_WAKEUP
                if (sIrqState == true) {
                    irq_set_irq_wake(pn547_dev->client->irq,0);
                    sIrqState = false;
                    dprintk(PN547_DRV_NAME ":%s disable IRQ\n", __func__);
                }
                else {
                    pr_err("%s IRQ is already disabled!\n", __func__);
                }
#endif
                if (pn547_dev->count_irq > 0) {
                    pr_err("%s: Clear IRQ(%d)\n", __func__, pn547_dev->count_irq);
                    pn547_dev->count_irq = 0;
                    wake_unlock(&nfc_wake_lock);
                }
                //pr_err("%s NFC_POWER_OFF\n", __func__); // for debug
                sPowerState = NFC_POWER_OFF;
                sReadSequence = NFC_PACKET_HEADER;
                spin_unlock_irqrestore(&pn547_dev->irq_enabled_lock, flags);
            }
            else {
                pr_err("%s NFC is alread Off!\n", __func__);
            }
        } else {
                pr_err("%s bad arg %ld\n", __func__, arg);
            return -EINVAL;
        }
        break;
    case pn547_HW_REVISION:
        {
            return pn547_get_hw_revision();
        }
    default:
        pr_err("%s bad ioctl %d\n", __func__, cmd);
        return -EINVAL;
    }

    return 0;
}