int wacom_i2c_load_fw(struct wacom_i2c *wac_i2c) { int ret = 0; switch (wac_i2c->update_info.fw_path) { case FW_BUILT_IN: ret = load_fw_built_in(wac_i2c); break; case FW_IN_SDCARD: ret = load_fw_sdcard(wac_i2c); break; default: break; } return ret; }
static int tc300k_fw_update(struct tc300k_data *data, u8 fw_path, bool force) { struct i2c_client *client = data->client; int retry = 4; int ret; if (fw_path == FW_INKERNEL) { if (!force) { ret = get_fw_version(data, false); if (ret) return -1; } ret = load_fw_in_kernel(data); if (ret) return -1; if (!force && (data->fw_ver >= data->fw_img->first_fw_ver)) { dev_notice(&client->dev, "do not need firm update (0x%x, 0x%x)\n", data->fw_ver, data->fw_img->first_fw_ver); t300k_release_fw(data, fw_path); return 0; } } else if (fw_path == FW_SDCARD) { ret = load_fw_sdcard(data); if (ret) return -1; } while (retry--) { data->fw_downloding = true; ret = tc300k_flash_fw(data, fw_path); data->fw_downloding = false; if (ret) { dev_err(&client->dev, "%s tc300k_flash_fw fail (%d)\n", __func__, retry); continue; } ret = get_fw_version(data, false); if (ret) { dev_err(&client->dev, "%s get_fw_version fail (%d)\n", __func__, retry); continue; } if (data->fw_ver != data->fw_img->first_fw_ver) { dev_err(&client->dev, "%s fw version fail (0x%x, 0x%x)(%d)\n", __func__, data->fw_ver, data->fw_img->first_fw_ver, retry); continue; } ret = tc300k_crc_check(data); if (ret) { dev_err(&client->dev, "%s crc check fail (%d)\n", __func__, retry); continue; } break; } if (retry > 0) dev_info(&client->dev, "%s success\n", __func__); t300k_release_fw(data, fw_path); return ret; }