aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorThomas Abraham <thomas.abraham@linaro.org>2012-07-12 18:15:14 -0400
committerKukjin Kim <kgene.kim@samsung.com>2012-07-13 02:23:46 -0400
commita5238e360b715e9a1bb39d7d3537f78cc9e9e286 (patch)
treeb6503a7429b93b7c15f90d5e3b0124a191215423 /drivers/spi
parent2b54be661191532ddf1628c3b151b81ae8743caa (diff)
spi: s3c64xx: move controller information into driver data
Platform data is used to specify controller hardware specific information such as the tx/rx fifo level mask and bit offset of rx fifo level. Such information is not suitable to be supplied from device tree. Instead, it can be moved into the driver data and removed from platform data. Signed-off-by: Thomas Abraham <thomas.abraham@linaro.org> Acked-by: Jaswinder Singh <jaswinder.singh@linaro.org> Acked-by: Grant Likely <grant.likely@secretlab.ca> Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/spi-s3c64xx.c150
1 files changed, 123 insertions, 27 deletions
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index 6e60eecbfc4f..8698618e56fe 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -31,6 +31,8 @@
31#include <mach/dma.h> 31#include <mach/dma.h>
32#include <plat/s3c64xx-spi.h> 32#include <plat/s3c64xx-spi.h>
33 33
34#define MAX_SPI_PORTS 3
35
34/* Registers and bit-fields */ 36/* Registers and bit-fields */
35 37
36#define S3C64XX_SPI_CH_CFG 0x00 38#define S3C64XX_SPI_CH_CFG 0x00
@@ -113,9 +115,12 @@
113 115
114#define S3C64XX_SPI_FBCLK_MSK (3<<0) 116#define S3C64XX_SPI_FBCLK_MSK (3<<0)
115 117
116#define S3C64XX_SPI_ST_TX_DONE(v, i) (((v) & (1 << (i)->tx_st_done)) ? 1 : 0) 118#define FIFO_LVL_MASK(i) ((i)->port_conf->fifo_lvl_mask[i->port_id])
117#define TX_FIFO_LVL(v, i) (((v) >> 6) & (i)->fifo_lvl_mask) 119#define S3C64XX_SPI_ST_TX_DONE(v, i) (((v) & \
118#define RX_FIFO_LVL(v, i) (((v) >> (i)->rx_lvl_offset) & (i)->fifo_lvl_mask) 120 (1 << (i)->port_conf->tx_st_done)) ? 1 : 0)
121#define TX_FIFO_LVL(v, i) (((v) >> 6) & FIFO_LVL_MASK(i))
122#define RX_FIFO_LVL(v, i) (((v) >> (i)->port_conf->rx_lvl_offset) & \
123 FIFO_LVL_MASK(i))
119 124
120#define S3C64XX_SPI_MAX_TRAILCNT 0x3ff 125#define S3C64XX_SPI_MAX_TRAILCNT 0x3ff
121#define S3C64XX_SPI_TRAILCNT_OFF 19 126#define S3C64XX_SPI_TRAILCNT_OFF 19
@@ -134,6 +139,28 @@ struct s3c64xx_spi_dma_data {
134}; 139};
135 140
136/** 141/**
142 * struct s3c64xx_spi_info - SPI Controller hardware info
143 * @fifo_lvl_mask: Bit-mask for {TX|RX}_FIFO_LVL bits in SPI_STATUS register.
144 * @rx_lvl_offset: Bit offset of RX_FIFO_LVL bits in SPI_STATUS regiter.
145 * @tx_st_done: Bit offset of TX_DONE bit in SPI_STATUS regiter.
146 * @high_speed: True, if the controller supports HIGH_SPEED_EN bit.
147 * @clk_from_cmu: True, if the controller does not include a clock mux and
148 * prescaler unit.
149 *
150 * The Samsung s3c64xx SPI controller are used on various Samsung SoC's but
151 * differ in some aspects such as the size of the fifo and spi bus clock
152 * setup. Such differences are specified to the driver using this structure
153 * which is provided as driver data to the driver.
154 */
155struct s3c64xx_spi_port_config {
156 int fifo_lvl_mask[MAX_SPI_PORTS];
157 int rx_lvl_offset;
158 int tx_st_done;
159 bool high_speed;
160 bool clk_from_cmu;
161};
162
163/**
137 * struct s3c64xx_spi_driver_data - Runtime info holder for SPI driver. 164 * struct s3c64xx_spi_driver_data - Runtime info holder for SPI driver.
138 * @clk: Pointer to the spi clock. 165 * @clk: Pointer to the spi clock.
139 * @src_clk: Pointer to the clock used to generate SPI signals. 166 * @src_clk: Pointer to the clock used to generate SPI signals.
@@ -171,6 +198,8 @@ struct s3c64xx_spi_driver_data {
171 struct s3c64xx_spi_dma_data rx_dma; 198 struct s3c64xx_spi_dma_data rx_dma;
172 struct s3c64xx_spi_dma_data tx_dma; 199 struct s3c64xx_spi_dma_data tx_dma;
173 struct samsung_dma_ops *ops; 200 struct samsung_dma_ops *ops;
201 struct s3c64xx_spi_port_config *port_conf;
202 unsigned int port_id;
174}; 203};
175 204
176static struct s3c2410_dma_client s3c64xx_spi_dma_client = { 205static struct s3c2410_dma_client s3c64xx_spi_dma_client = {
@@ -179,7 +208,6 @@ static struct s3c2410_dma_client s3c64xx_spi_dma_client = {
179 208
180static void flush_fifo(struct s3c64xx_spi_driver_data *sdd) 209static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
181{ 210{
182 struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
183 void __iomem *regs = sdd->regs; 211 void __iomem *regs = sdd->regs;
184 unsigned long loops; 212 unsigned long loops;
185 u32 val; 213 u32 val;
@@ -195,7 +223,7 @@ static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
195 loops = msecs_to_loops(1); 223 loops = msecs_to_loops(1);
196 do { 224 do {
197 val = readl(regs + S3C64XX_SPI_STATUS); 225 val = readl(regs + S3C64XX_SPI_STATUS);
198 } while (TX_FIFO_LVL(val, sci) && loops--); 226 } while (TX_FIFO_LVL(val, sdd) && loops--);
199 227
200 if (loops == 0) 228 if (loops == 0)
201 dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n"); 229 dev_warn(&sdd->pdev->dev, "Timed out flushing TX FIFO\n");
@@ -204,7 +232,7 @@ static void flush_fifo(struct s3c64xx_spi_driver_data *sdd)
204 loops = msecs_to_loops(1); 232 loops = msecs_to_loops(1);
205 do { 233 do {
206 val = readl(regs + S3C64XX_SPI_STATUS); 234 val = readl(regs + S3C64XX_SPI_STATUS);
207 if (RX_FIFO_LVL(val, sci)) 235 if (RX_FIFO_LVL(val, sdd))
208 readl(regs + S3C64XX_SPI_RX_DATA); 236 readl(regs + S3C64XX_SPI_RX_DATA);
209 else 237 else
210 break; 238 break;
@@ -307,7 +335,6 @@ static void enable_datapath(struct s3c64xx_spi_driver_data *sdd,
307 struct spi_device *spi, 335 struct spi_device *spi,
308 struct spi_transfer *xfer, int dma_mode) 336 struct spi_transfer *xfer, int dma_mode)
309{ 337{
310 struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
311 void __iomem *regs = sdd->regs; 338 void __iomem *regs = sdd->regs;
312 u32 modecfg, chcfg; 339 u32 modecfg, chcfg;
313 340
@@ -357,7 +384,7 @@ static void enable_datapath(struct s3c64xx_spi_driver_data *sdd,
357 if (xfer->rx_buf != NULL) { 384 if (xfer->rx_buf != NULL) {
358 sdd->state |= RXBUSY; 385 sdd->state |= RXBUSY;
359 386
360 if (sci->high_speed && sdd->cur_speed >= 30000000UL 387 if (sdd->port_conf->high_speed && sdd->cur_speed >= 30000000UL
361 && !(sdd->cur_mode & SPI_CPHA)) 388 && !(sdd->cur_mode & SPI_CPHA))
362 chcfg |= S3C64XX_SPI_CH_HS_EN; 389 chcfg |= S3C64XX_SPI_CH_HS_EN;
363 390
@@ -397,7 +424,6 @@ static inline void enable_cs(struct s3c64xx_spi_driver_data *sdd,
397static int wait_for_xfer(struct s3c64xx_spi_driver_data *sdd, 424static int wait_for_xfer(struct s3c64xx_spi_driver_data *sdd,
398 struct spi_transfer *xfer, int dma_mode) 425 struct spi_transfer *xfer, int dma_mode)
399{ 426{
400 struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
401 void __iomem *regs = sdd->regs; 427 void __iomem *regs = sdd->regs;
402 unsigned long val; 428 unsigned long val;
403 int ms; 429 int ms;
@@ -414,7 +440,7 @@ static int wait_for_xfer(struct s3c64xx_spi_driver_data *sdd,
414 val = msecs_to_loops(ms); 440 val = msecs_to_loops(ms);
415 do { 441 do {
416 status = readl(regs + S3C64XX_SPI_STATUS); 442 status = readl(regs + S3C64XX_SPI_STATUS);
417 } while (RX_FIFO_LVL(status, sci) < xfer->len && --val); 443 } while (RX_FIFO_LVL(status, sdd) < xfer->len && --val);
418 } 444 }
419 445
420 if (!val) 446 if (!val)
@@ -433,8 +459,8 @@ static int wait_for_xfer(struct s3c64xx_spi_driver_data *sdd,
433 if (xfer->rx_buf == NULL) { 459 if (xfer->rx_buf == NULL) {
434 val = msecs_to_loops(10); 460 val = msecs_to_loops(10);
435 status = readl(regs + S3C64XX_SPI_STATUS); 461 status = readl(regs + S3C64XX_SPI_STATUS);
436 while ((TX_FIFO_LVL(status, sci) 462 while ((TX_FIFO_LVL(status, sdd)
437 || !S3C64XX_SPI_ST_TX_DONE(status, sci)) 463 || !S3C64XX_SPI_ST_TX_DONE(status, sdd))
438 && --val) { 464 && --val) {
439 cpu_relax(); 465 cpu_relax();
440 status = readl(regs + S3C64XX_SPI_STATUS); 466 status = readl(regs + S3C64XX_SPI_STATUS);
@@ -483,12 +509,11 @@ static inline void disable_cs(struct s3c64xx_spi_driver_data *sdd,
483 509
484static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) 510static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)
485{ 511{
486 struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
487 void __iomem *regs = sdd->regs; 512 void __iomem *regs = sdd->regs;
488 u32 val; 513 u32 val;
489 514
490 /* Disable Clock */ 515 /* Disable Clock */
491 if (sci->clk_from_cmu) { 516 if (sdd->port_conf->clk_from_cmu) {
492 clk_disable(sdd->src_clk); 517 clk_disable(sdd->src_clk);
493 } else { 518 } else {
494 val = readl(regs + S3C64XX_SPI_CLK_CFG); 519 val = readl(regs + S3C64XX_SPI_CLK_CFG);
@@ -532,7 +557,7 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)
532 557
533 writel(val, regs + S3C64XX_SPI_MODE_CFG); 558 writel(val, regs + S3C64XX_SPI_MODE_CFG);
534 559
535 if (sci->clk_from_cmu) { 560 if (sdd->port_conf->clk_from_cmu) {
536 /* Configure Clock */ 561 /* Configure Clock */
537 /* There is half-multiplier before the SPI */ 562 /* There is half-multiplier before the SPI */
538 clk_set_rate(sdd->src_clk, sdd->cur_speed * 2); 563 clk_set_rate(sdd->src_clk, sdd->cur_speed * 2);
@@ -558,7 +583,6 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)
558static int s3c64xx_spi_map_mssg(struct s3c64xx_spi_driver_data *sdd, 583static int s3c64xx_spi_map_mssg(struct s3c64xx_spi_driver_data *sdd,
559 struct spi_message *msg) 584 struct spi_message *msg)
560{ 585{
561 struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
562 struct device *dev = &sdd->pdev->dev; 586 struct device *dev = &sdd->pdev->dev;
563 struct spi_transfer *xfer; 587 struct spi_transfer *xfer;
564 588
@@ -574,7 +598,7 @@ static int s3c64xx_spi_map_mssg(struct s3c64xx_spi_driver_data *sdd,
574 /* Map until end or first fail */ 598 /* Map until end or first fail */
575 list_for_each_entry(xfer, &msg->transfers, transfer_list) { 599 list_for_each_entry(xfer, &msg->transfers, transfer_list) {
576 600
577 if (xfer->len <= ((sci->fifo_lvl_mask >> 1) + 1)) 601 if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1))
578 continue; 602 continue;
579 603
580 if (xfer->tx_buf != NULL) { 604 if (xfer->tx_buf != NULL) {
@@ -608,7 +632,6 @@ static int s3c64xx_spi_map_mssg(struct s3c64xx_spi_driver_data *sdd,
608static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd, 632static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd,
609 struct spi_message *msg) 633 struct spi_message *msg)
610{ 634{
611 struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
612 struct device *dev = &sdd->pdev->dev; 635 struct device *dev = &sdd->pdev->dev;
613 struct spi_transfer *xfer; 636 struct spi_transfer *xfer;
614 637
@@ -617,7 +640,7 @@ static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd,
617 640
618 list_for_each_entry(xfer, &msg->transfers, transfer_list) { 641 list_for_each_entry(xfer, &msg->transfers, transfer_list) {
619 642
620 if (xfer->len <= ((sci->fifo_lvl_mask >> 1) + 1)) 643 if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1))
621 continue; 644 continue;
622 645
623 if (xfer->rx_buf != NULL 646 if (xfer->rx_buf != NULL
@@ -636,7 +659,6 @@ static int s3c64xx_spi_transfer_one_message(struct spi_master *master,
636 struct spi_message *msg) 659 struct spi_message *msg)
637{ 660{
638 struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); 661 struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
639 struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
640 struct spi_device *spi = msg->spi; 662 struct spi_device *spi = msg->spi;
641 struct s3c64xx_spi_csinfo *cs = spi->controller_data; 663 struct s3c64xx_spi_csinfo *cs = spi->controller_data;
642 struct spi_transfer *xfer; 664 struct spi_transfer *xfer;
@@ -691,7 +713,7 @@ static int s3c64xx_spi_transfer_one_message(struct spi_master *master,
691 } 713 }
692 714
693 /* Polling method for xfers not bigger than FIFO capacity */ 715 /* Polling method for xfers not bigger than FIFO capacity */
694 if (xfer->len <= ((sci->fifo_lvl_mask >> 1) + 1)) 716 if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1))
695 use_dma = 0; 717 use_dma = 0;
696 else 718 else
697 use_dma = 1; 719 use_dma = 1;
@@ -845,7 +867,7 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
845 pm_runtime_get_sync(&sdd->pdev->dev); 867 pm_runtime_get_sync(&sdd->pdev->dev);
846 868
847 /* Check if we can provide the requested rate */ 869 /* Check if we can provide the requested rate */
848 if (!sci->clk_from_cmu) { 870 if (!sdd->port_conf->clk_from_cmu) {
849 u32 psr, speed; 871 u32 psr, speed;
850 872
851 /* Max possible */ 873 /* Max possible */
@@ -926,7 +948,7 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel)
926 /* Disable Interrupts - we use Polling if not DMA mode */ 948 /* Disable Interrupts - we use Polling if not DMA mode */
927 writel(0, regs + S3C64XX_SPI_INT_EN); 949 writel(0, regs + S3C64XX_SPI_INT_EN);
928 950
929 if (!sci->clk_from_cmu) 951 if (!sdd->port_conf->clk_from_cmu)
930 writel(sci->src_clk_nr << S3C64XX_SPI_CLKSEL_SRCSHFT, 952 writel(sci->src_clk_nr << S3C64XX_SPI_CLKSEL_SRCSHFT,
931 regs + S3C64XX_SPI_CLK_CFG); 953 regs + S3C64XX_SPI_CLK_CFG);
932 writel(0, regs + S3C64XX_SPI_MODE_CFG); 954 writel(0, regs + S3C64XX_SPI_MODE_CFG);
@@ -947,6 +969,13 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel)
947 flush_fifo(sdd); 969 flush_fifo(sdd);
948} 970}
949 971
972static inline struct s3c64xx_spi_port_config *s3c64xx_spi_get_port_config(
973 struct platform_device *pdev)
974{
975 return (struct s3c64xx_spi_port_config *)
976 platform_get_device_id(pdev)->driver_data;
977}
978
950static int __init s3c64xx_spi_probe(struct platform_device *pdev) 979static int __init s3c64xx_spi_probe(struct platform_device *pdev)
951{ 980{
952 struct resource *mem_res, *dmatx_res, *dmarx_res; 981 struct resource *mem_res, *dmatx_res, *dmarx_res;
@@ -1005,6 +1034,7 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
1005 platform_set_drvdata(pdev, master); 1034 platform_set_drvdata(pdev, master);
1006 1035
1007 sdd = spi_master_get_devdata(master); 1036 sdd = spi_master_get_devdata(master);
1037 sdd->port_conf = s3c64xx_spi_get_port_config(pdev);
1008 sdd->master = master; 1038 sdd->master = master;
1009 sdd->cntrlr_info = sci; 1039 sdd->cntrlr_info = sci;
1010 sdd->pdev = pdev; 1040 sdd->pdev = pdev;
@@ -1013,10 +1043,11 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
1013 sdd->tx_dma.direction = DMA_MEM_TO_DEV; 1043 sdd->tx_dma.direction = DMA_MEM_TO_DEV;
1014 sdd->rx_dma.dmach = dmarx_res->start; 1044 sdd->rx_dma.dmach = dmarx_res->start;
1015 sdd->rx_dma.direction = DMA_DEV_TO_MEM; 1045 sdd->rx_dma.direction = DMA_DEV_TO_MEM;
1046 sdd->port_id = pdev->id;
1016 1047
1017 sdd->cur_bpw = 8; 1048 sdd->cur_bpw = 8;
1018 1049
1019 master->bus_num = pdev->id; 1050 master->bus_num = sdd->port_id;
1020 master->setup = s3c64xx_spi_setup; 1051 master->setup = s3c64xx_spi_setup;
1021 master->prepare_transfer_hardware = s3c64xx_spi_prepare_transfer; 1052 master->prepare_transfer_hardware = s3c64xx_spi_prepare_transfer;
1022 master->transfer_one_message = s3c64xx_spi_transfer_one_message; 1053 master->transfer_one_message = s3c64xx_spi_transfer_one_message;
@@ -1076,7 +1107,7 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
1076 } 1107 }
1077 1108
1078 /* Setup Deufult Mode */ 1109 /* Setup Deufult Mode */
1079 s3c64xx_spi_hwinit(sdd, pdev->id); 1110 s3c64xx_spi_hwinit(sdd, sdd->port_id);
1080 1111
1081 spin_lock_init(&sdd->lock); 1112 spin_lock_init(&sdd->lock);
1082 init_completion(&sdd->xfer_completion); 1113 init_completion(&sdd->xfer_completion);
@@ -1101,7 +1132,7 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
1101 1132
1102 dev_dbg(&pdev->dev, "Samsung SoC SPI Driver loaded for Bus SPI-%d " 1133 dev_dbg(&pdev->dev, "Samsung SoC SPI Driver loaded for Bus SPI-%d "
1103 "with %d Slaves attached\n", 1134 "with %d Slaves attached\n",
1104 pdev->id, master->num_chipselect); 1135 sdd->port_id, master->num_chipselect);
1105 dev_dbg(&pdev->dev, "\tIOmem=[0x%x-0x%x]\tDMA=[Rx-%d, Tx-%d]\n", 1136 dev_dbg(&pdev->dev, "\tIOmem=[0x%x-0x%x]\tDMA=[Rx-%d, Tx-%d]\n",
1106 mem_res->end, mem_res->start, 1137 mem_res->end, mem_res->start,
1107 sdd->rx_dma.dmach, sdd->tx_dma.dmach); 1138 sdd->rx_dma.dmach, sdd->tx_dma.dmach);
@@ -1194,7 +1225,7 @@ static int s3c64xx_spi_resume(struct device *dev)
1194 clk_enable(sdd->src_clk); 1225 clk_enable(sdd->src_clk);
1195 clk_enable(sdd->clk); 1226 clk_enable(sdd->clk);
1196 1227
1197 s3c64xx_spi_hwinit(sdd, pdev->id); 1228 s3c64xx_spi_hwinit(sdd, sdd->port_id);
1198 1229
1199 spi_master_resume(master); 1230 spi_master_resume(master);
1200 1231
@@ -1232,6 +1263,70 @@ static const struct dev_pm_ops s3c64xx_spi_pm = {
1232 s3c64xx_spi_runtime_resume, NULL) 1263 s3c64xx_spi_runtime_resume, NULL)
1233}; 1264};
1234 1265
1266struct s3c64xx_spi_port_config s3c2443_spi_port_config = {
1267 .fifo_lvl_mask = { 0x7f },
1268 .rx_lvl_offset = 13,
1269 .tx_st_done = 21,
1270 .high_speed = true,
1271};
1272
1273struct s3c64xx_spi_port_config s3c6410_spi_port_config = {
1274 .fifo_lvl_mask = { 0x7f, 0x7F },
1275 .rx_lvl_offset = 13,
1276 .tx_st_done = 21,
1277};
1278
1279struct s3c64xx_spi_port_config s5p64x0_spi_port_config = {
1280 .fifo_lvl_mask = { 0x1ff, 0x7F },
1281 .rx_lvl_offset = 15,
1282 .tx_st_done = 25,
1283};
1284
1285struct s3c64xx_spi_port_config s5pc100_spi_port_config = {
1286 .fifo_lvl_mask = { 0x7f, 0x7F },
1287 .rx_lvl_offset = 13,
1288 .tx_st_done = 21,
1289 .high_speed = true,
1290};
1291
1292struct s3c64xx_spi_port_config s5pv210_spi_port_config = {
1293 .fifo_lvl_mask = { 0x1ff, 0x7F },
1294 .rx_lvl_offset = 15,
1295 .tx_st_done = 25,
1296 .high_speed = true,
1297};
1298
1299struct s3c64xx_spi_port_config exynos4_spi_port_config = {
1300 .fifo_lvl_mask = { 0x1ff, 0x7F, 0x7F },
1301 .rx_lvl_offset = 15,
1302 .tx_st_done = 25,
1303 .high_speed = true,
1304 .clk_from_cmu = true,
1305};
1306
1307static struct platform_device_id s3c64xx_spi_driver_ids[] = {
1308 {
1309 .name = "s3c2443-spi",
1310 .driver_data = (kernel_ulong_t)&s3c2443_spi_port_config,
1311 }, {
1312 .name = "s3c6410-spi",
1313 .driver_data = (kernel_ulong_t)&s3c6410_spi_port_config,
1314 }, {
1315 .name = "s5p64x0-spi",
1316 .driver_data = (kernel_ulong_t)&s5p64x0_spi_port_config,
1317 }, {
1318 .name = "s5pc100-spi",
1319 .driver_data = (kernel_ulong_t)&s5pc100_spi_port_config,
1320 }, {
1321 .name = "s5pv210-spi",
1322 .driver_data = (kernel_ulong_t)&s5pv210_spi_port_config,
1323 }, {
1324 .name = "exynos4210-spi",
1325 .driver_data = (kernel_ulong_t)&exynos4_spi_port_config,
1326 },
1327 { },
1328};
1329
1235static struct platform_driver s3c64xx_spi_driver = { 1330static struct platform_driver s3c64xx_spi_driver = {
1236 .driver = { 1331 .driver = {
1237 .name = "s3c64xx-spi", 1332 .name = "s3c64xx-spi",
@@ -1239,6 +1334,7 @@ static struct platform_driver s3c64xx_spi_driver = {
1239 .pm = &s3c64xx_spi_pm, 1334 .pm = &s3c64xx_spi_pm,
1240 }, 1335 },
1241 .remove = s3c64xx_spi_remove, 1336 .remove = s3c64xx_spi_remove,
1337 .id_table = s3c64xx_spi_driver_ids,
1242}; 1338};
1243MODULE_ALIAS("platform:s3c64xx-spi"); 1339MODULE_ALIAS("platform:s3c64xx-spi");
1244 1340