Skip to content

Commit

Permalink
Input: atmel_mxt_ts - allow specification of firmware file name
Browse files Browse the repository at this point in the history
On platforms which have multiple device instances using this driver, the
firmware may be different on each device. This patch makes the user give
the name of the firmware file when flashing.

This also prevents accidental triggering of the firmware load process.

Signed-off-by: Nick Dyer <[email protected]>
Acked-by: Benson Leung <[email protected]>
Acked-by: Yufeng Shen <[email protected]>
  • Loading branch information
ndyer committed Apr 26, 2016
1 parent 93a5757 commit 76ebb7c
Showing 1 changed file with 37 additions and 6 deletions.
43 changes: 37 additions & 6 deletions drivers/input/touchscreen/atmel_mxt_ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@
#include <linux/regulator/consumer.h>
#include <linux/gpio.h>

/* Firmware files */
#define MXT_FW_NAME "maxtouch.fw"
/* Configuration file */
#define MXT_CFG_NAME "maxtouch.cfg"
#define MXT_CFG_MAGIC "OBP_RAW V1"

Expand Down Expand Up @@ -279,6 +278,7 @@ struct mxt_data {
bool use_retrigen_workaround;
struct regulator *reg_vdd;
struct regulator *reg_avdd;
char *fw_name;

/* Cached parameters from object table */
u16 T5_address;
Expand Down Expand Up @@ -2679,7 +2679,7 @@ static int mxt_check_firmware_format(struct device *dev,
return -EINVAL;
}

static int mxt_load_fw(struct device *dev, const char *fn)
static int mxt_load_fw(struct device *dev)
{
struct mxt_data *data = dev_get_drvdata(dev);
const struct firmware *fw = NULL;
Expand All @@ -2689,9 +2689,9 @@ static int mxt_load_fw(struct device *dev, const char *fn)
unsigned int frame = 0;
int ret;

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

Expand Down Expand Up @@ -2811,14 +2811,45 @@ static int mxt_load_fw(struct device *dev, const char *fn)
return ret;
}

static int mxt_update_file_name(struct device *dev, char **file_name,
const char *buf, size_t count)
{
char *file_name_tmp;

/* Simple sanity check */
if (count > 64) {
dev_warn(dev, "File name too long\n");
return -EINVAL;
}

file_name_tmp = krealloc(*file_name, count + 1, GFP_KERNEL);
if (!file_name_tmp)
return -ENOMEM;

*file_name = file_name_tmp;
memcpy(*file_name, buf, count);

/* Echo into the sysfs entry may append newline at the end of buf */
if (buf[count - 1] == '\n')
(*file_name)[count - 1] = '\0';
else
(*file_name)[count] = '\0';

return 0;
}

static ssize_t mxt_update_fw_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct mxt_data *data = dev_get_drvdata(dev);
int error;

error = mxt_load_fw(dev, MXT_FW_NAME);
error = mxt_update_file_name(dev, &data->fw_name, buf, count);
if (error)
return error;

error = mxt_load_fw(dev);
if (error) {
dev_err(dev, "The firmware update failed(%d)\n", error);
count = error;
Expand Down

0 comments on commit 76ebb7c

Please sign in to comment.