spi: pxa2xx: Use pxa_ssp_enable()/pxa_ssp_disable() in the driver

There are few places that repeat the logic of pxa_ssp_enable() and
pxa_ssp_disable(). Use them instead of open coded variants.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20210510124134.24638-10-andriy.shevchenko@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Andy Shevchenko 2021-05-10 15:41:29 +03:00 committed by Mark Brown
parent 4761d2e7e5
commit 0c8ccd8b26
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
4 changed files with 35 additions and 37 deletions

View File

@ -50,9 +50,7 @@ static void pxa2xx_spi_dma_transfer_complete(struct driver_data *drv_data,
if (error) { if (error) {
/* In case we got an error we disable the SSP now */ /* In case we got an error we disable the SSP now */
pxa2xx_spi_write(drv_data, SSCR0, pxa_ssp_disable(drv_data->ssp);
pxa2xx_spi_read(drv_data, SSCR0)
& ~SSCR0_SSE);
msg->status = -EIO; msg->status = -EIO;
} }

View File

@ -286,13 +286,11 @@ static u32 pxa2xx_configure_sscr0(const struct driver_data *drv_data,
case QUARK_X1000_SSP: case QUARK_X1000_SSP:
return clk_div return clk_div
| QUARK_X1000_SSCR0_Motorola | QUARK_X1000_SSCR0_Motorola
| QUARK_X1000_SSCR0_DataSize(bits > 32 ? 8 : bits) | QUARK_X1000_SSCR0_DataSize(bits > 32 ? 8 : bits);
| SSCR0_SSE;
default: default:
return clk_div return clk_div
| SSCR0_Motorola | SSCR0_Motorola
| SSCR0_DataSize(bits > 16 ? bits - 16 : bits) | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
| SSCR0_SSE
| (bits > 16 ? SSCR0_EDSS : 0); | (bits > 16 ? SSCR0_EDSS : 0);
} }
} }
@ -498,8 +496,7 @@ static void pxa2xx_spi_off(struct driver_data *drv_data)
if (is_mmp2_ssp(drv_data)) if (is_mmp2_ssp(drv_data))
return; return;
pxa2xx_spi_write(drv_data, SSCR0, pxa_ssp_disable(drv_data->ssp);
pxa2xx_spi_read(drv_data, SSCR0) & ~SSCR0_SSE);
} }
static int null_writer(struct driver_data *drv_data) static int null_writer(struct driver_data *drv_data)
@ -1098,25 +1095,26 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *controller,
(pxa2xx_spi_read(drv_data, DDS_RATE) != chip->dds_rate)) (pxa2xx_spi_read(drv_data, DDS_RATE) != chip->dds_rate))
pxa2xx_spi_write(drv_data, DDS_RATE, chip->dds_rate); pxa2xx_spi_write(drv_data, DDS_RATE, chip->dds_rate);
/* Stop the SSP */
if (!is_mmp2_ssp(drv_data))
pxa_ssp_disable(drv_data->ssp);
if (!pxa25x_ssp_comp(drv_data))
pxa2xx_spi_write(drv_data, SSTO, chip->timeout);
/* see if we need to reload the config registers */ /* see if we need to reload the config registers */
if ((pxa2xx_spi_read(drv_data, SSCR0) != cr0) if ((pxa2xx_spi_read(drv_data, SSCR0) != cr0)
|| (pxa2xx_spi_read(drv_data, SSCR1) & change_mask) || (pxa2xx_spi_read(drv_data, SSCR1) & change_mask)
!= (cr1 & change_mask)) { != (cr1 & change_mask)) {
/* stop the SSP, and update the other bits */
if (!is_mmp2_ssp(drv_data))
pxa2xx_spi_write(drv_data, SSCR0, cr0 & ~SSCR0_SSE);
if (!pxa25x_ssp_comp(drv_data))
pxa2xx_spi_write(drv_data, SSTO, chip->timeout);
/* first set CR1 without interrupt and service enables */ /* first set CR1 without interrupt and service enables */
pxa2xx_spi_write(drv_data, SSCR1, cr1 & change_mask); pxa2xx_spi_write(drv_data, SSCR1, cr1 & change_mask);
/* restart the SSP */ /* Update the other bits */
pxa2xx_spi_write(drv_data, SSCR0, cr0); pxa2xx_spi_write(drv_data, SSCR0, cr0);
} else {
if (!pxa25x_ssp_comp(drv_data))
pxa2xx_spi_write(drv_data, SSTO, chip->timeout);
} }
/* Restart the SSP */
pxa_ssp_enable(drv_data->ssp);
if (is_mmp2_ssp(drv_data)) { if (is_mmp2_ssp(drv_data)) {
u8 tx_level = (pxa2xx_spi_read(drv_data, SSSR) u8 tx_level = (pxa2xx_spi_read(drv_data, SSSR)
& SSSR_TFL_MASK) >> 8; & SSSR_TFL_MASK) >> 8;
@ -1786,8 +1784,9 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
controller->min_speed_hz = controller->min_speed_hz =
DIV_ROUND_UP(controller->max_speed_hz, 512); DIV_ROUND_UP(controller->max_speed_hz, 512);
pxa_ssp_disable(ssp);
/* Load default SSP configuration */ /* Load default SSP configuration */
pxa2xx_spi_write(drv_data, SSCR0, 0);
switch (drv_data->ssp_type) { switch (drv_data->ssp_type) {
case QUARK_X1000_SSP: case QUARK_X1000_SSP:
tmp = QUARK_X1000_SSCR1_RxTresh(RX_THRESH_QUARK_X1000_DFLT) | tmp = QUARK_X1000_SSCR1_RxTresh(RX_THRESH_QUARK_X1000_DFLT) |
@ -1928,7 +1927,7 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)
spi_unregister_controller(drv_data->controller); spi_unregister_controller(drv_data->controller);
/* Disable the SSP at the peripheral and SOC level */ /* Disable the SSP at the peripheral and SOC level */
pxa2xx_spi_write(drv_data, SSCR0, 0); pxa_ssp_disable(ssp);
clk_disable_unprepare(ssp->clk); clk_disable_unprepare(ssp->clk);
/* Release DMA */ /* Release DMA */
@ -1957,7 +1956,8 @@ static int pxa2xx_spi_suspend(struct device *dev)
status = spi_controller_suspend(drv_data->controller); status = spi_controller_suspend(drv_data->controller);
if (status != 0) if (status != 0)
return status; return status;
pxa2xx_spi_write(drv_data, SSCR0, 0);
pxa_ssp_disable(ssp);
if (!pm_runtime_suspended(dev)) if (!pm_runtime_suspended(dev))
clk_disable_unprepare(ssp->clk); clk_disable_unprepare(ssp->clk);

View File

@ -254,6 +254,22 @@ static inline u32 pxa_ssp_read_reg(struct ssp_device *dev, u32 reg)
return __raw_readl(dev->mmio_base + reg); return __raw_readl(dev->mmio_base + reg);
} }
static inline void pxa_ssp_enable(struct ssp_device *ssp)
{
u32 sscr0;
sscr0 = pxa_ssp_read_reg(ssp, SSCR0) | SSCR0_SSE;
pxa_ssp_write_reg(ssp, SSCR0, sscr0);
}
static inline void pxa_ssp_disable(struct ssp_device *ssp)
{
u32 sscr0;
sscr0 = pxa_ssp_read_reg(ssp, SSCR0) & ~SSCR0_SSE;
pxa_ssp_write_reg(ssp, SSCR0, sscr0);
}
#if IS_ENABLED(CONFIG_PXA_SSP) #if IS_ENABLED(CONFIG_PXA_SSP)
struct ssp_device *pxa_ssp_request(int port, const char *label); struct ssp_device *pxa_ssp_request(int port, const char *label);
void pxa_ssp_free(struct ssp_device *); void pxa_ssp_free(struct ssp_device *);

View File

@ -61,22 +61,6 @@ static void dump_registers(struct ssp_device *ssp)
pxa_ssp_read_reg(ssp, SSACD)); pxa_ssp_read_reg(ssp, SSACD));
} }
static void pxa_ssp_enable(struct ssp_device *ssp)
{
uint32_t sscr0;
sscr0 = __raw_readl(ssp->mmio_base + SSCR0) | SSCR0_SSE;
__raw_writel(sscr0, ssp->mmio_base + SSCR0);
}
static void pxa_ssp_disable(struct ssp_device *ssp)
{
uint32_t sscr0;
sscr0 = __raw_readl(ssp->mmio_base + SSCR0) & ~SSCR0_SSE;
__raw_writel(sscr0, ssp->mmio_base + SSCR0);
}
static void pxa_ssp_set_dma_params(struct ssp_device *ssp, int width4, static void pxa_ssp_set_dma_params(struct ssp_device *ssp, int width4,
int out, struct snd_dmaengine_dai_dma_data *dma) int out, struct snd_dmaengine_dai_dma_data *dma)
{ {