int tsc210x_write_sync(struct tsc210x_dev *dev,
		int page, u8 address, u16 data)
{
	static struct tsc210x_spi_req req;
	static struct spi_transfer transfer[2];
	int ret;

	spi_message_init(&req.message);

	/* Address */
	req.command = (page << 11) | (address << 5);
	transfer[0].tx_buf = &req.command;
	transfer[0].rx_buf = NULL;
	transfer[0].len = 2;
	spi_message_add_tail(&transfer[0], &req.message);

	/* Data */
	transfer[1].tx_buf = &data;
	transfer[1].rx_buf = NULL;
	transfer[1].len = 2;
	transfer[1].cs_change = CS_CHANGE(1);
	spi_message_add_tail(&transfer[1], &req.message);

	ret = spi_sync(dev->spi, &req.message);
	if (!ret && req.message.status)
		ret = req.message.status;
	if (ret)
		dev_dbg(&dev->spi->dev, "write_sync --> %d\n", ret);

	return ret;
}
Exemple #2
0
static int xpt2046_read12_dfr(struct device *dev, unsigned command)
{
	struct spi_device	*spi = to_spi_device(dev);
	struct xpt2046		*ts = dev_get_drvdata(dev);
	struct dfr_req		*req = kzalloc(sizeof *req, GFP_KERNEL);
	int			status;

	if (!req)
		return -ENOMEM;

	spi_message_init(&req->msg);

	/* take sample */
	req->command = (u8) command;
	req->xfer[0].tx_buf = &req->command;
	req->xfer[0].len = 1;
	spi_message_add_tail(&req->xfer[0], &req->msg);

	req->xfer[1].rx_buf = &req->sample;
	req->xfer[1].len = 2;
	spi_message_add_tail(&req->xfer[1], &req->msg);

	/* converter in low power mode & enable PENIRQ */
	req->pwrdown= PWRDOWN;
	req->xfer[2].tx_buf = &req->pwrdown;
	req->xfer[2].len = 1;
	spi_message_add_tail(&req->xfer[2], &req->msg);

	req->xfer[3].rx_buf = &req->dummy;
	req->xfer[3].len = 2;
	CS_CHANGE(req->xfer[3]);
	spi_message_add_tail(&req->xfer[3], &req->msg);

	ts->irq_disabled = 1;
	disable_irq(spi->irq);
	status = spi_sync(spi, &req->msg);
	ts->irq_disabled = 0;
	enable_irq(spi->irq);
	
	if (status == 0) {
		/* on-wire is a must-ignore bit, a BE12 value, then padding */
		status = be16_to_cpu(req->sample);
		status = status >> 3;
		status &= 0x0fff;
		xpt2046printk("***>%s:status=%d\n",__FUNCTION__,status);
	}
static void tsc210x_request_alloc(struct tsc210x_dev *dev,
		struct tsc210x_spi_req *spi, int direction,
		int page, u8 startaddress, int numregs, u16 *data,
		void (*complete)(struct tsc210x_dev *context),
		struct spi_transfer **transfer)
{
	spi->dev = dev->spi;

	if (direction == 1)	/* Write */
		numregs = 2;
	else			/* Read */
		numregs += 1;

	spi_message_init(&spi->message);
	spi->message.complete = (void (*)(void *)) complete;
	spi->message.context = dev;

	/* Address */
	spi->command = (page << 11) | (startaddress << 5);
	if (direction != 1)
		spi->command |= 1 << 15;

	(*transfer)->tx_buf = &spi->command;
	(*transfer)->rx_buf = NULL;
	(*transfer)->len = 2;
	spi_message_add_tail((*transfer) ++, &spi->message);

	/* Data */
	while (-- numregs) {
		if (direction == 1)
			(*transfer)->tx_buf = &spi->data;
		else
			(*transfer)->rx_buf = data++;
		(*transfer)->len = 2;
		(*transfer)->cs_change = CS_CHANGE(numregs != 1);
		spi_message_add_tail((*transfer) ++, &spi->message);
	}
}
int tsc210x_reads_sync(struct tsc210x_dev *dev,
		int page, u8 startaddress, u16 *data, int numregs)
{
	static struct tsc210x_spi_req req;
	static struct spi_transfer transfer[6];
	int ret, i, j;

	if (numregs + 1 > ARRAY_SIZE(transfer))
		return -EINVAL;

	spi_message_init(&req.message);
	i = 0;
	j = 0;

	/* Address */
	req.command = 0x8000 | (page << 11) | (startaddress << 5);
	transfer[i].tx_buf = &req.command;
	transfer[i].rx_buf = NULL;
	transfer[i].len = 2;
	spi_message_add_tail(&transfer[i ++], &req.message);

	/* Data */
	while (j < numregs) {
		transfer[i].tx_buf = NULL;
		transfer[i].rx_buf = &data[j ++];
		transfer[i].len = 2;
		transfer[i].cs_change = CS_CHANGE(j == numregs);
		spi_message_add_tail(&transfer[i ++], &req.message);
	}

	ret = spi_sync(dev->spi, &req.message);
	if (!ret && req.message.status)
		ret = req.message.status;
	if (ret)
		dev_dbg(&dev->spi->dev, "reads_sync --> %d\n", ret);

	return ret;
}
Exemple #5
0
static int ak4182_read12_ser(struct device *dev, unsigned command)
{
	struct spi_device	*spi = to_spi_device(dev);
	struct ak4182		*ts = dev_get_drvdata(dev);
	struct ser_req		*req = kzalloc(sizeof *req, GFP_KERNEL);
	int			status;
	int			sample;
	int			use_internal;

	if (!req)
		return -ENOMEM;

	spi_message_init(&req->msg);

	/* FIXME boards with ak4182 might use external vref instead ... */
	use_internal = (ts->model == 4182);

	/* maybe turn on internal vREF, and let it settle */
	if (use_internal) {
		req->ref_on = REF_ON;
		req->xfer[0].tx_buf = &req->ref_on;
		req->xfer[0].len = 1;
		spi_message_add_tail(&req->xfer[0], &req->msg);

		req->xfer[1].rx_buf = &req->scratch;
		req->xfer[1].len = 2;

		/* for 1uF, settle for 800 usec; no cap, 100 usec.  */
		req->xfer[1].delay_usecs = ts->vref_delay_usecs;
		spi_message_add_tail(&req->xfer[1], &req->msg);
	}

	/* take sample */
	req->command = (u8) command;
	req->xfer[2].tx_buf = &req->command;
	req->xfer[2].len = 1;
	spi_message_add_tail(&req->xfer[2], &req->msg);
	req->xfer[3].rx_buf = &req->sample;
	
	req->xfer[3].len = 2;
	spi_message_add_tail(&req->xfer[3], &req->msg);

	/* REVISIT:  take a few more samples, and compare ... */

	/* converter in low power mode & enable PENIRQ */
	req->ref_off = PWRDOWN;
	req->xfer[4].tx_buf = &req->ref_off;
	req->xfer[4].len = 1;
	spi_message_add_tail(&req->xfer[4], &req->msg);

	req->xfer[5].rx_buf = &req->scratch;
	req->xfer[5].len = 2;
	CS_CHANGE(req->xfer[5]);
	spi_message_add_tail(&req->xfer[5], &req->msg);

	ts->irq_disabled = 1;
	disable_irq(spi->irq);
	status = spi_sync(spi, &req->msg);
	ts->irq_disabled = 0;
	enable_irq(spi->irq);

	if (req->msg.status)
		status = req->msg.status;

	/* on-wire is a must-ignore bit, a BE12 value, then padding */
	sample = be16_to_cpu(req->sample);
	sample = sample >> 3;
	sample &= 0x0fff;

	kfree(req);
	return status ? status : sample;
}
Exemple #6
0
static int ads7846_read12_ser(struct device *dev, unsigned command)
{
	struct spi_device	*spi = to_spi_device(dev);
	struct ads7846		*ts = dev_get_drvdata(dev);
	struct ser_req		*req = kzalloc(sizeof *req, GFP_KERNEL);
	int			status;
	int			use_internal;

	if (!req)
		return -ENOMEM;

	spi_message_init(&req->msg);

	
	use_internal = (ts->model == 7846);

	
	if (use_internal) {
		req->ref_on = REF_ON;
		req->xfer[0].tx_buf = &req->ref_on;
		req->xfer[0].len = 1;
		spi_message_add_tail(&req->xfer[0], &req->msg);

		req->xfer[1].rx_buf = &req->scratch;
		req->xfer[1].len = 2;

		
		req->xfer[1].delay_usecs = ts->vref_delay_usecs;
		spi_message_add_tail(&req->xfer[1], &req->msg);
	}

	
	req->command = (u8) command;
	req->xfer[2].tx_buf = &req->command;
	req->xfer[2].len = 1;
	spi_message_add_tail(&req->xfer[2], &req->msg);

	req->xfer[3].rx_buf = &req->sample;
	req->xfer[3].len = 2;
	spi_message_add_tail(&req->xfer[3], &req->msg);

	

	
	req->ref_off = PWRDOWN;
	req->xfer[4].tx_buf = &req->ref_off;
	req->xfer[4].len = 1;
	spi_message_add_tail(&req->xfer[4], &req->msg);

	req->xfer[5].rx_buf = &req->scratch;
	req->xfer[5].len = 2;
	CS_CHANGE(req->xfer[5]);
	spi_message_add_tail(&req->xfer[5], &req->msg);

	ts->irq_disabled = 1;
	disable_irq(spi->irq);
	status = spi_sync(spi, &req->msg);
	ts->irq_disabled = 0;
	enable_irq(spi->irq);

	if (status == 0) {
		
		status = be16_to_cpu(req->sample);
		status = status >> 3;
		status &= 0x0fff;
	}