From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
To: "ext hvaibhav@ti.com" <hvaibhav@ti.com>
Cc: linux-fbdev-devel@lists.sourceforge.net, linux-omap@vger.kernel.org
Subject: Re: [REVIEW PATCH] Added OMAP3EVM support on Tomis FBDEV/DSS Patches
Date: Fri, 14 Nov 2008 12:54:24 +0200 [thread overview]
Message-ID: <1226660064.32348.76.camel@tubuntu> (raw)
In-Reply-To: <1226644352-22060-1-git-send-email-hvaibhav@ti.com>
Hi,
On Fri, 2008-11-14 at 12:02 +0530, ext hvaibhav@ti.com wrote:
> From: Vaibhav Hiremath <hvaibhav@ti.com>
>
> Tested LCD, TV, DVI (480P) out on OMAP3EVM board.
>
> Please make sure that you change the option
> CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=7 and apply the
> Mans Rullgard clock patches to support set_rate and round_rate API.
>
> Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
I think the LCD panel on SDP and EVM boards are the same, so we should
only have one driver. Do you have specifications about the LCD? The
manufacturer, model etc?. I didn't find any proper information about the
LCD.
The #ifdef mode selection in DVI panel is quit hack, I agree. The mode
selection should be possible to be done runtime (or with kernel boot
option at minimum), but I'm not yet sure how to implement it. But I
guess I could at least name the mode config options a bit better.
You also set the LCD's bpp to 18, why is that? The bpp in panel driver
is currently only used as a default bpp for omapfb, but there's no 18bpp
mode in OMAP. For some reason omapfb let's the 18bpp through, but it
acts like it is 16bpp. I can't remember why it does that, I think I'll
remove it from omapfb.
Tomi
> ---
> arch/arm/mach-omap2/board-omap3evm.c | 224 ++++++++++++++++++++++++++++++++--
> drivers/video/omap2/Kconfig | 5 +
> drivers/video/omap2/Makefile | 1 +
> drivers/video/omap2/panel-dvi.c | 54 ++-------
> drivers/video/omap2/panel-omap3evm.c | 110 +++++++++++++++++
> 5 files changed, 341 insertions(+), 53 deletions(-)
> create mode 100644 drivers/video/omap2/panel-omap3evm.c
>
> diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
> index 42ab826..e244fa7 100644
> --- a/arch/arm/mach-omap2/board-omap3evm.c
> +++ b/arch/arm/mach-omap2/board-omap3evm.c
> @@ -37,6 +37,8 @@
> #include <mach/usb-ehci.h>
> #include <mach/common.h>
> #include <mach/mcspi.h>
> +#include <mach/omapfb.h>
> +#include <mach/display.h>
>
> #include "sdram-micron-mt46h32m32lf-6.h"
> #include "twl4030-generic-scripts.h"
> @@ -161,14 +163,215 @@ static int __init omap3_evm_i2c_init(void)
> omap_register_i2c_bus(3, 400, NULL, 0);
> return 0;
> }
> +static struct omap_fbmem_config evm_fbmem0_config = {
> + .size = 480*720*4,
> + .start = OMAPFB_MEMTYPE_SDRAM,
> +};
>
> -static struct platform_device omap3_evm_lcd_device = {
> - .name = "omap3evm_lcd",
> - .id = -1,
> +static struct omap_fbmem_config evm_fbmem1_config = {
> + .size = 480*720*4,
> + .start = OMAPFB_MEMTYPE_SDRAM,
> };
>
> -static struct omap_lcd_config omap3_evm_lcd_config __initdata = {
> - .ctrl_name = "internal",
> +static struct omap_fbmem_config evm_fbmem2_config = {
> + .size = 480*720*4,
> + .start = OMAPFB_MEMTYPE_SDRAM,
> +};
> +#define LCD_PANEL_LR 2
> +#define LCD_PANEL_UD 3
> +#define LCD_PANEL_INI 152
> +#define LCD_PANEL_ENABLE_GPIO 153
> +#define LCD_PANEL_QVGA 154
> +#define LCD_PANEL_RESB 155
> +
> +#define ENABLE_VDAC_DEDICATED 0x03
> +#define ENABLE_VDAC_DEV_GRP 0x20
> +#define ENABLE_VPLL2_DEDICATED 0x05
> +#define ENABLE_VPLL2_DEV_GRP 0xE0
> +
> +#define TWL4030_GPIODATA_IN3 0x03
> +#define TWL4030_GPIODATA_DIR3 0x06
> +#define TWL4030_VPLL2_DEV_GRP 0x33
> +#define TWL4030_VPLL2_DEDICATED 0x36
> +
> +static int lcd_enabled;
> +static int dvi_enabled;
> +
> +static void __init evm_display_init(void)
> +{
> + int r;
> + r = gpio_request(LCD_PANEL_LR, "lcd_panel_lr");
> + if (r) {
> + printk(KERN_ERR "failed to get LCD_PANEL_LR\n");
> + return;
> + }
> + r = gpio_request(LCD_PANEL_UD, "lcd_panel_ud");
> + if (r) {
> + printk(KERN_ERR "failed to get LCD_PANEL_UD\n");
> + goto err_1;
> + }
> +
> + r = gpio_request(LCD_PANEL_INI, "lcd_panel_ini");
> + if (r) {
> + printk(KERN_ERR "failed to get LCD_PANEL_INI\n");
> + goto err_2;
> + }
> + r = gpio_request(LCD_PANEL_RESB, "lcd_panel_resb");
> + if (r) {
> + printk(KERN_ERR "failed to get LCD_PANEL_RESB\n");
> + goto err_3;
> + }
> + r = gpio_request(LCD_PANEL_QVGA, "lcd_panel_qvga");
> + if (r) {
> + printk(KERN_ERR "failed to get LCD_PANEL_QVGA\n");
> + goto err_4;
> + }
> +
> + gpio_direction_output(LCD_PANEL_LR, 0);
> + gpio_direction_output(LCD_PANEL_UD, 0);
> + gpio_direction_output(LCD_PANEL_INI, 0);
> + gpio_direction_output(LCD_PANEL_RESB, 0);
> + gpio_direction_output(LCD_PANEL_QVGA, 0);
> +
> +#define TWL_LED_LEDEN 0x00
> +#define TWL_PWMA_PWMAON 0x00
> +#define TWL_PWMA_PWMAOFF 0x01
> +
> + 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);
> +
> + 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);
> +
> + return;
> +
> +err_4:
> + gpio_free(LCD_PANEL_RESB);
> +err_3:
> + gpio_free(LCD_PANEL_INI);
> +err_2:
> + gpio_free(LCD_PANEL_UD);
> +err_1:
> + gpio_free(LCD_PANEL_LR);
> +
> +}
> +
> +static int panel_enable_lcd(struct omap_display *display)
> +{
> + if (dvi_enabled) {
> + printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
> + return -EINVAL;
> + }
> + if (system_rev > OMAP3430_REV_ES1_0) {
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
> + ENABLE_VPLL2_DEDICATED, TWL4030_VPLL2_DEDICATED);
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
> + ENABLE_VPLL2_DEV_GRP, TWL4030_VPLL2_DEV_GRP);
> + }
> + gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0);
> + lcd_enabled = 1;
> + return 0;
> +}
> +
> +static void panel_disable_lcd(struct omap_display *display)
> +{
> + if (system_rev > OMAP3430_REV_ES1_0) {
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0,
> + TWL4030_VPLL2_DEDICATED);
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x0,
> + TWL4030_VPLL2_DEV_GRP);
> + }
> + omap_set_gpio_dataout(LCD_PANEL_ENABLE_GPIO, 1);
> + lcd_enabled = 0;
> +}
> +
> +static struct omap_display_data evm_display_data = {
> + .type = OMAP_DISPLAY_TYPE_DPI,
> + .name = "lcd",
> + .panel_name = "panel-evm",
> + .u.dpi.data_lines = 16,
> + .panel_enable = panel_enable_lcd,
> + .panel_disable = panel_disable_lcd,
> +};
> +
> +static int panel_enable_tv(struct omap_display *display)
> +{
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
> + ENABLE_VDAC_DEDICATED, TWL4030_VDAC_DEDICATED);
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER,
> + ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP);
> + return 0;
> +}
> +
> +static void panel_disable_tv(struct omap_display *display)
> +{
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
> + TWL4030_VDAC_DEDICATED);
> + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00,
> + TWL4030_VDAC_DEV_GRP);
> +}
> +
> +static struct omap_display_data evm_display_data_tv = {
> + .type = OMAP_DISPLAY_TYPE_VENC,
> + .name = "tv",
> + .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
> + .panel_enable = panel_enable_tv,
> + .panel_disable = panel_disable_tv,
> +};
> +
> +
> +static int panel_enable_dvi(struct omap_display *display)
> +{
> + if (lcd_enabled) {
> + printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
> + return -EINVAL;
> + }
> + twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80,
> + TWL4030_GPIODATA_IN3);
> + twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80,
> + TWL4030_GPIODATA_DIR3);
> + dvi_enabled = 1;
> +
> + return 0;
> +}
> +
> +static void panel_disable_dvi(struct omap_display *display)
> +{
> + twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00,
> + TWL4030_GPIODATA_IN3);
> + twl4030_i2c_write_u8(TWL4030_MODULE_GPIO, 0x00,
> + TWL4030_GPIODATA_DIR3);
> + dvi_enabled = 0;
> +}
> +
> +
> +static struct omap_display_data evm_display_data_dvi = {
> + .type = OMAP_DISPLAY_TYPE_DPI,
> + .name = "dvi",
> + .panel_name = "panel-dvi",
> + .u.dpi.data_lines = 24,
> + .panel_enable = panel_enable_dvi,
> + .panel_disable = panel_disable_dvi,
> +};
> +
> +static struct omap_dss_platform_data evm_dss_data = {
> + .num_displays = 3,
> + .displays = {
> + &evm_display_data,
> + &evm_display_data_dvi,
> + &evm_display_data_tv,
> + }
> +};
> +static struct platform_device evm_dss_device = {
> + .name = "omap-dss",
> + .id = -1,
> + .dev = {
> + .platform_data = &evm_dss_data,
> + },
> };
>
> static void ads7846_dev_init(void)
> @@ -227,11 +430,13 @@ static void __init omap3_evm_init_irq(void)
>
> static struct omap_board_config_kernel omap3_evm_config[] __initdata = {
> { OMAP_TAG_UART, &omap3_evm_uart_config },
> - { OMAP_TAG_LCD, &omap3_evm_lcd_config },
> + { OMAP_TAG_FBMEM, &evm_fbmem0_config },
> + { OMAP_TAG_FBMEM, &evm_fbmem1_config },
> + { OMAP_TAG_FBMEM, &evm_fbmem2_config },
> };
>
> static struct platform_device *omap3_evm_devices[] __initdata = {
> - &omap3_evm_lcd_device,
> + &evm_dss_device,
> &omap3evm_smc911x_device,
> };
>
> @@ -250,8 +455,6 @@ static void __init omap3_evm_init(void)
> omap3_evm_i2c_init();
>
> platform_add_devices(omap3_evm_devices, ARRAY_SIZE(omap3_evm_devices));
> - omap_board_config = omap3_evm_config;
> - omap_board_config_size = ARRAY_SIZE(omap3_evm_config);
>
> spi_register_board_info(omap3evm_spi_board_info,
> ARRAY_SIZE(omap3evm_spi_board_info));
> @@ -262,10 +465,13 @@ static void __init omap3_evm_init(void)
> usb_ehci_init();
> omap3evm_flash_init();
> ads7846_dev_init();
> + evm_display_init();
> }
>
> static void __init omap3_evm_map_io(void)
> {
> + omap_board_config = omap3_evm_config;
> + omap_board_config_size = ARRAY_SIZE(omap3_evm_config);
> omap2_set_globals_343x();
> omap2_map_common_io();
> }
> diff --git a/drivers/video/omap2/Kconfig b/drivers/video/omap2/Kconfig
> index 95691ad..8211ffd 100644
> --- a/drivers/video/omap2/Kconfig
> +++ b/drivers/video/omap2/Kconfig
> @@ -51,4 +51,9 @@ config PANEL_SDP3430
> help
> SDP3430 LCD
>
> +config PANEL_OMAP3EVM
> + tristate "OMAP3EVM Panel"
> + depends on OMAP2_DSS
> + help
> + OMAP3EVM LCD Panel
> endmenu
> diff --git a/drivers/video/omap2/Makefile b/drivers/video/omap2/Makefile
> index 73ab1c0..668e8c6 100644
> --- a/drivers/video/omap2/Makefile
> +++ b/drivers/video/omap2/Makefile
> @@ -3,3 +3,4 @@ omapfb-y := omapfb-main.o omapfb-sysfs.o omapfb-ioctl.o
>
> obj-$(CONFIG_PANEL_DVI) += panel-dvi.o
> obj-$(CONFIG_PANEL_SDP3430) += panel-sdp3430.o
> +obj-$(CONFIG_PANEL_OMAP3EVM) += panel-omap3evm.o
> diff --git a/drivers/video/omap2/panel-dvi.c b/drivers/video/omap2/panel-dvi.c
> index 2d053df..2a52897 100644
> --- a/drivers/video/omap2/panel-dvi.c
> +++ b/drivers/video/omap2/panel-dvi.c
> @@ -52,54 +52,20 @@ static struct omap_panel dvi_panel = {
> .disable = dvi_panel_disable,
> /*.set_mode = dvi_set_mode, */
>
> -#if defined(CONFIG_PANEL_DVI_LOWRES)
> .timings = {
> - /* 800 x 600 @ 60 Hz Reduced blanking VESA CVT 0.48M3-R */
> - .pixel_clock = 35500,
> - .hfp = 48,
> - .hsw = 32,
> - .hbp = 80,
> - .vfp = 3,
> - .vsw = 4,
> - .vbp = 11,
> + /* 480P */
> + .pixel_clock = 30000,
> + .hfp = 24,
> + .hsw = 40,
> + .hbp = 96,
> + .vfp = 10,
> + .vsw = 3,
> + .vbp = 32,
> },
>
> - .x_res = 800,
> - .y_res = 600,
> + .x_res = 480,
> + .y_res = 720,
> .bpp = 24,
> -#elif defined(CONFIG_PANEL_DVI_HIGHRES)
> - .timings = {
> - /* 1024 x 768 @ 60 Hz Reduced blanking */
> - .pixel_clock = 56000,
> - .hfp = 48,
> - .hsw = 32,
> - .hbp = 80,
> - .vfp = 3,
> - .vsw = 4,
> - .vbp = 15,
> - },
> -
> - .x_res = 1024,
> - .y_res = 768,
> - .bpp = 24,
> -#elif defined(CONFIG_PANEL_DVI_VERYHIGHRES)
> - .timings = {
> - /* 1280 x 1024 @ 57 Hz Reduced blanking */
> - .pixel_clock = 86500,
> - .hfp = 48,
> - .hsw = 32,
> - .hbp = 80,
> - .vfp = 3,
> - .vsw = 4,
> - .vbp = 15,
> - },
> -
> - .x_res = 1280,
> - .y_res = 1024,
> - .bpp = 16,
> -#else
> -#error Undefined default mode
> -#endif
>
> .config = OMAP_DSS_LCD_TFT,
> };
> diff --git a/drivers/video/omap2/panel-omap3evm.c b/drivers/video/omap2/panel-omap3evm.c
> new file mode 100644
> index 0000000..4a00b02
> --- /dev/null
> +++ b/drivers/video/omap2/panel-omap3evm.c
> @@ -0,0 +1,110 @@
> +/*
> + * LCD panel support for the TI OMAP3EVM board
> + *
> + * Copyright (C) 2008 Texas Instruments, Inc.
> + * Author: Vaibhav Hiremath <hvaibhav@ti.com>
> + *
> + * Derived from drivers/video/omap2/panel-sdp3430.c
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published by
> + * the Free Software Foundation.
> + *
> + * 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, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <linux/module.h>
> +#include <linux/delay.h>
> +
> +#include <mach/display.h>
> +
> +static int omap3evm_panel_init(struct omap_display *display)
> +{
> + return 0;
> +}
> +
> +static void omap3evm_panel_cleanup(struct omap_display *display)
> +{
> +}
> +
> +static int omap3evm_panel_enable(struct omap_display *display)
> +{
> + int r = 0;
> +
> + if (display->hw_config.panel_enable)
> + r = display->hw_config.panel_enable(display);
> +
> + return r;
> +}
> +
> +static void omap3evm_panel_disable(struct omap_display *display)
> +{
> + if (display->hw_config.panel_disable)
> + display->hw_config.panel_disable(display);
> +}
> +
> +static int omap3evm_panel_suspend(struct omap_display *display)
> +{
> + omap3evm_panel_disable(display);
> + return 0;
> +}
> +
> +static int omap3evm_panel_resume(struct omap_display *display)
> +{
> + return omap3evm_panel_enable(display);
> +}
> +
> +static struct omap_panel omap3evm_panel = {
> + .owner = THIS_MODULE,
> + .name = "panel-evm",
> + .init = omap3evm_panel_init,
> + .cleanup = omap3evm_panel_cleanup,
> + .enable = omap3evm_panel_enable,
> + .disable = omap3evm_panel_disable,
> + .suspend = omap3evm_panel_suspend,
> + .resume = omap3evm_panel_resume,
> + /*.set_mode = omap3evm_set_mode, */
> +
> + .timings = {
> + .pixel_clock = 26000,
> +
> + .hsw = 4,
> + .hfp = 4,
> + .hbp = 40,
> +
> + .vsw = 2,
> + .vfp = 2,
> + .vbp = 7,
> + },
> +
> + .acb = 0x28,
> +
> + .config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
> + OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IPC,
> +
> + .x_res = 480,
> + .y_res = 640,
> + .bpp = 18,
> +};
> +
> +
> +static int __init omap3evm_panel_drv_init(void)
> +{
> + omap_dss_register_panel(&omap3evm_panel);
> + return 0;
> +}
> +
> +static void __exit omap3evm_panel_drv_exit(void)
> +{
> + omap_dss_unregister_panel(&omap3evm_panel);
> +}
> +
> +module_init(omap3evm_panel_drv_init);
> +module_exit(omap3evm_panel_drv_exit);
> +MODULE_LICENSE("GPL");
> --
> 1.5.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2008-11-14 10:54 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-11-14 6:32 [REVIEW PATCH] Added OMAP3EVM support on Tomis FBDEV/DSS Patches hvaibhav
2008-11-14 10:54 ` Tomi Valkeinen [this message]
2008-11-14 12:35 ` Hiremath, Vaibhav
2008-11-14 13:53 ` Hiremath, Vaibhav
2008-11-14 15:53 ` Tomi Valkeinen
2008-11-14 19:44 ` Koen Kooi
2008-11-15 8:45 ` Hiremath, Vaibhav
2008-11-18 12:09 ` Hiremath, Vaibhav
2008-11-18 12:21 ` Koen Kooi
2008-11-15 8:42 ` Hiremath, Vaibhav
2008-11-17 9:49 ` Tomi Valkeinen
2008-11-14 11:38 ` Koen Kooi
2008-11-14 11:49 ` Shah, Hardik
2008-11-14 21:50 ` Tony Lindgren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1226660064.32348.76.camel@tubuntu \
--to=tomi.valkeinen@nokia.com \
--cc=hvaibhav@ti.com \
--cc=linux-fbdev-devel@lists.sourceforge.net \
--cc=linux-omap@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).