static int rmi4_i2c_check_device(struct i2c_client *client) { int rc = -ENXIO; struct device *dev = &client->dev; struct rmi4_i2c_driver_data *ddata = dev_get_drvdata(&client->dev); u16 addr = PDT_START_SCAN_LOCATION; u8 buf[RMI4_PACKET_SIZE]; int len = sizeof(buf); int i; if (RMI_I2C_PAGE(addr) != ddata->page) { rc = rmi4_i2c_set_page(client, RMI_I2C_PAGE(addr)); if (rc < 0) goto exit; } rc = rmi4_i2c_read(client, addr, buf, len); if (rc < 0) { dev_err(dev, "%s - check device failed with %d.\n", __func__, rc); goto exit; } for (i = 0; i < len; i++) { if (buf[i] != 0x00 && buf[i] != 0xFF) { dev_dbg(dev, "%s - Got valid response from chip.\n", __func__); rc = 0; goto exit; } } exit: return rc; }
static int rmi4_i2c_adapter_read(struct rmi4_core_device *cdev, u16 addr, u8 *buf, int len) { int retval; struct device *dev = cdev->dev.parent; struct i2c_client *client = to_i2c_client(dev); struct rmi4_i2c_driver_data *ddata = dev_get_drvdata(&client->dev); dev_dbg(dev, "%s - Called\n", __func__); mutex_lock(&ddata->page_mutex); if (RMI_I2C_PAGE(addr) != ddata->page) { retval = rmi4_i2c_adapter_set_page(cdev, RMI_I2C_PAGE(addr)); if (retval < 0) goto exit; } retval = rmi4_i2c_read(client, addr, buf, len); if (!retval) { dev_err(&client->dev, "%s: i2c set page failed: %d.", __func__, retval); goto exit; } exit: mutex_unlock(&ddata->page_mutex); return retval; }
static int rmi_i2c_read_block(struct rmi_phys_device *phys, u16 addr, u8 *buf, int len) { struct i2c_client *client = to_i2c_client(phys->dev); struct rmi_i2c_data *data = phys->data; u8 txbuf[1] = {addr & 0xff}; int retval; #if COMMS_DEBUG char debug_buf[len*3 + 1]; char *temp = debug_buf; int i, n; #endif mutex_lock(&data->page_mutex); if (RMI_I2C_PAGE(addr) != data->page) { retval = rmi_set_page(phys, RMI_I2C_PAGE(addr)); if (retval < 0) goto exit; } #if COMMS_DEBUG dev_dbg(&client->dev, "RMI4 I2C writes 1 bytes: %02x\n", txbuf[0]); #endif phys->info.tx_count++; phys->info.tx_bytes += sizeof(txbuf); retval = i2c_master_send(client, txbuf, sizeof(txbuf)); if (retval != sizeof(txbuf)) { phys->info.tx_errs++; retval = (retval < 0) ? retval : -EIO; goto exit; } retval = i2c_master_recv(client, buf, len); phys->info.rx_count++; phys->info.rx_bytes += len; if (retval < 0) phys->info.rx_errs++; #if COMMS_DEBUG else { n = 0; for (i=0; i < len; i++) { n = sprintf(temp, " %02x", buf[i]); temp += n; } dev_dbg(&client->dev, "RMI4 I2C read %d bytes at %#06x:%s\n", len, addr, debug_buf); } #endif exit: mutex_unlock(&data->page_mutex); return retval; }
static int rmi_i2c_write_block(struct rmi_phys_device *phys, u16 addr, const void *buf, const int len) { struct i2c_client *client = to_i2c_client(phys->dev); struct rmi_i2c_data *data = phys->data; int retval; int tx_size = len + 1; mutex_lock(&data->page_mutex); if (!data->tx_buf || data->tx_buf_size < tx_size) { if (data->tx_buf) devm_kfree(&client->dev, data->tx_buf); data->tx_buf_size = tx_size + BUFFER_SIZE_INCREMENT; data->tx_buf = devm_kzalloc(&client->dev, data->tx_buf_size, GFP_KERNEL); if (!data->tx_buf) { data->tx_buf_size = 0; retval = -ENOMEM; goto exit; } } data->tx_buf[0] = addr & 0xff; memcpy(data->tx_buf + 1, buf, len); if (RMI_I2C_PAGE(addr) != data->page) { retval = rmi_set_page(phys, RMI_I2C_PAGE(addr)); if (retval < 0) goto exit; } if (COMMS_DEBUG(data)) { retval = copy_to_debug_buf(&client->dev, data, (u8 *) buf, len); if (!retval) dev_dbg(&client->dev, "writes %d bytes at %#06x:%s\n", len, addr, data->debug_buf); } phys->info.tx_count++; phys->info.tx_bytes += tx_size; retval = i2c_master_send(client, data->tx_buf, tx_size); if (retval < 0) phys->info.tx_errs++; else retval--; /* don't count the address byte */ exit: mutex_unlock(&data->page_mutex); return retval; }
int rmi_i2c_read_block(struct rmi_phys_device *phys, u16 addr, u8 *buf, int len) { struct i2c_client *client = to_i2c_client(phys->dev); struct rmi_i2c_data *data = phys->data; u8 txbuf[1] = {addr & 0xff}; int retval; #if COMMS_DEBUG int i; #endif mutex_lock(&data->page_mutex); if (RMI_I2C_PAGE(addr) != data->page) { retval = rmi_set_page(phys, RMI_I2C_PAGE(addr)); if (retval < 0) goto exit; } #if COMMS_DEBUG dev_dbg(&client->dev, "RMI4 I2C writes 1 bytes: %02x\n", txbuf[0]); #endif phys->info.tx_count++; phys->info.tx_bytes += sizeof(txbuf); retval = i2c_master_normal_send(client, txbuf, sizeof(txbuf), CONFIG_RMI4_I2C_SCL_RATE); if (retval != sizeof(txbuf)) { phys->info.tx_errs++; retval = (retval < 0) ? retval : -EIO; goto exit; } retval = i2c_master_normal_recv(client, buf, len, CONFIG_RMI4_I2C_SCL_RATE); phys->info.rx_count++; phys->info.rx_bytes += len; if (retval < 0) phys->info.rx_errs++; #if COMMS_DEBUG else { dev_dbg(&client->dev, "RMI4 I2C received %d bytes: ", len); for (i = 0; i < len; i++) dev_dbg(&client->dev, "%02x ", buf[i]); dev_dbg(&client->dev, "\n"); } #endif exit: mutex_unlock(&data->page_mutex); return retval; }
static int rmi4_i2c_read(struct i2c_client *client, u16 addr, u8 *buf, int len) { int retval; u8 *txbuf = NULL; /* Only need address, no data */ int txlen = 0; dev_dbg(&client->dev, "%s - called\n", __func__); retval = rmi4_i2c_write(client, addr, txbuf, txlen); if (!retval) { dev_err(&client->dev, "%s: i2c read (write) failed: %d.", __func__, retval); goto exit; } retval = rmi4_i2c_do_read(client, buf, len); if (retval < 0) dev_err(&client->dev, "%s: i2c read failed: %d.", __func__, retval); rmi4_i2c_buf_debug(client, "read", addr, buf, len, RMI_I2C_PAGE(addr)); exit: return retval; }
static int rmi4_i2c_write(struct i2c_client *client, u16 addr, u8 *buf, int len) { int retval; u8 txbuf[len + 1]; int txlen = sizeof(txbuf); dev_dbg(&client->dev, "%s - called\n", __func__); txbuf[0] = addr & 0xff; memcpy(txbuf + 1, buf, len); rmi4_i2c_buf_debug(client, "write", addr, txbuf, txlen, RMI_I2C_PAGE(addr)); retval = rmi4_i2c_do_write(client, txbuf, txlen); if (retval < 0) { dev_err(&client->dev, "%s: i2c write failed: %d.", __func__, retval); goto exit; } if (retval != txlen) { dev_err(&client->dev, "%s: i2c write failed, txbuf size: %d.", __func__, retval); retval = -ENXIO; } exit: return retval; }
static int rmi_i2c_read_block(struct rmi_phys_device *phys, u16 addr, void *buf, const int len) { struct i2c_client *client = to_i2c_client(phys->dev); struct rmi_i2c_data *data = phys->data; u8 txbuf[1] = {addr & 0xff}; int retval; mutex_lock(&data->page_mutex); if (RMI_I2C_PAGE(addr) != data->page) { retval = rmi_set_page(phys, RMI_I2C_PAGE(addr)); if (retval < 0) goto exit; } if (COMMS_DEBUG(data)) dev_dbg(&client->dev, "writes 1 bytes: %02x\n", txbuf[0]); phys->info.tx_count++; phys->info.tx_bytes += sizeof(txbuf); retval = i2c_master_send(client, txbuf, sizeof(txbuf)); if (retval != sizeof(txbuf)) { phys->info.tx_errs++; retval = (retval < 0) ? retval : -EIO; goto exit; } retval = i2c_master_recv(client, (u8 *) buf, len); phys->info.rx_count++; phys->info.rx_bytes += len; if (retval < 0) phys->info.rx_errs++; else if (COMMS_DEBUG(data)) { retval = copy_to_debug_buf(&client->dev, data, (u8 *) buf, len); if (!retval) dev_dbg(&client->dev, "read %d bytes at %#06x:%s\n", len, addr, data->debug_buf); } exit: mutex_unlock(&data->page_mutex); return retval; }
static int rmi_i2c_write_block(struct rmi_phys_device *phys, u16 addr, u8 *buf, int len) { struct i2c_client *client = to_i2c_client(phys->dev); struct rmi_i2c_data *data = phys->data; u8 txbuf[len + 1]; int retval; #if COMMS_DEBUG char debug_buf[len*3 + 1]; int i, n; #endif txbuf[0] = addr & 0xff; memcpy(txbuf + 1, buf, len); mutex_lock(&data->page_mutex); if (RMI_I2C_PAGE(addr) != data->page) { retval = rmi_set_page(phys, RMI_I2C_PAGE(addr)); if (retval < 0) goto exit; } #if COMMS_DEBUG n = 0; for (i=0; i < len; i++) n = snprintf(debug_buf+n, 4, "%02x ", buf[i]); dev_dbg(&client->dev, "RMI4 I2C writes %d bytes at %#06x: %s\n", len, addr, debug_buf); #endif phys->info.tx_count++; phys->info.tx_bytes += sizeof(txbuf); retval = i2c_master_send(client, txbuf, sizeof(txbuf)); if (retval < 0) phys->info.tx_errs++; else retval--; /* don't count the address byte */ exit: mutex_unlock(&data->page_mutex); return retval; }
int rmi_i2c_write_block(struct rmi_phys_device *phys, u16 addr, u8 *buf, int len) { struct i2c_client *client = to_i2c_client(phys->dev); struct rmi_i2c_data *data = phys->data; u8 txbuf[len + 1]; int retval; #if COMMS_DEBUG int i; #endif txbuf[0] = addr & 0xff; memcpy(txbuf + 1, buf, len); mutex_lock(&data->page_mutex); if (RMI_I2C_PAGE(addr) != data->page) { retval = rmi_set_page(phys, RMI_I2C_PAGE(addr)); if (retval < 0) goto exit; } #if COMMS_DEBUG dev_dbg(&client->dev, "RMI4 I2C writes %d bytes: ", sizeof(txbuf)); for (i = 0; i < sizeof(txbuf); i++) dev_dbg(&client->dev, "%02x ", txbuf[i]); dev_dbg(&client->dev, "\n"); #endif phys->info.tx_count++; phys->info.tx_bytes += sizeof(txbuf); retval = i2c_master_normal_send(client, txbuf, sizeof(txbuf), CONFIG_RMI4_I2C_SCL_RATE); if (retval < 0) phys->info.tx_errs++; else retval--; /* don't count the address byte */ exit: mutex_unlock(&data->page_mutex); return retval; }