int FirmwareUpgrade (struct synaptics_ts_data *ts, const char* fw_path) { int ret = 0; const struct firmware *fw_entry = NULL; if ((ret = request_firmware(&fw_entry, fw_path, &ts->client->dev)) != 0) { TOUCH_ERR("request_firmware() failed %d\n", ret); goto error; } my_image_size = fw_entry->size; my_image_bin = kzalloc(sizeof(char) * (my_image_size+1), GFP_KERNEL); if (my_image_bin == NULL) { TOUCH_ERR("Can not allocate memory\n"); ret = -ENOMEM; goto error; } memcpy(my_image_bin, fw_entry->data, my_image_size); /* for checksum */ *(my_image_bin+my_image_size) = 0xFF; // strncpy(ts->fw_info.fw_image_product_id, &my_image_bin[0x0040], 6); // strncpy(ts->fw_info.fw_image_version, &my_image_bin[0x16d00], 4); // ts->fw_info.fw_start = (unsigned char*)&my_image_bin[0]; // ts->fw_info.fw_size = my_image_size; CompleteReflash(ts); release_firmware(fw_entry); return ret; error: if ( fw_entry != NULL ) memset(&fw_entry, 0, sizeof(fw_entry)); return ret; }
int FirmwareUpgrade (struct synaptics_ts_data *ts, const char* fw_path) { int ret = 0; int fd = -1; mm_segment_t old_fs = 0; struct stat fw_bin_stat; unsigned long read_bytes; if (unlikely(fw_path[0] != 0)) { old_fs = get_fs(); set_fs(get_ds()); fd = sys_open((const char __user *) fw_path, O_RDONLY, 0); if (fd < 0) { TOUCH_ERR_MSG("Can not read FW binary from %s\n", fw_path); ret = -EEXIST; goto read_fail; } ret = sys_newstat((char __user *) fw_path, (struct stat *)&fw_bin_stat); if (ret < 0) { TOUCH_ERR_MSG("Can not read FW binary stat from %s\n", fw_path); goto fw_mem_alloc_fail; } my_image_size = fw_bin_stat.st_size; my_image_bin = kzalloc(sizeof(char) * (my_image_size+1), GFP_KERNEL); if (my_image_bin == NULL) { TOUCH_ERR_MSG("Can not allocate memory\n"); ret = -ENOMEM; goto fw_mem_alloc_fail; } read_bytes = sys_read(fd, (char __user *)my_image_bin, my_image_size); /* for checksum */ *(my_image_bin+my_image_size) = 0xFF; TOUCH_INFO_MSG("Touch FW image read %ld bytes from %s\n", read_bytes, fw_path); } else { my_image_size = ts->fw_info.fw_size-1; my_image_bin = (unsigned char *)(&ts->fw_info.fw_start[0]); } CompleteReflash(ts); /* ret = CompleteReflash(ts); if (ret < 0) { TOUCH_ERR_MSG("CompleteReflash_Lockdown fail\n"); } */ if (unlikely(fw_path[0] != 0)) kfree(my_image_bin); fw_mem_alloc_fail: sys_close(fd); read_fail: set_fs(old_fs); return ret; }
static int __devinit rmi_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct rmi_phys_device *rmi_phys; struct rmi_i2c_data *data; struct rmi_device_platform_data *pdata = client->dev.platform_data; int error; if (!pdata) { dev_err(&client->dev, "no platform data\n"); return -EINVAL; } pr_info("%s: Probing %s at %#02x (IRQ %d).\n", __func__, pdata->sensor_name ? pdata->sensor_name : "-no name-", client->addr, pdata->attn_gpio); error = i2c_check_functionality(client->adapter, I2C_FUNC_I2C); if (!error) { dev_err(&client->dev, "i2c_check_functionality error %d.\n", error); return error; } rmi_phys = kzalloc(sizeof(struct rmi_phys_device), GFP_KERNEL); if (!rmi_phys) return -ENOMEM; data = kzalloc(sizeof(struct rmi_i2c_data), GFP_KERNEL); if (!data) { error = -ENOMEM; goto err_phys; } data->enabled = true; /* We plan to come up enabled. */ data->irq = gpio_to_irq(pdata->attn_gpio); if (pdata->level_triggered) { data->irq_flags = IRQF_ONESHOT | ((pdata->attn_polarity == RMI_ATTN_ACTIVE_HIGH) ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW); } else { data->irq_flags = (pdata->attn_polarity == RMI_ATTN_ACTIVE_HIGH) ? IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; } data->phys = rmi_phys; rmi_phys->data = data; rmi_phys->dev = &client->dev; rmi_phys->write = rmi_i2c_write; rmi_phys->write_block = rmi_i2c_write_block; rmi_phys->read = rmi_i2c_read; rmi_phys->read_block = rmi_i2c_read_block; rmi_phys->enable_device = enable_device; rmi_phys->disable_device = disable_device; rmi_phys->info.proto = phys_proto_name; mutex_init(&data->page_mutex); /* Setting the page to zero will (a) make sure the PSR is in a * known state, and (b) make sure we can talk to the device. */ error = rmi_set_page(rmi_phys, 0); if (error) { dev_err(&client->dev, "Failed to set page select to 0.\n"); goto err_data; } if (pdata->gpio_config) { error = pdata->gpio_config(pdata->gpio_data, true); if (error < 0) { dev_err(&client->dev, "failed to setup irq %d\n", pdata->attn_gpio); goto err_data; } } error = rmi_register_phys_device(rmi_phys); if (error) { dev_err(&client->dev, "failed to register physical driver at 0x%.2X.\n", client->addr); goto err_gpio; } i2c_set_clientdata(client, rmi_phys); if (pdata->attn_gpio > 0) { error = acquire_attn_irq(data); if (error < 0) { dev_err(&client->dev, "request_threaded_irq failed %d\n", pdata->attn_gpio); goto err_unregister; } } #if defined(CONFIG_RMI4_DEV) error = gpio_export(pdata->attn_gpio, false); if (error) { dev_warn(&client->dev, "%s: WARNING: Failed to " "export ATTN gpio!\n", __func__); error = 0; } else { error = gpio_export_link(&(rmi_phys->rmi_dev->dev), "attn", pdata->attn_gpio); if (error) { dev_warn(&(rmi_phys->rmi_dev->dev), "%s: WARNING: Failed to symlink ATTN gpio!\n", __func__); error = 0; } else { dev_info(&(rmi_phys->rmi_dev->dev), "%s: Exported GPIO %d.", __func__, pdata->attn_gpio); } } #endif /* CONFIG_RMI4_DEV */ dev_info(&client->dev, "registered rmi i2c driver at 0x%.2X.\n", client->addr); //reflash the new firmware revision [email protected] #ifdef CONFIG_RMI4_REFLASH_WHEN_BOOT CompleteReflash(rmi_phys); #endif return 0; err_unregister: rmi_unregister_phys_device(rmi_phys); err_gpio: if (pdata->gpio_config) pdata->gpio_config(pdata->gpio_data, false); err_data: kfree(data); err_phys: kfree(rmi_phys); return error; }