xref: /OK3568_Linux_fs/kernel/arch/arm/mach-pxa/poodle.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * linux/arch/arm/mach-pxa/poodle.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Support for the SHARP Poodle Board.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Based on:
8*4882a593Smuzhiyun  *  linux/arch/arm/mach-pxa/lubbock.c Author:	Nicolas Pitre
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Change Log
11*4882a593Smuzhiyun  *  12-Dec-2002 Sharp Corporation for Poodle
12*4882a593Smuzhiyun  *  John Lenz <lenz@cs.wisc.edu> updates to 2.6
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun #include <linux/kernel.h>
15*4882a593Smuzhiyun #include <linux/init.h>
16*4882a593Smuzhiyun #include <linux/export.h>
17*4882a593Smuzhiyun #include <linux/platform_device.h>
18*4882a593Smuzhiyun #include <linux/fb.h>
19*4882a593Smuzhiyun #include <linux/pm.h>
20*4882a593Smuzhiyun #include <linux/delay.h>
21*4882a593Smuzhiyun #include <linux/mtd/physmap.h>
22*4882a593Smuzhiyun #include <linux/gpio.h>
23*4882a593Smuzhiyun #include <linux/gpio/machine.h>
24*4882a593Smuzhiyun #include <linux/i2c.h>
25*4882a593Smuzhiyun #include <linux/platform_data/i2c-pxa.h>
26*4882a593Smuzhiyun #include <linux/regulator/machine.h>
27*4882a593Smuzhiyun #include <linux/spi/spi.h>
28*4882a593Smuzhiyun #include <linux/spi/ads7846.h>
29*4882a593Smuzhiyun #include <linux/spi/pxa2xx_spi.h>
30*4882a593Smuzhiyun #include <linux/mtd/sharpsl.h>
31*4882a593Smuzhiyun #include <linux/memblock.h>
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #include <mach/hardware.h>
34*4882a593Smuzhiyun #include <asm/mach-types.h>
35*4882a593Smuzhiyun #include <asm/irq.h>
36*4882a593Smuzhiyun #include <asm/setup.h>
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #include <asm/mach/arch.h>
39*4882a593Smuzhiyun #include <asm/mach/map.h>
40*4882a593Smuzhiyun #include <asm/mach/irq.h>
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #include "pxa25x.h"
43*4882a593Smuzhiyun #include <linux/platform_data/mmc-pxamci.h>
44*4882a593Smuzhiyun #include "udc.h"
45*4882a593Smuzhiyun #include <linux/platform_data/irda-pxaficp.h>
46*4882a593Smuzhiyun #include <mach/poodle.h>
47*4882a593Smuzhiyun #include <linux/platform_data/video-pxafb.h>
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #include <asm/hardware/scoop.h>
50*4882a593Smuzhiyun #include <asm/hardware/locomo.h>
51*4882a593Smuzhiyun #include <asm/mach/sharpsl_param.h>
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #include "generic.h"
54*4882a593Smuzhiyun #include "devices.h"
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun static unsigned long poodle_pin_config[] __initdata = {
57*4882a593Smuzhiyun 	/* I/O */
58*4882a593Smuzhiyun 	GPIO79_nCS_3,
59*4882a593Smuzhiyun 	GPIO80_nCS_4,
60*4882a593Smuzhiyun 	GPIO18_RDY,
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	/* Clock */
63*4882a593Smuzhiyun 	GPIO12_32KHz,
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	/* SSP1 */
66*4882a593Smuzhiyun 	GPIO23_SSP1_SCLK,
67*4882a593Smuzhiyun 	GPIO25_SSP1_TXD,
68*4882a593Smuzhiyun 	GPIO26_SSP1_RXD,
69*4882a593Smuzhiyun 	GPIO24_GPIO,	/* POODLE_GPIO_TP_CS - SFRM as chip select */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	/* I2S */
72*4882a593Smuzhiyun 	GPIO28_I2S_BITCLK_OUT,
73*4882a593Smuzhiyun 	GPIO29_I2S_SDATA_IN,
74*4882a593Smuzhiyun 	GPIO30_I2S_SDATA_OUT,
75*4882a593Smuzhiyun 	GPIO31_I2S_SYNC,
76*4882a593Smuzhiyun 	GPIO32_I2S_SYSCLK,
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	/* Infra-Red */
79*4882a593Smuzhiyun 	GPIO47_FICP_TXD,
80*4882a593Smuzhiyun 	GPIO46_FICP_RXD,
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	/* FFUART */
83*4882a593Smuzhiyun 	GPIO40_FFUART_DTR,
84*4882a593Smuzhiyun 	GPIO41_FFUART_RTS,
85*4882a593Smuzhiyun 	GPIO39_FFUART_TXD,
86*4882a593Smuzhiyun 	GPIO37_FFUART_DSR,
87*4882a593Smuzhiyun 	GPIO34_FFUART_RXD,
88*4882a593Smuzhiyun 	GPIO35_FFUART_CTS,
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	/* LCD */
91*4882a593Smuzhiyun 	GPIOxx_LCD_TFT_16BPP,
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	/* PC Card */
94*4882a593Smuzhiyun 	GPIO48_nPOE,
95*4882a593Smuzhiyun 	GPIO49_nPWE,
96*4882a593Smuzhiyun 	GPIO50_nPIOR,
97*4882a593Smuzhiyun 	GPIO51_nPIOW,
98*4882a593Smuzhiyun 	GPIO52_nPCE_1,
99*4882a593Smuzhiyun 	GPIO53_nPCE_2,
100*4882a593Smuzhiyun 	GPIO54_nPSKTSEL,
101*4882a593Smuzhiyun 	GPIO55_nPREG,
102*4882a593Smuzhiyun 	GPIO56_nPWAIT,
103*4882a593Smuzhiyun 	GPIO57_nIOIS16,
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	/* MMC */
106*4882a593Smuzhiyun 	GPIO6_MMC_CLK,
107*4882a593Smuzhiyun 	GPIO8_MMC_CS0,
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	/* GPIO */
110*4882a593Smuzhiyun 	GPIO9_GPIO,	/* POODLE_GPIO_nSD_DETECT */
111*4882a593Smuzhiyun 	GPIO7_GPIO,	/* POODLE_GPIO_nSD_WP */
112*4882a593Smuzhiyun 	GPIO3_GPIO,	/* POODLE_GPIO_SD_PWR */
113*4882a593Smuzhiyun 	GPIO33_GPIO,	/* POODLE_GPIO_SD_PWR1 */
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	GPIO20_GPIO,	/* POODLE_GPIO_USB_PULLUP */
116*4882a593Smuzhiyun 	GPIO22_GPIO,	/* POODLE_GPIO_IR_ON */
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun static struct resource poodle_scoop_resources[] = {
120*4882a593Smuzhiyun 	[0] = {
121*4882a593Smuzhiyun 		.start		= 0x10800000,
122*4882a593Smuzhiyun 		.end		= 0x10800fff,
123*4882a593Smuzhiyun 		.flags		= IORESOURCE_MEM,
124*4882a593Smuzhiyun 	},
125*4882a593Smuzhiyun };
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun static struct scoop_config poodle_scoop_setup = {
128*4882a593Smuzhiyun 	.io_dir		= POODLE_SCOOP_IO_DIR,
129*4882a593Smuzhiyun 	.io_out		= POODLE_SCOOP_IO_OUT,
130*4882a593Smuzhiyun 	.gpio_base	= POODLE_SCOOP_GPIO_BASE,
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun struct platform_device poodle_scoop_device = {
134*4882a593Smuzhiyun 	.name		= "sharp-scoop",
135*4882a593Smuzhiyun 	.id		= -1,
136*4882a593Smuzhiyun 	.dev		= {
137*4882a593Smuzhiyun 		.platform_data	= &poodle_scoop_setup,
138*4882a593Smuzhiyun 	},
139*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(poodle_scoop_resources),
140*4882a593Smuzhiyun 	.resource	= poodle_scoop_resources,
141*4882a593Smuzhiyun };
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun static struct scoop_pcmcia_dev poodle_pcmcia_scoop[] = {
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun 	.dev        = &poodle_scoop_device.dev,
146*4882a593Smuzhiyun 	.irq        = POODLE_IRQ_GPIO_CF_IRQ,
147*4882a593Smuzhiyun 	.cd_irq     = POODLE_IRQ_GPIO_CF_CD,
148*4882a593Smuzhiyun 	.cd_irq_str = "PCMCIA0 CD",
149*4882a593Smuzhiyun },
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun static struct scoop_pcmcia_config poodle_pcmcia_config = {
153*4882a593Smuzhiyun 	.devs         = &poodle_pcmcia_scoop[0],
154*4882a593Smuzhiyun 	.num_devs     = 1,
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun EXPORT_SYMBOL(poodle_scoop_device);
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun static struct platform_device poodle_audio_device = {
161*4882a593Smuzhiyun 	.name	= "poodle-audio",
162*4882a593Smuzhiyun 	.id	= -1,
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun /* LoCoMo device */
166*4882a593Smuzhiyun static struct resource locomo_resources[] = {
167*4882a593Smuzhiyun 	[0] = {
168*4882a593Smuzhiyun 		.start		= 0x10000000,
169*4882a593Smuzhiyun 		.end		= 0x10001fff,
170*4882a593Smuzhiyun 		.flags		= IORESOURCE_MEM,
171*4882a593Smuzhiyun 	},
172*4882a593Smuzhiyun 	[1] = {
173*4882a593Smuzhiyun 		.start		= PXA_GPIO_TO_IRQ(10),
174*4882a593Smuzhiyun 		.end		= PXA_GPIO_TO_IRQ(10),
175*4882a593Smuzhiyun 		.flags		= IORESOURCE_IRQ,
176*4882a593Smuzhiyun 	},
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun static struct locomo_platform_data locomo_info = {
180*4882a593Smuzhiyun 	.irq_base	= IRQ_BOARD_START,
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun struct platform_device poodle_locomo_device = {
184*4882a593Smuzhiyun 	.name		= "locomo",
185*4882a593Smuzhiyun 	.id		= 0,
186*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(locomo_resources),
187*4882a593Smuzhiyun 	.resource	= locomo_resources,
188*4882a593Smuzhiyun 	.dev		= {
189*4882a593Smuzhiyun 		.platform_data	= &locomo_info,
190*4882a593Smuzhiyun 	},
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun EXPORT_SYMBOL(poodle_locomo_device);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
196*4882a593Smuzhiyun static struct pxa2xx_spi_controller poodle_spi_info = {
197*4882a593Smuzhiyun 	.num_chipselect	= 1,
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun static struct ads7846_platform_data poodle_ads7846_info = {
201*4882a593Smuzhiyun 	.model			= 7846,
202*4882a593Smuzhiyun 	.vref_delay_usecs	= 100,
203*4882a593Smuzhiyun 	.x_plate_ohms		= 419,
204*4882a593Smuzhiyun 	.y_plate_ohms		= 486,
205*4882a593Smuzhiyun 	.gpio_pendown		= POODLE_GPIO_TP_INT,
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun static struct pxa2xx_spi_chip poodle_ads7846_chip = {
209*4882a593Smuzhiyun 	.gpio_cs		= POODLE_GPIO_TP_CS,
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun static struct spi_board_info poodle_spi_devices[] = {
213*4882a593Smuzhiyun 	{
214*4882a593Smuzhiyun 		.modalias	= "ads7846",
215*4882a593Smuzhiyun 		.max_speed_hz	= 10000,
216*4882a593Smuzhiyun 		.bus_num	= 1,
217*4882a593Smuzhiyun 		.platform_data	= &poodle_ads7846_info,
218*4882a593Smuzhiyun 		.controller_data= &poodle_ads7846_chip,
219*4882a593Smuzhiyun 		.irq		= PXA_GPIO_TO_IRQ(POODLE_GPIO_TP_INT),
220*4882a593Smuzhiyun 	},
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
poodle_init_spi(void)223*4882a593Smuzhiyun static void __init poodle_init_spi(void)
224*4882a593Smuzhiyun {
225*4882a593Smuzhiyun 	pxa2xx_set_spi_info(1, &poodle_spi_info);
226*4882a593Smuzhiyun 	spi_register_board_info(ARRAY_AND_SIZE(poodle_spi_devices));
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun #else
poodle_init_spi(void)229*4882a593Smuzhiyun static inline void poodle_init_spi(void) {}
230*4882a593Smuzhiyun #endif
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /*
233*4882a593Smuzhiyun  * MMC/SD Device
234*4882a593Smuzhiyun  *
235*4882a593Smuzhiyun  * The card detect interrupt isn't debounced so we delay it by 250ms
236*4882a593Smuzhiyun  * to give the card a chance to fully insert/eject.
237*4882a593Smuzhiyun  */
poodle_mci_init(struct device * dev,irq_handler_t poodle_detect_int,void * data)238*4882a593Smuzhiyun static int poodle_mci_init(struct device *dev, irq_handler_t poodle_detect_int, void *data)
239*4882a593Smuzhiyun {
240*4882a593Smuzhiyun 	int err;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	err = gpio_request(POODLE_GPIO_SD_PWR, "SD_PWR");
243*4882a593Smuzhiyun 	if (err)
244*4882a593Smuzhiyun 		goto err_free_2;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 	err = gpio_request(POODLE_GPIO_SD_PWR1, "SD_PWR1");
247*4882a593Smuzhiyun 	if (err)
248*4882a593Smuzhiyun 		goto err_free_3;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	gpio_direction_output(POODLE_GPIO_SD_PWR, 0);
251*4882a593Smuzhiyun 	gpio_direction_output(POODLE_GPIO_SD_PWR1, 0);
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	return 0;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun err_free_3:
256*4882a593Smuzhiyun 	gpio_free(POODLE_GPIO_SD_PWR);
257*4882a593Smuzhiyun err_free_2:
258*4882a593Smuzhiyun 	return err;
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun 
poodle_mci_setpower(struct device * dev,unsigned int vdd)261*4882a593Smuzhiyun static int poodle_mci_setpower(struct device *dev, unsigned int vdd)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun 	struct pxamci_platform_data* p_d = dev->platform_data;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	if ((1 << vdd) & p_d->ocr_mask) {
266*4882a593Smuzhiyun 		gpio_set_value(POODLE_GPIO_SD_PWR, 1);
267*4882a593Smuzhiyun 		mdelay(2);
268*4882a593Smuzhiyun 		gpio_set_value(POODLE_GPIO_SD_PWR1, 1);
269*4882a593Smuzhiyun 	} else {
270*4882a593Smuzhiyun 		gpio_set_value(POODLE_GPIO_SD_PWR1, 0);
271*4882a593Smuzhiyun 		gpio_set_value(POODLE_GPIO_SD_PWR, 0);
272*4882a593Smuzhiyun 	}
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	return 0;
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun 
poodle_mci_exit(struct device * dev,void * data)277*4882a593Smuzhiyun static void poodle_mci_exit(struct device *dev, void *data)
278*4882a593Smuzhiyun {
279*4882a593Smuzhiyun 	gpio_free(POODLE_GPIO_SD_PWR1);
280*4882a593Smuzhiyun 	gpio_free(POODLE_GPIO_SD_PWR);
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun static struct pxamci_platform_data poodle_mci_platform_data = {
284*4882a593Smuzhiyun 	.detect_delay_ms	= 250,
285*4882a593Smuzhiyun 	.ocr_mask		= MMC_VDD_32_33|MMC_VDD_33_34,
286*4882a593Smuzhiyun 	.init 			= poodle_mci_init,
287*4882a593Smuzhiyun 	.setpower 		= poodle_mci_setpower,
288*4882a593Smuzhiyun 	.exit			= poodle_mci_exit,
289*4882a593Smuzhiyun };
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun static struct gpiod_lookup_table poodle_mci_gpio_table = {
292*4882a593Smuzhiyun 	.dev_id = "pxa2xx-mci.0",
293*4882a593Smuzhiyun 	.table = {
294*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", POODLE_GPIO_nSD_DETECT,
295*4882a593Smuzhiyun 			    "cd", GPIO_ACTIVE_LOW),
296*4882a593Smuzhiyun 		GPIO_LOOKUP("gpio-pxa", POODLE_GPIO_nSD_WP,
297*4882a593Smuzhiyun 			    "wp", GPIO_ACTIVE_LOW),
298*4882a593Smuzhiyun 		{ },
299*4882a593Smuzhiyun 	},
300*4882a593Smuzhiyun };
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun /*
303*4882a593Smuzhiyun  * Irda
304*4882a593Smuzhiyun  */
305*4882a593Smuzhiyun static struct pxaficp_platform_data poodle_ficp_platform_data = {
306*4882a593Smuzhiyun 	.gpio_pwdown		= POODLE_GPIO_IR_ON,
307*4882a593Smuzhiyun 	.transceiver_cap	= IR_SIRMODE | IR_OFF,
308*4882a593Smuzhiyun };
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /*
312*4882a593Smuzhiyun  * USB Device Controller
313*4882a593Smuzhiyun  */
314*4882a593Smuzhiyun static struct pxa2xx_udc_mach_info udc_info __initdata = {
315*4882a593Smuzhiyun 	/* no connect GPIO; poodle can't tell connection status */
316*4882a593Smuzhiyun 	.gpio_pullup	= POODLE_GPIO_USB_PULLUP,
317*4882a593Smuzhiyun };
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun /* PXAFB device */
321*4882a593Smuzhiyun static struct pxafb_mode_info poodle_fb_mode = {
322*4882a593Smuzhiyun 	.pixclock	= 144700,
323*4882a593Smuzhiyun 	.xres		= 320,
324*4882a593Smuzhiyun 	.yres		= 240,
325*4882a593Smuzhiyun 	.bpp		= 16,
326*4882a593Smuzhiyun 	.hsync_len	= 7,
327*4882a593Smuzhiyun 	.left_margin	= 11,
328*4882a593Smuzhiyun 	.right_margin	= 30,
329*4882a593Smuzhiyun 	.vsync_len	= 2,
330*4882a593Smuzhiyun 	.upper_margin	= 2,
331*4882a593Smuzhiyun 	.lower_margin	= 0,
332*4882a593Smuzhiyun 	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
333*4882a593Smuzhiyun };
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun static struct pxafb_mach_info poodle_fb_info = {
336*4882a593Smuzhiyun 	.modes		= &poodle_fb_mode,
337*4882a593Smuzhiyun 	.num_modes	= 1,
338*4882a593Smuzhiyun 	.lcd_conn	= LCD_COLOR_TFT_16BPP,
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun static struct nand_bbt_descr sharpsl_bbt = {
344*4882a593Smuzhiyun 	.options = 0,
345*4882a593Smuzhiyun 	.offs = 4,
346*4882a593Smuzhiyun 	.len = 2,
347*4882a593Smuzhiyun 	.pattern = scan_ff_pattern
348*4882a593Smuzhiyun };
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun static const char * const probes[] = {
351*4882a593Smuzhiyun 	"cmdlinepart",
352*4882a593Smuzhiyun 	"ofpart",
353*4882a593Smuzhiyun 	"sharpslpart",
354*4882a593Smuzhiyun 	NULL,
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun static struct sharpsl_nand_platform_data sharpsl_nand_platform_data = {
358*4882a593Smuzhiyun 	.badblock_pattern	= &sharpsl_bbt,
359*4882a593Smuzhiyun 	.part_parsers		= probes,
360*4882a593Smuzhiyun };
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun static struct resource sharpsl_nand_resources[] = {
363*4882a593Smuzhiyun 	{
364*4882a593Smuzhiyun 		.start	= 0x0C000000,
365*4882a593Smuzhiyun 		.end	= 0x0C000FFF,
366*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
367*4882a593Smuzhiyun 	},
368*4882a593Smuzhiyun };
369*4882a593Smuzhiyun 
370*4882a593Smuzhiyun static struct platform_device sharpsl_nand_device = {
371*4882a593Smuzhiyun 	.name		= "sharpsl-nand",
372*4882a593Smuzhiyun 	.id		= -1,
373*4882a593Smuzhiyun 	.resource	= sharpsl_nand_resources,
374*4882a593Smuzhiyun 	.num_resources	= ARRAY_SIZE(sharpsl_nand_resources),
375*4882a593Smuzhiyun 	.dev.platform_data	= &sharpsl_nand_platform_data,
376*4882a593Smuzhiyun };
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun static struct mtd_partition sharpsl_rom_parts[] = {
379*4882a593Smuzhiyun 	{
380*4882a593Smuzhiyun 		.name	="Boot PROM Filesystem",
381*4882a593Smuzhiyun 		.offset	= 0x00120000,
382*4882a593Smuzhiyun 		.size	= MTDPART_SIZ_FULL,
383*4882a593Smuzhiyun 	},
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun static struct physmap_flash_data sharpsl_rom_data = {
387*4882a593Smuzhiyun 	.width		= 2,
388*4882a593Smuzhiyun 	.nr_parts	= ARRAY_SIZE(sharpsl_rom_parts),
389*4882a593Smuzhiyun 	.parts		= sharpsl_rom_parts,
390*4882a593Smuzhiyun };
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun static struct resource sharpsl_rom_resources[] = {
393*4882a593Smuzhiyun 	{
394*4882a593Smuzhiyun 		.start	= 0x00000000,
395*4882a593Smuzhiyun 		.end	= 0x007fffff,
396*4882a593Smuzhiyun 		.flags	= IORESOURCE_MEM,
397*4882a593Smuzhiyun 	},
398*4882a593Smuzhiyun };
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun static struct platform_device sharpsl_rom_device = {
401*4882a593Smuzhiyun 	.name	= "physmap-flash",
402*4882a593Smuzhiyun 	.id	= -1,
403*4882a593Smuzhiyun 	.resource = sharpsl_rom_resources,
404*4882a593Smuzhiyun 	.num_resources = ARRAY_SIZE(sharpsl_rom_resources),
405*4882a593Smuzhiyun 	.dev.platform_data = &sharpsl_rom_data,
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun static struct platform_device *devices[] __initdata = {
409*4882a593Smuzhiyun 	&poodle_locomo_device,
410*4882a593Smuzhiyun 	&poodle_scoop_device,
411*4882a593Smuzhiyun 	&poodle_audio_device,
412*4882a593Smuzhiyun 	&sharpsl_nand_device,
413*4882a593Smuzhiyun 	&sharpsl_rom_device,
414*4882a593Smuzhiyun };
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun static struct i2c_board_info __initdata poodle_i2c_devices[] = {
417*4882a593Smuzhiyun 	{ I2C_BOARD_INFO("wm8731", 0x1b) },
418*4882a593Smuzhiyun };
419*4882a593Smuzhiyun 
poodle_poweroff(void)420*4882a593Smuzhiyun static void poodle_poweroff(void)
421*4882a593Smuzhiyun {
422*4882a593Smuzhiyun 	pxa_restart(REBOOT_HARD, NULL);
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun 
poodle_init(void)425*4882a593Smuzhiyun static void __init poodle_init(void)
426*4882a593Smuzhiyun {
427*4882a593Smuzhiyun 	int ret = 0;
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun 	pm_power_off = poodle_poweroff;
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	PCFR |= PCFR_OPDE;
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun 	pxa2xx_mfp_config(ARRAY_AND_SIZE(poodle_pin_config));
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 	pxa_set_ffuart_info(NULL);
436*4882a593Smuzhiyun 	pxa_set_btuart_info(NULL);
437*4882a593Smuzhiyun 	pxa_set_stuart_info(NULL);
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	platform_scoop_config = &poodle_pcmcia_config;
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	ret = platform_add_devices(devices, ARRAY_SIZE(devices));
442*4882a593Smuzhiyun 	if (ret)
443*4882a593Smuzhiyun 		pr_warn("poodle: Unable to register LoCoMo device\n");
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	pxa_set_fb_info(&poodle_locomo_device.dev, &poodle_fb_info);
446*4882a593Smuzhiyun 	pxa_set_udc_info(&udc_info);
447*4882a593Smuzhiyun 	gpiod_add_lookup_table(&poodle_mci_gpio_table);
448*4882a593Smuzhiyun 	pxa_set_mci_info(&poodle_mci_platform_data);
449*4882a593Smuzhiyun 	pxa_set_ficp_info(&poodle_ficp_platform_data);
450*4882a593Smuzhiyun 	pxa_set_i2c_info(NULL);
451*4882a593Smuzhiyun 	i2c_register_board_info(0, ARRAY_AND_SIZE(poodle_i2c_devices));
452*4882a593Smuzhiyun 	poodle_init_spi();
453*4882a593Smuzhiyun 	regulator_has_full_constraints();
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun 
fixup_poodle(struct tag * tags,char ** cmdline)456*4882a593Smuzhiyun static void __init fixup_poodle(struct tag *tags, char **cmdline)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun 	sharpsl_save_param();
459*4882a593Smuzhiyun 	memblock_add(0xa0000000, SZ_32M);
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun 
462*4882a593Smuzhiyun MACHINE_START(POODLE, "SHARP Poodle")
463*4882a593Smuzhiyun 	.fixup		= fixup_poodle,
464*4882a593Smuzhiyun 	.map_io		= pxa25x_map_io,
465*4882a593Smuzhiyun 	.nr_irqs	= POODLE_NR_IRQS,	/* 4 for LoCoMo */
466*4882a593Smuzhiyun 	.init_irq	= pxa25x_init_irq,
467*4882a593Smuzhiyun 	.handle_irq	= pxa25x_handle_irq,
468*4882a593Smuzhiyun 	.init_time	= pxa_timer_init,
469*4882a593Smuzhiyun 	.init_machine	= poodle_init,
470*4882a593Smuzhiyun 	.restart	= pxa_restart,
471*4882a593Smuzhiyun MACHINE_END
472