From 6ceb8fdeaec665642de944ee47d11440e72a5e26 Mon Sep 17 00:00:00 2001
From: Viresh Kumar <viresh.kumar@linaro.org>
Date: Fri, 3 Jul 2015 17:00:30 +0530
Subject: [PATCH] greybus: svc: save pointer to struct gb_svc in struct
 gb_interface

Its another special protocol (just like control protocol) and is
required to be accessed from other files, lets save a pointer to it in
interface structure.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
---
 drivers/staging/greybus/interface.h |  1 +
 drivers/staging/greybus/svc.c       | 13 ++++++-------
 drivers/staging/greybus/svc.h       |  7 ++++++-
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h
index 86eb8947a3d6..c2bcb92dacdb 100644
--- a/drivers/staging/greybus/interface.h
+++ b/drivers/staging/greybus/interface.h
@@ -14,6 +14,7 @@
 struct gb_interface {
 	struct device dev;
 	struct gb_control *control;
+	struct gb_svc *svc;
 
 	struct list_head bundles;
 	struct list_head links;	/* greybus_host_device->interfaces */
diff --git a/drivers/staging/greybus/svc.c b/drivers/staging/greybus/svc.c
index 8a5a9b7c375d..ce789c909c5f 100644
--- a/drivers/staging/greybus/svc.c
+++ b/drivers/staging/greybus/svc.c
@@ -9,12 +9,6 @@
 
 #include "greybus.h"
 
-struct gb_svc {
-	struct gb_connection	*connection;
-	u8			version_major;
-	u8			version_minor;
-};
-
 /* Define get_version() routine */
 define_get_version(gb_svc, SVC);
 
@@ -217,6 +211,9 @@ static int gb_svc_connection_init(struct gb_connection *connection)
 	if (ret)
 		kfree(svc);
 
+	/* Set interface's svc connection */
+	connection->bundle->intf->svc = svc;
+
 	return ret;
 }
 
@@ -224,9 +221,11 @@ static void gb_svc_connection_exit(struct gb_connection *connection)
 {
 	struct gb_svc *svc = connection->private;
 
-	if (!svc)
+	if (WARN_ON(connection->bundle->intf->svc != svc))
 		return;
 
+	connection->bundle->intf->svc = NULL;
+
 	kfree(svc);
 }
 
diff --git a/drivers/staging/greybus/svc.h b/drivers/staging/greybus/svc.h
index b039aea4c409..ebabe5ff7c6d 100644
--- a/drivers/staging/greybus/svc.h
+++ b/drivers/staging/greybus/svc.h
@@ -10,7 +10,12 @@
 #ifndef __SVC_H
 #define __SVC_H
 
-struct gb_svc;
+struct gb_svc {
+	struct gb_connection	*connection;
+	u8			version_major;
+	u8			version_minor;
+};
+
 
 int gb_svc_intf_device_id(struct gb_svc *svc, u8 intf_id, u8 device_id);
 int gb_svc_intf_reset(struct gb_svc *svc, u8 intf_id);