]> Pileus Git - ~andy/linux/blobdiff - drivers/input/touchscreen/cyttsp4_core.c
Merge tag 'cris-for-3.12' of git://jni.nu/cris
[~andy/linux] / drivers / input / touchscreen / cyttsp4_core.c
index 8238d9881bcb6af07d35d8b9c361fc451fffbef6..d038575f49db3a6d70e16ee640fb67cfbcab24be 100644 (file)
@@ -153,7 +153,7 @@ static int cyttsp4_hw_reset(struct cyttsp4 *cd)
  */
 static int cyttsp4_bits_2_bytes(unsigned int nbits, size_t *max)
 {
-       *max = 1 << nbits;
+       *max = 1UL << nbits;
        return (nbits + 7) / 8;
 }
 
@@ -1447,11 +1447,6 @@ static void cyttsp4_watchdog_work(struct work_struct *work)
        u8 *mode;
        int retval;
 
-       if (cd == NULL) {
-               dev_err(cd->dev, "%s: NULL context pointer\n", __func__);
-               return;
-       }
-
        mutex_lock(&cd->system_lock);
        retval = cyttsp4_load_status_regs(cd);
        if (retval < 0) {
@@ -1554,106 +1549,6 @@ exit:
        return rc;
 }
 
-static int cyttsp4_core_sleep(struct cyttsp4 *cd)
-{
-       int rc;
-
-       rc = cyttsp4_request_exclusive(cd, cd->dev,
-                       CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT);
-       if (rc < 0) {
-               dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n",
-                               __func__, cd->exclusive_dev, cd->dev);
-               return 0;
-       }
-
-       rc = cyttsp4_core_sleep_(cd);
-
-       if (cyttsp4_release_exclusive(cd, cd->dev) < 0)
-               dev_err(cd->dev, "%s: fail to release exclusive\n", __func__);
-       else
-               dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__);
-
-       return rc;
-}
-
-static int cyttsp4_core_wake_(struct cyttsp4 *cd)
-{
-       struct device *dev = cd->dev;
-       int rc;
-       u8 mode;
-       int t;
-
-       /* Already woken? */
-       mutex_lock(&cd->system_lock);
-       if (cd->sleep_state == SS_SLEEP_OFF) {
-               mutex_unlock(&cd->system_lock);
-               return 0;
-       }
-       cd->int_status &= ~CY_INT_IGNORE;
-       cd->int_status |= CY_INT_AWAKE;
-       cd->sleep_state = SS_WAKING;
-
-       if (cd->cpdata->power) {
-               dev_dbg(dev, "%s: Power up HW\n", __func__);
-               rc = cd->cpdata->power(cd->cpdata, 1, dev, &cd->ignore_irq);
-       } else {
-               dev_dbg(dev, "%s: No power function\n", __func__);
-               rc = -ENOSYS;
-       }
-       if (rc < 0) {
-               dev_err(dev, "%s: HW Power up fails r=%d\n",
-                               __func__, rc);
-
-               /* Initiate a read transaction to wake up */
-               cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode);
-       } else
-               dev_vdbg(cd->dev, "%s: HW power up succeeds\n",
-                       __func__);
-       mutex_unlock(&cd->system_lock);
-
-       t = wait_event_timeout(cd->wait_q,
-                       (cd->int_status & CY_INT_AWAKE) == 0,
-                       msecs_to_jiffies(CY_CORE_WAKEUP_TIMEOUT));
-       if (IS_TMO(t)) {
-               dev_err(dev, "%s: TMO waiting for wakeup\n", __func__);
-               mutex_lock(&cd->system_lock);
-               cd->int_status &= ~CY_INT_AWAKE;
-               /* Try starting up */
-               cyttsp4_queue_startup_(cd);
-               mutex_unlock(&cd->system_lock);
-       }
-
-       mutex_lock(&cd->system_lock);
-       cd->sleep_state = SS_SLEEP_OFF;
-       mutex_unlock(&cd->system_lock);
-
-       cyttsp4_start_wd_timer(cd);
-
-       return 0;
-}
-
-static int cyttsp4_core_wake(struct cyttsp4 *cd)
-{
-       int rc;
-
-       rc = cyttsp4_request_exclusive(cd, cd->dev,
-                       CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT);
-       if (rc < 0) {
-               dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n",
-                               __func__, cd->exclusive_dev, cd->dev);
-               return 0;
-       }
-
-       rc = cyttsp4_core_wake_(cd);
-
-       if (cyttsp4_release_exclusive(cd, cd->dev) < 0)
-               dev_err(cd->dev, "%s: fail to release exclusive\n", __func__);
-       else
-               dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__);
-
-       return rc;
-}
-
 static int cyttsp4_startup_(struct cyttsp4 *cd)
 {
        int retry = CY_CORE_STARTUP_RETRY_COUNT;
@@ -1823,6 +1718,106 @@ static void cyttsp4_free_si_ptrs(struct cyttsp4 *cd)
 }
 
 #if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_RUNTIME)
+static int cyttsp4_core_sleep(struct cyttsp4 *cd)
+{
+       int rc;
+
+       rc = cyttsp4_request_exclusive(cd, cd->dev,
+                       CY_CORE_SLEEP_REQUEST_EXCLUSIVE_TIMEOUT);
+       if (rc < 0) {
+               dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n",
+                               __func__, cd->exclusive_dev, cd->dev);
+               return 0;
+       }
+
+       rc = cyttsp4_core_sleep_(cd);
+
+       if (cyttsp4_release_exclusive(cd, cd->dev) < 0)
+               dev_err(cd->dev, "%s: fail to release exclusive\n", __func__);
+       else
+               dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__);
+
+       return rc;
+}
+
+static int cyttsp4_core_wake_(struct cyttsp4 *cd)
+{
+       struct device *dev = cd->dev;
+       int rc;
+       u8 mode;
+       int t;
+
+       /* Already woken? */
+       mutex_lock(&cd->system_lock);
+       if (cd->sleep_state == SS_SLEEP_OFF) {
+               mutex_unlock(&cd->system_lock);
+               return 0;
+       }
+       cd->int_status &= ~CY_INT_IGNORE;
+       cd->int_status |= CY_INT_AWAKE;
+       cd->sleep_state = SS_WAKING;
+
+       if (cd->cpdata->power) {
+               dev_dbg(dev, "%s: Power up HW\n", __func__);
+               rc = cd->cpdata->power(cd->cpdata, 1, dev, &cd->ignore_irq);
+       } else {
+               dev_dbg(dev, "%s: No power function\n", __func__);
+               rc = -ENOSYS;
+       }
+       if (rc < 0) {
+               dev_err(dev, "%s: HW Power up fails r=%d\n",
+                               __func__, rc);
+
+               /* Initiate a read transaction to wake up */
+               cyttsp4_adap_read(cd, CY_REG_BASE, sizeof(mode), &mode);
+       } else
+               dev_vdbg(cd->dev, "%s: HW power up succeeds\n",
+                       __func__);
+       mutex_unlock(&cd->system_lock);
+
+       t = wait_event_timeout(cd->wait_q,
+                       (cd->int_status & CY_INT_AWAKE) == 0,
+                       msecs_to_jiffies(CY_CORE_WAKEUP_TIMEOUT));
+       if (IS_TMO(t)) {
+               dev_err(dev, "%s: TMO waiting for wakeup\n", __func__);
+               mutex_lock(&cd->system_lock);
+               cd->int_status &= ~CY_INT_AWAKE;
+               /* Try starting up */
+               cyttsp4_queue_startup_(cd);
+               mutex_unlock(&cd->system_lock);
+       }
+
+       mutex_lock(&cd->system_lock);
+       cd->sleep_state = SS_SLEEP_OFF;
+       mutex_unlock(&cd->system_lock);
+
+       cyttsp4_start_wd_timer(cd);
+
+       return 0;
+}
+
+static int cyttsp4_core_wake(struct cyttsp4 *cd)
+{
+       int rc;
+
+       rc = cyttsp4_request_exclusive(cd, cd->dev,
+                       CY_CORE_REQUEST_EXCLUSIVE_TIMEOUT);
+       if (rc < 0) {
+               dev_err(cd->dev, "%s: fail get exclusive ex=%p own=%p\n",
+                               __func__, cd->exclusive_dev, cd->dev);
+               return 0;
+       }
+
+       rc = cyttsp4_core_wake_(cd);
+
+       if (cyttsp4_release_exclusive(cd, cd->dev) < 0)
+               dev_err(cd->dev, "%s: fail to release exclusive\n", __func__);
+       else
+               dev_vdbg(cd->dev, "%s: pass release exclusive\n", __func__);
+
+       return rc;
+}
+
 static int cyttsp4_core_suspend(struct device *dev)
 {
        struct cyttsp4 *cd = dev_get_drvdata(dev);
@@ -2027,7 +2022,7 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
        if (!cd->xfer_buf) {
                dev_err(dev, "%s: Error, kzalloc\n", __func__);
                rc = -ENOMEM;
-               goto error_alloc_data;
+               goto error_free_cd;
        }
 
        /* Initialize device info */
@@ -2051,7 +2046,7 @@ struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops,
        cd->irq = gpio_to_irq(cd->cpdata->irq_gpio);
        if (cd->irq < 0) {
                rc = -EINVAL;
-               goto error_gpio_irq;
+               goto error_free_xfer;
        }
 
        dev_set_drvdata(dev, cd);
@@ -2119,7 +2114,9 @@ error_request_irq:
        if (cd->cpdata->init)
                cd->cpdata->init(cd->cpdata, 0, dev);
        dev_set_drvdata(dev, NULL);
-error_gpio_irq:
+error_free_xfer:
+       kfree(cd->xfer_buf);
+error_free_cd:
        kfree(cd);
 error_alloc_data:
 error_no_pdata: