Merge remote-tracking branches 'asoc/fix/atmel', 'asoc/fix/fsl', 'asoc/fix/tegra...
[linux-drm-fsl-dcu.git] / arch / arm / mach-pxa / colibri-pxa270-income.c
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_backlight.h>
24 #include <linux/i2c/pxa-i2c.h>
25
26 #include <asm/irq.h>
27 #include <asm/mach-types.h>
28
29 #include <mach/hardware.h>
30 #include <linux/platform_data/mmc-pxamci.h>
31 #include <linux/platform_data/usb-ohci-pxa27x.h>
32 #include <mach/pxa27x.h>
33 #include <mach/pxa27x-udc.h>
34 #include <linux/platform_data/video-pxafb.h>
35
36 #include "devices.h"
37 #include "generic.h"
38
39 #define GPIO114_INCOME_ETH_IRQ  (114)
40 #define GPIO0_INCOME_SD_DETECT  (0)
41 #define GPIO0_INCOME_SD_RO      (1)
42 #define GPIO54_INCOME_LED_A     (54)
43 #define GPIO55_INCOME_LED_B     (55)
44 #define GPIO113_INCOME_TS_IRQ   (113)
45
46 /******************************************************************************
47  * SD/MMC card controller
48  ******************************************************************************/
49 #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
50 static struct pxamci_platform_data income_mci_platform_data = {
51         .ocr_mask               = MMC_VDD_32_33 | MMC_VDD_33_34,
52         .gpio_power             = -1,
53         .gpio_card_detect       = GPIO0_INCOME_SD_DETECT,
54         .gpio_card_ro           = GPIO0_INCOME_SD_RO,
55         .detect_delay_ms        = 200,
56 };
57
58 static void __init income_mmc_init(void)
59 {
60         pxa_set_mci_info(&income_mci_platform_data);
61 }
62 #else
63 static inline void income_mmc_init(void) {}
64 #endif
65
66 /******************************************************************************
67  * USB Host
68  ******************************************************************************/
69 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
70 static struct pxaohci_platform_data income_ohci_info = {
71         .port_mode      = PMM_PERPORT_MODE,
72         .flags          = ENABLE_PORT1 | POWER_CONTROL_LOW | POWER_SENSE_LOW,
73 };
74
75 static void __init income_uhc_init(void)
76 {
77         pxa_set_ohci_info(&income_ohci_info);
78 }
79 #else
80 static inline void income_uhc_init(void) {}
81 #endif
82
83 /******************************************************************************
84  * LED
85  ******************************************************************************/
86 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
87 struct gpio_led income_gpio_leds[] = {
88         {
89                 .name                   = "income:green:leda",
90                 .default_trigger        = "none",
91                 .gpio                   = GPIO54_INCOME_LED_A,
92                 .active_low             = 1,
93         },
94         {
95                 .name                   = "income:green:ledb",
96                 .default_trigger        = "none",
97                 .gpio                   = GPIO55_INCOME_LED_B,
98                 .active_low             = 1,
99         }
100 };
101
102 static struct gpio_led_platform_data income_gpio_led_info = {
103         .leds           = income_gpio_leds,
104         .num_leds       = ARRAY_SIZE(income_gpio_leds),
105 };
106
107 static struct platform_device income_leds = {
108         .name   = "leds-gpio",
109         .id     = -1,
110         .dev    = {
111                 .platform_data  = &income_gpio_led_info,
112         }
113 };
114
115 static void __init income_led_init(void)
116 {
117         platform_device_register(&income_leds);
118 }
119 #else
120 static inline void income_led_init(void) {}
121 #endif
122
123 /******************************************************************************
124  * I2C
125  ******************************************************************************/
126 #if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
127 static struct i2c_board_info __initdata income_i2c_devs[] = {
128         {
129                 I2C_BOARD_INFO("ds1340", 0x68),
130         }, {
131                 I2C_BOARD_INFO("lm75", 0x4f),
132         },
133 };
134
135 static void __init income_i2c_init(void)
136 {
137         pxa_set_i2c_info(NULL);
138         pxa27x_set_i2c_power_info(NULL);
139         i2c_register_board_info(0, ARRAY_AND_SIZE(income_i2c_devs));
140 }
141 #else
142 static inline void income_i2c_init(void) {}
143 #endif
144
145 /******************************************************************************
146  * Framebuffer
147  ******************************************************************************/
148 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
149 static struct pxafb_mode_info income_lcd_modes[] = {
150 {
151         .pixclock       = 144700,
152         .xres           = 320,
153         .yres           = 240,
154         .bpp            = 32,
155         .depth          = 18,
156
157         .left_margin    = 10,
158         .right_margin   = 10,
159         .upper_margin   = 7,
160         .lower_margin   = 8,
161
162         .hsync_len      = 20,
163         .vsync_len      = 2,
164
165         .sync           = FB_SYNC_VERT_HIGH_ACT,
166 },
167 };
168
169 static struct pxafb_mach_info income_lcd_screen = {
170         .modes          = income_lcd_modes,
171         .num_modes      = ARRAY_SIZE(income_lcd_modes),
172         .lcd_conn       = LCD_COLOR_TFT_18BPP | LCD_PCLK_EDGE_FALL,
173 };
174
175 static void __init income_lcd_init(void)
176 {
177         pxa_set_fb_info(NULL, &income_lcd_screen);
178 }
179 #else
180 static inline void income_lcd_init(void) {}
181 #endif
182
183 /******************************************************************************
184  * Backlight
185  ******************************************************************************/
186 #if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
187 static struct platform_pwm_backlight_data income_backlight_data = {
188         .pwm_id         = 0,
189         .max_brightness = 0x3ff,
190         .dft_brightness = 0x1ff,
191         .pwm_period_ns  = 1000000,
192         .enable_gpio    = -1,
193 };
194
195 static struct platform_device income_backlight = {
196         .name   = "pwm-backlight",
197         .dev    = {
198                 .parent         = &pxa27x_device_pwm0.dev,
199                 .platform_data  = &income_backlight_data,
200         },
201 };
202
203 static void __init income_pwm_init(void)
204 {
205         platform_device_register(&income_backlight);
206 }
207 #else
208 static inline void income_pwm_init(void) {}
209 #endif
210
211 void __init colibri_pxa270_income_boardinit(void)
212 {
213         pxa_set_ffuart_info(NULL);
214         pxa_set_btuart_info(NULL);
215         pxa_set_stuart_info(NULL);
216
217         income_mmc_init();
218         income_uhc_init();
219         income_led_init();
220         income_i2c_init();
221         income_lcd_init();
222         income_pwm_init();
223 }
224