lkml.org 
[lkml]   [2020]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v11 27/56] Input: atmel_mxt_ts - refactor firmware flash to extract context into struct
    Date
    From: Nick Dyer <nick.dyer@itdev.co.uk>

    Refactor firmware flash to extract context into struct

    Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
    (cherry picked from ndyer/linux/for-upstream commit 1bbe20ff3dcd6612e7942c495929eae5c138ece2)
    Signed-off-by: George G. Davis <george_davis@mentor.com>
    [jiada: Add commit description]
    Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
    ---
    drivers/input/touchscreen/atmel_mxt_ts.c | 59 +++++++++++++++---------
    1 file changed, 36 insertions(+), 23 deletions(-)

    diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
    index c3dd6c486c12..bb4fc13defea 100644
    --- a/drivers/input/touchscreen/atmel_mxt_ts.c
    +++ b/drivers/input/touchscreen/atmel_mxt_ts.c
    @@ -292,6 +292,22 @@ struct mxt_cfg {
    struct mxt_info info;
    };

    +/* Firmware frame structure */
    +struct mxt_fw_frame {
    + __be16 size;
    + u8 data[];
    +};
    +
    +/* Firmware update context */
    +struct mxt_flash {
    + const struct firmware *fw;
    + struct mxt_fw_frame *frame;
    + loff_t pos;
    + size_t frame_size;
    + unsigned int count;
    + unsigned int retry;
    +};
    +
    /* Each client has this additional data */
    struct mxt_data {
    struct i2c_client *client;
    @@ -3240,21 +3256,17 @@ static int mxt_check_firmware_format(struct device *dev,
    static int mxt_load_fw(struct device *dev)
    {
    struct mxt_data *data = dev_get_drvdata(dev);
    - const struct firmware *fw = NULL;
    - unsigned int frame_size;
    - unsigned int pos = 0;
    - unsigned int retry = 0;
    - unsigned int frame = 0;
    + struct mxt_flash f = { 0, };
    int ret;

    - ret = request_firmware(&fw, data->fw_name, dev);
    + ret = request_firmware(&f.fw, data->fw_name, dev);
    if (ret) {
    dev_err(dev, "Unable to open firmware %s\n", data->fw_name);
    return ret;
    }

    /* Check for incorrect enc file */
    - ret = mxt_check_firmware_format(dev, fw);
    + ret = mxt_check_firmware_format(dev, f.fw);
    if (ret)
    goto release_firmware;

    @@ -3308,41 +3320,42 @@ static int mxt_load_fw(struct device *dev)
    goto disable_irq;
    }

    - while (pos < fw->size) {
    + while (f.pos < f.fw->size) {
    + f.frame = (struct mxt_fw_frame *)(f.fw->data + f.pos);
    +
    ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA, true);
    if (ret)
    goto disable_irq;

    - frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1));
    -
    /* Take account of CRC bytes */
    - frame_size += 2;
    + f.frame_size = __be16_to_cpu(f.frame->size) + 2U;

    /* Write one frame to device */
    - ret = mxt_bootloader_write(data, fw->data + pos, frame_size);
    + ret = mxt_bootloader_write(data, f.fw->data + f.pos,
    + f.frame_size);
    if (ret)
    goto disable_irq;

    ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS, true);
    if (ret) {
    - retry++;
    + f.retry++;

    /* Back off by 20ms per retry */
    - msleep(retry * 20);
    + msleep(f.retry * 20);

    - if (retry > 20) {
    + if (f.retry > 20) {
    dev_err(dev, "Retry count exceeded\n");
    goto disable_irq;
    }
    } else {
    - retry = 0;
    - pos += frame_size;
    - frame++;
    + f.retry = 0;
    + f.pos += f.frame_size;
    + f.count++;
    }

    - if (frame % 50 == 0)
    - dev_dbg(dev, "Sent %d frames, %d/%zd bytes\n",
    - frame, pos, fw->size);
    + if (f.count % 50 == 0)
    + dev_dbg(dev, "Sent %u frames, %lld/%zu bytes\n",
    + f.count, f.pos, f.fw->size);
    }

    /* Wait for flash. */
    @@ -3351,7 +3364,7 @@ static int mxt_load_fw(struct device *dev)
    if (ret)
    goto disable_irq;

    - dev_dbg(dev, "Sent %d frames, %d bytes\n", frame, pos);
    + dev_dbg(dev, "Sent %u frames, %lld bytes\n", f.count, f.pos);

    /*
    * Wait for device to reset. Some bootloader versions do not assert
    @@ -3365,7 +3378,7 @@ static int mxt_load_fw(struct device *dev)
    disable_irq:
    disable_irq(data->irq);
    release_firmware:
    - release_firmware(fw);
    + release_firmware(f.fw);
    return ret;
    }

    --
    2.17.1
    \
     
     \ /
      Last update: 2020-05-08 07:59    [W:6.015 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site