From: Imre D. <imr...@no...> - 2009-06-04 17:53:53
|
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. Note that this is about the existing "DSS1" FB driver which will eventually be replaced by Tomi Valkeinen's DSS2 FB driver. Thanks, Imre [PATCH 01/20] omapfb: Add support for the Apollon LCD [PATCH 02/20] omapfb: Add support for MIPI-DCS compatible LCDs [PATCH 03/20] N770: Enable LCD MIPI-DCS in Kconfig [PATCH 04/20] omapfb: Add support for the Amstrad Delta LCD [PATCH 05/20] omapfb: Add support for the 2430SDP LCD [PATCH 06/20] omapfb: Add support for the OMAP2EVM LCD [PATCH 07/20] omapfb: Add support for the 3430SDP LCD [PATCH 08/20] omapfb: Add support for the OMAP3 EVM LCD [PATCH 09/20] omapfb: Add support for the OMAP3 Beagle DVI output [PATCH 10/20] omapfb: Add support for the Gumstix Overo LCD [PATCH 11/20] omapfb: Add support for the ZOOM MDK LCD [PATCH 12/20] omapfb: Add support for rotation on the Blizzard LCD ctrl [PATCH 13/20] omapfb: dispc: Various typo fixes [PATCH 14/20] omapfb: dispc: Disable iface clocks along with func clocks [PATCH 15/20] omapfb: dispc: Enable wake up capability [PATCH 16/20] omapfb: dispc: Allow multiple external IRQ handlers [PATCH 17/20] omapfb: suspend/resume only if FB device is already initialized [PATCH 18/20] omapfb: Fix coding style / remove dead line [PATCH 19/20] omapfb: Add FB manual update option to Kconfig [PATCH 20/20] omapfb: HWA742: fix pointer to be const |
From: Imre D. <imr...@no...> - 2009-06-04 17:54:50
|
From: Kyungmin Park <kyu...@sa...> Signed-off-by: Kyungmin Park <kyu...@sa...> Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/Makefile | 2 + drivers/video/omap/lcd_apollon.c | 138 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 0 deletions(-) create mode 100644 drivers/video/omap/lcd_apollon.c diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index ed13889..d053498 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile @@ -24,5 +24,7 @@ objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1610.o 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 + omapfb-objs := $(objs-yy) diff --git a/drivers/video/omap/lcd_apollon.c b/drivers/video/omap/lcd_apollon.c new file mode 100644 index 0000000..626ae3a --- /dev/null +++ b/drivers/video/omap/lcd_apollon.c @@ -0,0 +1,138 @@ +/* + * LCD panel support for the Samsung OMAP2 Apollon board + * + * Copyright (C) 2005,2006 Samsung Electronics + * Author: Kyungmin Park <kyu...@sa...> + * + * Derived from drivers/video/omap/lcd-h4.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 <mach/gpio.h> +#include <mach/mux.h> +#include <mach/omapfb.h> + +/* #define USE_35INCH_LCD 1 */ + +static int apollon_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + /* configure LCD PWR_EN */ + omap_cfg_reg(M21_242X_GPIO11); + return 0; +} + +static void apollon_panel_cleanup(struct lcd_panel *panel) +{ +} + +static int apollon_panel_enable(struct lcd_panel *panel) +{ + return 0; +} + +static void apollon_panel_disable(struct lcd_panel *panel) +{ +} + +static unsigned long apollon_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +struct lcd_panel apollon_panel = { + .name = "apollon", + .config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | + OMAP_LCDC_INV_HSYNC, + + .bpp = 16, + .data_lines = 18, +#ifdef USE_35INCH_LCD + .x_res = 240, + .y_res = 320, + .hsw = 2, + .hfp = 3, + .hbp = 9, + .vsw = 4, + .vfp = 3, + .vbp = 5, +#else + .x_res = 480, + .y_res = 272, + .hsw = 41, + .hfp = 2, + .hbp = 2, + .vsw = 10, + .vfp = 2, + .vbp = 2, +#endif + .pixel_clock = 6250, + + .init = apollon_panel_init, + .cleanup = apollon_panel_cleanup, + .enable = apollon_panel_enable, + .disable = apollon_panel_disable, + .get_caps = apollon_panel_get_caps, +}; + +static int apollon_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&apollon_panel); + return 0; +} + +static int apollon_panel_remove(struct platform_device *pdev) +{ + return 0; +} + +static int apollon_panel_suspend(struct platform_device *pdev, + pm_message_t mesg) +{ + return 0; +} + +static int apollon_panel_resume(struct platform_device *pdev) +{ + return 0; +} + +struct platform_driver apollon_panel_driver = { + .probe = apollon_panel_probe, + .remove = apollon_panel_remove, + .suspend = apollon_panel_suspend, + .resume = apollon_panel_resume, + .driver = { + .name = "apollon_lcd", + .owner = THIS_MODULE, + }, +}; + +static int __init apollon_panel_drv_init(void) +{ + return platform_driver_register(&apollon_panel_driver); +} + +static void __exit apollon_panel_drv_exit(void) +{ + platform_driver_unregister(&apollon_panel_driver); +} + +module_init(apollon_panel_drv_init); +module_exit(apollon_panel_drv_exit); -- 1.6.3.1 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:14
|
CC: lin...@li... Signed-off-by: Imre Deak <imr...@no...> --- arch/arm/configs/n770_defconfig | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/arch/arm/configs/n770_defconfig b/arch/arm/configs/n770_defconfig index 672f6db..a1657b7 100644 --- a/arch/arm/configs/n770_defconfig +++ b/arch/arm/configs/n770_defconfig @@ -875,7 +875,7 @@ CONFIG_FB_OMAP_LCDC_EXTERNAL=y CONFIG_FB_OMAP_LCDC_HWA742=y # CONFIG_FB_OMAP_LCDC_BLIZZARD is not set CONFIG_FB_OMAP_MANUAL_UPDATE=y -# CONFIG_FB_OMAP_LCD_MIPID is not set +CONFIG_FB_OMAP_LCD_MIPID=y # CONFIG_FB_OMAP_BOOTLOADER_INIT is not set CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2 # CONFIG_FB_OMAP_DMA_TUNE is not set -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:40:38
|
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 > > > ------------------------------------------------------------------- > List admin: http://lists.arm.linux.org.uk/mailman/listinfo/linux-arm-kernel > FAQ: http://www.arm.linux.org.uk/mailinglists/faq.php > Etiquette: http://www.arm.linux.org.uk/mailinglists/etiquette.php > ---------------------------------------------------------------------- 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-16 11:12:14
|
On Sun, Jun 14, 2009 at 11:47:16PM +0200, ext Krzysztof Helt wrote: > On Thu, 4 Jun 2009 20:52:36 +0300 > Imre Deak <imr...@no...> wrote: > [...] > > 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 > > [...] > > +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(). Ok, will fix it and the similar places in the other panel drivers. --Imre |
From: Krzysztof H. <krz...@po...> - 2009-06-07 22:34:18
|
On Thu, 4 Jun 2009 20:52:26 +0300 Imre Deak <imr...@no...> wrote: > From: Kyungmin Park <kyu...@sa...> > > Signed-off-by: Kyungmin Park <kyu...@sa...> > 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:55:38
|
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; + } + + 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) +{ +} + +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; + } + + 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); + } +} + +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, + .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 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:42
|
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; + int revision; + u8 display_id[3]; + 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; + + 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, md->display_id, 3); + dev_dbg(&md->spi->dev, "MIPI display ID: %02x%02x%02x\n", + md->display_id[0], md->display_id[1], md->display_id[2]); + + switch (md->display_id[0]) { + case 0x45: + md->model = MIPID_VER_LPH8923; + md->panel.name = "lph8923"; + break; + case 0x83: + md->model = MIPID_VER_LS041Y3; + 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 = md->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.1 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:43
|
From: Steve Sakoman <st...@sa...> Add LCD support for OMAP3 EVM Backlight support by Arun C <aru...@mi...> Signed-off-by: Steve Sakoman <st...@sa...> Acked-by: Syed Mohammed Khasim <kh...@ti...> 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_omap3evm.c | 191 +++++++++++++++++++++++++++++++++++++ 2 files changed, 192 insertions(+), 0 deletions(-) create mode 100644 drivers/video/omap/lcd_omap3evm.c diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index 96d2d43..4345157 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile @@ -30,6 +30,7 @@ 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_OMAP2EVM) += lcd_omap2evm.o +objs-y$(CONFIG_MACH_OMAP3EVM) += lcd_omap3evm.o objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o omapfb-objs := $(objs-yy) diff --git a/drivers/video/omap/lcd_omap3evm.c b/drivers/video/omap/lcd_omap3evm.c new file mode 100644 index 0000000..1c3d814 --- /dev/null +++ b/drivers/video/omap/lcd_omap3evm.c @@ -0,0 +1,191 @@ +/* + * LCD panel support for the TI OMAP3 EVM board + * + * Author: Steve Sakoman <st...@sa...> + * + * 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 153 +#define LCD_PANEL_LR 2 +#define LCD_PANEL_UD 3 +#define LCD_PANEL_INI 152 +#define LCD_PANEL_QVGA 154 +#define LCD_PANEL_RESB 155 + +#define LCD_XRES 480 +#define LCD_YRES 640 +#define LCD_PIXCLOCK 26000 /* in kHz */ + +#define ENABLE_VDAC_DEDICATED 0x03 +#define ENABLE_VDAC_DEV_GRP 0x20 +#define ENABLE_VPLL2_DEDICATED 0x05 +#define ENABLE_VPLL2_DEV_GRP 0xE0 + +#define TWL_LED_LEDEN 0x00 +#define TWL_PWMA_PWMAON 0x00 +#define TWL_PWMA_PWMAOFF 0x01 + +static unsigned int bklight_level; + +static int omap3evm_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + 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_RESB, "LCD resb"); + gpio_request(LCD_PANEL_QVGA, "LCD qvga"); + + 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 omap3evm_panel_cleanup(struct lcd_panel *panel) +{ +} + +static int omap3evm_panel_enable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 0); + return 0; +} + +static void omap3evm_panel_disable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 1); +} + +static unsigned long omap3evm_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +static int omap3evm_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 omap3evm_bklight_getlevel(struct lcd_panel *panel) +{ + return bklight_level; +} + +static unsigned int omap3evm_bklight_getmaxlevel(struct lcd_panel *panel) +{ + return 100; +} + +struct lcd_panel omap3evm_panel = { + .name = "omap3evm", + .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, + + .init = omap3evm_panel_init, + .cleanup = omap3evm_panel_cleanup, + .enable = omap3evm_panel_enable, + .disable = omap3evm_panel_disable, + .get_caps = omap3evm_panel_get_caps, + .set_bklight_level = omap3evm_bklight_setlevel, + .get_bklight_level = omap3evm_bklight_getlevel, + .get_bklight_max = omap3evm_bklight_getmaxlevel, +}; + +static int omap3evm_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&omap3evm_panel); + return 0; +} + +static int omap3evm_panel_remove(struct platform_device *pdev) +{ + return 0; +} + +static int omap3evm_panel_suspend(struct platform_device *pdev, + pm_message_t mesg) +{ + return 0; +} + +static int omap3evm_panel_resume(struct platform_device *pdev) +{ + return 0; +} + +struct platform_driver omap3evm_panel_driver = { + .probe = omap3evm_panel_probe, + .remove = omap3evm_panel_remove, + .suspend = omap3evm_panel_suspend, + .resume = omap3evm_panel_resume, + .driver = { + .name = "omap3evm_lcd", + .owner = THIS_MODULE, + }, +}; + +static int __init omap3evm_panel_drv_init(void) +{ + return platform_driver_register(&omap3evm_panel_driver); +} + +static void __exit omap3evm_panel_drv_exit(void) +{ + platform_driver_unregister(&omap3evm_panel_driver); +} + +module_init(omap3evm_panel_drv_init); +module_exit(omap3evm_panel_drv_exit); -- 1.6.3.1 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:49
|
From: Kevin Hilman <kh...@mv...> The 3430SDP uses the same panel as the 2430SDP. The main difference are in the GPIO lines used for panel enable and backlight, and the VAUX register/commands sent to the TWL4030 power subsystem. Also, some misc. whitespace cleanups. Signed-off-by: Kevin Hilman <kh...@mv...> Signed-off-by: Tony Lindgren <to...@at...> Fixed-by: Tony Lindgren <to...@at...> CC: lin...@li... Signed-off-by: Imre Deak <imr...@no...> --- arch/arm/configs/omap_3430sdp_defconfig | 39 +++++++++++++++++++++++++++++- drivers/video/omap/Makefile | 2 + drivers/video/omap/lcd_2430sdp.c | 12 ++++++--- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/arch/arm/configs/omap_3430sdp_defconfig b/arch/arm/configs/omap_3430sdp_defconfig index 8fb918d..73e0128 100644 --- a/arch/arm/configs/omap_3430sdp_defconfig +++ b/arch/arm/configs/omap_3430sdp_defconfig @@ -1313,8 +1313,33 @@ CONFIG_DVB_ISL6421=m # Graphics support # # CONFIG_VGASTATE is not set -# CONFIG_VIDEO_OUTPUT_CONTROL is not set -# CONFIG_FB is not set +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC 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 is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_VIRTUAL is not set +CONFIG_FB_OMAP=y +# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set +# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set +CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set # @@ -1331,6 +1356,16 @@ CONFIG_DISPLAY_SUPPORT=y # # 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_SOUND_OSS_CORE=y CONFIG_SND=y diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index c2475e3..96d2d43 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile @@ -8,6 +8,7 @@ objs-yy := omapfb_main.o objs-y$(CONFIG_ARCH_OMAP1) += lcdc.o objs-y$(CONFIG_ARCH_OMAP2) += dispc.o +objs-y$(CONFIG_ARCH_OMAP3) += dispc.o objs-$(CONFIG_ARCH_OMAP1)$(CONFIG_FB_OMAP_LCDC_EXTERNAL) += sossi.o objs-$(CONFIG_ARCH_OMAP2)$(CONFIG_FB_OMAP_LCDC_EXTERNAL) += rfbi.o @@ -27,6 +28,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_OMAP2EVM) += lcd_omap2evm.o objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o diff --git a/drivers/video/omap/lcd_2430sdp.c b/drivers/video/omap/lcd_2430sdp.c index 5bcbb8d..13c822e 100644 --- a/drivers/video/omap/lcd_2430sdp.c +++ b/drivers/video/omap/lcd_2430sdp.c @@ -39,13 +39,17 @@ 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 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) @@ -144,7 +148,7 @@ struct lcd_panel sdp2430_panel = { .init = sdp2430_panel_init, .cleanup = sdp2430_panel_cleanup, - .enable = sdp2430_panel_enable, + .enable = sdp2430_panel_enable, .disable = sdp2430_panel_disable, .get_caps = sdp2430_panel_get_caps, }; @@ -174,7 +178,7 @@ static int sdp2430_panel_resume(struct platform_device *pdev) struct platform_driver sdp2430_panel_driver = { .probe = sdp2430_panel_probe, .remove = sdp2430_panel_remove, - .suspend = sdp2430_panel_suspend, + .suspend = sdp2430_panel_suspend, .resume = sdp2430_panel_resume, .driver = { .name = "sdp2430_lcd", -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:27:05
|
On Thu, 4 Jun 2009 20:52:32 +0300 Imre Deak <imr...@no...> wrote: > From: Kevin Hilman <kh...@mv...> > > The 3430SDP uses the same panel as the 2430SDP. The main difference > are in the GPIO lines used for panel enable and backlight, and the > VAUX register/commands sent to the TWL4030 power subsystem. > > Also, some misc. whitespace cleanups. > > Signed-off-by: Kevin Hilman <kh...@mv...> > Signed-off-by: Tony Lindgren <to...@at...> > Fixed-by: Tony Lindgren <to...@at...> > CC: lin...@li... > Signed-off-by: Imre Deak <imr...@no...> > --- Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Dobra czy zla wiadomosc? Zawsze warto oszczedzac. Teraz 5,5%. Sprawdz > http://link.interia.pl/f21b0 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:51
|
From: Rodrigo Vivi <rod...@op...> The LCD controller (EPSON S1D13744) supports rotation (0, 90, 180 and 270 degrees) on hardware just setting the bits 0 and 1 of 0x28 register (LCD Panel Configuration Register). Now it is possible to use this caps only setting the angle degree on var rotate of fb_var_screeninfo using the FBIOPUT_VSCREENINFO ioctl. Signed-off-by: Rodrigo Vivi <rod...@op...> Signed-off-by: Tony Lindgren <to...@at...> Fixed-by: Siarhei Siamashka <sia...@no...> Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/blizzard.c | 91 +++++++++++++++++++++++++++++++++++-- drivers/video/omap/omapfb_main.c | 52 ++++++++++++++++------ 2 files changed, 124 insertions(+), 19 deletions(-) diff --git a/drivers/video/omap/blizzard.c b/drivers/video/omap/blizzard.c index 9dfcf39..d5e5955 100644 --- a/drivers/video/omap/blizzard.c +++ b/drivers/video/omap/blizzard.c @@ -44,6 +44,7 @@ #define BLIZZARD_CLK_SRC 0x0e #define BLIZZARD_MEM_BANK0_ACTIVATE 0x10 #define BLIZZARD_MEM_BANK0_STATUS 0x14 +#define BLIZZARD_PANEL_CONFIGURATION 0x28 #define BLIZZARD_HDISP 0x2a #define BLIZZARD_HNDP 0x2c #define BLIZZARD_VDISP0 0x2e @@ -162,6 +163,10 @@ struct blizzard_struct { int vid_scaled; int last_color_mode; int zoom_on; + int zoom_area_gx1; + int zoom_area_gx2; + int zoom_area_gy1; + int zoom_area_gy2; int screen_width; int screen_height; unsigned te_connected:1; @@ -513,6 +518,13 @@ static int do_full_screen_update(struct blizzard_request *req) return REQ_PENDING; } +static int check_1d_intersect(int a1, int a2, int b1, int b2) +{ + if (a2 <= b1 || b2 <= a1) + return 0; + return 1; +} + /* Setup all planes with an overlapping area with the update window. */ static int do_partial_update(struct blizzard_request *req, int plane, int x, int y, int w, int h, @@ -525,6 +537,7 @@ static int do_partial_update(struct blizzard_request *req, int plane, int color_mode; int flags; int zoom_off; + int have_zoom_for_this_update = 0; /* Global coordinates, relative to pixel 0,0 of the LCD */ gx1 = x + blizzard.plane[plane].pos_x; @@ -544,10 +557,6 @@ static int do_partial_update(struct blizzard_request *req, int plane, gx2_out = gx1_out + w_out; gy2_out = gy1_out + h_out; } - zoom_off = blizzard.zoom_on && gx1 == 0 && gy1 == 0 && - w == blizzard.screen_width && h == blizzard.screen_height; - blizzard.zoom_on = (!zoom_off && blizzard.zoom_on) || - (w < w_out || h < h_out); for (i = 0; i < OMAPFB_PLANE_NUM; i++) { struct plane_info *p = &blizzard.plane[i]; @@ -653,8 +662,49 @@ static int do_partial_update(struct blizzard_request *req, int plane, else disable_tearsync(); + if ((gx2_out - gx1_out) != (gx2 - gx1) || + (gy2_out - gy1_out) != (gy2 - gy1)) + have_zoom_for_this_update = 1; + + /* 'background' type of screen update (as opposed to 'destructive') + can be used to disable scaling if scaling is active */ + zoom_off = blizzard.zoom_on && !have_zoom_for_this_update && + (gx1_out == 0) && (gx2_out == blizzard.screen_width) && + (gy1_out == 0) && (gy2_out == blizzard.screen_height) && + (gx1 == 0) && (gy1 == 0); + + if (blizzard.zoom_on && !have_zoom_for_this_update && !zoom_off && + check_1d_intersect(blizzard.zoom_area_gx1, blizzard.zoom_area_gx2, + gx1_out, gx2_out) && + check_1d_intersect(blizzard.zoom_area_gy1, blizzard.zoom_area_gy2, + gy1_out, gy2_out)) { + /* Previous screen update was using scaling, current update + * is not using it. Additionally, current screen update is + * going to overlap with the scaled area. Scaling needs to be + * disabled in order to avoid 'magnifying glass' effect. + * Dummy setup of background window can be used for this. + */ + set_window_regs(0, 0, blizzard.screen_width, + blizzard.screen_height, + 0, 0, blizzard.screen_width, + blizzard.screen_height, + BLIZZARD_COLOR_RGB565, 1, flags); + blizzard.zoom_on = 0; + } + + /* remember scaling settings if we have scaled update */ + if (have_zoom_for_this_update) { + blizzard.zoom_on = 1; + blizzard.zoom_area_gx1 = gx1_out; + blizzard.zoom_area_gx2 = gx2_out; + blizzard.zoom_area_gy1 = gy1_out; + blizzard.zoom_area_gy2 = gy2_out; + } + set_window_regs(gx1, gy1, gx2, gy2, gx1_out, gy1_out, gx2_out, gy2_out, color_mode, zoom_off, flags); + if (zoom_off) + blizzard.zoom_on = 0; blizzard.extif->set_bits_per_cycle(16); /* set_window_regs has left the register index at the right @@ -908,6 +958,35 @@ static int blizzard_set_scale(int plane, int orig_w, int orig_h, return 0; } +static int blizzard_set_rotate(int angle) +{ + u32 l; + + l = blizzard_read_reg(BLIZZARD_PANEL_CONFIGURATION); + l &= ~0x03; + + switch (angle) { + case 0: + l = l | 0x00; + break; + case 90: + l = l | 0x03; + break; + case 180: + l = l | 0x02; + break; + case 270: + l = l | 0x01; + break; + default: + return -EINVAL; + } + + blizzard_write_reg(BLIZZARD_PANEL_CONFIGURATION, l); + + return 0; +} + static int blizzard_enable_plane(int plane, int enable) { if (enable) @@ -1285,7 +1364,8 @@ static void blizzard_get_caps(int plane, struct omapfb_caps *caps) caps->ctrl |= OMAPFB_CAPS_MANUAL_UPDATE | OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE | OMAPFB_CAPS_WINDOW_SCALE | - OMAPFB_CAPS_WINDOW_OVERLAY; + OMAPFB_CAPS_WINDOW_OVERLAY | + OMAPFB_CAPS_WINDOW_ROTATE; if (blizzard.te_connected) caps->ctrl |= OMAPFB_CAPS_TEARSYNC; caps->wnd_color |= (1 << OMAPFB_COLOR_RGB565) | @@ -1560,6 +1640,7 @@ struct lcd_ctrl blizzard_ctrl = { .setup_plane = blizzard_setup_plane, .set_scale = blizzard_set_scale, .enable_plane = blizzard_enable_plane, + .set_rotate = blizzard_set_rotate, .update_window = blizzard_update_window_async, .sync = blizzard_sync, .suspend = blizzard_suspend, diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c index 060d72f..5b04b9c 100644 --- a/drivers/video/omap/omapfb_main.c +++ b/drivers/video/omap/omapfb_main.c @@ -67,6 +67,7 @@ static struct caps_table_struct ctrl_caps[] = { { OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE, "pixel double window" }, { OMAPFB_CAPS_WINDOW_SCALE, "scale window" }, { OMAPFB_CAPS_WINDOW_OVERLAY, "overlay window" }, + { OMAPFB_CAPS_WINDOW_ROTATE, "rotate window" }, { OMAPFB_CAPS_SET_BACKLIGHT, "backlight setting" }, }; @@ -215,6 +216,15 @@ static int ctrl_change_mode(struct fb_info *fbi) offset, var->xres_virtual, plane->info.pos_x, plane->info.pos_y, var->xres, var->yres, plane->color_mode); + if (r < 0) + return r; + + if (fbdev->ctrl->set_rotate != NULL) { + r = fbdev->ctrl->set_rotate(var->rotate); + if (r < 0) + return r; + } + if (fbdev->ctrl->set_scale != NULL) r = fbdev->ctrl->set_scale(plane->idx, var->xres, var->yres, @@ -598,7 +608,7 @@ static void omapfb_rotate(struct fb_info *fbi, int rotate) struct omapfb_device *fbdev = plane->fbdev; omapfb_rqueue_lock(fbdev); - if (cpu_is_omap15xx() && rotate != fbi->var.rotate) { + if (rotate != fbi->var.rotate) { struct fb_var_screeninfo *new_var = &fbdev->new_var; memcpy(new_var, &fbi->var, sizeof(*new_var)); @@ -705,28 +715,42 @@ int omapfb_update_window_async(struct fb_info *fbi, void (*callback)(void *), void *callback_data) { + int xres, yres; struct omapfb_plane_struct *plane = fbi->par; struct omapfb_device *fbdev = plane->fbdev; - struct fb_var_screeninfo *var; + struct fb_var_screeninfo *var = &fbi->var; + + switch (var->rotate) { + case 0: + case 180: + xres = fbdev->panel->x_res; + yres = fbdev->panel->y_res; + break; + case 90: + case 270: + xres = fbdev->panel->y_res; + yres = fbdev->panel->x_res; + break; + default: + return -EINVAL; + } - var = &fbi->var; - if (win->x >= var->xres || win->y >= var->yres || - win->out_x > var->xres || win->out_y >= var->yres) + if (win->x >= xres || win->y >= yres || + win->out_x > xres || win->out_y > yres) return -EINVAL; if (!fbdev->ctrl->update_window || fbdev->ctrl->get_update_mode() != OMAPFB_MANUAL_UPDATE) return -ENODEV; - if (win->x + win->width >= var->xres) - win->width = var->xres - win->x; - if (win->y + win->height >= var->yres) - win->height = var->yres - win->y; - /* The out sizes should be cropped to the LCD size */ - if (win->out_x + win->out_width > fbdev->panel->x_res) - win->out_width = fbdev->panel->x_res - win->out_x; - if (win->out_y + win->out_height > fbdev->panel->y_res) - win->out_height = fbdev->panel->y_res - win->out_y; + if (win->x + win->width > xres) + win->width = xres - win->x; + if (win->y + win->height > yres) + win->height = yres - win->y; + if (win->out_x + win->out_width > xres) + win->out_width = xres - win->out_x; + if (win->out_y + win->out_height > yres) + win->out_height = yres - win->out_y; if (!win->width || !win->height || !win->out_width || !win->out_height) return 0; -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:32:15
|
On Thu, 4 Jun 2009 20:52:37 +0300 Imre Deak <imr...@no...> wrote: > From: Rodrigo Vivi <rod...@op...> > > The LCD controller (EPSON S1D13744) supports rotation (0, 90, 180 > and 270 degrees) on hardware just setting the bits 0 and 1 of 0x28 > register (LCD Panel Configuration Register). Now it is possible to > use this caps only setting the angle degree on var rotate of > fb_var_screeninfo using the FBIOPUT_VSCREENINFO ioctl. > > Signed-off-by: Rodrigo Vivi <rod...@op...> > Signed-off-by: Tony Lindgren <to...@at...> > Fixed-by: Siarhei Siamashka <sia...@no...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/blizzard.c | 91 +++++++++++++++++++++++++++++++++++-- > drivers/video/omap/omapfb_main.c | 52 ++++++++++++++++------ > 2 files changed, 124 insertions(+), 19 deletions(-) > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Przekaz dalej wiadomosc: Zawsze warto oszczedzac. Teraz 5,5%! Sprawdz > http://link.interia.pl/f21b1 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:52
|
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 */ + +#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) +{ +} + +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 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:52
|
From: Steve Sakoman <st...@sa...> Signed-off-by: Steve Sakoman <st...@sa...> Signed-off-by: Tony Lindgren <to...@at...> Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/Kconfig | 21 +++++ drivers/video/omap/Makefile | 1 + drivers/video/omap/lcd_overo.c | 179 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 201 insertions(+), 0 deletions(-) create mode 100644 drivers/video/omap/lcd_overo.c diff --git a/drivers/video/omap/Kconfig b/drivers/video/omap/Kconfig index 574453f..eb05e09 100644 --- a/drivers/video/omap/Kconfig +++ b/drivers/video/omap/Kconfig @@ -7,6 +7,27 @@ config FB_OMAP help Frame buffer driver for OMAP based boards. +choice + depends on FB_OMAP && MACH_OVERO + prompt "Screen resolution" + default FB_OMAP_079M3R + help + Selected desired screen resolution + +config FB_OMAP_031M3R + boolean "640 x 480 @ 60 Hz Reduced blanking" + +config FB_OMAP_048M3R + boolean "800 x 600 @ 60 Hz Reduced blanking" + +config FB_OMAP_079M3R + boolean "1024 x 768 @ 60 Hz Reduced blanking" + +config FB_OMAP_092M9R + boolean "1280 x 720 @ 60 Hz Reduced blanking" + +endchoice + config FB_OMAP_LCD_MIPID bool "MIPI DBI-C/DCS compatible LCD support" depends on FB_OMAP && SPI_MASTER diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index 9ff1815..0d2996a 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile @@ -33,6 +33,7 @@ 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 objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o +objs-y$(CONFIG_MACH_OVERO) += lcd_overo.o omapfb-objs := $(objs-yy) diff --git a/drivers/video/omap/lcd_overo.c b/drivers/video/omap/lcd_overo.c new file mode 100644 index 0000000..2bc5c92 --- /dev/null +++ b/drivers/video/omap/lcd_overo.c @@ -0,0 +1,179 @@ +/* + * LCD panel support for the Gumstix Overo + * + * Author: Steve Sakoman <st...@sa...> + * + * 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/i2c/twl4030.h> + +#include <mach/gpio.h> +#include <mach/mux.h> +#include <mach/omapfb.h> +#include <asm/mach-types.h> + +#define LCD_ENABLE 144 + +static int overo_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + if ((gpio_request(LCD_ENABLE, "LCD_ENABLE") == 0) && + (gpio_direction_output(LCD_ENABLE, 1) == 0)) + gpio_export(LCD_ENABLE, 0); + else + printk(KERN_ERR "could not obtain gpio for LCD_ENABLE\n"); + + return 0; +} + +static void overo_panel_cleanup(struct lcd_panel *panel) +{ + gpio_free(LCD_ENABLE); +} + +static int overo_panel_enable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_ENABLE, 1); + return 0; +} + +static void overo_panel_disable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_ENABLE, 0); +} + +static unsigned long overo_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +struct lcd_panel overo_panel = { + .name = "overo", + .config = OMAP_LCDC_PANEL_TFT, + .bpp = 16, + .data_lines = 24, + +#if defined CONFIG_FB_OMAP_031M3R + + /* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */ + .x_res = 640, + .y_res = 480, + .hfp = 48, + .hsw = 32, + .hbp = 80, + .vfp = 3, + .vsw = 4, + .vbp = 7, + .pixel_clock = 23500, + +#elif defined CONFIG_FB_OMAP_048M3R + + /* 800 x 600 @ 60 Hz Reduced blanking VESA CVT 0.48M3-R */ + .x_res = 800, + .y_res = 600, + .hfp = 48, + .hsw = 32, + .hbp = 80, + .vfp = 3, + .vsw = 4, + .vbp = 11, + .pixel_clock = 35500, + +#elif defined CONFIG_FB_OMAP_079M3R + + /* 1024 x 768 @ 60 Hz Reduced blanking VESA CVT 0.79M3-R */ + .x_res = 1024, + .y_res = 768, + .hfp = 48, + .hsw = 32, + .hbp = 80, + .vfp = 3, + .vsw = 4, + .vbp = 15, + .pixel_clock = 56000, + +#elif defined CONFIG_FB_OMAP_092M9R + + /* 1280 x 720 @ 60 Hz Reduced blanking VESA CVT 0.92M9-R */ + .x_res = 1280, + .y_res = 720, + .hfp = 48, + .hsw = 32, + .hbp = 80, + .vfp = 3, + .vsw = 5, + .vbp = 13, + .pixel_clock = 64000, + +#else + + /* use 640 x 480 if no config option */ + /* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */ + .x_res = 640, + .y_res = 480, + .hfp = 48, + .hsw = 32, + .hbp = 80, + .vfp = 3, + .vsw = 4, + .vbp = 7, + .pixel_clock = 23500, + +#endif + + .init = overo_panel_init, + .cleanup = overo_panel_cleanup, + .enable = overo_panel_enable, + .disable = overo_panel_disable, + .get_caps = overo_panel_get_caps, +}; + +static int overo_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&overo_panel); + return 0; +} + +static int overo_panel_remove(struct platform_device *pdev) +{ + /* omapfb does not have unregister_panel */ + return 0; +} + +static struct platform_driver overo_panel_driver = { + .probe = overo_panel_probe, + .remove = overo_panel_remove, + .driver = { + .name = "overo_lcd", + .owner = THIS_MODULE, + }, +}; + +static int __init overo_panel_drv_init(void) +{ + return platform_driver_register(&overo_panel_driver); +} + +static void __exit overo_panel_drv_exit(void) +{ + platform_driver_unregister(&overo_panel_driver); +} + +module_init(overo_panel_drv_init); +module_exit(overo_panel_drv_exit); -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:28:36
|
On Thu, 4 Jun 2009 20:52:35 +0300 Imre Deak <imr...@no...> wrote: > From: Steve Sakoman <st...@sa...> > > Signed-off-by: Steve Sakoman <st...@sa...> > Signed-off-by: Tony Lindgren <to...@at...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/Kconfig | 21 +++++ > drivers/video/omap/Makefile | 1 + > drivers/video/omap/lcd_overo.c | 179 ++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 201 insertions(+), 0 deletions(-) > create mode 100644 drivers/video/omap/lcd_overo.c > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- 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:55:52
|
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. 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); -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:20:58
|
On Thu, 4 Jun 2009 20:52:29 +0300 Imre Deak <imr...@no...> wrote: > 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. > > Signed-off-by: Jonathan McDowell <no...@ea...> > 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:55:56
|
From: Jouni Hogander <jou...@no...> Leaving interface clocks enabled causes dss pwrdm to stay in active state when mpu is in active state. This fix puts dss to sleep state when it is not needed. Earlier version broke framebuffer on 24xx. This is fixed by enabling clocks before trying to access DISPC_IRQSTATUS register. 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 | 23 ++++++++++------------- 1 files changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c index 2db8fbb..cc3c817 100644 --- a/drivers/video/omap/dispc.c +++ b/drivers/video/omap/dispc.c @@ -858,8 +858,11 @@ EXPORT_SYMBOL(omap_dispc_free_irq); static irqreturn_t omap_dispc_irq_handler(int irq, void *dev) { - u32 stat = dispc_read_reg(DISPC_IRQSTATUS); + u32 stat; + enable_lcd_clocks(1); + + stat = dispc_read_reg(DISPC_IRQSTATUS); if (stat & DISPC_IRQ_FRAMEMASK) complete(&dispc.frame_done); @@ -875,6 +878,8 @@ static irqreturn_t omap_dispc_irq_handler(int irq, void *dev) dispc_write_reg(DISPC_IRQSTATUS, stat); + enable_lcd_clocks(0); + return IRQ_HANDLED; } @@ -913,18 +918,13 @@ static void put_dss_clocks(void) static void enable_lcd_clocks(int enable) { - if (enable) + if (enable) { + clk_enable(dispc.dss_ick); clk_enable(dispc.dss1_fck); - else + } else { clk_disable(dispc.dss1_fck); -} - -static void enable_interface_clocks(int enable) -{ - if (enable) - clk_enable(dispc.dss_ick); - else clk_disable(dispc.dss_ick); + } } static void enable_digit_clocks(int enable) @@ -1365,7 +1365,6 @@ static int omap_dispc_init(struct omapfb_device *fbdev, int ext_mode, if ((r = get_dss_clocks()) < 0) goto fail0; - enable_interface_clocks(1); enable_lcd_clocks(1); #ifdef CONFIG_FB_OMAP_BOOTLOADER_INIT @@ -1469,7 +1468,6 @@ fail2: free_irq(INT_24XX_DSS_IRQ, fbdev); fail1: enable_lcd_clocks(0); - enable_interface_clocks(0); put_dss_clocks(); fail0: iounmap(dispc.base); @@ -1487,7 +1485,6 @@ static void omap_dispc_cleanup(void) cleanup_fbmem(); free_palette_ram(); free_irq(INT_24XX_DSS_IRQ, dispc.fbdev); - enable_interface_clocks(0); put_dss_clocks(); iounmap(dispc.base); } -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:33:06
|
On Thu, 4 Jun 2009 20:52:39 +0300 Imre Deak <imr...@no...> wrote: > From: Jouni Hogander <jou...@no...> > > Leaving interface clocks enabled causes dss pwrdm to stay in active > state when mpu is in active state. This fix puts dss to sleep state > when it is not needed. > > Earlier version broke framebuffer on 24xx. This is fixed by enabling > clocks before trying to access DISPC_IRQSTATUS register. > > Signed-off-by: Jouni Hogander <jou...@no...> > Signed-off-by: Tony Lindgren <to...@at...> > Signed-off-by: Imre Deak <imr...@no...> > --- Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Dobra czy zla wiadomosc? Zawsze warto oszczedzac. Teraz 5,5%. Sprawdz > http://link.interia.pl/f21b0 |
From: Imre D. <imr...@no...> - 2009-06-04 17:55:57
|
- value and register offset was swapped in a dispc write - DISPC_CONTROL register was used instead of DISPC_SYSCONFIG - FIFO size bit field had incorrect length for OMAP3 Signed-off-by: Tony Lindgren <to...@at...> Fixed-by: arun <aru...@mi...> Fixed-by: Kalle Jokiniemi <ext...@no...> Fixed-by: Andrzej Zaborowski <ba...@za...> Signed-off-by: Imre Deak <imr...@no...> --- drivers/video/omap/dispc.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c index 148cbcc..2db8fbb 100644 --- a/drivers/video/omap/dispc.c +++ b/drivers/video/omap/dispc.c @@ -286,7 +286,7 @@ static void setup_plane_fifo(int plane, int ext_mode) BUG_ON(plane > 2); l = dispc_read_reg(fsz_reg[plane]); - l &= FLD_MASK(0, 9); + l &= FLD_MASK(0, 11); if (ext_mode) { low = l * 3 / 4; high = l; @@ -294,7 +294,7 @@ static void setup_plane_fifo(int plane, int ext_mode) low = l / 4; high = l * 3 / 4; } - MOD_REG_FLD(ftrs_reg[plane], FLD_MASK(16, 9) | FLD_MASK(0, 9), + MOD_REG_FLD(ftrs_reg[plane], FLD_MASK(16, 12) | FLD_MASK(0, 12), (high << 16) | low); } @@ -1397,7 +1397,7 @@ static int omap_dispc_init(struct omapfb_device *fbdev, int ext_mode, } /* Enable smart idle and autoidle */ - l = dispc_read_reg(DISPC_CONTROL); + l = dispc_read_reg(DISPC_SYSCONFIG); l &= ~((3 << 12) | (3 << 3)); l |= (2 << 12) | (2 << 3) | (1 << 0); dispc_write_reg(DISPC_SYSCONFIG, l); @@ -1409,7 +1409,7 @@ static int omap_dispc_init(struct omapfb_device *fbdev, int ext_mode, dispc_write_reg(DISPC_CONFIG, l); l = dispc_read_reg(DISPC_IRQSTATUS); - dispc_write_reg(l, DISPC_IRQSTATUS); + dispc_write_reg(DISPC_IRQSTATUS, l); /* Enable those that we handle always */ omap_dispc_enable_irqs(DISPC_IRQ_FRAMEMASK); -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:32:10
|
On Thu, 4 Jun 2009 20:52:38 +0300 Imre Deak <imr...@no...> wrote: > - value and register offset was swapped in a dispc write > - DISPC_CONTROL register was used instead of DISPC_SYSCONFIG > - FIFO size bit field had incorrect length for OMAP3 > > Signed-off-by: Tony Lindgren <to...@at...> > Fixed-by: arun <aru...@mi...> > Fixed-by: Kalle Jokiniemi <ext...@no...> > Fixed-by: Andrzej Zaborowski <ba...@za...> > Signed-off-by: Imre Deak <imr...@no...> > --- > drivers/video/omap/dispc.c | 8 ++++---- > 1 files changed, 4 insertions(+), 4 deletions(-) > Acked-by: Krzysztof Helt <krz...@wp...> ---------------------------------------------------------------------- Wejdz i kliknij na Swoj znak zodiaku! http://link.interia.pl/f21b8 |
From: Imre D. <imr...@no...> - 2009-06-04 17:56:03
|
From: Koen Kooi <ko...@op...> The default resolution is 1024x768@24bit This version addresses the comments from Felipe Balbi adn Arun Edarath Signed-off-by: Koen Kooi <ko...@op...> Signed-off-by: Tony Lindgren <to...@at...> Fixed-by: Felipe Contreras <fel...@gm...> Fixed-by: Steve Sakoman <st...@sa...> Fixed-by: Jarkko Nikula <jar...@gm...> Fixed-by: David Brownell <dbr...@us...> CC: lin...@li... Signed-off-by: Imre Deak <imr...@no...> --- arch/arm/configs/omap3_beagle_defconfig | 47 +++++++++++- drivers/video/omap/Makefile | 1 + drivers/video/omap/lcd_omap3beagle.c | 133 +++++++++++++++++++++++++++++++ 3 files changed, 180 insertions(+), 1 deletions(-) create mode 100644 drivers/video/omap/lcd_omap3beagle.c diff --git a/arch/arm/configs/omap3_beagle_defconfig b/arch/arm/configs/omap3_beagle_defconfig index 4c6fb7e..c4726f0 100644 --- a/arch/arm/configs/omap3_beagle_defconfig +++ b/arch/arm/configs/omap3_beagle_defconfig @@ -769,7 +769,33 @@ CONFIG_DAB=y # # CONFIG_VGASTATE is not set # CONFIG_VIDEO_OUTPUT_CONTROL is not set -# CONFIG_FB is not set +CONFIG_FB=y +# CONFIG_FIRMWARE_EDID is not set +# CONFIG_FB_DDC 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 is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_VIRTUAL is not set +CONFIG_FB_OMAP=y +# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set +# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set +CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set # @@ -782,6 +808,25 @@ CONFIG_DAB=y # # 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=y +CONFIG_FONTS=y +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_10x18 is not set +# CONFIG_LOGO is not set + +# +# Sound +# # CONFIG_SOUND is not set # CONFIG_HID_SUPPORT is not set CONFIG_USB_SUPPORT=y diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile index 4345157..9ff1815 100644 --- a/drivers/video/omap/Makefile +++ b/drivers/video/omap/Makefile @@ -31,6 +31,7 @@ objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o objs-y$(CONFIG_MACH_OMAP_3430SDP) += lcd_2430sdp.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 objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o omapfb-objs := $(objs-yy) diff --git a/drivers/video/omap/lcd_omap3beagle.c b/drivers/video/omap/lcd_omap3beagle.c new file mode 100644 index 0000000..40454dc --- /dev/null +++ b/drivers/video/omap/lcd_omap3beagle.c @@ -0,0 +1,133 @@ +/* + * LCD panel support for the TI OMAP3 Beagle board + * + * Author: Koen Kooi <ko...@op...> + * + * Derived from drivers/video/omap/lcd-omap3evm.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 170 + +#define LCD_XRES 1024 +#define LCD_YRES 768 +#define LCD_PIXCLOCK 64000 /* in kHz */ + +static int omap3beagle_panel_init(struct lcd_panel *panel, + struct omapfb_device *fbdev) +{ + gpio_request(LCD_PANEL_ENABLE_GPIO, "LCD enable"); + return 0; +} + +static void omap3beagle_panel_cleanup(struct lcd_panel *panel) +{ +} + +static int omap3beagle_panel_enable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 1); + return 0; +} + +static void omap3beagle_panel_disable(struct lcd_panel *panel) +{ + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 0); +} + +static unsigned long omap3beagle_panel_get_caps(struct lcd_panel *panel) +{ + return 0; +} + +struct lcd_panel omap3beagle_panel = { + .name = "omap3beagle", + .config = OMAP_LCDC_PANEL_TFT, + + .bpp = 16, + .data_lines = 24, + .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, + + .init = omap3beagle_panel_init, + .cleanup = omap3beagle_panel_cleanup, + .enable = omap3beagle_panel_enable, + .disable = omap3beagle_panel_disable, + .get_caps = omap3beagle_panel_get_caps, +}; + +static int omap3beagle_panel_probe(struct platform_device *pdev) +{ + omapfb_register_panel(&omap3beagle_panel); + return 0; +} + +static int omap3beagle_panel_remove(struct platform_device *pdev) +{ + return 0; +} + +static int omap3beagle_panel_suspend(struct platform_device *pdev, + pm_message_t mesg) +{ + return 0; +} + +static int omap3beagle_panel_resume(struct platform_device *pdev) +{ + return 0; +} + +struct platform_driver omap3beagle_panel_driver = { + .probe = omap3beagle_panel_probe, + .remove = omap3beagle_panel_remove, + .suspend = omap3beagle_panel_suspend, + .resume = omap3beagle_panel_resume, + .driver = { + .name = "omap3beagle_lcd", + .owner = THIS_MODULE, + }, +}; + +static int __init omap3beagle_panel_drv_init(void) +{ + return platform_driver_register(&omap3beagle_panel_driver); +} + +static void __exit omap3beagle_panel_drv_exit(void) +{ + platform_driver_unregister(&omap3beagle_panel_driver); +} + +module_init(omap3beagle_panel_drv_init); +module_exit(omap3beagle_panel_drv_exit); -- 1.6.3.1 |
From: Krzysztof H. <krz...@po...> - 2009-06-14 21:27:07
|
On Thu, 4 Jun 2009 20:52:34 +0300 Imre Deak <imr...@no...> wrote: > From: Koen Kooi <ko...@op...> > > The default resolution is 1024x768@24bit > > This version addresses the comments from Felipe Balbi adn Arun Edarath > > Signed-off-by: Koen Kooi <ko...@op...> > Signed-off-by: Tony Lindgren <to...@at...> > Fixed-by: Felipe Contreras <fel...@gm...> > Fixed-by: Steve Sakoman <st...@sa...> > Fixed-by: Jarkko Nikula <jar...@gm...> > Fixed-by: David Brownell <dbr...@us...> > CC: lin...@li... > Signed-off-by: Imre Deak <imr...@no...> > --- > arch/arm/configs/omap3_beagle_defconfig | 47 +++++++++++- > drivers/video/omap/Makefile | 1 + > drivers/video/omap/lcd_omap3beagle.c | 133 +++++++++++++++++++++++++++++++ > 3 files changed, 180 insertions(+), 1 deletions(-) > create mode 100644 drivers/video/omap/lcd_omap3beagle.c > > diff --git a/arch/arm/configs/omap3_beagle_defconfig b/arch/arm/configs/omap3_beagle_defconfig > index 4c6fb7e..c4726f0 100644 > --- a/arch/arm/configs/omap3_beagle_defconfig > +++ b/arch/arm/configs/omap3_beagle_defconfig > @@ -769,7 +769,33 @@ CONFIG_DAB=y > # > # CONFIG_VGASTATE is not set > # CONFIG_VIDEO_OUTPUT_CONTROL is not set > -# CONFIG_FB is not set > +CONFIG_FB=y > +# CONFIG_FIRMWARE_EDID is not set > +# CONFIG_FB_DDC 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 is not set > +# CONFIG_FB_TILEBLITTING is not set > + > +# > +# Frame buffer hardware drivers > +# > +# CONFIG_FB_S1D13XXX is not set > +# CONFIG_FB_VIRTUAL is not set > +CONFIG_FB_OMAP=y > +# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set > +# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set > +CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2 > # CONFIG_BACKLIGHT_LCD_SUPPORT is not set > > # > @@ -782,6 +808,25 @@ CONFIG_DAB=y > # > # 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=y > +CONFIG_FONTS=y > +CONFIG_FONT_8x8=y > +CONFIG_FONT_8x16=y > +# CONFIG_FONT_6x11 is not set > +# CONFIG_FONT_7x14 is not set > +# CONFIG_FONT_PEARL_8x8 is not set > +# CONFIG_FONT_ACORN_8x8 is not set > +# CONFIG_FONT_MINI_4x6 is not set > +# CONFIG_FONT_SUN8x16 is not set > +# CONFIG_FONT_SUN12x22 is not set > +# CONFIG_FONT_10x18 is not set > +# CONFIG_LOGO is not set > + > +# > +# Sound > +# > # CONFIG_SOUND is not set > # CONFIG_HID_SUPPORT is not set > CONFIG_USB_SUPPORT=y > diff --git a/drivers/video/omap/Makefile b/drivers/video/omap/Makefile > index 4345157..9ff1815 100644 > --- a/drivers/video/omap/Makefile > +++ b/drivers/video/omap/Makefile > @@ -31,6 +31,7 @@ objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o > objs-y$(CONFIG_MACH_OMAP_3430SDP) += lcd_2430sdp.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 > objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o > > omapfb-objs := $(objs-yy) > diff --git a/drivers/video/omap/lcd_omap3beagle.c b/drivers/video/omap/lcd_omap3beagle.c > new file mode 100644 > index 0000000..40454dc > --- /dev/null > +++ b/drivers/video/omap/lcd_omap3beagle.c > @@ -0,0 +1,133 @@ > +/* > + * LCD panel support for the TI OMAP3 Beagle board > + * > + * Author: Koen Kooi <ko...@op...> > + * > + * Derived from drivers/video/omap/lcd-omap3evm.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 170 > + > +#define LCD_XRES 1024 > +#define LCD_YRES 768 > +#define LCD_PIXCLOCK 64000 /* in kHz */ > + Used once and well documented by the assignment. > +static int omap3beagle_panel_init(struct lcd_panel *panel, > + struct omapfb_device *fbdev) > +{ > + gpio_request(LCD_PANEL_ENABLE_GPIO, "LCD enable"); > + return 0; > +} > + > +static void omap3beagle_panel_cleanup(struct lcd_panel *panel) > +{ Should the requested gpio be freed? > +} > + > +static int omap3beagle_panel_enable(struct lcd_panel *panel) > +{ > + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 1); > + return 0; > +} > + > +static void omap3beagle_panel_disable(struct lcd_panel *panel) > +{ > + gpio_set_value(LCD_PANEL_ENABLE_GPIO, 0); > +} > + > +static unsigned long omap3beagle_panel_get_caps(struct lcd_panel *panel) > +{ > + return 0; > +} > + > +struct lcd_panel omap3beagle_panel = { > + .name = "omap3beagle", > + .config = OMAP_LCDC_PANEL_TFT, > + > + .bpp = 16, > + .data_lines = 24, > + .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, > + > + .init = omap3beagle_panel_init, > + .cleanup = omap3beagle_panel_cleanup, > + .enable = omap3beagle_panel_enable, > + .disable = omap3beagle_panel_disable, > + .get_caps = omap3beagle_panel_get_caps, > +}; > + > +static int omap3beagle_panel_probe(struct platform_device *pdev) > +{ > + omapfb_register_panel(&omap3beagle_panel); > + return 0; > +} > + > +static int omap3beagle_panel_remove(struct platform_device *pdev) > +{ > + return 0; > +} > + > +static int omap3beagle_panel_suspend(struct platform_device *pdev, > + pm_message_t mesg) > +{ > + return 0; > +} > + > +static int omap3beagle_panel_resume(struct platform_device *pdev) > +{ > + return 0; > +} > + > +struct platform_driver omap3beagle_panel_driver = { > + .probe = omap3beagle_panel_probe, > + .remove = omap3beagle_panel_remove, > + .suspend = omap3beagle_panel_suspend, > + .resume = omap3beagle_panel_resume, > + .driver = { > + .name = "omap3beagle_lcd", > + .owner = THIS_MODULE, > + }, > +}; > + > +static int __init omap3beagle_panel_drv_init(void) > +{ > + return platform_driver_register(&omap3beagle_panel_driver); > +} > + > +static void __exit omap3beagle_panel_drv_exit(void) > +{ > + platform_driver_unregister(&omap3beagle_panel_driver); > +} > + > +module_init(omap3beagle_panel_drv_init); > +module_exit(omap3beagle_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 > ---------------------------------------------------------------------- Sprawdz wiadomosci z Twojego regionu! Kliknij >>> http://link.interia.pl/f21ba |
From: Imre D. <imr...@no...> - 2009-06-04 17:56:06
|
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(-) diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c index 5b04b9c..098177b 100644 --- a/drivers/video/omap/omapfb_main.c +++ b/drivers/video/omap/omapfb_main.c @@ -1842,8 +1842,8 @@ static int omapfb_suspend(struct platform_device *pdev, pm_message_t mesg) { struct omapfb_device *fbdev = platform_get_drvdata(pdev); - omapfb_blank(FB_BLANK_POWERDOWN, fbdev->fb_info[0]); - + if (fbdev != NULL) + omapfb_blank(FB_BLANK_POWERDOWN, fbdev->fb_info[0]); return 0; } @@ -1852,7 +1852,8 @@ static int omapfb_resume(struct platform_device *pdev) { struct omapfb_device *fbdev = platform_get_drvdata(pdev); - omapfb_blank(FB_BLANK_UNBLANK, fbdev->fb_info[0]); + if (fbdev != NULL) + omapfb_blank(FB_BLANK_UNBLANK, fbdev->fb_info[0]); return 0; } -- 1.6.3.1 |