lkml.org 
[lkml]   [2013]   [Jun]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 18/53] Input: atmel_mxt_ts - Implement bootloader frame retries
    Date
    Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
    Acked-by: Benson Leung <bleung@chromium.org>
    ---
    drivers/input/touchscreen/atmel_mxt_ts.c | 27 ++++++++++++++++++++-------
    1 file changed, 20 insertions(+), 7 deletions(-)

    diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
    index df8fc1a..2cd8ead 100644
    --- a/drivers/input/touchscreen/atmel_mxt_ts.c
    +++ b/drivers/input/touchscreen/atmel_mxt_ts.c
    @@ -494,8 +494,12 @@ recheck:
    val &= ~MXT_BOOT_STATUS_MASK;
    break;
    case MXT_FRAME_CRC_PASS:
    - if (val == MXT_FRAME_CRC_CHECK)
    + if (val == MXT_FRAME_CRC_CHECK) {
    goto recheck;
    + } else if (val == MXT_FRAME_CRC_FAIL) {
    + dev_err(dev, "Bootloader CRC fail\n");
    + return -EINVAL;
    + }
    break;
    default:
    return -EINVAL;
    @@ -1460,6 +1464,7 @@ static int mxt_load_fw(struct device *dev, const char *fn)
    const struct firmware *fw = NULL;
    unsigned int frame_size;
    unsigned int pos = 0;
    + unsigned int retry = 0;
    int ret;

    ret = request_firmware(&fw, fn, dev);
    @@ -1497,9 +1502,7 @@ static int mxt_load_fw(struct device *dev, const char *fn)

    frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1));

    - /* We should add 2 at frame size as the the firmware data is not
    - * included the CRC bytes.
    - */
    + /* Take account of CRC bytes */
    frame_size += 2;

    /* Write one frame to device */
    @@ -1508,10 +1511,20 @@ static int mxt_load_fw(struct device *dev, const char *fn)
    goto disable_irq;

    ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS);
    - if (ret)
    - goto disable_irq;
    + if (ret) {
    + retry++;

    - pos += frame_size;
    + /* Back off by 20ms per retry */
    + msleep(retry * 20);
    +
    + if (retry > 20) {
    + dev_err(dev, "Retry count exceeded\n");
    + goto disable_irq;
    + }
    + } else {
    + retry = 0;
    + pos += frame_size;
    + }

    dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, fw->size);
    }
    --
    1.7.10.4


    \
     
     \ /
      Last update: 2013-06-05 20:42    [W:4.107 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site