aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/spilib.c
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2016-07-21 14:45:06 -0700
committerGreg Kroah-Hartman <gregkh@google.com>2016-07-21 19:03:05 -0700
commit92bcaddea3197e477bb37439805fcb5a2f9942d7 (patch)
treec38580b183820a61bd7f7579591116175d833157 /drivers/staging/greybus/spilib.c
parentgreybus: firmware: Improve test application (diff)
downloadlinux-dev-92bcaddea3197e477bb37439805fcb5a2f9942d7.tar.xz
linux-dev-92bcaddea3197e477bb37439805fcb5a2f9942d7.zip
greybus: spilib: make spilib independent of gbphy
spilib is used by multiple users currently (spi.c and fw-core.c) but commit aa52b62a0556 broke that hierarchy and introduced gbphy dependent code in spilib. This may have unreliable consequences as we are doing following operation unconditionally now: gbphy_dev = to_gbphy_dev(spi->parent); gbphy_runtime_get_sync(gbphy_dev); which may not go well when the parent is of type &bundle->dev (fw-core.c). This patch introduces spilib_ops and lets the users of the core register them. This shall have no functional change for the spi.c usecase and shall fix the unreliable results for the fw-core.c usecase. Tested by writing to mtd0 dev and verifying (with print messages) that the below routines are getting called for a gpbridge-test module. Fixes: aa52b62a0556 ("spi: Add runtime_pm support") Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/spilib.c')
-rw-r--r--drivers/staging/greybus/spilib.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/staging/greybus/spilib.c b/drivers/staging/greybus/spilib.c
index e4c82e0a322b..9427c313dd4e 100644
--- a/drivers/staging/greybus/spilib.c
+++ b/drivers/staging/greybus/spilib.c
@@ -15,13 +15,13 @@
#include "greybus.h"
#include "spilib.h"
-#include "gbphy.h"
struct gb_spilib {
struct gb_connection *connection;
struct device *parent;
struct spi_transfer *first_xfer;
struct spi_transfer *last_xfer;
+ struct spilib_ops *ops;
u32 rx_xfer_offset;
u32 tx_xfer_offset;
u32 last_xfer_size;
@@ -373,25 +373,21 @@ out:
return ret;
}
-#ifndef SPI_CORE_SUPPORT_PM
static int gb_spi_prepare_transfer_hardware(struct spi_master *master)
{
struct gb_spilib *spi = spi_master_get_devdata(master);
- struct gbphy_device *gbphy_dev = to_gbphy_dev(spi->parent);
- return gbphy_runtime_get_sync(gbphy_dev);
+ return spi->ops->prepare_transfer_hardware(spi->parent);
}
static int gb_spi_unprepare_transfer_hardware(struct spi_master *master)
{
struct gb_spilib *spi = spi_master_get_devdata(master);
- struct gbphy_device *gbphy_dev = to_gbphy_dev(spi->parent);
- gbphy_runtime_put_autosuspend(gbphy_dev);
+ spi->ops->unprepare_transfer_hardware(spi->parent);
return 0;
}
-#endif
static int gb_spi_setup(struct spi_device *spi)
{
@@ -483,7 +479,8 @@ static int gb_spi_setup_device(struct gb_spilib *spi, u8 cs)
return 0;
}
-int gb_spilib_master_init(struct gb_connection *connection, struct device *dev)
+int gb_spilib_master_init(struct gb_connection *connection, struct device *dev,
+ struct spilib_ops *ops)
{
struct gb_spilib *spi;
struct spi_master *master;
@@ -501,6 +498,7 @@ int gb_spilib_master_init(struct gb_connection *connection, struct device *dev)
spi->connection = connection;
gb_connection_set_data(connection, master);
spi->parent = dev;
+ spi->ops = ops;
/* get master configuration */
ret = gb_spi_get_master_config(spi);
@@ -518,11 +516,17 @@ int gb_spilib_master_init(struct gb_connection *connection, struct device *dev)
master->setup = gb_spi_setup;
master->transfer_one_message = gb_spi_transfer_one_message;
-#ifndef SPI_CORE_SUPPORT_PM
- master->prepare_transfer_hardware = gb_spi_prepare_transfer_hardware;
- master->unprepare_transfer_hardware =
+ if (ops && ops->prepare_transfer_hardware) {
+ master->prepare_transfer_hardware =
+ gb_spi_prepare_transfer_hardware;
+ }
+
+ if (ops && ops->unprepare_transfer_hardware) {
+ master->unprepare_transfer_hardware =
gb_spi_unprepare_transfer_hardware;
-#else
+ }
+
+#ifdef SPI_CORE_SUPPORT_PM
master->auto_runtime_pm = true;
#endif