linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: linux-i2c@vger.kernel.org
Cc: Wolfram Sang <wsa@the-dreams.de>,
	"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
	linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
	Lv Zheng <lv.zheng@intel.com>, Aaron Lu <aaron.lu@intel.com>,
	linux-arm-kernel@lists.infradead.org,
	Mark Brown <broonie@kernel.org>,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	Mauro Carvalho Chehab <m.chehab@samsung.com>,
	Samuel Ortiz <sameo@linux.intel.com>,
	Lee Jones <lee.jones@linaro.org>, Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Kyungmin Park <kyungmin.park@samsung.com>,
	Mika Westerberg <mika.westerberg@linux.intel.com>
Subject: [PATCH v2 8/9] spi: prepare runtime PM support for SPI devices
Date: Wed, 11 Sep 2013 18:32:39 +0300	[thread overview]
Message-ID: <1378913560-2752-9-git-send-email-mika.westerberg@linux.intel.com> (raw)
In-Reply-To: <1378913560-2752-1-git-send-email-mika.westerberg@linux.intel.com>

This patch adds runtime PM support for the SPI bus analogous to what has
been done for the I2C bus. This means that the SPI core prepares runtime PM
for a client device just before a driver is about to be bound to it.
Devices that are not bound to any driver are not prepared for runtime PM.

In order to participate the runtime PM of the SPI bus a device driver needs
to drop the device runtime PM reference count by calling pm_runtime_put()
in its ->probe() callback and possibly implement rest of the runtime PM
callbacks.

If the driver doesn't support runtime PM, the device in question is
regarded as being runtime PM active and powered on.

This patch adds also runtime PM support for the SPI master device because
it is needed to be able to runtime power manage the SPI controller device.
The SPI master device is handled along with the SPI controller device.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
 drivers/spi/spi.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 47 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 978dda2..94ebab9 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -240,22 +240,61 @@ EXPORT_SYMBOL_GPL(spi_bus_type);
 static int spi_drv_probe(struct device *dev)
 {
 	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
+	struct spi_device		*spi = to_spi_device(dev);
+	int				ret;
 
-	return sdrv->probe(to_spi_device(dev));
+	/* Make sure that the master is powered on */
+	pm_runtime_get_sync(&spi->master->dev);
+
+	/*
+	 * Enable runtime PM for the SPI device. The SPI device driver can
+	 * participate in runtime PM by calling pm_runtime_put() in its
+	 * probe() callback.
+	 */
+	pm_runtime_get_noresume(&spi->dev);
+	pm_runtime_set_active(&spi->dev);
+	pm_runtime_enable(&spi->dev);
+
+	ret = sdrv->probe(spi);
+	if (ret) {
+		pm_runtime_disable(&spi->dev);
+		pm_runtime_set_suspended(&spi->dev);
+		pm_runtime_put_noidle(&spi->dev);
+	}
+
+	pm_runtime_put(&spi->master->dev);
+
+	return ret;
 }
 
 static int spi_drv_remove(struct device *dev)
 {
 	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
+	struct spi_device		*spi = to_spi_device(dev);
+	int				ret;
+
+	pm_runtime_get_sync(&spi->master->dev);
+
+	ret = sdrv->remove(spi);
+
+	/* Undo the runtime PM done in spi_drv_probe() */
+	pm_runtime_disable(&spi->dev);
+	pm_runtime_set_suspended(&spi->dev);
+	pm_runtime_put_noidle(&spi->dev);
 
-	return sdrv->remove(to_spi_device(dev));
+	pm_runtime_put(&spi->master->dev);
+
+	return ret;
 }
 
 static void spi_drv_shutdown(struct device *dev)
 {
 	const struct spi_driver		*sdrv = to_spi_driver(dev->driver);
+	struct spi_device		*spi = to_spi_device(dev);
 
+	pm_runtime_get_sync(&spi->master->dev);
 	sdrv->shutdown(to_spi_device(dev));
+	pm_runtime_put(&spi->master->dev);
 }
 
 /**
@@ -1174,6 +1213,10 @@ int spi_register_master(struct spi_master *master)
 		}
 	}
 
+	pm_runtime_set_active(&master->dev);
+	pm_runtime_no_callbacks(&master->dev);
+	pm_runtime_enable(&master->dev);
+
 	mutex_lock(&board_lock);
 	list_add_tail(&master->list, &spi_master_list);
 	list_for_each_entry(bi, &board_list, list)
@@ -1217,6 +1260,8 @@ void spi_unregister_master(struct spi_master *master)
 	list_del(&master->list);
 	mutex_unlock(&board_lock);
 
+	pm_runtime_disable(&master->dev);
+
 	dummy = device_for_each_child(&master->dev, NULL, __unregister);
 	device_unregister(&master->dev);
 }
-- 
1.8.4.rc3

  parent reply	other threads:[~2013-09-11 15:32 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-11 15:32 [PATCH v2 0/9] runtime PM support for I2C and SPI client devices Mika Westerberg
2013-09-11 15:32 ` [PATCH v2 1/9] i2c: prepare runtime PM support for I2C " Mika Westerberg
2013-09-12 21:34   ` Kevin Hilman
     [not found]     ` <87vc25pvvm.fsf-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2013-09-12 21:40       ` Kevin Hilman
2013-09-13  6:54     ` Mika Westerberg
2013-09-13  9:59       ` Mark Brown
     [not found]         ` <20130913095950.GA29403-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-09-13 10:16           ` Mika Westerberg
2013-09-13 10:31             ` Mark Brown
     [not found]               ` <20130913103152.GE29403-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-09-13 11:50                 ` Mika Westerberg
     [not found]                   ` <20130913115035.GB7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-13 12:10                     ` Mark Brown
2013-09-13 14:30       ` Kevin Hilman
2013-09-13 14:50         ` Mika Westerberg
     [not found]           ` <20130913145022.GC7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-13 17:31             ` Mika Westerberg
2013-09-13 21:10               ` Kevin Hilman
2013-09-15  6:41                 ` Mika Westerberg
2013-09-15 12:47                   ` Mark Brown
     [not found]                     ` <20130915124744.GW29403-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-09-15 13:28                       ` Mika Westerberg
2013-09-16 10:12                         ` Mark Brown
     [not found]                           ` <20130916101249.GX29403-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-09-16 14:38                             ` Mika Westerberg
     [not found]                               ` <20130916143811.GP7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-16 14:46                                 ` Graeme Gregory
2013-09-16 15:13                                   ` Mika Westerberg
2013-09-13 15:14       ` Sylwester Nawrocki
     [not found]         ` <52332BF0.4060605-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-09-13 15:40           ` Mika Westerberg
     [not found]             ` <20130913154013.GD7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-15 13:48               ` Sylwester Nawrocki
     [not found]                 ` <5235BA9C.1090509-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-09-16  8:47                   ` Mika Westerberg
2013-09-16 19:07                     ` Rafael J. Wysocki
     [not found]                       ` <1861747.RtS0ZLgUUN-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2013-09-16 23:31                         ` Mark Brown
     [not found]                           ` <20130916233111.GB21013-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-09-17  1:25                             ` Rafael J. Wysocki
     [not found]                               ` <1820315.QOOAzSjac3-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2013-09-17 10:48                                 ` Mark Brown
2013-09-17 11:00                         ` Mika Westerberg
     [not found]                           ` <20130917110021.GU7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-17 21:38                             ` Rafael J. Wysocki
     [not found]                     ` <20130916084708.GN7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-17 11:07                       ` Sylwester Nawrocki
2013-09-24  5:18                         ` Mika Westerberg
2013-09-12 22:06   ` Sylwester Nawrocki
2013-09-13  1:14     ` Aaron Lu
     [not found]       ` <523266EC.1060501-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-13 10:02         ` Mark Brown
2013-09-11 15:32 ` [PATCH v2 2/9] i2c: attach/detach I2C client device to the ACPI power domain Mika Westerberg
2013-09-11 15:32 ` [PATCH v2 3/9] Input: misc - convert existing I2C client drivers to use I2C core runtime PM Mika Westerberg
2013-09-11 15:32 ` [PATCH v2 4/9] [media] s5p-tv: convert " Mika Westerberg
2013-09-11 15:32 ` [PATCH v2 5/9] drivers/misc: convert existing I2C clients driver " Mika Westerberg
2013-09-12 21:29   ` Greg Kroah-Hartman
2013-09-11 15:32 ` [PATCH v2 6/9] mfd: wm8994: convert " Mika Westerberg
2013-09-11 16:12   ` Samuel Ortiz
2013-09-12  9:24     ` Mika Westerberg
     [not found]       ` <20130912092447.GJ7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-12  9:28         ` Samuel Ortiz
2013-09-11 15:32 ` [PATCH v2 7/9] ASoC: codecs: convert existing I2C client drivers " Mika Westerberg
     [not found]   ` <1378913560-2752-8-git-send-email-mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2013-09-11 15:44     ` Mark Brown
2013-09-11 15:32 ` Mika Westerberg [this message]
     [not found]   ` <1378913560-2752-9-git-send-email-mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2013-09-11 15:51     ` [PATCH v2 8/9] spi: prepare runtime PM support for SPI devices Mark Brown
2013-09-12  9:27       ` Mika Westerberg
     [not found]         ` <20130912092743.GK7393-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2013-09-12  9:31           ` Mark Brown
     [not found]             ` <20130912093145.GA29403-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-09-12  9:43               ` Mika Westerberg
2013-09-12 11:04                 ` Rafael J. Wysocki
2013-09-12 11:04                   ` Wolfram Sang
2013-09-12 12:20                     ` Mika Westerberg
     [not found]                   ` <14222641.vVF4lKBqCB-sKB8Sp2ER+y1GS7QM15AGw@public.gmane.org>
2013-09-12 12:25                     ` Mika Westerberg
2013-09-11 15:32 ` [PATCH v2 9/9] spi: attach/detach SPI device to the ACPI power domain Mika Westerberg
2013-09-11 15:51   ` Mark Brown
     [not found] ` <1378913560-2752-1-git-send-email-mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2013-09-11 15:53   ` [PATCH v2 0/9] runtime PM support for I2C and SPI client devices Mark Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1378913560-2752-9-git-send-email-mika.westerberg@linux.intel.com \
    --to=mika.westerberg@linux.intel.com \
    --cc=aaron.lu@intel.com \
    --cc=arnd@arndb.de \
    --cc=broonie@kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=kyungmin.park@samsung.com \
    --cc=lee.jones@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lv.zheng@intel.com \
    --cc=m.chehab@samsung.com \
    --cc=rafael.j.wysocki@intel.com \
    --cc=sameo@linux.intel.com \
    --cc=wsa@the-dreams.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).