Path: blob/master/drivers/input/touchscreen/atmel_mxt_ts.c
15111 views
/*1* Atmel maXTouch Touchscreen driver2*3* Copyright (C) 2010 Samsung Electronics Co.Ltd4* Author: Joonyoung Shim <[email protected]>5*6* This program is free software; you can redistribute it and/or modify it7* under the terms of the GNU General Public License as published by the8* Free Software Foundation; either version 2 of the License, or (at your9* option) any later version.10*11*/1213#include <linux/module.h>14#include <linux/init.h>15#include <linux/delay.h>16#include <linux/firmware.h>17#include <linux/i2c.h>18#include <linux/i2c/atmel_mxt_ts.h>19#include <linux/input/mt.h>20#include <linux/interrupt.h>21#include <linux/slab.h>2223/* Version */24#define MXT_VER_20 2025#define MXT_VER_21 2126#define MXT_VER_22 222728/* Slave addresses */29#define MXT_APP_LOW 0x4a30#define MXT_APP_HIGH 0x4b31#define MXT_BOOT_LOW 0x2432#define MXT_BOOT_HIGH 0x253334/* Firmware */35#define MXT_FW_NAME "maxtouch.fw"3637/* Registers */38#define MXT_FAMILY_ID 0x0039#define MXT_VARIANT_ID 0x0140#define MXT_VERSION 0x0241#define MXT_BUILD 0x0342#define MXT_MATRIX_X_SIZE 0x0443#define MXT_MATRIX_Y_SIZE 0x0544#define MXT_OBJECT_NUM 0x0645#define MXT_OBJECT_START 0x074647#define MXT_OBJECT_SIZE 64849/* Object types */50#define MXT_DEBUG_DIAGNOSTIC 3751#define MXT_GEN_MESSAGE 552#define MXT_GEN_COMMAND 653#define MXT_GEN_POWER 754#define MXT_GEN_ACQUIRE 855#define MXT_TOUCH_MULTI 956#define MXT_TOUCH_KEYARRAY 1557#define MXT_TOUCH_PROXIMITY 2358#define MXT_PROCI_GRIPFACE 2059#define MXT_PROCG_NOISE 2260#define MXT_PROCI_ONETOUCH 2461#define MXT_PROCI_TWOTOUCH 2762#define MXT_PROCI_GRIP 4063#define MXT_PROCI_PALM 4164#define MXT_SPT_COMMSCONFIG 1865#define MXT_SPT_GPIOPWM 1966#define MXT_SPT_SELFTEST 2567#define MXT_SPT_CTECONFIG 2868#define MXT_SPT_USERDATA 3869#define MXT_SPT_DIGITIZER 4370#define MXT_SPT_MESSAGECOUNT 447172/* MXT_GEN_COMMAND field */73#define MXT_COMMAND_RESET 074#define MXT_COMMAND_BACKUPNV 175#define MXT_COMMAND_CALIBRATE 276#define MXT_COMMAND_REPORTALL 377#define MXT_COMMAND_DIAGNOSTIC 57879/* MXT_GEN_POWER field */80#define MXT_POWER_IDLEACQINT 081#define MXT_POWER_ACTVACQINT 182#define MXT_POWER_ACTV2IDLETO 28384/* MXT_GEN_ACQUIRE field */85#define MXT_ACQUIRE_CHRGTIME 086#define MXT_ACQUIRE_TCHDRIFT 287#define MXT_ACQUIRE_DRIFTST 388#define MXT_ACQUIRE_TCHAUTOCAL 489#define MXT_ACQUIRE_SYNC 590#define MXT_ACQUIRE_ATCHCALST 691#define MXT_ACQUIRE_ATCHCALSTHR 79293/* MXT_TOUCH_MULTI field */94#define MXT_TOUCH_CTRL 095#define MXT_TOUCH_XORIGIN 196#define MXT_TOUCH_YORIGIN 297#define MXT_TOUCH_XSIZE 398#define MXT_TOUCH_YSIZE 499#define MXT_TOUCH_BLEN 6100#define MXT_TOUCH_TCHTHR 7101#define MXT_TOUCH_TCHDI 8102#define MXT_TOUCH_ORIENT 9103#define MXT_TOUCH_MOVHYSTI 11104#define MXT_TOUCH_MOVHYSTN 12105#define MXT_TOUCH_NUMTOUCH 14106#define MXT_TOUCH_MRGHYST 15107#define MXT_TOUCH_MRGTHR 16108#define MXT_TOUCH_AMPHYST 17109#define MXT_TOUCH_XRANGE_LSB 18110#define MXT_TOUCH_XRANGE_MSB 19111#define MXT_TOUCH_YRANGE_LSB 20112#define MXT_TOUCH_YRANGE_MSB 21113#define MXT_TOUCH_XLOCLIP 22114#define MXT_TOUCH_XHICLIP 23115#define MXT_TOUCH_YLOCLIP 24116#define MXT_TOUCH_YHICLIP 25117#define MXT_TOUCH_XEDGECTRL 26118#define MXT_TOUCH_XEDGEDIST 27119#define MXT_TOUCH_YEDGECTRL 28120#define MXT_TOUCH_YEDGEDIST 29121#define MXT_TOUCH_JUMPLIMIT 30122123/* MXT_PROCI_GRIPFACE field */124#define MXT_GRIPFACE_CTRL 0125#define MXT_GRIPFACE_XLOGRIP 1126#define MXT_GRIPFACE_XHIGRIP 2127#define MXT_GRIPFACE_YLOGRIP 3128#define MXT_GRIPFACE_YHIGRIP 4129#define MXT_GRIPFACE_MAXTCHS 5130#define MXT_GRIPFACE_SZTHR1 7131#define MXT_GRIPFACE_SZTHR2 8132#define MXT_GRIPFACE_SHPTHR1 9133#define MXT_GRIPFACE_SHPTHR2 10134#define MXT_GRIPFACE_SUPEXTTO 11135136/* MXT_PROCI_NOISE field */137#define MXT_NOISE_CTRL 0138#define MXT_NOISE_OUTFLEN 1139#define MXT_NOISE_GCAFUL_LSB 3140#define MXT_NOISE_GCAFUL_MSB 4141#define MXT_NOISE_GCAFLL_LSB 5142#define MXT_NOISE_GCAFLL_MSB 6143#define MXT_NOISE_ACTVGCAFVALID 7144#define MXT_NOISE_NOISETHR 8145#define MXT_NOISE_FREQHOPSCALE 10146#define MXT_NOISE_FREQ0 11147#define MXT_NOISE_FREQ1 12148#define MXT_NOISE_FREQ2 13149#define MXT_NOISE_FREQ3 14150#define MXT_NOISE_FREQ4 15151#define MXT_NOISE_IDLEGCAFVALID 16152153/* MXT_SPT_COMMSCONFIG */154#define MXT_COMMS_CTRL 0155#define MXT_COMMS_CMD 1156157/* MXT_SPT_CTECONFIG field */158#define MXT_CTE_CTRL 0159#define MXT_CTE_CMD 1160#define MXT_CTE_MODE 2161#define MXT_CTE_IDLEGCAFDEPTH 3162#define MXT_CTE_ACTVGCAFDEPTH 4163#define MXT_CTE_VOLTAGE 5164165#define MXT_VOLTAGE_DEFAULT 2700000166#define MXT_VOLTAGE_STEP 10000167168/* Define for MXT_GEN_COMMAND */169#define MXT_BOOT_VALUE 0xa5170#define MXT_BACKUP_VALUE 0x55171#define MXT_BACKUP_TIME 25 /* msec */172#define MXT_RESET_TIME 65 /* msec */173174#define MXT_FWRESET_TIME 175 /* msec */175176/* Command to unlock bootloader */177#define MXT_UNLOCK_CMD_MSB 0xaa178#define MXT_UNLOCK_CMD_LSB 0xdc179180/* Bootloader mode status */181#define MXT_WAITING_BOOTLOAD_CMD 0xc0 /* valid 7 6 bit only */182#define MXT_WAITING_FRAME_DATA 0x80 /* valid 7 6 bit only */183#define MXT_FRAME_CRC_CHECK 0x02184#define MXT_FRAME_CRC_FAIL 0x03185#define MXT_FRAME_CRC_PASS 0x04186#define MXT_APP_CRC_FAIL 0x40 /* valid 7 8 bit only */187#define MXT_BOOT_STATUS_MASK 0x3f188189/* Touch status */190#define MXT_SUPPRESS (1 << 1)191#define MXT_AMP (1 << 2)192#define MXT_VECTOR (1 << 3)193#define MXT_MOVE (1 << 4)194#define MXT_RELEASE (1 << 5)195#define MXT_PRESS (1 << 6)196#define MXT_DETECT (1 << 7)197198/* Touch orient bits */199#define MXT_XY_SWITCH (1 << 0)200#define MXT_X_INVERT (1 << 1)201#define MXT_Y_INVERT (1 << 2)202203/* Touchscreen absolute values */204#define MXT_MAX_AREA 0xff205206#define MXT_MAX_FINGER 10207208struct mxt_info {209u8 family_id;210u8 variant_id;211u8 version;212u8 build;213u8 matrix_xsize;214u8 matrix_ysize;215u8 object_num;216};217218struct mxt_object {219u8 type;220u16 start_address;221u8 size;222u8 instances;223u8 num_report_ids;224225/* to map object and message */226u8 max_reportid;227};228229struct mxt_message {230u8 reportid;231u8 message[7];232u8 checksum;233};234235struct mxt_finger {236int status;237int x;238int y;239int area;240};241242/* Each client has this additional data */243struct mxt_data {244struct i2c_client *client;245struct input_dev *input_dev;246const struct mxt_platform_data *pdata;247struct mxt_object *object_table;248struct mxt_info info;249struct mxt_finger finger[MXT_MAX_FINGER];250unsigned int irq;251unsigned int max_x;252unsigned int max_y;253};254255static bool mxt_object_readable(unsigned int type)256{257switch (type) {258case MXT_GEN_MESSAGE:259case MXT_GEN_COMMAND:260case MXT_GEN_POWER:261case MXT_GEN_ACQUIRE:262case MXT_TOUCH_MULTI:263case MXT_TOUCH_KEYARRAY:264case MXT_TOUCH_PROXIMITY:265case MXT_PROCI_GRIPFACE:266case MXT_PROCG_NOISE:267case MXT_PROCI_ONETOUCH:268case MXT_PROCI_TWOTOUCH:269case MXT_PROCI_GRIP:270case MXT_PROCI_PALM:271case MXT_SPT_COMMSCONFIG:272case MXT_SPT_GPIOPWM:273case MXT_SPT_SELFTEST:274case MXT_SPT_CTECONFIG:275case MXT_SPT_USERDATA:276return true;277default:278return false;279}280}281282static bool mxt_object_writable(unsigned int type)283{284switch (type) {285case MXT_GEN_COMMAND:286case MXT_GEN_POWER:287case MXT_GEN_ACQUIRE:288case MXT_TOUCH_MULTI:289case MXT_TOUCH_KEYARRAY:290case MXT_TOUCH_PROXIMITY:291case MXT_PROCI_GRIPFACE:292case MXT_PROCG_NOISE:293case MXT_PROCI_ONETOUCH:294case MXT_PROCI_TWOTOUCH:295case MXT_PROCI_GRIP:296case MXT_PROCI_PALM:297case MXT_SPT_GPIOPWM:298case MXT_SPT_SELFTEST:299case MXT_SPT_CTECONFIG:300return true;301default:302return false;303}304}305306static void mxt_dump_message(struct device *dev,307struct mxt_message *message)308{309dev_dbg(dev, "reportid:\t0x%x\n", message->reportid);310dev_dbg(dev, "message1:\t0x%x\n", message->message[0]);311dev_dbg(dev, "message2:\t0x%x\n", message->message[1]);312dev_dbg(dev, "message3:\t0x%x\n", message->message[2]);313dev_dbg(dev, "message4:\t0x%x\n", message->message[3]);314dev_dbg(dev, "message5:\t0x%x\n", message->message[4]);315dev_dbg(dev, "message6:\t0x%x\n", message->message[5]);316dev_dbg(dev, "message7:\t0x%x\n", message->message[6]);317dev_dbg(dev, "checksum:\t0x%x\n", message->checksum);318}319320static int mxt_check_bootloader(struct i2c_client *client,321unsigned int state)322{323u8 val;324325recheck:326if (i2c_master_recv(client, &val, 1) != 1) {327dev_err(&client->dev, "%s: i2c recv failed\n", __func__);328return -EIO;329}330331switch (state) {332case MXT_WAITING_BOOTLOAD_CMD:333case MXT_WAITING_FRAME_DATA:334val &= ~MXT_BOOT_STATUS_MASK;335break;336case MXT_FRAME_CRC_PASS:337if (val == MXT_FRAME_CRC_CHECK)338goto recheck;339break;340default:341return -EINVAL;342}343344if (val != state) {345dev_err(&client->dev, "Unvalid bootloader mode state\n");346return -EINVAL;347}348349return 0;350}351352static int mxt_unlock_bootloader(struct i2c_client *client)353{354u8 buf[2];355356buf[0] = MXT_UNLOCK_CMD_LSB;357buf[1] = MXT_UNLOCK_CMD_MSB;358359if (i2c_master_send(client, buf, 2) != 2) {360dev_err(&client->dev, "%s: i2c send failed\n", __func__);361return -EIO;362}363364return 0;365}366367static int mxt_fw_write(struct i2c_client *client,368const u8 *data, unsigned int frame_size)369{370if (i2c_master_send(client, data, frame_size) != frame_size) {371dev_err(&client->dev, "%s: i2c send failed\n", __func__);372return -EIO;373}374375return 0;376}377378static int __mxt_read_reg(struct i2c_client *client,379u16 reg, u16 len, void *val)380{381struct i2c_msg xfer[2];382u8 buf[2];383384buf[0] = reg & 0xff;385buf[1] = (reg >> 8) & 0xff;386387/* Write register */388xfer[0].addr = client->addr;389xfer[0].flags = 0;390xfer[0].len = 2;391xfer[0].buf = buf;392393/* Read data */394xfer[1].addr = client->addr;395xfer[1].flags = I2C_M_RD;396xfer[1].len = len;397xfer[1].buf = val;398399if (i2c_transfer(client->adapter, xfer, 2) != 2) {400dev_err(&client->dev, "%s: i2c transfer failed\n", __func__);401return -EIO;402}403404return 0;405}406407static int mxt_read_reg(struct i2c_client *client, u16 reg, u8 *val)408{409return __mxt_read_reg(client, reg, 1, val);410}411412static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val)413{414u8 buf[3];415416buf[0] = reg & 0xff;417buf[1] = (reg >> 8) & 0xff;418buf[2] = val;419420if (i2c_master_send(client, buf, 3) != 3) {421dev_err(&client->dev, "%s: i2c send failed\n", __func__);422return -EIO;423}424425return 0;426}427428static int mxt_read_object_table(struct i2c_client *client,429u16 reg, u8 *object_buf)430{431return __mxt_read_reg(client, reg, MXT_OBJECT_SIZE,432object_buf);433}434435static struct mxt_object *436mxt_get_object(struct mxt_data *data, u8 type)437{438struct mxt_object *object;439int i;440441for (i = 0; i < data->info.object_num; i++) {442object = data->object_table + i;443if (object->type == type)444return object;445}446447dev_err(&data->client->dev, "Invalid object type\n");448return NULL;449}450451static int mxt_read_message(struct mxt_data *data,452struct mxt_message *message)453{454struct mxt_object *object;455u16 reg;456457object = mxt_get_object(data, MXT_GEN_MESSAGE);458if (!object)459return -EINVAL;460461reg = object->start_address;462return __mxt_read_reg(data->client, reg,463sizeof(struct mxt_message), message);464}465466static int mxt_read_object(struct mxt_data *data,467u8 type, u8 offset, u8 *val)468{469struct mxt_object *object;470u16 reg;471472object = mxt_get_object(data, type);473if (!object)474return -EINVAL;475476reg = object->start_address;477return __mxt_read_reg(data->client, reg + offset, 1, val);478}479480static int mxt_write_object(struct mxt_data *data,481u8 type, u8 offset, u8 val)482{483struct mxt_object *object;484u16 reg;485486object = mxt_get_object(data, type);487if (!object)488return -EINVAL;489490reg = object->start_address;491return mxt_write_reg(data->client, reg + offset, val);492}493494static void mxt_input_report(struct mxt_data *data, int single_id)495{496struct mxt_finger *finger = data->finger;497struct input_dev *input_dev = data->input_dev;498int status = finger[single_id].status;499int finger_num = 0;500int id;501502for (id = 0; id < MXT_MAX_FINGER; id++) {503if (!finger[id].status)504continue;505506input_mt_slot(input_dev, id);507input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,508finger[id].status != MXT_RELEASE);509510if (finger[id].status != MXT_RELEASE) {511finger_num++;512input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR,513finger[id].area);514input_report_abs(input_dev, ABS_MT_POSITION_X,515finger[id].x);516input_report_abs(input_dev, ABS_MT_POSITION_Y,517finger[id].y);518} else {519finger[id].status = 0;520}521}522523input_report_key(input_dev, BTN_TOUCH, finger_num > 0);524525if (status != MXT_RELEASE) {526input_report_abs(input_dev, ABS_X, finger[single_id].x);527input_report_abs(input_dev, ABS_Y, finger[single_id].y);528}529530input_sync(input_dev);531}532533static void mxt_input_touchevent(struct mxt_data *data,534struct mxt_message *message, int id)535{536struct mxt_finger *finger = data->finger;537struct device *dev = &data->client->dev;538u8 status = message->message[0];539int x;540int y;541int area;542543/* Check the touch is present on the screen */544if (!(status & MXT_DETECT)) {545if (status & MXT_RELEASE) {546dev_dbg(dev, "[%d] released\n", id);547548finger[id].status = MXT_RELEASE;549mxt_input_report(data, id);550}551return;552}553554/* Check only AMP detection */555if (!(status & (MXT_PRESS | MXT_MOVE)))556return;557558x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf);559y = (message->message[2] << 4) | ((message->message[3] & 0xf));560if (data->max_x < 1024)561x = x >> 2;562if (data->max_y < 1024)563y = y >> 2;564565area = message->message[4];566567dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,568status & MXT_MOVE ? "moved" : "pressed",569x, y, area);570571finger[id].status = status & MXT_MOVE ?572MXT_MOVE : MXT_PRESS;573finger[id].x = x;574finger[id].y = y;575finger[id].area = area;576577mxt_input_report(data, id);578}579580static irqreturn_t mxt_interrupt(int irq, void *dev_id)581{582struct mxt_data *data = dev_id;583struct mxt_message message;584struct mxt_object *object;585struct device *dev = &data->client->dev;586int id;587u8 reportid;588u8 max_reportid;589u8 min_reportid;590591do {592if (mxt_read_message(data, &message)) {593dev_err(dev, "Failed to read message\n");594goto end;595}596597reportid = message.reportid;598599/* whether reportid is thing of MXT_TOUCH_MULTI */600object = mxt_get_object(data, MXT_TOUCH_MULTI);601if (!object)602goto end;603604max_reportid = object->max_reportid;605min_reportid = max_reportid - object->num_report_ids + 1;606id = reportid - min_reportid;607608if (reportid >= min_reportid && reportid <= max_reportid)609mxt_input_touchevent(data, &message, id);610else611mxt_dump_message(dev, &message);612} while (reportid != 0xff);613614end:615return IRQ_HANDLED;616}617618static int mxt_check_reg_init(struct mxt_data *data)619{620const struct mxt_platform_data *pdata = data->pdata;621struct mxt_object *object;622struct device *dev = &data->client->dev;623int index = 0;624int i, j, config_offset;625626if (!pdata->config) {627dev_dbg(dev, "No cfg data defined, skipping reg init\n");628return 0;629}630631for (i = 0; i < data->info.object_num; i++) {632object = data->object_table + i;633634if (!mxt_object_writable(object->type))635continue;636637for (j = 0; j < object->size + 1; j++) {638config_offset = index + j;639if (config_offset > pdata->config_length) {640dev_err(dev, "Not enough config data!\n");641return -EINVAL;642}643mxt_write_object(data, object->type, j,644pdata->config[config_offset]);645}646index += object->size + 1;647}648649return 0;650}651652static int mxt_make_highchg(struct mxt_data *data)653{654struct device *dev = &data->client->dev;655struct mxt_message message;656int count = 10;657int error;658659/* Read dummy message to make high CHG pin */660do {661error = mxt_read_message(data, &message);662if (error)663return error;664} while (message.reportid != 0xff && --count);665666if (!count) {667dev_err(dev, "CHG pin isn't cleared\n");668return -EBUSY;669}670671return 0;672}673674static void mxt_handle_pdata(struct mxt_data *data)675{676const struct mxt_platform_data *pdata = data->pdata;677u8 voltage;678679/* Set touchscreen lines */680mxt_write_object(data, MXT_TOUCH_MULTI, MXT_TOUCH_XSIZE,681pdata->x_line);682mxt_write_object(data, MXT_TOUCH_MULTI, MXT_TOUCH_YSIZE,683pdata->y_line);684685/* Set touchscreen orient */686mxt_write_object(data, MXT_TOUCH_MULTI, MXT_TOUCH_ORIENT,687pdata->orient);688689/* Set touchscreen burst length */690mxt_write_object(data, MXT_TOUCH_MULTI,691MXT_TOUCH_BLEN, pdata->blen);692693/* Set touchscreen threshold */694mxt_write_object(data, MXT_TOUCH_MULTI,695MXT_TOUCH_TCHTHR, pdata->threshold);696697/* Set touchscreen resolution */698mxt_write_object(data, MXT_TOUCH_MULTI,699MXT_TOUCH_XRANGE_LSB, (pdata->x_size - 1) & 0xff);700mxt_write_object(data, MXT_TOUCH_MULTI,701MXT_TOUCH_XRANGE_MSB, (pdata->x_size - 1) >> 8);702mxt_write_object(data, MXT_TOUCH_MULTI,703MXT_TOUCH_YRANGE_LSB, (pdata->y_size - 1) & 0xff);704mxt_write_object(data, MXT_TOUCH_MULTI,705MXT_TOUCH_YRANGE_MSB, (pdata->y_size - 1) >> 8);706707/* Set touchscreen voltage */708if (pdata->voltage) {709if (pdata->voltage < MXT_VOLTAGE_DEFAULT) {710voltage = (MXT_VOLTAGE_DEFAULT - pdata->voltage) /711MXT_VOLTAGE_STEP;712voltage = 0xff - voltage + 1;713} else714voltage = (pdata->voltage - MXT_VOLTAGE_DEFAULT) /715MXT_VOLTAGE_STEP;716717mxt_write_object(data, MXT_SPT_CTECONFIG,718MXT_CTE_VOLTAGE, voltage);719}720}721722static int mxt_get_info(struct mxt_data *data)723{724struct i2c_client *client = data->client;725struct mxt_info *info = &data->info;726int error;727u8 val;728729error = mxt_read_reg(client, MXT_FAMILY_ID, &val);730if (error)731return error;732info->family_id = val;733734error = mxt_read_reg(client, MXT_VARIANT_ID, &val);735if (error)736return error;737info->variant_id = val;738739error = mxt_read_reg(client, MXT_VERSION, &val);740if (error)741return error;742info->version = val;743744error = mxt_read_reg(client, MXT_BUILD, &val);745if (error)746return error;747info->build = val;748749error = mxt_read_reg(client, MXT_OBJECT_NUM, &val);750if (error)751return error;752info->object_num = val;753754return 0;755}756757static int mxt_get_object_table(struct mxt_data *data)758{759int error;760int i;761u16 reg;762u8 reportid = 0;763u8 buf[MXT_OBJECT_SIZE];764765for (i = 0; i < data->info.object_num; i++) {766struct mxt_object *object = data->object_table + i;767768reg = MXT_OBJECT_START + MXT_OBJECT_SIZE * i;769error = mxt_read_object_table(data->client, reg, buf);770if (error)771return error;772773object->type = buf[0];774object->start_address = (buf[2] << 8) | buf[1];775object->size = buf[3];776object->instances = buf[4];777object->num_report_ids = buf[5];778779if (object->num_report_ids) {780reportid += object->num_report_ids *781(object->instances + 1);782object->max_reportid = reportid;783}784}785786return 0;787}788789static int mxt_initialize(struct mxt_data *data)790{791struct i2c_client *client = data->client;792struct mxt_info *info = &data->info;793int error;794u8 val;795796error = mxt_get_info(data);797if (error)798return error;799800data->object_table = kcalloc(info->object_num,801sizeof(struct mxt_object),802GFP_KERNEL);803if (!data->object_table) {804dev_err(&client->dev, "Failed to allocate memory\n");805return -ENOMEM;806}807808/* Get object table information */809error = mxt_get_object_table(data);810if (error)811return error;812813/* Check register init values */814error = mxt_check_reg_init(data);815if (error)816return error;817818mxt_handle_pdata(data);819820/* Backup to memory */821mxt_write_object(data, MXT_GEN_COMMAND,822MXT_COMMAND_BACKUPNV,823MXT_BACKUP_VALUE);824msleep(MXT_BACKUP_TIME);825826/* Soft reset */827mxt_write_object(data, MXT_GEN_COMMAND,828MXT_COMMAND_RESET, 1);829msleep(MXT_RESET_TIME);830831/* Update matrix size at info struct */832error = mxt_read_reg(client, MXT_MATRIX_X_SIZE, &val);833if (error)834return error;835info->matrix_xsize = val;836837error = mxt_read_reg(client, MXT_MATRIX_Y_SIZE, &val);838if (error)839return error;840info->matrix_ysize = val;841842dev_info(&client->dev,843"Family ID: %d Variant ID: %d Version: %d Build: %d\n",844info->family_id, info->variant_id, info->version,845info->build);846847dev_info(&client->dev,848"Matrix X Size: %d Matrix Y Size: %d Object Num: %d\n",849info->matrix_xsize, info->matrix_ysize,850info->object_num);851852return 0;853}854855static void mxt_calc_resolution(struct mxt_data *data)856{857unsigned int max_x = data->pdata->x_size - 1;858unsigned int max_y = data->pdata->y_size - 1;859860if (data->pdata->orient & MXT_XY_SWITCH) {861data->max_x = max_y;862data->max_y = max_x;863} else {864data->max_x = max_x;865data->max_y = max_y;866}867}868869static ssize_t mxt_object_show(struct device *dev,870struct device_attribute *attr, char *buf)871{872struct mxt_data *data = dev_get_drvdata(dev);873struct mxt_object *object;874int count = 0;875int i, j;876int error;877u8 val;878879for (i = 0; i < data->info.object_num; i++) {880object = data->object_table + i;881882count += sprintf(buf + count,883"Object Table Element %d(Type %d)\n",884i + 1, object->type);885886if (!mxt_object_readable(object->type)) {887count += sprintf(buf + count, "\n");888continue;889}890891for (j = 0; j < object->size + 1; j++) {892error = mxt_read_object(data,893object->type, j, &val);894if (error)895return error;896897count += sprintf(buf + count,898" Byte %d: 0x%x (%d)\n", j, val, val);899}900901count += sprintf(buf + count, "\n");902}903904return count;905}906907static int mxt_load_fw(struct device *dev, const char *fn)908{909struct mxt_data *data = dev_get_drvdata(dev);910struct i2c_client *client = data->client;911const struct firmware *fw = NULL;912unsigned int frame_size;913unsigned int pos = 0;914int ret;915916ret = request_firmware(&fw, fn, dev);917if (ret) {918dev_err(dev, "Unable to open firmware %s\n", fn);919return ret;920}921922/* Change to the bootloader mode */923mxt_write_object(data, MXT_GEN_COMMAND,924MXT_COMMAND_RESET, MXT_BOOT_VALUE);925msleep(MXT_RESET_TIME);926927/* Change to slave address of bootloader */928if (client->addr == MXT_APP_LOW)929client->addr = MXT_BOOT_LOW;930else931client->addr = MXT_BOOT_HIGH;932933ret = mxt_check_bootloader(client, MXT_WAITING_BOOTLOAD_CMD);934if (ret)935goto out;936937/* Unlock bootloader */938mxt_unlock_bootloader(client);939940while (pos < fw->size) {941ret = mxt_check_bootloader(client,942MXT_WAITING_FRAME_DATA);943if (ret)944goto out;945946frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1));947948/* We should add 2 at frame size as the the firmware data is not949* included the CRC bytes.950*/951frame_size += 2;952953/* Write one frame to device */954mxt_fw_write(client, fw->data + pos, frame_size);955956ret = mxt_check_bootloader(client,957MXT_FRAME_CRC_PASS);958if (ret)959goto out;960961pos += frame_size;962963dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, fw->size);964}965966out:967release_firmware(fw);968969/* Change to slave address of application */970if (client->addr == MXT_BOOT_LOW)971client->addr = MXT_APP_LOW;972else973client->addr = MXT_APP_HIGH;974975return ret;976}977978static ssize_t mxt_update_fw_store(struct device *dev,979struct device_attribute *attr,980const char *buf, size_t count)981{982struct mxt_data *data = dev_get_drvdata(dev);983int error;984985disable_irq(data->irq);986987error = mxt_load_fw(dev, MXT_FW_NAME);988if (error) {989dev_err(dev, "The firmware update failed(%d)\n", error);990count = error;991} else {992dev_dbg(dev, "The firmware update succeeded\n");993994/* Wait for reset */995msleep(MXT_FWRESET_TIME);996997kfree(data->object_table);998data->object_table = NULL;9991000mxt_initialize(data);1001}10021003enable_irq(data->irq);10041005error = mxt_make_highchg(data);1006if (error)1007return error;10081009return count;1010}10111012static DEVICE_ATTR(object, 0444, mxt_object_show, NULL);1013static DEVICE_ATTR(update_fw, 0664, NULL, mxt_update_fw_store);10141015static struct attribute *mxt_attrs[] = {1016&dev_attr_object.attr,1017&dev_attr_update_fw.attr,1018NULL1019};10201021static const struct attribute_group mxt_attr_group = {1022.attrs = mxt_attrs,1023};10241025static void mxt_start(struct mxt_data *data)1026{1027/* Touch enable */1028mxt_write_object(data,1029MXT_TOUCH_MULTI, MXT_TOUCH_CTRL, 0x83);1030}10311032static void mxt_stop(struct mxt_data *data)1033{1034/* Touch disable */1035mxt_write_object(data,1036MXT_TOUCH_MULTI, MXT_TOUCH_CTRL, 0);1037}10381039static int mxt_input_open(struct input_dev *dev)1040{1041struct mxt_data *data = input_get_drvdata(dev);10421043mxt_start(data);10441045return 0;1046}10471048static void mxt_input_close(struct input_dev *dev)1049{1050struct mxt_data *data = input_get_drvdata(dev);10511052mxt_stop(data);1053}10541055static int __devinit mxt_probe(struct i2c_client *client,1056const struct i2c_device_id *id)1057{1058const struct mxt_platform_data *pdata = client->dev.platform_data;1059struct mxt_data *data;1060struct input_dev *input_dev;1061int error;10621063if (!pdata)1064return -EINVAL;10651066data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);1067input_dev = input_allocate_device();1068if (!data || !input_dev) {1069dev_err(&client->dev, "Failed to allocate memory\n");1070error = -ENOMEM;1071goto err_free_mem;1072}10731074input_dev->name = "Atmel maXTouch Touchscreen";1075input_dev->id.bustype = BUS_I2C;1076input_dev->dev.parent = &client->dev;1077input_dev->open = mxt_input_open;1078input_dev->close = mxt_input_close;10791080data->client = client;1081data->input_dev = input_dev;1082data->pdata = pdata;1083data->irq = client->irq;10841085mxt_calc_resolution(data);10861087__set_bit(EV_ABS, input_dev->evbit);1088__set_bit(EV_KEY, input_dev->evbit);1089__set_bit(BTN_TOUCH, input_dev->keybit);10901091/* For single touch */1092input_set_abs_params(input_dev, ABS_X,10930, data->max_x, 0, 0);1094input_set_abs_params(input_dev, ABS_Y,10950, data->max_y, 0, 0);10961097/* For multi touch */1098input_mt_init_slots(input_dev, MXT_MAX_FINGER);1099input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,11000, MXT_MAX_AREA, 0, 0);1101input_set_abs_params(input_dev, ABS_MT_POSITION_X,11020, data->max_x, 0, 0);1103input_set_abs_params(input_dev, ABS_MT_POSITION_Y,11040, data->max_y, 0, 0);11051106input_set_drvdata(input_dev, data);1107i2c_set_clientdata(client, data);11081109error = mxt_initialize(data);1110if (error)1111goto err_free_object;11121113error = request_threaded_irq(client->irq, NULL, mxt_interrupt,1114pdata->irqflags, client->dev.driver->name, data);1115if (error) {1116dev_err(&client->dev, "Failed to register interrupt\n");1117goto err_free_object;1118}11191120error = mxt_make_highchg(data);1121if (error)1122goto err_free_irq;11231124error = input_register_device(input_dev);1125if (error)1126goto err_free_irq;11271128error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group);1129if (error)1130goto err_unregister_device;11311132return 0;11331134err_unregister_device:1135input_unregister_device(input_dev);1136input_dev = NULL;1137err_free_irq:1138free_irq(client->irq, data);1139err_free_object:1140kfree(data->object_table);1141err_free_mem:1142input_free_device(input_dev);1143kfree(data);1144return error;1145}11461147static int __devexit mxt_remove(struct i2c_client *client)1148{1149struct mxt_data *data = i2c_get_clientdata(client);11501151sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);1152free_irq(data->irq, data);1153input_unregister_device(data->input_dev);1154kfree(data->object_table);1155kfree(data);11561157return 0;1158}11591160#ifdef CONFIG_PM1161static int mxt_suspend(struct device *dev)1162{1163struct i2c_client *client = to_i2c_client(dev);1164struct mxt_data *data = i2c_get_clientdata(client);1165struct input_dev *input_dev = data->input_dev;11661167mutex_lock(&input_dev->mutex);11681169if (input_dev->users)1170mxt_stop(data);11711172mutex_unlock(&input_dev->mutex);11731174return 0;1175}11761177static int mxt_resume(struct device *dev)1178{1179struct i2c_client *client = to_i2c_client(dev);1180struct mxt_data *data = i2c_get_clientdata(client);1181struct input_dev *input_dev = data->input_dev;11821183/* Soft reset */1184mxt_write_object(data, MXT_GEN_COMMAND,1185MXT_COMMAND_RESET, 1);11861187msleep(MXT_RESET_TIME);11881189mutex_lock(&input_dev->mutex);11901191if (input_dev->users)1192mxt_start(data);11931194mutex_unlock(&input_dev->mutex);11951196return 0;1197}11981199static const struct dev_pm_ops mxt_pm_ops = {1200.suspend = mxt_suspend,1201.resume = mxt_resume,1202};1203#endif12041205static const struct i2c_device_id mxt_id[] = {1206{ "qt602240_ts", 0 },1207{ "atmel_mxt_ts", 0 },1208{ "mXT224", 0 },1209{ }1210};1211MODULE_DEVICE_TABLE(i2c, mxt_id);12121213static struct i2c_driver mxt_driver = {1214.driver = {1215.name = "atmel_mxt_ts",1216.owner = THIS_MODULE,1217#ifdef CONFIG_PM1218.pm = &mxt_pm_ops,1219#endif1220},1221.probe = mxt_probe,1222.remove = __devexit_p(mxt_remove),1223.id_table = mxt_id,1224};12251226static int __init mxt_init(void)1227{1228return i2c_add_driver(&mxt_driver);1229}12301231static void __exit mxt_exit(void)1232{1233i2c_del_driver(&mxt_driver);1234}12351236module_init(mxt_init);1237module_exit(mxt_exit);12381239/* Module information */1240MODULE_AUTHOR("Joonyoung Shim <[email protected]>");1241MODULE_DESCRIPTION("Atmel maXTouch Touchscreen driver");1242MODULE_LICENSE("GPL");124312441245