linux/arch/arm/mach-omap1/board-nokia770.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-omap1/board-nokia770.c
   3 *
   4 * Modified from board-generic.c
   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 version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10#include <linux/clkdev.h>
  11#include <linux/irq.h>
  12#include <linux/gpio.h>
  13#include <linux/kernel.h>
  14#include <linux/init.h>
  15#include <linux/mutex.h>
  16#include <linux/platform_device.h>
  17#include <linux/input.h>
  18#include <linux/omapfb.h>
  19
  20#include <linux/spi/spi.h>
  21#include <linux/spi/ads7846.h>
  22#include <linux/workqueue.h>
  23#include <linux/delay.h>
  24
  25#include <linux/platform_data/keypad-omap.h>
  26#include <linux/platform_data/lcd-mipid.h>
  27#include <linux/platform_data/gpio-omap.h>
  28#include <linux/platform_data/i2c-cbus-gpio.h>
  29
  30#include <asm/mach-types.h>
  31#include <asm/mach/arch.h>
  32#include <asm/mach/map.h>
  33
  34#include <mach/mux.h>
  35
  36#include <mach/hardware.h>
  37#include <mach/usb.h>
  38
  39#include "common.h"
  40#include "clock.h"
  41#include "mmc.h"
  42
  43#define ADS7846_PENDOWN_GPIO    15
  44
  45static const unsigned int nokia770_keymap[] = {
  46        KEY(1, 0, GROUP_0 | KEY_UP),
  47        KEY(2, 0, GROUP_1 | KEY_F5),
  48        KEY(0, 1, GROUP_0 | KEY_LEFT),
  49        KEY(1, 1, GROUP_0 | KEY_ENTER),
  50        KEY(2, 1, GROUP_0 | KEY_RIGHT),
  51        KEY(0, 2, GROUP_1 | KEY_ESC),
  52        KEY(1, 2, GROUP_0 | KEY_DOWN),
  53        KEY(2, 2, GROUP_1 | KEY_F4),
  54        KEY(0, 3, GROUP_2 | KEY_F7),
  55        KEY(1, 3, GROUP_2 | KEY_F8),
  56        KEY(2, 3, GROUP_2 | KEY_F6),
  57};
  58
  59static struct resource nokia770_kp_resources[] = {
  60        [0] = {
  61                .start  = INT_KEYBOARD,
  62                .end    = INT_KEYBOARD,
  63                .flags  = IORESOURCE_IRQ,
  64        },
  65};
  66
  67static const struct matrix_keymap_data nokia770_keymap_data = {
  68        .keymap         = nokia770_keymap,
  69        .keymap_size    = ARRAY_SIZE(nokia770_keymap),
  70};
  71
  72static struct omap_kp_platform_data nokia770_kp_data = {
  73        .rows           = 8,
  74        .cols           = 8,
  75        .keymap_data    = &nokia770_keymap_data,
  76        .delay          = 4,
  77};
  78
  79static struct platform_device nokia770_kp_device = {
  80        .name           = "omap-keypad",
  81        .id             = -1,
  82        .dev            = {
  83                .platform_data = &nokia770_kp_data,
  84        },
  85        .num_resources  = ARRAY_SIZE(nokia770_kp_resources),
  86        .resource       = nokia770_kp_resources,
  87};
  88
  89static struct platform_device *nokia770_devices[] __initdata = {
  90        &nokia770_kp_device,
  91};
  92
  93static void mipid_shutdown(struct mipid_platform_data *pdata)
  94{
  95        if (pdata->nreset_gpio != -1) {
  96                printk(KERN_INFO "shutdown LCD\n");
  97                gpio_set_value(pdata->nreset_gpio, 0);
  98                msleep(120);
  99        }
 100}
 101
 102static struct mipid_platform_data nokia770_mipid_platform_data = {
 103        .shutdown = mipid_shutdown,
 104};
 105
 106static const struct omap_lcd_config nokia770_lcd_config __initconst = {
 107        .ctrl_name      = "hwa742",
 108};
 109
 110static void __init mipid_dev_init(void)
 111{
 112        nokia770_mipid_platform_data.nreset_gpio = 13;
 113        nokia770_mipid_platform_data.data_lines = 16;
 114
 115        omapfb_set_lcd_config(&nokia770_lcd_config);
 116}
 117
 118static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = {
 119        .x_max          = 0x0fff,
 120        .y_max          = 0x0fff,
 121        .x_plate_ohms   = 180,
 122        .pressure_max   = 255,
 123        .debounce_max   = 10,
 124        .debounce_tol   = 3,
 125        .debounce_rep   = 1,
 126        .gpio_pendown   = ADS7846_PENDOWN_GPIO,
 127};
 128
 129static struct spi_board_info nokia770_spi_board_info[] __initdata = {
 130        [0] = {
 131                .modalias       = "lcd_mipid",
 132                .bus_num        = 2,
 133                .chip_select    = 3,
 134                .max_speed_hz   = 12000000,
 135                .platform_data  = &nokia770_mipid_platform_data,
 136        },
 137        [1] = {
 138                .modalias       = "ads7846",
 139                .bus_num        = 2,
 140                .chip_select    = 0,
 141                .max_speed_hz   = 2500000,
 142                .platform_data  = &nokia770_ads7846_platform_data,
 143        },
 144};
 145
 146static void __init hwa742_dev_init(void)
 147{
 148        clk_add_alias("hwa_sys_ck", NULL, "bclk", NULL);
 149}
 150
 151/* assume no Mini-AB port */
 152
 153static struct omap_usb_config nokia770_usb_config __initdata = {
 154        .otg            = 1,
 155        .register_host  = 1,
 156        .register_dev   = 1,
 157        .hmc_mode       = 16,
 158        .pins[0]        = 6,
 159        .extcon         = "tahvo-usb",
 160};
 161
 162#if IS_ENABLED(CONFIG_MMC_OMAP)
 163
 164#define NOKIA770_GPIO_MMC_POWER         41
 165#define NOKIA770_GPIO_MMC_SWITCH        23
 166
 167static int nokia770_mmc_set_power(struct device *dev, int slot, int power_on,
 168                                int vdd)
 169{
 170        gpio_set_value(NOKIA770_GPIO_MMC_POWER, power_on);
 171        return 0;
 172}
 173
 174static int nokia770_mmc_get_cover_state(struct device *dev, int slot)
 175{
 176        return gpio_get_value(NOKIA770_GPIO_MMC_SWITCH);
 177}
 178
 179static struct omap_mmc_platform_data nokia770_mmc2_data = {
 180        .nr_slots                       = 1,
 181        .max_freq                       = 12000000,
 182        .slots[0]       = {
 183                .set_power              = nokia770_mmc_set_power,
 184                .get_cover_state        = nokia770_mmc_get_cover_state,
 185                .ocr_mask               = MMC_VDD_32_33|MMC_VDD_33_34,
 186                .name                   = "mmcblk",
 187        },
 188};
 189
 190static struct omap_mmc_platform_data *nokia770_mmc_data[OMAP16XX_NR_MMC];
 191
 192static void __init nokia770_mmc_init(void)
 193{
 194        int ret;
 195
 196        ret = gpio_request(NOKIA770_GPIO_MMC_POWER, "MMC power");
 197        if (ret < 0)
 198                return;
 199        gpio_direction_output(NOKIA770_GPIO_MMC_POWER, 0);
 200
 201        ret = gpio_request(NOKIA770_GPIO_MMC_SWITCH, "MMC cover");
 202        if (ret < 0) {
 203                gpio_free(NOKIA770_GPIO_MMC_POWER);
 204                return;
 205        }
 206        gpio_direction_input(NOKIA770_GPIO_MMC_SWITCH);
 207
 208        /* Only the second MMC controller is used */
 209        nokia770_mmc_data[1] = &nokia770_mmc2_data;
 210        omap1_init_mmc(nokia770_mmc_data, OMAP16XX_NR_MMC);
 211}
 212
 213#else
 214static inline void nokia770_mmc_init(void)
 215{
 216}
 217#endif
 218
 219#if IS_ENABLED(CONFIG_I2C_CBUS_GPIO)
 220static struct i2c_cbus_platform_data nokia770_cbus_data = {
 221        .clk_gpio = OMAP_MPUIO(9),
 222        .dat_gpio = OMAP_MPUIO(10),
 223        .sel_gpio = OMAP_MPUIO(11),
 224};
 225
 226static struct platform_device nokia770_cbus_device = {
 227        .name   = "i2c-cbus-gpio",
 228        .id     = 2,
 229        .dev    = {
 230                .platform_data = &nokia770_cbus_data,
 231        },
 232};
 233
 234static struct i2c_board_info nokia770_i2c_board_info_2[] __initdata = {
 235        {
 236                I2C_BOARD_INFO("retu", 0x01),
 237        },
 238        {
 239                I2C_BOARD_INFO("tahvo", 0x02),
 240        },
 241};
 242
 243static void __init nokia770_cbus_init(void)
 244{
 245        const int retu_irq_gpio = 62;
 246        const int tahvo_irq_gpio = 40;
 247
 248        if (gpio_request_one(retu_irq_gpio, GPIOF_IN, "Retu IRQ"))
 249                return;
 250        if (gpio_request_one(tahvo_irq_gpio, GPIOF_IN, "Tahvo IRQ")) {
 251                gpio_free(retu_irq_gpio);
 252                return;
 253        }
 254        irq_set_irq_type(gpio_to_irq(retu_irq_gpio), IRQ_TYPE_EDGE_RISING);
 255        irq_set_irq_type(gpio_to_irq(tahvo_irq_gpio), IRQ_TYPE_EDGE_RISING);
 256        nokia770_i2c_board_info_2[0].irq = gpio_to_irq(retu_irq_gpio);
 257        nokia770_i2c_board_info_2[1].irq = gpio_to_irq(tahvo_irq_gpio);
 258        i2c_register_board_info(2, nokia770_i2c_board_info_2,
 259                                ARRAY_SIZE(nokia770_i2c_board_info_2));
 260        platform_device_register(&nokia770_cbus_device);
 261}
 262#else /* CONFIG_I2C_CBUS_GPIO */
 263static void __init nokia770_cbus_init(void)
 264{
 265}
 266#endif /* CONFIG_I2C_CBUS_GPIO */
 267
 268static void __init omap_nokia770_init(void)
 269{
 270        /* On Nokia 770, the SleepX signal is masked with an
 271         * MPUIO line by default.  It has to be unmasked for it
 272         * to become functional */
 273
 274        /* SleepX mask direction */
 275        omap_writew((omap_readw(0xfffb5008) & ~2), 0xfffb5008);
 276        /* Unmask SleepX signal */
 277        omap_writew((omap_readw(0xfffb5004) & ~2), 0xfffb5004);
 278
 279        platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices));
 280        nokia770_spi_board_info[1].irq = gpio_to_irq(15);
 281        spi_register_board_info(nokia770_spi_board_info,
 282                                ARRAY_SIZE(nokia770_spi_board_info));
 283        omap_serial_init();
 284        omap_register_i2c_bus(1, 100, NULL, 0);
 285        hwa742_dev_init();
 286        mipid_dev_init();
 287        omap1_usb_init(&nokia770_usb_config);
 288        nokia770_mmc_init();
 289        nokia770_cbus_init();
 290}
 291
 292MACHINE_START(NOKIA770, "Nokia 770")
 293        .atag_offset    = 0x100,
 294        .map_io         = omap16xx_map_io,
 295        .init_early     = omap1_init_early,
 296        .init_irq       = omap1_init_irq,
 297        .handle_irq     = omap1_handle_irq,
 298        .init_machine   = omap_nokia770_init,
 299        .init_late      = omap1_init_late,
 300        .init_time      = omap1_timer_init,
 301        .restart        = omap1_restart,
 302MACHINE_END
 303