diff mbox series

[v7,26/37] spi: tegra20-slink: Improve runtime PM usage

Message ID 20210701232728.23591-27-digetx@gmail.com
State Accepted
Commit e4bb903fda0e9bbafa1338dcd2ee5e4d3ccc50da
Headers show
Series NVIDIA Tegra power management patches for 5.15 | expand

Commit Message

Dmitry Osipenko July 1, 2021, 11:27 p.m. UTC
The Tegra SPI driver supports runtime PM, which controls the clock
enable state, but the clk is also enabled separately from the RPM
at the driver probe time, and thus, stays always on. Fix it.

Runtime PM now is always available on Tegra, hence there is no need to
check the RPM presence in the driver anymore. Remove these checks.

Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
 drivers/spi/spi-tegra20-slink.c | 67 +++++++++++----------------------
 1 file changed, 22 insertions(+), 45 deletions(-)

Comments

kernel test robot July 2, 2021, 8:29 a.m. UTC | #1
Hi Dmitry,

I love your patch! Perhaps something to improve:

[auto build test WARNING on next-20210701]
[cannot apply to tegra/for-next robh/for-next tegra-drm/drm/tegra/for-next v5.13 v5.13-rc7 v5.13-rc6 v5.13]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Dmitry-Osipenko/NVIDIA-Tegra-power-management-patches-for-5-15/20210702-073048
base:    fb0ca446157a86b75502c1636b0d81e642fe6bf1
config: x86_64-randconfig-b001-20210630 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 9eb613b2de3163686b1a4bd1160f15ac56a4b083)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # https://github.com/0day-ci/linux/commit/eae252678e4ba361dc1513283e282268a7548af6
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Dmitry-Osipenko/NVIDIA-Tegra-power-management-patches-for-5-15/20210702-073048
        git checkout eae252678e4ba361dc1513283e282268a7548af6
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/spi/spi-tegra20-slink.c:1076:6: warning: variable 'spi_irq' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]

           if (ret < 0)
               ^~~~~~~
   drivers/spi/spi-tegra20-slink.c:1126:11: note: uninitialized use occurs here
           free_irq(spi_irq, tspi);
                    ^~~~~~~
   drivers/spi/spi-tegra20-slink.c:1076:2: note: remove the 'if' if its condition is always false
           if (ret < 0)
           ^~~~~~~~~~~~
   drivers/spi/spi-tegra20-slink.c:1066:6: warning: variable 'spi_irq' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
           if (IS_ERR(tspi->rst)) {
               ^~~~~~~~~~~~~~~~~
   drivers/spi/spi-tegra20-slink.c:1126:11: note: uninitialized use occurs here
           free_irq(spi_irq, tspi);
                    ^~~~~~~
   drivers/spi/spi-tegra20-slink.c:1066:2: note: remove the 'if' if its condition is always false
           if (IS_ERR(tspi->rst)) {
           ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/spi/spi-tegra20-slink.c:1007:18: note: initialize the variable 'spi_irq' to silence this warning
           int ret, spi_irq;
                           ^
                            = 0
   2 warnings generated.


vim +1076 drivers/spi/spi-tegra20-slink.c

dc4dc36056392c Laxman Dewangan 2012-10-30  1001  
fd4a319bc933ae Grant Likely    2012-12-07  1002  static int tegra_slink_probe(struct platform_device *pdev)
dc4dc36056392c Laxman Dewangan 2012-10-30  1003  {
dc4dc36056392c Laxman Dewangan 2012-10-30  1004  	struct spi_master	*master;
dc4dc36056392c Laxman Dewangan 2012-10-30  1005  	struct tegra_slink_data	*tspi;
dc4dc36056392c Laxman Dewangan 2012-10-30  1006  	struct resource		*r;
dc4dc36056392c Laxman Dewangan 2012-10-30  1007  	int ret, spi_irq;
dc4dc36056392c Laxman Dewangan 2012-10-30  1008  	const struct tegra_slink_chip_data *cdata = NULL;
dc4dc36056392c Laxman Dewangan 2012-10-30  1009  	const struct of_device_id *match;
dc4dc36056392c Laxman Dewangan 2012-10-30  1010  
c60fea02141167 Stephen Warren  2013-02-15  1011  	match = of_match_device(tegra_slink_of_match, &pdev->dev);
dc4dc36056392c Laxman Dewangan 2012-10-30  1012  	if (!match) {
dc4dc36056392c Laxman Dewangan 2012-10-30  1013  		dev_err(&pdev->dev, "Error: No device match found\n");
dc4dc36056392c Laxman Dewangan 2012-10-30  1014  		return -ENODEV;
dc4dc36056392c Laxman Dewangan 2012-10-30  1015  	}
dc4dc36056392c Laxman Dewangan 2012-10-30  1016  	cdata = match->data;
dc4dc36056392c Laxman Dewangan 2012-10-30  1017  
dc4dc36056392c Laxman Dewangan 2012-10-30  1018  	master = spi_alloc_master(&pdev->dev, sizeof(*tspi));
dc4dc36056392c Laxman Dewangan 2012-10-30  1019  	if (!master) {
dc4dc36056392c Laxman Dewangan 2012-10-30  1020  		dev_err(&pdev->dev, "master allocation failed\n");
dc4dc36056392c Laxman Dewangan 2012-10-30  1021  		return -ENOMEM;
dc4dc36056392c Laxman Dewangan 2012-10-30  1022  	}
dc4dc36056392c Laxman Dewangan 2012-10-30  1023  
dc4dc36056392c Laxman Dewangan 2012-10-30  1024  	/* the spi->mode bits understood by this driver: */
dc4dc36056392c Laxman Dewangan 2012-10-30  1025  	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
dc4dc36056392c Laxman Dewangan 2012-10-30  1026  	master->setup = tegra_slink_setup;
63fc184cde2d77 Mark Brown      2013-10-05  1027  	master->prepare_message = tegra_slink_prepare_message;
63fc184cde2d77 Mark Brown      2013-10-05  1028  	master->transfer_one = tegra_slink_transfer_one;
63fc184cde2d77 Mark Brown      2013-10-05  1029  	master->unprepare_message = tegra_slink_unprepare_message;
ce74ac80d25bcb Mark Brown      2013-07-28  1030  	master->auto_runtime_pm = true;
dc4dc36056392c Laxman Dewangan 2012-10-30  1031  	master->num_chipselect = MAX_CHIP_SELECT;
dc4dc36056392c Laxman Dewangan 2012-10-30  1032  
24b5a82cf5709a Jingoo Han      2013-05-23  1033  	platform_set_drvdata(pdev, master);
dc4dc36056392c Laxman Dewangan 2012-10-30  1034  	tspi = spi_master_get_devdata(master);
dc4dc36056392c Laxman Dewangan 2012-10-30  1035  	tspi->master = master;
dc4dc36056392c Laxman Dewangan 2012-10-30  1036  	tspi->dev = &pdev->dev;
dc4dc36056392c Laxman Dewangan 2012-10-30  1037  	tspi->chip_data = cdata;
dc4dc36056392c Laxman Dewangan 2012-10-30  1038  	spin_lock_init(&tspi->lock);
dc4dc36056392c Laxman Dewangan 2012-10-30  1039  
3c604de496d756 Axel Lin        2014-02-10  1040  	if (of_property_read_u32(tspi->dev->of_node, "spi-max-frequency",
3c604de496d756 Axel Lin        2014-02-10  1041  				 &master->max_speed_hz))
3c604de496d756 Axel Lin        2014-02-10  1042  		master->max_speed_hz = 25000000; /* 25MHz */
c60fea02141167 Stephen Warren  2013-02-15  1043  
dc4dc36056392c Laxman Dewangan 2012-10-30  1044  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
dc4dc36056392c Laxman Dewangan 2012-10-30  1045  	if (!r) {
dc4dc36056392c Laxman Dewangan 2012-10-30  1046  		dev_err(&pdev->dev, "No IO memory resource\n");
dc4dc36056392c Laxman Dewangan 2012-10-30  1047  		ret = -ENODEV;
dc4dc36056392c Laxman Dewangan 2012-10-30  1048  		goto exit_free_master;
dc4dc36056392c Laxman Dewangan 2012-10-30  1049  	}
dc4dc36056392c Laxman Dewangan 2012-10-30  1050  	tspi->phys = r->start;
b0ee5605234a24 Thierry Reding  2013-01-21  1051  	tspi->base = devm_ioremap_resource(&pdev->dev, r);
b0ee5605234a24 Thierry Reding  2013-01-21  1052  	if (IS_ERR(tspi->base)) {
b0ee5605234a24 Thierry Reding  2013-01-21  1053  		ret = PTR_ERR(tspi->base);
dc4dc36056392c Laxman Dewangan 2012-10-30  1054  		goto exit_free_master;
dc4dc36056392c Laxman Dewangan 2012-10-30  1055  	}
dc4dc36056392c Laxman Dewangan 2012-10-30  1056  
7001cab1dabc0b Marcel Ziswiler 2018-08-29  1057  	/* disabled clock may cause interrupt storm upon request */
7001cab1dabc0b Marcel Ziswiler 2018-08-29  1058  	tspi->clk = devm_clk_get(&pdev->dev, NULL);
7001cab1dabc0b Marcel Ziswiler 2018-08-29  1059  	if (IS_ERR(tspi->clk)) {
7001cab1dabc0b Marcel Ziswiler 2018-08-29  1060  		ret = PTR_ERR(tspi->clk);
7001cab1dabc0b Marcel Ziswiler 2018-08-29  1061  		dev_err(&pdev->dev, "Can not get clock %d\n", ret);
7001cab1dabc0b Marcel Ziswiler 2018-08-29  1062  		goto exit_free_master;
7001cab1dabc0b Marcel Ziswiler 2018-08-29  1063  	}
dc4dc36056392c Laxman Dewangan 2012-10-30  1064  
73b32756cec312 Philipp Zabel   2017-07-19  1065  	tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi");
ff2251e3de37b0 Stephen Warren  2013-11-06  1066  	if (IS_ERR(tspi->rst)) {
ff2251e3de37b0 Stephen Warren  2013-11-06  1067  		dev_err(&pdev->dev, "can not get reset\n");
ff2251e3de37b0 Stephen Warren  2013-11-06  1068  		ret = PTR_ERR(tspi->rst);
ff2251e3de37b0 Stephen Warren  2013-11-06  1069  		goto exit_free_irq;
ff2251e3de37b0 Stephen Warren  2013-11-06  1070  	}
ff2251e3de37b0 Stephen Warren  2013-11-06  1071  
dc4dc36056392c Laxman Dewangan 2012-10-30  1072  	tspi->max_buf_size = SLINK_FIFO_DEPTH << 2;
dc4dc36056392c Laxman Dewangan 2012-10-30  1073  	tspi->dma_buf_size = DEFAULT_SPI_DMA_BUF_LEN;
dc4dc36056392c Laxman Dewangan 2012-10-30  1074  
dc4dc36056392c Laxman Dewangan 2012-10-30  1075  	ret = tegra_slink_init_dma_param(tspi, true);
a915d150f68d8f Stephen Warren  2013-11-11 @1076  	if (ret < 0)
dc4dc36056392c Laxman Dewangan 2012-10-30  1077  		goto exit_free_irq;
dc4dc36056392c Laxman Dewangan 2012-10-30  1078  	ret = tegra_slink_init_dma_param(tspi, false);
a915d150f68d8f Stephen Warren  2013-11-11  1079  	if (ret < 0)
dc4dc36056392c Laxman Dewangan 2012-10-30  1080  		goto exit_rx_dma_free;
dc4dc36056392c Laxman Dewangan 2012-10-30  1081  	tspi->max_buf_size = tspi->dma_buf_size;
dc4dc36056392c Laxman Dewangan 2012-10-30  1082  	init_completion(&tspi->tx_dma_complete);
dc4dc36056392c Laxman Dewangan 2012-10-30  1083  	init_completion(&tspi->rx_dma_complete);
dc4dc36056392c Laxman Dewangan 2012-10-30  1084  
dc4dc36056392c Laxman Dewangan 2012-10-30  1085  	init_completion(&tspi->xfer_completion);
dc4dc36056392c Laxman Dewangan 2012-10-30  1086  
dc4dc36056392c Laxman Dewangan 2012-10-30  1087  	pm_runtime_enable(&pdev->dev);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1088  	ret = pm_runtime_resume_and_get(&pdev->dev);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1089  	if (ret) {
dc4dc36056392c Laxman Dewangan 2012-10-30  1090  		dev_err(&pdev->dev, "pm runtime get failed, e = %d\n", ret);
dc4dc36056392c Laxman Dewangan 2012-10-30  1091  		goto exit_pm_disable;
dc4dc36056392c Laxman Dewangan 2012-10-30  1092  	}
aceda401e84115 Jon Hunter      2021-06-08  1093  
aceda401e84115 Jon Hunter      2021-06-08  1094  	reset_control_assert(tspi->rst);
aceda401e84115 Jon Hunter      2021-06-08  1095  	udelay(2);
aceda401e84115 Jon Hunter      2021-06-08  1096  	reset_control_deassert(tspi->rst);
aceda401e84115 Jon Hunter      2021-06-08  1097  
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1098  	spi_irq = platform_get_irq(pdev, 0);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1099  	tspi->irq = spi_irq;
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1100  	ret = request_threaded_irq(tspi->irq, tegra_slink_isr,
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1101  				   tegra_slink_isr_thread, IRQF_ONESHOT,
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1102  				   dev_name(&pdev->dev), tspi);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1103  	if (ret < 0) {
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1104  		dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1105  			tspi->irq);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1106  		goto exit_pm_put;
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1107  	}
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1108  
dc4dc36056392c Laxman Dewangan 2012-10-30  1109  	tspi->def_command_reg  = SLINK_M_S;
dc4dc36056392c Laxman Dewangan 2012-10-30  1110  	tspi->def_command2_reg = SLINK_CS_ACTIVE_BETWEEN;
dc4dc36056392c Laxman Dewangan 2012-10-30  1111  	tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND);
dc4dc36056392c Laxman Dewangan 2012-10-30  1112  	tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2);
dc4dc36056392c Laxman Dewangan 2012-10-30  1113  
dc4dc36056392c Laxman Dewangan 2012-10-30  1114  	master->dev.of_node = pdev->dev.of_node;
716db5d64f5f9b Jingoo Han      2013-09-24  1115  	ret = devm_spi_register_master(&pdev->dev, master);
dc4dc36056392c Laxman Dewangan 2012-10-30  1116  	if (ret < 0) {
dc4dc36056392c Laxman Dewangan 2012-10-30  1117  		dev_err(&pdev->dev, "can not register to master err %d\n", ret);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1118  		goto exit_free_irq;
dc4dc36056392c Laxman Dewangan 2012-10-30  1119  	}
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1120  
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1121  	pm_runtime_put(&pdev->dev);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1122  
dc4dc36056392c Laxman Dewangan 2012-10-30  1123  	return ret;
dc4dc36056392c Laxman Dewangan 2012-10-30  1124  
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1125  exit_free_irq:
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1126  	free_irq(spi_irq, tspi);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1127  exit_pm_put:
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1128  	pm_runtime_put(&pdev->dev);
dc4dc36056392c Laxman Dewangan 2012-10-30  1129  exit_pm_disable:
dc4dc36056392c Laxman Dewangan 2012-10-30  1130  	pm_runtime_disable(&pdev->dev);
eae252678e4ba3 Dmitry Osipenko 2021-07-02  1131  
dc4dc36056392c Laxman Dewangan 2012-10-30  1132  	tegra_slink_deinit_dma_param(tspi, false);
dc4dc36056392c Laxman Dewangan 2012-10-30  1133  exit_rx_dma_free:
dc4dc36056392c Laxman Dewangan 2012-10-30  1134  	tegra_slink_deinit_dma_param(tspi, true);
dc4dc36056392c Laxman Dewangan 2012-10-30  1135  exit_free_master:
dc4dc36056392c Laxman Dewangan 2012-10-30  1136  	spi_master_put(master);
dc4dc36056392c Laxman Dewangan 2012-10-30  1137  	return ret;
dc4dc36056392c Laxman Dewangan 2012-10-30  1138  }
dc4dc36056392c Laxman Dewangan 2012-10-30  1139  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
index 6a726c95ac7a..cbf0b4a0820a 100644
--- a/drivers/spi/spi-tegra20-slink.c
+++ b/drivers/spi/spi-tegra20-slink.c
@@ -1061,27 +1061,6 @@  static int tegra_slink_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "Can not get clock %d\n", ret);
 		goto exit_free_master;
 	}
-	ret = clk_prepare(tspi->clk);
-	if (ret < 0) {
-		dev_err(&pdev->dev, "Clock prepare failed %d\n", ret);
-		goto exit_free_master;
-	}
-	ret = clk_enable(tspi->clk);
-	if (ret < 0) {
-		dev_err(&pdev->dev, "Clock enable failed %d\n", ret);
-		goto exit_clk_unprepare;
-	}
-
-	spi_irq = platform_get_irq(pdev, 0);
-	tspi->irq = spi_irq;
-	ret = request_threaded_irq(tspi->irq, tegra_slink_isr,
-			tegra_slink_isr_thread, IRQF_ONESHOT,
-			dev_name(&pdev->dev), tspi);
-	if (ret < 0) {
-		dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
-					tspi->irq);
-		goto exit_clk_disable;
-	}
 
 	tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi");
 	if (IS_ERR(tspi->rst)) {
@@ -1106,16 +1085,9 @@  static int tegra_slink_probe(struct platform_device *pdev)
 	init_completion(&tspi->xfer_completion);
 
 	pm_runtime_enable(&pdev->dev);
-	if (!pm_runtime_enabled(&pdev->dev)) {
-		ret = tegra_slink_runtime_resume(&pdev->dev);
-		if (ret)
-			goto exit_pm_disable;
-	}
-
-	ret = pm_runtime_get_sync(&pdev->dev);
-	if (ret < 0) {
+	ret = pm_runtime_resume_and_get(&pdev->dev);
+	if (ret) {
 		dev_err(&pdev->dev, "pm runtime get failed, e = %d\n", ret);
-		pm_runtime_put_noidle(&pdev->dev);
 		goto exit_pm_disable;
 	}
 
@@ -1123,33 +1095,43 @@  static int tegra_slink_probe(struct platform_device *pdev)
 	udelay(2);
 	reset_control_deassert(tspi->rst);
 
+	spi_irq = platform_get_irq(pdev, 0);
+	tspi->irq = spi_irq;
+	ret = request_threaded_irq(tspi->irq, tegra_slink_isr,
+				   tegra_slink_isr_thread, IRQF_ONESHOT,
+				   dev_name(&pdev->dev), tspi);
+	if (ret < 0) {
+		dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n",
+			tspi->irq);
+		goto exit_pm_put;
+	}
+
 	tspi->def_command_reg  = SLINK_M_S;
 	tspi->def_command2_reg = SLINK_CS_ACTIVE_BETWEEN;
 	tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND);
 	tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2);
-	pm_runtime_put(&pdev->dev);
 
 	master->dev.of_node = pdev->dev.of_node;
 	ret = devm_spi_register_master(&pdev->dev, master);
 	if (ret < 0) {
 		dev_err(&pdev->dev, "can not register to master err %d\n", ret);
-		goto exit_pm_disable;
+		goto exit_free_irq;
 	}
+
+	pm_runtime_put(&pdev->dev);
+
 	return ret;
 
+exit_free_irq:
+	free_irq(spi_irq, tspi);
+exit_pm_put:
+	pm_runtime_put(&pdev->dev);
 exit_pm_disable:
 	pm_runtime_disable(&pdev->dev);
-	if (!pm_runtime_status_suspended(&pdev->dev))
-		tegra_slink_runtime_suspend(&pdev->dev);
+
 	tegra_slink_deinit_dma_param(tspi, false);
 exit_rx_dma_free:
 	tegra_slink_deinit_dma_param(tspi, true);
-exit_free_irq:
-	free_irq(spi_irq, tspi);
-exit_clk_disable:
-	clk_disable(tspi->clk);
-exit_clk_unprepare:
-	clk_unprepare(tspi->clk);
 exit_free_master:
 	spi_master_put(master);
 	return ret;
@@ -1162,9 +1144,6 @@  static int tegra_slink_remove(struct platform_device *pdev)
 
 	free_irq(tspi->irq, tspi);
 
-	clk_disable(tspi->clk);
-	clk_unprepare(tspi->clk);
-
 	if (tspi->tx_dma_chan)
 		tegra_slink_deinit_dma_param(tspi, false);
 
@@ -1172,8 +1151,6 @@  static int tegra_slink_remove(struct platform_device *pdev)
 		tegra_slink_deinit_dma_param(tspi, true);
 
 	pm_runtime_disable(&pdev->dev);
-	if (!pm_runtime_status_suspended(&pdev->dev))
-		tegra_slink_runtime_suspend(&pdev->dev);
 
 	return 0;
 }