19664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit/* 29664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * cyttsp_i2c_common.c 39664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * Cypress TrueTouch(TM) Standard Product (TTSP) I2C touchscreen driver. 49664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * For use with Cypress Txx3xx and Txx4xx parts. 59664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * Supported parts include: 69664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * CY8CTST341 79664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * CY8CTMA340 89664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * TMA4XX 99664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * TMA1036 109664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * 119664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * Copyright (C) 2009, 2010, 2011 Cypress Semiconductor, Inc. 129664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * Copyright (C) 2012 Javier Martinez Canillas <javier@dowhile0.org> 139664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * 149664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * This program is free software; you can redistribute it and/or 159664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * modify it under the terms of the GNU General Public License 169664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * version 2, and only version 2, as published by the 179664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * Free Software Foundation. 189664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * 199664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * This program is distributed in the hope that it will be useful, 209664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * but WITHOUT ANY WARRANTY; without even the implied warranty of 219664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 229664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * GNU General Public License for more details. 239664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * 249664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * Contact Cypress Semiconductor at www.cypress.com <ttdrivers@cypress.com> 259664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit * 269664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit */ 279664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 289664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit#include <linux/device.h> 299664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit#include <linux/export.h> 309664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit#include <linux/i2c.h> 319664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit#include <linux/module.h> 329664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit#include <linux/types.h> 339664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 349222d8069d3812400b346ebd5fea47b8b88c7cbfRashika Kheria#include "cyttsp4_core.h" 359222d8069d3812400b346ebd5fea47b8b88c7cbfRashika Kheria 369664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigitint cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, 3762f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit u16 addr, u8 length, void *values) 389664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit{ 399664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit struct i2c_client *client = to_i2c_client(dev); 4062f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit u8 client_addr = client->addr | ((addr >> 8) & 0x1); 4162f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit u8 addr_lo = addr & 0xFF; 429664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit struct i2c_msg msgs[] = { 439664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit { 4462f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit .addr = client_addr, 459664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit .flags = 0, 469664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit .len = 1, 4762f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit .buf = &addr_lo, 489664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit }, 499664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit { 5062f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit .addr = client_addr, 519664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit .flags = I2C_M_RD, 529664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit .len = length, 539664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit .buf = values, 549664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit }, 559664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit }; 569664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit int retval; 579664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 589664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit retval = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 599664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit if (retval < 0) 609664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit return retval; 619664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 629664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit return retval != ARRAY_SIZE(msgs) ? -EIO : 0; 639664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit} 649664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh YigitEXPORT_SYMBOL_GPL(cyttsp_i2c_read_block_data); 659664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 669664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigitint cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, 6762f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit u16 addr, u8 length, const void *values) 689664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit{ 699664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit struct i2c_client *client = to_i2c_client(dev); 7062f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit u8 client_addr = client->addr | ((addr >> 8) & 0x1); 7162f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit u8 addr_lo = addr & 0xFF; 7262f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit struct i2c_msg msgs[] = { 7362f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit { 7462f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit .addr = client_addr, 7562f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit .flags = 0, 7662f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit .len = length + 1, 7762f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit .buf = xfer_buf, 7862f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit }, 7962f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit }; 809664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit int retval; 819664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 8262f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit xfer_buf[0] = addr_lo; 839664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit memcpy(&xfer_buf[1], values, length); 849664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 8562f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit retval = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); 8662f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit if (retval < 0) 8762f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit return retval; 889664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 8962f548d0c2d2418e39b8e4b7ec39b5ca2ef4380dFerruh Yigit return retval != ARRAY_SIZE(msgs) ? -EIO : 0; 909664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit} 919664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh YigitEXPORT_SYMBOL_GPL(cyttsp_i2c_write_block_data); 929664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 939664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh Yigit 949664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh YigitMODULE_LICENSE("GPL"); 959664877ed8956b81feb3bd6b3b2621b5fcdb624fFerruh YigitMODULE_AUTHOR("Cypress"); 96