* [PATCH v6 1/3] pinctrl: use to octal permissions for debugfs files
2021-02-16 22:44 [PATCH v6 0/3] pinctrl: pinmux: Add pinmux-select debugfs file Drew Fustini
@ 2021-02-16 22:44 ` Drew Fustini
2021-02-16 22:44 ` [PATCH v6 2/3] pinctrl: pinmux: Add pinmux-select debugfs file Drew Fustini
` (2 subsequent siblings)
3 siblings, 0 replies; 7+ messages in thread
From: Drew Fustini @ 2021-02-16 22:44 UTC (permalink / raw)
To: Linus Walleij, linux-gpio, linux-kernel, Tony Lindgren,
Andy Shevchenko, Alexandre Belloni, Geert Uytterhoeven,
Pantelis Antoniou, Jason Kridner, Robert Nelson, Joe Perches,
Dan Carpenter, Jonathan Corbet, linux-doc
Cc: Drew Fustini, Geert Uytterhoeven
Switch over pinctrl debugfs files to use octal permissions as they are
preferred over symbolic permissions. Refer to commit f90774e1fd27
("checkpatch: look for symbolic permissions and suggest octal instead").
Note: S_IFREG flag is added to the mode by __debugfs_create_file()
in fs/debugfs/inode.c
Suggested-by: Joe Perches <joe@perches.com>
Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Drew Fustini <drew@beagleboard.org>
---
drivers/pinctrl/core.c | 12 ++++++------
drivers/pinctrl/pinconf.c | 4 ++--
drivers/pinctrl/pinmux.c | 4 ++--
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
index 3663d87f51a0..07458742bc0f 100644
--- a/drivers/pinctrl/core.c
+++ b/drivers/pinctrl/core.c
@@ -1888,11 +1888,11 @@ static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
dev_name(pctldev->dev));
return;
}
- debugfs_create_file("pins", S_IFREG | S_IRUGO,
+ debugfs_create_file("pins", 0444,
device_root, pctldev, &pinctrl_pins_fops);
- debugfs_create_file("pingroups", S_IFREG | S_IRUGO,
+ debugfs_create_file("pingroups", 0444,
device_root, pctldev, &pinctrl_groups_fops);
- debugfs_create_file("gpio-ranges", S_IFREG | S_IRUGO,
+ debugfs_create_file("gpio-ranges", 0444,
device_root, pctldev, &pinctrl_gpioranges_fops);
if (pctldev->desc->pmxops)
pinmux_init_device_debugfs(device_root, pctldev);
@@ -1914,11 +1914,11 @@ static void pinctrl_init_debugfs(void)
return;
}
- debugfs_create_file("pinctrl-devices", S_IFREG | S_IRUGO,
+ debugfs_create_file("pinctrl-devices", 0444,
debugfs_root, NULL, &pinctrl_devices_fops);
- debugfs_create_file("pinctrl-maps", S_IFREG | S_IRUGO,
+ debugfs_create_file("pinctrl-maps", 0444,
debugfs_root, NULL, &pinctrl_maps_fops);
- debugfs_create_file("pinctrl-handles", S_IFREG | S_IRUGO,
+ debugfs_create_file("pinctrl-handles", 0444,
debugfs_root, NULL, &pinctrl_fops);
}
diff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c
index 02c075cc010b..d9d54065472e 100644
--- a/drivers/pinctrl/pinconf.c
+++ b/drivers/pinctrl/pinconf.c
@@ -370,9 +370,9 @@ DEFINE_SHOW_ATTRIBUTE(pinconf_groups);
void pinconf_init_device_debugfs(struct dentry *devroot,
struct pinctrl_dev *pctldev)
{
- debugfs_create_file("pinconf-pins", S_IFREG | S_IRUGO,
+ debugfs_create_file("pinconf-pins", 0444,
devroot, pctldev, &pinconf_pins_fops);
- debugfs_create_file("pinconf-groups", S_IFREG | S_IRUGO,
+ debugfs_create_file("pinconf-groups", 0444,
devroot, pctldev, &pinconf_groups_fops);
}
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index bab888fe3f8e..c651b2db0925 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -676,9 +676,9 @@ DEFINE_SHOW_ATTRIBUTE(pinmux_pins);
void pinmux_init_device_debugfs(struct dentry *devroot,
struct pinctrl_dev *pctldev)
{
- debugfs_create_file("pinmux-functions", S_IFREG | S_IRUGO,
+ debugfs_create_file("pinmux-functions", 0444,
devroot, pctldev, &pinmux_functions_fops);
- debugfs_create_file("pinmux-pins", S_IFREG | S_IRUGO,
+ debugfs_create_file("pinmux-pins", 0444,
devroot, pctldev, &pinmux_pins_fops);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v6 2/3] pinctrl: pinmux: Add pinmux-select debugfs file
2021-02-16 22:44 [PATCH v6 0/3] pinctrl: pinmux: Add pinmux-select debugfs file Drew Fustini
2021-02-16 22:44 ` [PATCH v6 1/3] pinctrl: use to octal permissions for debugfs files Drew Fustini
@ 2021-02-16 22:44 ` Drew Fustini
2021-02-17 10:10 ` Andy Shevchenko
2021-02-16 22:44 ` [PATCH v6 3/3] docs/pinctrl: document debugfs files Drew Fustini
2021-02-17 13:53 ` [PATCH v6 0/3] pinctrl: pinmux: Add pinmux-select debugfs file Tony Lindgren
3 siblings, 1 reply; 7+ messages in thread
From: Drew Fustini @ 2021-02-16 22:44 UTC (permalink / raw)
To: Linus Walleij, linux-gpio, linux-kernel, Tony Lindgren,
Andy Shevchenko, Alexandre Belloni, Geert Uytterhoeven,
Pantelis Antoniou, Jason Kridner, Robert Nelson, Joe Perches,
Dan Carpenter, Jonathan Corbet, linux-doc
Cc: Drew Fustini
Add "pinmux-select" to debugfs which will activate a function and group:
echo "<function-name group-name>" > pinmux-select
The write operation pinmux_select() handles this by checking that the
names map to valid selectors and then calling ops->set_mux().
The existing "pinmux-functions" debugfs file lists the pin functions
registered for the pin controller. For example:
function: pinmux-uart0, groups = [ pinmux-uart0-pins ]
function: pinmux-mmc0, groups = [ pinmux-mmc0-pins ]
function: pinmux-mmc1, groups = [ pinmux-mmc1-pins ]
function: pinmux-i2c0, groups = [ pinmux-i2c0-pins ]
function: pinmux-i2c1, groups = [ pinmux-i2c1-pins ]
function: pinmux-spi1, groups = [ pinmux-spi1-pins ]
To activate function pinmux-i2c1 and group pinmux-i2c1-pins:
echo "pinmux-i2c1 pinmux-i2c1-pins" > pinmux-select
Signed-off-by: Drew Fustini <drew@beagleboard.org>
---
drivers/pinctrl/pinmux.c | 102 +++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index c651b2db0925..08f336e4246c 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -23,6 +23,7 @@
#include <linux/string.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
+#include <linux/ctype.h>
#include <linux/pinctrl/machine.h>
#include <linux/pinctrl/pinmux.h>
#include "core.h"
@@ -673,6 +674,105 @@ void pinmux_show_setting(struct seq_file *s,
DEFINE_SHOW_ATTRIBUTE(pinmux_functions);
DEFINE_SHOW_ATTRIBUTE(pinmux_pins);
+#define PINMUX_SELECT_MAX 50
+static ssize_t pinmux_select(struct file *file, const char __user *user_buf,
+ size_t len, loff_t *ppos)
+{
+ struct seq_file *sfile = file->private_data;
+ struct pinctrl_dev *pctldev = sfile->private;
+ const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
+ const char *const *groups;
+ char *buf, *fname, *gname;
+ unsigned int num_groups;
+ int fsel, gsel, ret;
+
+ if (len > PINMUX_SELECT_MAX)
+ return -ENOMEM;
+
+ buf = kzalloc(PINMUX_SELECT_MAX, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ ret = strncpy_from_user(buf, user_buf, PINMUX_SELECT_MAX);
+ if (ret < 0)
+ goto exit_free_buf;
+ buf[len-1] = '\0';
+
+ /* remove leading and trailing spaces of input buffer */
+ fname = strstrip(buf);
+ if (*fname == '\0') {
+ ret = -EINVAL;
+ goto exit_free_buf;
+ }
+
+ /* find a separator like a space character */
+ for (gname = fname; !isspace(*gname); gname++) {
+ if (*gname == '\0') {
+ ret = -EINVAL;
+ goto exit_free_buf;
+ }
+ }
+ *gname = '\0';
+
+ /* drop extra spaces between function and group name */
+ gname = skip_spaces(gname + 1);
+ if (*gname == '\0') {
+ ret = -EINVAL;
+ goto exit_free_buf;
+ }
+
+ fsel = pinmux_func_name_to_selector(pctldev, fname);
+ if (fsel < 0) {
+ dev_err(pctldev->dev, "invalid function %s in map table\n", fname);
+ ret = fsel;
+ goto exit_free_buf;
+ }
+
+ ret = pmxops->get_function_groups(pctldev, fsel, &groups, &num_groups);
+ if (ret) {
+ dev_err(pctldev->dev, "no groups for function %d (%s)", fsel, fname);
+ goto exit_free_buf;
+ }
+
+ ret = match_string(groups, num_groups, gname);
+ if (ret < 0) {
+ dev_err(pctldev->dev, "invalid group %s", gname);
+ goto exit_free_buf;
+ }
+
+ gsel = pinctrl_get_group_selector(pctldev, gname);
+ if (gsel < 0) {
+ dev_err(pctldev->dev, "failed to get group selector for %s", gname);
+ ret = gsel;
+ goto exit_free_buf;
+ }
+
+ ret = pmxops->set_mux(pctldev, fsel, gsel);
+ if (ret) {
+ dev_err(pctldev->dev, "set_mux() failed: %d", ret);
+ goto exit_free_buf;
+ }
+ ret = len;
+
+exit_free_buf:
+ kfree(buf);
+
+ return ret;
+}
+
+static int pinmux_select_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, NULL, inode->i_private);
+}
+
+static const struct file_operations pinmux_select_ops = {
+ .owner = THIS_MODULE,
+ .open = pinmux_select_open,
+ .write = pinmux_select,
+ .llseek = no_llseek,
+ .release = single_release,
+};
+
void pinmux_init_device_debugfs(struct dentry *devroot,
struct pinctrl_dev *pctldev)
{
@@ -680,6 +780,8 @@ void pinmux_init_device_debugfs(struct dentry *devroot,
devroot, pctldev, &pinmux_functions_fops);
debugfs_create_file("pinmux-pins", 0444,
devroot, pctldev, &pinmux_pins_fops);
+ debugfs_create_file("pinmux-select", 0200,
+ devroot, pctldev, &pinmux_select_ops);
}
#endif /* CONFIG_DEBUG_FS */
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v6 2/3] pinctrl: pinmux: Add pinmux-select debugfs file
2021-02-16 22:44 ` [PATCH v6 2/3] pinctrl: pinmux: Add pinmux-select debugfs file Drew Fustini
@ 2021-02-17 10:10 ` Andy Shevchenko
0 siblings, 0 replies; 7+ messages in thread
From: Andy Shevchenko @ 2021-02-17 10:10 UTC (permalink / raw)
To: Drew Fustini
Cc: Linus Walleij, open list:GPIO SUBSYSTEM,
Linux Kernel Mailing List, Tony Lindgren, Alexandre Belloni,
Geert Uytterhoeven, Pantelis Antoniou, Jason Kridner,
Robert Nelson, Joe Perches, Dan Carpenter, Jonathan Corbet,
Linux Documentation List
On Wed, Feb 17, 2021 at 12:45 AM Drew Fustini <drew@beagleboard.org> wrote:
>
> Add "pinmux-select" to debugfs which will activate a function and group:
>
> echo "<function-name group-name>" > pinmux-select
>
> The write operation pinmux_select() handles this by checking that the
> names map to valid selectors and then calling ops->set_mux().
>
> The existing "pinmux-functions" debugfs file lists the pin functions
> registered for the pin controller. For example:
>
> function: pinmux-uart0, groups = [ pinmux-uart0-pins ]
> function: pinmux-mmc0, groups = [ pinmux-mmc0-pins ]
> function: pinmux-mmc1, groups = [ pinmux-mmc1-pins ]
> function: pinmux-i2c0, groups = [ pinmux-i2c0-pins ]
> function: pinmux-i2c1, groups = [ pinmux-i2c1-pins ]
> function: pinmux-spi1, groups = [ pinmux-spi1-pins ]
>
> To activate function pinmux-i2c1 and group pinmux-i2c1-pins:
>
> echo "pinmux-i2c1 pinmux-i2c1-pins" > pinmux-select
Thanks, looks almost good to me (few nit-picks below)
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Signed-off-by: Drew Fustini <drew@beagleboard.org>
> ---
> drivers/pinctrl/pinmux.c | 102 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 102 insertions(+)
>
> diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
> index c651b2db0925..08f336e4246c 100644
> --- a/drivers/pinctrl/pinmux.c
> +++ b/drivers/pinctrl/pinmux.c
> @@ -23,6 +23,7 @@
> #include <linux/string.h>
> #include <linux/debugfs.h>
> #include <linux/seq_file.h>
> +#include <linux/ctype.h>
Perhaps squeeze it to look slightly more ordered?
> #include <linux/pinctrl/machine.h>
> #include <linux/pinctrl/pinmux.h>
> #include "core.h"
> @@ -673,6 +674,105 @@ void pinmux_show_setting(struct seq_file *s,
> DEFINE_SHOW_ATTRIBUTE(pinmux_functions);
> DEFINE_SHOW_ATTRIBUTE(pinmux_pins);
> +#define PINMUX_SELECT_MAX 50
Why suddenly this number? Maybe 64 for the sake of good power of 2?
> +static ssize_t pinmux_select(struct file *file, const char __user *user_buf,
> + size_t len, loff_t *ppos)
> +{
> + struct seq_file *sfile = file->private_data;
> + struct pinctrl_dev *pctldev = sfile->private;
> + const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
> + const char *const *groups;
> + char *buf, *fname, *gname;
> + unsigned int num_groups;
> + int fsel, gsel, ret;
> +
> + if (len > PINMUX_SELECT_MAX)
> + return -ENOMEM;
> +
> + buf = kzalloc(PINMUX_SELECT_MAX, GFP_KERNEL);
> + if (!buf)
> + return -ENOMEM;
> +
> + ret = strncpy_from_user(buf, user_buf, PINMUX_SELECT_MAX);
> + if (ret < 0)
> + goto exit_free_buf;
> + buf[len-1] = '\0';
> +
> + /* remove leading and trailing spaces of input buffer */
> + fname = strstrip(buf);
> + if (*fname == '\0') {
> + ret = -EINVAL;
> + goto exit_free_buf;
> + }
> +
> + /* find a separator like a space character */
"find a separator which is a spacelike character" ?
> + for (gname = fname; !isspace(*gname); gname++) {
> + if (*gname == '\0') {
> + ret = -EINVAL;
> + goto exit_free_buf;
> + }
> + }
> + *gname = '\0';
> +
> + /* drop extra spaces between function and group name */
names
> + gname = skip_spaces(gname + 1);
> + if (*gname == '\0') {
> + ret = -EINVAL;
> + goto exit_free_buf;
> + }
> +
> + fsel = pinmux_func_name_to_selector(pctldev, fname);
> + if (fsel < 0) {
> + dev_err(pctldev->dev, "invalid function %s in map table\n", fname);
> + ret = fsel;
> + goto exit_free_buf;
> + }
Here and below you could do other way around, i.e.
ret = ...
if (ret < 0) {
...
}
fsel = ret;
> + ret = pmxops->get_function_groups(pctldev, fsel, &groups, &num_groups);
> + if (ret) {
> + dev_err(pctldev->dev, "no groups for function %d (%s)", fsel, fname);
> + goto exit_free_buf;
> + }
> +
> + ret = match_string(groups, num_groups, gname);
> + if (ret < 0) {
> + dev_err(pctldev->dev, "invalid group %s", gname);
> + goto exit_free_buf;
> + }
> +
> + gsel = pinctrl_get_group_selector(pctldev, gname);
> + if (gsel < 0) {
> + dev_err(pctldev->dev, "failed to get group selector for %s", gname);
> + ret = gsel;
> + goto exit_free_buf;
> + }
> +
> + ret = pmxops->set_mux(pctldev, fsel, gsel);
> + if (ret) {
> + dev_err(pctldev->dev, "set_mux() failed: %d", ret);
> + goto exit_free_buf;
> + }
> + ret = len;
> +
> +exit_free_buf:
> + kfree(buf);
> +
> + return ret;
> +}
> +
> +static int pinmux_select_open(struct inode *inode, struct file *file)
> +{
> + return single_open(file, NULL, inode->i_private);
> +}
> +
> +static const struct file_operations pinmux_select_ops = {
> + .owner = THIS_MODULE,
> + .open = pinmux_select_open,
> + .write = pinmux_select,
> + .llseek = no_llseek,
> + .release = single_release,
> +};
> +
> void pinmux_init_device_debugfs(struct dentry *devroot,
> struct pinctrl_dev *pctldev)
> {
> @@ -680,6 +780,8 @@ void pinmux_init_device_debugfs(struct dentry *devroot,
> devroot, pctldev, &pinmux_functions_fops);
> debugfs_create_file("pinmux-pins", 0444,
> devroot, pctldev, &pinmux_pins_fops);
> + debugfs_create_file("pinmux-select", 0200,
> + devroot, pctldev, &pinmux_select_ops);
> }
>
> #endif /* CONFIG_DEBUG_FS */
> --
> 2.25.1
>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v6 3/3] docs/pinctrl: document debugfs files
2021-02-16 22:44 [PATCH v6 0/3] pinctrl: pinmux: Add pinmux-select debugfs file Drew Fustini
2021-02-16 22:44 ` [PATCH v6 1/3] pinctrl: use to octal permissions for debugfs files Drew Fustini
2021-02-16 22:44 ` [PATCH v6 2/3] pinctrl: pinmux: Add pinmux-select debugfs file Drew Fustini
@ 2021-02-16 22:44 ` Drew Fustini
2021-02-17 10:16 ` Andy Shevchenko
2021-02-17 13:53 ` [PATCH v6 0/3] pinctrl: pinmux: Add pinmux-select debugfs file Tony Lindgren
3 siblings, 1 reply; 7+ messages in thread
From: Drew Fustini @ 2021-02-16 22:44 UTC (permalink / raw)
To: Linus Walleij, linux-gpio, linux-kernel, Tony Lindgren,
Andy Shevchenko, Alexandre Belloni, Geert Uytterhoeven,
Pantelis Antoniou, Jason Kridner, Robert Nelson, Joe Perches,
Dan Carpenter, Jonathan Corbet, linux-doc
Cc: Drew Fustini
Document debugfs directories and files created for pinctrl subsystem.
Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Drew Fustini <drew@beagleboard.org>
---
Documentation/driver-api/pinctl.rst | 37 +++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/Documentation/driver-api/pinctl.rst b/Documentation/driver-api/pinctl.rst
index 3d2deaf48841..37bc3bd64cd8 100644
--- a/Documentation/driver-api/pinctl.rst
+++ b/Documentation/driver-api/pinctl.rst
@@ -1428,3 +1428,40 @@ on the pins defined by group B::
The above has to be done from process context. The reservation of the pins
will be done when the state is activated, so in effect one specific pin
can be used by different functions at different times on a running system.
+
+
+Debugfs files
+=============
+These files are created in ``/sys/kernel/debug/pinctrl``:
+
+- ``pinctrl-devices``: prints each pin controller device along with columns to
+ indicate support for pinmux and pinconf
+
+- ``pinctrl-handles``: iterate through the list of pin controller handles and
+ print the corresponding pinmux maps
+
+- ``pinctrl-maps``: print all pinctrl maps
+
+A sub-directory is created inside of ``/sys/kernel/debug/pinctrl`` for each pin
+controller device containing these files:
+
+- ``pins``: prints a line for each pin registered on the pin controller. The
+ pinctrl driver may add additional information such as register contents.
+
+- ``gpio-ranges``: print ranges that map gpio lines to pins on the controller
+
+- ``pingroups``: print all pin groups registered on the pin controller
+
+- ``pinconf-pins``: print pin config settings for each pin
+
+- ``pinconf-groups``: print pin config settings per pin group
+
+- ``pinmux-functions``: print each pin function along with the pin groups that
+ map to the pin function
+
+- ``pinmux-pins``: iterate through all pins and print mux owner, gpio owner
+ and if the pin is a hog
+
+- ``pinmux-select``: write to this file to activate a pin function and group::
+
+ echo "<function-name group-name>" > pinmux-select
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v6 3/3] docs/pinctrl: document debugfs files
2021-02-16 22:44 ` [PATCH v6 3/3] docs/pinctrl: document debugfs files Drew Fustini
@ 2021-02-17 10:16 ` Andy Shevchenko
0 siblings, 0 replies; 7+ messages in thread
From: Andy Shevchenko @ 2021-02-17 10:16 UTC (permalink / raw)
To: Drew Fustini
Cc: Linus Walleij, open list:GPIO SUBSYSTEM,
Linux Kernel Mailing List, Tony Lindgren, Alexandre Belloni,
Geert Uytterhoeven, Pantelis Antoniou, Jason Kridner,
Robert Nelson, Joe Perches, Dan Carpenter, Jonathan Corbet,
Linux Documentation List
On Wed, Feb 17, 2021 at 12:45 AM Drew Fustini <drew@beagleboard.org> wrote:
>
> Document debugfs directories and files created for pinctrl subsystem.
Thanks for doing this!
I won't bikeshed now because it's about debugfs anyway, so
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Signed-off-by: Drew Fustini <drew@beagleboard.org>
> ---
> Documentation/driver-api/pinctl.rst | 37 +++++++++++++++++++++++++++++
> 1 file changed, 37 insertions(+)
>
> diff --git a/Documentation/driver-api/pinctl.rst b/Documentation/driver-api/pinctl.rst
> index 3d2deaf48841..37bc3bd64cd8 100644
> --- a/Documentation/driver-api/pinctl.rst
> +++ b/Documentation/driver-api/pinctl.rst
> @@ -1428,3 +1428,40 @@ on the pins defined by group B::
> The above has to be done from process context. The reservation of the pins
> will be done when the state is activated, so in effect one specific pin
> can be used by different functions at different times on a running system.
> +
> +
> +Debugfs files
> +=============
> +These files are created in ``/sys/kernel/debug/pinctrl``:
> +
> +- ``pinctrl-devices``: prints each pin controller device along with columns to
> + indicate support for pinmux and pinconf
> +
> +- ``pinctrl-handles``: iterate through the list of pin controller handles and
> + print the corresponding pinmux maps
> +
> +- ``pinctrl-maps``: print all pinctrl maps
> +
> +A sub-directory is created inside of ``/sys/kernel/debug/pinctrl`` for each pin
> +controller device containing these files:
> +
> +- ``pins``: prints a line for each pin registered on the pin controller. The
> + pinctrl driver may add additional information such as register contents.
> +
> +- ``gpio-ranges``: print ranges that map gpio lines to pins on the controller
> +
> +- ``pingroups``: print all pin groups registered on the pin controller
> +
> +- ``pinconf-pins``: print pin config settings for each pin
> +
> +- ``pinconf-groups``: print pin config settings per pin group
> +
> +- ``pinmux-functions``: print each pin function along with the pin groups that
> + map to the pin function
> +
> +- ``pinmux-pins``: iterate through all pins and print mux owner, gpio owner
> + and if the pin is a hog
> +
> +- ``pinmux-select``: write to this file to activate a pin function and group::
> +
> + echo "<function-name group-name>" > pinmux-select
> --
> 2.25.1
>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v6 0/3] pinctrl: pinmux: Add pinmux-select debugfs file
2021-02-16 22:44 [PATCH v6 0/3] pinctrl: pinmux: Add pinmux-select debugfs file Drew Fustini
` (2 preceding siblings ...)
2021-02-16 22:44 ` [PATCH v6 3/3] docs/pinctrl: document debugfs files Drew Fustini
@ 2021-02-17 13:53 ` Tony Lindgren
3 siblings, 0 replies; 7+ messages in thread
From: Tony Lindgren @ 2021-02-17 13:53 UTC (permalink / raw)
To: Drew Fustini
Cc: Linus Walleij, linux-gpio, linux-kernel, Andy Shevchenko,
Alexandre Belloni, Geert Uytterhoeven, Pantelis Antoniou,
Jason Kridner, Robert Nelson, Joe Perches, Dan Carpenter,
Jonathan Corbet, linux-doc
* Drew Fustini <drew@beagleboard.org> [210216 22:46]:
> This series first converts the debugfs files in the pinctrl subsystem to
> octal permissions and then adds a new debugfs file "pinmux-select".
>
> Function name and group name can be written to "pinmux-select" which
> will cause the function and group to be activated on the pin controller.
Nice to see this happening!
Reviewed-by: Tony Lindgren <tony@atomide.com>
^ permalink raw reply [flat|nested] 7+ messages in thread