Re: [PATCH 1/5] extcon: Add an API to get extcon device from dt node

2013-06-11 Thread Chanwoo Choi
Hi Kishon,

On 06/04/2013 01:13 AM, Kishon Vijay Abraham I wrote:
 Added an API of_extcon_get_extcon_dev() to be used by drivers to get
 extcon device in the case of dt boot (this can be used instead of
 extcon_get_extcon_dev()).

 Signed-off-by: Kishon Vijay Abraham I kis...@ti.com
 ---
  drivers/extcon/extcon-class.c |   40 
  include/linux/extcon.h|8 
  2 files changed, 48 insertions(+)

I don't prefer that add of helper API in extcon core. I want to add
new of helper file as drivers/extcon/of-extcon.c.
So, I add drivers/extcon/of-extcon.c and include/linux/extcon/of-extcon.h
based on your this patch. I will send modified patch at once.

 diff --git a/drivers/extcon/extcon-class.c b/drivers/extcon/extcon-class.c
 index 60adc04..265d549 100644
 --- a/drivers/extcon/extcon-class.c
 +++ b/drivers/extcon/extcon-class.c
 @@ -31,6 +31,7 @@
  #include linux/extcon.h
  #include linux/slab.h
  #include linux/sysfs.h
 +#include linux/of_platform.h
  
  /*
   * extcon_cable_name suggests the standard cable names for commonly used
 @@ -392,6 +393,45 @@ int extcon_set_cable_state(struct extcon_dev *edev,
  }
  EXPORT_SYMBOL_GPL(extcon_set_cable_state);
  
 +struct extcon_dev *of_extcon_get_extcon_dev(struct device *dev, int index)
 +{
 + struct class_dev_iter iter;
 + struct device *extcon_dev;
 + struct device_node *node;
 + struct platform_device *extcon_parent_dev;
 +
 + if (!dev-of_node) {
 + dev_dbg(dev, device does not have a device node entry\n);
 + return ERR_PTR(-EINVAL);
 + }
 +
 + node = of_parse_phandle(dev-of_node, extcon, index);
 + if (!node) {
 + dev_dbg(dev, failed to get phandle in %s node\n,
 + dev-of_node-full_name);
 + return ERR_PTR(-ENODEV);
 + }
 +
 + extcon_parent_dev = of_find_device_by_node(node);
 + if (!extcon_parent_dev) {
 + dev_dbg(dev, unable to find device by node\n);
 + return ERR_PTR(-EPROBE_DEFER);
 + }
 +
 + class_dev_iter_init(iter, extcon_class, NULL, NULL);
 + while ((extcon_dev = class_dev_iter_next(iter))) {
 + if (extcon_dev-parent != extcon_parent_dev-dev)
 + continue;
 +
 + class_dev_iter_exit(iter);
 + return dev_get_drvdata(extcon_dev);
 + }
 +
 + class_dev_iter_exit(iter);

Use extcon_get_extcon_dev() instead of using class_dev_iter_init/exit()

 + return ERR_PTR(-ENODEV);
 +}
 +EXPORT_SYMBOL_GPL(of_extcon_get_extcon_dev);
 +
  /**
   * extcon_get_extcon_dev() - Get the extcon device instance from the name
   * @extcon_name: The extcon name provided with extcon_dev_register()
 diff --git a/include/linux/extcon.h b/include/linux/extcon.h
 index fcb51c8..3858bb9 100644
 --- a/include/linux/extcon.h
 +++ b/include/linux/extcon.h
 @@ -182,6 +182,8 @@ struct extcon_specific_cable_nb {
   */
  extern int extcon_dev_register(struct extcon_dev *edev, struct device *dev);
  extern void extcon_dev_unregister(struct extcon_dev *edev);
 +extern struct extcon_dev *of_extcon_get_extcon_dev(struct device *dev,
 + int index);
  extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name);
  
  /*
 @@ -292,6 +294,12 @@ static inline int extcon_set_cable_state(struct 
 extcon_dev *edev,
   return 0;
  }
  
 +static inline struct extcon_dev *of_extcon_get_extcon_dev(struct device *dev,
 + int index)
 +{
 + return NULL;
 +}
 +
  static inline struct extcon_dev *extcon_get_extcon_dev(const char 
 *extcon_name)
  {
   return NULL;

Thanks,
Chanwoo Choi






--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/5] extcon: Add an API to get extcon device from dt node

2013-06-03 Thread Kishon Vijay Abraham I
Added an API of_extcon_get_extcon_dev() to be used by drivers to get
extcon device in the case of dt boot (this can be used instead of
extcon_get_extcon_dev()).

Signed-off-by: Kishon Vijay Abraham I kis...@ti.com
---
 drivers/extcon/extcon-class.c |   40 
 include/linux/extcon.h|8 
 2 files changed, 48 insertions(+)

diff --git a/drivers/extcon/extcon-class.c b/drivers/extcon/extcon-class.c
index 60adc04..265d549 100644
--- a/drivers/extcon/extcon-class.c
+++ b/drivers/extcon/extcon-class.c
@@ -31,6 +31,7 @@
 #include linux/extcon.h
 #include linux/slab.h
 #include linux/sysfs.h
+#include linux/of_platform.h
 
 /*
  * extcon_cable_name suggests the standard cable names for commonly used
@@ -392,6 +393,45 @@ int extcon_set_cable_state(struct extcon_dev *edev,
 }
 EXPORT_SYMBOL_GPL(extcon_set_cable_state);
 
+struct extcon_dev *of_extcon_get_extcon_dev(struct device *dev, int index)
+{
+   struct class_dev_iter iter;
+   struct device *extcon_dev;
+   struct device_node *node;
+   struct platform_device *extcon_parent_dev;
+
+   if (!dev-of_node) {
+   dev_dbg(dev, device does not have a device node entry\n);
+   return ERR_PTR(-EINVAL);
+   }
+
+   node = of_parse_phandle(dev-of_node, extcon, index);
+   if (!node) {
+   dev_dbg(dev, failed to get phandle in %s node\n,
+   dev-of_node-full_name);
+   return ERR_PTR(-ENODEV);
+   }
+
+   extcon_parent_dev = of_find_device_by_node(node);
+   if (!extcon_parent_dev) {
+   dev_dbg(dev, unable to find device by node\n);
+   return ERR_PTR(-EPROBE_DEFER);
+   }
+
+   class_dev_iter_init(iter, extcon_class, NULL, NULL);
+   while ((extcon_dev = class_dev_iter_next(iter))) {
+   if (extcon_dev-parent != extcon_parent_dev-dev)
+   continue;
+
+   class_dev_iter_exit(iter);
+   return dev_get_drvdata(extcon_dev);
+   }
+
+   class_dev_iter_exit(iter);
+   return ERR_PTR(-ENODEV);
+}
+EXPORT_SYMBOL_GPL(of_extcon_get_extcon_dev);
+
 /**
  * extcon_get_extcon_dev() - Get the extcon device instance from the name
  * @extcon_name:   The extcon name provided with extcon_dev_register()
diff --git a/include/linux/extcon.h b/include/linux/extcon.h
index fcb51c8..3858bb9 100644
--- a/include/linux/extcon.h
+++ b/include/linux/extcon.h
@@ -182,6 +182,8 @@ struct extcon_specific_cable_nb {
  */
 extern int extcon_dev_register(struct extcon_dev *edev, struct device *dev);
 extern void extcon_dev_unregister(struct extcon_dev *edev);
+extern struct extcon_dev *of_extcon_get_extcon_dev(struct device *dev,
+   int index);
 extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name);
 
 /*
@@ -292,6 +294,12 @@ static inline int extcon_set_cable_state(struct extcon_dev 
*edev,
return 0;
 }
 
+static inline struct extcon_dev *of_extcon_get_extcon_dev(struct device *dev,
+   int index)
+{
+   return NULL;
+}
+
 static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
 {
return NULL;
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html