Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi/fsl-espi: Add Power Management support for eSPI controller

Add PM support for eSPI controller using callback function suspend
and resume in .driver.pm of platform_driver.

Signed-off-by: Hou Zhiqiang <b48286@freescale.com>
Signed-off-by: Mark Brown <broonie@linaro.org>

authored by

Hou Zhiqiang and committed by
Mark Brown
714bb654 7227cd18

+61
+61
drivers/spi/spi-fsl-espi.c
··· 727 727 return mpc8xxx_spi_remove(&dev->dev); 728 728 } 729 729 730 + #ifdef CONFIG_PM_SLEEP 731 + static int of_fsl_espi_suspend(struct device *dev) 732 + { 733 + struct spi_master *master = dev_get_drvdata(dev); 734 + struct mpc8xxx_spi *mpc8xxx_spi; 735 + struct fsl_espi_reg *reg_base; 736 + u32 regval; 737 + int ret; 738 + 739 + mpc8xxx_spi = spi_master_get_devdata(master); 740 + reg_base = mpc8xxx_spi->reg_base; 741 + 742 + ret = spi_master_suspend(master); 743 + if (ret) { 744 + dev_warn(dev, "cannot suspend master\n"); 745 + return ret; 746 + } 747 + 748 + regval = mpc8xxx_spi_read_reg(&reg_base->mode); 749 + regval &= ~SPMODE_ENABLE; 750 + mpc8xxx_spi_write_reg(&reg_base->mode, regval); 751 + 752 + return 0; 753 + } 754 + 755 + static int of_fsl_espi_resume(struct device *dev) 756 + { 757 + struct fsl_spi_platform_data *pdata = dev_get_platdata(dev); 758 + struct spi_master *master = dev_get_drvdata(dev); 759 + struct mpc8xxx_spi *mpc8xxx_spi; 760 + struct fsl_espi_reg *reg_base; 761 + u32 regval; 762 + int i; 763 + 764 + mpc8xxx_spi = spi_master_get_devdata(master); 765 + reg_base = mpc8xxx_spi->reg_base; 766 + 767 + /* SPI controller initializations */ 768 + mpc8xxx_spi_write_reg(&reg_base->mode, 0); 769 + mpc8xxx_spi_write_reg(&reg_base->mask, 0); 770 + mpc8xxx_spi_write_reg(&reg_base->command, 0); 771 + mpc8xxx_spi_write_reg(&reg_base->event, 0xffffffff); 772 + 773 + /* Init eSPI CS mode register */ 774 + for (i = 0; i < pdata->max_chipselect; i++) 775 + mpc8xxx_spi_write_reg(&reg_base->csmode[i], CSMODE_INIT_VAL); 776 + 777 + /* Enable SPI interface */ 778 + regval = pdata->initial_spmode | SPMODE_INIT_VAL | SPMODE_ENABLE; 779 + 780 + mpc8xxx_spi_write_reg(&reg_base->mode, regval); 781 + 782 + return spi_master_resume(master); 783 + } 784 + #endif /* CONFIG_PM_SLEEP */ 785 + 786 + static const struct dev_pm_ops espi_pm = { 787 + SET_SYSTEM_SLEEP_PM_OPS(of_fsl_espi_suspend, of_fsl_espi_resume) 788 + }; 789 + 730 790 static const struct of_device_id of_fsl_espi_match[] = { 731 791 { .compatible = "fsl,mpc8536-espi" }, 732 792 {} ··· 798 738 .name = "fsl_espi", 799 739 .owner = THIS_MODULE, 800 740 .of_match_table = of_fsl_espi_match, 741 + .pm = &espi_pm, 801 742 }, 802 743 .probe = of_fsl_espi_probe, 803 744 .remove = of_fsl_espi_remove,