diff options
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r-- | drivers/spi/spi-rspi.c | 273 |
1 files changed, 232 insertions, 41 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 8719206a03a0..9e829cee7357 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -59,6 +59,14 @@ | |||
59 | #define RSPI_SPCMD6 0x1c | 59 | #define RSPI_SPCMD6 0x1c |
60 | #define RSPI_SPCMD7 0x1e | 60 | #define RSPI_SPCMD7 0x1e |
61 | 61 | ||
62 | /*qspi only */ | ||
63 | #define QSPI_SPBFCR 0x18 | ||
64 | #define QSPI_SPBDCR 0x1a | ||
65 | #define QSPI_SPBMUL0 0x1c | ||
66 | #define QSPI_SPBMUL1 0x20 | ||
67 | #define QSPI_SPBMUL2 0x24 | ||
68 | #define QSPI_SPBMUL3 0x28 | ||
69 | |||
62 | /* SPCR */ | 70 | /* SPCR */ |
63 | #define SPCR_SPRIE 0x80 | 71 | #define SPCR_SPRIE 0x80 |
64 | #define SPCR_SPE 0x40 | 72 | #define SPCR_SPE 0x40 |
@@ -126,6 +134,8 @@ | |||
126 | #define SPCMD_LSBF 0x1000 | 134 | #define SPCMD_LSBF 0x1000 |
127 | #define SPCMD_SPB_MASK 0x0f00 | 135 | #define SPCMD_SPB_MASK 0x0f00 |
128 | #define SPCMD_SPB_8_TO_16(bit) (((bit - 1) << 8) & SPCMD_SPB_MASK) | 136 | #define SPCMD_SPB_8_TO_16(bit) (((bit - 1) << 8) & SPCMD_SPB_MASK) |
137 | #define SPCMD_SPB_8BIT 0x0000 /* qspi only */ | ||
138 | #define SPCMD_SPB_16BIT 0x0100 | ||
129 | #define SPCMD_SPB_20BIT 0x0000 | 139 | #define SPCMD_SPB_20BIT 0x0000 |
130 | #define SPCMD_SPB_24BIT 0x0100 | 140 | #define SPCMD_SPB_24BIT 0x0100 |
131 | #define SPCMD_SPB_32BIT 0x0200 | 141 | #define SPCMD_SPB_32BIT 0x0200 |
@@ -135,6 +145,10 @@ | |||
135 | #define SPCMD_CPOL 0x0002 | 145 | #define SPCMD_CPOL 0x0002 |
136 | #define SPCMD_CPHA 0x0001 | 146 | #define SPCMD_CPHA 0x0001 |
137 | 147 | ||
148 | /* SPBFCR */ | ||
149 | #define SPBFCR_TXRST 0x80 /* qspi only */ | ||
150 | #define SPBFCR_RXRST 0x40 /* qspi only */ | ||
151 | |||
138 | struct rspi_data { | 152 | struct rspi_data { |
139 | void __iomem *addr; | 153 | void __iomem *addr; |
140 | u32 max_speed_hz; | 154 | u32 max_speed_hz; |
@@ -145,6 +159,7 @@ struct rspi_data { | |||
145 | spinlock_t lock; | 159 | spinlock_t lock; |
146 | struct clk *clk; | 160 | struct clk *clk; |
147 | unsigned char spsr; | 161 | unsigned char spsr; |
162 | const struct spi_ops *ops; | ||
148 | 163 | ||
149 | /* for dmaengine */ | 164 | /* for dmaengine */ |
150 | struct dma_chan *chan_tx; | 165 | struct dma_chan *chan_tx; |
@@ -165,6 +180,11 @@ static void rspi_write16(struct rspi_data *rspi, u16 data, u16 offset) | |||
165 | iowrite16(data, rspi->addr + offset); | 180 | iowrite16(data, rspi->addr + offset); |
166 | } | 181 | } |
167 | 182 | ||
183 | static void rspi_write32(struct rspi_data *rspi, u32 data, u16 offset) | ||
184 | { | ||
185 | iowrite32(data, rspi->addr + offset); | ||
186 | } | ||
187 | |||
168 | static u8 rspi_read8(struct rspi_data *rspi, u16 offset) | 188 | static u8 rspi_read8(struct rspi_data *rspi, u16 offset) |
169 | { | 189 | { |
170 | return ioread8(rspi->addr + offset); | 190 | return ioread8(rspi->addr + offset); |
@@ -175,17 +195,103 @@ static u16 rspi_read16(struct rspi_data *rspi, u16 offset) | |||
175 | return ioread16(rspi->addr + offset); | 195 | return ioread16(rspi->addr + offset); |
176 | } | 196 | } |
177 | 197 | ||
178 | static unsigned char rspi_calc_spbr(struct rspi_data *rspi) | 198 | /* optional functions */ |
199 | struct spi_ops { | ||
200 | int (*set_config_register)(struct rspi_data *rspi, int access_size); | ||
201 | int (*send_pio)(struct rspi_data *rspi, struct spi_message *mesg, | ||
202 | struct spi_transfer *t); | ||
203 | int (*receive_pio)(struct rspi_data *rspi, struct spi_message *mesg, | ||
204 | struct spi_transfer *t); | ||
205 | |||
206 | }; | ||
207 | |||
208 | /* | ||
209 | * functions for RSPI | ||
210 | */ | ||
211 | static int rspi_set_config_register(struct rspi_data *rspi, int access_size) | ||
212 | { | ||
213 | int spbr; | ||
214 | |||
215 | /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */ | ||
216 | rspi_write8(rspi, 0x00, RSPI_SPPCR); | ||
217 | |||
218 | /* Sets transfer bit rate */ | ||
219 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; | ||
220 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); | ||
221 | |||
222 | /* Sets number of frames to be used: 1 frame */ | ||
223 | rspi_write8(rspi, 0x00, RSPI_SPDCR); | ||
224 | |||
225 | /* Sets RSPCK, SSL, next-access delay value */ | ||
226 | rspi_write8(rspi, 0x00, RSPI_SPCKD); | ||
227 | rspi_write8(rspi, 0x00, RSPI_SSLND); | ||
228 | rspi_write8(rspi, 0x00, RSPI_SPND); | ||
229 | |||
230 | /* Sets parity, interrupt mask */ | ||
231 | rspi_write8(rspi, 0x00, RSPI_SPCR2); | ||
232 | |||
233 | /* Sets SPCMD */ | ||
234 | rspi_write16(rspi, SPCMD_SPB_8_TO_16(access_size) | SPCMD_SSLKP, | ||
235 | RSPI_SPCMD0); | ||
236 | |||
237 | /* Sets RSPI mode */ | ||
238 | rspi_write8(rspi, SPCR_MSTR, RSPI_SPCR); | ||
239 | |||
240 | return 0; | ||
241 | } | ||
242 | |||
243 | /* | ||
244 | * functions for QSPI | ||
245 | */ | ||
246 | static int qspi_set_config_register(struct rspi_data *rspi, int access_size) | ||
179 | { | 247 | { |
180 | int tmp; | 248 | u16 spcmd; |
181 | unsigned char spbr; | 249 | int spbr; |
250 | |||
251 | /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */ | ||
252 | rspi_write8(rspi, 0x00, RSPI_SPPCR); | ||
253 | |||
254 | /* Sets transfer bit rate */ | ||
255 | spbr = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz); | ||
256 | rspi_write8(rspi, clamp(spbr, 0, 255), RSPI_SPBR); | ||
257 | |||
258 | /* Sets number of frames to be used: 1 frame */ | ||
259 | rspi_write8(rspi, 0x00, RSPI_SPDCR); | ||
260 | |||
261 | /* Sets RSPCK, SSL, next-access delay value */ | ||
262 | rspi_write8(rspi, 0x00, RSPI_SPCKD); | ||
263 | rspi_write8(rspi, 0x00, RSPI_SSLND); | ||
264 | rspi_write8(rspi, 0x00, RSPI_SPND); | ||
265 | |||
266 | /* Data Length Setting */ | ||
267 | if (access_size == 8) | ||
268 | spcmd = SPCMD_SPB_8BIT; | ||
269 | else if (access_size == 16) | ||
270 | spcmd = SPCMD_SPB_16BIT; | ||
271 | else if (access_size == 32) | ||
272 | spcmd = SPCMD_SPB_32BIT; | ||
273 | |||
274 | spcmd |= SPCMD_SCKDEN | SPCMD_SLNDEN | SPCMD_SSLKP | SPCMD_SPNDEN; | ||
275 | |||
276 | /* Resets transfer data length */ | ||
277 | rspi_write32(rspi, 0, QSPI_SPBMUL0); | ||
278 | |||
279 | /* Resets transmit and receive buffer */ | ||
280 | rspi_write8(rspi, SPBFCR_TXRST | SPBFCR_RXRST, QSPI_SPBFCR); | ||
281 | /* Sets buffer to allow normal operation */ | ||
282 | rspi_write8(rspi, 0x00, QSPI_SPBFCR); | ||
283 | |||
284 | /* Sets SPCMD */ | ||
285 | rspi_write16(rspi, spcmd, RSPI_SPCMD0); | ||
182 | 286 | ||
183 | tmp = clk_get_rate(rspi->clk) / (2 * rspi->max_speed_hz) - 1; | 287 | /* Enables SPI function in a master mode */ |
184 | spbr = clamp(tmp, 0, 255); | 288 | rspi_write8(rspi, SPCR_SPE | SPCR_MSTR, RSPI_SPCR); |
185 | 289 | ||
186 | return spbr; | 290 | return 0; |
187 | } | 291 | } |
188 | 292 | ||
293 | #define set_config_register(spi, n) spi->ops->set_config_register(spi, n) | ||
294 | |||
189 | static void rspi_enable_irq(struct rspi_data *rspi, u8 enable) | 295 | static void rspi_enable_irq(struct rspi_data *rspi, u8 enable) |
190 | { | 296 | { |
191 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | enable, RSPI_SPCR); | 297 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | enable, RSPI_SPCR); |
@@ -220,54 +326,60 @@ static void rspi_negate_ssl(struct rspi_data *rspi) | |||
220 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) & ~SPCR_SPE, RSPI_SPCR); | 326 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) & ~SPCR_SPE, RSPI_SPCR); |
221 | } | 327 | } |
222 | 328 | ||
223 | static int rspi_set_config_register(struct rspi_data *rspi, int access_size) | 329 | static int rspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg, |
330 | struct spi_transfer *t) | ||
224 | { | 331 | { |
225 | /* Sets output mode(CMOS) and MOSI signal(from previous transfer) */ | 332 | int remain = t->len; |
226 | rspi_write8(rspi, 0x00, RSPI_SPPCR); | 333 | u8 *data; |
227 | |||
228 | /* Sets transfer bit rate */ | ||
229 | rspi_write8(rspi, rspi_calc_spbr(rspi), RSPI_SPBR); | ||
230 | |||
231 | /* Sets number of frames to be used: 1 frame */ | ||
232 | rspi_write8(rspi, 0x00, RSPI_SPDCR); | ||
233 | 334 | ||
234 | /* Sets RSPCK, SSL, next-access delay value */ | 335 | data = (u8 *)t->tx_buf; |
235 | rspi_write8(rspi, 0x00, RSPI_SPCKD); | 336 | while (remain > 0) { |
236 | rspi_write8(rspi, 0x00, RSPI_SSLND); | 337 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | SPCR_TXMD, |
237 | rspi_write8(rspi, 0x00, RSPI_SPND); | 338 | RSPI_SPCR); |
238 | 339 | ||
239 | /* Sets parity, interrupt mask */ | 340 | if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) { |
240 | rspi_write8(rspi, 0x00, RSPI_SPCR2); | 341 | dev_err(&rspi->master->dev, |
342 | "%s: tx empty timeout\n", __func__); | ||
343 | return -ETIMEDOUT; | ||
344 | } | ||
241 | 345 | ||
242 | /* Sets SPCMD */ | 346 | rspi_write16(rspi, *data, RSPI_SPDR); |
243 | rspi_write16(rspi, SPCMD_SPB_8_TO_16(access_size) | SPCMD_SSLKP, | 347 | data++; |
244 | RSPI_SPCMD0); | 348 | remain--; |
349 | } | ||
245 | 350 | ||
246 | /* Sets RSPI mode */ | 351 | /* Waiting for the last transmition */ |
247 | rspi_write8(rspi, SPCR_MSTR, RSPI_SPCR); | 352 | rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE); |
248 | 353 | ||
249 | return 0; | 354 | return 0; |
250 | } | 355 | } |
251 | 356 | ||
252 | static int rspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg, | 357 | static int qspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg, |
253 | struct spi_transfer *t) | 358 | struct spi_transfer *t) |
254 | { | 359 | { |
255 | int remain = t->len; | 360 | int remain = t->len; |
256 | u8 *data; | 361 | u8 *data; |
257 | 362 | ||
363 | rspi_write8(rspi, SPBFCR_TXRST, QSPI_SPBFCR); | ||
364 | rspi_write8(rspi, 0x00, QSPI_SPBFCR); | ||
365 | |||
258 | data = (u8 *)t->tx_buf; | 366 | data = (u8 *)t->tx_buf; |
259 | while (remain > 0) { | 367 | while (remain > 0) { |
260 | rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) | SPCR_TXMD, | ||
261 | RSPI_SPCR); | ||
262 | 368 | ||
263 | if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) { | 369 | if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) { |
264 | dev_err(&rspi->master->dev, | 370 | dev_err(&rspi->master->dev, |
265 | "%s: tx empty timeout\n", __func__); | 371 | "%s: tx empty timeout\n", __func__); |
266 | return -ETIMEDOUT; | 372 | return -ETIMEDOUT; |
267 | } | 373 | } |
374 | rspi_write8(rspi, *data++, RSPI_SPDR); | ||
375 | |||
376 | if (rspi_wait_for_interrupt(rspi, SPSR_SPRF, SPCR_SPRIE) < 0) { | ||
377 | dev_err(&rspi->master->dev, | ||
378 | "%s: receive timeout\n", __func__); | ||
379 | return -ETIMEDOUT; | ||
380 | } | ||
381 | rspi_read8(rspi, RSPI_SPDR); | ||
268 | 382 | ||
269 | rspi_write16(rspi, *data, RSPI_SPDR); | ||
270 | data++; | ||
271 | remain--; | 383 | remain--; |
272 | } | 384 | } |
273 | 385 | ||
@@ -277,6 +389,8 @@ static int rspi_send_pio(struct rspi_data *rspi, struct spi_message *mesg, | |||
277 | return 0; | 389 | return 0; |
278 | } | 390 | } |
279 | 391 | ||
392 | #define send_pio(spi, mesg, t) spi->ops->send_pio(spi, mesg, t) | ||
393 | |||
280 | static void rspi_dma_complete(void *arg) | 394 | static void rspi_dma_complete(void *arg) |
281 | { | 395 | { |
282 | struct rspi_data *rspi = arg; | 396 | struct rspi_data *rspi = arg; |
@@ -442,6 +556,51 @@ static int rspi_receive_pio(struct rspi_data *rspi, struct spi_message *mesg, | |||
442 | return 0; | 556 | return 0; |
443 | } | 557 | } |
444 | 558 | ||
559 | static void qspi_receive_init(struct rspi_data *rspi) | ||
560 | { | ||
561 | unsigned char spsr; | ||
562 | |||
563 | spsr = rspi_read8(rspi, RSPI_SPSR); | ||
564 | if (spsr & SPSR_SPRF) | ||
565 | rspi_read8(rspi, RSPI_SPDR); /* dummy read */ | ||
566 | rspi_write8(rspi, SPBFCR_TXRST | SPBFCR_RXRST, QSPI_SPBFCR); | ||
567 | rspi_write8(rspi, 0x00, QSPI_SPBFCR); | ||
568 | } | ||
569 | |||
570 | static int qspi_receive_pio(struct rspi_data *rspi, struct spi_message *mesg, | ||
571 | struct spi_transfer *t) | ||
572 | { | ||
573 | int remain = t->len; | ||
574 | u8 *data; | ||
575 | |||
576 | qspi_receive_init(rspi); | ||
577 | |||
578 | data = (u8 *)t->rx_buf; | ||
579 | while (remain > 0) { | ||
580 | |||
581 | if (rspi_wait_for_interrupt(rspi, SPSR_SPTEF, SPCR_SPTIE) < 0) { | ||
582 | dev_err(&rspi->master->dev, | ||
583 | "%s: tx empty timeout\n", __func__); | ||
584 | return -ETIMEDOUT; | ||
585 | } | ||
586 | /* dummy write for generate clock */ | ||
587 | rspi_write8(rspi, 0x00, RSPI_SPDR); | ||
588 | |||
589 | if (rspi_wait_for_interrupt(rspi, SPSR_SPRF, SPCR_SPRIE) < 0) { | ||
590 | dev_err(&rspi->master->dev, | ||
591 | "%s: receive timeout\n", __func__); | ||
592 | return -ETIMEDOUT; | ||
593 | } | ||
594 | /* SPDR allows 8, 16 or 32-bit access */ | ||
595 | *data++ = rspi_read8(rspi, RSPI_SPDR); | ||
596 | remain--; | ||
597 | } | ||
598 | |||
599 | return 0; | ||
600 | } | ||
601 | |||
602 | #define receive_pio(spi, mesg, t) spi->ops->receive_pio(spi, mesg, t) | ||
603 | |||
445 | static int rspi_receive_dma(struct rspi_data *rspi, struct spi_transfer *t) | 604 | static int rspi_receive_dma(struct rspi_data *rspi, struct spi_transfer *t) |
446 | { | 605 | { |
447 | struct scatterlist sg, sg_dummy; | 606 | struct scatterlist sg, sg_dummy; |
@@ -581,7 +740,7 @@ static void rspi_work(struct work_struct *work) | |||
581 | if (rspi_is_dma(rspi, t)) | 740 | if (rspi_is_dma(rspi, t)) |
582 | ret = rspi_send_dma(rspi, t); | 741 | ret = rspi_send_dma(rspi, t); |
583 | else | 742 | else |
584 | ret = rspi_send_pio(rspi, mesg, t); | 743 | ret = send_pio(rspi, mesg, t); |
585 | if (ret < 0) | 744 | if (ret < 0) |
586 | goto error; | 745 | goto error; |
587 | } | 746 | } |
@@ -589,7 +748,7 @@ static void rspi_work(struct work_struct *work) | |||
589 | if (rspi_is_dma(rspi, t)) | 748 | if (rspi_is_dma(rspi, t)) |
590 | ret = rspi_receive_dma(rspi, t); | 749 | ret = rspi_receive_dma(rspi, t); |
591 | else | 750 | else |
592 | ret = rspi_receive_pio(rspi, mesg, t); | 751 | ret = receive_pio(rspi, mesg, t); |
593 | if (ret < 0) | 752 | if (ret < 0) |
594 | goto error; | 753 | goto error; |
595 | } | 754 | } |
@@ -616,7 +775,7 @@ static int rspi_setup(struct spi_device *spi) | |||
616 | spi->bits_per_word = 8; | 775 | spi->bits_per_word = 8; |
617 | rspi->max_speed_hz = spi->max_speed_hz; | 776 | rspi->max_speed_hz = spi->max_speed_hz; |
618 | 777 | ||
619 | rspi_set_config_register(rspi, 8); | 778 | set_config_register(rspi, 8); |
620 | 779 | ||
621 | return 0; | 780 | return 0; |
622 | } | 781 | } |
@@ -726,14 +885,13 @@ static void rspi_release_dma(struct rspi_data *rspi) | |||
726 | 885 | ||
727 | static int rspi_remove(struct platform_device *pdev) | 886 | static int rspi_remove(struct platform_device *pdev) |
728 | { | 887 | { |
729 | struct rspi_data *rspi = spi_master_get(platform_get_drvdata(pdev)); | 888 | struct rspi_data *rspi = platform_get_drvdata(pdev); |
730 | 889 | ||
731 | spi_unregister_master(rspi->master); | 890 | spi_unregister_master(rspi->master); |
732 | rspi_release_dma(rspi); | 891 | rspi_release_dma(rspi); |
733 | free_irq(platform_get_irq(pdev, 0), rspi); | 892 | free_irq(platform_get_irq(pdev, 0), rspi); |
734 | clk_put(rspi->clk); | 893 | clk_put(rspi->clk); |
735 | iounmap(rspi->addr); | 894 | iounmap(rspi->addr); |
736 | spi_master_put(rspi->master); | ||
737 | 895 | ||
738 | return 0; | 896 | return 0; |
739 | } | 897 | } |
@@ -745,7 +903,16 @@ static int rspi_probe(struct platform_device *pdev) | |||
745 | struct rspi_data *rspi; | 903 | struct rspi_data *rspi; |
746 | int ret, irq; | 904 | int ret, irq; |
747 | char clk_name[16]; | 905 | char clk_name[16]; |
748 | 906 | struct rspi_plat_data *rspi_pd = pdev->dev.platform_data; | |
907 | const struct spi_ops *ops; | ||
908 | const struct platform_device_id *id_entry = pdev->id_entry; | ||
909 | |||
910 | ops = (struct spi_ops *)id_entry->driver_data; | ||
911 | /* ops parameter check */ | ||
912 | if (!ops->set_config_register) { | ||
913 | dev_err(&pdev->dev, "there is no set_config_register\n"); | ||
914 | return -ENODEV; | ||
915 | } | ||
749 | /* get base addr */ | 916 | /* get base addr */ |
750 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 917 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
751 | if (unlikely(res == NULL)) { | 918 | if (unlikely(res == NULL)) { |
@@ -767,7 +934,7 @@ static int rspi_probe(struct platform_device *pdev) | |||
767 | 934 | ||
768 | rspi = spi_master_get_devdata(master); | 935 | rspi = spi_master_get_devdata(master); |
769 | platform_set_drvdata(pdev, rspi); | 936 | platform_set_drvdata(pdev, rspi); |
770 | 937 | rspi->ops = ops; | |
771 | rspi->master = master; | 938 | rspi->master = master; |
772 | rspi->addr = ioremap(res->start, resource_size(res)); | 939 | rspi->addr = ioremap(res->start, resource_size(res)); |
773 | if (rspi->addr == NULL) { | 940 | if (rspi->addr == NULL) { |
@@ -776,7 +943,7 @@ static int rspi_probe(struct platform_device *pdev) | |||
776 | goto error1; | 943 | goto error1; |
777 | } | 944 | } |
778 | 945 | ||
779 | snprintf(clk_name, sizeof(clk_name), "rspi%d", pdev->id); | 946 | snprintf(clk_name, sizeof(clk_name), "%s%d", id_entry->name, pdev->id); |
780 | rspi->clk = clk_get(&pdev->dev, clk_name); | 947 | rspi->clk = clk_get(&pdev->dev, clk_name); |
781 | if (IS_ERR(rspi->clk)) { | 948 | if (IS_ERR(rspi->clk)) { |
782 | dev_err(&pdev->dev, "cannot get clock\n"); | 949 | dev_err(&pdev->dev, "cannot get clock\n"); |
@@ -790,7 +957,10 @@ static int rspi_probe(struct platform_device *pdev) | |||
790 | INIT_WORK(&rspi->ws, rspi_work); | 957 | INIT_WORK(&rspi->ws, rspi_work); |
791 | init_waitqueue_head(&rspi->wait); | 958 | init_waitqueue_head(&rspi->wait); |
792 | 959 | ||
793 | master->num_chipselect = 2; | 960 | master->num_chipselect = rspi_pd->num_chipselect; |
961 | if (!master->num_chipselect) | ||
962 | master->num_chipselect = 2; /* default */ | ||
963 | |||
794 | master->bus_num = pdev->id; | 964 | master->bus_num = pdev->id; |
795 | master->setup = rspi_setup; | 965 | master->setup = rspi_setup; |
796 | master->transfer = rspi_transfer; | 966 | master->transfer = rspi_transfer; |
@@ -832,11 +1002,32 @@ error1: | |||
832 | return ret; | 1002 | return ret; |
833 | } | 1003 | } |
834 | 1004 | ||
1005 | static struct spi_ops rspi_ops = { | ||
1006 | .set_config_register = rspi_set_config_register, | ||
1007 | .send_pio = rspi_send_pio, | ||
1008 | .receive_pio = rspi_receive_pio, | ||
1009 | }; | ||
1010 | |||
1011 | static struct spi_ops qspi_ops = { | ||
1012 | .set_config_register = qspi_set_config_register, | ||
1013 | .send_pio = qspi_send_pio, | ||
1014 | .receive_pio = qspi_receive_pio, | ||
1015 | }; | ||
1016 | |||
1017 | static struct platform_device_id spi_driver_ids[] = { | ||
1018 | { "rspi", (kernel_ulong_t)&rspi_ops }, | ||
1019 | { "qspi", (kernel_ulong_t)&qspi_ops }, | ||
1020 | {}, | ||
1021 | }; | ||
1022 | |||
1023 | MODULE_DEVICE_TABLE(platform, spi_driver_ids); | ||
1024 | |||
835 | static struct platform_driver rspi_driver = { | 1025 | static struct platform_driver rspi_driver = { |
836 | .probe = rspi_probe, | 1026 | .probe = rspi_probe, |
837 | .remove = rspi_remove, | 1027 | .remove = rspi_remove, |
1028 | .id_table = spi_driver_ids, | ||
838 | .driver = { | 1029 | .driver = { |
839 | .name = "rspi", | 1030 | .name = "renesas_spi", |
840 | .owner = THIS_MODULE, | 1031 | .owner = THIS_MODULE, |
841 | }, | 1032 | }, |
842 | }; | 1033 | }; |