Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-pxa/idp.c
10817 views
1
/*
2
* linux/arch/arm/mach-pxa/idp.c
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
7
*
8
* Copyright (c) 2001 Cliff Brake, Accelent Systems Inc.
9
*
10
* 2001-09-13: Cliff Brake <[email protected]>
11
* Initial code
12
*
13
* 2005-02-15: Cliff Brake <[email protected]>
14
* <http://www.vibren.com> <http://bec-systems.com>
15
* Updated for 2.6 kernel
16
*
17
*/
18
19
#include <linux/init.h>
20
#include <linux/interrupt.h>
21
#include <linux/irq.h>
22
#include <linux/platform_device.h>
23
#include <linux/fb.h>
24
25
#include <asm/setup.h>
26
#include <asm/memory.h>
27
#include <asm/mach-types.h>
28
#include <mach/hardware.h>
29
#include <asm/irq.h>
30
31
#include <asm/mach/arch.h>
32
#include <asm/mach/map.h>
33
34
#include <mach/pxa25x.h>
35
#include <mach/idp.h>
36
#include <mach/pxafb.h>
37
#include <mach/bitfield.h>
38
#include <mach/mmc.h>
39
40
#include "generic.h"
41
#include "devices.h"
42
43
/* TODO:
44
* - add pxa2xx_audio_ops_t device structure
45
* - Ethernet interrupt
46
*/
47
48
static unsigned long idp_pin_config[] __initdata = {
49
/* LCD */
50
GPIOxx_LCD_DSTN_16BPP,
51
52
/* BTUART */
53
GPIO42_BTUART_RXD,
54
GPIO43_BTUART_TXD,
55
GPIO44_BTUART_CTS,
56
GPIO45_BTUART_RTS,
57
58
/* STUART */
59
GPIO46_STUART_RXD,
60
GPIO47_STUART_TXD,
61
62
/* MMC */
63
GPIO6_MMC_CLK,
64
GPIO8_MMC_CS0,
65
66
/* Ethernet */
67
GPIO33_nCS_5, /* Ethernet CS */
68
GPIO4_GPIO, /* Ethernet IRQ */
69
};
70
71
static struct resource smc91x_resources[] = {
72
[0] = {
73
.start = (IDP_ETH_PHYS + 0x300),
74
.end = (IDP_ETH_PHYS + 0xfffff),
75
.flags = IORESOURCE_MEM,
76
},
77
[1] = {
78
.start = IRQ_GPIO(4),
79
.end = IRQ_GPIO(4),
80
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
81
}
82
};
83
84
static struct platform_device smc91x_device = {
85
.name = "smc91x",
86
.id = 0,
87
.num_resources = ARRAY_SIZE(smc91x_resources),
88
.resource = smc91x_resources,
89
};
90
91
static void idp_backlight_power(int on)
92
{
93
if (on) {
94
IDP_CPLD_LCD |= (1<<1);
95
} else {
96
IDP_CPLD_LCD &= ~(1<<1);
97
}
98
}
99
100
static void idp_vlcd(int on)
101
{
102
if (on) {
103
IDP_CPLD_LCD |= (1<<2);
104
} else {
105
IDP_CPLD_LCD &= ~(1<<2);
106
}
107
}
108
109
static void idp_lcd_power(int on, struct fb_var_screeninfo *var)
110
{
111
if (on) {
112
IDP_CPLD_LCD |= (1<<0);
113
} else {
114
IDP_CPLD_LCD &= ~(1<<0);
115
}
116
117
/* call idp_vlcd for now as core driver does not support
118
* both power and vlcd hooks. Note, this is not technically
119
* the correct sequence, but seems to work. Disclaimer:
120
* this may eventually damage the display.
121
*/
122
123
idp_vlcd(on);
124
}
125
126
static struct pxafb_mode_info sharp_lm8v31_mode = {
127
.pixclock = 270000,
128
.xres = 640,
129
.yres = 480,
130
.bpp = 16,
131
.hsync_len = 1,
132
.left_margin = 3,
133
.right_margin = 3,
134
.vsync_len = 1,
135
.upper_margin = 0,
136
.lower_margin = 0,
137
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
138
.cmap_greyscale = 0,
139
};
140
141
static struct pxafb_mach_info sharp_lm8v31 = {
142
.modes = &sharp_lm8v31_mode,
143
.num_modes = 1,
144
.cmap_inverse = 0,
145
.cmap_static = 0,
146
.lcd_conn = LCD_COLOR_DSTN_16BPP | LCD_PCLK_EDGE_FALL |
147
LCD_AC_BIAS_FREQ(255),
148
.pxafb_backlight_power = &idp_backlight_power,
149
.pxafb_lcd_power = &idp_lcd_power
150
};
151
152
static struct pxamci_platform_data idp_mci_platform_data = {
153
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
154
.gpio_card_detect = -1,
155
.gpio_card_ro = -1,
156
.gpio_power = -1,
157
};
158
159
static void __init idp_init(void)
160
{
161
printk("idp_init()\n");
162
163
pxa2xx_mfp_config(ARRAY_AND_SIZE(idp_pin_config));
164
pxa_set_ffuart_info(NULL);
165
pxa_set_btuart_info(NULL);
166
pxa_set_stuart_info(NULL);
167
168
platform_device_register(&smc91x_device);
169
//platform_device_register(&mst_audio_device);
170
pxa_set_fb_info(NULL, &sharp_lm8v31);
171
pxa_set_mci_info(&idp_mci_platform_data);
172
}
173
174
static struct map_desc idp_io_desc[] __initdata = {
175
{
176
.virtual = IDP_COREVOLT_VIRT,
177
.pfn = __phys_to_pfn(IDP_COREVOLT_PHYS),
178
.length = IDP_COREVOLT_SIZE,
179
.type = MT_DEVICE
180
}, {
181
.virtual = IDP_CPLD_VIRT,
182
.pfn = __phys_to_pfn(IDP_CPLD_PHYS),
183
.length = IDP_CPLD_SIZE,
184
.type = MT_DEVICE
185
}
186
};
187
188
static void __init idp_map_io(void)
189
{
190
pxa25x_map_io();
191
iotable_init(idp_io_desc, ARRAY_SIZE(idp_io_desc));
192
}
193
194
195
MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")
196
/* Maintainer: Vibren Technologies */
197
.map_io = idp_map_io,
198
.init_irq = pxa25x_init_irq,
199
.timer = &pxa_timer,
200
.init_machine = idp_init,
201
MACHINE_END
202
203