spitz.c 25.1 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
#include <linux/module.h>
34 35 36 37

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

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

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

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

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

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

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

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

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

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

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

M
Marek Vasut 已提交
133 134 135 136 137

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Marek Vasut 已提交
726 727
static void __init spitz_lcd_init(void)
{
728
	pxa_set_fb_info(NULL, &spitz_pxafb_info);
M
Marek Vasut 已提交
729 730 731 732 733 734 735 736 737
}
#else
static inline void spitz_lcd_init(void) {}
#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Marek Vasut 已提交
868 869 870 871 872 873 874 875 876 877 878 879
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[] = {
A
Axel Lin 已提交
880
	REGULATOR_SUPPLY("vcc_core", NULL),
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
	pxa_restart('g', NULL);
928 929
}

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

	spitz_poweroff();
}

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

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 972
static void __init spitz_fixup(struct tag *tags, char **cmdline,
			       struct meminfo *mi)
973 974 975 976 977 978 979 980 981
{
	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
	.restart_mode	= 'g',
983
	.fixup		= spitz_fixup,
984
	.map_io		= pxa27x_map_io,
R
Rob Herring 已提交
985
	.nr_irqs	= PXA_NR_IRQS,
986
	.init_irq	= pxa27x_init_irq,
987
	.handle_irq	= pxa27x_handle_irq,
988 989
	.init_machine	= spitz_init,
	.timer		= &pxa_timer,
990
	.restart	= spitz_restart,
991 992 993 994 995
MACHINE_END
#endif

#ifdef CONFIG_MACH_BORZOI
MACHINE_START(BORZOI, "SHARP Borzoi")
996
	.restart_mode	= 'g',
997
	.fixup		= spitz_fixup,
998
	.map_io		= pxa27x_map_io,
R
Rob Herring 已提交
999
	.nr_irqs	= PXA_NR_IRQS,
1000
	.init_irq	= pxa27x_init_irq,
1001
	.handle_irq	= pxa27x_handle_irq,
1002 1003
	.init_machine	= spitz_init,
	.timer		= &pxa_timer,
1004
	.restart	= spitz_restart,
1005 1006
MACHINE_END
#endif
1007 1008 1009

#ifdef CONFIG_MACH_AKITA
MACHINE_START(AKITA, "SHARP Akita")
1010
	.restart_mode	= 'g',
1011
	.fixup		= spitz_fixup,
1012
	.map_io		= pxa27x_map_io,
R
Rob Herring 已提交
1013
	.nr_irqs	= PXA_NR_IRQS,
1014
	.init_irq	= pxa27x_init_irq,
1015
	.handle_irq	= pxa27x_handle_irq,
M
Marek Vasut 已提交
1016
	.init_machine	= spitz_init,
1017
	.timer		= &pxa_timer,
1018
	.restart	= spitz_restart,
1019 1020
MACHINE_END
#endif