diff mbox

[v2,3/3] i.MX: Add GPIO devices to i.MX25 SOC

Message ID 4d657d751f29d4daaa38da73c5a69cebba697073.1441546955.git.jcd@tribudubois.net
State New
Headers show

Commit Message

Jean-Christophe Dubois Sept. 6, 2015, 8:46 p.m. UTC
Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
---

Changes since v1:
  * various coding style cleanup

 hw/arm/fsl-imx25.c         | 29 +++++++++++++++++++++++++++++
 include/hw/arm/fsl-imx25.h | 15 +++++++++++++++
 2 files changed, 44 insertions(+)

Comments

Peter Crosthwaite Sept. 7, 2015, 2:04 a.m. UTC | #1
On Sun, Sep 6, 2015 at 1:46 PM, Jean-Christophe Dubois
<jcd@tribudubois.net> wrote:
> Signed-off-by: Jean-Christophe Dubois <jcd@tribudubois.net>
> Reviewed-by: Peter Crosthwaite <crosthwaite.peter@gmail.com>
> ---
>
> Changes since v1:
>   * various coding style cleanup
>
>  hw/arm/fsl-imx25.c         | 29 +++++++++++++++++++++++++++++
>  include/hw/arm/fsl-imx25.h | 15 +++++++++++++++
>  2 files changed, 44 insertions(+)
>
> diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
> index 6d157c9..86fde42 100644
> --- a/hw/arm/fsl-imx25.c
> +++ b/hw/arm/fsl-imx25.c
> @@ -63,6 +63,11 @@ static void fsl_imx25_init(Object *obj)
>          object_initialize(&s->i2c[i], sizeof(s->i2c[i]), TYPE_IMX_I2C);
>          qdev_set_parent_bus(DEVICE(&s->i2c[i]), sysbus_get_default());
>      }
> +
> +    for (i = 0; i < FSL_IMX25_NUM_GPIOS; i++) {
> +        object_initialize(&s->gpio[i], sizeof(s->gpio[i]), TYPE_IMX_GPIO);
> +        qdev_set_parent_bus(DEVICE(&s->gpio[i]), sysbus_get_default());
> +    }
>  }
>
>  static void fsl_imx25_realize(DeviceState *dev, Error **errp)
> @@ -214,6 +219,30 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp)
>                                              i2c_table[i].irq));
>      }
>
> +    /* Initialize all GPIOs */
> +    for (i = 0; i < FSL_IMX25_NUM_GPIOS; i++) {
> +        static const struct {
> +            hwaddr addr;
> +            unsigned int irq;
> +        } gpio_table[FSL_IMX25_NUM_GPIOS] = {
> +            { FSL_IMX25_GPIO1_ADDR, FSL_IMX25_GPIO1_IRQ },
> +            { FSL_IMX25_GPIO2_ADDR, FSL_IMX25_GPIO2_IRQ },
> +            { FSL_IMX25_GPIO3_ADDR, FSL_IMX25_GPIO3_IRQ },
> +            { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
> +        };
> +
> +        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", &err);
> +        if (err) {
> +            error_propagate(errp, err);
> +            return;
> +        }

Same. Feel free to rely on the default value (prop should be false) in
one case of the other, but being explicit in both machine models is OK
as well.

Regards,
Peter

> +        sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
> +        /* Connect GPIO IRQ to PIC */
> +        sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
> +                           qdev_get_gpio_in(DEVICE(&s->avic),
> +                                            gpio_table[i].irq));
> +    }
> +
>      /* initialize 2 x 16 KB ROM */
>      memory_region_init_rom_device(&s->rom[0], NULL, NULL, NULL,
>                                    "imx25.rom0", FSL_IMX25_ROM0_SIZE, &err);
> diff --git a/include/hw/arm/fsl-imx25.h b/include/hw/arm/fsl-imx25.h
> index 7f6bb64..73f50c6 100644
> --- a/include/hw/arm/fsl-imx25.h
> +++ b/include/hw/arm/fsl-imx25.h
> @@ -25,6 +25,7 @@
>  #include "hw/timer/imx_epit.h"
>  #include "hw/net/imx_fec.h"
>  #include "hw/i2c/imx_i2c.h"
> +#include "hw/gpio/imx_gpio.h"
>  #include "exec/memory.h"
>
>  #define TYPE_FSL_IMX25 "fsl,imx25"
> @@ -34,6 +35,7 @@
>  #define FSL_IMX25_NUM_GPTS 4
>  #define FSL_IMX25_NUM_EPITS 2
>  #define FSL_IMX25_NUM_I2CS 3
> +#define FSL_IMX25_NUM_GPIOS 4
>
>  typedef struct FslIMX25State {
>      /*< private >*/
> @@ -48,6 +50,7 @@ typedef struct FslIMX25State {
>      IMXEPITState   epit[FSL_IMX25_NUM_EPITS];
>      IMXFECState    fec;
>      IMXI2CState    i2c[FSL_IMX25_NUM_I2CS];
> +    IMXGPIOState   gpio[FSL_IMX25_NUM_GPIOS];
>      MemoryRegion   rom[2];
>      MemoryRegion   iram;
>      MemoryRegion   iram_alias;
> @@ -204,6 +207,14 @@ typedef struct FslIMX25State {
>  #define FSL_IMX25_EPIT1_SIZE    0x4000
>  #define FSL_IMX25_EPIT2_ADDR    0x53F98000
>  #define FSL_IMX25_EPIT2_SIZE    0x4000
> +#define FSL_IMX25_GPIO4_ADDR    0x53F9C000
> +#define FSL_IMX25_GPIO4_SIZE    0x4000
> +#define FSL_IMX25_GPIO3_ADDR    0x53FA4000
> +#define FSL_IMX25_GPIO3_SIZE    0x4000
> +#define FSL_IMX25_GPIO1_ADDR    0x53FCC000
> +#define FSL_IMX25_GPIO1_SIZE    0x4000
> +#define FSL_IMX25_GPIO2_ADDR    0x53FD0000
> +#define FSL_IMX25_GPIO2_SIZE    0x4000
>  #define FSL_IMX25_AVIC_ADDR     0x68000000
>  #define FSL_IMX25_AVIC_SIZE     0x4000
>  #define FSL_IMX25_IRAM_ADDR     0x78000000
> @@ -230,5 +241,9 @@ typedef struct FslIMX25State {
>  #define FSL_IMX25_I2C1_IRQ      3
>  #define FSL_IMX25_I2C2_IRQ      4
>  #define FSL_IMX25_I2C3_IRQ      10
> +#define FSL_IMX25_GPIO1_IRQ     52
> +#define FSL_IMX25_GPIO2_IRQ     51
> +#define FSL_IMX25_GPIO3_IRQ     16
> +#define FSL_IMX25_GPIO4_IRQ     23
>
>  #endif /* FSL_IMX25_H */
> --
> 2.1.4
>
diff mbox

Patch

diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
index 6d157c9..86fde42 100644
--- a/hw/arm/fsl-imx25.c
+++ b/hw/arm/fsl-imx25.c
@@ -63,6 +63,11 @@  static void fsl_imx25_init(Object *obj)
         object_initialize(&s->i2c[i], sizeof(s->i2c[i]), TYPE_IMX_I2C);
         qdev_set_parent_bus(DEVICE(&s->i2c[i]), sysbus_get_default());
     }
+
+    for (i = 0; i < FSL_IMX25_NUM_GPIOS; i++) {
+        object_initialize(&s->gpio[i], sizeof(s->gpio[i]), TYPE_IMX_GPIO);
+        qdev_set_parent_bus(DEVICE(&s->gpio[i]), sysbus_get_default());
+    }
 }
 
 static void fsl_imx25_realize(DeviceState *dev, Error **errp)
@@ -214,6 +219,30 @@  static void fsl_imx25_realize(DeviceState *dev, Error **errp)
                                             i2c_table[i].irq));
     }
 
+    /* Initialize all GPIOs */
+    for (i = 0; i < FSL_IMX25_NUM_GPIOS; i++) {
+        static const struct {
+            hwaddr addr;
+            unsigned int irq;
+        } gpio_table[FSL_IMX25_NUM_GPIOS] = {
+            { FSL_IMX25_GPIO1_ADDR, FSL_IMX25_GPIO1_IRQ },
+            { FSL_IMX25_GPIO2_ADDR, FSL_IMX25_GPIO2_IRQ },
+            { FSL_IMX25_GPIO3_ADDR, FSL_IMX25_GPIO3_IRQ },
+            { FSL_IMX25_GPIO4_ADDR, FSL_IMX25_GPIO4_IRQ }
+        };
+
+        object_property_set_bool(OBJECT(&s->gpio[i]), true, "realized", &err);
+        if (err) {
+            error_propagate(errp, err);
+            return;
+        }
+        sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, gpio_table[i].addr);
+        /* Connect GPIO IRQ to PIC */
+        sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio[i]), 0,
+                           qdev_get_gpio_in(DEVICE(&s->avic),
+                                            gpio_table[i].irq));
+    }
+
     /* initialize 2 x 16 KB ROM */
     memory_region_init_rom_device(&s->rom[0], NULL, NULL, NULL,
                                   "imx25.rom0", FSL_IMX25_ROM0_SIZE, &err);
diff --git a/include/hw/arm/fsl-imx25.h b/include/hw/arm/fsl-imx25.h
index 7f6bb64..73f50c6 100644
--- a/include/hw/arm/fsl-imx25.h
+++ b/include/hw/arm/fsl-imx25.h
@@ -25,6 +25,7 @@ 
 #include "hw/timer/imx_epit.h"
 #include "hw/net/imx_fec.h"
 #include "hw/i2c/imx_i2c.h"
+#include "hw/gpio/imx_gpio.h"
 #include "exec/memory.h"
 
 #define TYPE_FSL_IMX25 "fsl,imx25"
@@ -34,6 +35,7 @@ 
 #define FSL_IMX25_NUM_GPTS 4
 #define FSL_IMX25_NUM_EPITS 2
 #define FSL_IMX25_NUM_I2CS 3
+#define FSL_IMX25_NUM_GPIOS 4
 
 typedef struct FslIMX25State {
     /*< private >*/
@@ -48,6 +50,7 @@  typedef struct FslIMX25State {
     IMXEPITState   epit[FSL_IMX25_NUM_EPITS];
     IMXFECState    fec;
     IMXI2CState    i2c[FSL_IMX25_NUM_I2CS];
+    IMXGPIOState   gpio[FSL_IMX25_NUM_GPIOS];
     MemoryRegion   rom[2];
     MemoryRegion   iram;
     MemoryRegion   iram_alias;
@@ -204,6 +207,14 @@  typedef struct FslIMX25State {
 #define FSL_IMX25_EPIT1_SIZE    0x4000
 #define FSL_IMX25_EPIT2_ADDR    0x53F98000
 #define FSL_IMX25_EPIT2_SIZE    0x4000
+#define FSL_IMX25_GPIO4_ADDR    0x53F9C000
+#define FSL_IMX25_GPIO4_SIZE    0x4000
+#define FSL_IMX25_GPIO3_ADDR    0x53FA4000
+#define FSL_IMX25_GPIO3_SIZE    0x4000
+#define FSL_IMX25_GPIO1_ADDR    0x53FCC000
+#define FSL_IMX25_GPIO1_SIZE    0x4000
+#define FSL_IMX25_GPIO2_ADDR    0x53FD0000
+#define FSL_IMX25_GPIO2_SIZE    0x4000
 #define FSL_IMX25_AVIC_ADDR     0x68000000
 #define FSL_IMX25_AVIC_SIZE     0x4000
 #define FSL_IMX25_IRAM_ADDR     0x78000000
@@ -230,5 +241,9 @@  typedef struct FslIMX25State {
 #define FSL_IMX25_I2C1_IRQ      3
 #define FSL_IMX25_I2C2_IRQ      4
 #define FSL_IMX25_I2C3_IRQ      10
+#define FSL_IMX25_GPIO1_IRQ     52
+#define FSL_IMX25_GPIO2_IRQ     51
+#define FSL_IMX25_GPIO3_IRQ     16
+#define FSL_IMX25_GPIO4_IRQ     23
 
 #endif /* FSL_IMX25_H */