|
@@ -199,122 +199,6 @@
|
|
|
|
|
|
#define MXT_MAX_FINGER 10
|
|
|
|
|
|
-/* Initial register values recommended from chip vendor */
|
|
|
-static const u8 init_vals_ver_20[] = {
|
|
|
- /* MXT_GEN_COMMAND(6) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_GEN_POWER(7) */
|
|
|
- 0x20, 0xff, 0x32,
|
|
|
- /* MXT_GEN_ACQUIRE(8) */
|
|
|
- 0x08, 0x05, 0x05, 0x00, 0x00, 0x00, 0x05, 0x14,
|
|
|
- /* MXT_TOUCH_MULTI(9) */
|
|
|
- 0x00, 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00,
|
|
|
- 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x64,
|
|
|
- /* MXT_TOUCH_KEYARRAY(15) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00,
|
|
|
- /* MXT_SPT_GPIOPWM(19) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00,
|
|
|
- /* MXT_PROCI_GRIPFACE(20) */
|
|
|
- 0x00, 0x64, 0x64, 0x64, 0x64, 0x00, 0x00, 0x1e, 0x14, 0x04,
|
|
|
- 0x1e, 0x00,
|
|
|
- /* MXT_PROCG_NOISE(22) */
|
|
|
- 0x05, 0x00, 0x00, 0x19, 0x00, 0xe7, 0xff, 0x04, 0x32, 0x00,
|
|
|
- 0x01, 0x0a, 0x0f, 0x14, 0x00, 0x00, 0xe8,
|
|
|
- /* MXT_TOUCH_PROXIMITY(23) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_ONETOUCH(24) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_SPT_SELFTEST(25) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_TWOTOUCH(27) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_SPT_CTECONFIG(28) */
|
|
|
- 0x00, 0x00, 0x00, 0x04, 0x08,
|
|
|
-};
|
|
|
-
|
|
|
-static const u8 init_vals_ver_21[] = {
|
|
|
- /* MXT_GEN_COMMAND(6) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_GEN_POWER(7) */
|
|
|
- 0x20, 0xff, 0x32,
|
|
|
- /* MXT_GEN_ACQUIRE(8) */
|
|
|
- 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
|
|
|
- /* MXT_TOUCH_MULTI(9) */
|
|
|
- 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
|
|
|
- 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_TOUCH_KEYARRAY(15) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00,
|
|
|
- /* MXT_SPT_GPIOPWM(19) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_GRIPFACE(20) */
|
|
|
- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
|
|
|
- 0x0f, 0x0a,
|
|
|
- /* MXT_PROCG_NOISE(22) */
|
|
|
- 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
|
|
|
- 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
|
|
|
- /* MXT_TOUCH_PROXIMITY(23) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_ONETOUCH(24) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_SPT_SELFTEST(25) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_TWOTOUCH(27) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_SPT_CTECONFIG(28) */
|
|
|
- 0x00, 0x00, 0x00, 0x08, 0x10, 0x00,
|
|
|
-};
|
|
|
-
|
|
|
-static const u8 init_vals_ver_22[] = {
|
|
|
- /* MXT_GEN_COMMAND(6) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_GEN_POWER(7) */
|
|
|
- 0x20, 0xff, 0x32,
|
|
|
- /* MXT_GEN_ACQUIRE(8) */
|
|
|
- 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23,
|
|
|
- /* MXT_TOUCH_MULTI(9) */
|
|
|
- 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00,
|
|
|
- 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00,
|
|
|
- /* MXT_TOUCH_KEYARRAY(15) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00,
|
|
|
- /* MXT_SPT_GPIOPWM(19) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_GRIPFACE(20) */
|
|
|
- 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04,
|
|
|
- 0x0f, 0x0a,
|
|
|
- /* MXT_PROCG_NOISE(22) */
|
|
|
- 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00,
|
|
|
- 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03,
|
|
|
- /* MXT_TOUCH_PROXIMITY(23) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_ONETOUCH(24) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_SPT_SELFTEST(25) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_PROCI_TWOTOUCH(27) */
|
|
|
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
|
- /* MXT_SPT_CTECONFIG(28) */
|
|
|
- 0x00, 0x00, 0x00, 0x08, 0x10, 0x00,
|
|
|
-};
|
|
|
-
|
|
|
struct mxt_info {
|
|
|
u8 family_id;
|
|
|
u8 variant_id;
|
|
@@ -714,26 +598,15 @@ end:
|
|
|
|
|
|
static int mxt_check_reg_init(struct mxt_data *data)
|
|
|
{
|
|
|
+ const struct mxt_platform_data *pdata = data->pdata;
|
|
|
struct mxt_object *object;
|
|
|
struct device *dev = &data->client->dev;
|
|
|
int index = 0;
|
|
|
- int i, j;
|
|
|
- u8 version = data->info.version;
|
|
|
- u8 *init_vals;
|
|
|
+ int i, j, config_offset;
|
|
|
|
|
|
- switch (version) {
|
|
|
- case MXT_VER_20:
|
|
|
- init_vals = (u8 *)init_vals_ver_20;
|
|
|
- break;
|
|
|
- case MXT_VER_21:
|
|
|
- init_vals = (u8 *)init_vals_ver_21;
|
|
|
- break;
|
|
|
- case MXT_VER_22:
|
|
|
- init_vals = (u8 *)init_vals_ver_22;
|
|
|
- break;
|
|
|
- default:
|
|
|
- dev_err(dev, "Firmware version %d doesn't support\n", version);
|
|
|
- return -EINVAL;
|
|
|
+ if (!pdata->config) {
|
|
|
+ dev_dbg(dev, "No cfg data defined, skipping reg init\n");
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < data->info.object_num; i++) {
|
|
@@ -742,10 +615,15 @@ static int mxt_check_reg_init(struct mxt_data *data)
|
|
|
if (!mxt_object_writable(object->type))
|
|
|
continue;
|
|
|
|
|
|
- for (j = 0; j < object->size + 1; j++)
|
|
|
+ for (j = 0; j < object->size + 1; j++) {
|
|
|
+ config_offset = index + j;
|
|
|
+ if (config_offset > pdata->config_length) {
|
|
|
+ dev_err(dev, "Not enough config data!\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
mxt_write_object(data, object->type, j,
|
|
|
- init_vals[index + j]);
|
|
|
-
|
|
|
+ pdata->config[config_offset]);
|
|
|
+ }
|
|
|
index += object->size + 1;
|
|
|
}
|
|
|
|