From patchwork Tue Feb 16 19:57:20 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ernst Schwab X-Patchwork-Id: 79771 Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o1GJvshA014138 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 16 Feb 2010 19:58:30 GMT Received: from localhost ([127.0.0.1] helo=sfs-ml-1.v29.ch3.sourceforge.com) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1NhTYQ-0004qP-HY; Tue, 16 Feb 2010 19:57:54 +0000 Received: from sfi-mx-1.v28.ch3.sourceforge.com ([172.29.28.121] helo=mx.sourceforge.net) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1NhTYP-0004qA-L9 for spi-devel-general@lists.sourceforge.net; Tue, 16 Feb 2010 19:57:53 +0000 X-ACL-Warn: Received: from moutng.kundenserver.de ([212.227.126.186]) by sfi-mx-1.v28.ch3.sourceforge.com with esmtp (Exim 4.69) id 1NhTYO-0000EU-Di; Tue, 16 Feb 2010 19:57:53 +0000 Received: from ip065 (koln-5d8135c9.pool.mediaWays.net [93.129.53.201]) by mrelayeu.kundenserver.de (node=mrbap0) with ESMTP (Nemesis) id 0Medom-1NJBOI2QCO-00OySZ; Tue, 16 Feb 2010 20:57:19 +0100 Date: Tue, 16 Feb 2010 20:57:20 +0100 From: Ernst Schwab To: Grant Likely , Kumar Gala , David Brownell , spi-devel-general@lists.sourceforge.net Message-Id: <20100216205720.ebe949a1.eschwab@online.de> In-Reply-To: <20100216204450.e043eed8.eschwab@online.de> References: <20100216204450.e043eed8.eschwab@online.de> X-Mailer: Sylpheed 3.0.0beta8 (GTK+ 2.10.14; i686-pc-mingw32) Mime-Version: 1.0 X-Provags-ID: V01U2FsdGVkX1/hO79Dpc/9EW5Bx1O/F1SjBhtBcvpcNIl4JkS DXl2JRG9DOhXQlYkrnTC081rn88kXG0Pmx6t6avW0KuSnLtXOY KluOvYk5sTT3BGqJUhGKuTAsXnt6H/Y X-Spam-Score: -0.0 (/) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-Headers-End: 1NhTYO-0000EU-Di Cc: yi.li@analog.com, vapier@gentoo.org Subject: [spi-devel-general] [PATCH 1/5] spi: spi_lock_bus and spi_unlock_bus X-BeenThere: spi-devel-general@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Linux SPI core/device drivers discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: spi-devel-general-bounces@lists.sourceforge.net X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Tue, 16 Feb 2010 19:58:30 +0000 (UTC) diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 70845cc..b82b8ad 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -653,6 +653,54 @@ static void spi_complete(void *arg) } /** + * spi_lock_bus - lock SPI bus for exclusive access + * @spi: device which want to lock the bus + * Context: any + * + * Once the caller owns exclusive access to the SPI bus, + * only messages for this device will be transferred. + * Messages for other devices are queued but not transferred until + * the bus owner unlock the bus. + * + * The caller may call spi_lock_bus() before spi_sync() or spi_async(). + * So this call may be used in irq and other contexts which can't sleep, + * as well as from task contexts which can sleep. + * + * It returns zero on success, else a negative error code. + */ +int spi_lock_bus(struct spi_device *spi) +{ + if (spi->master->lock_bus) + return spi->master->lock_bus(spi); + else + return 0; +} +EXPORT_SYMBOL_GPL(spi_lock_bus); + +/** + * spi_unlock_bus - unlock SPI bus + * @spi: device which want to unlock the bus + * Context: any + * + * The caller has called spi_lock_bus() to lock the bus. It calls + * spi_unlock_bus() to release the bus so messages for other devices + * can be transferred. + * + * If the caller did not call spi_lock_bus() before, spi_unlock_bus() + * should have no effect. + * + * It returns zero on success, else a negative error code. + */ +int spi_unlock_bus(struct spi_device *spi) +{ + if (spi->master->unlock_bus) + return spi->master->unlock_bus(spi); + else + return 0; +} +EXPORT_SYMBOL_GPL(spi_unlock_bus); + +/** * spi_sync - blocking/synchronous SPI data transfers * @spi: device with which data will be exchanged * @message: describes the data transfers diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index c47c4b4..c53292c 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -214,6 +214,8 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv) * the device whose settings are being modified. * @transfer: adds a message to the controller's transfer queue. * @cleanup: frees controller-specific state + * @lock_bus: lock SPI bus for exclusive access + * @unlock_bus: unlock SPI bus so other devices can access * * Each SPI master controller can communicate with one or more @spi_device * children. These make a small bus, sharing MOSI, MISO and SCK signals @@ -286,6 +288,9 @@ struct spi_master { /* called on release() to free memory provided by spi_master */ void (*cleanup)(struct spi_device *spi); + + int (*lock_bus)(struct spi_device *spi); + int (*unlock_bus)(struct spi_device *spi); }; static inline void *spi_master_get_devdata(struct spi_master *master) @@ -578,6 +583,8 @@ spi_async(struct spi_device *spi, struct spi_message *message) */ extern int spi_sync(struct spi_device *spi, struct spi_message *message); +extern int spi_lock_bus(struct spi_device *spi); +extern int spi_unlock_bus(struct spi_device *spi); /** * spi_write - SPI synchronous write