1/*
2 *  Copyright (C) 2000, 2001 Blue Mug, Inc.  All Rights Reserved.
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 as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 */
9
10#include <linux/init.h>
11#include <linux/gpio.h>
12#include <linux/delay.h>
13#include <linux/memblock.h>
14#include <linux/types.h>
15#include <linux/i2c-gpio.h>
16#include <linux/interrupt.h>
17#include <linux/platform_device.h>
18#include <linux/pwm.h>
19#include <linux/pwm_backlight.h>
20#include <linux/memblock.h>
21
22#include <linux/mtd/physmap.h>
23#include <linux/mtd/partitions.h>
24
25#include <asm/setup.h>
26#include <asm/mach/map.h>
27#include <asm/mach/arch.h>
28#include <asm/mach-types.h>
29
30#include <video/platform_lcd.h>
31
32#include <mach/hardware.h>
33
34#include "common.h"
35#include "devices.h"
36
37#define VIDEORAM_SIZE		SZ_128K
38
39#define EDB7211_LCD_DC_DC_EN	CLPS711X_GPIO(3, 1)
40#define EDB7211_LCDEN		CLPS711X_GPIO(3, 2)
41#define EDB7211_LCDBL		CLPS711X_GPIO(3, 3)
42
43#define EDB7211_I2C_SDA		CLPS711X_GPIO(3, 4)
44#define EDB7211_I2C_SCL		CLPS711X_GPIO(3, 5)
45
46#define EDB7211_FLASH0_BASE	(CS0_PHYS_BASE)
47#define EDB7211_FLASH1_BASE	(CS1_PHYS_BASE)
48
49#define EDB7211_CS8900_BASE	(CS2_PHYS_BASE + 0x300)
50#define EDB7211_CS8900_IRQ	(IRQ_EINT3)
51
52/* The extra 8 lines of the keyboard matrix */
53#define EDB7211_EXTKBD_BASE	(CS3_PHYS_BASE)
54
55static struct i2c_gpio_platform_data edb7211_i2c_pdata __initdata = {
56	.sda_pin	= EDB7211_I2C_SDA,
57	.scl_pin	= EDB7211_I2C_SCL,
58	.scl_is_output_only = 1,
59};
60
61static struct resource edb7211_cs8900_resource[] __initdata = {
62	DEFINE_RES_MEM(EDB7211_CS8900_BASE, SZ_1K),
63	DEFINE_RES_IRQ(EDB7211_CS8900_IRQ),
64};
65
66static struct mtd_partition edb7211_flash_partitions[] __initdata = {
67	{
68		.name	= "Flash",
69		.offset	= 0,
70		.size	= MTDPART_SIZ_FULL,
71	},
72};
73
74static struct physmap_flash_data edb7211_flash_pdata __initdata = {
75	.width		= 4,
76	.parts		= edb7211_flash_partitions,
77	.nr_parts	= ARRAY_SIZE(edb7211_flash_partitions),
78};
79
80static struct resource edb7211_flash_resources[] __initdata = {
81	DEFINE_RES_MEM(EDB7211_FLASH0_BASE, SZ_8M),
82	DEFINE_RES_MEM(EDB7211_FLASH1_BASE, SZ_8M),
83};
84
85static struct platform_device edb7211_flash_pdev __initdata = {
86	.name		= "physmap-flash",
87	.id		= 0,
88	.resource	= edb7211_flash_resources,
89	.num_resources	= ARRAY_SIZE(edb7211_flash_resources),
90	.dev	= {
91		.platform_data	= &edb7211_flash_pdata,
92	},
93};
94
95static void edb7211_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
96{
97	if (power) {
98		gpio_set_value(EDB7211_LCDEN, 1);
99		udelay(100);
100		gpio_set_value(EDB7211_LCD_DC_DC_EN, 1);
101	} else {
102		gpio_set_value(EDB7211_LCD_DC_DC_EN, 0);
103		udelay(100);
104		gpio_set_value(EDB7211_LCDEN, 0);
105	}
106}
107
108static struct plat_lcd_data edb7211_lcd_power_pdata = {
109	.set_power	= edb7211_lcd_power_set,
110};
111
112static struct pwm_lookup edb7211_pwm_lookup[] = {
113	PWM_LOOKUP("clps711x-pwm", 0, "pwm-backlight.0", NULL,
114		   0, PWM_POLARITY_NORMAL),
115};
116
117static struct platform_pwm_backlight_data pwm_bl_pdata = {
118	.dft_brightness	= 0x01,
119	.max_brightness	= 0x0f,
120	.enable_gpio	= EDB7211_LCDBL,
121};
122
123static struct resource clps711x_pwm_res =
124	DEFINE_RES_MEM(CLPS711X_PHYS_BASE + PMPCON, SZ_4);
125
126static struct gpio edb7211_gpios[] __initconst = {
127	{ EDB7211_LCD_DC_DC_EN,	GPIOF_OUT_INIT_LOW,	"LCD DC-DC" },
128	{ EDB7211_LCDEN,	GPIOF_OUT_INIT_LOW,	"LCD POWER" },
129};
130
131/* Reserve screen memory region at the start of main system memory. */
132static void __init edb7211_reserve(void)
133{
134	memblock_reserve(PHYS_OFFSET, VIDEORAM_SIZE);
135}
136
137static void __init
138fixup_edb7211(struct tag *tags, char **cmdline)
139{
140	/*
141	 * Bank start addresses are not present in the information
142	 * passed in from the boot loader.  We could potentially
143	 * detect them, but instead we hard-code them.
144	 *
145	 * Banks sizes _are_ present in the param block, but we're
146	 * not using that information yet.
147	 */
148	memblock_add(0xc0000000, SZ_8M);
149	memblock_add(0xc1000000, SZ_8M);
150}
151
152static void __init edb7211_init_late(void)
153{
154	gpio_request_array(edb7211_gpios, ARRAY_SIZE(edb7211_gpios));
155
156	platform_device_register(&edb7211_flash_pdev);
157
158	platform_device_register_data(NULL, "platform-lcd", 0,
159				      &edb7211_lcd_power_pdata,
160				      sizeof(edb7211_lcd_power_pdata));
161
162	platform_device_register_simple("clps711x-pwm", PLATFORM_DEVID_NONE,
163					&clps711x_pwm_res, 1);
164	pwm_add_table(edb7211_pwm_lookup, ARRAY_SIZE(edb7211_pwm_lookup));
165
166	platform_device_register_data(&platform_bus, "pwm-backlight", 0,
167				      &pwm_bl_pdata, sizeof(pwm_bl_pdata));
168
169	platform_device_register_simple("video-clps711x", 0, NULL, 0);
170	platform_device_register_simple("cs89x0", 0, edb7211_cs8900_resource,
171					ARRAY_SIZE(edb7211_cs8900_resource));
172	platform_device_register_data(NULL, "i2c-gpio", 0,
173				      &edb7211_i2c_pdata,
174				      sizeof(edb7211_i2c_pdata));
175}
176
177MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
178	/* Maintainer: Jon McClintock */
179	.atag_offset	= VIDEORAM_SIZE + 0x100,
180	.fixup		= fixup_edb7211,
181	.reserve	= edb7211_reserve,
182	.map_io		= clps711x_map_io,
183	.init_irq	= clps711x_init_irq,
184	.init_time	= clps711x_timer_init,
185	.init_machine	= clps711x_devices_init,
186	.init_late	= edb7211_init_late,
187	.restart	= clps711x_restart,
188MACHINE_END
189