diff options
Diffstat (limited to 'arch')
-rwxr-xr-x | arch/arm/configs/u5500_defconfig | 5 | ||||
-rwxr-xr-x | arch/arm/configs/u8500_defconfig | 8 | ||||
-rw-r--r-- | arch/arm/configs/u8500_snowball_android_defconfig | 6 | ||||
-rwxr-xr-x | arch/arm/configs/u9500_defconfig | 8 | ||||
-rw-r--r-- | arch/arm/mach-ux500/Kconfig-arch | 74 | ||||
-rw-r--r-- | arch/arm/mach-ux500/Makefile | 7 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-mop500-mcde.c | 263 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-mop500-mcde.h | 24 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-mop500.c | 8 | ||||
-rw-r--r-- | arch/arm/mach-ux500/board-u5500-mcde.c | 133 |
10 files changed, 144 insertions, 392 deletions
diff --git a/arch/arm/configs/u5500_defconfig b/arch/arm/configs/u5500_defconfig index 171825c28ae..de080861597 100755 --- a/arch/arm/configs/u5500_defconfig +++ b/arch/arm/configs/u5500_defconfig @@ -27,9 +27,6 @@ CONFIG_MACH_U5500=y CONFIG_UX500_DEBUG_UART=0 CONFIG_U5500_MLOADER=y CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_VSYNC=y -CONFIG_MCDE_DISPLAY_PRIMARY_32BPP=y -CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY=y -CONFIG_DISPLAY_AV8100_TERTIARY=y CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER=y CONFIG_UX500_SUSPEND=y CONFIG_UX500_SUSPEND_DBG=y @@ -143,7 +140,7 @@ CONFIG_SND_SOC_CG29XX=y CONFIG_GPU_MALI=y CONFIG_FB=y CONFIG_FB_MCDE=y -CONFIG_MCDE_DISPLAY_DSI=y +CONFIG_MCDE_DISPLAY_SONY_ACX424AKP_DSI=y CONFIG_MCDE_DISPLAY_AV8100=y # CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE is not set CONFIG_AV8100=y diff --git a/arch/arm/configs/u8500_defconfig b/arch/arm/configs/u8500_defconfig index c0180ad2abf..f36054ba11e 100755 --- a/arch/arm/configs/u8500_defconfig +++ b/arch/arm/configs/u8500_defconfig @@ -26,14 +26,10 @@ CONFIG_MACH_HREFV60=y CONFIG_MACH_SNOWBALL=y CONFIG_U8500_REGULATOR_DEBUG=y CONFIG_DB8500_MLOADER=y -CONFIG_DISPLAY_GENERIC_PRIMARY=y -CONFIG_DISPLAY_GENERIC_DSI_PRIMARY=y -CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY=y -CONFIG_MCDE_DISPLAY_PRIMARY_32BPP=y CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_90=y CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE=90 CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_VSYNC=y -CONFIG_DISPLAY_AV8100_TERTIARY=y +CONFIG_U8500_TV_OUTPUT_AV8100=y CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER=y CONFIG_DBX500_PRCMU_QOS_POWER=y CONFIG_UX500_GPIO_KEYS=y @@ -274,8 +270,8 @@ CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y CONFIG_FB_SYS_FOPS=y CONFIG_FB_MCDE=y +CONFIG_MCDE_DISPLAY_SONY_ACX424AKP_DSI=y CONFIG_MCDE_DISPLAY_SAMSUNG_S6D16D0=y -CONFIG_MCDE_DISPLAY_GENERIC_DSI=y CONFIG_MCDE_DISPLAY_AV8100=y # CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE is not set CONFIG_FB_B2R2=y diff --git a/arch/arm/configs/u8500_snowball_android_defconfig b/arch/arm/configs/u8500_snowball_android_defconfig index c35e93dc39e..1c406674762 100644 --- a/arch/arm/configs/u8500_snowball_android_defconfig +++ b/arch/arm/configs/u8500_snowball_android_defconfig @@ -24,8 +24,7 @@ CONFIG_UX500_SOC_DB8500=y CONFIG_MACH_HREFV60=y CONFIG_MACH_SNOWBALL=y CONFIG_UX500_PRCMU_TIMER=y -# CONFIG_DISPLAY_GENERIC_PRIMARY is not set -CONFIG_DISPLAY_AV8100_TERTIARY=y +CONFIG_U8500_TV_OUTPUT_AV8100=y CONFIG_UX500_SUSPEND=y CONFIG_UX500_SUSPEND_STANDBY=y CONFIG_UX500_SUSPEND_MEM=y @@ -160,7 +159,8 @@ CONFIG_VIDEO_DEV=y # CONFIG_VIDEO_CAPTURE_DRIVERS is not set CONFIG_FB=y CONFIG_FB_MCDE=y -CONFIG_MCDE_DISPLAY_GENERIC_DSI=y +CONFIG_MCDE_DISPLAY_AV8100=y +CONFIG_AV8100=y CONFIG_AV8100_HWTRIG_I2SDAT3=y CONFIG_FB_B2R2=y CONFIG_B2R2_PLUG_CONF=y diff --git a/arch/arm/configs/u9500_defconfig b/arch/arm/configs/u9500_defconfig index c00f4825d14..d99b32e9f99 100755 --- a/arch/arm/configs/u9500_defconfig +++ b/arch/arm/configs/u9500_defconfig @@ -26,13 +26,10 @@ CONFIG_MACH_HREFV60=y CONFIG_MACH_SNOWBALL=y CONFIG_U8500_REGULATOR_DEBUG=y CONFIG_DB8500_MLOADER=y -CONFIG_DISPLAY_GENERIC_PRIMARY=y -CONFIG_DISPLAY_GENERIC_DSI_PRIMARY=y -CONFIG_MCDE_DISPLAY_PRIMARY_32BPP=y CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_90=y CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE=90 CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_VSYNC=y -CONFIG_DISPLAY_AV8100_TERTIARY=y +CONFIG_U8500_TV_OUTPUT_AV8100=y CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER=y CONFIG_DBX500_PRCMU_QOS_POWER=y CONFIG_DBX500_PRCMU_DEBUG=y @@ -276,7 +273,8 @@ CONFIG_FB_SYS_COPYAREA=y CONFIG_FB_SYS_IMAGEBLIT=y CONFIG_FB_SYS_FOPS=y CONFIG_FB_MCDE=y -CONFIG_MCDE_DISPLAY_GENERIC_DSI=y +CONFIG_MCDE_DISPLAY_SONY_ACX424AKP_DSI=y +CONFIG_MCDE_DISPLAY_SAMSUNG_S6D16D0=y CONFIG_MCDE_DISPLAY_AV8100=y # CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE is not set CONFIG_FB_B2R2=y diff --git a/arch/arm/mach-ux500/Kconfig-arch b/arch/arm/mach-ux500/Kconfig-arch index f619ace5635..c3e0fa583a1 100644 --- a/arch/arm/mach-ux500/Kconfig-arch +++ b/arch/arm/mach-ux500/Kconfig-arch @@ -8,26 +8,21 @@ config U8500_SECURE if FB_MCDE -menu "Display selection" - -config DISPLAY_GENERIC_PRIMARY - bool "Generic primary display support" - depends on (MACH_U8500 || MACH_U5500) - select MCDE_DISPLAY_DSI - default y +menu "Display setup" choice - prompt "Display port type" - depends on DISPLAY_GENERIC_PRIMARY - default DISPLAY_GENERIC_DSI_PRIMARY + prompt "TV output type" + default U8500_TV_OUTPUT_AV8100 help - Select the kind of display port used for the primary display + Select the source of TV output to use -config DISPLAY_GENERIC_DSI_PRIMARY - bool "DSI display" - select MCDE_DISPLAY_GENERIC_DSI - help - Say yes here when using a DSI display +config U8500_TV_OUTPUT_AV8100 + bool "AV8100 (HDMI/CVBS)" + depends on MCDE_DISPLAY_AV8100 + +config U8500_TV_OUTPUT_AB8500 + bool "AB8500 (CVBS)" + depends on MCDE_DISPLAY_AB8500_DENC endchoice @@ -52,7 +47,6 @@ endchoice choice DISPLAY_GENERIC_DSI_PRIMARY_ROTATION prompt "Enable main display rotation" - depends on DISPLAY_GENERIC_DSI_PRIMARY default DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_90 help Set rotation of main display @@ -69,7 +63,6 @@ endchoice config DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE int - depends on DISPLAY_GENERIC_DSI_PRIMARY default "0" if DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_0 default "90" if DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_90 default "180" if DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_180 @@ -77,59 +70,16 @@ config DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE config DISPLAY_GENERIC_DSI_PRIMARY_VSYNC bool "Enable v-sync for primary display" - depends on DISPLAY_GENERIC_DSI_PRIMARY default n help Say yes to enable v-sync for primary display -config DISPLAY_SONY_ACX424AKP_DSI_PRIMARY - bool "Sony acx424akp DSI display" - select MCDE_DISPLAY_SONY_ACX424AKP_DSI - select MCDE_DISPLAY_DSI - help - Say yes here when using a sony acx424akp DSI display - -config DISPLAY_GENERIC_DSI_SECONDARY - bool "Sub display support" - depends on MACH_U8500 - select MCDE_DISPLAY_GENERIC_DSI - select MCDE_DISPLAY_DSI - help - Say yes here if sub display exists - -config DISPLAY_GENERIC_DSI_SECONDARY_VSYNC - bool "Enable v-sync for secondary display" - depends on DISPLAY_GENERIC_DSI_SECONDARY - help - Say yes to enable v-sync for secondary display - -config DISPLAY_AB8500_TERTIARY - bool "AB8500 TVout display support" - depends on MACH_U8500 && !AV8100_SDTV - select MCDE_DISPLAY_AB8500_DENC - help - Say yes here if tv out support - -config DISPLAY_AV8100_TERTIARY - bool "AV8100 HDMI/CVBS display support" - depends on (MACH_U8500 || MACH_U5500) - select MCDE_DISPLAY_AV8100 - select MCDE_DISPLAY_DSI - help - Say yes here if HDMI output support - config DISPLAY_AV8100_TRIPPLE_BUFFER bool "Enable tripple buffer for HDMI display" - depends on DISPLAY_AV8100_TERTIARY + depends on MCDE_DISPLAY_AV8100 help Say yes to enable tripple buffer. You'll get double buffer otherwise -config DISPLAY_FICTIVE - bool "DISPLAY fictive" - default n - ---help--- - Say Y if you want a fictive display that doesn't access hardware - endmenu endif diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile index dd633940dfb..07988f6f823 100644 --- a/arch/arm/mach-ux500/Makefile +++ b/arch/arm/mach-ux500/Makefile @@ -14,27 +14,28 @@ ifeq ($(CONFIG_UX500_SOC_DB5500), y) obj-$(CONFIG_UX500_SOC_DBX500) += cpu-db5500.o dma-db5500.o \ devices-db5500.o clock-db5500.o obj-$(CONFIG_TOUCHSCREEN_CYTTSP_SPI) += board-u5500-cyttsp.o +board-mcde-objs += board-u5500-mcde.o endif ifeq ($(CONFIG_UX500_SOC_DB8500), y) obj-$(CONFIG_UX500_SOC_DBX500) += cpu-db8500.o devices-db8500.o \ clock-db8500.o dma-db8500.o +board-mcde-objs += board-mop500-mcde.o endif obj-$(CONFIG_MACH_U8500) += board-mop500.o board-mop500-sdi.o \ board-mop500-regulators.o \ board-mop500-uib.o board-mop500-stuib.o \ board-mop500-u8500uib.o board-mop500-pins.o \ - board-mop500-mcde.o \ board-mop500-msp.o board-mop500-bm.o \ board-pins-sleep-force.o \ board-mop500-wlan.o \ board-mop500-cyttsp.o obj-$(CONFIG_ANDROID_STE_TIMED_VIBRA) += board-mop500-vibra.o obj-$(CONFIG_MACH_U5500) += board-u5500.o board-u5500-sdi.o \ - board-u5500-mcde.o \ board-u5500-regulators.o \ board-u5500-pins.o \ board-u5500-wlan.o +obj-$(CONFIG_FB_MCDE) += board-mcde.o obj-$(CONFIG_U5500_MMIO) += board-u5500-mmio.o obj-$(CONFIG_U8500_MMIO) += board-mop500-mmio.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o @@ -54,4 +55,4 @@ obj-$(CONFIG_AB5500_BM) += board-u5500-bm.o obj-$(CONFIG_DBX500_PRCMU_DEBUG) += prcmu-debug.o ifeq ($(CONFIG_UX500_SOC_DB8500), y) obj-$(CONFIG_STM_TRACE) += board-mop500-stm.o -endif
\ No newline at end of file +endif diff --git a/arch/arm/mach-ux500/board-mop500-mcde.c b/arch/arm/mach-ux500/board-mop500-mcde.c index ceaffc1e203..65a3256d5b3 100644 --- a/arch/arm/mach-ux500/board-mop500-mcde.c +++ b/arch/arm/mach-ux500/board-mop500-mcde.c @@ -6,6 +6,7 @@ * * License terms: GNU General Public License (GPL), version 2. */ + #include <linux/platform_device.h> #include <linux/kernel.h> #include <linux/gpio.h> @@ -30,11 +31,9 @@ #define DSI_UNIT_INTERVAL_1 0x9 #define DSI_UNIT_INTERVAL_2 0x5 -#ifdef CONFIG_FB_MCDE - +#ifdef CONFIG_U8500_TV_OUTPUT_AV8100 /* The initialization of hdmi disp driver must be delayed in order to * ensure that inputclk will be available (needed by hdmi hw) */ -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY static struct delayed_work work_dispreg_hdmi; #define DISPREG_HDMI_DELAY 6000 #endif @@ -47,6 +46,7 @@ enum { AB8500_DISPLAY_ID, MCDE_NR_OF_DISPLAYS }; + static int display_initialized_during_boot; static int __init startup_graphics_setup(char *str) @@ -69,8 +69,8 @@ static int __init startup_graphics_setup(char *str) } __setup("startup_graphics=", startup_graphics_setup); -#if defined(CONFIG_DISPLAY_AB8500_TERTIARY) ||\ - defined(CONFIG_DISPLAY_AV8100_TERTIARY) +#if defined(CONFIG_U8500_TV_OUTPUT_AV8100) || \ + defined(CONFIG_U8500_TV_OUTPUT_AB8500) static struct mcde_col_transform rgb_2_yCbCr_transform = { .matrix = { {0x0042, 0x0081, 0x0019}, @@ -81,18 +81,6 @@ static struct mcde_col_transform rgb_2_yCbCr_transform = { }; #endif -#ifdef CONFIG_DISPLAY_FICTIVE -static struct mcde_display_device fictive_display = { - .name = "mcde_disp_fictive", - .id = FICTIVE_DISPLAY_ID, - .fictive = true, - .default_pixel_format = MCDE_OVLYPIXFMT_RGB565, - .native_x_res = 1280, - .native_y_res = 720, -}; -#endif /* CONFIG_DISPLAY_FICTIVE */ - -#ifdef CONFIG_DISPLAY_GENERIC_DSI_PRIMARY static struct mcde_display_dsi_platform_data samsung_s6d16d0_pdata0 = { .link = 0, }; @@ -102,11 +90,7 @@ static struct mcde_display_device samsung_s6d16d0_display0 = { .id = PRIMARY_DISPLAY_ID, .chnl_id = MCDE_CHNL_A, .fifo = MCDE_FIFO_A, -#ifdef CONFIG_MCDE_DISPLAY_PRIMARY_16BPP - .default_pixel_format = MCDE_OVLYPIXFMT_RGB565, -#else .default_pixel_format = MCDE_OVLYPIXFMT_RGBA8888, -#endif #ifdef CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_VSYNC .synchronized_update = true, #else @@ -119,14 +103,12 @@ static struct mcde_display_device samsung_s6d16d0_display0 = { .platform_data = &samsung_s6d16d0_pdata0, }, }; -#endif /* CONFIG_DISPLAY_GENERIC_DSI_PRIMARY */ -#ifdef CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY static struct mcde_port sony_port0 = { .link = 0, }; -struct mcde_display_sony_acx424akp_platform_data +static struct mcde_display_sony_acx424akp_platform_data sony_acx424akp_display0_pdata = { .reset_gpio = HREFV60_DISP2_RST_GPIO, }; @@ -136,22 +118,20 @@ static struct mcde_display_device sony_acx424akp_display0 = { .id = PRIMARY_DISPLAY_ID, .port = &sony_port0, .chnl_id = MCDE_CHNL_A, - /* - * A large fifo is needed when ddr is clocked down to 25% to not get - * latency problems. - */ .fifo = MCDE_FIFO_A, .default_pixel_format = MCDE_OVLYPIXFMT_RGBA8888, +#ifdef CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_VSYNC .synchronized_update = true, +#else + .synchronized_update = false, +#endif .rotbuf1 = U8500_ESRAM_BASE + 0x20000 * 4 + 0x2000, .rotbuf2 = U8500_ESRAM_BASE + 0x20000 * 4 + 0x10000, .dev = { .platform_data = &sony_acx424akp_display0_pdata, }, }; -#endif /* CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY */ -#ifdef CONFIG_DISPLAY_GENERIC_DSI_SECONDARY static struct mcde_display_dsi_platform_data samsung_s6d16d0_pdata1 = { .link = 1, }; @@ -162,22 +142,16 @@ static struct mcde_display_device samsung_s6d16d0_display1 = { .chnl_id = MCDE_CHNL_C1, .fifo = MCDE_FIFO_C1, .default_pixel_format = MCDE_OVLYPIXFMT_RGB565, -#ifdef CONFIG_DISPLAY_GENERIC_DSI_SECONDARY_VSYNC - .synchronized_update = true, -#else .synchronized_update = false, -#endif .dev = { .platform_data = &samsung_s6d16d0_pdata1, }, }; -#endif /* CONFIG_DISPLAY_GENERIC_DSI_SECONDARY */ -#ifdef CONFIG_DISPLAY_AB8500_TERTIARY +#ifdef CONFIG_U8500_TV_OUTPUT_AB8500 static struct mcde_port port_tvout1 = { .type = MCDE_PORTTYPE_DPI, .pixel_format = MCDE_PORTPIXFMT_DPI_24BPP, - .ifc = 0, .link = 1, /* channel B */ .sync_src = MCDE_SYNCSRC_OFF, .update_auto_trig = true, @@ -236,7 +210,7 @@ failed: return res; } -struct mcde_display_device tvout_ab8500_display = { +static struct mcde_display_device tvout_ab8500_display = { .name = "mcde_tv_ab8500", .id = AB8500_DISPLAY_ID, .port = &port_tvout1, @@ -245,7 +219,6 @@ struct mcde_display_device tvout_ab8500_display = { .default_pixel_format = MCDE_OVLYPIXFMT_RGB565, .native_x_res = 720, .native_y_res = 576, - /* .synchronized_update: Don't care: port is set to update_auto_trig */ .dev = { .platform_data = &ab8500_display_pdata, }, @@ -258,46 +231,38 @@ struct mcde_display_device tvout_ab8500_display = { .platform_enable = ab8500_platform_enable, .platform_disable = ab8500_platform_disable, }; -#endif /* CONFIG_DISPLAY_AB8500_TERTIARY */ +#endif + +#ifdef CONFIG_U8500_TV_OUTPUT_AV8100 -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY -static struct mcde_port port2 = { +#if defined(CONFIG_AV8100_HWTRIG_INT) + #define AV8100_SYNC_SRC MCDE_SYNCSRC_TE0 +#elif defined(CONFIG_AV8100_HWTRIG_I2SDAT3) + #define AV8100_SYNC_SRC MCDE_SYNCSRC_TE1 +#elif defined(CONFIG_AV8100_HWTRIG_DSI_TE) + #define AV8100_SYNC_SRC MCDE_SYNCSRC_TE_POLLING +#else + #define AV8100_SYNC_SRC MCDE_SYNCSRC_OFF +#endif +static struct mcde_port av8100_port2 = { .type = MCDE_PORTTYPE_DSI, .mode = MCDE_PORTMODE_CMD, .pixel_format = MCDE_PORTPIXFMT_DSI_24BPP, .ifc = 1, .link = 2, -#ifdef CONFIG_AV8100_HWTRIG_INT - .sync_src = MCDE_SYNCSRC_TE0, -#endif -#ifdef CONFIG_AV8100_HWTRIG_I2SDAT3 - .sync_src = MCDE_SYNCSRC_TE1, -#endif -#ifdef CONFIG_AV8100_HWTRIG_DSI_TE - .sync_src = MCDE_SYNCSRC_TE_POLLING, -#endif -#ifdef CONFIG_AV8100_HWTRIG_NONE - .sync_src = MCDE_SYNCSRC_OFF, -#endif + .sync_src = AV8100_SYNC_SRC, .update_auto_trig = true, .phy = { .dsi = { - .virt_id = 0, .num_data_lanes = 2, .ui = DSI_UNIT_INTERVAL_2, - .clk_cont = false, - .data_lanes_swap = false, }, }, .hdmi_sdtv_switch = HDMI_SWITCH, }; static struct mcde_display_hdmi_platform_data av8100_hdmi_pdata = { - .reset_gpio = 0, - .reset_delay = 1, - .regulator_id = NULL, /* TODO: "display_main" */ .cvbs_regulator_id = "vcc-N2158", - .ddb_id = 1, .rgb_2_yCbCr_transform = &rgb_2_yCbCr_transform, }; @@ -342,10 +307,10 @@ failed: return res; } -struct mcde_display_device av8100_hdmi = { +static struct mcde_display_device av8100_hdmi = { .name = "av8100_hdmi", .id = AV8100_DISPLAY_ID, - .port = &port2, + .port = &av8100_port2, .chnl_id = MCDE_CHNL_B, .fifo = MCDE_FIFO_B, .default_pixel_format = MCDE_OVLYPIXFMT_RGB888, @@ -363,7 +328,7 @@ static void delayed_work_dispreg_hdmi(struct work_struct *ptr) if (mcde_display_device_register(&av8100_hdmi)) pr_warning("Failed to register av8100_hdmi\n"); } -#endif /* CONFIG_DISPLAY_AV8100_TERTIARY */ +#endif /* CONFIG_U8500_TV_OUTPUT_AV8100 */ /* * This function will create the framebuffer for the display that is registered. @@ -373,9 +338,8 @@ static int display_postregistered_callback(struct notifier_block *nb, { struct mcde_display_device *ddev = dev; u16 width, height; - u16 virtual_width, virtual_height; + u16 virtual_height; u32 rotate = FB_ROTATE_UR; - u32 rotate_angle = 0; struct fb_info *fbi; #ifdef CONFIG_DISPDEV struct mcde_fb *mfb; @@ -389,61 +353,33 @@ static int display_postregistered_callback(struct notifier_block *nb, mcde_dss_get_native_resolution(ddev, &width, &height); - if (uib_is_u8500uibr3()) - rotate_angle = 0; - else - rotate_angle = \ - CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_ROTATION_ANGLE; - -#if defined(CONFIG_DISPLAY_GENERIC_DSI_PRIMARY) || \ - defined(CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY) - if (ddev->id == PRIMARY_DISPLAY_ID) { - switch (rotate_angle) { - case 0: - rotate = FB_ROTATE_UR; - break; - case 90: - rotate = FB_ROTATE_CW; - swap(width, height); - break; - case 180: - rotate = FB_ROTATE_UD; - break; - case 270: - rotate = FB_ROTATE_CCW; - swap(width, height); - break; - } + if ((uib_is_u8500uib() || uib_is_stuib()) && + ddev->id == PRIMARY_DISPLAY_ID) { + rotate = FB_ROTATE_CW; + swap(width, height); } -#endif - virtual_width = width; virtual_height = height * 2; -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY if (ddev->id == AV8100_DISPLAY_ID) { +#ifdef CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER + virtual_height = height * 3; +#endif #ifdef CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE hdmi_fb_onoff(ddev, 1, 0, 0); #endif - goto display_postregistered_callback_end; + goto out; } -#endif /* CONFIG_DISPLAY_AV8100_TERTIARY */ /* Create frame buffer */ - fbi = mcde_fb_create(ddev, - width, height, - virtual_width, virtual_height, - ddev->default_pixel_format, - rotate); - + fbi = mcde_fb_create(ddev, width, height, width, virtual_height, + ddev->default_pixel_format, rotate); if (IS_ERR(fbi)) { dev_warn(&ddev->dev, - "Failed to create fb for display %s\n", - ddev->name); + "Failed to create fb for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { - dev_info(&ddev->dev, "Framebuffer created (%s)\n", - ddev->name); + dev_info(&ddev->dev, "Framebuffer created (%s)\n", ddev->name); } #ifdef CONFIG_DISPDEV @@ -452,18 +388,14 @@ static int display_postregistered_callback(struct notifier_block *nb, /* Create a dispdev overlay for this display */ if (dispdev_create(ddev, true, mfb->ovlys[0]) < 0) { dev_warn(&ddev->dev, - "Failed to create disp for display %s\n", - ddev->name); + "Failed to create disp for display %s\n", ddev->name); goto display_postregistered_callback_err; } else { - dev_info(&ddev->dev, "Disp dev created for (%s)\n", - ddev->name); + dev_info(&ddev->dev, "Disp dev created for (%s)\n", ddev->name); } #endif -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY -display_postregistered_callback_end: -#endif +out: return 0; display_postregistered_callback_err: @@ -474,97 +406,56 @@ static struct notifier_block display_nb = { .notifier_call = display_postregistered_callback, }; -static void setup_primary_display(void) +static int __init init_display_devices(void) { + if (!cpu_is_u8500()) + return 0; + + (void)mcde_dss_register_notifier(&display_nb); + + /* Set powermode to STANDBY if startup graphics is executed */ + if (display_initialized_during_boot) { + samsung_s6d16d0_display0.power_mode = MCDE_DISPLAY_PM_STANDBY; + sony_acx424akp_display0.power_mode = MCDE_DISPLAY_PM_STANDBY; + } + /* Display reset GPIO is different depending on reference boards */ - if (machine_is_hrefv60()) + if (machine_is_hrefv60()) { samsung_s6d16d0_pdata0.reset_gpio = HREFV60_DISP1_RST_GPIO; - else + samsung_s6d16d0_pdata1.reset_gpio = HREFV60_DISP2_RST_GPIO; + } + else { samsung_s6d16d0_pdata0.reset_gpio = MOP500_DISP1_RST_GPIO; + samsung_s6d16d0_pdata1.reset_gpio = MOP500_DISP2_RST_GPIO; + } - /* Not all STUIB supports VSYNC, disable vsync for STUIB */ -#ifdef CONFIG_DISPLAY_GENERIC_DSI_PRIMARY + /* Not all STUIBs supports VSYNC, disable vsync for STUIB */ if (uib_is_stuib()) samsung_s6d16d0_display0.synchronized_update = false; -#endif -} - -int __init init_display_devices(void) -{ - int ret = 0; - - if (!cpu_is_u8500()) - return ret; - - ret = mcde_dss_register_notifier(&display_nb); - if (ret) - pr_warning("Failed to register dss notifier\n"); -#ifdef CONFIG_DISPLAY_FICTIVE - ret = mcde_display_device_register(&fictive_display); - if (ret) - pr_warning("Failed to register fictive display device\n"); -#endif - - /* Set powermode to STANDBY if startup graphics is executed */ -#ifdef CONFIG_DISPLAY_GENERIC_PRIMARY - if (display_initialized_during_boot) - samsung_s6d16d0_display0.power_mode = MCDE_DISPLAY_PM_STANDBY; -#endif -#ifdef CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY - if (display_initialized_during_boot) - sony_acx424akp_display0.power_mode = MCDE_DISPLAY_PM_STANDBY; -#endif -#if defined(CONFIG_DISPLAY_GENERIC_PRIMARY) || \ - defined(CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY) - /* - * For reference platforms different panels are used - * depending on UIB - * UIB = User Interface Board - */ - setup_primary_display(); - -#ifdef CONFIG_DISPLAY_GENERIC_PRIMARY - /* Samsung display for STUIB and U8500UIB */ if (uib_is_u8500uib() || uib_is_stuib()) - ret = mcde_display_device_register(&samsung_s6d16d0_display0); -#endif -#ifdef CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY - /* Sony display on U8500UIBV3 */ - if (uib_is_u8500uibr3()) - ret = mcde_display_device_register(&sony_acx424akp_display0); -#endif - if (ret) - pr_warning("Failed to register primary display device\n"); -#endif + /* Samsung display on U8500 and ST UIB */ + (void)mcde_display_device_register(&samsung_s6d16d0_display0); + else if (uib_is_u8500uibr3()) + /* Sony display on U8500UIBV3 */ + (void)mcde_display_device_register(&sony_acx424akp_display0); + else + WARN_ON("Unknown UI board"); -#ifdef CONFIG_DISPLAY_GENERIC_DSI_SECONDARY /* Display reset GPIO is different depending on reference boards */ - if (machine_is_hrefv60()) - samsung_s6d16d0_pdata1.reset_gpio = HREFV60_DISP2_RST_GPIO; - else - samsung_s6d16d0_pdata1.reset_gpio = MOP500_DISP2_RST_GPIO; - ret = mcde_display_device_register(&samsung_s6d16d0_display1); - if (ret) - pr_warning("Failed to register sub display device\n"); -#endif + if (uib_is_stuib()) + (void)mcde_display_device_register(&samsung_s6d16d0_display1); -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY +#if defined(CONFIG_U8500_TV_OUTPUT_AV8100) INIT_DELAYED_WORK_DEFERRABLE(&work_dispreg_hdmi, delayed_work_dispreg_hdmi); - schedule_delayed_work(&work_dispreg_hdmi, msecs_to_jiffies(DISPREG_HDMI_DELAY)); -#endif -#ifdef CONFIG_DISPLAY_AB8500_TERTIARY - ret = mcde_display_device_register(&tvout_ab8500_display); - if (ret) - pr_warning("Failed to register ab8500 tvout device\n"); +#elif defined(CONFIG_U8500_TV_OUTPUT_AB8500) + (void)mcde_display_device_register(&tvout_ab8500_display); #endif - return ret; + return 0; } - module_init(init_display_devices); -#endif diff --git a/arch/arm/mach-ux500/board-mop500-mcde.h b/arch/arm/mach-ux500/board-mop500-mcde.h deleted file mode 100644 index 38094b81b34..00000000000 --- a/arch/arm/mach-ux500/board-mop500-mcde.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) ST-Ericsson SA 2011 - * - * License Terms: GNU General Public License v2 - * - * Author: Marcel Tunnissen <marcel.tuennissen@stericsson.com> for ST-Ericsson - * - * MOP500 board specific initialization for regulators - */ - -#ifndef __BOARD_MOP500_MCDE_H -#define __BOARD_MOP500_MCDE_H - -#include <video/mcde_display.h> - -#ifdef CONFIG_DISPLAY_AB8500_TERTIARY -extern struct mcde_display_device tvout_ab8500_display; -#endif - -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY -extern struct mcde_display_device av8100_hdmi; -#endif - -#endif /* __BOARD_MOP500_MCDE_H */ diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 3e380863288..0c614276fe9 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -712,7 +712,6 @@ static struct led_pwm pwm_leds_data[] = { .lth_brightness = 90, .pwm_period_ns = 1023, }, -#ifdef CONFIG_DISPLAY_GENERIC_DSI_SECONDARY [1] = { .name = "sec-lcd-backlight", .pwm_id = 2, @@ -720,15 +719,10 @@ static struct led_pwm pwm_leds_data[] = { .lth_brightness = 90, .pwm_period_ns = 1023, }, -#endif }; static struct led_pwm_platform_data u8500_leds_data = { -#ifdef CONFIG_DISPLAY_GENERIC_DSI_SECONDARY - .num_leds = 2, -#else .num_leds = 1, -#endif .leds = pwm_leds_data, }; @@ -1170,6 +1164,8 @@ static void __init mop500_init_machine(void) hsi_register_board_info(u8500_hsi_devices, ARRAY_SIZE(u8500_hsi_devices)); #endif + if (uib_is_stuib()) + u8500_leds_data.num_leds = 2; if (machine_is_snowball()) { platform_add_devices(snowball_platform_devs, diff --git a/arch/arm/mach-ux500/board-u5500-mcde.c b/arch/arm/mach-ux500/board-u5500-mcde.c index 3b5832d6086..1e5a5e6b3a1 100644 --- a/arch/arm/mach-ux500/board-u5500-mcde.c +++ b/arch/arm/mach-ux500/board-u5500-mcde.c @@ -6,6 +6,7 @@ * * License terms: GNU General Public License (GPL), version 2. */ + #include <linux/platform_device.h> #include <linux/kernel.h> #include <linux/gpio.h> @@ -23,26 +24,17 @@ #define DSI_UNIT_INTERVAL_0 0xA #define DSI_UNIT_INTERVAL_2 0x5 +/* The initialization of hdmi disp driver must be delayed in order to + * ensure that inputclk will be available (needed by hdmi hw) */ +static struct delayed_work work_dispreg_hdmi; +#define DISPREG_HDMI_DELAY 6000 + enum { -#ifdef CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY PRIMARY_DISPLAY_ID, -#endif -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY AV8100_DISPLAY_ID, -#endif MCDE_NR_OF_DISPLAYS }; - -#ifdef CONFIG_FB_MCDE - -/* The initialization of hdmi disp driver must be delayed in order to - * ensure that inputclk will be available (needed by hdmi hw) */ -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY -static struct delayed_work work_dispreg_hdmi; -#define DISPREG_HDMI_DELAY 6000 -#endif - static int display_initialized_during_boot; static int __init startup_graphics_setup(char *str) @@ -65,7 +57,6 @@ static int __init startup_graphics_setup(char *str) } __setup("startup_graphics=", startup_graphics_setup); -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY static struct mcde_col_transform rgb_2_yCbCr_transform = { .matrix = { {0x0042, 0x0081, 0x0019}, @@ -74,94 +65,76 @@ static struct mcde_col_transform rgb_2_yCbCr_transform = { }, .offset = {0x10, 0x80, 0x80}, }; -#endif -#ifdef CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY -static struct mcde_port port1 = { +static struct mcde_port sony_port0 = { .link = 0, }; -struct mcde_display_sony_acx424akp_platform_data \ +static struct mcde_display_sony_acx424akp_platform_data \ sony_acx424akp_display0_pdata = { .reset_gpio = 226, }; -struct mcde_display_device sony_acx424akp_display0 = { +static struct mcde_display_device sony_acx424akp_display0 = { .name = "mcde_disp_sony_acx424akp", .id = PRIMARY_DISPLAY_ID, - .port = &port1, + .port = &sony_port0, .chnl_id = MCDE_CHNL_A, .fifo = MCDE_FIFO_A, -#ifdef CONFIG_MCDE_DISPLAY_PRIMARY_16BPP - .default_pixel_format = MCDE_OVLYPIXFMT_RGB565, -#else .default_pixel_format = MCDE_OVLYPIXFMT_RGBA8888, -#endif #ifdef CONFIG_DISPLAY_GENERIC_DSI_PRIMARY_VSYNC .synchronized_update = true, #else .synchronized_update = false, #endif - /* TODO: Remove rotation buffers once ESRAM driver is completed */ .rotbuf1 = U5500_ESRAM_BASE + 0x20000 * 2, .rotbuf2 = U5500_ESRAM_BASE + 0x20000 * 2 + 0x10000, .dev = { .platform_data = &sony_acx424akp_display0_pdata, }, }; -#endif /* CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY */ -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY -static struct mcde_port port2 = { +#if defined(CONFIG_AV8100_HWTRIG_INT) + #define AV8100_SYNC_SRC MCDE_SYNCSRC_TE0 +#elif defined(CONFIG_AV8100_HWTRIG_I2SDAT3) + #define AV8100_SYNC_SRC MCDE_SYNCSRC_TE1 +#elif defined(CONFIG_AV8100_HWTRIG_DSI_TE) + #define AV8100_SYNC_SRC MCDE_SYNCSRC_TE_POLLING +#else + #define AV8100_SYNC_SRC MCDE_SYNCSRC_OFF +#endif +static struct mcde_port av8100_port2 = { .type = MCDE_PORTTYPE_DSI, .mode = MCDE_PORTMODE_CMD, .pixel_format = MCDE_PORTPIXFMT_DSI_24BPP, - .ifc = DSI_VIDEO_MODE, .link = 1, -#ifdef CONFIG_AV8100_HWTRIG_INT - .sync_src = MCDE_SYNCSRC_TE0, -#endif -#ifdef CONFIG_AV8100_HWTRIG_I2SDAT3 - .sync_src = MCDE_SYNCSRC_TE1, -#endif -#ifdef CONFIG_AV8100_HWTRIG_DSI_TE - .sync_src = MCDE_SYNCSRC_TE_POLLING, -#endif -#ifdef CONFIG_AV8100_HWTRIG_NONE - .sync_src = MCDE_SYNCSRC_OFF, -#endif + .sync_src = AV8100_SYNC_SRC, .update_auto_trig = true, .phy = { .dsi = { - .virt_id = 0, .num_data_lanes = 2, .ui = DSI_UNIT_INTERVAL_2, - .clk_cont = false, - .data_lanes_swap = false, }, }, .hdmi_sdtv_switch = HDMI_SWITCH, }; -struct mcde_display_hdmi_platform_data av8100_hdmi_pdata = { +static struct mcde_display_hdmi_platform_data av8100_hdmi_pdata = { .rgb_2_yCbCr_transform = &rgb_2_yCbCr_transform, }; static struct mcde_display_device av8100_hdmi = { .name = "av8100_hdmi", .id = AV8100_DISPLAY_ID, - .port = &port2, + .port = &av8100_port2, .chnl_id = MCDE_CHNL_B, .fifo = MCDE_FIFO_B, .default_pixel_format = MCDE_OVLYPIXFMT_RGB888, .native_x_res = 1280, .native_y_res = 720, - .synchronized_update = false, .dev = { .platform_data = &av8100_hdmi_pdata, }, - .platform_enable = NULL, - .platform_disable = NULL, }; static void delayed_work_dispreg_hdmi(struct work_struct *ptr) @@ -169,7 +142,6 @@ static void delayed_work_dispreg_hdmi(struct work_struct *ptr) if (mcde_display_device_register(&av8100_hdmi)) pr_warning("Failed to register av8100_hdmi\n"); } -#endif /* CONFIG_DISPLAY_AV8100_TERTIARY */ /* * This function will create the framebuffer for the display that is registered. @@ -179,7 +151,7 @@ static int display_postregistered_callback(struct notifier_block *nb, { struct mcde_display_device *ddev = dev; u16 width, height; - u16 virtual_width, virtual_height; + u16 virtual_height; u32 rotate = FB_ROTATE_UR; struct fb_info *fbi; #ifdef CONFIG_DISPDEV @@ -194,30 +166,21 @@ static int display_postregistered_callback(struct notifier_block *nb, mcde_dss_get_native_resolution(ddev, &width, &height); - - virtual_width = width; virtual_height = height * 2; + if (ddev->id == AV8100_DISPLAY_ID) { #ifdef CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER - if (ddev->id == AV8100_DISPLAY_ID) virtual_height = height * 3; #endif -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY - if (ddev->id == AV8100_DISPLAY_ID) { #ifdef CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE hdmi_fb_onoff(ddev, 1, 0, 0); -#endif /* CONFIG_MCDE_DISPLAY_HDMI_FB_AUTO_CREATE */ +#endif goto out; } -#endif /* CONFIG_DISPLAY_AV8100_TERTIARY */ /* Create frame buffer */ - fbi = mcde_fb_create(ddev, - width, height, - virtual_width, virtual_height, - ddev->default_pixel_format, - rotate); - + fbi = mcde_fb_create(ddev, width, height, width, virtual_height, + ddev->default_pixel_format, rotate); if (IS_ERR(fbi)) { dev_warn(&ddev->dev, "Failed to create fb for display %s\n", ddev->name); @@ -228,6 +191,7 @@ static int display_postregistered_callback(struct notifier_block *nb, #ifdef CONFIG_DISPDEV mfb = to_mcde_fb(fbi); + /* Create a dispdev overlay for this display */ if (dispdev_create(ddev, true, mfb->ovlys[0]) < 0) { dev_warn(&ddev->dev, @@ -238,9 +202,7 @@ static int display_postregistered_callback(struct notifier_block *nb, } #endif -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY out: -#endif return 0; display_postregistered_callback_err: @@ -251,39 +213,24 @@ static struct notifier_block display_nb = { .notifier_call = display_postregistered_callback, }; -int __init init_display_devices(void) +static int __init init_display_devices(void) { - int ret = 0; - if (!cpu_is_u5500()) - return ret; - - ret = mcde_dss_register_notifier(&display_nb); - if (ret) - pr_warning("Failed to register dss notifier\n"); - -#ifdef CONFIG_DISPLAY_SONY_ACX424AKP_DSI_PRIMARY - if (cpu_is_u5500v2()) { - if (display_initialized_during_boot) - sony_acx424akp_display0.power_mode = \ - MCDE_DISPLAY_PM_STANDBY; - ret = mcde_display_device_register(&sony_acx424akp_display0); - if (ret) - pr_warning("Failed to register sony acx424akp \ - display device 0\n"); - } -#endif + return 0; + + (void)mcde_dss_register_notifier(&display_nb); + + if (display_initialized_during_boot) + sony_acx424akp_display0.power_mode = MCDE_DISPLAY_PM_STANDBY; + + (void)mcde_display_device_register(&sony_acx424akp_display0); -#ifdef CONFIG_DISPLAY_AV8100_TERTIARY INIT_DELAYED_WORK_DEFERRABLE(&work_dispreg_hdmi, delayed_work_dispreg_hdmi); - schedule_delayed_work(&work_dispreg_hdmi, msecs_to_jiffies(DISPREG_HDMI_DELAY)); -#endif - return ret; + return 0; } - module_init(init_display_devices); -#endif + |