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