Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/mach-omap2/board-am3517evm.c
10817 views
1
/*
2
* linux/arch/arm/mach-omap2/board-am3517evm.c
3
*
4
* Copyright (C) 2009 Texas Instruments Incorporated
5
* Author: Ranjith Lohithakshan <[email protected]>
6
*
7
* Based on mach-omap2/board-omap3evm.c
8
*
9
* This program is free software; you can redistribute it and/or modify it
10
* under the terms of the GNU General Public License as published by the
11
* Free Software Foundation version 2.
12
*
13
* This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
14
* whether express or implied; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* General Public License for more details.
17
*/
18
19
#include <linux/kernel.h>
20
#include <linux/init.h>
21
#include <linux/clk.h>
22
#include <linux/platform_device.h>
23
#include <linux/gpio.h>
24
#include <linux/i2c/pca953x.h>
25
#include <linux/can/platform/ti_hecc.h>
26
#include <linux/davinci_emac.h>
27
28
#include <mach/hardware.h>
29
#include <mach/am35xx.h>
30
#include <asm/mach-types.h>
31
#include <asm/mach/arch.h>
32
#include <asm/mach/map.h>
33
34
#include <plat/board.h>
35
#include <plat/common.h>
36
#include <plat/usb.h>
37
#include <video/omapdss.h>
38
#include <video/omap-panel-generic-dpi.h>
39
40
#include "mux.h"
41
#include "control.h"
42
43
#define AM35XX_EVM_MDIO_FREQUENCY (1000000)
44
45
static struct mdio_platform_data am3517_evm_mdio_pdata = {
46
.bus_freq = AM35XX_EVM_MDIO_FREQUENCY,
47
};
48
49
static struct resource am3517_mdio_resources[] = {
50
{
51
.start = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET,
52
.end = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET +
53
SZ_4K - 1,
54
.flags = IORESOURCE_MEM,
55
},
56
};
57
58
static struct platform_device am3517_mdio_device = {
59
.name = "davinci_mdio",
60
.id = 0,
61
.num_resources = ARRAY_SIZE(am3517_mdio_resources),
62
.resource = am3517_mdio_resources,
63
.dev.platform_data = &am3517_evm_mdio_pdata,
64
};
65
66
static struct emac_platform_data am3517_evm_emac_pdata = {
67
.rmii_en = 1,
68
};
69
70
static struct resource am3517_emac_resources[] = {
71
{
72
.start = AM35XX_IPSS_EMAC_BASE,
73
.end = AM35XX_IPSS_EMAC_BASE + 0x2FFFF,
74
.flags = IORESOURCE_MEM,
75
},
76
{
77
.start = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
78
.end = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
79
.flags = IORESOURCE_IRQ,
80
},
81
{
82
.start = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
83
.end = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
84
.flags = IORESOURCE_IRQ,
85
},
86
{
87
.start = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
88
.end = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
89
.flags = IORESOURCE_IRQ,
90
},
91
{
92
.start = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
93
.end = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
94
.flags = IORESOURCE_IRQ,
95
},
96
};
97
98
static struct platform_device am3517_emac_device = {
99
.name = "davinci_emac",
100
.id = -1,
101
.num_resources = ARRAY_SIZE(am3517_emac_resources),
102
.resource = am3517_emac_resources,
103
};
104
105
static void am3517_enable_ethernet_int(void)
106
{
107
u32 regval;
108
109
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
110
regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
111
AM35XX_CPGMAC_C0_TX_PULSE_CLR |
112
AM35XX_CPGMAC_C0_MISC_PULSE_CLR |
113
AM35XX_CPGMAC_C0_RX_THRESH_CLR);
114
omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
115
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
116
}
117
118
static void am3517_disable_ethernet_int(void)
119
{
120
u32 regval;
121
122
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
123
regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
124
AM35XX_CPGMAC_C0_TX_PULSE_CLR);
125
omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
126
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
127
}
128
129
static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
130
{
131
unsigned int regval;
132
133
pdata->ctrl_reg_offset = AM35XX_EMAC_CNTRL_OFFSET;
134
pdata->ctrl_mod_reg_offset = AM35XX_EMAC_CNTRL_MOD_OFFSET;
135
pdata->ctrl_ram_offset = AM35XX_EMAC_CNTRL_RAM_OFFSET;
136
pdata->ctrl_ram_size = AM35XX_EMAC_CNTRL_RAM_SIZE;
137
pdata->version = EMAC_VERSION_2;
138
pdata->hw_ram_addr = AM35XX_EMAC_HW_RAM_ADDR;
139
pdata->interrupt_enable = am3517_enable_ethernet_int;
140
pdata->interrupt_disable = am3517_disable_ethernet_int;
141
am3517_emac_device.dev.platform_data = pdata;
142
platform_device_register(&am3517_emac_device);
143
platform_device_register(&am3517_mdio_device);
144
clk_add_alias(NULL, dev_name(&am3517_mdio_device.dev),
145
NULL, &am3517_emac_device.dev);
146
147
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
148
regval = regval & (~(AM35XX_CPGMACSS_SW_RST));
149
omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
150
regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
151
152
return ;
153
}
154
155
156
157
#define LCD_PANEL_PWR 176
158
#define LCD_PANEL_BKLIGHT_PWR 182
159
#define LCD_PANEL_PWM 181
160
161
static struct i2c_board_info __initdata am3517evm_i2c1_boardinfo[] = {
162
{
163
I2C_BOARD_INFO("s35390a", 0x30),
164
},
165
};
166
167
/*
168
* RTC - S35390A
169
*/
170
#define GPIO_RTCS35390A_IRQ 55
171
172
static void __init am3517_evm_rtc_init(void)
173
{
174
int r;
175
176
omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP);
177
178
r = gpio_request_one(GPIO_RTCS35390A_IRQ, GPIOF_IN, "rtcs35390a-irq");
179
if (r < 0) {
180
printk(KERN_WARNING "failed to request GPIO#%d\n",
181
GPIO_RTCS35390A_IRQ);
182
return;
183
}
184
185
am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);
186
}
187
188
/*
189
* I2C GPIO Expander - TCA6416
190
*/
191
192
/* Mounted on Base-Board */
193
static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = {
194
.gpio_base = OMAP_MAX_GPIO_LINES,
195
};
196
static struct i2c_board_info __initdata am3517evm_i2c2_boardinfo[] = {
197
{
198
I2C_BOARD_INFO("tlv320aic23", 0x1A),
199
},
200
{
201
I2C_BOARD_INFO("tca6416", 0x21),
202
.platform_data = &am3517evm_gpio_expander_info_0,
203
},
204
};
205
206
/* Mounted on UI Card */
207
static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = {
208
.gpio_base = OMAP_MAX_GPIO_LINES + 16,
209
};
210
static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = {
211
.gpio_base = OMAP_MAX_GPIO_LINES + 32,
212
};
213
static struct i2c_board_info __initdata am3517evm_i2c3_boardinfo[] = {
214
{
215
I2C_BOARD_INFO("tca6416", 0x20),
216
.platform_data = &am3517evm_ui_gpio_expander_info_1,
217
},
218
{
219
I2C_BOARD_INFO("tca6416", 0x21),
220
.platform_data = &am3517evm_ui_gpio_expander_info_2,
221
},
222
};
223
224
static int __init am3517_evm_i2c_init(void)
225
{
226
omap_register_i2c_bus(1, 400, NULL, 0);
227
omap_register_i2c_bus(2, 400, am3517evm_i2c2_boardinfo,
228
ARRAY_SIZE(am3517evm_i2c2_boardinfo));
229
omap_register_i2c_bus(3, 400, am3517evm_i2c3_boardinfo,
230
ARRAY_SIZE(am3517evm_i2c3_boardinfo));
231
232
return 0;
233
}
234
235
static int lcd_enabled;
236
static int dvi_enabled;
237
238
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
239
defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
240
static struct gpio am3517_evm_dss_gpios[] __initdata = {
241
/* GPIO 182 = LCD Backlight Power */
242
{ LCD_PANEL_BKLIGHT_PWR, GPIOF_OUT_INIT_HIGH, "lcd_backlight_pwr" },
243
/* GPIO 181 = LCD Panel PWM */
244
{ LCD_PANEL_PWM, GPIOF_OUT_INIT_HIGH, "lcd bl enable" },
245
/* GPIO 176 = LCD Panel Power enable pin */
246
{ LCD_PANEL_PWR, GPIOF_OUT_INIT_HIGH, "dvi enable" },
247
};
248
249
static void __init am3517_evm_display_init(void)
250
{
251
int r;
252
253
omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);
254
omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);
255
omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);
256
257
r = gpio_request_array(am3517_evm_dss_gpios,
258
ARRAY_SIZE(am3517_evm_dss_gpios));
259
if (r) {
260
printk(KERN_ERR "failed to get DSS panel control GPIOs\n");
261
return;
262
}
263
264
printk(KERN_INFO "Display initialized successfully\n");
265
}
266
#else
267
static void __init am3517_evm_display_init(void) {}
268
#endif
269
270
static int am3517_evm_panel_enable_lcd(struct omap_dss_device *dssdev)
271
{
272
if (dvi_enabled) {
273
printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
274
return -EINVAL;
275
}
276
gpio_set_value(LCD_PANEL_PWR, 1);
277
lcd_enabled = 1;
278
279
return 0;
280
}
281
282
static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev)
283
{
284
gpio_set_value(LCD_PANEL_PWR, 0);
285
lcd_enabled = 0;
286
}
287
288
static struct panel_generic_dpi_data lcd_panel = {
289
.name = "sharp_lq",
290
.platform_enable = am3517_evm_panel_enable_lcd,
291
.platform_disable = am3517_evm_panel_disable_lcd,
292
};
293
294
static struct omap_dss_device am3517_evm_lcd_device = {
295
.type = OMAP_DISPLAY_TYPE_DPI,
296
.name = "lcd",
297
.driver_name = "generic_dpi_panel",
298
.data = &lcd_panel,
299
.phy.dpi.data_lines = 16,
300
};
301
302
static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev)
303
{
304
return 0;
305
}
306
307
static void am3517_evm_panel_disable_tv(struct omap_dss_device *dssdev)
308
{
309
}
310
311
static struct omap_dss_device am3517_evm_tv_device = {
312
.type = OMAP_DISPLAY_TYPE_VENC,
313
.name = "tv",
314
.driver_name = "venc",
315
.phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
316
.platform_enable = am3517_evm_panel_enable_tv,
317
.platform_disable = am3517_evm_panel_disable_tv,
318
};
319
320
static int am3517_evm_panel_enable_dvi(struct omap_dss_device *dssdev)
321
{
322
if (lcd_enabled) {
323
printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
324
return -EINVAL;
325
}
326
dvi_enabled = 1;
327
328
return 0;
329
}
330
331
static void am3517_evm_panel_disable_dvi(struct omap_dss_device *dssdev)
332
{
333
dvi_enabled = 0;
334
}
335
336
static struct panel_generic_dpi_data dvi_panel = {
337
.name = "generic",
338
.platform_enable = am3517_evm_panel_enable_dvi,
339
.platform_disable = am3517_evm_panel_disable_dvi,
340
};
341
342
static struct omap_dss_device am3517_evm_dvi_device = {
343
.type = OMAP_DISPLAY_TYPE_DPI,
344
.name = "dvi",
345
.driver_name = "generic_dpi_panel",
346
.data = &dvi_panel,
347
.phy.dpi.data_lines = 24,
348
};
349
350
static struct omap_dss_device *am3517_evm_dss_devices[] = {
351
&am3517_evm_lcd_device,
352
&am3517_evm_tv_device,
353
&am3517_evm_dvi_device,
354
};
355
356
static struct omap_dss_board_info am3517_evm_dss_data = {
357
.num_devices = ARRAY_SIZE(am3517_evm_dss_devices),
358
.devices = am3517_evm_dss_devices,
359
.default_device = &am3517_evm_lcd_device,
360
};
361
362
/*
363
* Board initialization
364
*/
365
static void __init am3517_evm_init_early(void)
366
{
367
omap2_init_common_infrastructure();
368
omap2_init_common_devices(NULL, NULL);
369
}
370
371
static struct omap_musb_board_data musb_board_data = {
372
.interface_type = MUSB_INTERFACE_ULPI,
373
.mode = MUSB_OTG,
374
.power = 500,
375
.set_phy_power = am35x_musb_phy_power,
376
.clear_irq = am35x_musb_clear_irq,
377
.set_mode = am35x_set_mode,
378
.reset = am35x_musb_reset,
379
};
380
381
static __init void am3517_evm_musb_init(void)
382
{
383
u32 devconf2;
384
385
/*
386
* Set up USB clock/mode in the DEVCONF2 register.
387
*/
388
devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
389
390
/* USB2.0 PHY reference clock is 13 MHz */
391
devconf2 &= ~(CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE);
392
devconf2 |= CONF2_REFFREQ_13MHZ | CONF2_SESENDEN | CONF2_VBDTCTEN
393
| CONF2_DATPOL;
394
395
omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2);
396
397
usb_musb_init(&musb_board_data);
398
}
399
400
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
401
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
402
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
403
defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
404
.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
405
#else
406
.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
407
#endif
408
.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
409
410
.phy_reset = true,
411
.reset_gpio_port[0] = 57,
412
.reset_gpio_port[1] = -EINVAL,
413
.reset_gpio_port[2] = -EINVAL
414
};
415
416
#ifdef CONFIG_OMAP_MUX
417
static struct omap_board_mux board_mux[] __initdata = {
418
/* USB OTG DRVVBUS offset = 0x212 */
419
OMAP3_MUX(SAD2D_MCAD23, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN),
420
{ .reg_offset = OMAP_MUX_TERMINATOR },
421
};
422
#endif
423
424
425
static struct resource am3517_hecc_resources[] = {
426
{
427
.start = AM35XX_IPSS_HECC_BASE,
428
.end = AM35XX_IPSS_HECC_BASE + 0x3FFF,
429
.flags = IORESOURCE_MEM,
430
},
431
{
432
.start = INT_35XX_HECC0_IRQ,
433
.end = INT_35XX_HECC0_IRQ,
434
.flags = IORESOURCE_IRQ,
435
},
436
};
437
438
static struct platform_device am3517_hecc_device = {
439
.name = "ti_hecc",
440
.id = -1,
441
.num_resources = ARRAY_SIZE(am3517_hecc_resources),
442
.resource = am3517_hecc_resources,
443
};
444
445
static struct ti_hecc_platform_data am3517_evm_hecc_pdata = {
446
.scc_hecc_offset = AM35XX_HECC_SCC_HECC_OFFSET,
447
.scc_ram_offset = AM35XX_HECC_SCC_RAM_OFFSET,
448
.hecc_ram_offset = AM35XX_HECC_RAM_OFFSET,
449
.mbx_offset = AM35XX_HECC_MBOX_OFFSET,
450
.int_line = AM35XX_HECC_INT_LINE,
451
.version = AM35XX_HECC_VERSION,
452
};
453
454
static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata)
455
{
456
am3517_hecc_device.dev.platform_data = pdata;
457
platform_device_register(&am3517_hecc_device);
458
}
459
460
static struct omap_board_config_kernel am3517_evm_config[] __initdata = {
461
};
462
463
static void __init am3517_evm_init(void)
464
{
465
omap_board_config = am3517_evm_config;
466
omap_board_config_size = ARRAY_SIZE(am3517_evm_config);
467
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
468
469
am3517_evm_i2c_init();
470
omap_display_init(&am3517_evm_dss_data);
471
omap_serial_init();
472
473
/* Configure GPIO for EHCI port */
474
omap_mux_init_gpio(57, OMAP_PIN_OUTPUT);
475
usbhs_init(&usbhs_bdata);
476
am3517_evm_hecc_init(&am3517_evm_hecc_pdata);
477
/* DSS */
478
am3517_evm_display_init();
479
480
/* RTC - S35390A */
481
am3517_evm_rtc_init();
482
483
i2c_register_board_info(1, am3517evm_i2c1_boardinfo,
484
ARRAY_SIZE(am3517evm_i2c1_boardinfo));
485
/*Ethernet*/
486
am3517_evm_ethernet_init(&am3517_evm_emac_pdata);
487
488
/* MUSB */
489
am3517_evm_musb_init();
490
}
491
492
MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
493
.boot_params = 0x80000100,
494
.reserve = omap_reserve,
495
.map_io = omap3_map_io,
496
.init_early = am3517_evm_init_early,
497
.init_irq = omap_init_irq,
498
.init_machine = am3517_evm_init,
499
.timer = &omap_timer,
500
MACHINE_END
501
502