Commit e5b3b2d9 authored by Antoine Ténart's avatar Antoine Ténart Committed by Linus Walleij

pinctrl: allows not to define the get_group_pins operation

When using a group only pinctrl driver, which does not have any
information on the pins it is useless to define a get_group_pins
always returning an empty list of pins.

When not using get_group_pin[1], a driver must implement it so
pins = NULL and num_pins = 0. This patch makes it the default
behaviour if not defined in the pinctrl driver when used in
pinmux enable and disable funtions and in pinctrl_groups_show.

It also adds a check in pinctrl_get_group_pins and return -EINVAL if
not defined. This function is called in the gpiolib when adding when
pingroup range. It cannot be used if no group is defined, so this seams
reasonable.

[1] get_group_pin(struct pinctrl_dev *pctldev,
		  unsigned selector,
		  const unsigned **pins,
		  unsigned *num_pins);

Signed-off-by: Antoine Ténart <antoine.tenart@free-electrons.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent eb171a99
...@@ -468,6 +468,9 @@ int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group, ...@@ -468,6 +468,9 @@ int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group,
const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
int gs; int gs;
if (!pctlops->get_group_pins)
return -EINVAL;
gs = pinctrl_get_group_selector(pctldev, pin_group); gs = pinctrl_get_group_selector(pctldev, pin_group);
if (gs < 0) if (gs < 0)
return gs; return gs;
...@@ -1362,15 +1365,16 @@ static int pinctrl_groups_show(struct seq_file *s, void *what) ...@@ -1362,15 +1365,16 @@ static int pinctrl_groups_show(struct seq_file *s, void *what)
seq_puts(s, "registered pin groups:\n"); seq_puts(s, "registered pin groups:\n");
while (selector < ngroups) { while (selector < ngroups) {
const unsigned *pins; const unsigned *pins = NULL;
unsigned num_pins; unsigned num_pins = 0;
const char *gname = ops->get_group_name(pctldev, selector); const char *gname = ops->get_group_name(pctldev, selector);
const char *pname; const char *pname;
int ret; int ret = 0;
int i; int i;
ret = ops->get_group_pins(pctldev, selector, if (ops->get_group_pins)
&pins, &num_pins); ret = ops->get_group_pins(pctldev, selector,
&pins, &num_pins);
if (ret) if (ret)
seq_printf(s, "%s [ERROR GETTING PINS]\n", seq_printf(s, "%s [ERROR GETTING PINS]\n",
gname); gname);
...@@ -1694,8 +1698,7 @@ static int pinctrl_check_ops(struct pinctrl_dev *pctldev) ...@@ -1694,8 +1698,7 @@ static int pinctrl_check_ops(struct pinctrl_dev *pctldev)
if (!ops || if (!ops ||
!ops->get_groups_count || !ops->get_groups_count ||
!ops->get_group_name || !ops->get_group_name)
!ops->get_group_pins)
return -EINVAL; return -EINVAL;
if (ops->dt_node_to_map && !ops->dt_free_map) if (ops->dt_node_to_map && !ops->dt_free_map)
......
...@@ -391,14 +391,16 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting) ...@@ -391,14 +391,16 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)
struct pinctrl_dev *pctldev = setting->pctldev; struct pinctrl_dev *pctldev = setting->pctldev;
const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
const struct pinmux_ops *ops = pctldev->desc->pmxops; const struct pinmux_ops *ops = pctldev->desc->pmxops;
int ret; int ret = 0;
const unsigned *pins; const unsigned *pins = NULL;
unsigned num_pins; unsigned num_pins = 0;
int i; int i;
struct pin_desc *desc; struct pin_desc *desc;
ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, if (pctlops->get_group_pins)
&pins, &num_pins); ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
&pins, &num_pins);
if (ret) { if (ret) {
const char *gname; const char *gname;
...@@ -470,14 +472,15 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting) ...@@ -470,14 +472,15 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)
struct pinctrl_dev *pctldev = setting->pctldev; struct pinctrl_dev *pctldev = setting->pctldev;
const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
const struct pinmux_ops *ops = pctldev->desc->pmxops; const struct pinmux_ops *ops = pctldev->desc->pmxops;
int ret; int ret = 0;
const unsigned *pins; const unsigned *pins = NULL;
unsigned num_pins; unsigned num_pins = 0;
int i; int i;
struct pin_desc *desc; struct pin_desc *desc;
ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, if (pctlops->get_group_pins)
&pins, &num_pins); ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
&pins, &num_pins);
if (ret) { if (ret) {
const char *gname; const char *gname;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment