This change adds the following optional DT properties: number-gpios: Number of GPIOs the device should expose gpio-base: GPIO base that is registered with the kernel firmware-gpio-base: GPIO bases as viewed by the firmware The purpose of these DT nodes is to make the driver more general. Signed-off-by: Michael Zoran <mzoran@xxxxxxxxxxxx> --- .../bcm2835-firmware-gpio/gpio-bcm-exp.c | 40 ++++++++++++++++------ 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/drivers/staging/vc04_services/bcm2835-firmware-gpio/gpio-bcm-exp.c b/drivers/staging/vc04_services/bcm2835-firmware-gpio/gpio-bcm-exp.c index ba9750107957..f6719c84ed8b 100644 --- a/drivers/staging/vc04_services/bcm2835-firmware-gpio/gpio-bcm-exp.c +++ b/drivers/staging/vc04_services/bcm2835-firmware-gpio/gpio-bcm-exp.c @@ -23,12 +23,15 @@ #include <soc/bcm2835/raspberrypi-firmware.h> #define MODULE_NAME "brcmexp-gpio" -#define NUM_GPIO 8 +#define DEFAULT_NUM_GPIO 8 +#define DEFAULT_GPIO_BASE 128 +#define DEFAULT_FIRMWARE_GPIO_BASE 128 struct brcmexp_gpio { struct gpio_chip gc; struct device *dev; struct rpi_firmware *fw; + u32 firmware_gpio_base; }; struct gpio_set_config { @@ -58,7 +61,7 @@ static int brcmexp_gpio_get_polarity(struct gpio_chip *gc, unsigned int off) gpio = container_of(gc, struct brcmexp_gpio, gc); - get.gpio = off + gpio->gc.base; /* GPIO to update */ + get.gpio = off + gpio->firmware_gpio_base; ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_GET_GPIO_CONFIG, &get, sizeof(get)); @@ -78,7 +81,7 @@ static int brcmexp_gpio_dir_in(struct gpio_chip *gc, unsigned int off) gpio = container_of(gc, struct brcmexp_gpio, gc); - set_in.gpio = off + gpio->gc.base; /* GPIO to update */ + set_in.gpio = off + gpio->firmware_gpio_base; set_in.direction = 0; /* Input */ set_in.polarity = brcmexp_gpio_get_polarity(gc, off); /* Retain existing setting */ @@ -105,7 +108,7 @@ static int brcmexp_gpio_dir_out(struct gpio_chip *gc, unsigned int off, int val) gpio = container_of(gc, struct brcmexp_gpio, gc); - set_out.gpio = off + gpio->gc.base; /* GPIO to update */ + set_out.gpio = off + gpio->firmware_gpio_base; set_out.direction = 1; /* Output */ set_out.polarity = brcmexp_gpio_get_polarity(gc, off); /* Retain existing setting */ @@ -131,7 +134,7 @@ static int brcmexp_gpio_get_direction(struct gpio_chip *gc, unsigned int off) gpio = container_of(gc, struct brcmexp_gpio, gc); - get.gpio = off + gpio->gc.base; /* GPIO to update */ + get.gpio = off + gpio->firmware_gpio_base; ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_GET_GPIO_CONFIG, &get, sizeof(get)); @@ -151,7 +154,7 @@ static int brcmexp_gpio_get(struct gpio_chip *gc, unsigned int off) gpio = container_of(gc, struct brcmexp_gpio, gc); - get.gpio = off + gpio->gc.base; /* GPIO to update */ + get.gpio = off + gpio->firmware_gpio_base; get.state = 0; /* storage for returned value */ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_GET_GPIO_STATE, @@ -172,9 +175,7 @@ static void brcmexp_gpio_set(struct gpio_chip *gc, unsigned int off, int val) gpio = container_of(gc, struct brcmexp_gpio, gc); - off += gpio->gc.base; - - set.gpio = off + gpio->gc.base; /* GPIO to update */ + set.gpio = off + gpio->firmware_gpio_base; set.state = val; /* Output state */ ret = rpi_firmware_property(gpio->fw, RPI_FIRMWARE_SET_GPIO_STATE, @@ -212,8 +213,8 @@ static int brcmexp_gpio_probe(struct platform_device *pdev) ucb->gc.label = MODULE_NAME; ucb->gc.owner = THIS_MODULE; ucb->gc.of_node = np; - ucb->gc.base = 128; - ucb->gc.ngpio = NUM_GPIO; + ucb->gc.base = DEFAULT_GPIO_BASE; + ucb->gc.ngpio = DEFAULT_NUM_GPIO; ucb->gc.direction_input = brcmexp_gpio_dir_in; ucb->gc.direction_output = brcmexp_gpio_dir_out; @@ -222,6 +223,23 @@ static int brcmexp_gpio_probe(struct platform_device *pdev) ucb->gc.set = brcmexp_gpio_set; ucb->gc.can_sleep = true; + ucb->firmware_gpio_base = DEFAULT_FIRMWARE_GPIO_BASE; + + err = of_property_read_u16(dev->of_node, "number-gpios", + &ucb->gc.ngpio); + if (err) + dev_dbg(dev, "Failed to get DT property number-gpio"); + + err = of_property_read_u32(dev->of_node, "gpio-base", + &ucb->gc.base); + if (err) + dev_dbg(dev, "Failed to get DT property gpio-base"); + + err = of_property_read_u32(dev->of_node, "firmware-gpio-base", + &ucb->firmware_gpio_base); + if (err) + dev_dbg(dev, "Failed to get DT property firmware-gpio-base"); + err = gpiochip_add(&ucb->gc); if (err) return err; -- 2.11.0 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel