From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933106AbcLIKbR (ORCPT ); Fri, 9 Dec 2016 05:31:17 -0500 Received: from mail-wj0-f194.google.com ([209.85.210.194]:34876 "EHLO mail-wj0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933022AbcLIKbP (ORCPT ); Fri, 9 Dec 2016 05:31:15 -0500 From: Marcus Folkesson To: Lee Jones Cc: linux-kernel@vger.kernel.org, Marcus Folkesson Subject: [PATCH] mfd: mc13xxx-spi: make SPI buffers DMA-safe Date: Fri, 9 Dec 2016 11:24:58 +0100 Message-Id: <20161209102458.30696-1-marcus.folkesson@gmail.com> X-Mailer: git-send-email 2.11.0.rc2 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Marcus Folkesson --- drivers/mfd/mc13xxx-spi.c | 14 +++++++------- drivers/mfd/mc13xxx.h | 4 ++++ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/mfd/mc13xxx-spi.c b/drivers/mfd/mc13xxx-spi.c index cbc1e5ed599c..f6bfbee9d9ef 100644 --- a/drivers/mfd/mc13xxx-spi.c +++ b/drivers/mfd/mc13xxx-spi.c @@ -63,14 +63,13 @@ static const struct regmap_config mc13xxx_regmap_spi_config = { static int mc13xxx_spi_read(void *context, const void *reg, size_t reg_size, void *val, size_t val_size) { - unsigned char w[4] = { *((unsigned char *) reg), 0, 0, 0}; - unsigned char r[4]; unsigned char *p = val; struct device *dev = context; struct spi_device *spi = to_spi_device(dev); + struct mc13xxx *mc13xxx = dev_get_drvdata(dev); struct spi_transfer t = { - .tx_buf = w, - .rx_buf = r, + .tx_buf = mc13xxx->wbuf, + .rx_buf = mc13xxx->rbuf, .len = 4, }; @@ -80,11 +79,12 @@ static int mc13xxx_spi_read(void *context, const void *reg, size_t reg_size, if (val_size != 3 || reg_size != 1) return -ENOTSUPP; + mc13xxx->wbuf[0] = *(unsigned char *)reg; spi_message_init(&m); spi_message_add_tail(&t, &m); ret = spi_sync(spi, &m); - memcpy(p, &r[1], 3); + memcpy(p, &mc13xxx->rbuf[1], 3); return ret; } @@ -100,9 +100,9 @@ static int mc13xxx_spi_write(void *context, const void *data, size_t count) /* include errata fix for spi audio problems */ if (*reg == MC13783_AUDIO_CODEC || *reg == MC13783_AUDIO_DAC) - spi_write(spi, data, count); + spi_write_then_read(spi, data, count, NULL, 0); - return spi_write(spi, data, count); + return spi_write_then_read(spi, data, count, NULL, 0); } /* diff --git a/drivers/mfd/mc13xxx.h b/drivers/mfd/mc13xxx.h index 33677d1dcf66..1b35632e1d7e 100644 --- a/drivers/mfd/mc13xxx.h +++ b/drivers/mfd/mc13xxx.h @@ -44,6 +44,10 @@ struct mc13xxx { int flags; int adcflags; +#ifdef CONFIG_MFD_MC13XXX_SPI + unsigned char wbuf[4] ____cacheline_aligned; + unsigned char rbuf[4]; +#endif }; int mc13xxx_common_init(struct device *dev); -- 2.11.0.rc2