From: Andy Shevchenko <andriy.shevchenko-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Weike Chen <alvin.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: Eric Miao <eric.y.miao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
Haojian Zhuang
<haojian.zhuang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Mika Westerberg
<mika.westerberg-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Hock Leong Kweh
<hock.leong.kweh-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Boon Leong Ong
<boon.leong.ong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Raymond Tan <raymond.tan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Subject: Re: [PATCH 1/2 v2] SPI: spi-pxa2xx: Add helpers for regiseters' accessing
Date: Mon, 29 Sep 2014 11:52:17 +0300 [thread overview]
Message-ID: <1411980737.10697.0.camel@linux.intel.com> (raw)
In-Reply-To: <1412000548-9908-2-git-send-email-alvin.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
On Mon, 2014-09-29 at 07:22 -0700, Weike Chen wrote:
I'm okay with the current version, though I have few minor comments
below.
> Introduce helper functions to access the 'SSCR0' and 'SSCR1'.
>
Like you said in the summary there are many accessors to many registers,
not only cr1/cr0. Perhaps, you may extend your commit message.
In any case
Reviewed-by: Andy Shevchenko <andriy.shevchenko-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
More comments below.
> Signed-off-by: Weike Chen <alvin.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
> drivers/spi/spi-pxa2xx.c | 108 ++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 85 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
> index 256c0ab..e7ff9c5 100644
> --- a/drivers/spi/spi-pxa2xx.c
> +++ b/drivers/spi/spi-pxa2xx.c
> @@ -80,6 +80,73 @@ static bool is_lpss_ssp(const struct driver_data *drv_data)
> return drv_data->ssp_type == LPSS_SSP;
> }
>
> +static u32 pxa2xx_spi_get_ssrc1_change_mask(const struct driver_data *drv_data)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return SSCR1_CHANGE_MASK;
> + }
> +}
> +
> +static u32
> +pxa2xx_spi_get_rx_default_thre(const struct driver_data *drv_data)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return RX_THRESH_DFLT;
> + }
> +}
> +
> +static bool pxa2xx_spi_txfifo_full(const struct driver_data *drv_data)
> +{
> + void __iomem *reg = drv_data->ioaddr;
> + u32 mask;
> +
> + switch (drv_data->ssp_type) {
> + default:
> + mask = SSSR_TFL_MASK;
> + break;
> + }
> +
> + return (read_SSSR(reg) & mask) == mask;
> +}
> +
> +static void pxa2xx_spi_clear_rx_thre(const struct driver_data *drv_data,
> + u32 *sccr1_reg)
> +{
> + u32 mask;
> +
> + switch (drv_data->ssp_type) {
> + default:
> + mask = SSCR1_RFT;
> + break;
> + }
> + *sccr1_reg &= ~mask;
> +}
> +
> +static void pxa2xx_spi_set_rx_thre(const struct driver_data *drv_data,
> + u32 *sccr1_reg, u32 threshold)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + *sccr1_reg |= SSCR1_RxTresh(threshold);
> + break;
> + }
> +}
> +
> +static u32 pxa2xx_configure_sscr0(const struct driver_data *drv_data,
> + u32 clk_div, u8 bits)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return clk_div
> + | SSCR0_Motorola
> + | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
> + | SSCR0_SSE
> + | (bits > 16 ? SSCR0_EDSS : 0);
> + }
> +}
> +
> /*
> * Read and write LPSS SSP private registers. Caller must first check that
> * is_lpss_ssp() returns true before these can be called.
> @@ -234,7 +301,7 @@ static int null_writer(struct driver_data *drv_data)
> void __iomem *reg = drv_data->ioaddr;
> u8 n_bytes = drv_data->n_bytes;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Just wondering if those two could fit one line.
> return 0;
>
> @@ -262,7 +329,7 @@ static int u8_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -289,7 +356,7 @@ static int u16_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -316,7 +383,7 @@ static int u32_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -508,8 +575,9 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
> * remaining RX bytes.
> */
> if (pxa25x_ssp_comp(drv_data)) {
> + u32 rx_thre;
>
> - sccr1_reg &= ~SSCR1_RFT;
> + pxa2xx_spi_clear_rx_thre(drv_data, &sccr1_reg);
>
> bytes_left = drv_data->rx_end - drv_data->rx;
> switch (drv_data->n_bytes) {
> @@ -519,10 +587,12 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
> bytes_left >>= 1;
> }
>
> - if (bytes_left > RX_THRESH_DFLT)
> - bytes_left = RX_THRESH_DFLT;
> + rx_thre = pxa2xx_spi_get_rx_default_thre(drv_data);
> + if (rx_thre > bytes_left)
> + rx_thre = bytes_left;
>
> - sccr1_reg |= SSCR1_RxTresh(bytes_left);
> + pxa2xx_spi_set_rx_thre(drv_data, &sccr1_reg,
> + rx_thre);
> }
> write_SSCR1(sccr1_reg, reg);
> }
> @@ -613,6 +683,7 @@ static void pump_transfers(unsigned long data)
> u32 cr1;
> u32 dma_thresh = drv_data->cur_chip->dma_threshold;
> u32 dma_burst = drv_data->cur_chip->dma_burst_size;
> + u32 change_mask = pxa2xx_spi_get_ssrc1_change_mask(drv_data);
>
> /* Get current state information */
> message = drv_data->cur_msg;
> @@ -731,11 +802,7 @@ static void pump_transfers(unsigned long data)
> "pump_transfers: DMA burst size reduced to match bits_per_word\n");
> }
>
> - cr0 = clk_div
> - | SSCR0_Motorola
> - | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
> - | SSCR0_SSE
> - | (bits > 16 ? SSCR0_EDSS : 0);
> + cr0 = pxa2xx_configure_sscr0(drv_data, clk_div, bits);
> }
>
> message->state = RUNNING_STATE;
> @@ -772,16 +839,15 @@ static void pump_transfers(unsigned long data)
> }
>
> /* see if we need to reload the config registers */
> - if ((read_SSCR0(reg) != cr0)
> - || (read_SSCR1(reg) & SSCR1_CHANGE_MASK) !=
> - (cr1 & SSCR1_CHANGE_MASK)) {
> + if ((read_SSCR0(reg) != cr0) ||
> + (read_SSCR1(reg) & change_mask) != (cr1 & change_mask)) {
>
> /* stop the SSP, and update the other bits */
> write_SSCR0(cr0 & ~SSCR0_SSE, reg);
> if (!pxa25x_ssp_comp(drv_data))
> write_SSTO(chip->timeout, reg);
> /* first set CR1 without interrupt and service enables */
> - write_SSCR1(cr1 & SSCR1_CHANGE_MASK, reg);
> + write_SSCR1(cr1 & change_mask, reg);
> /* restart the SSP */
> write_SSCR0(cr0, reg);
>
> @@ -959,12 +1025,8 @@ static int setup(struct spi_device *spi)
> clk_div = ssp_get_clk_div(drv_data, spi->max_speed_hz);
> chip->speed_hz = spi->max_speed_hz;
>
> - chip->cr0 = clk_div
> - | SSCR0_Motorola
> - | SSCR0_DataSize(spi->bits_per_word > 16 ?
> - spi->bits_per_word - 16 : spi->bits_per_word)
> - | SSCR0_SSE
> - | (spi->bits_per_word > 16 ? SSCR0_EDSS : 0);
> + chip->cr0 = pxa2xx_configure_sscr0(drv_data, clk_div,
> + spi->bits_per_word);
> chip->cr1 &= ~(SSCR1_SPO | SSCR1_SPH);
> chip->cr1 |= (((spi->mode & SPI_CPHA) != 0) ? SSCR1_SPH : 0)
> | (((spi->mode & SPI_CPOL) != 0) ? SSCR1_SPO : 0);
--
Andy Shevchenko <andriy.shevchenko-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Intel Finland Oy
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: andriy.shevchenko@linux.intel.com (Andy Shevchenko)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/2 v2] SPI: spi-pxa2xx: Add helpers for regiseters' accessing
Date: Mon, 29 Sep 2014 11:52:17 +0300 [thread overview]
Message-ID: <1411980737.10697.0.camel@linux.intel.com> (raw)
In-Reply-To: <1412000548-9908-2-git-send-email-alvin.chen@intel.com>
On Mon, 2014-09-29 at 07:22 -0700, Weike Chen wrote:
I'm okay with the current version, though I have few minor comments
below.
> Introduce helper functions to access the 'SSCR0' and 'SSCR1'.
>
Like you said in the summary there are many accessors to many registers,
not only cr1/cr0. Perhaps, you may extend your commit message.
In any case
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
More comments below.
> Signed-off-by: Weike Chen <alvin.chen@intel.com>
> ---
> drivers/spi/spi-pxa2xx.c | 108 ++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 85 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
> index 256c0ab..e7ff9c5 100644
> --- a/drivers/spi/spi-pxa2xx.c
> +++ b/drivers/spi/spi-pxa2xx.c
> @@ -80,6 +80,73 @@ static bool is_lpss_ssp(const struct driver_data *drv_data)
> return drv_data->ssp_type == LPSS_SSP;
> }
>
> +static u32 pxa2xx_spi_get_ssrc1_change_mask(const struct driver_data *drv_data)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return SSCR1_CHANGE_MASK;
> + }
> +}
> +
> +static u32
> +pxa2xx_spi_get_rx_default_thre(const struct driver_data *drv_data)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return RX_THRESH_DFLT;
> + }
> +}
> +
> +static bool pxa2xx_spi_txfifo_full(const struct driver_data *drv_data)
> +{
> + void __iomem *reg = drv_data->ioaddr;
> + u32 mask;
> +
> + switch (drv_data->ssp_type) {
> + default:
> + mask = SSSR_TFL_MASK;
> + break;
> + }
> +
> + return (read_SSSR(reg) & mask) == mask;
> +}
> +
> +static void pxa2xx_spi_clear_rx_thre(const struct driver_data *drv_data,
> + u32 *sccr1_reg)
> +{
> + u32 mask;
> +
> + switch (drv_data->ssp_type) {
> + default:
> + mask = SSCR1_RFT;
> + break;
> + }
> + *sccr1_reg &= ~mask;
> +}
> +
> +static void pxa2xx_spi_set_rx_thre(const struct driver_data *drv_data,
> + u32 *sccr1_reg, u32 threshold)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + *sccr1_reg |= SSCR1_RxTresh(threshold);
> + break;
> + }
> +}
> +
> +static u32 pxa2xx_configure_sscr0(const struct driver_data *drv_data,
> + u32 clk_div, u8 bits)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return clk_div
> + | SSCR0_Motorola
> + | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
> + | SSCR0_SSE
> + | (bits > 16 ? SSCR0_EDSS : 0);
> + }
> +}
> +
> /*
> * Read and write LPSS SSP private registers. Caller must first check that
> * is_lpss_ssp() returns true before these can be called.
> @@ -234,7 +301,7 @@ static int null_writer(struct driver_data *drv_data)
> void __iomem *reg = drv_data->ioaddr;
> u8 n_bytes = drv_data->n_bytes;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Just wondering if those two could fit one line.
> return 0;
>
> @@ -262,7 +329,7 @@ static int u8_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -289,7 +356,7 @@ static int u16_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -316,7 +383,7 @@ static int u32_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -508,8 +575,9 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
> * remaining RX bytes.
> */
> if (pxa25x_ssp_comp(drv_data)) {
> + u32 rx_thre;
>
> - sccr1_reg &= ~SSCR1_RFT;
> + pxa2xx_spi_clear_rx_thre(drv_data, &sccr1_reg);
>
> bytes_left = drv_data->rx_end - drv_data->rx;
> switch (drv_data->n_bytes) {
> @@ -519,10 +587,12 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
> bytes_left >>= 1;
> }
>
> - if (bytes_left > RX_THRESH_DFLT)
> - bytes_left = RX_THRESH_DFLT;
> + rx_thre = pxa2xx_spi_get_rx_default_thre(drv_data);
> + if (rx_thre > bytes_left)
> + rx_thre = bytes_left;
>
> - sccr1_reg |= SSCR1_RxTresh(bytes_left);
> + pxa2xx_spi_set_rx_thre(drv_data, &sccr1_reg,
> + rx_thre);
> }
> write_SSCR1(sccr1_reg, reg);
> }
> @@ -613,6 +683,7 @@ static void pump_transfers(unsigned long data)
> u32 cr1;
> u32 dma_thresh = drv_data->cur_chip->dma_threshold;
> u32 dma_burst = drv_data->cur_chip->dma_burst_size;
> + u32 change_mask = pxa2xx_spi_get_ssrc1_change_mask(drv_data);
>
> /* Get current state information */
> message = drv_data->cur_msg;
> @@ -731,11 +802,7 @@ static void pump_transfers(unsigned long data)
> "pump_transfers: DMA burst size reduced to match bits_per_word\n");
> }
>
> - cr0 = clk_div
> - | SSCR0_Motorola
> - | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
> - | SSCR0_SSE
> - | (bits > 16 ? SSCR0_EDSS : 0);
> + cr0 = pxa2xx_configure_sscr0(drv_data, clk_div, bits);
> }
>
> message->state = RUNNING_STATE;
> @@ -772,16 +839,15 @@ static void pump_transfers(unsigned long data)
> }
>
> /* see if we need to reload the config registers */
> - if ((read_SSCR0(reg) != cr0)
> - || (read_SSCR1(reg) & SSCR1_CHANGE_MASK) !=
> - (cr1 & SSCR1_CHANGE_MASK)) {
> + if ((read_SSCR0(reg) != cr0) ||
> + (read_SSCR1(reg) & change_mask) != (cr1 & change_mask)) {
>
> /* stop the SSP, and update the other bits */
> write_SSCR0(cr0 & ~SSCR0_SSE, reg);
> if (!pxa25x_ssp_comp(drv_data))
> write_SSTO(chip->timeout, reg);
> /* first set CR1 without interrupt and service enables */
> - write_SSCR1(cr1 & SSCR1_CHANGE_MASK, reg);
> + write_SSCR1(cr1 & change_mask, reg);
> /* restart the SSP */
> write_SSCR0(cr0, reg);
>
> @@ -959,12 +1025,8 @@ static int setup(struct spi_device *spi)
> clk_div = ssp_get_clk_div(drv_data, spi->max_speed_hz);
> chip->speed_hz = spi->max_speed_hz;
>
> - chip->cr0 = clk_div
> - | SSCR0_Motorola
> - | SSCR0_DataSize(spi->bits_per_word > 16 ?
> - spi->bits_per_word - 16 : spi->bits_per_word)
> - | SSCR0_SSE
> - | (spi->bits_per_word > 16 ? SSCR0_EDSS : 0);
> + chip->cr0 = pxa2xx_configure_sscr0(drv_data, clk_div,
> + spi->bits_per_word);
> chip->cr1 &= ~(SSCR1_SPO | SSCR1_SPH);
> chip->cr1 |= (((spi->mode & SPI_CPHA) != 0) ? SSCR1_SPH : 0)
> | (((spi->mode & SPI_CPOL) != 0) ? SSCR1_SPO : 0);
--
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy
WARNING: multiple messages have this Message-ID (diff)
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Weike Chen <alvin.chen@intel.com>
Cc: Eric Miao <eric.y.miao@gmail.com>,
Russell King <linux@arm.linux.org.uk>,
Haojian Zhuang <haojian.zhuang@gmail.com>,
Mark Brown <broonie@kernel.org>,
linux-arm-kernel@lists.infradead.org, linux-spi@vger.kernel.org,
linux-kernel@vger.kernel.org,
Mika Westerberg <mika.westerberg@intel.com>,
Hock Leong Kweh <hock.leong.kweh@intel.com>,
Boon Leong Ong <boon.leong.ong@intel.com>,
Raymond Tan <raymond.tan@intel.com>
Subject: Re: [PATCH 1/2 v2] SPI: spi-pxa2xx: Add helpers for regiseters' accessing
Date: Mon, 29 Sep 2014 11:52:17 +0300 [thread overview]
Message-ID: <1411980737.10697.0.camel@linux.intel.com> (raw)
In-Reply-To: <1412000548-9908-2-git-send-email-alvin.chen@intel.com>
On Mon, 2014-09-29 at 07:22 -0700, Weike Chen wrote:
I'm okay with the current version, though I have few minor comments
below.
> Introduce helper functions to access the 'SSCR0' and 'SSCR1'.
>
Like you said in the summary there are many accessors to many registers,
not only cr1/cr0. Perhaps, you may extend your commit message.
In any case
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
More comments below.
> Signed-off-by: Weike Chen <alvin.chen@intel.com>
> ---
> drivers/spi/spi-pxa2xx.c | 108 ++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 85 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
> index 256c0ab..e7ff9c5 100644
> --- a/drivers/spi/spi-pxa2xx.c
> +++ b/drivers/spi/spi-pxa2xx.c
> @@ -80,6 +80,73 @@ static bool is_lpss_ssp(const struct driver_data *drv_data)
> return drv_data->ssp_type == LPSS_SSP;
> }
>
> +static u32 pxa2xx_spi_get_ssrc1_change_mask(const struct driver_data *drv_data)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return SSCR1_CHANGE_MASK;
> + }
> +}
> +
> +static u32
> +pxa2xx_spi_get_rx_default_thre(const struct driver_data *drv_data)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return RX_THRESH_DFLT;
> + }
> +}
> +
> +static bool pxa2xx_spi_txfifo_full(const struct driver_data *drv_data)
> +{
> + void __iomem *reg = drv_data->ioaddr;
> + u32 mask;
> +
> + switch (drv_data->ssp_type) {
> + default:
> + mask = SSSR_TFL_MASK;
> + break;
> + }
> +
> + return (read_SSSR(reg) & mask) == mask;
> +}
> +
> +static void pxa2xx_spi_clear_rx_thre(const struct driver_data *drv_data,
> + u32 *sccr1_reg)
> +{
> + u32 mask;
> +
> + switch (drv_data->ssp_type) {
> + default:
> + mask = SSCR1_RFT;
> + break;
> + }
> + *sccr1_reg &= ~mask;
> +}
> +
> +static void pxa2xx_spi_set_rx_thre(const struct driver_data *drv_data,
> + u32 *sccr1_reg, u32 threshold)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + *sccr1_reg |= SSCR1_RxTresh(threshold);
> + break;
> + }
> +}
> +
> +static u32 pxa2xx_configure_sscr0(const struct driver_data *drv_data,
> + u32 clk_div, u8 bits)
> +{
> + switch (drv_data->ssp_type) {
> + default:
> + return clk_div
> + | SSCR0_Motorola
> + | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
> + | SSCR0_SSE
> + | (bits > 16 ? SSCR0_EDSS : 0);
> + }
> +}
> +
> /*
> * Read and write LPSS SSP private registers. Caller must first check that
> * is_lpss_ssp() returns true before these can be called.
> @@ -234,7 +301,7 @@ static int null_writer(struct driver_data *drv_data)
> void __iomem *reg = drv_data->ioaddr;
> u8 n_bytes = drv_data->n_bytes;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Just wondering if those two could fit one line.
> return 0;
>
> @@ -262,7 +329,7 @@ static int u8_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -289,7 +356,7 @@ static int u16_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -316,7 +383,7 @@ static int u32_writer(struct driver_data *drv_data)
> {
> void __iomem *reg = drv_data->ioaddr;
>
> - if (((read_SSSR(reg) & SSSR_TFL_MASK) == SSSR_TFL_MASK)
> + if (pxa2xx_spi_txfifo_full(drv_data)
> || (drv_data->tx == drv_data->tx_end))
Ditto.
> return 0;
>
> @@ -508,8 +575,9 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
> * remaining RX bytes.
> */
> if (pxa25x_ssp_comp(drv_data)) {
> + u32 rx_thre;
>
> - sccr1_reg &= ~SSCR1_RFT;
> + pxa2xx_spi_clear_rx_thre(drv_data, &sccr1_reg);
>
> bytes_left = drv_data->rx_end - drv_data->rx;
> switch (drv_data->n_bytes) {
> @@ -519,10 +587,12 @@ static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
> bytes_left >>= 1;
> }
>
> - if (bytes_left > RX_THRESH_DFLT)
> - bytes_left = RX_THRESH_DFLT;
> + rx_thre = pxa2xx_spi_get_rx_default_thre(drv_data);
> + if (rx_thre > bytes_left)
> + rx_thre = bytes_left;
>
> - sccr1_reg |= SSCR1_RxTresh(bytes_left);
> + pxa2xx_spi_set_rx_thre(drv_data, &sccr1_reg,
> + rx_thre);
> }
> write_SSCR1(sccr1_reg, reg);
> }
> @@ -613,6 +683,7 @@ static void pump_transfers(unsigned long data)
> u32 cr1;
> u32 dma_thresh = drv_data->cur_chip->dma_threshold;
> u32 dma_burst = drv_data->cur_chip->dma_burst_size;
> + u32 change_mask = pxa2xx_spi_get_ssrc1_change_mask(drv_data);
>
> /* Get current state information */
> message = drv_data->cur_msg;
> @@ -731,11 +802,7 @@ static void pump_transfers(unsigned long data)
> "pump_transfers: DMA burst size reduced to match bits_per_word\n");
> }
>
> - cr0 = clk_div
> - | SSCR0_Motorola
> - | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
> - | SSCR0_SSE
> - | (bits > 16 ? SSCR0_EDSS : 0);
> + cr0 = pxa2xx_configure_sscr0(drv_data, clk_div, bits);
> }
>
> message->state = RUNNING_STATE;
> @@ -772,16 +839,15 @@ static void pump_transfers(unsigned long data)
> }
>
> /* see if we need to reload the config registers */
> - if ((read_SSCR0(reg) != cr0)
> - || (read_SSCR1(reg) & SSCR1_CHANGE_MASK) !=
> - (cr1 & SSCR1_CHANGE_MASK)) {
> + if ((read_SSCR0(reg) != cr0) ||
> + (read_SSCR1(reg) & change_mask) != (cr1 & change_mask)) {
>
> /* stop the SSP, and update the other bits */
> write_SSCR0(cr0 & ~SSCR0_SSE, reg);
> if (!pxa25x_ssp_comp(drv_data))
> write_SSTO(chip->timeout, reg);
> /* first set CR1 without interrupt and service enables */
> - write_SSCR1(cr1 & SSCR1_CHANGE_MASK, reg);
> + write_SSCR1(cr1 & change_mask, reg);
> /* restart the SSP */
> write_SSCR0(cr0, reg);
>
> @@ -959,12 +1025,8 @@ static int setup(struct spi_device *spi)
> clk_div = ssp_get_clk_div(drv_data, spi->max_speed_hz);
> chip->speed_hz = spi->max_speed_hz;
>
> - chip->cr0 = clk_div
> - | SSCR0_Motorola
> - | SSCR0_DataSize(spi->bits_per_word > 16 ?
> - spi->bits_per_word - 16 : spi->bits_per_word)
> - | SSCR0_SSE
> - | (spi->bits_per_word > 16 ? SSCR0_EDSS : 0);
> + chip->cr0 = pxa2xx_configure_sscr0(drv_data, clk_div,
> + spi->bits_per_word);
> chip->cr1 &= ~(SSCR1_SPO | SSCR1_SPH);
> chip->cr1 |= (((spi->mode & SPI_CPHA) != 0) ? SSCR1_SPH : 0)
> | (((spi->mode & SPI_CPOL) != 0) ? SSCR1_SPO : 0);
--
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Intel Finland Oy
next prev parent reply other threads:[~2014-09-29 8:52 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-29 14:22 [PATCH 0/2 v2] SPI: spi-pxa2xx: Add support for Intel Quark X1000 SPI controller Weike Chen
2014-09-29 14:22 ` Weike Chen
2014-09-29 14:22 ` Weike Chen
2014-09-29 14:22 ` [PATCH 1/2 v2] SPI: spi-pxa2xx: Add helpers for regiseters' accessing Weike Chen
2014-09-29 14:22 ` Weike Chen
[not found] ` <1412000548-9908-2-git-send-email-alvin.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-09-29 8:52 ` Andy Shevchenko [this message]
2014-09-29 8:52 ` Andy Shevchenko
2014-09-29 8:52 ` Andy Shevchenko
[not found] ` <1411980737.10697.0.camel-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2014-10-08 0:46 ` Chen, Alvin
2014-10-08 0:46 ` Chen, Alvin
2014-10-08 0:46 ` Chen, Alvin
2014-09-29 9:53 ` Mika Westerberg
2014-09-29 9:53 ` Mika Westerberg
2014-09-29 9:53 ` Mika Westerberg
2014-09-29 14:22 ` [PATCH 2/2 v2] SPI: spi-pxa2xx: SPI support for Intel Quark X1000 Weike Chen
2014-09-29 14:22 ` Weike Chen
[not found] ` <1412000548-9908-3-git-send-email-alvin.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2014-09-29 9:02 ` Andy Shevchenko
2014-09-29 9:02 ` Andy Shevchenko
2014-09-29 9:02 ` Andy Shevchenko
2014-10-08 1:32 ` Chen, Alvin
2014-10-08 1:32 ` Chen, Alvin
2014-10-08 1:32 ` Chen, Alvin
2014-11-25 20:06 ` Olof Johansson
2014-11-25 20:06 ` Olof Johansson
2014-11-25 20:06 ` Olof Johansson
[not found] ` <CAOesGMi5f_Kc1xA_JqiZYsbVYxaJgBXMZCe5TAxDkPQj7=o8sg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-11-25 21:02 ` Mark Brown
2014-11-25 21:02 ` Mark Brown
2014-11-25 21:02 ` Mark Brown
2014-09-29 9:57 ` Mika Westerberg
2014-09-29 9:57 ` Mika Westerberg
2014-10-08 1:03 ` Bryan O'Donoghue
2014-10-08 1:03 ` Bryan O'Donoghue
[not found] ` <54348D56.20708-SyKdqv6vbfZdzvEItQ6vdLNAH6kLmebB@public.gmane.org>
2014-10-08 7:48 ` Chen, Alvin
2014-10-08 7:48 ` Chen, Alvin
2014-10-08 7:48 ` Chen, Alvin
2014-10-08 9:02 ` Bryan O'Donoghue
2014-10-08 9:02 ` Bryan O'Donoghue
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=1411980737.10697.0.camel@linux.intel.com \
--to=andriy.shevchenko-vuqaysv1563yd54fqh9/ca@public.gmane.org \
--cc=alvin.chen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=boon.leong.ong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=eric.y.miao-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=haojian.zhuang-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=hock.leong.kweh-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org \
--cc=linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mika.westerberg-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=raymond.tan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.