spitz.c 24.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Support for Sharp SL-Cxx00 Series of PDAs
 * Models: SL-C3000 (Spitz), SL-C1000 (Akita) and SL-C3100 (Borzoi)
 *
 * Copyright (c) 2005 Richard Purdie
 *
 * Based on Sharp's 2.4 kernel patches/lubbock.c
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 */

#include <linux/kernel.h>
16
#include <linux/platform_device.h>
17
#include <linux/delay.h>
18
#include <linux/gpio_keys.h>
19
#include <linux/gpio.h>
20
#include <linux/leds.h>
21 22
#include <linux/i2c.h>
#include <linux/i2c/pca953x.h>
23 24 25
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/spi/corgi_lcd.h>
M
Marek Vasut 已提交
26
#include <linux/mtd/physmap.h>
27
#include <linux/mtd/sharpsl.h>
28
#include <linux/input/matrix_keypad.h>
M
Marek Vasut 已提交
29
#include <linux/regulator/machine.h>
30 31 32 33

#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
34 35 36
#include <asm/mach/sharpsl_param.h>
#include <asm/hardware/scoop.h>

37
#include <mach/pxa27x.h>
38
#include <mach/pxa27x-udc.h>
39
#include <mach/reset.h>
40 41 42 43
#include <mach/irda.h>
#include <mach/mmc.h>
#include <mach/ohci.h>
#include <mach/pxafb.h>
44
#include <mach/pxa2xx_spi.h>
45
#include <mach/spitz.h>
46
#include <mach/sharpsl_pm.h>
47

M
Marek Vasut 已提交
48
#include <plat/i2c.h>
49 50

#include "generic.h"
51
#include "devices.h"
52

M
Marek Vasut 已提交
53 54 55
/******************************************************************************
 * Pin configuration
 ******************************************************************************/
56 57 58
static unsigned long spitz_pin_config[] __initdata = {
	/* Chip Selects */
	GPIO78_nCS_2,	/* SCOOP #2 */
59
	GPIO79_nCS_3,	/* NAND */
60 61 62
	GPIO80_nCS_4,	/* SCOOP #1 */

	/* LCD - 16bpp Active TFT */
63
	GPIOxx_LCD_TFT_16BPP,
64 65 66 67 68 69 70 71 72 73 74

	/* PC Card */
	GPIO48_nPOE,
	GPIO49_nPWE,
	GPIO50_nPIOR,
	GPIO51_nPIOW,
	GPIO85_nPCE_1,
	GPIO54_nPCE_2,
	GPIO55_nPREG,
	GPIO56_nPWAIT,
	GPIO57_nIOIS16,
75
	GPIO104_PSKTSEL,
76

77 78 79 80 81 82
	/* I2S */
	GPIO28_I2S_BITCLK_OUT,
	GPIO29_I2S_SDATA_IN,
	GPIO30_I2S_SDATA_OUT,
	GPIO31_I2S_SYNC,

83 84 85 86 87 88 89 90 91 92
	/* MMC */
	GPIO32_MMC_CLK,
	GPIO112_MMC_CMD,
	GPIO92_MMC_DAT_0,
	GPIO109_MMC_DAT_1,
	GPIO110_MMC_DAT_2,
	GPIO111_MMC_DAT_3,

	/* GPIOs */
	GPIO9_GPIO,	/* SPITZ_GPIO_nSD_DETECT */
93
	GPIO16_GPIO,	/* SPITZ_GPIO_SYNC */
94 95 96 97 98 99 100 101 102
	GPIO81_GPIO,	/* SPITZ_GPIO_nSD_WP */
	GPIO41_GPIO,	/* SPITZ_GPIO_USB_CONNECT */
	GPIO37_GPIO,	/* SPITZ_GPIO_USB_HOST */
	GPIO35_GPIO,	/* SPITZ_GPIO_USB_DEVICE */
	GPIO22_GPIO,	/* SPITZ_GPIO_HSYNC */
	GPIO94_GPIO,	/* SPITZ_GPIO_CF_CD */
	GPIO105_GPIO,	/* SPITZ_GPIO_CF_IRQ */
	GPIO106_GPIO,	/* SPITZ_GPIO_CF2_IRQ */

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
	/* GPIO matrix keypad */
	GPIO88_GPIO,	/* column 0 */
	GPIO23_GPIO,	/* column 1 */
	GPIO24_GPIO,	/* column 2 */
	GPIO25_GPIO,	/* column 3 */
	GPIO26_GPIO,	/* column 4 */
	GPIO27_GPIO,	/* column 5 */
	GPIO52_GPIO,	/* column 6 */
	GPIO103_GPIO,	/* column 7 */
	GPIO107_GPIO,	/* column 8 */
	GPIO108_GPIO,	/* column 9 */
	GPIO114_GPIO,	/* column 10 */
	GPIO12_GPIO,	/* row 0 */
	GPIO17_GPIO,	/* row 1 */
	GPIO91_GPIO,	/* row 2 */
	GPIO34_GPIO,	/* row 3 */
	GPIO36_GPIO,	/* row 4 */
	GPIO38_GPIO,	/* row 5 */
	GPIO39_GPIO,	/* row 6 */

123 124 125 126
	/* I2C */
	GPIO117_I2C_SCL,
	GPIO118_I2C_SDA,

127 128
	GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,	/* SPITZ_GPIO_KEY_INT */
	GPIO1_GPIO | WAKEUP_ON_EDGE_FALL,	/* SPITZ_GPIO_RESET */
129 130
};

M
Marek Vasut 已提交
131 132 133 134 135

/******************************************************************************
 * Scoop GPIO expander
 ******************************************************************************/
#if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
136 137
/* SCOOP Device #1 */
static struct resource spitz_scoop_1_resources[] = {
138 139 140 141 142 143 144
	[0] = {
		.start		= 0x10800000,
		.end		= 0x10800fff,
		.flags		= IORESOURCE_MEM,
	},
};

145
static struct scoop_config spitz_scoop_1_setup = {
146
	.io_dir		= SPITZ_SCP_IO_DIR,
147
	.io_out		= SPITZ_SCP_IO_OUT,
148 149 150
	.suspend_clr	= SPITZ_SCP_SUS_CLR,
	.suspend_set	= SPITZ_SCP_SUS_SET,
	.gpio_base	= SPITZ_SCP_GPIO_BASE,
151 152
};

153
struct platform_device spitz_scoop_1_device = {
154 155 156
	.name		= "sharp-scoop",
	.id		= 0,
	.dev		= {
157
		.platform_data	= &spitz_scoop_1_setup,
158
	},
159 160
	.num_resources	= ARRAY_SIZE(spitz_scoop_1_resources),
	.resource	= spitz_scoop_1_resources,
161 162
};

163 164
/* SCOOP Device #2 */
static struct resource spitz_scoop_2_resources[] = {
165 166 167 168 169 170 171
	[0] = {
		.start		= 0x08800040,
		.end		= 0x08800fff,
		.flags		= IORESOURCE_MEM,
	},
};

172
static struct scoop_config spitz_scoop_2_setup = {
173
	.io_dir		= SPITZ_SCP2_IO_DIR,
174
	.io_out		= SPITZ_SCP2_IO_OUT,
175 176 177
	.suspend_clr	= SPITZ_SCP2_SUS_CLR,
	.suspend_set	= SPITZ_SCP2_SUS_SET,
	.gpio_base	= SPITZ_SCP2_GPIO_BASE,
178 179
};

180
struct platform_device spitz_scoop_2_device = {
181 182 183
	.name		= "sharp-scoop",
	.id		= 1,
	.dev		= {
184
		.platform_data	= &spitz_scoop_2_setup,
185
	},
186 187
	.num_resources	= ARRAY_SIZE(spitz_scoop_2_resources),
	.resource	= spitz_scoop_2_resources,
188 189
};

M
Marek Vasut 已提交
190 191
static void __init spitz_scoop_init(void)
{
192
	platform_device_register(&spitz_scoop_1_device);
M
Marek Vasut 已提交
193 194 195

	/* Akita doesn't have the second SCOOP chip */
	if (!machine_is_akita())
196
		platform_device_register(&spitz_scoop_2_device);
M
Marek Vasut 已提交
197
}
198 199

/* Power control is shared with between one of the CF slots and SD */
M
Marek Vasut 已提交
200
static void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr)
201
{
M
Marek Vasut 已提交
202 203
	unsigned short cpr;
	unsigned long flags;
204

M
Marek Vasut 已提交
205
	if (new_cpr & 0x7) {
206
		gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
M
Marek Vasut 已提交
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
		mdelay(5);
	}

	local_irq_save(flags);

	cpr = read_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR);

	if (enable & new_cpr)
		cpr |= new_cpr;
	else
		cpr &= ~enable;

	write_scoop_reg(&spitz_scoop_1_device.dev, SCOOP_CPR, cpr);

	local_irq_restore(flags);

	if (!(cpr & 0x7)) {
		mdelay(1);
		gpio_set_value(SPITZ_GPIO_CF_POWER, 0);
226 227 228
	}
}

M
Marek Vasut 已提交
229 230 231 232 233 234 235 236 237 238
#else
static inline void spitz_scoop_init(void) {}
static inline void spitz_card_pwr_ctrl(uint8_t enable, uint8_t new_cpr) {}
#endif

/******************************************************************************
 * PCMCIA
 ******************************************************************************/
#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
static void spitz_pcmcia_pwr(struct device *scoop, uint16_t cpr, int nr)
239 240 241
{
	/* Only need to override behaviour for slot 0 */
	if (nr == 0)
M
Marek Vasut 已提交
242 243
		spitz_card_pwr_ctrl(
			cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
244 245 246 247
	else
		write_scoop_reg(scoop, SCOOP_CPR, cpr);
}

248
static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
249 250 251 252 253 254 255 256 257 258
	{
		.dev		= &spitz_scoop_1_device.dev,
		.irq		= SPITZ_IRQ_GPIO_CF_IRQ,
		.cd_irq		= SPITZ_IRQ_GPIO_CF_CD,
		.cd_irq_str	= "PCMCIA0 CD",
	}, {
		.dev		= &spitz_scoop_2_device.dev,
		.irq		= SPITZ_IRQ_GPIO_CF2_IRQ,
		.cd_irq		= -1,
	},
259 260
};

261
static struct scoop_pcmcia_config spitz_pcmcia_config = {
262 263 264
	.devs		= &spitz_pcmcia_scoop[0],
	.num_devs	= 2,
	.power_ctrl	= spitz_pcmcia_pwr,
265 266
};

M
Marek Vasut 已提交
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
static void __init spitz_pcmcia_init(void)
{
	/* Akita has only one PCMCIA slot used */
	if (machine_is_akita())
		spitz_pcmcia_config.num_devs = 1;

	platform_scoop_config = &spitz_pcmcia_config;
}
#else
static inline void spitz_pcmcia_init(void) {}
#endif

/******************************************************************************
 * GPIO keyboard
 ******************************************************************************/
#if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
283

284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
#define SPITZ_KEY_CALENDAR	KEY_F1
#define SPITZ_KEY_ADDRESS	KEY_F2
#define SPITZ_KEY_FN		KEY_F3
#define SPITZ_KEY_CANCEL	KEY_F4
#define SPITZ_KEY_EXOK		KEY_F5
#define SPITZ_KEY_EXCANCEL	KEY_F6
#define SPITZ_KEY_EXJOGDOWN	KEY_F7
#define SPITZ_KEY_EXJOGUP	KEY_F8
#define SPITZ_KEY_JAP1		KEY_LEFTALT
#define SPITZ_KEY_JAP2		KEY_RIGHTCTRL
#define SPITZ_KEY_SYNC		KEY_F9
#define SPITZ_KEY_MAIL		KEY_F10
#define SPITZ_KEY_OK		KEY_F11
#define SPITZ_KEY_MENU		KEY_F12

299
static const uint32_t spitz_keymap[] = {
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
	KEY(0, 0, KEY_LEFTCTRL),
	KEY(0, 1, KEY_1),
	KEY(0, 2, KEY_3),
	KEY(0, 3, KEY_5),
	KEY(0, 4, KEY_6),
	KEY(0, 5, KEY_7),
	KEY(0, 6, KEY_9),
	KEY(0, 7, KEY_0),
	KEY(0, 8, KEY_BACKSPACE),
	KEY(0, 9, SPITZ_KEY_EXOK),	/* EXOK */
	KEY(0, 10, SPITZ_KEY_EXCANCEL),	/* EXCANCEL */
	KEY(1, 1, KEY_2),
	KEY(1, 2, KEY_4),
	KEY(1, 3, KEY_R),
	KEY(1, 4, KEY_Y),
	KEY(1, 5, KEY_8),
	KEY(1, 6, KEY_I),
	KEY(1, 7, KEY_O),
	KEY(1, 8, KEY_P),
	KEY(1, 9, SPITZ_KEY_EXJOGDOWN),	/* EXJOGDOWN */
	KEY(1, 10, SPITZ_KEY_EXJOGUP),	/* EXJOGUP */
	KEY(2, 0, KEY_TAB),
	KEY(2, 1, KEY_Q),
	KEY(2, 2, KEY_E),
	KEY(2, 3, KEY_T),
	KEY(2, 4, KEY_G),
	KEY(2, 5, KEY_U),
	KEY(2, 6, KEY_J),
	KEY(2, 7, KEY_K),
	KEY(3, 0, SPITZ_KEY_ADDRESS),	/* ADDRESS */
	KEY(3, 1, KEY_W),
	KEY(3, 2, KEY_S),
	KEY(3, 3, KEY_F),
	KEY(3, 4, KEY_V),
	KEY(3, 5, KEY_H),
	KEY(3, 6, KEY_M),
	KEY(3, 7, KEY_L),
	KEY(3, 9, KEY_RIGHTSHIFT),
	KEY(4, 0, SPITZ_KEY_CALENDAR),	/* CALENDAR */
	KEY(4, 1, KEY_A),
	KEY(4, 2, KEY_D),
	KEY(4, 3, KEY_C),
	KEY(4, 4, KEY_B),
	KEY(4, 5, KEY_N),
	KEY(4, 6, KEY_DOT),
	KEY(4, 8, KEY_ENTER),
	KEY(4, 9, KEY_LEFTSHIFT),
	KEY(5, 0, SPITZ_KEY_MAIL),	/* MAIL */
	KEY(5, 1, KEY_Z),
	KEY(5, 2, KEY_X),
	KEY(5, 3, KEY_MINUS),
	KEY(5, 4, KEY_SPACE),
	KEY(5, 5, KEY_COMMA),
	KEY(5, 7, KEY_UP),
	KEY(5, 10, SPITZ_KEY_FN),	/* FN */
	KEY(6, 0, KEY_SYSRQ),
	KEY(6, 1, SPITZ_KEY_JAP1),	/* JAP1 */
	KEY(6, 2, SPITZ_KEY_JAP2),	/* JAP2 */
	KEY(6, 3, SPITZ_KEY_CANCEL),	/* CANCEL */
	KEY(6, 4, SPITZ_KEY_OK),	/* OK */
	KEY(6, 5, SPITZ_KEY_MENU),	/* MENU */
	KEY(6, 6, KEY_LEFT),
	KEY(6, 7, KEY_DOWN),
	KEY(6, 8, KEY_RIGHT),
};

366 367 368
static const struct matrix_keymap_data spitz_keymap_data = {
	.keymap		= spitz_keymap,
	.keymap_size	= ARRAY_SIZE(spitz_keymap),
369 370
};

371
static const uint32_t spitz_row_gpios[] =
372
		{ 12, 17, 91, 34, 36, 38, 39 };
373
static const uint32_t spitz_col_gpios[] =
374 375
		{ 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };

376 377 378 379 380 381
static struct matrix_keypad_platform_data spitz_mkp_pdata = {
	.keymap_data		= &spitz_keymap_data,
	.row_gpios		= spitz_row_gpios,
	.col_gpios		= spitz_col_gpios,
	.num_row_gpios		= ARRAY_SIZE(spitz_row_gpios),
	.num_col_gpios		= ARRAY_SIZE(spitz_col_gpios),
382 383 384 385 386
	.col_scan_delay_us	= 10,
	.debounce_ms		= 10,
	.wakeup			= 1,
};

387
static struct platform_device spitz_mkp_device = {
388
	.name		= "matrix-keypad",
389
	.id		= -1,
390
	.dev		= {
391
		.platform_data	= &spitz_mkp_pdata,
392
	},
393 394
};

M
Marek Vasut 已提交
395 396
static void __init spitz_mkp_init(void)
{
397
	platform_device_register(&spitz_mkp_device);
M
Marek Vasut 已提交
398 399 400 401
}
#else
static inline void spitz_mkp_init(void) {}
#endif
402

M
Marek Vasut 已提交
403 404 405 406
/******************************************************************************
 * GPIO keys
 ******************************************************************************/
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
407 408 409 410 411
static struct gpio_keys_button spitz_gpio_keys[] = {
	{
		.type	= EV_PWR,
		.code	= KEY_SUSPEND,
		.gpio	= SPITZ_GPIO_ON_KEY,
412
		.desc	= "On Off",
413 414 415 416 417 418 419
		.wakeup	= 1,
	},
	/* Two buttons detecting the lid state */
	{
		.type	= EV_SW,
		.code	= 0,
		.gpio	= SPITZ_GPIO_SWA,
420
		.desc	= "Display Down",
421 422 423 424 425
	},
	{
		.type	= EV_SW,
		.code	= 1,
		.gpio	= SPITZ_GPIO_SWB,
426
		.desc	= "Lid Closed",
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
	},
};

static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
	.buttons	= spitz_gpio_keys,
	.nbuttons	= ARRAY_SIZE(spitz_gpio_keys),
};

static struct platform_device spitz_gpio_keys_device = {
	.name	= "gpio-keys",
	.id	= -1,
	.dev	= {
		.platform_data	= &spitz_gpio_keys_platform_data,
	},
};

M
Marek Vasut 已提交
443 444 445 446 447 448 449
static void __init spitz_keys_init(void)
{
	platform_device_register(&spitz_gpio_keys_device);
}
#else
static inline void spitz_keys_init(void) {}
#endif
450

M
Marek Vasut 已提交
451 452 453 454
/******************************************************************************
 * LEDs
 ******************************************************************************/
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
455 456 457 458 459 460 461 462 463 464
static struct gpio_led spitz_gpio_leds[] = {
	{
		.name			= "spitz:amber:charge",
		.default_trigger	= "sharpsl-charge",
		.gpio			= SPITZ_GPIO_LED_ORANGE,
	},
	{
		.name			= "spitz:green:hddactivity",
		.default_trigger	= "ide-disk",
		.gpio			= SPITZ_GPIO_LED_GREEN,
465 466 467
	},
};

468 469 470
static struct gpio_led_platform_data spitz_gpio_leds_info = {
	.leds		= spitz_gpio_leds,
	.num_leds	= ARRAY_SIZE(spitz_gpio_leds),
471 472
};

473
static struct platform_device spitz_led_device = {
474
	.name		= "leds-gpio",
475
	.id		= -1,
476
	.dev		= {
477
		.platform_data	= &spitz_gpio_leds_info,
478
	},
479 480
};

M
Marek Vasut 已提交
481 482
static void __init spitz_leds_init(void)
{
483
	platform_device_register(&spitz_led_device);
M
Marek Vasut 已提交
484 485 486 487
}
#else
static inline void spitz_leds_init(void) {}
#endif
488

M
Marek Vasut 已提交
489 490 491 492
/******************************************************************************
 * SSP Devices
 ******************************************************************************/
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
493
static void spitz_ads7846_wait_for_hsync(void)
494 495 496 497 498 499 500 501
{
	while (gpio_get_value(SPITZ_GPIO_HSYNC))
		cpu_relax();

	while (!gpio_get_value(SPITZ_GPIO_HSYNC))
		cpu_relax();
}

502 503 504 505 506
static struct ads7846_platform_data spitz_ads7846_info = {
	.model			= 7846,
	.vref_delay_usecs	= 100,
	.x_plate_ohms		= 419,
	.y_plate_ohms		= 486,
507
	.pressure_max		= 1024,
508
	.gpio_pendown		= SPITZ_GPIO_TP_INT,
509
	.wait_for_sync		= spitz_ads7846_wait_for_hsync,
510
};
511

512
static struct pxa2xx_spi_chip spitz_ads7846_chip = {
513
	.gpio_cs		= SPITZ_GPIO_ADS7846_CS,
514
};
515

516
static void spitz_bl_kick_battery(void)
517
{
518
	void (*kick_batt)(void);
519

520 521 522 523
	kick_batt = symbol_get(sharpsl_battery_kick);
	if (kick_batt) {
		kick_batt();
		symbol_put(sharpsl_battery_kick);
524 525 526
	}
}

527 528 529 530 531
static struct corgi_lcd_platform_data spitz_lcdcon_info = {
	.init_mode		= CORGI_LCD_MODE_VGA,
	.max_intensity		= 0x2f,
	.default_intensity	= 0x1f,
	.limit_mask		= 0x0b,
532 533
	.gpio_backlight_cont	= SPITZ_GPIO_BACKLIGHT_CONT,
	.gpio_backlight_on	= SPITZ_GPIO_BACKLIGHT_ON,
534 535
	.kick_battery		= spitz_bl_kick_battery,
};
536

537
static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
538
	.gpio_cs	= SPITZ_GPIO_LCDCON_CS,
539 540
};

541
static struct pxa2xx_spi_chip spitz_max1111_chip = {
542
	.gpio_cs	= SPITZ_GPIO_MAX1111_CS,
543 544
};

545 546
static struct spi_board_info spitz_spi_devices[] = {
	{
547 548 549 550 551 552 553
		.modalias		= "ads7846",
		.max_speed_hz		= 1200000,
		.bus_num		= 2,
		.chip_select		= 0,
		.platform_data		= &spitz_ads7846_info,
		.controller_data	= &spitz_ads7846_chip,
		.irq			= gpio_to_irq(SPITZ_GPIO_TP_INT),
554
	}, {
555 556 557 558 559 560
		.modalias		= "corgi-lcd",
		.max_speed_hz		= 50000,
		.bus_num		= 2,
		.chip_select		= 1,
		.platform_data		= &spitz_lcdcon_info,
		.controller_data	= &spitz_lcdcon_chip,
561
	}, {
562 563 564 565 566
		.modalias		= "max1111",
		.max_speed_hz		= 450000,
		.bus_num		= 2,
		.chip_select		= 2,
		.controller_data	= &spitz_max1111_chip,
567 568 569
	},
};

M
Marek Vasut 已提交
570 571 572 573
static struct pxa2xx_spi_master spitz_spi_info = {
	.num_chipselect	= 3,
};

574
static void __init spitz_spi_init(void)
575
{
M
Marek Vasut 已提交
576 577
	struct corgi_lcd_platform_data *lcd_data = &spitz_lcdcon_info;

578
	if (machine_is_akita()) {
M
Marek Vasut 已提交
579 580
		lcd_data->gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
		lcd_data->gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
581 582
	}

583 584 585 586
	pxa2xx_set_spi_info(2, &spitz_spi_info);
	spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
}
#else
587
static inline void spitz_spi_init(void) {}
588
#endif
589

M
Marek Vasut 已提交
590 591 592 593
/******************************************************************************
 * SD/MMC card controller
 ******************************************************************************/
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
594
/*
M
Marek Vasut 已提交
595 596
 * NOTE: The card detect interrupt isn't debounced so we delay it by 250ms to
 * give the card a chance to fully insert/eject.
597 598 599 600 601
 */
static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
{
	struct pxamci_platform_data* p_d = dev->platform_data;

M
Marek Vasut 已提交
602 603
	if ((1 << vdd) & p_d->ocr_mask)
		spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, SCOOP_CPR_SD_3V);
604
	else
M
Marek Vasut 已提交
605
		spitz_card_pwr_ctrl(SCOOP_CPR_SD_3V, 0x0);
606 607 608
}

static struct pxamci_platform_data spitz_mci_platform_data = {
609
	.detect_delay_ms	= 250,
610
	.ocr_mask		= MMC_VDD_32_33|MMC_VDD_33_34,
611
	.setpower		= spitz_mci_setpower,
612 613 614
	.gpio_card_detect	= SPITZ_GPIO_nSD_DETECT,
	.gpio_card_ro		= SPITZ_GPIO_nSD_WP,
	.gpio_power		= -1,
615 616
};

M
Marek Vasut 已提交
617 618 619 620 621 622 623
static void __init spitz_mmc_init(void)
{
	pxa_set_mci_info(&spitz_mci_platform_data);
}
#else
static inline void spitz_mmc_init(void) {}
#endif
624

M
Marek Vasut 已提交
625 626 627 628
/******************************************************************************
 * USB Host
 ******************************************************************************/
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
629 630
static int spitz_ohci_init(struct device *dev)
{
631
	int err;
632

633 634 635
	err = gpio_request(SPITZ_GPIO_USB_HOST, "USB_HOST");
	if (err)
		return err;
636

M
Marek Vasut 已提交
637
	/* Only Port 2 is connected, setup USB Port 2 Output Control Register */
638 639
	UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;

640
	return gpio_direction_output(SPITZ_GPIO_USB_HOST, 1);
641 642
}

643 644 645 646 647
static void spitz_ohci_exit(struct device *dev)
{
	gpio_free(SPITZ_GPIO_USB_HOST);
}

648 649 650
static struct pxaohci_platform_data spitz_ohci_platform_data = {
	.port_mode	= PMM_NPS_MODE,
	.init		= spitz_ohci_init,
651
	.exit		= spitz_ohci_exit,
652
	.flags		= ENABLE_PORT_ALL | NO_OC_PROTECTION,
653
	.power_budget	= 150,
654 655
};

M
Marek Vasut 已提交
656 657 658 659 660 661 662
static void __init spitz_uhc_init(void)
{
	pxa_set_ohci_info(&spitz_ohci_platform_data);
}
#else
static inline void spitz_uhc_init(void) {}
#endif
663

M
Marek Vasut 已提交
664 665 666 667
/******************************************************************************
 * IrDA
 ******************************************************************************/
#if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
668
static struct pxaficp_platform_data spitz_ficp_platform_data = {
669
	.transceiver_cap	= IR_SIRMODE | IR_OFF,
670 671
};

M
Marek Vasut 已提交
672 673 674 675 676 677
static void __init spitz_irda_init(void)
{
	if (machine_is_akita())
		spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
	else
		spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
678

M
Marek Vasut 已提交
679 680 681 682 683
	pxa_set_ficp_info(&spitz_ficp_platform_data);
}
#else
static inline void spitz_irda_init(void) {}
#endif
684

M
Marek Vasut 已提交
685 686 687 688
/******************************************************************************
 * Framebuffer
 ******************************************************************************/
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
689
static struct pxafb_mode_info spitz_pxafb_modes[] = {
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
	{
		.pixclock       = 19231,
		.xres           = 480,
		.yres           = 640,
		.bpp            = 16,
		.hsync_len      = 40,
		.left_margin    = 46,
		.right_margin   = 125,
		.vsync_len      = 3,
		.upper_margin   = 1,
		.lower_margin   = 0,
		.sync           = 0,
	}, {
		.pixclock       = 134617,
		.xres           = 240,
		.yres           = 320,
		.bpp            = 16,
		.hsync_len      = 20,
		.left_margin    = 20,
		.right_margin   = 46,
		.vsync_len      = 2,
		.upper_margin   = 1,
		.lower_margin   = 0,
		.sync           = 0,
	},
715 716 717
};

static struct pxafb_mach_info spitz_pxafb_info = {
M
Marek Vasut 已提交
718 719
	.modes          = spitz_pxafb_modes,
	.num_modes      = ARRAY_SIZE(spitz_pxafb_modes),
720
	.fixed_modes    = 1,
721
	.lcd_conn	= LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING,
722 723
};

M
Marek Vasut 已提交
724 725 726 727 728 729 730 731 732 733 734 735
static void __init spitz_lcd_init(void)
{
	set_pxa_fb_info(&spitz_pxafb_info);
}
#else
static inline void spitz_lcd_init(void) {}
#endif

/******************************************************************************
 * Framebuffer
 ******************************************************************************/
#if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
736
static struct mtd_partition spitz_nand_partitions[] = {
737 738 739 740
	{
		.name = "System Area",
		.offset = 0,
		.size = 7 * 1024 * 1024,
741
	}, {
742 743
		.name = "Root Filesystem",
		.offset = 7 * 1024 * 1024,
744
	}, {
745 746 747 748 749 750 751 752
		.name = "Home Filesystem",
		.offset = MTDPART_OFS_APPEND,
		.size = MTDPART_SIZ_FULL,
	},
};

static uint8_t scan_ff_pattern[] = { 0xff, 0xff };

753 754 755 756 757
static struct nand_bbt_descr spitz_nand_bbt = {
	.options	= 0,
	.offs		= 4,
	.len		= 2,
	.pattern	= scan_ff_pattern
758 759
};

760
static struct nand_ecclayout akita_oobinfo = {
M
Marek Vasut 已提交
761 762 763 764 765 766 767
	.oobfree	= { {0x08, 0x09} },
	.eccbytes	= 24,
	.eccpos		= {
			0x05, 0x01, 0x02, 0x03, 0x06, 0x07, 0x15, 0x11,
			0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
			0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37,
	},
768 769
};

770 771 772 773
static struct sharpsl_nand_platform_data spitz_nand_pdata = {
	.badblock_pattern	= &spitz_nand_bbt,
	.partitions		= spitz_nand_partitions,
	.nr_partitions		= ARRAY_SIZE(spitz_nand_partitions),
774 775
};

776
static struct resource spitz_nand_resources[] = {
777
	{
M
Marek Vasut 已提交
778 779
		.start	= PXA_CS3_PHYS,
		.end	= PXA_CS3_PHYS + SZ_4K - 1,
780 781 782 783
		.flags	= IORESOURCE_MEM,
	},
};

784
static struct platform_device spitz_nand_device = {
785 786
	.name		= "sharpsl-nand",
	.id		= -1,
787 788
	.resource	= spitz_nand_resources,
	.num_resources	= ARRAY_SIZE(spitz_nand_resources),
M
Marek Vasut 已提交
789
	.dev		= {
790
		.platform_data	= &spitz_nand_pdata,
M
Marek Vasut 已提交
791
	}
792 793
};

M
Marek Vasut 已提交
794 795 796
static void __init spitz_nand_init(void)
{
	if (machine_is_spitz()) {
797
		spitz_nand_partitions[1].size = 5 * 1024 * 1024;
M
Marek Vasut 已提交
798
	} else if (machine_is_akita()) {
799 800 801
		spitz_nand_partitions[1].size = 58 * 1024 * 1024;
		spitz_nand_bbt.len = 1;
		spitz_nand_pdata.ecc_layout = &akita_oobinfo;
M
Marek Vasut 已提交
802
	} else if (machine_is_borzoi()) {
803 804 805
		spitz_nand_partitions[1].size = 32 * 1024 * 1024;
		spitz_nand_bbt.len = 1;
		spitz_nand_pdata.ecc_layout = &akita_oobinfo;
M
Marek Vasut 已提交
806 807
	}

808
	platform_device_register(&spitz_nand_device);
M
Marek Vasut 已提交
809 810 811 812
}
#else
static inline void spitz_nand_init(void) {}
#endif
813

M
Marek Vasut 已提交
814 815 816 817
/******************************************************************************
 * NOR Flash
 ******************************************************************************/
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
818
static struct mtd_partition spitz_rom_parts[] = {
819 820 821 822 823 824 825
	{
		.name	="Boot PROM Filesystem",
		.offset	= 0x00140000,
		.size	= MTDPART_SIZ_FULL,
	},
};

826
static struct physmap_flash_data spitz_rom_data = {
827
	.width		= 2,
828 829
	.nr_parts	= ARRAY_SIZE(spitz_rom_parts),
	.parts		= spitz_rom_parts,
830 831
};

832
static struct resource spitz_rom_resources[] = {
833
	{
M
Marek Vasut 已提交
834 835
		.start	= PXA_CS0_PHYS,
		.end	= PXA_CS0_PHYS + SZ_8M - 1,
836 837 838 839
		.flags	= IORESOURCE_MEM,
	},
};

840 841 842 843 844
static struct platform_device spitz_rom_device = {
	.name		= "physmap-flash",
	.id		= -1,
	.resource	= spitz_rom_resources,
	.num_resources	= ARRAY_SIZE(spitz_rom_resources),
M
Marek Vasut 已提交
845
	.dev		= {
846
		.platform_data	= &spitz_rom_data,
M
Marek Vasut 已提交
847
	},
848 849
};

M
Marek Vasut 已提交
850 851
static void __init spitz_nor_init(void)
{
852
	platform_device_register(&spitz_rom_device);
M
Marek Vasut 已提交
853 854 855 856 857 858 859 860 861 862 863
}
#else
static inline void spitz_nor_init(void) {}
#endif

/******************************************************************************
 * GPIO expander
 ******************************************************************************/
#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
static struct pca953x_platform_data akita_pca953x_pdata = {
	.gpio_base		= AKITA_IOEXP_GPIO_BASE,
864 865
};

M
Marek Vasut 已提交
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880
static struct i2c_board_info spitz_i2c_devs[] = {
	{
		.type		= "wm8750",
		.addr		= 0x1b,
	}, {
		.type		= "max7310",
		.addr		= 0x18,
		.platform_data	= &akita_pca953x_pdata,
	},
};

static struct regulator_consumer_supply isl6271a_consumers[] = {
	{
		.supply	= "vcc_core",
	}
881 882
};

M
Marek Vasut 已提交
883 884 885 886 887 888 889 890 891 892 893 894
static struct regulator_init_data isl6271a_info[] = {
	{
		.constraints = {
			.name		= "vcc_core range",
			.min_uV		= 850000,
			.max_uV		= 1600000,
			.always_on	= 1,
			.valid_ops_mask	= REGULATOR_CHANGE_VOLTAGE,
		},
	.consumer_supplies	= isl6271a_consumers,
	.num_consumer_supplies	= ARRAY_SIZE(isl6271a_consumers),
	}
895 896
};

M
Marek Vasut 已提交
897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
static struct i2c_board_info spitz_pi2c_devs[] = {
	{
		.type		= "isl6271a",
		.addr		= 0x0c,
		.platform_data	= &isl6271a_info,
	},
};

static void __init spitz_i2c_init(void)
{
	int size = ARRAY_SIZE(spitz_i2c_devs);

	/* Only Akita has the max7310 chip */
	if (!machine_is_akita())
		size--;

	pxa_set_i2c_info(NULL);
	pxa27x_set_i2c_power_info(NULL);
	i2c_register_board_info(0, spitz_i2c_devs, size);
	i2c_register_board_info(1, ARRAY_AND_SIZE(spitz_pi2c_devs));
}
#else
static inline void spitz_i2c_init(void) {}
#endif

/******************************************************************************
 * Machine init
 ******************************************************************************/
925 926
static void spitz_poweroff(void)
{
927
	arm_machine_restart('g', NULL);
928 929
}

930
static void spitz_restart(char mode, const char *cmd)
931 932
{
	/* Bootloader magic for a reboot */
M
Marek Vasut 已提交
933
	if ((MSC0 & 0xffff0000) == 0x7ff00000)
934 935 936 937 938
		MSC0 = (MSC0 & 0xffff) | 0x7ee00000;

	spitz_poweroff();
}

M
Marek Vasut 已提交
939
static void __init spitz_init(void)
940
{
941
	init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
942 943 944
	pm_power_off = spitz_poweroff;
	arm_pm_restart = spitz_restart;

945 946 947 948 949
	PMCR = 0x00;

	/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
	PCFR |= PCFR_OPDE;

950
	pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
951

952 953 954 955
	pxa_set_ffuart_info(NULL);
	pxa_set_btuart_info(NULL);
	pxa_set_stuart_info(NULL);

956
	spitz_spi_init();
M
Marek Vasut 已提交
957 958 959 960 961 962 963 964 965 966 967 968
	spitz_scoop_init();
	spitz_mkp_init();
	spitz_keys_init();
	spitz_leds_init();
	spitz_mmc_init();
	spitz_pcmcia_init();
	spitz_irda_init();
	spitz_uhc_init();
	spitz_lcd_init();
	spitz_nor_init();
	spitz_nand_init();
	spitz_i2c_init();
969 970
}

971
static void __init spitz_fixup(struct machine_desc *desc,
972 973 974 975 976 977 978 979 980 981
		struct tag *tags, char **cmdline, struct meminfo *mi)
{
	sharpsl_save_param();
	mi->nr_banks = 1;
	mi->bank[0].start = 0xa0000000;
	mi->bank[0].size = (64*1024*1024);
}

#ifdef CONFIG_MACH_SPITZ
MACHINE_START(SPITZ, "SHARP Spitz")
982
	.fixup		= spitz_fixup,
983
	.map_io		= pxa_map_io,
984
	.init_irq	= pxa27x_init_irq,
985 986 987 988 989 990 991
	.init_machine	= spitz_init,
	.timer		= &pxa_timer,
MACHINE_END
#endif

#ifdef CONFIG_MACH_BORZOI
MACHINE_START(BORZOI, "SHARP Borzoi")
992
	.fixup		= spitz_fixup,
993
	.map_io		= pxa_map_io,
994
	.init_irq	= pxa27x_init_irq,
995 996 997 998
	.init_machine	= spitz_init,
	.timer		= &pxa_timer,
MACHINE_END
#endif
999 1000 1001

#ifdef CONFIG_MACH_AKITA
MACHINE_START(AKITA, "SHARP Akita")
1002
	.fixup		= spitz_fixup,
1003
	.map_io		= pxa_map_io,
1004
	.init_irq	= pxa27x_init_irq,
M
Marek Vasut 已提交
1005
	.init_machine	= spitz_init,
1006 1007 1008
	.timer		= &pxa_timer,
MACHINE_END
#endif