Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5c271ec authored by Philipp Zabel's avatar Philipp Zabel Committed by Russell King
Browse files

[ARM] 4664/1: Add basic support for HTC Magician PDA phones



This includes irda, gpio keys, pxafb, backlight, ohci and flash
(read-only).

Signed-off-by: default avatarPhilipp Zabel <philipp.zabel@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 3abcd199
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -112,6 +112,12 @@ config MACH_ARMCORE
	select PXA27x
	select IWMMXT

config MACH_MAGICIAN
	bool "Enable HTC Magician Support"
	depends on ARCH_PXA
	select PXA27x
	select IWMMXT

endchoice

if PXA_SHARPSL
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ obj-$(CONFIG_MACH_AKITA) += akita-ioexp.o
obj-$(CONFIG_MACH_POODLE)	+= poodle.o corgi_ssp.o
obj-$(CONFIG_MACH_TOSA)		+= tosa.o
obj-$(CONFIG_MACH_EM_X270)	+= em-x270.o
obj-$(CONFIG_MACH_MAGICIAN)	+= magician.o
obj-$(CONFIG_ARCH_PXA_ESERIES)	+= eseries.o

ifeq ($(CONFIG_MACH_ZYLONITE),y)
+218 −0
Original line number Diff line number Diff line
/*
 * Support for HTC Magician PDA phones:
 * i-mate JAM, O2 Xda mini, Orange SPV M500, Qtek s100, Qtek s110
 * and T-Mobile MDA Compact.
 *
 * Copyright (c) 2006-2007 Philipp Zabel
 *
 * Based on hx4700.c, spitz.c and others.
 *
 * 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>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/gpio_keys.h>
#include <linux/input.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/physmap.h>

#include <asm/gpio.h>
#include <asm/hardware.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/arch/magician.h>
#include <asm/arch/pxa-regs.h>
#include <asm/arch/pxafb.h>
#include <asm/arch/irda.h>
#include <asm/arch/ohci.h>

#include "generic.h"

/*
 * IRDA
 */

static void magician_irda_transceiver_mode(struct device *dev, int mode)
{
	gpio_set_value(GPIO83_MAGICIAN_nIR_EN, mode & IR_OFF);
}

static struct pxaficp_platform_data magician_ficp_info = {
	.transceiver_cap  = IR_SIRMODE | IR_OFF,
	.transceiver_mode = magician_irda_transceiver_mode,
};

/*
 * GPIO Keys
 */

static struct gpio_keys_button magician_button_table[] = {
	{KEY_POWER,      GPIO0_MAGICIAN_KEY_POWER,      0, "Power button"},
	{KEY_ESC,        GPIO37_MAGICIAN_KEY_HANGUP,    0, "Hangup button"},
	{KEY_F10,        GPIO38_MAGICIAN_KEY_CONTACTS,  0, "Contacts button"},
	{KEY_CALENDAR,   GPIO90_MAGICIAN_KEY_CALENDAR,  0, "Calendar button"},
	{KEY_CAMERA,     GPIO91_MAGICIAN_KEY_CAMERA,    0, "Camera button"},
	{KEY_UP,         GPIO93_MAGICIAN_KEY_UP,        0, "Up button"},
	{KEY_DOWN,       GPIO94_MAGICIAN_KEY_DOWN,      0, "Down button"},
	{KEY_LEFT,       GPIO95_MAGICIAN_KEY_LEFT,      0, "Left button"},
	{KEY_RIGHT,      GPIO96_MAGICIAN_KEY_RIGHT,     0, "Right button"},
	{KEY_KPENTER,    GPIO97_MAGICIAN_KEY_ENTER,     0, "Action button"},
	{KEY_RECORD,     GPIO98_MAGICIAN_KEY_RECORD,    0, "Record button"},
	{KEY_VOLUMEUP,   GPIO100_MAGICIAN_KEY_VOL_UP,   0, "Volume up"},
	{KEY_VOLUMEDOWN, GPIO101_MAGICIAN_KEY_VOL_DOWN, 0, "Volume down"},
	{KEY_PHONE,      GPIO102_MAGICIAN_KEY_PHONE,    0, "Phone button"},
	{KEY_PLAY,       GPIO99_MAGICIAN_HEADPHONE_IN,  0, "Headset button"},
};

static struct gpio_keys_platform_data gpio_keys_data = {
	.buttons  = magician_button_table,
	.nbuttons = ARRAY_SIZE(magician_button_table),
};

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

/*
 * LCD - Toppoly TD028STEB1
 */

static struct pxafb_mode_info toppoly_modes[] = {
	{
		.pixclock     = 96153,
		.bpp          = 16,
		.xres         = 240,
		.yres         = 320,
		.hsync_len    = 11,
		.vsync_len    = 3,
		.left_margin  = 19,
		.upper_margin = 2,
		.right_margin = 10,
		.lower_margin = 2,
		.sync         = 0,
	},
};

static struct pxafb_mach_info toppoly_info = {
	.modes       = toppoly_modes,
	.num_modes   = 1,
	.fixed_modes = 1,
	.lccr0       = LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
	.lccr3       = LCCR3_PixRsEdg,
};

/*
 * Backlight
 */

static void magician_set_bl_intensity(int intensity)
{
	if (intensity) {
		PWM_CTRL0 = 1;
		PWM_PERVAL0 = 0xc8;
		PWM_PWDUTY0 = intensity;
		pxa_set_cken(CKEN_PWM0, 1);
	} else {
		pxa_set_cken(CKEN_PWM0, 0);
	}
}

static struct generic_bl_info backlight_info = {
	.default_intensity = 0x64,
	.limit_mask        = 0x0b,
	.max_intensity     = 0xc7,
	.set_bl_intensity  = magician_set_bl_intensity,
};

static struct platform_device backlight = {
	.name = "corgi-bl",
	.dev  = {
		.platform_data = &backlight_info,
	},
	.id   = -1,
};


/*
 * USB OHCI
 */

static int magician_ohci_init(struct device *dev)
{
	UHCHR = (UHCHR | UHCHR_SSEP2 | UHCHR_PCPL | UHCHR_CGR) &
	    ~(UHCHR_SSEP1 | UHCHR_SSEP3 | UHCHR_SSE);

	return 0;
}

static struct pxaohci_platform_data magician_ohci_info = {
	.port_mode    = PMM_PERPORT_MODE,
	.init         = magician_ohci_init,
	.power_budget = 0,
};


/*
 * StrataFlash
 */

#define PXA_CS_SIZE		0x04000000

static struct resource strataflash_resource = {
	.start = PXA_CS0_PHYS,
	.end   = PXA_CS0_PHYS + PXA_CS_SIZE - 1,
	.flags = IORESOURCE_MEM,
};

static struct physmap_flash_data strataflash_data = {
	.width = 4,
};

static struct platform_device strataflash = {
	.name          = "physmap-flash",
	.id            = -1,
	.num_resources = 1,
	.resource      = &strataflash_resource,
	.dev = {
		.platform_data = &strataflash_data,
	},
};

/*
 * Platform devices
 */

static struct platform_device *devices[] __initdata = {
	&gpio_keys,
	&backlight,
	&strataflash,
};

static void __init magician_init(void)
{
	platform_add_devices(devices, ARRAY_SIZE(devices));
	pxa_set_ohci_info(&magician_ohci_info);
	pxa_set_ficp_info(&magician_ficp_info);
	set_pxa_fb_info(&toppoly_info);
}


MACHINE_START(MAGICIAN, "HTC Magician")
	.phys_io = 0x40000000,
	.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
	.boot_params = 0xa0000100,
	.map_io = pxa_map_io,
	.init_irq = pxa27x_init_irq,
	.init_machine = magician_init,
	.timer = &pxa_timer,
MACHINE_END
+111 −0
Original line number Diff line number Diff line
/*
 * GPIO and IRQ definitions for HTC Magician PDA phones
 *
 * Copyright (c) 2007 Philipp Zabel
 *
 * 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.
 *
 */

#ifndef _MAGICIAN_H_
#define _MAGICIAN_H_

#include <asm/arch/pxa-regs.h>

/*
 * PXA GPIOs
 */

#define GPIO0_MAGICIAN_KEY_POWER		0
#define GPIO9_MAGICIAN_UNKNOWN			9
#define GPIO10_MAGICIAN_GSM_IRQ			10
#define GPIO11_MAGICIAN_GSM_OUT1		11
#define GPIO13_MAGICIAN_CPLD_IRQ		13
#define GPIO18_MAGICIAN_UNKNOWN			18
#define GPIO22_MAGICIAN_VIBRA_EN		22
#define GPIO26_MAGICIAN_GSM_POWER		26
#define GPIO27_MAGICIAN_USBC_PUEN		27
#define GPIO30_MAGICIAN_nCHARGE_EN		30
#define GPIO37_MAGICIAN_KEY_HANGUP		37
#define GPIO38_MAGICIAN_KEY_CONTACTS		38
#define GPIO40_MAGICIAN_GSM_OUT2		40
#define GPIO48_MAGICIAN_UNKNOWN			48
#define GPIO56_MAGICIAN_UNKNOWN			56
#define GPIO57_MAGICIAN_CAM_RESET		57
#define GPIO83_MAGICIAN_nIR_EN			83
#define GPIO86_MAGICIAN_GSM_RESET		86
#define GPIO87_MAGICIAN_GSM_SELECT		87
#define GPIO90_MAGICIAN_KEY_CALENDAR		90
#define GPIO91_MAGICIAN_KEY_CAMERA		91
#define GPIO93_MAGICIAN_KEY_UP			93
#define GPIO94_MAGICIAN_KEY_DOWN		94
#define GPIO95_MAGICIAN_KEY_LEFT		95
#define GPIO96_MAGICIAN_KEY_RIGHT		96
#define GPIO97_MAGICIAN_KEY_ENTER		97
#define GPIO98_MAGICIAN_KEY_RECORD		98
#define GPIO99_MAGICIAN_HEADPHONE_IN		99
#define GPIO100_MAGICIAN_KEY_VOL_UP		100
#define GPIO101_MAGICIAN_KEY_VOL_DOWN 		101
#define GPIO102_MAGICIAN_KEY_PHONE		102
#define GPIO103_MAGICIAN_LED_KP			103
#define GPIO104_MAGICIAN_LCD_POWER_1 		104
#define GPIO105_MAGICIAN_LCD_POWER_2		105
#define GPIO106_MAGICIAN_LCD_POWER_3		106
#define GPIO107_MAGICIAN_DS1WM_IRQ		107
#define GPIO108_MAGICIAN_GSM_READY		108
#define GPIO114_MAGICIAN_UNKNOWN		114
#define GPIO115_MAGICIAN_nPEN_IRQ		115
#define GPIO116_MAGICIAN_nCAM_EN		116
#define GPIO119_MAGICIAN_UNKNOWN		119
#define GPIO120_MAGICIAN_UNKNOWN		120

/*
 * PXA GPIO alternate function mode & direction
 */

#define GPIO0_MAGICIAN_KEY_POWER_MD		(0 | GPIO_IN)
#define GPIO9_MAGICIAN_UNKNOWN_MD		(9 | GPIO_IN)
#define GPIO10_MAGICIAN_GSM_IRQ_MD		(10 | GPIO_IN)
#define GPIO11_MAGICIAN_GSM_OUT1_MD		(11 | GPIO_OUT)
#define GPIO13_MAGICIAN_CPLD_IRQ_MD		(13 | GPIO_IN)
#define GPIO18_MAGICIAN_UNKNOWN_MD		(18 | GPIO_OUT)
#define GPIO22_MAGICIAN_VIBRA_EN_MD		(22 | GPIO_OUT)
#define GPIO26_MAGICIAN_GSM_POWER_MD		(26 | GPIO_OUT)
#define GPIO27_MAGICIAN_USBC_PUEN_MD		(27 | GPIO_OUT)
#define GPIO30_MAGICIAN_nCHARGE_EN_MD		(30 | GPIO_OUT)
#define GPIO37_MAGICIAN_KEY_HANGUP_MD		(37 | GPIO_OUT)
#define GPIO38_MAGICIAN_KEY_CONTACTS_MD		(38 | GPIO_OUT)
#define GPIO40_MAGICIAN_GSM_OUT2_MD		(40 | GPIO_OUT)
#define GPIO48_MAGICIAN_UNKNOWN_MD		(48 | GPIO_OUT)
#define GPIO56_MAGICIAN_UNKNOWN_MD		(56 | GPIO_OUT)
#define GPIO57_MAGICIAN_CAM_RESET_MD		(57 | GPIO_OUT)
#define GPIO83_MAGICIAN_nIR_EN_MD		(83 | GPIO_OUT)
#define GPIO86_MAGICIAN_GSM_RESET_MD		(86 | GPIO_OUT)
#define GPIO87_MAGICIAN_GSM_SELECT_MD		(87 | GPIO_OUT)
#define GPIO90_MAGICIAN_KEY_CALENDAR_MD		(90 | GPIO_OUT)
#define GPIO91_MAGICIAN_KEY_CAMERA_MD		(91 | GPIO_OUT)
#define GPIO93_MAGICIAN_KEY_UP_MD		(93 | GPIO_IN)
#define GPIO94_MAGICIAN_KEY_DOWN_MD		(94 | GPIO_IN)
#define GPIO95_MAGICIAN_KEY_LEFT_MD		(95 | GPIO_IN)
#define GPIO96_MAGICIAN_KEY_RIGHT_MD		(96 | GPIO_IN)
#define GPIO97_MAGICIAN_KEY_ENTER_MD		(97 | GPIO_IN)
#define GPIO98_MAGICIAN_KEY_RECORD_MD		(98 | GPIO_IN)
#define GPIO99_MAGICIAN_HEADPHONE_IN_MD		(99 | GPIO_IN)
#define GPIO100_MAGICIAN_KEY_VOL_UP_MD		(100 | GPIO_IN)
#define GPIO101_MAGICIAN_KEY_VOL_DOWN_MD 	(101 | GPIO_IN)
#define GPIO102_MAGICIAN_KEY_PHONE_MD		(102 | GPIO_IN)
#define GPIO103_MAGICIAN_LED_KP_MD		(103 | GPIO_OUT)
#define GPIO104_MAGICIAN_LCD_POWER_1_MD 	(104 | GPIO_OUT)
#define GPIO105_MAGICIAN_LCD_POWER_2_MD		(105 | GPIO_OUT)
#define GPIO106_MAGICIAN_LCD_POWER_3_MD		(106 | GPIO_OUT)
#define GPIO107_MAGICIAN_DS1WM_IRQ_MD		(107 | GPIO_IN)
#define GPIO108_MAGICIAN_GSM_READY_MD		(108 | GPIO_IN)
#define GPIO114_MAGICIAN_UNKNOWN_MD		(114 | GPIO_OUT)
#define GPIO115_MAGICIAN_nPEN_IRQ_MD		(115 | GPIO_IN)
#define GPIO116_MAGICIAN_nCAM_EN_MD		(116 | GPIO_OUT)
#define GPIO119_MAGICIAN_UNKNOWN_MD		(119 | GPIO_OUT)
#define GPIO120_MAGICIAN_UNKNOWN_MD		(120 | GPIO_OUT)

#endif /* _MAGICIAN_H_ */