static int fwu_read_f34_queries(void) { int retval; unsigned char count; unsigned char buf[10]; retval = fwu->fn_ptr->read(fwu->rmi4_data, fwu->f34_fd.query_base_addr + BOOTLOADER_ID_OFFSET, fwu->bootloader_id, sizeof(fwu->bootloader_id)); if (retval < 0) { TS_LOG_ERR("Failed to read bootloader ID\n"); return retval; } TS_LOG_INFO("bootloader_id[1] = %c", fwu->bootloader_id[1]); if (fwu->bootloader_id[1] == '5') { fwu->bl_version = V5; } else if (fwu->bootloader_id[1] == '6') { fwu->bl_version = V6; } else { TS_LOG_ERR("Unrecognized bootloader version\n"); return -EINVAL; } if (fwu->bl_version == V5) { fwu->properties_off = V5_PROPERTIES_OFFSET; fwu->blk_size_off = V5_BLOCK_SIZE_OFFSET; fwu->blk_count_off = V5_BLOCK_COUNT_OFFSET; fwu->blk_data_off = V5_BLOCK_DATA_OFFSET; } else if (fwu->bl_version == V6) { fwu->properties_off = V6_PROPERTIES_OFFSET; fwu->blk_size_off = V6_BLOCK_SIZE_OFFSET; fwu->blk_count_off = V6_BLOCK_COUNT_OFFSET; fwu->blk_data_off = V6_BLOCK_DATA_OFFSET; } retval = fwu->fn_ptr->read(fwu->rmi4_data, fwu->f34_fd.query_base_addr + fwu->properties_off, &fwu->flash_properties, sizeof(fwu->flash_properties)); if (retval < 0) { TS_LOG_ERR("Failed to read flash properties\n"); return retval; } count = 4; if (fwu->flash_properties & HAS_PERM_CONFIG) { fwu->has_perm_config = 1; count += 2; } if (fwu->flash_properties & HAS_BL_CONFIG) { fwu->has_bl_config = 1; count += 2; } if (fwu->flash_properties & HAS_DISP_CONFIG) { fwu->has_disp_config = 1; count += 2; } retval = fwu->fn_ptr->read(fwu->rmi4_data, fwu->f34_fd.query_base_addr + fwu->blk_size_off, buf, 2); if (retval < 0) { TS_LOG_ERR("Failed to read block size info\n"); return retval; } batohs(&fwu->block_size, &(buf[0])); if (fwu->bl_version == V5) { fwu->flash_cmd_off = fwu->blk_data_off + fwu->block_size; fwu->flash_status_off = fwu->flash_cmd_off; } else if (fwu->bl_version == V6) { fwu->flash_cmd_off = V6_FLASH_COMMAND_OFFSET; fwu->flash_status_off = V6_FLASH_STATUS_OFFSET; } retval = fwu->fn_ptr->read(fwu->rmi4_data, fwu->f34_fd.query_base_addr + fwu->blk_count_off, buf, count); if (retval < 0) { TS_LOG_ERR("Failed to read block count info\n"); return retval; } batohs(&fwu->fw_block_count, &(buf[0])); batohs(&fwu->config_block_count, &(buf[2])); count = 4; if (fwu->has_perm_config) { batohs(&fwu->perm_config_block_count, &(buf[count])); count += 2; } if (fwu->has_bl_config) { batohs(&fwu->bl_config_block_count, &(buf[count])); count += 2; } if (fwu->has_disp_config) batohs(&fwu->disp_config_block_count, &(buf[count])); return 0; }
static int rmi_f34_initialize(struct rmi_function_dev *fn_dev) { struct rmi_device *rmi_dev = fn_dev->rmi_dev; struct rmi_device_platform_data *pdata; int retval = 0; struct rmi_fn_34_data *f34 = fn_dev->data; u16 query_base_addr; u16 control_base_addr; u8 buf[2]; pdata = to_rmi_platform_data(rmi_dev); mutex_init(&f34->attn_mutex); /* get the Bootloader ID and Block Size. */ query_base_addr = fn_dev->fd.query_base_addr; control_base_addr = fn_dev->fd.control_base_addr; retval = rmi_read_block(fn_dev->rmi_dev, query_base_addr, buf, ARRAY_SIZE(buf)); if (retval < 0) { dev_err(&fn_dev->dev, "Could not read bootloaderid from 0x%04x.\n", query_base_addr); return retval; } f34->bootloaderid = batohs(buf); retval = rmi_read_block(fn_dev->rmi_dev, query_base_addr + BLK_SZ_OFF, buf, ARRAY_SIZE(buf)); if (retval < 0) { dev_err(&fn_dev->dev, "Could not read block size from 0x%04x, error=%d.\n", query_base_addr + BLK_SZ_OFF, retval); return retval; } f34->blocksize = batohs(buf); /* Get firmware image block count and store it in the instance data */ retval = rmi_read_block(fn_dev->rmi_dev, query_base_addr + IMG_BLK_CNT_OFF, buf, ARRAY_SIZE(buf)); if (retval < 0) { dev_err(&fn_dev->dev, "Couldn't read image block count from 0x%x, error=%d.\n", query_base_addr + IMG_BLK_CNT_OFF, retval); return retval; } f34->imageblockcount = batohs(buf); /* Get config block count and store it in the instance data */ retval = rmi_read_block(fn_dev->rmi_dev, query_base_addr + 7, buf, ARRAY_SIZE(buf)); if (retval < 0) { dev_err(&fn_dev->dev, "Couldn't read config block count from 0x%x, error=%d.\n", query_base_addr + CFG_BLK_CNT_OFF, retval); return retval; } f34->configblockcount = batohs(buf); return 0; }