Commit a6b5825a authored by Paul Mundt's avatar Paul Mundt

Merge branch 'for-paul' of git://gitorious.org/linux-omap-dss2/linux

Conflicts:
	drivers/video/omap2/dss/dsi.c
	drivers/video/omap2/dss/dss_features.c
	drivers/video/omap2/dss/dss_features.h
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parents 9fb4c7fb 0d66cbb5
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
#include <plat/common.h> #include <plat/common.h>
#include <plat/dma.h> #include <plat/dma.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include <plat/gpmc-smc91x.h> #include <plat/gpmc-smc91x.h>
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/mmc.h> #include <plat/mmc.h>
#include <plat/omap4-keypad.h> #include <plat/omap4-keypad.h>
#include <plat/display.h> #include <video/omapdss.h>
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
...@@ -680,6 +680,15 @@ static struct omap_dss_device sdp4430_hdmi_device = { ...@@ -680,6 +680,15 @@ static struct omap_dss_device sdp4430_hdmi_device = {
.name = "hdmi", .name = "hdmi",
.driver_name = "hdmi_panel", .driver_name = "hdmi_panel",
.type = OMAP_DISPLAY_TYPE_HDMI, .type = OMAP_DISPLAY_TYPE_HDMI,
.clocks = {
.dispc = {
.dispc_fclk_src = OMAP_DSS_CLK_SRC_FCK,
},
.hdmi = {
.regn = 15,
.regm2 = 1,
},
},
.platform_enable = sdp4430_panel_enable_hdmi, .platform_enable = sdp4430_panel_enable_hdmi,
.platform_disable = sdp4430_panel_disable_hdmi, .platform_disable = sdp4430_panel_disable_hdmi,
.channel = OMAP_DSS_CHANNEL_DIGIT, .channel = OMAP_DSS_CHANNEL_DIGIT,
......
...@@ -34,8 +34,8 @@ ...@@ -34,8 +34,8 @@
#include <plat/board.h> #include <plat/board.h>
#include <plat/common.h> #include <plat/common.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include "mux.h" #include "mux.h"
#include "control.h" #include "control.h"
......
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
#include <plat/nand.h> #include <plat/nand.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <mach/hardware.h> #include <mach/hardware.h>
......
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/nand.h> #include <plat/nand.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h> #include <linux/input/matrix_keypad.h>
......
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
#include <plat/common.h> #include <plat/common.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include <plat/onenand.h> #include <plat/onenand.h>
#include "mux.h" #include "mux.h"
......
...@@ -41,8 +41,8 @@ ...@@ -41,8 +41,8 @@
#include <plat/board.h> #include <plat/board.h>
#include <plat/common.h> #include <plat/common.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/nand.h> #include <plat/nand.h>
#include <plat/usb.h> #include <plat/usb.h>
......
...@@ -44,8 +44,8 @@ ...@@ -44,8 +44,8 @@
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/common.h> #include <plat/common.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include "mux.h" #include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
#include <mach/hardware.h> #include <mach/hardware.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/nand.h> #include <plat/nand.h>
#include "mux.h" #include "mux.h"
......
...@@ -39,8 +39,8 @@ ...@@ -39,8 +39,8 @@
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/nand.h> #include <plat/nand.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h> #include <linux/input/matrix_keypad.h>
......
...@@ -34,13 +34,13 @@ ...@@ -34,13 +34,13 @@
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/board.h> #include <plat/board.h>
#include <plat/common.h> #include <plat/common.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/mmc.h> #include <plat/mmc.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include "timer-gp.h" #include "timer-gp.h"
#include "hsmmc.h" #include "hsmmc.h"
......
...@@ -43,8 +43,8 @@ ...@@ -43,8 +43,8 @@
#include <plat/board.h> #include <plat/board.h>
#include <plat/common.h> #include <plat/common.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
#include <mach/gpio.h> #include <mach/gpio.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <mach/hardware.h> #include <mach/hardware.h>
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/vram.h> #include <plat/vram.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <plat/display.h> #include <video/omapdss.h>
#define LCD_PANEL_RESET_GPIO_PROD 96 #define LCD_PANEL_RESET_GPIO_PROD 96
#define LCD_PANEL_RESET_GPIO_PILOT 55 #define LCD_PANEL_RESET_GPIO_PILOT 55
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/err.h> #include <linux/err.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/omap_hwmod.h> #include <plat/omap_hwmod.h>
#include <plat/omap_device.h> #include <plat/omap_device.h>
...@@ -56,37 +56,58 @@ static bool opt_clock_available(const char *clk_role) ...@@ -56,37 +56,58 @@ static bool opt_clock_available(const char *clk_role)
return false; return false;
} }
struct omap_dss_hwmod_data {
const char *oh_name;
const char *dev_name;
const int id;
};
static const struct omap_dss_hwmod_data omap2_dss_hwmod_data[] __initdata = {
{ "dss_core", "omapdss_dss", -1 },
{ "dss_dispc", "omapdss_dispc", -1 },
{ "dss_rfbi", "omapdss_rfbi", -1 },
{ "dss_venc", "omapdss_venc", -1 },
};
static const struct omap_dss_hwmod_data omap3_dss_hwmod_data[] __initdata = {
{ "dss_core", "omapdss_dss", -1 },
{ "dss_dispc", "omapdss_dispc", -1 },
{ "dss_rfbi", "omapdss_rfbi", -1 },
{ "dss_venc", "omapdss_venc", -1 },
{ "dss_dsi1", "omapdss_dsi1", -1 },
};
static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = {
{ "dss_core", "omapdss_dss", -1 },
{ "dss_dispc", "omapdss_dispc", -1 },
{ "dss_rfbi", "omapdss_rfbi", -1 },
{ "dss_venc", "omapdss_venc", -1 },
{ "dss_dsi1", "omapdss_dsi1", -1 },
{ "dss_dsi2", "omapdss_dsi2", -1 },
{ "dss_hdmi", "omapdss_hdmi", -1 },
};
int __init omap_display_init(struct omap_dss_board_info *board_data) int __init omap_display_init(struct omap_dss_board_info *board_data)
{ {
int r = 0; int r = 0;
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct omap_device *od; struct omap_device *od;
int i; int i, oh_count;
struct omap_display_platform_data pdata; struct omap_display_platform_data pdata;
const struct omap_dss_hwmod_data *curr_dss_hwmod;
/*
* omap: valid DSS hwmod names
* omap2,3,4: dss_core, dss_dispc, dss_rfbi, dss_venc
* omap3,4: dss_dsi1
* omap4: dss_dsi2, dss_hdmi
*/
char *oh_name[] = { "dss_core", "dss_dispc", "dss_rfbi", "dss_venc",
"dss_dsi1", "dss_dsi2", "dss_hdmi" };
char *dev_name[] = { "omapdss_dss", "omapdss_dispc", "omapdss_rfbi",
"omapdss_venc", "omapdss_dsi1", "omapdss_dsi2",
"omapdss_hdmi" };
int oh_count;
memset(&pdata, 0, sizeof(pdata)); memset(&pdata, 0, sizeof(pdata));
if (cpu_is_omap24xx()) if (cpu_is_omap24xx()) {
oh_count = ARRAY_SIZE(oh_name) - 3; curr_dss_hwmod = omap2_dss_hwmod_data;
/* last 3 hwmod dev in oh_name are not available for omap2 */ oh_count = ARRAY_SIZE(omap2_dss_hwmod_data);
else if (cpu_is_omap44xx()) } else if (cpu_is_omap34xx()) {
oh_count = ARRAY_SIZE(oh_name); curr_dss_hwmod = omap3_dss_hwmod_data;
else oh_count = ARRAY_SIZE(omap3_dss_hwmod_data);
oh_count = ARRAY_SIZE(oh_name) - 2; } else {
/* last 2 hwmod dev in oh_name are not available for omap3 */ curr_dss_hwmod = omap4_dss_hwmod_data;
oh_count = ARRAY_SIZE(omap4_dss_hwmod_data);
}
/* opt_clks are always associated with dss hwmod */ /* opt_clks are always associated with dss hwmod */
oh_core = omap_hwmod_lookup("dss_core"); oh_core = omap_hwmod_lookup("dss_core");
...@@ -100,19 +121,21 @@ int __init omap_display_init(struct omap_dss_board_info *board_data) ...@@ -100,19 +121,21 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)
pdata.opt_clock_available = opt_clock_available; pdata.opt_clock_available = opt_clock_available;
for (i = 0; i < oh_count; i++) { for (i = 0; i < oh_count; i++) {
oh = omap_hwmod_lookup(oh_name[i]); oh = omap_hwmod_lookup(curr_dss_hwmod[i].oh_name);
if (!oh) { if (!oh) {
pr_err("Could not look up %s\n", oh_name[i]); pr_err("Could not look up %s\n",
curr_dss_hwmod[i].oh_name);
return -ENODEV; return -ENODEV;
} }
od = omap_device_build(dev_name[i], -1, oh, &pdata, od = omap_device_build(curr_dss_hwmod[i].dev_name,
curr_dss_hwmod[i].id, oh, &pdata,
sizeof(struct omap_display_platform_data), sizeof(struct omap_display_platform_data),
omap_dss_latency, omap_dss_latency,
ARRAY_SIZE(omap_dss_latency), 0); ARRAY_SIZE(omap_dss_latency), 0);
if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n", if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n",
oh_name[i])) curr_dss_hwmod[i].oh_name))
return -ENODEV; return -ENODEV;
} }
omap_display_device.dev.platform_data = board_data; omap_display_device.dev.platform_data = board_data;
......
/* /*
* Defines for zoom boards * Defines for zoom boards
*/ */
#include <plat/display.h> #include <video/omapdss.h>
#define ZOOM_NAND_CS 0 #define ZOOM_NAND_CS 0
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
#include <plat/dma.h> #include <plat/dma.h>
#include <plat/vram.h> #include <plat/vram.h>
#include <plat/vrfb.h> #include <plat/vrfb.h>
#include <plat/display.h> #include <video/omapdss.h>
#include "omap_voutlib.h" #include "omap_voutlib.h"
#include "omap_voutdef.h" #include "omap_voutdef.h"
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#ifndef OMAP_VOUTDEF_H #ifndef OMAP_VOUTDEF_H
#define OMAP_VOUTDEF_H #define OMAP_VOUTDEF_H
#include <plat/display.h> #include <video/omapdss.h>
#define YUYV_BPP 2 #define YUYV_BPP 2
#define RGB565_BPP 2 #define RGB565_BPP 2
......
...@@ -922,14 +922,14 @@ static int get_dss_clocks(void) ...@@ -922,14 +922,14 @@ static int get_dss_clocks(void)
return PTR_ERR(dispc.dss_ick); return PTR_ERR(dispc.dss_ick);
} }
dispc.dss1_fck = clk_get(&dispc.fbdev->dssdev->dev, "dss1_fck"); dispc.dss1_fck = clk_get(&dispc.fbdev->dssdev->dev, "fck");
if (IS_ERR(dispc.dss1_fck)) { if (IS_ERR(dispc.dss1_fck)) {
dev_err(dispc.fbdev->dev, "can't get dss1_fck\n"); dev_err(dispc.fbdev->dev, "can't get dss1_fck\n");
clk_put(dispc.dss_ick); clk_put(dispc.dss_ick);
return PTR_ERR(dispc.dss1_fck); return PTR_ERR(dispc.dss1_fck);
} }
dispc.dss_54m_fck = clk_get(&dispc.fbdev->dssdev->dev, "tv_fck"); dispc.dss_54m_fck = clk_get(&dispc.fbdev->dssdev->dev, "tv_clk");
if (IS_ERR(dispc.dss_54m_fck)) { if (IS_ERR(dispc.dss_54m_fck)) {
dev_err(dispc.fbdev->dev, "can't get tv_fck\n"); dev_err(dispc.fbdev->dev, "can't get tv_fck\n");
clk_put(dispc.dss_ick); clk_put(dispc.dss_ick);
......
...@@ -90,7 +90,7 @@ static void omapdss_release(struct device *dev) ...@@ -90,7 +90,7 @@ static void omapdss_release(struct device *dev)
/* dummy device for clocks */ /* dummy device for clocks */
static struct platform_device omapdss_device = { static struct platform_device omapdss_device = {
.name = "omapdss", .name = "omapdss_dss",
.id = -1, .id = -1,
.dev = { .dev = {
.release = omapdss_release, .release = omapdss_release,
......
...@@ -90,7 +90,7 @@ static int rfbi_get_clocks(void) ...@@ -90,7 +90,7 @@ static int rfbi_get_clocks(void)
return PTR_ERR(rfbi.dss_ick); return PTR_ERR(rfbi.dss_ick);
} }
rfbi.dss1_fck = clk_get(&rfbi.fbdev->dssdev->dev, "dss1_fck"); rfbi.dss1_fck = clk_get(&rfbi.fbdev->dssdev->dev, "fck");
if (IS_ERR(rfbi.dss1_fck)) { if (IS_ERR(rfbi.dss1_fck)) {
dev_err(rfbi.fbdev->dev, "can't get dss1_fck\n"); dev_err(rfbi.fbdev->dev, "can't get dss1_fck\n");
clk_put(rfbi.dss_ick); clk_put(rfbi.dss_ick);
......
obj-$(CONFIG_OMAP2_VRAM) += vram.o obj-$(CONFIG_OMAP2_VRAM) += vram.o
obj-$(CONFIG_OMAP2_VRFB) += vrfb.o obj-$(CONFIG_OMAP2_VRFB) += vrfb.o
obj-y += dss/ obj-$(CONFIG_OMAP2_DSS) += dss/
obj-y += omapfb/ obj-$(CONFIG_FB_OMAP2) += omapfb/
obj-y += displays/ obj-y += displays/
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <plat/display.h> #include <video/omapdss.h>
#define MIPID_CMD_READ_DISP_ID 0x04 #define MIPID_CMD_READ_DISP_ID 0x04
#define MIPID_CMD_READ_RED 0x06 #define MIPID_CMD_READ_RED 0x06
......
...@@ -33,8 +33,9 @@ ...@@ -33,8 +33,9 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <video/omapdss.h>
#include <plat/panel-generic-dpi.h> #include <video/omap-panel-generic-dpi.h>
struct panel_config { struct panel_config {
struct omap_video_timings timings; struct omap_video_timings timings;
...@@ -181,6 +182,56 @@ static struct panel_config generic_dpi_panels[] = { ...@@ -181,6 +182,56 @@ static struct panel_config generic_dpi_panels[] = {
.power_off_delay = 0, .power_off_delay = 0,
.name = "samsung_lte430wq_f0c", .name = "samsung_lte430wq_f0c",
}, },
/* Seiko 70WVW1TZ3Z3 */
{
{
.x_res = 800,
.y_res = 480,
.pixel_clock = 33000,
.hsw = 128,
.hfp = 10,
.hbp = 10,
.vsw = 2,
.vfp = 4,
.vbp = 11,
},
.acbi = 0x0,
.acb = 0x0,
.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS |
OMAP_DSS_LCD_IHS,
.power_on_delay = 0,
.power_off_delay = 0,
.name = "seiko_70wvw1tz3",
},
/* Powertip PH480272T */
{
{
.x_res = 480,
.y_res = 272,
.pixel_clock = 9000,
.hsw = 40,
.hfp = 2,
.hbp = 2,
.vsw = 10,
.vfp = 2,
.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 = 0,
.power_off_delay = 0,
.name = "powertip_ph480272t",
},
}; };
struct panel_drv_data { struct panel_drv_data {
...@@ -285,7 +336,7 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev) ...@@ -285,7 +336,7 @@ static int generic_dpi_panel_probe(struct omap_dss_device *dssdev)
return 0; return 0;
} }
static void generic_dpi_panel_remove(struct omap_dss_device *dssdev) static void __exit generic_dpi_panel_remove(struct omap_dss_device *dssdev)
{ {
struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev); struct panel_drv_data *drv_data = dev_get_drvdata(&dssdev->dev);
...@@ -358,7 +409,7 @@ static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev, ...@@ -358,7 +409,7 @@ static int generic_dpi_panel_check_timings(struct omap_dss_device *dssdev,
static struct omap_dss_driver dpi_driver = { static struct omap_dss_driver dpi_driver = {
.probe = generic_dpi_panel_probe, .probe = generic_dpi_panel_probe,
.remove = generic_dpi_panel_remove, .remove = __exit_p(generic_dpi_panel_remove),
.enable = generic_dpi_panel_enable, .enable = generic_dpi_panel_enable,
.disable = generic_dpi_panel_disable, .disable = generic_dpi_panel_disable,
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <plat/display.h> #include <video/omapdss.h>
struct lb035q02_data { struct lb035q02_data {
struct mutex lock; struct mutex lock;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <plat/display.h> #include <video/omapdss.h>
#define LCD_XRES 800 #define LCD_XRES 800
#define LCD_YRES 480 #define LCD_YRES 480
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <plat/display.h> #include <video/omapdss.h>
struct sharp_data { struct sharp_data {
struct backlight_device *bl; struct backlight_device *bl;
...@@ -120,7 +120,7 @@ static int sharp_ls_panel_probe(struct omap_dss_device *dssdev) ...@@ -120,7 +120,7 @@ static int sharp_ls_panel_probe(struct omap_dss_device *dssdev)
return 0; return 0;
} }
static void sharp_ls_panel_remove(struct omap_dss_device *dssdev) static void __exit sharp_ls_panel_remove(struct omap_dss_device *dssdev)
{ {
struct sharp_data *sd = dev_get_drvdata(&dssdev->dev); struct sharp_data *sd = dev_get_drvdata(&dssdev->dev);
struct backlight_device *bl = sd->bl; struct backlight_device *bl = sd->bl;
...@@ -205,7 +205,7 @@ static int sharp_ls_panel_resume(struct omap_dss_device *dssdev) ...@@ -205,7 +205,7 @@ static int sharp_ls_panel_resume(struct omap_dss_device *dssdev)
static struct omap_dss_driver sharp_ls_driver = { static struct omap_dss_driver sharp_ls_driver = {
.probe = sharp_ls_panel_probe, .probe = sharp_ls_panel_probe,
.remove = sharp_ls_panel_remove, .remove = __exit_p(sharp_ls_panel_remove),
.enable = sharp_ls_panel_enable, .enable = sharp_ls_panel_enable,
.disable = sharp_ls_panel_disable, .disable = sharp_ls_panel_disable,
......
This diff is collapsed.
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <plat/display.h> #include <video/omapdss.h>
#define TPO_R02_MODE(x) ((x) & 7) #define TPO_R02_MODE(x) ((x) & 7)
#define TPO_R02_MODE_800x480 7 #define TPO_R02_MODE_800x480 7
...@@ -144,13 +144,15 @@ static ssize_t tpo_td043_vmirror_store(struct device *dev, ...@@ -144,13 +144,15 @@ static ssize_t tpo_td043_vmirror_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
struct tpo_td043_device *tpo_td043 = dev_get_drvdata(dev); struct tpo_td043_device *tpo_td043 = dev_get_drvdata(dev);
long val; int val;
int ret; int ret;
ret = strict_strtol(buf, 0, &val); ret = kstrtoint(buf, 0, &val);
if (ret < 0) if (ret < 0)
return ret; return ret;
val = !!val;
ret = tpo_td043_write_mirror(tpo_td043->spi, tpo_td043->hmirror, val); ret = tpo_td043_write_mirror(tpo_td043->spi, tpo_td043->hmirror, val);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -175,7 +177,7 @@ static ssize_t tpo_td043_mode_store(struct device *dev, ...@@ -175,7 +177,7 @@ static ssize_t tpo_td043_mode_store(struct device *dev,
long val; long val;
int ret; int ret;
ret = strict_strtol(buf, 0, &val); ret = kstrtol(buf, 0, &val);
if (ret != 0 || val & ~7) if (ret != 0 || val & ~7)
return -EINVAL; return -EINVAL;
......
...@@ -80,7 +80,7 @@ config OMAP2_DSS_SDI ...@@ -80,7 +80,7 @@ config OMAP2_DSS_SDI
config OMAP2_DSS_DSI config OMAP2_DSS_DSI
bool "DSI support" bool "DSI support"
depends on ARCH_OMAP3 depends on ARCH_OMAP3 || ARCH_OMAP4
default n default n
help help
MIPI DSI (Display Serial Interface) support. MIPI DSI (Display Serial Interface) support.
...@@ -90,14 +90,6 @@ config OMAP2_DSS_DSI ...@@ -90,14 +90,6 @@ config OMAP2_DSS_DSI
See http://www.mipi.org/ for DSI spesifications. See http://www.mipi.org/ for DSI spesifications.
config OMAP2_DSS_USE_DSI_PLL
bool "Use DSI PLL for PCLK (EXPERIMENTAL)"
default n
depends on OMAP2_DSS_DSI
help
Use DSI PLL to generate pixel clock. Currently only for DPI output.
DSI PLL can be used to generate higher and more precise pixel clocks.
config OMAP2_DSS_FAKE_VSYNC config OMAP2_DSS_FAKE_VSYNC
bool "Fake VSYNC irq from manual update displays" bool "Fake VSYNC irq from manual update displays"
default n default n
...@@ -125,4 +117,27 @@ config OMAP2_DSS_MIN_FCK_PER_PCK ...@@ -125,4 +117,27 @@ config OMAP2_DSS_MIN_FCK_PER_PCK
Max FCK is 173MHz, so this doesn't work if your PCK Max FCK is 173MHz, so this doesn't work if your PCK
is very high. is very high.
config OMAP2_DSS_SLEEP_BEFORE_RESET
bool "Sleep 50ms before DSS reset"
default y
help
For some unknown reason we may get SYNC_LOST errors from the display
subsystem at initialization time if we don't sleep before resetting
the DSS. See the source (dss.c) for more comments.
However, 50ms is quite long time to sleep, and with some
configurations the SYNC_LOST may never happen, so the sleep can
be disabled here.
config OMAP2_DSS_SLEEP_AFTER_VENC_RESET
bool "Sleep 20ms after VENC reset"
default y
help
There is a 20ms sleep after VENC reset which seemed to fix the
reset. The reason for the bug is unclear, and it's also unclear
on what platforms this happens.
This option enables the sleep, and is enabled by default. You can
disable the sleep if it doesn't cause problems on your platform.
endif endif
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <plat/display.h> #include <video/omapdss.h>
#include "dss.h" #include "dss.h"
#include "dss_features.h" #include "dss_features.h"
...@@ -54,6 +54,9 @@ unsigned int dss_debug; ...@@ -54,6 +54,9 @@ unsigned int dss_debug;
module_param_named(debug, dss_debug, bool, 0644); module_param_named(debug, dss_debug, bool, 0644);
#endif #endif
static int omap_dss_register_device(struct omap_dss_device *);
static void omap_dss_unregister_device(struct omap_dss_device *);
/* REGULATORS */ /* REGULATORS */
struct regulator *dss_get_vdds_dsi(void) struct regulator *dss_get_vdds_dsi(void)
...@@ -124,8 +127,7 @@ static int dss_initialize_debugfs(void) ...@@ -124,8 +127,7 @@ static int dss_initialize_debugfs(void)
#endif #endif
#if defined(CONFIG_OMAP2_DSS_DSI) && defined(CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS) #if defined(CONFIG_OMAP2_DSS_DSI) && defined(CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS)
debugfs_create_file("dsi_irq", S_IRUGO, dss_debugfs_dir, dsi_create_debugfs_files_irq(dss_debugfs_dir, &dss_debug_fops);
&dsi_dump_irqs, &dss_debug_fops);
#endif #endif
debugfs_create_file("dss", S_IRUGO, dss_debugfs_dir, debugfs_create_file("dss", S_IRUGO, dss_debugfs_dir,
...@@ -137,8 +139,7 @@ static int dss_initialize_debugfs(void) ...@@ -137,8 +139,7 @@ static int dss_initialize_debugfs(void)
&rfbi_dump_regs, &dss_debug_fops); &rfbi_dump_regs, &dss_debug_fops);
#endif #endif
#ifdef CONFIG_OMAP2_DSS_DSI #ifdef CONFIG_OMAP2_DSS_DSI
debugfs_create_file("dsi", S_IRUGO, dss_debugfs_dir, dsi_create_debugfs_files_reg(dss_debugfs_dir, &dss_debug_fops);
&dsi_dump_regs, &dss_debug_fops);
#endif #endif
#ifdef CONFIG_OMAP2_DSS_VENC #ifdef CONFIG_OMAP2_DSS_VENC
debugfs_create_file("venc", S_IRUGO, dss_debugfs_dir, debugfs_create_file("venc", S_IRUGO, dss_debugfs_dir,
...@@ -480,7 +481,7 @@ static void omap_dss_dev_release(struct device *dev) ...@@ -480,7 +481,7 @@ static void omap_dss_dev_release(struct device *dev)
reset_device(dev, 0); reset_device(dev, 0);
} }
int omap_dss_register_device(struct omap_dss_device *dssdev) static int omap_dss_register_device(struct omap_dss_device *dssdev)
{ {
static int dev_num; static int dev_num;
...@@ -494,7 +495,7 @@ int omap_dss_register_device(struct omap_dss_device *dssdev) ...@@ -494,7 +495,7 @@ int omap_dss_register_device(struct omap_dss_device *dssdev)
return device_register(&dssdev->dev); return device_register(&dssdev->dev);
} }
void omap_dss_unregister_device(struct omap_dss_device *dssdev) static void omap_dss_unregister_device(struct omap_dss_device *dssdev)
{ {
device_unregister(&dssdev->dev); device_unregister(&dssdev->dev);
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <plat/display.h> #include <video/omapdss.h>
#include "dss.h" #include "dss.h"
static ssize_t display_enabled_show(struct device *dev, static ssize_t display_enabled_show(struct device *dev,
...@@ -44,9 +44,13 @@ static ssize_t display_enabled_store(struct device *dev, ...@@ -44,9 +44,13 @@ static ssize_t display_enabled_store(struct device *dev,
const char *buf, size_t size) const char *buf, size_t size)
{ {
struct omap_dss_device *dssdev = to_dss_device(dev); struct omap_dss_device *dssdev = to_dss_device(dev);
bool enabled, r; int r, enabled;
enabled = simple_strtoul(buf, NULL, 10); r = kstrtoint(buf, 0, &enabled);
if (r)
return r;
enabled = !!enabled;
if (enabled != (dssdev->state != OMAP_DSS_DISPLAY_DISABLED)) { if (enabled != (dssdev->state != OMAP_DSS_DISPLAY_DISABLED)) {
if (enabled) { if (enabled) {
...@@ -82,7 +86,9 @@ static ssize_t display_upd_mode_store(struct device *dev, ...@@ -82,7 +86,9 @@ static ssize_t display_upd_mode_store(struct device *dev,
if (!dssdev->driver->set_update_mode) if (!dssdev->driver->set_update_mode)
return -EINVAL; return -EINVAL;
val = simple_strtoul(buf, NULL, 10); r = kstrtoint(buf, 0, &val);
if (r)
return r;
switch (val) { switch (val) {
case OMAP_DSS_UPDATE_DISABLED: case OMAP_DSS_UPDATE_DISABLED:
...@@ -114,13 +120,16 @@ static ssize_t display_tear_store(struct device *dev, ...@@ -114,13 +120,16 @@ static ssize_t display_tear_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size) struct device_attribute *attr, const char *buf, size_t size)
{ {
struct omap_dss_device *dssdev = to_dss_device(dev); struct omap_dss_device *dssdev = to_dss_device(dev);
unsigned long te; int te, r;
int r;
if (!dssdev->driver->enable_te || !dssdev->driver->get_te) if (!dssdev->driver->enable_te || !dssdev->driver->get_te)
return -ENOENT; return -ENOENT;
te = simple_strtoul(buf, NULL, 0); r = kstrtoint(buf, 0, &te);
if (r)
return r;
te = !!te;
r = dssdev->driver->enable_te(dssdev, te); r = dssdev->driver->enable_te(dssdev, te);
if (r) if (r)
...@@ -196,13 +205,14 @@ static ssize_t display_rotate_store(struct device *dev, ...@@ -196,13 +205,14 @@ static ssize_t display_rotate_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size) struct device_attribute *attr, const char *buf, size_t size)
{ {
struct omap_dss_device *dssdev = to_dss_device(dev); struct omap_dss_device *dssdev = to_dss_device(dev);
unsigned long rot; int rot, r;
int r;
if (!dssdev->driver->set_rotate || !dssdev->driver->get_rotate) if (!dssdev->driver->set_rotate || !dssdev->driver->get_rotate)
return -ENOENT; return -ENOENT;
rot = simple_strtoul(buf, NULL, 0); r = kstrtoint(buf, 0, &rot);
if (r)
return r;
r = dssdev->driver->set_rotate(dssdev, rot); r = dssdev->driver->set_rotate(dssdev, rot);
if (r) if (r)
...@@ -226,13 +236,16 @@ static ssize_t display_mirror_store(struct device *dev, ...@@ -226,13 +236,16 @@ static ssize_t display_mirror_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size) struct device_attribute *attr, const char *buf, size_t size)
{ {
struct omap_dss_device *dssdev = to_dss_device(dev); struct omap_dss_device *dssdev = to_dss_device(dev);
unsigned long mirror; int mirror, r;
int r;
if (!dssdev->driver->set_mirror || !dssdev->driver->get_mirror) if (!dssdev->driver->set_mirror || !dssdev->driver->get_mirror)
return -ENOENT; return -ENOENT;
mirror = simple_strtoul(buf, NULL, 0); r = kstrtoint(buf, 0, &mirror);
if (r)
return r;
mirror = !!mirror;
r = dssdev->driver->set_mirror(dssdev, mirror); r = dssdev->driver->set_mirror(dssdev, mirror);
if (r) if (r)
...@@ -259,14 +272,15 @@ static ssize_t display_wss_store(struct device *dev, ...@@ -259,14 +272,15 @@ static ssize_t display_wss_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size) struct device_attribute *attr, const char *buf, size_t size)
{ {
struct omap_dss_device *dssdev = to_dss_device(dev); struct omap_dss_device *dssdev = to_dss_device(dev);
unsigned long wss; u32 wss;
int r; int r;
if (!dssdev->driver->get_wss || !dssdev->driver->set_wss) if (!dssdev->driver->get_wss || !dssdev->driver->set_wss)
return -ENOENT; return -ENOENT;
if (strict_strtoul(buf, 0, &wss)) r = kstrtou32(buf, 0, &wss);
return -EINVAL; if (r)
return r;
if (wss > 0xfffff) if (wss > 0xfffff)
return -EINVAL; return -EINVAL;
......
...@@ -30,16 +30,40 @@ ...@@ -30,16 +30,40 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include "dss.h" #include "dss.h"
static struct { static struct {
struct regulator *vdds_dsi_reg; struct regulator *vdds_dsi_reg;
struct platform_device *dsidev;
} dpi; } dpi;
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL static struct platform_device *dpi_get_dsidev(enum omap_dss_clk_source clk)
{
int dsi_module;
dsi_module = clk == OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC ? 0 : 1;
return dsi_get_dsidev_from_id(dsi_module);
}
static bool dpi_use_dsi_pll(struct omap_dss_device *dssdev)
{
if (dssdev->clocks.dispc.dispc_fclk_src ==
OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC ||
dssdev->clocks.dispc.dispc_fclk_src ==
OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC ||
dssdev->clocks.dispc.channel.lcd_clk_src ==
OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC ||
dssdev->clocks.dispc.channel.lcd_clk_src ==
OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC)
return true;
else
return false;
}
static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft, static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
unsigned long pck_req, unsigned long *fck, int *lck_div, unsigned long pck_req, unsigned long *fck, int *lck_div,
int *pck_div) int *pck_div)
...@@ -48,16 +72,16 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft, ...@@ -48,16 +72,16 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
struct dispc_clock_info dispc_cinfo; struct dispc_clock_info dispc_cinfo;
int r; int r;
r = dsi_pll_calc_clock_div_pck(is_tft, pck_req, &dsi_cinfo, r = dsi_pll_calc_clock_div_pck(dpi.dsidev, is_tft, pck_req,
&dispc_cinfo); &dsi_cinfo, &dispc_cinfo);
if (r) if (r)
return r; return r;
r = dsi_pll_set_clock_div(&dsi_cinfo); r = dsi_pll_set_clock_div(dpi.dsidev, &dsi_cinfo);
if (r) if (r)
return r; return r;
dss_select_dispc_clk_source(DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC); dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src);
r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo); r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo);
if (r) if (r)
...@@ -69,7 +93,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft, ...@@ -69,7 +93,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft,
return 0; return 0;
} }
#else
static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft, static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft,
unsigned long pck_req, unsigned long *fck, int *lck_div, unsigned long pck_req, unsigned long *fck, int *lck_div,
int *pck_div) int *pck_div)
...@@ -96,13 +120,12 @@ static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft, ...@@ -96,13 +120,12 @@ static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft,
return 0; return 0;
} }
#endif
static int dpi_set_mode(struct omap_dss_device *dssdev) static int dpi_set_mode(struct omap_dss_device *dssdev)
{ {
struct omap_video_timings *t = &dssdev->panel.timings; struct omap_video_timings *t = &dssdev->panel.timings;
int lck_div, pck_div; int lck_div = 0, pck_div = 0;
unsigned long fck; unsigned long fck = 0;
unsigned long pck; unsigned long pck;
bool is_tft; bool is_tft;
int r = 0; int r = 0;
...@@ -114,13 +137,12 @@ static int dpi_set_mode(struct omap_dss_device *dssdev) ...@@ -114,13 +137,12 @@ static int dpi_set_mode(struct omap_dss_device *dssdev)
is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0; is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL if (dpi_use_dsi_pll(dssdev))
r = dpi_set_dsi_clk(dssdev, is_tft, t->pixel_clock * 1000, &fck, r = dpi_set_dsi_clk(dssdev, is_tft, t->pixel_clock * 1000,
&lck_div, &pck_div); &fck, &lck_div, &pck_div);
#else else
r = dpi_set_dispc_clk(dssdev, is_tft, t->pixel_clock * 1000, &fck, r = dpi_set_dispc_clk(dssdev, is_tft, t->pixel_clock * 1000,
&lck_div, &pck_div); &fck, &lck_div, &pck_div);
#endif
if (r) if (r)
goto err0; goto err0;
...@@ -179,12 +201,13 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) ...@@ -179,12 +201,13 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
if (r) if (r)
goto err2; goto err2;
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL if (dpi_use_dsi_pll(dssdev)) {
dss_clk_enable(DSS_CLK_SYSCK); dss_clk_enable(DSS_CLK_SYSCK);
r = dsi_pll_init(dssdev, 0, 1); r = dsi_pll_init(dpi.dsidev, 0, 1);
if (r) if (r)
goto err3; goto err3;
#endif }
r = dpi_set_mode(dssdev); r = dpi_set_mode(dssdev);
if (r) if (r)
goto err4; goto err4;
...@@ -196,11 +219,11 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) ...@@ -196,11 +219,11 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
return 0; return 0;
err4: err4:
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL if (dpi_use_dsi_pll(dssdev))
dsi_pll_uninit(); dsi_pll_uninit(dpi.dsidev, true);
err3: err3:
dss_clk_disable(DSS_CLK_SYSCK); if (dpi_use_dsi_pll(dssdev))
#endif dss_clk_disable(DSS_CLK_SYSCK);
err2: err2:
dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK);
if (cpu_is_omap34xx()) if (cpu_is_omap34xx())
...@@ -216,11 +239,11 @@ void omapdss_dpi_display_disable(struct omap_dss_device *dssdev) ...@@ -216,11 +239,11 @@ void omapdss_dpi_display_disable(struct omap_dss_device *dssdev)
{ {
dssdev->manager->disable(dssdev->manager); dssdev->manager->disable(dssdev->manager);
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL if (dpi_use_dsi_pll(dssdev)) {
dss_select_dispc_clk_source(DSS_CLK_SRC_FCK); dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
dsi_pll_uninit(); dsi_pll_uninit(dpi.dsidev, true);
dss_clk_disable(DSS_CLK_SYSCK); dss_clk_disable(DSS_CLK_SYSCK);
#endif }
dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK); dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK);
...@@ -251,6 +274,7 @@ int dpi_check_timings(struct omap_dss_device *dssdev, ...@@ -251,6 +274,7 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
int lck_div, pck_div; int lck_div, pck_div;
unsigned long fck; unsigned long fck;
unsigned long pck; unsigned long pck;
struct dispc_clock_info dispc_cinfo;
if (!dispc_lcd_timings_ok(timings)) if (!dispc_lcd_timings_ok(timings))
return -EINVAL; return -EINVAL;
...@@ -260,11 +284,9 @@ int dpi_check_timings(struct omap_dss_device *dssdev, ...@@ -260,11 +284,9 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0; is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL if (dpi_use_dsi_pll(dssdev)) {
{
struct dsi_clock_info dsi_cinfo; struct dsi_clock_info dsi_cinfo;
struct dispc_clock_info dispc_cinfo; r = dsi_pll_calc_clock_div_pck(dpi.dsidev, is_tft,
r = dsi_pll_calc_clock_div_pck(is_tft,
timings->pixel_clock * 1000, timings->pixel_clock * 1000,
&dsi_cinfo, &dispc_cinfo); &dsi_cinfo, &dispc_cinfo);
...@@ -272,13 +294,8 @@ int dpi_check_timings(struct omap_dss_device *dssdev, ...@@ -272,13 +294,8 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
return r; return r;
fck = dsi_cinfo.dsi_pll_hsdiv_dispc_clk; fck = dsi_cinfo.dsi_pll_hsdiv_dispc_clk;
lck_div = dispc_cinfo.lck_div; } else {
pck_div = dispc_cinfo.pck_div;
}
#else
{
struct dss_clock_info dss_cinfo; struct dss_clock_info dss_cinfo;
struct dispc_clock_info dispc_cinfo;
r = dss_calc_clock_div(is_tft, timings->pixel_clock * 1000, r = dss_calc_clock_div(is_tft, timings->pixel_clock * 1000,
&dss_cinfo, &dispc_cinfo); &dss_cinfo, &dispc_cinfo);
...@@ -286,10 +303,10 @@ int dpi_check_timings(struct omap_dss_device *dssdev, ...@@ -286,10 +303,10 @@ int dpi_check_timings(struct omap_dss_device *dssdev,
return r; return r;
fck = dss_cinfo.fck; fck = dss_cinfo.fck;
lck_div = dispc_cinfo.lck_div;
pck_div = dispc_cinfo.pck_div;
} }
#endif
lck_div = dispc_cinfo.lck_div;
pck_div = dispc_cinfo.pck_div;
pck = fck / lck_div / pck_div / 1000; pck = fck / lck_div / pck_div / 1000;
...@@ -316,6 +333,12 @@ int dpi_init_display(struct omap_dss_device *dssdev) ...@@ -316,6 +333,12 @@ int dpi_init_display(struct omap_dss_device *dssdev)
dpi.vdds_dsi_reg = vdds_dsi; dpi.vdds_dsi_reg = vdds_dsi;
} }
if (dpi_use_dsi_pll(dssdev)) {
enum omap_dss_clk_source dispc_fclk_src =
dssdev->clocks.dispc.dispc_fclk_src;
dpi.dsidev = dpi_get_dsidev(dispc_fclk_src);
}
return 0; return 0;
} }
......
This diff is collapsed.
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/clock.h> #include <plat/clock.h>
#include "dss.h" #include "dss.h"
#include "dss_features.h" #include "dss_features.h"
...@@ -45,7 +45,6 @@ struct dss_reg { ...@@ -45,7 +45,6 @@ struct dss_reg {
#define DSS_REVISION DSS_REG(0x0000) #define DSS_REVISION DSS_REG(0x0000)
#define DSS_SYSCONFIG DSS_REG(0x0010) #define DSS_SYSCONFIG DSS_REG(0x0010)
#define DSS_SYSSTATUS DSS_REG(0x0014) #define DSS_SYSSTATUS DSS_REG(0x0014)
#define DSS_IRQSTATUS DSS_REG(0x0018)
#define DSS_CONTROL DSS_REG(0x0040) #define DSS_CONTROL DSS_REG(0x0040)
#define DSS_SDI_CONTROL DSS_REG(0x0044) #define DSS_SDI_CONTROL DSS_REG(0x0044)
#define DSS_PLL_CONTROL DSS_REG(0x0048) #define DSS_PLL_CONTROL DSS_REG(0x0048)
...@@ -75,17 +74,17 @@ static struct { ...@@ -75,17 +74,17 @@ static struct {
struct dss_clock_info cache_dss_cinfo; struct dss_clock_info cache_dss_cinfo;
struct dispc_clock_info cache_dispc_cinfo; struct dispc_clock_info cache_dispc_cinfo;
enum dss_clk_source dsi_clk_source; enum omap_dss_clk_source dsi_clk_source[MAX_NUM_DSI];
enum dss_clk_source dispc_clk_source; enum omap_dss_clk_source dispc_clk_source;
enum dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS]; enum omap_dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS];
u32 ctx[DSS_SZ_REGS / sizeof(u32)]; u32 ctx[DSS_SZ_REGS / sizeof(u32)];
} dss; } dss;
static const char * const dss_generic_clk_source_names[] = { static const char * const dss_generic_clk_source_names[] = {
[DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "DSI_PLL_HSDIV_DISPC", [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "DSI_PLL_HSDIV_DISPC",
[DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "DSI_PLL_HSDIV_DSI", [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "DSI_PLL_HSDIV_DSI",
[DSS_CLK_SRC_FCK] = "DSS_FCK", [OMAP_DSS_CLK_SRC_FCK] = "DSS_FCK",
}; };
static void dss_clk_enable_all_no_ctx(void); static void dss_clk_enable_all_no_ctx(void);
...@@ -230,7 +229,7 @@ void dss_sdi_disable(void) ...@@ -230,7 +229,7 @@ void dss_sdi_disable(void)
REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */
} }
const char *dss_get_generic_clk_source_name(enum dss_clk_source clk_src) const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src)
{ {
return dss_generic_clk_source_names[clk_src]; return dss_generic_clk_source_names[clk_src];
} }
...@@ -246,8 +245,8 @@ void dss_dump_clocks(struct seq_file *s) ...@@ -246,8 +245,8 @@ void dss_dump_clocks(struct seq_file *s)
seq_printf(s, "- DSS -\n"); seq_printf(s, "- DSS -\n");
fclk_name = dss_get_generic_clk_source_name(DSS_CLK_SRC_FCK); fclk_name = dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_FCK);
fclk_real_name = dss_feat_get_clk_source_name(DSS_CLK_SRC_FCK); fclk_real_name = dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_FCK);
fclk_rate = dss_clk_get_rate(DSS_CLK_FCK); fclk_rate = dss_clk_get_rate(DSS_CLK_FCK);
if (dss.dpll4_m4_ck) { if (dss.dpll4_m4_ck) {
...@@ -286,7 +285,6 @@ void dss_dump_regs(struct seq_file *s) ...@@ -286,7 +285,6 @@ void dss_dump_regs(struct seq_file *s)
DUMPREG(DSS_REVISION); DUMPREG(DSS_REVISION);
DUMPREG(DSS_SYSCONFIG); DUMPREG(DSS_SYSCONFIG);
DUMPREG(DSS_SYSSTATUS); DUMPREG(DSS_SYSSTATUS);
DUMPREG(DSS_IRQSTATUS);
DUMPREG(DSS_CONTROL); DUMPREG(DSS_CONTROL);
if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) & if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) &
...@@ -300,18 +298,25 @@ void dss_dump_regs(struct seq_file *s) ...@@ -300,18 +298,25 @@ void dss_dump_regs(struct seq_file *s)
#undef DUMPREG #undef DUMPREG
} }
void dss_select_dispc_clk_source(enum dss_clk_source clk_src) void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src)
{ {
struct platform_device *dsidev;
int b; int b;
u8 start, end; u8 start, end;
switch (clk_src) { switch (clk_src) {
case DSS_CLK_SRC_FCK: case OMAP_DSS_CLK_SRC_FCK:
b = 0; b = 0;
break; break;
case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
b = 1; b = 1;
dsi_wait_pll_hsdiv_dispc_active(); dsidev = dsi_get_dsidev_from_id(0);
dsi_wait_pll_hsdiv_dispc_active(dsidev);
break;
case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
b = 2;
dsidev = dsi_get_dsidev_from_id(1);
dsi_wait_pll_hsdiv_dispc_active(dsidev);
break; break;
default: default:
BUG(); BUG();
...@@ -324,17 +329,27 @@ void dss_select_dispc_clk_source(enum dss_clk_source clk_src) ...@@ -324,17 +329,27 @@ void dss_select_dispc_clk_source(enum dss_clk_source clk_src)
dss.dispc_clk_source = clk_src; dss.dispc_clk_source = clk_src;
} }
void dss_select_dsi_clk_source(enum dss_clk_source clk_src) void dss_select_dsi_clk_source(int dsi_module,
enum omap_dss_clk_source clk_src)
{ {
struct platform_device *dsidev;
int b; int b;
switch (clk_src) { switch (clk_src) {
case DSS_CLK_SRC_FCK: case OMAP_DSS_CLK_SRC_FCK:
b = 0; b = 0;
break; break;
case DSS_CLK_SRC_DSI_PLL_HSDIV_DSI: case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI:
BUG_ON(dsi_module != 0);
b = 1;
dsidev = dsi_get_dsidev_from_id(0);
dsi_wait_pll_hsdiv_dsi_active(dsidev);
break;
case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI:
BUG_ON(dsi_module != 1);
b = 1; b = 1;
dsi_wait_pll_hsdiv_dsi_active(); dsidev = dsi_get_dsidev_from_id(1);
dsi_wait_pll_hsdiv_dsi_active(dsidev);
break; break;
default: default:
BUG(); BUG();
...@@ -342,25 +357,33 @@ void dss_select_dsi_clk_source(enum dss_clk_source clk_src) ...@@ -342,25 +357,33 @@ void dss_select_dsi_clk_source(enum dss_clk_source clk_src)
REG_FLD_MOD(DSS_CONTROL, b, 1, 1); /* DSI_CLK_SWITCH */ REG_FLD_MOD(DSS_CONTROL, b, 1, 1); /* DSI_CLK_SWITCH */
dss.dsi_clk_source = clk_src; dss.dsi_clk_source[dsi_module] = clk_src;
} }
void dss_select_lcd_clk_source(enum omap_channel channel, void dss_select_lcd_clk_source(enum omap_channel channel,
enum dss_clk_source clk_src) enum omap_dss_clk_source clk_src)
{ {
struct platform_device *dsidev;
int b, ix, pos; int b, ix, pos;
if (!dss_has_feature(FEAT_LCD_CLK_SRC)) if (!dss_has_feature(FEAT_LCD_CLK_SRC))
return; return;
switch (clk_src) { switch (clk_src) {
case DSS_CLK_SRC_FCK: case OMAP_DSS_CLK_SRC_FCK:
b = 0; b = 0;
break; break;
case DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
BUG_ON(channel != OMAP_DSS_CHANNEL_LCD); BUG_ON(channel != OMAP_DSS_CHANNEL_LCD);
b = 1; b = 1;
dsi_wait_pll_hsdiv_dispc_active(); dsidev = dsi_get_dsidev_from_id(0);
dsi_wait_pll_hsdiv_dispc_active(dsidev);
break;
case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
BUG_ON(channel != OMAP_DSS_CHANNEL_LCD2);
b = 1;
dsidev = dsi_get_dsidev_from_id(1);
dsi_wait_pll_hsdiv_dispc_active(dsidev);
break; break;
default: default:
BUG(); BUG();
...@@ -373,17 +396,17 @@ void dss_select_lcd_clk_source(enum omap_channel channel, ...@@ -373,17 +396,17 @@ void dss_select_lcd_clk_source(enum omap_channel channel,
dss.lcd_clk_source[ix] = clk_src; dss.lcd_clk_source[ix] = clk_src;
} }
enum dss_clk_source dss_get_dispc_clk_source(void) enum omap_dss_clk_source dss_get_dispc_clk_source(void)
{ {
return dss.dispc_clk_source; return dss.dispc_clk_source;
} }
enum dss_clk_source dss_get_dsi_clk_source(void) enum omap_dss_clk_source dss_get_dsi_clk_source(int dsi_module)
{ {
return dss.dsi_clk_source; return dss.dsi_clk_source[dsi_module];
} }
enum dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel) enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel)
{ {
if (dss_has_feature(FEAT_LCD_CLK_SRC)) { if (dss_has_feature(FEAT_LCD_CLK_SRC)) {
int ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1; int ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1;
...@@ -665,13 +688,18 @@ static int dss_init(void) ...@@ -665,13 +688,18 @@ static int dss_init(void)
* the kernel resets it */ * the kernel resets it */
omap_writel(omap_readl(0x48050440) & ~0x3, 0x48050440); omap_writel(omap_readl(0x48050440) & ~0x3, 0x48050440);
#ifdef CONFIG_OMAP2_DSS_SLEEP_BEFORE_RESET
/* We need to wait here a bit, otherwise we sometimes start to /* We need to wait here a bit, otherwise we sometimes start to
* get synclost errors, and after that only power cycle will * get synclost errors, and after that only power cycle will
* restore DSS functionality. I have no idea why this happens. * restore DSS functionality. I have no idea why this happens.
* And we have to wait _before_ resetting the DSS, but after * And we have to wait _before_ resetting the DSS, but after
* enabling clocks. * enabling clocks.
*
* This bug was at least present on OMAP3430. It's unknown
* if it happens on OMAP2 or OMAP3630.
*/ */
msleep(50); msleep(50);
#endif
_omap_dss_reset(); _omap_dss_reset();
...@@ -706,10 +734,11 @@ static int dss_init(void) ...@@ -706,10 +734,11 @@ static int dss_init(void)
dss.dpll4_m4_ck = dpll4_m4_ck; dss.dpll4_m4_ck = dpll4_m4_ck;
dss.dsi_clk_source = DSS_CLK_SRC_FCK; dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
dss.dispc_clk_source = DSS_CLK_SRC_FCK; dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK;
dss.lcd_clk_source[0] = DSS_CLK_SRC_FCK; dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK;
dss.lcd_clk_source[1] = DSS_CLK_SRC_FCK; dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK;
dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK;
dss_save_context(); dss_save_context();
...@@ -1021,6 +1050,14 @@ static void core_dump_clocks(struct seq_file *s) ...@@ -1021,6 +1050,14 @@ static void core_dump_clocks(struct seq_file *s)
dss.dss_video_fck dss.dss_video_fck
}; };
const char *names[5] = {
"ick",
"fck",
"sys_clk",
"tv_fck",
"video_fck"
};
seq_printf(s, "- CORE -\n"); seq_printf(s, "- CORE -\n");
seq_printf(s, "internal clk count\t\t%u\n", dss.num_clks_enabled); seq_printf(s, "internal clk count\t\t%u\n", dss.num_clks_enabled);
...@@ -1028,8 +1065,11 @@ static void core_dump_clocks(struct seq_file *s) ...@@ -1028,8 +1065,11 @@ static void core_dump_clocks(struct seq_file *s)
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
if (!clocks[i]) if (!clocks[i])
continue; continue;
seq_printf(s, "%-15s\t%lu\t%d\n", seq_printf(s, "%s (%s)%*s\t%lu\t%d\n",
names[i],
clocks[i]->name, clocks[i]->name,
24 - strlen(names[i]) - strlen(clocks[i]->name),
"",
clk_get_rate(clocks[i]), clk_get_rate(clocks[i]),
clocks[i]->usecount); clocks[i]->usecount);
} }
......
...@@ -117,15 +117,6 @@ enum dss_clock { ...@@ -117,15 +117,6 @@ enum dss_clock {
DSS_CLK_VIDFCK = 1 << 4, /* DSS_96M_FCLK*/ DSS_CLK_VIDFCK = 1 << 4, /* DSS_96M_FCLK*/
}; };
enum dss_clk_source {
DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC, /* OMAP3: DSI1_PLL_FCLK
* OMAP4: PLL1_CLK1 */
DSS_CLK_SRC_DSI_PLL_HSDIV_DSI, /* OMAP3: DSI2_PLL_FCLK
* OMAP4: PLL1_CLK2 */
DSS_CLK_SRC_FCK, /* OMAP2/3: DSS1_ALWON_FCLK
* OMAP4: DSS_FCLK */
};
enum dss_hdmi_venc_clk_source_select { enum dss_hdmi_venc_clk_source_select {
DSS_VENC_TV_CLK = 0, DSS_VENC_TV_CLK = 0,
DSS_HDMI_M_PCLK = 1, DSS_HDMI_M_PCLK = 1,
...@@ -236,7 +227,7 @@ void dss_clk_enable(enum dss_clock clks); ...@@ -236,7 +227,7 @@ void dss_clk_enable(enum dss_clock clks);
void dss_clk_disable(enum dss_clock clks); void dss_clk_disable(enum dss_clock clks);
unsigned long dss_clk_get_rate(enum dss_clock clk); unsigned long dss_clk_get_rate(enum dss_clock clk);
int dss_need_ctx_restore(void); int dss_need_ctx_restore(void);
const char *dss_get_generic_clk_source_name(enum dss_clk_source clk_src); const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src);
void dss_dump_clocks(struct seq_file *s); void dss_dump_clocks(struct seq_file *s);
void dss_dump_regs(struct seq_file *s); void dss_dump_regs(struct seq_file *s);
...@@ -248,13 +239,14 @@ void dss_sdi_init(u8 datapairs); ...@@ -248,13 +239,14 @@ void dss_sdi_init(u8 datapairs);
int dss_sdi_enable(void); int dss_sdi_enable(void);
void dss_sdi_disable(void); void dss_sdi_disable(void);
void dss_select_dispc_clk_source(enum dss_clk_source clk_src); void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src);
void dss_select_dsi_clk_source(enum dss_clk_source clk_src); void dss_select_dsi_clk_source(int dsi_module,
enum omap_dss_clk_source clk_src);
void dss_select_lcd_clk_source(enum omap_channel channel, void dss_select_lcd_clk_source(enum omap_channel channel,
enum dss_clk_source clk_src); enum omap_dss_clk_source clk_src);
enum dss_clk_source dss_get_dispc_clk_source(void); enum omap_dss_clk_source dss_get_dispc_clk_source(void);
enum dss_clk_source dss_get_dsi_clk_source(void); enum omap_dss_clk_source dss_get_dsi_clk_source(int dsi_module);
enum dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel); enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel);
void dss_set_venc_output(enum omap_dss_venc_type type); void dss_set_venc_output(enum omap_dss_venc_type type);
void dss_set_dac_pwrdn_bgz(bool enable); void dss_set_dac_pwrdn_bgz(bool enable);
...@@ -284,31 +276,39 @@ static inline void sdi_exit(void) ...@@ -284,31 +276,39 @@ static inline void sdi_exit(void)
/* DSI */ /* DSI */
#ifdef CONFIG_OMAP2_DSS_DSI #ifdef CONFIG_OMAP2_DSS_DSI
struct dentry;
struct file_operations;
int dsi_init_platform_driver(void); int dsi_init_platform_driver(void);
void dsi_uninit_platform_driver(void); void dsi_uninit_platform_driver(void);
void dsi_dump_clocks(struct seq_file *s); void dsi_dump_clocks(struct seq_file *s);
void dsi_dump_irqs(struct seq_file *s); void dsi_create_debugfs_files_irq(struct dentry *debugfs_dir,
void dsi_dump_regs(struct seq_file *s); const struct file_operations *debug_fops);
void dsi_create_debugfs_files_reg(struct dentry *debugfs_dir,
const struct file_operations *debug_fops);
void dsi_save_context(void); void dsi_save_context(void);
void dsi_restore_context(void); void dsi_restore_context(void);
int dsi_init_display(struct omap_dss_device *display); int dsi_init_display(struct omap_dss_device *display);
void dsi_irq_handler(void); void dsi_irq_handler(void);
unsigned long dsi_get_pll_hsdiv_dispc_rate(void); unsigned long dsi_get_pll_hsdiv_dispc_rate(struct platform_device *dsidev);
int dsi_pll_set_clock_div(struct dsi_clock_info *cinfo); int dsi_pll_set_clock_div(struct platform_device *dsidev,
int dsi_pll_calc_clock_div_pck(bool is_tft, unsigned long req_pck, struct dsi_clock_info *cinfo);
struct dsi_clock_info *cinfo, int dsi_pll_calc_clock_div_pck(struct platform_device *dsidev, bool is_tft,
unsigned long req_pck, struct dsi_clock_info *cinfo,
struct dispc_clock_info *dispc_cinfo); struct dispc_clock_info *dispc_cinfo);
int dsi_pll_init(struct omap_dss_device *dssdev, bool enable_hsclk, int dsi_pll_init(struct platform_device *dsidev, bool enable_hsclk,
bool enable_hsdiv); bool enable_hsdiv);
void dsi_pll_uninit(void); void dsi_pll_uninit(struct platform_device *dsidev, bool disconnect_lanes);
void dsi_get_overlay_fifo_thresholds(enum omap_plane plane, void dsi_get_overlay_fifo_thresholds(enum omap_plane plane,
u32 fifo_size, enum omap_burst_size *burst_size, u32 fifo_size, enum omap_burst_size *burst_size,
u32 *fifo_low, u32 *fifo_high); u32 *fifo_low, u32 *fifo_high);
void dsi_wait_pll_hsdiv_dispc_active(void); void dsi_wait_pll_hsdiv_dispc_active(struct platform_device *dsidev);
void dsi_wait_pll_hsdiv_dsi_active(void); void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev);
struct platform_device *dsi_get_dsidev_from_id(int module);
#else #else
static inline int dsi_init_platform_driver(void) static inline int dsi_init_platform_driver(void)
{ {
...@@ -317,17 +317,47 @@ static inline int dsi_init_platform_driver(void) ...@@ -317,17 +317,47 @@ static inline int dsi_init_platform_driver(void)
static inline void dsi_uninit_platform_driver(void) static inline void dsi_uninit_platform_driver(void)
{ {
} }
static inline unsigned long dsi_get_pll_hsdiv_dispc_rate(void) static inline unsigned long dsi_get_pll_hsdiv_dispc_rate(struct platform_device *dsidev)
{ {
WARN("%s: DSI not compiled in, returning rate as 0\n", __func__); WARN("%s: DSI not compiled in, returning rate as 0\n", __func__);
return 0; return 0;
} }
static inline void dsi_wait_pll_hsdiv_dispc_active(void) static inline int dsi_pll_set_clock_div(struct platform_device *dsidev,
struct dsi_clock_info *cinfo)
{
WARN("%s: DSI not compiled in\n", __func__);
return -ENODEV;
}
static inline int dsi_pll_calc_clock_div_pck(struct platform_device *dsidev,
bool is_tft, unsigned long req_pck,
struct dsi_clock_info *dsi_cinfo,
struct dispc_clock_info *dispc_cinfo)
{
WARN("%s: DSI not compiled in\n", __func__);
return -ENODEV;
}
static inline int dsi_pll_init(struct platform_device *dsidev,
bool enable_hsclk, bool enable_hsdiv)
{ {
WARN("%s: DSI not compiled in\n", __func__);
return -ENODEV;
} }
static inline void dsi_wait_pll_hsdiv_dsi_active(void) static inline void dsi_pll_uninit(struct platform_device *dsidev,
bool disconnect_lanes)
{ {
} }
static inline void dsi_wait_pll_hsdiv_dispc_active(struct platform_device *dsidev)
{
}
static inline void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev)
{
}
static inline struct platform_device *dsi_get_dsidev_from_id(int module)
{
WARN("%s: DSI not compiled in, returning platform device as NULL\n",
__func__);
return NULL;
}
#endif #endif
/* DPI */ /* DPI */
...@@ -391,7 +421,8 @@ int dispc_setup_plane(enum omap_plane plane, ...@@ -391,7 +421,8 @@ int dispc_setup_plane(enum omap_plane plane,
enum omap_dss_rotation_type rotation_type, enum omap_dss_rotation_type rotation_type,
u8 rotation, bool mirror, u8 rotation, bool mirror,
u8 global_alpha, u8 pre_mult_alpha, u8 global_alpha, u8 pre_mult_alpha,
enum omap_channel channel); enum omap_channel channel,
u32 puv_addr);
bool dispc_go_busy(enum omap_channel channel); bool dispc_go_busy(enum omap_channel channel);
void dispc_go(enum omap_channel channel); void dispc_go(enum omap_channel channel);
...@@ -485,13 +516,6 @@ void hdmi_panel_exit(void); ...@@ -485,13 +516,6 @@ void hdmi_panel_exit(void);
int rfbi_init_platform_driver(void); int rfbi_init_platform_driver(void);
void rfbi_uninit_platform_driver(void); void rfbi_uninit_platform_driver(void);
void rfbi_dump_regs(struct seq_file *s); 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(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); int rfbi_init_display(struct omap_dss_device *display);
#else #else
static inline int rfbi_init_platform_driver(void) static inline int rfbi_init_platform_driver(void)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/module.h> #include <linux/module.h>
#include <plat/display.h> #include <video/omapdss.h>
#include "dss.h" #include "dss.h"
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include "dss.h" #include "dss.h"
......
This diff is collapsed.
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include <linux/omapfb.h> #include <linux/omapfb.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <plat/display.h> #include <video/omapdss.h>
#include <plat/vrfb.h> #include <plat/vrfb.h>
#include <plat/vram.h> #include <plat/vram.h>
...@@ -895,8 +895,16 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) ...@@ -895,8 +895,16 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
p.display_info.xres = xres; p.display_info.xres = xres;
p.display_info.yres = yres; p.display_info.yres = yres;
p.display_info.width = 0;
p.display_info.height = 0; if (display->driver->get_dimensions) {
u32 w, h;
display->driver->get_dimensions(display, &w, &h);
p.display_info.width = w;
p.display_info.height = h;
} else {
p.display_info.width = 0;
p.display_info.height = 0;
}
if (copy_to_user((void __user *)arg, &p.display_info, if (copy_to_user((void __user *)arg, &p.display_info,
sizeof(p.display_info))) sizeof(p.display_info)))
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment