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; |
