linux/arch/m68knommu/platform/532x/gpio.c
<<
>>
Prefs
   1/*
   2 * Coldfire generic GPIO support
   3 *
   4 * (C) Copyright 2009, Steven King <sfking@fdwdc.com>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; version 2 of the License.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14*/
  15
  16#include <linux/kernel.h>
  17#include <linux/init.h>
  18
  19#include <asm/coldfire.h>
  20#include <asm/mcfsim.h>
  21#include <asm/mcfgpio.h>
  22
  23static struct mcf_gpio_chip mcf_gpio_chips[] = {
  24        {
  25                .gpio_chip                      = {
  26                        .label                  = "PIRQ",
  27                        .request                = mcf_gpio_request,
  28                        .free                   = mcf_gpio_free,
  29                        .direction_input        = mcf_gpio_direction_input,
  30                        .direction_output       = mcf_gpio_direction_output,
  31                        .get                    = mcf_gpio_get_value,
  32                        .set                    = mcf_gpio_set_value,
  33                        .ngpio                  = 8,
  34                },
  35                .pddr                           = MCFEPORT_EPDDR,
  36                .podr                           = MCFEPORT_EPDR,
  37                .ppdr                           = MCFEPORT_EPPDR,
  38        },
  39        {
  40                .gpio_chip                      = {
  41                        .label                  = "FECH",
  42                        .request                = mcf_gpio_request,
  43                        .free                   = mcf_gpio_free,
  44                        .direction_input        = mcf_gpio_direction_input,
  45                        .direction_output       = mcf_gpio_direction_output,
  46                        .get                    = mcf_gpio_get_value,
  47                        .set                    = mcf_gpio_set_value_fast,
  48                        .base                   = 8,
  49                        .ngpio                  = 8,
  50                },
  51                .pddr                           = MCFGPIO_PDDR_FECH,
  52                .podr                           = MCFGPIO_PODR_FECH,
  53                .ppdr                           = MCFGPIO_PPDSDR_FECH,
  54                .setr                           = MCFGPIO_PPDSDR_FECH,
  55                .clrr                           = MCFGPIO_PCLRR_FECH,
  56        },
  57        {
  58                .gpio_chip                      = {
  59                        .label                  = "FECL",
  60                        .request                = mcf_gpio_request,
  61                        .free                   = mcf_gpio_free,
  62                        .direction_input        = mcf_gpio_direction_input,
  63                        .direction_output       = mcf_gpio_direction_output,
  64                        .get                    = mcf_gpio_get_value,
  65                        .set                    = mcf_gpio_set_value_fast,
  66                        .base                   = 16,
  67                        .ngpio                  = 8,
  68                },
  69                .pddr                           = MCFGPIO_PDDR_FECL,
  70                .podr                           = MCFGPIO_PODR_FECL,
  71                .ppdr                           = MCFGPIO_PPDSDR_FECL,
  72                .setr                           = MCFGPIO_PPDSDR_FECL,
  73                .clrr                           = MCFGPIO_PCLRR_FECL,
  74        },
  75        {
  76                .gpio_chip                      = {
  77                        .label                  = "SSI",
  78                        .request                = mcf_gpio_request,
  79                        .free                   = mcf_gpio_free,
  80                        .direction_input        = mcf_gpio_direction_input,
  81                        .direction_output       = mcf_gpio_direction_output,
  82                        .get                    = mcf_gpio_get_value,
  83                        .set                    = mcf_gpio_set_value_fast,
  84                        .base                   = 24,
  85                        .ngpio                  = 5,
  86                },
  87                .pddr                           = MCFGPIO_PDDR_SSI,
  88                .podr                           = MCFGPIO_PODR_SSI,
  89                .ppdr                           = MCFGPIO_PPDSDR_SSI,
  90                .setr                           = MCFGPIO_PPDSDR_SSI,
  91                .clrr                           = MCFGPIO_PCLRR_SSI,
  92        },
  93        {
  94                .gpio_chip                      = {
  95                        .label                  = "BUSCTL",
  96                        .request                = mcf_gpio_request,
  97                        .free                   = mcf_gpio_free,
  98                        .direction_input        = mcf_gpio_direction_input,
  99                        .direction_output       = mcf_gpio_direction_output,
 100                        .get                    = mcf_gpio_get_value,
 101                        .set                    = mcf_gpio_set_value_fast,
 102                        .base                   = 32,
 103                        .ngpio                  = 4,
 104                },
 105                .pddr                           = MCFGPIO_PDDR_BUSCTL,
 106                .podr                           = MCFGPIO_PODR_BUSCTL,
 107                .ppdr                           = MCFGPIO_PPDSDR_BUSCTL,
 108                .setr                           = MCFGPIO_PPDSDR_BUSCTL,
 109                .clrr                           = MCFGPIO_PCLRR_BUSCTL,
 110        },
 111        {
 112                .gpio_chip                      = {
 113                        .label                  = "BE",
 114                        .request                = mcf_gpio_request,
 115                        .free                   = mcf_gpio_free,
 116                        .direction_input        = mcf_gpio_direction_input,
 117                        .direction_output       = mcf_gpio_direction_output,
 118                        .get                    = mcf_gpio_get_value,
 119                        .set                    = mcf_gpio_set_value_fast,
 120                        .base                   = 40,
 121                        .ngpio                  = 4,
 122                },
 123                .pddr                           = MCFGPIO_PDDR_BE,
 124                .podr                           = MCFGPIO_PODR_BE,
 125                .ppdr                           = MCFGPIO_PPDSDR_BE,
 126                .setr                           = MCFGPIO_PPDSDR_BE,
 127                .clrr                           = MCFGPIO_PCLRR_BE,
 128        },
 129        {
 130                .gpio_chip                      = {
 131                        .label                  = "CS",
 132                        .request                = mcf_gpio_request,
 133                        .free                   = mcf_gpio_free,
 134                        .direction_input        = mcf_gpio_direction_input,
 135                        .direction_output       = mcf_gpio_direction_output,
 136                        .get                    = mcf_gpio_get_value,
 137                        .set                    = mcf_gpio_set_value_fast,
 138                        .base                   = 49,
 139                        .ngpio                  = 5,
 140                },
 141                .pddr                           = MCFGPIO_PDDR_CS,
 142                .podr                           = MCFGPIO_PODR_CS,
 143                .ppdr                           = MCFGPIO_PPDSDR_CS,
 144                .setr                           = MCFGPIO_PPDSDR_CS,
 145                .clrr                           = MCFGPIO_PCLRR_CS,
 146        },
 147        {
 148                .gpio_chip                      = {
 149                        .label                  = "PWM",
 150                        .request                = mcf_gpio_request,
 151                        .free                   = mcf_gpio_free,
 152                        .direction_input        = mcf_gpio_direction_input,
 153                        .direction_output       = mcf_gpio_direction_output,
 154                        .get                    = mcf_gpio_get_value,
 155                        .set                    = mcf_gpio_set_value_fast,
 156                        .base                   = 58,
 157                        .ngpio                  = 4,
 158                },
 159                .pddr                           = MCFGPIO_PDDR_PWM,
 160                .podr                           = MCFGPIO_PODR_PWM,
 161                .ppdr                           = MCFGPIO_PPDSDR_PWM,
 162                .setr                           = MCFGPIO_PPDSDR_PWM,
 163                .clrr                           = MCFGPIO_PCLRR_PWM,
 164        },
 165        {
 166                .gpio_chip                      = {
 167                        .label                  = "FECI2C",
 168                        .request                = mcf_gpio_request,
 169                        .free                   = mcf_gpio_free,
 170                        .direction_input        = mcf_gpio_direction_input,
 171                        .direction_output       = mcf_gpio_direction_output,
 172                        .get                    = mcf_gpio_get_value,
 173                        .set                    = mcf_gpio_set_value_fast,
 174                        .base                   = 64,
 175                        .ngpio                  = 4,
 176                },
 177                .pddr                           = MCFGPIO_PDDR_FECI2C,
 178                .podr                           = MCFGPIO_PODR_FECI2C,
 179                .ppdr                           = MCFGPIO_PPDSDR_FECI2C,
 180                .setr                           = MCFGPIO_PPDSDR_FECI2C,
 181                .clrr                           = MCFGPIO_PCLRR_FECI2C,
 182        },
 183        {
 184                .gpio_chip                      = {
 185                        .label                  = "UART",
 186                        .request                = mcf_gpio_request,
 187                        .free                   = mcf_gpio_free,
 188                        .direction_input        = mcf_gpio_direction_input,
 189                        .direction_output       = mcf_gpio_direction_output,
 190                        .get                    = mcf_gpio_get_value,
 191                        .set                    = mcf_gpio_set_value_fast,
 192                        .base                   = 72,
 193                        .ngpio                  = 8,
 194                },
 195                .pddr                           = MCFGPIO_PDDR_UART,
 196                .podr                           = MCFGPIO_PODR_UART,
 197                .ppdr                           = MCFGPIO_PPDSDR_UART,
 198                .setr                           = MCFGPIO_PPDSDR_UART,
 199                .clrr                           = MCFGPIO_PCLRR_UART,
 200        },
 201        {
 202                .gpio_chip                      = {
 203                        .label                  = "QSPI",
 204                        .request                = mcf_gpio_request,
 205                        .free                   = mcf_gpio_free,
 206                        .direction_input        = mcf_gpio_direction_input,
 207                        .direction_output       = mcf_gpio_direction_output,
 208                        .get                    = mcf_gpio_get_value,
 209                        .set                    = mcf_gpio_set_value_fast,
 210                        .base                   = 80,
 211                        .ngpio                  = 6,
 212                },
 213                .pddr                           = MCFGPIO_PDDR_QSPI,
 214                .podr                           = MCFGPIO_PODR_QSPI,
 215                .ppdr                           = MCFGPIO_PPDSDR_QSPI,
 216                .setr                           = MCFGPIO_PPDSDR_QSPI,
 217                .clrr                           = MCFGPIO_PCLRR_QSPI,
 218        },
 219        {
 220                .gpio_chip                      = {
 221                        .label                  = "TIMER",
 222                        .request                = mcf_gpio_request,
 223                        .free                   = mcf_gpio_free,
 224                        .direction_input        = mcf_gpio_direction_input,
 225                        .direction_output       = mcf_gpio_direction_output,
 226                        .get                    = mcf_gpio_get_value,
 227                        .set                    = mcf_gpio_set_value_fast,
 228                        .base                   = 88,
 229                        .ngpio                  = 4,
 230                },
 231                .pddr                           = MCFGPIO_PDDR_TIMER,
 232                .podr                           = MCFGPIO_PODR_TIMER,
 233                .ppdr                           = MCFGPIO_PPDSDR_TIMER,
 234                .setr                           = MCFGPIO_PPDSDR_TIMER,
 235                .clrr                           = MCFGPIO_PCLRR_TIMER,
 236        },
 237        {
 238                .gpio_chip                      = {
 239                        .label                  = "LCDDATAH",
 240                        .request                = mcf_gpio_request,
 241                        .free                   = mcf_gpio_free,
 242                        .direction_input        = mcf_gpio_direction_input,
 243                        .direction_output       = mcf_gpio_direction_output,
 244                        .get                    = mcf_gpio_get_value,
 245                        .set                    = mcf_gpio_set_value_fast,
 246                        .base                   = 96,
 247                        .ngpio                  = 2,
 248                },
 249                .pddr                           = MCFGPIO_PDDR_LCDDATAH,
 250                .podr                           = MCFGPIO_PODR_LCDDATAH,
 251                .ppdr                           = MCFGPIO_PPDSDR_LCDDATAH,
 252                .setr                           = MCFGPIO_PPDSDR_LCDDATAH,
 253                .clrr                           = MCFGPIO_PCLRR_LCDDATAH,
 254        },
 255        {
 256                .gpio_chip                      = {
 257                        .label                  = "LCDDATAM",
 258                        .request                = mcf_gpio_request,
 259                        .free                   = mcf_gpio_free,
 260                        .direction_input        = mcf_gpio_direction_input,
 261                        .direction_output       = mcf_gpio_direction_output,
 262                        .get                    = mcf_gpio_get_value,
 263                        .set                    = mcf_gpio_set_value_fast,
 264                        .base                   = 104,
 265                        .ngpio                  = 8,
 266                },
 267                .pddr                           = MCFGPIO_PDDR_LCDDATAM,
 268                .podr                           = MCFGPIO_PODR_LCDDATAM,
 269                .ppdr                           = MCFGPIO_PPDSDR_LCDDATAM,
 270                .setr                           = MCFGPIO_PPDSDR_LCDDATAM,
 271                .clrr                           = MCFGPIO_PCLRR_LCDDATAM,
 272        },
 273        {
 274                .gpio_chip                      = {
 275                        .label                  = "LCDDATAL",
 276                        .request                = mcf_gpio_request,
 277                        .free                   = mcf_gpio_free,
 278                        .direction_input        = mcf_gpio_direction_input,
 279                        .direction_output       = mcf_gpio_direction_output,
 280                        .get                    = mcf_gpio_get_value,
 281                        .set                    = mcf_gpio_set_value_fast,
 282                        .base                   = 112,
 283                        .ngpio                  = 8,
 284                },
 285                .pddr                           = MCFGPIO_PDDR_LCDDATAL,
 286                .podr                           = MCFGPIO_PODR_LCDDATAL,
 287                .ppdr                           = MCFGPIO_PPDSDR_LCDDATAL,
 288                .setr                           = MCFGPIO_PPDSDR_LCDDATAL,
 289                .clrr                           = MCFGPIO_PCLRR_LCDDATAL,
 290        },
 291        {
 292                .gpio_chip                      = {
 293                        .label                  = "LCDCTLH",
 294                        .request                = mcf_gpio_request,
 295                        .free                   = mcf_gpio_free,
 296                        .direction_input        = mcf_gpio_direction_input,
 297                        .direction_output       = mcf_gpio_direction_output,
 298                        .get                    = mcf_gpio_get_value,
 299                        .set                    = mcf_gpio_set_value_fast,
 300                        .base                   = 120,
 301                        .ngpio                  = 1,
 302                },
 303                .pddr                           = MCFGPIO_PDDR_LCDCTLH,
 304                .podr                           = MCFGPIO_PODR_LCDCTLH,
 305                .ppdr                           = MCFGPIO_PPDSDR_LCDCTLH,
 306                .setr                           = MCFGPIO_PPDSDR_LCDCTLH,
 307                .clrr                           = MCFGPIO_PCLRR_LCDCTLH,
 308        },
 309        {
 310                .gpio_chip                      = {
 311                        .label                  = "LCDCTLL",
 312                        .request                = mcf_gpio_request,
 313                        .free                   = mcf_gpio_free,
 314                        .direction_input        = mcf_gpio_direction_input,
 315                        .direction_output       = mcf_gpio_direction_output,
 316                        .get                    = mcf_gpio_get_value,
 317                        .set                    = mcf_gpio_set_value_fast,
 318                        .base                   = 128,
 319                        .ngpio                  = 8,
 320                },
 321                .pddr                           = MCFGPIO_PDDR_LCDCTLL,
 322                .podr                           = MCFGPIO_PODR_LCDCTLL,
 323                .ppdr                           = MCFGPIO_PPDSDR_LCDCTLL,
 324                .setr                           = MCFGPIO_PPDSDR_LCDCTLL,
 325                .clrr                           = MCFGPIO_PCLRR_LCDCTLL,
 326        },
 327};
 328
 329static int __init mcf_gpio_init(void)
 330{
 331        unsigned i = 0;
 332        while (i < ARRAY_SIZE(mcf_gpio_chips))
 333                (void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]);
 334        return 0;
 335}
 336
 337core_initcall(mcf_gpio_init);
 338