mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-28 17:48:58 +00:00
7d7aa2fd92
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Despite, since subtargets range from bcm2708 to bcm2711, it seems appropriate to use bcm27xx instead of bcm2708 (again, as already done for BOARDNAME). This also renames the packages brcm2708-userland and brcm2708-gpu-fw. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de> Acked-by: Álvaro Fernández Rojas <noltari@gmail.com>
184 lines
5.3 KiB
Diff
184 lines
5.3 KiB
Diff
From 268bd5b5557ccb0ac4eae998ad7c6261c240b89b Mon Sep 17 00:00:00 2001
|
|
From: Stefan Wahren <wahrenst@gmx.net>
|
|
Date: Sun, 21 Jul 2019 16:01:36 +0200
|
|
Subject: [PATCH] pinctrl: bcm2835: Add support for BCM2711 pull-up
|
|
functionality
|
|
|
|
commit e38a9a437fb93ddafab5030165e4c6a3a5021669 upstream.
|
|
|
|
The BCM2711 has a new way of selecting the pull-up/pull-down setting
|
|
for a GPIO pin. The registers used for the BCM2835, GP_PUD and
|
|
GP_PUDCLKn0, are no longer connected. A new set of registers,
|
|
GP_GPIO_PUP_PDN_CNTRL_REGx must be used. This commit will add
|
|
a new compatible string "brcm,bcm2711-gpio" and the kernel
|
|
driver will use it to select which method is used to select
|
|
pull-up/pull-down.
|
|
|
|
This patch based on a patch by Al Cooper which was intended for the
|
|
BCM7211. This is a bugfixed and improved version.
|
|
|
|
Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
|
|
Acked-by: Eric Anholt <eric@anholt.net>
|
|
---
|
|
drivers/pinctrl/bcm/pinctrl-bcm2835.c | 105 ++++++++++++++++++++++++--
|
|
1 file changed, 100 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
|
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
|
|
@@ -57,15 +57,24 @@
|
|
#define GPAFEN0 0x88 /* Pin Async Falling Edge Detect */
|
|
#define GPPUD 0x94 /* Pin Pull-up/down Enable */
|
|
#define GPPUDCLK0 0x98 /* Pin Pull-up/down Enable Clock */
|
|
+#define GP_GPIO_PUP_PDN_CNTRL_REG0 0xe4 /* 2711 Pin Pull-up/down select */
|
|
|
|
#define FSEL_REG(p) (GPFSEL0 + (((p) / 10) * 4))
|
|
#define FSEL_SHIFT(p) (((p) % 10) * 3)
|
|
#define GPIO_REG_OFFSET(p) ((p) / 32)
|
|
#define GPIO_REG_SHIFT(p) ((p) % 32)
|
|
|
|
+#define PUD_2711_MASK 0x3
|
|
+#define PUD_2711_REG_OFFSET(p) ((p) / 16)
|
|
+#define PUD_2711_REG_SHIFT(p) (((p) % 16) * 2)
|
|
+
|
|
/* argument: bcm2835_pinconf_pull */
|
|
#define BCM2835_PINCONF_PARAM_PULL (PIN_CONFIG_END + 1)
|
|
|
|
+#define BCM2711_PULL_NONE 0x0
|
|
+#define BCM2711_PULL_UP 0x1
|
|
+#define BCM2711_PULL_DOWN 0x2
|
|
+
|
|
struct bcm2835_pinctrl {
|
|
struct device *dev;
|
|
void __iomem *base;
|
|
@@ -975,6 +984,77 @@ static const struct pinconf_ops bcm2835_
|
|
.pin_config_set = bcm2835_pinconf_set,
|
|
};
|
|
|
|
+static void bcm2711_pull_config_set(struct bcm2835_pinctrl *pc,
|
|
+ unsigned int pin, unsigned int arg)
|
|
+{
|
|
+ u32 shifter;
|
|
+ u32 value;
|
|
+ u32 off;
|
|
+
|
|
+ off = PUD_2711_REG_OFFSET(pin);
|
|
+ shifter = PUD_2711_REG_SHIFT(pin);
|
|
+
|
|
+ value = bcm2835_gpio_rd(pc, GP_GPIO_PUP_PDN_CNTRL_REG0 + (off * 4));
|
|
+ value &= ~(PUD_2711_MASK << shifter);
|
|
+ value |= (arg << shifter);
|
|
+ bcm2835_gpio_wr(pc, GP_GPIO_PUP_PDN_CNTRL_REG0 + (off * 4), value);
|
|
+}
|
|
+
|
|
+static int bcm2711_pinconf_set(struct pinctrl_dev *pctldev,
|
|
+ unsigned int pin, unsigned long *configs,
|
|
+ unsigned int num_configs)
|
|
+{
|
|
+ struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
|
|
+ u32 param, arg;
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < num_configs; i++) {
|
|
+ param = pinconf_to_config_param(configs[i]);
|
|
+ arg = pinconf_to_config_argument(configs[i]);
|
|
+
|
|
+ switch (param) {
|
|
+ /* convert legacy brcm,pull */
|
|
+ case BCM2835_PINCONF_PARAM_PULL:
|
|
+ if (arg == BCM2835_PUD_UP)
|
|
+ arg = BCM2711_PULL_UP;
|
|
+ else if (arg == BCM2835_PUD_DOWN)
|
|
+ arg = BCM2711_PULL_DOWN;
|
|
+ else
|
|
+ arg = BCM2711_PULL_NONE;
|
|
+
|
|
+ bcm2711_pull_config_set(pc, pin, arg);
|
|
+ break;
|
|
+
|
|
+ /* Set pull generic bindings */
|
|
+ case PIN_CONFIG_BIAS_DISABLE:
|
|
+ bcm2711_pull_config_set(pc, pin, BCM2711_PULL_NONE);
|
|
+ break;
|
|
+ case PIN_CONFIG_BIAS_PULL_DOWN:
|
|
+ bcm2711_pull_config_set(pc, pin, BCM2711_PULL_DOWN);
|
|
+ break;
|
|
+ case PIN_CONFIG_BIAS_PULL_UP:
|
|
+ bcm2711_pull_config_set(pc, pin, BCM2711_PULL_UP);
|
|
+ break;
|
|
+
|
|
+ /* Set output-high or output-low */
|
|
+ case PIN_CONFIG_OUTPUT:
|
|
+ bcm2835_gpio_set_bit(pc, arg ? GPSET0 : GPCLR0, pin);
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return -ENOTSUPP;
|
|
+ }
|
|
+ } /* for each config */
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static const struct pinconf_ops bcm2711_pinconf_ops = {
|
|
+ .is_generic = true,
|
|
+ .pin_config_get = bcm2835_pinconf_get,
|
|
+ .pin_config_set = bcm2711_pinconf_set,
|
|
+};
|
|
+
|
|
static struct pinctrl_desc bcm2835_pinctrl_desc = {
|
|
.name = MODULE_NAME,
|
|
.pins = bcm2835_gpio_pins,
|
|
@@ -990,6 +1070,18 @@ static struct pinctrl_gpio_range bcm2835
|
|
.npins = BCM2835_NUM_GPIOS,
|
|
};
|
|
|
|
+static const struct of_device_id bcm2835_pinctrl_match[] = {
|
|
+ {
|
|
+ .compatible = "brcm,bcm2835-gpio",
|
|
+ .data = &bcm2835_pinconf_ops,
|
|
+ },
|
|
+ {
|
|
+ .compatible = "brcm,bcm2711-gpio",
|
|
+ .data = &bcm2711_pinconf_ops,
|
|
+ },
|
|
+ {}
|
|
+};
|
|
+
|
|
static int bcm2835_pinctrl_probe(struct platform_device *pdev)
|
|
{
|
|
struct device *dev = &pdev->dev;
|
|
@@ -997,6 +1089,8 @@ static int bcm2835_pinctrl_probe(struct
|
|
struct bcm2835_pinctrl *pc;
|
|
struct resource iomem;
|
|
int err, i;
|
|
+ const struct of_device_id *match;
|
|
+
|
|
BUILD_BUG_ON(ARRAY_SIZE(bcm2835_gpio_pins) != BCM2835_NUM_GPIOS);
|
|
BUILD_BUG_ON(ARRAY_SIZE(bcm2835_gpio_groups) != BCM2835_NUM_GPIOS);
|
|
|
|
@@ -1073,6 +1167,12 @@ static int bcm2835_pinctrl_probe(struct
|
|
bcm2835_gpio_irq_handler);
|
|
}
|
|
|
|
+ match = of_match_node(bcm2835_pinctrl_match, pdev->dev.of_node);
|
|
+ if (match) {
|
|
+ bcm2835_pinctrl_desc.confops =
|
|
+ (const struct pinconf_ops *)match->data;
|
|
+ }
|
|
+
|
|
pc->pctl_dev = devm_pinctrl_register(dev, &bcm2835_pinctrl_desc, pc);
|
|
if (IS_ERR(pc->pctl_dev)) {
|
|
gpiochip_remove(&pc->gpio_chip);
|
|
@@ -1087,11 +1187,6 @@ static int bcm2835_pinctrl_probe(struct
|
|
return 0;
|
|
}
|
|
|
|
-static const struct of_device_id bcm2835_pinctrl_match[] = {
|
|
- { .compatible = "brcm,bcm2835-gpio" },
|
|
- {}
|
|
-};
|
|
-
|
|
static struct platform_driver bcm2835_pinctrl_driver = {
|
|
.probe = bcm2835_pinctrl_probe,
|
|
.driver = {
|