PageRenderTime 34ms CodeModel.GetById 14ms app.highlight 16ms RepoModel.GetById 1ms app.codeStats 1ms

/arch/arm/mach-ep93xx/edb93xx.c

https://github.com/AICP/kernel_google_msm
C | 351 lines | 254 code | 45 blank | 52 comment | 29 complexity | e6e59bb86f91c0e95bdce116a149abe1 MD5 | raw file
  1/*
  2 * arch/arm/mach-ep93xx/edb93xx.c
  3 * Cirrus Logic EDB93xx Development Board support.
  4 *
  5 * EDB93XX, EDB9301, EDB9307A
  6 * Copyright (C) 2008-2009 H Hartley Sweeten <hsweeten@visionengravers.com>
  7 *
  8 * EDB9302
  9 * Copyright (C) 2006 George Kashperko <george@chas.com.ua>
 10 *
 11 * EDB9302A, EDB9315, EDB9315A
 12 * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
 13 *
 14 * EDB9307
 15 * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
 16 *
 17 * EDB9312
 18 * Copyright (C) 2006 Infosys Technologies Limited
 19 *                    Toufeeq Hussain <toufeeq_hussain@infosys.com>
 20 *
 21 * This program is free software; you can redistribute it and/or modify
 22 * it under the terms of the GNU General Public License as published by
 23 * the Free Software Foundation; either version 2 of the License, or (at
 24 * your option) any later version.
 25 */
 26
 27#include <linux/kernel.h>
 28#include <linux/init.h>
 29#include <linux/platform_device.h>
 30#include <linux/gpio.h>
 31#include <linux/i2c.h>
 32#include <linux/i2c-gpio.h>
 33#include <linux/spi/spi.h>
 34
 35#include <sound/cs4271.h>
 36
 37#include <mach/hardware.h>
 38#include <mach/fb.h>
 39#include <mach/ep93xx_spi.h>
 40#include <mach/gpio-ep93xx.h>
 41
 42#include <asm/hardware/vic.h>
 43#include <asm/mach-types.h>
 44#include <asm/mach/arch.h>
 45
 46#include "soc.h"
 47
 48static void __init edb93xx_register_flash(void)
 49{
 50	if (machine_is_edb9307() || machine_is_edb9312() ||
 51	    machine_is_edb9315()) {
 52		ep93xx_register_flash(4, EP93XX_CS6_PHYS_BASE, SZ_32M);
 53	} else {
 54		ep93xx_register_flash(2, EP93XX_CS6_PHYS_BASE, SZ_16M);
 55	}
 56}
 57
 58static struct ep93xx_eth_data __initdata edb93xx_eth_data = {
 59	.phy_id		= 1,
 60};
 61
 62
 63/*************************************************************************
 64 * EDB93xx i2c peripheral handling
 65 *************************************************************************/
 66static struct i2c_gpio_platform_data __initdata edb93xx_i2c_gpio_data = {
 67	.sda_pin		= EP93XX_GPIO_LINE_EEDAT,
 68	.sda_is_open_drain	= 0,
 69	.scl_pin		= EP93XX_GPIO_LINE_EECLK,
 70	.scl_is_open_drain	= 0,
 71	.udelay			= 0,	/* default to 100 kHz */
 72	.timeout		= 0,	/* default to 100 ms */
 73};
 74
 75static struct i2c_board_info __initdata edb93xxa_i2c_board_info[] = {
 76	{
 77		I2C_BOARD_INFO("isl1208", 0x6f),
 78	},
 79};
 80
 81static struct i2c_board_info __initdata edb93xx_i2c_board_info[] = {
 82	{
 83		I2C_BOARD_INFO("ds1337", 0x68),
 84	},
 85};
 86
 87static void __init edb93xx_register_i2c(void)
 88{
 89	if (machine_is_edb9302a() || machine_is_edb9307a() ||
 90	    machine_is_edb9315a()) {
 91		ep93xx_register_i2c(&edb93xx_i2c_gpio_data,
 92				    edb93xxa_i2c_board_info,
 93				    ARRAY_SIZE(edb93xxa_i2c_board_info));
 94	} else if (machine_is_edb9307() || machine_is_edb9312() ||
 95		   machine_is_edb9315()) {
 96		ep93xx_register_i2c(&edb93xx_i2c_gpio_data,
 97				    edb93xx_i2c_board_info,
 98				    ARRAY_SIZE(edb93xx_i2c_board_info));
 99	}
100}
101
102
103/*************************************************************************
104 * EDB93xx SPI peripheral handling
105 *************************************************************************/
106static struct cs4271_platform_data edb93xx_cs4271_data = {
107	.gpio_nreset	= -EINVAL,	/* filled in later */
108};
109
110static int edb93xx_cs4271_hw_setup(struct spi_device *spi)
111{
112	return gpio_request_one(EP93XX_GPIO_LINE_EGPIO6,
113				GPIOF_OUT_INIT_HIGH, spi->modalias);
114}
115
116static void edb93xx_cs4271_hw_cleanup(struct spi_device *spi)
117{
118	gpio_free(EP93XX_GPIO_LINE_EGPIO6);
119}
120
121static void edb93xx_cs4271_hw_cs_control(struct spi_device *spi, int value)
122{
123	gpio_set_value(EP93XX_GPIO_LINE_EGPIO6, value);
124}
125
126static struct ep93xx_spi_chip_ops edb93xx_cs4271_hw = {
127	.setup		= edb93xx_cs4271_hw_setup,
128	.cleanup	= edb93xx_cs4271_hw_cleanup,
129	.cs_control	= edb93xx_cs4271_hw_cs_control,
130};
131
132static struct spi_board_info edb93xx_spi_board_info[] __initdata = {
133	{
134		.modalias		= "cs4271",
135		.platform_data		= &edb93xx_cs4271_data,
136		.controller_data	= &edb93xx_cs4271_hw,
137		.max_speed_hz		= 6000000,
138		.bus_num		= 0,
139		.chip_select		= 0,
140		.mode			= SPI_MODE_3,
141	},
142};
143
144static struct ep93xx_spi_info edb93xx_spi_info __initdata = {
145	.num_chipselect	= ARRAY_SIZE(edb93xx_spi_board_info),
146};
147
148static void __init edb93xx_register_spi(void)
149{
150	if (machine_is_edb9301() || machine_is_edb9302())
151		edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO1;
152	else if (machine_is_edb9302a() || machine_is_edb9307a())
153		edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_H(2);
154	else if (machine_is_edb9315a())
155		edb93xx_cs4271_data.gpio_nreset = EP93XX_GPIO_LINE_EGPIO14;
156
157	ep93xx_register_spi(&edb93xx_spi_info, edb93xx_spi_board_info,
158			    ARRAY_SIZE(edb93xx_spi_board_info));
159}
160
161
162/*************************************************************************
163 * EDB93xx I2S
164 *************************************************************************/
165static struct platform_device edb93xx_audio_device = {
166	.name		= "edb93xx-audio",
167	.id		= -1,
168};
169
170static int __init edb93xx_has_audio(void)
171{
172	return (machine_is_edb9301() || machine_is_edb9302() ||
173		machine_is_edb9302a() || machine_is_edb9307a() ||
174		machine_is_edb9315a());
175}
176
177static void __init edb93xx_register_i2s(void)
178{
179	if (edb93xx_has_audio()) {
180		ep93xx_register_i2s();
181		platform_device_register(&edb93xx_audio_device);
182	}
183}
184
185
186/*************************************************************************
187 * EDB93xx pwm
188 *************************************************************************/
189static void __init edb93xx_register_pwm(void)
190{
191	if (machine_is_edb9301() ||
192	    machine_is_edb9302() || machine_is_edb9302a()) {
193		/* EP9301 and EP9302 only have pwm.1 (EGPIO14) */
194		ep93xx_register_pwm(0, 1);
195	} else if (machine_is_edb9307() || machine_is_edb9307a()) {
196		/* EP9307 only has pwm.0 (PWMOUT) */
197		ep93xx_register_pwm(1, 0);
198	} else {
199		/* EP9312 and EP9315 have both */
200		ep93xx_register_pwm(1, 1);
201	}
202}
203
204
205/*************************************************************************
206 * EDB93xx framebuffer
207 *************************************************************************/
208static struct ep93xxfb_mach_info __initdata edb93xxfb_info = {
209	.num_modes	= EP93XXFB_USE_MODEDB,
210	.bpp		= 16,
211	.flags		= 0,
212};
213
214static int __init edb93xx_has_fb(void)
215{
216	/* These platforms have an ep93xx with video capability */
217	return machine_is_edb9307() || machine_is_edb9307a() ||
218	       machine_is_edb9312() || machine_is_edb9315() ||
219	       machine_is_edb9315a();
220}
221
222static void __init edb93xx_register_fb(void)
223{
224	if (!edb93xx_has_fb())
225		return;
226
227	if (machine_is_edb9307a() || machine_is_edb9315a())
228		edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN0;
229	else
230		edb93xxfb_info.flags |= EP93XXFB_USE_SDCSN3;
231
232	ep93xx_register_fb(&edb93xxfb_info);
233}
234
235
236static void __init edb93xx_init_machine(void)
237{
238	ep93xx_init_devices();
239	edb93xx_register_flash();
240	ep93xx_register_eth(&edb93xx_eth_data, 1);
241	edb93xx_register_i2c();
242	edb93xx_register_spi();
243	edb93xx_register_i2s();
244	edb93xx_register_pwm();
245	edb93xx_register_fb();
246}
247
248
249#ifdef CONFIG_MACH_EDB9301
250MACHINE_START(EDB9301, "Cirrus Logic EDB9301 Evaluation Board")
251	/* Maintainer: H Hartley Sweeten <hsweeten@visionengravers.com> */
252	.atag_offset	= 0x100,
253	.map_io		= ep93xx_map_io,
254	.init_irq	= ep93xx_init_irq,
255	.handle_irq	= vic_handle_irq,
256	.timer		= &ep93xx_timer,
257	.init_machine	= edb93xx_init_machine,
258	.restart	= ep93xx_restart,
259MACHINE_END
260#endif
261
262#ifdef CONFIG_MACH_EDB9302
263MACHINE_START(EDB9302, "Cirrus Logic EDB9302 Evaluation Board")
264	/* Maintainer: George Kashperko <george@chas.com.ua> */
265	.atag_offset	= 0x100,
266	.map_io		= ep93xx_map_io,
267	.init_irq	= ep93xx_init_irq,
268	.handle_irq	= vic_handle_irq,
269	.timer		= &ep93xx_timer,
270	.init_machine	= edb93xx_init_machine,
271	.restart	= ep93xx_restart,
272MACHINE_END
273#endif
274
275#ifdef CONFIG_MACH_EDB9302A
276MACHINE_START(EDB9302A, "Cirrus Logic EDB9302A Evaluation Board")
277	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
278	.atag_offset	= 0x100,
279	.map_io		= ep93xx_map_io,
280	.init_irq	= ep93xx_init_irq,
281	.handle_irq	= vic_handle_irq,
282	.timer		= &ep93xx_timer,
283	.init_machine	= edb93xx_init_machine,
284	.restart	= ep93xx_restart,
285MACHINE_END
286#endif
287
288#ifdef CONFIG_MACH_EDB9307
289MACHINE_START(EDB9307, "Cirrus Logic EDB9307 Evaluation Board")
290	/* Maintainer: Herbert Valerio Riedel <hvr@gnu.org> */
291	.atag_offset	= 0x100,
292	.map_io		= ep93xx_map_io,
293	.init_irq	= ep93xx_init_irq,
294	.handle_irq	= vic_handle_irq,
295	.timer		= &ep93xx_timer,
296	.init_machine	= edb93xx_init_machine,
297	.restart	= ep93xx_restart,
298MACHINE_END
299#endif
300
301#ifdef CONFIG_MACH_EDB9307A
302MACHINE_START(EDB9307A, "Cirrus Logic EDB9307A Evaluation Board")
303	/* Maintainer: H Hartley Sweeten <hsweeten@visionengravers.com> */
304	.atag_offset	= 0x100,
305	.map_io		= ep93xx_map_io,
306	.init_irq	= ep93xx_init_irq,
307	.handle_irq	= vic_handle_irq,
308	.timer		= &ep93xx_timer,
309	.init_machine	= edb93xx_init_machine,
310	.restart	= ep93xx_restart,
311MACHINE_END
312#endif
313
314#ifdef CONFIG_MACH_EDB9312
315MACHINE_START(EDB9312, "Cirrus Logic EDB9312 Evaluation Board")
316	/* Maintainer: Toufeeq Hussain <toufeeq_hussain@infosys.com> */
317	.atag_offset	= 0x100,
318	.map_io		= ep93xx_map_io,
319	.init_irq	= ep93xx_init_irq,
320	.handle_irq	= vic_handle_irq,
321	.timer		= &ep93xx_timer,
322	.init_machine	= edb93xx_init_machine,
323	.restart	= ep93xx_restart,
324MACHINE_END
325#endif
326
327#ifdef CONFIG_MACH_EDB9315
328MACHINE_START(EDB9315, "Cirrus Logic EDB9315 Evaluation Board")
329	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
330	.atag_offset	= 0x100,
331	.map_io		= ep93xx_map_io,
332	.init_irq	= ep93xx_init_irq,
333	.handle_irq	= vic_handle_irq,
334	.timer		= &ep93xx_timer,
335	.init_machine	= edb93xx_init_machine,
336	.restart	= ep93xx_restart,
337MACHINE_END
338#endif
339
340#ifdef CONFIG_MACH_EDB9315A
341MACHINE_START(EDB9315A, "Cirrus Logic EDB9315A Evaluation Board")
342	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
343	.atag_offset	= 0x100,
344	.map_io		= ep93xx_map_io,
345	.init_irq	= ep93xx_init_irq,
346	.handle_irq	= vic_handle_irq,
347	.timer		= &ep93xx_timer,
348	.init_machine	= edb93xx_init_machine,
349	.restart	= ep93xx_restart,
350MACHINE_END
351#endif