spitz.c 24.8 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
#include <linux/i2c.h>
22
#include <linux/i2c/pxa-i2c.h>
23
#include <linux/i2c/pca953x.h>
24 25 26
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/spi/corgi_lcd.h>
27
#include <linux/spi/pxa2xx_spi.h>
28
#include <linux/mtd/sharpsl.h>
29
#include <linux/mtd/physmap.h>
30
#include <linux/input/matrix_keypad.h>
M
Marek Vasut 已提交
31
#include <linux/regulator/machine.h>
32
#include <linux/io.h>
33 34 35 36

#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
37 38 39
#include <asm/mach/sharpsl_param.h>
#include <asm/hardware/scoop.h>

40
#include <mach/pxa27x.h>
41
#include <mach/pxa27x-udc.h>
42
#include <mach/reset.h>
43 44 45 46 47
#include <mach/irda.h>
#include <mach/mmc.h>
#include <mach/ohci.h>
#include <mach/pxafb.h>
#include <mach/spitz.h>
48
#include <mach/sharpsl_pm.h>
49
#include <mach/smemc.h>
50 51

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

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

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

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

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

84 85 86 87 88 89 90 91 92 93
	/* 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 */
94
	GPIO16_GPIO,	/* SPITZ_GPIO_SYNC */
95 96 97 98 99 100 101 102 103
	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 */

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
	/* 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 */

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

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

M
Marek Vasut 已提交
132 133 134 135 136

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

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

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

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

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

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

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

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

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

M
Marek Vasut 已提交
206
	if (new_cpr & 0x7) {
207
		gpio_set_value(SPITZ_GPIO_CF_POWER, 1);
M
Marek Vasut 已提交
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
		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);
227 228 229
	}
}

M
Marek Vasut 已提交
230 231 232 233 234 235 236 237 238 239
#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)
240 241 242
{
	/* Only need to override behaviour for slot 0 */
	if (nr == 0)
M
Marek Vasut 已提交
243 244
		spitz_card_pwr_ctrl(
			cpr & (SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV), cpr);
245 246 247 248
	else
		write_scoop_reg(scoop, SCOOP_CPR, cpr);
}

249
static struct scoop_pcmcia_dev spitz_pcmcia_scoop[] = {
250 251 252 253 254 255 256 257 258 259
	{
		.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,
	},
260 261
};

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

M
Marek Vasut 已提交
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
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)
284

285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
#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

300
static const uint32_t spitz_keymap[] = {
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 366
	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),
};

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

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

377 378 379 380 381 382
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),
383 384 385 386 387
	.col_scan_delay_us	= 10,
	.debounce_ms		= 10,
	.wakeup			= 1,
};

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

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

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

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 已提交
444 445 446 447 448 449 450
static void __init spitz_keys_init(void)
{
	platform_device_register(&spitz_gpio_keys_device);
}
#else
static inline void spitz_keys_init(void) {}
#endif
451

M
Marek Vasut 已提交
452 453 454 455
/******************************************************************************
 * LEDs
 ******************************************************************************/
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
456 457 458 459 460 461 462 463 464 465
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,
466 467 468
	},
};

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

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

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

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

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

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

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

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

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

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

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

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

546 547
static struct spi_board_info spitz_spi_devices[] = {
	{
548 549 550 551 552 553 554
		.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),
555
	}, {
556 557 558 559 560 561
		.modalias		= "corgi-lcd",
		.max_speed_hz		= 50000,
		.bus_num		= 2,
		.chip_select		= 1,
		.platform_data		= &spitz_lcdcon_info,
		.controller_data	= &spitz_lcdcon_chip,
562
	}, {
563 564 565 566 567
		.modalias		= "max1111",
		.max_speed_hz		= 450000,
		.bus_num		= 2,
		.chip_select		= 2,
		.controller_data	= &spitz_max1111_chip,
568 569 570
	},
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Marek Vasut 已提交
673 674 675 676 677 678
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;
679

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

M
Marek Vasut 已提交
686 687 688 689
/******************************************************************************
 * Framebuffer
 ******************************************************************************/
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
690
static struct pxafb_mode_info spitz_pxafb_modes[] = {
691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715
	{
		.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,
	},
716 717 718
};

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

M
Marek Vasut 已提交
725 726 727 728 729 730 731 732 733 734 735 736
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)
737
static struct mtd_partition spitz_nand_partitions[] = {
738 739 740 741
	{
		.name = "System Area",
		.offset = 0,
		.size = 7 * 1024 * 1024,
742
	}, {
743 744
		.name = "Root Filesystem",
		.offset = 7 * 1024 * 1024,
745
	}, {
746 747 748 749 750 751 752 753
		.name = "Home Filesystem",
		.offset = MTDPART_OFS_APPEND,
		.size = MTDPART_SIZ_FULL,
	},
};

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

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

761
static struct nand_ecclayout akita_oobinfo = {
M
Marek Vasut 已提交
762 763 764 765 766 767 768
	.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,
	},
769 770
};

771 772 773 774
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),
775 776
};

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

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

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

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

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

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

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

841 842 843 844 845
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 已提交
846
	.dev		= {
847
		.platform_data	= &spitz_rom_data,
M
Marek Vasut 已提交
848
	},
849 850
};

M
Marek Vasut 已提交
851 852
static void __init spitz_nor_init(void)
{
853
	platform_device_register(&spitz_rom_device);
M
Marek Vasut 已提交
854 855 856 857 858 859 860 861 862 863 864
}
#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,
865 866
};

M
Marek Vasut 已提交
867 868 869 870 871 872 873 874 875 876 877 878 879 880 881
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",
	}
882 883
};

M
Marek Vasut 已提交
884 885 886 887 888 889 890 891 892 893 894 895
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),
	}
896 897
};

M
Marek Vasut 已提交
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 925
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
 ******************************************************************************/
926 927
static void spitz_poweroff(void)
{
928
	arm_machine_restart('g', NULL);
929 930
}

931
static void spitz_restart(char mode, const char *cmd)
932
{
933
	uint32_t msc0 = __raw_readl(MSC0);
934
	/* Bootloader magic for a reboot */
935 936
	if ((msc0 & 0xffff0000) == 0x7ff00000)
		__raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0);
937 938 939 940

	spitz_poweroff();
}

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

947 948 949 950 951
	PMCR = 0x00;

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

952
	pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
953

954 955 956 957
	pxa_set_ffuart_info(NULL);
	pxa_set_btuart_info(NULL);
	pxa_set_stuart_info(NULL);

958
	spitz_spi_init();
M
Marek Vasut 已提交
959 960 961 962 963 964 965 966 967 968 969 970
	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();
971 972
}

973
static void __init spitz_fixup(struct machine_desc *desc,
974 975 976 977 978 979 980 981 982 983
		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")
984
	.fixup		= spitz_fixup,
985
	.map_io		= pxa27x_map_io,
986
	.init_irq	= pxa27x_init_irq,
987 988 989 990 991 992 993
	.init_machine	= spitz_init,
	.timer		= &pxa_timer,
MACHINE_END
#endif

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

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