linux/arch/arm/mach-omap1/board-ams-delta.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * linux/arch/arm/mach-omap1/board-ams-delta.c
   4 *
   5 * Modified from board-generic.c
   6 *
   7 * Board specific inits for the Amstrad E3 (codename Delta) videophone
   8 *
   9 * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li>
  10 */
  11#include <linux/gpio/driver.h>
  12#include <linux/gpio/machine.h>
  13#include <linux/gpio/consumer.h>
  14#include <linux/gpio.h>
  15#include <linux/kernel.h>
  16#include <linux/init.h>
  17#include <linux/input.h>
  18#include <linux/interrupt.h>
  19#include <linux/leds.h>
  20#include <linux/platform_device.h>
  21#include <linux/regulator/consumer.h>
  22#include <linux/regulator/fixed.h>
  23#include <linux/regulator/machine.h>
  24#include <linux/serial_8250.h>
  25#include <linux/export.h>
  26#include <linux/omapfb.h>
  27#include <linux/io.h>
  28#include <linux/platform_data/gpio-omap.h>
  29
  30#include <media/soc_camera.h>
  31
  32#include <asm/serial.h>
  33#include <asm/mach-types.h>
  34#include <asm/mach/arch.h>
  35#include <asm/mach/map.h>
  36
  37#include <linux/platform_data/keypad-omap.h>
  38#include <mach/mux.h>
  39
  40#include <mach/hardware.h>
  41#include "camera.h"
  42#include <mach/usb.h>
  43
  44#include "ams-delta-fiq.h"
  45#include "board-ams-delta.h"
  46#include "iomap.h"
  47#include "common.h"
  48
  49static const unsigned int ams_delta_keymap[] = {
  50        KEY(0, 0, KEY_F1),              /* Advert    */
  51
  52        KEY(0, 3, KEY_COFFEE),          /* Games     */
  53        KEY(0, 2, KEY_QUESTION),        /* Directory */
  54        KEY(2, 3, KEY_CONNECT),         /* Internet  */
  55        KEY(1, 2, KEY_SHOP),            /* Services  */
  56        KEY(1, 1, KEY_PHONE),           /* VoiceMail */
  57
  58        KEY(0, 1, KEY_DELETE),          /* Delete    */
  59        KEY(2, 2, KEY_PLAY),            /* Play      */
  60        KEY(1, 0, KEY_PAGEUP),          /* Up        */
  61        KEY(1, 3, KEY_PAGEDOWN),        /* Down      */
  62        KEY(2, 0, KEY_EMAIL),           /* ReadEmail */
  63        KEY(2, 1, KEY_STOP),            /* Stop      */
  64
  65        /* Numeric keypad portion */
  66        KEY(0, 7, KEY_KP1),
  67        KEY(0, 6, KEY_KP2),
  68        KEY(0, 5, KEY_KP3),
  69        KEY(1, 7, KEY_KP4),
  70        KEY(1, 6, KEY_KP5),
  71        KEY(1, 5, KEY_KP6),
  72        KEY(2, 7, KEY_KP7),
  73        KEY(2, 6, KEY_KP8),
  74        KEY(2, 5, KEY_KP9),
  75        KEY(3, 6, KEY_KP0),
  76        KEY(3, 7, KEY_KPASTERISK),
  77        KEY(3, 5, KEY_KPDOT),           /* # key     */
  78        KEY(7, 2, KEY_NUMLOCK),         /* Mute      */
  79        KEY(7, 1, KEY_KPMINUS),         /* Recall    */
  80        KEY(6, 1, KEY_KPPLUS),          /* Redial    */
  81        KEY(7, 6, KEY_KPSLASH),         /* Handsfree */
  82        KEY(6, 0, KEY_ENTER),           /* Video     */
  83
  84        KEY(7, 4, KEY_CAMERA),          /* Photo     */
  85
  86        KEY(0, 4, KEY_F2),              /* Home      */
  87        KEY(1, 4, KEY_F3),              /* Office    */
  88        KEY(2, 4, KEY_F4),              /* Mobile    */
  89        KEY(7, 7, KEY_F5),              /* SMS       */
  90        KEY(7, 5, KEY_F6),              /* Email     */
  91
  92        /* QWERTY portion of keypad */
  93        KEY(3, 4, KEY_Q),
  94        KEY(3, 3, KEY_W),
  95        KEY(3, 2, KEY_E),
  96        KEY(3, 1, KEY_R),
  97        KEY(3, 0, KEY_T),
  98        KEY(4, 7, KEY_Y),
  99        KEY(4, 6, KEY_U),
 100        KEY(4, 5, KEY_I),
 101        KEY(4, 4, KEY_O),
 102        KEY(4, 3, KEY_P),
 103
 104        KEY(4, 2, KEY_A),
 105        KEY(4, 1, KEY_S),
 106        KEY(4, 0, KEY_D),
 107        KEY(5, 7, KEY_F),
 108        KEY(5, 6, KEY_G),
 109        KEY(5, 5, KEY_H),
 110        KEY(5, 4, KEY_J),
 111        KEY(5, 3, KEY_K),
 112        KEY(5, 2, KEY_L),
 113
 114        KEY(5, 1, KEY_Z),
 115        KEY(5, 0, KEY_X),
 116        KEY(6, 7, KEY_C),
 117        KEY(6, 6, KEY_V),
 118        KEY(6, 5, KEY_B),
 119        KEY(6, 4, KEY_N),
 120        KEY(6, 3, KEY_M),
 121        KEY(6, 2, KEY_SPACE),
 122
 123        KEY(7, 0, KEY_LEFTSHIFT),       /* Vol up    */
 124        KEY(7, 3, KEY_LEFTCTRL),        /* Vol down  */
 125};
 126
 127#define LATCH1_PHYS     0x01000000
 128#define LATCH1_VIRT     0xEA000000
 129#define MODEM_PHYS      0x04000000
 130#define MODEM_VIRT      0xEB000000
 131#define LATCH2_PHYS     0x08000000
 132#define LATCH2_VIRT     0xEC000000
 133
 134static struct map_desc ams_delta_io_desc[] __initdata = {
 135        /* AMS_DELTA_LATCH1 */
 136        {
 137                .virtual        = LATCH1_VIRT,
 138                .pfn            = __phys_to_pfn(LATCH1_PHYS),
 139                .length         = 0x01000000,
 140                .type           = MT_DEVICE
 141        },
 142        /* AMS_DELTA_LATCH2 */
 143        {
 144                .virtual        = LATCH2_VIRT,
 145                .pfn            = __phys_to_pfn(LATCH2_PHYS),
 146                .length         = 0x01000000,
 147                .type           = MT_DEVICE
 148        },
 149        /* AMS_DELTA_MODEM */
 150        {
 151                .virtual        = MODEM_VIRT,
 152                .pfn            = __phys_to_pfn(MODEM_PHYS),
 153                .length         = 0x01000000,
 154                .type           = MT_DEVICE
 155        }
 156};
 157
 158static const struct omap_lcd_config ams_delta_lcd_config __initconst = {
 159        .ctrl_name      = "internal",
 160};
 161
 162static struct omap_usb_config ams_delta_usb_config __initdata = {
 163        .register_host  = 1,
 164        .hmc_mode       = 16,
 165        .pins[0]        = 2,
 166};
 167
 168#define LATCH1_NGPIO            8
 169
 170static struct resource latch1_resources[] = {
 171        [0] = {
 172                .name   = "dat",
 173                .start  = LATCH1_PHYS,
 174                .end    = LATCH1_PHYS + (LATCH1_NGPIO - 1) / 8,
 175                .flags  = IORESOURCE_MEM,
 176        },
 177};
 178
 179#define LATCH1_LABEL    "latch1"
 180
 181static struct bgpio_pdata latch1_pdata = {
 182        .label  = LATCH1_LABEL,
 183        .base   = -1,
 184        .ngpio  = LATCH1_NGPIO,
 185};
 186
 187static struct platform_device latch1_gpio_device = {
 188        .name           = "basic-mmio-gpio",
 189        .id             = 0,
 190        .resource       = latch1_resources,
 191        .num_resources  = ARRAY_SIZE(latch1_resources),
 192        .dev            = {
 193                .platform_data  = &latch1_pdata,
 194        },
 195};
 196
 197#define LATCH1_PIN_LED_CAMERA           0
 198#define LATCH1_PIN_LED_ADVERT           1
 199#define LATCH1_PIN_LED_MAIL             2
 200#define LATCH1_PIN_LED_HANDSFREE        3
 201#define LATCH1_PIN_LED_VOICEMAIL        4
 202#define LATCH1_PIN_LED_VOICE            5
 203#define LATCH1_PIN_DOCKIT1              6
 204#define LATCH1_PIN_DOCKIT2              7
 205
 206#define LATCH2_NGPIO                    16
 207
 208static struct resource latch2_resources[] = {
 209        [0] = {
 210                .name   = "dat",
 211                .start  = LATCH2_PHYS,
 212                .end    = LATCH2_PHYS + (LATCH2_NGPIO - 1) / 8,
 213                .flags  = IORESOURCE_MEM,
 214        },
 215};
 216
 217#define LATCH2_LABEL    "latch2"
 218
 219static struct bgpio_pdata latch2_pdata = {
 220        .label  = LATCH2_LABEL,
 221        .base   = -1,
 222        .ngpio  = LATCH2_NGPIO,
 223};
 224
 225static struct platform_device latch2_gpio_device = {
 226        .name           = "basic-mmio-gpio",
 227        .id             = 1,
 228        .resource       = latch2_resources,
 229        .num_resources  = ARRAY_SIZE(latch2_resources),
 230        .dev            = {
 231                .platform_data  = &latch2_pdata,
 232        },
 233};
 234
 235#define LATCH2_PIN_LCD_VBLEN            0
 236#define LATCH2_PIN_LCD_NDISP            1
 237#define LATCH2_PIN_NAND_NCE             2
 238#define LATCH2_PIN_NAND_NRE             3
 239#define LATCH2_PIN_NAND_NWP             4
 240#define LATCH2_PIN_NAND_NWE             5
 241#define LATCH2_PIN_NAND_ALE             6
 242#define LATCH2_PIN_NAND_CLE             7
 243#define LATCH2_PIN_KEYBRD_PWR           8
 244#define LATCH2_PIN_KEYBRD_DATAOUT       9
 245#define LATCH2_PIN_SCARD_RSTIN          10
 246#define LATCH2_PIN_SCARD_CMDVCC         11
 247#define LATCH2_PIN_MODEM_NRESET         12
 248#define LATCH2_PIN_MODEM_CODEC          13
 249#define LATCH2_PIN_AUDIO_MUTE           14
 250#define LATCH2_PIN_HOOKFLASH            15
 251
 252static struct regulator_consumer_supply modem_nreset_consumers[] = {
 253        REGULATOR_SUPPLY("RESET#", "serial8250.1"),
 254        REGULATOR_SUPPLY("POR", "cx20442-codec"),
 255};
 256
 257static struct regulator_init_data modem_nreset_data = {
 258        .constraints            = {
 259                .valid_ops_mask         = REGULATOR_CHANGE_STATUS,
 260                .boot_on                = 1,
 261        },
 262        .num_consumer_supplies  = ARRAY_SIZE(modem_nreset_consumers),
 263        .consumer_supplies      = modem_nreset_consumers,
 264};
 265
 266static struct fixed_voltage_config modem_nreset_config = {
 267        .supply_name            = "modem_nreset",
 268        .microvolts             = 3300000,
 269        .startup_delay          = 25000,
 270        .enabled_at_boot        = 1,
 271        .init_data              = &modem_nreset_data,
 272};
 273
 274static struct platform_device modem_nreset_device = {
 275        .name   = "reg-fixed-voltage",
 276        .id     = -1,
 277        .dev    = {
 278                .platform_data  = &modem_nreset_config,
 279        },
 280};
 281
 282static struct gpiod_lookup_table ams_delta_nreset_gpiod_table = {
 283        .dev_id = "reg-fixed-voltage",
 284        .table = {
 285                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_MODEM_NRESET,
 286                            NULL, GPIO_ACTIVE_HIGH),
 287                { },
 288        },
 289};
 290
 291struct modem_private_data {
 292        struct regulator *regulator;
 293};
 294
 295static struct modem_private_data modem_priv;
 296
 297static struct platform_device ams_delta_nand_device = {
 298        .name   = "ams-delta-nand",
 299        .id     = -1,
 300};
 301
 302#define OMAP_GPIO_LABEL         "gpio-0-15"
 303#define OMAP_MPUIO_LABEL        "mpuio"
 304
 305static struct gpiod_lookup_table ams_delta_nand_gpio_table = {
 306        .table = {
 307                GPIO_LOOKUP(OMAP_GPIO_LABEL, AMS_DELTA_GPIO_PIN_NAND_RB, "rdy",
 308                            0),
 309                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NCE, "nce", 0),
 310                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NRE, "nre", 0),
 311                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWP, "nwp", 0),
 312                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_NWE, "nwe", 0),
 313                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_ALE, "ale", 0),
 314                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_NAND_CLE, "cle", 0),
 315                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 0, "data", 0, 0),
 316                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 1, "data", 1, 0),
 317                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 2, "data", 2, 0),
 318                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 3, "data", 3, 0),
 319                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 4, "data", 4, 0),
 320                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 5, "data", 5, 0),
 321                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 6, "data", 6, 0),
 322                GPIO_LOOKUP_IDX(OMAP_MPUIO_LABEL, 7, "data", 7, 0),
 323                { },
 324        },
 325};
 326
 327static struct resource ams_delta_kp_resources[] = {
 328        [0] = {
 329                .start  = INT_KEYBOARD,
 330                .end    = INT_KEYBOARD,
 331                .flags  = IORESOURCE_IRQ,
 332        },
 333};
 334
 335static const struct matrix_keymap_data ams_delta_keymap_data = {
 336        .keymap         = ams_delta_keymap,
 337        .keymap_size    = ARRAY_SIZE(ams_delta_keymap),
 338};
 339
 340static struct omap_kp_platform_data ams_delta_kp_data = {
 341        .rows           = 8,
 342        .cols           = 8,
 343        .keymap_data    = &ams_delta_keymap_data,
 344        .delay          = 9,
 345};
 346
 347static struct platform_device ams_delta_kp_device = {
 348        .name           = "omap-keypad",
 349        .id             = -1,
 350        .dev            = {
 351                .platform_data = &ams_delta_kp_data,
 352        },
 353        .num_resources  = ARRAY_SIZE(ams_delta_kp_resources),
 354        .resource       = ams_delta_kp_resources,
 355};
 356
 357static struct platform_device ams_delta_lcd_device = {
 358        .name   = "lcd_ams_delta",
 359        .id     = -1,
 360};
 361
 362static struct gpiod_lookup_table ams_delta_lcd_gpio_table = {
 363        .table = {
 364                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_LCD_VBLEN, "vblen", 0),
 365                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_LCD_NDISP, "ndisp", 0),
 366                { },
 367        },
 368};
 369
 370static struct gpio_led gpio_leds[] __initdata = {
 371        [LATCH1_PIN_LED_CAMERA] = {
 372                .name            = "camera",
 373                .default_state   = LEDS_GPIO_DEFSTATE_OFF,
 374#ifdef CONFIG_LEDS_TRIGGERS
 375                .default_trigger = "ams_delta_camera",
 376#endif
 377        },
 378        [LATCH1_PIN_LED_ADVERT] = {
 379                .name            = "advert",
 380                .default_state   = LEDS_GPIO_DEFSTATE_OFF,
 381        },
 382        [LATCH1_PIN_LED_MAIL] = {
 383                .name            = "email",
 384                .default_state   = LEDS_GPIO_DEFSTATE_OFF,
 385        },
 386        [LATCH1_PIN_LED_HANDSFREE] = {
 387                .name            = "handsfree",
 388                .default_state   = LEDS_GPIO_DEFSTATE_OFF,
 389        },
 390        [LATCH1_PIN_LED_VOICEMAIL] = {
 391                .name            = "voicemail",
 392                .default_state   = LEDS_GPIO_DEFSTATE_OFF,
 393        },
 394        [LATCH1_PIN_LED_VOICE] = {
 395                .name            = "voice",
 396                .default_state   = LEDS_GPIO_DEFSTATE_OFF,
 397        },
 398};
 399
 400static const struct gpio_led_platform_data leds_pdata __initconst = {
 401        .leds           = gpio_leds,
 402        .num_leds       = ARRAY_SIZE(gpio_leds),
 403};
 404
 405static struct gpiod_lookup_table leds_gpio_table = {
 406        .table = {
 407                GPIO_LOOKUP_IDX(LATCH1_LABEL, LATCH1_PIN_LED_CAMERA, NULL,
 408                                LATCH1_PIN_LED_CAMERA, 0),
 409                GPIO_LOOKUP_IDX(LATCH1_LABEL, LATCH1_PIN_LED_ADVERT, NULL,
 410                                LATCH1_PIN_LED_ADVERT, 0),
 411                GPIO_LOOKUP_IDX(LATCH1_LABEL, LATCH1_PIN_LED_MAIL, NULL,
 412                                LATCH1_PIN_LED_MAIL, 0),
 413                GPIO_LOOKUP_IDX(LATCH1_LABEL, LATCH1_PIN_LED_HANDSFREE, NULL,
 414                                LATCH1_PIN_LED_HANDSFREE, 0),
 415                GPIO_LOOKUP_IDX(LATCH1_LABEL, LATCH1_PIN_LED_VOICEMAIL, NULL,
 416                                LATCH1_PIN_LED_VOICEMAIL, 0),
 417                GPIO_LOOKUP_IDX(LATCH1_LABEL, LATCH1_PIN_LED_VOICE, NULL,
 418                                LATCH1_PIN_LED_VOICE, 0),
 419                { },
 420        },
 421};
 422
 423static struct i2c_board_info ams_delta_camera_board_info[] = {
 424        {
 425                I2C_BOARD_INFO("ov6650", 0x60),
 426        },
 427};
 428
 429#ifdef CONFIG_LEDS_TRIGGERS
 430DEFINE_LED_TRIGGER(ams_delta_camera_led_trigger);
 431
 432static int ams_delta_camera_power(struct device *dev, int power)
 433{
 434        /*
 435         * turn on camera LED
 436         */
 437        if (power)
 438                led_trigger_event(ams_delta_camera_led_trigger, LED_FULL);
 439        else
 440                led_trigger_event(ams_delta_camera_led_trigger, LED_OFF);
 441        return 0;
 442}
 443#else
 444#define ams_delta_camera_power  NULL
 445#endif
 446
 447static struct soc_camera_link ams_delta_iclink = {
 448        .bus_id         = 0,    /* OMAP1 SoC camera bus */
 449        .i2c_adapter_id = 1,
 450        .board_info     = &ams_delta_camera_board_info[0],
 451        .module_name    = "ov6650",
 452        .power          = ams_delta_camera_power,
 453};
 454
 455static struct platform_device ams_delta_camera_device = {
 456        .name   = "soc-camera-pdrv",
 457        .id     = 0,
 458        .dev    = {
 459                .platform_data = &ams_delta_iclink,
 460        },
 461};
 462
 463static struct omap1_cam_platform_data ams_delta_camera_platform_data = {
 464        .camexclk_khz   = 12000,        /* default 12MHz clock, no extra DPLL */
 465        .lclk_khz_max   = 1334,         /* results in 5fps CIF, 10fps QCIF */
 466};
 467
 468static struct platform_device ams_delta_audio_device = {
 469        .name   = "ams-delta-audio",
 470        .id     = -1,
 471};
 472
 473static struct gpiod_lookup_table ams_delta_audio_gpio_table = {
 474        .table = {
 475                GPIO_LOOKUP(OMAP_GPIO_LABEL, AMS_DELTA_GPIO_PIN_HOOK_SWITCH,
 476                            "hook_switch", 0),
 477                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_MODEM_CODEC,
 478                            "modem_codec", 0),
 479                { },
 480        },
 481};
 482
 483static struct platform_device cx20442_codec_device = {
 484        .name   = "cx20442-codec",
 485        .id     = -1,
 486};
 487
 488static struct resource ams_delta_serio_resources[] = {
 489        {
 490                .flags  = IORESOURCE_IRQ,
 491                /*
 492                 * Initialize IRQ resource with invalid IRQ number.
 493                 * It will be replaced with dynamically allocated GPIO IRQ
 494                 * obtained from GPIO chip as soon as the chip is available.
 495                 */
 496                .start  = -EINVAL,
 497                .end    = -EINVAL,
 498        },
 499};
 500
 501static struct platform_device ams_delta_serio_device = {
 502        .name           = "ams-delta-serio",
 503        .id             = PLATFORM_DEVID_NONE,
 504        .dev            = {
 505                /*
 506                 * Initialize .platform_data explicitly with NULL to
 507                 * indicate it is going to be used.  It will be replaced
 508                 * with FIQ buffer address as soon as FIQ is initialized.
 509                 */
 510                .platform_data = NULL,
 511        },
 512        .num_resources  = ARRAY_SIZE(ams_delta_serio_resources),
 513        .resource       = ams_delta_serio_resources,
 514};
 515
 516static struct regulator_consumer_supply keybrd_pwr_consumers[] = {
 517        /*
 518         * Initialize supply .dev_name with NULL.  It will be replaced
 519         * with serio dev_name() as soon as the serio device is registered.
 520         */
 521        REGULATOR_SUPPLY("vcc", NULL),
 522};
 523
 524static struct regulator_init_data keybrd_pwr_initdata = {
 525        .constraints            = {
 526                .valid_ops_mask         = REGULATOR_CHANGE_STATUS,
 527        },
 528        .num_consumer_supplies  = ARRAY_SIZE(keybrd_pwr_consumers),
 529        .consumer_supplies      = keybrd_pwr_consumers,
 530};
 531
 532static struct fixed_voltage_config keybrd_pwr_config = {
 533        .supply_name            = "keybrd_pwr",
 534        .microvolts             = 5000000,
 535        .init_data              = &keybrd_pwr_initdata,
 536};
 537
 538static struct platform_device keybrd_pwr_device = {
 539        .name   = "reg-fixed-voltage",
 540        .id     = PLATFORM_DEVID_AUTO,
 541        .dev    = {
 542                .platform_data  = &keybrd_pwr_config,
 543        },
 544};
 545
 546static struct gpiod_lookup_table keybrd_pwr_gpio_table = {
 547        .table = {
 548                GPIO_LOOKUP(LATCH2_LABEL, LATCH2_PIN_KEYBRD_PWR, NULL,
 549                            GPIO_ACTIVE_HIGH),
 550                { },
 551        },
 552};
 553
 554static struct platform_device *ams_delta_devices[] __initdata = {
 555        &latch1_gpio_device,
 556        &latch2_gpio_device,
 557        &ams_delta_kp_device,
 558        &ams_delta_camera_device,
 559        &ams_delta_audio_device,
 560        &ams_delta_serio_device,
 561        &ams_delta_nand_device,
 562        &ams_delta_lcd_device,
 563        &cx20442_codec_device,
 564};
 565
 566static struct gpiod_lookup_table *ams_delta_gpio_tables[] __initdata = {
 567        &ams_delta_nreset_gpiod_table,
 568        &ams_delta_audio_gpio_table,
 569        &keybrd_pwr_gpio_table,
 570        &ams_delta_lcd_gpio_table,
 571        &ams_delta_nand_gpio_table,
 572};
 573
 574/*
 575 * Some drivers may not use GPIO lookup tables but need to be provided
 576 * with GPIO numbers.  The same applies to GPIO based IRQ lines - some
 577 * drivers may even not use GPIO layer but expect just IRQ numbers.
 578 * We could either define GPIO lookup tables then use them on behalf
 579 * of those devices, or we can use GPIO driver level methods for
 580 * identification of GPIO and IRQ numbers. For the purpose of the latter,
 581 * defina a helper function which identifies GPIO chips by their labels.
 582 */
 583static int gpiochip_match_by_label(struct gpio_chip *chip, void *data)
 584{
 585        char *label = data;
 586
 587        return !strcmp(label, chip->label);
 588}
 589
 590static struct gpiod_hog ams_delta_gpio_hogs[] = {
 591        GPIO_HOG(LATCH2_LABEL, LATCH2_PIN_KEYBRD_DATAOUT, "keybrd_dataout",
 592                 GPIO_ACTIVE_HIGH, GPIOD_OUT_LOW),
 593        GPIO_HOG(LATCH2_LABEL, LATCH2_PIN_AUDIO_MUTE, "audio_mute",
 594                 GPIO_ACTIVE_HIGH, GPIOD_OUT_LOW),
 595        {},
 596};
 597
 598static struct plat_serial8250_port ams_delta_modem_ports[];
 599
 600/*
 601 * Obtain MODEM IRQ GPIO descriptor using its hardware pin
 602 * number and assign related IRQ number to the MODEM port.
 603 * Keep the GPIO descriptor open so nobody steps in.
 604 */
 605static void __init modem_assign_irq(struct gpio_chip *chip)
 606{
 607        struct gpio_desc *gpiod;
 608
 609        gpiod = gpiochip_request_own_desc(chip, AMS_DELTA_GPIO_PIN_MODEM_IRQ,
 610                                          "modem_irq", GPIO_ACTIVE_HIGH,
 611                                          GPIOD_IN);
 612        if (IS_ERR(gpiod)) {
 613                pr_err("%s: modem IRQ GPIO request failed (%ld)\n", __func__,
 614                       PTR_ERR(gpiod));
 615        } else {
 616                ams_delta_modem_ports[0].irq = gpiod_to_irq(gpiod);
 617        }
 618}
 619
 620/*
 621 * The purpose of this function is to take care of proper initialization of
 622 * devices and data structures which depend on GPIO lines provided by OMAP GPIO
 623 * banks but their drivers don't use GPIO lookup tables or GPIO layer at all.
 624 * The function may be called as soon as OMAP GPIO devices are probed.
 625 * Since that happens at postcore_initcall, it can be called successfully
 626 * from init_machine or later.
 627 * Dependent devices may be registered from within this function or later.
 628 */
 629static void __init omap_gpio_deps_init(void)
 630{
 631        struct gpio_chip *chip;
 632
 633        chip = gpiochip_find(OMAP_GPIO_LABEL, gpiochip_match_by_label);
 634        if (!chip) {
 635                pr_err("%s: OMAP GPIO chip not found\n", __func__);
 636                return;
 637        }
 638
 639        /*
 640         * Start with FIQ initialization as it may have to request
 641         * and release successfully each OMAP GPIO pin in turn.
 642         */
 643        ams_delta_init_fiq(chip, &ams_delta_serio_device);
 644
 645        modem_assign_irq(chip);
 646}
 647
 648/*
 649 * Initialize latch2 pins with values which are safe for dependent on-board
 650 * devices or useful for their successull initialization even before GPIO
 651 * driver takes control over the latch pins:
 652 * - LATCH2_PIN_LCD_VBLEN       = 0
 653 * - LATCH2_PIN_LCD_NDISP       = 0     Keep LCD device powered off before its
 654 *                                      driver takes control over it.
 655 * - LATCH2_PIN_NAND_NCE        = 0
 656 * - LATCH2_PIN_NAND_NWP        = 0     Keep NAND device down and write-
 657 *                                      protected before its driver takes
 658 *                                      control over it.
 659 * - LATCH2_PIN_KEYBRD_PWR      = 0     Keep keyboard powered off before serio
 660 *                                      driver takes control over it.
 661 * - LATCH2_PIN_KEYBRD_DATAOUT  = 0     Keep low to avoid corruption of first
 662 *                                      byte of data received from attached
 663 *                                      keyboard when serio device is probed;
 664 *                                      the pin is also hogged low by the latch2
 665 *                                      GPIO driver as soon as it is ready.
 666 * - LATCH2_PIN_MODEM_NRESET    = 1     Enable voice MODEM device, allowing for
 667 *                                      its successful probe even before a
 668 *                                      regulator it depends on, which in turn
 669 *                                      takes control over the pin, is set up.
 670 * - LATCH2_PIN_MODEM_CODEC     = 1     Attach voice MODEM CODEC data port
 671 *                                      to the MODEM so the CODEC is under
 672 *                                      control even if audio driver doesn't
 673 *                                      take it over.
 674 */
 675static void __init ams_delta_latch2_init(void)
 676{
 677        u16 latch2 = 1 << LATCH2_PIN_MODEM_NRESET | 1 << LATCH2_PIN_MODEM_CODEC;
 678
 679        __raw_writew(latch2, LATCH2_VIRT);
 680}
 681
 682static void __init ams_delta_init(void)
 683{
 684        struct platform_device *leds_pdev;
 685
 686        /* mux pins for uarts */
 687        omap_cfg_reg(UART1_TX);
 688        omap_cfg_reg(UART1_RTS);
 689
 690        /* parallel camera interface */
 691        omap_cfg_reg(H19_1610_CAM_EXCLK);
 692        omap_cfg_reg(J15_1610_CAM_LCLK);
 693        omap_cfg_reg(L18_1610_CAM_VS);
 694        omap_cfg_reg(L15_1610_CAM_HS);
 695        omap_cfg_reg(L19_1610_CAM_D0);
 696        omap_cfg_reg(K14_1610_CAM_D1);
 697        omap_cfg_reg(K15_1610_CAM_D2);
 698        omap_cfg_reg(K19_1610_CAM_D3);
 699        omap_cfg_reg(K18_1610_CAM_D4);
 700        omap_cfg_reg(J14_1610_CAM_D5);
 701        omap_cfg_reg(J19_1610_CAM_D6);
 702        omap_cfg_reg(J18_1610_CAM_D7);
 703
 704        omap_gpio_deps_init();
 705        ams_delta_latch2_init();
 706        gpiod_add_hogs(ams_delta_gpio_hogs);
 707
 708        omap_serial_init();
 709        omap_register_i2c_bus(1, 100, NULL, 0);
 710
 711        omap1_usb_init(&ams_delta_usb_config);
 712        omap1_set_camera_info(&ams_delta_camera_platform_data);
 713#ifdef CONFIG_LEDS_TRIGGERS
 714        led_trigger_register_simple("ams_delta_camera",
 715                        &ams_delta_camera_led_trigger);
 716#endif
 717        platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
 718
 719        /*
 720         * As soon as regulator consumers have been registered, assign their
 721         * dev_names to consumer supply entries of respective regulators.
 722         */
 723        keybrd_pwr_consumers[0].dev_name =
 724                        dev_name(&ams_delta_serio_device.dev);
 725
 726        /*
 727         * Once consumer supply entries are populated with dev_names,
 728         * register regulator devices.  At this stage only the keyboard
 729         * power regulator has its consumer supply table fully populated.
 730         */
 731        platform_device_register(&keybrd_pwr_device);
 732
 733        /*
 734         * As soon as GPIO consumers have been registered, assign
 735         * their dev_names to respective GPIO lookup tables.
 736         */
 737        ams_delta_audio_gpio_table.dev_id =
 738                        dev_name(&ams_delta_audio_device.dev);
 739        keybrd_pwr_gpio_table.dev_id = dev_name(&keybrd_pwr_device.dev);
 740        ams_delta_nand_gpio_table.dev_id = dev_name(&ams_delta_nand_device.dev);
 741        ams_delta_lcd_gpio_table.dev_id = dev_name(&ams_delta_lcd_device.dev);
 742
 743        /*
 744         * Once GPIO lookup tables are populated with dev_names, register them.
 745         */
 746        gpiod_add_lookup_tables(ams_delta_gpio_tables,
 747                                ARRAY_SIZE(ams_delta_gpio_tables));
 748
 749        leds_pdev = gpio_led_register_device(PLATFORM_DEVID_NONE, &leds_pdata);
 750        if (!IS_ERR_OR_NULL(leds_pdev)) {
 751                leds_gpio_table.dev_id = dev_name(&leds_pdev->dev);
 752                gpiod_add_lookup_table(&leds_gpio_table);
 753        }
 754
 755        omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1);
 756
 757        omapfb_set_lcd_config(&ams_delta_lcd_config);
 758}
 759
 760static void modem_pm(struct uart_port *port, unsigned int state, unsigned old)
 761{
 762        struct modem_private_data *priv = port->private_data;
 763        int ret;
 764
 765        if (!priv)
 766                return;
 767
 768        if (IS_ERR(priv->regulator))
 769                return;
 770
 771        if (state == old)
 772                return;
 773
 774        if (state == 0)
 775                ret = regulator_enable(priv->regulator);
 776        else if (old == 0)
 777                ret = regulator_disable(priv->regulator);
 778        else
 779                ret = 0;
 780
 781        if (ret)
 782                dev_warn(port->dev,
 783                         "ams_delta modem_pm: failed to %sable regulator: %d\n",
 784                         state ? "dis" : "en", ret);
 785}
 786
 787static struct plat_serial8250_port ams_delta_modem_ports[] = {
 788        {
 789                .membase        = IOMEM(MODEM_VIRT),
 790                .mapbase        = MODEM_PHYS,
 791                .irq            = IRQ_NOTCONNECTED, /* changed later */
 792                .flags          = UPF_BOOT_AUTOCONF,
 793                .irqflags       = IRQF_TRIGGER_RISING,
 794                .iotype         = UPIO_MEM,
 795                .regshift       = 1,
 796                .uartclk        = BASE_BAUD * 16,
 797                .pm             = modem_pm,
 798                .private_data   = &modem_priv,
 799        },
 800        { },
 801};
 802
 803static struct platform_device ams_delta_modem_device = {
 804        .name   = "serial8250",
 805        .id     = PLAT8250_DEV_PLATFORM1,
 806        .dev            = {
 807                .platform_data = ams_delta_modem_ports,
 808        },
 809};
 810
 811static int __init modem_nreset_init(void)
 812{
 813        int err;
 814
 815        err = platform_device_register(&modem_nreset_device);
 816        if (err)
 817                pr_err("Couldn't register the modem regulator device\n");
 818
 819        return err;
 820}
 821
 822
 823/*
 824 * This function expects MODEM IRQ number already assigned to the port.
 825 * The MODEM device requires its RESET# pin kept high during probe.
 826 * That requirement can be fulfilled in several ways:
 827 * - with a descriptor of already functional modem_nreset regulator
 828 *   assigned to the MODEM private data,
 829 * - with the regulator not yet controlled by modem_pm function but
 830 *   already enabled by default on probe,
 831 * - before the modem_nreset regulator is probed, with the pin already
 832 *   set high explicitly.
 833 * The last one is already guaranteed by ams_delta_latch2_init() called
 834 * from machine_init.
 835 * In order to avoid taking over ttyS0 device slot, the MODEM device
 836 * should be registered after OMAP serial ports.  Since those ports
 837 * are registered at arch_initcall, this function can be called safely
 838 * at arch_initcall_sync earliest.
 839 */
 840static int __init ams_delta_modem_init(void)
 841{
 842        int err;
 843
 844        if (!machine_is_ams_delta())
 845                return -ENODEV;
 846
 847        omap_cfg_reg(M14_1510_GPIO2);
 848
 849        /* Initialize the modem_nreset regulator consumer before use */
 850        modem_priv.regulator = ERR_PTR(-ENODEV);
 851
 852        err = platform_device_register(&ams_delta_modem_device);
 853
 854        return err;
 855}
 856arch_initcall_sync(ams_delta_modem_init);
 857
 858static int __init late_init(void)
 859{
 860        int err;
 861
 862        err = modem_nreset_init();
 863        if (err)
 864                return err;
 865
 866        /*
 867         * Once the modem device is registered, the modem_nreset
 868         * regulator can be requested on behalf of that device.
 869         */
 870        modem_priv.regulator = regulator_get(&ams_delta_modem_device.dev,
 871                        "RESET#");
 872        if (IS_ERR(modem_priv.regulator)) {
 873                err = PTR_ERR(modem_priv.regulator);
 874                goto unregister;
 875        }
 876        return 0;
 877
 878unregister:
 879        platform_device_unregister(&ams_delta_modem_device);
 880        return err;
 881}
 882
 883static void __init ams_delta_init_late(void)
 884{
 885        omap1_init_late();
 886        late_init();
 887}
 888
 889static void __init ams_delta_map_io(void)
 890{
 891        omap15xx_map_io();
 892        iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
 893}
 894
 895MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
 896        /* Maintainer: Jonathan McDowell <noodles@earth.li> */
 897        .atag_offset    = 0x100,
 898        .map_io         = ams_delta_map_io,
 899        .init_early     = omap1_init_early,
 900        .init_irq       = omap1_init_irq,
 901        .handle_irq     = omap1_handle_irq,
 902        .init_machine   = ams_delta_init,
 903        .init_late      = ams_delta_init_late,
 904        .init_time      = omap1_timer_init,
 905        .restart        = omap1_restart,
 906MACHINE_END
 907