@@ -277,6 +277,19 @@ enum mxt_suspend_mode {
277
277
MXT_SUSPEND_T9_CTRL = 1 ,
278
278
};
279
279
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
+
280
293
/* Each client has this additional data */
281
294
struct mxt_data {
282
295
struct i2c_client * client ;
@@ -1282,12 +1295,7 @@ static u32 mxt_calculate_crc(u8 *base, off_t start_off, off_t end_off)
1282
1295
return crc ;
1283
1296
}
1284
1297
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 )
1291
1299
{
1292
1300
struct device * dev = & data -> client -> dev ;
1293
1301
struct mxt_object * object ;
@@ -1298,9 +1306,9 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
1298
1306
u16 reg ;
1299
1307
u8 val ;
1300
1308
1301
- while (data_pos < cfg -> size ) {
1309
+ while (cfg -> raw_pos < cfg -> raw_size ) {
1302
1310
/* 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" ,
1304
1312
& type , & instance , & size , & offset );
1305
1313
if (ret == 0 ) {
1306
1314
/* EOF */
@@ -1309,20 +1317,20 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
1309
1317
dev_err (dev , "Bad format: failed to parse object\n" );
1310
1318
return - EINVAL ;
1311
1319
}
1312
- data_pos += offset ;
1320
+ cfg -> raw_pos += offset ;
1313
1321
1314
1322
object = mxt_get_object (data , type );
1315
1323
if (!object ) {
1316
1324
/* Skip object */
1317
1325
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" ,
1319
1327
& val , & offset );
1320
1328
if (ret != 1 ) {
1321
1329
dev_err (dev , "Bad format in T%d at %d\n" ,
1322
1330
type , i );
1323
1331
return - EINVAL ;
1324
1332
}
1325
- data_pos += offset ;
1333
+ cfg -> raw_pos += offset ;
1326
1334
}
1327
1335
continue ;
1328
1336
}
@@ -1357,23 +1365,23 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
1357
1365
reg = object -> start_address + mxt_obj_size (object ) * instance ;
1358
1366
1359
1367
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" ,
1361
1369
& val ,
1362
1370
& offset );
1363
1371
if (ret != 1 ) {
1364
1372
dev_err (dev , "Bad format in T%d at %d\n" ,
1365
1373
type , i );
1366
1374
return - EINVAL ;
1367
1375
}
1368
- data_pos += offset ;
1376
+ cfg -> raw_pos += offset ;
1369
1377
1370
1378
if (i > mxt_obj_size (object ))
1371
1379
continue ;
1372
1380
1373
- byte_offset = reg + i - cfg_start_ofs ;
1381
+ byte_offset = reg + i - cfg -> start_ofs ;
1374
1382
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 ;
1377
1385
} else {
1378
1386
dev_err (dev , "Bad object: reg:%d, T%d, ofs=%d\n" ,
1379
1387
reg , object -> type , byte_offset );
@@ -1385,22 +1393,21 @@ static int mxt_prepare_cfg_mem(struct mxt_data *data,
1385
1393
return 0 ;
1386
1394
}
1387
1395
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 )
1390
1397
{
1391
1398
unsigned int byte_offset = 0 ;
1392
1399
int error ;
1393
1400
1394
1401
/* 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 ;
1397
1404
1398
1405
if (size > MXT_MAX_BLOCK_WRITE )
1399
1406
size = MXT_MAX_BLOCK_WRITE ;
1400
1407
1401
1408
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 );
1404
1411
if (error ) {
1405
1412
dev_err (& data -> client -> dev ,
1406
1413
"Config write error, ret=%d\n" , error );
@@ -1434,66 +1441,65 @@ static int mxt_init_t7_power_cfg(struct mxt_data *data);
1434
1441
* <SIZE> - 2-byte object size as hex
1435
1442
* <CONTENTS> - array of <SIZE> 1-byte hex values
1436
1443
*/
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 )
1438
1445
{
1439
1446
struct device * dev = & data -> client -> dev ;
1440
- struct mxt_info cfg_info ;
1447
+ struct mxt_cfg cfg ;
1441
1448
int ret ;
1442
1449
int offset ;
1443
- int data_pos ;
1444
1450
int i ;
1445
- int cfg_start_ofs ;
1446
1451
u32 info_crc , config_crc , calculated_crc ;
1447
- u8 * config_mem ;
1448
- size_t config_mem_size ;
1449
1452
u16 crc_start = 0 ;
1450
1453
1454
+ cfg .raw = fw -> data ;
1455
+ cfg .raw_size = fw -> size ;
1456
+
1451
1457
mxt_update_crc (data , MXT_COMMAND_REPORTALL , 1 );
1452
1458
1453
- if (strncmp (cfg -> data , MXT_CFG_MAGIC , strlen (MXT_CFG_MAGIC ))) {
1459
+ if (strncmp (cfg . raw , MXT_CFG_MAGIC , strlen (MXT_CFG_MAGIC ))) {
1454
1460
dev_err (dev , "Unrecognised config file\n" );
1455
1461
return - EINVAL ;
1456
1462
}
1457
1463
1458
- data_pos = strlen (MXT_CFG_MAGIC );
1464
+ cfg . raw_pos = strlen (MXT_CFG_MAGIC );
1459
1465
1460
1466
/* Load information block and check */
1461
1467
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 ,
1464
1470
& offset );
1465
1471
if (ret != 1 ) {
1466
1472
dev_err (dev , "Bad format\n" );
1467
1473
return - EINVAL ;
1468
1474
}
1469
1475
1470
- data_pos += offset ;
1476
+ cfg . raw_pos += offset ;
1471
1477
}
1472
1478
1473
- if (cfg_info .family_id != data -> info -> family_id ) {
1479
+ if (cfg . info .family_id != data -> info -> family_id ) {
1474
1480
dev_err (dev , "Family ID mismatch!\n" );
1475
1481
return - EINVAL ;
1476
1482
}
1477
1483
1478
- if (cfg_info .variant_id != data -> info -> variant_id ) {
1484
+ if (cfg . info .variant_id != data -> info -> variant_id ) {
1479
1485
dev_err (dev , "Variant ID mismatch!\n" );
1480
1486
return - EINVAL ;
1481
1487
}
1482
1488
1483
1489
/* 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 );
1485
1491
if (ret != 1 ) {
1486
1492
dev_err (dev , "Bad format: failed to parse Info CRC\n" );
1487
1493
return - EINVAL ;
1488
1494
}
1489
- data_pos += offset ;
1495
+ cfg . raw_pos += offset ;
1490
1496
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 );
1492
1498
if (ret != 1 ) {
1493
1499
dev_err (dev , "Bad format: failed to parse Config CRC\n" );
1494
1500
return - EINVAL ;
1495
1501
}
1496
- data_pos += offset ;
1502
+ cfg . raw_pos += offset ;
1497
1503
1498
1504
/*
1499
1505
* 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)
1519
1525
}
1520
1526
1521
1527
/* Malloc memory to store configuration */
1522
- cfg_start_ofs = MXT_OBJECT_START +
1528
+ cfg . start_ofs = MXT_OBJECT_START +
1523
1529
data -> info -> object_num * sizeof (struct mxt_object ) +
1524
1530
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 )
1528
1534
return - ENOMEM ;
1529
1535
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 );
1532
1537
if (ret )
1533
1538
goto release_mem ;
1534
1539
@@ -1540,18 +1545,17 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
1540
1545
else
1541
1546
dev_warn (dev , "Could not find CRC start\n" );
1542
1547
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 );
1547
1552
1548
1553
if (config_crc > 0 && config_crc != calculated_crc )
1549
1554
dev_warn (dev , "Config CRC in file inconsistent, calculated=%06X, file=%06X\n" ,
1550
1555
calculated_crc , config_crc );
1551
1556
}
1552
1557
1553
- ret = mxt_upload_cfg_mem (data , cfg_start_ofs ,
1554
- config_mem , config_mem_size );
1558
+ ret = mxt_upload_cfg_mem (data , & cfg );
1555
1559
if (ret )
1556
1560
goto release_mem ;
1557
1561
@@ -1567,7 +1571,7 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *cfg)
1567
1571
mxt_init_t7_power_cfg (data );
1568
1572
1569
1573
release_mem :
1570
- kfree (config_mem );
1574
+ kfree (cfg . mem );
1571
1575
return ret ;
1572
1576
}
1573
1577
0 commit comments