Commit 3dac1918 authored by Stefan Agner's avatar Stefan Agner Committed by Linus Walleij

pinctrl: imx: detect uninitialized pins

The pinctrl driver initialized the register offsets for the pins
with 0. On Vybrid an offset of 0 is a valid offset for the pinctrl
mux register. So far, this was solved using the ZERO_OFFSET_VALID
flag which allowed offsets of 0. However, this does not allow to
verify whether a pins struct imx_pmx_func was initialized or not.

Use signed offset values for register offsets and initialize those
with -1 in order to detect uninitialized offset values reliable.
Signed-off-by: default avatarStefan Agner <stefan@agner.ch>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 3ccc11f6
...@@ -204,7 +204,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, ...@@ -204,7 +204,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
pin_id = pin->pin; pin_id = pin->pin;
pin_reg = &info->pin_regs[pin_id]; pin_reg = &info->pin_regs[pin_id];
if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->mux_reg) { if (pin_reg->mux_reg == -1) {
dev_err(ipctl->dev, "Pin(%s) does not support mux function\n", dev_err(ipctl->dev, "Pin(%s) does not support mux function\n",
info->pins[pin_id].name); info->pins[pin_id].name);
return -EINVAL; return -EINVAL;
...@@ -308,7 +308,7 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev, ...@@ -308,7 +308,7 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev,
const struct imx_pinctrl_soc_info *info = ipctl->info; const struct imx_pinctrl_soc_info *info = ipctl->info;
const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id]; const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->conf_reg) { if (pin_reg->conf_reg == -1) {
dev_err(info->dev, "Pin(%s) does not support config function\n", dev_err(info->dev, "Pin(%s) does not support config function\n",
info->pins[pin_id].name); info->pins[pin_id].name);
return -EINVAL; return -EINVAL;
...@@ -331,7 +331,7 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev, ...@@ -331,7 +331,7 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev,
const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id]; const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
int i; int i;
if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->conf_reg) { if (pin_reg->conf_reg == -1) {
dev_err(info->dev, "Pin(%s) does not support config function\n", dev_err(info->dev, "Pin(%s) does not support config function\n",
info->pins[pin_id].name); info->pins[pin_id].name);
return -EINVAL; return -EINVAL;
...@@ -586,10 +586,11 @@ int imx_pinctrl_probe(struct platform_device *pdev, ...@@ -586,10 +586,11 @@ int imx_pinctrl_probe(struct platform_device *pdev,
if (!ipctl) if (!ipctl)
return -ENOMEM; return -ENOMEM;
info->pin_regs = devm_kzalloc(&pdev->dev, sizeof(*info->pin_regs) * info->pin_regs = devm_kmalloc(&pdev->dev, sizeof(*info->pin_regs) *
info->npins, GFP_KERNEL); info->npins, GFP_KERNEL);
if (!info->pin_regs) if (!info->pin_regs)
return -ENOMEM; return -ENOMEM;
memset(info->pin_regs, 0xff, sizeof(*info->pin_regs) * info->npins);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
ipctl->base = devm_ioremap_resource(&pdev->dev, res); ipctl->base = devm_ioremap_resource(&pdev->dev, res);
......
...@@ -67,8 +67,8 @@ struct imx_pmx_func { ...@@ -67,8 +67,8 @@ struct imx_pmx_func {
* @conf_reg: config register offset * @conf_reg: config register offset
*/ */
struct imx_pin_reg { struct imx_pin_reg {
u16 mux_reg; s16 mux_reg;
u16 conf_reg; s16 conf_reg;
}; };
struct imx_pinctrl_soc_info { struct imx_pinctrl_soc_info {
...@@ -83,8 +83,7 @@ struct imx_pinctrl_soc_info { ...@@ -83,8 +83,7 @@ struct imx_pinctrl_soc_info {
unsigned int flags; unsigned int flags;
}; };
#define ZERO_OFFSET_VALID 0x1 #define SHARE_MUX_CONF_REG 0x1
#define SHARE_MUX_CONF_REG 0x2
#define NO_MUX 0x0 #define NO_MUX 0x0
#define NO_PAD 0x0 #define NO_PAD 0x0
......
...@@ -299,7 +299,7 @@ static const struct pinctrl_pin_desc vf610_pinctrl_pads[] = { ...@@ -299,7 +299,7 @@ static const struct pinctrl_pin_desc vf610_pinctrl_pads[] = {
static struct imx_pinctrl_soc_info vf610_pinctrl_info = { static struct imx_pinctrl_soc_info vf610_pinctrl_info = {
.pins = vf610_pinctrl_pads, .pins = vf610_pinctrl_pads,
.npins = ARRAY_SIZE(vf610_pinctrl_pads), .npins = ARRAY_SIZE(vf610_pinctrl_pads),
.flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG, .flags = SHARE_MUX_CONF_REG,
}; };
static struct of_device_id vf610_pinctrl_of_match[] = { static struct of_device_id vf610_pinctrl_of_match[] = {
......
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