diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-25 14:45:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-25 14:45:04 -0400 |
commit | 2432cbe4f29fbb8d349e481695ac6e88b884bacb (patch) | |
tree | 80079d639d2937d44b201a812e742fdc030376c1 /drivers | |
parent | 8497ae61d0e7f30ae9f20c5fcea94c957b6c3b83 (diff) | |
parent | a1dca315ce3f78347bca8ce8befe3cc71ae63b7e (diff) |
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS fixes from Ralf Baechle:
"Random fixes across the MIPS tree. The two hotspots are several bugs
in the module loader and the ath79 SOC support; also noteworthy is the
restructuring of the code to synchronize CPU timers across CPUs on
startup; the old code recently ceased to work due to unrelated
changes.
All except one of these patches have sat for a significant time in
linux-next for testing."
* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus:
MIPS: pci-ar724x: avoid data bus error due to a missing PCIe module
MIPS: Malta: Delete duplicate PCI fixup.
MIPS: ath79: don't hardcode the unavailability of the DSP ASE
MIPS: Synchronize MIPS count one CPU at a time
MIPS: BCM63xx: Fix SPI message control register handling for BCM6338/6348.
MIPS: Module: Deal with malformed HI16/LO16 relocation sequences.
MIPS: Fix race condition in module relocation code.
MIPS: Fix memory leak in error path of HI16/LO16 relocation handling.
MIPS: MTX-1: Add udelay to mtx1_pci_idsel
MIPS: ath79: select HAVE_CLK
MIPS: ath79: Use correct IRQ number for the OHCI controller on AR7240
MIPS: ath79: Fix number of GPIO lines for AR724[12]
MIPS: Octeon: Fix broken interrupt controller code.
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/spi/spi-bcm63xx.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c index ea0aaa3f13d0..a9f4049c6769 100644 --- a/drivers/spi/spi-bcm63xx.c +++ b/drivers/spi/spi-bcm63xx.c | |||
@@ -47,6 +47,8 @@ struct bcm63xx_spi { | |||
47 | /* Platform data */ | 47 | /* Platform data */ |
48 | u32 speed_hz; | 48 | u32 speed_hz; |
49 | unsigned fifo_size; | 49 | unsigned fifo_size; |
50 | unsigned int msg_type_shift; | ||
51 | unsigned int msg_ctl_width; | ||
50 | 52 | ||
51 | /* Data buffers */ | 53 | /* Data buffers */ |
52 | const unsigned char *tx_ptr; | 54 | const unsigned char *tx_ptr; |
@@ -221,13 +223,20 @@ static unsigned int bcm63xx_txrx_bufs(struct spi_device *spi, | |||
221 | msg_ctl = (t->len << SPI_BYTE_CNT_SHIFT); | 223 | msg_ctl = (t->len << SPI_BYTE_CNT_SHIFT); |
222 | 224 | ||
223 | if (t->rx_buf && t->tx_buf) | 225 | if (t->rx_buf && t->tx_buf) |
224 | msg_ctl |= (SPI_FD_RW << SPI_MSG_TYPE_SHIFT); | 226 | msg_ctl |= (SPI_FD_RW << bs->msg_type_shift); |
225 | else if (t->rx_buf) | 227 | else if (t->rx_buf) |
226 | msg_ctl |= (SPI_HD_R << SPI_MSG_TYPE_SHIFT); | 228 | msg_ctl |= (SPI_HD_R << bs->msg_type_shift); |
227 | else if (t->tx_buf) | 229 | else if (t->tx_buf) |
228 | msg_ctl |= (SPI_HD_W << SPI_MSG_TYPE_SHIFT); | 230 | msg_ctl |= (SPI_HD_W << bs->msg_type_shift); |
229 | 231 | ||
230 | bcm_spi_writew(bs, msg_ctl, SPI_MSG_CTL); | 232 | switch (bs->msg_ctl_width) { |
233 | case 8: | ||
234 | bcm_spi_writeb(bs, msg_ctl, SPI_MSG_CTL); | ||
235 | break; | ||
236 | case 16: | ||
237 | bcm_spi_writew(bs, msg_ctl, SPI_MSG_CTL); | ||
238 | break; | ||
239 | } | ||
231 | 240 | ||
232 | /* Issue the transfer */ | 241 | /* Issue the transfer */ |
233 | cmd = SPI_CMD_START_IMMEDIATE; | 242 | cmd = SPI_CMD_START_IMMEDIATE; |
@@ -406,9 +415,21 @@ static int __devinit bcm63xx_spi_probe(struct platform_device *pdev) | |||
406 | master->transfer_one_message = bcm63xx_spi_transfer_one; | 415 | master->transfer_one_message = bcm63xx_spi_transfer_one; |
407 | master->mode_bits = MODEBITS; | 416 | master->mode_bits = MODEBITS; |
408 | bs->speed_hz = pdata->speed_hz; | 417 | bs->speed_hz = pdata->speed_hz; |
418 | bs->msg_type_shift = pdata->msg_type_shift; | ||
419 | bs->msg_ctl_width = pdata->msg_ctl_width; | ||
409 | bs->tx_io = (u8 *)(bs->regs + bcm63xx_spireg(SPI_MSG_DATA)); | 420 | bs->tx_io = (u8 *)(bs->regs + bcm63xx_spireg(SPI_MSG_DATA)); |
410 | bs->rx_io = (const u8 *)(bs->regs + bcm63xx_spireg(SPI_RX_DATA)); | 421 | bs->rx_io = (const u8 *)(bs->regs + bcm63xx_spireg(SPI_RX_DATA)); |
411 | 422 | ||
423 | switch (bs->msg_ctl_width) { | ||
424 | case 8: | ||
425 | case 16: | ||
426 | break; | ||
427 | default: | ||
428 | dev_err(dev, "unsupported MSG_CTL width: %d\n", | ||
429 | bs->msg_ctl_width); | ||
430 | goto out_clk_disable; | ||
431 | } | ||
432 | |||
412 | /* Initialize hardware */ | 433 | /* Initialize hardware */ |
413 | clk_enable(bs->clk); | 434 | clk_enable(bs->clk); |
414 | bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS); | 435 | bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS); |