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; }
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; }
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; }
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; }