Lines Matching +full:dsp +full:- +full:config +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0-only
8 * Copyright (c) 2010 - 2012 Goodix Technology.
54 if (fw->size != expected_size) { in goodix_firmware_verify()
56 expected_size, fw->size); in goodix_firmware_verify()
57 return -EINVAL; in goodix_firmware_verify()
60 data = fw->data + GOODIX_FW_HEADER_LENGTH; in goodix_firmware_verify()
64 return -EINVAL; in goodix_firmware_verify()
70 dev_err(dev, "DSP firmware checksum error\n"); in goodix_firmware_verify()
71 return -EINVAL; in goodix_firmware_verify()
74 fw_header = (const struct goodix_fw_header *)fw->data; in goodix_firmware_verify()
76 fw_header->hw_info[0], fw_header->hw_info[1], in goodix_firmware_verify()
77 fw_header->hw_info[2], fw_header->hw_info[3]); in goodix_firmware_verify()
79 memcpy(buf, fw_header->pid, 8); in goodix_firmware_verify()
82 fw_header->vid[0], fw_header->vid[1]); in goodix_firmware_verify()
105 } while (--tries); in goodix_enter_upload_mode()
108 dev_err(&client->dev, "Error could not hold ss51 & dsp\n"); in goodix_enter_upload_mode()
109 return -EIO; in goodix_enter_upload_mode()
166 /* Release SS51 & DSP */ in goodix_start_firmware()
177 dev_err(&client->dev, "Error SW_WDT reg not cleared on fw startup\n"); in goodix_start_firmware()
178 return -EIO; in goodix_start_firmware()
181 /* Re-init software watchdog */ in goodix_start_firmware()
196 snprintf(fw_name, sizeof(fw_name), "goodix/%s", ts->firmware_name); in goodix_firmware_upload()
198 error = request_firmware(&fw, fw_name, &ts->client->dev); in goodix_firmware_upload()
200 dev_err(&ts->client->dev, "Firmware request error %d\n", error); in goodix_firmware_upload()
204 error = goodix_firmware_verify(&ts->client->dev, fw); in goodix_firmware_upload()
212 error = goodix_enter_upload_mode(ts->client); in goodix_firmware_upload()
217 error = goodix_i2c_write_u8(ts->client, in goodix_firmware_upload()
222 data = fw->data + GOODIX_FW_HEADER_LENGTH; in goodix_firmware_upload()
223 error = goodix_i2c_write(ts->client, GOODIX_FW_UPLOAD_ADDRESS, in goodix_firmware_upload()
229 error = goodix_i2c_write_u8(ts->client, in goodix_firmware_upload()
235 error = goodix_i2c_write(ts->client, GOODIX_FW_UPLOAD_ADDRESS, in goodix_firmware_upload()
240 /* Select SRAM bank 2 and upload the DSP firmware */ in goodix_firmware_upload()
241 error = goodix_i2c_write_u8(ts->client, in goodix_firmware_upload()
247 error = goodix_i2c_write(ts->client, GOODIX_FW_UPLOAD_ADDRESS, in goodix_firmware_upload()
252 error = goodix_start_firmware(ts->client); in goodix_firmware_upload()
266 if (ts->bak_ref) in goodix_prepare_bak_ref()
269 have_key = (ts->config[GOODIX_CFG_LOC_HAVE_KEY] & 0x01); in goodix_prepare_bak_ref()
271 driver_num = (ts->config[GOODIX_CFG_LOC_DRVA_NUM] & 0x1f) + in goodix_prepare_bak_ref()
272 (ts->config[GOODIX_CFG_LOC_DRVB_NUM] & 0x1f); in goodix_prepare_bak_ref()
274 driver_num--; in goodix_prepare_bak_ref()
276 sensor_num = (ts->config[GOODIX_CFG_LOC_SENS_NUM] & 0x0f) + in goodix_prepare_bak_ref()
277 ((ts->config[GOODIX_CFG_LOC_SENS_NUM] >> 4) & 0x0f); in goodix_prepare_bak_ref()
279 dev_dbg(&ts->client->dev, "Drv %d Sen %d Key %d\n", in goodix_prepare_bak_ref()
282 ts->bak_ref_len = (driver_num * (sensor_num - 2) + 2) * 2; in goodix_prepare_bak_ref()
284 ts->bak_ref = devm_kzalloc(&ts->client->dev, in goodix_prepare_bak_ref()
285 ts->bak_ref_len, GFP_KERNEL); in goodix_prepare_bak_ref()
286 if (!ts->bak_ref) in goodix_prepare_bak_ref()
287 return -ENOMEM; in goodix_prepare_bak_ref()
295 * factor in approx. the -20 - +20 range (in 2s complement) set to 0. in goodix_prepare_bak_ref()
298 * values after a reboot / power-cycle. in goodix_prepare_bak_ref()
304 ts->bak_ref[ts->bak_ref_len - 1] = 1; in goodix_prepare_bak_ref()
315 device_property_read_u32(&ts->client->dev, in goodix_send_main_clock()
316 "goodix,main-clk", &main_clk); in goodix_send_main_clock()
318 for (i = 0; i < (GOODIX_MAIN_CLK_LEN - 1); i++) { in goodix_send_main_clock()
319 ts->main_clk[i] = main_clk; in goodix_send_main_clock()
324 ts->main_clk[GOODIX_MAIN_CLK_LEN - 1] = 256 - checksum; in goodix_send_main_clock()
326 return goodix_i2c_write(ts->client, GOODIX_REG_MAIN_CLK, in goodix_send_main_clock()
327 ts->main_clk, GOODIX_MAIN_CLK_LEN); in goodix_send_main_clock()
332 device_property_read_string(&ts->client->dev, in goodix_firmware_check()
333 "firmware-name", &ts->firmware_name); in goodix_firmware_check()
334 if (!ts->firmware_name) in goodix_firmware_check()
337 if (ts->irq_pin_access_method == IRQ_PIN_ACCESS_NONE) { in goodix_firmware_check()
338 dev_err(&ts->client->dev, "Error no IRQ-pin access method, cannot upload fw.\n"); in goodix_firmware_check()
339 return -EINVAL; in goodix_firmware_check()
342 dev_info(&ts->client->dev, "Touchscreen controller needs fw-upload\n"); in goodix_firmware_check()
343 ts->load_cfg_from_disk = true; in goodix_firmware_check()
353 error = goodix_i2c_read(ts->client, GOODIX_REG_REQUEST, &val, 1); in goodix_handle_fw_request()
365 error = goodix_send_cfg(ts, ts->config, ts->chip->config_len); in goodix_handle_fw_request()
375 error = goodix_i2c_write(ts->client, GOODIX_REG_BAK_REF, in goodix_handle_fw_request()
376 ts->bak_ref, ts->bak_ref_len); in goodix_handle_fw_request()
397 dev_err_ratelimited(&ts->client->dev, "Unknown Request: 0x%02x\n", val); in goodix_handle_fw_request()
401 goodix_i2c_write_u8(ts->client, in goodix_handle_fw_request()
411 if (!ts->firmware_name) in goodix_save_bak_ref()
414 error = goodix_i2c_read(ts->client, GOODIX_REG_STATUS, &val, 1); in goodix_save_bak_ref()
421 error = goodix_i2c_read(ts->client, GOODIX_REG_BAK_REF, in goodix_save_bak_ref()
422 ts->bak_ref, ts->bak_ref_len); in goodix_save_bak_ref()
424 memset(ts->bak_ref, 0, ts->bak_ref_len); in goodix_save_bak_ref()
425 ts->bak_ref[ts->bak_ref_len - 1] = 1; in goodix_save_bak_ref()