OSDN Git Service

Merge remote-tracking branches 'spi/topic/omap-uwire', 'spi/topic/omap100k', 'spi...
[uclinux-h8/linux.git] / drivers / spi / spi-orion.c
index 7f2121f..d018a4a 100644 (file)
@@ -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;
@@ -425,9 +367,9 @@ 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);
 
@@ -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);