This patch moves the 'struct extcon_dev' of extcon subsystem
to driver/extcon/extcon.h header file because the struct extcon_dev have to
be handled by extcon API to guarantee the consistency of strcut extcon_dev.
If external drivers are able to touch the struct extcon_dev directly, it might
cause the critical and unknown problem.

Signed-off-by: Chanwoo Choi <cw00.c...@samsung.com>
---
 drivers/extcon/devres.c |  2 +-
 drivers/extcon/extcon.c |  3 ++-
 drivers/extcon/extcon.h | 62 +++++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/extcon.h  | 57 +--------------------------------------------
 4 files changed, 66 insertions(+), 58 deletions(-)
 create mode 100644 drivers/extcon/extcon.h

diff --git a/drivers/extcon/devres.c b/drivers/extcon/devres.c
index e686acd1c459..b40eb1805927 100644
--- a/drivers/extcon/devres.c
+++ b/drivers/extcon/devres.c
@@ -14,7 +14,7 @@
  * GNU General Public License for more details.
  */
 
-#include <linux/extcon.h>
+#include "extcon.h"
 
 static int devm_extcon_dev_match(struct device *dev, void *res, void *data)
 {
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c
index d0e367959c91..591582b0d2b7 100644
--- a/drivers/extcon/extcon.c
+++ b/drivers/extcon/extcon.c
@@ -30,11 +30,12 @@
 #include <linux/device.h>
 #include <linux/fs.h>
 #include <linux/err.h>
-#include <linux/extcon.h>
 #include <linux/of.h>
 #include <linux/slab.h>
 #include <linux/sysfs.h>
 
+#include "extcon.h"
+
 #define SUPPORTED_CABLE_MAX    32
 #define CABLE_NAME_MAX         30
 
diff --git a/drivers/extcon/extcon.h b/drivers/extcon/extcon.h
new file mode 100644
index 000000000000..993ddccafe11
--- /dev/null
+++ b/drivers/extcon/extcon.h
@@ -0,0 +1,62 @@
+#ifndef __LINUX_EXTCON_INTERNAL_H__
+#define __LINUX_EXTCON_INTERNAL_H__
+
+#include <linux/extcon.h>
+
+/**
+ * struct extcon_dev - An extcon device represents one external connector.
+ * @name:              The name of this extcon device. Parent device name is
+ *                     used if NULL.
+ * @supported_cable:   Array of supported cable names ending with EXTCON_NONE.
+ *                     If supported_cable is NULL, cable name related APIs
+ *                     are disabled.
+ * @mutually_exclusive:        Array of mutually exclusive set of cables that 
cannot
+ *                     be attached simultaneously. The array should be
+ *                     ending with NULL or be NULL (no mutually exclusive
+ *                     cables). For example, if it is { 0x7, 0x30, 0}, then,
+ *                     {0, 1}, {0, 1, 2}, {0, 2}, {1, 2}, or {4, 5} cannot
+ *                     be attached simulataneously. {0x7, 0} is equivalent to
+ *                     {0x3, 0x6, 0x5, 0}. If it is {0xFFFFFFFF, 0}, there
+ *                     can be no simultaneous connections.
+ * @dev:               Device of this extcon.
+ * @state:             Attach/detach state of this extcon. Do not provide at
+ *                     register-time.
+ * @nh:                        Notifier for the state change events from this 
extcon
+ * @entry:             To support list of extcon devices so that users can
+ *                     search for extcon devices based on the extcon name.
+ * @lock:
+ * @max_supported:     Internal value to store the number of cables.
+ * @extcon_dev_type:   Device_type struct to provide attribute_groups
+ *                     customized for each extcon device.
+ * @cables:            Sysfs subdirectories. Each represents one cable.
+ *
+ * In most cases, users only need to provide "User initializing data" of
+ * this struct when registering an extcon. In some exceptional cases,
+ * optional callbacks may be needed. However, the values in "internal data"
+ * are overwritten by register function.
+ */
+struct extcon_dev {
+       /* Optional user initializing data */
+       const char *name;
+       const unsigned int *supported_cable;
+       const u32 *mutually_exclusive;
+
+       /* Internal data. Please do not set. */
+       struct device dev;
+       struct raw_notifier_head *nh;
+       struct list_head entry;
+       int max_supported;
+       spinlock_t lock;        /* could be called by irq handler */
+       u32 state;
+
+       /* /sys/class/extcon/.../cable.n/... */
+       struct device_type extcon_dev_type;
+       struct extcon_cable *cables;
+
+       /* /sys/class/extcon/.../mutually_exclusive/... */
+       struct attribute_group attr_g_muex;
+       struct attribute **attrs_muex;
+       struct device_attribute *d_attrs_muex;
+};
+
+#endif /* __LINUX_EXTCON_INTERNAL_H__ */
diff --git a/include/linux/extcon.h b/include/linux/extcon.h
index 00201230bea5..d57e52443841 100644
--- a/include/linux/extcon.h
+++ b/include/linux/extcon.h
@@ -167,62 +167,7 @@
 };
 
 struct extcon_cable;
-
-/**
- * struct extcon_dev - An extcon device represents one external connector.
- * @name:              The name of this extcon device. Parent device name is
- *                     used if NULL.
- * @supported_cable:   Array of supported cable names ending with EXTCON_NONE.
- *                     If supported_cable is NULL, cable name related APIs
- *                     are disabled.
- * @mutually_exclusive:        Array of mutually exclusive set of cables that 
cannot
- *                     be attached simultaneously. The array should be
- *                     ending with NULL or be NULL (no mutually exclusive
- *                     cables). For example, if it is { 0x7, 0x30, 0}, then,
- *                     {0, 1}, {0, 1, 2}, {0, 2}, {1, 2}, or {4, 5} cannot
- *                     be attached simulataneously. {0x7, 0} is equivalent to
- *                     {0x3, 0x6, 0x5, 0}. If it is {0xFFFFFFFF, 0}, there
- *                     can be no simultaneous connections.
- * @dev:               Device of this extcon.
- * @state:             Attach/detach state of this extcon. Do not provide at
- *                     register-time.
- * @nh:                        Notifier for the state change events from this 
extcon
- * @entry:             To support list of extcon devices so that users can
- *                     search for extcon devices based on the extcon name.
- * @lock:
- * @max_supported:     Internal value to store the number of cables.
- * @extcon_dev_type:   Device_type struct to provide attribute_groups
- *                     customized for each extcon device.
- * @cables:            Sysfs subdirectories. Each represents one cable.
- *
- * In most cases, users only need to provide "User initializing data" of
- * this struct when registering an extcon. In some exceptional cases,
- * optional callbacks may be needed. However, the values in "internal data"
- * are overwritten by register function.
- */
-struct extcon_dev {
-       /* Optional user initializing data */
-       const char *name;
-       const unsigned int *supported_cable;
-       const u32 *mutually_exclusive;
-
-       /* Internal data. Please do not set. */
-       struct device dev;
-       struct raw_notifier_head *nh;
-       struct list_head entry;
-       int max_supported;
-       spinlock_t lock;        /* could be called by irq handler */
-       u32 state;
-
-       /* /sys/class/extcon/.../cable.n/... */
-       struct device_type extcon_dev_type;
-       struct extcon_cable *cables;
-
-       /* /sys/class/extcon/.../mutually_exclusive/... */
-       struct attribute_group attr_g_muex;
-       struct attribute **attrs_muex;
-       struct device_attribute *d_attrs_muex;
-};
+struct extcon_dev;
 
 #if IS_ENABLED(CONFIG_EXTCON)
 
-- 
1.9.1

Reply via email to