forked from Minki/linux
Merge branch 'for-paul-38-rebased' of git://gitorious.org/linux-omap-dss2/linux
This commit is contained in:
commit
e9ab320731
@ -187,16 +187,19 @@ obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom.o \
|
||||
board-zoom-peripherals.o \
|
||||
board-zoom-display.o \
|
||||
board-flash.o \
|
||||
hsmmc.o \
|
||||
board-zoom-debugboard.o
|
||||
obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom.o \
|
||||
board-zoom-peripherals.o \
|
||||
board-zoom-display.o \
|
||||
board-flash.o \
|
||||
hsmmc.o \
|
||||
board-zoom-debugboard.o
|
||||
obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
|
||||
board-zoom-peripherals.o \
|
||||
board-zoom-display.o \
|
||||
board-flash.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include <plat/dma.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
|
||||
#include <plat/gpmc-smc91x.h>
|
||||
|
||||
@ -270,15 +271,20 @@ static struct omap_dss_device sdp3430_lcd_device = {
|
||||
.platform_disable = sdp3430_panel_disable_lcd,
|
||||
};
|
||||
|
||||
static struct omap_dss_device sdp3430_dvi_device = {
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.phy.dpi.data_lines = 24,
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = sdp3430_panel_enable_dvi,
|
||||
.platform_disable = sdp3430_panel_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device sdp3430_dvi_device = {
|
||||
.name = "dvi",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
};
|
||||
|
||||
static struct omap_dss_device sdp3430_tv_device = {
|
||||
.name = "tv",
|
||||
.driver_name = "venc",
|
||||
|
@ -207,6 +207,7 @@ static void __init omap_sdp_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBP);
|
||||
zoom_peripherals_init();
|
||||
zoom_display_init();
|
||||
board_smc91x_init();
|
||||
board_flash_init(sdp_flash_partitions, chip_sel_sdp);
|
||||
enable_board_wakeup_source();
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include <plat/common.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
@ -303,13 +304,18 @@ static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev)
|
||||
lcd_enabled = 0;
|
||||
}
|
||||
|
||||
static struct panel_generic_dpi_data lcd_panel = {
|
||||
.name = "sharp_lq",
|
||||
.platform_enable = am3517_evm_panel_enable_lcd,
|
||||
.platform_disable = am3517_evm_panel_disable_lcd,
|
||||
};
|
||||
|
||||
static struct omap_dss_device am3517_evm_lcd_device = {
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.name = "lcd",
|
||||
.driver_name = "sharp_lq_panel",
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &lcd_panel,
|
||||
.phy.dpi.data_lines = 16,
|
||||
.platform_enable = am3517_evm_panel_enable_lcd,
|
||||
.platform_disable = am3517_evm_panel_disable_lcd,
|
||||
};
|
||||
|
||||
static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev)
|
||||
@ -346,13 +352,18 @@ static void am3517_evm_panel_disable_dvi(struct omap_dss_device *dssdev)
|
||||
dvi_enabled = 0;
|
||||
}
|
||||
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = am3517_evm_panel_enable_dvi,
|
||||
.platform_disable = am3517_evm_panel_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device am3517_evm_dvi_device = {
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.platform_enable = am3517_evm_panel_enable_dvi,
|
||||
.platform_disable = am3517_evm_panel_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device *am3517_evm_dss_devices[] = {
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <plat/mcspi.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
@ -351,24 +352,34 @@ static void cm_t35_panel_disable_tv(struct omap_dss_device *dssdev)
|
||||
{
|
||||
}
|
||||
|
||||
static struct omap_dss_device cm_t35_lcd_device = {
|
||||
.name = "lcd",
|
||||
.driver_name = "toppoly_tdo35s_panel",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.phy.dpi.data_lines = 18,
|
||||
static struct panel_generic_dpi_data lcd_panel = {
|
||||
.name = "toppoly_tdo35s",
|
||||
.platform_enable = cm_t35_panel_enable_lcd,
|
||||
.platform_disable = cm_t35_panel_disable_lcd,
|
||||
};
|
||||
|
||||
static struct omap_dss_device cm_t35_dvi_device = {
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
static struct omap_dss_device cm_t35_lcd_device = {
|
||||
.name = "lcd",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &lcd_panel,
|
||||
.phy.dpi.data_lines = 18,
|
||||
};
|
||||
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = cm_t35_panel_enable_dvi,
|
||||
.platform_disable = cm_t35_panel_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device cm_t35_dvi_device = {
|
||||
.name = "dvi",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
};
|
||||
|
||||
static struct omap_dss_device cm_t35_tv_device = {
|
||||
.name = "tv",
|
||||
.driver_name = "venc",
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
@ -149,25 +150,34 @@ static struct regulator_consumer_supply devkit8000_vmmc1_supply =
|
||||
static struct regulator_consumer_supply devkit8000_vio_supply =
|
||||
REGULATOR_SUPPLY("vcc", "spi2.0");
|
||||
|
||||
static struct omap_dss_device devkit8000_lcd_device = {
|
||||
.name = "lcd",
|
||||
.driver_name = "generic_panel",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.reset_gpio = -EINVAL, /* will be replaced */
|
||||
static struct panel_generic_dpi_data lcd_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = devkit8000_panel_enable_lcd,
|
||||
.platform_disable = devkit8000_panel_disable_lcd,
|
||||
};
|
||||
static struct omap_dss_device devkit8000_dvi_device = {
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
|
||||
static struct omap_dss_device devkit8000_lcd_device = {
|
||||
.name = "lcd",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &lcd_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.reset_gpio = -EINVAL, /* will be replaced */
|
||||
};
|
||||
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = devkit8000_panel_enable_dvi,
|
||||
.platform_disable = devkit8000_panel_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device devkit8000_dvi_device = {
|
||||
.name = "dvi",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
};
|
||||
|
||||
static struct omap_dss_device devkit8000_tv_device = {
|
||||
.name = "tv",
|
||||
.driver_name = "venc",
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <plat/onenand.h>
|
||||
|
||||
#include "mux.h"
|
||||
@ -459,13 +460,18 @@ static void igep2_disable_dvi(struct omap_dss_device *dssdev)
|
||||
gpio_direction_output(IGEP2_GPIO_DVI_PUP, 0);
|
||||
}
|
||||
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = igep2_enable_dvi,
|
||||
.platform_disable = igep2_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device igep2_dvi_device = {
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.platform_enable = igep2_enable_dvi,
|
||||
.platform_disable = igep2_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device *igep2_dss_devices[] = {
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
@ -194,14 +195,19 @@ static void beagle_disable_dvi(struct omap_dss_device *dssdev)
|
||||
gpio_set_value(dssdev->reset_gpio, 0);
|
||||
}
|
||||
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = beagle_enable_dvi,
|
||||
.platform_disable = beagle_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device beagle_dvi_device = {
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.reset_gpio = 170,
|
||||
.platform_enable = beagle_enable_dvi,
|
||||
.platform_disable = beagle_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device beagle_tv_device = {
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include <plat/common.h>
|
||||
#include <plat/mcspi.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
@ -301,15 +302,20 @@ static void omap3_evm_disable_dvi(struct omap_dss_device *dssdev)
|
||||
dvi_enabled = 0;
|
||||
}
|
||||
|
||||
static struct omap_dss_device omap3_evm_dvi_device = {
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.phy.dpi.data_lines = 24,
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = omap3_evm_enable_dvi,
|
||||
.platform_disable = omap3_evm_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device omap3_evm_dvi_device = {
|
||||
.name = "dvi",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
};
|
||||
|
||||
static struct omap_dss_device *omap3_evm_dss_devices[] = {
|
||||
&omap3_evm_lcd_device,
|
||||
&omap3_evm_tv_device,
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
@ -160,15 +161,20 @@ static void omap3_stalker_disable_lcd(struct omap_dss_device *dssdev)
|
||||
lcd_enabled = 0;
|
||||
}
|
||||
|
||||
static struct omap_dss_device omap3_stalker_lcd_device = {
|
||||
.name = "lcd",
|
||||
.driver_name = "generic_panel",
|
||||
.phy.dpi.data_lines = 24,
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
static struct panel_generic_dpi_data lcd_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = omap3_stalker_enable_lcd,
|
||||
.platform_disable = omap3_stalker_disable_lcd,
|
||||
};
|
||||
|
||||
static struct omap_dss_device omap3_stalker_lcd_device = {
|
||||
.name = "lcd",
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &lcd_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
};
|
||||
|
||||
static int omap3_stalker_enable_tv(struct omap_dss_device *dssdev)
|
||||
{
|
||||
return 0;
|
||||
@ -208,15 +214,20 @@ static void omap3_stalker_disable_dvi(struct omap_dss_device *dssdev)
|
||||
dvi_enabled = 0;
|
||||
}
|
||||
|
||||
static struct omap_dss_device omap3_stalker_dvi_device = {
|
||||
.name = "dvi",
|
||||
.driver_name = "generic_panel",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.phy.dpi.data_lines = 24,
|
||||
static struct panel_generic_dpi_data dvi_panel = {
|
||||
.name = "generic",
|
||||
.platform_enable = omap3_stalker_enable_dvi,
|
||||
.platform_disable = omap3_stalker_disable_dvi,
|
||||
};
|
||||
|
||||
static struct omap_dss_device omap3_stalker_dvi_device = {
|
||||
.name = "dvi",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.driver_name = "generic_dpi_panel",
|
||||
.data = &dvi_panel,
|
||||
.phy.dpi.data_lines = 24,
|
||||
};
|
||||
|
||||
static struct omap_dss_device *omap3_stalker_dss_devices[] = {
|
||||
&omap3_stalker_lcd_device,
|
||||
&omap3_stalker_tv_device,
|
||||
|
168
arch/arm/mach-omap2/board-zoom-display.c
Normal file
168
arch/arm/mach-omap2/board-zoom-display.c
Normal file
@ -0,0 +1,168 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Texas Instruments Inc.
|
||||
*
|
||||
* Modified from mach-omap2/board-zoom-peripherals.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.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <plat/mcspi.h>
|
||||
#include <plat/display.h>
|
||||
|
||||
#define LCD_PANEL_RESET_GPIO_PROD 96
|
||||
#define LCD_PANEL_RESET_GPIO_PILOT 55
|
||||
#define LCD_PANEL_QVGA_GPIO 56
|
||||
|
||||
static void zoom_lcd_panel_init(void)
|
||||
{
|
||||
int ret;
|
||||
unsigned char lcd_panel_reset_gpio;
|
||||
|
||||
lcd_panel_reset_gpio = (omap_rev() > OMAP3430_REV_ES3_0) ?
|
||||
LCD_PANEL_RESET_GPIO_PROD :
|
||||
LCD_PANEL_RESET_GPIO_PILOT;
|
||||
|
||||
ret = gpio_request(lcd_panel_reset_gpio, "lcd reset");
|
||||
if (ret) {
|
||||
pr_err("Failed to get LCD reset GPIO (gpio%d).\n",
|
||||
lcd_panel_reset_gpio);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(lcd_panel_reset_gpio, 1);
|
||||
|
||||
ret = gpio_request(LCD_PANEL_QVGA_GPIO, "lcd qvga");
|
||||
if (ret) {
|
||||
pr_err("Failed to get LCD_PANEL_QVGA_GPIO (gpio%d).\n",
|
||||
LCD_PANEL_QVGA_GPIO);
|
||||
goto err0;
|
||||
}
|
||||
gpio_direction_output(LCD_PANEL_QVGA_GPIO, 1);
|
||||
|
||||
return;
|
||||
err0:
|
||||
gpio_free(lcd_panel_reset_gpio);
|
||||
}
|
||||
|
||||
static int zoom_panel_enable_lcd(struct omap_dss_device *dssdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void zoom_panel_disable_lcd(struct omap_dss_device *dssdev)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* PWMA/B register offsets (TWL4030_MODULE_PWMA)
|
||||
*/
|
||||
#define TWL_INTBR_PMBR1 0xD
|
||||
#define TWL_INTBR_GPBR1 0xC
|
||||
#define TWL_LED_PWMON 0x0
|
||||
#define TWL_LED_PWMOFF 0x1
|
||||
|
||||
static int zoom_set_bl_intensity(struct omap_dss_device *dssdev, int level)
|
||||
{
|
||||
unsigned char c;
|
||||
u8 mux_pwm, enb_pwm;
|
||||
|
||||
if (level > 100)
|
||||
return -1;
|
||||
|
||||
twl_i2c_read_u8(TWL4030_MODULE_INTBR, &mux_pwm, TWL_INTBR_PMBR1);
|
||||
twl_i2c_read_u8(TWL4030_MODULE_INTBR, &enb_pwm, TWL_INTBR_GPBR1);
|
||||
|
||||
if (level == 0) {
|
||||
/* disable pwm1 output and clock */
|
||||
enb_pwm = enb_pwm & 0xF5;
|
||||
/* change pwm1 pin to gpio pin */
|
||||
mux_pwm = mux_pwm & 0xCF;
|
||||
twl_i2c_write_u8(TWL4030_MODULE_INTBR,
|
||||
enb_pwm, TWL_INTBR_GPBR1);
|
||||
twl_i2c_write_u8(TWL4030_MODULE_INTBR,
|
||||
mux_pwm, TWL_INTBR_PMBR1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!((enb_pwm & 0xA) && (mux_pwm & 0x30))) {
|
||||
/* change gpio pin to pwm1 pin */
|
||||
mux_pwm = mux_pwm | 0x30;
|
||||
/* enable pwm1 output and clock*/
|
||||
enb_pwm = enb_pwm | 0x0A;
|
||||
twl_i2c_write_u8(TWL4030_MODULE_INTBR,
|
||||
mux_pwm, TWL_INTBR_PMBR1);
|
||||
twl_i2c_write_u8(TWL4030_MODULE_INTBR,
|
||||
enb_pwm, TWL_INTBR_GPBR1);
|
||||
}
|
||||
|
||||
c = ((50 * (100 - level)) / 100) + 1;
|
||||
twl_i2c_write_u8(TWL4030_MODULE_PWM1, 0x7F, TWL_LED_PWMOFF);
|
||||
twl_i2c_write_u8(TWL4030_MODULE_PWM1, c, TWL_LED_PWMON);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct omap_dss_device zoom_lcd_device = {
|
||||
.name = "lcd",
|
||||
.driver_name = "NEC_8048_panel",
|
||||
.type = OMAP_DISPLAY_TYPE_DPI,
|
||||
.phy.dpi.data_lines = 24,
|
||||
.platform_enable = zoom_panel_enable_lcd,
|
||||
.platform_disable = zoom_panel_disable_lcd,
|
||||
.max_backlight_level = 100,
|
||||
.set_backlight = zoom_set_bl_intensity,
|
||||
};
|
||||
|
||||
static struct omap_dss_device *zoom_dss_devices[] = {
|
||||
&zoom_lcd_device,
|
||||
};
|
||||
|
||||
static struct omap_dss_board_info zoom_dss_data = {
|
||||
.num_devices = ARRAY_SIZE(zoom_dss_devices),
|
||||
.devices = zoom_dss_devices,
|
||||
.default_device = &zoom_lcd_device,
|
||||
};
|
||||
|
||||
static struct platform_device zoom_dss_device = {
|
||||
.name = "omapdss",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &zoom_dss_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap2_mcspi_device_config dss_lcd_mcspi_config = {
|
||||
.turbo_mode = 1,
|
||||
.single_channel = 1, /* 0: slave, 1: master */
|
||||
};
|
||||
|
||||
static struct spi_board_info nec_8048_spi_board_info[] __initdata = {
|
||||
[0] = {
|
||||
.modalias = "nec_8048_spi",
|
||||
.bus_num = 1,
|
||||
.chip_select = 2,
|
||||
.max_speed_hz = 375000,
|
||||
.controller_data = &dss_lcd_mcspi_config,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *zoom_display_devices[] __initdata = {
|
||||
&zoom_dss_device,
|
||||
};
|
||||
|
||||
void __init zoom_display_init(void)
|
||||
{
|
||||
platform_add_devices(zoom_display_devices,
|
||||
ARRAY_SIZE(zoom_display_devices));
|
||||
spi_register_board_info(nec_8048_spi_board_info,
|
||||
ARRAY_SIZE(nec_8048_spi_board_info));
|
||||
zoom_lcd_panel_init();
|
||||
}
|
||||
|
@ -35,6 +35,8 @@
|
||||
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
|
||||
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
|
||||
|
||||
#define LCD_PANEL_ENABLE_GPIO (7 + OMAP_MAX_GPIO_LINES)
|
||||
|
||||
/* Zoom2 has Qwerty keyboard*/
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_E),
|
||||
@ -224,9 +226,43 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vpll2_supply =
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss");
|
||||
|
||||
static struct regulator_consumer_supply zoom_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss");
|
||||
|
||||
static struct regulator_init_data zoom_vpll2 = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vpll2_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data zoom_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vdda_dac_supply,
|
||||
};
|
||||
|
||||
static int zoom_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
@ -238,7 +274,15 @@ static int zoom_twl_gpio_setup(struct device *dev,
|
||||
zoom_vsim_supply.dev = mmc[0].dev;
|
||||
zoom_vmmc2_supply.dev = mmc[1].dev;
|
||||
|
||||
return 0;
|
||||
ret = gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd enable");
|
||||
if (ret) {
|
||||
pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n",
|
||||
LCD_PANEL_ENABLE_GPIO);
|
||||
return ret;
|
||||
}
|
||||
gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* EXTMUTE callback function */
|
||||
@ -301,7 +345,8 @@ static struct twl4030_platform_data zoom_twldata = {
|
||||
.vmmc1 = &zoom_vmmc1,
|
||||
.vmmc2 = &zoom_vmmc2,
|
||||
.vsim = &zoom_vsim,
|
||||
|
||||
.vpll2 = &zoom_vpll2,
|
||||
.vdac = &zoom_vdac,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata zoom_i2c_boardinfo[] = {
|
||||
|
@ -130,6 +130,7 @@ static void __init omap_zoom_init(void)
|
||||
ARRAY_SIZE(zoom_nand_partitions), ZOOM_NAND_CS);
|
||||
zoom_debugboard_init();
|
||||
zoom_peripherals_init();
|
||||
zoom_display_init();
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")
|
||||
|
@ -1,9 +1,12 @@
|
||||
/*
|
||||
* Defines for zoom boards
|
||||
*/
|
||||
#include <plat/display.h>
|
||||
|
||||
#define ZOOM_NAND_CS 0
|
||||
|
||||
extern int __init zoom_debugboard_init(void);
|
||||
extern void __init zoom_peripherals_init(void);
|
||||
extern void __init zoom_display_init(void);
|
||||
|
||||
#define ZOOM2_HEADSET_EXTMUTE_GPIO 153
|
||||
|
@ -42,6 +42,10 @@
|
||||
#define DISPC_IRQ_SYNC_LOST (1 << 14)
|
||||
#define DISPC_IRQ_SYNC_LOST_DIGIT (1 << 15)
|
||||
#define DISPC_IRQ_WAKEUP (1 << 16)
|
||||
#define DISPC_IRQ_SYNC_LOST2 (1 << 17)
|
||||
#define DISPC_IRQ_VSYNC2 (1 << 18)
|
||||
#define DISPC_IRQ_ACBIAS_COUNT_STAT2 (1 << 21)
|
||||
#define DISPC_IRQ_FRAMEDONE2 (1 << 22)
|
||||
|
||||
struct omap_dss_device;
|
||||
struct omap_overlay_manager;
|
||||
@ -64,6 +68,7 @@ enum omap_plane {
|
||||
enum omap_channel {
|
||||
OMAP_DSS_CHANNEL_LCD = 0,
|
||||
OMAP_DSS_CHANNEL_DIGIT = 1,
|
||||
OMAP_DSS_CHANNEL_LCD2 = 2,
|
||||
};
|
||||
|
||||
enum omap_color_mode {
|
||||
@ -142,6 +147,7 @@ enum omap_dss_display_state {
|
||||
enum omap_dss_overlay_managers {
|
||||
OMAP_DSS_OVL_MGR_LCD,
|
||||
OMAP_DSS_OVL_MGR_TV,
|
||||
OMAP_DSS_OVL_MGR_LCD2,
|
||||
};
|
||||
|
||||
enum omap_dss_rotation_type {
|
||||
@ -268,6 +274,7 @@ struct omap_overlay_info {
|
||||
u16 out_width; /* if 0, out_width == width */
|
||||
u16 out_height; /* if 0, out_height == height */
|
||||
u8 global_alpha;
|
||||
u8 pre_mult_alpha;
|
||||
};
|
||||
|
||||
struct omap_overlay {
|
||||
@ -351,6 +358,8 @@ struct omap_dss_device {
|
||||
|
||||
enum omap_display_type type;
|
||||
|
||||
enum omap_channel channel;
|
||||
|
||||
union {
|
||||
struct {
|
||||
u8 data_lines;
|
||||
|
37
arch/arm/plat-omap/include/plat/panel-generic-dpi.h
Normal file
37
arch/arm/plat-omap/include/plat/panel-generic-dpi.h
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Header for generic DPI panel driver
|
||||
*
|
||||
* Copyright (C) 2010 Canonical Ltd.
|
||||
* Author: Bryan Wu <bryan.wu@canonical.com>
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_ARM_PLAT_OMAP_PANEL_GENERIC_DPI_H
|
||||
#define __ARCH_ARM_PLAT_OMAP_PANEL_GENERIC_DPI_H
|
||||
|
||||
#include "display.h"
|
||||
|
||||
/**
|
||||
* struct panel_generic_dpi_data - panel driver configuration data
|
||||
* @name: panel name
|
||||
* @platform_enable: platform specific panel enable function
|
||||
* @platform_disable: platform specific panel disable function
|
||||
*/
|
||||
struct panel_generic_dpi_data {
|
||||
const char *name;
|
||||
int (*platform_enable)(struct omap_dss_device *dssdev);
|
||||
void (*platform_disable)(struct omap_dss_device *dssdev);
|
||||
};
|
||||
|
||||
#endif /* __ARCH_ARM_PLAT_OMAP_PANEL_GENERIC_DPI_H */
|
@ -1,11 +1,13 @@
|
||||
menu "OMAP2/3 Display Device Drivers"
|
||||
depends on OMAP2_DSS
|
||||
|
||||
config PANEL_GENERIC
|
||||
tristate "Generic Panel"
|
||||
config PANEL_GENERIC_DPI
|
||||
tristate "Generic DPI Panel"
|
||||
help
|
||||
Generic panel driver.
|
||||
Used for DVI output for Beagle and OMAP3 SDP.
|
||||
Generic DPI panel driver.
|
||||
Supports DVI output for Beagle and OMAP3 SDP.
|
||||
Supports LCD Panel used in TI SDP3430 and EVM boards,
|
||||
OMAP3517 EVM boards and CM-T35.
|
||||
|
||||
config PANEL_SHARP_LS037V7DW01
|
||||
tristate "Sharp LS037V7DW01 LCD Panel"
|
||||
@ -14,11 +16,12 @@ config PANEL_SHARP_LS037V7DW01
|
||||
help
|
||||
LCD Panel used in TI's SDP3430 and EVM boards
|
||||
|
||||
config PANEL_SHARP_LQ043T1DG01
|
||||
tristate "Sharp LQ043T1DG01 LCD Panel"
|
||||
depends on OMAP2_DSS
|
||||
help
|
||||
LCD Panel used in TI's OMAP3517 EVM boards
|
||||
config PANEL_NEC_NL8048HL11_01B
|
||||
tristate "NEC NL8048HL11-01B Panel"
|
||||
depends on OMAP2_DSS
|
||||
help
|
||||
This NEC NL8048HL11-01B panel is TFT LCD
|
||||
used in the Zoom2/3/3630 sdp boards.
|
||||
|
||||
config PANEL_TAAL
|
||||
tristate "Taal DSI Panel"
|
||||
@ -26,12 +29,6 @@ config PANEL_TAAL
|
||||
help
|
||||
Taal DSI command mode panel from TPO.
|
||||
|
||||
config PANEL_TOPPOLY_TDO35S
|
||||
tristate "Toppoly TDO35S LCD Panel support"
|
||||
depends on OMAP2_DSS
|
||||
help
|
||||
LCD Panel used in CM-T35
|
||||
|
||||
config PANEL_TPO_TD043MTEA1
|
||||
tristate "TPO TD043MTEA1 LCD Panel"
|
||||
depends on OMAP2_DSS && SPI
|
||||
|
@ -1,8 +1,7 @@
|
||||
obj-$(CONFIG_PANEL_GENERIC) += panel-generic.o
|
||||
obj-$(CONFIG_PANEL_GENERIC_DPI) += panel-generic-dpi.o
|
||||
obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o
|
||||
obj-$(CONFIG_PANEL_SHARP_LQ043T1DG01) += panel-sharp-lq043t1dg01.o
|
||||
obj-$(CONFIG_PANEL_NEC_NL8048HL11_01B) += panel-nec-nl8048hl11-01b.o
|
||||
|
||||
obj-$(CONFIG_PANEL_TAAL) += panel-taal.o
|
||||
obj-$(CONFIG_PANEL_TOPPOLY_TDO35S) += panel-toppoly-tdo35s.o
|
||||
obj-$(CONFIG_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o
|
||||
obj-$(CONFIG_PANEL_ACX565AKM) += panel-acx565akm.o
|
||||
|
365
drivers/video/omap2/displays/panel-generic-dpi.c
Normal file
365
drivers/video/omap2/displays/panel-generic-dpi.c
Normal file
@ -0,0 +1,365 @@
|
||||
/*
|
||||
* Generic DPI Panels support
|
||||
*
|
||||
* Copyright (C) 2010 Canonical Ltd.
|
||||
* Author: Bryan Wu <bryan.wu@canonical.com>
|
||||
*
|
||||
* LCD panel driver for Sharp LQ043T1DG01
|
||||
*
|
||||
* Copyright (C) 2009 Texas Instruments Inc
|
||||
* Author: Vaibhav Hiremath <hvaibhav@ti.com>
|
||||
*
|
||||
* LCD panel driver for Toppoly TDO35S
|
||||
*
|
||||
* Copyright (C) 2009 CompuLab, Ltd.
|
||||
* Author: Mike Rapoport <mike@compulab.co.il>
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation
|
||||
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
||||
*
|
||||
* 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 <linux/slab.h>
|
||||
|
||||
#include <plat/panel-generic-dpi.h>
|
||||
|
||||
struct panel_config {
|
||||
struct omap_video_timings timings;
|
||||
|
||||
int acbi; /* ac-bias pin transitions per interrupt */
|
||||
/* Unit: line clocks */
|
||||
int acb; /* ac-bias pin frequency */
|
||||
|
||||
enum omap_panel_config config;
|
||||
|
||||
int power_on_delay;
|
||||
int power_off_delay;
|
||||
|
||||
/*
|
||||
* Used to match device to panel configuration
|
||||
* when use generic panel driver
|
||||
*/
|
||||
const char *name;
|
||||
};
|
||||
|
||||
/* Panel configurations */
|
||||
static struct panel_config generic_dpi_panels[] = {
|
||||
/* Generic Panel */
|
||||
{
|
||||
{
|
||||
.x_res = 640,
|
||||
.y_res = 480,
|
||||
|
||||
.pixel_clock = 23500,
|
||||
|
||||
.hfp = 48,
|
||||
.hsw = 32,
|
||||
.hbp = 80,
|
||||
|
||||
.vfp = 3,
|
||||
.vsw = 4,
|
||||
.vbp = 7,
|
||||
},
|
||||
.acbi = 0x0,
|
||||
.acb = 0x0,
|
||||
.config = OMAP_DSS_LCD_TFT,
|
||||
.power_on_delay = 0,
|
||||
.power_off_delay = 0,
|
||||
.name = "generic",
|
||||
},
|
||||
|
||||
/* Sharp LQ043T1DG01 */
|
||||
{
|
||||
{
|
||||
.x_res = 480,
|
||||
.y_res = 272,
|
||||
|
||||
.pixel_clock = 9000,
|
||||
|
||||
.hsw = 42,
|
||||
.hfp = 3,
|
||||
.hbp = 2,
|
||||
|
||||
.vsw = 11,
|
||||
.vfp = 3,
|
||||
.vbp = 2,
|
||||
},
|
||||
.acbi = 0x0,
|
||||
.acb = 0x0,
|
||||
.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
|
||||
OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IEO,
|
||||
.power_on_delay = 50,
|
||||
.power_off_delay = 100,
|
||||
.name = "sharp_lq",
|
||||
},
|
||||
|
||||
/* Sharp LS037V7DW01 */
|
||||
{
|
||||
{
|
||||
.x_res = 480,
|
||||
.y_res = 640,
|
||||
|
||||
.pixel_clock = 19200,
|
||||
|
||||
.hsw = 2,
|
||||
.hfp = 1,
|
||||
.hbp = 28,
|
||||
|
||||
.vsw = 1,
|
||||
.vfp = 1,
|
||||
.vbp = 1,
|
||||
},
|
||||
.acbi = 0x0,
|
||||
.acb = 0x28,
|
||||
.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
|
||||
OMAP_DSS_LCD_IHS,
|
||||
.power_on_delay = 50,
|
||||
.power_off_delay = 100,
|
||||
.name = "sharp_ls",
|
||||
},
|
||||
|
||||
/* Toppoly TDO35S */
|
||||
{
|
||||
{
|
||||
.x_res = 480,
|
||||
.y_res = 640,
|
||||
|
||||
.pixel_clock = 26000,
|
||||
|
||||
.hfp = 104,
|
||||
.hsw = 8,
|
||||
.hbp = 8,
|
||||
|
||||
.vfp = 4,
|
||||
.vsw = 2,
|
||||
.vbp = 2,
|
||||
},
|
||||
.acbi = 0x0,
|
||||
.acb = 0x0,
|
||||
.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
|
||||
OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IPC |
|
||||
OMAP_DSS_LCD_ONOFF,
|
||||
.power_on_delay = 0,
|
||||
.power_off_delay = 0,
|
||||
.name = "toppoly_tdo35s",
|
||||
},
|
||||
};
|
||||
|
||||
struct panel_drv_data {
|
||||
|
||||
struct omap_dss_device *dssdev;
|
||||
|
||||
struct panel_config *panel_config;
|
||||
};
|
||||
|
||||
static inline struct panel_generic_dpi_data
|
||||
*get_panel_data(const struct omap_dss_device *dssdev)
|
||||
{
|
||||
return (struct panel_generic_dpi_data *) dssdev->data;
|
||||
}
|
||||
|
||||
static int generic_dpi_panel_power_on(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r;
|
||||
struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
|
||||
struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
|
||||
struct panel_config *panel_config = drv_data->panel_config;
|
||||
|
||||
if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return 0;
|
||||
|
||||
r = omapdss_dpi_display_enable(dssdev);
|
||||
if (r)
|
||||
goto err0;
|
||||
|
||||
/* wait couple of vsyncs until enabling the LCD */
|
||||
if (panel_config->power_on_delay)
|
||||
msleep(panel_config->power_on_delay);
|
||||
|
||||
if (panel_data->platform_enable) {
|
||||
r = panel_data->platform_enable(dssdev);
|
||||
if (r)
|
||||
goto err1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err1:
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
err0:
|
||||
return r;
|
||||
}
|
||||
|
||||
static void generic_dpi_panel_power_off(struct omap_dss_device *dssdev)
|
||||
{
|
||||
struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
|
||||
struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
|
||||
struct panel_config *panel_config = drv_data->panel_config;
|
||||
|
||||
if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return;
|
||||
|
||||
if (panel_data->platform_disable)
|
||||
panel_data->platform_disable(dssdev);
|
||||
|
||||
/* wait couple of vsyncs after disabling the LCD */
|
||||
if (panel_config->power_off_delay)
|
||||
msleep(panel_config->power_off_delay);
|
||||
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
}
|
||||
|
||||
static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
|
||||
{
|
||||
struct panel_generic_dpi_data *panel_data = get_panel_data(dssdev);
|
||||
struct panel_config *panel_config = NULL;
|
||||
struct panel_drv_data *drv_data = NULL;
|
||||
int i;
|
||||
|
||||
dev_dbg(&dssdev->dev, "probe\n");
|
||||
|
||||
if (!panel_data || !panel_data->name)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(generic_dpi_panels); i++) {
|
||||
if (strcmp(panel_data->name, generic_dpi_panels[i].name) == 0) {
|
||||
panel_config = &generic_dpi_panels[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!panel_config)
|
||||
return -EINVAL;
|
||||
|
||||
dssdev->panel.config = panel_config->config;
|
||||
dssdev->panel.timings = panel_config->timings;
|
||||
dssdev->panel.acb = panel_config->acb;
|
||||
dssdev->panel.acbi = panel_config->acbi;
|
||||
|
||||
drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL);
|
||||
if (!drv_data)
|
||||
return -ENOMEM;
|
||||
|
||||
drv_data->dssdev = dssdev;
|
||||
drv_data->panel_config = panel_config;
|
||||
|
||||
dev_set_drvdata(&dssdev->dev, drv_data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void generic_dpi_panel_remove(struct omap_dss_device *dssdev)
|
||||
{
|
||||
struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
|
||||
|
||||
dev_dbg(&dssdev->dev, "remove\n");
|
||||
|
||||
kfree(drv_data);
|
||||
|
||||
dev_set_drvdata(&dssdev->dev, NULL);
|
||||
}
|
||||
|
||||
static int generic_dpi_panel_enable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = generic_dpi_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void generic_dpi_panel_disable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
generic_dpi_panel_power_off(dssdev);
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
|
||||
}
|
||||
|
||||
static int generic_dpi_panel_suspend(struct omap_dss_device *dssdev)
|
||||
{
|
||||
generic_dpi_panel_power_off(dssdev);
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int generic_dpi_panel_resume(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = generic_dpi_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void generic_dpi_panel_set_timings(struct omap_dss_device *dssdev,
|
||||
struct omap_video_timings *timings)
|
||||
{
|
||||
dpi_set_timings(dssdev, timings);
|
||||
}
|
||||
|
||||
static void generic_dpi_panel_get_timings(struct omap_dss_device *dssdev,
|
||||
struct omap_video_timings *timings)
|
||||
{
|
||||
*timings = dssdev->panel.timings;
|
||||
}
|
||||
|
||||
static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev,
|
||||
struct omap_video_timings *timings)
|
||||
{
|
||||
return dpi_check_timings(dssdev, timings);
|
||||
}
|
||||
|
||||
static struct omap_dss_driver dpi_driver = {
|
||||
.probe = generic_dpi_panel_probe,
|
||||
.remove = generic_dpi_panel_remove,
|
||||
|
||||
.enable = generic_dpi_panel_enable,
|
||||
.disable = generic_dpi_panel_disable,
|
||||
.suspend = generic_dpi_panel_suspend,
|
||||
.resume = generic_dpi_panel_resume,
|
||||
|
||||
.set_timings = generic_dpi_panel_set_timings,
|
||||
.get_timings = generic_dpi_panel_get_timings,
|
||||
.check_timings = generic_dpi_panel_check_timings,
|
||||
|
||||
.driver = {
|
||||
.name = "generic_dpi_panel",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init generic_dpi_panel_drv_init(void)
|
||||
{
|
||||
return omap_dss_register_driver(&dpi_driver);
|
||||
}
|
||||
|
||||
static void __exit generic_dpi_panel_drv_exit(void)
|
||||
{
|
||||
omap_dss_unregister_driver(&dpi_driver);
|
||||
}
|
||||
|
||||
module_init(generic_dpi_panel_drv_init);
|
||||
module_exit(generic_dpi_panel_drv_exit);
|
||||
MODULE_LICENSE("GPL");
|
@ -1,174 +0,0 @@
|
||||
/*
|
||||
* Generic panel support
|
||||
*
|
||||
* Copyright (C) 2008 Nokia Corporation
|
||||
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
||||
*
|
||||
* 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 <plat/display.h>
|
||||
|
||||
static struct omap_video_timings generic_panel_timings = {
|
||||
/* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */
|
||||
.x_res = 640,
|
||||
.y_res = 480,
|
||||
.pixel_clock = 23500,
|
||||
.hfp = 48,
|
||||
.hsw = 32,
|
||||
.hbp = 80,
|
||||
.vfp = 3,
|
||||
.vsw = 4,
|
||||
.vbp = 7,
|
||||
};
|
||||
|
||||
static int generic_panel_power_on(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return 0;
|
||||
|
||||
r = omapdss_dpi_display_enable(dssdev);
|
||||
if (r)
|
||||
goto err0;
|
||||
|
||||
if (dssdev->platform_enable) {
|
||||
r = dssdev->platform_enable(dssdev);
|
||||
if (r)
|
||||
goto err1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err1:
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
err0:
|
||||
return r;
|
||||
}
|
||||
|
||||
static void generic_panel_power_off(struct omap_dss_device *dssdev)
|
||||
{
|
||||
if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return;
|
||||
|
||||
if (dssdev->platform_disable)
|
||||
dssdev->platform_disable(dssdev);
|
||||
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
}
|
||||
|
||||
static int generic_panel_probe(struct omap_dss_device *dssdev)
|
||||
{
|
||||
dssdev->panel.config = OMAP_DSS_LCD_TFT;
|
||||
dssdev->panel.timings = generic_panel_timings;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void generic_panel_remove(struct omap_dss_device *dssdev)
|
||||
{
|
||||
}
|
||||
|
||||
static int generic_panel_enable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = generic_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void generic_panel_disable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
generic_panel_power_off(dssdev);
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
|
||||
}
|
||||
|
||||
static int generic_panel_suspend(struct omap_dss_device *dssdev)
|
||||
{
|
||||
generic_panel_power_off(dssdev);
|
||||
dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int generic_panel_resume(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = generic_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void generic_panel_set_timings(struct omap_dss_device *dssdev,
|
||||
struct omap_video_timings *timings)
|
||||
{
|
||||
dpi_set_timings(dssdev, timings);
|
||||
}
|
||||
|
||||
static void generic_panel_get_timings(struct omap_dss_device *dssdev,
|
||||
struct omap_video_timings *timings)
|
||||
{
|
||||
*timings = dssdev->panel.timings;
|
||||
}
|
||||
|
||||
static int generic_panel_check_timings(struct omap_dss_device *dssdev,
|
||||
struct omap_video_timings *timings)
|
||||
{
|
||||
return dpi_check_timings(dssdev, timings);
|
||||
}
|
||||
|
||||
static struct omap_dss_driver generic_driver = {
|
||||
.probe = generic_panel_probe,
|
||||
.remove = generic_panel_remove,
|
||||
|
||||
.enable = generic_panel_enable,
|
||||
.disable = generic_panel_disable,
|
||||
.suspend = generic_panel_suspend,
|
||||
.resume = generic_panel_resume,
|
||||
|
||||
.set_timings = generic_panel_set_timings,
|
||||
.get_timings = generic_panel_get_timings,
|
||||
.check_timings = generic_panel_check_timings,
|
||||
|
||||
.driver = {
|
||||
.name = "generic_panel",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init generic_panel_drv_init(void)
|
||||
{
|
||||
return omap_dss_register_driver(&generic_driver);
|
||||
}
|
||||
|
||||
static void __exit generic_panel_drv_exit(void)
|
||||
{
|
||||
omap_dss_unregister_driver(&generic_driver);
|
||||
}
|
||||
|
||||
module_init(generic_panel_drv_init);
|
||||
module_exit(generic_panel_drv_exit);
|
||||
MODULE_LICENSE("GPL");
|
325
drivers/video/omap2/displays/panel-nec-nl8048hl11-01b.c
Normal file
325
drivers/video/omap2/displays/panel-nec-nl8048hl11-01b.c
Normal file
@ -0,0 +1,325 @@
|
||||
/*
|
||||
* Support for NEC-nl8048hl11-01b panel driver
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments Inc.
|
||||
* Author: Erik Gilling <konkers@android.com>
|
||||
* 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 <linux/spi/spi.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <plat/display.h>
|
||||
|
||||
#define LCD_XRES 800
|
||||
#define LCD_YRES 480
|
||||
/*
|
||||
* NEC PIX Clock Ratings
|
||||
* MIN:21.8MHz TYP:23.8MHz MAX:25.7MHz
|
||||
*/
|
||||
#define LCD_PIXEL_CLOCK 23800
|
||||
|
||||
struct nec_8048_data {
|
||||
struct backlight_device *bl;
|
||||
};
|
||||
|
||||
static const struct {
|
||||
unsigned char addr;
|
||||
unsigned char dat;
|
||||
} nec_8048_init_seq[] = {
|
||||
{ 3, 0x01 }, { 0, 0x00 }, { 1, 0x01 }, { 4, 0x00 }, { 5, 0x14 },
|
||||
{ 6, 0x24 }, { 16, 0xD7 }, { 17, 0x00 }, { 18, 0x00 }, { 19, 0x55 },
|
||||
{ 20, 0x01 }, { 21, 0x70 }, { 22, 0x1E }, { 23, 0x25 }, { 24, 0x25 },
|
||||
{ 25, 0x02 }, { 26, 0x02 }, { 27, 0xA0 }, { 32, 0x2F }, { 33, 0x0F },
|
||||
{ 34, 0x0F }, { 35, 0x0F }, { 36, 0x0F }, { 37, 0x0F }, { 38, 0x0F },
|
||||
{ 39, 0x00 }, { 40, 0x02 }, { 41, 0x02 }, { 42, 0x02 }, { 43, 0x0F },
|
||||
{ 44, 0x0F }, { 45, 0x0F }, { 46, 0x0F }, { 47, 0x0F }, { 48, 0x0F },
|
||||
{ 49, 0x0F }, { 50, 0x00 }, { 51, 0x02 }, { 52, 0x02 }, { 53, 0x02 },
|
||||
{ 80, 0x0C }, { 83, 0x42 }, { 84, 0x42 }, { 85, 0x41 }, { 86, 0x14 },
|
||||
{ 89, 0x88 }, { 90, 0x01 }, { 91, 0x00 }, { 92, 0x02 }, { 93, 0x0C },
|
||||
{ 94, 0x1C }, { 95, 0x27 }, { 98, 0x49 }, { 99, 0x27 }, { 102, 0x76 },
|
||||
{ 103, 0x27 }, { 112, 0x01 }, { 113, 0x0E }, { 114, 0x02 },
|
||||
{ 115, 0x0C }, { 118, 0x0C }, { 121, 0x30 }, { 130, 0x00 },
|
||||
{ 131, 0x00 }, { 132, 0xFC }, { 134, 0x00 }, { 136, 0x00 },
|
||||
{ 138, 0x00 }, { 139, 0x00 }, { 140, 0x00 }, { 141, 0xFC },
|
||||
{ 143, 0x00 }, { 145, 0x00 }, { 147, 0x00 }, { 148, 0x00 },
|
||||
{ 149, 0x00 }, { 150, 0xFC }, { 152, 0x00 }, { 154, 0x00 },
|
||||
{ 156, 0x00 }, { 157, 0x00 }, { 2, 0x00 },
|
||||
};
|
||||
|
||||
/*
|
||||
* NEC NL8048HL11-01B Manual
|
||||
* defines HFB, HSW, HBP, VFP, VSW, VBP as shown below
|
||||
*/
|
||||
|
||||
static struct omap_video_timings nec_8048_panel_timings = {
|
||||
/* 800 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */
|
||||
.x_res = LCD_XRES,
|
||||
.y_res = LCD_YRES,
|
||||
.pixel_clock = LCD_PIXEL_CLOCK,
|
||||
.hfp = 6,
|
||||
.hsw = 1,
|
||||
.hbp = 4,
|
||||
.vfp = 3,
|
||||
.vsw = 1,
|
||||
.vbp = 4,
|
||||
};
|
||||
|
||||
static int nec_8048_bl_update_status(struct backlight_device *bl)
|
||||
{
|
||||
struct omap_dss_device *dssdev = dev_get_drvdata(&bl->dev);
|
||||
int level;
|
||||
|
||||
if (!dssdev->set_backlight)
|
||||
return -EINVAL;
|
||||
|
||||
if (bl->props.fb_blank == FB_BLANK_UNBLANK &&
|
||||
bl->props.power == FB_BLANK_UNBLANK)
|
||||
level = bl->props.brightness;
|
||||
else
|
||||
level = 0;
|
||||
|
||||
return dssdev->set_backlight(dssdev, level);
|
||||
}
|
||||
|
||||
static int nec_8048_bl_get_brightness(struct backlight_device *bl)
|
||||
{
|
||||
if (bl->props.fb_blank == FB_BLANK_UNBLANK &&
|
||||
bl->props.power == FB_BLANK_UNBLANK)
|
||||
return bl->props.brightness;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct backlight_ops nec_8048_bl_ops = {
|
||||
.get_brightness = nec_8048_bl_get_brightness,
|
||||
.update_status = nec_8048_bl_update_status,
|
||||
};
|
||||
|
||||
static int nec_8048_panel_probe(struct omap_dss_device *dssdev)
|
||||
{
|
||||
struct backlight_device *bl;
|
||||
struct nec_8048_data *necd;
|
||||
struct backlight_properties props;
|
||||
int r;
|
||||
|
||||
dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
|
||||
OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_RF |
|
||||
OMAP_DSS_LCD_ONOFF;
|
||||
dssdev->panel.timings = nec_8048_panel_timings;
|
||||
|
||||
necd = kzalloc(sizeof(*necd), GFP_KERNEL);
|
||||
if (!necd)
|
||||
return -ENOMEM;
|
||||
|
||||
dev_set_drvdata(&dssdev->dev, necd);
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.max_brightness = 255;
|
||||
|
||||
bl = backlight_device_register("nec-8048", &dssdev->dev, dssdev,
|
||||
&nec_8048_bl_ops, &props);
|
||||
if (IS_ERR(bl)) {
|
||||
r = PTR_ERR(bl);
|
||||
kfree(necd);
|
||||
return r;
|
||||
}
|
||||
necd->bl = bl;
|
||||
|
||||
bl->props.fb_blank = FB_BLANK_UNBLANK;
|
||||
bl->props.power = FB_BLANK_UNBLANK;
|
||||
bl->props.max_brightness = dssdev->max_backlight_level;
|
||||
bl->props.brightness = dssdev->max_backlight_level;
|
||||
|
||||
r = nec_8048_bl_update_status(bl);
|
||||
if (r < 0)
|
||||
dev_err(&dssdev->dev, "failed to set lcd brightness\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nec_8048_panel_remove(struct omap_dss_device *dssdev)
|
||||
{
|
||||
struct nec_8048_data *necd = dev_get_drvdata(&dssdev->dev);
|
||||
struct backlight_device *bl = necd->bl;
|
||||
|
||||
bl->props.power = FB_BLANK_POWERDOWN;
|
||||
nec_8048_bl_update_status(bl);
|
||||
backlight_device_unregister(bl);
|
||||
|
||||
kfree(necd);
|
||||
}
|
||||
|
||||
static int nec_8048_panel_enable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
struct nec_8048_data *necd = dev_get_drvdata(&dssdev->dev);
|
||||
struct backlight_device *bl = necd->bl;
|
||||
|
||||
if (dssdev->platform_enable) {
|
||||
r = dssdev->platform_enable(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = nec_8048_bl_update_status(bl);
|
||||
if (r < 0)
|
||||
dev_err(&dssdev->dev, "failed to set lcd brightness\n");
|
||||
|
||||
r = omapdss_dpi_display_enable(dssdev);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void nec_8048_panel_disable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
struct nec_8048_data *necd = dev_get_drvdata(&dssdev->dev);
|
||||
struct backlight_device *bl = necd->bl;
|
||||
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
|
||||
bl->props.brightness = 0;
|
||||
nec_8048_bl_update_status(bl);
|
||||
|
||||
if (dssdev->platform_disable)
|
||||
dssdev->platform_disable(dssdev);
|
||||
}
|
||||
|
||||
static int nec_8048_panel_suspend(struct omap_dss_device *dssdev)
|
||||
{
|
||||
nec_8048_panel_disable(dssdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nec_8048_panel_resume(struct omap_dss_device *dssdev)
|
||||
{
|
||||
return nec_8048_panel_enable(dssdev);
|
||||
}
|
||||
|
||||
static int nec_8048_recommended_bpp(struct omap_dss_device *dssdev)
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
|
||||
static struct omap_dss_driver nec_8048_driver = {
|
||||
.probe = nec_8048_panel_probe,
|
||||
.remove = nec_8048_panel_remove,
|
||||
.enable = nec_8048_panel_enable,
|
||||
.disable = nec_8048_panel_disable,
|
||||
.suspend = nec_8048_panel_suspend,
|
||||
.resume = nec_8048_panel_resume,
|
||||
.get_recommended_bpp = nec_8048_recommended_bpp,
|
||||
|
||||
.driver = {
|
||||
.name = "NEC_8048_panel",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int nec_8048_spi_send(struct spi_device *spi, unsigned char reg_addr,
|
||||
unsigned char reg_data)
|
||||
{
|
||||
int ret = 0;
|
||||
unsigned int cmd = 0, data = 0;
|
||||
|
||||
cmd = 0x0000 | reg_addr; /* register address write */
|
||||
data = 0x0100 | reg_data ; /* register data write */
|
||||
data = (cmd << 16) | data;
|
||||
|
||||
ret = spi_write(spi, (unsigned char *)&data, 4);
|
||||
if (ret)
|
||||
pr_err("error in spi_write %x\n", data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int init_nec_8048_wvga_lcd(struct spi_device *spi)
|
||||
{
|
||||
unsigned int i;
|
||||
/* Initialization Sequence */
|
||||
/* nec_8048_spi_send(spi, REG, VAL) */
|
||||
for (i = 0; i < (ARRAY_SIZE(nec_8048_init_seq) - 1); i++)
|
||||
nec_8048_spi_send(spi, nec_8048_init_seq[i].addr,
|
||||
nec_8048_init_seq[i].dat);
|
||||
udelay(20);
|
||||
nec_8048_spi_send(spi, nec_8048_init_seq[i].addr,
|
||||
nec_8048_init_seq[i].dat);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nec_8048_spi_probe(struct spi_device *spi)
|
||||
{
|
||||
spi->mode = SPI_MODE_0;
|
||||
spi->bits_per_word = 32;
|
||||
spi_setup(spi);
|
||||
|
||||
init_nec_8048_wvga_lcd(spi);
|
||||
|
||||
return omap_dss_register_driver(&nec_8048_driver);
|
||||
}
|
||||
|
||||
static int nec_8048_spi_remove(struct spi_device *spi)
|
||||
{
|
||||
omap_dss_unregister_driver(&nec_8048_driver);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nec_8048_spi_suspend(struct spi_device *spi, pm_message_t mesg)
|
||||
{
|
||||
nec_8048_spi_send(spi, 2, 0x01);
|
||||
mdelay(40);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nec_8048_spi_resume(struct spi_device *spi)
|
||||
{
|
||||
/* reinitialize the panel */
|
||||
spi_setup(spi);
|
||||
nec_8048_spi_send(spi, 2, 0x00);
|
||||
init_nec_8048_wvga_lcd(spi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct spi_driver nec_8048_spi_driver = {
|
||||
.probe = nec_8048_spi_probe,
|
||||
.remove = __devexit_p(nec_8048_spi_remove),
|
||||
.suspend = nec_8048_spi_suspend,
|
||||
.resume = nec_8048_spi_resume,
|
||||
.driver = {
|
||||
.name = "nec_8048_spi",
|
||||
.bus = &spi_bus_type,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init nec_8048_lcd_init(void)
|
||||
{
|
||||
return spi_register_driver(&nec_8048_spi_driver);
|
||||
}
|
||||
|
||||
static void __exit nec_8048_lcd_exit(void)
|
||||
{
|
||||
return spi_unregister_driver(&nec_8048_spi_driver);
|
||||
}
|
||||
|
||||
module_init(nec_8048_lcd_init);
|
||||
module_exit(nec_8048_lcd_exit);
|
||||
MODULE_AUTHOR("Erik Gilling <konkers@android.com>");
|
||||
MODULE_DESCRIPTION("NEC-nl8048hl11-01b Driver");
|
||||
MODULE_LICENSE("GPL");
|
@ -1,165 +0,0 @@
|
||||
/*
|
||||
* LCD panel driver for Sharp LQ043T1DG01
|
||||
*
|
||||
* Copyright (C) 2009 Texas Instruments Inc
|
||||
* Author: Vaibhav Hiremath <hvaibhav@ti.com>
|
||||
*
|
||||
* 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 <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <plat/display.h>
|
||||
|
||||
static struct omap_video_timings sharp_lq_timings = {
|
||||
.x_res = 480,
|
||||
.y_res = 272,
|
||||
|
||||
.pixel_clock = 9000,
|
||||
|
||||
.hsw = 42,
|
||||
.hfp = 3,
|
||||
.hbp = 2,
|
||||
|
||||
.vsw = 11,
|
||||
.vfp = 3,
|
||||
.vbp = 2,
|
||||
};
|
||||
|
||||
static int sharp_lq_panel_power_on(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return 0;
|
||||
|
||||
r = omapdss_dpi_display_enable(dssdev);
|
||||
if (r)
|
||||
goto err0;
|
||||
|
||||
/* wait couple of vsyncs until enabling the LCD */
|
||||
msleep(50);
|
||||
|
||||
if (dssdev->platform_enable) {
|
||||
r = dssdev->platform_enable(dssdev);
|
||||
if (r)
|
||||
goto err1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err1:
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
err0:
|
||||
return r;
|
||||
}
|
||||
|
||||
static void sharp_lq_panel_power_off(struct omap_dss_device *dssdev)
|
||||
{
|
||||
if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return;
|
||||
|
||||
if (dssdev->platform_disable)
|
||||
dssdev->platform_disable(dssdev);
|
||||
|
||||
/* wait at least 5 vsyncs after disabling the LCD */
|
||||
msleep(100);
|
||||
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
}
|
||||
|
||||
static int sharp_lq_panel_probe(struct omap_dss_device *dssdev)
|
||||
{
|
||||
|
||||
dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
|
||||
OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IEO;
|
||||
dssdev->panel.acb = 0x0;
|
||||
dssdev->panel.timings = sharp_lq_timings;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sharp_lq_panel_remove(struct omap_dss_device *dssdev)
|
||||
{
|
||||
}
|
||||
|
||||
static int sharp_lq_panel_enable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = sharp_lq_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void sharp_lq_panel_disable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
sharp_lq_panel_power_off(dssdev);
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
|
||||
}
|
||||
|
||||
static int sharp_lq_panel_suspend(struct omap_dss_device *dssdev)
|
||||
{
|
||||
sharp_lq_panel_power_off(dssdev);
|
||||
dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sharp_lq_panel_resume(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = sharp_lq_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct omap_dss_driver sharp_lq_driver = {
|
||||
.probe = sharp_lq_panel_probe,
|
||||
.remove = sharp_lq_panel_remove,
|
||||
|
||||
.enable = sharp_lq_panel_enable,
|
||||
.disable = sharp_lq_panel_disable,
|
||||
.suspend = sharp_lq_panel_suspend,
|
||||
.resume = sharp_lq_panel_resume,
|
||||
|
||||
.driver = {
|
||||
.name = "sharp_lq_panel",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init sharp_lq_panel_drv_init(void)
|
||||
{
|
||||
return omap_dss_register_driver(&sharp_lq_driver);
|
||||
}
|
||||
|
||||
static void __exit sharp_lq_panel_drv_exit(void)
|
||||
{
|
||||
omap_dss_unregister_driver(&sharp_lq_driver);
|
||||
}
|
||||
|
||||
module_init(sharp_lq_panel_drv_init);
|
||||
module_exit(sharp_lq_panel_drv_exit);
|
||||
MODULE_LICENSE("GPL");
|
@ -1,164 +0,0 @@
|
||||
/*
|
||||
* LCD panel driver for Toppoly TDO35S
|
||||
*
|
||||
* Copyright (C) 2009 CompuLab, Ltd.
|
||||
* Author: Mike Rapoport <mike@compulab.co.il>
|
||||
*
|
||||
* Based on generic panel support
|
||||
* Copyright (C) 2008 Nokia Corporation
|
||||
* Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
||||
*
|
||||
* 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 <plat/display.h>
|
||||
|
||||
static struct omap_video_timings toppoly_tdo_panel_timings = {
|
||||
/* 640 x 480 @ 60 Hz Reduced blanking VESA CVT 0.31M3-R */
|
||||
.x_res = 480,
|
||||
.y_res = 640,
|
||||
|
||||
.pixel_clock = 26000,
|
||||
|
||||
.hfp = 104,
|
||||
.hsw = 8,
|
||||
.hbp = 8,
|
||||
|
||||
.vfp = 4,
|
||||
.vsw = 2,
|
||||
.vbp = 2,
|
||||
};
|
||||
|
||||
static int toppoly_tdo_panel_power_on(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return 0;
|
||||
|
||||
r = omapdss_dpi_display_enable(dssdev);
|
||||
if (r)
|
||||
goto err0;
|
||||
|
||||
if (dssdev->platform_enable) {
|
||||
r = dssdev->platform_enable(dssdev);
|
||||
if (r)
|
||||
goto err1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err1:
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
err0:
|
||||
return r;
|
||||
}
|
||||
|
||||
static void toppoly_tdo_panel_power_off(struct omap_dss_device *dssdev)
|
||||
{
|
||||
if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
|
||||
return;
|
||||
|
||||
if (dssdev->platform_disable)
|
||||
dssdev->platform_disable(dssdev);
|
||||
|
||||
omapdss_dpi_display_disable(dssdev);
|
||||
}
|
||||
|
||||
static int toppoly_tdo_panel_probe(struct omap_dss_device *dssdev)
|
||||
{
|
||||
dssdev->panel.config = OMAP_DSS_LCD_TFT |
|
||||
OMAP_DSS_LCD_IVS |
|
||||
OMAP_DSS_LCD_IHS |
|
||||
OMAP_DSS_LCD_IPC |
|
||||
OMAP_DSS_LCD_ONOFF;
|
||||
|
||||
dssdev->panel.timings = toppoly_tdo_panel_timings;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void toppoly_tdo_panel_remove(struct omap_dss_device *dssdev)
|
||||
{
|
||||
}
|
||||
|
||||
static int toppoly_tdo_panel_enable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = toppoly_tdo_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void toppoly_tdo_panel_disable(struct omap_dss_device *dssdev)
|
||||
{
|
||||
toppoly_tdo_panel_power_off(dssdev);
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
|
||||
}
|
||||
|
||||
static int toppoly_tdo_panel_suspend(struct omap_dss_device *dssdev)
|
||||
{
|
||||
toppoly_tdo_panel_power_off(dssdev);
|
||||
dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int toppoly_tdo_panel_resume(struct omap_dss_device *dssdev)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
r = toppoly_tdo_panel_power_on(dssdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct omap_dss_driver generic_driver = {
|
||||
.probe = toppoly_tdo_panel_probe,
|
||||
.remove = toppoly_tdo_panel_remove,
|
||||
|
||||
.enable = toppoly_tdo_panel_enable,
|
||||
.disable = toppoly_tdo_panel_disable,
|
||||
.suspend = toppoly_tdo_panel_suspend,
|
||||
.resume = toppoly_tdo_panel_resume,
|
||||
|
||||
.driver = {
|
||||
.name = "toppoly_tdo35s_panel",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init toppoly_tdo_panel_drv_init(void)
|
||||
{
|
||||
return omap_dss_register_driver(&generic_driver);
|
||||
}
|
||||
|
||||
static void __exit toppoly_tdo_panel_drv_exit(void)
|
||||
{
|
||||
omap_dss_unregister_driver(&generic_driver);
|
||||
}
|
||||
|
||||
module_init(toppoly_tdo_panel_drv_init);
|
||||
module_exit(toppoly_tdo_panel_drv_exit);
|
||||
MODULE_LICENSE("GPL");
|
File diff suppressed because it is too large
Load Diff
@ -40,8 +40,9 @@ static struct {
|
||||
} dpi;
|
||||
|
||||
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
|
||||
static int dpi_set_dsi_clk(bool is_tft, unsigned long pck_req,
|
||||
unsigned long *fck, int *lck_div, int *pck_div)
|
||||
static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
|
||||
unsigned long pck_req, unsigned long *fck, int *lck_div,
|
||||
int *pck_div)
|
||||
{
|
||||
struct dsi_clock_info dsi_cinfo;
|
||||
struct dispc_clock_info dispc_cinfo;
|
||||
@ -58,7 +59,7 @@ static int dpi_set_dsi_clk(bool is_tft, unsigned long pck_req,
|
||||
|
||||
dss_select_dispc_clk_source(DSS_SRC_DSI1_PLL_FCLK);
|
||||
|
||||
r = dispc_set_clock_div(&dispc_cinfo);
|
||||
r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@ -69,8 +70,9 @@ static int dpi_set_dsi_clk(bool is_tft, unsigned long pck_req,
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int dpi_set_dispc_clk(bool is_tft, unsigned long pck_req,
|
||||
unsigned long *fck, int *lck_div, int *pck_div)
|
||||
static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft,
|
||||
unsigned long pck_req, unsigned long *fck, int *lck_div,
|
||||
int *pck_div)
|
||||
{
|
||||
struct dss_clock_info dss_cinfo;
|
||||
struct dispc_clock_info dispc_cinfo;
|
||||
@ -84,7 +86,7 @@ static int dpi_set_dispc_clk(bool is_tft, unsigned long pck_req,
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = dispc_set_clock_div(&dispc_cinfo);
|
||||
r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
@ -107,17 +109,17 @@ static int dpi_set_mode(struct omap_dss_device *dssdev)
|
||||
|
||||
dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
|
||||
|
||||
dispc_set_pol_freq(dssdev->panel.config, dssdev->panel.acbi,
|
||||
dssdev->panel.acb);
|
||||
dispc_set_pol_freq(dssdev->manager->id, dssdev->panel.config,
|
||||
dssdev->panel.acbi, dssdev->panel.acb);
|
||||
|
||||
is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
|
||||
|
||||
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
|
||||
r = dpi_set_dsi_clk(is_tft, t->pixel_clock * 1000,
|
||||
&fck, &lck_div, &pck_div);
|
||||
r = dpi_set_dsi_clk(dssdev, is_tft, t->pixel_clock * 1000, &fck,
|
||||
&lck_div, &pck_div);
|
||||
#else
|
||||
r = dpi_set_dispc_clk(is_tft, t->pixel_clock * 1000,
|
||||
&fck, &lck_div, &pck_div);
|
||||
r = dpi_set_dispc_clk(dssdev, is_tft, t->pixel_clock * 1000, &fck,
|
||||
&lck_div, &pck_div);
|
||||
#endif
|
||||
if (r)
|
||||
goto err0;
|
||||
@ -132,7 +134,7 @@ static int dpi_set_mode(struct omap_dss_device *dssdev)
|
||||
t->pixel_clock = pck;
|
||||
}
|
||||
|
||||
dispc_set_lcd_timings(t);
|
||||
dispc_set_lcd_timings(dssdev->manager->id, t);
|
||||
|
||||
err0:
|
||||
dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
|
||||
@ -145,10 +147,12 @@ static int dpi_basic_init(struct omap_dss_device *dssdev)
|
||||
|
||||
is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
|
||||
|
||||
dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS);
|
||||
dispc_set_lcd_display_type(is_tft ? OMAP_DSS_LCD_DISPLAY_TFT :
|
||||
OMAP_DSS_LCD_DISPLAY_STN);
|
||||
dispc_set_tft_data_lines(dssdev->phy.dpi.data_lines);
|
||||
dispc_set_parallel_interface_mode(dssdev->manager->id,
|
||||
OMAP_DSS_PARALLELMODE_BYPASS);
|
||||
dispc_set_lcd_display_type(dssdev->manager->id, is_tft ?
|
||||
OMAP_DSS_LCD_DISPLAY_TFT : OMAP_DSS_LCD_DISPLAY_STN);
|
||||
dispc_set_tft_data_lines(dssdev->manager->id,
|
||||
dssdev->phy.dpi.data_lines);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -234,7 +238,7 @@ void dpi_set_timings(struct omap_dss_device *dssdev,
|
||||
dssdev->panel.timings = *timings;
|
||||
if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
|
||||
dpi_set_mode(dssdev);
|
||||
dispc_go(OMAP_DSS_CHANNEL_LCD);
|
||||
dispc_go(dssdev->manager->id);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(dpi_set_timings);
|
||||
|
@ -792,7 +792,8 @@ static int dsi_pll_power(enum dsi_pll_power_state state)
|
||||
}
|
||||
|
||||
/* calculate clock rates using dividers in cinfo */
|
||||
static int dsi_calc_clock_rates(struct dsi_clock_info *cinfo)
|
||||
static int dsi_calc_clock_rates(struct omap_dss_device *dssdev,
|
||||
struct dsi_clock_info *cinfo)
|
||||
{
|
||||
if (cinfo->regn == 0 || cinfo->regn > REGN_MAX)
|
||||
return -EINVAL;
|
||||
@ -812,7 +813,7 @@ static int dsi_calc_clock_rates(struct dsi_clock_info *cinfo)
|
||||
* with DSS2_FCK source also */
|
||||
cinfo->highfreq = 0;
|
||||
} else {
|
||||
cinfo->clkin = dispc_pclk_rate();
|
||||
cinfo->clkin = dispc_pclk_rate(dssdev->manager->id);
|
||||
|
||||
if (cinfo->clkin < 32000000)
|
||||
cinfo->highfreq = 0;
|
||||
@ -1206,8 +1207,8 @@ void dsi_dump_clocks(struct seq_file *s)
|
||||
|
||||
seq_printf(s, "VP_CLK\t\t%lu\n"
|
||||
"VP_PCLK\t\t%lu\n",
|
||||
dispc_lclk_rate(),
|
||||
dispc_pclk_rate());
|
||||
dispc_lclk_rate(OMAP_DSS_CHANNEL_LCD),
|
||||
dispc_pclk_rate(OMAP_DSS_CHANNEL_LCD));
|
||||
|
||||
enable_clocks(0);
|
||||
}
|
||||
@ -2888,7 +2889,7 @@ int omap_dsi_prepare_update(struct omap_dss_device *dssdev,
|
||||
if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
|
||||
dss_setup_partial_planes(dssdev, x, y, w, h,
|
||||
enlarge_update_area);
|
||||
dispc_set_lcd_size(*w, *h);
|
||||
dispc_set_lcd_size(dssdev->manager->id, *w, *h);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2947,12 +2948,14 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
|
||||
return r;
|
||||
}
|
||||
|
||||
dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT);
|
||||
dispc_set_lcd_display_type(dssdev->manager->id,
|
||||
OMAP_DSS_LCD_DISPLAY_TFT);
|
||||
|
||||
dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_DSI);
|
||||
dispc_enable_fifohandcheck(1);
|
||||
dispc_set_parallel_interface_mode(dssdev->manager->id,
|
||||
OMAP_DSS_PARALLELMODE_DSI);
|
||||
dispc_enable_fifohandcheck(dssdev->manager->id, 1);
|
||||
|
||||
dispc_set_tft_data_lines(dssdev->ctrl.pixel_size);
|
||||
dispc_set_tft_data_lines(dssdev->manager->id, dssdev->ctrl.pixel_size);
|
||||
|
||||
{
|
||||
struct omap_video_timings timings = {
|
||||
@ -2964,7 +2967,7 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
|
||||
.vbp = 0,
|
||||
};
|
||||
|
||||
dispc_set_lcd_timings(&timings);
|
||||
dispc_set_lcd_timings(dssdev->manager->id, &timings);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -2987,7 +2990,7 @@ static int dsi_configure_dsi_clocks(struct omap_dss_device *dssdev)
|
||||
cinfo.regm = dssdev->phy.dsi.div.regm;
|
||||
cinfo.regm3 = dssdev->phy.dsi.div.regm3;
|
||||
cinfo.regm4 = dssdev->phy.dsi.div.regm4;
|
||||
r = dsi_calc_clock_rates(&cinfo);
|
||||
r = dsi_calc_clock_rates(dssdev, &cinfo);
|
||||
if (r) {
|
||||
DSSERR("Failed to calc dsi clocks\n");
|
||||
return r;
|
||||
@ -3019,7 +3022,7 @@ static int dsi_configure_dispc_clocks(struct omap_dss_device *dssdev)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = dispc_set_clock_div(&dispc_cinfo);
|
||||
r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo);
|
||||
if (r) {
|
||||
DSSERR("Failed to set dispc clocks\n");
|
||||
return r;
|
||||
|
@ -333,9 +333,9 @@ void dispc_disable_sidle(void);
|
||||
void dispc_lcd_enable_signal_polarity(bool act_high);
|
||||
void dispc_lcd_enable_signal(bool enable);
|
||||
void dispc_pck_free_enable(bool enable);
|
||||
void dispc_enable_fifohandcheck(bool enable);
|
||||
void dispc_enable_fifohandcheck(enum omap_channel channel, bool enable);
|
||||
|
||||
void dispc_set_lcd_size(u16 width, u16 height);
|
||||
void dispc_set_lcd_size(enum omap_channel channel, u16 width, u16 height);
|
||||
void dispc_set_digit_size(u16 width, u16 height);
|
||||
u32 dispc_get_plane_fifo_size(enum omap_plane plane);
|
||||
void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high);
|
||||
@ -359,7 +359,8 @@ int dispc_setup_plane(enum omap_plane plane,
|
||||
bool ilace,
|
||||
enum omap_dss_rotation_type rotation_type,
|
||||
u8 rotation, bool mirror,
|
||||
u8 global_alpha);
|
||||
u8 global_alpha, u8 pre_mult_alpha,
|
||||
enum omap_channel channel);
|
||||
|
||||
bool dispc_go_busy(enum omap_channel channel);
|
||||
void dispc_go(enum omap_channel channel);
|
||||
@ -368,9 +369,11 @@ bool dispc_is_channel_enabled(enum omap_channel channel);
|
||||
int dispc_enable_plane(enum omap_plane plane, bool enable);
|
||||
void dispc_enable_replication(enum omap_plane plane, bool enable);
|
||||
|
||||
void dispc_set_parallel_interface_mode(enum omap_parallel_interface_mode mode);
|
||||
void dispc_set_tft_data_lines(u8 data_lines);
|
||||
void dispc_set_lcd_display_type(enum omap_lcd_display_type type);
|
||||
void dispc_set_parallel_interface_mode(enum omap_channel channel,
|
||||
enum omap_parallel_interface_mode mode);
|
||||
void dispc_set_tft_data_lines(enum omap_channel channel, u8 data_lines);
|
||||
void dispc_set_lcd_display_type(enum omap_channel channel,
|
||||
enum omap_lcd_display_type type);
|
||||
void dispc_set_loadmode(enum omap_dss_load_mode mode);
|
||||
|
||||
void dispc_set_default_color(enum omap_channel channel, u32 color);
|
||||
@ -387,17 +390,21 @@ bool dispc_trans_key_enabled(enum omap_channel ch);
|
||||
bool dispc_alpha_blending_enabled(enum omap_channel ch);
|
||||
|
||||
bool dispc_lcd_timings_ok(struct omap_video_timings *timings);
|
||||
void dispc_set_lcd_timings(struct omap_video_timings *timings);
|
||||
void dispc_set_lcd_timings(enum omap_channel channel,
|
||||
struct omap_video_timings *timings);
|
||||
unsigned long dispc_fclk_rate(void);
|
||||
unsigned long dispc_lclk_rate(void);
|
||||
unsigned long dispc_pclk_rate(void);
|
||||
void dispc_set_pol_freq(enum omap_panel_config config, u8 acbi, u8 acb);
|
||||
unsigned long dispc_lclk_rate(enum omap_channel channel);
|
||||
unsigned long dispc_pclk_rate(enum omap_channel channel);
|
||||
void dispc_set_pol_freq(enum omap_channel channel,
|
||||
enum omap_panel_config config, u8 acbi, u8 acb);
|
||||
void dispc_find_clk_divs(bool is_tft, unsigned long req_pck, unsigned long fck,
|
||||
struct dispc_clock_info *cinfo);
|
||||
int dispc_calc_clock_rates(unsigned long dispc_fclk_rate,
|
||||
struct dispc_clock_info *cinfo);
|
||||
int dispc_set_clock_div(struct dispc_clock_info *cinfo);
|
||||
int dispc_get_clock_div(struct dispc_clock_info *cinfo);
|
||||
int dispc_set_clock_div(enum omap_channel channel,
|
||||
struct dispc_clock_info *cinfo);
|
||||
int dispc_get_clock_div(enum omap_channel channel,
|
||||
struct dispc_clock_info *cinfo);
|
||||
|
||||
|
||||
/* VENC */
|
||||
@ -424,8 +431,8 @@ void rfbi_dump_regs(struct seq_file *s);
|
||||
|
||||
int rfbi_configure(int rfbi_module, int bpp, int lines);
|
||||
void rfbi_enable_rfbi(bool enable);
|
||||
void rfbi_transfer_area(u16 width, u16 height,
|
||||
void (callback)(void *data), void *data);
|
||||
void rfbi_transfer_area(struct omap_dss_device *dssdev, u16 width,
|
||||
u16 height, void (callback)(void *data), void *data);
|
||||
void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t);
|
||||
unsigned long rfbi_get_max_tx_rate(void);
|
||||
int rfbi_init_display(struct omap_dss_device *display);
|
||||
|
@ -82,6 +82,18 @@ static const enum omap_display_type omap3_dss_supported_displays[] = {
|
||||
OMAP_DISPLAY_TYPE_VENC,
|
||||
};
|
||||
|
||||
static const enum omap_display_type omap4_dss_supported_displays[] = {
|
||||
/* OMAP_DSS_CHANNEL_LCD */
|
||||
OMAP_DISPLAY_TYPE_DBI | OMAP_DISPLAY_TYPE_DSI,
|
||||
|
||||
/* OMAP_DSS_CHANNEL_DIGIT */
|
||||
OMAP_DISPLAY_TYPE_VENC,
|
||||
|
||||
/* OMAP_DSS_CHANNEL_LCD2 */
|
||||
OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI |
|
||||
OMAP_DISPLAY_TYPE_DSI,
|
||||
};
|
||||
|
||||
static const enum omap_color_mode omap2_dss_supported_color_modes[] = {
|
||||
/* OMAP_DSS_GFX */
|
||||
OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 |
|
||||
@ -127,6 +139,10 @@ static struct omap_dss_features omap2_dss_features = {
|
||||
.reg_fields = omap2_dss_reg_fields,
|
||||
.num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields),
|
||||
|
||||
.has_feature =
|
||||
FEAT_LCDENABLEPOL | FEAT_LCDENABLESIGNAL |
|
||||
FEAT_PCKFREEENABLE | FEAT_FUNCGATED,
|
||||
|
||||
.num_mgrs = 2,
|
||||
.num_ovls = 3,
|
||||
.supported_displays = omap2_dss_supported_displays,
|
||||
@ -134,11 +150,14 @@ static struct omap_dss_features omap2_dss_features = {
|
||||
};
|
||||
|
||||
/* OMAP3 DSS Features */
|
||||
static struct omap_dss_features omap3_dss_features = {
|
||||
static struct omap_dss_features omap3430_dss_features = {
|
||||
.reg_fields = omap3_dss_reg_fields,
|
||||
.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
|
||||
|
||||
.has_feature = FEAT_GLOBAL_ALPHA,
|
||||
.has_feature =
|
||||
FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL |
|
||||
FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE |
|
||||
FEAT_FUNCGATED,
|
||||
|
||||
.num_mgrs = 2,
|
||||
.num_ovls = 3,
|
||||
@ -146,6 +165,36 @@ static struct omap_dss_features omap3_dss_features = {
|
||||
.supported_color_modes = omap3_dss_supported_color_modes,
|
||||
};
|
||||
|
||||
static struct omap_dss_features omap3630_dss_features = {
|
||||
.reg_fields = omap3_dss_reg_fields,
|
||||
.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
|
||||
|
||||
.has_feature =
|
||||
FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL |
|
||||
FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE |
|
||||
FEAT_PRE_MULT_ALPHA | FEAT_FUNCGATED,
|
||||
|
||||
.num_mgrs = 2,
|
||||
.num_ovls = 3,
|
||||
.supported_displays = omap3_dss_supported_displays,
|
||||
.supported_color_modes = omap3_dss_supported_color_modes,
|
||||
};
|
||||
|
||||
/* OMAP4 DSS Features */
|
||||
static struct omap_dss_features omap4_dss_features = {
|
||||
.reg_fields = omap3_dss_reg_fields,
|
||||
.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
|
||||
|
||||
.has_feature =
|
||||
FEAT_GLOBAL_ALPHA | FEAT_PRE_MULT_ALPHA |
|
||||
FEAT_MGR_LCD2,
|
||||
|
||||
.num_mgrs = 3,
|
||||
.num_ovls = 3,
|
||||
.supported_displays = omap4_dss_supported_displays,
|
||||
.supported_color_modes = omap3_dss_supported_color_modes,
|
||||
};
|
||||
|
||||
/* Functions returning values related to a DSS feature */
|
||||
int dss_feat_get_num_mgrs(void)
|
||||
{
|
||||
@ -167,6 +216,13 @@ enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane)
|
||||
return omap_current_dss_features->supported_color_modes[plane];
|
||||
}
|
||||
|
||||
bool dss_feat_color_mode_supported(enum omap_plane plane,
|
||||
enum omap_color_mode color_mode)
|
||||
{
|
||||
return omap_current_dss_features->supported_color_modes[plane] &
|
||||
color_mode;
|
||||
}
|
||||
|
||||
/* DSS has_feature check */
|
||||
bool dss_has_feature(enum dss_feat_id id)
|
||||
{
|
||||
@ -186,6 +242,10 @@ void dss_features_init(void)
|
||||
{
|
||||
if (cpu_is_omap24xx())
|
||||
omap_current_dss_features = &omap2_dss_features;
|
||||
else if (cpu_is_omap3630())
|
||||
omap_current_dss_features = &omap3630_dss_features;
|
||||
else if (cpu_is_omap34xx())
|
||||
omap_current_dss_features = &omap3430_dss_features;
|
||||
else
|
||||
omap_current_dss_features = &omap3_dss_features;
|
||||
omap_current_dss_features = &omap4_dss_features;
|
||||
}
|
||||
|
@ -20,13 +20,19 @@
|
||||
#ifndef __OMAP2_DSS_FEATURES_H
|
||||
#define __OMAP2_DSS_FEATURES_H
|
||||
|
||||
#define MAX_DSS_MANAGERS 2
|
||||
#define MAX_DSS_MANAGERS 3
|
||||
#define MAX_DSS_OVERLAYS 3
|
||||
|
||||
/* DSS has feature id */
|
||||
enum dss_feat_id {
|
||||
FEAT_GLOBAL_ALPHA = 1 << 0,
|
||||
FEAT_GLOBAL_ALPHA_VID1 = 1 << 1,
|
||||
FEAT_PRE_MULT_ALPHA = 1 << 2,
|
||||
FEAT_LCDENABLEPOL = 1 << 3,
|
||||
FEAT_LCDENABLESIGNAL = 1 << 4,
|
||||
FEAT_PCKFREEENABLE = 1 << 5,
|
||||
FEAT_FUNCGATED = 1 << 6,
|
||||
FEAT_MGR_LCD2 = 1 << 7,
|
||||
};
|
||||
|
||||
/* DSS register field id */
|
||||
@ -43,6 +49,8 @@ int dss_feat_get_num_mgrs(void);
|
||||
int dss_feat_get_num_ovls(void);
|
||||
enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel);
|
||||
enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane);
|
||||
bool dss_feat_color_mode_supported(enum omap_plane plane,
|
||||
enum omap_color_mode color_mode);
|
||||
|
||||
bool dss_has_feature(enum dss_feat_id id);
|
||||
void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end);
|
||||
|
@ -406,6 +406,7 @@ struct overlay_cache_data {
|
||||
u16 out_width; /* if 0, out_width == width */
|
||||
u16 out_height; /* if 0, out_height == height */
|
||||
u8 global_alpha;
|
||||
u8 pre_mult_alpha;
|
||||
|
||||
enum omap_channel channel;
|
||||
bool replication;
|
||||
@ -512,11 +513,14 @@ static int dss_mgr_wait_for_vsync(struct omap_overlay_manager *mgr)
|
||||
unsigned long timeout = msecs_to_jiffies(500);
|
||||
u32 irq;
|
||||
|
||||
if (mgr->device->type == OMAP_DISPLAY_TYPE_VENC)
|
||||
if (mgr->device->type == OMAP_DISPLAY_TYPE_VENC) {
|
||||
irq = DISPC_IRQ_EVSYNC_ODD;
|
||||
else
|
||||
irq = DISPC_IRQ_VSYNC;
|
||||
|
||||
} else {
|
||||
if (mgr->id == OMAP_DSS_CHANNEL_LCD)
|
||||
irq = DISPC_IRQ_VSYNC;
|
||||
else
|
||||
irq = DISPC_IRQ_VSYNC2;
|
||||
}
|
||||
return omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
|
||||
}
|
||||
|
||||
@ -524,7 +528,6 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
|
||||
{
|
||||
unsigned long timeout = msecs_to_jiffies(500);
|
||||
struct manager_cache_data *mc;
|
||||
enum omap_channel channel;
|
||||
u32 irq;
|
||||
int r;
|
||||
int i;
|
||||
@ -535,7 +538,6 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
|
||||
|
||||
if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) {
|
||||
irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
|
||||
channel = OMAP_DSS_CHANNEL_DIGIT;
|
||||
} else {
|
||||
if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
|
||||
enum omap_dss_update_mode mode;
|
||||
@ -543,11 +545,14 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
|
||||
if (mode != OMAP_DSS_UPDATE_AUTO)
|
||||
return 0;
|
||||
|
||||
irq = DISPC_IRQ_FRAMEDONE;
|
||||
irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
|
||||
DISPC_IRQ_FRAMEDONE
|
||||
: DISPC_IRQ_FRAMEDONE2;
|
||||
} else {
|
||||
irq = DISPC_IRQ_VSYNC;
|
||||
irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
|
||||
DISPC_IRQ_VSYNC
|
||||
: DISPC_IRQ_VSYNC2;
|
||||
}
|
||||
channel = OMAP_DSS_CHANNEL_LCD;
|
||||
}
|
||||
|
||||
mc = &dss_cache.manager_cache[mgr->id];
|
||||
@ -594,7 +599,6 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
|
||||
int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
|
||||
{
|
||||
unsigned long timeout = msecs_to_jiffies(500);
|
||||
enum omap_channel channel;
|
||||
struct overlay_cache_data *oc;
|
||||
struct omap_dss_device *dssdev;
|
||||
u32 irq;
|
||||
@ -611,7 +615,6 @@ int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
|
||||
|
||||
if (dssdev->type == OMAP_DISPLAY_TYPE_VENC) {
|
||||
irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
|
||||
channel = OMAP_DSS_CHANNEL_DIGIT;
|
||||
} else {
|
||||
if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
|
||||
enum omap_dss_update_mode mode;
|
||||
@ -619,11 +622,14 @@ int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
|
||||
if (mode != OMAP_DSS_UPDATE_AUTO)
|
||||
return 0;
|
||||
|
||||
irq = DISPC_IRQ_FRAMEDONE;
|
||||
irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
|
||||
DISPC_IRQ_FRAMEDONE
|
||||
: DISPC_IRQ_FRAMEDONE2;
|
||||
} else {
|
||||
irq = DISPC_IRQ_VSYNC;
|
||||
irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
|
||||
DISPC_IRQ_VSYNC
|
||||
: DISPC_IRQ_VSYNC2;
|
||||
}
|
||||
channel = OMAP_DSS_CHANNEL_LCD;
|
||||
}
|
||||
|
||||
oc = &dss_cache.overlay_cache[ovl->id];
|
||||
@ -842,7 +848,9 @@ static int configure_overlay(enum omap_plane plane)
|
||||
c->rotation_type,
|
||||
c->rotation,
|
||||
c->mirror,
|
||||
c->global_alpha);
|
||||
c->global_alpha,
|
||||
c->pre_mult_alpha,
|
||||
c->channel);
|
||||
|
||||
if (r) {
|
||||
/* this shouldn't happen */
|
||||
@ -894,10 +902,10 @@ static int configure_dispc(void)
|
||||
r = 0;
|
||||
busy = false;
|
||||
|
||||
mgr_busy[0] = dispc_go_busy(0);
|
||||
mgr_busy[1] = dispc_go_busy(1);
|
||||
mgr_go[0] = false;
|
||||
mgr_go[1] = false;
|
||||
for (i = 0; i < num_mgrs; i++) {
|
||||
mgr_busy[i] = dispc_go_busy(i);
|
||||
mgr_go[i] = false;
|
||||
}
|
||||
|
||||
/* Commit overlay settings */
|
||||
for (i = 0; i < num_ovls; ++i) {
|
||||
@ -1156,9 +1164,10 @@ static void dss_apply_irq_handler(void *data, u32 mask)
|
||||
const int num_mgrs = dss_feat_get_num_mgrs();
|
||||
int i, r;
|
||||
bool mgr_busy[MAX_DSS_MANAGERS];
|
||||
u32 irq_mask;
|
||||
|
||||
mgr_busy[0] = dispc_go_busy(0);
|
||||
mgr_busy[1] = dispc_go_busy(1);
|
||||
for (i = 0; i < num_mgrs; i++)
|
||||
mgr_busy[i] = dispc_go_busy(i);
|
||||
|
||||
spin_lock(&dss_cache.lock);
|
||||
|
||||
@ -1179,8 +1188,8 @@ static void dss_apply_irq_handler(void *data, u32 mask)
|
||||
goto end;
|
||||
|
||||
/* re-read busy flags */
|
||||
mgr_busy[0] = dispc_go_busy(0);
|
||||
mgr_busy[1] = dispc_go_busy(1);
|
||||
for (i = 0; i < num_mgrs; i++)
|
||||
mgr_busy[i] = dispc_go_busy(i);
|
||||
|
||||
/* keep running as long as there are busy managers, so that
|
||||
* we can collect overlay-applied information */
|
||||
@ -1189,9 +1198,12 @@ static void dss_apply_irq_handler(void *data, u32 mask)
|
||||
goto end;
|
||||
}
|
||||
|
||||
omap_dispc_unregister_isr(dss_apply_irq_handler, NULL,
|
||||
DISPC_IRQ_VSYNC | DISPC_IRQ_EVSYNC_ODD |
|
||||
DISPC_IRQ_EVSYNC_EVEN);
|
||||
irq_mask = DISPC_IRQ_VSYNC | DISPC_IRQ_EVSYNC_ODD |
|
||||
DISPC_IRQ_EVSYNC_EVEN;
|
||||
if (dss_has_feature(FEAT_MGR_LCD2))
|
||||
irq_mask |= DISPC_IRQ_VSYNC2;
|
||||
|
||||
omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, irq_mask);
|
||||
dss_cache.irq_enabled = false;
|
||||
|
||||
end:
|
||||
@ -1265,6 +1277,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
|
||||
oc->out_width = ovl->info.out_width;
|
||||
oc->out_height = ovl->info.out_height;
|
||||
oc->global_alpha = ovl->info.global_alpha;
|
||||
oc->pre_mult_alpha = ovl->info.pre_mult_alpha;
|
||||
|
||||
oc->replication =
|
||||
dss_use_replication(dssdev, ovl->info.color_mode);
|
||||
@ -1383,9 +1396,14 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
|
||||
r = 0;
|
||||
dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
|
||||
if (!dss_cache.irq_enabled) {
|
||||
r = omap_dispc_register_isr(dss_apply_irq_handler, NULL,
|
||||
DISPC_IRQ_VSYNC | DISPC_IRQ_EVSYNC_ODD |
|
||||
DISPC_IRQ_EVSYNC_EVEN);
|
||||
u32 mask;
|
||||
|
||||
mask = DISPC_IRQ_VSYNC | DISPC_IRQ_EVSYNC_ODD |
|
||||
DISPC_IRQ_EVSYNC_EVEN;
|
||||
if (dss_has_feature(FEAT_MGR_LCD2))
|
||||
mask |= DISPC_IRQ_VSYNC2;
|
||||
|
||||
r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask);
|
||||
dss_cache.irq_enabled = true;
|
||||
}
|
||||
configure_dispc();
|
||||
@ -1477,6 +1495,10 @@ int dss_init_overlay_managers(struct platform_device *pdev)
|
||||
mgr->name = "tv";
|
||||
mgr->id = OMAP_DSS_CHANNEL_DIGIT;
|
||||
break;
|
||||
case 2:
|
||||
mgr->name = "lcd2";
|
||||
mgr->id = OMAP_DSS_CHANNEL_LCD2;
|
||||
break;
|
||||
}
|
||||
|
||||
mgr->set_device = &omap_dss_set_device;
|
||||
|
@ -257,6 +257,43 @@ static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl,
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t overlay_pre_mult_alpha_show(struct omap_overlay *ovl,
|
||||
char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
ovl->info.pre_mult_alpha);
|
||||
}
|
||||
|
||||
static ssize_t overlay_pre_mult_alpha_store(struct omap_overlay *ovl,
|
||||
const char *buf, size_t size)
|
||||
{
|
||||
int r;
|
||||
struct omap_overlay_info info;
|
||||
|
||||
ovl->get_overlay_info(ovl, &info);
|
||||
|
||||
/* only GFX and Video2 plane support pre alpha multiplied
|
||||
* set zero for Video1 plane
|
||||
*/
|
||||
if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) &&
|
||||
ovl->id == OMAP_DSS_VIDEO1)
|
||||
info.pre_mult_alpha = 0;
|
||||
else
|
||||
info.pre_mult_alpha = simple_strtoul(buf, NULL, 10);
|
||||
|
||||
r = ovl->set_overlay_info(ovl, &info);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
if (ovl->manager) {
|
||||
r = ovl->manager->apply(ovl->manager);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
struct overlay_attribute {
|
||||
struct attribute attr;
|
||||
ssize_t (*show)(struct omap_overlay *, char *);
|
||||
@ -280,6 +317,9 @@ static OVERLAY_ATTR(enabled, S_IRUGO|S_IWUSR,
|
||||
overlay_enabled_show, overlay_enabled_store);
|
||||
static OVERLAY_ATTR(global_alpha, S_IRUGO|S_IWUSR,
|
||||
overlay_global_alpha_show, overlay_global_alpha_store);
|
||||
static OVERLAY_ATTR(pre_mult_alpha, S_IRUGO|S_IWUSR,
|
||||
overlay_pre_mult_alpha_show,
|
||||
overlay_pre_mult_alpha_store);
|
||||
|
||||
static struct attribute *overlay_sysfs_attrs[] = {
|
||||
&overlay_attr_name.attr,
|
||||
@ -290,6 +330,7 @@ static struct attribute *overlay_sysfs_attrs[] = {
|
||||
&overlay_attr_output_size.attr,
|
||||
&overlay_attr_enabled.attr,
|
||||
&overlay_attr_global_alpha.attr,
|
||||
&overlay_attr_pre_mult_alpha.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -623,12 +664,22 @@ void dss_recheck_connections(struct omap_dss_device *dssdev, bool force)
|
||||
int i;
|
||||
struct omap_overlay_manager *lcd_mgr;
|
||||
struct omap_overlay_manager *tv_mgr;
|
||||
struct omap_overlay_manager *lcd2_mgr = NULL;
|
||||
struct omap_overlay_manager *mgr = NULL;
|
||||
|
||||
lcd_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD);
|
||||
tv_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_TV);
|
||||
if (dss_has_feature(FEAT_MGR_LCD2))
|
||||
lcd2_mgr = omap_dss_get_overlay_manager(OMAP_DSS_OVL_MGR_LCD2);
|
||||
|
||||
if (dssdev->type != OMAP_DISPLAY_TYPE_VENC) {
|
||||
if (dssdev->channel == OMAP_DSS_CHANNEL_LCD2) {
|
||||
if (!lcd2_mgr->device || force) {
|
||||
if (lcd2_mgr->device)
|
||||
lcd2_mgr->unset_device(lcd2_mgr);
|
||||
lcd2_mgr->set_device(lcd2_mgr, dssdev);
|
||||
mgr = lcd2_mgr;
|
||||
}
|
||||
} else if (dssdev->type != OMAP_DISPLAY_TYPE_VENC) {
|
||||
if (!lcd_mgr->device || force) {
|
||||
if (lcd_mgr->device)
|
||||
lcd_mgr->unset_device(lcd_mgr);
|
||||
|
@ -301,8 +301,8 @@ void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width,
|
||||
}
|
||||
EXPORT_SYMBOL(omap_rfbi_write_pixels);
|
||||
|
||||
void rfbi_transfer_area(u16 width, u16 height,
|
||||
void (callback)(void *data), void *data)
|
||||
void rfbi_transfer_area(struct omap_dss_device *dssdev, u16 width,
|
||||
u16 height, void (*callback)(void *data), void *data)
|
||||
{
|
||||
u32 l;
|
||||
|
||||
@ -311,9 +311,9 @@ void rfbi_transfer_area(u16 width, u16 height,
|
||||
|
||||
DSSDBG("rfbi_transfer_area %dx%d\n", width, height);
|
||||
|
||||
dispc_set_lcd_size(width, height);
|
||||
dispc_set_lcd_size(dssdev->manager->id, width, height);
|
||||
|
||||
dispc_enable_channel(OMAP_DSS_CHANNEL_LCD, true);
|
||||
dispc_enable_channel(dssdev->manager->id, true);
|
||||
|
||||
rfbi.framedone_callback = callback;
|
||||
rfbi.framedone_callback_data = data;
|
||||
@ -887,7 +887,7 @@ int omap_rfbi_prepare_update(struct omap_dss_device *dssdev,
|
||||
|
||||
if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
|
||||
dss_setup_partial_planes(dssdev, x, y, w, h, true);
|
||||
dispc_set_lcd_size(*w, *h);
|
||||
dispc_set_lcd_size(dssdev->manager->id, *w, *h);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -899,7 +899,7 @@ int omap_rfbi_update(struct omap_dss_device *dssdev,
|
||||
void (*callback)(void *), void *data)
|
||||
{
|
||||
if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
|
||||
rfbi_transfer_area(w, h, callback, data);
|
||||
rfbi_transfer_area(dssdev, w, h, callback, data);
|
||||
} else {
|
||||
struct omap_overlay *ovl;
|
||||
void __iomem *addr;
|
||||
@ -1018,11 +1018,13 @@ int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev)
|
||||
goto err1;
|
||||
}
|
||||
|
||||
dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT);
|
||||
dispc_set_lcd_display_type(dssdev->manager->id,
|
||||
OMAP_DSS_LCD_DISPLAY_TFT);
|
||||
|
||||
dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_RFBI);
|
||||
dispc_set_parallel_interface_mode(dssdev->manager->id,
|
||||
OMAP_DSS_PARALLELMODE_RFBI);
|
||||
|
||||
dispc_set_tft_data_lines(dssdev->ctrl.pixel_size);
|
||||
dispc_set_tft_data_lines(dssdev->manager->id, dssdev->ctrl.pixel_size);
|
||||
|
||||
rfbi_configure(dssdev->phy.rfbi.channel,
|
||||
dssdev->ctrl.pixel_size,
|
||||
|
@ -35,12 +35,16 @@ static struct {
|
||||
struct regulator *vdds_sdi_reg;
|
||||
} sdi;
|
||||
|
||||
static void sdi_basic_init(void)
|
||||
{
|
||||
dispc_set_parallel_interface_mode(OMAP_DSS_PARALLELMODE_BYPASS);
|
||||
static void sdi_basic_init(struct omap_dss_device *dssdev)
|
||||
|
||||
dispc_set_lcd_display_type(OMAP_DSS_LCD_DISPLAY_TFT);
|
||||
dispc_set_tft_data_lines(24);
|
||||
{
|
||||
dispc_set_parallel_interface_mode(dssdev->manager->id,
|
||||
OMAP_DSS_PARALLELMODE_BYPASS);
|
||||
|
||||
dispc_set_lcd_display_type(dssdev->manager->id,
|
||||
OMAP_DSS_LCD_DISPLAY_TFT);
|
||||
|
||||
dispc_set_tft_data_lines(dssdev->manager->id, 24);
|
||||
dispc_lcd_enable_signal_polarity(1);
|
||||
}
|
||||
|
||||
@ -68,20 +72,20 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev)
|
||||
if (!sdi.skip_init)
|
||||
dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
|
||||
|
||||
sdi_basic_init();
|
||||
sdi_basic_init(dssdev);
|
||||
|
||||
/* 15.5.9.1.2 */
|
||||
dssdev->panel.config |= OMAP_DSS_LCD_RF | OMAP_DSS_LCD_ONOFF;
|
||||
|
||||
dispc_set_pol_freq(dssdev->panel.config, dssdev->panel.acbi,
|
||||
dssdev->panel.acb);
|
||||
dispc_set_pol_freq(dssdev->manager->id, dssdev->panel.config,
|
||||
dssdev->panel.acbi, dssdev->panel.acb);
|
||||
|
||||
if (!sdi.skip_init) {
|
||||
r = dss_calc_clock_div(1, t->pixel_clock * 1000,
|
||||
&dss_cinfo, &dispc_cinfo);
|
||||
} else {
|
||||
r = dss_get_clock_div(&dss_cinfo);
|
||||
r = dispc_get_clock_div(&dispc_cinfo);
|
||||
r = dispc_get_clock_div(dssdev->manager->id, &dispc_cinfo);
|
||||
}
|
||||
|
||||
if (r)
|
||||
@ -102,13 +106,13 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev)
|
||||
}
|
||||
|
||||
|
||||
dispc_set_lcd_timings(t);
|
||||
dispc_set_lcd_timings(dssdev->manager->id, t);
|
||||
|
||||
r = dss_set_clock_div(&dss_cinfo);
|
||||
if (r)
|
||||
goto err2;
|
||||
|
||||
r = dispc_set_clock_div(&dispc_cinfo);
|
||||
r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo);
|
||||
if (r)
|
||||
goto err2;
|
||||
|
||||
|
@ -2132,8 +2132,9 @@ static int omapfb_parse_def_modes(struct omapfb2_device *fbdev)
|
||||
char *str, *options, *this_opt;
|
||||
int r = 0;
|
||||
|
||||
str = kmalloc(strlen(def_mode) + 1, GFP_KERNEL);
|
||||
strcpy(str, def_mode);
|
||||
str = kstrdup(def_mode, GFP_KERNEL);
|
||||
if (!str)
|
||||
return -ENOMEM;
|
||||
options = str;
|
||||
|
||||
while (!r && (this_opt = strsep(&options, ",")) != NULL) {
|
||||
|
Loading…
Reference in New Issue
Block a user