From: Jonathan Cameron <jic23@cam.ac.uk>
To: Alexander Stein <alexander.stein@systec-electronic.com>
Cc: Michael Hennerich <Michael.Hennerich@analog.com>,
"linux-input@vger.kernel.org" <linux-input@vger.kernel.org>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
Anatolij Gustschin <agust@denx.de>
Subject: Re: [PATCH 1/2] ads7846: Make buffers in ads7846_read12_ser and ads7845_read12_ser DMA save
Date: Wed, 04 May 2011 16:49:56 +0100 [thread overview]
Message-ID: <4DC175A4.6060401@cam.ac.uk> (raw)
In-Reply-To: <1304522525-27351-1-git-send-email-alexander.stein@systec-electronic.com>
On 05/04/11 16:22, Alexander Stein wrote:
> req.sample needs its own cacheline otherwise accessing req.msg fetches
> it in again.
> Put req onto stack as it doesn't need to be DMA save.
> req.sample is kzalloced itself for DMA access.
> req.command doesn't need own cache line because it will only be written to
> memory on dma_map_single. req.scratch is unsed at all.
>
> Note: This effect doesn't occur if the underlying SPI driver doesn't use
> DMA at all.
>
How about using ____cacheline_aligned having moved 'sample' to the end of the
structure?
e.g.
...
struct spi_transfer xfer[6];
__be16 sample ____cacheline_aligned;
}
Rather smaller patch when you get down to it.
> Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
> ---
> Anatolij,
>
> could you please check the ads7845 parts?
> Thanks!
>
> drivers/input/touchscreen/ads7846.c | 92 ++++++++++++++++++-----------------
> 1 files changed, 48 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
> index c24946f..6157a80 100644
> --- a/drivers/input/touchscreen/ads7846.c
> +++ b/drivers/input/touchscreen/ads7846.c
> @@ -281,7 +281,7 @@ struct ser_req {
> u8 command;
> u8 ref_off;
> u16 scratch;
> - __be16 sample;
> + __be16 *sample;
> struct spi_message msg;
> struct spi_transfer xfer[6];
> };
> @@ -289,7 +289,7 @@ struct ser_req {
> struct ads7845_ser_req {
> u8 command[3];
> u8 pwrdown[3];
> - u8 sample[3];
> + u8 *sample;
> struct spi_message msg;
> struct spi_transfer xfer[2];
> };
> @@ -298,71 +298,73 @@ 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;
> + struct ser_req req;
> int status;
> int use_internal;
>
> - req = kzalloc(sizeof *req, GFP_KERNEL);
> - if (!req)
> + memset(&req, 0, sizeof(req));
> +
> + req.sample = kzalloc(sizeof *(req.sample), GFP_KERNEL);
> + if (!req.sample)
> return -ENOMEM;
>
> - spi_message_init(&req->msg);
> + spi_message_init(&req.msg);
>
> /* FIXME boards with ads7846 might use external vref instead ... */
> use_internal = (ts->model == 7846);
>
> /* 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.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].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);
> + 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.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.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.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);
> + 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);
>
> mutex_lock(&ts->lock);
> ads7846_stop(ts);
> - status = spi_sync(spi, &req->msg);
> + status = spi_sync(spi, &req.msg);
> ads7846_restart(ts);
> mutex_unlock(&ts->lock);
>
> if (status == 0) {
> /* on-wire is a must-ignore bit, a BE12 value, then padding */
> - status = be16_to_cpu(req->sample);
> + status = be16_to_cpu(*req.sample);
> status = status >> 3;
> status &= 0x0fff;
> }
>
> - kfree(req);
> + kfree(req.sample);
> return status;
> }
>
> @@ -370,35 +372,37 @@ static int ads7845_read12_ser(struct device *dev, unsigned command)
> {
> struct spi_device *spi = to_spi_device(dev);
> struct ads7846 *ts = dev_get_drvdata(dev);
> - struct ads7845_ser_req *req;
> + struct ads7845_ser_req req;
> int status;
>
> - req = kzalloc(sizeof *req, GFP_KERNEL);
> - if (!req)
> + memset(&req, 0, sizeof(req));
> +
> + req.sample = kzalloc(3 * sizeof *(req.sample), GFP_KERNEL);
> + if (!req.sample)
> return -ENOMEM;
>
> - spi_message_init(&req->msg);
> + spi_message_init(&req.msg);
>
> - req->command[0] = (u8) command;
> - req->xfer[0].tx_buf = req->command;
> - req->xfer[0].rx_buf = req->sample;
> - req->xfer[0].len = 3;
> - spi_message_add_tail(&req->xfer[0], &req->msg);
> + req.command[0] = (u8) command;
> + req.xfer[0].tx_buf = req.command;
> + req.xfer[0].rx_buf = req.sample;
> + req.xfer[0].len = 3;
> + spi_message_add_tail(&req.xfer[0], &req.msg);
>
> mutex_lock(&ts->lock);
> ads7846_stop(ts);
> - status = spi_sync(spi, &req->msg);
> + status = spi_sync(spi, &req.msg);
> ads7846_restart(ts);
> mutex_unlock(&ts->lock);
>
> if (status == 0) {
> /* BE12 value, then padding */
> - status = be16_to_cpu(*((u16 *)&req->sample[1]));
> + status = be16_to_cpu(*((u16 *)&req.sample[1]));
> status = status >> 3;
> status &= 0x0fff;
> }
>
> - kfree(req);
> + kfree(req.sample);
> return status;
> }
>
next prev parent reply other threads:[~2011-05-04 15:47 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-04 14:02 ads7846: ads7846_read12_ser is not DMA save Alexander Stein
2011-05-04 14:17 ` Hennerich, Michael
2011-05-04 15:22 ` [PATCH 1/2] ads7846: Make buffers in ads7846_read12_ser and ads7845_read12_ser " Alexander Stein
2011-05-04 15:49 ` Jonathan Cameron [this message]
2011-05-04 15:55 ` Jonathan Cameron
2011-05-04 15:55 ` Alexander Stein
2011-05-04 16:07 ` Jonathan Cameron
2011-05-05 1:31 ` Dmitry Torokhov
2011-05-04 15:22 ` [PATCH 2/2] ads7846: Remove unused variable from struct ads7845_ser_req Alexander Stein
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DC175A4.6060401@cam.ac.uk \
--to=jic23@cam.ac.uk \
--cc=Michael.Hennerich@analog.com \
--cc=agust@denx.de \
--cc=alexander.stein@systec-electronic.com \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).