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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #8
0
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;
}
Beispiel #9
0
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;
}
Beispiel #10
0
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;
}