pinctrl: allow pctldevs to decode pin config in debugfs
Stephen Warren [Fri, 13 Apr 2012 16:49:06 +0000 (10:49 -0600)]
Add a pinconf op so that pin controller drivers can decode their pin
config settings for debugfs.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
(cherry picked from commit 6cb4158757a8629e14851e7802f3b6bfaa7d6f00)

Change-Id: Ic111de9e5af5639d0a8b55b5e3dd174a8eb2fb71
Signed-off-by: Pritesh Raithatha <praithatha@nvidia.com>

drivers/pinctrl/pinconf.c
include/linux/pinctrl/pinconf.h

index 384dcc1..0133a69 100644 (file)
@@ -379,8 +379,16 @@ int pinconf_apply_setting(struct pinctrl_setting const *setting)
 
 void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map)
 {
+       struct pinctrl_dev *pctldev;
+       const struct pinconf_ops *confops;
        int i;
 
+       pctldev = get_pinctrl_dev_from_devname(map->ctrl_dev_name);
+       if (pctldev)
+               confops = pctldev->desc->confops;
+       else
+               confops = NULL;
+
        switch (map->type) {
        case PIN_MAP_TYPE_CONFIGS_PIN:
                seq_printf(s, "pin ");
@@ -394,8 +402,15 @@ void pinconf_show_map(struct seq_file *s, struct pinctrl_map const *map)
 
        seq_printf(s, "%s\n", map->data.configs.group_or_pin);
 
-       for (i = 0; i < map->data.configs.num_configs; i++)
-               seq_printf(s, "config %08lx\n", map->data.configs.configs[i]);
+       for (i = 0; i < map->data.configs.num_configs; i++) {
+               seq_printf(s, "config ");
+               if (confops && confops->pin_config_config_dbg_show)
+                       confops->pin_config_config_dbg_show(pctldev, s,
+                                               map->data.configs.configs[i]);
+               else
+                       seq_printf(s, "%08lx", map->data.configs.configs[i]);
+               seq_printf(s, "\n");
+       }
 }
 
 void pinconf_show_setting(struct seq_file *s,
@@ -403,6 +418,7 @@ void pinconf_show_setting(struct seq_file *s,
 {
        struct pinctrl_dev *pctldev = setting->pctldev;
        const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
+       const struct pinconf_ops *confops = pctldev->desc->confops;
        struct pin_desc *desc;
        int i;
 
@@ -428,8 +444,15 @@ void pinconf_show_setting(struct seq_file *s,
         * FIXME: We should really get the pin controler to dump the config
         * values, so they can be decoded to something meaningful.
         */
-       for (i = 0; i < setting->data.configs.num_configs; i++)
-               seq_printf(s, " %08lx", setting->data.configs.configs[i]);
+       for (i = 0; i < setting->data.configs.num_configs; i++) {
+               seq_printf(s, " ");
+               if (confops && confops->pin_config_config_dbg_show)
+                       confops->pin_config_config_dbg_show(pctldev, s,
+                               setting->data.configs.configs[i]);
+               else
+                       seq_printf(s, "%08lx",
+                                  setting->data.configs.configs[i]);
+       }
 
        seq_printf(s, "\n");
 }
index ec431f0..7b9d5f0 100644 (file)
@@ -33,6 +33,8 @@ struct seq_file;
  *     per-device info for a certain pin in debugfs
  * @pin_config_group_dbg_show: optional debugfs display hook that will provide
  *     per-device info for a certain group in debugfs
+ * @pin_config_config_dbg_show: optional debugfs display hook that will decode
+ *     and display a driver's pin configuration parameter
  */
 struct pinconf_ops {
 #ifdef CONFIG_GENERIC_PINCONF
@@ -56,6 +58,9 @@ struct pinconf_ops {
        void (*pin_config_group_dbg_show) (struct pinctrl_dev *pctldev,
                                           struct seq_file *s,
                                           unsigned selector);
+       void (*pin_config_config_dbg_show) (struct pinctrl_dev *pctldev,
+                                           struct seq_file *s,
+                                           unsigned long config);
 };
 
 #endif