diff options
Diffstat (limited to 'drivers/spi/spi-orion.c')
| -rw-r--r-- | drivers/spi/spi-orion.c | 90 | 
1 files changed, 14 insertions, 76 deletions
diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c index 1d1d321d90c..d018a4aac3a 100644 --- a/drivers/spi/spi-orion.c +++ b/drivers/spi/spi-orion.c @@ -9,7 +9,6 @@   * published by the Free Software Foundation.   */ -#include <linux/init.h>  #include <linux/interrupt.h>  #include <linux/delay.h>  #include <linux/platform_device.h> @@ -43,8 +42,6 @@  struct orion_spi {  	struct spi_master	*master;  	void __iomem		*base; -	unsigned int		max_speed; -	unsigned int		min_speed;  	struct clk              *clk;  }; @@ -75,23 +72,6 @@ orion_spi_clrbits(struct orion_spi *orion_spi, u32 reg, u32 mask)  	writel(val, reg_addr);  } -static int orion_spi_set_transfer_size(struct orion_spi *orion_spi, int size) -{ -	if (size == 16) { -		orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG, -				  ORION_SPI_IF_8_16_BIT_MODE); -	} else if (size == 8) { -		orion_spi_clrbits(orion_spi, ORION_SPI_IF_CONFIG_REG, -				  ORION_SPI_IF_8_16_BIT_MODE); -	} else { -		pr_debug("Bad bits per word value %d (only 8 or 16 are " -			 "allowed).\n", size); -		return -EINVAL; -	} - -	return 0; -} -  static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed)  {  	u32 tclk_hz; @@ -170,7 +150,14 @@ orion_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)  	if (rc)  		return rc; -	return orion_spi_set_transfer_size(orion_spi, bits_per_word); +	if (bits_per_word == 16) +		orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG, +				  ORION_SPI_IF_8_16_BIT_MODE); +	else +		orion_spi_clrbits(orion_spi, ORION_SPI_IF_CONFIG_REG, +				  ORION_SPI_IF_8_16_BIT_MODE); + +	return 0;  }  static void orion_spi_set_cs(struct orion_spi *orion_spi, int enable) @@ -260,11 +247,9 @@ orion_spi_write_read_16bit(struct spi_device *spi,  static unsigned int  orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)  { -	struct orion_spi *orion_spi;  	unsigned int count;  	int word_len; -	orion_spi = spi_master_get_devdata(spi->master);  	word_len = spi->bits_per_word;  	count = xfer->len; @@ -310,27 +295,6 @@ static int orion_spi_transfer_one_message(struct spi_master *master,  		goto msg_done;  	list_for_each_entry(t, &m->transfers, transfer_list) { -		/* make sure buffer length is even when working in 16 -		 * bit mode*/ -		if ((t->bits_per_word == 16) && (t->len & 1)) { -			dev_err(&spi->dev, -				"message rejected : " -				"odd data length %d while in 16 bit mode\n", -				t->len); -			status = -EIO; -			goto msg_done; -		} - -		if (t->speed_hz && t->speed_hz < orion_spi->min_speed) { -			dev_err(&spi->dev, -				"message rejected : " -				"device min speed (%d Hz) exceeds " -				"required transfer speed (%d Hz)\n", -				orion_spi->min_speed, t->speed_hz); -			status = -EIO; -			goto msg_done; -		} -  		if (par_override || t->speed_hz || t->bits_per_word) {  			par_override = 1;  			status = orion_spi_setup_transfer(spi, t); @@ -375,28 +339,6 @@ static int orion_spi_reset(struct orion_spi *orion_spi)  	return 0;  } -static int orion_spi_setup(struct spi_device *spi) -{ -	struct orion_spi *orion_spi; - -	orion_spi = spi_master_get_devdata(spi->master); - -	if ((spi->max_speed_hz == 0) -			|| (spi->max_speed_hz > orion_spi->max_speed)) -		spi->max_speed_hz = orion_spi->max_speed; - -	if (spi->max_speed_hz < orion_spi->min_speed) { -		dev_err(&spi->dev, "setup: requested speed too low %d Hz\n", -			spi->max_speed_hz); -		return -EINVAL; -	} - -	/* -	 * baudrate & width will be set orion_spi_setup_transfer -	 */ -	return 0; -} -  static int orion_spi_probe(struct platform_device *pdev)  {  	struct spi_master *master; @@ -407,7 +349,7 @@ static int orion_spi_probe(struct platform_device *pdev)  	const u32 *iprop;  	int size; -	master = spi_alloc_master(&pdev->dev, sizeof *spi); +	master = spi_alloc_master(&pdev->dev, sizeof(*spi));  	if (master == NULL) {  		dev_dbg(&pdev->dev, "master allocation failed\n");  		return -ENOMEM; @@ -425,16 +367,16 @@ static int orion_spi_probe(struct platform_device *pdev)  	/* we support only mode 0, and no options */  	master->mode_bits = SPI_CPHA | SPI_CPOL; -	master->setup = orion_spi_setup;  	master->transfer_one_message = orion_spi_transfer_one_message;  	master->num_chipselect = ORION_NUM_CHIPSELECTS; +	master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16);  	platform_set_drvdata(pdev, master);  	spi = spi_master_get_devdata(master);  	spi->master = master; -	spi->clk = clk_get(&pdev->dev, NULL); +	spi->clk = devm_clk_get(&pdev->dev, NULL);  	if (IS_ERR(spi->clk)) {  		status = PTR_ERR(spi->clk);  		goto out; @@ -443,8 +385,8 @@ static int orion_spi_probe(struct platform_device *pdev)  	clk_prepare(spi->clk);  	clk_enable(spi->clk);  	tclk_hz = clk_get_rate(spi->clk); -	spi->max_speed = DIV_ROUND_UP(tclk_hz, 4); -	spi->min_speed = DIV_ROUND_UP(tclk_hz, 30); +	master->max_speed_hz = DIV_ROUND_UP(tclk_hz, 4); +	master->min_speed_hz = DIV_ROUND_UP(tclk_hz, 30);  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	spi->base = devm_ioremap_resource(&pdev->dev, r); @@ -457,7 +399,7 @@ static int orion_spi_probe(struct platform_device *pdev)  		goto out_rel_clk;  	master->dev.of_node = pdev->dev.of_node; -	status = spi_register_master(master); +	status = devm_spi_register_master(&pdev->dev, master);  	if (status < 0)  		goto out_rel_clk; @@ -465,7 +407,6 @@ static int orion_spi_probe(struct platform_device *pdev)  out_rel_clk:  	clk_disable_unprepare(spi->clk); -	clk_put(spi->clk);  out:  	spi_master_put(master);  	return status; @@ -481,9 +422,6 @@ static int orion_spi_remove(struct platform_device *pdev)  	spi = spi_master_get_devdata(master);  	clk_disable_unprepare(spi->clk); -	clk_put(spi->clk); - -	spi_unregister_master(master);  	return 0;  }  | 
