diff options
Diffstat (limited to 'drivers/spi/spi-fsl-espi.c')
-rw-r--r-- | drivers/spi/spi-fsl-espi.c | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c index e767f5831b9c..8ebd724e4c59 100644 --- a/drivers/spi/spi-fsl-espi.c +++ b/drivers/spi/spi-fsl-espi.c | |||
@@ -348,7 +348,7 @@ static void fsl_espi_cmd_trans(struct spi_message *m, | |||
348 | } | 348 | } |
349 | 349 | ||
350 | espi_trans->tx_buf = local_buf; | 350 | espi_trans->tx_buf = local_buf; |
351 | espi_trans->rx_buf = local_buf + espi_trans->n_tx; | 351 | espi_trans->rx_buf = local_buf; |
352 | fsl_espi_do_trans(m, espi_trans); | 352 | fsl_espi_do_trans(m, espi_trans); |
353 | 353 | ||
354 | espi_trans->actual_length = espi_trans->len; | 354 | espi_trans->actual_length = espi_trans->len; |
@@ -397,7 +397,7 @@ static void fsl_espi_rw_trans(struct spi_message *m, | |||
397 | espi_trans->n_rx = trans_len; | 397 | espi_trans->n_rx = trans_len; |
398 | espi_trans->len = trans_len + n_tx; | 398 | espi_trans->len = trans_len + n_tx; |
399 | espi_trans->tx_buf = local_buf; | 399 | espi_trans->tx_buf = local_buf; |
400 | espi_trans->rx_buf = local_buf + n_tx; | 400 | espi_trans->rx_buf = local_buf; |
401 | fsl_espi_do_trans(m, espi_trans); | 401 | fsl_espi_do_trans(m, espi_trans); |
402 | 402 | ||
403 | memcpy(rx_buf + pos, espi_trans->rx_buf + n_tx, trans_len); | 403 | memcpy(rx_buf + pos, espi_trans->rx_buf + n_tx, trans_len); |
@@ -458,7 +458,7 @@ static int fsl_espi_setup(struct spi_device *spi) | |||
458 | return -EINVAL; | 458 | return -EINVAL; |
459 | 459 | ||
460 | if (!cs) { | 460 | if (!cs) { |
461 | cs = kzalloc(sizeof *cs, GFP_KERNEL); | 461 | cs = devm_kzalloc(&spi->dev, sizeof(*cs), GFP_KERNEL); |
462 | if (!cs) | 462 | if (!cs) |
463 | return -ENOMEM; | 463 | return -ENOMEM; |
464 | spi->controller_state = cs; | 464 | spi->controller_state = cs; |
@@ -586,8 +586,10 @@ static struct spi_master * fsl_espi_probe(struct device *dev, | |||
586 | struct spi_master *master; | 586 | struct spi_master *master; |
587 | struct mpc8xxx_spi *mpc8xxx_spi; | 587 | struct mpc8xxx_spi *mpc8xxx_spi; |
588 | struct fsl_espi_reg *reg_base; | 588 | struct fsl_espi_reg *reg_base; |
589 | u32 regval; | 589 | struct device_node *nc; |
590 | int i, ret = 0; | 590 | const __be32 *prop; |
591 | u32 regval, csmode; | ||
592 | int i, len, ret = 0; | ||
591 | 593 | ||
592 | master = spi_alloc_master(dev, sizeof(struct mpc8xxx_spi)); | 594 | master = spi_alloc_master(dev, sizeof(struct mpc8xxx_spi)); |
593 | if (!master) { | 595 | if (!master) { |
@@ -634,8 +636,32 @@ static struct spi_master * fsl_espi_probe(struct device *dev, | |||
634 | mpc8xxx_spi_write_reg(®_base->event, 0xffffffff); | 636 | mpc8xxx_spi_write_reg(®_base->event, 0xffffffff); |
635 | 637 | ||
636 | /* Init eSPI CS mode register */ | 638 | /* Init eSPI CS mode register */ |
637 | for (i = 0; i < pdata->max_chipselect; i++) | 639 | for_each_available_child_of_node(master->dev.of_node, nc) { |
638 | mpc8xxx_spi_write_reg(®_base->csmode[i], CSMODE_INIT_VAL); | 640 | /* get chip select */ |
641 | prop = of_get_property(nc, "reg", &len); | ||
642 | if (!prop || len < sizeof(*prop)) | ||
643 | continue; | ||
644 | i = be32_to_cpup(prop); | ||
645 | if (i < 0 || i >= pdata->max_chipselect) | ||
646 | continue; | ||
647 | |||
648 | csmode = CSMODE_INIT_VAL; | ||
649 | /* check if CSBEF is set in device tree */ | ||
650 | prop = of_get_property(nc, "fsl,csbef", &len); | ||
651 | if (prop && len >= sizeof(*prop)) { | ||
652 | csmode &= ~(CSMODE_BEF(0xf)); | ||
653 | csmode |= CSMODE_BEF(be32_to_cpup(prop)); | ||
654 | } | ||
655 | /* check if CSAFT is set in device tree */ | ||
656 | prop = of_get_property(nc, "fsl,csaft", &len); | ||
657 | if (prop && len >= sizeof(*prop)) { | ||
658 | csmode &= ~(CSMODE_AFT(0xf)); | ||
659 | csmode |= CSMODE_AFT(be32_to_cpup(prop)); | ||
660 | } | ||
661 | mpc8xxx_spi_write_reg(®_base->csmode[i], csmode); | ||
662 | |||
663 | dev_info(dev, "cs=%d, init_csmode=0x%x\n", i, csmode); | ||
664 | } | ||
639 | 665 | ||
640 | /* Enable SPI interface */ | 666 | /* Enable SPI interface */ |
641 | regval = pdata->initial_spmode | SPMODE_INIT_VAL | SPMODE_ENABLE; | 667 | regval = pdata->initial_spmode | SPMODE_INIT_VAL | SPMODE_ENABLE; |