diff options
Diffstat (limited to 'drivers/spi/spi-octeon.c')
| -rw-r--r-- | drivers/spi/spi-octeon.c | 84 | 
1 files changed, 11 insertions, 73 deletions
diff --git a/drivers/spi/spi-octeon.c b/drivers/spi/spi-octeon.c index 5f28ddbe4f7..c5e2f718eeb 100644 --- a/drivers/spi/spi-octeon.c +++ b/drivers/spi/spi-octeon.c @@ -11,7 +11,6 @@  #include <linux/spi/spi.h>  #include <linux/module.h>  #include <linux/delay.h> -#include <linux/init.h>  #include <linux/io.h>  #include <linux/of.h> @@ -33,13 +32,6 @@ struct octeon_spi {  	u64 cs_enax;  }; -struct octeon_spi_setup { -	u32 max_speed_hz; -	u8 chip_select; -	u8 mode; -	u8 bits_per_word; -}; -  static void octeon_spi_wait_ready(struct octeon_spi *p)  {  	union cvmx_mpi_sts mpi_sts; @@ -57,6 +49,7 @@ static int octeon_spi_do_transfer(struct octeon_spi *p,  				  struct spi_transfer *xfer,  				  bool last_xfer)  { +	struct spi_device *spi = msg->spi;  	union cvmx_mpi_cfg mpi_cfg;  	union cvmx_mpi_tx mpi_tx;  	unsigned int clkdiv; @@ -68,18 +61,11 @@ static int octeon_spi_do_transfer(struct octeon_spi *p,  	int len;  	int i; -	struct octeon_spi_setup *msg_setup = spi_get_ctldata(msg->spi); - -	speed_hz = msg_setup->max_speed_hz; -	mode = msg_setup->mode; +	mode = spi->mode;  	cpha = mode & SPI_CPHA;  	cpol = mode & SPI_CPOL; -	if (xfer->speed_hz) -		speed_hz = xfer->speed_hz; - -	if (speed_hz > OCTEON_SPI_MAX_CLOCK_HZ) -		speed_hz = OCTEON_SPI_MAX_CLOCK_HZ; +	speed_hz = xfer->speed_hz ? : spi->max_speed_hz;  	clkdiv = octeon_get_io_clock_rate() / (2 * speed_hz); @@ -93,8 +79,8 @@ static int octeon_spi_do_transfer(struct octeon_spi *p,  	mpi_cfg.s.cslate = cpha ? 1 : 0;  	mpi_cfg.s.enable = 1; -	if (msg_setup->chip_select < 4) -		p->cs_enax |= 1ull << (12 + msg_setup->chip_select); +	if (spi->chip_select < 4) +		p->cs_enax |= 1ull << (12 + spi->chip_select);  	mpi_cfg.u64 |= p->cs_enax;  	if (mpi_cfg.u64 != p->last_cfg) { @@ -114,7 +100,7 @@ static int octeon_spi_do_transfer(struct octeon_spi *p,  			cvmx_write_csr(p->register_base + OCTEON_SPI_DAT0 + (8 * i), d);  		}  		mpi_tx.u64 = 0; -		mpi_tx.s.csid = msg_setup->chip_select; +		mpi_tx.s.csid = spi->chip_select;  		mpi_tx.s.leavecs = 1;  		mpi_tx.s.txnum = tx_buf ? OCTEON_SPI_MAX_BYTES : 0;  		mpi_tx.s.totnum = OCTEON_SPI_MAX_BYTES; @@ -139,7 +125,7 @@ static int octeon_spi_do_transfer(struct octeon_spi *p,  	}  	mpi_tx.u64 = 0; -	mpi_tx.s.csid = msg_setup->chip_select; +	mpi_tx.s.csid = spi->chip_select;  	if (last_xfer)  		mpi_tx.s.leavecs = xfer->cs_change;  	else @@ -169,17 +155,9 @@ static int octeon_spi_transfer_one_message(struct spi_master *master,  	int status = 0;  	struct spi_transfer *xfer; -	/* -	 * We better have set the configuration via a call to .setup -	 * before we get here. -	 */ -	if (spi_get_ctldata(msg->spi) == NULL) { -		status = -EINVAL; -		goto err; -	} -  	list_for_each_entry(xfer, &msg->transfers, transfer_list) { -		bool last_xfer = &xfer->transfer_list == msg->transfers.prev; +		bool last_xfer = list_is_last(&xfer->transfer_list, +					      &msg->transfers);  		int r = octeon_spi_do_transfer(p, msg, xfer, last_xfer);  		if (r < 0) {  			status = r; @@ -194,41 +172,6 @@ err:  	return status;  } -static struct octeon_spi_setup *octeon_spi_new_setup(struct spi_device *spi) -{ -	struct octeon_spi_setup *setup = kzalloc(sizeof(*setup), GFP_KERNEL); -	if (!setup) -		return NULL; - -	setup->max_speed_hz = spi->max_speed_hz; -	setup->chip_select = spi->chip_select; -	setup->mode = spi->mode; -	setup->bits_per_word = spi->bits_per_word; -	return setup; -} - -static int octeon_spi_setup(struct spi_device *spi) -{ -	struct octeon_spi_setup *new_setup; -	struct octeon_spi_setup *old_setup = spi_get_ctldata(spi); - -	new_setup = octeon_spi_new_setup(spi); -	if (!new_setup) -		return -ENOMEM; - -	spi_set_ctldata(spi, new_setup); -	kfree(old_setup); - -	return 0; -} - -static void octeon_spi_cleanup(struct spi_device *spi) -{ -	struct octeon_spi_setup *old_setup = spi_get_ctldata(spi); -	spi_set_ctldata(spi, NULL); -	kfree(old_setup); -} -  static int octeon_spi_probe(struct platform_device *pdev)  {  	struct resource *res_mem; @@ -257,8 +200,6 @@ static int octeon_spi_probe(struct platform_device *pdev)  	p->register_base = (u64)devm_ioremap(&pdev->dev, res_mem->start,  					     resource_size(res_mem)); -	/* Dynamic bus numbering */ -	master->bus_num = -1;  	master->num_chipselect = 4;  	master->mode_bits = SPI_CPHA |  			    SPI_CPOL | @@ -266,13 +207,12 @@ static int octeon_spi_probe(struct platform_device *pdev)  			    SPI_LSB_FIRST |  			    SPI_3WIRE; -	master->setup = octeon_spi_setup; -	master->cleanup = octeon_spi_cleanup;  	master->transfer_one_message = octeon_spi_transfer_one_message;  	master->bits_per_word_mask = SPI_BPW_MASK(8); +	master->max_speed_hz = OCTEON_SPI_MAX_CLOCK_HZ;  	master->dev.of_node = pdev->dev.of_node; -	err = spi_register_master(master); +	err = devm_spi_register_master(&pdev->dev, master);  	if (err) {  		dev_err(&pdev->dev, "register master failed: %d\n", err);  		goto fail; @@ -292,8 +232,6 @@ static int octeon_spi_remove(struct platform_device *pdev)  	struct octeon_spi *p = spi_master_get_devdata(master);  	u64 register_base = p->register_base; -	spi_unregister_master(master); -  	/* Clear the CSENA* and put everything in a known state. */  	cvmx_write_csr(register_base + OCTEON_SPI_CFG, 0);  | 
