greybus: split sysfs functions out to separate file.
diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile
index 9815e8a..c1e4e12 100644
--- a/drivers/staging/greybus/Makefile
+++ b/drivers/staging/greybus/Makefile
@@ -1,5 +1,6 @@
 greybus-y :=	core.o		\
 		gbuf.o		\
+		sysfs.o		\
 		debugfs.o	\
 		ap.o		\
 		i2c-gb.o	\
diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c
index 235a9c4..bbe9ef9 100644
--- a/drivers/staging/greybus/core.c
+++ b/drivers/staging/greybus/core.c
@@ -190,153 +190,6 @@
 	.release =	greybus_module_release,
 };
 
-/* Function fields */
-#define greybus_function_attr(field)					\
-static ssize_t function_##field##_show(struct device *dev,		\
-				       struct device_attribute *attr,	\
-				       char *buf)			\
-{									\
-	struct greybus_device *gdev = to_greybus_device(dev);		\
-	return sprintf(buf, "%d\n", gdev->function.field);		\
-}									\
-static DEVICE_ATTR_RO(function_##field)
-
-greybus_function_attr(number);
-greybus_function_attr(cport);
-greybus_function_attr(class);
-greybus_function_attr(subclass);
-greybus_function_attr(protocol);
-
-static struct attribute *function_attrs[] = {
-	&dev_attr_function_number.attr,
-	&dev_attr_function_cport.attr,
-	&dev_attr_function_class.attr,
-	&dev_attr_function_subclass.attr,
-	&dev_attr_function_protocol.attr,
-	NULL,
-};
-
-static umode_t function_attrs_are_visible(struct kobject *kobj,
-					  struct attribute *a, int n)
-{
-	struct greybus_device *gdev = to_greybus_device(kobj_to_dev(kobj));
-
-	// FIXME - make this a dynamic structure to "know" if it really is here
-	// or not easier?
-	if (gdev->function.number ||
-	    gdev->function.cport ||
-	    gdev->function.class ||
-	    gdev->function.subclass ||
-	    gdev->function.protocol)
-		return a->mode;
-	return 0;
-}
-
-static struct attribute_group function_attr_grp = {
-	.attrs =	function_attrs,
-	.is_visible =	function_attrs_are_visible,
-};
-
-/* Module fields */
-#define greybus_module_attr(field)					\
-static ssize_t module_##field##_show(struct device *dev,		\
-				     struct device_attribute *attr,	\
-				     char *buf)				\
-{									\
-	struct greybus_device *gdev = to_greybus_device(dev);		\
-	return sprintf(buf, "%x\n", gdev->module_id.field);		\
-}									\
-static DEVICE_ATTR_RO(module_##field)
-
-greybus_module_attr(vendor);
-greybus_module_attr(product);
-greybus_module_attr(version);
-
-static ssize_t module_vendor_string_show(struct device *dev,
-					 struct device_attribute *attr,
-					 char *buf)
-{
-	struct greybus_device *gdev = to_greybus_device(dev);
-	return sprintf(buf, "%s",
-		       greybus_string(gdev, gdev->module_id.vendor_stringid));
-}
-static DEVICE_ATTR_RO(module_vendor_string);
-
-static ssize_t module_product_string_show(struct device *dev,
-					 struct device_attribute *attr,
-					 char *buf)
-{
-	struct greybus_device *gdev = to_greybus_device(dev);
-	return sprintf(buf, "%s",
-		       greybus_string(gdev, gdev->module_id.product_stringid));
-}
-static DEVICE_ATTR_RO(module_product_string);
-
-static struct attribute *module_attrs[] = {
-	&dev_attr_module_vendor.attr,
-	&dev_attr_module_product.attr,
-	&dev_attr_module_version.attr,
-	&dev_attr_module_vendor_string.attr,
-	&dev_attr_module_product_string.attr,
-	NULL,
-};
-
-static umode_t module_attrs_are_visible(struct kobject *kobj,
-					struct attribute *a, int n)
-{
-	struct greybus_device *gdev = to_greybus_device(kobj_to_dev(kobj));
-
-	if ((a == &dev_attr_module_vendor_string.attr) &&
-	    (gdev->module_id.vendor_stringid))
-		return a->mode;
-	if ((a == &dev_attr_module_product_string.attr) &&
-	    (gdev->module_id.product_stringid))
-		return a->mode;
-
-	// FIXME - make this a dynamic structure to "know" if it really is here
-	// or not easier?
-	if (gdev->module_id.vendor ||
-	    gdev->module_id.product ||
-	    gdev->module_id.version)
-		return a->mode;
-	return 0;
-}
-
-static struct attribute_group module_attr_grp = {
-	.attrs =	module_attrs,
-	.is_visible =	module_attrs_are_visible,
-};
-
-
-/* Serial Number */
-static ssize_t serial_number_show(struct device *dev,
-				  struct device_attribute *attr, char *buf)
-{
-	struct greybus_device *gdev = to_greybus_device(dev);
-	return sprintf(buf, "%llX\n",
-		      (unsigned long long)gdev->serial_number.serial_number);
-}
-static DEVICE_ATTR_RO(serial_number);
-
-static struct attribute *serial_number_attrs[] = {
-	&dev_attr_serial_number.attr,
-	NULL,
-};
-
-static struct attribute_group serial_number_attr_grp = {
-	.attrs =	serial_number_attrs,
-	.is_visible =	function_attrs_are_visible,
-};
-
-
-static const struct attribute_group *greybus_module_groups[] = {
-	&function_attr_grp,
-	&module_attr_grp,
-	&serial_number_attr_grp,
-	NULL,
-};
-
-
 static int gb_init_subdevs(struct greybus_device *gdev,
 			   const struct greybus_module_id *id)
 {
diff --git a/drivers/staging/greybus/greybus.h b/drivers/staging/greybus/greybus.h
index 50bbf18..d9cfc3b 100644
--- a/drivers/staging/greybus/greybus.h
+++ b/drivers/staging/greybus/greybus.h
@@ -188,6 +188,8 @@
 int gb_debugfs_init(void);
 void gb_debugfs_cleanup(void);
 
+extern const struct attribute_group *greybus_module_groups[];
+
 /*
  * Because we are allocating a data structure per "type" in the greybus device,
  * we have static functions for this, not "dynamic" drivers like we really
diff --git a/drivers/staging/greybus/sysfs.c b/drivers/staging/greybus/sysfs.c
new file mode 100644
index 0000000..16e6ca4
--- /dev/null
+++ b/drivers/staging/greybus/sysfs.c
@@ -0,0 +1,166 @@
+/*
+ * Greybus sysfs file functions
+ *
+ * Copyright 2014 Google Inc.
+ *
+ * Released under the GPLv2 only.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/types.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/kthread.h>
+#include <linux/device.h>
+
+#include "greybus.h"
+
+/* Function fields */
+#define greybus_function_attr(field)					\
+static ssize_t function_##field##_show(struct device *dev,		\
+				       struct device_attribute *attr,	\
+				       char *buf)			\
+{									\
+	struct greybus_device *gdev = to_greybus_device(dev);		\
+	return sprintf(buf, "%d\n", gdev->function.field);		\
+}									\
+static DEVICE_ATTR_RO(function_##field)
+
+greybus_function_attr(number);
+greybus_function_attr(cport);
+greybus_function_attr(class);
+greybus_function_attr(subclass);
+greybus_function_attr(protocol);
+
+static struct attribute *function_attrs[] = {
+	&dev_attr_function_number.attr,
+	&dev_attr_function_cport.attr,
+	&dev_attr_function_class.attr,
+	&dev_attr_function_subclass.attr,
+	&dev_attr_function_protocol.attr,
+	NULL,
+};
+
+static umode_t function_attrs_are_visible(struct kobject *kobj,
+					  struct attribute *a, int n)
+{
+	struct greybus_device *gdev = to_greybus_device(kobj_to_dev(kobj));
+
+	// FIXME - make this a dynamic structure to "know" if it really is here
+	// or not easier?
+	if (gdev->function.number ||
+	    gdev->function.cport ||
+	    gdev->function.class ||
+	    gdev->function.subclass ||
+	    gdev->function.protocol)
+		return a->mode;
+	return 0;
+}
+
+static struct attribute_group function_attr_grp = {
+	.attrs =	function_attrs,
+	.is_visible =	function_attrs_are_visible,
+};
+
+/* Module fields */
+#define greybus_module_attr(field)					\
+static ssize_t module_##field##_show(struct device *dev,		\
+				     struct device_attribute *attr,	\
+				     char *buf)				\
+{									\
+	struct greybus_device *gdev = to_greybus_device(dev);		\
+	return sprintf(buf, "%x\n", gdev->module_id.field);		\
+}									\
+static DEVICE_ATTR_RO(module_##field)
+
+greybus_module_attr(vendor);
+greybus_module_attr(product);
+greybus_module_attr(version);
+
+static ssize_t module_vendor_string_show(struct device *dev,
+					 struct device_attribute *attr,
+					 char *buf)
+{
+	struct greybus_device *gdev = to_greybus_device(dev);
+	return sprintf(buf, "%s",
+		       greybus_string(gdev, gdev->module_id.vendor_stringid));
+}
+static DEVICE_ATTR_RO(module_vendor_string);
+
+static ssize_t module_product_string_show(struct device *dev,
+					 struct device_attribute *attr,
+					 char *buf)
+{
+	struct greybus_device *gdev = to_greybus_device(dev);
+	return sprintf(buf, "%s",
+		       greybus_string(gdev, gdev->module_id.product_stringid));
+}
+static DEVICE_ATTR_RO(module_product_string);
+
+static struct attribute *module_attrs[] = {
+	&dev_attr_module_vendor.attr,
+	&dev_attr_module_product.attr,
+	&dev_attr_module_version.attr,
+	&dev_attr_module_vendor_string.attr,
+	&dev_attr_module_product_string.attr,
+	NULL,
+};
+
+static umode_t module_attrs_are_visible(struct kobject *kobj,
+					struct attribute *a, int n)
+{
+	struct greybus_device *gdev = to_greybus_device(kobj_to_dev(kobj));
+
+	if ((a == &dev_attr_module_vendor_string.attr) &&
+	    (gdev->module_id.vendor_stringid))
+		return a->mode;
+	if ((a == &dev_attr_module_product_string.attr) &&
+	    (gdev->module_id.product_stringid))
+		return a->mode;
+
+	// FIXME - make this a dynamic structure to "know" if it really is here
+	// or not easier?
+	if (gdev->module_id.vendor ||
+	    gdev->module_id.product ||
+	    gdev->module_id.version)
+		return a->mode;
+	return 0;
+}
+
+static struct attribute_group module_attr_grp = {
+	.attrs =	module_attrs,
+	.is_visible =	module_attrs_are_visible,
+};
+
+
+/* Serial Number */
+static ssize_t serial_number_show(struct device *dev,
+				  struct device_attribute *attr, char *buf)
+{
+	struct greybus_device *gdev = to_greybus_device(dev);
+	return sprintf(buf, "%llX\n",
+		      (unsigned long long)gdev->serial_number.serial_number);
+}
+static DEVICE_ATTR_RO(serial_number);
+
+static struct attribute *serial_number_attrs[] = {
+	&dev_attr_serial_number.attr,
+	NULL,
+};
+
+static struct attribute_group serial_number_attr_grp = {
+	.attrs =	serial_number_attrs,
+	.is_visible =	function_attrs_are_visible,
+};
+
+
+const struct attribute_group *greybus_module_groups[] = {
+	&function_attr_grp,
+	&module_attr_grp,
+	&serial_number_attr_grp,
+	NULL,
+};
+