Merge "NFC: Fix crash due to invalid use of ese gpio"

This commit is contained in:
Linux Build Service Account 2016-07-19 18:47:58 -07:00 committed by Gerrit - the friendly Code Review server
commit 3225611f1d

View file

@ -325,8 +325,10 @@ static int nqx_ese_pwr(struct nqx_dev *nqx_dev, unsigned long int arg)
} else if (arg == 3) { } else if (arg == 3) {
if (!nqx_dev->nfc_ven_enabled) if (!nqx_dev->nfc_ven_enabled)
r = 0; r = 0;
else else {
r = gpio_get_value(nqx_dev->ese_gpio); if (gpio_is_valid(nqx_dev->ese_gpio))
r = gpio_get_value(nqx_dev->ese_gpio);
}
} }
return r; return r;
} }
@ -375,11 +377,14 @@ int nfc_ioctl_power_states(struct file *filp, unsigned long arg)
__func__, nqx_dev); __func__, nqx_dev);
if (gpio_is_valid(nqx_dev->firm_gpio)) if (gpio_is_valid(nqx_dev->firm_gpio))
gpio_set_value(nqx_dev->firm_gpio, 0); gpio_set_value(nqx_dev->firm_gpio, 0);
if (!gpio_get_value(nqx_dev->ese_gpio)) {
dev_dbg(&nqx_dev->client->dev, "disabling en_gpio\n"); if (gpio_is_valid(nqx_dev->ese_gpio)) {
gpio_set_value(nqx_dev->en_gpio, 0); if (!gpio_get_value(nqx_dev->ese_gpio)) {
} else { dev_dbg(&nqx_dev->client->dev, "disabling en_gpio\n");
dev_dbg(&nqx_dev->client->dev, "keeping en_gpio high\n"); gpio_set_value(nqx_dev->en_gpio, 0);
} else {
dev_dbg(&nqx_dev->client->dev, "keeping en_gpio high\n");
}
} }
r = nqx_clock_deselect(nqx_dev); r = nqx_clock_deselect(nqx_dev);
if (r < 0) if (r < 0)
@ -405,9 +410,11 @@ int nfc_ioctl_power_states(struct file *filp, unsigned long arg)
* We are switching to Dowload Mode, toggle the enable pin * We are switching to Dowload Mode, toggle the enable pin
* in order to set the NFCC in the new mode * in order to set the NFCC in the new mode
*/ */
if (gpio_get_value(nqx_dev->ese_gpio)) { if (gpio_is_valid(nqx_dev->ese_gpio)) {
dev_err(&nqx_dev->client->dev, "FW download forbidden while ese is on\n"); if (gpio_get_value(nqx_dev->ese_gpio)) {
return -EBUSY; /* Device or resource busy */ dev_err(&nqx_dev->client->dev, "FW download forbidden while ese is on\n");
return -EBUSY; /* Device or resource busy */
}
} }
gpio_set_value(nqx_dev->en_gpio, 1); gpio_set_value(nqx_dev->en_gpio, 1);
msleep(20); msleep(20);
@ -828,6 +835,7 @@ static int nqx_probe(struct i2c_client *client,
nqx_dev->en_gpio = platform_data->en_gpio; nqx_dev->en_gpio = platform_data->en_gpio;
nqx_dev->irq_gpio = platform_data->irq_gpio; nqx_dev->irq_gpio = platform_data->irq_gpio;
nqx_dev->firm_gpio = platform_data->firm_gpio; nqx_dev->firm_gpio = platform_data->firm_gpio;
nqx_dev->ese_gpio = platform_data->ese_gpio;
nqx_dev->clkreq_gpio = platform_data->clkreq_gpio; nqx_dev->clkreq_gpio = platform_data->clkreq_gpio;
nqx_dev->pdata = platform_data; nqx_dev->pdata = platform_data;