unsigned int max_touch_num;
        unsigned int int_trigger_type;
        bool rotated_screen;
+       int cfg_len;
 };
 
 #define GOODIX_MAX_HEIGHT              4096
 #define GOODIX_MAX_CONTACTS            10
 
 #define GOODIX_CONFIG_MAX_LENGTH       240
+#define GOODIX_CONFIG_911_LENGTH       186
+#define GOODIX_CONFIG_967_LENGTH       228
 
 /* Register defines */
 #define GOODIX_READ_COOR_ADDR          0x814E
        return ret < 0 ? ret : (ret != ARRAY_SIZE(msgs) ? -EIO : 0);
 }
 
+static int goodix_get_cfg_len(u16 id)
+{
+       switch (id) {
+       case 911:
+       case 9271:
+       case 9110:
+       case 927:
+       case 928:
+               return GOODIX_CONFIG_911_LENGTH;
+
+       case 912:
+       case 967:
+               return GOODIX_CONFIG_967_LENGTH;
+
+       default:
+               return GOODIX_CONFIG_MAX_LENGTH;
+       }
+}
+
 static int goodix_ts_read_input_report(struct goodix_ts_data *ts, u8 *data)
 {
        int touch_num;
        int error;
 
        error = goodix_i2c_read(ts->client, GOODIX_REG_CONFIG_DATA,
-                               config,
-                               GOODIX_CONFIG_MAX_LENGTH);
+                               config, ts->cfg_len);
        if (error) {
                dev_warn(&ts->client->dev,
                         "Error reading config (%d), using defaults\n",
                return error;
        }
 
+       ts->cfg_len = goodix_get_cfg_len(id_info);
+
        goodix_read_config(ts);
 
        error = goodix_request_input_dev(ts, version_info, id_info);