aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Ricard <christophe.ricard@gmail.com>2015-01-25 17:33:29 -0500
committerSamuel Ortiz <sameo@linux.intel.com>2015-01-26 17:14:34 -0500
commit7274496f2e1e799dbc260d7465e32077cb1a3fd6 (patch)
tree9ff398eb60545644a165764116597ded5a4fffb4
parentc490c557b67fddfc7d733455d86500080ba717b6 (diff)
NFC: st21nfcb: Fix "NULL pointer dereference" possible error
When the platform with CONFIG_ST21NFCB_I2C=y without any st21nfcb component physically connected a: "Unable to handle kernel NULL pointer dereference at virtual address" may show up at driver initialization phase. Signed-off-by: Christophe Ricard <christophe-h.ricard@st.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
-rw-r--r--drivers/nfc/st21nfcb/i2c.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/nfc/st21nfcb/i2c.c b/drivers/nfc/st21nfcb/i2c.c
index b65847c62631..eb886932d972 100644
--- a/drivers/nfc/st21nfcb/i2c.c
+++ b/drivers/nfc/st21nfcb/i2c.c
@@ -199,7 +199,7 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
199 struct sk_buff *skb = NULL; 199 struct sk_buff *skb = NULL;
200 int r; 200 int r;
201 201
202 if (!phy || irq != phy->i2c_dev->irq) { 202 if (!phy || !phy->ndlc || irq != phy->i2c_dev->irq) {
203 WARN_ON_ONCE(1); 203 WARN_ON_ONCE(1);
204 return IRQ_NONE; 204 return IRQ_NONE;
205 } 205 }
@@ -343,18 +343,22 @@ static int st21nfcb_nci_i2c_probe(struct i2c_client *client,
343 return -ENODEV; 343 return -ENODEV;
344 } 344 }
345 345
346 r = ndlc_probe(phy, &i2c_phy_ops, &client->dev,
347 ST21NFCB_FRAME_HEADROOM, ST21NFCB_FRAME_TAILROOM,
348 &phy->ndlc);
349 if (r < 0) {
350 nfc_err(&client->dev, "Unable to register ndlc layer\n");
351 return r;
352 }
353
346 r = devm_request_threaded_irq(&client->dev, client->irq, NULL, 354 r = devm_request_threaded_irq(&client->dev, client->irq, NULL,
347 st21nfcb_nci_irq_thread_fn, 355 st21nfcb_nci_irq_thread_fn,
348 phy->irq_polarity | IRQF_ONESHOT, 356 phy->irq_polarity | IRQF_ONESHOT,
349 ST21NFCB_NCI_DRIVER_NAME, phy); 357 ST21NFCB_NCI_DRIVER_NAME, phy);
350 if (r < 0) { 358 if (r < 0)
351 nfc_err(&client->dev, "Unable to register IRQ handler\n"); 359 nfc_err(&client->dev, "Unable to register IRQ handler\n");
352 return r;
353 }
354 360
355 return ndlc_probe(phy, &i2c_phy_ops, &client->dev, 361 return r;
356 ST21NFCB_FRAME_HEADROOM, ST21NFCB_FRAME_TAILROOM,
357 &phy->ndlc);
358} 362}
359 363
360static int st21nfcb_nci_i2c_remove(struct i2c_client *client) 364static int st21nfcb_nci_i2c_remove(struct i2c_client *client)