Linux Audio

Check our new training course

Loading...
v3.15
 
  1/*
  2 *  linux/arch/arm/mach-pxa/littleton.c
  3 *
  4 *  Support for the Marvell Littleton Development Platform.
  5 *
  6 *  Author:	Jason Chagas (largely modified code)
  7 *  Created:	Nov 20, 2006
  8 *  Copyright:	(C) Copyright 2006 Marvell International Ltd.
  9 *
 10 *  2007-11-22  modified to align with latest kernel
 11 *              eric miao <eric.miao@marvell.com>
 12 *
 13 *  This program is free software; you can redistribute it and/or modify
 14 *  it under the terms of the GNU General Public License version 2 as
 15 *  publishhed by the Free Software Foundation.
 16 */
 17
 18#include <linux/init.h>
 19#include <linux/interrupt.h>
 20#include <linux/delay.h>
 21#include <linux/platform_device.h>
 22#include <linux/clk.h>
 23#include <linux/gpio.h>
 24#include <linux/spi/spi.h>
 25#include <linux/spi/pxa2xx_spi.h>
 26#include <linux/smc91x.h>
 27#include <linux/i2c.h>
 28#include <linux/leds.h>
 29#include <linux/mfd/da903x.h>
 30#include <linux/i2c/max732x.h>
 31#include <linux/i2c/pxa-i2c.h>
 32
 33#include <asm/types.h>
 34#include <asm/setup.h>
 35#include <asm/memory.h>
 36#include <asm/mach-types.h>
 37#include <mach/hardware.h>
 38#include <asm/irq.h>
 39
 40#include <asm/mach/arch.h>
 41#include <asm/mach/map.h>
 42#include <asm/mach/irq.h>
 43
 44#include <mach/pxa300.h>
 
 45#include <linux/platform_data/video-pxafb.h>
 46#include <linux/platform_data/mmc-pxamci.h>
 47#include <linux/platform_data/keypad-pxa27x.h>
 48#include <mach/littleton.h>
 49#include <linux/platform_data/mtd-nand-pxa3xx.h>
 50
 51#include "generic.h"
 52
 53#define GPIO_MMC1_CARD_DETECT	mfp_to_gpio(MFP_PIN_GPIO15)
 54
 55/* Littleton MFP configurations */
 56static mfp_cfg_t littleton_mfp_cfg[] __initdata = {
 57	/* LCD */
 58	GPIO54_LCD_LDD_0,
 59	GPIO55_LCD_LDD_1,
 60	GPIO56_LCD_LDD_2,
 61	GPIO57_LCD_LDD_3,
 62	GPIO58_LCD_LDD_4,
 63	GPIO59_LCD_LDD_5,
 64	GPIO60_LCD_LDD_6,
 65	GPIO61_LCD_LDD_7,
 66	GPIO62_LCD_LDD_8,
 67	GPIO63_LCD_LDD_9,
 68	GPIO64_LCD_LDD_10,
 69	GPIO65_LCD_LDD_11,
 70	GPIO66_LCD_LDD_12,
 71	GPIO67_LCD_LDD_13,
 72	GPIO68_LCD_LDD_14,
 73	GPIO69_LCD_LDD_15,
 74	GPIO70_LCD_LDD_16,
 75	GPIO71_LCD_LDD_17,
 76	GPIO72_LCD_FCLK,
 77	GPIO73_LCD_LCLK,
 78	GPIO74_LCD_PCLK,
 79	GPIO75_LCD_BIAS,
 80
 81	/* SSP2 */
 82	GPIO25_SSP2_SCLK,
 83	GPIO27_SSP2_TXD,
 84	GPIO17_GPIO,	/* SFRM as chip-select */
 85
 86	/* Debug Ethernet */
 87	GPIO90_GPIO,
 88
 89	/* Keypad */
 90	GPIO107_KP_DKIN_0,
 91	GPIO108_KP_DKIN_1,
 92	GPIO115_KP_MKIN_0,
 93	GPIO116_KP_MKIN_1,
 94	GPIO117_KP_MKIN_2,
 95	GPIO118_KP_MKIN_3,
 96	GPIO119_KP_MKIN_4,
 97	GPIO120_KP_MKIN_5,
 98	GPIO121_KP_MKOUT_0,
 99	GPIO122_KP_MKOUT_1,
100	GPIO123_KP_MKOUT_2,
101	GPIO124_KP_MKOUT_3,
102	GPIO125_KP_MKOUT_4,
103
104	/* MMC1 */
105	GPIO3_MMC1_DAT0,
106	GPIO4_MMC1_DAT1,
107	GPIO5_MMC1_DAT2,
108	GPIO6_MMC1_DAT3,
109	GPIO7_MMC1_CLK,
110	GPIO8_MMC1_CMD,
111	GPIO15_GPIO, /* card detect */
112
113	/* UART3 */
114	GPIO107_UART3_CTS,
115	GPIO108_UART3_RTS,
116	GPIO109_UART3_TXD,
117	GPIO110_UART3_RXD,
118};
119
120static struct resource smc91x_resources[] = {
121	[0] = {
122		.start	= (LITTLETON_ETH_PHYS + 0x300),
123		.end	= (LITTLETON_ETH_PHYS + 0xfffff),
124		.flags	= IORESOURCE_MEM,
125	},
126	[1] = {
127		.start	= PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO90)),
128		.end	= PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO90)),
129		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
130	}
131};
132
133static struct smc91x_platdata littleton_smc91x_info = {
134	.flags	= SMC91X_USE_8BIT | SMC91X_USE_16BIT |
135		  SMC91X_NOWAIT | SMC91X_USE_DMA,
136};
137
138static struct platform_device smc91x_device = {
139	.name		= "smc91x",
140	.id		= 0,
141	.num_resources	= ARRAY_SIZE(smc91x_resources),
142	.resource	= smc91x_resources,
143	.dev		= {
144		.platform_data = &littleton_smc91x_info,
145	},
146};
147
148#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
149static struct pxafb_mode_info tpo_tdo24mtea1_modes[] = {
150	[0] = {
151		/* VGA */
152		.pixclock	= 38250,
153		.xres		= 480,
154		.yres		= 640,
155		.bpp		= 16,
156		.hsync_len	= 8,
157		.left_margin	= 8,
158		.right_margin	= 24,
159		.vsync_len	= 2,
160		.upper_margin	= 2,
161		.lower_margin	= 4,
162		.sync		= 0,
163	},
164	[1] = {
165		/* QVGA */
166		.pixclock	= 153000,
167		.xres		= 240,
168		.yres		= 320,
169		.bpp		= 16,
170		.hsync_len	= 8,
171		.left_margin	= 8,
172		.right_margin	= 88,
173		.vsync_len	= 2,
174		.upper_margin	= 2,
175		.lower_margin	= 2,
176		.sync		= 0,
177	},
178};
179
180static struct pxafb_mach_info littleton_lcd_info = {
181	.modes			= tpo_tdo24mtea1_modes,
182	.num_modes		= 2,
183	.lcd_conn		= LCD_COLOR_TFT_16BPP,
184};
185
186static void littleton_init_lcd(void)
187{
188	pxa_set_fb_info(NULL, &littleton_lcd_info);
189}
190#else
191static inline void littleton_init_lcd(void) {};
192#endif /* CONFIG_FB_PXA || CONFIG_FB_PXA_MODULE */
193
194#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
195static struct pxa2xx_spi_master littleton_spi_info = {
196	.num_chipselect		= 1,
197};
198
199static struct pxa2xx_spi_chip littleton_tdo24m_chip = {
200	.rx_threshold	= 1,
201	.tx_threshold	= 1,
202	.gpio_cs	= LITTLETON_GPIO_LCD_CS,
203};
204
205static struct spi_board_info littleton_spi_devices[] __initdata = {
206	{
207		.modalias	= "tdo24m",
208		.max_speed_hz	= 1000000,
209		.bus_num	= 2,
210		.chip_select	= 0,
211		.controller_data= &littleton_tdo24m_chip,
212	},
213};
214
215static void __init littleton_init_spi(void)
216{
217	pxa2xx_set_spi_info(2, &littleton_spi_info);
218	spi_register_board_info(ARRAY_AND_SIZE(littleton_spi_devices));
219}
220#else
221static inline void littleton_init_spi(void) {}
222#endif
223
224#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
225static const unsigned int littleton_matrix_key_map[] = {
226	/* KEY(row, col, key_code) */
227	KEY(1, 3, KEY_0), KEY(0, 0, KEY_1), KEY(1, 0, KEY_2), KEY(2, 0, KEY_3),
228	KEY(0, 1, KEY_4), KEY(1, 1, KEY_5), KEY(2, 1, KEY_6), KEY(0, 2, KEY_7),
229	KEY(1, 2, KEY_8), KEY(2, 2, KEY_9),
230
231	KEY(0, 3, KEY_KPASTERISK), 	/* * */
232	KEY(2, 3, KEY_KPDOT), 		/* # */
233
234	KEY(5, 4, KEY_ENTER),
235
236	KEY(5, 0, KEY_UP),
237	KEY(5, 1, KEY_DOWN),
238	KEY(5, 2, KEY_LEFT),
239	KEY(5, 3, KEY_RIGHT),
240	KEY(3, 2, KEY_HOME),
241	KEY(4, 1, KEY_END),
242	KEY(3, 3, KEY_BACK),
243
244	KEY(4, 0, KEY_SEND),
245	KEY(4, 2, KEY_VOLUMEUP),
246	KEY(4, 3, KEY_VOLUMEDOWN),
247
248	KEY(3, 0, KEY_F22),	/* soft1 */
249	KEY(3, 1, KEY_F23),	/* soft2 */
250};
251
252static struct matrix_keymap_data littleton_matrix_keymap_data = {
253	.keymap			= littleton_matrix_key_map,
254	.keymap_size		= ARRAY_SIZE(littleton_matrix_key_map),
255};
256
257static struct pxa27x_keypad_platform_data littleton_keypad_info = {
258	.matrix_key_rows	= 6,
259	.matrix_key_cols	= 5,
260	.matrix_keymap_data	= &littleton_matrix_keymap_data,
261
262	.enable_rotary0		= 1,
263	.rotary0_up_key		= KEY_UP,
264	.rotary0_down_key	= KEY_DOWN,
265
266	.debounce_interval	= 30,
267};
268static void __init littleton_init_keypad(void)
269{
270	pxa_set_keypad_info(&littleton_keypad_info);
271}
272#else
273static inline void littleton_init_keypad(void) {}
274#endif
275
276#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
277static struct pxamci_platform_data littleton_mci_platform_data = {
278	.detect_delay_ms	= 200,
279	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
280	.gpio_card_detect	= GPIO_MMC1_CARD_DETECT,
281	.gpio_card_ro		= -1,
282	.gpio_power		= -1,
 
 
 
 
 
 
 
283};
284
285static void __init littleton_init_mmc(void)
286{
 
287	pxa_set_mci_info(&littleton_mci_platform_data);
288}
289#else
290static inline void littleton_init_mmc(void) {}
291#endif
292
293#if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE)
294static struct mtd_partition littleton_nand_partitions[] = {
295	[0] = {
296		.name        = "Bootloader",
297		.offset      = 0,
298		.size        = 0x060000,
299		.mask_flags  = MTD_WRITEABLE, /* force read-only */
300	},
301	[1] = {
302		.name        = "Kernel",
303		.offset      = 0x060000,
304		.size        = 0x200000,
305		.mask_flags  = MTD_WRITEABLE, /* force read-only */
306	},
307	[2] = {
308		.name        = "Filesystem",
309		.offset      = 0x0260000,
310		.size        = 0x3000000,     /* 48M - rootfs */
311	},
312	[3] = {
313		.name        = "MassStorage",
314		.offset      = 0x3260000,
315		.size        = 0x3d40000,
316	},
317	[4] = {
318		.name        = "BBT",
319		.offset      = 0x6FA0000,
320		.size        = 0x80000,
321		.mask_flags  = MTD_WRITEABLE,  /* force read-only */
322	},
323	/* NOTE: we reserve some blocks at the end of the NAND flash for
324	 * bad block management, and the max number of relocation blocks
325	 * differs on different platforms. Please take care with it when
326	 * defining the partition table.
327	 */
328};
329
330static struct pxa3xx_nand_platform_data littleton_nand_info = {
331	.enable_arbiter	= 1,
332	.num_cs		= 1,
333	.parts[0]	= littleton_nand_partitions,
334	.nr_parts[0]	= ARRAY_SIZE(littleton_nand_partitions),
335};
336
337static void __init littleton_init_nand(void)
338{
339	pxa3xx_set_nand_info(&littleton_nand_info);
340}
341#else
342static inline void littleton_init_nand(void) {}
343#endif /* CONFIG_MTD_NAND_PXA3xx || CONFIG_MTD_NAND_PXA3xx_MODULE */
344
345#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
346static struct led_info littleton_da9034_leds[] = {
347	[0] = {
348		.name	= "littleton:keypad1",
349		.flags	= DA9034_LED_RAMP,
350	},
351	[1] = {
352		.name	= "littleton:keypad2",
353		.flags	= DA9034_LED_RAMP,
354	},
355	[2] = {
356		.name	= "littleton:vibra",
357		.flags	= 0,
358	},
359};
360
361static struct da9034_touch_pdata littleton_da9034_touch = {
362	.x_inverted     = 1,
363	.interval_ms    = 20,
364};
365
366static struct da903x_subdev_info littleton_da9034_subdevs[] = {
367	{
368		.name		= "da903x-led",
369		.id		= DA9034_ID_LED_1,
370		.platform_data	= &littleton_da9034_leds[0],
371	}, {
372		.name		= "da903x-led",
373		.id		= DA9034_ID_LED_2,
374		.platform_data	= &littleton_da9034_leds[1],
375	}, {
376		.name		= "da903x-led",
377		.id		= DA9034_ID_VIBRA,
378		.platform_data	= &littleton_da9034_leds[2],
379	}, {
380		.name		= "da903x-backlight",
381		.id		= DA9034_ID_WLED,
382	}, {
383		.name		= "da9034-touch",
384		.id		= DA9034_ID_TOUCH,
385		.platform_data	= &littleton_da9034_touch,
386	},
387};
388
389static struct da903x_platform_data littleton_da9034_info = {
390	.num_subdevs	= ARRAY_SIZE(littleton_da9034_subdevs),
391	.subdevs	= littleton_da9034_subdevs,
392};
393
394static struct max732x_platform_data littleton_max7320_info = {
395	.gpio_base	= EXT0_GPIO_BASE,
396};
397
398static struct i2c_board_info littleton_i2c_info[] = {
399	[0] = {
400		.type		= "da9034",
401		.addr		= 0x34,
402		.platform_data	= &littleton_da9034_info,
403		.irq		= PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO18)),
404	},
405	[1] = {
406		.type		= "max7320",
407		.addr		= 0x50,
408		.platform_data	= &littleton_max7320_info,
409	},
410};
411
412static void __init littleton_init_i2c(void)
413{
414	pxa_set_i2c_info(NULL);
415	i2c_register_board_info(0, ARRAY_AND_SIZE(littleton_i2c_info));
416}
417#else
418static inline void littleton_init_i2c(void) {}
419#endif /* CONFIG_I2C_PXA || CONFIG_I2C_PXA_MODULE */
420
421static void __init littleton_init(void)
422{
423	/* initialize MFP configurations */
424	pxa3xx_mfp_config(ARRAY_AND_SIZE(littleton_mfp_cfg));
425
426	pxa_set_ffuart_info(NULL);
427	pxa_set_btuart_info(NULL);
428	pxa_set_stuart_info(NULL);
429
430	/*
431	 * Note: we depend bootloader set the correct
432	 * value to MSC register for SMC91x.
433	 */
434	platform_device_register(&smc91x_device);
435
436	littleton_init_spi();
437	littleton_init_i2c();
438	littleton_init_mmc();
439	littleton_init_lcd();
440	littleton_init_keypad();
441	littleton_init_nand();
442}
443
444MACHINE_START(LITTLETON, "Marvell Form Factor Development Platform (aka Littleton)")
445	.atag_offset	= 0x100,
446	.map_io		= pxa3xx_map_io,
447	.nr_irqs	= LITTLETON_NR_IRQS,
448	.init_irq	= pxa3xx_init_irq,
449	.handle_irq	= pxa3xx_handle_irq,
450	.init_time	= pxa_timer_init,
451	.init_machine	= littleton_init,
452	.restart	= pxa_restart,
453MACHINE_END
v5.14.15
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 *  linux/arch/arm/mach-pxa/littleton.c
  4 *
  5 *  Support for the Marvell Littleton Development Platform.
  6 *
  7 *  Author:	Jason Chagas (largely modified code)
  8 *  Created:	Nov 20, 2006
  9 *  Copyright:	(C) Copyright 2006 Marvell International Ltd.
 10 *
 11 *  2007-11-22  modified to align with latest kernel
 12 *              eric miao <eric.miao@marvell.com>
 
 
 
 
 13 */
 14
 15#include <linux/init.h>
 16#include <linux/interrupt.h>
 17#include <linux/delay.h>
 18#include <linux/platform_device.h>
 19#include <linux/clk.h>
 20#include <linux/gpio/machine.h>
 21#include <linux/spi/spi.h>
 22#include <linux/spi/pxa2xx_spi.h>
 23#include <linux/smc91x.h>
 24#include <linux/i2c.h>
 25#include <linux/leds.h>
 26#include <linux/mfd/da903x.h>
 27#include <linux/platform_data/max732x.h>
 28#include <linux/platform_data/i2c-pxa.h>
 29
 30#include <asm/types.h>
 31#include <asm/setup.h>
 32#include <asm/memory.h>
 33#include <asm/mach-types.h>
 34#include <mach/hardware.h>
 35#include <asm/irq.h>
 36
 37#include <asm/mach/arch.h>
 38#include <asm/mach/map.h>
 39#include <asm/mach/irq.h>
 40
 41#include "pxa300.h"
 42#include "devices.h"
 43#include <linux/platform_data/video-pxafb.h>
 44#include <linux/platform_data/mmc-pxamci.h>
 45#include <linux/platform_data/keypad-pxa27x.h>
 46#include "littleton.h"
 47#include <linux/platform_data/mtd-nand-pxa3xx.h>
 48
 49#include "generic.h"
 50
 
 
 51/* Littleton MFP configurations */
 52static mfp_cfg_t littleton_mfp_cfg[] __initdata = {
 53	/* LCD */
 54	GPIO54_LCD_LDD_0,
 55	GPIO55_LCD_LDD_1,
 56	GPIO56_LCD_LDD_2,
 57	GPIO57_LCD_LDD_3,
 58	GPIO58_LCD_LDD_4,
 59	GPIO59_LCD_LDD_5,
 60	GPIO60_LCD_LDD_6,
 61	GPIO61_LCD_LDD_7,
 62	GPIO62_LCD_LDD_8,
 63	GPIO63_LCD_LDD_9,
 64	GPIO64_LCD_LDD_10,
 65	GPIO65_LCD_LDD_11,
 66	GPIO66_LCD_LDD_12,
 67	GPIO67_LCD_LDD_13,
 68	GPIO68_LCD_LDD_14,
 69	GPIO69_LCD_LDD_15,
 70	GPIO70_LCD_LDD_16,
 71	GPIO71_LCD_LDD_17,
 72	GPIO72_LCD_FCLK,
 73	GPIO73_LCD_LCLK,
 74	GPIO74_LCD_PCLK,
 75	GPIO75_LCD_BIAS,
 76
 77	/* SSP2 */
 78	GPIO25_SSP2_SCLK,
 79	GPIO27_SSP2_TXD,
 80	GPIO17_GPIO,	/* SFRM as chip-select */
 81
 82	/* Debug Ethernet */
 83	GPIO90_GPIO,
 84
 85	/* Keypad */
 86	GPIO107_KP_DKIN_0,
 87	GPIO108_KP_DKIN_1,
 88	GPIO115_KP_MKIN_0,
 89	GPIO116_KP_MKIN_1,
 90	GPIO117_KP_MKIN_2,
 91	GPIO118_KP_MKIN_3,
 92	GPIO119_KP_MKIN_4,
 93	GPIO120_KP_MKIN_5,
 94	GPIO121_KP_MKOUT_0,
 95	GPIO122_KP_MKOUT_1,
 96	GPIO123_KP_MKOUT_2,
 97	GPIO124_KP_MKOUT_3,
 98	GPIO125_KP_MKOUT_4,
 99
100	/* MMC1 */
101	GPIO3_MMC1_DAT0,
102	GPIO4_MMC1_DAT1,
103	GPIO5_MMC1_DAT2,
104	GPIO6_MMC1_DAT3,
105	GPIO7_MMC1_CLK,
106	GPIO8_MMC1_CMD,
107	GPIO15_GPIO, /* card detect */
108
109	/* UART3 */
110	GPIO107_UART3_CTS,
111	GPIO108_UART3_RTS,
112	GPIO109_UART3_TXD,
113	GPIO110_UART3_RXD,
114};
115
116static struct resource smc91x_resources[] = {
117	[0] = {
118		.start	= (LITTLETON_ETH_PHYS + 0x300),
119		.end	= (LITTLETON_ETH_PHYS + 0xfffff),
120		.flags	= IORESOURCE_MEM,
121	},
122	[1] = {
123		.start	= PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO90)),
124		.end	= PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO90)),
125		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
126	}
127};
128
129static struct smc91x_platdata littleton_smc91x_info = {
130	.flags	= SMC91X_USE_8BIT | SMC91X_USE_16BIT |
131		  SMC91X_NOWAIT | SMC91X_USE_DMA,
132};
133
134static struct platform_device smc91x_device = {
135	.name		= "smc91x",
136	.id		= 0,
137	.num_resources	= ARRAY_SIZE(smc91x_resources),
138	.resource	= smc91x_resources,
139	.dev		= {
140		.platform_data = &littleton_smc91x_info,
141	},
142};
143
144#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
145static struct pxafb_mode_info tpo_tdo24mtea1_modes[] = {
146	[0] = {
147		/* VGA */
148		.pixclock	= 38250,
149		.xres		= 480,
150		.yres		= 640,
151		.bpp		= 16,
152		.hsync_len	= 8,
153		.left_margin	= 8,
154		.right_margin	= 24,
155		.vsync_len	= 2,
156		.upper_margin	= 2,
157		.lower_margin	= 4,
158		.sync		= 0,
159	},
160	[1] = {
161		/* QVGA */
162		.pixclock	= 153000,
163		.xres		= 240,
164		.yres		= 320,
165		.bpp		= 16,
166		.hsync_len	= 8,
167		.left_margin	= 8,
168		.right_margin	= 88,
169		.vsync_len	= 2,
170		.upper_margin	= 2,
171		.lower_margin	= 2,
172		.sync		= 0,
173	},
174};
175
176static struct pxafb_mach_info littleton_lcd_info = {
177	.modes			= tpo_tdo24mtea1_modes,
178	.num_modes		= 2,
179	.lcd_conn		= LCD_COLOR_TFT_16BPP,
180};
181
182static void __init littleton_init_lcd(void)
183{
184	pxa_set_fb_info(NULL, &littleton_lcd_info);
185}
186#else
187static inline void littleton_init_lcd(void) {};
188#endif /* CONFIG_FB_PXA || CONFIG_FB_PXA_MODULE */
189
190#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
191static struct pxa2xx_spi_controller littleton_spi_info = {
192	.num_chipselect		= 1,
193};
194
195static struct pxa2xx_spi_chip littleton_tdo24m_chip = {
196	.rx_threshold	= 1,
197	.tx_threshold	= 1,
198	.gpio_cs	= LITTLETON_GPIO_LCD_CS,
199};
200
201static struct spi_board_info littleton_spi_devices[] __initdata = {
202	{
203		.modalias	= "tdo24m",
204		.max_speed_hz	= 1000000,
205		.bus_num	= 2,
206		.chip_select	= 0,
207		.controller_data= &littleton_tdo24m_chip,
208	},
209};
210
211static void __init littleton_init_spi(void)
212{
213	pxa2xx_set_spi_info(2, &littleton_spi_info);
214	spi_register_board_info(ARRAY_AND_SIZE(littleton_spi_devices));
215}
216#else
217static inline void littleton_init_spi(void) {}
218#endif
219
220#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
221static const unsigned int littleton_matrix_key_map[] = {
222	/* KEY(row, col, key_code) */
223	KEY(1, 3, KEY_0), KEY(0, 0, KEY_1), KEY(1, 0, KEY_2), KEY(2, 0, KEY_3),
224	KEY(0, 1, KEY_4), KEY(1, 1, KEY_5), KEY(2, 1, KEY_6), KEY(0, 2, KEY_7),
225	KEY(1, 2, KEY_8), KEY(2, 2, KEY_9),
226
227	KEY(0, 3, KEY_KPASTERISK), 	/* * */
228	KEY(2, 3, KEY_KPDOT), 		/* # */
229
230	KEY(5, 4, KEY_ENTER),
231
232	KEY(5, 0, KEY_UP),
233	KEY(5, 1, KEY_DOWN),
234	KEY(5, 2, KEY_LEFT),
235	KEY(5, 3, KEY_RIGHT),
236	KEY(3, 2, KEY_HOME),
237	KEY(4, 1, KEY_END),
238	KEY(3, 3, KEY_BACK),
239
240	KEY(4, 0, KEY_SEND),
241	KEY(4, 2, KEY_VOLUMEUP),
242	KEY(4, 3, KEY_VOLUMEDOWN),
243
244	KEY(3, 0, KEY_F22),	/* soft1 */
245	KEY(3, 1, KEY_F23),	/* soft2 */
246};
247
248static struct matrix_keymap_data littleton_matrix_keymap_data = {
249	.keymap			= littleton_matrix_key_map,
250	.keymap_size		= ARRAY_SIZE(littleton_matrix_key_map),
251};
252
253static struct pxa27x_keypad_platform_data littleton_keypad_info = {
254	.matrix_key_rows	= 6,
255	.matrix_key_cols	= 5,
256	.matrix_keymap_data	= &littleton_matrix_keymap_data,
257
258	.enable_rotary0		= 1,
259	.rotary0_up_key		= KEY_UP,
260	.rotary0_down_key	= KEY_DOWN,
261
262	.debounce_interval	= 30,
263};
264static void __init littleton_init_keypad(void)
265{
266	pxa_set_keypad_info(&littleton_keypad_info);
267}
268#else
269static inline void littleton_init_keypad(void) {}
270#endif
271
272#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
273static struct pxamci_platform_data littleton_mci_platform_data = {
274	.detect_delay_ms	= 200,
275	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
276};
277
278static struct gpiod_lookup_table littleton_mci_gpio_table = {
279	.dev_id = "pxa2xx-mci.0",
280	.table = {
281		/* Card detect on MFP (gpio-pxa) GPIO 15 */
282		GPIO_LOOKUP("gpio-pxa", MFP_PIN_GPIO15,
283			    "cd", GPIO_ACTIVE_LOW),
284		{ },
285	},
286};
287
288static void __init littleton_init_mmc(void)
289{
290	gpiod_add_lookup_table(&littleton_mci_gpio_table);
291	pxa_set_mci_info(&littleton_mci_platform_data);
292}
293#else
294static inline void littleton_init_mmc(void) {}
295#endif
296
297#if IS_ENABLED(CONFIG_MTD_NAND_MARVELL)
298static struct mtd_partition littleton_nand_partitions[] = {
299	[0] = {
300		.name        = "Bootloader",
301		.offset      = 0,
302		.size        = 0x060000,
303		.mask_flags  = MTD_WRITEABLE, /* force read-only */
304	},
305	[1] = {
306		.name        = "Kernel",
307		.offset      = 0x060000,
308		.size        = 0x200000,
309		.mask_flags  = MTD_WRITEABLE, /* force read-only */
310	},
311	[2] = {
312		.name        = "Filesystem",
313		.offset      = 0x0260000,
314		.size        = 0x3000000,     /* 48M - rootfs */
315	},
316	[3] = {
317		.name        = "MassStorage",
318		.offset      = 0x3260000,
319		.size        = 0x3d40000,
320	},
321	[4] = {
322		.name        = "BBT",
323		.offset      = 0x6FA0000,
324		.size        = 0x80000,
325		.mask_flags  = MTD_WRITEABLE,  /* force read-only */
326	},
327	/* NOTE: we reserve some blocks at the end of the NAND flash for
328	 * bad block management, and the max number of relocation blocks
329	 * differs on different platforms. Please take care with it when
330	 * defining the partition table.
331	 */
332};
333
334static struct pxa3xx_nand_platform_data littleton_nand_info = {
335	.parts		= littleton_nand_partitions,
336	.nr_parts	= ARRAY_SIZE(littleton_nand_partitions),
 
 
337};
338
339static void __init littleton_init_nand(void)
340{
341	pxa3xx_set_nand_info(&littleton_nand_info);
342}
343#else
344static inline void littleton_init_nand(void) {}
345#endif /* IS_ENABLED(CONFIG_MTD_NAND_MARVELL) */
346
347#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
348static struct led_info littleton_da9034_leds[] = {
349	[0] = {
350		.name	= "littleton:keypad1",
351		.flags	= DA9034_LED_RAMP,
352	},
353	[1] = {
354		.name	= "littleton:keypad2",
355		.flags	= DA9034_LED_RAMP,
356	},
357	[2] = {
358		.name	= "littleton:vibra",
359		.flags	= 0,
360	},
361};
362
363static struct da9034_touch_pdata littleton_da9034_touch = {
364	.x_inverted     = 1,
365	.interval_ms    = 20,
366};
367
368static struct da903x_subdev_info littleton_da9034_subdevs[] = {
369	{
370		.name		= "da903x-led",
371		.id		= DA9034_ID_LED_1,
372		.platform_data	= &littleton_da9034_leds[0],
373	}, {
374		.name		= "da903x-led",
375		.id		= DA9034_ID_LED_2,
376		.platform_data	= &littleton_da9034_leds[1],
377	}, {
378		.name		= "da903x-led",
379		.id		= DA9034_ID_VIBRA,
380		.platform_data	= &littleton_da9034_leds[2],
381	}, {
382		.name		= "da903x-backlight",
383		.id		= DA9034_ID_WLED,
384	}, {
385		.name		= "da9034-touch",
386		.id		= DA9034_ID_TOUCH,
387		.platform_data	= &littleton_da9034_touch,
388	},
389};
390
391static struct da903x_platform_data littleton_da9034_info = {
392	.num_subdevs	= ARRAY_SIZE(littleton_da9034_subdevs),
393	.subdevs	= littleton_da9034_subdevs,
394};
395
396static struct max732x_platform_data littleton_max7320_info = {
397	.gpio_base	= EXT0_GPIO_BASE,
398};
399
400static struct i2c_board_info littleton_i2c_info[] = {
401	[0] = {
402		.type		= "da9034",
403		.addr		= 0x34,
404		.platform_data	= &littleton_da9034_info,
405		.irq		= PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO18)),
406	},
407	[1] = {
408		.type		= "max7320",
409		.addr		= 0x50,
410		.platform_data	= &littleton_max7320_info,
411	},
412};
413
414static void __init littleton_init_i2c(void)
415{
416	pxa_set_i2c_info(NULL);
417	i2c_register_board_info(0, ARRAY_AND_SIZE(littleton_i2c_info));
418}
419#else
420static inline void littleton_init_i2c(void) {}
421#endif /* CONFIG_I2C_PXA || CONFIG_I2C_PXA_MODULE */
422
423static void __init littleton_init(void)
424{
425	/* initialize MFP configurations */
426	pxa3xx_mfp_config(ARRAY_AND_SIZE(littleton_mfp_cfg));
427
428	pxa_set_ffuart_info(NULL);
429	pxa_set_btuart_info(NULL);
430	pxa_set_stuart_info(NULL);
431
432	/*
433	 * Note: we depend bootloader set the correct
434	 * value to MSC register for SMC91x.
435	 */
436	platform_device_register(&smc91x_device);
437
438	littleton_init_spi();
439	littleton_init_i2c();
440	littleton_init_mmc();
441	littleton_init_lcd();
442	littleton_init_keypad();
443	littleton_init_nand();
444}
445
446MACHINE_START(LITTLETON, "Marvell Form Factor Development Platform (aka Littleton)")
447	.atag_offset	= 0x100,
448	.map_io		= pxa3xx_map_io,
449	.nr_irqs	= LITTLETON_NR_IRQS,
450	.init_irq	= pxa3xx_init_irq,
451	.handle_irq	= pxa3xx_handle_irq,
452	.init_time	= pxa_timer_init,
453	.init_machine	= littleton_init,
454	.restart	= pxa_restart,
455MACHINE_END