Skip to content

Commit

Permalink
NFC: st-nci: Disable irq when powering the device up
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Christophe Ricard authored and Samuel Ortiz committed Oct 27, 2015
1 parent a9e062d commit bb2496c
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
8 changes: 7 additions & 1 deletion drivers/nfc/st-nci/i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}
Expand All @@ -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;
}

/*
Expand Down Expand Up @@ -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,
Expand Down
8 changes: 7 additions & 1 deletion drivers/nfc/st-nci/spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
}
Expand All @@ -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;
}

/*
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit bb2496c

Please sign in to comment.