Skip to content

Commit 2386245

Browse files
Evoke Zhangakiernan
authored andcommitted
lcd_extern: driver defect clean up
PD#150081: driver defect clean up: torvalds#20 torvalds#38 torvalds#87 torvalds#468 torvalds#469 torvalds#470 torvalds#471 torvalds#613 torvalds#668 Change-Id: Ifa0756e25088599571761b33efaffb6c2c898dfc Signed-off-by: Evoke Zhang <[email protected]>
1 parent b94e5e2 commit 2386245

File tree

3 files changed

+113
-74
lines changed

3 files changed

+113
-74
lines changed

drivers/amlogic/media/vout/lcd/lcd_extern/ext_default.c

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ static int lcd_extern_power_cmd_dynamic_size(unsigned char *init_table,
181181

182182
switch (ext_config->type) {
183183
case LCD_EXTERN_I2C:
184-
while (i <= max_len) {
184+
while ((i + 2) < max_len) {
185185
type = init_table[i];
186186
if (type == LCD_EXTERN_INIT_END)
187187
break;
@@ -191,6 +191,9 @@ static int lcd_extern_power_cmd_dynamic_size(unsigned char *init_table,
191191
init_table[i], init_table[i+1]);
192192
}
193193
cmd_size = init_table[i+1];
194+
if ((i + 2 + cmd_size) > max_len)
195+
break;
196+
194197
if (type == LCD_EXTERN_INIT_NONE) {
195198
if (cmd_size < 1) {
196199
EXTERR("step %d: invalid cmd_size %d\n",
@@ -238,7 +241,7 @@ static int lcd_extern_power_cmd_dynamic_size(unsigned char *init_table,
238241
}
239242
break;
240243
case LCD_EXTERN_SPI:
241-
while (i <= max_len) {
244+
while ((i + 2) < max_len) {
242245
type = init_table[i];
243246
if (type == LCD_EXTERN_INIT_END)
244247
break;
@@ -248,6 +251,9 @@ static int lcd_extern_power_cmd_dynamic_size(unsigned char *init_table,
248251
init_table[i], init_table[i+1]);
249252
}
250253
cmd_size = init_table[i+1];
254+
if ((i + 2 + cmd_size) > max_len)
255+
break;
256+
251257
if (type == LCD_EXTERN_INIT_NONE) {
252258
if (cmd_size < 1) {
253259
EXTERR("step %d: invalid cmd_size %d\n",
@@ -311,7 +317,7 @@ static int lcd_extern_power_cmd_fixed_size(unsigned char *init_table, int flag)
311317
cmd_size = ext_config->cmd_size;
312318
switch (ext_config->type) {
313319
case LCD_EXTERN_I2C:
314-
while (i <= max_len) {
320+
while ((i + cmd_size) <= max_len) {
315321
type = init_table[i];
316322
if (type == LCD_EXTERN_INIT_END)
317323
break;
@@ -346,7 +352,7 @@ static int lcd_extern_power_cmd_fixed_size(unsigned char *init_table, int flag)
346352
}
347353
break;
348354
case LCD_EXTERN_SPI:
349-
while (i <= max_len) {
355+
while ((i + cmd_size) <= max_len) {
350356
type = init_table[i];
351357
if (type == LCD_EXTERN_INIT_END)
352358
break;
@@ -494,10 +500,12 @@ static int aml_default_i2c_probe(struct i2c_client *client,
494500
const struct i2c_device_id *id)
495501
{
496502

497-
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
503+
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
498504
EXTERR("%s: functionality check failed\n", __func__);
499-
else
500-
aml_default_i2c_client = client;
505+
return -ENODEV;
506+
}
507+
508+
aml_default_i2c_client = client;
501509

502510
EXTPR("%s OK\n", __func__);
503511
return 0;
@@ -546,6 +554,7 @@ int aml_lcd_extern_default_probe(struct aml_lcd_extern_driver_s *ext_drv)
546554
}
547555

548556
strncpy(i2c_info.type, ext_drv->config.name, I2C_NAME_SIZE);
557+
i2c_info.type[I2C_NAME_SIZE-1] = '\0';
549558
i2c_info.addr = ext_drv->config.i2c_addr;
550559
i2c_info.platform_data = &ext_drv->config;
551560
i2c_info.flags = 0;
@@ -558,11 +567,11 @@ int aml_lcd_extern_default_probe(struct aml_lcd_extern_driver_s *ext_drv)
558567
if (!i2c_client) {
559568
EXTERR("%s failed to new i2c device\n",
560569
ext_drv->config.name);
561-
} else {
562-
if (lcd_debug_print_flag) {
563-
EXTPR("%s new i2c device succeed\n",
564-
ext_drv->config.name);
565-
}
570+
return -1;
571+
}
572+
if (lcd_debug_print_flag) {
573+
EXTPR("%s new i2c device succeed\n",
574+
ext_drv->config.name);
566575
}
567576

568577
if (!aml_default_i2c_client) {

drivers/amlogic/media/vout/lcd/lcd_extern/i2c_T5800Q.c

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static int lcd_extern_power_cmd(unsigned char *init_table, int flag)
136136
else
137137
max_len = LCD_EXTERN_INIT_OFF_MAX;
138138

139-
while (i <= max_len) {
139+
while ((i + cmd_size) <= max_len) {
140140
if (init_table[i] == LCD_EXTERN_INIT_END)
141141
break;
142142
if (lcd_debug_print_flag) {
@@ -216,7 +216,10 @@ static int lcd_extern_driver_update(struct aml_lcd_extern_driver_s *ext_drv)
216216
return 0;
217217
}
218218

219-
/* debug function */
219+
/* *********************************************************
220+
* debug function
221+
* *********************************************************
222+
*/
220223
static const char *lcd_extern_debug_usage_str = {
221224
"Usage:\n"
222225
" echo <reg> <> ... <> > write ; T5800Q i2c command write, 7 parameters without address\n"
@@ -301,10 +304,12 @@ static int aml_T5800Q_i2c_probe(struct i2c_client *client,
301304
const struct i2c_device_id *id)
302305
{
303306

304-
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
307+
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
305308
EXTERR("%s: functionality check failed\n", __func__);
306-
else
307-
aml_T5800Q_i2c_client = client;
309+
return -ENODEV;
310+
}
311+
312+
aml_T5800Q_i2c_client = client;
308313

309314
EXTPR("%s OK\n", __func__);
310315
return 0;
@@ -348,6 +353,7 @@ int aml_lcd_extern_i2c_T5800Q_probe(struct aml_lcd_extern_driver_s *ext_drv)
348353
}
349354

350355
strncpy(i2c_info.type, ext_drv->config.name, I2C_NAME_SIZE);
356+
i2c_info.type[I2C_NAME_SIZE-1] = '\0';
351357
i2c_info.addr = ext_drv->config.i2c_addr;
352358
i2c_info.platform_data = &ext_drv->config;
353359
i2c_info.flags = 0;
@@ -359,12 +365,10 @@ int aml_lcd_extern_i2c_T5800Q_probe(struct aml_lcd_extern_driver_s *ext_drv)
359365
i2c_client = i2c_new_device(adapter, &i2c_info);
360366
if (!i2c_client) {
361367
EXTERR("%s failed to new i2c device\n", ext_drv->config.name);
362-
} else {
363-
if (lcd_debug_print_flag) {
364-
EXTPR("%s new i2c device succeed\n",
365-
ext_drv->config.name);
366-
}
368+
return -1;
367369
}
370+
if (lcd_debug_print_flag)
371+
EXTPR("%s new i2c device succeed\n", ext_drv->config.name);
368372

369373
if (!aml_T5800Q_i2c_client) {
370374
ret = i2c_add_driver(&aml_T5800Q_i2c_driver);

0 commit comments

Comments
 (0)