1*09182ed2SHans de Goede // SPDX-License-Identifier: GPL-2.0-only 2*09182ed2SHans de Goede /* 3*09182ed2SHans de Goede * Goodix Touchscreen firmware upload support 4*09182ed2SHans de Goede * 5*09182ed2SHans de Goede * Copyright (c) 2021 Hans de Goede <hdegoede@redhat.com> 6*09182ed2SHans de Goede * 7*09182ed2SHans de Goede * This is a rewrite of gt9xx_update.c from the Allwinner H3 BSP which is: 8*09182ed2SHans de Goede * Copyright (c) 2010 - 2012 Goodix Technology. 9*09182ed2SHans de Goede * Author: andrew@goodix.com 10*09182ed2SHans de Goede */ 11*09182ed2SHans de Goede 12*09182ed2SHans de Goede #include <linux/device.h> 13*09182ed2SHans de Goede #include <linux/firmware.h> 14*09182ed2SHans de Goede #include <linux/i2c.h> 15*09182ed2SHans de Goede #include "goodix.h" 16*09182ed2SHans de Goede 17*09182ed2SHans de Goede #define GOODIX_FW_HEADER_LENGTH sizeof(struct goodix_fw_header) 18*09182ed2SHans de Goede #define GOODIX_FW_SECTION_LENGTH 0x2000 19*09182ed2SHans de Goede #define GOODIX_FW_DSP_LENGTH 0x1000 20*09182ed2SHans de Goede #define GOODIX_FW_UPLOAD_ADDRESS 0xc000 21*09182ed2SHans de Goede 22*09182ed2SHans de Goede #define GOODIX_CFG_LOC_HAVE_KEY 7 23*09182ed2SHans de Goede #define GOODIX_CFG_LOC_DRVA_NUM 27 24*09182ed2SHans de Goede #define GOODIX_CFG_LOC_DRVB_NUM 28 25*09182ed2SHans de Goede #define GOODIX_CFG_LOC_SENS_NUM 29 26*09182ed2SHans de Goede 27*09182ed2SHans de Goede struct goodix_fw_header { 28*09182ed2SHans de Goede u8 hw_info[4]; 29*09182ed2SHans de Goede u8 pid[8]; 30*09182ed2SHans de Goede u8 vid[2]; 31*09182ed2SHans de Goede } __packed; 32*09182ed2SHans de Goede 33*09182ed2SHans de Goede static u16 goodix_firmware_checksum(const u8 *data, int size) 34*09182ed2SHans de Goede { 35*09182ed2SHans de Goede u16 checksum = 0; 36*09182ed2SHans de Goede int i; 37*09182ed2SHans de Goede 38*09182ed2SHans de Goede for (i = 0; i < size; i += 2) 39*09182ed2SHans de Goede checksum += (data[i] << 8) + data[i + 1]; 40*09182ed2SHans de Goede 41*09182ed2SHans de Goede return checksum; 42*09182ed2SHans de Goede } 43*09182ed2SHans de Goede 44*09182ed2SHans de Goede static int goodix_firmware_verify(struct device *dev, const struct firmware *fw) 45*09182ed2SHans de Goede { 46*09182ed2SHans de Goede const struct goodix_fw_header *fw_header; 47*09182ed2SHans de Goede size_t expected_size; 48*09182ed2SHans de Goede const u8 *data; 49*09182ed2SHans de Goede u16 checksum; 50*09182ed2SHans de Goede char buf[9]; 51*09182ed2SHans de Goede 52*09182ed2SHans de Goede expected_size = GOODIX_FW_HEADER_LENGTH + 4 * GOODIX_FW_SECTION_LENGTH + 53*09182ed2SHans de Goede GOODIX_FW_DSP_LENGTH; 54*09182ed2SHans de Goede if (fw->size != expected_size) { 55*09182ed2SHans de Goede dev_err(dev, "Firmware has wrong size, expected %zu got %zu\n", 56*09182ed2SHans de Goede expected_size, fw->size); 57*09182ed2SHans de Goede return -EINVAL; 58*09182ed2SHans de Goede } 59*09182ed2SHans de Goede 60*09182ed2SHans de Goede data = fw->data + GOODIX_FW_HEADER_LENGTH; 61*09182ed2SHans de Goede checksum = goodix_firmware_checksum(data, 4 * GOODIX_FW_SECTION_LENGTH); 62*09182ed2SHans de Goede if (checksum) { 63*09182ed2SHans de Goede dev_err(dev, "Main firmware checksum error\n"); 64*09182ed2SHans de Goede return -EINVAL; 65*09182ed2SHans de Goede } 66*09182ed2SHans de Goede 67*09182ed2SHans de Goede data += 4 * GOODIX_FW_SECTION_LENGTH; 68*09182ed2SHans de Goede checksum = goodix_firmware_checksum(data, GOODIX_FW_DSP_LENGTH); 69*09182ed2SHans de Goede if (checksum) { 70*09182ed2SHans de Goede dev_err(dev, "DSP firmware checksum error\n"); 71*09182ed2SHans de Goede return -EINVAL; 72*09182ed2SHans de Goede } 73*09182ed2SHans de Goede 74*09182ed2SHans de Goede fw_header = (const struct goodix_fw_header *)fw->data; 75*09182ed2SHans de Goede dev_info(dev, "Firmware hardware info %02x%02x%02x%02x\n", 76*09182ed2SHans de Goede fw_header->hw_info[0], fw_header->hw_info[1], 77*09182ed2SHans de Goede fw_header->hw_info[2], fw_header->hw_info[3]); 78*09182ed2SHans de Goede /* pid is a 8 byte buffer containing a string, weird I know */ 79*09182ed2SHans de Goede memcpy(buf, fw_header->pid, 8); 80*09182ed2SHans de Goede buf[8] = 0; 81*09182ed2SHans de Goede dev_info(dev, "Firmware PID: %s VID: %02x%02x\n", buf, 82*09182ed2SHans de Goede fw_header->vid[0], fw_header->vid[1]); 83*09182ed2SHans de Goede return 0; 84*09182ed2SHans de Goede } 85*09182ed2SHans de Goede 86*09182ed2SHans de Goede static int goodix_enter_upload_mode(struct i2c_client *client) 87*09182ed2SHans de Goede { 88*09182ed2SHans de Goede int tries, error; 89*09182ed2SHans de Goede u8 val; 90*09182ed2SHans de Goede 91*09182ed2SHans de Goede tries = 200; 92*09182ed2SHans de Goede do { 93*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, 94*09182ed2SHans de Goede GOODIX_REG_MISCTL_SWRST, 0x0c); 95*09182ed2SHans de Goede if (error) 96*09182ed2SHans de Goede return error; 97*09182ed2SHans de Goede 98*09182ed2SHans de Goede error = goodix_i2c_read(client, 99*09182ed2SHans de Goede GOODIX_REG_MISCTL_SWRST, &val, 1); 100*09182ed2SHans de Goede if (error) 101*09182ed2SHans de Goede return error; 102*09182ed2SHans de Goede 103*09182ed2SHans de Goede if (val == 0x0c) 104*09182ed2SHans de Goede break; 105*09182ed2SHans de Goede } while (--tries); 106*09182ed2SHans de Goede 107*09182ed2SHans de Goede if (!tries) { 108*09182ed2SHans de Goede dev_err(&client->dev, "Error could not hold ss51 & dsp\n"); 109*09182ed2SHans de Goede return -EIO; 110*09182ed2SHans de Goede } 111*09182ed2SHans de Goede 112*09182ed2SHans de Goede /* DSP_CK and DSP_ALU_CK PowerOn */ 113*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_DSP_CTL, 0x00); 114*09182ed2SHans de Goede if (error) 115*09182ed2SHans de Goede return error; 116*09182ed2SHans de Goede 117*09182ed2SHans de Goede /* Disable watchdog */ 118*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_TMR0_EN, 0x00); 119*09182ed2SHans de Goede if (error) 120*09182ed2SHans de Goede return error; 121*09182ed2SHans de Goede 122*09182ed2SHans de Goede /* Clear cache enable */ 123*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_CACHE_EN, 0x00); 124*09182ed2SHans de Goede if (error) 125*09182ed2SHans de Goede return error; 126*09182ed2SHans de Goede 127*09182ed2SHans de Goede /* Set boot from SRAM */ 128*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_BOOTCTL, 0x02); 129*09182ed2SHans de Goede if (error) 130*09182ed2SHans de Goede return error; 131*09182ed2SHans de Goede 132*09182ed2SHans de Goede /* Software reboot */ 133*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, 134*09182ed2SHans de Goede GOODIX_REG_MISCTL_CPU_SWRST_PULSE, 0x01); 135*09182ed2SHans de Goede if (error) 136*09182ed2SHans de Goede return error; 137*09182ed2SHans de Goede 138*09182ed2SHans de Goede /* Clear control flag */ 139*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_BOOTCTL, 0x00); 140*09182ed2SHans de Goede if (error) 141*09182ed2SHans de Goede return error; 142*09182ed2SHans de Goede 143*09182ed2SHans de Goede /* Set scramble */ 144*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_BOOT_OPT, 0x00); 145*09182ed2SHans de Goede if (error) 146*09182ed2SHans de Goede return error; 147*09182ed2SHans de Goede 148*09182ed2SHans de Goede /* Enable accessing code */ 149*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_MEM_CD_EN, 0x01); 150*09182ed2SHans de Goede if (error) 151*09182ed2SHans de Goede return error; 152*09182ed2SHans de Goede 153*09182ed2SHans de Goede return 0; 154*09182ed2SHans de Goede } 155*09182ed2SHans de Goede 156*09182ed2SHans de Goede static int goodix_start_firmware(struct i2c_client *client) 157*09182ed2SHans de Goede { 158*09182ed2SHans de Goede int error; 159*09182ed2SHans de Goede u8 val; 160*09182ed2SHans de Goede 161*09182ed2SHans de Goede /* Init software watchdog */ 162*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_SW_WDT, 0xaa); 163*09182ed2SHans de Goede if (error) 164*09182ed2SHans de Goede return error; 165*09182ed2SHans de Goede 166*09182ed2SHans de Goede /* Release SS51 & DSP */ 167*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_MISCTL_SWRST, 0x00); 168*09182ed2SHans de Goede if (error) 169*09182ed2SHans de Goede return error; 170*09182ed2SHans de Goede 171*09182ed2SHans de Goede error = goodix_i2c_read(client, GOODIX_REG_SW_WDT, &val, 1); 172*09182ed2SHans de Goede if (error) 173*09182ed2SHans de Goede return error; 174*09182ed2SHans de Goede 175*09182ed2SHans de Goede /* The value we've written to SW_WDT should have been cleared now */ 176*09182ed2SHans de Goede if (val == 0xaa) { 177*09182ed2SHans de Goede dev_err(&client->dev, "Error SW_WDT reg not cleared on fw startup\n"); 178*09182ed2SHans de Goede return -EIO; 179*09182ed2SHans de Goede } 180*09182ed2SHans de Goede 181*09182ed2SHans de Goede /* Re-init software watchdog */ 182*09182ed2SHans de Goede error = goodix_i2c_write_u8(client, GOODIX_REG_SW_WDT, 0xaa); 183*09182ed2SHans de Goede if (error) 184*09182ed2SHans de Goede return error; 185*09182ed2SHans de Goede 186*09182ed2SHans de Goede return 0; 187*09182ed2SHans de Goede } 188*09182ed2SHans de Goede 189*09182ed2SHans de Goede static int goodix_firmware_upload(struct goodix_ts_data *ts) 190*09182ed2SHans de Goede { 191*09182ed2SHans de Goede const struct firmware *fw; 192*09182ed2SHans de Goede char fw_name[64]; 193*09182ed2SHans de Goede const u8 *data; 194*09182ed2SHans de Goede int error; 195*09182ed2SHans de Goede 196*09182ed2SHans de Goede snprintf(fw_name, sizeof(fw_name), "goodix/%s", ts->firmware_name); 197*09182ed2SHans de Goede 198*09182ed2SHans de Goede error = request_firmware(&fw, fw_name, &ts->client->dev); 199*09182ed2SHans de Goede if (error) { 200*09182ed2SHans de Goede dev_err(&ts->client->dev, "Firmware request error %d\n", error); 201*09182ed2SHans de Goede return error; 202*09182ed2SHans de Goede } 203*09182ed2SHans de Goede 204*09182ed2SHans de Goede error = goodix_firmware_verify(&ts->client->dev, fw); 205*09182ed2SHans de Goede if (error) 206*09182ed2SHans de Goede goto release; 207*09182ed2SHans de Goede 208*09182ed2SHans de Goede error = goodix_reset_no_int_sync(ts); 209*09182ed2SHans de Goede if (error) 210*09182ed2SHans de Goede return error; 211*09182ed2SHans de Goede 212*09182ed2SHans de Goede error = goodix_enter_upload_mode(ts->client); 213*09182ed2SHans de Goede if (error) 214*09182ed2SHans de Goede goto release; 215*09182ed2SHans de Goede 216*09182ed2SHans de Goede /* Select SRAM bank 0 and upload section 1 & 2 */ 217*09182ed2SHans de Goede error = goodix_i2c_write_u8(ts->client, 218*09182ed2SHans de Goede GOODIX_REG_MISCTL_SRAM_BANK, 0x00); 219*09182ed2SHans de Goede if (error) 220*09182ed2SHans de Goede goto release; 221*09182ed2SHans de Goede 222*09182ed2SHans de Goede data = fw->data + GOODIX_FW_HEADER_LENGTH; 223*09182ed2SHans de Goede error = goodix_i2c_write(ts->client, GOODIX_FW_UPLOAD_ADDRESS, 224*09182ed2SHans de Goede data, 2 * GOODIX_FW_SECTION_LENGTH); 225*09182ed2SHans de Goede if (error) 226*09182ed2SHans de Goede goto release; 227*09182ed2SHans de Goede 228*09182ed2SHans de Goede /* Select SRAM bank 1 and upload section 3 & 4 */ 229*09182ed2SHans de Goede error = goodix_i2c_write_u8(ts->client, 230*09182ed2SHans de Goede GOODIX_REG_MISCTL_SRAM_BANK, 0x01); 231*09182ed2SHans de Goede if (error) 232*09182ed2SHans de Goede goto release; 233*09182ed2SHans de Goede 234*09182ed2SHans de Goede data += 2 * GOODIX_FW_SECTION_LENGTH; 235*09182ed2SHans de Goede error = goodix_i2c_write(ts->client, GOODIX_FW_UPLOAD_ADDRESS, 236*09182ed2SHans de Goede data, 2 * GOODIX_FW_SECTION_LENGTH); 237*09182ed2SHans de Goede if (error) 238*09182ed2SHans de Goede goto release; 239*09182ed2SHans de Goede 240*09182ed2SHans de Goede /* Select SRAM bank 2 and upload the DSP firmware */ 241*09182ed2SHans de Goede error = goodix_i2c_write_u8(ts->client, 242*09182ed2SHans de Goede GOODIX_REG_MISCTL_SRAM_BANK, 0x02); 243*09182ed2SHans de Goede if (error) 244*09182ed2SHans de Goede goto release; 245*09182ed2SHans de Goede 246*09182ed2SHans de Goede data += 2 * GOODIX_FW_SECTION_LENGTH; 247*09182ed2SHans de Goede error = goodix_i2c_write(ts->client, GOODIX_FW_UPLOAD_ADDRESS, 248*09182ed2SHans de Goede data, GOODIX_FW_DSP_LENGTH); 249*09182ed2SHans de Goede if (error) 250*09182ed2SHans de Goede goto release; 251*09182ed2SHans de Goede 252*09182ed2SHans de Goede error = goodix_start_firmware(ts->client); 253*09182ed2SHans de Goede if (error) 254*09182ed2SHans de Goede goto release; 255*09182ed2SHans de Goede 256*09182ed2SHans de Goede error = goodix_int_sync(ts); 257*09182ed2SHans de Goede release: 258*09182ed2SHans de Goede release_firmware(fw); 259*09182ed2SHans de Goede return error; 260*09182ed2SHans de Goede } 261*09182ed2SHans de Goede 262*09182ed2SHans de Goede static int goodix_prepare_bak_ref(struct goodix_ts_data *ts) 263*09182ed2SHans de Goede { 264*09182ed2SHans de Goede u8 have_key, driver_num, sensor_num; 265*09182ed2SHans de Goede 266*09182ed2SHans de Goede if (ts->bak_ref) 267*09182ed2SHans de Goede return 0; /* Already done */ 268*09182ed2SHans de Goede 269*09182ed2SHans de Goede have_key = (ts->config[GOODIX_CFG_LOC_HAVE_KEY] & 0x01); 270*09182ed2SHans de Goede 271*09182ed2SHans de Goede driver_num = (ts->config[GOODIX_CFG_LOC_DRVA_NUM] & 0x1f) + 272*09182ed2SHans de Goede (ts->config[GOODIX_CFG_LOC_DRVB_NUM] & 0x1f); 273*09182ed2SHans de Goede if (have_key) 274*09182ed2SHans de Goede driver_num--; 275*09182ed2SHans de Goede 276*09182ed2SHans de Goede sensor_num = (ts->config[GOODIX_CFG_LOC_SENS_NUM] & 0x0f) + 277*09182ed2SHans de Goede ((ts->config[GOODIX_CFG_LOC_SENS_NUM] >> 4) & 0x0f); 278*09182ed2SHans de Goede 279*09182ed2SHans de Goede dev_dbg(&ts->client->dev, "Drv %d Sen %d Key %d\n", 280*09182ed2SHans de Goede driver_num, sensor_num, have_key); 281*09182ed2SHans de Goede 282*09182ed2SHans de Goede ts->bak_ref_len = (driver_num * (sensor_num - 2) + 2) * 2; 283*09182ed2SHans de Goede 284*09182ed2SHans de Goede ts->bak_ref = devm_kzalloc(&ts->client->dev, 285*09182ed2SHans de Goede ts->bak_ref_len, GFP_KERNEL); 286*09182ed2SHans de Goede if (!ts->bak_ref) 287*09182ed2SHans de Goede return -ENOMEM; 288*09182ed2SHans de Goede 289*09182ed2SHans de Goede /* 290*09182ed2SHans de Goede * The bak_ref array contains the backup of an array of (self/auto) 291*09182ed2SHans de Goede * calibration related values which the Android version of the driver 292*09182ed2SHans de Goede * stores on the filesystem so that it can be restored after reboot. 293*09182ed2SHans de Goede * The mainline kernel never writes directly to the filesystem like 294*09182ed2SHans de Goede * this, we always start will all the values which give a correction 295*09182ed2SHans de Goede * factor in approx. the -20 - +20 range (in 2s complement) set to 0. 296*09182ed2SHans de Goede * 297*09182ed2SHans de Goede * Note the touchscreen works fine without restoring the reference 298*09182ed2SHans de Goede * values after a reboot / power-cycle. 299*09182ed2SHans de Goede * 300*09182ed2SHans de Goede * The last 2 bytes are a 16 bits unsigned checksum which is expected 301*09182ed2SHans de Goede * to make the addition al all 16 bit unsigned values in the array add 302*09182ed2SHans de Goede * up to 1 (rather then the usual 0), so we must set the last byte to 1. 303*09182ed2SHans de Goede */ 304*09182ed2SHans de Goede ts->bak_ref[ts->bak_ref_len - 1] = 1; 305*09182ed2SHans de Goede 306*09182ed2SHans de Goede return 0; 307*09182ed2SHans de Goede } 308*09182ed2SHans de Goede 309*09182ed2SHans de Goede static int goodix_send_main_clock(struct goodix_ts_data *ts) 310*09182ed2SHans de Goede { 311*09182ed2SHans de Goede u32 main_clk = 54; /* Default main clock */ 312*09182ed2SHans de Goede u8 checksum = 0; 313*09182ed2SHans de Goede int i; 314*09182ed2SHans de Goede 315*09182ed2SHans de Goede device_property_read_u32(&ts->client->dev, 316*09182ed2SHans de Goede "goodix,main-clk", &main_clk); 317*09182ed2SHans de Goede 318*09182ed2SHans de Goede for (i = 0; i < (GOODIX_MAIN_CLK_LEN - 1); i++) { 319*09182ed2SHans de Goede ts->main_clk[i] = main_clk; 320*09182ed2SHans de Goede checksum += main_clk; 321*09182ed2SHans de Goede } 322*09182ed2SHans de Goede 323*09182ed2SHans de Goede /* The value of all bytes combines must be 0 */ 324*09182ed2SHans de Goede ts->main_clk[GOODIX_MAIN_CLK_LEN - 1] = 256 - checksum; 325*09182ed2SHans de Goede 326*09182ed2SHans de Goede return goodix_i2c_write(ts->client, GOODIX_REG_MAIN_CLK, 327*09182ed2SHans de Goede ts->main_clk, GOODIX_MAIN_CLK_LEN); 328*09182ed2SHans de Goede } 329*09182ed2SHans de Goede 330*09182ed2SHans de Goede int goodix_firmware_check(struct goodix_ts_data *ts) 331*09182ed2SHans de Goede { 332*09182ed2SHans de Goede device_property_read_string(&ts->client->dev, 333*09182ed2SHans de Goede "firmware-name", &ts->firmware_name); 334*09182ed2SHans de Goede if (!ts->firmware_name) 335*09182ed2SHans de Goede return 0; 336*09182ed2SHans de Goede 337*09182ed2SHans de Goede if (ts->irq_pin_access_method == IRQ_PIN_ACCESS_NONE) { 338*09182ed2SHans de Goede dev_err(&ts->client->dev, "Error no IRQ-pin access method, cannot upload fw.\n"); 339*09182ed2SHans de Goede return -EINVAL; 340*09182ed2SHans de Goede } 341*09182ed2SHans de Goede 342*09182ed2SHans de Goede dev_info(&ts->client->dev, "Touchscreen controller needs fw-upload\n"); 343*09182ed2SHans de Goede ts->load_cfg_from_disk = true; 344*09182ed2SHans de Goede 345*09182ed2SHans de Goede return goodix_firmware_upload(ts); 346*09182ed2SHans de Goede } 347*09182ed2SHans de Goede 348*09182ed2SHans de Goede bool goodix_handle_fw_request(struct goodix_ts_data *ts) 349*09182ed2SHans de Goede { 350*09182ed2SHans de Goede int error; 351*09182ed2SHans de Goede u8 val; 352*09182ed2SHans de Goede 353*09182ed2SHans de Goede error = goodix_i2c_read(ts->client, GOODIX_REG_REQUEST, &val, 1); 354*09182ed2SHans de Goede if (error) 355*09182ed2SHans de Goede return false; 356*09182ed2SHans de Goede 357*09182ed2SHans de Goede switch (val) { 358*09182ed2SHans de Goede case GOODIX_RQST_RESPONDED: 359*09182ed2SHans de Goede /* 360*09182ed2SHans de Goede * If we read back our own last ack the IRQ was not for 361*09182ed2SHans de Goede * a request. 362*09182ed2SHans de Goede */ 363*09182ed2SHans de Goede return false; 364*09182ed2SHans de Goede case GOODIX_RQST_CONFIG: 365*09182ed2SHans de Goede error = goodix_send_cfg(ts, ts->config, ts->chip->config_len); 366*09182ed2SHans de Goede if (error) 367*09182ed2SHans de Goede return false; 368*09182ed2SHans de Goede 369*09182ed2SHans de Goede break; 370*09182ed2SHans de Goede case GOODIX_RQST_BAK_REF: 371*09182ed2SHans de Goede error = goodix_prepare_bak_ref(ts); 372*09182ed2SHans de Goede if (error) 373*09182ed2SHans de Goede return false; 374*09182ed2SHans de Goede 375*09182ed2SHans de Goede error = goodix_i2c_write(ts->client, GOODIX_REG_BAK_REF, 376*09182ed2SHans de Goede ts->bak_ref, ts->bak_ref_len); 377*09182ed2SHans de Goede if (error) 378*09182ed2SHans de Goede return false; 379*09182ed2SHans de Goede 380*09182ed2SHans de Goede break; 381*09182ed2SHans de Goede case GOODIX_RQST_RESET: 382*09182ed2SHans de Goede error = goodix_firmware_upload(ts); 383*09182ed2SHans de Goede if (error) 384*09182ed2SHans de Goede return false; 385*09182ed2SHans de Goede 386*09182ed2SHans de Goede break; 387*09182ed2SHans de Goede case GOODIX_RQST_MAIN_CLOCK: 388*09182ed2SHans de Goede error = goodix_send_main_clock(ts); 389*09182ed2SHans de Goede if (error) 390*09182ed2SHans de Goede return false; 391*09182ed2SHans de Goede 392*09182ed2SHans de Goede break; 393*09182ed2SHans de Goede case GOODIX_RQST_UNKNOWN: 394*09182ed2SHans de Goede case GOODIX_RQST_IDLE: 395*09182ed2SHans de Goede break; 396*09182ed2SHans de Goede default: 397*09182ed2SHans de Goede dev_err_ratelimited(&ts->client->dev, "Unknown Request: 0x%02x\n", val); 398*09182ed2SHans de Goede } 399*09182ed2SHans de Goede 400*09182ed2SHans de Goede /* Ack the request */ 401*09182ed2SHans de Goede goodix_i2c_write_u8(ts->client, 402*09182ed2SHans de Goede GOODIX_REG_REQUEST, GOODIX_RQST_RESPONDED); 403*09182ed2SHans de Goede return true; 404*09182ed2SHans de Goede } 405*09182ed2SHans de Goede 406*09182ed2SHans de Goede void goodix_save_bak_ref(struct goodix_ts_data *ts) 407*09182ed2SHans de Goede { 408*09182ed2SHans de Goede int error; 409*09182ed2SHans de Goede u8 val; 410*09182ed2SHans de Goede 411*09182ed2SHans de Goede if (!ts->firmware_name) 412*09182ed2SHans de Goede return; 413*09182ed2SHans de Goede 414*09182ed2SHans de Goede error = goodix_i2c_read(ts->client, GOODIX_REG_STATUS, &val, 1); 415*09182ed2SHans de Goede if (error) 416*09182ed2SHans de Goede return; 417*09182ed2SHans de Goede 418*09182ed2SHans de Goede if (!(val & 0x80)) 419*09182ed2SHans de Goede return; 420*09182ed2SHans de Goede 421*09182ed2SHans de Goede error = goodix_i2c_read(ts->client, GOODIX_REG_BAK_REF, 422*09182ed2SHans de Goede ts->bak_ref, ts->bak_ref_len); 423*09182ed2SHans de Goede if (error) { 424*09182ed2SHans de Goede memset(ts->bak_ref, 0, ts->bak_ref_len); 425*09182ed2SHans de Goede ts->bak_ref[ts->bak_ref_len - 1] = 1; 426*09182ed2SHans de Goede } 427*09182ed2SHans de Goede } 428