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: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
eb171a997d
commit
e5b3b2d9ed
2 changed files with 23 additions and 17 deletions
|
@ -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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue