Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: atmel_mxt_ts - simplify mxt_initialize a bit

I think having control flow with 2 goto/labels/flags is quite hard to read,
this version is a bit more readable IMO.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>

+43 -40
+43 -40
drivers/input/touchscreen/atmel_mxt_ts.c
··· 359 359 msg.buf = val; 360 360 361 361 ret = i2c_transfer(data->client->adapter, &msg, 1); 362 - 363 362 if (ret == 1) { 364 363 ret = 0; 365 364 } else { ··· 413 414 case 0x5b: 414 415 bootloader = appmode - 0x26; 415 416 break; 417 + 416 418 default: 417 419 dev_err(&data->client->dev, 418 420 "Appmode i2c address 0x%02x not found\n", ··· 425 425 return 0; 426 426 } 427 427 428 - static int mxt_probe_bootloader(struct mxt_data *data, bool retry) 428 + static int mxt_probe_bootloader(struct mxt_data *data, bool alt_address) 429 429 { 430 430 struct device *dev = &data->client->dev; 431 - int ret; 431 + int error; 432 432 u8 val; 433 433 bool crc_failure; 434 434 435 - ret = mxt_lookup_bootloader_address(data, retry); 436 - if (ret) 437 - return ret; 435 + error = mxt_lookup_bootloader_address(data, alt_address); 436 + if (error) 437 + return error; 438 438 439 - ret = mxt_bootloader_read(data, &val, 1); 440 - if (ret) 441 - return ret; 439 + error = mxt_bootloader_read(data, &val, 1); 440 + if (error) 441 + return error; 442 442 443 443 /* Check app crc fail mode */ 444 444 crc_failure = (val & ~MXT_BOOT_STATUS_MASK) == MXT_APP_CRC_FAIL; ··· 1645 1645 static int mxt_initialize(struct mxt_data *data) 1646 1646 { 1647 1647 struct i2c_client *client = data->client; 1648 + int recovery_attempts = 0; 1648 1649 int error; 1649 - bool alt_bootloader_addr = false; 1650 - bool retry = false; 1651 1650 1652 - retry_info: 1653 - error = mxt_get_info(data); 1654 - if (error) { 1655 - retry_bootloader: 1656 - error = mxt_probe_bootloader(data, alt_bootloader_addr); 1651 + while (1) { 1652 + error = mxt_get_info(data); 1653 + if (!error) 1654 + break; 1655 + 1656 + /* Check bootloader state */ 1657 + error = mxt_probe_bootloader(data, false); 1657 1658 if (error) { 1658 - if (alt_bootloader_addr) { 1659 + dev_info(&client->dev, "Trying alternate bootloader address\n"); 1660 + error = mxt_probe_bootloader(data, true); 1661 + if (error) { 1659 1662 /* Chip is not in appmode or bootloader mode */ 1660 1663 return error; 1661 1664 } 1662 - 1663 - dev_info(&client->dev, "Trying alternate bootloader address\n"); 1664 - alt_bootloader_addr = true; 1665 - goto retry_bootloader; 1666 - } else { 1667 - if (retry) { 1668 - dev_err(&client->dev, "Could not recover from bootloader mode\n"); 1669 - /* 1670 - * We can reflash from this state, so do not 1671 - * abort init 1672 - */ 1673 - data->in_bootloader = true; 1674 - return 0; 1675 - } 1676 - 1677 - /* Attempt to exit bootloader into app mode */ 1678 - mxt_send_bootloader_cmd(data, false); 1679 - msleep(MXT_FW_RESET_TIME); 1680 - retry = true; 1681 - goto retry_info; 1682 1665 } 1666 + 1667 + /* OK, we are in bootloader, see if we can recover */ 1668 + if (++recovery_attempts > 1) { 1669 + dev_err(&client->dev, "Could not recover from bootloader mode\n"); 1670 + /* 1671 + * We can reflash from this state, so do not 1672 + * abort initialization. 1673 + */ 1674 + data->in_bootloader = true; 1675 + return 0; 1676 + } 1677 + 1678 + /* Attempt to exit bootloader into app mode */ 1679 + mxt_send_bootloader_cmd(data, false); 1680 + msleep(MXT_FW_RESET_TIME); 1683 1681 } 1684 1682 1685 1683 /* Get object table information */ ··· 1691 1693 if (error) 1692 1694 goto err_free_object_table; 1693 1695 1694 - request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME, 1695 - &data->client->dev, GFP_KERNEL, data, 1696 - mxt_config_cb); 1696 + error = request_firmware_nowait(THIS_MODULE, true, MXT_CFG_NAME, 1697 + &client->dev, GFP_KERNEL, data, 1698 + mxt_config_cb); 1699 + if (error) { 1700 + dev_err(&client->dev, "Failed to invoke firmware loader: %d\n", 1701 + error); 1702 + goto err_free_object_table; 1703 + } 1697 1704 1698 1705 return 0; 1699 1706