linux/arch/arm/mach-omap1/gpio7xx.c
<<
>>
Prefs
   1/*
   2 * OMAP7xx specific gpio init
   3 *
   4 * Copyright (C) 2010 Texas Instruments Incorporated - https://www.ti.com/
   5 *
   6 * Author:
   7 *      Charulatha V <charu@ti.com>
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License as
  11 * published by the Free Software Foundation version 2.
  12 *
  13 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  14 * kind, whether express or implied; without even the implied warranty
  15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 */
  18
  19#include <linux/gpio.h>
  20#include <linux/platform_data/gpio-omap.h>
  21
  22#include <mach/irqs.h>
  23
  24#include "soc.h"
  25
  26#define OMAP7XX_GPIO1_BASE              0xfffbc000
  27#define OMAP7XX_GPIO2_BASE              0xfffbc800
  28#define OMAP7XX_GPIO3_BASE              0xfffbd000
  29#define OMAP7XX_GPIO4_BASE              0xfffbd800
  30#define OMAP7XX_GPIO5_BASE              0xfffbe000
  31#define OMAP7XX_GPIO6_BASE              0xfffbe800
  32#define OMAP1_MPUIO_VBASE               OMAP1_MPUIO_BASE
  33
  34/* mpu gpio */
  35static struct resource omap7xx_mpu_gpio_resources[] = {
  36        {
  37                .start  = OMAP1_MPUIO_VBASE,
  38                .end    = OMAP1_MPUIO_VBASE + SZ_2K - 1,
  39                .flags  = IORESOURCE_MEM,
  40        },
  41        {
  42                .start  = INT_7XX_MPUIO,
  43                .flags  = IORESOURCE_IRQ,
  44        },
  45};
  46
  47static struct omap_gpio_reg_offs omap7xx_mpuio_regs = {
  48        .revision       = USHRT_MAX,
  49        .direction      = OMAP_MPUIO_IO_CNTL / 2,
  50        .datain         = OMAP_MPUIO_INPUT_LATCH / 2,
  51        .dataout        = OMAP_MPUIO_OUTPUT / 2,
  52        .irqstatus      = OMAP_MPUIO_GPIO_INT / 2,
  53        .irqenable      = OMAP_MPUIO_GPIO_MASKIT / 2,
  54        .irqenable_inv  = true,
  55        .irqctrl        = OMAP_MPUIO_GPIO_INT_EDGE >> 1,
  56};
  57
  58static struct omap_gpio_platform_data omap7xx_mpu_gpio_config = {
  59        .is_mpuio               = true,
  60        .bank_width             = 16,
  61        .bank_stride            = 2,
  62        .regs                   = &omap7xx_mpuio_regs,
  63};
  64
  65static struct platform_device omap7xx_mpu_gpio = {
  66        .name           = "omap_gpio",
  67        .id             = 0,
  68        .dev            = {
  69                .platform_data = &omap7xx_mpu_gpio_config,
  70        },
  71        .num_resources = ARRAY_SIZE(omap7xx_mpu_gpio_resources),
  72        .resource = omap7xx_mpu_gpio_resources,
  73};
  74
  75/* gpio1 */
  76static struct resource omap7xx_gpio1_resources[] = {
  77        {
  78                .start  = OMAP7XX_GPIO1_BASE,
  79                .end    = OMAP7XX_GPIO1_BASE + SZ_2K - 1,
  80                .flags  = IORESOURCE_MEM,
  81        },
  82        {
  83                .start  = INT_7XX_GPIO_BANK1,
  84                .flags  = IORESOURCE_IRQ,
  85        },
  86};
  87
  88static struct omap_gpio_reg_offs omap7xx_gpio_regs = {
  89        .revision       = USHRT_MAX,
  90        .direction      = OMAP7XX_GPIO_DIR_CONTROL,
  91        .datain         = OMAP7XX_GPIO_DATA_INPUT,
  92        .dataout        = OMAP7XX_GPIO_DATA_OUTPUT,
  93        .irqstatus      = OMAP7XX_GPIO_INT_STATUS,
  94        .irqenable      = OMAP7XX_GPIO_INT_MASK,
  95        .irqenable_inv  = true,
  96        .irqctrl        = OMAP7XX_GPIO_INT_CONTROL,
  97};
  98
  99static struct omap_gpio_platform_data omap7xx_gpio1_config = {
 100        .bank_width             = 32,
 101        .regs                   = &omap7xx_gpio_regs,
 102};
 103
 104static struct platform_device omap7xx_gpio1 = {
 105        .name           = "omap_gpio",
 106        .id             = 1,
 107        .dev            = {
 108                .platform_data = &omap7xx_gpio1_config,
 109        },
 110        .num_resources = ARRAY_SIZE(omap7xx_gpio1_resources),
 111        .resource = omap7xx_gpio1_resources,
 112};
 113
 114/* gpio2 */
 115static struct resource omap7xx_gpio2_resources[] = {
 116        {
 117                .start  = OMAP7XX_GPIO2_BASE,
 118                .end    = OMAP7XX_GPIO2_BASE + SZ_2K - 1,
 119                .flags  = IORESOURCE_MEM,
 120        },
 121        {
 122                .start  = INT_7XX_GPIO_BANK2,
 123                .flags  = IORESOURCE_IRQ,
 124        },
 125};
 126
 127static struct omap_gpio_platform_data omap7xx_gpio2_config = {
 128        .bank_width             = 32,
 129        .regs                   = &omap7xx_gpio_regs,
 130};
 131
 132static struct platform_device omap7xx_gpio2 = {
 133        .name           = "omap_gpio",
 134        .id             = 2,
 135        .dev            = {
 136                .platform_data = &omap7xx_gpio2_config,
 137        },
 138        .num_resources = ARRAY_SIZE(omap7xx_gpio2_resources),
 139        .resource = omap7xx_gpio2_resources,
 140};
 141
 142/* gpio3 */
 143static struct resource omap7xx_gpio3_resources[] = {
 144        {
 145                .start  = OMAP7XX_GPIO3_BASE,
 146                .end    = OMAP7XX_GPIO3_BASE + SZ_2K - 1,
 147                .flags  = IORESOURCE_MEM,
 148        },
 149        {
 150                .start  = INT_7XX_GPIO_BANK3,
 151                .flags  = IORESOURCE_IRQ,
 152        },
 153};
 154
 155static struct omap_gpio_platform_data omap7xx_gpio3_config = {
 156        .bank_width             = 32,
 157        .regs                   = &omap7xx_gpio_regs,
 158};
 159
 160static struct platform_device omap7xx_gpio3 = {
 161        .name           = "omap_gpio",
 162        .id             = 3,
 163        .dev            = {
 164                .platform_data = &omap7xx_gpio3_config,
 165        },
 166        .num_resources = ARRAY_SIZE(omap7xx_gpio3_resources),
 167        .resource = omap7xx_gpio3_resources,
 168};
 169
 170/* gpio4 */
 171static struct resource omap7xx_gpio4_resources[] = {
 172        {
 173                .start  = OMAP7XX_GPIO4_BASE,
 174                .end    = OMAP7XX_GPIO4_BASE + SZ_2K - 1,
 175                .flags  = IORESOURCE_MEM,
 176        },
 177        {
 178                .start  = INT_7XX_GPIO_BANK4,
 179                .flags  = IORESOURCE_IRQ,
 180        },
 181};
 182
 183static struct omap_gpio_platform_data omap7xx_gpio4_config = {
 184        .bank_width             = 32,
 185        .regs                   = &omap7xx_gpio_regs,
 186};
 187
 188static struct platform_device omap7xx_gpio4 = {
 189        .name           = "omap_gpio",
 190        .id             = 4,
 191        .dev            = {
 192                .platform_data = &omap7xx_gpio4_config,
 193        },
 194        .num_resources = ARRAY_SIZE(omap7xx_gpio4_resources),
 195        .resource = omap7xx_gpio4_resources,
 196};
 197
 198/* gpio5 */
 199static struct resource omap7xx_gpio5_resources[] = {
 200        {
 201                .start  = OMAP7XX_GPIO5_BASE,
 202                .end    = OMAP7XX_GPIO5_BASE + SZ_2K - 1,
 203                .flags  = IORESOURCE_MEM,
 204        },
 205        {
 206                .start  = INT_7XX_GPIO_BANK5,
 207                .flags  = IORESOURCE_IRQ,
 208        },
 209};
 210
 211static struct omap_gpio_platform_data omap7xx_gpio5_config = {
 212        .bank_width             = 32,
 213        .regs                   = &omap7xx_gpio_regs,
 214};
 215
 216static struct platform_device omap7xx_gpio5 = {
 217        .name           = "omap_gpio",
 218        .id             = 5,
 219        .dev            = {
 220                .platform_data = &omap7xx_gpio5_config,
 221        },
 222        .num_resources = ARRAY_SIZE(omap7xx_gpio5_resources),
 223        .resource = omap7xx_gpio5_resources,
 224};
 225
 226/* gpio6 */
 227static struct resource omap7xx_gpio6_resources[] = {
 228        {
 229                .start  = OMAP7XX_GPIO6_BASE,
 230                .end    = OMAP7XX_GPIO6_BASE + SZ_2K - 1,
 231                .flags  = IORESOURCE_MEM,
 232        },
 233        {
 234                .start  = INT_7XX_GPIO_BANK6,
 235                .flags  = IORESOURCE_IRQ,
 236        },
 237};
 238
 239static struct omap_gpio_platform_data omap7xx_gpio6_config = {
 240        .bank_width             = 32,
 241        .regs                   = &omap7xx_gpio_regs,
 242};
 243
 244static struct platform_device omap7xx_gpio6 = {
 245        .name           = "omap_gpio",
 246        .id             = 6,
 247        .dev            = {
 248                .platform_data = &omap7xx_gpio6_config,
 249        },
 250        .num_resources = ARRAY_SIZE(omap7xx_gpio6_resources),
 251        .resource = omap7xx_gpio6_resources,
 252};
 253
 254static struct platform_device *omap7xx_gpio_dev[] __initdata = {
 255        &omap7xx_mpu_gpio,
 256        &omap7xx_gpio1,
 257        &omap7xx_gpio2,
 258        &omap7xx_gpio3,
 259        &omap7xx_gpio4,
 260        &omap7xx_gpio5,
 261        &omap7xx_gpio6,
 262};
 263
 264/*
 265 * omap7xx_gpio_init needs to be done before
 266 * machine_init functions access gpio APIs.
 267 * Hence omap7xx_gpio_init is a postcore_initcall.
 268 */
 269static int __init omap7xx_gpio_init(void)
 270{
 271        int i;
 272
 273        if (!cpu_is_omap7xx())
 274                return -EINVAL;
 275
 276        for (i = 0; i < ARRAY_SIZE(omap7xx_gpio_dev); i++)
 277                platform_device_register(omap7xx_gpio_dev[i]);
 278
 279        return 0;
 280}
 281postcore_initcall(omap7xx_gpio_init);
 282