diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-09-13 15:45:50 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-09-13 15:45:50 -0400 |
| commit | 6142811a3395188bac6fa4f5c4223471b1ac98a8 (patch) | |
| tree | 76fa1cfd80eddfc7e529683685baebfd54f4096b | |
| parent | 49553c2ef88749dd502687f4eb9c258bb10a4f44 (diff) | |
| parent | 25c8e03bdb769dfe2381f8b7942f05b0eb4bdf31 (diff) | |
Merge branch 'next-spi' of git://git.secretlab.ca/git/linux-2.6
* 'next-spi' of git://git.secretlab.ca/git/linux-2.6:
spi/pl022: move probe call to subsys_initcall()
powerpc/5200: mpc52xx_uart.c: Add of_node_put to avoid memory leak
spi/pl022: fix APB pclk power regression on U300
spi/spi_s3c64xx: Warn if PIO transfers time out
spi/s3c64xx: Fix incorrect reuse of 'val' local variable.
spi/s3c64xx: Fix compilation warning
spi/dw_spi: clean the cs_control code
spi/dw_spi: Allow interrupt sharing
spi/spi_s3c64xx: Increase dead reckoning time in wait_for_xfer()
spi/spi_s3c64xx: Move to subsys_initcall()
spi: free children in spi_unregister_master, not siblings
gpiolib: Add 'struct gpio_chip' forward declaration for !GPIOLIB case
of: Fix missing includes - ll_temac
spi/spi_s3c64xx: Staticise non-exported functions
spi/spi_s3c64xx: Make probe more robust against missing board config
| -rw-r--r-- | drivers/net/ll_temac_main.c | 1 | ||||
| -rw-r--r-- | drivers/net/ll_temac_mdio.c | 1 | ||||
| -rw-r--r-- | drivers/serial/mpc52xx_uart.c | 1 | ||||
| -rw-r--r-- | drivers/spi/amba-pl022.c | 16 | ||||
| -rw-r--r-- | drivers/spi/dw_spi.c | 24 | ||||
| -rw-r--r-- | drivers/spi/spi.c | 9 | ||||
| -rw-r--r-- | drivers/spi/spi_s3c64xx.c | 37 | ||||
| -rw-r--r-- | include/linux/gpio.h | 1 | ||||
| -rw-r--r-- | include/linux/spi/dw_spi.h | 2 |
9 files changed, 54 insertions, 38 deletions
diff --git a/drivers/net/ll_temac_main.c b/drivers/net/ll_temac_main.c index bdf2149e5296..87f0a93b165c 100644 --- a/drivers/net/ll_temac_main.c +++ b/drivers/net/ll_temac_main.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/of_device.h> | 38 | #include <linux/of_device.h> |
| 39 | #include <linux/of_mdio.h> | 39 | #include <linux/of_mdio.h> |
| 40 | #include <linux/of_platform.h> | 40 | #include <linux/of_platform.h> |
| 41 | #include <linux/of_address.h> | ||
| 41 | #include <linux/skbuff.h> | 42 | #include <linux/skbuff.h> |
| 42 | #include <linux/spinlock.h> | 43 | #include <linux/spinlock.h> |
| 43 | #include <linux/tcp.h> /* needed for sizeof(tcphdr) */ | 44 | #include <linux/tcp.h> /* needed for sizeof(tcphdr) */ |
diff --git a/drivers/net/ll_temac_mdio.c b/drivers/net/ll_temac_mdio.c index 5ae28c975b38..8cf9d4f56bb2 100644 --- a/drivers/net/ll_temac_mdio.c +++ b/drivers/net/ll_temac_mdio.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/phy.h> | 10 | #include <linux/phy.h> |
| 11 | #include <linux/of.h> | 11 | #include <linux/of.h> |
| 12 | #include <linux/of_device.h> | 12 | #include <linux/of_device.h> |
| 13 | #include <linux/of_address.h> | ||
| 13 | #include <linux/slab.h> | 14 | #include <linux/slab.h> |
| 14 | #include <linux/of_mdio.h> | 15 | #include <linux/of_mdio.h> |
| 15 | 16 | ||
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index 8dedb266f143..c4399e23565a 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
| @@ -500,6 +500,7 @@ static int __init mpc512x_psc_fifoc_init(void) | |||
| 500 | psc_fifoc = of_iomap(np, 0); | 500 | psc_fifoc = of_iomap(np, 0); |
| 501 | if (!psc_fifoc) { | 501 | if (!psc_fifoc) { |
| 502 | pr_err("%s: Can't map FIFOC\n", __func__); | 502 | pr_err("%s: Can't map FIFOC\n", __func__); |
| 503 | of_node_put(np); | ||
| 503 | return -ENODEV; | 504 | return -ENODEV; |
| 504 | } | 505 | } |
| 505 | 506 | ||
diff --git a/drivers/spi/amba-pl022.c b/drivers/spi/amba-pl022.c index acd35d1ebd12..4c37c4e28647 100644 --- a/drivers/spi/amba-pl022.c +++ b/drivers/spi/amba-pl022.c | |||
| @@ -503,8 +503,9 @@ static void giveback(struct pl022 *pl022) | |||
| 503 | msg->state = NULL; | 503 | msg->state = NULL; |
| 504 | if (msg->complete) | 504 | if (msg->complete) |
| 505 | msg->complete(msg->context); | 505 | msg->complete(msg->context); |
| 506 | /* This message is completed, so let's turn off the clock! */ | 506 | /* This message is completed, so let's turn off the clocks! */ |
| 507 | clk_disable(pl022->clk); | 507 | clk_disable(pl022->clk); |
| 508 | amba_pclk_disable(pl022->adev); | ||
| 508 | } | 509 | } |
| 509 | 510 | ||
| 510 | /** | 511 | /** |
| @@ -1139,9 +1140,10 @@ static void pump_messages(struct work_struct *work) | |||
| 1139 | /* Setup the SPI using the per chip configuration */ | 1140 | /* Setup the SPI using the per chip configuration */ |
| 1140 | pl022->cur_chip = spi_get_ctldata(pl022->cur_msg->spi); | 1141 | pl022->cur_chip = spi_get_ctldata(pl022->cur_msg->spi); |
| 1141 | /* | 1142 | /* |
| 1142 | * We enable the clock here, then the clock will be disabled when | 1143 | * We enable the clocks here, then the clocks will be disabled when |
| 1143 | * giveback() is called in each method (poll/interrupt/DMA) | 1144 | * giveback() is called in each method (poll/interrupt/DMA) |
| 1144 | */ | 1145 | */ |
| 1146 | amba_pclk_enable(pl022->adev); | ||
| 1145 | clk_enable(pl022->clk); | 1147 | clk_enable(pl022->clk); |
| 1146 | restore_state(pl022); | 1148 | restore_state(pl022); |
| 1147 | flush(pl022); | 1149 | flush(pl022); |
| @@ -1786,11 +1788,9 @@ pl022_probe(struct amba_device *adev, struct amba_id *id) | |||
| 1786 | } | 1788 | } |
| 1787 | 1789 | ||
| 1788 | /* Disable SSP */ | 1790 | /* Disable SSP */ |
| 1789 | clk_enable(pl022->clk); | ||
| 1790 | writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)), | 1791 | writew((readw(SSP_CR1(pl022->virtbase)) & (~SSP_CR1_MASK_SSE)), |
| 1791 | SSP_CR1(pl022->virtbase)); | 1792 | SSP_CR1(pl022->virtbase)); |
| 1792 | load_ssp_default_config(pl022); | 1793 | load_ssp_default_config(pl022); |
| 1793 | clk_disable(pl022->clk); | ||
| 1794 | 1794 | ||
| 1795 | status = request_irq(adev->irq[0], pl022_interrupt_handler, 0, "pl022", | 1795 | status = request_irq(adev->irq[0], pl022_interrupt_handler, 0, "pl022", |
| 1796 | pl022); | 1796 | pl022); |
| @@ -1818,6 +1818,8 @@ pl022_probe(struct amba_device *adev, struct amba_id *id) | |||
| 1818 | goto err_spi_register; | 1818 | goto err_spi_register; |
| 1819 | } | 1819 | } |
| 1820 | dev_dbg(dev, "probe succeded\n"); | 1820 | dev_dbg(dev, "probe succeded\n"); |
| 1821 | /* Disable the silicon block pclk and clock it when needed */ | ||
| 1822 | amba_pclk_disable(adev); | ||
| 1821 | return 0; | 1823 | return 0; |
| 1822 | 1824 | ||
| 1823 | err_spi_register: | 1825 | err_spi_register: |
| @@ -1879,9 +1881,9 @@ static int pl022_suspend(struct amba_device *adev, pm_message_t state) | |||
| 1879 | return status; | 1881 | return status; |
| 1880 | } | 1882 | } |
| 1881 | 1883 | ||
| 1882 | clk_enable(pl022->clk); | 1884 | amba_pclk_enable(adev); |
| 1883 | load_ssp_default_config(pl022); | 1885 | load_ssp_default_config(pl022); |
| 1884 | clk_disable(pl022->clk); | 1886 | amba_pclk_disable(adev); |
| 1885 | dev_dbg(&adev->dev, "suspended\n"); | 1887 | dev_dbg(&adev->dev, "suspended\n"); |
| 1886 | return 0; | 1888 | return 0; |
| 1887 | } | 1889 | } |
| @@ -1981,7 +1983,7 @@ static int __init pl022_init(void) | |||
| 1981 | return amba_driver_register(&pl022_driver); | 1983 | return amba_driver_register(&pl022_driver); |
| 1982 | } | 1984 | } |
| 1983 | 1985 | ||
| 1984 | module_init(pl022_init); | 1986 | subsys_initcall(pl022_init); |
| 1985 | 1987 | ||
| 1986 | static void __exit pl022_exit(void) | 1988 | static void __exit pl022_exit(void) |
| 1987 | { | 1989 | { |
diff --git a/drivers/spi/dw_spi.c b/drivers/spi/dw_spi.c index d256cb00604c..56247853c298 100644 --- a/drivers/spi/dw_spi.c +++ b/drivers/spi/dw_spi.c | |||
| @@ -181,10 +181,6 @@ static void flush(struct dw_spi *dws) | |||
| 181 | wait_till_not_busy(dws); | 181 | wait_till_not_busy(dws); |
| 182 | } | 182 | } |
| 183 | 183 | ||
| 184 | static void null_cs_control(u32 command) | ||
| 185 | { | ||
| 186 | } | ||
| 187 | |||
| 188 | static int null_writer(struct dw_spi *dws) | 184 | static int null_writer(struct dw_spi *dws) |
| 189 | { | 185 | { |
| 190 | u8 n_bytes = dws->n_bytes; | 186 | u8 n_bytes = dws->n_bytes; |
| @@ -322,7 +318,7 @@ static void giveback(struct dw_spi *dws) | |||
| 322 | struct spi_transfer, | 318 | struct spi_transfer, |
| 323 | transfer_list); | 319 | transfer_list); |
| 324 | 320 | ||
| 325 | if (!last_transfer->cs_change) | 321 | if (!last_transfer->cs_change && dws->cs_control) |
| 326 | dws->cs_control(MRST_SPI_DEASSERT); | 322 | dws->cs_control(MRST_SPI_DEASSERT); |
| 327 | 323 | ||
| 328 | msg->state = NULL; | 324 | msg->state = NULL; |
| @@ -396,6 +392,11 @@ static irqreturn_t interrupt_transfer(struct dw_spi *dws) | |||
| 396 | static irqreturn_t dw_spi_irq(int irq, void *dev_id) | 392 | static irqreturn_t dw_spi_irq(int irq, void *dev_id) |
| 397 | { | 393 | { |
| 398 | struct dw_spi *dws = dev_id; | 394 | struct dw_spi *dws = dev_id; |
| 395 | u16 irq_status, irq_mask = 0x3f; | ||
| 396 | |||
| 397 | irq_status = dw_readw(dws, isr) & irq_mask; | ||
| 398 | if (!irq_status) | ||
| 399 | return IRQ_NONE; | ||
| 399 | 400 | ||
| 400 | if (!dws->cur_msg) { | 401 | if (!dws->cur_msg) { |
| 401 | spi_mask_intr(dws, SPI_INT_TXEI); | 402 | spi_mask_intr(dws, SPI_INT_TXEI); |
| @@ -544,13 +545,13 @@ static void pump_transfers(unsigned long data) | |||
| 544 | */ | 545 | */ |
| 545 | if (dws->cs_control) { | 546 | if (dws->cs_control) { |
| 546 | if (dws->rx && dws->tx) | 547 | if (dws->rx && dws->tx) |
| 547 | chip->tmode = 0x00; | 548 | chip->tmode = SPI_TMOD_TR; |
| 548 | else if (dws->rx) | 549 | else if (dws->rx) |
| 549 | chip->tmode = 0x02; | 550 | chip->tmode = SPI_TMOD_RO; |
| 550 | else | 551 | else |
| 551 | chip->tmode = 0x01; | 552 | chip->tmode = SPI_TMOD_TO; |
| 552 | 553 | ||
| 553 | cr0 &= ~(0x3 << SPI_MODE_OFFSET); | 554 | cr0 &= ~SPI_TMOD_MASK; |
| 554 | cr0 |= (chip->tmode << SPI_TMOD_OFFSET); | 555 | cr0 |= (chip->tmode << SPI_TMOD_OFFSET); |
| 555 | } | 556 | } |
| 556 | 557 | ||
| @@ -699,9 +700,6 @@ static int dw_spi_setup(struct spi_device *spi) | |||
| 699 | chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); | 700 | chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); |
| 700 | if (!chip) | 701 | if (!chip) |
| 701 | return -ENOMEM; | 702 | return -ENOMEM; |
| 702 | |||
| 703 | chip->cs_control = null_cs_control; | ||
| 704 | chip->enable_dma = 0; | ||
| 705 | } | 703 | } |
| 706 | 704 | ||
| 707 | /* | 705 | /* |
| @@ -883,7 +881,7 @@ int __devinit dw_spi_add_host(struct dw_spi *dws) | |||
| 883 | dws->dma_inited = 0; | 881 | dws->dma_inited = 0; |
| 884 | dws->dma_addr = (dma_addr_t)(dws->paddr + 0x60); | 882 | dws->dma_addr = (dma_addr_t)(dws->paddr + 0x60); |
| 885 | 883 | ||
| 886 | ret = request_irq(dws->irq, dw_spi_irq, 0, | 884 | ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, |
| 887 | "dw_spi", dws); | 885 | "dw_spi", dws); |
| 888 | if (ret < 0) { | 886 | if (ret < 0) { |
| 889 | dev_err(&master->dev, "can not get IRQ\n"); | 887 | dev_err(&master->dev, "can not get IRQ\n"); |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index a9e5c79ae52a..0bcf4c1601a2 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
| @@ -554,11 +554,9 @@ done: | |||
| 554 | EXPORT_SYMBOL_GPL(spi_register_master); | 554 | EXPORT_SYMBOL_GPL(spi_register_master); |
| 555 | 555 | ||
| 556 | 556 | ||
| 557 | static int __unregister(struct device *dev, void *master_dev) | 557 | static int __unregister(struct device *dev, void *null) |
| 558 | { | 558 | { |
| 559 | /* note: before about 2.6.14-rc1 this would corrupt memory: */ | 559 | spi_unregister_device(to_spi_device(dev)); |
| 560 | if (dev != master_dev) | ||
| 561 | spi_unregister_device(to_spi_device(dev)); | ||
| 562 | return 0; | 560 | return 0; |
| 563 | } | 561 | } |
| 564 | 562 | ||
| @@ -576,8 +574,7 @@ void spi_unregister_master(struct spi_master *master) | |||
| 576 | { | 574 | { |
| 577 | int dummy; | 575 | int dummy; |
| 578 | 576 | ||
| 579 | dummy = device_for_each_child(master->dev.parent, &master->dev, | 577 | dummy = device_for_each_child(&master->dev, NULL, __unregister); |
| 580 | __unregister); | ||
| 581 | device_unregister(&master->dev); | 578 | device_unregister(&master->dev); |
| 582 | } | 579 | } |
| 583 | EXPORT_SYMBOL_GPL(spi_unregister_master); | 580 | EXPORT_SYMBOL_GPL(spi_unregister_master); |
diff --git a/drivers/spi/spi_s3c64xx.c b/drivers/spi/spi_s3c64xx.c index 97365815a729..c3038da2648a 100644 --- a/drivers/spi/spi_s3c64xx.c +++ b/drivers/spi/spi_s3c64xx.c | |||
| @@ -200,6 +200,9 @@ static void flush_fifo(struct s3c64xx_spi_driver_data *sdd) | |||
| 200 | val = readl(regs + S3C64XX_SPI_STATUS); | 200 | val = readl(regs + S3C64XX_SPI_STATUS); |
| 201 | } while (TX_FIFO_LVL(val, sci) && loops--); | 201 | } while (TX_FIFO_LVL(val, sci) && loops--); |
| 202 | 202 | ||
| 203 | if (loops == 0) | ||
| 204 | dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n"); | ||
| 205 | |||
| 203 | /* Flush RxFIFO*/ | 206 | /* Flush RxFIFO*/ |
| 204 | loops = msecs_to_loops(1); | 207 | loops = msecs_to_loops(1); |
| 205 | do { | 208 | do { |
| @@ -210,6 +213,9 @@ static void flush_fifo(struct s3c64xx_spi_driver_data *sdd) | |||
| 210 | break; | 213 | break; |
| 211 | } while (loops--); | 214 | } while (loops--); |
| 212 | 215 | ||
| 216 | if (loops == 0) | ||
| 217 | dev_warn(&sdd->pdev->dev, "Timed out flushing RX FIFO\n"); | ||
| 218 | |||
| 213 | val = readl(regs + S3C64XX_SPI_CH_CFG); | 219 | val = readl(regs + S3C64XX_SPI_CH_CFG); |
| 214 | val &= ~S3C64XX_SPI_CH_SW_RST; | 220 | val &= ~S3C64XX_SPI_CH_SW_RST; |
| 215 | writel(val, regs + S3C64XX_SPI_CH_CFG); | 221 | writel(val, regs + S3C64XX_SPI_CH_CFG); |
| @@ -320,16 +326,17 @@ static int wait_for_xfer(struct s3c64xx_spi_driver_data *sdd, | |||
| 320 | 326 | ||
| 321 | /* millisecs to xfer 'len' bytes @ 'cur_speed' */ | 327 | /* millisecs to xfer 'len' bytes @ 'cur_speed' */ |
| 322 | ms = xfer->len * 8 * 1000 / sdd->cur_speed; | 328 | ms = xfer->len * 8 * 1000 / sdd->cur_speed; |
| 323 | ms += 5; /* some tolerance */ | 329 | ms += 10; /* some tolerance */ |
| 324 | 330 | ||
| 325 | if (dma_mode) { | 331 | if (dma_mode) { |
| 326 | val = msecs_to_jiffies(ms) + 10; | 332 | val = msecs_to_jiffies(ms) + 10; |
| 327 | val = wait_for_completion_timeout(&sdd->xfer_completion, val); | 333 | val = wait_for_completion_timeout(&sdd->xfer_completion, val); |
| 328 | } else { | 334 | } else { |
| 335 | u32 status; | ||
| 329 | val = msecs_to_loops(ms); | 336 | val = msecs_to_loops(ms); |
| 330 | do { | 337 | do { |
| 331 | val = readl(regs + S3C64XX_SPI_STATUS); | 338 | status = readl(regs + S3C64XX_SPI_STATUS); |
| 332 | } while (RX_FIFO_LVL(val, sci) < xfer->len && --val); | 339 | } while (RX_FIFO_LVL(status, sci) < xfer->len && --val); |
| 333 | } | 340 | } |
| 334 | 341 | ||
| 335 | if (!val) | 342 | if (!val) |
| @@ -447,8 +454,8 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) | |||
| 447 | writel(val, regs + S3C64XX_SPI_CLK_CFG); | 454 | writel(val, regs + S3C64XX_SPI_CLK_CFG); |
| 448 | } | 455 | } |
| 449 | 456 | ||
| 450 | void s3c64xx_spi_dma_rxcb(struct s3c2410_dma_chan *chan, void *buf_id, | 457 | static void s3c64xx_spi_dma_rxcb(struct s3c2410_dma_chan *chan, void *buf_id, |
| 451 | int size, enum s3c2410_dma_buffresult res) | 458 | int size, enum s3c2410_dma_buffresult res) |
| 452 | { | 459 | { |
| 453 | struct s3c64xx_spi_driver_data *sdd = buf_id; | 460 | struct s3c64xx_spi_driver_data *sdd = buf_id; |
| 454 | unsigned long flags; | 461 | unsigned long flags; |
| @@ -467,8 +474,8 @@ void s3c64xx_spi_dma_rxcb(struct s3c2410_dma_chan *chan, void *buf_id, | |||
| 467 | spin_unlock_irqrestore(&sdd->lock, flags); | 474 | spin_unlock_irqrestore(&sdd->lock, flags); |
| 468 | } | 475 | } |
| 469 | 476 | ||
| 470 | void s3c64xx_spi_dma_txcb(struct s3c2410_dma_chan *chan, void *buf_id, | 477 | static void s3c64xx_spi_dma_txcb(struct s3c2410_dma_chan *chan, void *buf_id, |
| 471 | int size, enum s3c2410_dma_buffresult res) | 478 | int size, enum s3c2410_dma_buffresult res) |
| 472 | { | 479 | { |
| 473 | struct s3c64xx_spi_driver_data *sdd = buf_id; | 480 | struct s3c64xx_spi_driver_data *sdd = buf_id; |
| 474 | unsigned long flags; | 481 | unsigned long flags; |
| @@ -508,8 +515,9 @@ static int s3c64xx_spi_map_mssg(struct s3c64xx_spi_driver_data *sdd, | |||
| 508 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | 515 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
| 509 | 516 | ||
| 510 | if (xfer->tx_buf != NULL) { | 517 | if (xfer->tx_buf != NULL) { |
| 511 | xfer->tx_dma = dma_map_single(dev, xfer->tx_buf, | 518 | xfer->tx_dma = dma_map_single(dev, |
| 512 | xfer->len, DMA_TO_DEVICE); | 519 | (void *)xfer->tx_buf, xfer->len, |
| 520 | DMA_TO_DEVICE); | ||
| 513 | if (dma_mapping_error(dev, xfer->tx_dma)) { | 521 | if (dma_mapping_error(dev, xfer->tx_dma)) { |
| 514 | dev_err(dev, "dma_map_single Tx failed\n"); | 522 | dev_err(dev, "dma_map_single Tx failed\n"); |
| 515 | xfer->tx_dma = XFER_DMAADDR_INVALID; | 523 | xfer->tx_dma = XFER_DMAADDR_INVALID; |
| @@ -919,6 +927,13 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev) | |||
| 919 | return -ENODEV; | 927 | return -ENODEV; |
| 920 | } | 928 | } |
| 921 | 929 | ||
| 930 | sci = pdev->dev.platform_data; | ||
| 931 | if (!sci->src_clk_name) { | ||
| 932 | dev_err(&pdev->dev, | ||
| 933 | "Board init must call s3c64xx_spi_set_info()\n"); | ||
| 934 | return -EINVAL; | ||
| 935 | } | ||
| 936 | |||
| 922 | /* Check for availability of necessary resource */ | 937 | /* Check for availability of necessary resource */ |
| 923 | 938 | ||
| 924 | dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); | 939 | dmatx_res = platform_get_resource(pdev, IORESOURCE_DMA, 0); |
| @@ -946,8 +961,6 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev) | |||
| 946 | return -ENOMEM; | 961 | return -ENOMEM; |
| 947 | } | 962 | } |
| 948 | 963 | ||
| 949 | sci = pdev->dev.platform_data; | ||
| 950 | |||
| 951 | platform_set_drvdata(pdev, master); | 964 | platform_set_drvdata(pdev, master); |
| 952 | 965 | ||
| 953 | sdd = spi_master_get_devdata(master); | 966 | sdd = spi_master_get_devdata(master); |
| @@ -1170,7 +1183,7 @@ static int __init s3c64xx_spi_init(void) | |||
| 1170 | { | 1183 | { |
| 1171 | return platform_driver_probe(&s3c64xx_spi_driver, s3c64xx_spi_probe); | 1184 | return platform_driver_probe(&s3c64xx_spi_driver, s3c64xx_spi_probe); |
| 1172 | } | 1185 | } |
| 1173 | module_init(s3c64xx_spi_init); | 1186 | subsys_initcall(s3c64xx_spi_init); |
| 1174 | 1187 | ||
| 1175 | static void __exit s3c64xx_spi_exit(void) | 1188 | static void __exit s3c64xx_spi_exit(void) |
| 1176 | { | 1189 | { |
diff --git a/include/linux/gpio.h b/include/linux/gpio.h index 03f616b78cfa..e41f7dd1ae67 100644 --- a/include/linux/gpio.h +++ b/include/linux/gpio.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/errno.h> | 13 | #include <linux/errno.h> |
| 14 | 14 | ||
| 15 | struct device; | 15 | struct device; |
| 16 | struct gpio_chip; | ||
| 16 | 17 | ||
| 17 | /* | 18 | /* |
| 18 | * Some platforms don't support the GPIO programming interface. | 19 | * Some platforms don't support the GPIO programming interface. |
diff --git a/include/linux/spi/dw_spi.h b/include/linux/spi/dw_spi.h index cc813f95a2f2..c91302f3a257 100644 --- a/include/linux/spi/dw_spi.h +++ b/include/linux/spi/dw_spi.h | |||
| @@ -14,7 +14,9 @@ | |||
| 14 | #define SPI_MODE_OFFSET 6 | 14 | #define SPI_MODE_OFFSET 6 |
| 15 | #define SPI_SCPH_OFFSET 6 | 15 | #define SPI_SCPH_OFFSET 6 |
| 16 | #define SPI_SCOL_OFFSET 7 | 16 | #define SPI_SCOL_OFFSET 7 |
| 17 | |||
| 17 | #define SPI_TMOD_OFFSET 8 | 18 | #define SPI_TMOD_OFFSET 8 |
| 19 | #define SPI_TMOD_MASK (0x3 << SPI_TMOD_OFFSET) | ||
| 18 | #define SPI_TMOD_TR 0x0 /* xmit & recv */ | 20 | #define SPI_TMOD_TR 0x0 /* xmit & recv */ |
| 19 | #define SPI_TMOD_TO 0x1 /* xmit only */ | 21 | #define SPI_TMOD_TO 0x1 /* xmit only */ |
| 20 | #define SPI_TMOD_RO 0x2 /* recv only */ | 22 | #define SPI_TMOD_RO 0x2 /* recv only */ |
