This patch introduces support for the HTC Herald (T-Mobile Wing, etc.) series of smart phones -- board support and LCD panel settings. Signed-off-by: Cory Maccarrone <darkstar6262@xxxxxxxxx> --- arch/arm/mach-omap1/board-htcherald.c | 246 +++++++++++++++++++++++++++++++++ drivers/video/omap/lcd_htcherald.c | 129 +++++++++++++++++ 2 files changed, 375 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-omap1/board-htcherald.c create mode 100644 drivers/video/omap/lcd_htcherald.c diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c new file mode 100644 index 0000000..e21cf9a --- /dev/null +++ b/arch/arm/mach-omap1/board-htcherald.c @@ -0,0 +1,246 @@ +/* + * HTC Herald board configuration + * Copyright (C) 2009 Cory Maccarrone <darkstar6262@xxxxxxxxx> + * Copyright (C) 2009 Wing Linux + * + * Based on the board-htcwizard.c file from the linwizard project: + * Copyright (C) 2006 Unai Uribarri + * Copyright (C) 2008 linwizard.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + * + */ + +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/input.h> +#include <linux/bootmem.h> + +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <mach/omap7xx.h> +#include <asm/page.h> +#include <asm/memory.h> +#include <mach/common.h> +#include <mach/board.h> + +#include <mach/io.h> +#include <mach/irqs.h> +#include <mach/gpio.h> +#include <mach/keypad.h> + +#include <linux/delay.h> + +/* LCD register definition */ +#define OMAP_LCDC_CONTROL (0xfffec000 + 0x00) +#define OMAP_LCDC_STATUS (0xfffec000 + 0x10) +#define OMAP_DMA_LCD_CCR (0xfffee300 + 0xc2) +#define OMAP_DMA_LCD_CTRL (0xfffee300 + 0xc4) +#define OMAP_LCDC_CTRL_LCD_EN (1 << 0) +#define OMAP_LCDC_STAT_DONE (1 << 0) + +static struct omap_lcd_config htcherald_lcd_config __initdata = { + .ctrl_name = "internal", +}; + +static struct omap_board_config_kernel htcherald_config[] __initdata = +{ + { OMAP_TAG_LCD, &htcherald_lcd_config }, +}; + +/* Keyboard definition */ + +static int htc_herald_keymap[] = { + KEY(0,0,KEY_RECORD), /* Mail button */ + KEY(0,1,KEY_CAMERA), /* Camera */ + KEY(0,2,KEY_PHONE), /* Send key */ + KEY(0,3,KEY_VOLUMEUP), /* Volume up */ + KEY(0,4,KEY_F2), /* Right bar (landscape) */ + KEY(0,5,KEY_MAIL), /* Win key (portrait) */ + KEY(0,6,KEY_DIRECTORY), /* Right bar (protrait) */ + KEY(1,0,KEY_LEFTCTRL), /* Windows key */ + KEY(1,1,KEY_COMMA), + KEY(1,2,KEY_M), + KEY(1,3,KEY_K), + KEY(1,4,KEY_SLASH), /* OK key */ + KEY(1,5,KEY_I), + KEY(1,6,KEY_U), + KEY(2,0,KEY_LEFTALT), + KEY(2,1,KEY_TAB), + KEY(2,2,KEY_N), + KEY(2,3,KEY_J), + KEY(2,4,KEY_ENTER), + KEY(2,5,KEY_H), + KEY(2,6,KEY_Y), + KEY(3,0,KEY_SPACE), + KEY(3,1,KEY_L), + KEY(3,2,KEY_B), + KEY(3,3,KEY_V), + KEY(3,4,KEY_BACKSPACE), + KEY(3,5,KEY_G), + KEY(3,6,KEY_T), + KEY(4,0,KEY_CAPSLOCK), /* Shift */ + KEY(4,1,KEY_C), + KEY(4,2,KEY_F), + KEY(4,3,KEY_R), + KEY(4,4,KEY_O), + KEY(4,5,KEY_E), + KEY(4,6,KEY_D), + KEY(5,0,KEY_X), + KEY(5,1,KEY_Z), + KEY(5,2,KEY_S), + KEY(5,3,KEY_W), + KEY(5,4,KEY_P), + KEY(5,5,KEY_Q), + KEY(5,6,KEY_A), + KEY(6,0,KEY_CONNECT), /* Voice button */ + KEY(6,2,KEY_CANCEL), /* End key */ + KEY(6,3,KEY_VOLUMEDOWN), /* Volume down */ + KEY(6,4,KEY_F1), /* Left bar (landscape) */ + KEY(6,5,KEY_WWW), /* OK button (portrait) */ + KEY(6,6,KEY_CALENDAR), /* Left bar (portrait) */ + 0 +}; + +struct omap_kp_platform_data htcherald_kp_data = { + .rows = 7, + .cols = 7, + .delay = 20, + .rep = 1, + .keymap = htc_herald_keymap, +}; + +static struct resource kp_resources[] = { + [0] = { + .start = INT_7XX_MPUIO_KEYPAD, + .end = INT_7XX_MPUIO_KEYPAD, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device kp_device = { + .name = "omap-keypad", + .id = -1, + .dev = { + .platform_data = &htcherald_kp_data, + }, + .num_resources = ARRAY_SIZE(kp_resources), + .resource = kp_resources, +}; + +/* LCD Device resources */ +static struct platform_device lcd_device = { + .name = "lcd_htcherald", + .id = -1, +}; + +static struct platform_device *devices[] __initdata = { + &kp_device, + &lcd_device, +}; + +/* + * Init functions from here on + */ + +static void __init htcherald_lcd_init(void) +{ + u32 reg; + unsigned int tries = 200; + + /* disable controller if active */ + reg = omap_readl(OMAP_LCDC_CONTROL); + if (reg & OMAP_LCDC_CTRL_LCD_EN) { + reg &= ~OMAP_LCDC_CTRL_LCD_EN; + omap_writel(reg, OMAP_LCDC_CONTROL); + + /* wait for end of frame */ + while (!(omap_readl(OMAP_LCDC_STATUS) & OMAP_LCDC_STAT_DONE) && --tries); + if (!tries) { + printk(KERN_WARNING "Timeout waiting for end of frame -- LCD may not be available\n"); + } + + /* turn off DMA */ + reg = omap_readw(OMAP_DMA_LCD_CCR); + reg &= ~(1 << 7); + omap_writew(reg, OMAP_DMA_LCD_CCR); + + reg = omap_readw(OMAP_DMA_LCD_CTRL); + reg &= ~(1 << 8); + omap_writew(reg, OMAP_DMA_LCD_CTRL); + } +} + +static void __init htcherald_map_io(void) +{ + omap1_map_common_io(); + + /* + * The LCD panel must be disabled and DMA turned off here, as doing + * it later causes the LCD never to reinitialize. + */ + htcherald_lcd_init(); + + printk(KERN_INFO "htcherald_map_io done.\n"); +} + +static void __init htcherald_disable_watchdog(void) +{ + /* Disable watchdog if running */ + if (omap_readl(OMAP_WDT_TIMER_MODE) & 0x8000) { + /* + * disable a potentially running watchdog timer before + * it kills us. + */ + printk(KERN_WARNING "OMAP850 Watchdog seems to be activated, disabling it for now.\n"); + omap_writel(0xF5, OMAP_WDT_TIMER_MODE); + omap_writel(0xA0, OMAP_WDT_TIMER_MODE); + } +} + +static void __init htcherald_init(void) +{ + printk(KERN_INFO "HTC Herald init.\n"); + + omap_gpio_init(); + + omap_board_config = htcherald_config; + omap_board_config_size = ARRAY_SIZE(htcherald_config); + platform_add_devices(devices, ARRAY_SIZE(devices)); + + htcherald_disable_watchdog(); +} + +static void __init htcherald_init_irq(void) +{ + printk(KERN_INFO "htcherald_init_irq.\n"); + omap1_init_common_hw(); + omap_init_irq(); +} + +MACHINE_START(HERALD, "HTC Herald") + /* Maintainer: Cory Maccarrone <darkstar6262@xxxxxxxxx> */ + /* Maintainer: wing-linux.sourceforge.net */ + .phys_io = 0xfff00000, + .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc, + .boot_params = 0x10000100, + .map_io = htcherald_map_io, + .init_irq = htcherald_init_irq, + .init_machine = htcherald_init, + .timer = &omap_timer, +MACHINE_END diff --git a/drivers/video/omap/lcd_htcherald.c b/drivers/video/omap/lcd_htcherald.c new file mode 100644 index 0000000..c203f92 --- /dev/null +++ b/drivers/video/omap/lcd_htcherald.c @@ -0,0 +1,129 @@ +/* + * File: drivers/video/omap/lcd-htcherald.c + * + * LCD panel support for the HTC Herald + * + * Copyright (C) 2009 Cory Maccarrone <darkstar6262@xxxxxxxxx> + * Copyright (C) 2009 Wing Linux + * + * Based on the lcd_htcwizard.c file from the linwizard project: + * Copyright (C) linwizard.sourceforge.net + * Author: Angelo Arrifano <miknix@xxxxxxxxx> + * Based on lcd_h4 by Imre Deak <imre.deak@xxxxxxxxx> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <mach/omapfb.h> + +static int htcherald_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + return 0; +} + +static void htcherald_panel_cleanup(struct lcd_panel *panel) +{ +} + +static int htcherald_panel_enable(struct lcd_panel *panel) +{ + return 0; +} + +static void htcherald_panel_disable(struct lcd_panel *panel) +{ +} + +static unsigned long htcherald_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +/* Found on WIZ200 (miknix) and some HERA110 models (darkstar62) */ +struct lcd_panel htcherald_panel_1 = { + .name = "lcd_herald", + .config = OMAP_LCDC_PANEL_TFT | + OMAP_LCDC_INV_HSYNC | + OMAP_LCDC_INV_VSYNC | + OMAP_LCDC_INV_PIX_CLOCK, + .bpp = 16, + .data_lines = 16, + .x_res = 240, + .y_res = 320, + .pixel_clock = 6093, + .pcd = 0, /* 15 */ + .hsw = 10, + .hfp = 10, + .hbp = 20, + .vsw = 3, + .vfp = 2, + .vbp = 2, + + .init = htcherald_panel_init, + .cleanup = htcherald_panel_cleanup, + .enable = htcherald_panel_enable, + .disable = htcherald_panel_disable, + .get_caps = htcherald_panel_get_caps, +}; + +static int htcherald_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&htcherald_panel_1); + return 0; +} + +static int htcherald_panel_remove(struct platform_device *pdev) +{ + return 0; +} + +static int htcherald_panel_suspend(struct platform_device *pdev, pm_message_t mesg) +{ + return 0; +} + +static int htcherald_panel_resume(struct platform_device *pdev) +{ + return 0; +} + +struct platform_driver htcherald_panel_driver = { + .probe = htcherald_panel_probe, + .remove = htcherald_panel_remove, + .suspend = htcherald_panel_suspend, + .resume = htcherald_panel_resume, + .driver = { + .name = "lcd_htcherald", + .owner = THIS_MODULE, + }, +}; + +static int htcherald_panel_drv_init(void) +{ + return platform_driver_register(&htcherald_panel_driver); +} + +static void htcherald_panel_drv_cleanup(void) +{ + platform_driver_unregister(&htcherald_panel_driver); +} + +module_init(htcherald_panel_drv_init); +module_exit(htcherald_panel_drv_cleanup); + -- 1.5.6.3 On Sun, Oct 4, 2009 at 2:05 PM, Cory Maccarrone <darkstar6262@xxxxxxxxx> wrote: > After doing more testing, it seems that putting the LCD disable code > in lcd_htcherald.c is too late in the bootup -- it only worked > intermittently at best, failing to work most of the time. > > As such, I've moved that code back into the board file and call it > just after omap1_map_common_io(). With this in place, the framebuffer > is reliably enabled. > > This should hopefully be the last revision of this patch I make -- > sorry for all the patch spam. > > - Cory > > On Sun, Oct 4, 2009 at 10:33 AM, Cory Maccarrone <darkstar6262@xxxxxxxxx> wrote: >> This patch introduces support for the HTC Herald (T-Mobile >> Wing, etc.) series of smart phones -- board support and LCD >> panel settings. >> >> Signed-off-by: Cory Maccarrone <darkstar6262@xxxxxxxxx> >> --- >> arch/arm/mach-omap1/board-htcherald.c | 203 +++++++++++++++++++++++++++++++++ >> drivers/video/omap/lcd_htcherald.c | 164 ++++++++++++++++++++++++++ >> 2 files changed, 367 insertions(+), 0 deletions(-) >> create mode 100644 arch/arm/mach-omap1/board-htcherald.c >> create mode 100644 drivers/video/omap/lcd_htcherald.c >> >> diff --git a/arch/arm/mach-omap1/board-htcherald.c >> b/arch/arm/mach-omap1/board-htcherald.c >> new file mode 100644 >> index 0000000..93f8903 >> --- /dev/null >> +++ b/arch/arm/mach-omap1/board-htcherald.c >> @@ -0,0 +1,203 @@ >> +/* >> + * HTC Herald board configuration >> + * Copyright (C) 2009 Cory Maccarrone <darkstar6262@xxxxxxxxx> >> + * Copyright (C) 2009 Wing Linux >> + * >> + * Based on the board-htcwizard.c file from the linwizard project: >> + * Copyright (C) 2006 Unai Uribarri >> + * Copyright (C) 2008 linwizard.sourceforge.net >> + * >> + * This program is free software; you can redistribute it and/or >> + * modify it under the terms of the GNU General Public License as >> + * published by the Free Software Foundation; either version 2 of the >> + * License, or (at your option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, but >> + * WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + * General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License >> + * along with this program; if not, write to the Free Software >> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA >> + * 02110-1301, USA. >> + * >> + */ >> + >> +#include <linux/kernel.h> >> +#include <linux/init.h> >> +#include <linux/platform_device.h> >> +#include <linux/input.h> >> +#include <linux/bootmem.h> >> + >> +#include <asm/mach-types.h> >> +#include <asm/mach/arch.h> >> +#include <asm/mach/map.h> >> +#include <mach/omap7xx.h> >> +#include <asm/page.h> >> +#include <asm/memory.h> >> +#include <mach/common.h> >> +#include <mach/board.h> >> + >> +#include <mach/io.h> >> +#include <mach/irqs.h> >> +#include <mach/gpio.h> >> +#include <mach/keypad.h> >> + >> +#include <linux/delay.h> >> + >> +static struct omap_lcd_config htcherald_lcd_config __initdata = { >> + .ctrl_name = "internal", >> +}; >> + >> +static struct omap_board_config_kernel htcherald_config[] __initdata = >> +{ >> + { OMAP_TAG_LCD, &htcherald_lcd_config }, >> +}; >> + >> +/* Keyboard definition */ >> + >> +static int htc_herald_keymap[] = { >> + KEY(0,0,KEY_RECORD), /* Mail button */ >> + KEY(0,1,KEY_CAMERA), /* Camera */ >> + KEY(0,2,KEY_PHONE), /* Send key */ >> + KEY(0,3,KEY_VOLUMEUP), /* Volume up */ >> + KEY(0,4,KEY_F2), /* Right bar (landscape) */ >> + KEY(0,5,KEY_MAIL), /* Win key (portrait) */ >> + KEY(0,6,KEY_DIRECTORY), /* Right bar (protrait) */ >> + KEY(1,0,KEY_LEFTCTRL), /* Windows key */ >> + KEY(1,1,KEY_COMMA), >> + KEY(1,2,KEY_M), >> + KEY(1,3,KEY_K), >> + KEY(1,4,KEY_SLASH), /* OK key */ >> + KEY(1,5,KEY_I), >> + KEY(1,6,KEY_U), >> + KEY(2,0,KEY_LEFTALT), >> + KEY(2,1,KEY_TAB), >> + KEY(2,2,KEY_N), >> + KEY(2,3,KEY_J), >> + KEY(2,4,KEY_ENTER), >> + KEY(2,5,KEY_H), >> + KEY(2,6,KEY_Y), >> + KEY(3,0,KEY_SPACE), >> + KEY(3,1,KEY_L), >> + KEY(3,2,KEY_B), >> + KEY(3,3,KEY_V), >> + KEY(3,4,KEY_BACKSPACE), >> + KEY(3,5,KEY_G), >> + KEY(3,6,KEY_T), >> + KEY(4,0,KEY_CAPSLOCK), /* Shift */ >> + KEY(4,1,KEY_C), >> + KEY(4,2,KEY_F), >> + KEY(4,3,KEY_R), >> + KEY(4,4,KEY_O), >> + KEY(4,5,KEY_E), >> + KEY(4,6,KEY_D), >> + KEY(5,0,KEY_X), >> + KEY(5,1,KEY_Z), >> + KEY(5,2,KEY_S), >> + KEY(5,3,KEY_W), >> + KEY(5,4,KEY_P), >> + KEY(5,5,KEY_Q), >> + KEY(5,6,KEY_A), >> + KEY(6,0,KEY_CONNECT), /* Voice button */ >> + KEY(6,2,KEY_CANCEL), /* End key */ >> + KEY(6,3,KEY_VOLUMEDOWN), /* Volume down */ >> + KEY(6,4,KEY_F1), /* Left bar (landscape) */ >> + KEY(6,5,KEY_WWW), /* OK button (portrait) */ >> + KEY(6,6,KEY_CALENDAR), /* Left bar (portrait) */ >> + 0 >> +}; >> + >> +struct omap_kp_platform_data htcherald_kp_data = { >> + .rows = 7, >> + .cols = 7, >> + .delay = 20, >> + .rep = 1, >> + .keymap = htc_herald_keymap, >> +}; >> + >> +static struct resource kp_resources[] = { >> + [0] = { >> + .start = INT_7XX_MPUIO_KEYPAD, >> + .end = INT_7XX_MPUIO_KEYPAD, >> + .flags = IORESOURCE_IRQ, >> + }, >> +}; >> + >> +static struct platform_device kp_device = { >> + .name = "omap-keypad", >> + .id = -1, >> + .dev = { >> + .platform_data = &htcherald_kp_data, >> + }, >> + .num_resources = ARRAY_SIZE(kp_resources), >> + .resource = kp_resources, >> +}; >> + >> +/* LCD Device resources */ >> +static struct platform_device lcd_device = { >> + .name = "lcd_htcherald", >> + .id = -1, >> +}; >> + >> +static struct platform_device *devices[] __initdata = { >> + &kp_device, >> + &lcd_device, >> +}; >> + >> +/* >> + * Init functions from here on >> + */ >> + >> +static void __init htcherald_map_io(void) >> +{ >> + omap1_map_common_io(); >> + printk(KERN_INFO "htcherald_map_io done.\n"); >> +} >> + >> +static void __init htcherald_disable_watchdog(void) >> +{ >> + /* Disable watchdog if running */ >> + if (omap_readl(OMAP_WDT_TIMER_MODE) & 0x8000) { >> + /* >> + * disable a potentially running watchdog timer before >> + * it kills us. >> + */ >> + printk(KERN_WARNING "OMAP850 Watchdog seems to be activated, >> disabling it for now.\n"); >> + omap_writel(0xF5, OMAP_WDT_TIMER_MODE); >> + omap_writel(0xA0, OMAP_WDT_TIMER_MODE); >> + } >> +} >> + >> +static void __init htcherald_init(void) >> +{ >> + printk(KERN_INFO "HTC Herald init.\n"); >> + >> + omap_gpio_init(); >> + >> + omap_board_config = htcherald_config; >> + omap_board_config_size = ARRAY_SIZE(htcherald_config); >> + platform_add_devices(devices, ARRAY_SIZE(devices)); >> + >> + htcherald_disable_watchdog(); >> +} >> + >> +static void __init htcherald_init_irq(void) >> +{ >> + printk(KERN_INFO "htcherald_init_irq.\n"); >> + omap1_init_common_hw(); >> + omap_init_irq(); >> +} >> + >> +MACHINE_START(HERALD, "HTC Herald") >> + /* Maintainer: Cory Maccarrone <darkstar6262@xxxxxxxxx> */ >> + /* Maintainer: wing-linux.sourceforge.net */ >> + .phys_io = 0xfff00000, >> + .io_pg_offst = ((0xfef00000) >> 18) & 0xfffc, >> + .boot_params = 0x10000100, >> + .map_io = htcherald_map_io, >> + .init_irq = htcherald_init_irq, >> + .init_machine = htcherald_init, >> + .timer = &omap_timer, >> +MACHINE_END >> diff --git a/drivers/video/omap/lcd_htcherald.c >> b/drivers/video/omap/lcd_htcherald.c >> new file mode 100644 >> index 0000000..eb0dc2c >> --- /dev/null >> +++ b/drivers/video/omap/lcd_htcherald.c >> @@ -0,0 +1,164 @@ >> +/* >> + * File: drivers/video/omap/lcd-htcherald.c >> + * >> + * LCD panel support for the HTC Herald >> + * >> + * Copyright (C) 2009 Cory Maccarrone <darkstar6262@xxxxxxxxx> >> + * Copyright (C) 2009 Wing Linux >> + * >> + * Based on the lcd_htcwizard.c file from the linwizard project: >> + * Copyright (C) linwizard.sourceforge.net >> + * Author: Angelo Arrifano <miknix@xxxxxxxxx> >> + * Based on lcd_h4 by Imre Deak <imre.deak@xxxxxxxxx> >> + * >> + * This program is free software; you can redistribute it and/or modify it >> + * under the terms of the GNU General Public License as published by the >> + * Free Software Foundation; either version 2 of the License, or (at your >> + * option) any later version. >> + * >> + * This program is distributed in the hope that it will be useful, but >> + * WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + * General Public License for more details. >> + * >> + * You should have received a copy of the GNU General Public License along >> + * with this program; if not, write to the Free Software Foundation, Inc., >> + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. >> + */ >> + >> +#include <linux/module.h> >> +#include <linux/platform_device.h> >> + >> +#include <mach/omapfb.h> >> +#include <mach/io.h> >> + >> +/* LCD register definition */ >> +#define OMAP_LCDC_CONTROL (0xfffec000 + 0x00) >> +#define OMAP_LCDC_STATUS (0xfffec000 + 0x10) >> +#define OMAP_DMA_LCD_CCR (0xfffee300 + 0xc2) >> +#define OMAP_DMA_LCD_CTRL (0xfffee300 + 0xc4) >> +#define OMAP_LCDC_CTRL_LCD_EN (1 << 0) >> +#define OMAP_LCDC_STAT_DONE (1 << 0) >> + >> +static int htcherald_panel_init(struct lcd_panel *panel, >> + struct omapfb_device *fbdev) >> +{ >> + return 0; >> +} >> + >> +static void htcherald_panel_cleanup(struct lcd_panel *panel) >> +{ >> +} >> + >> +static int htcherald_panel_enable(struct lcd_panel *panel) >> +{ >> + return 0; >> +} >> + >> +static void htcherald_panel_disable(struct lcd_panel *panel) >> +{ >> +} >> + >> +static unsigned long htcherald_panel_get_caps(struct lcd_panel *panel) >> +{ >> + return 0; >> +} >> + >> +/* Found on WIZ200 (miknix) and some HERA110 models (darkstar62) */ >> +struct lcd_panel htcherald_panel_1 = { >> + .name = "lcd_herald", >> + .config = OMAP_LCDC_PANEL_TFT | >> + OMAP_LCDC_INV_HSYNC | >> + OMAP_LCDC_INV_VSYNC | >> + OMAP_LCDC_INV_PIX_CLOCK, >> + .bpp = 16, >> + .data_lines = 16, >> + .x_res = 240, >> + .y_res = 320, >> + .pixel_clock = 6093, >> + .pcd = 0, /* 15 */ >> + .hsw = 10, >> + .hfp = 10, >> + .hbp = 20, >> + .vsw = 3, >> + .vfp = 2, >> + .vbp = 2, >> + >> + .init = htcherald_panel_init, >> + .cleanup = htcherald_panel_cleanup, >> + .enable = htcherald_panel_enable, >> + .disable = htcherald_panel_disable, >> + .get_caps = htcherald_panel_get_caps, >> +}; >> + >> +static int htcherald_panel_probe(struct platform_device *pdev) >> +{ >> + u32 reg; >> + unsigned int tries = 200; >> + >> + /* disable controller if active */ >> + reg = omap_readl(OMAP_LCDC_CONTROL); >> + if (reg & OMAP_LCDC_CTRL_LCD_EN) { >> + reg &= ~OMAP_LCDC_CTRL_LCD_EN; >> + omap_writel(reg, OMAP_LCDC_CONTROL); >> + >> + /* wait for end of frame */ >> + while (!(omap_readl(OMAP_LCDC_STATUS) & OMAP_LCDC_STAT_DONE) && --tries); >> + >> + if (!tries) { >> + printk(KERN_WARNING "lcd_htcherald: Unable to confirm controller >> is disabled -- LCD might not work\n"); >> + } >> + >> + /* turn off DMA */ >> + reg = omap_readw(OMAP_DMA_LCD_CCR); >> + reg &= ~(1 << 7); >> + omap_writew(reg, OMAP_DMA_LCD_CCR); >> + >> + reg = omap_readw(OMAP_DMA_LCD_CTRL); >> + reg &= ~(1 << 8); >> + omap_writew(reg, OMAP_DMA_LCD_CTRL); >> + } >> + >> + omapfb_register_panel(&htcherald_panel_1); >> + return 0; >> +} >> + >> +static int htcherald_panel_remove(struct platform_device *pdev) >> +{ >> + return 0; >> +} >> + >> +static int htcherald_panel_suspend(struct platform_device *pdev, >> pm_message_t mesg) >> +{ >> + return 0; >> +} >> + >> +static int htcherald_panel_resume(struct platform_device *pdev) >> +{ >> + return 0; >> +} >> + >> +struct platform_driver htcherald_panel_driver = { >> + .probe = htcherald_panel_probe, >> + .remove = htcherald_panel_remove, >> + .suspend = htcherald_panel_suspend, >> + .resume = htcherald_panel_resume, >> + .driver = { >> + .name = "lcd_htcherald", >> + .owner = THIS_MODULE, >> + }, >> +}; >> + >> +static int htcherald_panel_drv_init(void) >> +{ >> + return platform_driver_register(&htcherald_panel_driver); >> +} >> + >> +static void htcherald_panel_drv_cleanup(void) >> +{ >> + platform_driver_unregister(&htcherald_panel_driver); >> +} >> + >> +module_init(htcherald_panel_drv_init); >> +module_exit(htcherald_panel_drv_cleanup); >> + >> -- >> 1.5.6.3 >> > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html