1/*
2 * ATSTK1000 board-specific setup code.
3 *
4 * Copyright (C) 2005-2006 Atmel Corporation
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/bootmem.h>
11#include <linux/fb.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/types.h>
15#include <linux/linkage.h>
16
17#include <video/atmel_lcdc.h>
18
19#include <asm/setup.h>
20
21#include <mach/at32ap700x.h>
22#include <mach/board.h>
23#include <mach/portmux.h>
24
25#include "atstk1000.h"
26
27/* Initialized by bootloader-specific startup code. */
28struct tag *bootloader_tags __initdata;
29
30static struct fb_videomode __initdata ltv350qv_modes[] = {
31	{
32		.name		= "320x240 @ 75",
33		.refresh	= 75,
34		.xres		= 320,		.yres		= 240,
35		.pixclock	= KHZ2PICOS(6891),
36
37		.left_margin	= 17,		.right_margin	= 33,
38		.upper_margin	= 10,		.lower_margin	= 10,
39		.hsync_len	= 16,		.vsync_len	= 1,
40
41		.sync		= 0,
42		.vmode		= FB_VMODE_NONINTERLACED,
43	},
44};
45
46static struct fb_monspecs __initdata atstk1000_default_monspecs = {
47	.manufacturer		= "SNG",
48	.monitor		= "LTV350QV",
49	.modedb			= ltv350qv_modes,
50	.modedb_len		= ARRAY_SIZE(ltv350qv_modes),
51	.hfmin			= 14820,
52	.hfmax			= 22230,
53	.vfmin			= 60,
54	.vfmax			= 90,
55	.dclkmax		= 30000000,
56};
57
58struct atmel_lcdfb_pdata __initdata atstk1000_lcdc_data = {
59	.default_bpp		= 24,
60	.default_dmacon		= ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
61	.default_lcdcon2	= (ATMEL_LCDC_DISTYPE_TFT
62				   | ATMEL_LCDC_INVCLK
63				   | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE
64				   | ATMEL_LCDC_MEMOR_BIG),
65	.default_monspecs	= &atstk1000_default_monspecs,
66	.guard_time		= 2,
67};
68
69#ifdef CONFIG_BOARD_ATSTK1000_J2_LED
70#include <linux/leds.h>
71
72static struct gpio_led stk1000_j2_led[] = {
73#ifdef CONFIG_BOARD_ATSTK1000_J2_LED8
74#define LEDSTRING "J2 jumpered to LED8"
75	{ .name = "led0:amber", .gpio = GPIO_PIN_PB( 8), },
76	{ .name = "led1:amber", .gpio = GPIO_PIN_PB( 9), },
77	{ .name = "led2:amber", .gpio = GPIO_PIN_PB(10), },
78	{ .name = "led3:amber", .gpio = GPIO_PIN_PB(13), },
79	{ .name = "led4:amber", .gpio = GPIO_PIN_PB(14), },
80	{ .name = "led5:amber", .gpio = GPIO_PIN_PB(15), },
81	{ .name = "led6:amber", .gpio = GPIO_PIN_PB(16), },
82	{ .name = "led7:amber", .gpio = GPIO_PIN_PB(30),
83			.default_trigger = "heartbeat", },
84#else	/* RGB */
85#define LEDSTRING "J2 jumpered to RGB LEDs"
86	{ .name = "r1:red",     .gpio = GPIO_PIN_PB( 8), },
87	{ .name = "g1:green",   .gpio = GPIO_PIN_PB(10), },
88	{ .name = "b1:blue",    .gpio = GPIO_PIN_PB(14), },
89
90	{ .name = "r2:red",     .gpio = GPIO_PIN_PB( 9),
91			.default_trigger = "heartbeat", },
92	{ .name = "g2:green",   .gpio = GPIO_PIN_PB(13), },
93	{ .name = "b2:blue",    .gpio = GPIO_PIN_PB(15),
94			.default_trigger = "heartbeat", },
95	/* PB16, PB30 unused */
96#endif
97};
98
99static struct gpio_led_platform_data stk1000_j2_led_data = {
100	.num_leds	= ARRAY_SIZE(stk1000_j2_led),
101	.leds		= stk1000_j2_led,
102};
103
104static struct platform_device stk1000_j2_led_dev = {
105	.name		= "leds-gpio",
106	.id		= 2,	/* gpio block J2 */
107	.dev		= {
108		.platform_data	= &stk1000_j2_led_data,
109	},
110};
111
112void __init atstk1000_setup_j2_leds(void)
113{
114	unsigned	i;
115
116	for (i = 0; i < ARRAY_SIZE(stk1000_j2_led); i++)
117		at32_select_gpio(stk1000_j2_led[i].gpio, AT32_GPIOF_OUTPUT);
118
119	printk("STK1000: " LEDSTRING "\n");
120	platform_device_register(&stk1000_j2_led_dev);
121}
122#else /* CONFIG_BOARD_ATSTK1000_J2_LED */
123void __init atstk1000_setup_j2_leds(void)
124{
125
126}
127#endif /* CONFIG_BOARD_ATSTK1000_J2_LED */
128