Common code for the different EZX GSM phones. Functions to control LCD and backlight power, OHCI and UART init.
Signed-off-by: Stefan Schmidt <[EMAIL PROTECTED]> Signed-off-by: Daniel Ribeiro <[EMAIL PROTECTED]> Index: linux-2.6-arm/arch/arm/mach-pxa/ezx.c =================================================================== --- /dev/null +++ linux-2.6-arm/arch/arm/mach-pxa/ezx.c @@ -0,0 +1,193 @@ +/* + * ezx.c - Common code for the EZX platform. + * + * Copyright (C) 2005-2006 Harald Welte <[EMAIL PROTECTED]>, + * 2007-2008 Daniel Ribeiro <[EMAIL PROTECTED]>, + * 2007-2008 Stefan Schmidt <[EMAIL PROTECTED]> + * + * 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/delay.h> +#include <linux/pwm_backlight.h> + +#include <asm/arch/pxafb.h> +#include <asm/arch/ohci.h> +#include <asm/arch/i2c.h> + +#include <asm/arch/mfp-pxa27x.h> +#include <asm/arch/pxa-regs.h> +#include <asm/arch/pxa2xx-regs.h> +#include <asm/arch/pxa27x-udc.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> + +#include "devices.h" +#include "generic.h" + +/* EZX PXA framebuffer */ +void ezx_lcd_power(int on, struct fb_var_screeninfo *var) +{ + /* FIXME Can we make the register poking more sane here? */ + if (on) { + msleep(1); + GPSR3 = 0x00100000; + msleep(10); + GPCR3 = 0x00100000; + GPDR3 |= 0x00100000; + } else { + GPSR3 = 0x00100000; + PGSR3 |= 0x00100000; + msleep(41); + msleep(18); + } +} + +static struct platform_pwm_backlight_data ezx_backlight_data = { + .pwm_id = 0, + .max_brightness = 1023, + .dft_brightness = 1023, + .pwm_period_ns = 78770, +}; + +static struct platform_device ezx_backlight_device = { + .name = "pwm-backlight", + .dev = { + .parent = &pxa27x_device_pwm0.dev, + .platform_data = &ezx_backlight_data, + }, +}; + +static struct pxafb_mode_info mode_ezx = { + .pixclock = 150000, + .xres = 240, + .yres = 320, + .bpp = 16, + .hsync_len = 10, + .left_margin = 20, + .right_margin = 10, + .vsync_len = 2, + .upper_margin = 3, + .lower_margin = 2, + .sync = 0, +}; + +static struct pxafb_mach_info ezx_fb_info = { + .modes = &mode_ezx, + .num_modes = 1, + .lcd_conn = LCD_COLOR_TFT_16BPP, + .pxafb_lcd_power = &ezx_lcd_power, +}; + +/* OHCI Controller */ +static int ezx_ohci_init(struct device *dev) +{ + /* FIXME Do we need this? */ + //UP3OCR = 0x00000002; + + UHCHR = UHCHR & ~(UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE); + + return 0; +} + +static struct pxaohci_platform_data ezx_ohci_platform_data = { + .port_mode = PMM_NPS_MODE, + .init = ezx_ohci_init, +}; + + +static struct platform_device *devices[] __initdata = { + &ezx_backlight_device, +}; + +static unsigned long ezx_pin_config[] = { + /* PWM backlight */ + GPIO16_PWM0_OUT, + + /* BTUART */ + GPIO42_BTUART_RXD, + GPIO43_BTUART_TXD, + GPIO44_BTUART_CTS, + GPIO45_BTUART_RTS, + + /* STUART */ + GPIO46_STUART_RXD, + GPIO47_STUART_TXD, + + /* For A780 support (connected with Neptune GSM chip) */ + GPIO30_USB_P3_2, /* ICL_TXENB */ + GPIO31_USB_P3_6, /* ICL_VPOUT */ + GPIO90_USB_P3_5, /* ICL_VPIN */ + GPIO91_USB_P3_1, /* ICL_XRXD */ + GPIO56_USB_P3_4, /* ICL_VMOUT */ + GPIO113_USB_P3_3, /* /ICL_VMIN */ +}; + +static void __init ezx_init(void) +{ + /* FIXME Do we need this? */ + //CKEN = (1 << CKEN_OSTIMER) | (1 << CKEN_MEMC); + + pxa2xx_mfp_config(ARRAY_AND_SIZE(ezx_pin_config)); + + pxa_set_ohci_info(&ezx_ohci_platform_data); + pxa_set_i2c_info(NULL); + + /* FIXME How can we use mfp_config here? */ + /* setup sleep mode values */ + if (machine_is_motorola_a780()) { + PWER = 0xc0007803; /* disable usb, GPIO15 NC */ + PFER = 0x00007803; + PRER = 0x00001802; + PGSR0 = 0x00000010; + PGSR1 = 0x02800000; + PGSR2 = 0x00040000; + PGSR3 = 0x00000008; + PCFR = PCFR_DC_EN | PCFR_FS | PCFR_FP | PCFR_OPDE; + PSLR = 0x05800f00; + } else if (machine_is_motorola_e680()) { + PWER = 0xc000f803; /* disable usb 0xdc00f803; */ + PFER = 0x0000f803; + PRER = 0x00001802; + PGSR0 = 0x00000010; + PGSR1 = 0x02800000; + PGSR2 = 0x00040000; + PGSR3 = 0x00000000; + PCFR = PCFR_DC_EN | PCFR_FS | PCFR_FP | PCFR_OPDE; + PSLR = 0x05800f00; + } + + set_pxa_fb_info(&ezx_fb_info); + + platform_add_devices(devices, ARRAY_SIZE(devices)); +} + +#ifdef CONFIG_MACH_MOTOROLA_A780 +MACHINE_START(MOTOROLA_A780, "Motorola EZX A780") + .phys_io = 0x40000000, + .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, + .boot_params = 0xa0000100, + .map_io = pxa_map_io, + .init_irq = pxa27x_init_irq, + .timer = &pxa_timer, + .init_machine = &ezx_init, +MACHINE_END +#endif + +#ifdef CONFIG_MACH_MOTOROLA_E680 +MACHINE_START(MOTOROLA_E680, "Motorola EZX E680") + .phys_io = 0x40000000, + .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, + .boot_params = 0xa0000100, + .map_io = pxa_map_io, + .init_irq = pxa27x_init_irq, + .timer = &pxa_timer, + .init_machine = &ezx_init, +MACHINE_END +#endif Index: linux-2.6-arm/arch/arm/mach-pxa/Kconfig =================================================================== --- linux-2.6-arm.orig/arch/arm/mach-pxa/Kconfig +++ linux-2.6-arm/arch/arm/mach-pxa/Kconfig @@ -140,6 +140,23 @@ select PXA27x select IWMMXT +config PXA_EZX + bool "Motorola EZX Platform" + select PXA27x + select IWMMXT + select PXA_SSP + select HAVE_PWM + +config MACH_MOTOROLA_A780 + bool "Motorola EZX A780" + default y + depends on PXA_EZX + +config MACH_MOTOROLA_E680 + bool "Motorola EZX E680" + default y + depends on PXA_EZX + endmenu choice Index: linux-2.6-arm/arch/arm/mach-pxa/Makefile =================================================================== --- linux-2.6-arm.orig/arch/arm/mach-pxa/Makefile +++ linux-2.6-arm/arch/arm/mach-pxa/Makefile @@ -46,6 +46,7 @@ obj-$(CONFIG_MACH_LITTLETON) += littleton.o obj-$(CONFIG_MACH_ARMCORE) += cm-x270.o +obj-$(CONFIG_PXA_EZX) += ezx.o # Support for blinky lights led-y := leds.o --