diff options
Diffstat (limited to 'drivers/spi/spi-imx.c')
-rw-r--r-- | drivers/spi/spi-imx.c | 227 |
1 files changed, 196 insertions, 31 deletions
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index babb15f07995..fe35aaea323b 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c | |||
@@ -53,10 +53,13 @@ | |||
53 | /* generic defines to abstract from the different register layouts */ | 53 | /* generic defines to abstract from the different register layouts */ |
54 | #define MXC_INT_RR (1 << 0) /* Receive data ready interrupt */ | 54 | #define MXC_INT_RR (1 << 0) /* Receive data ready interrupt */ |
55 | #define MXC_INT_TE (1 << 1) /* Transmit FIFO empty interrupt */ | 55 | #define MXC_INT_TE (1 << 1) /* Transmit FIFO empty interrupt */ |
56 | #define MXC_INT_RDR BIT(4) /* Receive date threshold interrupt */ | ||
56 | 57 | ||
57 | /* The maximum bytes that a sdma BD can transfer.*/ | 58 | /* The maximum bytes that a sdma BD can transfer.*/ |
58 | #define MAX_SDMA_BD_BYTES (1 << 15) | 59 | #define MAX_SDMA_BD_BYTES (1 << 15) |
59 | #define MX51_ECSPI_CTRL_MAX_BURST 512 | 60 | #define MX51_ECSPI_CTRL_MAX_BURST 512 |
61 | /* The maximum bytes that IMX53_ECSPI can transfer in slave mode.*/ | ||
62 | #define MX53_MAX_TRANSFER_BYTES 512 | ||
60 | 63 | ||
61 | enum spi_imx_devtype { | 64 | enum spi_imx_devtype { |
62 | IMX1_CSPI, | 65 | IMX1_CSPI, |
@@ -76,7 +79,9 @@ struct spi_imx_devtype_data { | |||
76 | void (*trigger)(struct spi_imx_data *); | 79 | void (*trigger)(struct spi_imx_data *); |
77 | int (*rx_available)(struct spi_imx_data *); | 80 | int (*rx_available)(struct spi_imx_data *); |
78 | void (*reset)(struct spi_imx_data *); | 81 | void (*reset)(struct spi_imx_data *); |
82 | void (*disable)(struct spi_imx_data *); | ||
79 | bool has_dmamode; | 83 | bool has_dmamode; |
84 | bool has_slavemode; | ||
80 | unsigned int fifo_size; | 85 | unsigned int fifo_size; |
81 | bool dynamic_burst; | 86 | bool dynamic_burst; |
82 | enum spi_imx_devtype devtype; | 87 | enum spi_imx_devtype devtype; |
@@ -108,6 +113,11 @@ struct spi_imx_data { | |||
108 | unsigned int dynamic_burst, read_u32; | 113 | unsigned int dynamic_burst, read_u32; |
109 | unsigned int word_mask; | 114 | unsigned int word_mask; |
110 | 115 | ||
116 | /* Slave mode */ | ||
117 | bool slave_mode; | ||
118 | bool slave_aborted; | ||
119 | unsigned int slave_burst; | ||
120 | |||
111 | /* DMA */ | 121 | /* DMA */ |
112 | bool usedma; | 122 | bool usedma; |
113 | u32 wml; | 123 | u32 wml; |
@@ -221,6 +231,9 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi, | |||
221 | if (!master->dma_rx) | 231 | if (!master->dma_rx) |
222 | return false; | 232 | return false; |
223 | 233 | ||
234 | if (spi_imx->slave_mode) | ||
235 | return false; | ||
236 | |||
224 | bytes_per_word = spi_imx_bytes_per_word(transfer->bits_per_word); | 237 | bytes_per_word = spi_imx_bytes_per_word(transfer->bits_per_word); |
225 | 238 | ||
226 | if (bytes_per_word != 1 && bytes_per_word != 2 && bytes_per_word != 4) | 239 | if (bytes_per_word != 1 && bytes_per_word != 2 && bytes_per_word != 4) |
@@ -262,6 +275,7 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi, | |||
262 | #define MX51_ECSPI_INT 0x10 | 275 | #define MX51_ECSPI_INT 0x10 |
263 | #define MX51_ECSPI_INT_TEEN (1 << 0) | 276 | #define MX51_ECSPI_INT_TEEN (1 << 0) |
264 | #define MX51_ECSPI_INT_RREN (1 << 3) | 277 | #define MX51_ECSPI_INT_RREN (1 << 3) |
278 | #define MX51_ECSPI_INT_RDREN (1 << 4) | ||
265 | 279 | ||
266 | #define MX51_ECSPI_DMA 0x14 | 280 | #define MX51_ECSPI_DMA 0x14 |
267 | #define MX51_ECSPI_DMA_TX_WML(wml) ((wml) & 0x3f) | 281 | #define MX51_ECSPI_DMA_TX_WML(wml) ((wml) & 0x3f) |
@@ -378,6 +392,44 @@ static void spi_imx_buf_tx_swap(struct spi_imx_data *spi_imx) | |||
378 | spi_imx_buf_tx_u16(spi_imx); | 392 | spi_imx_buf_tx_u16(spi_imx); |
379 | } | 393 | } |
380 | 394 | ||
395 | static void mx53_ecspi_rx_slave(struct spi_imx_data *spi_imx) | ||
396 | { | ||
397 | u32 val = be32_to_cpu(readl(spi_imx->base + MXC_CSPIRXDATA)); | ||
398 | |||
399 | if (spi_imx->rx_buf) { | ||
400 | int n_bytes = spi_imx->slave_burst % sizeof(val); | ||
401 | |||
402 | if (!n_bytes) | ||
403 | n_bytes = sizeof(val); | ||
404 | |||
405 | memcpy(spi_imx->rx_buf, | ||
406 | ((u8 *)&val) + sizeof(val) - n_bytes, n_bytes); | ||
407 | |||
408 | spi_imx->rx_buf += n_bytes; | ||
409 | spi_imx->slave_burst -= n_bytes; | ||
410 | } | ||
411 | } | ||
412 | |||
413 | static void mx53_ecspi_tx_slave(struct spi_imx_data *spi_imx) | ||
414 | { | ||
415 | u32 val = 0; | ||
416 | int n_bytes = spi_imx->count % sizeof(val); | ||
417 | |||
418 | if (!n_bytes) | ||
419 | n_bytes = sizeof(val); | ||
420 | |||
421 | if (spi_imx->tx_buf) { | ||
422 | memcpy(((u8 *)&val) + sizeof(val) - n_bytes, | ||
423 | spi_imx->tx_buf, n_bytes); | ||
424 | val = cpu_to_be32(val); | ||
425 | spi_imx->tx_buf += n_bytes; | ||
426 | } | ||
427 | |||
428 | spi_imx->count -= n_bytes; | ||
429 | |||
430 | writel(val, spi_imx->base + MXC_CSPITXDATA); | ||
431 | } | ||
432 | |||
381 | /* MX51 eCSPI */ | 433 | /* MX51 eCSPI */ |
382 | static unsigned int mx51_ecspi_clkdiv(struct spi_imx_data *spi_imx, | 434 | static unsigned int mx51_ecspi_clkdiv(struct spi_imx_data *spi_imx, |
383 | unsigned int fspi, unsigned int *fres) | 435 | unsigned int fspi, unsigned int *fres) |
@@ -427,6 +479,9 @@ static void mx51_ecspi_intctrl(struct spi_imx_data *spi_imx, int enable) | |||
427 | if (enable & MXC_INT_RR) | 479 | if (enable & MXC_INT_RR) |
428 | val |= MX51_ECSPI_INT_RREN; | 480 | val |= MX51_ECSPI_INT_RREN; |
429 | 481 | ||
482 | if (enable & MXC_INT_RDR) | ||
483 | val |= MX51_ECSPI_INT_RDREN; | ||
484 | |||
430 | writel(val, spi_imx->base + MX51_ECSPI_INT); | 485 | writel(val, spi_imx->base + MX51_ECSPI_INT); |
431 | } | 486 | } |
432 | 487 | ||
@@ -439,6 +494,15 @@ static void mx51_ecspi_trigger(struct spi_imx_data *spi_imx) | |||
439 | writel(reg, spi_imx->base + MX51_ECSPI_CTRL); | 494 | writel(reg, spi_imx->base + MX51_ECSPI_CTRL); |
440 | } | 495 | } |
441 | 496 | ||
497 | static void mx51_ecspi_disable(struct spi_imx_data *spi_imx) | ||
498 | { | ||
499 | u32 ctrl; | ||
500 | |||
501 | ctrl = readl(spi_imx->base + MX51_ECSPI_CTRL); | ||
502 | ctrl &= ~MX51_ECSPI_CTRL_ENABLE; | ||
503 | writel(ctrl, spi_imx->base + MX51_ECSPI_CTRL); | ||
504 | } | ||
505 | |||
442 | static int mx51_ecspi_config(struct spi_device *spi) | 506 | static int mx51_ecspi_config(struct spi_device *spi) |
443 | { | 507 | { |
444 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | 508 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); |
@@ -446,14 +510,11 @@ static int mx51_ecspi_config(struct spi_device *spi) | |||
446 | u32 clk = spi_imx->speed_hz, delay, reg; | 510 | u32 clk = spi_imx->speed_hz, delay, reg; |
447 | u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG); | 511 | u32 cfg = readl(spi_imx->base + MX51_ECSPI_CONFIG); |
448 | 512 | ||
449 | /* | 513 | /* set Master or Slave mode */ |
450 | * The hardware seems to have a race condition when changing modes. The | 514 | if (spi_imx->slave_mode) |
451 | * current assumption is that the selection of the channel arrives | 515 | ctrl &= ~MX51_ECSPI_CTRL_MODE_MASK; |
452 | * earlier in the hardware than the mode bits when they are written at | 516 | else |
453 | * the same time. | 517 | ctrl |= MX51_ECSPI_CTRL_MODE_MASK; |
454 | * So set master mode for all channels as we do not support slave mode. | ||
455 | */ | ||
456 | ctrl |= MX51_ECSPI_CTRL_MODE_MASK; | ||
457 | 518 | ||
458 | /* | 519 | /* |
459 | * Enable SPI_RDY handling (falling edge/level triggered). | 520 | * Enable SPI_RDY handling (falling edge/level triggered). |
@@ -468,9 +529,22 @@ static int mx51_ecspi_config(struct spi_device *spi) | |||
468 | /* set chip select to use */ | 529 | /* set chip select to use */ |
469 | ctrl |= MX51_ECSPI_CTRL_CS(spi->chip_select); | 530 | ctrl |= MX51_ECSPI_CTRL_CS(spi->chip_select); |
470 | 531 | ||
471 | ctrl |= (spi_imx->bits_per_word - 1) << MX51_ECSPI_CTRL_BL_OFFSET; | 532 | if (spi_imx->slave_mode && is_imx53_ecspi(spi_imx)) |
533 | ctrl |= (spi_imx->slave_burst * 8 - 1) | ||
534 | << MX51_ECSPI_CTRL_BL_OFFSET; | ||
535 | else | ||
536 | ctrl |= (spi_imx->bits_per_word - 1) | ||
537 | << MX51_ECSPI_CTRL_BL_OFFSET; | ||
472 | 538 | ||
473 | cfg |= MX51_ECSPI_CONFIG_SBBCTRL(spi->chip_select); | 539 | /* |
540 | * eCSPI burst completion by Chip Select signal in Slave mode | ||
541 | * is not functional for imx53 Soc, config SPI burst completed when | ||
542 | * BURST_LENGTH + 1 bits are received | ||
543 | */ | ||
544 | if (spi_imx->slave_mode && is_imx53_ecspi(spi_imx)) | ||
545 | cfg &= ~MX51_ECSPI_CONFIG_SBBCTRL(spi->chip_select); | ||
546 | else | ||
547 | cfg |= MX51_ECSPI_CONFIG_SBBCTRL(spi->chip_select); | ||
474 | 548 | ||
475 | if (spi->mode & SPI_CPHA) | 549 | if (spi->mode & SPI_CPHA) |
476 | cfg |= MX51_ECSPI_CONFIG_SCLKPHA(spi->chip_select); | 550 | cfg |= MX51_ECSPI_CONFIG_SCLKPHA(spi->chip_select); |
@@ -805,6 +879,7 @@ static struct spi_imx_devtype_data imx1_cspi_devtype_data = { | |||
805 | .fifo_size = 8, | 879 | .fifo_size = 8, |
806 | .has_dmamode = false, | 880 | .has_dmamode = false, |
807 | .dynamic_burst = false, | 881 | .dynamic_burst = false, |
882 | .has_slavemode = false, | ||
808 | .devtype = IMX1_CSPI, | 883 | .devtype = IMX1_CSPI, |
809 | }; | 884 | }; |
810 | 885 | ||
@@ -817,6 +892,7 @@ static struct spi_imx_devtype_data imx21_cspi_devtype_data = { | |||
817 | .fifo_size = 8, | 892 | .fifo_size = 8, |
818 | .has_dmamode = false, | 893 | .has_dmamode = false, |
819 | .dynamic_burst = false, | 894 | .dynamic_burst = false, |
895 | .has_slavemode = false, | ||
820 | .devtype = IMX21_CSPI, | 896 | .devtype = IMX21_CSPI, |
821 | }; | 897 | }; |
822 | 898 | ||
@@ -830,6 +906,7 @@ static struct spi_imx_devtype_data imx27_cspi_devtype_data = { | |||
830 | .fifo_size = 8, | 906 | .fifo_size = 8, |
831 | .has_dmamode = false, | 907 | .has_dmamode = false, |
832 | .dynamic_burst = false, | 908 | .dynamic_burst = false, |
909 | .has_slavemode = false, | ||
833 | .devtype = IMX27_CSPI, | 910 | .devtype = IMX27_CSPI, |
834 | }; | 911 | }; |
835 | 912 | ||
@@ -842,6 +919,7 @@ static struct spi_imx_devtype_data imx31_cspi_devtype_data = { | |||
842 | .fifo_size = 8, | 919 | .fifo_size = 8, |
843 | .has_dmamode = false, | 920 | .has_dmamode = false, |
844 | .dynamic_burst = false, | 921 | .dynamic_burst = false, |
922 | .has_slavemode = false, | ||
845 | .devtype = IMX31_CSPI, | 923 | .devtype = IMX31_CSPI, |
846 | }; | 924 | }; |
847 | 925 | ||
@@ -855,6 +933,7 @@ static struct spi_imx_devtype_data imx35_cspi_devtype_data = { | |||
855 | .fifo_size = 8, | 933 | .fifo_size = 8, |
856 | .has_dmamode = true, | 934 | .has_dmamode = true, |
857 | .dynamic_burst = false, | 935 | .dynamic_burst = false, |
936 | .has_slavemode = false, | ||
858 | .devtype = IMX35_CSPI, | 937 | .devtype = IMX35_CSPI, |
859 | }; | 938 | }; |
860 | 939 | ||
@@ -867,6 +946,8 @@ static struct spi_imx_devtype_data imx51_ecspi_devtype_data = { | |||
867 | .fifo_size = 64, | 946 | .fifo_size = 64, |
868 | .has_dmamode = true, | 947 | .has_dmamode = true, |
869 | .dynamic_burst = true, | 948 | .dynamic_burst = true, |
949 | .has_slavemode = true, | ||
950 | .disable = mx51_ecspi_disable, | ||
870 | .devtype = IMX51_ECSPI, | 951 | .devtype = IMX51_ECSPI, |
871 | }; | 952 | }; |
872 | 953 | ||
@@ -878,6 +959,8 @@ static struct spi_imx_devtype_data imx53_ecspi_devtype_data = { | |||
878 | .reset = mx51_ecspi_reset, | 959 | .reset = mx51_ecspi_reset, |
879 | .fifo_size = 64, | 960 | .fifo_size = 64, |
880 | .has_dmamode = true, | 961 | .has_dmamode = true, |
962 | .has_slavemode = true, | ||
963 | .disable = mx51_ecspi_disable, | ||
881 | .devtype = IMX53_ECSPI, | 964 | .devtype = IMX53_ECSPI, |
882 | }; | 965 | }; |
883 | 966 | ||
@@ -945,14 +1028,16 @@ static void spi_imx_push(struct spi_imx_data *spi_imx) | |||
945 | spi_imx->txfifo++; | 1028 | spi_imx->txfifo++; |
946 | } | 1029 | } |
947 | 1030 | ||
948 | spi_imx->devtype_data->trigger(spi_imx); | 1031 | if (!spi_imx->slave_mode) |
1032 | spi_imx->devtype_data->trigger(spi_imx); | ||
949 | } | 1033 | } |
950 | 1034 | ||
951 | static irqreturn_t spi_imx_isr(int irq, void *dev_id) | 1035 | static irqreturn_t spi_imx_isr(int irq, void *dev_id) |
952 | { | 1036 | { |
953 | struct spi_imx_data *spi_imx = dev_id; | 1037 | struct spi_imx_data *spi_imx = dev_id; |
954 | 1038 | ||
955 | while (spi_imx->devtype_data->rx_available(spi_imx)) { | 1039 | while (spi_imx->txfifo && |
1040 | spi_imx->devtype_data->rx_available(spi_imx)) { | ||
956 | spi_imx->rx(spi_imx); | 1041 | spi_imx->rx(spi_imx); |
957 | spi_imx->txfifo--; | 1042 | spi_imx->txfifo--; |
958 | } | 1043 | } |
@@ -1034,7 +1119,7 @@ static int spi_imx_setupxfer(struct spi_device *spi, | |||
1034 | spi_imx->speed_hz = t->speed_hz; | 1119 | spi_imx->speed_hz = t->speed_hz; |
1035 | 1120 | ||
1036 | /* Initialize the functions for transfer */ | 1121 | /* Initialize the functions for transfer */ |
1037 | if (spi_imx->devtype_data->dynamic_burst) { | 1122 | if (spi_imx->devtype_data->dynamic_burst && !spi_imx->slave_mode) { |
1038 | u32 mask; | 1123 | u32 mask; |
1039 | 1124 | ||
1040 | spi_imx->dynamic_burst = 0; | 1125 | spi_imx->dynamic_burst = 0; |
@@ -1078,6 +1163,12 @@ static int spi_imx_setupxfer(struct spi_device *spi, | |||
1078 | return ret; | 1163 | return ret; |
1079 | } | 1164 | } |
1080 | 1165 | ||
1166 | if (is_imx53_ecspi(spi_imx) && spi_imx->slave_mode) { | ||
1167 | spi_imx->rx = mx53_ecspi_rx_slave; | ||
1168 | spi_imx->tx = mx53_ecspi_tx_slave; | ||
1169 | spi_imx->slave_burst = t->len; | ||
1170 | } | ||
1171 | |||
1081 | spi_imx->devtype_data->config(spi); | 1172 | spi_imx->devtype_data->config(spi); |
1082 | 1173 | ||
1083 | return 0; | 1174 | return 0; |
@@ -1262,11 +1353,61 @@ static int spi_imx_pio_transfer(struct spi_device *spi, | |||
1262 | return transfer->len; | 1353 | return transfer->len; |
1263 | } | 1354 | } |
1264 | 1355 | ||
1356 | static int spi_imx_pio_transfer_slave(struct spi_device *spi, | ||
1357 | struct spi_transfer *transfer) | ||
1358 | { | ||
1359 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | ||
1360 | int ret = transfer->len; | ||
1361 | |||
1362 | if (is_imx53_ecspi(spi_imx) && | ||
1363 | transfer->len > MX53_MAX_TRANSFER_BYTES) { | ||
1364 | dev_err(&spi->dev, "Transaction too big, max size is %d bytes\n", | ||
1365 | MX53_MAX_TRANSFER_BYTES); | ||
1366 | return -EMSGSIZE; | ||
1367 | } | ||
1368 | |||
1369 | spi_imx->tx_buf = transfer->tx_buf; | ||
1370 | spi_imx->rx_buf = transfer->rx_buf; | ||
1371 | spi_imx->count = transfer->len; | ||
1372 | spi_imx->txfifo = 0; | ||
1373 | |||
1374 | reinit_completion(&spi_imx->xfer_done); | ||
1375 | spi_imx->slave_aborted = false; | ||
1376 | |||
1377 | spi_imx_push(spi_imx); | ||
1378 | |||
1379 | spi_imx->devtype_data->intctrl(spi_imx, MXC_INT_TE | MXC_INT_RDR); | ||
1380 | |||
1381 | if (wait_for_completion_interruptible(&spi_imx->xfer_done) || | ||
1382 | spi_imx->slave_aborted) { | ||
1383 | dev_dbg(&spi->dev, "interrupted\n"); | ||
1384 | ret = -EINTR; | ||
1385 | } | ||
1386 | |||
1387 | /* ecspi has a HW issue when works in Slave mode, | ||
1388 | * after 64 words writtern to TXFIFO, even TXFIFO becomes empty, | ||
1389 | * ECSPI_TXDATA keeps shift out the last word data, | ||
1390 | * so we have to disable ECSPI when in slave mode after the | ||
1391 | * transfer completes | ||
1392 | */ | ||
1393 | if (spi_imx->devtype_data->disable) | ||
1394 | spi_imx->devtype_data->disable(spi_imx); | ||
1395 | |||
1396 | return ret; | ||
1397 | } | ||
1398 | |||
1265 | static int spi_imx_transfer(struct spi_device *spi, | 1399 | static int spi_imx_transfer(struct spi_device *spi, |
1266 | struct spi_transfer *transfer) | 1400 | struct spi_transfer *transfer) |
1267 | { | 1401 | { |
1268 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); | 1402 | struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master); |
1269 | 1403 | ||
1404 | /* flush rxfifo before transfer */ | ||
1405 | while (spi_imx->devtype_data->rx_available(spi_imx)) | ||
1406 | spi_imx->rx(spi_imx); | ||
1407 | |||
1408 | if (spi_imx->slave_mode) | ||
1409 | return spi_imx_pio_transfer_slave(spi, transfer); | ||
1410 | |||
1270 | if (spi_imx->usedma) | 1411 | if (spi_imx->usedma) |
1271 | return spi_imx_dma_transfer(spi_imx, transfer); | 1412 | return spi_imx_dma_transfer(spi_imx, transfer); |
1272 | else | 1413 | else |
@@ -1323,6 +1464,16 @@ spi_imx_unprepare_message(struct spi_master *master, struct spi_message *msg) | |||
1323 | return 0; | 1464 | return 0; |
1324 | } | 1465 | } |
1325 | 1466 | ||
1467 | static int spi_imx_slave_abort(struct spi_master *master) | ||
1468 | { | ||
1469 | struct spi_imx_data *spi_imx = spi_master_get_devdata(master); | ||
1470 | |||
1471 | spi_imx->slave_aborted = true; | ||
1472 | complete(&spi_imx->xfer_done); | ||
1473 | |||
1474 | return 0; | ||
1475 | } | ||
1476 | |||
1326 | static int spi_imx_probe(struct platform_device *pdev) | 1477 | static int spi_imx_probe(struct platform_device *pdev) |
1327 | { | 1478 | { |
1328 | struct device_node *np = pdev->dev.of_node; | 1479 | struct device_node *np = pdev->dev.of_node; |
@@ -1334,13 +1485,23 @@ static int spi_imx_probe(struct platform_device *pdev) | |||
1334 | struct spi_imx_data *spi_imx; | 1485 | struct spi_imx_data *spi_imx; |
1335 | struct resource *res; | 1486 | struct resource *res; |
1336 | int i, ret, irq, spi_drctl; | 1487 | int i, ret, irq, spi_drctl; |
1488 | const struct spi_imx_devtype_data *devtype_data = of_id ? of_id->data : | ||
1489 | (struct spi_imx_devtype_data *)pdev->id_entry->driver_data; | ||
1490 | bool slave_mode; | ||
1337 | 1491 | ||
1338 | if (!np && !mxc_platform_info) { | 1492 | if (!np && !mxc_platform_info) { |
1339 | dev_err(&pdev->dev, "can't get the platform data\n"); | 1493 | dev_err(&pdev->dev, "can't get the platform data\n"); |
1340 | return -EINVAL; | 1494 | return -EINVAL; |
1341 | } | 1495 | } |
1342 | 1496 | ||
1343 | master = spi_alloc_master(&pdev->dev, sizeof(struct spi_imx_data)); | 1497 | slave_mode = devtype_data->has_slavemode && |
1498 | of_property_read_bool(np, "spi-slave"); | ||
1499 | if (slave_mode) | ||
1500 | master = spi_alloc_slave(&pdev->dev, | ||
1501 | sizeof(struct spi_imx_data)); | ||
1502 | else | ||
1503 | master = spi_alloc_master(&pdev->dev, | ||
1504 | sizeof(struct spi_imx_data)); | ||
1344 | if (!master) | 1505 | if (!master) |
1345 | return -ENOMEM; | 1506 | return -ENOMEM; |
1346 | 1507 | ||
@@ -1358,9 +1519,9 @@ static int spi_imx_probe(struct platform_device *pdev) | |||
1358 | spi_imx = spi_master_get_devdata(master); | 1519 | spi_imx = spi_master_get_devdata(master); |
1359 | spi_imx->bitbang.master = master; | 1520 | spi_imx->bitbang.master = master; |
1360 | spi_imx->dev = &pdev->dev; | 1521 | spi_imx->dev = &pdev->dev; |
1522 | spi_imx->slave_mode = slave_mode; | ||
1361 | 1523 | ||
1362 | spi_imx->devtype_data = of_id ? of_id->data : | 1524 | spi_imx->devtype_data = devtype_data; |
1363 | (struct spi_imx_devtype_data *)pdev->id_entry->driver_data; | ||
1364 | 1525 | ||
1365 | if (mxc_platform_info) { | 1526 | if (mxc_platform_info) { |
1366 | master->num_chipselect = mxc_platform_info->num_chipselect; | 1527 | master->num_chipselect = mxc_platform_info->num_chipselect; |
@@ -1380,6 +1541,7 @@ static int spi_imx_probe(struct platform_device *pdev) | |||
1380 | spi_imx->bitbang.master->cleanup = spi_imx_cleanup; | 1541 | spi_imx->bitbang.master->cleanup = spi_imx_cleanup; |
1381 | spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message; | 1542 | spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message; |
1382 | spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message; | 1543 | spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message; |
1544 | spi_imx->bitbang.master->slave_abort = spi_imx_slave_abort; | ||
1383 | spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \ | 1545 | spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \ |
1384 | | SPI_NO_CS; | 1546 | | SPI_NO_CS; |
1385 | if (is_imx35_cspi(spi_imx) || is_imx51_ecspi(spi_imx) || | 1547 | if (is_imx35_cspi(spi_imx) || is_imx51_ecspi(spi_imx) || |
@@ -1457,23 +1619,26 @@ static int spi_imx_probe(struct platform_device *pdev) | |||
1457 | goto out_clk_put; | 1619 | goto out_clk_put; |
1458 | } | 1620 | } |
1459 | 1621 | ||
1460 | if (!master->cs_gpios) { | 1622 | if (!spi_imx->slave_mode) { |
1461 | dev_err(&pdev->dev, "No CS GPIOs available\n"); | 1623 | if (!master->cs_gpios) { |
1462 | ret = -EINVAL; | 1624 | dev_err(&pdev->dev, "No CS GPIOs available\n"); |
1463 | goto out_clk_put; | 1625 | ret = -EINVAL; |
1464 | } | ||
1465 | |||
1466 | for (i = 0; i < master->num_chipselect; i++) { | ||
1467 | if (!gpio_is_valid(master->cs_gpios[i])) | ||
1468 | continue; | ||
1469 | |||
1470 | ret = devm_gpio_request(&pdev->dev, master->cs_gpios[i], | ||
1471 | DRIVER_NAME); | ||
1472 | if (ret) { | ||
1473 | dev_err(&pdev->dev, "Can't get CS GPIO %i\n", | ||
1474 | master->cs_gpios[i]); | ||
1475 | goto out_clk_put; | 1626 | goto out_clk_put; |
1476 | } | 1627 | } |
1628 | |||
1629 | for (i = 0; i < master->num_chipselect; i++) { | ||
1630 | if (!gpio_is_valid(master->cs_gpios[i])) | ||
1631 | continue; | ||
1632 | |||
1633 | ret = devm_gpio_request(&pdev->dev, | ||
1634 | master->cs_gpios[i], | ||
1635 | DRIVER_NAME); | ||
1636 | if (ret) { | ||
1637 | dev_err(&pdev->dev, "Can't get CS GPIO %i\n", | ||
1638 | master->cs_gpios[i]); | ||
1639 | goto out_clk_put; | ||
1640 | } | ||
1641 | } | ||
1477 | } | 1642 | } |
1478 | 1643 | ||
1479 | dev_info(&pdev->dev, "probed\n"); | 1644 | dev_info(&pdev->dev, "probed\n"); |