From: Krzysztof H. <krz...@po...> - 2009-06-14 21:35:50
|
On Thu, 4 Jun 2009 20:52:42 +0300 Imre Deak <imr...@no...> wrote: > From: Jouni Högander <jou...@no...> > > Check wether fbdev is NULL in suspend / resume functions. Fbdev is > NULL, if there is no lcd or it is not enabled in configuration. > > Signed-off-by: Jouni Högander <jou...@no...> > Signed-off-by: Tony Lindgren <to...@at...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/omapfb_main.c | 7 ++++--- > 1 files changed, 4 insertions(+), 3 deletions(-) > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Zostan dziennikarzem obywatelskim! Sprawd¼ sie >>> http://link.interia.pl/f21b9 |
From: Imre D. <imr...@no...> - 2009-06-04 17:56:07
|
From: Stanley.Miao <sta...@wi...> Add glue to control the OMAP_LDP LCD as a frame buffer device using the existing dispc.c driver under omapfb. Patch updated for mainline kernel. Note that the drivers/video/omap should be updated to pass omap_lcd_config in platform_data. The patch should also be updated to compile if twl4030 is not selected, and eventually to use the regulator framework. Signed-off-by: Stanley.Miao <sta...@wi...> Signed-off-by: Tony Lindgren <to...@at...> Fixed-by: Jarkko Nikula <jar...@gm...> Fixed-by: Tony Lindgren <to...@at...> CC: lin...@li... Signed-off-by: Imre Deak <imr...@no...> --- arch/arm/configs/omap_ldp_defconfig | 54 +++++++++- drivers/video/omap/Kconfig | 4 + drivers/video/omap/Makefile | 1 + drivers/video/omap/lcd_ldp.c | 200 +++++++++++++++++++++++++++++++++++ 4 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 drivers/video/omap/lcd_ldp.c diff --git a/arch/arm/configs/omap_ldp_defconfig b/arch/arm/configs/omap_ldp_defconfig index 679a4a3..b9c4891 100644 --- a/arch/arm/configs/omap_ldp_defconfig +++ b/arch/arm/configs/omap_ldp_defconfig @@ -690,6 +690,7 @@ CONFIG_GPIOLIB=y # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCF857X is not set +CONFIG_GPIO_TWL4030=y # # PCI GPIO expanders: @@ -742,6 +743,7 @@ CONFIG_SSB_POSSIBLE=y # CONFIG_MFD_SM501 is not set # CONFIG_HTC_EGPIO is not set # CONFIG_HTC_PASIC3 is not set +CONFIG_TWL4030_CORE=y # CONFIG_MFD_TMIO is not set # CONFIG_MFD_T7L66XB is not set # CONFIG_MFD_TC6387XB is not set @@ -767,8 +769,46 @@ CONFIG_DAB=y # # CONFIG_VGASTATE is not set CONFIG_VIDEO_OUTPUT_CONTROL=m -# CONFIG_FB is not set -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +# CONFIG_FB_DDC is not set +# CONFIG_FB_BOOT_VESA_SUPPORT is not set +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set +# CONFIG_FB_SYS_FILLRECT is not set +# CONFIG_FB_SYS_COPYAREA is not set +# CONFIG_FB_SYS_IMAGEBLIT is not set +# CONFIG_FB_FOREIGN_ENDIAN is not set +# CONFIG_FB_SYS_FOPS is not set +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +CONFIG_FB_OMAP=y +CONFIG_FB_OMAP_LCD_VGA=y +# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set +# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set +CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=4 +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_LCD_CLASS_DEVICE=y +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +CONFIG_LCD_PLATFORM=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_CORGI is not set +# CONFIG_BACKLIGHT_GENERIC is not set # # Display device support @@ -780,6 +820,16 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m # # CONFIG_VGA_CONSOLE is not set CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y CONFIG_SOUND=y CONFIG_SND=y # CONFIG_SND_SEQUENCER is not set diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig index eb05e09..2bffc07 100644 --- a/drivers/video/omap/Kconfig +++ b/drivers/video/omap/Kconfig @@ -7,6 +7,10 @@ config FB_OMAP help Frame buffer driver for OMAP based boards. +config FB_OMAP_LCD_VGA + bool "Use LCD in VGA mode" + depends on MACH_OMAP_3430SDP || MACH_OMAP_LDP + choice depends on FB_OMAP && MACH_OVERO prompt "Screen resolution" diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index 0d2996a..b63b198 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile @@ -29,6 +29,7 @@ objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o objs-y$(CONFIG_MACH_OMAP_3430SDP) += lcd_2430sdp.o +objs-y$(CONFIG_MACH_OMAP_LDP) += lcd_ldp.o objs-y$(CONFIG_MACH_OMAP2EVM) += lcd_omap2evm.o objs-y$(CONFIG_MACH_OMAP3EVM) += lcd_omap3evm.o objs-y$(CONFIG_MACH_OMAP3_BEAGLE) += lcd_omap3beagle.o diff --git a/drivers/video/omap/lcd_ldp.c b/drivers/video/omap/lcd_ldp.c new file mode 100644 index 0000000..8925230 --- /dev/null +++ b/drivers/video/omap/lcd_ldp.c @@ -0,0 +1,200 @@ +/* + * LCD panel support for the TI LDP board + * + * Copyright (C) 2007 WindRiver + * Author: Stanley Miao <sta...@wi...> + * + * Derived from drivers/video/omap/lcd-2430sdp.c + * + * 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 <linux/delay.h> +#include <linux/i2c/twl4030.h> + +#include <mach/gpio.h> +#include <mach/mux.h> +#include <mach/omapfb.h> +#include <asm/mach-types.h> + +#define LCD_PANEL_BACKLIGHT_GPIO (15 + OMAP_MAX_GPIO_LINES) +#define LCD_PANEL_ENABLE_GPIO (7 + OMAP_MAX_GPIO_LINES) + +#define LCD_PANEL_RESET_GPIO 55 +#define LCD_PANEL_QVGA_GPIO 56 + +#ifdef CONFIG_FB_OMAP_LCD_VGA +#define LCD_XRES 480 +#define LCD_YRES 640 +#define LCD_PIXCLOCK_MAX 41700 +#else +#define LCD_XRES 240 +#define LCD_YRES 320 +#define LCD_PIXCLOCK_MAX 185186 +#endif + +#define PM_RECEIVER TWL4030_MODULE_PM_RECEIVER +#define ENABLE_VAUX2_DEDICATED 0x09 +#define ENABLE_VAUX2_DEV_GRP 0x20 +#define ENABLE_VAUX3_DEDICATED 0x03 +#define ENABLE_VAUX3_DEV_GRP 0x20 + +#define ENABLE_VPLL2_DEDICATED 0x05 +#define ENABLE_VPLL2_DEV_GRP 0xE0 +#define TWL4030_VPLL2_DEV_GRP 0x33 +#define TWL4030_VPLL2_DEDICATED 0x36 + +#define t2_out(c, r, v) twl4030_i2c_write_u8(c, r, v) + + +static int ldp_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + gpio_request(LCD_PANEL_RESET_GPIO, "lcd reset"); + gpio_request(LCD_PANEL_QVGA_GPIO, "lcd qvga"); + gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd panel"); + gpio_request(LCD_PANEL_BACKLIGHT_GPIO, "lcd backlight"); + + gpio_direction_output(LCD_PANEL_QVGA_GPIO, 0); + gpio_direction_output(LCD_PANEL_RESET_GPIO, 0); + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); + gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 0); + +#ifdef CONFIG_FB_OMAP_LCD_VGA + gpio_set_value(LCD_PANEL_QVGA_GPIO, 0); +#else + gpio_set_value(LCD_PANEL_QVGA_GPIO, 1); +#endif + gpio_set_value(LCD_PANEL_RESET_GPIO, 1); + + return 0; +} + +static void ldp_panel_cleanup(struct lcd_panel *panel) +{ + gpio_free(LCD_PANEL_RESET_GPIO); + gpio_free(LCD_PANEL_QVGA_GPIO); + gpio_free(LCD_PANEL_ENABLE_GPIO); + gpio_free(LCD_PANEL_BACKLIGHT_GPIO); +} + +static int ldp_panel_enable(struct lcd_panel *panel) +{ + if (0 != t2_out(PM_RECEIVER, ENABLE_VPLL2_DEDICATED, + TWL4030_VPLL2_DEDICATED)) + return -EIO; + if (0 != t2_out(PM_RECEIVER, ENABLE_VPLL2_DEV_GRP, + TWL4030_VPLL2_DEV_GRP)) + return -EIO; + + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1); + gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 1); + + if (0 != t2_out(PM_RECEIVER, ENABLE_VAUX3_DEDICATED, + TWL4030_VAUX3_DEDICATED)) + return -EIO; + if (0 != t2_out(PM_RECEIVER, ENABLE_VAUX3_DEV_GRP, + TWL4030_VAUX3_DEV_GRP)) + return -EIO; + + return 0; +} + +static void ldp_panel_disable(struct lcd_panel *panel) +{ + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); + gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 0); + + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEDICATED); + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEV_GRP); + mdelay(4); +} + +static unsigned long ldp_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +struct lcd_panel ldp_panel = { + .name = "ldp", + .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | + OMAP_LCDC_INV_HSYNC, + + .bpp = 16, + .data_lines = 18, + .x_res = LCD_XRES, + .y_res = LCD_YRES, + .hsw = 3, /* hsync_len (4) - 1 */ + .hfp = 3, /* right_margin (4) - 1 */ + .hbp = 39, /* left_margin (40) - 1 */ + .vsw = 1, /* vsync_len (2) - 1 */ + .vfp = 2, /* lower_margin */ + .vbp = 7, /* upper_margin (8) - 1 */ + + .pixel_clock = LCD_PIXCLOCK_MAX, + + .init = ldp_panel_init, + .cleanup = ldp_panel_cleanup, + .enable = ldp_panel_enable, + .disable = ldp_panel_disable, + .get_caps = ldp_panel_get_caps, +}; + +static int ldp_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&ldp_panel); + return 0; +} + +static int ldp_panel_remove(struct platform_device *pdev) +{ + return 0; +} + +static int ldp_panel_suspend(struct platform_device *pdev, pm_message_t mesg) +{ + return 0; +} + +static int ldp_panel_resume(struct platform_device *pdev) +{ + return 0; +} + +struct platform_driver ldp_panel_driver = { + .probe = ldp_panel_probe, + .remove = ldp_panel_remove, + .suspend = ldp_panel_suspend, + .resume = ldp_panel_resume, + .driver = { + .name = "ldp_lcd", + .owner = THIS_MODULE, + }, +}; + +static int __init ldp_panel_drv_init(void) +{ + return platform_driver_register(&ldp_panel_driver); +} + +static void __exit ldp_panel_drv_exit(void) +{ + platform_driver_unregister(&ldp_panel_driver); +} + +module_init(ldp_panel_drv_init); +module_exit(ldp_panel_drv_exit); -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:29:42
|
On Thu, 4 Jun 2009 20:52:36 +0300 Imre Deak <imr...@no...> wrote: > From: Stanley.Miao <sta...@wi...> > > Add glue to control the OMAP_LDP LCD as a frame buffer device > using the existing dispc.c driver under omapfb. > > Patch updated for mainline kernel. Note that the > drivers/video/omap should be updated to pass omap_lcd_config > in platform_data. The patch should also be updated to compile > if twl4030 is not selected, and eventually to use the regulator > framework. > > Signed-off-by: Stanley.Miao <sta...@wi...> > Signed-off-by: Tony Lindgren <to...@at...> > Fixed-by: Jarkko Nikula <jar...@gm...> > Fixed-by: Tony Lindgren <to...@at...> > CC: lin...@li... > Signed-off-by: Imre Deak <imr...@no...> > --- > arch/arm/configs/omap_ldp_defconfig | 54 +++++++++- > drivers/video/omap/Kconfig | 4 + > drivers/video/omap/Makefile | 1 + > drivers/video/omap/lcd_ldp.c | 200 +++++++++++++++++++++++++++++++++++ > 4 files changed, 257 insertions(+), 2 deletions(-) > create mode 100644 drivers/video/omap/lcd_ldp.c > > diff --git a/arch/arm/configs/omap_ldp_defconfig b/arch/arm/configs/omap_ldp_defconfig > index 679a4a3..b9c4891 100644 > --- a/arch/arm/configs/omap_ldp_defconfig > +++ b/arch/arm/configs/omap_ldp_defconfig > @@ -690,6 +690,7 @@ CONFIG_GPIOLIB=y > # CONFIG_GPIO_MAX732X is not set > # CONFIG_GPIO_PCA953X is not set > # CONFIG_GPIO_PCF857X is not set > +CONFIG_GPIO_TWL4030=y > > # > # PCI GPIO expanders: > @@ -742,6 +743,7 @@ CONFIG_SSB_POSSIBLE=y > # CONFIG_MFD_SM501 is not set > # CONFIG_HTC_EGPIO is not set > # CONFIG_HTC_PASIC3 is not set > +CONFIG_TWL4030_CORE=y > # CONFIG_MFD_TMIO is not set > # CONFIG_MFD_T7L66XB is not set > # CONFIG_MFD_TC6387XB is not set > @@ -767,8 +769,46 @@ CONFIG_DAB=y > # > # CONFIG_VGASTATE is not set > CONFIG_VIDEO_OUTPUT_CONTROL=m > -# CONFIG_FB is not set > -# CONFIG_BACKLIGHT_LCD_SUPPORT is not set > +CONFIG_FB=y > +CONFIG_FIRMWARE_EDID=y > +# CONFIG_FB_DDC is not set > +# CONFIG_FB_BOOT_VESA_SUPPORT is not set > +CONFIG_FB_CFB_FILLRECT=y > +CONFIG_FB_CFB_COPYAREA=y > +CONFIG_FB_CFB_IMAGEBLIT=y > +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set > +# CONFIG_FB_SYS_FILLRECT is not set > +# CONFIG_FB_SYS_COPYAREA is not set > +# CONFIG_FB_SYS_IMAGEBLIT is not set > +# CONFIG_FB_FOREIGN_ENDIAN is not set > +# CONFIG_FB_SYS_FOPS is not set > +# CONFIG_FB_SVGALIB is not set > +# CONFIG_FB_MACMODES is not set > +# CONFIG_FB_BACKLIGHT is not set > +CONFIG_FB_MODE_HELPERS=y > +CONFIG_FB_TILEBLITTING=y > + > +# > +# Frame buffer hardware drivers > +# > +# CONFIG_FB_S1D13XXX is not set > +# CONFIG_FB_VIRTUAL is not set > +# CONFIG_FB_METRONOME is not set > +CONFIG_FB_OMAP=y > +CONFIG_FB_OMAP_LCD_VGA=y > +# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set > +# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set > +CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=4 > +CONFIG_BACKLIGHT_LCD_SUPPORT=y > +CONFIG_LCD_CLASS_DEVICE=y > +# CONFIG_LCD_LTV350QV is not set > +# CONFIG_LCD_ILI9320 is not set > +# CONFIG_LCD_TDO24M is not set > +# CONFIG_LCD_VGG2432A4 is not set > +CONFIG_LCD_PLATFORM=y > +CONFIG_BACKLIGHT_CLASS_DEVICE=y > +# CONFIG_BACKLIGHT_CORGI is not set > +# CONFIG_BACKLIGHT_GENERIC is not set > > # > # Display device support > @@ -780,6 +820,16 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m > # > # CONFIG_VGA_CONSOLE is not set > CONFIG_DUMMY_CONSOLE=y > +CONFIG_FRAMEBUFFER_CONSOLE=y > +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set > +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set > +# CONFIG_FONTS is not set > +CONFIG_FONT_8x8=y > +CONFIG_FONT_8x16=y > +CONFIG_LOGO=y > +CONFIG_LOGO_LINUX_MONO=y > +CONFIG_LOGO_LINUX_VGA16=y > +CONFIG_LOGO_LINUX_CLUT224=y > CONFIG_SOUND=y > CONFIG_SND=y > # CONFIG_SND_SEQUENCER is not set > diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig > index eb05e09..2bffc07 100644 > --- a/drivers/video/omap/Kconfig > +++ b/drivers/video/omap/Kconfig > @@ -7,6 +7,10 @@ config FB_OMAP > help > Frame buffer driver for OMAP based boards. > > +config FB_OMAP_LCD_VGA > + bool "Use LCD in VGA mode" > + depends on MACH_OMAP_3430SDP || MACH_OMAP_LDP > + > choice > depends on FB_OMAP && MACH_OVERO > prompt "Screen resolution" > diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile > index 0d2996a..b63b198 100644 > --- a/drivers/video/omap/Makefile > +++ b/drivers/video/omap/Makefile > @@ -29,6 +29,7 @@ objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o > objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o > objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o > objs-y$(CONFIG_MACH_OMAP_3430SDP) += lcd_2430sdp.o > +objs-y$(CONFIG_MACH_OMAP_LDP) += lcd_ldp.o > objs-y$(CONFIG_MACH_OMAP2EVM) += lcd_omap2evm.o > objs-y$(CONFIG_MACH_OMAP3EVM) += lcd_omap3evm.o > objs-y$(CONFIG_MACH_OMAP3_BEAGLE) += lcd_omap3beagle.o > diff --git a/drivers/video/omap/lcd_ldp.c b/drivers/video/omap/lcd_ldp.c > new file mode 100644 > index 0000000..8925230 > --- /dev/null > +++ b/drivers/video/omap/lcd_ldp.c > @@ -0,0 +1,200 @@ > +/* > + * LCD panel support for the TI LDP board > + * > + * Copyright (C) 2007 WindRiver > + * Author: Stanley Miao <sta...@wi...> > + * > + * Derived from drivers/video/omap/lcd-2430sdp.c > + * > + * 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 <linux/delay.h> > +#include <linux/i2c/twl4030.h> > + > +#include <mach/gpio.h> > +#include <mach/mux.h> > +#include <mach/omapfb.h> > +#include <asm/mach-types.h> > + > +#define LCD_PANEL_BACKLIGHT_GPIO (15 + OMAP_MAX_GPIO_LINES) > +#define LCD_PANEL_ENABLE_GPIO (7 + OMAP_MAX_GPIO_LINES) > + > +#define LCD_PANEL_RESET_GPIO 55 > +#define LCD_PANEL_QVGA_GPIO 56 > + > +#ifdef CONFIG_FB_OMAP_LCD_VGA > +#define LCD_XRES 480 > +#define LCD_YRES 640 > +#define LCD_PIXCLOCK_MAX 41700 > +#else > +#define LCD_XRES 240 > +#define LCD_YRES 320 > +#define LCD_PIXCLOCK_MAX 185186 > +#endif > + > +#define PM_RECEIVER TWL4030_MODULE_PM_RECEIVER > +#define ENABLE_VAUX2_DEDICATED 0x09 > +#define ENABLE_VAUX2_DEV_GRP 0x20 > +#define ENABLE_VAUX3_DEDICATED 0x03 > +#define ENABLE_VAUX3_DEV_GRP 0x20 > + > +#define ENABLE_VPLL2_DEDICATED 0x05 > +#define ENABLE_VPLL2_DEV_GRP 0xE0 > +#define TWL4030_VPLL2_DEV_GRP 0x33 > +#define TWL4030_VPLL2_DEDICATED 0x36 > + > +#define t2_out(c, r, v) twl4030_i2c_write_u8(c, r, v) > + > + > +static int ldp_panel_init(struct lcd_panel *panel, > + struct omapfb_device *fbdev) > +{ > + gpio_request(LCD_PANEL_RESET_GPIO, "lcd reset"); > + gpio_request(LCD_PANEL_QVGA_GPIO, "lcd qvga"); > + gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd panel"); > + gpio_request(LCD_PANEL_BACKLIGHT_GPIO, "lcd backlight"); > + > + gpio_direction_output(LCD_PANEL_QVGA_GPIO, 0); > + gpio_direction_output(LCD_PANEL_RESET_GPIO, 0); > + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); > + gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 0); > + > +#ifdef CONFIG_FB_OMAP_LCD_VGA > + gpio_set_value(LCD_PANEL_QVGA_GPIO, 0); > +#else > + gpio_set_value(LCD_PANEL_QVGA_GPIO, 1); > +#endif > + gpio_set_value(LCD_PANEL_RESET_GPIO, 1); > + > + return 0; > +} > + > +static void ldp_panel_cleanup(struct lcd_panel *panel) > +{ > + gpio_free(LCD_PANEL_RESET_GPIO); > + gpio_free(LCD_PANEL_QVGA_GPIO); > + gpio_free(LCD_PANEL_ENABLE_GPIO); > + gpio_free(LCD_PANEL_BACKLIGHT_GPIO); > +} > + > +static int ldp_panel_enable(struct lcd_panel *panel) > +{ > + if (0 != t2_out(PM_RECEIVER, ENABLE_VPLL2_DEDICATED, > + TWL4030_VPLL2_DEDICATED)) > + return -EIO; > + if (0 != t2_out(PM_RECEIVER, ENABLE_VPLL2_DEV_GRP, > + TWL4030_VPLL2_DEV_GRP)) > + return -EIO; > + > + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1); > + gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 1); > + > + if (0 != t2_out(PM_RECEIVER, ENABLE_VAUX3_DEDICATED, > + TWL4030_VAUX3_DEDICATED)) > + return -EIO; > + if (0 != t2_out(PM_RECEIVER, ENABLE_VAUX3_DEV_GRP, > + TWL4030_VAUX3_DEV_GRP)) > + return -EIO; > + > + return 0; > +} > + > +static void ldp_panel_disable(struct lcd_panel *panel) > +{ > + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); > + gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 0); > + > + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEDICATED); > + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEV_GRP); > + mdelay(4); Use the msleep() instead of the mdelay(). > +} > + > +static unsigned long ldp_panel_get_caps(struct lcd_panel *panel) > +{ > + return 0; > +} > + > +struct lcd_panel ldp_panel = { > + .name = "ldp", > + .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | > + OMAP_LCDC_INV_HSYNC, > + > + .bpp = 16, > + .data_lines = 18, > + .x_res = LCD_XRES, > + .y_res = LCD_YRES, > + .hsw = 3, /* hsync_len (4) - 1 */ > + .hfp = 3, /* right_margin (4) - 1 */ > + .hbp = 39, /* left_margin (40) - 1 */ > + .vsw = 1, /* vsync_len (2) - 1 */ > + .vfp = 2, /* lower_margin */ > + .vbp = 7, /* upper_margin (8) - 1 */ > + > + .pixel_clock = LCD_PIXCLOCK_MAX, > + > + .init = ldp_panel_init, > + .cleanup = ldp_panel_cleanup, > + .enable = ldp_panel_enable, > + .disable = ldp_panel_disable, > + .get_caps = ldp_panel_get_caps, > +}; > + > +static int ldp_panel_probe(struct platform_device *pdev) > +{ > + omapfb_register_panel(&ldp_panel); > + return 0; > +} > + > +static int ldp_panel_remove(struct platform_device *pdev) > +{ > + return 0; > +} > + > +static int ldp_panel_suspend(struct platform_device *pdev, pm_message_t mesg) > +{ > + return 0; > +} > + > +static int ldp_panel_resume(struct platform_device *pdev) > +{ > + return 0; > +} > + > +struct platform_driver ldp_panel_driver = { > + .probe = ldp_panel_probe, > + .remove = ldp_panel_remove, > + .suspend = ldp_panel_suspend, > + .resume = ldp_panel_resume, > + .driver = { > + .name = "ldp_lcd", > + .owner = THIS_MODULE, > + }, > +}; > + > +static int __init ldp_panel_drv_init(void) > +{ > + return platform_driver_register(&ldp_panel_driver); > +} > + > +static void __exit ldp_panel_drv_exit(void) > +{ > + platform_driver_unregister(&ldp_panel_driver); > +} > + > +module_init(ldp_panel_drv_init); > +module_exit(ldp_panel_drv_exit); > -- > 1.6.3.1 > > > ------------------------------------------------------------------------------ > OpenSolaris 2009.06 is a cutting edge operating system for enterprises > looking to deploy the next generation of Solaris that includes the latest > innovations from Sun and the OpenSource community. Download a copy and > enjoy capabilities such as Networking, Storage and Virtualization. > Go to: http://p.sf.net/sfu/opensolaris-get > _______________________________________________ > Linux-fbdev-devel mailing list > Lin...@li... > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel > ---------------------------------------------------------------------- Chcesz miec nawigacje GPS ? Zamow lub przedluz umowe na neostrade, a nawigacja bedzie Twoja. Kliknij na link po szczegoly! http://link.interia.pl/f219a |
From: Imre D. <imr...@no...> - 2009-06-04 17:56:14
|
From: arun c <aru...@mi...> - use __iomem type attribute where appropriate - expand (a ? : b) to (a ? a : b) As suggested by Russell King <li...@ar...> - remove a dead line from omapfb_main.c Signed-off-by: Arun C <aru...@mi...> Signed-off-by: Tony Lindgren <to...@at...> CC: lin...@li... Signed-off-by: Imre Deak <imr...@no...> --- arch/arm/plat-omap/include/mach/omapfb.h | 4 ++-- drivers/video/omap/omapfb_main.c | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/arch/arm/plat-omap/include/mach/omapfb.h b/arch/arm/plat-omap/include/mach/omapfb.h index 7b74d12..b226bdf 100644 --- a/arch/arm/plat-omap/include/mach/omapfb.h +++ b/arch/arm/plat-omap/include/mach/omapfb.h @@ -276,8 +276,8 @@ typedef int (*omapfb_notifier_callback_t)(struct notifier_block *, void *fbi); struct omapfb_mem_region { - dma_addr_t paddr; - void *vaddr; + u32 paddr; + void __iomem *vaddr; unsigned long size; u8 type; /* OMAPFB_PLANE_MEM_* */ unsigned alloc:1; /* allocated by the driver */ diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c index 098177b..0df4523 100644 --- a/drivers/video/omap/omapfb_main.c +++ b/drivers/video/omap/omapfb_main.c @@ -562,7 +562,6 @@ static int set_fb_var(struct fb_info *fbi, var->xoffset = var->xres_virtual - var->xres; if (var->yres + var->yoffset > var->yres_virtual) var->yoffset = var->yres_virtual - var->yres; - line_size = var->xres * bpp / 8; if (plane->color_mode == OMAPFB_COLOR_RGB444) { var->red.offset = 8; var->red.length = 4; @@ -1719,8 +1718,8 @@ static int omapfb_do_probe(struct platform_device *pdev, pr_info("omapfb: configured for panel %s\n", fbdev->panel->name); - def_vxres = def_vxres ? : fbdev->panel->x_res; - def_vyres = def_vyres ? : fbdev->panel->y_res; + def_vxres = def_vxres ? def_vxres : fbdev->panel->x_res; + def_vyres = def_vyres ? def_vyres : fbdev->panel->y_res; init_state++; -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:37:39
|
On Thu, 4 Jun 2009 20:52:43 +0300 Imre Deak <imr...@no...> wrote: > From: arun c <aru...@mi...> > > - use __iomem type attribute where appropriate > - expand (a ? : b) to (a ? a : b) > As suggested by Russell King <li...@ar...> > > - remove a dead line from omapfb_main.c > > Signed-off-by: Arun C <aru...@mi...> > Signed-off-by: Tony Lindgren <to...@at...> > CC: lin...@li... > Signed-off-by: Imre Deak <imr...@no...> > --- > arch/arm/plat-omap/include/mach/omapfb.h | 4 ++-- > drivers/video/omap/omapfb_main.c | 5 ++--- > 2 files changed, 4 insertions(+), 5 deletions(-) > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Kup wlasne mieszkanie za 33 tys. zl. Sprawdz >>> http://link.interia.pl/f21eb |
From: Imre D. <imr...@no...> - 2009-06-04 17:56:55
|
Fixes the following: warning: assignment discards qualifiers from pointer target type CC: lin...@li... Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/hwa742.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/video/omap/hwa742.c b/drivers/video/omap/hwa742.c index 8aa6e47..7bbd4c7 100644 --- a/drivers/video/omap/hwa742.c +++ b/drivers/video/omap/hwa742.c @@ -131,7 +131,7 @@ struct { struct omapfb_device *fbdev; struct lcd_ctrl_extif *extif; - struct lcd_ctrl *int_ctrl; + const struct lcd_ctrl *int_ctrl; void (*power_up)(struct device *dev); void (*power_down)(struct device *dev); -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:39:01
|
On Thu, 4 Jun 2009 20:52:45 +0300 Imre Deak <imr...@no...> wrote: > Fixes the following: > warning: assignment discards qualifiers from pointer target type > > CC: lin...@li... > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/hwa742.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Interia.pl w Twojej kieszeni! Kliknij >>>http://link.interia.pl/f21b8 |
From: Imre D. <imr...@no...> - 2009-06-04 17:57:14
|
From: Jouni Hogander <jou...@no...> Without wakeup enable omap doesn't wake up on dispc interrupts. This causes problems in a case where mpu is in sleep state and dispc interrupt fires. Signed-off-by: Jouni Hogander <jou...@no...> Signed-off-by: Tony Lindgren <to...@at...> Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/dispc.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c index cc3c817..9adf54e 100644 --- a/drivers/video/omap/dispc.c +++ b/drivers/video/omap/dispc.c @@ -1395,10 +1395,10 @@ static int omap_dispc_init(struct omapfb_device *fbdev, int ext_mode, enable_digit_clocks(0); } - /* Enable smart idle and autoidle */ + /* Enable smart standby/idle, autoidle and wakeup */ l = dispc_read_reg(DISPC_SYSCONFIG); l &= ~((3 << 12) | (3 << 3)); - l |= (2 << 12) | (2 << 3) | (1 << 0); + l |= (2 << 12) | (2 << 3) | (1 << 2) | (1 << 0); dispc_write_reg(DISPC_SYSCONFIG, l); omap_writel(1 << 0, DSS_BASE + DSS_SYSCONFIG); -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:33:35
|
On Thu, 4 Jun 2009 20:52:40 +0300 Imre Deak <imr...@no...> wrote: > From: Jouni Hogander <jou...@no...> > > Without wakeup enable omap doesn't wake up on dispc interrupts. This > causes problems in a case where mpu is in sleep state and dispc > interrupt fires. > > Signed-off-by: Jouni Hogander <jou...@no...> > Signed-off-by: Tony Lindgren <to...@at...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/dispc.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Nowa akcja Pepsi - nagrody za kody spod nakretek. Zarejestruj sie! http://link.interia.pl/f21cc |
From: Imre D. <imr...@no...> - 2009-06-04 17:57:14
|
From: Daniel Stone <dan...@no...> Previously, the only external (to dispc.c) IRQ handler was RFBI's frame done handler. dispc's IRQ framework was very dumb: you could only have one handler, and the semantics of {request,free}_irq were odd, to say the least. The new framework allows multiple consumers to register arbitrary IRQ masks. Signed-off-by: Daniel Stone <dan...@no...> Signed-off-by: Tony Lindgren <to...@at...> Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/dispc.c | 95 +++++++++++++++++++++++++++----------------- drivers/video/omap/dispc.h | 7 ++- drivers/video/omap/rfbi.c | 7 ++- 3 files changed, 67 insertions(+), 42 deletions(-) diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c index 9adf54e..350b444 100644 --- a/drivers/video/omap/dispc.c +++ b/drivers/video/omap/dispc.c @@ -155,6 +155,8 @@ struct resmap { unsigned long *map; }; +#define MAX_IRQ_HANDLERS 4 + static struct { void __iomem *base; @@ -167,9 +169,11 @@ static struct { int ext_mode; - unsigned long enabled_irqs; - void (*irq_callback)(void *); - void *irq_callback_data; + struct { + u32 irq_mask; + void (*callback)(void *); + void *data; + } irq_handlers[MAX_IRQ_HANDLERS]; struct completion frame_done; int fir_hinc[OMAPFB_PLANE_NUM]; @@ -809,56 +813,70 @@ static void set_lcd_timings(void) panel->pixel_clock = fck / lck_div / pck_div / 1000; } -int omap_dispc_request_irq(void (*callback)(void *data), void *data) +static void recalc_irq_mask(void) { - int r = 0; + int i; + unsigned long irq_mask = DISPC_IRQ_MASK_ERROR; - BUG_ON(callback == NULL); + for (i = 0; i < MAX_IRQ_HANDLERS; i++) { + if (!dispc.irq_handlers[i].callback) + continue; - if (dispc.irq_callback) - r = -EBUSY; - else { - dispc.irq_callback = callback; - dispc.irq_callback_data = data; + irq_mask |= dispc.irq_handlers[i].irq_mask; } - return r; -} -EXPORT_SYMBOL(omap_dispc_request_irq); - -void omap_dispc_enable_irqs(int irq_mask) -{ enable_lcd_clocks(1); - dispc.enabled_irqs = irq_mask; - irq_mask |= DISPC_IRQ_MASK_ERROR; MOD_REG_FLD(DISPC_IRQENABLE, 0x7fff, irq_mask); enable_lcd_clocks(0); } -EXPORT_SYMBOL(omap_dispc_enable_irqs); -void omap_dispc_disable_irqs(int irq_mask) +int omap_dispc_request_irq(unsigned long irq_mask, void (*callback)(void *data), + void *data) { - enable_lcd_clocks(1); - dispc.enabled_irqs &= ~irq_mask; - irq_mask &= ~DISPC_IRQ_MASK_ERROR; - MOD_REG_FLD(DISPC_IRQENABLE, 0x7fff, irq_mask); - enable_lcd_clocks(0); + int i; + + BUG_ON(callback == NULL); + + for (i = 0; i < MAX_IRQ_HANDLERS; i++) { + if (dispc.irq_handlers[i].callback) + continue; + + dispc.irq_handlers[i].irq_mask = irq_mask; + dispc.irq_handlers[i].callback = callback; + dispc.irq_handlers[i].data = data; + recalc_irq_mask(); + + return 0; + } + + return -EBUSY; } -EXPORT_SYMBOL(omap_dispc_disable_irqs); +EXPORT_SYMBOL(omap_dispc_request_irq); -void omap_dispc_free_irq(void) +void omap_dispc_free_irq(unsigned long irq_mask, void (*callback)(void *data), + void *data) { - enable_lcd_clocks(1); - omap_dispc_disable_irqs(DISPC_IRQ_MASK_ALL); - dispc.irq_callback = NULL; - dispc.irq_callback_data = NULL; - enable_lcd_clocks(0); + int i; + + for (i = 0; i < MAX_IRQ_HANDLERS; i++) { + if (dispc.irq_handlers[i].callback == callback && + dispc.irq_handlers[i].data == data) { + dispc.irq_handlers[i].irq_mask = 0; + dispc.irq_handlers[i].callback = NULL; + dispc.irq_handlers[i].data = NULL; + recalc_irq_mask(); + return; + } + } + + BUG(); } EXPORT_SYMBOL(omap_dispc_free_irq); static irqreturn_t omap_dispc_irq_handler(int irq, void *dev) { u32 stat; + int i = 0; enable_lcd_clocks(1); @@ -873,8 +891,12 @@ static irqreturn_t omap_dispc_irq_handler(int irq, void *dev) } } - if ((stat & dispc.enabled_irqs) && dispc.irq_callback) - dispc.irq_callback(dispc.irq_callback_data); + for (i = 0; i < MAX_IRQ_HANDLERS; i++) { + if (unlikely(dispc.irq_handlers[i].callback && + (stat & dispc.irq_handlers[i].irq_mask))) + dispc.irq_handlers[i].callback( + dispc.irq_handlers[i].data); + } dispc_write_reg(DISPC_IRQSTATUS, stat); @@ -1410,8 +1432,7 @@ static int omap_dispc_init(struct omapfb_device *fbdev, int ext_mode, l = dispc_read_reg(DISPC_IRQSTATUS); dispc_write_reg(DISPC_IRQSTATUS, l); - /* Enable those that we handle always */ - omap_dispc_enable_irqs(DISPC_IRQ_FRAMEMASK); + recalc_irq_mask(); if ((r = request_irq(INT_24XX_DSS_IRQ, omap_dispc_irq_handler, 0, MODULE_NAME, fbdev)) < 0) { diff --git a/drivers/video/omap/dispc.h b/drivers/video/omap/dispc.h index ef720a7..c15ea77 100644 --- a/drivers/video/omap/dispc.h +++ b/drivers/video/omap/dispc.h @@ -37,9 +37,10 @@ extern void omap_dispc_set_lcd_size(int width, int height); extern void omap_dispc_enable_lcd_out(int enable); extern void omap_dispc_enable_digit_out(int enable); -extern int omap_dispc_request_irq(void (*callback)(void *data), void *data); -extern void omap_dispc_free_irq(void); +extern int omap_dispc_request_irq(unsigned long irq_mask, + void (*callback)(void *data), void *data); +extern void omap_dispc_free_irq(unsigned long irq_mask, + void (*callback)(void *data), void *data); extern const struct lcd_ctrl omap2_int_ctrl; - #endif diff --git a/drivers/video/omap/rfbi.c b/drivers/video/omap/rfbi.c index 9332d6c..ee01e84 100644 --- a/drivers/video/omap/rfbi.c +++ b/drivers/video/omap/rfbi.c @@ -57,6 +57,7 @@ #define DISPC_BASE 0x48050400 #define DISPC_CONTROL 0x0040 +#define DISPC_IRQ_FRAMEMASK 0x0001 static struct { void __iomem *base; @@ -553,7 +554,9 @@ static int rfbi_init(struct omapfb_device *fbdev) l = (0x01 << 2); rfbi_write_reg(RFBI_CONTROL, l); - if ((r = omap_dispc_request_irq(rfbi_dma_callback, NULL)) < 0) { + r = omap_dispc_request_irq(DISPC_IRQ_FRAMEMASK, rfbi_dma_callback, + NULL); + if (r < 0) { dev_err(fbdev->dev, "can't get DISPC irq\n"); rfbi_enable_clocks(0); return r; @@ -570,7 +573,7 @@ static int rfbi_init(struct omapfb_device *fbdev) static void rfbi_cleanup(void) { - omap_dispc_free_irq(); + omap_dispc_free_irq(DISPC_IRQ_FRAMEMASK, rfbi_dma_callback, NULL); rfbi_put_clocks(); iounmap(rfbi.base); } -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:34:52
|
On Thu, 4 Jun 2009 20:52:41 +0300 Imre Deak <imr...@no...> wrote: > From: Daniel Stone <dan...@no...> > > Previously, the only external (to dispc.c) IRQ handler was RFBI's > frame done handler. dispc's IRQ framework was very dumb: you could only > have one handler, and the semantics of {request,free}_irq were odd, to > say the least. > > The new framework allows multiple consumers to register arbitrary IRQ > masks. > > Signed-off-by: Daniel Stone <dan...@no...> > Signed-off-by: Tony Lindgren <to...@at...> > Signed-off-by: Imre Deak <imr...@no...> > --- Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Masz juz dosc wysokich rachunkow? Wygraj nowa mozliwosc komunikacji! Sprawdz >>> http://link.interia.pl/f21d2 |
From: Imre D. <imr...@no...> - 2009-06-04 17:57:13
|
Also move the controller specific options up in the menu, to a more logical spot. Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/Kconfig | 49 ++++++++++++++++++++++++++----------------- 1 files changed, 30 insertions(+), 19 deletions(-) diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig index 2bffc07..551e3e9 100644 --- a/drivers/video/omap/Kconfig +++ b/drivers/video/omap/Kconfig @@ -32,6 +32,36 @@ config FB_OMAP_092M9R endchoice +config FB_OMAP_LCDC_EXTERNAL + bool "External LCD controller support" + depends on FB_OMAP + help + Say Y here, if you want to have support for boards with an + external LCD controller connected to the SoSSI/RFBI interface. + +config FB_OMAP_LCDC_HWA742 + bool "Epson HWA742 LCD controller support" + depends on FB_OMAP && FB_OMAP_LCDC_EXTERNAL + help + Say Y here if you want to have support for the external + Epson HWA742 LCD controller. + +config FB_OMAP_LCDC_BLIZZARD + bool "Epson Blizzard LCD controller support" + depends on FB_OMAP && FB_OMAP_LCDC_EXTERNAL + help + Say Y here if you want to have support for the external + Epson Blizzard LCD controller. + +config FB_OMAP_MANUAL_UPDATE + bool "Default to manual update mode" + depends on FB_OMAP && FB_OMAP_LCDC_EXTERNAL + help + Say Y here, if your user-space applications are capable of + notifying the frame buffer driver when a change has occured in + the frame buffer content and thus a reload of the image data to + the external frame buffer is required. If unsure, say N. + config FB_OMAP_LCD_MIPID bool "MIPI DBI-C/DCS compatible LCD support" depends on FB_OMAP && SPI_MASTER @@ -69,23 +99,4 @@ config FB_OMAP_DMA_TUNE answer yes. Answer no if you have a dedicated video memory, or don't use any of the accelerated features. -config FB_OMAP_LCDC_EXTERNAL - bool "External LCD controller support" - depends on FB_OMAP - help - Say Y here, if you want to have support for boards with an - external LCD controller connected to the SoSSI/RFBI interface. -config FB_OMAP_LCDC_HWA742 - bool "Epson HWA742 LCD controller support" - depends on FB_OMAP && FB_OMAP_LCDC_EXTERNAL - help - Say Y here if you want to have support for the external - Epson HWA742 LCD controller. - -config FB_OMAP_LCDC_BLIZZARD - bool "Epson Blizzard LCD controller support" - depends on FB_OMAP && FB_OMAP_LCDC_EXTERNAL - help - Say Y here if you want to have support for the external - Epson Blizzard LCD controller. -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:38:42
|
On Thu, 4 Jun 2009 20:52:44 +0300 Imre Deak <imr...@no...> wrote: > Also move the controller specific options up in the menu, to a more > logical spot. > > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/Kconfig | 49 ++++++++++++++++++++++++++----------------- > 1 files changed, 30 insertions(+), 19 deletions(-) > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Kup wlasne mieszkanie za 33 tys. zl. Sprawdz >>> http://link.interia.pl/f21eb |
From: Krzysztof H. <krz...@po...> - 2009-06-04 20:52:52
|
On Thu, 4 Jun 2009 20:52:25 +0300 Imre Deak <imr...@no...> wrote: > Hi, > > I'd like to ask for the merging of this patchset into Linus' tree. > It adds support for new LCDs on OMAP based boards (01-12) and fixes > generic parts of the omapfb driver (13-20). The changes have been > staged in the Linux OMAP tree for quite a long time, so they should > be safe to be merged. > I will review your patches over next weekend. Best regards, Krzysztof ---------------------------------------------------------------------- Dodaj ogloszenie motoryzacyjne za 0 zl! Tylko na mobile.interia.pl Sprawdz >>> http://link.interia.pl/f21b7 |
From: Krzysztof H. <krz...@po...> - 2009-06-07 22:36:10
|
On Thu, 4 Jun 2009 20:52:27 +0300 Imre Deak <imr...@no...> wrote: > Fixed-by: Mike Wege <ext...@no...> > Fixed-by: Arnaud Patard <arn...@rt...> > Fixed-by: Timo Savola <ts...@mo...> > Fixed-by: Hiroshi DOYU <Hir...@no...> > Fixed-by: Trilok Soni <son...@gm...> > Signed-off-by: Imre Deak <imr...@so...> > Signed-off-by: Juha Yrjola <juh...@so...> > --- > arch/arm/plat-omap/include/mach/lcd_mipid.h | 5 + > drivers/video/omap/Kconfig | 8 + > drivers/video/omap/Makefile | 1 + > drivers/video/omap/lcd_mipid.c | 631 +++++++++++++++++++++++++++ > 4 files changed, 645 insertions(+), 0 deletions(-) > create mode 100644 drivers/video/omap/lcd_mipid.c > > diff --git a/arch/arm/plat-omap/include/mach/lcd_mipid.h b/arch/arm/plat-omap/include/mach/lcd_mipid.h > index f8fbc48..8e52c65 100644 > --- a/arch/arm/plat-omap/include/mach/lcd_mipid.h > +++ b/arch/arm/plat-omap/include/mach/lcd_mipid.h > @@ -16,7 +16,12 @@ enum mipid_test_result { > struct mipid_platform_data { > int nreset_gpio; > int data_lines; > + > void (*shutdown)(struct mipid_platform_data *pdata); > + void (*set_bklight_level)(struct mipid_platform_data *pdata, > + int level); > + int (*get_bklight_level)(struct mipid_platform_data *pdata); > + int (*get_bklight_max)(struct mipid_platform_data *pdata); > }; > > #endif > diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig > index 4440885..574453f 100644 > --- a/drivers/video/omap/Kconfig > +++ b/drivers/video/omap/Kconfig > @@ -7,6 +7,14 @@ config FB_OMAP > help > Frame buffer driver for OMAP based boards. > > +config FB_OMAP_LCD_MIPID > + bool "MIPI DBI-C/DCS compatible LCD support" > + depends on FB_OMAP && SPI_MASTER > + help > + Say Y here if you want to have support for LCDs compatible with > + the Mobile Industry Processor Interface DBI-C/DCS > + specification. (Supported LCDs: Philips LPH8923, Sharp LS041Y3) > + > config FB_OMAP_BOOTLOADER_INIT > bool "Check bootloader initialization" > depends on FB_OMAP > diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile > index d053498..d86d54a 100644 > --- a/drivers/video/omap/Makefile > +++ b/drivers/video/omap/Makefile > @@ -25,6 +25,7 @@ objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o > objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o > > objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o > +objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o > > omapfb-objs := $(objs-yy) > > diff --git a/drivers/video/omap/lcd_mipid.c b/drivers/video/omap/lcd_mipid.c > new file mode 100644 > index 0000000..3165d3d > --- /dev/null > +++ b/drivers/video/omap/lcd_mipid.c > @@ -0,0 +1,631 @@ > +/* > + * LCD driver for MIPI DBI-C / DCS compatible LCDs > + * > + * Copyright (C) 2006 Nokia Corporation > + * Author: Imre Deak <imr...@no...> > + * > + * 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/device.h> > +#include <linux/delay.h> > +#include <linux/workqueue.h> > +#include <linux/spi/spi.h> > + > +#include <mach/omapfb.h> > +#include <mach/lcd_mipid.h> > + > +#define MIPID_MODULE_NAME "lcd_mipid" > + > +#define MIPID_CMD_READ_DISP_ID 0x04 > +#define MIPID_CMD_READ_RED 0x06 > +#define MIPID_CMD_READ_GREEN 0x07 > +#define MIPID_CMD_READ_BLUE 0x08 > +#define MIPID_CMD_READ_DISP_STATUS 0x09 > +#define MIPID_CMD_RDDSDR 0x0F > +#define MIPID_CMD_SLEEP_IN 0x10 > +#define MIPID_CMD_SLEEP_OUT 0x11 > +#define MIPID_CMD_DISP_OFF 0x28 > +#define MIPID_CMD_DISP_ON 0x29 > + > +#define MIPID_VER_LPH8923 3 > +#define MIPID_VER_LS041Y3 4 > + > +#define MIPID_ESD_CHECK_PERIOD msecs_to_jiffies(5000) > + > +#define to_mipid_device(p) container_of(p, struct mipid_device, \ > + panel) > +struct mipid_device { > + int enabled; > + int model; This one is only set and never read. A name is probably enough. > + int revision; > + u8 display_id[3]; This one should be a local variable. > + unsigned int saved_bklight_level; > + unsigned long hw_guard_end; /* next value of jiffies > + when we can issue the > + next sleep in/out command */ > + unsigned long hw_guard_wait; /* max guard time in jiffies */ > + > + struct omapfb_device *fbdev; > + struct spi_device *spi; > + struct mutex mutex; > + struct lcd_panel panel; How does it differ from fbdev->panel? Is it duplicated field? I am sorry but I had not enough time to review the rest. Regards, Krzysztof ---------------------------------------------------------------------- Zostan dziennikarzem obywatelskim! Sprawd¼ sie >>> http://link.interia.pl/f21b9 |
From: Imre D. <imr...@no...> - 2009-06-09 11:15:51
|
Hi, On Mon, Jun 08, 2009 at 12:43:24AM +0200, ext Krzysztof Helt wrote: > On Thu, 4 Jun 2009 20:52:27 +0300 > Imre Deak <imr...@no...> wrote: >[...] > > + > > +#define to_mipid_device(p) container_of(p, struct mipid_device, \ > > + panel) > > +struct mipid_device { > > + int enabled; > > + int model; > > This one is only set and never read. A name is probably enough. Ok, I'll remove model. > > > + int revision; > > + u8 display_id[3]; > > This one should be a local variable. Ok, I'll move it to the func where it's used. > > > + unsigned int saved_bklight_level; > > + unsigned long hw_guard_end; /* next value of jiffies > > + when we can issue the > > + next sleep in/out command */ > > + unsigned long hw_guard_wait; /* max guard time in jiffies */ > > + > > + struct omapfb_device *fbdev; > > + struct spi_device *spi; > > + struct mutex mutex; > > + struct lcd_panel panel; > > How does it differ from fbdev->panel? Is it duplicated field? fbdev->panel is a pointer to this device instance specific data. It's embedded here so that we can get to struct mipid_device with the container_of macro when fbdev->panel is passed to us. > > I am sorry but I had not enough time to review the rest. Thanks for the review, if there is nothing else I can post a new version with the above changes. --Imre |
From: Imre D. <imr...@no...> - 2009-06-10 14:50:04
|
Fixed-by: Mike Wege <ext...@no...> Fixed-by: Arnaud Patard <arn...@rt...> Fixed-by: Timo Savola <ts...@mo...> Fixed-by: Hiroshi DOYU <Hir...@no...> Fixed-by: Trilok Soni <son...@gm...> Signed-off-by: Imre Deak <imr...@so...> Signed-off-by: Juha Yrjola <juh...@so...> --- arch/arm/plat-omap/include/mach/lcd_mipid.h | 5 + drivers/video/omap/Kconfig | 8 + drivers/video/omap/Makefile | 1 + drivers/video/omap/lcd_mipid.c | 625 +++++++++++++++++++++++++++ 4 files changed, 639 insertions(+), 0 deletions(-) create mode 100644 drivers/video/omap/lcd_mipid.c diff --git a/arch/arm/plat-omap/include/mach/lcd_mipid.h b/arch/arm/plat-omap/include/mach/lcd_mipid.h index f8fbc48..8e52c65 100644 --- a/arch/arm/plat-omap/include/mach/lcd_mipid.h +++ b/arch/arm/plat-omap/include/mach/lcd_mipid.h @@ -16,7 +16,12 @@ enum mipid_test_result { struct mipid_platform_data { int nreset_gpio; int data_lines; + void (*shutdown)(struct mipid_platform_data *pdata); + void (*set_bklight_level)(struct mipid_platform_data *pdata, + int level); + int (*get_bklight_level)(struct mipid_platform_data *pdata); + int (*get_bklight_max)(struct mipid_platform_data *pdata); }; #endif diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig index 4440885..574453f 100644 --- a/drivers/video/omap/Kconfig +++ b/drivers/video/omap/Kconfig @@ -7,6 +7,14 @@ config FB_OMAP help Frame buffer driver for OMAP based boards. +config FB_OMAP_LCD_MIPID + bool "MIPI DBI-C/DCS compatible LCD support" + depends on FB_OMAP && SPI_MASTER + help + Say Y here if you want to have support for LCDs compatible with + the Mobile Industry Processor Interface DBI-C/DCS + specification. (Supported LCDs: Philips LPH8923, Sharp LS041Y3) + config FB_OMAP_BOOTLOADER_INIT bool "Check bootloader initialization" depends on FB_OMAP diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index d053498..d86d54a 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile @@ -25,6 +25,7 @@ objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o +objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o omapfb-objs := $(objs-yy) diff --git a/drivers/video/omap/lcd_mipid.c b/drivers/video/omap/lcd_mipid.c new file mode 100644 index 0000000..918ee89 --- /dev/null +++ b/drivers/video/omap/lcd_mipid.c @@ -0,0 +1,625 @@ +/* + * LCD driver for MIPI DBI-C / DCS compatible LCDs + * + * Copyright (C) 2006 Nokia Corporation + * Author: Imre Deak <imr...@no...> + * + * 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/device.h> +#include <linux/delay.h> +#include <linux/workqueue.h> +#include <linux/spi/spi.h> + +#include <mach/omapfb.h> +#include <mach/lcd_mipid.h> + +#define MIPID_MODULE_NAME "lcd_mipid" + +#define MIPID_CMD_READ_DISP_ID 0x04 +#define MIPID_CMD_READ_RED 0x06 +#define MIPID_CMD_READ_GREEN 0x07 +#define MIPID_CMD_READ_BLUE 0x08 +#define MIPID_CMD_READ_DISP_STATUS 0x09 +#define MIPID_CMD_RDDSDR 0x0F +#define MIPID_CMD_SLEEP_IN 0x10 +#define MIPID_CMD_SLEEP_OUT 0x11 +#define MIPID_CMD_DISP_OFF 0x28 +#define MIPID_CMD_DISP_ON 0x29 + +#define MIPID_ESD_CHECK_PERIOD msecs_to_jiffies(5000) + +#define to_mipid_device(p) container_of(p, struct mipid_device, \ + panel) +struct mipid_device { + int enabled; + int revision; + unsigned int saved_bklight_level; + unsigned long hw_guard_end; /* next value of jiffies + when we can issue the + next sleep in/out command */ + unsigned long hw_guard_wait; /* max guard time in jiffies */ + + struct omapfb_device *fbdev; + struct spi_device *spi; + struct mutex mutex; + struct lcd_panel panel; + + struct workqueue_struct *esd_wq; + struct delayed_work esd_work; + void (*esd_check)(struct mipid_device *m); +}; + +static void mipid_transfer(struct mipid_device *md, int cmd, const u8 *wbuf, + int wlen, u8 *rbuf, int rlen) +{ + struct spi_message m; + struct spi_transfer *x, xfer[4]; + u16 w; + int r; + + BUG_ON(md->spi == NULL); + + spi_message_init(&m); + + memset(xfer, 0, sizeof(xfer)); + x = &xfer[0]; + + cmd &= 0xff; + x->tx_buf = &cmd; + x->bits_per_word = 9; + x->len = 2; + spi_message_add_tail(x, &m); + + if (wlen) { + x++; + x->tx_buf = wbuf; + x->len = wlen; + x->bits_per_word = 9; + spi_message_add_tail(x, &m); + } + + if (rlen) { + x++; + x->rx_buf = &w; + x->len = 1; + spi_message_add_tail(x, &m); + + if (rlen > 1) { + /* Arrange for the extra clock before the first + * data bit. + */ + x->bits_per_word = 9; + x->len = 2; + + x++; + x->rx_buf = &rbuf[1]; + x->len = rlen - 1; + spi_message_add_tail(x, &m); + } + } + + r = spi_sync(md->spi, &m); + if (r < 0) + dev_dbg(&md->spi->dev, "spi_sync %d\n", r); + + if (rlen) + rbuf[0] = w & 0xff; +} + +static inline void mipid_cmd(struct mipid_device *md, int cmd) +{ + mipid_transfer(md, cmd, NULL, 0, NULL, 0); +} + +static inline void mipid_write(struct mipid_device *md, + int reg, const u8 *buf, int len) +{ + mipid_transfer(md, reg, buf, len, NULL, 0); +} + +static inline void mipid_read(struct mipid_device *md, + int reg, u8 *buf, int len) +{ + mipid_transfer(md, reg, NULL, 0, buf, len); +} + +static void set_data_lines(struct mipid_device *md, int data_lines) +{ + u16 par; + + switch (data_lines) { + case 16: + par = 0x150; + break; + case 18: + par = 0x160; + break; + case 24: + par = 0x170; + break; + } + mipid_write(md, 0x3a, (u8 *)&par, 2); +} + +static void send_init_string(struct mipid_device *md) +{ + u16 initpar[] = { 0x0102, 0x0100, 0x0100 }; + + mipid_write(md, 0xc2, (u8 *)initpar, sizeof(initpar)); + set_data_lines(md, md->panel.data_lines); +} + +static void hw_guard_start(struct mipid_device *md, int guard_msec) +{ + md->hw_guard_wait = msecs_to_jiffies(guard_msec); + md->hw_guard_end = jiffies + md->hw_guard_wait; +} + +static void hw_guard_wait(struct mipid_device *md) +{ + unsigned long wait = md->hw_guard_end - jiffies; + + if ((long)wait > 0 && wait <= md->hw_guard_wait) { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(wait); + } +} + +static void set_sleep_mode(struct mipid_device *md, int on) +{ + int cmd, sleep_time = 50; + + if (on) + cmd = MIPID_CMD_SLEEP_IN; + else + cmd = MIPID_CMD_SLEEP_OUT; + hw_guard_wait(md); + mipid_cmd(md, cmd); + hw_guard_start(md, 120); + /* + * When we enable the panel, it seems we _have_ to sleep + * 120 ms before sending the init string. When disabling the + * panel we'll sleep for the duration of 2 frames, so that the + * controller can still provide the PCLK,HS,VS signals. + */ + if (!on) + sleep_time = 120; + msleep(sleep_time); +} + +static void set_display_state(struct mipid_device *md, int enabled) +{ + int cmd = enabled ? MIPID_CMD_DISP_ON : MIPID_CMD_DISP_OFF; + + mipid_cmd(md, cmd); +} + +static int mipid_set_bklight_level(struct lcd_panel *panel, unsigned int level) +{ + struct mipid_device *md = to_mipid_device(panel); + struct mipid_platform_data *pd = md->spi->dev.platform_data; + + if (pd->get_bklight_max == NULL || pd->set_bklight_level == NULL) + return -ENODEV; + if (level > pd->get_bklight_max(pd)) + return -EINVAL; + if (!md->enabled) { + md->saved_bklight_level = level; + return 0; + } + pd->set_bklight_level(pd, level); + + return 0; +} + +static unsigned int mipid_get_bklight_level(struct lcd_panel *panel) +{ + struct mipid_device *md = to_mipid_device(panel); + struct mipid_platform_data *pd = md->spi->dev.platform_data; + + if (pd->get_bklight_level == NULL) + return -ENODEV; + return pd->get_bklight_level(pd); +} + +static unsigned int mipid_get_bklight_max(struct lcd_panel *panel) +{ + struct mipid_device *md = to_mipid_device(panel); + struct mipid_platform_data *pd = md->spi->dev.platform_data; + + if (pd->get_bklight_max == NULL) + return -ENODEV; + + return pd->get_bklight_max(pd); +} + +static unsigned long mipid_get_caps(struct lcd_panel *panel) +{ + return OMAPFB_CAPS_SET_BACKLIGHT; +} + +static u16 read_first_pixel(struct mipid_device *md) +{ + u16 pixel; + u8 red, green, blue; + + mutex_lock(&md->mutex); + mipid_read(md, MIPID_CMD_READ_RED, &red, 1); + mipid_read(md, MIPID_CMD_READ_GREEN, &green, 1); + mipid_read(md, MIPID_CMD_READ_BLUE, &blue, 1); + mutex_unlock(&md->mutex); + + switch (md->panel.data_lines) { + case 16: + pixel = ((red >> 1) << 11) | (green << 5) | (blue >> 1); + break; + case 24: + /* 24 bit -> 16 bit */ + pixel = ((red >> 3) << 11) | ((green >> 2) << 5) | + (blue >> 3); + break; + default: + pixel = 0; + BUG(); + } + + return pixel; +} + +static int mipid_run_test(struct lcd_panel *panel, int test_num) +{ + struct mipid_device *md = to_mipid_device(panel); + static const u16 test_values[4] = { + 0x0000, 0xffff, 0xaaaa, 0x5555, + }; + int i; + + if (test_num != MIPID_TEST_RGB_LINES) + return MIPID_TEST_INVALID; + + for (i = 0; i < ARRAY_SIZE(test_values); i++) { + int delay; + unsigned long tmo; + + omapfb_write_first_pixel(md->fbdev, test_values[i]); + tmo = jiffies + msecs_to_jiffies(100); + delay = 25; + while (1) { + u16 pixel; + + msleep(delay); + pixel = read_first_pixel(md); + if (pixel == test_values[i]) + break; + if (time_after(jiffies, tmo)) { + dev_err(&md->spi->dev, + "MIPI LCD RGB I/F test failed: " + "expecting %04x, got %04x\n", + test_values[i], pixel); + return MIPID_TEST_FAILED; + } + delay = 10; + } + } + + return 0; +} + +static void ls041y3_esd_recover(struct mipid_device *md) +{ + dev_err(&md->spi->dev, "performing LCD ESD recovery\n"); + set_sleep_mode(md, 1); + set_sleep_mode(md, 0); +} + +static void ls041y3_esd_check_mode1(struct mipid_device *md) +{ + u8 state1, state2; + + mipid_read(md, MIPID_CMD_RDDSDR, &state1, 1); + set_sleep_mode(md, 0); + mipid_read(md, MIPID_CMD_RDDSDR, &state2, 1); + dev_dbg(&md->spi->dev, "ESD mode 1 state1 %02x state2 %02x\n", + state1, state2); + /* Each sleep out command will trigger a self diagnostic and flip + * Bit6 if the test passes. + */ + if (!((state1 ^ state2) & (1 << 6))) + ls041y3_esd_recover(md); +} + +static void ls041y3_esd_check_mode2(struct mipid_device *md) +{ + int i; + u8 rbuf[2]; + static const struct { + int cmd; + int wlen; + u16 wbuf[3]; + } *rd, rd_ctrl[7] = { + { 0xb0, 4, { 0x0101, 0x01fe, } }, + { 0xb1, 4, { 0x01de, 0x0121, } }, + { 0xc2, 4, { 0x0100, 0x0100, } }, + { 0xbd, 2, { 0x0100, } }, + { 0xc2, 4, { 0x01fc, 0x0103, } }, + { 0xb4, 0, }, + { 0x00, 0, }, + }; + + rd = rd_ctrl; + for (i = 0; i < 3; i++, rd++) + mipid_write(md, rd->cmd, (u8 *)rd->wbuf, rd->wlen); + + udelay(10); + mipid_read(md, rd->cmd, rbuf, 2); + rd++; + + for (i = 0; i < 3; i++, rd++) { + udelay(10); + mipid_write(md, rd->cmd, (u8 *)rd->wbuf, rd->wlen); + } + + dev_dbg(&md->spi->dev, "ESD mode 2 state %02x\n", rbuf[1]); + if (rbuf[1] == 0x00) + ls041y3_esd_recover(md); +} + +static void ls041y3_esd_check(struct mipid_device *md) +{ + ls041y3_esd_check_mode1(md); + if (md->revision >= 0x88) + ls041y3_esd_check_mode2(md); +} + +static void mipid_esd_start_check(struct mipid_device *md) +{ + if (md->esd_check != NULL) + queue_delayed_work(md->esd_wq, &md->esd_work, + MIPID_ESD_CHECK_PERIOD); +} + +static void mipid_esd_stop_check(struct mipid_device *md) +{ + if (md->esd_check != NULL) + cancel_rearming_delayed_workqueue(md->esd_wq, &md->esd_work); +} + +static void mipid_esd_work(struct work_struct *work) +{ + struct mipid_device *md = container_of(work, struct mipid_device, + esd_work.work); + + mutex_lock(&md->mutex); + md->esd_check(md); + mutex_unlock(&md->mutex); + mipid_esd_start_check(md); +} + +static int mipid_enable(struct lcd_panel *panel) +{ + struct mipid_device *md = to_mipid_device(panel); + + mutex_lock(&md->mutex); + + if (md->enabled) { + mutex_unlock(&md->mutex); + return 0; + } + set_sleep_mode(md, 0); + md->enabled = 1; + send_init_string(md); + set_display_state(md, 1); + mipid_set_bklight_level(panel, md->saved_bklight_level); + mipid_esd_start_check(md); + + mutex_unlock(&md->mutex); + return 0; +} + +static void mipid_disable(struct lcd_panel *panel) +{ + struct mipid_device *md = to_mipid_device(panel); + + /* + * A final ESD work might be called before returning, + * so do this without holding the lock. + */ + mipid_esd_stop_check(md); + mutex_lock(&md->mutex); + + if (!md->enabled) { + mutex_unlock(&md->mutex); + return; + } + md->saved_bklight_level = mipid_get_bklight_level(panel); + mipid_set_bklight_level(panel, 0); + set_display_state(md, 0); + set_sleep_mode(md, 1); + md->enabled = 0; + + mutex_unlock(&md->mutex); +} + +static int panel_enabled(struct mipid_device *md) +{ + u32 disp_status; + int enabled; + + mipid_read(md, MIPID_CMD_READ_DISP_STATUS, (u8 *)&disp_status, 4); + disp_status = __be32_to_cpu(disp_status); + enabled = (disp_status & (1 << 17)) && (disp_status & (1 << 10)); + dev_dbg(&md->spi->dev, + "LCD panel %senabled by bootloader (status 0x%04x)\n", + enabled ? "" : "not ", disp_status); + return enabled; +} + +static int mipid_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + struct mipid_device *md = to_mipid_device(panel); + + md->fbdev = fbdev; + md->esd_wq = create_singlethread_workqueue("mipid_esd"); + if (md->esd_wq == NULL) { + dev_err(&md->spi->dev, "can't create ESD workqueue\n"); + return -ENOMEM; + } + INIT_DELAYED_WORK(&md->esd_work, mipid_esd_work); + mutex_init(&md->mutex); + + md->enabled = panel_enabled(md); + + if (md->enabled) + mipid_esd_start_check(md); + else + md->saved_bklight_level = mipid_get_bklight_level(panel); + + return 0; +} + +static void mipid_cleanup(struct lcd_panel *panel) +{ + struct mipid_device *md = to_mipid_device(panel); + + if (md->enabled) + mipid_esd_stop_check(md); + destroy_workqueue(md->esd_wq); +} + +static struct lcd_panel mipid_panel = { + .config = OMAP_LCDC_PANEL_TFT, + + .bpp = 16, + .x_res = 800, + .y_res = 480, + .pixel_clock = 21940, + .hsw = 50, + .hfp = 20, + .hbp = 15, + .vsw = 2, + .vfp = 1, + .vbp = 3, + + .init = mipid_init, + .cleanup = mipid_cleanup, + .enable = mipid_enable, + .disable = mipid_disable, + .get_caps = mipid_get_caps, + .set_bklight_level = mipid_set_bklight_level, + .get_bklight_level = mipid_get_bklight_level, + .get_bklight_max = mipid_get_bklight_max, + .run_test = mipid_run_test, +}; + +static int mipid_detect(struct mipid_device *md) +{ + struct mipid_platform_data *pdata; + u8 display_id[3]; + + pdata = md->spi->dev.platform_data; + if (pdata == NULL) { + dev_err(&md->spi->dev, "missing platform data\n"); + return -ENOENT; + } + + mipid_read(md, MIPID_CMD_READ_DISP_ID, display_id, 3); + dev_dbg(&md->spi->dev, "MIPI display ID: %02x%02x%02x\n", + display_id[0], display_id[1], display_id[2]); + + switch (display_id[0]) { + case 0x45: + md->panel.name = "lph8923"; + break; + case 0x83: + md->panel.name = "ls041y3"; + md->esd_check = ls041y3_esd_check; + break; + default: + md->panel.name = "unknown"; + dev_err(&md->spi->dev, "invalid display ID\n"); + return -ENODEV; + } + + md->revision = display_id[1]; + md->panel.data_lines = pdata->data_lines; + pr_info("omapfb: %s rev %02x LCD detected, %d data lines\n", + md->panel.name, md->revision, md->panel.data_lines); + + return 0; +} + +static int mipid_spi_probe(struct spi_device *spi) +{ + struct mipid_device *md; + int r; + + md = kzalloc(sizeof(*md), GFP_KERNEL); + if (md == NULL) { + dev_err(&spi->dev, "out of memory\n"); + return -ENOMEM; + } + + spi->mode = SPI_MODE_0; + md->spi = spi; + dev_set_drvdata(&spi->dev, md); + md->panel = mipid_panel; + + r = mipid_detect(md); + if (r < 0) + return r; + + omapfb_register_panel(&md->panel); + + return 0; +} + +static int mipid_spi_remove(struct spi_device *spi) +{ + struct mipid_device *md = dev_get_drvdata(&spi->dev); + + mipid_disable(&md->panel); + kfree(md); + + return 0; +} + +static struct spi_driver mipid_spi_driver = { + .driver = { + .name = MIPID_MODULE_NAME, + .bus = &spi_bus_type, + .owner = THIS_MODULE, + }, + .probe = mipid_spi_probe, + .remove = __devexit_p(mipid_spi_remove), +}; + +static int mipid_drv_init(void) +{ + spi_register_driver(&mipid_spi_driver); + + return 0; +} +module_init(mipid_drv_init); + +static void mipid_drv_cleanup(void) +{ + spi_unregister_driver(&mipid_spi_driver); +} +module_exit(mipid_drv_cleanup); + +MODULE_DESCRIPTION("MIPI display driver"); +MODULE_LICENSE("GPL"); -- 1.6.3.2 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:42:14
|
On Tue, 9 Jun 2009 14:15:22 +0300 Imre Deak <imr...@no...> wrote: > Hi, > > On Mon, Jun 08, 2009 at 12:43:24AM +0200, ext Krzysztof Helt wrote: > > On Thu, 4 Jun 2009 20:52:27 +0300 > > Imre Deak <imr...@no...> wrote: > >[...] > > > + > > > +#define to_mipid_device(p) container_of(p, struct mipid_device, \ > > > + panel) > > > +struct mipid_device { > > > + int enabled; > > > + int model; > > > > This one is only set and never read. A name is probably enough. > > Ok, I'll remove model. > > > > > > + int revision; > > > + u8 display_id[3]; > > > > This one should be a local variable. > > Ok, I'll move it to the func where it's used. > > > > > > + unsigned int saved_bklight_level; > > > + unsigned long hw_guard_end; /* next value of jiffies > > > + when we can issue the > > > + next sleep in/out command */ > > > + unsigned long hw_guard_wait; /* max guard time in jiffies */ > > > + > > > + struct omapfb_device *fbdev; > > > + struct spi_device *spi; > > > + struct mutex mutex; > > > + struct lcd_panel panel; > > > > How does it differ from fbdev->panel? Is it duplicated field? > > fbdev->panel is a pointer to this device instance specific data. It's embedded here > so that we can get to struct mipid_device with the container_of macro when fbdev->panel > is passed to us. > > > > > I am sorry but I had not enough time to review the rest. > > Thanks for the review, if there is nothing else I can post a new version with the > above changes. > Please post the series after I review your last patch. It should not take longer than two days. Regards, Krzysztof ---------------------------------------------------------------------- Przekaz dalej wiadomosc: Zawsze warto oszczedzac. Teraz 5,5%! Sprawdz > http://link.interia.pl/f21b1 |
From: Janusz K. <jkr...@ti...> - 2009-06-05 10:39:59
|
Thursday 04 June 2009 19:52:29 Imre Deak napisał(a): > From: Jonathan McDowell <no...@ea...> > > This is an updated version of the LCD driver for the Amstrad Delta to > take into account the recent changes to the omapfb infrastructure. The > Delta features a 480x320 12 bit DSTN panel. Hi, I'd really love to see the lcd_ams_delta support included in the mainline kernel, but I am not sure if it is ready for submission, as I still have issues with it. It does work perfectly unless power management is turned on. With CONFIG_PM=y, the omapfb device, after initially starting correctly, breaks with the following error messages: omapfb omapfb: resetting (status 0xffffff96,reset count 1) ... omapfb omapfb: resetting (status 0xffffff96,reset count 100) omapfb omapfb: too many reset attempts, giving up. Tested with linux-2.6.30-rc5 and linux-omap revision 90e758af52ba803cba233fabee81176d99589f09. Error messages do not appear when CONFIG_PM=n or lcd_ams_delta.o is removed from omapfb-objs. Please let me know what else I can do to help in resolving this issue. Cheers, Janusz > Signed-off-by: Jonathan McDowell <no...@ea...> > Signed-off-by: Tony Lindgren <to...@at...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/Makefile | 1 + > drivers/video/omap/lcd_ams_delta.c | 137 > ++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 0 > deletions(-) > create mode 100644 drivers/video/omap/lcd_ams_delta.c > > diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile > index d86d54a..2bf94ad 100644 > --- a/drivers/video/omap/Makefile > +++ b/drivers/video/omap/Makefile > @@ -15,6 +15,7 @@ objs-$(CONFIG_ARCH_OMAP2)$(CONFIG_FB_OMAP_LCDC_EXTERNAL) > += rfbi.o objs-y$(CONFIG_FB_OMAP_LCDC_HWA742) += hwa742.o > objs-y$(CONFIG_FB_OMAP_LCDC_BLIZZARD) += blizzard.o > > +objs-y$(CONFIG_MACH_AMS_DELTA) += lcd_ams_delta.o > objs-y$(CONFIG_MACH_OMAP_H4) += lcd_h4.o > objs-y$(CONFIG_MACH_OMAP_H3) += lcd_h3.o > objs-y$(CONFIG_MACH_OMAP_PALMTE) += lcd_palmte.o > diff --git a/drivers/video/omap/lcd_ams_delta.c > b/drivers/video/omap/lcd_ams_delta.c new file mode 100644 > index 0000000..1f74399 > --- /dev/null > +++ b/drivers/video/omap/lcd_ams_delta.c > @@ -0,0 +1,137 @@ > +/* > + * Based on drivers/video/omap/lcd_inn1510.c > + * > + * LCD panel support for the Amstrad E3 (Delta) videophone. > + * > + * Copyright (C) 2006 Jonathan McDowell <no...@ea...> > + * > + * 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 <linux/io.h> > +#include <linux/delay.h> > + > +#include <mach/board-ams-delta.h> > +#include <mach/hardware.h> > +#include <mach/omapfb.h> > + > +#define AMS_DELTA_DEFAULT_CONTRAST 112 > + > +static int ams_delta_panel_init(struct lcd_panel *panel, > + struct omapfb_device *fbdev) > +{ > + return 0; > +} > + > +static void ams_delta_panel_cleanup(struct lcd_panel *panel) > +{ > +} > + > +static int ams_delta_panel_enable(struct lcd_panel *panel) > +{ > + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, > + AMS_DELTA_LATCH2_LCD_NDISP); > + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, > + AMS_DELTA_LATCH2_LCD_VBLEN); > + > + omap_writeb(1, OMAP_PWL_CLK_ENABLE); > + omap_writeb(AMS_DELTA_DEFAULT_CONTRAST, OMAP_PWL_ENABLE); > + > + return 0; > +} > + > +static void ams_delta_panel_disable(struct lcd_panel *panel) > +{ > + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 0); > + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, 0); > +} > + > +static unsigned long ams_delta_panel_get_caps(struct lcd_panel *panel) > +{ > + return 0; > +} > + > +static struct lcd_panel ams_delta_panel = { > + .name = "ams-delta", > + .config = 0, > + > + .bpp = 12, > + .data_lines = 16, > + .x_res = 480, > + .y_res = 320, > + .pixel_clock = 4687, > + .hsw = 3, > + .hfp = 1, > + .hbp = 1, > + .vsw = 1, > + .vfp = 0, > + .vbp = 0, > + .pcd = 0, > + .acb = 37, > + > + .init = ams_delta_panel_init, > + .cleanup = ams_delta_panel_cleanup, > + .enable = ams_delta_panel_enable, > + .disable = ams_delta_panel_disable, > + .get_caps = ams_delta_panel_get_caps, > +}; > + > +static int ams_delta_panel_probe(struct platform_device *pdev) > +{ > + omapfb_register_panel(&ams_delta_panel); > + return 0; > +} > + > +static int ams_delta_panel_remove(struct platform_device *pdev) > +{ > + return 0; > +} > + > +static int ams_delta_panel_suspend(struct platform_device *pdev, > + pm_message_t mesg) > +{ > + return 0; > +} > + > +static int ams_delta_panel_resume(struct platform_device *pdev) > +{ > + return 0; > +} > + > +struct platform_driver ams_delta_panel_driver = { > + .probe = ams_delta_panel_probe, > + .remove = ams_delta_panel_remove, > + .suspend = ams_delta_panel_suspend, > + .resume = ams_delta_panel_resume, > + .driver = { > + .name = "lcd_ams_delta", > + .owner = THIS_MODULE, > + }, > +}; > + > +static int ams_delta_panel_drv_init(void) > +{ > + return platform_driver_register(&ams_delta_panel_driver); > +} > + > +static void ams_delta_panel_drv_cleanup(void) > +{ > + platform_driver_unregister(&ams_delta_panel_driver); > +} > + > +module_init(ams_delta_panel_drv_init); > +module_exit(ams_delta_panel_drv_cleanup); |
From: Janusz K. <jkr...@ti...> - 2009-06-05 11:40:42
|
TIS - Janusz Krzysztofik napisał(a): > Thursday 04 June 2009 19:52:29 Imre Deak napisał(a): >> From: Jonathan McDowell <no...@ea...> >> >> This is an updated version of the LCD driver for the Amstrad Delta to >> take into account the recent changes to the omapfb infrastructure. The >> Delta features a 480x320 12 bit DSTN panel. > > Hi, > > I'd really love to see the lcd_ams_delta support included in the mainline > kernel, but I am not sure if it is ready for submission, as I still have > issues with it. It does work perfectly unless power management is turned on. > With CONFIG_PM=y, the omapfb device, after initially starting correctly, > breaks with the following error messages: > > omapfb omapfb: resetting (status 0xffffff96,reset count 1) > ... > omapfb omapfb: resetting (status 0xffffff96,reset count 100) > omapfb omapfb: too many reset attempts, giving up. > > Tested with linux-2.6.30-rc5 and linux-omap revision > 90e758af52ba803cba233fabee81176d99589f09. Error messages do not appear when > CONFIG_PM=n or lcd_ams_delta.o is removed from omapfb-objs. One idea for a temporary workaround: maybe we could just force PM=n in case of MACH_AMS_DELTA && FB_OMAP? PM already depends on !IA64_HP_SIM. Janusz > Please let me know what else I can do to help in resolving this issue. > > Cheers, > Janusz > >> Signed-off-by: Jonathan McDowell <no...@ea...> >> Signed-off-by: Tony Lindgren <to...@at...> >> Signed-off-by: Imre Deak <imr...@no...> >> --- >> drivers/video/omap/Makefile | 1 + >> drivers/video/omap/lcd_ams_delta.c | 137 >> ++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 0 >> deletions(-) >> create mode 100644 drivers/video/omap/lcd_ams_delta.c >> >> diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile >> index d86d54a..2bf94ad 100644 >> --- a/drivers/video/omap/Makefile >> +++ b/drivers/video/omap/Makefile >> @@ -15,6 +15,7 @@ objs-$(CONFIG_ARCH_OMAP2)$(CONFIG_FB_OMAP_LCDC_EXTERNAL) >> += rfbi.o objs-y$(CONFIG_FB_OMAP_LCDC_HWA742) += hwa742.o >> objs-y$(CONFIG_FB_OMAP_LCDC_BLIZZARD) += blizzard.o >> >> +objs-y$(CONFIG_MACH_AMS_DELTA) += lcd_ams_delta.o >> objs-y$(CONFIG_MACH_OMAP_H4) += lcd_h4.o >> objs-y$(CONFIG_MACH_OMAP_H3) += lcd_h3.o >> objs-y$(CONFIG_MACH_OMAP_PALMTE) += lcd_palmte.o >> diff --git a/drivers/video/omap/lcd_ams_delta.c >> b/drivers/video/omap/lcd_ams_delta.c new file mode 100644 >> index 0000000..1f74399 >> --- /dev/null >> +++ b/drivers/video/omap/lcd_ams_delta.c >> @@ -0,0 +1,137 @@ >> +/* >> + * Based on drivers/video/omap/lcd_inn1510.c >> + * >> + * LCD panel support for the Amstrad E3 (Delta) videophone. >> + * >> + * Copyright (C) 2006 Jonathan McDowell <no...@ea...> >> + * >> + * 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 <linux/io.h> >> +#include <linux/delay.h> >> + >> +#include <mach/board-ams-delta.h> >> +#include <mach/hardware.h> >> +#include <mach/omapfb.h> >> + >> +#define AMS_DELTA_DEFAULT_CONTRAST 112 >> + >> +static int ams_delta_panel_init(struct lcd_panel *panel, >> + struct omapfb_device *fbdev) >> +{ >> + return 0; >> +} >> + >> +static void ams_delta_panel_cleanup(struct lcd_panel *panel) >> +{ >> +} >> + >> +static int ams_delta_panel_enable(struct lcd_panel *panel) >> +{ >> + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, >> + AMS_DELTA_LATCH2_LCD_NDISP); >> + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, >> + AMS_DELTA_LATCH2_LCD_VBLEN); >> + >> + omap_writeb(1, OMAP_PWL_CLK_ENABLE); >> + omap_writeb(AMS_DELTA_DEFAULT_CONTRAST, OMAP_PWL_ENABLE); >> + >> + return 0; >> +} >> + >> +static void ams_delta_panel_disable(struct lcd_panel *panel) >> +{ >> + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 0); >> + ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, 0); >> +} >> + >> +static unsigned long ams_delta_panel_get_caps(struct lcd_panel *panel) >> +{ >> + return 0; >> +} >> + >> +static struct lcd_panel ams_delta_panel = { >> + .name = "ams-delta", >> + .config = 0, >> + >> + .bpp = 12, >> + .data_lines = 16, >> + .x_res = 480, >> + .y_res = 320, >> + .pixel_clock = 4687, >> + .hsw = 3, >> + .hfp = 1, >> + .hbp = 1, >> + .vsw = 1, >> + .vfp = 0, >> + .vbp = 0, >> + .pcd = 0, >> + .acb = 37, >> + >> + .init = ams_delta_panel_init, >> + .cleanup = ams_delta_panel_cleanup, >> + .enable = ams_delta_panel_enable, >> + .disable = ams_delta_panel_disable, >> + .get_caps = ams_delta_panel_get_caps, >> +}; >> + >> +static int ams_delta_panel_probe(struct platform_device *pdev) >> +{ >> + omapfb_register_panel(&ams_delta_panel); >> + return 0; >> +} >> + >> +static int ams_delta_panel_remove(struct platform_device *pdev) >> +{ >> + return 0; >> +} >> + >> +static int ams_delta_panel_suspend(struct platform_device *pdev, >> + pm_message_t mesg) >> +{ >> + return 0; >> +} >> + >> +static int ams_delta_panel_resume(struct platform_device *pdev) >> +{ >> + return 0; >> +} >> + >> +struct platform_driver ams_delta_panel_driver = { >> + .probe = ams_delta_panel_probe, >> + .remove = ams_delta_panel_remove, >> + .suspend = ams_delta_panel_suspend, >> + .resume = ams_delta_panel_resume, >> + .driver = { >> + .name = "lcd_ams_delta", >> + .owner = THIS_MODULE, >> + }, >> +}; >> + >> +static int ams_delta_panel_drv_init(void) >> +{ >> + return platform_driver_register(&ams_delta_panel_driver); >> +} >> + >> +static void ams_delta_panel_drv_cleanup(void) >> +{ >> + platform_driver_unregister(&ams_delta_panel_driver); >> +} >> + >> +module_init(ams_delta_panel_drv_init); >> +module_exit(ams_delta_panel_drv_cleanup); > > |
From: Jonathan M. <no...@ea...> - 2009-06-05 16:13:16
|
On Fri, Jun 05, 2009 at 12:38:22PM +0200, Janusz Krzysztofik wrote: > Thursday 04 June 2009 19:52:29 Imre Deak napisał(a): > > From: Jonathan McDowell <no...@ea...> > > > > This is an updated version of the LCD driver for the Amstrad Delta to > > take into account the recent changes to the omapfb infrastructure. The > > Delta features a 480x320 12 bit DSTN panel. > > I'd really love to see the lcd_ams_delta support included in the mainline > kernel, but I am not sure if it is ready for submission, as I still have > issues with it. It does work perfectly unless power management is turned on. > With CONFIG_PM=y, the omapfb device, after initially starting correctly, > breaks with the following error messages: > > omapfb omapfb: resetting (status 0xffffff96,reset count 1) > ... > omapfb omapfb: resetting (status 0xffffff96,reset count 100) > omapfb omapfb: too many reset attempts, giving up. > > Tested with linux-2.6.30-rc5 and linux-omap revision > 90e758af52ba803cba233fabee81176d99589f09. Error messages do not appear when > CONFIG_PM=n or lcd_ams_delta.o is removed from omapfb-objs. > > Please let me know what else I can do to help in resolving this issue. Reporting it was a good start; it's the first I've heard of this issue. Looking at the E3 configs I have lying around it looks like none of them have CONFIG_PM set, so it's possible most people have just been using the defconfig or a minor variation of it. I don't have my E3 convenient at present to investigate however. J. -- 101 things you can't have too much of : 14 - Paperclips. |
From: Imre D. <imr...@no...> - 2009-06-11 12:02:18
|
Hi, the following pull request is for the patchset updated based on your comments: The following changes since commit 07a2039b8eb0af4ff464efd3dfd95de5c02648c6: Linus Torvalds (1): Linux 2.6.30 are available in the git repository at: git://koowaldah.org/people/imre/linux-2.6-fb master Daniel Stone (1): omapfb: dispc: Allow multiple external IRQ handlers Hunyue Yau (1): omapfb: Add support for the 2430SDP LCD Imre Deak (5): omapfb: Add support for MIPI-DCS compatible LCDs N770: Enable LCD MIPI-DCS in Kconfig omapfb: dispc: Various typo fixes omapfb: Add FB manual update option to Kconfig omapfb: HWA742: fix pointer to be const Jonathan McDowell (1): omapfb: Add support for the Amstrad Delta LCD Jouni Hogander (2): omapfb: dispc: Disable iface clocks along with func clocks omapfb: dispc: Enable wake up capability Jouni Högander (1): omapfb: suspend/resume only if FB device is already initialized Kevin Hilman (1): omapfb: Add support for the 3430SDP LCD Koen Kooi (1): omapfb: Add support for the OMAP3 Beagle DVI output Kyungmin Park (1): omapfb: Add support for the Apollon LCD Rodrigo Vivi (1): omapfb: Add support for rotation on the Blizzard LCD ctrl Stanley.Miao (1): omapfb: Add support for the ZOOM MDK LCD Steve Sakoman (2): omapfb: Add support for the OMAP3 EVM LCD omapfb: Add support for the Gumstix Overo LCD arun c (2): omapfb: Add support for the OMAP2EVM LCD omapfb: Fix coding style / remove dead line arch/arm/configs/n770_defconfig | 2 +- arch/arm/configs/omap3_beagle_defconfig | 47 ++- arch/arm/configs/omap_3430sdp_defconfig | 39 ++- arch/arm/configs/omap_ldp_defconfig | 54 +++- arch/arm/plat-omap/include/mach/lcd_mipid.h | 5 + arch/arm/plat-omap/include/mach/omapfb.h | 4 +- drivers/video/omap/Kconfig | 82 +++- drivers/video/omap/Makefile | 12 + drivers/video/omap/blizzard.c | 91 ++++- drivers/video/omap/dispc.c | 130 ++++--- drivers/video/omap/dispc.h | 7 +- drivers/video/omap/hwa742.c | 2 +- drivers/video/omap/lcd_2430sdp.c | 200 +++++++++ drivers/video/omap/lcd_ams_delta.c | 137 ++++++ drivers/video/omap/lcd_apollon.c | 138 ++++++ drivers/video/omap/lcd_ldp.c | 200 +++++++++ drivers/video/omap/lcd_mipid.c | 625 +++++++++++++++++++++++++++ drivers/video/omap/lcd_omap2evm.c | 189 ++++++++ drivers/video/omap/lcd_omap3beagle.c | 133 ++++++ drivers/video/omap/lcd_omap3evm.c | 191 ++++++++ drivers/video/omap/lcd_overo.c | 179 ++++++++ drivers/video/omap/omapfb_main.c | 64 ++- drivers/video/omap/rfbi.c | 7 +- 23 files changed, 2424 insertions(+), 114 deletions(-) create mode 100644 drivers/video/omap/lcd_2430sdp.c create mode 100644 drivers/video/omap/lcd_ams_delta.c create mode 100644 drivers/video/omap/lcd_apollon.c create mode 100644 drivers/video/omap/lcd_ldp.c create mode 100644 drivers/video/omap/lcd_mipid.c create mode 100644 drivers/video/omap/lcd_omap2evm.c create mode 100644 drivers/video/omap/lcd_omap3beagle.c create mode 100644 drivers/video/omap/lcd_omap3evm.c create mode 100644 drivers/video/omap/lcd_overo.c --Imre |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:21:44
|
On Thu, 4 Jun 2009 20:52:30 +0300 Imre Deak <imr...@no...> wrote: > From: Hunyue Yau <hy...@mv...> > > Add glue to control the 2430SDP LCD as a frame buffer device > using the existing dispc.c driver under omapfb. > > Signed-off-by: Hunyue Yau <hy...@mv...> > Signed-off-by: Kevin Hilman <kh...@mv...> > Signed-off-by: Tony Lindgren <to...@at...> > Fixed-by: Kevin Hilman <kh...@mv...> > Fixed-by: Sergio Aguirre <saa...@ti...> > Fixed-by: Francisco Alecrim <fra...@in...> > Fixed-by: Tony Lindgren <to...@at...> > Fixed-by: David Brownell <dbr...@us...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/Makefile | 1 + > drivers/video/omap/lcd_2430sdp.c | 196 ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 197 insertions(+), 0 deletions(-) > create mode 100644 drivers/video/omap/lcd_2430sdp.c > > diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile > index 2bf94ad..7a37b03 100644 > --- a/drivers/video/omap/Makefile > +++ b/drivers/video/omap/Makefile > @@ -26,6 +26,7 @@ objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o > objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o > > objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o > +objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o > objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o > > omapfb-objs := $(objs-yy) diff --git a/drivers/video/omap/lcd_2430sdp.c b/drivers/video/omap/lcd_2430sdp.c new file mode 100644 index 0000000..5bcbb8d --- /dev/null +++ b/drivers/video/omap/lcd_2430sdp.c @@ -0,0 +1,196 @@ +/* + * LCD panel support for the TI 2430SDP board + * + * Copyright (C) 2007 MontaVista + * Author: Hunyue Yau <hy...@mv...> + * + * Derived from drivers/video/omap/lcd-apollon.c + * + * 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 <linux/delay.h> +#include <linux/gpio.h> +#include <linux/i2c/twl4030.h> + +#include <mach/mux.h> +#include <mach/omapfb.h> +#include <asm/mach-types.h> + +#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 +#define SDP2430_LCD_PANEL_ENABLE_GPIO 154 +#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 24 +#define SDP3430_LCD_PANEL_ENABLE_GPIO 28 + +static unsigned backlight_gpio; +static unsigned enable_gpio; + +#define LCD_PANEL_BACKLIGHT_GPIO 91 +#define LCD_PANEL_ENABLE_GPIO 154 +#define LCD_PIXCLOCK_MAX 5400 /* freq 5.4 MHz */ +#define PM_RECEIVER TWL4030_MODULE_PM_RECEIVER +#define ENABLE_VAUX2_DEDICATED 0x09 +#define ENABLE_VAUX2_DEV_GRP 0x20 + + +#define t2_out(c, r, v) twl4030_i2c_write_u8(c, r, v) + + +static int sdp2430_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + if (machine_is_omap_3430sdp()) { + enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO; + backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; + } else { + enable_gpio = SDP2430_LCD_PANEL_ENABLE_GPIO; + backlight_gpio = SDP2430_LCD_PANEL_BACKLIGHT_GPIO; + } The same assingments in both clauses. No if() is required. + + gpio_request(enable_gpio, "LCD enable"); /* LCD panel */ + gpio_request(backlight_gpio, "LCD bl"); /* LCD backlight */ + gpio_direction_output(enable_gpio, 0); + gpio_direction_output(backlight_gpio, 0); + + return 0; +} + +static void sdp2430_panel_cleanup(struct lcd_panel *panel) +{ Should the requested gpios be freed? +} + +static int sdp2430_panel_enable(struct lcd_panel *panel) +{ + u8 ded_val, ded_reg; + u8 grp_val, grp_reg; + + if (machine_is_omap_3430sdp()) { + ded_reg = TWL4030_VAUX3_DEDICATED; + ded_val = ENABLE_VAUX3_DEDICATED; + grp_reg = TWL4030_VAUX3_DEV_GRP; + grp_val = ENABLE_VAUX3_DEV_GRP; + + if (omap_rev() > OMAP3430_REV_ES1_0) { + t2_out(PM_RECEIVER, ENABLE_VPLL2_DEDICATED, + TWL4030_VPLL2_DEDICATED); + t2_out(PM_RECEIVER, ENABLE_VPLL2_DEV_GRP, + TWL4030_VPLL2_DEV_GRP); + } + } else { + ded_reg = TWL4030_VAUX2_DEDICATED; + ded_val = ENABLE_VAUX2_DEDICATED; + grp_reg = TWL4030_VAUX2_DEV_GRP; + grp_val = ENABLE_VAUX2_DEV_GRP; + } Again, please put the same assingments outside the if () clause. + + gpio_set_value(enable_gpio, 1); + gpio_set_value(backlight_gpio, 1); + + if (0 != t2_out(PM_RECEIVER, ded_val, ded_reg)) + return -EIO; + if (0 != t2_out(PM_RECEIVER, grp_val, grp_reg)) + return -EIO; + + return 0; +} + +static void sdp2430_panel_disable(struct lcd_panel *panel) +{ + gpio_set_value(enable_gpio, 0); + gpio_set_value(backlight_gpio, 0); + if (omap_rev() > OMAP3430_REV_ES1_0) { + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEDICATED); + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEV_GRP); + mdelay(4); + } +} Please use msleep() instead of the mdelay(). + +static unsigned long sdp2430_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +struct lcd_panel sdp2430_panel = { + .name = "sdp2430", + .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | + OMAP_LCDC_INV_HSYNC, + + .bpp = 16, + .data_lines = 16, + .x_res = 240, + .y_res = 320, + .hsw = 3, /* hsync_len (4) - 1 */ + .hfp = 3, /* right_margin (4) - 1 */ + .hbp = 39, /* left_margin (40) - 1 */ + .vsw = 1, /* vsync_len (2) - 1 */ + .vfp = 2, /* lower_margin */ + .vbp = 7, /* upper_margin (8) - 1 */ + + .pixel_clock = LCD_PIXCLOCK_MAX, + + .init = sdp2430_panel_init, + .cleanup = sdp2430_panel_cleanup, + .enable = sdp2430_panel_enable, + .disable = sdp2430_panel_disable, + .get_caps = sdp2430_panel_get_caps, +}; + +static int sdp2430_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&sdp2430_panel); + return 0; +} + +static int sdp2430_panel_remove(struct platform_device *pdev) +{ + return 0; +} + +static int sdp2430_panel_suspend(struct platform_device *pdev, + pm_message_t mesg) +{ + return 0; +} + +static int sdp2430_panel_resume(struct platform_device *pdev) +{ + return 0; +} + +struct platform_driver sdp2430_panel_driver = { + .probe = sdp2430_panel_probe, + .remove = sdp2430_panel_remove, + .suspend = sdp2430_panel_suspend, There is small indentation defect before the '='. + .resume = sdp2430_panel_resume, + .driver = { + .name = "sdp2430_lcd", + .owner = THIS_MODULE, + }, +}; + +static int __init sdp2430_panel_drv_init(void) +{ + return platform_driver_register(&sdp2430_panel_driver); +} + +static void __exit sdp2430_panel_drv_exit(void) +{ + platform_driver_unregister(&sdp2430_panel_driver); +} + +module_init(sdp2430_panel_drv_init); +module_exit(sdp2430_panel_drv_exit); -- 1.6.3.1 ---------------------------------------------------------------------- Dobra czy zla wiadomosc? Zawsze warto oszczedzac. Teraz 5,5%. Sprawdz > http://link.interia.pl/f21b0 |
From: Imre D. <imr...@no...> - 2009-06-16 10:49:08
|
On Sun, Jun 14, 2009 at 11:29:06PM +0200, ext Krzysztof Helt wrote: > On Thu, 4 Jun 2009 20:52:30 +0300 > Imre Deak <imr...@no...> wrote: > > > From: Hunyue Yau <hy...@mv...> > > > > Add glue to control the 2430SDP LCD as a frame buffer device > > using the existing dispc.c driver under omapfb. > > > > Signed-off-by: Hunyue Yau <hy...@mv...> > > Signed-off-by: Kevin Hilman <kh...@mv...> > > Signed-off-by: Tony Lindgren <to...@at...> > > Fixed-by: Kevin Hilman <kh...@mv...> > > Fixed-by: Sergio Aguirre <saa...@ti...> > > Fixed-by: Francisco Alecrim <fra...@in...> > > Fixed-by: Tony Lindgren <to...@at...> > > Fixed-by: David Brownell <dbr...@us...> > > Signed-off-by: Imre Deak <imr...@no...> > > --- > > drivers/video/omap/Makefile | 1 + > > drivers/video/omap/lcd_2430sdp.c | 196 ++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 197 insertions(+), 0 deletions(-) > > create mode 100644 drivers/video/omap/lcd_2430sdp.c > > > > diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile > > index 2bf94ad..7a37b03 100644 > > --- a/drivers/video/omap/Makefile > > +++ b/drivers/video/omap/Makefile > > @@ -26,6 +26,7 @@ objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o > > objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o > > > > objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o > > +objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o > > objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o > > > > omapfb-objs := $(objs-yy) > diff --git a/drivers/video/omap/lcd_2430sdp.c b/drivers/video/omap/lcd_2430sdp.c > new file mode 100644 > index 0000000..5bcbb8d > --- /dev/null > +++ b/drivers/video/omap/lcd_2430sdp.c > @@ -0,0 +1,196 @@ > +/* > + * LCD panel support for the TI 2430SDP board > + * > + * Copyright (C) 2007 MontaVista > + * Author: Hunyue Yau <hy...@mv...> > + * > + * Derived from drivers/video/omap/lcd-apollon.c > + * > + * 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 <linux/delay.h> > +#include <linux/gpio.h> > +#include <linux/i2c/twl4030.h> > + > +#include <mach/mux.h> > +#include <mach/omapfb.h> > +#include <asm/mach-types.h> > + > +#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 > +#define SDP2430_LCD_PANEL_ENABLE_GPIO 154 > +#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 24 > +#define SDP3430_LCD_PANEL_ENABLE_GPIO 28 > + > +static unsigned backlight_gpio; > +static unsigned enable_gpio; > + > +#define LCD_PANEL_BACKLIGHT_GPIO 91 > +#define LCD_PANEL_ENABLE_GPIO 154 > +#define LCD_PIXCLOCK_MAX 5400 /* freq 5.4 MHz */ > +#define PM_RECEIVER TWL4030_MODULE_PM_RECEIVER > +#define ENABLE_VAUX2_DEDICATED 0x09 > +#define ENABLE_VAUX2_DEV_GRP 0x20 > + > + > +#define t2_out(c, r, v) twl4030_i2c_write_u8(c, r, v) > + > + > +static int sdp2430_panel_init(struct lcd_panel *panel, > + struct omapfb_device *fbdev) > +{ > + if (machine_is_omap_3430sdp()) { > + enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO; > + backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; > + } else { > + enable_gpio = SDP2430_LCD_PANEL_ENABLE_GPIO; > + backlight_gpio = SDP2430_LCD_PANEL_BACKLIGHT_GPIO; > + } > > The same assingments in both clauses. No if() is required. They are different, SDP3430_* vs. SDP2430_*. > > + > + gpio_request(enable_gpio, "LCD enable"); /* LCD panel */ > + gpio_request(backlight_gpio, "LCD bl"); /* LCD backlight */ > + gpio_direction_output(enable_gpio, 0); > + gpio_direction_output(backlight_gpio, 0); > + > + return 0; > +} > + > +static void sdp2430_panel_cleanup(struct lcd_panel *panel) > +{ > > Should the requested gpios be freed? Yes, agreed. I will follow-up with a patchset that fixes this and similar places in the other panel drivers. > > +} > + > +static int sdp2430_panel_enable(struct lcd_panel *panel) > +{ > + u8 ded_val, ded_reg; > + u8 grp_val, grp_reg; > + > + if (machine_is_omap_3430sdp()) { > + ded_reg = TWL4030_VAUX3_DEDICATED; > + ded_val = ENABLE_VAUX3_DEDICATED; > + grp_reg = TWL4030_VAUX3_DEV_GRP; > + grp_val = ENABLE_VAUX3_DEV_GRP; > + > + if (omap_rev() > OMAP3430_REV_ES1_0) { > + t2_out(PM_RECEIVER, ENABLE_VPLL2_DEDICATED, > + TWL4030_VPLL2_DEDICATED); > + t2_out(PM_RECEIVER, ENABLE_VPLL2_DEV_GRP, > + TWL4030_VPLL2_DEV_GRP); > + } > + } else { > + ded_reg = TWL4030_VAUX2_DEDICATED; > + ded_val = ENABLE_VAUX2_DEDICATED; > + grp_reg = TWL4030_VAUX2_DEV_GRP; > + grp_val = ENABLE_VAUX2_DEV_GRP; > + } > > Again, please put the same assingments outside the if () clause. They are different, VAUX2 vs. VAUX3 . > + > + gpio_set_value(enable_gpio, 1); > + gpio_set_value(backlight_gpio, 1); > + > + if (0 != t2_out(PM_RECEIVER, ded_val, ded_reg)) > + return -EIO; > + if (0 != t2_out(PM_RECEIVER, grp_val, grp_reg)) > + return -EIO; > + > + return 0; > +} > + > +static void sdp2430_panel_disable(struct lcd_panel *panel) > +{ > + gpio_set_value(enable_gpio, 0); > + gpio_set_value(backlight_gpio, 0); > + if (omap_rev() > OMAP3430_REV_ES1_0) { > + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEDICATED); > + t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEV_GRP); > + mdelay(4); > + } > +} > > Please use msleep() instead of the mdelay(). Ok, I'll change this. > > + > +static unsigned long sdp2430_panel_get_caps(struct lcd_panel *panel) > +{ > + return 0; > +} > + > +struct lcd_panel sdp2430_panel = { > + .name = "sdp2430", > + .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | > + OMAP_LCDC_INV_HSYNC, > + > + .bpp = 16, > + .data_lines = 16, > + .x_res = 240, > + .y_res = 320, > + .hsw = 3, /* hsync_len (4) - 1 */ > + .hfp = 3, /* right_margin (4) - 1 */ > + .hbp = 39, /* left_margin (40) - 1 */ > + .vsw = 1, /* vsync_len (2) - 1 */ > + .vfp = 2, /* lower_margin */ > + .vbp = 7, /* upper_margin (8) - 1 */ > + > + .pixel_clock = LCD_PIXCLOCK_MAX, > + > + .init = sdp2430_panel_init, > + .cleanup = sdp2430_panel_cleanup, > + .enable = sdp2430_panel_enable, > + .disable = sdp2430_panel_disable, > + .get_caps = sdp2430_panel_get_caps, > +}; > + > +static int sdp2430_panel_probe(struct platform_device *pdev) > +{ > + omapfb_register_panel(&sdp2430_panel); > + return 0; > +} > + > +static int sdp2430_panel_remove(struct platform_device *pdev) > +{ > + return 0; > +} > + > +static int sdp2430_panel_suspend(struct platform_device *pdev, > + pm_message_t mesg) > +{ > + return 0; > +} > + > +static int sdp2430_panel_resume(struct platform_device *pdev) > +{ > + return 0; > +} > + > +struct platform_driver sdp2430_panel_driver = { > + .probe = sdp2430_panel_probe, > + .remove = sdp2430_panel_remove, > + .suspend = sdp2430_panel_suspend, > > There is small indentation defect before the '='. Fixing it. Thanks, Imre |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:23:48
|
On Thu, 4 Jun 2009 20:52:31 +0300 Imre Deak <imr...@no...> wrote: > From: arun c <aru...@gm...> > > omap2evm LCD supports VGA and QVGA resolution, by default its in VGA mode. > > Signed-off-by: Arun C <aru...@mi...> > Signed-off-by: Tony Lindgren <to...@at...> > Fixed-by: Jarkko Nikula <jar...@gm...> > Fixed-by: David Brownell <dbr...@us...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/Makefile | 1 + > drivers/video/omap/lcd_omap2evm.c | 189 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 190 insertions(+), 0 deletions(-) > create mode 100644 drivers/video/omap/lcd_omap2evm.c > > diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile > index 7a37b03..c2475e3 100644 > --- a/drivers/video/omap/Makefile > +++ b/drivers/video/omap/Makefile > @@ -27,6 +27,7 @@ objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o > > objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o > objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o > +objs-y$(CONFIG_MACH_OMAP2EVM) += lcd_omap2evm.o > objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o > > omapfb-objs := $(objs-yy) diff --git a/drivers/video/omap/lcd_omap2evm.c b/drivers/video/omap/lcd_omap2evm.c new file mode 100644 index 0000000..2fc46c2 --- /dev/null +++ b/drivers/video/omap/lcd_omap2evm.c @@ -0,0 +1,189 @@ +/* + * LCD panel support for the MISTRAL OMAP2EVM board + * + * Author: Arun C <aru...@mi...> + * + * Derived from drivers/video/omap/lcd_omap3evm.c + * Derived from drivers/video/omap/lcd-apollon.c + * + * 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 <linux/gpio.h> +#include <linux/i2c/twl4030.h> + +#include <mach/mux.h> +#include <mach/omapfb.h> +#include <asm/mach-types.h> + +#define LCD_PANEL_ENABLE_GPIO 154 +#define LCD_PANEL_LR 128 +#define LCD_PANEL_UD 129 +#define LCD_PANEL_INI 152 +#define LCD_PANEL_QVGA 148 +#define LCD_PANEL_RESB 153 + +#define LCD_XRES 480 +#define LCD_YRES 640 +#define LCD_PIXCLOCK_MAX 20000 /* in kHz */ You can drop defines used only once. There are no such defines for some other panels in your patches. + +#define TWL_LED_LEDEN 0x00 +#define TWL_PWMA_PWMAON 0x00 +#define TWL_PWMA_PWMAOFF 0x01 + +static unsigned int bklight_level; + +static int omap2evm_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + gpio_request(LCD_PANEL_ENABLE_GPIO, "LCD enable"); + gpio_request(LCD_PANEL_LR, "LCD lr"); + gpio_request(LCD_PANEL_UD, "LCD ud"); + gpio_request(LCD_PANEL_INI, "LCD ini"); + gpio_request(LCD_PANEL_QVGA, "LCD qvga"); + gpio_request(LCD_PANEL_RESB, "LCD resb"); + + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1); + gpio_direction_output(LCD_PANEL_RESB, 1); + gpio_direction_output(LCD_PANEL_INI, 1); + gpio_direction_output(LCD_PANEL_QVGA, 0); + gpio_direction_output(LCD_PANEL_LR, 1); + gpio_direction_output(LCD_PANEL_UD, 1); + + twl4030_i2c_write_u8(TWL4030_MODULE_LED, 0x11, TWL_LED_LEDEN); + twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x01, TWL_PWMA_PWMAON); + twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, 0x02, TWL_PWMA_PWMAOFF); + bklight_level = 100; + + return 0; +} + +static void omap2evm_panel_cleanup(struct lcd_panel *panel) +{ Should the requested gpios be freed? +} + +static int omap2evm_panel_enable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 0); + return 0; +} + +static void omap2evm_panel_disable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 1); +} + +static unsigned long omap2evm_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +static int omap2evm_bklight_setlevel(struct lcd_panel *panel, + unsigned int level) +{ + u8 c; + if ((level >= 0) && (level <= 100)) { + c = (125 * (100 - level)) / 100 + 2; + twl4030_i2c_write_u8(TWL4030_MODULE_PWMA, c, TWL_PWMA_PWMAOFF); + bklight_level = level; + } + return 0; +} + +static unsigned int omap2evm_bklight_getlevel(struct lcd_panel *panel) +{ + return bklight_level; +} + +static unsigned int omap2evm_bklight_getmaxlevel(struct lcd_panel *panel) +{ + return 100; +} + +struct lcd_panel omap2evm_panel = { + .name = "omap2evm", + .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | + OMAP_LCDC_INV_HSYNC, + + .bpp = 16, + .data_lines = 18, + .x_res = LCD_XRES, + .y_res = LCD_YRES, + .hsw = 3, + .hfp = 0, + .hbp = 28, + .vsw = 2, + .vfp = 1, + .vbp = 0, + + .pixel_clock = LCD_PIXCLOCK_MAX, + + .init = omap2evm_panel_init, + .cleanup = omap2evm_panel_cleanup, + .enable = omap2evm_panel_enable, + .disable = omap2evm_panel_disable, + .get_caps = omap2evm_panel_get_caps, + .set_bklight_level = omap2evm_bklight_setlevel, + .get_bklight_level = omap2evm_bklight_getlevel, + .get_bklight_max = omap2evm_bklight_getmaxlevel, +}; + +static int omap2evm_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&omap2evm_panel); + return 0; +} + +static int omap2evm_panel_remove(struct platform_device *pdev) +{ + return 0; +} + +static int omap2evm_panel_suspend(struct platform_device *pdev, + pm_message_t mesg) +{ + return 0; +} + +static int omap2evm_panel_resume(struct platform_device *pdev) +{ + return 0; +} + +struct platform_driver omap2evm_panel_driver = { + .probe = omap2evm_panel_probe, + .remove = omap2evm_panel_remove, + .suspend = omap2evm_panel_suspend, + .resume = omap2evm_panel_resume, + .driver = { + .name = "omap2evm_lcd", + .owner = THIS_MODULE, + }, +}; + +static int __init omap2evm_panel_drv_init(void) +{ + return platform_driver_register(&omap2evm_panel_driver); +} + +static void __exit omap2evm_panel_drv_exit(void) +{ + platform_driver_unregister(&omap2evm_panel_driver); +} + +module_init(omap2evm_panel_drv_init); +module_exit(omap2evm_panel_drv_exit); -- 1.6.3.1 ---------------------------------------------------------------------- Interia.pl w Twojej kieszeni! Kliknij >>>http://link.interia.pl/f21b8 |