mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
pinctrl: fix pinctrl_gpio_get_pinctrl_and_offset for gpio-ranges array
Sometimes a multi-element array is used for "gpio-ranges" property in dts file: qe_pio_e: gpio-controller@1460 { ...... gpio-ranges = <&pinctrl1 0 20 10>, <&pinctrl2 10 50 20>; ...... }; But the function pinctrl_gpio_get_pinctrl_and_offset can't handle this case because the "index" argument passed to dev_read_phandle_with_args is fixed to be "0". Use a loop to traverse the array to fix it. Signed-off-by: Quanyang Wang <quanyang.wang@windriver.com>
This commit is contained in:
parent
2fb74a1d13
commit
d0bb00adcc
1 changed files with 23 additions and 24 deletions
|
@ -169,34 +169,33 @@ pinctrl_gpio_get_pinctrl_and_offset(struct udevice *dev, unsigned offset,
|
|||
{
|
||||
struct ofnode_phandle_args args;
|
||||
unsigned gpio_offset, pfc_base, pfc_pins;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
int i = 0;
|
||||
|
||||
ret = dev_read_phandle_with_args(dev, "gpio-ranges", NULL, 3,
|
||||
0, &args);
|
||||
if (ret) {
|
||||
dev_dbg(dev, "%s: dev_read_phandle_with_args: err=%d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
while (ret == 0) {
|
||||
ret = dev_read_phandle_with_args(dev, "gpio-ranges", NULL, 3,
|
||||
i++, &args);
|
||||
if (ret) {
|
||||
dev_dbg(dev, "%s: dev_read_phandle_with_args: err=%d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = uclass_get_device_by_ofnode(UCLASS_PINCTRL,
|
||||
args.node, pctldev);
|
||||
if (ret) {
|
||||
dev_dbg(dev,
|
||||
"%s: uclass_get_device_by_of_offset failed: err=%d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
ret = uclass_get_device_by_ofnode(UCLASS_PINCTRL,
|
||||
args.node, pctldev);
|
||||
if (ret) {
|
||||
dev_dbg(dev,
|
||||
"%s: uclass_get_device_by_of_offset failed: err=%d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
gpio_offset = args.args[0];
|
||||
pfc_base = args.args[1];
|
||||
pfc_pins = args.args[2];
|
||||
gpio_offset = args.args[0];
|
||||
pfc_base = args.args[1];
|
||||
pfc_pins = args.args[2];
|
||||
|
||||
if (offset < gpio_offset || offset > gpio_offset + pfc_pins) {
|
||||
dev_dbg(dev,
|
||||
"%s: GPIO can not be mapped to pincontrol pin\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
if (offset >= gpio_offset && offset <= gpio_offset + pfc_pins)
|
||||
break;
|
||||
}
|
||||
|
||||
offset -= gpio_offset;
|
||||
|
|
Loading…
Reference in a new issue