diff options
author | Anup Patel <apatel@ventanamicro.com> | 2023-04-19 16:49:19 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2023-06-05 15:55:29 +0530 |
commit | fa5ad2e6f9e9c77b69cdf2506da753c8bad9509d (patch) | |
tree | b50f1f50e4025a2a57993462c4af42a1cdca3b6f | |
parent | 66daafe3ba210eec78900269817ee504ffa9c212 (diff) | |
download | opensbi-fa5ad2e6f9e9c77b69cdf2506da753c8bad9509d.zip opensbi-fa5ad2e6f9e9c77b69cdf2506da753c8bad9509d.tar.gz opensbi-fa5ad2e6f9e9c77b69cdf2506da753c8bad9509d.tar.bz2 |
lib: utils/gpio: Use heap in SiFive and StartFive GPIO drivers
Let's use heap allocation in SiFive and Starfive GPIO drivers
instead of using a fixed size global array.
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
-rw-r--r-- | lib/utils/gpio/fdt_gpio_sifive.c | 21 | ||||
-rw-r--r-- | lib/utils/gpio/fdt_gpio_starfive.c | 20 |
2 files changed, 20 insertions, 21 deletions
diff --git a/lib/utils/gpio/fdt_gpio_sifive.c b/lib/utils/gpio/fdt_gpio_sifive.c index 677f0fa..5e3f39d 100644 --- a/lib/utils/gpio/fdt_gpio_sifive.c +++ b/lib/utils/gpio/fdt_gpio_sifive.c @@ -9,11 +9,10 @@ #include <sbi/riscv_io.h> #include <sbi/sbi_error.h> +#include <sbi/sbi_heap.h> #include <sbi_utils/fdt/fdt_helper.h> #include <sbi_utils/gpio/fdt_gpio.h> -#define SIFIVE_GPIO_CHIP_MAX 2 - #define SIFIVE_GPIO_PINS_MIN 1 #define SIFIVE_GPIO_PINS_MAX 32 #define SIFIVE_GPIO_PINS_DEF 16 @@ -27,9 +26,6 @@ struct sifive_gpio_chip { struct gpio_chip chip; }; -static unsigned int sifive_gpio_chip_count; -static struct sifive_gpio_chip sifive_gpio_chip_array[SIFIVE_GPIO_CHIP_MAX]; - static int sifive_gpio_direction_output(struct gpio_pin *gp, int value) { unsigned int v; @@ -73,13 +69,15 @@ static int sifive_gpio_init(void *fdt, int nodeoff, u32 phandle, struct sifive_gpio_chip *chip; uint64_t addr; - if (SIFIVE_GPIO_CHIP_MAX <= sifive_gpio_chip_count) - return SBI_ENOSPC; - chip = &sifive_gpio_chip_array[sifive_gpio_chip_count]; + chip = sbi_zalloc(sizeof(*chip)); + if (!chip) + return SBI_ENOMEM; rc = fdt_get_node_addr_size(fdt, nodeoff, 0, &addr, NULL); - if (rc) + if (rc) { + sbi_free(chip); return rc; + } chip->addr = addr; chip->chip.driver = &fdt_gpio_sifive; @@ -88,10 +86,11 @@ static int sifive_gpio_init(void *fdt, int nodeoff, u32 phandle, chip->chip.direction_output = sifive_gpio_direction_output; chip->chip.set = sifive_gpio_set; rc = gpio_chip_add(&chip->chip); - if (rc) + if (rc) { + sbi_free(chip); return rc; + } - sifive_gpio_chip_count++; return 0; } diff --git a/lib/utils/gpio/fdt_gpio_starfive.c b/lib/utils/gpio/fdt_gpio_starfive.c index 18cca72..f430b13 100644 --- a/lib/utils/gpio/fdt_gpio_starfive.c +++ b/lib/utils/gpio/fdt_gpio_starfive.c @@ -9,11 +9,11 @@ #include <sbi/riscv_io.h> #include <sbi/sbi_error.h> +#include <sbi/sbi_heap.h> #include <sbi/sbi_console.h> #include <sbi_utils/fdt/fdt_helper.h> #include <sbi_utils/gpio/fdt_gpio.h> -#define STARFIVE_GPIO_CHIP_MAX 2 #define STARFIVE_GPIO_PINS_DEF 64 #define STARFIVE_GPIO_OUTVAL 0x40 #define STARFIVE_GPIO_MASK 0xff @@ -25,9 +25,6 @@ struct starfive_gpio_chip { struct gpio_chip chip; }; -static unsigned int starfive_gpio_chip_count; -static struct starfive_gpio_chip starfive_gpio_chip_array[STARFIVE_GPIO_CHIP_MAX]; - static int starfive_gpio_direction_output(struct gpio_pin *gp, int value) { u32 val; @@ -82,13 +79,15 @@ static int starfive_gpio_init(void *fdt, int nodeoff, u32 phandle, struct starfive_gpio_chip *chip; u64 addr; - if (starfive_gpio_chip_count >= STARFIVE_GPIO_CHIP_MAX) - return SBI_ENOSPC; - chip = &starfive_gpio_chip_array[starfive_gpio_chip_count]; + chip = sbi_zalloc(sizeof(*chip)); + if (!chip) + return SBI_ENOMEM; rc = fdt_get_node_addr_size(fdt, nodeoff, 0, &addr, NULL); - if (rc) + if (rc) { + sbi_free(chip); return rc; + } chip->addr = addr; chip->chip.driver = &fdt_gpio_starfive; @@ -97,10 +96,11 @@ static int starfive_gpio_init(void *fdt, int nodeoff, u32 phandle, chip->chip.direction_output = starfive_gpio_direction_output; chip->chip.set = starfive_gpio_set; rc = gpio_chip_add(&chip->chip); - if (rc) + if (rc) { + sbi_free(chip); return rc; + } - starfive_gpio_chip_count++; return 0; } |