|
@@ -27,7 +27,6 @@
|
|
|
|
|
|
#include <linux/spi/sh_msiof.h>
|
|
|
#include <linux/spi/spi.h>
|
|
|
-#include <linux/spi/spi_bitbang.h>
|
|
|
|
|
|
#include <asm/unaligned.h>
|
|
|
|
|
@@ -39,7 +38,6 @@ struct sh_msiof_chipdata {
|
|
|
};
|
|
|
|
|
|
struct sh_msiof_spi_priv {
|
|
|
- struct spi_bitbang bitbang; /* must be first for spi_bitbang.c */
|
|
|
void __iomem *mapbase;
|
|
|
struct clk *clk;
|
|
|
struct platform_device *pdev;
|
|
@@ -459,7 +457,10 @@ static int sh_msiof_spi_setup(struct spi_device *spi)
|
|
|
!!(spi->mode & SPI_LSB_FIRST),
|
|
|
!!(spi->mode & SPI_CS_HIGH));
|
|
|
|
|
|
- return spi_bitbang_setup(spi);
|
|
|
+ if (spi->cs_gpio >= 0)
|
|
|
+ gpio_set_value(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int sh_msiof_prepare_message(struct spi_master *master,
|
|
@@ -490,20 +491,6 @@ static int sh_msiof_unprepare_message(struct spi_master *master,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void sh_msiof_spi_chipselect(struct spi_device *spi, int is_on)
|
|
|
-{
|
|
|
- int value;
|
|
|
-
|
|
|
- /* chip select is active low unless SPI_CS_HIGH is set */
|
|
|
- if (spi->mode & SPI_CS_HIGH)
|
|
|
- value = (is_on == BITBANG_CS_ACTIVE) ? 1 : 0;
|
|
|
- else
|
|
|
- value = (is_on == BITBANG_CS_ACTIVE) ? 0 : 1;
|
|
|
-
|
|
|
- if (spi->cs_gpio >= 0)
|
|
|
- gpio_set_value(spi->cs_gpio, value);
|
|
|
-}
|
|
|
-
|
|
|
static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p,
|
|
|
void (*tx_fifo)(struct sh_msiof_spi_priv *,
|
|
|
const void *, int, int),
|
|
@@ -573,9 +560,11 @@ static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int sh_msiof_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
|
|
|
+static int sh_msiof_transfer_one(struct spi_master *master,
|
|
|
+ struct spi_device *spi,
|
|
|
+ struct spi_transfer *t)
|
|
|
{
|
|
|
- struct sh_msiof_spi_priv *p = spi_master_get_devdata(spi->master);
|
|
|
+ struct sh_msiof_spi_priv *p = spi_master_get_devdata(master);
|
|
|
void (*tx_fifo)(struct sh_msiof_spi_priv *, const void *, int, int);
|
|
|
void (*rx_fifo)(struct sh_msiof_spi_priv *, void *, int, int);
|
|
|
int bits;
|
|
@@ -656,13 +645,6 @@ static int sh_msiof_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
|
|
|
words -= n;
|
|
|
}
|
|
|
|
|
|
- return bytes_done;
|
|
|
-}
|
|
|
-
|
|
|
-static u32 sh_msiof_spi_txrx_word(struct spi_device *spi, unsigned nsecs,
|
|
|
- u32 word, u8 bits)
|
|
|
-{
|
|
|
- BUG(); /* unused but needed by bitbang code */
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -799,7 +781,7 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
|
|
|
if (p->info->rx_fifo_override)
|
|
|
p->rx_fifo_size = p->info->rx_fifo_override;
|
|
|
|
|
|
- /* init master and bitbang code */
|
|
|
+ /* init master code */
|
|
|
master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
|
|
|
master->mode_bits |= SPI_LSB_FIRST | SPI_3WIRE;
|
|
|
master->flags = p->chipdata->master_flags;
|
|
@@ -807,24 +789,20 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
|
|
|
master->dev.of_node = pdev->dev.of_node;
|
|
|
master->num_chipselect = p->info->num_chipselect;
|
|
|
master->setup = sh_msiof_spi_setup;
|
|
|
- master->cleanup = spi_bitbang_cleanup;
|
|
|
master->prepare_message = sh_msiof_prepare_message;
|
|
|
master->unprepare_message = sh_msiof_unprepare_message;
|
|
|
master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32);
|
|
|
+ master->transfer_one = sh_msiof_transfer_one;
|
|
|
|
|
|
- p->bitbang.master = master;
|
|
|
- p->bitbang.chipselect = sh_msiof_spi_chipselect;
|
|
|
- p->bitbang.setup_transfer = spi_bitbang_setup_transfer;
|
|
|
- p->bitbang.txrx_bufs = sh_msiof_spi_txrx;
|
|
|
- p->bitbang.txrx_word[SPI_MODE_0] = sh_msiof_spi_txrx_word;
|
|
|
- p->bitbang.txrx_word[SPI_MODE_1] = sh_msiof_spi_txrx_word;
|
|
|
- p->bitbang.txrx_word[SPI_MODE_2] = sh_msiof_spi_txrx_word;
|
|
|
- p->bitbang.txrx_word[SPI_MODE_3] = sh_msiof_spi_txrx_word;
|
|
|
+ ret = devm_spi_register_master(&pdev->dev, master);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_err(&pdev->dev, "spi_register_master error.\n");
|
|
|
+ goto err2;
|
|
|
+ }
|
|
|
|
|
|
- ret = spi_bitbang_start(&p->bitbang);
|
|
|
- if (ret == 0)
|
|
|
- return 0;
|
|
|
+ return 0;
|
|
|
|
|
|
+ err2:
|
|
|
pm_runtime_disable(&pdev->dev);
|
|
|
clk_unprepare(p->clk);
|
|
|
err1:
|
|
@@ -835,15 +813,10 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
|
|
|
static int sh_msiof_spi_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
struct sh_msiof_spi_priv *p = platform_get_drvdata(pdev);
|
|
|
- int ret;
|
|
|
|
|
|
- ret = spi_bitbang_stop(&p->bitbang);
|
|
|
- if (!ret) {
|
|
|
- pm_runtime_disable(&pdev->dev);
|
|
|
- clk_unprepare(p->clk);
|
|
|
- spi_master_put(p->bitbang.master);
|
|
|
- }
|
|
|
- return ret;
|
|
|
+ pm_runtime_disable(&pdev->dev);
|
|
|
+ clk_unprepare(p->clk);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static struct platform_device_id spi_driver_ids[] = {
|