case QUARK_X1000_SSP:
                return clk_div
                        | QUARK_X1000_SSCR0_Motorola
-                       | QUARK_X1000_SSCR0_DataSize(bits > 32 ? 8 : bits)
-                       | SSCR0_SSE;
+                       | QUARK_X1000_SSCR0_DataSize(bits > 32 ? 8 : bits);
        default:
                return clk_div
                        | SSCR0_Motorola
                        | SSCR0_DataSize(bits > 16 ? bits - 16 : bits)
-                       | SSCR0_SSE
                        | (bits > 16 ? SSCR0_EDSS : 0);
        }
 }
        if (is_mmp2_ssp(drv_data))
                return;
 
-       pxa2xx_spi_write(drv_data, SSCR0,
-                        pxa2xx_spi_read(drv_data, SSCR0) & ~SSCR0_SSE);
+       pxa_ssp_disable(drv_data->ssp);
 }
 
 static int null_writer(struct driver_data *drv_data)
            (pxa2xx_spi_read(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 */
        if ((pxa2xx_spi_read(drv_data, SSCR0) != cr0)
            || (pxa2xx_spi_read(drv_data, SSCR1) & 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 */
                pxa2xx_spi_write(drv_data, SSCR1, cr1 & change_mask);
-               /* restart the SSP */
+               /* Update the other bits */
                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)) {
                u8 tx_level = (pxa2xx_spi_read(drv_data, SSSR)
                                        & SSSR_TFL_MASK) >> 8;
                controller->min_speed_hz =
                        DIV_ROUND_UP(controller->max_speed_hz, 512);
 
+       pxa_ssp_disable(ssp);
+
        /* Load default SSP configuration */
-       pxa2xx_spi_write(drv_data, SSCR0, 0);
        switch (drv_data->ssp_type) {
        case QUARK_X1000_SSP:
                tmp = QUARK_X1000_SSCR1_RxTresh(RX_THRESH_QUARK_X1000_DFLT) |
        spi_unregister_controller(drv_data->controller);
 
        /* 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);
 
        /* Release DMA */
        status = spi_controller_suspend(drv_data->controller);
        if (status != 0)
                return status;
-       pxa2xx_spi_write(drv_data, SSCR0, 0);
+
+       pxa_ssp_disable(ssp);
 
        if (!pm_runtime_suspended(dev))
                clk_disable_unprepare(ssp->clk);
 
        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)
 struct ssp_device *pxa_ssp_request(int port, const char *label);
 void pxa_ssp_free(struct ssp_device *);
 
                 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,
                        int out, struct snd_dmaengine_dai_dma_data *dma)
 {