From 8888b963743be7aad2a98bc165fb51150db5fd9f Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Sat, 14 May 2016 23:42:20 +0530 Subject: greybus: spi: Separate out spilib from spi bridged PHY bundle driver spilib can be used by multiple bridge drivers implementing different bundle classes. Separate out bridged PHY bundle drivers parts. Signed-off-by: Viresh Kumar Reviewed-by: Rui Miguel Silva Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/spi.c | 75 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 drivers/staging/greybus/spi.c (limited to 'drivers/staging/greybus/spi.c') diff --git a/drivers/staging/greybus/spi.c b/drivers/staging/greybus/spi.c new file mode 100644 index 000000000000..1cf5f509363c --- /dev/null +++ b/drivers/staging/greybus/spi.c @@ -0,0 +1,75 @@ +/* + * SPI bridge PHY driver. + * + * Copyright 2014-2016 Google Inc. + * Copyright 2014-2016 Linaro Ltd. + * + * Released under the GPLv2 only. + */ + +#include + +#include "greybus.h" +#include "gpbridge.h" +#include "spilib.h" + +static int gb_spi_probe(struct gpbridge_device *gpbdev, + const struct gpbridge_device_id *id) +{ + struct gb_connection *connection; + int ret; + + connection = gb_connection_create(gpbdev->bundle, + le16_to_cpu(gpbdev->cport_desc->id), + NULL); + if (IS_ERR(connection)) + return PTR_ERR(connection); + + ret = gb_connection_enable(connection); + if (ret) + goto exit_connection_destroy; + + ret = gb_gpbridge_get_version(connection); + if (ret) + goto exit_connection_disable; + + ret = gb_spilib_master_init(connection, &gpbdev->dev); + if (ret) + goto exit_connection_disable; + + gb_gpbridge_set_data(gpbdev, connection); + + return 0; + +exit_connection_disable: + gb_connection_disable(connection); +exit_connection_destroy: + gb_connection_destroy(connection); + + return ret; +} + +static void gb_spi_remove(struct gpbridge_device *gpbdev) +{ + struct gb_connection *connection = gb_gpbridge_get_data(gpbdev); + + gb_spilib_master_exit(connection); + gb_connection_disable(connection); + gb_connection_destroy(connection); +} + +static const struct gpbridge_device_id gb_spi_id_table[] = { + { GPBRIDGE_PROTOCOL(GREYBUS_PROTOCOL_SPI) }, + { }, +}; +MODULE_DEVICE_TABLE(gpbridge, gb_spi_id_table); + +static struct gpbridge_driver spi_driver = { + .name = "spi", + .probe = gb_spi_probe, + .remove = gb_spi_remove, + .id_table = gb_spi_id_table, +}; + +module_gpbridge_driver(spi_driver); +MODULE_LICENSE("GPL v2"); -- cgit v1.2.3