linux/arch/arm/mach-pxa/colibri-pxa270-income.c
<<
>>
Prefs
   1/*
   2 * linux/arch/arm/mach-pxa/income.c
   3 *
   4 * Support for Income s.r.o. SH-Dmaster PXA270 SBC
   5 *
   6 * Copyright (C) 2010
   7 * Marek Vasut <marek.vasut@gmail.com>
   8 * Pavel Revak <palo@bielyvlk.sk>
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 */
  14
  15#include <linux/bitops.h>
  16#include <linux/delay.h>
  17#include <linux/gpio.h>
  18#include <linux/init.h>
  19#include <linux/interrupt.h>
  20#include <linux/ioport.h>
  21#include <linux/kernel.h>
  22#include <linux/platform_device.h>
  23#include <linux/pwm.h>
  24#include <linux/pwm_backlight.h>
  25#include <linux/i2c/pxa-i2c.h>
  26
  27#include <asm/irq.h>
  28#include <asm/mach-types.h>
  29
  30#include <mach/hardware.h>
  31#include <linux/platform_data/mmc-pxamci.h>
  32#include <linux/platform_data/usb-ohci-pxa27x.h>
  33#include "pxa27x.h"
  34#include "pxa27x-udc.h"
  35#include <linux/platform_data/video-pxafb.h>
  36
  37#include "devices.h"
  38#include "generic.h"
  39
  40#define GPIO114_INCOME_ETH_IRQ  (114)
  41#define GPIO0_INCOME_SD_DETECT  (0)
  42#define GPIO0_INCOME_SD_RO      (1)
  43#define GPIO54_INCOME_LED_A     (54)
  44#define GPIO55_INCOME_LED_B     (55)
  45#define GPIO113_INCOME_TS_IRQ   (113)
  46
  47/******************************************************************************
  48 * SD/MMC card controller
  49 ******************************************************************************/
  50#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
  51static struct pxamci_platform_data income_mci_platform_data = {
  52        .ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34,
  53        .gpio_power             = -1,
  54        .gpio_card_detect       = GPIO0_INCOME_SD_DETECT,
  55        .gpio_card_ro           = GPIO0_INCOME_SD_RO,
  56        .detect_delay_ms        = 200,
  57};
  58
  59static void __init income_mmc_init(void)
  60{
  61        pxa_set_mci_info(&income_mci_platform_data);
  62}
  63#else
  64static inline void income_mmc_init(void) {}
  65#endif
  66
  67/******************************************************************************
  68 * USB Host
  69 ******************************************************************************/
  70#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
  71static struct pxaohci_platform_data income_ohci_info = {
  72        .port_mode      = PMM_PERPORT_MODE,
  73        .flags          = ENABLE_PORT1 | POWER_CONTROL_LOW | POWER_SENSE_LOW,
  74};
  75
  76static void __init income_uhc_init(void)
  77{
  78        pxa_set_ohci_info(&income_ohci_info);
  79}
  80#else
  81static inline void income_uhc_init(void) {}
  82#endif
  83
  84/******************************************************************************
  85 * LED
  86 ******************************************************************************/
  87#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
  88struct gpio_led income_gpio_leds[] = {
  89        {
  90                .name                   = "income:green:leda",
  91                .default_trigger        = "none",
  92                .gpio                   = GPIO54_INCOME_LED_A,
  93                .active_low             = 1,
  94        },
  95        {
  96                .name                   = "income:green:ledb",
  97                .default_trigger        = "none",
  98                .gpio                   = GPIO55_INCOME_LED_B,
  99                .active_low             = 1,
 100        }
 101};
 102
 103static struct gpio_led_platform_data income_gpio_led_info = {
 104        .leds           = income_gpio_leds,
 105        .num_leds       = ARRAY_SIZE(income_gpio_leds),
 106};
 107
 108static struct platform_device income_leds = {
 109        .name   = "leds-gpio",
 110        .id     = -1,
 111        .dev    = {
 112                .platform_data  = &income_gpio_led_info,
 113        }
 114};
 115
 116static void __init income_led_init(void)
 117{
 118        platform_device_register(&income_leds);
 119}
 120#else
 121static inline void income_led_init(void) {}
 122#endif
 123
 124/******************************************************************************
 125 * I2C
 126 ******************************************************************************/
 127#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
 128static struct i2c_board_info __initdata income_i2c_devs[] = {
 129        {
 130                I2C_BOARD_INFO("ds1340", 0x68),
 131        }, {
 132                I2C_BOARD_INFO("lm75", 0x4f),
 133        },
 134};
 135
 136static void __init income_i2c_init(void)
 137{
 138        pxa_set_i2c_info(NULL);
 139        pxa27x_set_i2c_power_info(NULL);
 140        i2c_register_board_info(0, ARRAY_AND_SIZE(income_i2c_devs));
 141}
 142#else
 143static inline void income_i2c_init(void) {}
 144#endif
 145
 146/******************************************************************************
 147 * Framebuffer
 148 ******************************************************************************/
 149#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
 150static struct pxafb_mode_info income_lcd_modes[] = {
 151{
 152        .pixclock       = 144700,
 153        .xres           = 320,
 154        .yres           = 240,
 155        .bpp            = 32,
 156        .depth          = 18,
 157
 158        .left_margin    = 10,
 159        .right_margin   = 10,
 160        .upper_margin   = 7,
 161        .lower_margin   = 8,
 162
 163        .hsync_len      = 20,
 164        .vsync_len      = 2,
 165
 166        .sync           = FB_SYNC_VERT_HIGH_ACT,
 167},
 168};
 169
 170static struct pxafb_mach_info income_lcd_screen = {
 171        .modes          = income_lcd_modes,
 172        .num_modes      = ARRAY_SIZE(income_lcd_modes),
 173        .lcd_conn       = LCD_COLOR_TFT_18BPP | LCD_PCLK_EDGE_FALL,
 174};
 175
 176static void __init income_lcd_init(void)
 177{
 178        pxa_set_fb_info(NULL, &income_lcd_screen);
 179}
 180#else
 181static inline void income_lcd_init(void) {}
 182#endif
 183
 184/******************************************************************************
 185 * Backlight
 186 ******************************************************************************/
 187#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
 188static struct pwm_lookup income_pwm_lookup[] = {
 189        PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.0", NULL, 1000000,
 190                   PWM_POLARITY_NORMAL),
 191};
 192
 193static struct platform_pwm_backlight_data income_backlight_data = {
 194        .max_brightness = 0x3ff,
 195        .dft_brightness = 0x1ff,
 196        .enable_gpio    = -1,
 197};
 198
 199static struct platform_device income_backlight = {
 200        .name   = "pwm-backlight",
 201        .dev    = {
 202                .parent         = &pxa27x_device_pwm0.dev,
 203                .platform_data  = &income_backlight_data,
 204        },
 205};
 206
 207static void __init income_pwm_init(void)
 208{
 209        pwm_add_table(income_pwm_lookup, ARRAY_SIZE(income_pwm_lookup));
 210        platform_device_register(&income_backlight);
 211}
 212#else
 213static inline void income_pwm_init(void) {}
 214#endif
 215
 216void __init colibri_pxa270_income_boardinit(void)
 217{
 218        pxa_set_ffuart_info(NULL);
 219        pxa_set_btuart_info(NULL);
 220        pxa_set_stuart_info(NULL);
 221
 222        income_mmc_init();
 223        income_uhc_init();
 224        income_led_init();
 225        income_i2c_init();
 226        income_lcd_init();
 227        income_pwm_init();
 228}
 229
 230