diff options
-rw-r--r-- | arch/arm/mach-lpc32xx/phy3250.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-u300/dummyspichip.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-u300/spi.c | 10 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-mop500.c | 8 | ||||
-rw-r--r-- | drivers/mfd/ab8500-spi.c | 5 | ||||
-rw-r--r-- | drivers/spi/amba-pl022.c | 121 | ||||
-rw-r--r-- | include/linux/amba/pl022.h | 6 |
7 files changed, 63 insertions, 99 deletions
diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index bc9a42da2145..0c936cf5675a 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c | |||
@@ -172,18 +172,12 @@ static void phy3250_spi_cs_set(u32 control) | |||
172 | } | 172 | } |
173 | 173 | ||
174 | static struct pl022_config_chip spi0_chip_info = { | 174 | static struct pl022_config_chip spi0_chip_info = { |
175 | .lbm = LOOPBACK_DISABLED, | ||
176 | .com_mode = INTERRUPT_TRANSFER, | 175 | .com_mode = INTERRUPT_TRANSFER, |
177 | .iface = SSP_INTERFACE_MOTOROLA_SPI, | 176 | .iface = SSP_INTERFACE_MOTOROLA_SPI, |
178 | .hierarchy = SSP_MASTER, | 177 | .hierarchy = SSP_MASTER, |
179 | .slave_tx_disable = 0, | 178 | .slave_tx_disable = 0, |
180 | .endian_tx = SSP_TX_LSB, | ||
181 | .endian_rx = SSP_RX_LSB, | ||
182 | .data_size = SSP_DATA_BITS_8, | ||
183 | .rx_lev_trig = SSP_RX_4_OR_MORE_ELEM, | 179 | .rx_lev_trig = SSP_RX_4_OR_MORE_ELEM, |
184 | .tx_lev_trig = SSP_TX_4_OR_MORE_EMPTY_LOC, | 180 | .tx_lev_trig = SSP_TX_4_OR_MORE_EMPTY_LOC, |
185 | .clk_phase = SSP_CLK_FIRST_EDGE, | ||
186 | .clk_pol = SSP_CLK_POL_IDLE_LOW, | ||
187 | .ctrl_len = SSP_BITS_8, | 181 | .ctrl_len = SSP_BITS_8, |
188 | .wait_state = SSP_MWIRE_WAIT_ZERO, | 182 | .wait_state = SSP_MWIRE_WAIT_ZERO, |
189 | .duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, | 183 | .duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, |
@@ -239,6 +233,7 @@ static int __init phy3250_spi_board_register(void) | |||
239 | .max_speed_hz = 5000000, | 233 | .max_speed_hz = 5000000, |
240 | .bus_num = 0, | 234 | .bus_num = 0, |
241 | .chip_select = 0, | 235 | .chip_select = 0, |
236 | .mode = SPI_MODE_0, | ||
242 | .platform_data = &eeprom, | 237 | .platform_data = &eeprom, |
243 | .controller_data = &spi0_chip_info, | 238 | .controller_data = &spi0_chip_info, |
244 | }, | 239 | }, |
diff --git a/arch/arm/mach-u300/dummyspichip.c b/arch/arm/mach-u300/dummyspichip.c index 5f55012b7c9e..03f793612594 100644 --- a/arch/arm/mach-u300/dummyspichip.c +++ b/arch/arm/mach-u300/dummyspichip.c | |||
@@ -46,7 +46,6 @@ static ssize_t dummy_looptest(struct device *dev, | |||
46 | * struct, this is just used here to alter the behaviour of the chip | 46 | * struct, this is just used here to alter the behaviour of the chip |
47 | * in order to perform tests. | 47 | * in order to perform tests. |
48 | */ | 48 | */ |
49 | struct pl022_config_chip *chip_info = spi->controller_data; | ||
50 | int status; | 49 | int status; |
51 | u8 txbuf[14] = {0xDE, 0xAD, 0xBE, 0xEF, 0x2B, 0xAD, | 50 | u8 txbuf[14] = {0xDE, 0xAD, 0xBE, 0xEF, 0x2B, 0xAD, |
52 | 0xCA, 0xFE, 0xBA, 0xBE, 0xB1, 0x05, | 51 | 0xCA, 0xFE, 0xBA, 0xBE, 0xB1, 0x05, |
@@ -72,7 +71,7 @@ static ssize_t dummy_looptest(struct device *dev, | |||
72 | * Force chip to 8 bit mode | 71 | * Force chip to 8 bit mode |
73 | * WARNING: NEVER DO THIS IN REAL DRIVER CODE, THIS SHOULD BE STATIC! | 72 | * WARNING: NEVER DO THIS IN REAL DRIVER CODE, THIS SHOULD BE STATIC! |
74 | */ | 73 | */ |
75 | chip_info->data_size = SSP_DATA_BITS_8; | 74 | spi->bits_per_word = 8; |
76 | /* You should NOT DO THIS EITHER */ | 75 | /* You should NOT DO THIS EITHER */ |
77 | spi->master->setup(spi); | 76 | spi->master->setup(spi); |
78 | 77 | ||
@@ -159,7 +158,7 @@ static ssize_t dummy_looptest(struct device *dev, | |||
159 | * Force chip to 16 bit mode | 158 | * Force chip to 16 bit mode |
160 | * WARNING: NEVER DO THIS IN REAL DRIVER CODE, THIS SHOULD BE STATIC! | 159 | * WARNING: NEVER DO THIS IN REAL DRIVER CODE, THIS SHOULD BE STATIC! |
161 | */ | 160 | */ |
162 | chip_info->data_size = SSP_DATA_BITS_16; | 161 | spi->bits_per_word = 16; |
163 | /* You should NOT DO THIS EITHER */ | 162 | /* You should NOT DO THIS EITHER */ |
164 | spi->master->setup(spi); | 163 | spi->master->setup(spi); |
165 | 164 | ||
diff --git a/arch/arm/mach-u300/spi.c b/arch/arm/mach-u300/spi.c index f0e887bea30e..edb2c0d255c2 100644 --- a/arch/arm/mach-u300/spi.c +++ b/arch/arm/mach-u300/spi.c | |||
@@ -30,8 +30,6 @@ static void select_dummy_chip(u32 chipselect) | |||
30 | } | 30 | } |
31 | 31 | ||
32 | struct pl022_config_chip dummy_chip_info = { | 32 | struct pl022_config_chip dummy_chip_info = { |
33 | /* Nominally this is LOOPBACK_DISABLED, but this is our dummy chip! */ | ||
34 | .lbm = LOOPBACK_ENABLED, | ||
35 | /* | 33 | /* |
36 | * available POLLING_TRANSFER and INTERRUPT_TRANSFER, | 34 | * available POLLING_TRANSFER and INTERRUPT_TRANSFER, |
37 | * DMA_TRANSFER does not work | 35 | * DMA_TRANSFER does not work |
@@ -42,14 +40,8 @@ struct pl022_config_chip dummy_chip_info = { | |||
42 | .hierarchy = SSP_MASTER, | 40 | .hierarchy = SSP_MASTER, |
43 | /* 0 = drive TX even as slave, 1 = do not drive TX as slave */ | 41 | /* 0 = drive TX even as slave, 1 = do not drive TX as slave */ |
44 | .slave_tx_disable = 0, | 42 | .slave_tx_disable = 0, |
45 | /* LSB first */ | ||
46 | .endian_tx = SSP_TX_LSB, | ||
47 | .endian_rx = SSP_RX_LSB, | ||
48 | .data_size = SSP_DATA_BITS_8, /* used to be 12 in some default */ | ||
49 | .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM, | 43 | .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM, |
50 | .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC, | 44 | .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC, |
51 | .clk_phase = SSP_CLK_SECOND_EDGE, | ||
52 | .clk_pol = SSP_CLK_POL_IDLE_LOW, | ||
53 | .ctrl_len = SSP_BITS_12, | 45 | .ctrl_len = SSP_BITS_12, |
54 | .wait_state = SSP_MWIRE_WAIT_ZERO, | 46 | .wait_state = SSP_MWIRE_WAIT_ZERO, |
55 | .duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, | 47 | .duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX, |
@@ -75,7 +67,7 @@ static struct spi_board_info u300_spi_devices[] = { | |||
75 | .bus_num = 0, /* Only one bus on this chip */ | 67 | .bus_num = 0, /* Only one bus on this chip */ |
76 | .chip_select = 0, | 68 | .chip_select = 0, |
77 | /* Means SPI_CS_HIGH, change if e.g low CS */ | 69 | /* Means SPI_CS_HIGH, change if e.g low CS */ |
78 | .mode = 0, | 70 | .mode = SPI_MODE_1 | SPI_LSB_FIRST | SPI_LOOP, |
79 | }, | 71 | }, |
80 | #endif | 72 | #endif |
81 | }; | 73 | }; |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 0e8fd135a57d..219ae0ca4eef 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -55,19 +55,13 @@ static void ab4500_spi_cs_control(u32 command) | |||
55 | } | 55 | } |
56 | 56 | ||
57 | struct pl022_config_chip ab4500_chip_info = { | 57 | struct pl022_config_chip ab4500_chip_info = { |
58 | .lbm = LOOPBACK_DISABLED, | ||
59 | .com_mode = INTERRUPT_TRANSFER, | 58 | .com_mode = INTERRUPT_TRANSFER, |
60 | .iface = SSP_INTERFACE_MOTOROLA_SPI, | 59 | .iface = SSP_INTERFACE_MOTOROLA_SPI, |
61 | /* we can act as master only */ | 60 | /* we can act as master only */ |
62 | .hierarchy = SSP_MASTER, | 61 | .hierarchy = SSP_MASTER, |
63 | .slave_tx_disable = 0, | 62 | .slave_tx_disable = 0, |
64 | .endian_rx = SSP_RX_MSB, | ||
65 | .endian_tx = SSP_TX_MSB, | ||
66 | .data_size = SSP_DATA_BITS_24, | ||
67 | .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM, | 63 | .rx_lev_trig = SSP_RX_1_OR_MORE_ELEM, |
68 | .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC, | 64 | .tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC, |
69 | .clk_phase = SSP_CLK_SECOND_EDGE, | ||
70 | .clk_pol = SSP_CLK_POL_IDLE_HIGH, | ||
71 | .cs_control = ab4500_spi_cs_control, | 65 | .cs_control = ab4500_spi_cs_control, |
72 | }; | 66 | }; |
73 | 67 | ||
@@ -83,7 +77,7 @@ static struct spi_board_info u8500_spi_devices[] = { | |||
83 | .max_speed_hz = 12000000, | 77 | .max_speed_hz = 12000000, |
84 | .bus_num = 0, | 78 | .bus_num = 0, |
85 | .chip_select = 0, | 79 | .chip_select = 0, |
86 | .mode = SPI_MODE_0, | 80 | .mode = SPI_MODE_3, |
87 | .irq = IRQ_DB8500_AB8500, | 81 | .irq = IRQ_DB8500_AB8500, |
88 | }, | 82 | }, |
89 | }; | 83 | }; |
diff --git a/drivers/mfd/ab8500-spi.c b/drivers/mfd/ab8500-spi.c index e1c8b62b086d..01b6d584442c 100644 --- a/drivers/mfd/ab8500-spi.c +++ b/drivers/mfd/ab8500-spi.c | |||
@@ -83,6 +83,11 @@ static int __devinit ab8500_spi_probe(struct spi_device *spi) | |||
83 | struct ab8500 *ab8500; | 83 | struct ab8500 *ab8500; |
84 | int ret; | 84 | int ret; |
85 | 85 | ||
86 | spi->bits_per_word = 24; | ||
87 | ret = spi_setup(spi); | ||
88 | if (ret < 0) | ||
89 | return ret; | ||
90 | |||
86 | ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL); | 91 | ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL); |
87 | if (!ab8500) | 92 | if (!ab8500) |
88 | return -ENOMEM; | 93 | return -ENOMEM; |
diff --git a/drivers/spi/amba-pl022.c b/drivers/spi/amba-pl022.c index db0c67908d2b..59c90f3ccc26 100644 --- a/drivers/spi/amba-pl022.c +++ b/drivers/spi/amba-pl022.c | |||
@@ -1595,12 +1595,6 @@ static int destroy_queue(struct pl022 *pl022) | |||
1595 | static int verify_controller_parameters(struct pl022 *pl022, | 1595 | static int verify_controller_parameters(struct pl022 *pl022, |
1596 | struct pl022_config_chip *chip_info) | 1596 | struct pl022_config_chip *chip_info) |
1597 | { | 1597 | { |
1598 | if ((chip_info->lbm != LOOPBACK_ENABLED) | ||
1599 | && (chip_info->lbm != LOOPBACK_DISABLED)) { | ||
1600 | dev_err(chip_info->dev, | ||
1601 | "loopback Mode is configured incorrectly\n"); | ||
1602 | return -EINVAL; | ||
1603 | } | ||
1604 | if ((chip_info->iface < SSP_INTERFACE_MOTOROLA_SPI) | 1598 | if ((chip_info->iface < SSP_INTERFACE_MOTOROLA_SPI) |
1605 | || (chip_info->iface > SSP_INTERFACE_UNIDIRECTIONAL)) { | 1599 | || (chip_info->iface > SSP_INTERFACE_UNIDIRECTIONAL)) { |
1606 | dev_err(chip_info->dev, | 1600 | dev_err(chip_info->dev, |
@@ -1626,24 +1620,6 @@ static int verify_controller_parameters(struct pl022 *pl022, | |||
1626 | "cpsdvsr is configured incorrectly\n"); | 1620 | "cpsdvsr is configured incorrectly\n"); |
1627 | return -EINVAL; | 1621 | return -EINVAL; |
1628 | } | 1622 | } |
1629 | if ((chip_info->endian_rx != SSP_RX_MSB) | ||
1630 | && (chip_info->endian_rx != SSP_RX_LSB)) { | ||
1631 | dev_err(chip_info->dev, | ||
1632 | "RX FIFO endianess is configured incorrectly\n"); | ||
1633 | return -EINVAL; | ||
1634 | } | ||
1635 | if ((chip_info->endian_tx != SSP_TX_MSB) | ||
1636 | && (chip_info->endian_tx != SSP_TX_LSB)) { | ||
1637 | dev_err(chip_info->dev, | ||
1638 | "TX FIFO endianess is configured incorrectly\n"); | ||
1639 | return -EINVAL; | ||
1640 | } | ||
1641 | if ((chip_info->data_size < SSP_DATA_BITS_4) | ||
1642 | || (chip_info->data_size > SSP_DATA_BITS_32)) { | ||
1643 | dev_err(chip_info->dev, | ||
1644 | "DATA Size is configured incorrectly\n"); | ||
1645 | return -EINVAL; | ||
1646 | } | ||
1647 | if ((chip_info->com_mode != INTERRUPT_TRANSFER) | 1623 | if ((chip_info->com_mode != INTERRUPT_TRANSFER) |
1648 | && (chip_info->com_mode != DMA_TRANSFER) | 1624 | && (chip_info->com_mode != DMA_TRANSFER) |
1649 | && (chip_info->com_mode != POLLING_TRANSFER)) { | 1625 | && (chip_info->com_mode != POLLING_TRANSFER)) { |
@@ -1663,20 +1639,6 @@ static int verify_controller_parameters(struct pl022 *pl022, | |||
1663 | "TX FIFO Trigger Level is configured incorrectly\n"); | 1639 | "TX FIFO Trigger Level is configured incorrectly\n"); |
1664 | return -EINVAL; | 1640 | return -EINVAL; |
1665 | } | 1641 | } |
1666 | if (chip_info->iface == SSP_INTERFACE_MOTOROLA_SPI) { | ||
1667 | if ((chip_info->clk_phase != SSP_CLK_FIRST_EDGE) | ||
1668 | && (chip_info->clk_phase != SSP_CLK_SECOND_EDGE)) { | ||
1669 | dev_err(chip_info->dev, | ||
1670 | "Clock Phase is configured incorrectly\n"); | ||
1671 | return -EINVAL; | ||
1672 | } | ||
1673 | if ((chip_info->clk_pol != SSP_CLK_POL_IDLE_LOW) | ||
1674 | && (chip_info->clk_pol != SSP_CLK_POL_IDLE_HIGH)) { | ||
1675 | dev_err(chip_info->dev, | ||
1676 | "Clock Polarity is configured incorrectly\n"); | ||
1677 | return -EINVAL; | ||
1678 | } | ||
1679 | } | ||
1680 | if (chip_info->iface == SSP_INTERFACE_NATIONAL_MICROWIRE) { | 1642 | if (chip_info->iface == SSP_INTERFACE_NATIONAL_MICROWIRE) { |
1681 | if ((chip_info->ctrl_len < SSP_BITS_4) | 1643 | if ((chip_info->ctrl_len < SSP_BITS_4) |
1682 | || (chip_info->ctrl_len > SSP_BITS_32)) { | 1644 | || (chip_info->ctrl_len > SSP_BITS_32)) { |
@@ -1825,23 +1787,14 @@ static int calculate_effective_freq(struct pl022 *pl022, | |||
1825 | * controller hardware here, that is not done until the actual transfer | 1787 | * controller hardware here, that is not done until the actual transfer |
1826 | * commence. | 1788 | * commence. |
1827 | */ | 1789 | */ |
1828 | |||
1829 | /* FIXME: JUST GUESSING the spi->mode bits understood by this driver */ | ||
1830 | #define MODEBITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \ | ||
1831 | | SPI_LSB_FIRST | SPI_LOOP) | ||
1832 | |||
1833 | static int pl022_setup(struct spi_device *spi) | 1790 | static int pl022_setup(struct spi_device *spi) |
1834 | { | 1791 | { |
1835 | struct pl022_config_chip *chip_info; | 1792 | struct pl022_config_chip *chip_info; |
1836 | struct chip_data *chip; | 1793 | struct chip_data *chip; |
1837 | int status = 0; | 1794 | int status = 0; |
1838 | struct pl022 *pl022 = spi_master_get_devdata(spi->master); | 1795 | struct pl022 *pl022 = spi_master_get_devdata(spi->master); |
1839 | 1796 | unsigned int bits = spi->bits_per_word; | |
1840 | if (spi->mode & ~MODEBITS) { | 1797 | u32 tmp; |
1841 | dev_dbg(&spi->dev, "unsupported mode bits %x\n", | ||
1842 | spi->mode & ~MODEBITS); | ||
1843 | return -EINVAL; | ||
1844 | } | ||
1845 | 1798 | ||
1846 | if (!spi->max_speed_hz) | 1799 | if (!spi->max_speed_hz) |
1847 | return -EINVAL; | 1800 | return -EINVAL; |
@@ -1884,18 +1837,12 @@ static int pl022_setup(struct spi_device *spi) | |||
1884 | * Set controller data default values: | 1837 | * Set controller data default values: |
1885 | * Polling is supported by default | 1838 | * Polling is supported by default |
1886 | */ | 1839 | */ |
1887 | chip_info->lbm = LOOPBACK_DISABLED; | ||
1888 | chip_info->com_mode = POLLING_TRANSFER; | 1840 | chip_info->com_mode = POLLING_TRANSFER; |
1889 | chip_info->iface = SSP_INTERFACE_MOTOROLA_SPI; | 1841 | chip_info->iface = SSP_INTERFACE_MOTOROLA_SPI; |
1890 | chip_info->hierarchy = SSP_SLAVE; | 1842 | chip_info->hierarchy = SSP_SLAVE; |
1891 | chip_info->slave_tx_disable = DO_NOT_DRIVE_TX; | 1843 | chip_info->slave_tx_disable = DO_NOT_DRIVE_TX; |
1892 | chip_info->endian_tx = SSP_TX_LSB; | ||
1893 | chip_info->endian_rx = SSP_RX_LSB; | ||
1894 | chip_info->data_size = SSP_DATA_BITS_12; | ||
1895 | chip_info->rx_lev_trig = SSP_RX_1_OR_MORE_ELEM; | 1844 | chip_info->rx_lev_trig = SSP_RX_1_OR_MORE_ELEM; |
1896 | chip_info->tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC; | 1845 | chip_info->tx_lev_trig = SSP_TX_1_OR_MORE_EMPTY_LOC; |
1897 | chip_info->clk_phase = SSP_CLK_SECOND_EDGE; | ||
1898 | chip_info->clk_pol = SSP_CLK_POL_IDLE_LOW; | ||
1899 | chip_info->ctrl_len = SSP_BITS_8; | 1846 | chip_info->ctrl_len = SSP_BITS_8; |
1900 | chip_info->wait_state = SSP_MWIRE_WAIT_ZERO; | 1847 | chip_info->wait_state = SSP_MWIRE_WAIT_ZERO; |
1901 | chip_info->duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX; | 1848 | chip_info->duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX; |
@@ -1933,12 +1880,16 @@ static int pl022_setup(struct spi_device *spi) | |||
1933 | chip->xfer_type = chip_info->com_mode; | 1880 | chip->xfer_type = chip_info->com_mode; |
1934 | chip->cs_control = chip_info->cs_control; | 1881 | chip->cs_control = chip_info->cs_control; |
1935 | 1882 | ||
1936 | if (chip_info->data_size <= 8) { | 1883 | if (bits <= 3) { |
1937 | dev_dbg(&spi->dev, "1 <= n <=8 bits per word\n"); | 1884 | /* PL022 doesn't support less than 4-bits */ |
1885 | status = -ENOTSUPP; | ||
1886 | goto err_config_params; | ||
1887 | } else if (bits <= 8) { | ||
1888 | dev_dbg(&spi->dev, "4 <= n <=8 bits per word\n"); | ||
1938 | chip->n_bytes = 1; | 1889 | chip->n_bytes = 1; |
1939 | chip->read = READING_U8; | 1890 | chip->read = READING_U8; |
1940 | chip->write = WRITING_U8; | 1891 | chip->write = WRITING_U8; |
1941 | } else if (chip_info->data_size <= 16) { | 1892 | } else if (bits <= 16) { |
1942 | dev_dbg(&spi->dev, "9 <= n <= 16 bits per word\n"); | 1893 | dev_dbg(&spi->dev, "9 <= n <= 16 bits per word\n"); |
1943 | chip->n_bytes = 2; | 1894 | chip->n_bytes = 2; |
1944 | chip->read = READING_U16; | 1895 | chip->read = READING_U16; |
@@ -1955,6 +1906,7 @@ static int pl022_setup(struct spi_device *spi) | |||
1955 | dev_err(&spi->dev, | 1906 | dev_err(&spi->dev, |
1956 | "a standard pl022 can only handle " | 1907 | "a standard pl022 can only handle " |
1957 | "1 <= n <= 16 bit words\n"); | 1908 | "1 <= n <= 16 bit words\n"); |
1909 | status = -ENOTSUPP; | ||
1958 | goto err_config_params; | 1910 | goto err_config_params; |
1959 | } | 1911 | } |
1960 | } | 1912 | } |
@@ -1987,6 +1939,8 @@ static int pl022_setup(struct spi_device *spi) | |||
1987 | 1939 | ||
1988 | /* Special setup for the ST micro extended control registers */ | 1940 | /* Special setup for the ST micro extended control registers */ |
1989 | if (pl022->vendor->extended_cr) { | 1941 | if (pl022->vendor->extended_cr) { |
1942 | u32 etx; | ||
1943 | |||
1990 | if (pl022->vendor->pl023) { | 1944 | if (pl022->vendor->pl023) { |
1991 | /* These bits are only in the PL023 */ | 1945 | /* These bits are only in the PL023 */ |
1992 | SSP_WRITE_BITS(chip->cr1, chip_info->clkdelay, | 1946 | SSP_WRITE_BITS(chip->cr1, chip_info->clkdelay, |
@@ -2002,29 +1956,51 @@ static int pl022_setup(struct spi_device *spi) | |||
2002 | SSP_WRITE_BITS(chip->cr1, chip_info->wait_state, | 1956 | SSP_WRITE_BITS(chip->cr1, chip_info->wait_state, |
2003 | SSP_CR1_MASK_MWAIT_ST, 6); | 1957 | SSP_CR1_MASK_MWAIT_ST, 6); |
2004 | } | 1958 | } |
2005 | SSP_WRITE_BITS(chip->cr0, chip_info->data_size, | 1959 | SSP_WRITE_BITS(chip->cr0, bits - 1, |
2006 | SSP_CR0_MASK_DSS_ST, 0); | 1960 | SSP_CR0_MASK_DSS_ST, 0); |
2007 | SSP_WRITE_BITS(chip->cr1, chip_info->endian_rx, | 1961 | |
2008 | SSP_CR1_MASK_RENDN_ST, 4); | 1962 | if (spi->mode & SPI_LSB_FIRST) { |
2009 | SSP_WRITE_BITS(chip->cr1, chip_info->endian_tx, | 1963 | tmp = SSP_RX_LSB; |
2010 | SSP_CR1_MASK_TENDN_ST, 5); | 1964 | etx = SSP_TX_LSB; |
1965 | } else { | ||
1966 | tmp = SSP_RX_MSB; | ||
1967 | etx = SSP_TX_MSB; | ||
1968 | } | ||
1969 | SSP_WRITE_BITS(chip->cr1, tmp, SSP_CR1_MASK_RENDN_ST, 4); | ||
1970 | SSP_WRITE_BITS(chip->cr1, etx, SSP_CR1_MASK_TENDN_ST, 5); | ||
2011 | SSP_WRITE_BITS(chip->cr1, chip_info->rx_lev_trig, | 1971 | SSP_WRITE_BITS(chip->cr1, chip_info->rx_lev_trig, |
2012 | SSP_CR1_MASK_RXIFLSEL_ST, 7); | 1972 | SSP_CR1_MASK_RXIFLSEL_ST, 7); |
2013 | SSP_WRITE_BITS(chip->cr1, chip_info->tx_lev_trig, | 1973 | SSP_WRITE_BITS(chip->cr1, chip_info->tx_lev_trig, |
2014 | SSP_CR1_MASK_TXIFLSEL_ST, 10); | 1974 | SSP_CR1_MASK_TXIFLSEL_ST, 10); |
2015 | } else { | 1975 | } else { |
2016 | SSP_WRITE_BITS(chip->cr0, chip_info->data_size, | 1976 | SSP_WRITE_BITS(chip->cr0, bits - 1, |
2017 | SSP_CR0_MASK_DSS, 0); | 1977 | SSP_CR0_MASK_DSS, 0); |
2018 | SSP_WRITE_BITS(chip->cr0, chip_info->iface, | 1978 | SSP_WRITE_BITS(chip->cr0, chip_info->iface, |
2019 | SSP_CR0_MASK_FRF, 4); | 1979 | SSP_CR0_MASK_FRF, 4); |
2020 | } | 1980 | } |
1981 | |||
2021 | /* Stuff that is common for all versions */ | 1982 | /* Stuff that is common for all versions */ |
2022 | SSP_WRITE_BITS(chip->cr0, chip_info->clk_pol, SSP_CR0_MASK_SPO, 6); | 1983 | if (spi->mode & SPI_CPOL) |
2023 | SSP_WRITE_BITS(chip->cr0, chip_info->clk_phase, SSP_CR0_MASK_SPH, 7); | 1984 | tmp = SSP_CLK_POL_IDLE_HIGH; |
1985 | else | ||
1986 | tmp = SSP_CLK_POL_IDLE_LOW; | ||
1987 | SSP_WRITE_BITS(chip->cr0, tmp, SSP_CR0_MASK_SPO, 6); | ||
1988 | |||
1989 | if (spi->mode & SPI_CPHA) | ||
1990 | tmp = SSP_CLK_SECOND_EDGE; | ||
1991 | else | ||
1992 | tmp = SSP_CLK_FIRST_EDGE; | ||
1993 | SSP_WRITE_BITS(chip->cr0, tmp, SSP_CR0_MASK_SPH, 7); | ||
1994 | |||
2024 | SSP_WRITE_BITS(chip->cr0, chip_info->clk_freq.scr, SSP_CR0_MASK_SCR, 8); | 1995 | SSP_WRITE_BITS(chip->cr0, chip_info->clk_freq.scr, SSP_CR0_MASK_SCR, 8); |
2025 | /* Loopback is available on all versions except PL023 */ | 1996 | /* Loopback is available on all versions except PL023 */ |
2026 | if (!pl022->vendor->pl023) | 1997 | if (!pl022->vendor->pl023) { |
2027 | SSP_WRITE_BITS(chip->cr1, chip_info->lbm, SSP_CR1_MASK_LBM, 0); | 1998 | if (spi->mode & SPI_LOOP) |
1999 | tmp = LOOPBACK_ENABLED; | ||
2000 | else | ||
2001 | tmp = LOOPBACK_DISABLED; | ||
2002 | SSP_WRITE_BITS(chip->cr1, tmp, SSP_CR1_MASK_LBM, 0); | ||
2003 | } | ||
2028 | SSP_WRITE_BITS(chip->cr1, SSP_DISABLED, SSP_CR1_MASK_SSE, 1); | 2004 | SSP_WRITE_BITS(chip->cr1, SSP_DISABLED, SSP_CR1_MASK_SSE, 1); |
2029 | SSP_WRITE_BITS(chip->cr1, chip_info->hierarchy, SSP_CR1_MASK_MS, 2); | 2005 | SSP_WRITE_BITS(chip->cr1, chip_info->hierarchy, SSP_CR1_MASK_MS, 2); |
2030 | SSP_WRITE_BITS(chip->cr1, chip_info->slave_tx_disable, SSP_CR1_MASK_SOD, 3); | 2006 | SSP_WRITE_BITS(chip->cr1, chip_info->slave_tx_disable, SSP_CR1_MASK_SOD, 3); |
@@ -2033,6 +2009,7 @@ static int pl022_setup(struct spi_device *spi) | |||
2033 | spi_set_ctldata(spi, chip); | 2009 | spi_set_ctldata(spi, chip); |
2034 | return status; | 2010 | return status; |
2035 | err_config_params: | 2011 | err_config_params: |
2012 | spi_set_ctldata(spi, NULL); | ||
2036 | err_first_setup: | 2013 | err_first_setup: |
2037 | kfree(chip); | 2014 | kfree(chip); |
2038 | return status; | 2015 | return status; |
@@ -2095,6 +2072,14 @@ pl022_probe(struct amba_device *adev, struct amba_id *id) | |||
2095 | master->setup = pl022_setup; | 2072 | master->setup = pl022_setup; |
2096 | master->transfer = pl022_transfer; | 2073 | master->transfer = pl022_transfer; |
2097 | 2074 | ||
2075 | /* | ||
2076 | * Supports mode 0-3, loopback, and active low CS. Transfers are | ||
2077 | * always MS bit first on the original pl022. | ||
2078 | */ | ||
2079 | master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP; | ||
2080 | if (pl022->vendor->extended_cr) | ||
2081 | master->mode_bits |= SPI_LSB_FIRST; | ||
2082 | |||
2098 | dev_dbg(&adev->dev, "BUSNO: %d\n", master->bus_num); | 2083 | dev_dbg(&adev->dev, "BUSNO: %d\n", master->bus_num); |
2099 | 2084 | ||
2100 | status = amba_request_regions(adev, NULL); | 2085 | status = amba_request_regions(adev, NULL); |
diff --git a/include/linux/amba/pl022.h b/include/linux/amba/pl022.h index db6a191ddcf7..bf143663df81 100644 --- a/include/linux/amba/pl022.h +++ b/include/linux/amba/pl022.h | |||
@@ -277,19 +277,13 @@ struct pl022_ssp_controller { | |||
277 | */ | 277 | */ |
278 | struct pl022_config_chip { | 278 | struct pl022_config_chip { |
279 | struct device *dev; | 279 | struct device *dev; |
280 | enum ssp_loopback lbm; | ||
281 | enum ssp_interface iface; | 280 | enum ssp_interface iface; |
282 | enum ssp_hierarchy hierarchy; | 281 | enum ssp_hierarchy hierarchy; |
283 | bool slave_tx_disable; | 282 | bool slave_tx_disable; |
284 | struct ssp_clock_params clk_freq; | 283 | struct ssp_clock_params clk_freq; |
285 | enum ssp_rx_endian endian_rx; | ||
286 | enum ssp_tx_endian endian_tx; | ||
287 | enum ssp_data_size data_size; | ||
288 | enum ssp_mode com_mode; | 284 | enum ssp_mode com_mode; |
289 | enum ssp_rx_level_trig rx_lev_trig; | 285 | enum ssp_rx_level_trig rx_lev_trig; |
290 | enum ssp_tx_level_trig tx_lev_trig; | 286 | enum ssp_tx_level_trig tx_lev_trig; |
291 | enum ssp_spi_clk_phase clk_phase; | ||
292 | enum ssp_spi_clk_pol clk_pol; | ||
293 | enum ssp_microwire_ctrl_len ctrl_len; | 287 | enum ssp_microwire_ctrl_len ctrl_len; |
294 | enum ssp_microwire_wait_state wait_state; | 288 | enum ssp_microwire_wait_state wait_state; |
295 | enum ssp_duplex duplex; | 289 | enum ssp_duplex duplex; |