mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 17:12:06 +00:00
NFC: st-nci: Disable irq when powering the device up
Upon some conditions (timing, CLF errors, platform errors...), the irq might be already active when powering the device. Add irq_active variable as a guard to avoid kernel warning message Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
This commit is contained in:
parent
a9e062d059
commit
bb2496c3ec
@ -50,6 +50,8 @@ struct st_nci_i2c_phy {
|
||||
struct i2c_client *i2c_dev;
|
||||
struct llt_ndlc *ndlc;
|
||||
|
||||
bool irq_active;
|
||||
|
||||
unsigned int gpio_reset;
|
||||
unsigned int irq_polarity;
|
||||
|
||||
@ -72,8 +74,10 @@ static int st_nci_i2c_enable(void *phy_id)
|
||||
gpio_set_value(phy->gpio_reset, 1);
|
||||
usleep_range(80000, 85000);
|
||||
|
||||
if (phy->ndlc->powered == 0)
|
||||
if (phy->ndlc->powered == 0 && phy->irq_active == 0) {
|
||||
enable_irq(phy->i2c_dev->irq);
|
||||
phy->irq_active = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -83,6 +87,7 @@ static void st_nci_i2c_disable(void *phy_id)
|
||||
struct st_nci_i2c_phy *phy = phy_id;
|
||||
|
||||
disable_irq_nosync(phy->i2c_dev->irq);
|
||||
phy->irq_active = false;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -342,6 +347,7 @@ static int st_nci_i2c_probe(struct i2c_client *client,
|
||||
return r;
|
||||
}
|
||||
|
||||
phy->irq_active = true;
|
||||
r = devm_request_threaded_irq(&client->dev, client->irq, NULL,
|
||||
st_nci_irq_thread_fn,
|
||||
phy->irq_polarity | IRQF_ONESHOT,
|
||||
|
@ -51,6 +51,8 @@ struct st_nci_spi_phy {
|
||||
struct spi_device *spi_dev;
|
||||
struct llt_ndlc *ndlc;
|
||||
|
||||
bool irq_active;
|
||||
|
||||
unsigned int gpio_reset;
|
||||
unsigned int irq_polarity;
|
||||
|
||||
@ -73,8 +75,10 @@ static int st_nci_spi_enable(void *phy_id)
|
||||
gpio_set_value(phy->gpio_reset, 1);
|
||||
usleep_range(80000, 85000);
|
||||
|
||||
if (phy->ndlc->powered == 0)
|
||||
if (phy->ndlc->powered == 0 && phy->irq_active == 0) {
|
||||
enable_irq(phy->spi_dev->irq);
|
||||
phy->irq_active = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -84,6 +88,7 @@ static void st_nci_spi_disable(void *phy_id)
|
||||
struct st_nci_spi_phy *phy = phy_id;
|
||||
|
||||
disable_irq_nosync(phy->spi_dev->irq);
|
||||
phy->irq_active = false;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -358,6 +363,7 @@ static int st_nci_spi_probe(struct spi_device *dev)
|
||||
return r;
|
||||
}
|
||||
|
||||
phy->irq_active = true;
|
||||
r = devm_request_threaded_irq(&dev->dev, dev->irq, NULL,
|
||||
st_nci_irq_thread_fn,
|
||||
phy->irq_polarity | IRQF_ONESHOT,
|
||||
|
Loading…
Reference in New Issue
Block a user