static int mxt_check_fcal_status(struct mxt_data *data, u8 status) { struct device *dev = &data->client->dev; int error = -EINVAL; dev_info(dev, "FCAL : state[%s]\n", MXT_FCALSTATE(status) ? (MXT_FCALSTATE(status) == 1 ? "PRIMED" : "GENERATED") : "IDLE"); switch (MXT_FCALSTATE(status)) { case MXT_FCALSTATE_IDLE: if (status & MXT_FCALSTATUS_SEQTO) { dev_err(dev, "Sequence Timeout:[0x%x]\n", status); goto out; } if (status & MXT_FCALSTATUS_SEQERR) { dev_err(dev, "Sequence Error:[0x%x]\n", status); goto out; } if (status & MXT_FCALSTATUS_SEQDONE) { dev_info(dev, "Sequence Done:[0x%x]\n", status); error = FCALSEQDONE_MAGIC; goto out; } break; case MXT_FCALSTATE_PRIMED: error = mxt_write_object(data, MXT_SPT_GOLDENREFERENCES_T66, 0, MXT_FCALCMD(MXT_FCALCMD_GENERATE) | 0x03); if (error) { dev_err(dev, "Failed to write FALCMD_GENERATE\n"); goto out; } break; case MXT_FCALSTATE_GENERATED: if (status & MXT_FCALSTATUS_FAIL) { dev_err(dev, "Calibration Failed:[0x%x]\n", status); goto out; } if (status & MXT_FCALSTATUS_PASS) { dev_info(dev, "Calibration Passed:[0x%x]\n", status); error = mxt_write_object(data, MXT_SPT_GOLDENREFERENCES_T66, 0, MXT_FCALCMD(MXT_FCALCMD_STORE) | 0x03); if (error) { dev_err(dev, "Failed to write FCALCMD_STORE\n"); goto out; } } break; default: dev_err(dev, "Invaild Factory Calibration status[0x%x]\n", status); } out: return error; }
static int mxt_set_diagnostic_mode(struct mxt_data *data, u8 dbg_mode) { struct i2c_client *client = data->client; u8 cur_mode; int ret; ret = mxt_write_object(data, GEN_COMMANDPROCESSOR_T6, CMD_DIAGNOSTIC_OFFSET, dbg_mode); if (ret) { dev_err(&client->dev, "Failed change diagnositc mode to %d\n", dbg_mode); goto out; } if (dbg_mode & MXT_DIAG_MODE_MASK) { do { ret = mxt_read_object(data, DEBUG_DIAGNOSTIC_T37, MXT_DIAGNOSTIC_MODE, &cur_mode); if (ret) { dev_err(&client->dev, "Failed getting diagnositc mode\n"); goto out; } msleep(20); } while (cur_mode != dbg_mode); dev_dbg(&client->dev, "current dianostic chip mode is %d\n", cur_mode); } out: return ret; }
static void mxt_run_factory_cal(void *device_data) { struct mxt_data *data = (struct mxt_data *)device_data; struct i2c_client *client = data->client; struct mxt_fac_data *fdata = data->fdata; struct mxt_message message; int error = 0; set_default_result(fdata); /* To ensure that previous touchs are released */ msleep(500); /* CTRL : enable RPTEN and ENABLE */ error = mxt_write_object(data, MXT_SPT_GOLDENREFERENCES_T66, 0, MXT_FCALCMD(MXT_FCALCMD_PRIME) | 0x03); if (error) { dev_err(&client->dev, "Failed to write FCALCMD_PRIME\n"); fdata->cmd_state = CMD_STATUS_FAIL; return; } disable_irq(client->irq); do { error = mxt_read_message_on_fcal(data, &message); if (!error) msleep(1000); } while (!error); enable_irq(client->irq); if (error == FCALSEQDONE_MAGIC) { dev_info(&client->dev, "Sucessed Factory Calibration\n"); fdata->cmd_state = CMD_STATUS_OK; } else { dev_err(&client->dev, "Failed Factory Calibration [%d]", error); fdata->cmd_state = CMD_STATUS_FAIL; } }