summaryrefslogtreecommitdiff
path: root/nuttx/drivers/input/mxt.c
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-07-08 08:55:43 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-07-08 08:55:43 -0600
commit144bee43a459e31f52bd78c7d0fa8d8aeff33f44 (patch)
tree5c102fb226d22fd965997e0afc24cc25a5a4e006 /nuttx/drivers/input/mxt.c
parentc5dbd5f6728a60c8f610c71e8b126911cc605067 (diff)
downloadpx4-nuttx-144bee43a459e31f52bd78c7d0fa8d8aeff33f44.tar.gz
px4-nuttx-144bee43a459e31f52bd78c7d0fa8d8aeff33f44.tar.bz2
px4-nuttx-144bee43a459e31f52bd78c7d0fa8d8aeff33f44.zip
MXT Driver: Make sure that all return values are checked: Fix worker thread -- it must hold the MXT device semaphore to access I2C
Diffstat (limited to 'nuttx/drivers/input/mxt.c')
-rw-r--r--nuttx/drivers/input/mxt.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/nuttx/drivers/input/mxt.c b/nuttx/drivers/input/mxt.c
index 13e0e121d..aac6ee613 100644
--- a/nuttx/drivers/input/mxt.c
+++ b/nuttx/drivers/input/mxt.c
@@ -756,6 +756,15 @@ static void mxt_worker(FAR void *arg)
lower = priv->lower;
DEBUGASSERT(lower != NULL);
+ /* Get exclusive access to the MXT driver data structure */
+
+ do
+ {
+ ret = sem_wait(&priv->devsem);
+ DEBUGASSERT(ret == 0 || errno == EINTR);
+ }
+ while (ret < 0);
+
/* Loop, processing each message from the maXTouch */
do
@@ -766,7 +775,7 @@ static void mxt_worker(FAR void *arg)
if (ret < 0)
{
idbg("ERROR: mxt_getmessage failed: %d\n", ret);
- return;
+ goto errout_with_semaphore;
}
id = msg.id;
@@ -816,6 +825,11 @@ static void mxt_worker(FAR void *arg)
}
while (id != 0x00 && id != 0xff);
+errout_with_semaphore:
+ /* Release our lock on the MXT device */
+
+ sem_post(&priv->devsem);
+
/* Acknowledge and re-enable maXTouch interrupts */
MXT_CLEAR(lower);
@@ -894,6 +908,7 @@ static int mxt_open(FAR struct file *filep)
{
/* More than 255 opens; uint8_t overflows to zero */
+ idbg("ERROR: Too many opens: %d\n", priv->crefs);
ret = -EMFILE;
goto errout_with_sem;
}
@@ -906,7 +921,12 @@ static int mxt_open(FAR struct file *filep)
{
/* Touch enable */
- mxt_putobject(priv, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83);
+ ret = mxt_putobject(priv, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83);
+ if (ret < 0)
+ {
+ idbg("ERROR: Failed to enable touch: %d\n", ret);
+ goto errout_with_sem;
+ }
}
/* Save the new open count on success */
@@ -924,9 +944,9 @@ errout_with_sem:
static int mxt_close(FAR struct file *filep)
{
- FAR struct inode *inode;
+ FAR struct inode *inode;
FAR struct mxt_dev_s *priv;
- int ret;
+ int ret;
DEBUGASSERT(filep);
inode = filep->f_inode;
@@ -956,7 +976,11 @@ static int mxt_close(FAR struct file *filep)
{
/* Touch disable */
- mxt_putobject(priv, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0);
+ ret = mxt_putobject(priv, MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0);
+ if (ret < 0)
+ {
+ idbg("ERROR: Failed to disable touch: %d\n", ret);
+ }
}
}
@@ -1393,6 +1417,7 @@ static int mxt_getobjtab(FAR struct mxt_dev_s *priv)
tabsize);
if (ret < 0)
{
+ idbg("ERROR: Failed to object table size: %d\n", ret);
return ret;
}
@@ -1532,7 +1557,13 @@ static int mxt_hwinitialize(FAR struct mxt_dev_s *priv)
/* Perform a soft reset */
- mxt_putobject(priv, MXT_GEN_COMMAND_T6, MXT_COMMAND_RESET, 1);
+ ret = mxt_putobject(priv, MXT_GEN_COMMAND_T6, MXT_COMMAND_RESET, 1);
+ if (ret < 0)
+ {
+ idbg("ERROR: Soft reset failed: %d\n", ret);
+ goto errout_with_objtab;
+ }
+
usleep(MXT_RESET_TIME);
/* Update matrix size in the info structure */
@@ -1540,6 +1571,7 @@ static int mxt_hwinitialize(FAR struct mxt_dev_s *priv)
ret = mxt_getreg(priv, MXT_MATRIX_X_SIZE, (FAR uint8_t *)&regval, 1);
if (ret < 0)
{
+ idbg("ERROR: Failed to get X size: %d\n", ret);
goto errout_with_objtab;
}
@@ -1548,6 +1580,7 @@ static int mxt_hwinitialize(FAR struct mxt_dev_s *priv)
ret = mxt_getreg(priv, MXT_MATRIX_Y_SIZE, (FAR uint8_t *)&regval, 1);
if (ret < 0)
{
+ idbg("ERROR: Failed to get Y size: %d\n", ret);
goto errout_with_objtab;
}