summaryrefslogtreecommitdiff
path: root/drivers/pinctrl
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/mediatek/pinctrl-mtk-common.c1
-rw-r--r--drivers/pinctrl/pinctrl_stm32.c30
-rw-r--r--drivers/pinctrl/renesas/pfc.c77
3 files changed, 89 insertions, 19 deletions
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index 6553dde45c2..4dd3f73ead2 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -615,6 +615,7 @@ static int mtk_gpiochip_register(struct udevice *parent)
if (!drv)
return -ENOENT;
+ ret = -ENOENT;
dev_for_each_subnode(node, parent)
if (ofnode_read_bool(node, "gpio-controller")) {
ret = 0;
diff --git a/drivers/pinctrl/pinctrl_stm32.c b/drivers/pinctrl/pinctrl_stm32.c
index 591cd1a0ecc..a1f53a793b4 100644
--- a/drivers/pinctrl/pinctrl_stm32.c
+++ b/drivers/pinctrl/pinctrl_stm32.c
@@ -3,6 +3,8 @@
* Copyright (C) 2017-2020 STMicroelectronics - All Rights Reserved
*/
+#define LOG_CATEGORY UCLASS_PINCTRL
+
#include <common.h>
#include <dm.h>
#include <hwspinlock.h>
@@ -256,8 +258,8 @@ static int stm32_pinctrl_probe(struct udevice *dev)
/* hwspinlock property is optional, just log the error */
ret = hwspinlock_get_by_index(dev, 0, &priv->hws);
if (ret)
- debug("%s: hwspinlock_get_by_index may have failed (%d)\n",
- __func__, ret);
+ dev_dbg(dev, "hwspinlock_get_by_index may have failed (%d)\n",
+ ret);
return 0;
}
@@ -305,8 +307,7 @@ static int prep_gpio_dsc(struct stm32_gpio_dsc *gpio_dsc, u32 port_pin)
{
gpio_dsc->port = (port_pin & 0x1F000) >> 12;
gpio_dsc->pin = (port_pin & 0x0F00) >> 8;
- debug("%s: GPIO:port= %d, pin= %d\n", __func__, gpio_dsc->port,
- gpio_dsc->pin);
+ log_debug("GPIO:port= %d, pin= %d\n", gpio_dsc->port, gpio_dsc->pin);
return 0;
}
@@ -347,9 +348,9 @@ static int prep_gpio_ctl(struct stm32_gpio_ctl *gpio_ctl, u32 gpio_fn,
else
gpio_ctl->pupd = STM32_GPIO_PUPD_NO;
- debug("%s: gpio fn= %d, slew-rate= %x, op type= %x, pull-upd is = %x\n",
- __func__, gpio_fn, gpio_ctl->speed, gpio_ctl->otype,
- gpio_ctl->pupd);
+ log_debug("gpio fn= %d, slew-rate= %x, op type= %x, pull-upd is = %x\n",
+ gpio_fn, gpio_ctl->speed, gpio_ctl->otype,
+ gpio_ctl->pupd);
return 0;
}
@@ -373,7 +374,7 @@ static int stm32_pinctrl_config(ofnode node)
if (rv < 0)
return rv;
len = rv / sizeof(pin_mux[0]);
- debug("%s: no of pinmux entries= %d\n", __func__, len);
+ log_debug("No of pinmux entries= %d\n", len);
if (len > MAX_PINS_ONE_IP)
return -EINVAL;
rv = ofnode_read_u32_array(subnode, "pinmux", pin_mux, len);
@@ -382,7 +383,7 @@ static int stm32_pinctrl_config(ofnode node)
for (i = 0; i < len; i++) {
struct gpio_desc desc;
- debug("%s: pinmux = %x\n", __func__, *(pin_mux + i));
+ log_debug("pinmux = %x\n", *(pin_mux + i));
prep_gpio_dsc(&gpio_dsc, *(pin_mux + i));
prep_gpio_ctl(&gpio_ctl, *(pin_mux + i), subnode);
rv = uclass_get_device_by_seq(UCLASS_GPIO,
@@ -392,7 +393,7 @@ static int stm32_pinctrl_config(ofnode node)
return rv;
desc.offset = gpio_dsc.pin;
rv = stm32_gpio_config(&desc, &gpio_ctl);
- debug("%s: rv = %d\n\n", __func__, rv);
+ log_debug("rv = %d\n\n", rv);
if (rv)
return rv;
}
@@ -408,7 +409,7 @@ static int stm32_pinctrl_bind(struct udevice *dev)
int ret;
dev_for_each_subnode(node, dev) {
- debug("%s: bind %s\n", __func__, ofnode_get_name(node));
+ dev_dbg(dev, "bind %s\n", ofnode_get_name(node));
ofnode_get_property(node, "gpio-controller", &ret);
if (ret < 0)
@@ -424,7 +425,7 @@ static int stm32_pinctrl_bind(struct udevice *dev)
if (ret)
return ret;
- debug("%s: bind %s\n", __func__, name);
+ dev_dbg(dev, "bind %s\n", name);
}
return 0;
@@ -448,7 +449,7 @@ static int stm32_pinctrl_set_state_simple(struct udevice *dev,
if (!list)
return -EINVAL;
- debug("%s: periph->name = %s\n", __func__, periph->name);
+ dev_dbg(dev, "periph->name = %s\n", periph->name);
size /= sizeof(*list);
for (i = 0; i < size; i++) {
@@ -456,7 +457,8 @@ static int stm32_pinctrl_set_state_simple(struct udevice *dev,
config_node = ofnode_get_by_phandle(phandle);
if (!ofnode_valid(config_node)) {
- pr_err("prop pinctrl-0 index %d invalid phandle\n", i);
+ dev_err(periph,
+ "prop pinctrl-0 index %d invalid phandle\n", i);
return -EINVAL;
}
diff --git a/drivers/pinctrl/renesas/pfc.c b/drivers/pinctrl/renesas/pfc.c
index 8bb7e16f944..6ff948420c5 100644
--- a/drivers/pinctrl/renesas/pfc.c
+++ b/drivers/pinctrl/renesas/pfc.c
@@ -44,6 +44,7 @@ enum sh_pfc_model {
struct sh_pfc_pin_config {
u32 type;
+ const char *name;
};
struct sh_pfc_pinctrl {
@@ -448,6 +449,30 @@ static const char *sh_pfc_pinctrl_get_group_name(struct udevice *dev,
return priv->pfc.info->groups[selector].name;
}
+static int sh_pfc_pinctrl_get_pin_muxing(struct udevice *dev,
+ unsigned int selector,
+ char *buf, int size)
+{
+ struct sh_pfc_pinctrl_priv *priv = dev_get_priv(dev);
+ struct sh_pfc_pinctrl *pmx = &priv->pmx;
+ struct sh_pfc *pfc = &priv->pfc;
+ struct sh_pfc_pin_config *cfg;
+ const struct sh_pfc_pin *pin;
+ int idx;
+
+ pin = &priv->pfc.info->pins[selector];
+ if (!pin) {
+ snprintf(buf, size, "Unknown");
+ return -EINVAL;
+ }
+
+ idx = sh_pfc_get_pin_index(pfc, pin->pin);
+ cfg = &pmx->configs[idx];
+ snprintf(buf, size, "%s", cfg->name);
+
+ return 0;
+}
+
static int sh_pfc_pinctrl_get_functions_count(struct udevice *dev)
{
struct sh_pfc_pinctrl_priv *priv = dev_get_priv(dev);
@@ -487,14 +512,21 @@ static int sh_pfc_gpio_request_enable(struct udevice *dev,
idx = sh_pfc_get_pin_index(pfc, pin->pin);
cfg = &pmx->configs[idx];
- if (cfg->type != PINMUX_TYPE_NONE)
+ if (cfg->type != PINMUX_TYPE_NONE) {
+ if (!strcmp(cfg->name, pin->name))
+ return 0;
+
+ dev_err(pfc->dev, "Pin already used as %s\n",
+ cfg->name);
return -EBUSY;
+ }
ret = sh_pfc_config_mux(pfc, pin->enum_id, PINMUX_TYPE_GPIO);
if (ret)
return ret;
cfg->type = PINMUX_TYPE_GPIO;
+ cfg->name = "gpio";
return 0;
}
@@ -524,6 +556,7 @@ static int sh_pfc_gpio_disable_free(struct udevice *dev,
cfg = &pmx->configs[idx];
cfg->type = PINMUX_TYPE_NONE;
+ cfg->name = "none";
return 0;
}
@@ -537,11 +570,25 @@ static int sh_pfc_pinctrl_pin_set(struct udevice *dev, unsigned pin_selector,
const struct sh_pfc_pin *pin = &priv->pfc.info->pins[pin_selector];
int idx = sh_pfc_get_pin_index(pfc, pin->pin);
struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
+ int ret;
- if (cfg->type != PINMUX_TYPE_NONE)
+ if (cfg->type != PINMUX_TYPE_NONE) {
+ if (!strcmp(cfg->name, pin->name))
+ return 0;
+
+ dev_err(pfc->dev, "Pin already used as %s\n",
+ cfg->name);
return -EBUSY;
+ }
+
+ ret = sh_pfc_config_mux(pfc, pin->enum_id, PINMUX_TYPE_FUNCTION);
+ if (ret)
+ return ret;
- return sh_pfc_config_mux(pfc, pin->enum_id, PINMUX_TYPE_FUNCTION);
+ cfg->type = PINMUX_TYPE_FUNCTION;
+ cfg->name = "function";
+
+ return 0;
}
static int sh_pfc_pinctrl_group_set(struct udevice *dev, unsigned group_selector,
@@ -551,23 +598,41 @@ static int sh_pfc_pinctrl_group_set(struct udevice *dev, unsigned group_selector
struct sh_pfc_pinctrl *pmx = &priv->pmx;
struct sh_pfc *pfc = &priv->pfc;
const struct sh_pfc_pin_group *grp = &priv->pfc.info->groups[group_selector];
+ bool grp_pins_configured = true;
+ struct sh_pfc_pin_config *cfg;
unsigned int i;
int ret = 0;
+ int idx;
for (i = 0; i < grp->nr_pins; ++i) {
- int idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
- struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
+ idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
+ cfg = &pmx->configs[idx];
if (cfg->type != PINMUX_TYPE_NONE) {
+ if (!strcmp(cfg->name, grp->name))
+ continue;
+
+ dev_err(pfc->dev, "Pin already used as %s\n",
+ cfg->name);
ret = -EBUSY;
goto done;
+ } else {
+ grp_pins_configured = false;
}
}
+ if (grp_pins_configured)
+ return 0;
+
for (i = 0; i < grp->nr_pins; ++i) {
ret = sh_pfc_config_mux(pfc, grp->mux[i], PINMUX_TYPE_FUNCTION);
if (ret < 0)
break;
+
+ idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
+ cfg = &pmx->configs[idx];
+ cfg->type = PINMUX_TYPE_FUNCTION;
+ cfg->name = priv->pfc.info->groups[group_selector].name;
}
done:
@@ -774,6 +839,7 @@ static struct pinctrl_ops sh_pfc_pinctrl_ops = {
.get_pin_name = sh_pfc_pinctrl_get_pin_name,
.get_groups_count = sh_pfc_pinctrl_get_groups_count,
.get_group_name = sh_pfc_pinctrl_get_group_name,
+ .get_pin_muxing = sh_pfc_pinctrl_get_pin_muxing,
.get_functions_count = sh_pfc_pinctrl_get_functions_count,
.get_function_name = sh_pfc_pinctrl_get_function_name,
@@ -804,6 +870,7 @@ static int sh_pfc_map_pins(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
for (i = 0; i < pfc->info->nr_pins; ++i) {
struct sh_pfc_pin_config *cfg = &pmx->configs[i];
cfg->type = PINMUX_TYPE_NONE;
+ cfg->name = "none";
}
return 0;