diff options
| -rw-r--r-- | drivers/input/touchscreen/cyttsp4_core.h | 12 | ||||
| -rw-r--r-- | drivers/input/touchscreen/cyttsp4_spi.c | 20 | ||||
| -rw-r--r-- | drivers/input/touchscreen/cyttsp_core.h | 8 | ||||
| -rw-r--r-- | drivers/input/touchscreen/cyttsp_i2c_common.c | 30 | ||||
| -rw-r--r-- | drivers/input/touchscreen/cyttsp_spi.c | 6 |
5 files changed, 44 insertions, 32 deletions
diff --git a/drivers/input/touchscreen/cyttsp4_core.h b/drivers/input/touchscreen/cyttsp4_core.h index 86a254354136..8e0d4d490b20 100644 --- a/drivers/input/touchscreen/cyttsp4_core.h +++ b/drivers/input/touchscreen/cyttsp4_core.h | |||
| @@ -369,9 +369,9 @@ struct cyttsp4 { | |||
| 369 | 369 | ||
| 370 | struct cyttsp4_bus_ops { | 370 | struct cyttsp4_bus_ops { |
| 371 | u16 bustype; | 371 | u16 bustype; |
| 372 | int (*write)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length, | 372 | int (*write)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length, |
| 373 | const void *values); | 373 | const void *values); |
| 374 | int (*read)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length, | 374 | int (*read)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length, |
| 375 | void *values); | 375 | void *values); |
| 376 | }; | 376 | }; |
| 377 | 377 | ||
| @@ -448,13 +448,13 @@ enum cyttsp4_event_id { | |||
| 448 | /* y-axis, 0:origin is on top side of panel, 1: bottom */ | 448 | /* y-axis, 0:origin is on top side of panel, 1: bottom */ |
| 449 | #define CY_PCFG_ORIGIN_Y_MASK 0x80 | 449 | #define CY_PCFG_ORIGIN_Y_MASK 0x80 |
| 450 | 450 | ||
| 451 | static inline int cyttsp4_adap_read(struct cyttsp4 *ts, u8 addr, int size, | 451 | static inline int cyttsp4_adap_read(struct cyttsp4 *ts, u16 addr, int size, |
| 452 | void *buf) | 452 | void *buf) |
| 453 | { | 453 | { |
| 454 | return ts->bus_ops->read(ts->dev, ts->xfer_buf, addr, size, buf); | 454 | return ts->bus_ops->read(ts->dev, ts->xfer_buf, addr, size, buf); |
| 455 | } | 455 | } |
| 456 | 456 | ||
| 457 | static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u8 addr, int size, | 457 | static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u16 addr, int size, |
| 458 | const void *buf) | 458 | const void *buf) |
| 459 | { | 459 | { |
| 460 | return ts->bus_ops->write(ts->dev, ts->xfer_buf, addr, size, buf); | 460 | return ts->bus_ops->write(ts->dev, ts->xfer_buf, addr, size, buf); |
| @@ -463,9 +463,9 @@ static inline int cyttsp4_adap_write(struct cyttsp4 *ts, u8 addr, int size, | |||
| 463 | extern struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops, | 463 | extern struct cyttsp4 *cyttsp4_probe(const struct cyttsp4_bus_ops *ops, |
| 464 | struct device *dev, u16 irq, size_t xfer_buf_size); | 464 | struct device *dev, u16 irq, size_t xfer_buf_size); |
| 465 | extern int cyttsp4_remove(struct cyttsp4 *ts); | 465 | extern int cyttsp4_remove(struct cyttsp4 *ts); |
| 466 | int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u8 addr, | 466 | int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u16 addr, |
| 467 | u8 length, const void *values); | 467 | u8 length, const void *values); |
| 468 | int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u8 addr, | 468 | int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u16 addr, |
| 469 | u8 length, void *values); | 469 | u8 length, void *values); |
| 470 | extern const struct dev_pm_ops cyttsp4_pm_ops; | 470 | extern const struct dev_pm_ops cyttsp4_pm_ops; |
| 471 | 471 | ||
diff --git a/drivers/input/touchscreen/cyttsp4_spi.c b/drivers/input/touchscreen/cyttsp4_spi.c index f8f891bead34..a71e1141d638 100644 --- a/drivers/input/touchscreen/cyttsp4_spi.c +++ b/drivers/input/touchscreen/cyttsp4_spi.c | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | #define CY_SPI_DATA_BUF_SIZE (CY_SPI_CMD_BYTES + CY_SPI_DATA_SIZE) | 44 | #define CY_SPI_DATA_BUF_SIZE (CY_SPI_CMD_BYTES + CY_SPI_DATA_SIZE) |
| 45 | 45 | ||
| 46 | static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf, | 46 | static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf, |
| 47 | u8 op, u8 reg, u8 *buf, int length) | 47 | u8 op, u16 reg, u8 *buf, int length) |
| 48 | { | 48 | { |
| 49 | struct spi_device *spi = to_spi_device(dev); | 49 | struct spi_device *spi = to_spi_device(dev); |
| 50 | struct spi_message msg; | 50 | struct spi_message msg; |
| @@ -63,14 +63,12 @@ static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf, | |||
| 63 | memset(wr_buf, 0, CY_SPI_DATA_BUF_SIZE); | 63 | memset(wr_buf, 0, CY_SPI_DATA_BUF_SIZE); |
| 64 | memset(rd_buf, 0, CY_SPI_CMD_BYTES); | 64 | memset(rd_buf, 0, CY_SPI_CMD_BYTES); |
| 65 | 65 | ||
| 66 | if (reg > 255) | 66 | wr_buf[0] = op + (((reg >> 8) & 0x1) ? CY_SPI_A8_BIT : 0); |
| 67 | wr_buf[0] = op + CY_SPI_A8_BIT; | 67 | if (op == CY_SPI_WR_OP) { |
| 68 | else | 68 | wr_buf[1] = reg & 0xFF; |
| 69 | wr_buf[0] = op; | 69 | if (length > 0) |
| 70 | if (op == CY_SPI_WR_OP) | 70 | memcpy(wr_buf + CY_SPI_CMD_BYTES, buf, length); |
| 71 | wr_buf[1] = reg % 256; | 71 | } |
| 72 | if (op == CY_SPI_WR_OP && length > 0) | ||
| 73 | memcpy(wr_buf + CY_SPI_CMD_BYTES, buf, length); | ||
| 74 | 72 | ||
| 75 | memset(xfer, 0, sizeof(xfer)); | 73 | memset(xfer, 0, sizeof(xfer)); |
| 76 | spi_message_init(&msg); | 74 | spi_message_init(&msg); |
| @@ -130,7 +128,7 @@ static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf, | |||
| 130 | } | 128 | } |
| 131 | 129 | ||
| 132 | static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf, | 130 | static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf, |
| 133 | u8 addr, u8 length, void *data) | 131 | u16 addr, u8 length, void *data) |
| 134 | { | 132 | { |
| 135 | int rc; | 133 | int rc; |
| 136 | 134 | ||
| @@ -143,7 +141,7 @@ static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf, | |||
| 143 | } | 141 | } |
| 144 | 142 | ||
| 145 | static int cyttsp_spi_write_block_data(struct device *dev, u8 *xfer_buf, | 143 | static int cyttsp_spi_write_block_data(struct device *dev, u8 *xfer_buf, |
| 146 | u8 addr, u8 length, const void *data) | 144 | u16 addr, u8 length, const void *data) |
| 147 | { | 145 | { |
| 148 | return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_WR_OP, addr, (void *)data, | 146 | return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_WR_OP, addr, (void *)data, |
| 149 | length); | 147 | length); |
diff --git a/drivers/input/touchscreen/cyttsp_core.h b/drivers/input/touchscreen/cyttsp_core.h index 0cf564a79fb5..07074110a902 100644 --- a/drivers/input/touchscreen/cyttsp_core.h +++ b/drivers/input/touchscreen/cyttsp_core.h | |||
| @@ -112,9 +112,9 @@ struct cyttsp; | |||
| 112 | 112 | ||
| 113 | struct cyttsp_bus_ops { | 113 | struct cyttsp_bus_ops { |
| 114 | u16 bustype; | 114 | u16 bustype; |
| 115 | int (*write)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length, | 115 | int (*write)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length, |
| 116 | const void *values); | 116 | const void *values); |
| 117 | int (*read)(struct device *dev, u8 *xfer_buf, u8 addr, u8 length, | 117 | int (*read)(struct device *dev, u8 *xfer_buf, u16 addr, u8 length, |
| 118 | void *values); | 118 | void *values); |
| 119 | }; | 119 | }; |
| 120 | 120 | ||
| @@ -145,9 +145,9 @@ struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, | |||
| 145 | struct device *dev, int irq, size_t xfer_buf_size); | 145 | struct device *dev, int irq, size_t xfer_buf_size); |
| 146 | void cyttsp_remove(struct cyttsp *ts); | 146 | void cyttsp_remove(struct cyttsp *ts); |
| 147 | 147 | ||
| 148 | int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u8 addr, | 148 | int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, u16 addr, |
| 149 | u8 length, const void *values); | 149 | u8 length, const void *values); |
| 150 | int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u8 addr, | 150 | int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, u16 addr, |
| 151 | u8 length, void *values); | 151 | u8 length, void *values); |
| 152 | extern const struct dev_pm_ops cyttsp_pm_ops; | 152 | extern const struct dev_pm_ops cyttsp_pm_ops; |
| 153 | 153 | ||
diff --git a/drivers/input/touchscreen/cyttsp_i2c_common.c b/drivers/input/touchscreen/cyttsp_i2c_common.c index 07c553fbcef2..1d7b6f154168 100644 --- a/drivers/input/touchscreen/cyttsp_i2c_common.c +++ b/drivers/input/touchscreen/cyttsp_i2c_common.c | |||
| @@ -32,18 +32,20 @@ | |||
| 32 | #include <linux/types.h> | 32 | #include <linux/types.h> |
| 33 | 33 | ||
| 34 | int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, | 34 | int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, |
| 35 | u8 addr, u8 length, void *values) | 35 | u16 addr, u8 length, void *values) |
| 36 | { | 36 | { |
| 37 | struct i2c_client *client = to_i2c_client(dev); | 37 | struct i2c_client *client = to_i2c_client(dev); |
| 38 | u8 client_addr = client->addr | ((addr >> 8) & 0x1); | ||
| 39 | u8 addr_lo = addr & 0xFF; | ||
| 38 | struct i2c_msg msgs[] = { | 40 | struct i2c_msg msgs[] = { |
| 39 | { | 41 | { |
| 40 | .addr = client->addr, | 42 | .addr = client_addr, |
| 41 | .flags = 0, | 43 | .flags = 0, |
| 42 | .len = 1, | 44 | .len = 1, |
| 43 | .buf = &addr, | 45 | .buf = &addr_lo, |
| 44 | }, | 46 | }, |
| 45 | { | 47 | { |
| 46 | .addr = client->addr, | 48 | .addr = client_addr, |
| 47 | .flags = I2C_M_RD, | 49 | .flags = I2C_M_RD, |
| 48 | .len = length, | 50 | .len = length, |
| 49 | .buf = values, | 51 | .buf = values, |
| @@ -60,17 +62,29 @@ int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf, | |||
| 60 | EXPORT_SYMBOL_GPL(cyttsp_i2c_read_block_data); | 62 | EXPORT_SYMBOL_GPL(cyttsp_i2c_read_block_data); |
| 61 | 63 | ||
| 62 | int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, | 64 | int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf, |
| 63 | u8 addr, u8 length, const void *values) | 65 | u16 addr, u8 length, const void *values) |
| 64 | { | 66 | { |
| 65 | struct i2c_client *client = to_i2c_client(dev); | 67 | struct i2c_client *client = to_i2c_client(dev); |
| 68 | u8 client_addr = client->addr | ((addr >> 8) & 0x1); | ||
| 69 | u8 addr_lo = addr & 0xFF; | ||
| 70 | struct i2c_msg msgs[] = { | ||
| 71 | { | ||
| 72 | .addr = client_addr, | ||
| 73 | .flags = 0, | ||
| 74 | .len = length + 1, | ||
| 75 | .buf = xfer_buf, | ||
| 76 | }, | ||
| 77 | }; | ||
| 66 | int retval; | 78 | int retval; |
| 67 | 79 | ||
| 68 | xfer_buf[0] = addr; | 80 | xfer_buf[0] = addr_lo; |
| 69 | memcpy(&xfer_buf[1], values, length); | 81 | memcpy(&xfer_buf[1], values, length); |
| 70 | 82 | ||
| 71 | retval = i2c_master_send(client, xfer_buf, length + 1); | 83 | retval = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); |
| 84 | if (retval < 0) | ||
| 85 | return retval; | ||
| 72 | 86 | ||
| 73 | return retval < 0 ? retval : 0; | 87 | return retval != ARRAY_SIZE(msgs) ? -EIO : 0; |
| 74 | } | 88 | } |
| 75 | EXPORT_SYMBOL_GPL(cyttsp_i2c_write_block_data); | 89 | EXPORT_SYMBOL_GPL(cyttsp_i2c_write_block_data); |
| 76 | 90 | ||
diff --git a/drivers/input/touchscreen/cyttsp_spi.c b/drivers/input/touchscreen/cyttsp_spi.c index 1df625337b84..4728bcb1916c 100644 --- a/drivers/input/touchscreen/cyttsp_spi.c +++ b/drivers/input/touchscreen/cyttsp_spi.c | |||
| @@ -41,7 +41,7 @@ | |||
| 41 | #define CY_SPI_BITS_PER_WORD 8 | 41 | #define CY_SPI_BITS_PER_WORD 8 |
| 42 | 42 | ||
| 43 | static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf, | 43 | static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf, |
| 44 | u8 op, u8 reg, u8 *buf, int length) | 44 | u8 op, u16 reg, u8 *buf, int length) |
| 45 | { | 45 | { |
| 46 | struct spi_device *spi = to_spi_device(dev); | 46 | struct spi_device *spi = to_spi_device(dev); |
| 47 | struct spi_message msg; | 47 | struct spi_message msg; |
| @@ -126,14 +126,14 @@ static int cyttsp_spi_xfer(struct device *dev, u8 *xfer_buf, | |||
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf, | 128 | static int cyttsp_spi_read_block_data(struct device *dev, u8 *xfer_buf, |
| 129 | u8 addr, u8 length, void *data) | 129 | u16 addr, u8 length, void *data) |
| 130 | { | 130 | { |
| 131 | return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_RD_OP, addr, data, | 131 | return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_RD_OP, addr, data, |
| 132 | length); | 132 | length); |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | static int cyttsp_spi_write_block_data(struct device *dev, u8 *xfer_buf, | 135 | static int cyttsp_spi_write_block_data(struct device *dev, u8 *xfer_buf, |
| 136 | u8 addr, u8 length, const void *data) | 136 | u16 addr, u8 length, const void *data) |
| 137 | { | 137 | { |
| 138 | return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_WR_OP, addr, (void *)data, | 138 | return cyttsp_spi_xfer(dev, xfer_buf, CY_SPI_WR_OP, addr, (void *)data, |
| 139 | length); | 139 | length); |
