spi: uniphier: Add handle_err callback function
authorKunihiko Hayashi <hayashi.kunihiko@socionext.com>
Tue, 24 Dec 2019 00:58:25 +0000 (09:58 +0900)
committerMark Brown <broonie@kernel.org>
Wed, 25 Dec 2019 00:08:18 +0000 (00:08 +0000)
This adds master->handle_err() callback function to stop transfer due to
error. The function also resets FIFOs and disables interrupt.

Signed-off-by: Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
Link: https://lore.kernel.org/r/1577149107-30670-4-git-send-email-hayashi.kunihiko@socionext.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-uniphier.c

index a44a1a5..0b25559 100644 (file)
@@ -425,6 +425,22 @@ static int uniphier_spi_unprepare_transfer_hardware(struct spi_master *master)
        return 0;
 }
 
+static void uniphier_spi_handle_err(struct spi_master *master,
+                                   struct spi_message *msg)
+{
+       struct uniphier_spi_priv *priv = spi_master_get_devdata(master);
+       u32 val;
+
+       /* stop running spi transfer */
+       writel(0, priv->base + SSI_CTL);
+
+       /* reset FIFOs */
+       val = SSI_FC_TXFFL | SSI_FC_RXFFL;
+       writel(val, priv->base + SSI_FC);
+
+       uniphier_spi_irq_disable(priv, SSI_IE_RCIE | SSI_IE_RORIE);
+}
+
 static irqreturn_t uniphier_spi_handler(int irq, void *dev_id)
 {
        struct uniphier_spi_priv *priv = dev_id;
@@ -531,6 +547,7 @@ static int uniphier_spi_probe(struct platform_device *pdev)
                                = uniphier_spi_prepare_transfer_hardware;
        master->unprepare_transfer_hardware
                                = uniphier_spi_unprepare_transfer_hardware;
+       master->handle_err = uniphier_spi_handle_err;
        master->num_chipselect = 1;
 
        ret = devm_spi_register_master(&pdev->dev, master);