lkml.org 
[lkml]   [2012]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] pinctrl: resurrect verbose pinmux-pins
    Date
    From: Linus Walleij <linus.walleij@linaro.org>

    This reintroduces the verbosity in the pinmux-pins file, now this
    file will list all pins, their names, owning device (and if it's
    a hog) and also in applicable cases the function and group making
    use of that pin right now.

    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    ---
    drivers/pinctrl/core.h | 4 ++++
    drivers/pinctrl/pinmux.c | 34 +++++++++++++++++++++++++++++-----
    2 files changed, 33 insertions(+), 5 deletions(-)

    diff --git a/drivers/pinctrl/core.h b/drivers/pinctrl/core.h
    index e1dfdb3..0a52e39 100644
    --- a/drivers/pinctrl/core.h
    +++ b/drivers/pinctrl/core.h
    @@ -12,6 +12,7 @@
    #include <linux/pinctrl/pinconf.h>

    struct pinctrl_gpio_range;
    +struct pinmux_group;

    /**
    * struct pinctrl_dev - pin control class device
    @@ -77,6 +78,8 @@ struct pinctrl {
    * @dynamic_name: if the name of this pin was dynamically allocated
    * @lock: a lock to protect the descriptor structure
    * @owner: the device holding this pin or NULL of no device has claimed it
    + * @grp: the pinmux group used for this pin if it is used by a pin group
    + * or NULL
    */
    struct pin_desc {
    struct pinctrl_dev *pctldev;
    @@ -86,6 +89,7 @@ struct pin_desc {
    /* These fields only added when supporting pinmux drivers */
    #ifdef CONFIG_PINMUX
    const char *owner;
    + struct pinmux_group *grp;
    #endif
    };

    diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
    index f409f16..5785b09 100644
    --- a/drivers/pinctrl/pinmux.c
    +++ b/drivers/pinctrl/pinmux.c
    @@ -76,11 +76,14 @@ int pinmux_check_ops(struct pinctrl_dev *pctldev)
    * @pin: the pin number in the global pin space
    * @owner: a representation of the owner of this pin; typically the device
    * name that controls its mux function, or the requested GPIO name
    + * @grp: the pinmux group used for this pin or NULL of it is requested as
    + * a GPIO pin
    * @gpio_range: the range matching the GPIO pin if this is a request for a
    * single GPIO pin
    */
    static int pin_request(struct pinctrl_dev *pctldev,
    int pin, const char *owner,
    + struct pinmux_group *grp,
    struct pinctrl_gpio_range *gpio_range)
    {
    struct pin_desc *desc;
    @@ -104,6 +107,7 @@ static int pin_request(struct pinctrl_dev *pctldev,
    goto out;
    }
    desc->owner = owner;
    + desc->grp = grp;
    spin_unlock(&desc->lock);

    /* Let each pin increase references to this module */
    @@ -181,6 +185,7 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
    spin_lock(&desc->lock);
    owner = desc->owner;
    desc->owner = NULL;
    + desc->grp = NULL;
    spin_unlock(&desc->lock);
    module_put(pctldev->owner);

    @@ -208,7 +213,7 @@ int pinmux_request_gpio(struct pinctrl_dev *pctldev,
    if (!owner)
    return -EINVAL;

    - ret = pin_request(pctldev, pin, owner, range);
    + ret = pin_request(pctldev, pin, owner, NULL, range);
    if (ret < 0)
    kfree(owner);

    @@ -259,10 +264,12 @@ int pinmux_gpio_direction(struct pinctrl_dev *pctldev,
    * @pctldev: the device to take the pins on
    * @owner: a representation of the owner of this pin; typically the device
    * name that controls its mux function
    + * @grp: the pinmux group that will use the pins
    * @group_selector: the group selector containing the pins to acquire
    */
    static int acquire_pins(struct pinctrl_dev *pctldev,
    const char *owner,
    + struct pinmux_group *grp,
    unsigned group_selector)
    {
    const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
    @@ -281,7 +288,7 @@ static int acquire_pins(struct pinctrl_dev *pctldev,

    /* Try to allocate all pins in this group, one by one */
    for (i = 0; i < num_pins; i++) {
    - ret = pin_request(pctldev, pins[i], owner, NULL);
    + ret = pin_request(pctldev, pins[i], owner, grp, NULL);
    if (ret) {
    dev_err(pctldev->dev,
    "could not get request pin %d on device %s - conflicting mux mappings?\n",
    @@ -485,7 +492,7 @@ static int pinmux_enable_muxmap(struct pinctrl_dev *pctldev,
    return -ENOMEM;
    grp->func_selector = func_selector;
    grp->group_selector = group_selector;
    - ret = acquire_pins(pctldev, devname, group_selector);
    + ret = acquire_pins(pctldev, devname, grp, group_selector);
    if (ret) {
    kfree(grp);
    return ret;
    @@ -606,13 +613,25 @@ static int pinmux_functions_show(struct seq_file *s, void *what)
    return 0;
    }

    +static void pinmux_pins_show_groupinfo(struct seq_file *s,
    + struct pinctrl_dev *pctldev,
    + struct pinmux_group *grp)
    +{
    + const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
    + const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
    +
    + seq_printf(s, " function: \"%s\" group: \"%s\"\n",
    + pmxops->get_function_name(pctldev, grp->func_selector),
    + pctlops->get_group_name(pctldev, grp->group_selector));
    +}
    +
    static int pinmux_pins_show(struct seq_file *s, void *what)
    {
    struct pinctrl_dev *pctldev = s->private;
    unsigned i, pin;

    seq_puts(s, "Pinmux settings per pin\n");
    - seq_puts(s, "Format: pin (name): owner\n");
    + seq_puts(s, "Format: pin (name): owner [function]\n");

    /* The pin number can be retrived from the pin controller descriptor */
    for (i = 0; i < pctldev->desc->npins; i++) {
    @@ -629,10 +648,15 @@ static int pinmux_pins_show(struct seq_file *s, void *what)
    !strcmp(desc->owner, pinctrl_dev_get_name(pctldev)))
    is_hog = true;

    - seq_printf(s, "pin %d (%s): %s%s\n", pin,
    + seq_printf(s, "pin %d (%s): %s%s", pin,
    desc->name ? desc->name : "unnamed",
    desc->owner ? desc->owner : "UNCLAIMED",
    is_hog ? " (HOG)" : "");
    +
    + if (desc->grp)
    + pinmux_pins_show_groupinfo(s, pctldev, desc->grp);
    + else
    + seq_printf(s, "\n");
    }

    return 0;
    --
    1.7.8


    \
     
     \ /
      Last update: 2012-03-02 18:05    [W:0.055 / U:33.376 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site