Skip to content

Commit f865df7

Browse files
ndyerdtor
authored andcommitted
Input: atmel_mxt_ts - refactor config update code to add context struct
Signed-off-by: Nick Dyer <[email protected]> Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent 15082bd commit f865df7

File tree

1 file changed

+56
-52
lines changed

1 file changed

+56
-52
lines changed

drivers/input/touchscreen/atmel_mxt_ts.c

Lines changed: 56 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,19 @@ enum mxt_suspend_mode {
277277
MXT_SUSPEND_T9_CTRL = 1,
278278
};
279279

280+
/* Config update context */
281+
struct mxt_cfg {
282+
const u8 *raw;
283+
size_t raw_size;
284+
off_t raw_pos;
285+
286+
u8 *mem;
287+
size_t mem_size;
288+
int start_ofs;
289+
290+
struct mxt_info info;
291+
};
292+
280293
/* Each client has this additional data */
281294
struct mxt_data {
282295
struct i2c_client *client;
@@ -1282,12 +1295,7 @@ static u32 mxt_calculate_crc(u8 *base, off_t start_off, off_t end_off)
12821295
return crc;
12831296
}
12841297

1285-
static int mxt_prepare_cfg_mem(struct mxt_data *data,
1286-
const struct firmware *cfg,
1287-
unsigned int data_pos,
1288-
unsigned int cfg_start_ofs,
1289-
u8 *config_mem,
1290-
size_t config_mem_size)
1298+
static int mxt_prepare_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg)
12911299
{
12921300
struct device *dev = &data->client->dev;
12931301
struct mxt_object *object;
@@ -1298,9 +1306,9 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
12981306
u16 reg;
12991307
u8 val;
13001308

1301-
while (data_pos < cfg->size) {
1309+
while (cfg->raw_pos < cfg->raw_size) {
13021310
/* Read type, instance, length */
1303-
ret = sscanf(cfg->data + data_pos, "%x %x %x%n",
1311+
ret = sscanf(cfg->raw + cfg->raw_pos, "%x %x %x%n",
13041312
&type, &instance, &size, &offset);
13051313
if (ret == 0) {
13061314
/* EOF */
@@ -1309,20 +1317,20 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
13091317
dev_err(dev, "Bad format: failed to parse object\n");
13101318
return -EINVAL;
13111319
}
1312-
data_pos += offset;
1320+
cfg->raw_pos += offset;
13131321

13141322
object = mxt_get_object(data, type);
13151323
if (!object) {
13161324
/* Skip object */
13171325
for (i = 0; i < size; i++) {
1318-
ret = sscanf(cfg->data + data_pos, "%hhx%n",
1326+
ret = sscanf(cfg->raw + cfg->raw_pos, "%hhx%n",
13191327
&val, &offset);
13201328
if (ret != 1) {
13211329
dev_err(dev, "Bad format in T%d at %d\n",
13221330
type, i);
13231331
return -EINVAL;
13241332
}
1325-
data_pos += offset;
1333+
cfg->raw_pos += offset;
13261334
}
13271335
continue;
13281336
}
@@ -1357,23 +1365,23 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
13571365
reg = object->start_address + mxt_obj_size(object) * instance;
13581366

13591367
for (i = 0; i < size; i++) {
1360-
ret = sscanf(cfg->data + data_pos, "%hhx%n",
1368+
ret = sscanf(cfg->raw + cfg->raw_pos, "%hhx%n",
13611369
&val,
13621370
&offset);
13631371
if (ret != 1) {
13641372
dev_err(dev, "Bad format in T%d at %d\n",
13651373
type, i);
13661374
return -EINVAL;
13671375
}
1368-
data_pos += offset;
1376+
cfg->raw_pos += offset;
13691377

13701378
if (i > mxt_obj_size(object))
13711379
continue;
13721380

1373-
byte_offset = reg + i - cfg_start_ofs;
1381+
byte_offset = reg + i - cfg->start_ofs;
13741382

1375-
if (byte_offset >= 0 && byte_offset < config_mem_size) {
1376-
*(config_mem + byte_offset) = val;
1383+
if (byte_offset >= 0 && byte_offset < cfg->mem_size) {
1384+
*(cfg->mem + byte_offset) = val;
13771385
} else {
13781386
dev_err(dev, "Bad object: reg:%d, T%d, ofs=%d\n",
13791387
reg, object->type, byte_offset);
@@ -1385,22 +1393,21 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
13851393
return 0;
13861394
}
13871395

1388-
static int mxt_upload_cfg_mem(struct mxt_data *data, unsigned int cfg_start,
1389-
u8 *config_mem, size_t config_mem_size)
1396+
static int mxt_upload_cfg_mem(struct mxt_data *data, struct mxt_cfg *cfg)
13901397
{
13911398
unsigned int byte_offset = 0;
13921399
int error;
13931400

13941401
/* Write configuration as blocks */
1395-
while (byte_offset < config_mem_size) {
1396-
unsigned int size = config_mem_size - byte_offset;
1402+
while (byte_offset < cfg->mem_size) {
1403+
unsigned int size = cfg->mem_size - byte_offset;
13971404

13981405
if (size > MXT_MAX_BLOCK_WRITE)
13991406
size = MXT_MAX_BLOCK_WRITE;
14001407

14011408
error = __mxt_write_reg(data->client,
1402-
cfg_start + byte_offset,
1403-
size, config_mem + byte_offset);
1409+
cfg->start_ofs + byte_offset,
1410+
size, cfg->mem + byte_offset);
14041411
if (error) {
14051412
dev_err(&data->client->dev,
14061413
"Config write error, ret=%d\n", error);
@@ -1434,66 +1441,65 @@ static int mxt_init_t7_power_cfg(struct mxt_data *data);
14341441
* <SIZE> - 2-byte object size as hex
14351442
* <CONTENTS> - array of <SIZE> 1-byte hex values
14361443
*/
1437-
static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
1444+
static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw)
14381445
{
14391446
struct device *dev = &data->client->dev;
1440-
struct mxt_info cfg_info;
1447+
struct mxt_cfg cfg;
14411448
int ret;
14421449
int offset;
1443-
int data_pos;
14441450
int i;
1445-
int cfg_start_ofs;
14461451
u32 info_crc, config_crc, calculated_crc;
1447-
u8 *config_mem;
1448-
size_t config_mem_size;
14491452
u16 crc_start = 0;
14501453

1454+
cfg.raw = fw->data;
1455+
cfg.raw_size = fw->size;
1456+
14511457
mxt_update_crc(data, MXT_COMMAND_REPORTALL, 1);
14521458

1453-
if (strncmp(cfg->data, MXT_CFG_MAGIC, strlen(MXT_CFG_MAGIC))) {
1459+
if (strncmp(cfg.raw, MXT_CFG_MAGIC, strlen(MXT_CFG_MAGIC))) {
14541460
dev_err(dev, "Unrecognised config file\n");
14551461
return -EINVAL;
14561462
}
14571463

1458-
data_pos = strlen(MXT_CFG_MAGIC);
1464+
cfg.raw_pos = strlen(MXT_CFG_MAGIC);
14591465

14601466
/* Load information block and check */
14611467
for (i = 0; i < sizeof(struct mxt_info); i++) {
1462-
ret = sscanf(cfg->data + data_pos, "%hhx%n",
1463-
(unsigned char *)&cfg_info + i,
1468+
ret = sscanf(cfg.raw + cfg.raw_pos, "%hhx%n",
1469+
(unsigned char *)&cfg.info + i,
14641470
&offset);
14651471
if (ret != 1) {
14661472
dev_err(dev, "Bad format\n");
14671473
return -EINVAL;
14681474
}
14691475

1470-
data_pos += offset;
1476+
cfg.raw_pos += offset;
14711477
}
14721478

1473-
if (cfg_info.family_id != data->info->family_id) {
1479+
if (cfg.info.family_id != data->info->family_id) {
14741480
dev_err(dev, "Family ID mismatch!\n");
14751481
return -EINVAL;
14761482
}
14771483

1478-
if (cfg_info.variant_id != data->info->variant_id) {
1484+
if (cfg.info.variant_id != data->info->variant_id) {
14791485
dev_err(dev, "Variant ID mismatch!\n");
14801486
return -EINVAL;
14811487
}
14821488

14831489
/* Read CRCs */
1484-
ret = sscanf(cfg->data + data_pos, "%x%n", &info_crc, &offset);
1490+
ret = sscanf(cfg.raw + cfg.raw_pos, "%x%n", &info_crc, &offset);
14851491
if (ret != 1) {
14861492
dev_err(dev, "Bad format: failed to parse Info CRC\n");
14871493
return -EINVAL;
14881494
}
1489-
data_pos += offset;
1495+
cfg.raw_pos += offset;
14901496

1491-
ret = sscanf(cfg->data + data_pos, "%x%n", &config_crc, &offset);
1497+
ret = sscanf(cfg.raw + cfg.raw_pos, "%x%n", &config_crc, &offset);
14921498
if (ret != 1) {
14931499
dev_err(dev, "Bad format: failed to parse Config CRC\n");
14941500
return -EINVAL;
14951501
}
1496-
data_pos += offset;
1502+
cfg.raw_pos += offset;
14971503

14981504
/*
14991505
* The Info Block CRC is calculated over mxt_info and the object
@@ -1519,16 +1525,15 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
15191525
}
15201526

15211527
/* Malloc memory to store configuration */
1522-
cfg_start_ofs = MXT_OBJECT_START +
1528+
cfg.start_ofs = MXT_OBJECT_START +
15231529
data->info->object_num * sizeof(struct mxt_object) +
15241530
MXT_INFO_CHECKSUM_SIZE;
1525-
config_mem_size = data->mem_size - cfg_start_ofs;
1526-
config_mem = kzalloc(config_mem_size, GFP_KERNEL);
1527-
if (!config_mem)
1531+
cfg.mem_size = data->mem_size - cfg.start_ofs;
1532+
cfg.mem = kzalloc(cfg.mem_size, GFP_KERNEL);
1533+
if (!cfg.mem)
15281534
return -ENOMEM;
15291535

1530-
ret = mxt_prepare_cfg_mem(data, cfg, data_pos, cfg_start_ofs,
1531-
config_mem, config_mem_size);
1536+
ret = mxt_prepare_cfg_mem(data, &cfg);
15321537
if (ret)
15331538
goto release_mem;
15341539

@@ -1540,18 +1545,17 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
15401545
else
15411546
dev_warn(dev, "Could not find CRC start\n");
15421547

1543-
if (crc_start > cfg_start_ofs) {
1544-
calculated_crc = mxt_calculate_crc(config_mem,
1545-
crc_start - cfg_start_ofs,
1546-
config_mem_size);
1548+
if (crc_start > cfg.start_ofs) {
1549+
calculated_crc = mxt_calculate_crc(cfg.mem,
1550+
crc_start - cfg.start_ofs,
1551+
cfg.mem_size);
15471552

15481553
if (config_crc > 0 && config_crc != calculated_crc)
15491554
dev_warn(dev, "Config CRC in file inconsistent, calculated=%06X, file=%06X\n",
15501555
calculated_crc, config_crc);
15511556
}
15521557

1553-
ret = mxt_upload_cfg_mem(data, cfg_start_ofs,
1554-
config_mem, config_mem_size);
1558+
ret = mxt_upload_cfg_mem(data, &cfg);
15551559
if (ret)
15561560
goto release_mem;
15571561

@@ -1567,7 +1571,7 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
15671571
mxt_init_t7_power_cfg(data);
15681572

15691573
release_mem:
1570-
kfree(config_mem);
1574+
kfree(cfg.mem);
15711575
return ret;
15721576
}
15731577

0 commit comments

Comments
 (0)