mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	Merge branch 'fbdev-next' of git://github.com/schandinat/linux-2.6
* 'fbdev-next' of git://github.com/schandinat/linux-2.6: (270 commits)
  video: platinumfb: Add __devexit_p at necessary place
  drivers/video: fsl-diu-fb: merge diu_pool into fsl_diu_data
  drivers/video: fsl-diu-fb: merge diu_hw into fsl_diu_data
  drivers/video: fsl-diu-fb: only DIU modes 0 and 1 are supported
  drivers/video: fsl-diu-fb: remove unused panel operating mode support
  drivers/video: fsl-diu-fb: use an enum for the AOI index
  drivers/video: fsl-diu-fb: add several new video modes
  drivers/video: fsl-diu-fb: remove broken screen blanking support
  drivers/video: fsl-diu-fb: move some definitions out of the header file
  drivers/video: fsl-diu-fb: fix some ioctls
  video: da8xx-fb: Increased resolution configuration of revised LCDC IP
  OMAPDSS: picodlp: add missing #include <linux/module.h>
  fb: fix au1100fb bitrot.
  mx3fb: fix NULL pointer dereference in screen blanking.
  video: irq: Remove IRQF_DISABLED
  smscufx: change edid data to u8 instead of char
  OMAPDSS: DISPC: zorder support for DSS overlays
  OMAPDSS: DISPC: VIDEO3 pipeline support
  OMAPDSS/OMAP_VOUT: Fix incorrect OMAP3-alpha compatibility setting
  video/omap: fix build dependencies
  ...
Fix up conflicts in:
 - drivers/staging/xgifb/XGI_main_26.c
	Changes to XGIfb_pan_var()
 - drivers/video/omap/{lcd_apollon.c,lcd_ldp.c,lcd_overo.c}
	Removed (or in the case of apollon.c, merged into the generic
	DSS panel in drivers/video/omap2/displays/panel-generic-dpi.c)
			
			
This commit is contained in:
		
						commit
						acff987d94
					
				
					 163 changed files with 12125 additions and 7722 deletions
				
			
		|  | @ -87,23 +87,38 @@ Special configuration for udlfb is usually unnecessary. There are a few | |||
| options, however. | ||||
| 
 | ||||
| From the command line, pass options to modprobe | ||||
| modprobe udlfb defio=1 console=1 | ||||
| modprobe udlfb fb_defio=0 console=1 shadow=1 | ||||
| 
 | ||||
| Or for permanent option, create file like /etc/modprobe.d/options with text | ||||
| options udlfb defio=1 console=1 | ||||
| Or modify options on the fly at /sys/module/udlfb/parameters directory via | ||||
| sudo nano fb_defio | ||||
| change the parameter in place, and save the file. | ||||
| 
 | ||||
| Accepted options: | ||||
| Unplug/replug USB device to apply with new settings | ||||
| 
 | ||||
| Or for permanent option, create file like /etc/modprobe.d/udlfb.conf with text | ||||
| options udlfb fb_defio=0 console=1 shadow=1 | ||||
| 
 | ||||
| Accepted boolean options: | ||||
| 
 | ||||
| fb_defio	Make use of the fb_defio (CONFIG_FB_DEFERRED_IO) kernel | ||||
| 		module to track changed areas of the framebuffer by page faults. | ||||
|         	Standard fbdev applications that use mmap but that do not | ||||
| 		report damage, may be able to work with this enabled. | ||||
| 		Disabled by default because of overhead and other issues. | ||||
| 		Standard fbdev applications that use mmap but that do not | ||||
| 		report damage, should be able to work with this enabled. | ||||
| 		Disable when running with X server that supports reporting | ||||
| 		changed regions via ioctl, as this method is simpler, | ||||
| 		more stable, and higher performance. | ||||
| 		default: fb_defio=1 | ||||
| 
 | ||||
| console		Allow fbcon to attach to udlfb provided framebuffers. This | ||||
| 		is disabled by default because fbcon will aggressively consume | ||||
| 		the first framebuffer it finds, which isn't usually what the | ||||
| 		user wants in the case of USB displays. | ||||
| console	Allow fbcon to attach to udlfb provided framebuffers. | ||||
| 		Can be disabled if fbcon and other clients | ||||
| 		(e.g. X with --shared-vt) are in conflict. | ||||
| 		default: console=1 | ||||
| 
 | ||||
| shadow		Allocate a 2nd framebuffer to shadow what's currently across | ||||
| 		the USB bus in device memory. If any pixels are unchanged, | ||||
| 		do not transmit. Spends host memory to save USB transfers. | ||||
| 		Enabled by default. Only disable on very low memory systems. | ||||
| 		default: shadow=1 | ||||
| 
 | ||||
| Sysfs Attributes | ||||
| ================ | ||||
|  |  | |||
|  | @ -5970,6 +5970,12 @@ L:	netdev@vger.kernel.org | |||
| S:	Supported | ||||
| F:	drivers/net/ethernet/smsc/smsc9420.* | ||||
| 
 | ||||
| SMSC UFX6000 and UFX7000 USB to VGA DRIVER | ||||
| M:	Steve Glendinning <steve.glendinning@smsc.com> | ||||
| L:	linux-fbdev@vger.kernel.org | ||||
| S:	Supported | ||||
| F:	drivers/video/smscufx.c | ||||
| 
 | ||||
| SN-IA64 (Itanium) SUB-PLATFORM | ||||
| M:	Jes Sorensen <jes@sgi.com> | ||||
| L:	linux-altix@sgi.com | ||||
|  |  | |||
|  | @ -39,6 +39,9 @@ | |||
| #include <plat/usb.h> | ||||
| #include <plat/gpmc-smc91x.h> | ||||
| 
 | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| 
 | ||||
| #include "mux.h" | ||||
| #include "hsmmc.h" | ||||
| #include "common-board-devices.h" | ||||
|  | @ -99,20 +102,72 @@ static struct platform_device sdp2430_flash_device = { | |||
| 	.resource	= &sdp2430_flash_resource, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device sdp2430_lcd_device = { | ||||
| 	.name		= "sdp2430_lcd", | ||||
| 	.id		= -1, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device *sdp2430_devices[] __initdata = { | ||||
| 	&sdp2430_flash_device, | ||||
| }; | ||||
| 
 | ||||
| /* LCD */ | ||||
| #define SDP2430_LCD_PANEL_BACKLIGHT_GPIO	91 | ||||
| #define SDP2430_LCD_PANEL_ENABLE_GPIO		154 | ||||
| 
 | ||||
| static int sdp2430_panel_enable_lcd(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	gpio_direction_output(SDP2430_LCD_PANEL_ENABLE_GPIO, 1); | ||||
| 	gpio_direction_output(SDP2430_LCD_PANEL_BACKLIGHT_GPIO, 1); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void sdp2430_panel_disable_lcd(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	gpio_direction_output(SDP2430_LCD_PANEL_ENABLE_GPIO, 0); | ||||
| 	gpio_direction_output(SDP2430_LCD_PANEL_BACKLIGHT_GPIO, 0); | ||||
| } | ||||
| 
 | ||||
| static struct panel_generic_dpi_data sdp2430_panel_data = { | ||||
| 	.name			= "nec_nl2432dr22-11b", | ||||
| 	.platform_enable	= sdp2430_panel_enable_lcd, | ||||
| 	.platform_disable	= sdp2430_panel_disable_lcd, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device sdp2430_lcd_device = { | ||||
| 	.name			= "lcd", | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.phy.dpi.data_lines	= 16, | ||||
| 	.data			= &sdp2430_panel_data, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device *sdp2430_dss_devices[] = { | ||||
| 	&sdp2430_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_lcd_config sdp2430_lcd_config __initdata = { | ||||
| 	.ctrl_name	= "internal", | ||||
| static struct omap_dss_board_info sdp2430_dss_data = { | ||||
| 	.num_devices	= ARRAY_SIZE(sdp2430_dss_devices), | ||||
| 	.devices	= sdp2430_dss_devices, | ||||
| 	.default_device	= &sdp2430_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| static void __init sdp2430_display_init(void) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	static struct gpio gpios[] __initdata = { | ||||
| 		{ SDP2430_LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, | ||||
| 			"LCD reset" }, | ||||
| 		{ SDP2430_LCD_PANEL_BACKLIGHT_GPIO, GPIOF_OUT_INIT_LOW, | ||||
| 			"LCD Backlight" }, | ||||
| 	}; | ||||
| 
 | ||||
| 	r = gpio_request_array(gpios, ARRAY_SIZE(gpios)); | ||||
| 	if (r) { | ||||
| 		pr_err("Cannot request LCD GPIOs, error %d\n", r); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	omap_display_init(&sdp2430_dss_data); | ||||
| } | ||||
| 
 | ||||
| #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91x_MODULE) | ||||
| 
 | ||||
| static struct omap_smc91x_platform_data board_smc91x_data = { | ||||
|  | @ -137,10 +192,6 @@ static inline void board_smc91x_init(void) | |||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| static struct omap_board_config_kernel sdp2430_config[] __initdata = { | ||||
| 	{OMAP_TAG_LCD, &sdp2430_lcd_config}, | ||||
| }; | ||||
| 
 | ||||
| static void __init omap_2430sdp_init_early(void) | ||||
| { | ||||
| 	omap2_init_common_infrastructure(); | ||||
|  | @ -229,9 +280,6 @@ static void __init omap_2430sdp_init(void) | |||
| { | ||||
| 	omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC); | ||||
| 
 | ||||
| 	omap_board_config = sdp2430_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(sdp2430_config); | ||||
| 
 | ||||
| 	omap2430_i2c_init(); | ||||
| 
 | ||||
| 	platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices)); | ||||
|  | @ -247,6 +295,8 @@ static void __init omap_2430sdp_init(void) | |||
| 	/* Turn off secondary LCD backlight */ | ||||
| 	gpio_request_one(SECONDARY_LCD_GPIO, GPIOF_OUT_INIT_LOW, | ||||
| 			 "Secondary LCD backlight"); | ||||
| 
 | ||||
| 	sdp2430_display_init(); | ||||
| } | ||||
| 
 | ||||
| static void __init omap_2430sdp_map_io(void) | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ | |||
| #include <plat/dma.h> | ||||
| #include <plat/gpmc.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| 
 | ||||
| #include <plat/gpmc-smc91x.h> | ||||
| 
 | ||||
|  | @ -186,8 +186,7 @@ static struct omap_dss_device sdp3430_lcd_device = { | |||
| 	.platform_disable	= sdp3430_panel_disable_lcd, | ||||
| }; | ||||
| 
 | ||||
| static struct panel_generic_dpi_data dvi_panel = { | ||||
| 	.name			= "generic", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable	= sdp3430_panel_enable_dvi, | ||||
| 	.platform_disable	= sdp3430_panel_disable_dvi, | ||||
| }; | ||||
|  | @ -195,7 +194,7 @@ static struct panel_generic_dpi_data dvi_panel = { | |||
| static struct omap_dss_device sdp3430_dvi_device = { | ||||
| 	.name			= "dvi", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.data			= &dvi_panel, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| }; | ||||
|  |  | |||
|  | @ -38,6 +38,8 @@ | |||
| #include <plat/mmc.h> | ||||
| #include <plat/omap4-keypad.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-nokia-dsi.h> | ||||
| #include <video/omap-panel-picodlp.h> | ||||
| #include <linux/wl12xx.h> | ||||
| 
 | ||||
| #include "mux.h" | ||||
|  | @ -52,6 +54,8 @@ | |||
| #define OMAP4_SFH7741_ENABLE_GPIO		188 | ||||
| #define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */ | ||||
| #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ | ||||
| #define DISPLAY_SEL_GPIO	59	/* LCD2/PicoDLP switch */ | ||||
| #define DLP_POWER_ON_GPIO	40 | ||||
| 
 | ||||
| #define GPIO_WIFI_PMENA		54 | ||||
| #define GPIO_WIFI_IRQ		53 | ||||
|  | @ -340,11 +344,6 @@ static int __init omap_ethernet_init(void) | |||
| 	return status; | ||||
| } | ||||
| 
 | ||||
| static struct platform_device sdp4430_lcd_device = { | ||||
| 	.name		= "sdp4430_lcd", | ||||
| 	.id		= -1, | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_consumer_supply sdp4430_vbat_supply[] = { | ||||
| 	REGULATOR_SUPPLY("vddvibl", "twl6040-vibra"), | ||||
| 	REGULATOR_SUPPLY("vddvibr", "twl6040-vibra"), | ||||
|  | @ -374,21 +373,12 @@ static struct platform_device sdp4430_vbat = { | |||
| }; | ||||
| 
 | ||||
| static struct platform_device *sdp4430_devices[] __initdata = { | ||||
| 	&sdp4430_lcd_device, | ||||
| 	&sdp4430_gpio_keys_device, | ||||
| 	&sdp4430_leds_gpio, | ||||
| 	&sdp4430_leds_pwm, | ||||
| 	&sdp4430_vbat, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_lcd_config sdp4430_lcd_config __initdata = { | ||||
| 	.ctrl_name	= "internal", | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel sdp4430_config[] __initdata = { | ||||
| 	{ OMAP_TAG_LCD,		&sdp4430_lcd_config }, | ||||
| }; | ||||
| 
 | ||||
| static void __init omap_4430sdp_init_early(void) | ||||
| { | ||||
| 	omap2_init_common_infrastructure(); | ||||
|  | @ -648,37 +638,202 @@ static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev) | |||
| 	gpio_free(HDMI_GPIO_HPD); | ||||
| } | ||||
| 
 | ||||
| static struct nokia_dsi_panel_data dsi1_panel = { | ||||
| 		.name		= "taal", | ||||
| 		.reset_gpio	= 102, | ||||
| 		.use_ext_te	= false, | ||||
| 		.ext_te_gpio	= 101, | ||||
| 		.esd_interval	= 0, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device sdp4430_lcd_device = { | ||||
| 	.name			= "lcd", | ||||
| 	.driver_name		= "taal", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DSI, | ||||
| 	.data			= &dsi1_panel, | ||||
| 	.phy.dsi		= { | ||||
| 		.clk_lane	= 1, | ||||
| 		.clk_pol	= 0, | ||||
| 		.data1_lane	= 2, | ||||
| 		.data1_pol	= 0, | ||||
| 		.data2_lane	= 3, | ||||
| 		.data2_pol	= 0, | ||||
| 
 | ||||
| 		.module		= 0, | ||||
| 	}, | ||||
| 
 | ||||
| 	.clocks = { | ||||
| 		.dispc = { | ||||
| 			.channel = { | ||||
| 				/* Logic Clock = 172.8 MHz */ | ||||
| 				.lck_div	= 1, | ||||
| 				/* Pixel Clock = 34.56 MHz */ | ||||
| 				.pck_div	= 5, | ||||
| 				.lcd_clk_src	= OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC, | ||||
| 			}, | ||||
| 			.dispc_fclk_src	= OMAP_DSS_CLK_SRC_FCK, | ||||
| 		}, | ||||
| 
 | ||||
| 		.dsi = { | ||||
| 			.regn		= 16,	/* Fint = 2.4 MHz */ | ||||
| 			.regm		= 180,	/* DDR Clock = 216 MHz */ | ||||
| 			.regm_dispc	= 5,	/* PLL1_CLK1 = 172.8 MHz */ | ||||
| 			.regm_dsi	= 5,	/* PLL1_CLK2 = 172.8 MHz */ | ||||
| 
 | ||||
| 			.lp_clk_div	= 10,	/* LP Clock = 8.64 MHz */ | ||||
| 			.dsi_fclk_src	= OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI, | ||||
| 		}, | ||||
| 	}, | ||||
| 	.channel		= OMAP_DSS_CHANNEL_LCD, | ||||
| }; | ||||
| 
 | ||||
| static struct nokia_dsi_panel_data dsi2_panel = { | ||||
| 		.name		= "taal", | ||||
| 		.reset_gpio	= 104, | ||||
| 		.use_ext_te	= false, | ||||
| 		.ext_te_gpio	= 103, | ||||
| 		.esd_interval	= 0, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device sdp4430_lcd2_device = { | ||||
| 	.name			= "lcd2", | ||||
| 	.driver_name		= "taal", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DSI, | ||||
| 	.data			= &dsi2_panel, | ||||
| 	.phy.dsi		= { | ||||
| 		.clk_lane	= 1, | ||||
| 		.clk_pol	= 0, | ||||
| 		.data1_lane	= 2, | ||||
| 		.data1_pol	= 0, | ||||
| 		.data2_lane	= 3, | ||||
| 		.data2_pol	= 0, | ||||
| 
 | ||||
| 		.module		= 1, | ||||
| 	}, | ||||
| 
 | ||||
| 	.clocks = { | ||||
| 		.dispc = { | ||||
| 			.channel = { | ||||
| 				/* Logic Clock = 172.8 MHz */ | ||||
| 				.lck_div	= 1, | ||||
| 				/* Pixel Clock = 34.56 MHz */ | ||||
| 				.pck_div	= 5, | ||||
| 				.lcd_clk_src	= OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC, | ||||
| 			}, | ||||
| 			.dispc_fclk_src	= OMAP_DSS_CLK_SRC_FCK, | ||||
| 		}, | ||||
| 
 | ||||
| 		.dsi = { | ||||
| 			.regn		= 16,	/* Fint = 2.4 MHz */ | ||||
| 			.regm		= 180,	/* DDR Clock = 216 MHz */ | ||||
| 			.regm_dispc	= 5,	/* PLL1_CLK1 = 172.8 MHz */ | ||||
| 			.regm_dsi	= 5,	/* PLL1_CLK2 = 172.8 MHz */ | ||||
| 
 | ||||
| 			.lp_clk_div	= 10,	/* LP Clock = 8.64 MHz */ | ||||
| 			.dsi_fclk_src	= OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI, | ||||
| 		}, | ||||
| 	}, | ||||
| 	.channel		= OMAP_DSS_CHANNEL_LCD2, | ||||
| }; | ||||
| 
 | ||||
| static void sdp4430_lcd_init(void) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	r = gpio_request_one(dsi1_panel.reset_gpio, GPIOF_DIR_OUT, | ||||
| 		"lcd1_reset_gpio"); | ||||
| 	if (r) | ||||
| 		pr_err("%s: Could not get lcd1_reset_gpio\n", __func__); | ||||
| 
 | ||||
| 	r = gpio_request_one(dsi2_panel.reset_gpio, GPIOF_DIR_OUT, | ||||
| 		"lcd2_reset_gpio"); | ||||
| 	if (r) | ||||
| 		pr_err("%s: Could not get lcd2_reset_gpio\n", __func__); | ||||
| } | ||||
| 
 | ||||
| static struct omap_dss_device sdp4430_hdmi_device = { | ||||
| 	.name = "hdmi", | ||||
| 	.driver_name = "hdmi_panel", | ||||
| 	.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_disable = sdp4430_panel_disable_hdmi, | ||||
| 	.channel = OMAP_DSS_CHANNEL_DIGIT, | ||||
| }; | ||||
| 
 | ||||
| static struct picodlp_panel_data sdp4430_picodlp_pdata = { | ||||
| 	.picodlp_adapter_id	= 2, | ||||
| 	.emu_done_gpio		= 44, | ||||
| 	.pwrgood_gpio		= 45, | ||||
| }; | ||||
| 
 | ||||
| static void sdp4430_picodlp_init(void) | ||||
| { | ||||
| 	int r; | ||||
| 	const struct gpio picodlp_gpios[] = { | ||||
| 		{DLP_POWER_ON_GPIO, GPIOF_OUT_INIT_LOW, | ||||
| 			"DLP POWER ON"}, | ||||
| 		{sdp4430_picodlp_pdata.emu_done_gpio, GPIOF_IN, | ||||
| 			"DLP EMU DONE"}, | ||||
| 		{sdp4430_picodlp_pdata.pwrgood_gpio, GPIOF_OUT_INIT_LOW, | ||||
| 			"DLP PWRGOOD"}, | ||||
| 	}; | ||||
| 
 | ||||
| 	r = gpio_request_array(picodlp_gpios, ARRAY_SIZE(picodlp_gpios)); | ||||
| 	if (r) | ||||
| 		pr_err("Cannot request PicoDLP GPIOs, error %d\n", r); | ||||
| } | ||||
| 
 | ||||
| static int sdp4430_panel_enable_picodlp(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	gpio_set_value(DISPLAY_SEL_GPIO, 0); | ||||
| 	gpio_set_value(DLP_POWER_ON_GPIO, 1); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void sdp4430_panel_disable_picodlp(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	gpio_set_value(DLP_POWER_ON_GPIO, 0); | ||||
| 	gpio_set_value(DISPLAY_SEL_GPIO, 1); | ||||
| } | ||||
| 
 | ||||
| static struct omap_dss_device sdp4430_picodlp_device = { | ||||
| 	.name			= "picodlp", | ||||
| 	.driver_name		= "picodlp_panel", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| 	.channel		= OMAP_DSS_CHANNEL_LCD2, | ||||
| 	.platform_enable	= sdp4430_panel_enable_picodlp, | ||||
| 	.platform_disable	= sdp4430_panel_disable_picodlp, | ||||
| 	.data			= &sdp4430_picodlp_pdata, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device *sdp4430_dss_devices[] = { | ||||
| 	&sdp4430_lcd_device, | ||||
| 	&sdp4430_lcd2_device, | ||||
| 	&sdp4430_hdmi_device, | ||||
| 	&sdp4430_picodlp_device, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_board_info sdp4430_dss_data = { | ||||
| 	.num_devices	= ARRAY_SIZE(sdp4430_dss_devices), | ||||
| 	.devices	= sdp4430_dss_devices, | ||||
| 	.default_device	= &sdp4430_hdmi_device, | ||||
| 	.default_device	= &sdp4430_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| void omap_4430sdp_display_init(void) | ||||
| static void omap_4430sdp_display_init(void) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	/* Enable LCD2 by default (instead of Pico DLP) */ | ||||
| 	r = gpio_request_one(DISPLAY_SEL_GPIO, GPIOF_OUT_INIT_HIGH, | ||||
| 			"display_sel"); | ||||
| 	if (r) | ||||
| 		pr_err("%s: Could not get display_sel GPIO\n", __func__); | ||||
| 
 | ||||
| 	sdp4430_lcd_init(); | ||||
| 	sdp4430_hdmi_mux_init(); | ||||
| 	sdp4430_picodlp_init(); | ||||
| 	omap_display_init(&sdp4430_dss_data); | ||||
| } | ||||
| 
 | ||||
|  | @ -802,9 +957,6 @@ static void __init omap_4430sdp_init(void) | |||
| 		package = OMAP_PACKAGE_CBL; | ||||
| 	omap4_mux_init(board_mux, NULL, package); | ||||
| 
 | ||||
| 	omap_board_config = sdp4430_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(sdp4430_config); | ||||
| 
 | ||||
| 	omap4_i2c_init(); | ||||
| 	omap_sfh7741prox_init(); | ||||
| 	platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); | ||||
|  |  | |||
|  | @ -36,6 +36,7 @@ | |||
| #include <plat/usb.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| 
 | ||||
| #include "mux.h" | ||||
| #include "control.h" | ||||
|  | @ -333,8 +334,7 @@ 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", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable	= am3517_evm_panel_enable_dvi, | ||||
| 	.platform_disable	= am3517_evm_panel_disable_dvi, | ||||
| }; | ||||
|  | @ -342,7 +342,7 @@ static struct panel_generic_dpi_data dvi_panel = { | |||
| static struct omap_dss_device am3517_evm_dvi_device = { | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.name			= "dvi", | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.data			= &dvi_panel, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| }; | ||||
|  |  | |||
|  | @ -40,6 +40,9 @@ | |||
| #include <plat/common.h> | ||||
| #include <plat/gpmc.h> | ||||
| 
 | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| 
 | ||||
| #include "mux.h" | ||||
| #include "control.h" | ||||
| 
 | ||||
|  | @ -149,11 +152,6 @@ static struct platform_device apollon_smc91x_device = { | |||
| 	.resource	= apollon_smc91x_resources, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device apollon_lcd_device = { | ||||
| 	.name		= "apollon_lcd", | ||||
| 	.id		= -1, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_led_config apollon_led_config[] = { | ||||
| 	{ | ||||
| 		.cdev	= { | ||||
|  | @ -191,7 +189,6 @@ static struct platform_device apollon_led_device = { | |||
| static struct platform_device *apollon_devices[] __initdata = { | ||||
| 	&apollon_onenand_device, | ||||
| 	&apollon_smc91x_device, | ||||
| 	&apollon_lcd_device, | ||||
| 	&apollon_led_device, | ||||
| }; | ||||
| 
 | ||||
|  | @ -265,12 +262,26 @@ static struct omap_usb_config apollon_usb_config __initdata = { | |||
| 	.pins[0]	= 6, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_lcd_config apollon_lcd_config __initdata = { | ||||
| 	.ctrl_name	= "internal", | ||||
| static struct panel_generic_dpi_data apollon_panel_data = { | ||||
| 	.name			= "apollon", | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel apollon_config[] __initdata = { | ||||
| 	{ OMAP_TAG_LCD,		&apollon_lcd_config }, | ||||
| static struct omap_dss_device apollon_lcd_device = { | ||||
| 	.name			= "lcd", | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.phy.dpi.data_lines	= 18, | ||||
| 	.data			= &apollon_panel_data, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device *apollon_dss_devices[] = { | ||||
| 	&apollon_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_board_info apollon_dss_data = { | ||||
| 	.num_devices	= ARRAY_SIZE(apollon_dss_devices), | ||||
| 	.devices	= apollon_dss_devices, | ||||
| 	.default_device	= &apollon_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| static void __init omap_apollon_init_early(void) | ||||
|  | @ -314,8 +325,6 @@ static void __init omap_apollon_init(void) | |||
| 	u32 v; | ||||
| 
 | ||||
| 	omap2420_mux_init(board_mux, OMAP_PACKAGE_ZAC); | ||||
| 	omap_board_config = apollon_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(apollon_config); | ||||
| 
 | ||||
| 	apollon_init_smc91x(); | ||||
| 	apollon_led_init(); | ||||
|  | @ -340,6 +349,8 @@ static void __init omap_apollon_init(void) | |||
| 	 */ | ||||
| 	platform_add_devices(apollon_devices, ARRAY_SIZE(apollon_devices)); | ||||
| 	omap_serial_init(); | ||||
| 
 | ||||
| 	omap_display_init(&apollon_dss_data); | ||||
| } | ||||
| 
 | ||||
| static void __init omap_apollon_map_io(void) | ||||
|  |  | |||
|  | @ -43,6 +43,7 @@ | |||
| #include <plat/usb.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| #include <plat/mcspi.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
|  | @ -242,8 +243,7 @@ static struct omap_dss_device cm_t35_lcd_device = { | |||
| 	.phy.dpi.data_lines	= 18, | ||||
| }; | ||||
| 
 | ||||
| static struct panel_generic_dpi_data dvi_panel = { | ||||
| 	.name			= "generic", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable	= cm_t35_panel_enable_dvi, | ||||
| 	.platform_disable	= cm_t35_panel_disable_dvi, | ||||
| }; | ||||
|  | @ -251,7 +251,7 @@ static struct panel_generic_dpi_data dvi_panel = { | |||
| static struct omap_dss_device cm_t35_dvi_device = { | ||||
| 	.name			= "dvi", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.data			= &dvi_panel, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| }; | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ | |||
| #include <plat/usb.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| 
 | ||||
| #include <plat/mcspi.h> | ||||
| #include <linux/input/matrix_keypad.h> | ||||
|  | @ -139,7 +140,7 @@ static struct regulator_consumer_supply devkit8000_vio_supply[] = { | |||
| }; | ||||
| 
 | ||||
| static struct panel_generic_dpi_data lcd_panel = { | ||||
| 	.name			= "generic", | ||||
| 	.name			= "innolux_at070tn83", | ||||
| 	.platform_enable        = devkit8000_panel_enable_lcd, | ||||
| 	.platform_disable       = devkit8000_panel_disable_lcd, | ||||
| }; | ||||
|  | @ -152,8 +153,7 @@ static struct omap_dss_device devkit8000_lcd_device = { | |||
| 	.phy.dpi.data_lines     = 24, | ||||
| }; | ||||
| 
 | ||||
| static struct panel_generic_dpi_data dvi_panel = { | ||||
| 	.name			= "generic", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable        = devkit8000_panel_enable_dvi, | ||||
| 	.platform_disable       = devkit8000_panel_disable_dvi, | ||||
| }; | ||||
|  | @ -161,7 +161,7 @@ static struct panel_generic_dpi_data dvi_panel = { | |||
| static struct omap_dss_device devkit8000_dvi_device = { | ||||
| 	.name                   = "dvi", | ||||
| 	.type                   = OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.driver_name            = "generic_dpi_panel", | ||||
| 	.driver_name            = "dvi", | ||||
| 	.data			= &dvi_panel, | ||||
| 	.phy.dpi.data_lines     = 24, | ||||
| }; | ||||
|  | @ -267,7 +267,7 @@ static struct twl4030_gpio_platform_data devkit8000_gpio_data = { | |||
| 
 | ||||
| static struct regulator_consumer_supply devkit8000_vpll1_supplies[] = { | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"), | ||||
| }; | ||||
| 
 | ||||
| /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ | ||||
|  |  | |||
|  | @ -39,6 +39,9 @@ | |||
| #include <plat/dma.h> | ||||
| #include <plat/gpmc.h> | ||||
| 
 | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| 
 | ||||
| #include "mux.h" | ||||
| #include "control.h" | ||||
| 
 | ||||
|  | @ -156,17 +159,33 @@ static struct platform_device h4_kp_device = { | |||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device h4_lcd_device = { | ||||
| 	.name		= "lcd_h4", | ||||
| 	.id		= -1, | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device *h4_devices[] __initdata = { | ||||
| 	&h4_flash_device, | ||||
| 	&h4_kp_device, | ||||
| }; | ||||
| 
 | ||||
| static struct panel_generic_dpi_data h4_panel_data = { | ||||
| 	.name			= "h4", | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device h4_lcd_device = { | ||||
| 	.name			= "lcd", | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.phy.dpi.data_lines	= 16, | ||||
| 	.data			= &h4_panel_data, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device *h4_dss_devices[] = { | ||||
| 	&h4_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_board_info h4_dss_data = { | ||||
| 	.num_devices	= ARRAY_SIZE(h4_dss_devices), | ||||
| 	.devices	= h4_dss_devices, | ||||
| 	.default_device	= &h4_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| /* 2420 Sysboot setup (2430 is different) */ | ||||
| static u32 get_sysboot_value(void) | ||||
| { | ||||
|  | @ -270,10 +289,6 @@ static void __init h4_init_flash(void) | |||
| 	h4_flash_resource.end	= base + SZ_64M - 1; | ||||
| } | ||||
| 
 | ||||
| static struct omap_lcd_config h4_lcd_config __initdata = { | ||||
| 	.ctrl_name	= "internal", | ||||
| }; | ||||
| 
 | ||||
| static struct omap_usb_config h4_usb_config __initdata = { | ||||
| 	/* S1.10 OFF -- usb "download port"
 | ||||
| 	 * usb0 switched to Mini-B port and isp1105 transceiver; | ||||
|  | @ -285,10 +300,6 @@ static struct omap_usb_config h4_usb_config __initdata = { | |||
| 	.hmc_mode	= 0x00,		/* 0:dev|otg 1:disable 2:disable */ | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel h4_config[] __initdata = { | ||||
| 	{ OMAP_TAG_LCD,		&h4_lcd_config }, | ||||
| }; | ||||
| 
 | ||||
| static void __init omap_h4_init_early(void) | ||||
| { | ||||
| 	omap2_init_common_infrastructure(); | ||||
|  | @ -330,9 +341,6 @@ static void __init omap_h4_init(void) | |||
| { | ||||
| 	omap2420_mux_init(board_mux, OMAP_PACKAGE_ZAF); | ||||
| 
 | ||||
| 	omap_board_config = h4_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(h4_config); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Make sure the serial ports are muxed on at this point. | ||||
| 	 * You have to mux them off in device drivers later on | ||||
|  | @ -371,6 +379,8 @@ static void __init omap_h4_init(void) | |||
| 	omap2_usbfs_init(&h4_usb_config); | ||||
| 	omap_serial_init(); | ||||
| 	h4_init_flash(); | ||||
| 
 | ||||
| 	omap_display_init(&h4_dss_data); | ||||
| } | ||||
| 
 | ||||
| static void __init omap_h4_map_io(void) | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ | |||
| #include <plat/gpmc.h> | ||||
| #include <plat/usb.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| #include <plat/onenand.h> | ||||
| 
 | ||||
| #include "mux.h" | ||||
|  | @ -455,16 +455,16 @@ 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", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable	= igep2_enable_dvi, | ||||
| 	.platform_disable	= igep2_disable_dvi, | ||||
| 	.i2c_bus_num = 3, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device igep2_dvi_device = { | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.name			= "dvi", | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.data			= &dvi_panel, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| }; | ||||
|  |  | |||
|  | @ -27,6 +27,7 @@ | |||
| #include <linux/io.h> | ||||
| #include <linux/smsc911x.h> | ||||
| #include <linux/mmc/host.h> | ||||
| #include <linux/gpio.h> | ||||
| 
 | ||||
| #include <mach/hardware.h> | ||||
| #include <asm/mach-types.h> | ||||
|  | @ -43,6 +44,9 @@ | |||
| #include <plat/usb.h> | ||||
| #include <plat/gpmc-smsc911x.h> | ||||
| 
 | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| 
 | ||||
| #include "board-flash.h" | ||||
| #include "mux.h" | ||||
| #include "hsmmc.h" | ||||
|  | @ -179,29 +183,108 @@ static inline void __init ldp_init_smsc911x(void) | |||
| 	gpmc_smsc911x_init(&smsc911x_cfg); | ||||
| } | ||||
| 
 | ||||
| static struct platform_device ldp_lcd_device = { | ||||
| 	.name		= "ldp_lcd", | ||||
| 	.id		= -1, | ||||
| /* LCD */ | ||||
| 
 | ||||
| static int ldp_backlight_gpio; | ||||
| static int ldp_lcd_enable_gpio; | ||||
| 
 | ||||
| #define LCD_PANEL_RESET_GPIO		55 | ||||
| #define LCD_PANEL_QVGA_GPIO		56 | ||||
| 
 | ||||
| static int ldp_panel_enable_lcd(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	if (gpio_is_valid(ldp_lcd_enable_gpio)) | ||||
| 		gpio_direction_output(ldp_lcd_enable_gpio, 1); | ||||
| 	if (gpio_is_valid(ldp_backlight_gpio)) | ||||
| 		gpio_direction_output(ldp_backlight_gpio, 1); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void ldp_panel_disable_lcd(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	if (gpio_is_valid(ldp_lcd_enable_gpio)) | ||||
| 		gpio_direction_output(ldp_lcd_enable_gpio, 0); | ||||
| 	if (gpio_is_valid(ldp_backlight_gpio)) | ||||
| 		gpio_direction_output(ldp_backlight_gpio, 0); | ||||
| } | ||||
| 
 | ||||
| static struct panel_generic_dpi_data ldp_panel_data = { | ||||
| 	.name			= "nec_nl2432dr22-11b", | ||||
| 	.platform_enable	= ldp_panel_enable_lcd, | ||||
| 	.platform_disable	= ldp_panel_disable_lcd, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_lcd_config ldp_lcd_config __initdata = { | ||||
| 	.ctrl_name	= "internal", | ||||
| static struct omap_dss_device ldp_lcd_device = { | ||||
| 	.name			= "lcd", | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.phy.dpi.data_lines	= 18, | ||||
| 	.data			= &ldp_panel_data, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel ldp_config[] __initdata = { | ||||
| 	{ OMAP_TAG_LCD,		&ldp_lcd_config }, | ||||
| static struct omap_dss_device *ldp_dss_devices[] = { | ||||
| 	&ldp_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_board_info ldp_dss_data = { | ||||
| 	.num_devices	= ARRAY_SIZE(ldp_dss_devices), | ||||
| 	.devices	= ldp_dss_devices, | ||||
| 	.default_device	= &ldp_lcd_device, | ||||
| }; | ||||
| 
 | ||||
| static void __init ldp_display_init(void) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	static struct gpio gpios[] __initdata = { | ||||
| 		{LCD_PANEL_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "LCD RESET"}, | ||||
| 		{LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "LCD QVGA"}, | ||||
| 	}; | ||||
| 
 | ||||
| 	r = gpio_request_array(gpios, ARRAY_SIZE(gpios)); | ||||
| 	if (r) { | ||||
| 		pr_err("Cannot request LCD GPIOs, error %d\n", r); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	omap_display_init(&ldp_dss_data); | ||||
| } | ||||
| 
 | ||||
| static void __init omap_ldp_init_early(void) | ||||
| { | ||||
| 	omap2_init_common_infrastructure(); | ||||
| 	omap2_init_common_devices(NULL, NULL); | ||||
| } | ||||
| 
 | ||||
| static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	struct gpio gpios[] = { | ||||
| 		{gpio + 7 , GPIOF_OUT_INIT_LOW, "LCD ENABLE"}, | ||||
| 		{gpio + 15, GPIOF_OUT_INIT_LOW, "LCD BACKLIGHT"}, | ||||
| 	}; | ||||
| 
 | ||||
| 	r = gpio_request_array(gpios, ARRAY_SIZE(gpios)); | ||||
| 	if (r) { | ||||
| 		pr_err("Cannot request LCD GPIOs, error %d\n", r); | ||||
| 		ldp_backlight_gpio = -EINVAL; | ||||
| 		ldp_lcd_enable_gpio = -EINVAL; | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	ldp_backlight_gpio = gpio + 15; | ||||
| 	ldp_lcd_enable_gpio = gpio + 7; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct twl4030_gpio_platform_data ldp_gpio_data = { | ||||
| 	.gpio_base	= OMAP_MAX_GPIO_LINES, | ||||
| 	.irq_base	= TWL4030_GPIO_IRQ_BASE, | ||||
| 	.irq_end	= TWL4030_GPIO_IRQ_END, | ||||
| 	.setup		= ldp_twl_gpio_setup, | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_consumer_supply ldp_vmmc1_supply[] = { | ||||
|  | @ -243,10 +326,31 @@ static struct regulator_init_data ldp_vaux1 = { | |||
| 	.consumer_supplies		= ldp_vaux1_supplies, | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_consumer_supply ldp_vpll2_supplies[] = { | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_init_data ldp_vpll2 = { | ||||
| 	.constraints = { | ||||
| 		.name			= "VDVI", | ||||
| 		.min_uV			= 1800000, | ||||
| 		.max_uV			= 1800000, | ||||
| 		.apply_uV		= true, | ||||
| 		.valid_modes_mask	= REGULATOR_MODE_NORMAL | ||||
| 					| REGULATOR_MODE_STANDBY, | ||||
| 		.valid_ops_mask		= REGULATOR_CHANGE_MODE | ||||
| 					| REGULATOR_CHANGE_STATUS, | ||||
| 	}, | ||||
| 	.num_consumer_supplies	= ARRAY_SIZE(ldp_vpll2_supplies), | ||||
| 	.consumer_supplies	= ldp_vpll2_supplies, | ||||
| }; | ||||
| 
 | ||||
| static struct twl4030_platform_data ldp_twldata = { | ||||
| 	/* platform_data for children goes here */ | ||||
| 	.vmmc1		= &ldp_vmmc1, | ||||
| 	.vaux1		= &ldp_vaux1, | ||||
| 	.vpll2		= &ldp_vpll2, | ||||
| 	.gpio		= &ldp_gpio_data, | ||||
| 	.keypad		= &ldp_kp_twl4030_data, | ||||
| }; | ||||
|  | @ -272,7 +376,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = { | |||
| }; | ||||
| 
 | ||||
| static struct platform_device *ldp_devices[] __initdata = { | ||||
| 	&ldp_lcd_device, | ||||
| 	&ldp_gpio_keys_device, | ||||
| }; | ||||
| 
 | ||||
|  | @ -317,8 +420,6 @@ static struct mtd_partition ldp_nand_partitions[] = { | |||
| static void __init omap_ldp_init(void) | ||||
| { | ||||
| 	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | ||||
| 	omap_board_config = ldp_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(ldp_config); | ||||
| 	ldp_init_smsc911x(); | ||||
| 	omap_i2c_init(); | ||||
| 	platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices)); | ||||
|  | @ -329,6 +430,7 @@ static void __init omap_ldp_init(void) | |||
| 		ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); | ||||
| 
 | ||||
| 	omap2_hsmmc_init(mmc); | ||||
| 	ldp_display_init(); | ||||
| } | ||||
| 
 | ||||
| MACHINE_START(OMAP_LDP, "OMAP LDP board") | ||||
|  |  | |||
|  | @ -42,7 +42,7 @@ | |||
| #include <plat/board.h> | ||||
| #include <plat/common.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| #include <plat/gpmc.h> | ||||
| #include <plat/nand.h> | ||||
| #include <plat/usb.h> | ||||
|  | @ -203,16 +203,16 @@ 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", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable = beagle_enable_dvi, | ||||
| 	.platform_disable = beagle_disable_dvi, | ||||
| 	.i2c_bus_num = 3, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device beagle_dvi_device = { | ||||
| 	.type = OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.name = "dvi", | ||||
| 	.driver_name = "generic_dpi_panel", | ||||
| 	.driver_name = "dvi", | ||||
| 	.data = &dvi_panel, | ||||
| 	.phy.dpi.data_lines = 24, | ||||
| 	.reset_gpio = -EINVAL, | ||||
|  |  | |||
|  | @ -45,7 +45,7 @@ | |||
| #include <plat/common.h> | ||||
| #include <plat/mcspi.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| 
 | ||||
| #include "mux.h" | ||||
| #include "sdram-micron-mt46h32m32lf-6.h" | ||||
|  | @ -247,8 +247,7 @@ static void omap3_evm_disable_dvi(struct omap_dss_device *dssdev) | |||
| 	dvi_enabled = 0; | ||||
| } | ||||
| 
 | ||||
| static struct panel_generic_dpi_data dvi_panel = { | ||||
| 	.name			= "generic", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable	= omap3_evm_enable_dvi, | ||||
| 	.platform_disable	= omap3_evm_disable_dvi, | ||||
| }; | ||||
|  | @ -256,7 +255,7 @@ static struct panel_generic_dpi_data dvi_panel = { | |||
| static struct omap_dss_device omap3_evm_dvi_device = { | ||||
| 	.name			= "dvi", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.data			= &dvi_panel, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| }; | ||||
|  |  | |||
|  | @ -335,7 +335,7 @@ static struct regulator_consumer_supply pandora_vmmc3_supply[] = { | |||
| static struct regulator_consumer_supply pandora_vdds_supplies[] = { | ||||
| 	REGULATOR_SUPPLY("vdds_sdi", "omapdss"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"), | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_consumer_supply pandora_vcc_lcd_supply[] = { | ||||
|  |  | |||
|  | @ -41,6 +41,7 @@ | |||
| #include <plat/usb.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| 
 | ||||
| #include <plat/mcspi.h> | ||||
| #include <linux/input/matrix_keypad.h> | ||||
|  | @ -107,39 +108,6 @@ static void __init omap3_stalker_display_init(void) | |||
| 	return; | ||||
| } | ||||
| 
 | ||||
| static int omap3_stalker_enable_lcd(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	if (dvi_enabled) { | ||||
| 		printk(KERN_ERR "cannot enable LCD, DVI is enabled\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	gpio_set_value(DSS_ENABLE_GPIO, 1); | ||||
| 	gpio_set_value(LCD_PANEL_BKLIGHT_GPIO, 1); | ||||
| 	lcd_enabled = 1; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void omap3_stalker_disable_lcd(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	gpio_set_value(DSS_ENABLE_GPIO, 0); | ||||
| 	gpio_set_value(LCD_PANEL_BKLIGHT_GPIO, 0); | ||||
| 	lcd_enabled = 0; | ||||
| } | ||||
| 
 | ||||
| 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; | ||||
|  | @ -179,8 +147,7 @@ static void omap3_stalker_disable_dvi(struct omap_dss_device *dssdev) | |||
| 	dvi_enabled = 0; | ||||
| } | ||||
| 
 | ||||
| static struct panel_generic_dpi_data dvi_panel = { | ||||
| 	.name			= "generic", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable	= omap3_stalker_enable_dvi, | ||||
| 	.platform_disable	= omap3_stalker_disable_dvi, | ||||
| }; | ||||
|  | @ -188,13 +155,12 @@ static struct panel_generic_dpi_data dvi_panel = { | |||
| static struct omap_dss_device omap3_stalker_dvi_device = { | ||||
| 	.name			= "dvi", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.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, | ||||
| 	&omap3_stalker_dvi_device, | ||||
| }; | ||||
|  |  | |||
|  | @ -104,15 +104,6 @@ static struct omap2_hsmmc_info mmc[] = { | |||
| 	{}	/* Terminator */ | ||||
| }; | ||||
| 
 | ||||
| static struct platform_device omap3_touchbook_lcd_device = { | ||||
| 	.name		= "omap3touchbook_lcd", | ||||
| 	.id		= -1, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_lcd_config omap3_touchbook_lcd_config __initdata = { | ||||
| 	.ctrl_name	= "internal", | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_consumer_supply touchbook_vmmc1_supply[] = { | ||||
| 	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"), | ||||
| }; | ||||
|  | @ -165,14 +156,12 @@ static struct twl4030_gpio_platform_data touchbook_gpio_data = { | |||
| static struct regulator_consumer_supply touchbook_vdac_supply[] = { | ||||
| { | ||||
| 	.supply		= "vdac", | ||||
| 	.dev		= &omap3_touchbook_lcd_device.dev, | ||||
| }, | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_consumer_supply touchbook_vdvi_supply[] = { | ||||
| { | ||||
| 	.supply		= "vdvi", | ||||
| 	.dev		= &omap3_touchbook_lcd_device.dev, | ||||
| }, | ||||
| }; | ||||
| 
 | ||||
|  | @ -316,10 +305,6 @@ static struct platform_device keys_gpio = { | |||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel omap3_touchbook_config[] __initdata = { | ||||
| 	{ OMAP_TAG_LCD,		&omap3_touchbook_lcd_config }, | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_OMAP_MUX | ||||
| static struct omap_board_mux board_mux[] __initdata = { | ||||
| 	{ .reg_offset = OMAP_MUX_TERMINATOR }, | ||||
|  | @ -339,7 +324,6 @@ static void __init omap3_touchbook_init_irq(void) | |||
| } | ||||
| 
 | ||||
| static struct platform_device *omap3_touchbook_devices[] __initdata = { | ||||
| 	&omap3_touchbook_lcd_device, | ||||
| 	&leds_gpio, | ||||
| 	&keys_gpio, | ||||
| }; | ||||
|  | @ -376,8 +360,6 @@ early_param("tbr", early_touchbook_revision); | |||
| static void __init omap3_touchbook_init(void) | ||||
| { | ||||
| 	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | ||||
| 	omap_board_config = omap3_touchbook_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(omap3_touchbook_config); | ||||
| 
 | ||||
| 	pm_power_off = omap3_touchbook_poweroff; | ||||
| 
 | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ | |||
| #include <plat/common.h> | ||||
| #include <plat/usb.h> | ||||
| #include <plat/mmc.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| 
 | ||||
| #include "hsmmc.h" | ||||
| #include "control.h" | ||||
|  | @ -455,16 +455,16 @@ static void omap4_panda_disable_dvi(struct omap_dss_device *dssdev) | |||
| } | ||||
| 
 | ||||
| /* Using generic display panel */ | ||||
| static struct panel_generic_dpi_data omap4_dvi_panel = { | ||||
| 	.name			= "generic", | ||||
| static struct panel_dvi_platform_data omap4_dvi_panel = { | ||||
| 	.platform_enable	= omap4_panda_enable_dvi, | ||||
| 	.platform_disable	= omap4_panda_disable_dvi, | ||||
| 	.i2c_bus_num = 3, | ||||
| }; | ||||
| 
 | ||||
| struct omap_dss_device omap4_panda_dvi_device = { | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.name			= "dvi", | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.data			= &omap4_dvi_panel, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| 	.reset_gpio		= PANDA_DVI_TFP410_POWER_DOWN_GPIO, | ||||
|  |  | |||
|  | @ -46,6 +46,7 @@ | |||
| #include <plat/common.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-generic-dpi.h> | ||||
| #include <video/omap-panel-dvi.h> | ||||
| #include <plat/gpmc.h> | ||||
| #include <mach/hardware.h> | ||||
| #include <plat/nand.h> | ||||
|  | @ -182,16 +183,16 @@ static void overo_panel_disable_dvi(struct omap_dss_device *dssdev) | |||
| 	dvi_enabled = 0; | ||||
| } | ||||
| 
 | ||||
| static struct panel_generic_dpi_data dvi_panel = { | ||||
| 	.name			= "generic", | ||||
| static struct panel_dvi_platform_data dvi_panel = { | ||||
| 	.platform_enable	= overo_panel_enable_dvi, | ||||
| 	.platform_disable	= overo_panel_disable_dvi, | ||||
| 	.i2c_bus_num		= 3, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_dss_device overo_dvi_device = { | ||||
| 	.name			= "dvi", | ||||
| 	.type			= OMAP_DISPLAY_TYPE_DPI, | ||||
| 	.driver_name		= "generic_dpi_panel", | ||||
| 	.driver_name		= "dvi", | ||||
| 	.data			= &dvi_panel, | ||||
| 	.phy.dpi.data_lines	= 24, | ||||
| }; | ||||
|  |  | |||
|  | @ -79,29 +79,6 @@ static struct cpuidle_params rx51_cpuidle_params[] = { | |||
| 	{7505 + 15274, 484329, 1}, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_lcd_config rx51_lcd_config = { | ||||
| 	.ctrl_name	= "internal", | ||||
| }; | ||||
| 
 | ||||
| static struct omap_fbmem_config rx51_fbmem0_config = { | ||||
| 	.size = 752 * 1024, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_fbmem_config rx51_fbmem1_config = { | ||||
| 	.size = 752 * 1024, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_fbmem_config rx51_fbmem2_config = { | ||||
| 	.size = 752 * 1024, | ||||
| }; | ||||
| 
 | ||||
| static struct omap_board_config_kernel rx51_config[] = { | ||||
| 	{ OMAP_TAG_FBMEM,	&rx51_fbmem0_config }, | ||||
| 	{ OMAP_TAG_FBMEM,	&rx51_fbmem1_config }, | ||||
| 	{ OMAP_TAG_FBMEM,	&rx51_fbmem2_config }, | ||||
| 	{ OMAP_TAG_LCD,		&rx51_lcd_config }, | ||||
| }; | ||||
| 
 | ||||
| static void __init rx51_init_early(void) | ||||
| { | ||||
| 	struct omap_sdrc_params *sdrc_params; | ||||
|  | @ -128,8 +105,6 @@ static struct omap_musb_board_data musb_board_data = { | |||
| static void __init rx51_init(void) | ||||
| { | ||||
| 	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | ||||
| 	omap_board_config = rx51_config; | ||||
| 	omap_board_config_size = ARRAY_SIZE(rx51_config); | ||||
| 	omap3_pm_init_cpuidle(rx51_cpuidle_params); | ||||
| 	omap_serial_init(); | ||||
| 	usb_musb_init(&musb_board_data); | ||||
|  |  | |||
|  | @ -27,6 +27,8 @@ | |||
| #include <plat/omap_device.h> | ||||
| #include <plat/omap-pm.h> | ||||
| 
 | ||||
| #include "control.h" | ||||
| 
 | ||||
| static struct platform_device omap_display_device = { | ||||
| 	.name          = "omapdss", | ||||
| 	.id            = -1, | ||||
|  | @ -61,7 +63,7 @@ static const struct omap_dss_hwmod_data omap3_dss_hwmod_data[] __initdata = { | |||
| 	{ "dss_dispc", "omapdss_dispc", -1 }, | ||||
| 	{ "dss_rfbi", "omapdss_rfbi", -1 }, | ||||
| 	{ "dss_venc", "omapdss_venc", -1 }, | ||||
| 	{ "dss_dsi1", "omapdss_dsi1", -1 }, | ||||
| 	{ "dss_dsi1", "omapdss_dsi", 0 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = { | ||||
|  | @ -69,11 +71,58 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = { | |||
| 	{ "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_dsi1", "omapdss_dsi", 0 }, | ||||
| 	{ "dss_dsi2", "omapdss_dsi", 1 }, | ||||
| 	{ "dss_hdmi", "omapdss_hdmi", -1 }, | ||||
| }; | ||||
| 
 | ||||
| static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) | ||||
| { | ||||
| 	u32 enable_mask, enable_shift; | ||||
| 	u32 pipd_mask, pipd_shift; | ||||
| 	u32 reg; | ||||
| 
 | ||||
| 	if (dsi_id == 0) { | ||||
| 		enable_mask = OMAP4_DSI1_LANEENABLE_MASK; | ||||
| 		enable_shift = OMAP4_DSI1_LANEENABLE_SHIFT; | ||||
| 		pipd_mask = OMAP4_DSI1_PIPD_MASK; | ||||
| 		pipd_shift = OMAP4_DSI1_PIPD_SHIFT; | ||||
| 	} else if (dsi_id == 1) { | ||||
| 		enable_mask = OMAP4_DSI2_LANEENABLE_MASK; | ||||
| 		enable_shift = OMAP4_DSI2_LANEENABLE_SHIFT; | ||||
| 		pipd_mask = OMAP4_DSI2_PIPD_MASK; | ||||
| 		pipd_shift = OMAP4_DSI2_PIPD_SHIFT; | ||||
| 	} else { | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	reg = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY); | ||||
| 
 | ||||
| 	reg &= ~enable_mask; | ||||
| 	reg &= ~pipd_mask; | ||||
| 
 | ||||
| 	reg |= (lanes << enable_shift) & enable_mask; | ||||
| 	reg |= (lanes << pipd_shift) & pipd_mask; | ||||
| 
 | ||||
| 	omap4_ctrl_pad_writel(reg, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask) | ||||
| { | ||||
| 	if (cpu_is_omap44xx()) | ||||
| 		return omap4_dsi_mux_pads(dsi_id, lane_mask); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void omap_dsi_disable_pads(int dsi_id, unsigned lane_mask) | ||||
| { | ||||
| 	if (cpu_is_omap44xx()) | ||||
| 		omap4_dsi_mux_pads(dsi_id, 0); | ||||
| } | ||||
| 
 | ||||
| int __init omap_display_init(struct omap_dss_board_info *board_data) | ||||
| { | ||||
| 	int r = 0; | ||||
|  | @ -96,6 +145,11 @@ int __init omap_display_init(struct omap_dss_board_info *board_data) | |||
| 		oh_count = ARRAY_SIZE(omap4_dss_hwmod_data); | ||||
| 	} | ||||
| 
 | ||||
| 	if (board_data->dsi_enable_pads == NULL) | ||||
| 		board_data->dsi_enable_pads = omap_dsi_enable_pads; | ||||
| 	if (board_data->dsi_disable_pads == NULL) | ||||
| 		board_data->dsi_disable_pads = omap_dsi_disable_pads; | ||||
| 
 | ||||
| 	pdata.board_data = board_data; | ||||
| 	pdata.board_data->get_context_loss_count = | ||||
| 		omap_pm_get_dev_context_loss_count; | ||||
|  |  | |||
|  | @ -99,7 +99,7 @@ static struct regulator_init_data omap3_vdac_idata = { | |||
| 
 | ||||
| static struct regulator_consumer_supply omap3_vpll2_supplies[] = { | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"), | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_init_data omap3_vpll2_idata = { | ||||
|  | @ -235,6 +235,12 @@ static struct regulator_init_data omap4_vana_idata = { | |||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_consumer_supply omap4_vcxio_supply[] = { | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dss"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"), | ||||
| 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.1"), | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_init_data omap4_vcxio_idata = { | ||||
| 	.constraints = { | ||||
| 		.min_uV			= 1800000, | ||||
|  | @ -243,7 +249,10 @@ static struct regulator_init_data omap4_vcxio_idata = { | |||
| 					| REGULATOR_MODE_STANDBY, | ||||
| 		.valid_ops_mask		= REGULATOR_CHANGE_MODE | ||||
| 					| REGULATOR_CHANGE_STATUS, | ||||
| 		.always_on		= true, | ||||
| 	}, | ||||
| 	.num_consumer_supplies	= ARRAY_SIZE(omap4_vcxio_supply), | ||||
| 	.consumer_supplies	= omap4_vcxio_supply, | ||||
| }; | ||||
| 
 | ||||
| static struct regulator_init_data omap4_vusb_idata = { | ||||
|  |  | |||
|  | @ -1597,6 +1597,7 @@ static void __init mackerel_init(void) | |||
| 
 | ||||
| 	sh7372_add_device_to_domain(&sh7372_a4lc, &lcdc_device); | ||||
| 	sh7372_add_device_to_domain(&sh7372_a4lc, &hdmi_lcdc_device); | ||||
| 	sh7372_add_device_to_domain(&sh7372_a4lc, &meram_device); | ||||
| 	sh7372_add_device_to_domain(&sh7372_a4mp, &fsi_device); | ||||
| 	sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs0_device); | ||||
| 	sh7372_add_device_to_domain(&sh7372_a3sp, &usbhs1_device); | ||||
|  |  | |||
|  | @ -66,8 +66,8 @@ struct fsl_diu_shared_fb { | |||
| 	bool		in_use; | ||||
| }; | ||||
| 
 | ||||
| unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel, | ||||
| 				      int monitor_port) | ||||
| u32 mpc512x_get_pixel_format(enum fsl_diu_monitor_port port, | ||||
| 			     unsigned int bits_per_pixel) | ||||
| { | ||||
| 	switch (bits_per_pixel) { | ||||
| 	case 32: | ||||
|  | @ -80,11 +80,12 @@ unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel, | |||
| 	return 0x00000400; | ||||
| } | ||||
| 
 | ||||
| void mpc512x_set_gamma_table(int monitor_port, char *gamma_table_base) | ||||
| void mpc512x_set_gamma_table(enum fsl_diu_monitor_port port, | ||||
| 			     char *gamma_table_base) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| void mpc512x_set_monitor_port(int monitor_port) | ||||
| void mpc512x_set_monitor_port(enum fsl_diu_monitor_port port) | ||||
| { | ||||
| } | ||||
| 
 | ||||
|  | @ -182,14 +183,10 @@ void mpc512x_set_pixel_clock(unsigned int pixclock) | |||
| 	iounmap(ccm); | ||||
| } | ||||
| 
 | ||||
| ssize_t mpc512x_show_monitor_port(int monitor_port, char *buf) | ||||
| enum fsl_diu_monitor_port | ||||
| mpc512x_valid_monitor_port(enum fsl_diu_monitor_port port) | ||||
| { | ||||
| 	return sprintf(buf, "0 - 5121 LCD\n"); | ||||
| } | ||||
| 
 | ||||
| int mpc512x_set_sysfs_monitor_port(int val) | ||||
| { | ||||
| 	return 0; | ||||
| 	return FSL_DIU_PORT_DVI; | ||||
| } | ||||
| 
 | ||||
| static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb; | ||||
|  | @ -256,7 +253,7 @@ void __init mpc512x_init_diu(void) | |||
| 	} | ||||
| 
 | ||||
| 	mode = in_be32(&diu_reg->diu_mode); | ||||
| 	if (mode != MFB_MODE1) { | ||||
| 	if (mode == MFB_MODE0) { | ||||
| 		pr_info("%s: DIU OFF\n", __func__); | ||||
| 		goto out; | ||||
| 	} | ||||
|  | @ -332,8 +329,7 @@ void __init mpc512x_setup_diu(void) | |||
| 	diu_ops.set_gamma_table		= mpc512x_set_gamma_table; | ||||
| 	diu_ops.set_monitor_port	= mpc512x_set_monitor_port; | ||||
| 	diu_ops.set_pixel_clock		= mpc512x_set_pixel_clock; | ||||
| 	diu_ops.show_monitor_port	= mpc512x_show_monitor_port; | ||||
| 	diu_ops.set_sysfs_monitor_port	= mpc512x_set_sysfs_monitor_port; | ||||
| 	diu_ops.valid_monitor_port	= mpc512x_valid_monitor_port; | ||||
| 	diu_ops.release_bootmem		= mpc512x_release_bootmem; | ||||
| #endif | ||||
| } | ||||
|  |  | |||
|  | @ -93,8 +93,8 @@ | |||
|  * The Area Descriptor is a 32-bit value that determine which bits in each | ||||
|  * pixel are to be used for each color. | ||||
|  */ | ||||
| static unsigned int p1022ds_get_pixel_format(unsigned int bits_per_pixel, | ||||
| 	int monitor_port) | ||||
| static u32 p1022ds_get_pixel_format(enum fsl_diu_monitor_port port, | ||||
| 				    unsigned int bits_per_pixel) | ||||
| { | ||||
| 	switch (bits_per_pixel) { | ||||
| 	case 32: | ||||
|  | @ -118,7 +118,8 @@ static unsigned int p1022ds_get_pixel_format(unsigned int bits_per_pixel, | |||
|  * On some boards, the gamma table for some ports may need to be modified. | ||||
|  * This is not the case on the P1022DS, so we do nothing. | ||||
| */ | ||||
| static void p1022ds_set_gamma_table(int monitor_port, char *gamma_table_base) | ||||
| static void p1022ds_set_gamma_table(enum fsl_diu_monitor_port port, | ||||
| 				    char *gamma_table_base) | ||||
| { | ||||
| } | ||||
| 
 | ||||
|  | @ -126,7 +127,7 @@ static void p1022ds_set_gamma_table(int monitor_port, char *gamma_table_base) | |||
|  * p1022ds_set_monitor_port: switch the output to a different monitor port | ||||
|  * | ||||
|  */ | ||||
| static void p1022ds_set_monitor_port(int monitor_port) | ||||
| static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) | ||||
| { | ||||
| 	struct device_node *pixis_node; | ||||
| 	void __iomem *pixis; | ||||
|  | @ -145,19 +146,21 @@ static void p1022ds_set_monitor_port(int monitor_port) | |||
| 	} | ||||
| 	brdcfg1 = pixis + 9;	/* BRDCFG1 is at offset 9 in the ngPIXIS */ | ||||
| 
 | ||||
| 	switch (monitor_port) { | ||||
| 	case 0: /* DVI */ | ||||
| 	switch (port) { | ||||
| 	case FSL_DIU_PORT_DVI: | ||||
| 		printk(KERN_INFO "%s:%u\n", __func__, __LINE__); | ||||
| 		/* Enable the DVI port, disable the DFP and the backlight */ | ||||
| 		clrsetbits_8(brdcfg1, PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT, | ||||
| 			     PX_BRDCFG1_DVIEN); | ||||
| 		break; | ||||
| 	case 1: /* Single link LVDS */ | ||||
| 	case FSL_DIU_PORT_LVDS: | ||||
| 		printk(KERN_INFO "%s:%u\n", __func__, __LINE__); | ||||
| 		/* Enable the DFP port, disable the DVI and the backlight */ | ||||
| 		clrsetbits_8(brdcfg1, PX_BRDCFG1_DVIEN | PX_BRDCFG1_BACKLIGHT, | ||||
| 			     PX_BRDCFG1_DFPEN); | ||||
| 		break; | ||||
| 	default: | ||||
| 		pr_err("p1022ds: unsupported monitor port %i\n", monitor_port); | ||||
| 		pr_err("p1022ds: unsupported monitor port %i\n", port); | ||||
| 	} | ||||
| 
 | ||||
| 	iounmap(pixis); | ||||
|  | @ -214,23 +217,18 @@ void p1022ds_set_pixel_clock(unsigned int pixclock) | |||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * p1022ds_show_monitor_port: show the current monitor | ||||
|  * | ||||
|  * This function returns a string indicating whether the current monitor is | ||||
|  * set to DVI or LVDS. | ||||
|  * p1022ds_valid_monitor_port: set the monitor port for sysfs | ||||
|  */ | ||||
| ssize_t p1022ds_show_monitor_port(int monitor_port, char *buf) | ||||
| enum fsl_diu_monitor_port | ||||
| p1022ds_valid_monitor_port(enum fsl_diu_monitor_port port) | ||||
| { | ||||
| 	return sprintf(buf, "%c0 - DVI\n%c1 - Single link LVDS\n", | ||||
| 		monitor_port == 0 ? '*' : ' ', monitor_port == 1 ? '*' : ' '); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * p1022ds_set_sysfs_monitor_port: set the monitor port for sysfs | ||||
|  */ | ||||
| int p1022ds_set_sysfs_monitor_port(int val) | ||||
| { | ||||
| 	return val < 2 ? val : 0; | ||||
| 	switch (port) { | ||||
| 	case FSL_DIU_PORT_DVI: | ||||
| 	case FSL_DIU_PORT_LVDS: | ||||
| 		return port; | ||||
| 	default: | ||||
| 		return FSL_DIU_PORT_DVI; /* Dual-link LVDS is not supported */ | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | @ -305,8 +303,7 @@ static void __init p1022_ds_setup_arch(void) | |||
| 	diu_ops.set_gamma_table		= p1022ds_set_gamma_table; | ||||
| 	diu_ops.set_monitor_port	= p1022ds_set_monitor_port; | ||||
| 	diu_ops.set_pixel_clock		= p1022ds_set_pixel_clock; | ||||
| 	diu_ops.show_monitor_port	= p1022ds_show_monitor_port; | ||||
| 	diu_ops.set_sysfs_monitor_port	= p1022ds_set_sysfs_monitor_port; | ||||
| 	diu_ops.valid_monitor_port	= p1022ds_valid_monitor_port; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef CONFIG_SMP | ||||
|  |  | |||
|  | @ -152,10 +152,10 @@ machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices); | |||
| 	(c2 << AD_COMP_2_SHIFT) | (c1 << AD_COMP_1_SHIFT) | \ | ||||
| 	(c0 << AD_COMP_0_SHIFT) | (size << AD_PIXEL_S_SHIFT)) | ||||
| 
 | ||||
| unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel, | ||||
| 						int monitor_port) | ||||
| u32 mpc8610hpcd_get_pixel_format(enum fsl_diu_monitor_port port, | ||||
| 				 unsigned int bits_per_pixel) | ||||
| { | ||||
| 	static const unsigned long pixelformat[][3] = { | ||||
| 	static const u32 pixelformat[][3] = { | ||||
| 		{ | ||||
| 			MAKE_AD(3, 0, 2, 1, 3, 8, 8, 8, 8), | ||||
| 			MAKE_AD(4, 2, 0, 1, 2, 8, 8, 8, 0), | ||||
|  | @ -170,7 +170,8 @@ unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel, | |||
| 	unsigned int arch_monitor; | ||||
| 
 | ||||
| 	/* The DVI port is mis-wired on revision 1 of this board. */ | ||||
| 	arch_monitor = ((*pixis_arch == 0x01) && (monitor_port == 0))? 0 : 1; | ||||
| 	arch_monitor = | ||||
| 		((*pixis_arch == 0x01) && (port == FSL_DIU_PORT_DVI)) ? 0 : 1; | ||||
| 
 | ||||
| 	switch (bits_per_pixel) { | ||||
| 	case 32: | ||||
|  | @ -185,10 +186,11 @@ unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel, | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void mpc8610hpcd_set_gamma_table(int monitor_port, char *gamma_table_base) | ||||
| void mpc8610hpcd_set_gamma_table(enum fsl_diu_monitor_port port, | ||||
| 				 char *gamma_table_base) | ||||
| { | ||||
| 	int i; | ||||
| 	if (monitor_port == 2) {		/* dual link LVDS */ | ||||
| 	if (port == FSL_DIU_PORT_DLVDS) { | ||||
| 		for (i = 0; i < 256*3; i++) | ||||
| 			gamma_table_base[i] = (gamma_table_base[i] << 2) | | ||||
| 					 ((gamma_table_base[i] >> 6) & 0x03); | ||||
|  | @ -199,17 +201,21 @@ void mpc8610hpcd_set_gamma_table(int monitor_port, char *gamma_table_base) | |||
| #define PX_BRDCFG0_DLINK	(1 << 4) | ||||
| #define PX_BRDCFG0_DIU_MASK	(PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK) | ||||
| 
 | ||||
| void mpc8610hpcd_set_monitor_port(int monitor_port) | ||||
| void mpc8610hpcd_set_monitor_port(enum fsl_diu_monitor_port port) | ||||
| { | ||||
| 	static const u8 bdcfg[] = { | ||||
| 		PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK, | ||||
| 		PX_BRDCFG0_DLINK, | ||||
| 		0, | ||||
| 	}; | ||||
| 
 | ||||
| 	if (monitor_port < 3) | ||||
| 	switch (port) { | ||||
| 	case FSL_DIU_PORT_DVI: | ||||
| 		clrsetbits_8(pixis_bdcfg0, PX_BRDCFG0_DIU_MASK, | ||||
| 			     bdcfg[monitor_port]); | ||||
| 			     PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK); | ||||
| 		break; | ||||
| 	case FSL_DIU_PORT_LVDS: | ||||
| 		clrsetbits_8(pixis_bdcfg0, PX_BRDCFG0_DIU_MASK, | ||||
| 			     PX_BRDCFG0_DLINK); | ||||
| 		break; | ||||
| 	case FSL_DIU_PORT_DLVDS: | ||||
| 		clrbits8(pixis_bdcfg0, PX_BRDCFG0_DIU_MASK); | ||||
| 		break; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -262,20 +268,10 @@ void mpc8610hpcd_set_pixel_clock(unsigned int pixclock) | |||
| 	iounmap(guts); | ||||
| } | ||||
| 
 | ||||
| ssize_t mpc8610hpcd_show_monitor_port(int monitor_port, char *buf) | ||||
| enum fsl_diu_monitor_port | ||||
| mpc8610hpcd_valid_monitor_port(enum fsl_diu_monitor_port port) | ||||
| { | ||||
| 	return snprintf(buf, PAGE_SIZE, | ||||
| 			"%c0 - DVI\n" | ||||
| 			"%c1 - Single link LVDS\n" | ||||
| 			"%c2 - Dual link LVDS\n", | ||||
| 			monitor_port == 0 ? '*' : ' ', | ||||
| 			monitor_port == 1 ? '*' : ' ', | ||||
| 			monitor_port == 2 ? '*' : ' '); | ||||
| } | ||||
| 
 | ||||
| int mpc8610hpcd_set_sysfs_monitor_port(int val) | ||||
| { | ||||
| 	return val < 3 ? val : 0; | ||||
| 	return port; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | @ -307,8 +303,7 @@ static void __init mpc86xx_hpcd_setup_arch(void) | |||
| 	diu_ops.set_gamma_table		= mpc8610hpcd_set_gamma_table; | ||||
| 	diu_ops.set_monitor_port	= mpc8610hpcd_set_monitor_port; | ||||
| 	diu_ops.set_pixel_clock		= mpc8610hpcd_set_pixel_clock; | ||||
| 	diu_ops.show_monitor_port	= mpc8610hpcd_show_monitor_port; | ||||
| 	diu_ops.set_sysfs_monitor_port	= mpc8610hpcd_set_sysfs_monitor_port; | ||||
| 	diu_ops.valid_monitor_port	= mpc8610hpcd_valid_monitor_port; | ||||
| #endif | ||||
| 
 | ||||
| 	pixis_node = of_find_compatible_node(NULL, NULL, "fsl,fpga-pixis"); | ||||
|  |  | |||
|  | @ -22,15 +22,24 @@ struct device_node; | |||
| extern void fsl_rstcr_restart(char *cmd); | ||||
| 
 | ||||
| #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) | ||||
| 
 | ||||
| /* The different ports that the DIU can be connected to */ | ||||
| enum fsl_diu_monitor_port { | ||||
| 	FSL_DIU_PORT_DVI,	/* DVI */ | ||||
| 	FSL_DIU_PORT_LVDS,	/* Single-link LVDS */ | ||||
| 	FSL_DIU_PORT_DLVDS	/* Dual-link LVDS */ | ||||
| }; | ||||
| 
 | ||||
| struct platform_diu_data_ops { | ||||
| 	unsigned int (*get_pixel_format) (unsigned int bits_per_pixel, | ||||
| 		int monitor_port); | ||||
| 	void (*set_gamma_table) (int monitor_port, char *gamma_table_base); | ||||
| 	void (*set_monitor_port) (int monitor_port); | ||||
| 	void (*set_pixel_clock) (unsigned int pixclock); | ||||
| 	ssize_t (*show_monitor_port) (int monitor_port, char *buf); | ||||
| 	int (*set_sysfs_monitor_port) (int val); | ||||
| 	void (*release_bootmem) (void); | ||||
| 	u32 (*get_pixel_format)(enum fsl_diu_monitor_port port, | ||||
| 		unsigned int bpp); | ||||
| 	void (*set_gamma_table)(enum fsl_diu_monitor_port port, | ||||
| 		char *gamma_table_base); | ||||
| 	void (*set_monitor_port)(enum fsl_diu_monitor_port port); | ||||
| 	void (*set_pixel_clock)(unsigned int pixclock); | ||||
| 	enum fsl_diu_monitor_port (*valid_monitor_port) | ||||
| 		(enum fsl_diu_monitor_port port); | ||||
| 	void (*release_bootmem)(void); | ||||
| }; | ||||
| 
 | ||||
| extern struct platform_diu_data_ops diu_ops; | ||||
|  |  | |||
|  | @ -400,7 +400,6 @@ static int omapvid_setup_overlay(struct omap_vout_device *vout, | |||
| 
 | ||||
| 	ovl->get_overlay_info(ovl, &info); | ||||
| 	info.paddr = addr; | ||||
| 	info.vaddr = NULL; | ||||
| 	info.width = cropwidth; | ||||
| 	info.height = cropheight; | ||||
| 	info.color_mode = vout->dss_mode; | ||||
|  | @ -1165,12 +1164,17 @@ static int vidioc_try_fmt_vid_overlay(struct file *file, void *fh, | |||
| { | ||||
| 	int ret = 0; | ||||
| 	struct omap_vout_device *vout = fh; | ||||
| 	struct omap_overlay *ovl; | ||||
| 	struct omapvideo_info *ovid; | ||||
| 	struct v4l2_window *win = &f->fmt.win; | ||||
| 
 | ||||
| 	ovid = &vout->vid_info; | ||||
| 	ovl = ovid->overlays[0]; | ||||
| 
 | ||||
| 	ret = omap_vout_try_window(&vout->fbuf, win); | ||||
| 
 | ||||
| 	if (!ret) { | ||||
| 		if (vout->vid == OMAP_VIDEO1) | ||||
| 		if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0) | ||||
| 			win->global_alpha = 255; | ||||
| 		else | ||||
| 			win->global_alpha = f->fmt.win.global_alpha; | ||||
|  | @ -1194,8 +1198,8 @@ static int vidioc_s_fmt_vid_overlay(struct file *file, void *fh, | |||
| 
 | ||||
| 	ret = omap_vout_new_window(&vout->crop, &vout->win, &vout->fbuf, win); | ||||
| 	if (!ret) { | ||||
| 		/* Video1 plane does not support global alpha */ | ||||
| 		if (ovl->id == OMAP_DSS_VIDEO1) | ||||
| 		/* Video1 plane does not support global alpha on OMAP3 */ | ||||
| 		if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0) | ||||
| 			vout->win.global_alpha = 255; | ||||
| 		else | ||||
| 			vout->win.global_alpha = f->fmt.win.global_alpha; | ||||
|  | @ -1788,7 +1792,9 @@ static int vidioc_s_fbuf(struct file *file, void *fh, | |||
| 	if (ovl->manager && ovl->manager->get_manager_info && | ||||
| 			ovl->manager->set_manager_info) { | ||||
| 		ovl->manager->get_manager_info(ovl->manager, &info); | ||||
| 		info.alpha_enabled = enable; | ||||
| 		/* enable this only if there is no zorder cap */ | ||||
| 		if ((ovl->caps & OMAP_DSS_OVL_CAP_ZORDER) == 0) | ||||
| 			info.partial_alpha_enabled = enable; | ||||
| 		if (ovl->manager->set_manager_info(ovl->manager, &info)) | ||||
| 			return -EINVAL; | ||||
| 	} | ||||
|  | @ -1820,7 +1826,7 @@ static int vidioc_g_fbuf(struct file *file, void *fh, | |||
| 	} | ||||
| 	if (ovl->manager && ovl->manager->get_manager_info) { | ||||
| 		ovl->manager->get_manager_info(ovl->manager, &info); | ||||
| 		if (info.alpha_enabled) | ||||
| 		if (info.partial_alpha_enabled) | ||||
| 			a->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA; | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -1300,27 +1300,17 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int XGIfb_pan_var(struct xgifb_video_info *xgifb_info, | ||||
| 			 struct fb_var_screeninfo *var) | ||||
| static int XGIfb_pan_var(struct fb_var_screeninfo *var, struct fb_info *info) | ||||
| { | ||||
| 	struct xgifb_video_info *xgifb_info = info->par; | ||||
| 	unsigned int base; | ||||
| 
 | ||||
| 	/* printk("Inside pan_var"); */ | ||||
| 
 | ||||
| 	if (var->xoffset > (var->xres_virtual - var->xres)) { | ||||
| 		/* printk("Pan: xo: %d xv %d xr %d\n",
 | ||||
| 			var->xoffset, var->xres_virtual, var->xres); */ | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	if (var->yoffset > (var->yres_virtual - var->yres)) { | ||||
| 		/* printk("Pan: yo: %d yv %d yr %d\n",
 | ||||
| 			var->yoffset, var->yres_virtual, var->yres); */ | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 	base = var->yoffset * var->xres_virtual + var->xoffset; | ||||
| 	base = var->yoffset * info->var.xres_virtual + var->xoffset; | ||||
| 
 | ||||
| 	/* calculate base bpp dep. */ | ||||
| 	switch (var->bits_per_pixel) { | ||||
| 	switch (info->var.bits_per_pixel) { | ||||
| 	case 16: | ||||
| 		base >>= 1; | ||||
| 		break; | ||||
|  | @ -1615,13 +1605,12 @@ static int XGIfb_pan_display(struct fb_var_screeninfo *var, | |||
| 		struct fb_info *info) | ||||
| { | ||||
| 	int err; | ||||
| 	struct xgifb_video_info *xgifb_info = info->par; | ||||
| 
 | ||||
| 	/* printk("\nInside pan_display:\n"); */ | ||||
| 
 | ||||
| 	if (var->xoffset > (var->xres_virtual - var->xres)) | ||||
| 	if (var->xoffset > (info->var.xres_virtual - info->var.xres)) | ||||
| 		return -EINVAL; | ||||
| 	if (var->yoffset > (var->yres_virtual - var->yres)) | ||||
| 	if (var->yoffset > (info->var.yres_virtual - info->var.yres)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (var->vmode & FB_VMODE_YWRAP) { | ||||
|  | @ -1634,7 +1623,7 @@ static int XGIfb_pan_display(struct fb_var_screeninfo *var, | |||
| 						> info->var.yres_virtual) | ||||
| 			return -EINVAL; | ||||
| 	} | ||||
| 	err = XGIfb_pan_var(xgifb_info, var); | ||||
| 	err = XGIfb_pan_var(var, info); | ||||
| 	if (err < 0) | ||||
| 		return err; | ||||
| 
 | ||||
|  |  | |||
|  | @ -378,8 +378,8 @@ static int mc68x328fb_pan_display(struct fb_var_screeninfo *var, | |||
| 		    || var->xoffset) | ||||
| 			return -EINVAL; | ||||
| 	} else { | ||||
| 		if (var->xoffset + var->xres > info->var.xres_virtual || | ||||
| 		    var->yoffset + var->yres > info->var.yres_virtual) | ||||
| 		if (var->xoffset + info->var.xres > info->var.xres_virtual || | ||||
| 		    var->yoffset + info->var.yres > info->var.yres_virtual) | ||||
| 			return -EINVAL; | ||||
| 	} | ||||
| 	info->var.xoffset = var->xoffset; | ||||
|  |  | |||
|  | @ -259,6 +259,15 @@ config FB_TILEBLITTING | |||
| comment "Frame buffer hardware drivers" | ||||
| 	depends on FB | ||||
| 
 | ||||
| config FB_GRVGA | ||||
| 	tristate "Aeroflex Gaisler framebuffer support" | ||||
| 	depends on FB && SPARC | ||||
| 	select FB_CFB_FILLRECT | ||||
| 	select FB_CFB_COPYAREA | ||||
| 	select FB_CFB_IMAGEBLIT | ||||
| 	---help--- | ||||
| 	This enables support for the SVGACTRL framebuffer in the GRLIB IP library from Aeroflex Gaisler. | ||||
| 
 | ||||
| config FB_CIRRUS | ||||
| 	tristate "Cirrus Logic support" | ||||
| 	depends on FB && (ZORRO || PCI) | ||||
|  | @ -1756,9 +1765,10 @@ config FB_AU1100 | |||
| config FB_AU1200 | ||||
| 	bool "Au1200 LCD Driver" | ||||
| 	depends on (FB = y) && MIPS && SOC_AU1200 | ||||
| 	select FB_CFB_FILLRECT | ||||
| 	select FB_CFB_COPYAREA | ||||
| 	select FB_CFB_IMAGEBLIT | ||||
| 	select FB_SYS_FILLRECT | ||||
| 	select FB_SYS_COPYAREA | ||||
| 	select FB_SYS_IMAGEBLIT | ||||
| 	select FB_SYS_FOPS | ||||
| 	help | ||||
| 	  This is the framebuffer driver for the AMD Au1200 SOC.  It can drive | ||||
| 	  various panels and CRTs by passing in kernel cmd line option | ||||
|  | @ -2027,7 +2037,7 @@ config FB_TMIO_ACCELL | |||
| 
 | ||||
| config FB_S3C | ||||
| 	tristate "Samsung S3C framebuffer support" | ||||
| 	depends on FB && S3C_DEV_FB | ||||
| 	depends on FB && (S3C_DEV_FB || S5P_DEV_FIMD0) | ||||
| 	select FB_CFB_FILLRECT | ||||
| 	select FB_CFB_COPYAREA | ||||
| 	select FB_CFB_IMAGEBLIT | ||||
|  | @ -2110,6 +2120,22 @@ config FB_SM501 | |||
| 
 | ||||
| 	  If unsure, say N. | ||||
| 
 | ||||
| config FB_SMSCUFX | ||||
| 	tristate "SMSC UFX6000/7000 USB Framebuffer support" | ||||
| 	depends on FB && USB | ||||
| 	select FB_MODE_HELPERS | ||||
| 	select FB_SYS_FILLRECT | ||||
| 	select FB_SYS_COPYAREA | ||||
| 	select FB_SYS_IMAGEBLIT | ||||
| 	select FB_SYS_FOPS | ||||
| 	select FB_DEFERRED_IO | ||||
| 	---help--- | ||||
| 	  This is a kernel framebuffer driver for SMSC UFX USB devices. | ||||
| 	  Supports fbdev clients like xf86-video-fbdev, kdrive, fbi, and | ||||
| 	  mplayer -vo fbdev. Supports both UFX6000 (USB 2.0) and UFX7000 | ||||
| 	  (USB 3.0) devices. | ||||
| 	  To compile as a module, choose M here: the module name is smscufx. | ||||
| 
 | ||||
| config FB_UDL | ||||
| 	tristate "Displaylink USB Framebuffer support" | ||||
| 	depends on FB && USB | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ obj-$(CONFIG_FB_AMIGA)            += amifb.o c2p_planar.o | |||
| obj-$(CONFIG_FB_ARC)              += arcfb.o | ||||
| obj-$(CONFIG_FB_CLPS711X)         += clps711xfb.o | ||||
| obj-$(CONFIG_FB_CYBER2000)        += cyber2000fb.o | ||||
| obj-$(CONFIG_FB_GRVGA)            += grvga.o | ||||
| obj-$(CONFIG_FB_PM2)              += pm2fb.o | ||||
| obj-$(CONFIG_FB_PM3)		  += pm3fb.o | ||||
| 
 | ||||
|  | @ -127,6 +128,7 @@ obj-$(CONFIG_FB_IBM_GXT4500)	  += gxt4500.o | |||
| obj-$(CONFIG_FB_PS3)		  += ps3fb.o | ||||
| obj-$(CONFIG_FB_SM501)            += sm501fb.o | ||||
| obj-$(CONFIG_FB_UDL)		  += udlfb.o | ||||
| obj-$(CONFIG_FB_SMSCUFX)	  += smscufx.o | ||||
| obj-$(CONFIG_FB_XILINX)           += xilinxfb.o | ||||
| obj-$(CONFIG_SH_MIPI_DSI)	  += sh_mipi_dsi.o | ||||
| obj-$(CONFIG_FB_SH_MOBILE_HDMI)	  += sh_mobile_hdmi.o | ||||
|  |  | |||
|  | @ -850,9 +850,10 @@ acornfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) | |||
| 	u_int y_bottom = var->yoffset; | ||||
| 
 | ||||
| 	if (!(var->vmode & FB_VMODE_YWRAP)) | ||||
| 		y_bottom += var->yres; | ||||
| 		y_bottom += info->var.yres; | ||||
| 
 | ||||
| 	BUG_ON(y_bottom > var->yres_virtual); | ||||
| 	if (y_bottom > info->var.yres_virtual) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	acornfb_update_dma(info, var); | ||||
| 
 | ||||
|  |  | |||
|  | @ -908,13 +908,14 @@ static int arkfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info | |||
| 	unsigned int offset; | ||||
| 
 | ||||
| 	/* Calculate the offset */ | ||||
| 	if (var->bits_per_pixel == 0) { | ||||
| 		offset = (var->yoffset / 16) * (var->xres_virtual / 2) + (var->xoffset / 2); | ||||
| 	if (info->var.bits_per_pixel == 0) { | ||||
| 		offset = (var->yoffset / 16) * (info->var.xres_virtual / 2) | ||||
| 		       + (var->xoffset / 2); | ||||
| 		offset = offset >> 2; | ||||
| 	} else { | ||||
| 		offset = (var->yoffset * info->fix.line_length) + | ||||
| 			 (var->xoffset * var->bits_per_pixel / 8); | ||||
| 		offset = offset >> ((var->bits_per_pixel == 4) ? 2 : 3); | ||||
| 			 (var->xoffset * info->var.bits_per_pixel / 8); | ||||
| 		offset = offset >> ((info->var.bits_per_pixel == 4) ? 2 : 3); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Set the offset */ | ||||
|  |  | |||
|  | @ -39,7 +39,8 @@ | |||
| 					 | FBINFO_HWACCEL_YPAN) | ||||
| 
 | ||||
| static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo, | ||||
| 					struct fb_var_screeninfo *var) | ||||
| 					struct fb_var_screeninfo *var, | ||||
| 					struct fb_info *info) | ||||
| { | ||||
| 
 | ||||
| } | ||||
|  | @ -50,14 +51,16 @@ static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo, | |||
| 					| FBINFO_HWACCEL_YPAN) | ||||
| 
 | ||||
| static void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo, | ||||
| 				     struct fb_var_screeninfo *var) | ||||
| 				     struct fb_var_screeninfo *var, | ||||
| 				     struct fb_info *info) | ||||
| { | ||||
| 	u32 dma2dcfg; | ||||
| 	u32 pixeloff; | ||||
| 
 | ||||
| 	pixeloff = (var->xoffset * var->bits_per_pixel) & 0x1f; | ||||
| 	pixeloff = (var->xoffset * info->var.bits_per_pixel) & 0x1f; | ||||
| 
 | ||||
| 	dma2dcfg = ((var->xres_virtual - var->xres) * var->bits_per_pixel) / 8; | ||||
| 	dma2dcfg = (info->var.xres_virtual - info->var.xres) | ||||
| 		 * info->var.bits_per_pixel / 8; | ||||
| 	dma2dcfg |= pixeloff << ATMEL_LCDC_PIXELOFF_OFFSET; | ||||
| 	lcdc_writel(sinfo, ATMEL_LCDC_DMA2DCFG, dma2dcfg); | ||||
| 
 | ||||
|  | @ -249,14 +252,14 @@ static void atmel_lcdfb_update_dma(struct fb_info *info, | |||
| 	unsigned long dma_addr; | ||||
| 
 | ||||
| 	dma_addr = (fix->smem_start + var->yoffset * fix->line_length | ||||
| 		    + var->xoffset * var->bits_per_pixel / 8); | ||||
| 		    + var->xoffset * info->var.bits_per_pixel / 8); | ||||
| 
 | ||||
| 	dma_addr &= ~3UL; | ||||
| 
 | ||||
| 	/* Set framebuffer DMA base address and pixel offset */ | ||||
| 	lcdc_writel(sinfo, ATMEL_LCDC_DMABADDR1, dma_addr); | ||||
| 
 | ||||
| 	atmel_lcdfb_update_dma2d(sinfo, var); | ||||
| 	atmel_lcdfb_update_dma2d(sinfo, var, info); | ||||
| } | ||||
| 
 | ||||
| static inline void atmel_lcdfb_free_video_memory(struct atmel_lcdfb_info *sinfo) | ||||
|  |  | |||
|  | @ -845,16 +845,16 @@ static int radeonfb_pan_display (struct fb_var_screeninfo *var, | |||
| { | ||||
|         struct radeonfb_info *rinfo = info->par; | ||||
| 
 | ||||
|         if ((var->xoffset + var->xres > var->xres_virtual) | ||||
| 	    || (var->yoffset + var->yres > var->yres_virtual)) | ||||
|                return -EINVAL; | ||||
| 	if ((var->xoffset + info->var.xres > info->var.xres_virtual) | ||||
| 	    || (var->yoffset + info->var.yres > info->var.yres_virtual)) | ||||
| 		return -EINVAL; | ||||
|                  | ||||
|         if (rinfo->asleep) | ||||
|         	return 0; | ||||
| 
 | ||||
| 	radeon_fifo_wait(2); | ||||
|         OUTREG(CRTC_OFFSET, ((var->yoffset * var->xres_virtual + var->xoffset) | ||||
| 			     * var->bits_per_pixel / 8) & ~7); | ||||
| 	OUTREG(CRTC_OFFSET, (var->yoffset * info->fix.line_length + | ||||
| 			     var->xoffset * info->var.bits_per_pixel / 8) & ~7); | ||||
|         return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -110,12 +110,6 @@ static struct fb_var_screeninfo au1100fb_var __devinitdata = { | |||
| 	.vmode		= FB_VMODE_NONINTERLACED, | ||||
| }; | ||||
| 
 | ||||
| static struct au1100fb_drv_info drv_info; | ||||
| 
 | ||||
| static int nocursor = 0; | ||||
| module_param(nocursor, int, 0644); | ||||
| MODULE_PARM_DESC(nocursor, "cursor enable/disable"); | ||||
| 
 | ||||
| /* fb_blank
 | ||||
|  * Blank the screen. Depending on the mode, the screen will be | ||||
|  * activated with the backlight color, or desactivated | ||||
|  | @ -132,7 +126,7 @@ static int au1100fb_fb_blank(int blank_mode, struct fb_info *fbi) | |||
| 			/* Turn on panel */ | ||||
| 			fbdev->regs->lcd_control |= LCD_CONTROL_GO; | ||||
| #ifdef CONFIG_MIPS_PB1100 | ||||
| 			if (drv_info.panel_idx == 1) { | ||||
| 			if (fbdev->panel_idx == 1) { | ||||
| 				au_writew(au_readw(PB1100_G_CONTROL) | ||||
| 					  | (PB1100_G_CONTROL_BL | PB1100_G_CONTROL_VDD), | ||||
| 			PB1100_G_CONTROL); | ||||
|  | @ -147,7 +141,7 @@ static int au1100fb_fb_blank(int blank_mode, struct fb_info *fbi) | |||
| 			/* Turn off panel */ | ||||
| 			fbdev->regs->lcd_control &= ~LCD_CONTROL_GO; | ||||
| #ifdef CONFIG_MIPS_PB1100 | ||||
| 			if (drv_info.panel_idx == 1) { | ||||
| 			if (fbdev->panel_idx == 1) { | ||||
| 				au_writew(au_readw(PB1100_G_CONTROL) | ||||
| 				  	  & ~(PB1100_G_CONTROL_BL | PB1100_G_CONTROL_VDD), | ||||
| 			PB1100_G_CONTROL); | ||||
|  | @ -428,17 +422,6 @@ int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma) | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /* fb_cursor
 | ||||
|  * Used to disable cursor drawing... | ||||
|  */ | ||||
| int au1100fb_fb_cursor(struct fb_info *info, struct fb_cursor *cursor) | ||||
| { | ||||
| 	if (nocursor) | ||||
| 		return 0; | ||||
| 	else | ||||
| 		return -EINVAL;	/* just to force soft_cursor() call */ | ||||
| } | ||||
| 
 | ||||
| static struct fb_ops au1100fb_ops = | ||||
| { | ||||
| 	.owner			= THIS_MODULE, | ||||
|  | @ -450,13 +433,53 @@ static struct fb_ops au1100fb_ops = | |||
| 	.fb_imageblit		= cfb_imageblit, | ||||
| 	.fb_rotate		= au1100fb_fb_rotate, | ||||
| 	.fb_mmap		= au1100fb_fb_mmap, | ||||
| 	.fb_cursor		= au1100fb_fb_cursor, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* AU1100 LCD controller device driver */ | ||||
| static int au1100fb_setup(struct au1100fb_device *fbdev) | ||||
| { | ||||
| 	char *this_opt, *options; | ||||
| 	int num_panels = ARRAY_SIZE(known_lcd_panels); | ||||
| 
 | ||||
| 	if (num_panels <= 0) { | ||||
| 		print_err("No LCD panels supported by driver!"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	if (fb_get_options(DRIVER_NAME, &options)) | ||||
| 		return -ENODEV; | ||||
| 	if (!options) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	while ((this_opt = strsep(&options, ",")) != NULL) { | ||||
| 		/* Panel option */ | ||||
| 		if (!strncmp(this_opt, "panel:", 6)) { | ||||
| 			int i; | ||||
| 			this_opt += 6; | ||||
| 			for (i = 0; i < num_panels; i++) { | ||||
| 				if (!strncmp(this_opt, known_lcd_panels[i].name, | ||||
| 					     strlen(this_opt))) { | ||||
| 					fbdev->panel = &known_lcd_panels[i]; | ||||
| 					fbdev->panel_idx = i; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if (i >= num_panels) { | ||||
| 				print_warn("Panel '%s' not supported!", this_opt); | ||||
| 				return -ENODEV; | ||||
| 			} | ||||
| 		} | ||||
| 		/* Unsupported option */ | ||||
| 		else | ||||
| 			print_warn("Unsupported option \"%s\"", this_opt); | ||||
| 	} | ||||
| 
 | ||||
| 	print_info("Panel=%s", fbdev->panel->name); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int __devinit au1100fb_drv_probe(struct platform_device *dev) | ||||
| { | ||||
|  | @ -465,22 +488,21 @@ static int __devinit au1100fb_drv_probe(struct platform_device *dev) | |||
| 	unsigned long page; | ||||
| 	u32 sys_clksrc; | ||||
| 
 | ||||
| 	if (!dev) | ||||
| 			return -EINVAL; | ||||
| 
 | ||||
| 	/* Allocate new device private */ | ||||
| 	if (!(fbdev = kzalloc(sizeof(struct au1100fb_device), GFP_KERNEL))) { | ||||
| 	fbdev = kzalloc(sizeof(struct au1100fb_device), GFP_KERNEL); | ||||
| 	if (!fbdev) { | ||||
| 		print_err("fail to allocate device private record"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	fbdev->panel = &known_lcd_panels[drv_info.panel_idx]; | ||||
| 	if (au1100fb_setup(fbdev)) | ||||
| 		goto failed; | ||||
| 
 | ||||
| 	platform_set_drvdata(dev, (void *)fbdev); | ||||
| 
 | ||||
| 	/* Allocate region for our registers and map them */ | ||||
| 	if (!(regs_res = platform_get_resource(to_platform_device(dev), | ||||
| 					IORESOURCE_MEM, 0))) { | ||||
| 	regs_res = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||||
| 	if (!regs_res) { | ||||
| 		print_err("fail to retrieve registers resource"); | ||||
| 		return -EFAULT; | ||||
| 	} | ||||
|  | @ -500,13 +522,11 @@ static int __devinit au1100fb_drv_probe(struct platform_device *dev) | |||
| 	print_dbg("Register memory map at %p", fbdev->regs); | ||||
| 	print_dbg("phys=0x%08x, size=%d", fbdev->regs_phys, fbdev->regs_len); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 	/* Allocate the framebuffer to the maximum screen size * nbr of video buffers */ | ||||
| 	fbdev->fb_len = fbdev->panel->xres * fbdev->panel->yres * | ||||
| 		  	(fbdev->panel->bpp >> 3) * AU1100FB_NBR_VIDEO_BUFFERS; | ||||
| 
 | ||||
| 	fbdev->fb_mem = dma_alloc_coherent(dev, PAGE_ALIGN(fbdev->fb_len), | ||||
| 	fbdev->fb_mem = dma_alloc_coherent(&dev->dev, PAGE_ALIGN(fbdev->fb_len), | ||||
| 					&fbdev->fb_phys, GFP_KERNEL); | ||||
| 	if (!fbdev->fb_mem) { | ||||
| 		print_err("fail to allocate frambuffer (size: %dK))", | ||||
|  | @ -525,7 +545,7 @@ static int __devinit au1100fb_drv_probe(struct platform_device *dev) | |||
| 	     page < PAGE_ALIGN((unsigned long)fbdev->fb_mem + fbdev->fb_len); | ||||
| 	     page += PAGE_SIZE) { | ||||
| #if CONFIG_DMA_NONCOHERENT | ||||
| 		SetPageReserved(virt_to_page(CAC_ADDR(page))); | ||||
| 		SetPageReserved(virt_to_page(CAC_ADDR((void *)page))); | ||||
| #else | ||||
| 		SetPageReserved(virt_to_page(page)); | ||||
| #endif | ||||
|  | @ -578,7 +598,8 @@ failed: | |||
| 		release_mem_region(fbdev->regs_phys, fbdev->regs_len); | ||||
| 	} | ||||
| 	if (fbdev->fb_mem) { | ||||
| 		dma_free_noncoherent(dev, fbdev->fb_len, fbdev->fb_mem, fbdev->fb_phys); | ||||
| 		dma_free_noncoherent(&dev->dev, fbdev->fb_len, fbdev->fb_mem, | ||||
| 				     fbdev->fb_phys); | ||||
| 	} | ||||
| 	if (fbdev->info.cmap.len != 0) { | ||||
| 		fb_dealloc_cmap(&fbdev->info.cmap); | ||||
|  | @ -608,7 +629,8 @@ int au1100fb_drv_remove(struct platform_device *dev) | |||
| 
 | ||||
| 	release_mem_region(fbdev->regs_phys, fbdev->regs_len); | ||||
| 
 | ||||
| 	dma_free_coherent(dev, PAGE_ALIGN(fbdev->fb_len), fbdev->fb_mem, fbdev->fb_phys); | ||||
| 	dma_free_coherent(&dev->dev, PAGE_ALIGN(fbdev->fb_len), fbdev->fb_mem, | ||||
| 			  fbdev->fb_phys); | ||||
| 
 | ||||
| 	fb_dealloc_cmap(&fbdev->info.cmap); | ||||
| 	kfree(fbdev->info.pseudo_palette); | ||||
|  | @ -675,101 +697,18 @@ static struct platform_driver au1100fb_driver = { | |||
|         .resume		= au1100fb_drv_resume, | ||||
| }; | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Kernel driver */ | ||||
| 
 | ||||
| int au1100fb_setup(char *options) | ||||
| static int __init au1100fb_load(void) | ||||
| { | ||||
| 	char* this_opt; | ||||
| 	int num_panels = ARRAY_SIZE(known_lcd_panels); | ||||
| 	char* mode = NULL; | ||||
| 	int panel_idx = 0; | ||||
| 
 | ||||
| 	if (num_panels <= 0) { | ||||
| 		print_err("No LCD panels supported by driver!"); | ||||
| 		return -EFAULT; | ||||
| 			} | ||||
| 
 | ||||
| 	if (options) { | ||||
| 		while ((this_opt = strsep(&options,",")) != NULL) { | ||||
| 			/* Panel option */ | ||||
| 			if (!strncmp(this_opt, "panel:", 6)) { | ||||
| 				int i; | ||||
| 				this_opt += 6; | ||||
| 				for (i = 0; i < num_panels; i++) { | ||||
| 					if (!strncmp(this_opt, | ||||
| 					      	     known_lcd_panels[i].name, | ||||
| 							strlen(this_opt))) { | ||||
| 						panel_idx = i; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 				if (i >= num_panels) { | ||||
|  					print_warn("Panel %s not supported!", this_opt); | ||||
| 				} | ||||
| 			} | ||||
| 			if (!strncmp(this_opt, "nocursor", 8)) { | ||||
| 				this_opt += 8; | ||||
| 				nocursor = 1; | ||||
| 				print_info("Cursor disabled"); | ||||
| 			} | ||||
| 			/* Mode option (only option that start with digit) */ | ||||
| 			else if (isdigit(this_opt[0])) { | ||||
| 				mode = kstrdup(this_opt, GFP_KERNEL); | ||||
| 				if (!mode) { | ||||
| 					print_err("memory allocation failed"); | ||||
| 					return -ENOMEM; | ||||
| 				} | ||||
| 			} | ||||
| 			/* Unsupported option */ | ||||
| 			else { | ||||
| 				print_warn("Unsupported option \"%s\"", this_opt); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	drv_info.panel_idx = panel_idx; | ||||
| 	drv_info.opt_mode = mode; | ||||
| 
 | ||||
| 	print_info("Panel=%s Mode=%s", | ||||
| 			known_lcd_panels[drv_info.panel_idx].name, | ||||
| 		      	drv_info.opt_mode ? drv_info.opt_mode : "default"); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| int __init au1100fb_init(void) | ||||
| { | ||||
| 	char* options; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	print_info("" DRIVER_DESC ""); | ||||
| 
 | ||||
| 	memset(&drv_info, 0, sizeof(drv_info)); | ||||
| 
 | ||||
| 	if (fb_get_options(DRIVER_NAME, &options)) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/* Setup driver with options */ | ||||
| 	ret = au1100fb_setup(options); | ||||
| 	if (ret < 0) { | ||||
| 		print_err("Fail to setup driver"); | ||||
| 		return ret; | ||||
| 	} | ||||
| 
 | ||||
| 	return platform_driver_register(&au1100fb_driver); | ||||
| } | ||||
| 
 | ||||
| void __exit au1100fb_cleanup(void) | ||||
| static void __exit au1100fb_unload(void) | ||||
| { | ||||
| 	platform_driver_unregister(&au1100fb_driver); | ||||
| 
 | ||||
| 	kfree(drv_info.opt_mode); | ||||
| } | ||||
| 
 | ||||
| module_init(au1100fb_init); | ||||
| module_exit(au1100fb_cleanup); | ||||
| module_init(au1100fb_load); | ||||
| module_exit(au1100fb_unload); | ||||
| 
 | ||||
| MODULE_DESCRIPTION(DRIVER_DESC); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  |  | |||
|  | @ -108,6 +108,7 @@ struct au1100fb_device { | |||
| 	unsigned char* 		fb_mem;		/* FrameBuffer memory map */ | ||||
| 	size_t	      		fb_len; | ||||
| 	dma_addr_t    		fb_phys; | ||||
| 	int			panel_idx; | ||||
| }; | ||||
| 
 | ||||
| /********************************************************************/ | ||||
|  | @ -364,11 +365,6 @@ static struct au1100fb_panel known_lcd_panels[] = | |||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| struct au1100fb_drv_info { | ||||
| 	int	panel_idx; | ||||
| 	char 	*opt_mode; | ||||
| }; | ||||
| 
 | ||||
| /********************************************************************/ | ||||
| 
 | ||||
| /* Inline helpers */ | ||||
|  |  | |||
|  | @ -46,18 +46,10 @@ | |||
| #include <asm/mach-au1x00/au1000.h> | ||||
| #include "au1200fb.h" | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| #include <asm/mach-au1x00/au1xxx_pm.h> | ||||
| #endif | ||||
| 
 | ||||
| #ifndef CONFIG_FB_AU1200_DEVS | ||||
| #define CONFIG_FB_AU1200_DEVS 4 | ||||
| #endif | ||||
| 
 | ||||
| #define DRIVER_NAME "au1200fb" | ||||
| #define DRIVER_DESC "LCD controller driver for AU1200 processors" | ||||
| 
 | ||||
| #define DEBUG 1 | ||||
| #define DEBUG 0 | ||||
| 
 | ||||
| #define print_err(f, arg...) printk(KERN_ERR DRIVER_NAME ": " f "\n", ## arg) | ||||
| #define print_warn(f, arg...) printk(KERN_WARNING DRIVER_NAME ": " f "\n", ## arg) | ||||
|  | @ -150,7 +142,7 @@ struct au1200_lcd_iodata_t { | |||
| 
 | ||||
| /* Private, per-framebuffer management information (independent of the panel itself) */ | ||||
| struct au1200fb_device { | ||||
| 	struct fb_info fb_info;			/* FB driver info record */ | ||||
| 	struct fb_info *fb_info;		/* FB driver info record */ | ||||
| 
 | ||||
| 	int					plane; | ||||
| 	unsigned char* 		fb_mem;		/* FrameBuffer memory map */ | ||||
|  | @ -158,7 +150,6 @@ struct au1200fb_device { | |||
| 	dma_addr_t    		fb_phys; | ||||
| }; | ||||
| 
 | ||||
| static struct au1200fb_device _au1200fb_devices[CONFIG_FB_AU1200_DEVS]; | ||||
| /********************************************************************/ | ||||
| 
 | ||||
| /* LCD controller restrictions */ | ||||
|  | @ -171,10 +162,18 @@ static struct au1200fb_device _au1200fb_devices[CONFIG_FB_AU1200_DEVS]; | |||
| /* Default number of visible screen buffer to allocate */ | ||||
| #define AU1200FB_NBR_VIDEO_BUFFERS 1 | ||||
| 
 | ||||
| /* Default maximum number of fb devices to create */ | ||||
| #define MAX_DEVICE_COUNT	4 | ||||
| 
 | ||||
| /* Default window configuration entry to use (see windows[]) */ | ||||
| #define DEFAULT_WINDOW_INDEX	2 | ||||
| 
 | ||||
| /********************************************************************/ | ||||
| 
 | ||||
| static struct fb_info *_au1200fb_infos[MAX_DEVICE_COUNT]; | ||||
| static struct au1200_lcd *lcd = (struct au1200_lcd *) AU1200_LCD_ADDR; | ||||
| static int window_index = 2; /* default is zero */ | ||||
| static int device_count = MAX_DEVICE_COUNT; | ||||
| static int window_index = DEFAULT_WINDOW_INDEX;	/* default is zero */ | ||||
| static int panel_index = 2; /* default is zero */ | ||||
| static struct window_settings *win; | ||||
| static struct panel_settings *panel; | ||||
|  | @ -205,12 +204,6 @@ struct window_settings { | |||
| extern int board_au1200fb_panel_init (void); | ||||
| extern int board_au1200fb_panel_shutdown (void); | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| int au1200fb_pm_callback(au1xxx_power_dev_t *dev, | ||||
| 		au1xxx_request_t request, void *data); | ||||
| au1xxx_power_dev_t *LCD_pm_dev; | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Default window configurations | ||||
|  */ | ||||
|  | @ -652,25 +645,6 @@ static struct panel_settings known_lcd_panels[] = | |||
| 
 | ||||
| /********************************************************************/ | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| static int set_brightness(unsigned int brightness) | ||||
| { | ||||
| 	unsigned int hi1, divider; | ||||
| 
 | ||||
| 	/* limit brightness pwm duty to >= 30/1600 */ | ||||
| 	if (brightness < 30) { | ||||
| 		brightness = 30; | ||||
| 	} | ||||
| 	divider = (lcd->pwmdiv & 0x3FFFF) + 1; | ||||
| 	hi1 = (lcd->pwmhi >> 16) + 1; | ||||
| 	hi1 = (((brightness & 0xFF) + 1) * divider >> 8); | ||||
| 	lcd->pwmhi &= 0xFFFF; | ||||
| 	lcd->pwmhi |= (hi1 << 16); | ||||
| 
 | ||||
| 	return brightness; | ||||
| } | ||||
| #endif /* CONFIG_PM */ | ||||
| 
 | ||||
| static int winbpp (unsigned int winctrl1) | ||||
| { | ||||
| 	int bits = 0; | ||||
|  | @ -712,8 +686,8 @@ static int fbinfo2index (struct fb_info *fb_info) | |||
| { | ||||
| 	int i; | ||||
| 
 | ||||
| 	for (i = 0; i < CONFIG_FB_AU1200_DEVS; ++i) { | ||||
| 		if (fb_info == (struct fb_info *)(&_au1200fb_devices[i].fb_info)) | ||||
| 	for (i = 0; i < device_count; ++i) { | ||||
| 		if (fb_info == _au1200fb_infos[i]) | ||||
| 			return i; | ||||
| 	} | ||||
| 	printk("au1200fb: ERROR: fbinfo2index failed!\n"); | ||||
|  | @ -962,7 +936,7 @@ static void au1200_setmode(struct au1200fb_device *fbdev) | |||
| 	lcd->window[plane].winctrl2 = ( 0 | ||||
| 		| LCD_WINCTRL2_CKMODE_00 | ||||
| 		| LCD_WINCTRL2_DBM | ||||
| 		| LCD_WINCTRL2_BX_N( fbdev->fb_info.fix.line_length) | ||||
| 		| LCD_WINCTRL2_BX_N(fbdev->fb_info->fix.line_length) | ||||
| 		| LCD_WINCTRL2_SCX_1 | ||||
| 		| LCD_WINCTRL2_SCY_1 | ||||
| 		) ; | ||||
|  | @ -1050,7 +1024,7 @@ static void au1200fb_update_fbinfo(struct fb_info *fbi) | |||
| static int au1200fb_fb_check_var(struct fb_var_screeninfo *var, | ||||
| 	struct fb_info *fbi) | ||||
| { | ||||
| 	struct au1200fb_device *fbdev = (struct au1200fb_device *)fbi; | ||||
| 	struct au1200fb_device *fbdev = fbi->par; | ||||
| 	u32 pixclock; | ||||
| 	int screen_size, plane; | ||||
| 
 | ||||
|  | @ -1142,7 +1116,7 @@ static int au1200fb_fb_check_var(struct fb_var_screeninfo *var, | |||
|  */ | ||||
| static int au1200fb_fb_set_par(struct fb_info *fbi) | ||||
| { | ||||
| 	struct au1200fb_device *fbdev = (struct au1200fb_device *)fbi; | ||||
| 	struct au1200fb_device *fbdev = fbi->par; | ||||
| 
 | ||||
| 	au1200fb_update_fbinfo(fbi); | ||||
| 	au1200_setmode(fbdev); | ||||
|  | @ -1246,11 +1220,7 @@ static int au1200fb_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) | |||
| { | ||||
| 	unsigned int len; | ||||
| 	unsigned long start=0, off; | ||||
| 	struct au1200fb_device *fbdev = (struct au1200fb_device *) info; | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| 	au1xxx_pm_access(LCD_pm_dev); | ||||
| #endif | ||||
| 	struct au1200fb_device *fbdev = info->par; | ||||
| 
 | ||||
| 	if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) { | ||||
| 		return -EINVAL; | ||||
|  | @ -1461,10 +1431,6 @@ static int au1200fb_ioctl(struct fb_info *info, unsigned int cmd, | |||
| 	int plane; | ||||
| 	int val; | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| 	au1xxx_pm_access(LCD_pm_dev); | ||||
| #endif | ||||
| 
 | ||||
| 	plane = fbinfo2index(info); | ||||
| 	print_dbg("au1200fb: ioctl %d on plane %d\n", cmd, plane); | ||||
| 
 | ||||
|  | @ -1536,9 +1502,11 @@ static struct fb_ops au1200fb_fb_ops = { | |||
| 	.fb_set_par	= au1200fb_fb_set_par, | ||||
| 	.fb_setcolreg	= au1200fb_fb_setcolreg, | ||||
| 	.fb_blank	= au1200fb_fb_blank, | ||||
| 	.fb_fillrect	= cfb_fillrect, | ||||
| 	.fb_copyarea	= cfb_copyarea, | ||||
| 	.fb_imageblit	= cfb_imageblit, | ||||
| 	.fb_fillrect	= sys_fillrect, | ||||
| 	.fb_copyarea	= sys_copyarea, | ||||
| 	.fb_imageblit	= sys_imageblit, | ||||
| 	.fb_read	= fb_sys_read, | ||||
| 	.fb_write	= fb_sys_write, | ||||
| 	.fb_sync	= NULL, | ||||
| 	.fb_ioctl	= au1200fb_ioctl, | ||||
| 	.fb_mmap	= au1200fb_fb_mmap, | ||||
|  | @ -1561,10 +1529,9 @@ static irqreturn_t au1200fb_handle_irq(int irq, void* dev_id) | |||
| 
 | ||||
| static int au1200fb_init_fbinfo(struct au1200fb_device *fbdev) | ||||
| { | ||||
| 	struct fb_info *fbi = &fbdev->fb_info; | ||||
| 	struct fb_info *fbi = fbdev->fb_info; | ||||
| 	int bpp; | ||||
| 
 | ||||
| 	memset(fbi, 0, sizeof(struct fb_info)); | ||||
| 	fbi->fbops = &au1200fb_fb_ops; | ||||
| 
 | ||||
| 	bpp = winbpp(win->w[fbdev->plane].mode_winctrl1); | ||||
|  | @ -1623,24 +1590,36 @@ static int au1200fb_init_fbinfo(struct au1200fb_device *fbdev) | |||
| 
 | ||||
| /* AU1200 LCD controller device driver */ | ||||
| 
 | ||||
| static int au1200fb_drv_probe(struct platform_device *dev) | ||||
| static int __devinit au1200fb_drv_probe(struct platform_device *dev) | ||||
| { | ||||
| 	struct au1200fb_device *fbdev; | ||||
| 	struct fb_info *fbi = NULL; | ||||
| 	unsigned long page; | ||||
| 	int bpp, plane, ret; | ||||
| 	int bpp, plane, ret, irq; | ||||
| 
 | ||||
| 	if (!dev) | ||||
| 		return -EINVAL; | ||||
| 	/* shut gcc up */ | ||||
| 	ret = 0; | ||||
| 	fbdev = NULL; | ||||
| 
 | ||||
| 	for (plane = 0; plane < CONFIG_FB_AU1200_DEVS; ++plane) { | ||||
| 	/* Kickstart the panel */ | ||||
| 	au1200_setpanel(panel); | ||||
| 
 | ||||
| 	for (plane = 0; plane < device_count; ++plane) { | ||||
| 		bpp = winbpp(win->w[plane].mode_winctrl1); | ||||
| 		if (win->w[plane].xres == 0) | ||||
| 			win->w[plane].xres = panel->Xres; | ||||
| 		if (win->w[plane].yres == 0) | ||||
| 			win->w[plane].yres = panel->Yres; | ||||
| 
 | ||||
| 		fbdev = &_au1200fb_devices[plane]; | ||||
| 		memset(fbdev, 0, sizeof(struct au1200fb_device)); | ||||
| 		fbi = framebuffer_alloc(sizeof(struct au1200fb_device), | ||||
| 					&dev->dev); | ||||
| 		if (!fbi) | ||||
| 			goto failed; | ||||
| 
 | ||||
| 		_au1200fb_infos[plane] = fbi; | ||||
| 		fbdev = fbi->par; | ||||
| 		fbdev->fb_info = fbi; | ||||
| 
 | ||||
| 		fbdev->plane = plane; | ||||
| 
 | ||||
| 		/* Allocate the framebuffer to the maximum screen size */ | ||||
|  | @ -1673,30 +1652,31 @@ static int au1200fb_drv_probe(struct platform_device *dev) | |||
| 			goto failed; | ||||
| 
 | ||||
| 		/* Register new framebuffer */ | ||||
| 		if ((ret = register_framebuffer(&fbdev->fb_info)) < 0) { | ||||
| 		ret = register_framebuffer(fbi); | ||||
| 		if (ret < 0) { | ||||
| 			print_err("cannot register new framebuffer"); | ||||
| 			goto failed; | ||||
| 		} | ||||
| 
 | ||||
| 		au1200fb_fb_set_par(&fbdev->fb_info); | ||||
| 		au1200fb_fb_set_par(fbi); | ||||
| 
 | ||||
| #if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO) | ||||
| 		if (plane == 0) | ||||
| 			if (fb_prepare_logo(&fbdev->fb_info, FB_ROTATE_UR)) { | ||||
| 			if (fb_prepare_logo(fbi, FB_ROTATE_UR)) { | ||||
| 				/* Start display and show logo on boot */ | ||||
| 				fb_set_cmap(&fbdev->fb_info.cmap, | ||||
| 						&fbdev->fb_info); | ||||
| 
 | ||||
| 				fb_show_logo(&fbdev->fb_info, FB_ROTATE_UR); | ||||
| 				fb_set_cmap(&fbi->cmap, fbi); | ||||
| 				fb_show_logo(fbi, FB_ROTATE_UR); | ||||
| 			} | ||||
| #endif | ||||
| 	} | ||||
| 
 | ||||
| 	/* Now hook interrupt too */ | ||||
| 	if ((ret = request_irq(AU1200_LCD_INT, au1200fb_handle_irq, | ||||
| 		 	  IRQF_DISABLED | IRQF_SHARED, "lcd", (void *)dev)) < 0) { | ||||
| 	irq = platform_get_irq(dev, 0); | ||||
| 	ret = request_irq(irq, au1200fb_handle_irq, | ||||
| 			  IRQF_SHARED, "lcd", (void *)dev); | ||||
| 	if (ret) { | ||||
| 		print_err("fail to request interrupt line %d (err: %d)", | ||||
| 			  AU1200_LCD_INT, ret); | ||||
| 			  irq, ret); | ||||
| 		goto failed; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -1705,84 +1685,108 @@ static int au1200fb_drv_probe(struct platform_device *dev) | |||
| failed: | ||||
| 	/* NOTE: This only does the current plane/window that failed; others are still active */ | ||||
| 	if (fbdev->fb_mem) | ||||
| 		dma_free_noncoherent(dev, PAGE_ALIGN(fbdev->fb_len), | ||||
| 		dma_free_noncoherent(&dev->dev, PAGE_ALIGN(fbdev->fb_len), | ||||
| 				fbdev->fb_mem, fbdev->fb_phys); | ||||
| 	if (fbdev->fb_info.cmap.len != 0) | ||||
| 		fb_dealloc_cmap(&fbdev->fb_info.cmap); | ||||
| 	if (fbdev->fb_info.pseudo_palette) | ||||
| 		kfree(fbdev->fb_info.pseudo_palette); | ||||
| 	if (fbi) { | ||||
| 		if (fbi->cmap.len != 0) | ||||
| 			fb_dealloc_cmap(&fbi->cmap); | ||||
| 		kfree(fbi->pseudo_palette); | ||||
| 	} | ||||
| 	if (plane == 0) | ||||
| 		free_irq(AU1200_LCD_INT, (void*)dev); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| static int au1200fb_drv_remove(struct platform_device *dev) | ||||
| static int __devexit au1200fb_drv_remove(struct platform_device *dev) | ||||
| { | ||||
| 	struct au1200fb_device *fbdev; | ||||
| 	struct fb_info *fbi; | ||||
| 	int plane; | ||||
| 
 | ||||
| 	if (!dev) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/* Turn off the panel */ | ||||
| 	au1200_setpanel(NULL); | ||||
| 
 | ||||
| 	for (plane = 0; plane < CONFIG_FB_AU1200_DEVS; ++plane) | ||||
| 	{ | ||||
| 		fbdev = &_au1200fb_devices[plane]; | ||||
| 	for (plane = 0; plane < device_count; ++plane)	{ | ||||
| 		fbi = _au1200fb_infos[plane]; | ||||
| 		fbdev = fbi->par; | ||||
| 
 | ||||
| 		/* Clean up all probe data */ | ||||
| 		unregister_framebuffer(&fbdev->fb_info); | ||||
| 		unregister_framebuffer(fbi); | ||||
| 		if (fbdev->fb_mem) | ||||
| 			dma_free_noncoherent(&dev->dev, | ||||
| 					PAGE_ALIGN(fbdev->fb_len), | ||||
| 					fbdev->fb_mem, fbdev->fb_phys); | ||||
| 		if (fbdev->fb_info.cmap.len != 0) | ||||
| 			fb_dealloc_cmap(&fbdev->fb_info.cmap); | ||||
| 		if (fbdev->fb_info.pseudo_palette) | ||||
| 			kfree(fbdev->fb_info.pseudo_palette); | ||||
| 		if (fbi->cmap.len != 0) | ||||
| 			fb_dealloc_cmap(&fbi->cmap); | ||||
| 		kfree(fbi->pseudo_palette); | ||||
| 
 | ||||
| 		framebuffer_release(fbi); | ||||
| 		_au1200fb_infos[plane] = NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	free_irq(AU1200_LCD_INT, (void *)dev); | ||||
| 	free_irq(platform_get_irq(dev, 0), (void *)dev); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| static int au1200fb_drv_suspend(struct platform_device *dev, u32 state) | ||||
| static int au1200fb_drv_suspend(struct device *dev) | ||||
| { | ||||
| 	/* TODO */ | ||||
| 	au1200_setpanel(NULL); | ||||
| 
 | ||||
| 	lcd->outmask = 0; | ||||
| 	au_sync(); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int au1200fb_drv_resume(struct platform_device *dev) | ||||
| static int au1200fb_drv_resume(struct device *dev) | ||||
| { | ||||
| 	/* TODO */ | ||||
| 	struct fb_info *fbi; | ||||
| 	int i; | ||||
| 
 | ||||
| 	/* Kickstart the panel */ | ||||
| 	au1200_setpanel(panel); | ||||
| 
 | ||||
| 	for (i = 0; i < device_count; i++) { | ||||
| 		fbi = _au1200fb_infos[i]; | ||||
| 		au1200fb_fb_set_par(fbi); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static const struct dev_pm_ops au1200fb_pmops = { | ||||
| 	.suspend	= au1200fb_drv_suspend, | ||||
| 	.resume		= au1200fb_drv_resume, | ||||
| 	.freeze		= au1200fb_drv_suspend, | ||||
| 	.thaw		= au1200fb_drv_resume, | ||||
| }; | ||||
| 
 | ||||
| #define AU1200FB_PMOPS	(&au1200fb_pmops) | ||||
| 
 | ||||
| #else | ||||
| #define AU1200FB_PMOPS	NULL | ||||
| #endif /* CONFIG_PM */ | ||||
| 
 | ||||
| static struct platform_driver au1200fb_driver = { | ||||
| 	.driver = { | ||||
| 		.name		= "au1200-lcd", | ||||
| 		.owner          = THIS_MODULE, | ||||
| 		.name	= "au1200-lcd", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 		.pm	= AU1200FB_PMOPS, | ||||
| 	}, | ||||
| 	.probe		= au1200fb_drv_probe, | ||||
| 	.remove		= au1200fb_drv_remove, | ||||
| #ifdef CONFIG_PM | ||||
| 	.suspend	= au1200fb_drv_suspend, | ||||
| 	.resume		= au1200fb_drv_resume, | ||||
| #endif | ||||
| 	.remove		= __devexit_p(au1200fb_drv_remove), | ||||
| }; | ||||
| 
 | ||||
| /*-------------------------------------------------------------------------*/ | ||||
| 
 | ||||
| /* Kernel driver */ | ||||
| 
 | ||||
| static void au1200fb_setup(void) | ||||
| static int au1200fb_setup(void) | ||||
| { | ||||
| 	char* options = NULL; | ||||
| 	char* this_opt; | ||||
| 	char *options = NULL; | ||||
| 	char *this_opt, *endptr; | ||||
| 	int num_panels = ARRAY_SIZE(known_lcd_panels); | ||||
| 	int panel_idx = -1; | ||||
| 
 | ||||
|  | @ -1827,70 +1831,42 @@ static void au1200fb_setup(void) | |||
| 				nohwcursor = 1; | ||||
| 			} | ||||
| 
 | ||||
| 			else if (strncmp(this_opt, "devices:", 8) == 0) { | ||||
| 				this_opt += 8; | ||||
| 				device_count = simple_strtol(this_opt, | ||||
| 							     &endptr, 0); | ||||
| 				if ((device_count < 0) || | ||||
| 				    (device_count > MAX_DEVICE_COUNT)) | ||||
| 					device_count = MAX_DEVICE_COUNT; | ||||
| 			} | ||||
| 
 | ||||
| 			else if (strncmp(this_opt, "wincfg:", 7) == 0) { | ||||
| 				this_opt += 7; | ||||
| 				window_index = simple_strtol(this_opt, | ||||
| 							     &endptr, 0); | ||||
| 				if ((window_index < 0) || | ||||
| 				    (window_index >= ARRAY_SIZE(windows))) | ||||
| 					window_index = DEFAULT_WINDOW_INDEX; | ||||
| 			} | ||||
| 
 | ||||
| 			else if (strncmp(this_opt, "off", 3) == 0) | ||||
| 				return 1; | ||||
| 			/* Unsupported option */ | ||||
| 			else { | ||||
| 				print_warn("Unsupported option \"%s\"", this_opt); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| static int au1200fb_pm_callback(au1xxx_power_dev_t *dev, | ||||
| 		au1xxx_request_t request, void *data) { | ||||
| 	int retval = -1; | ||||
| 	unsigned int d = 0; | ||||
| 	unsigned int brightness = 0; | ||||
| 
 | ||||
| 	if (request == AU1XXX_PM_SLEEP) { | ||||
| 		board_au1200fb_panel_shutdown(); | ||||
| 	} | ||||
| 	else if (request == AU1XXX_PM_WAKEUP) { | ||||
| 		if(dev->prev_state == SLEEP_STATE) | ||||
| 		{ | ||||
| 			int plane; | ||||
| 			au1200_setpanel(panel); | ||||
| 			for (plane = 0; plane < CONFIG_FB_AU1200_DEVS; ++plane) 	{ | ||||
| 				struct au1200fb_device *fbdev; | ||||
| 				fbdev = &_au1200fb_devices[plane]; | ||||
| 				au1200fb_fb_set_par(&fbdev->fb_info); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		d = *((unsigned int*)data); | ||||
| 		if(d <=10) brightness = 26; | ||||
| 		else if(d<=20) brightness = 51; | ||||
| 		else if(d<=30) brightness = 77; | ||||
| 		else if(d<=40) brightness = 102; | ||||
| 		else if(d<=50) brightness = 128; | ||||
| 		else if(d<=60) brightness = 153; | ||||
| 		else if(d<=70) brightness = 179; | ||||
| 		else if(d<=80) brightness = 204; | ||||
| 		else if(d<=90) brightness = 230; | ||||
| 		else brightness = 255; | ||||
| 		set_brightness(brightness); | ||||
| 	} else if (request == AU1XXX_PM_GETSTATUS) { | ||||
| 		return dev->cur_state; | ||||
| 	} else if (request == AU1XXX_PM_ACCESS) { | ||||
| 		if (dev->cur_state != SLEEP_STATE) | ||||
| 			return retval; | ||||
| 		else { | ||||
| 			au1200_setpanel(panel); | ||||
| 		} | ||||
| 	} else if (request == AU1XXX_PM_IDLE) { | ||||
| 	} else if (request == AU1XXX_PM_CLEANUP) { | ||||
| 	} | ||||
| 
 | ||||
| 	return retval; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static int __init au1200fb_init(void) | ||||
| { | ||||
| 	print_info("" DRIVER_DESC ""); | ||||
| 
 | ||||
| 	/* Setup driver with options */ | ||||
| 	au1200fb_setup(); | ||||
| 	if (au1200fb_setup()) | ||||
| 		return -ENODEV; | ||||
| 
 | ||||
| 	/* Point to the panel selected */ | ||||
| 	panel = &known_lcd_panels[panel_index]; | ||||
|  | @ -1899,17 +1875,6 @@ static int __init au1200fb_init(void) | |||
| 	printk(DRIVER_NAME ": Panel %d %s\n", panel_index, panel->name); | ||||
| 	printk(DRIVER_NAME ": Win %d %s\n", window_index, win->name); | ||||
| 
 | ||||
| 	/* Kickstart the panel, the framebuffers/windows come soon enough */ | ||||
| 	au1200_setpanel(panel); | ||||
| 
 | ||||
| 	#ifdef CONFIG_PM | ||||
| 	LCD_pm_dev = new_au1xxx_power_device("LCD", &au1200fb_pm_callback, NULL); | ||||
| 	if ( LCD_pm_dev == NULL) | ||||
| 		printk(KERN_INFO "Unable to create a power management device entry for the au1200fb.\n"); | ||||
| 	else | ||||
| 		printk(KERN_INFO "Power management device entry for the au1200fb loaded.\n"); | ||||
| 	#endif | ||||
| 
 | ||||
| 	return platform_driver_register(&au1200fb_driver); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ | |||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/pm.h> | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ | |||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/version.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/pm.h> | ||||
|  |  | |||
|  | @ -633,7 +633,7 @@ static int __devinit bfin_bf54x_probe(struct platform_device *pdev) | |||
| 		goto out7; | ||||
| 	} | ||||
| 
 | ||||
| 	if (request_irq(info->irq, bfin_bf54x_irq_error, IRQF_DISABLED, | ||||
| 	if (request_irq(info->irq, bfin_bf54x_irq_error, 0, | ||||
| 			"PPI ERROR", info) < 0) { | ||||
| 		printk(KERN_ERR DRIVER_NAME | ||||
| 		       ": unable to request PPI ERROR IRQ\n"); | ||||
|  |  | |||
|  | @ -695,7 +695,7 @@ static int __devinit bfin_lq035q1_probe(struct platform_device *pdev) | |||
| 		goto out7; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = request_irq(info->irq, bfin_lq035q1_irq_error, IRQF_DISABLED, | ||||
| 	ret = request_irq(info->irq, bfin_lq035q1_irq_error, 0, | ||||
| 			DRIVER_NAME" PPI ERROR", info); | ||||
| 	if (ret < 0) { | ||||
| 		dev_err(&pdev->dev, "unable to request PPI ERROR IRQ\n"); | ||||
|  |  | |||
|  | @ -529,7 +529,7 @@ static int __devinit bfin_t350mcqb_probe(struct platform_device *pdev) | |||
| 		goto out7; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = request_irq(info->irq, bfin_t350mcqb_irq_error, IRQF_DISABLED, | ||||
| 	ret = request_irq(info->irq, bfin_t350mcqb_irq_error, 0, | ||||
| 			"PPI ERROR", info); | ||||
| 	if (ret < 0) { | ||||
| 		printk(KERN_ERR DRIVER_NAME | ||||
|  |  | |||
|  | @ -481,7 +481,7 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client, | |||
| 		goto out_4; | ||||
| 	} | ||||
| 
 | ||||
| 	if (request_irq(IRQ_PPI_ERROR, ppi_irq_error, IRQF_DISABLED, | ||||
| 	if (request_irq(IRQ_PPI_ERROR, ppi_irq_error, 0, | ||||
| 			"PPI ERROR", fbdev) < 0) { | ||||
| 		dev_err(&client->dev, "unable to request PPI ERROR IRQ\n"); | ||||
| 		ret = -EFAULT; | ||||
|  |  | |||
|  | @ -32,11 +32,11 @@ | |||
| #define CARMINEFB_DEFAULT_VIDEO_MODE	1 | ||||
| 
 | ||||
| static unsigned int fb_mode = CARMINEFB_DEFAULT_VIDEO_MODE; | ||||
| module_param(fb_mode, uint, 444); | ||||
| module_param(fb_mode, uint, 0444); | ||||
| MODULE_PARM_DESC(fb_mode, "Initial video mode as integer."); | ||||
| 
 | ||||
| static char *fb_mode_str; | ||||
| module_param(fb_mode_str, charp, 444); | ||||
| module_param(fb_mode_str, charp, 0444); | ||||
| MODULE_PARM_DESC(fb_mode_str, "Initial video mode in characters."); | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -46,7 +46,7 @@ MODULE_PARM_DESC(fb_mode_str, "Initial video mode in characters."); | |||
|  * 0b010 Display 1 | ||||
|  */ | ||||
| static int fb_displays = CARMINE_USE_DISPLAY0 | CARMINE_USE_DISPLAY1; | ||||
| module_param(fb_displays, int, 444); | ||||
| module_param(fb_displays, int, 0444); | ||||
| MODULE_PARM_DESC(fb_displays, "Bit mode, which displays are used"); | ||||
| 
 | ||||
| struct carmine_hw { | ||||
|  |  | |||
|  | @ -550,7 +550,7 @@ static void control_set_hardware(struct fb_info_control *p, struct fb_par_contro | |||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Parse user speficied options (`video=controlfb:') | ||||
|  * Parse user specified options (`video=controlfb:') | ||||
|  */ | ||||
| static void __init control_setup(char *options) | ||||
| { | ||||
|  |  | |||
|  | @ -35,6 +35,9 @@ | |||
| 
 | ||||
| #define DRIVER_NAME "da8xx_lcdc" | ||||
| 
 | ||||
| #define LCD_VERSION_1	1 | ||||
| #define LCD_VERSION_2	2 | ||||
| 
 | ||||
| /* LCD Status Register */ | ||||
| #define LCD_END_OF_FRAME1		BIT(9) | ||||
| #define LCD_END_OF_FRAME0		BIT(8) | ||||
|  | @ -49,7 +52,9 @@ | |||
| #define LCD_DMA_BURST_4			0x2 | ||||
| #define LCD_DMA_BURST_8			0x3 | ||||
| #define LCD_DMA_BURST_16		0x4 | ||||
| #define LCD_END_OF_FRAME_INT_ENA	BIT(2) | ||||
| #define LCD_V1_END_OF_FRAME_INT_ENA	BIT(2) | ||||
| #define LCD_V2_END_OF_FRAME0_INT_ENA	BIT(8) | ||||
| #define LCD_V2_END_OF_FRAME1_INT_ENA	BIT(9) | ||||
| #define LCD_DUAL_FRAME_BUFFER_ENABLE	BIT(0) | ||||
| 
 | ||||
| /* LCD Control Register */ | ||||
|  | @ -65,12 +70,18 @@ | |||
| #define LCD_MONO_8BIT_MODE		BIT(9) | ||||
| #define LCD_RASTER_ORDER		BIT(8) | ||||
| #define LCD_TFT_MODE			BIT(7) | ||||
| #define LCD_UNDERFLOW_INT_ENA		BIT(6) | ||||
| #define LCD_PL_ENABLE			BIT(4) | ||||
| #define LCD_V1_UNDERFLOW_INT_ENA	BIT(6) | ||||
| #define LCD_V2_UNDERFLOW_INT_ENA	BIT(5) | ||||
| #define LCD_V1_PL_INT_ENA		BIT(4) | ||||
| #define LCD_V2_PL_INT_ENA		BIT(6) | ||||
| #define LCD_MONOCHROME_MODE		BIT(1) | ||||
| #define LCD_RASTER_ENABLE		BIT(0) | ||||
| #define LCD_TFT_ALT_ENABLE		BIT(23) | ||||
| #define LCD_STN_565_ENABLE		BIT(24) | ||||
| #define LCD_V2_DMA_CLK_EN		BIT(2) | ||||
| #define LCD_V2_LIDD_CLK_EN		BIT(1) | ||||
| #define LCD_V2_CORE_CLK_EN		BIT(0) | ||||
| #define LCD_V2_LPP_B10			26 | ||||
| 
 | ||||
| /* LCD Raster Timing 2 Register */ | ||||
| #define LCD_AC_BIAS_TRANSITIONS_PER_INT(x)	((x) << 16) | ||||
|  | @ -82,6 +93,7 @@ | |||
| #define LCD_INVERT_FRAME_CLOCK			BIT(20) | ||||
| 
 | ||||
| /* LCD Block */ | ||||
| #define  LCD_PID_REG				0x0 | ||||
| #define  LCD_CTRL_REG				0x4 | ||||
| #define  LCD_STAT_REG				0x8 | ||||
| #define  LCD_RASTER_CTRL_REG			0x28 | ||||
|  | @ -94,6 +106,17 @@ | |||
| #define  LCD_DMA_FRM_BUF_BASE_ADDR_1_REG	0x4C | ||||
| #define  LCD_DMA_FRM_BUF_CEILING_ADDR_1_REG	0x50 | ||||
| 
 | ||||
| /* Interrupt Registers available only in Version 2 */ | ||||
| #define  LCD_RAW_STAT_REG			0x58 | ||||
| #define  LCD_MASKED_STAT_REG			0x5c | ||||
| #define  LCD_INT_ENABLE_SET_REG			0x60 | ||||
| #define  LCD_INT_ENABLE_CLR_REG			0x64 | ||||
| #define  LCD_END_OF_INT_IND_REG			0x68 | ||||
| 
 | ||||
| /* Clock registers available only on Version 2 */ | ||||
| #define  LCD_CLK_ENABLE_REG			0x6c | ||||
| #define  LCD_CLK_RESET_REG			0x70 | ||||
| 
 | ||||
| #define LCD_NUM_BUFFERS	2 | ||||
| 
 | ||||
| #define WSI_TIMEOUT	50 | ||||
|  | @ -105,6 +128,8 @@ | |||
| 
 | ||||
| static resource_size_t da8xx_fb_reg_base; | ||||
| static struct resource *lcdc_regs; | ||||
| static unsigned int lcd_revision; | ||||
| static irq_handler_t lcdc_irq_handler; | ||||
| 
 | ||||
| static inline unsigned int lcdc_read(unsigned int addr) | ||||
| { | ||||
|  | @ -240,6 +265,7 @@ static void lcd_blit(int load_mode, struct da8xx_fb_par *par) | |||
| 	u32 end; | ||||
| 	u32 reg_ras; | ||||
| 	u32 reg_dma; | ||||
| 	u32 reg_int; | ||||
| 
 | ||||
| 	/* init reg to clear PLM (loading mode) fields */ | ||||
| 	reg_ras = lcdc_read(LCD_RASTER_CTRL_REG); | ||||
|  | @ -252,7 +278,14 @@ static void lcd_blit(int load_mode, struct da8xx_fb_par *par) | |||
| 		end      = par->dma_end; | ||||
| 
 | ||||
| 		reg_ras |= LCD_PALETTE_LOAD_MODE(DATA_ONLY); | ||||
| 		reg_dma |= LCD_END_OF_FRAME_INT_ENA; | ||||
| 		if (lcd_revision == LCD_VERSION_1) { | ||||
| 			reg_dma |= LCD_V1_END_OF_FRAME_INT_ENA; | ||||
| 		} else { | ||||
| 			reg_int = lcdc_read(LCD_INT_ENABLE_SET_REG) | | ||||
| 				LCD_V2_END_OF_FRAME0_INT_ENA | | ||||
| 				LCD_V2_END_OF_FRAME1_INT_ENA; | ||||
| 			lcdc_write(reg_int, LCD_INT_ENABLE_SET_REG); | ||||
| 		} | ||||
| 		reg_dma |= LCD_DUAL_FRAME_BUFFER_ENABLE; | ||||
| 
 | ||||
| 		lcdc_write(start, LCD_DMA_FRM_BUF_BASE_ADDR_0_REG); | ||||
|  | @ -264,7 +297,14 @@ static void lcd_blit(int load_mode, struct da8xx_fb_par *par) | |||
| 		end      = start + par->palette_sz - 1; | ||||
| 
 | ||||
| 		reg_ras |= LCD_PALETTE_LOAD_MODE(PALETTE_ONLY); | ||||
| 		reg_ras |= LCD_PL_ENABLE; | ||||
| 
 | ||||
| 		if (lcd_revision == LCD_VERSION_1) { | ||||
| 			reg_ras |= LCD_V1_PL_INT_ENA; | ||||
| 		} else { | ||||
| 			reg_int = lcdc_read(LCD_INT_ENABLE_SET_REG) | | ||||
| 				LCD_V2_PL_INT_ENA; | ||||
| 			lcdc_write(reg_int, LCD_INT_ENABLE_SET_REG); | ||||
| 		} | ||||
| 
 | ||||
| 		lcdc_write(start, LCD_DMA_FRM_BUF_BASE_ADDR_0_REG); | ||||
| 		lcdc_write(end, LCD_DMA_FRM_BUF_CEILING_ADDR_0_REG); | ||||
|  | @ -348,6 +388,7 @@ static void lcd_cfg_vertical_sync(int back_porch, int pulse_width, | |||
| static int lcd_cfg_display(const struct lcd_ctrl_config *cfg) | ||||
| { | ||||
| 	u32 reg; | ||||
| 	u32 reg_int; | ||||
| 
 | ||||
| 	reg = lcdc_read(LCD_RASTER_CTRL_REG) & ~(LCD_TFT_MODE | | ||||
| 						LCD_MONO_8BIT_MODE | | ||||
|  | @ -375,7 +416,13 @@ static int lcd_cfg_display(const struct lcd_ctrl_config *cfg) | |||
| 	} | ||||
| 
 | ||||
| 	/* enable additional interrupts here */ | ||||
| 	reg |= LCD_UNDERFLOW_INT_ENA; | ||||
| 	if (lcd_revision == LCD_VERSION_1) { | ||||
| 		reg |= LCD_V1_UNDERFLOW_INT_ENA; | ||||
| 	} else { | ||||
| 		reg_int = lcdc_read(LCD_INT_ENABLE_SET_REG) | | ||||
| 			LCD_V2_UNDERFLOW_INT_ENA; | ||||
| 		lcdc_write(reg_int, LCD_INT_ENABLE_SET_REG); | ||||
| 	} | ||||
| 
 | ||||
| 	lcdc_write(reg, LCD_RASTER_CTRL_REG); | ||||
| 
 | ||||
|  | @ -413,18 +460,43 @@ static int lcd_cfg_frame_buffer(struct da8xx_fb_par *par, u32 width, u32 height, | |||
| 
 | ||||
| 	/* Set the Panel Width */ | ||||
| 	/* Pixels per line = (PPL + 1)*16 */ | ||||
| 	/*0x3F in bits 4..9 gives max horisontal resolution = 1024 pixels*/ | ||||
| 	width &= 0x3f0; | ||||
| 	if (lcd_revision == LCD_VERSION_1) { | ||||
| 		/*
 | ||||
| 		 * 0x3F in bits 4..9 gives max horizontal resolution = 1024 | ||||
| 		 * pixels. | ||||
| 		 */ | ||||
| 		width &= 0x3f0; | ||||
| 	} else { | ||||
| 		/*
 | ||||
| 		 * 0x7F in bits 4..10 gives max horizontal resolution = 2048 | ||||
| 		 * pixels. | ||||
| 		 */ | ||||
| 		width &= 0x7f0; | ||||
| 	} | ||||
| 
 | ||||
| 	reg = lcdc_read(LCD_RASTER_TIMING_0_REG); | ||||
| 	reg &= 0xfffffc00; | ||||
| 	reg |= ((width >> 4) - 1) << 4; | ||||
| 	if (lcd_revision == LCD_VERSION_1) { | ||||
| 		reg |= ((width >> 4) - 1) << 4; | ||||
| 	} else { | ||||
| 		width = (width >> 4) - 1; | ||||
| 		reg |= ((width & 0x3f) << 4) | ((width & 0x40) >> 3); | ||||
| 	} | ||||
| 	lcdc_write(reg, LCD_RASTER_TIMING_0_REG); | ||||
| 
 | ||||
| 	/* Set the Panel Height */ | ||||
| 	/* Set bits 9:0 of Lines Per Pixel */ | ||||
| 	reg = lcdc_read(LCD_RASTER_TIMING_1_REG); | ||||
| 	reg = ((height - 1) & 0x3ff) | (reg & 0xfffffc00); | ||||
| 	lcdc_write(reg, LCD_RASTER_TIMING_1_REG); | ||||
| 
 | ||||
| 	/* Set bit 10 of Lines Per Pixel */ | ||||
| 	if (lcd_revision == LCD_VERSION_2) { | ||||
| 		reg = lcdc_read(LCD_RASTER_TIMING_2_REG); | ||||
| 		reg |= ((height - 1) & 0x400) << 16; | ||||
| 		lcdc_write(reg, LCD_RASTER_TIMING_2_REG); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Set the Raster Order of the Frame Buffer */ | ||||
| 	reg = lcdc_read(LCD_RASTER_CTRL_REG) & ~(1 << 8); | ||||
| 	if (raster_order) | ||||
|  | @ -511,6 +583,9 @@ static void lcd_reset(struct da8xx_fb_par *par) | |||
| 	/* DMA has to be disabled */ | ||||
| 	lcdc_write(0, LCD_DMA_CTRL_REG); | ||||
| 	lcdc_write(0, LCD_RASTER_CTRL_REG); | ||||
| 
 | ||||
| 	if (lcd_revision == LCD_VERSION_2) | ||||
| 		lcdc_write(0, LCD_INT_ENABLE_SET_REG); | ||||
| } | ||||
| 
 | ||||
| static void lcd_calc_clk_divider(struct da8xx_fb_par *par) | ||||
|  | @ -523,6 +598,11 @@ static void lcd_calc_clk_divider(struct da8xx_fb_par *par) | |||
| 	/* Configure the LCD clock divisor. */ | ||||
| 	lcdc_write(LCD_CLK_DIVISOR(div) | | ||||
| 			(LCD_RASTER_MODE & 0x1), LCD_CTRL_REG); | ||||
| 
 | ||||
| 	if (lcd_revision == LCD_VERSION_2) | ||||
| 		lcdc_write(LCD_V2_DMA_CLK_EN | LCD_V2_LIDD_CLK_EN | | ||||
| 				LCD_V2_CORE_CLK_EN, LCD_CLK_ENABLE_REG); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, | ||||
|  | @ -583,7 +663,63 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg, | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static irqreturn_t lcdc_irq_handler(int irq, void *arg) | ||||
| /* IRQ handler for version 2 of LCDC */ | ||||
| static irqreturn_t lcdc_irq_handler_rev02(int irq, void *arg) | ||||
| { | ||||
| 	struct da8xx_fb_par *par = arg; | ||||
| 	u32 stat = lcdc_read(LCD_MASKED_STAT_REG); | ||||
| 	u32 reg_int; | ||||
| 
 | ||||
| 	if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) { | ||||
| 		lcd_disable_raster(); | ||||
| 		lcdc_write(stat, LCD_MASKED_STAT_REG); | ||||
| 		lcd_enable_raster(); | ||||
| 	} else if (stat & LCD_PL_LOAD_DONE) { | ||||
| 		/*
 | ||||
| 		 * Must disable raster before changing state of any control bit. | ||||
| 		 * And also must be disabled before clearing the PL loading | ||||
| 		 * interrupt via the following write to the status register. If | ||||
| 		 * this is done after then one gets multiple PL done interrupts. | ||||
| 		 */ | ||||
| 		lcd_disable_raster(); | ||||
| 
 | ||||
| 		lcdc_write(stat, LCD_MASKED_STAT_REG); | ||||
| 
 | ||||
| 		/* Disable PL completion inerrupt */ | ||||
| 		reg_int = lcdc_read(LCD_INT_ENABLE_CLR_REG) | | ||||
| 		       (LCD_V2_PL_INT_ENA); | ||||
| 		lcdc_write(reg_int, LCD_INT_ENABLE_CLR_REG); | ||||
| 
 | ||||
| 		/* Setup and start data loading mode */ | ||||
| 		lcd_blit(LOAD_DATA, par); | ||||
| 	} else { | ||||
| 		lcdc_write(stat, LCD_MASKED_STAT_REG); | ||||
| 
 | ||||
| 		if (stat & LCD_END_OF_FRAME0) { | ||||
| 			lcdc_write(par->dma_start, | ||||
| 				   LCD_DMA_FRM_BUF_BASE_ADDR_0_REG); | ||||
| 			lcdc_write(par->dma_end, | ||||
| 				   LCD_DMA_FRM_BUF_CEILING_ADDR_0_REG); | ||||
| 			par->vsync_flag = 1; | ||||
| 			wake_up_interruptible(&par->vsync_wait); | ||||
| 		} | ||||
| 
 | ||||
| 		if (stat & LCD_END_OF_FRAME1) { | ||||
| 			lcdc_write(par->dma_start, | ||||
| 				   LCD_DMA_FRM_BUF_BASE_ADDR_1_REG); | ||||
| 			lcdc_write(par->dma_end, | ||||
| 				   LCD_DMA_FRM_BUF_CEILING_ADDR_1_REG); | ||||
| 			par->vsync_flag = 1; | ||||
| 			wake_up_interruptible(&par->vsync_wait); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	lcdc_write(0, LCD_END_OF_INT_IND_REG); | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| 
 | ||||
| /* IRQ handler for version 1 LCDC */ | ||||
| static irqreturn_t lcdc_irq_handler_rev01(int irq, void *arg) | ||||
| { | ||||
| 	struct da8xx_fb_par *par = arg; | ||||
| 	u32 stat = lcdc_read(LCD_STAT_REG); | ||||
|  | @ -606,7 +742,7 @@ static irqreturn_t lcdc_irq_handler(int irq, void *arg) | |||
| 
 | ||||
| 		/* Disable PL completion inerrupt */ | ||||
| 		reg_ras  = lcdc_read(LCD_RASTER_CTRL_REG); | ||||
| 		reg_ras &= ~LCD_PL_ENABLE; | ||||
| 		reg_ras &= ~LCD_V1_PL_INT_ENA; | ||||
| 		lcdc_write(reg_ras, LCD_RASTER_CTRL_REG); | ||||
| 
 | ||||
| 		/* Setup and start data loading mode */ | ||||
|  | @ -877,8 +1013,8 @@ static int da8xx_pan_display(struct fb_var_screeninfo *var, | |||
| 
 | ||||
| 			start	= fix->smem_start + | ||||
| 				new_var.yoffset * fix->line_length + | ||||
| 				new_var.xoffset * var->bits_per_pixel / 8; | ||||
| 			end	= start + var->yres * fix->line_length - 1; | ||||
| 				new_var.xoffset * fbi->var.bits_per_pixel / 8; | ||||
| 			end	= start + fbi->var.yres * fix->line_length - 1; | ||||
| 			par->dma_start	= start; | ||||
| 			par->dma_end	= end; | ||||
| 		} | ||||
|  | @ -945,6 +1081,22 @@ static int __devinit fb_probe(struct platform_device *device) | |||
| 	if (ret) | ||||
| 		goto err_clk_put; | ||||
| 
 | ||||
| 	/* Determine LCD IP Version */ | ||||
| 	switch (lcdc_read(LCD_PID_REG)) { | ||||
| 	case 0x4C100102: | ||||
| 		lcd_revision = LCD_VERSION_1; | ||||
| 		break; | ||||
| 	case 0x4F200800: | ||||
| 		lcd_revision = LCD_VERSION_2; | ||||
| 		break; | ||||
| 	default: | ||||
| 		dev_warn(&device->dev, "Unknown PID Reg value 0x%x, " | ||||
| 				"defaulting to LCD revision 1\n", | ||||
| 				lcdc_read(LCD_PID_REG)); | ||||
| 		lcd_revision = LCD_VERSION_1; | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	for (i = 0, lcdc_info = known_lcd_panels; | ||||
| 		i < ARRAY_SIZE(known_lcd_panels); | ||||
| 		i++, lcdc_info++) { | ||||
|  | @ -1085,7 +1237,13 @@ static int __devinit fb_probe(struct platform_device *device) | |||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	ret = request_irq(par->irq, lcdc_irq_handler, 0, DRIVER_NAME, par); | ||||
| 	if (lcd_revision == LCD_VERSION_1) | ||||
| 		lcdc_irq_handler = lcdc_irq_handler_rev01; | ||||
| 	else | ||||
| 		lcdc_irq_handler = lcdc_irq_handler_rev02; | ||||
| 
 | ||||
| 	ret = request_irq(par->irq, lcdc_irq_handler, 0, | ||||
| 			DRIVER_NAME, par); | ||||
| 	if (ret) | ||||
| 		goto irq_freq; | ||||
| 	return 0; | ||||
|  |  | |||
|  | @ -624,8 +624,8 @@ static int unifb_pan_display(struct fb_var_screeninfo *var, | |||
| 		    || var->xoffset) | ||||
| 			return -EINVAL; | ||||
| 	} else { | ||||
| 		if (var->xoffset + var->xres > info->var.xres_virtual || | ||||
| 		    var->yoffset + var->yres > info->var.yres_virtual) | ||||
| 		if (var->xoffset + info->var.xres > info->var.xres_virtual || | ||||
| 		    var->yoffset + info->var.yres > info->var.yres_virtual) | ||||
| 			return -EINVAL; | ||||
| 	} | ||||
| 	info->var.xoffset = var->xoffset; | ||||
|  |  | |||
|  | @ -223,8 +223,7 @@ void fb_deferred_io_cleanup(struct fb_info *info) | |||
| 	int i; | ||||
| 
 | ||||
| 	BUG_ON(!fbdefio); | ||||
| 	cancel_delayed_work(&info->deferred_work); | ||||
| 	flush_scheduled_work(); | ||||
| 	cancel_delayed_work_sync(&info->deferred_work); | ||||
| 
 | ||||
| 	/* clear out the mapping that we setup */ | ||||
| 	for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) { | ||||
|  |  | |||
|  | @ -1738,8 +1738,6 @@ void fb_set_suspend(struct fb_info *info, int state) | |||
| { | ||||
| 	struct fb_event event; | ||||
| 
 | ||||
| 	if (!lock_fb_info(info)) | ||||
| 		return; | ||||
| 	event.info = info; | ||||
| 	if (state) { | ||||
| 		fb_notifier_call_chain(FB_EVENT_SUSPEND, &event); | ||||
|  | @ -1748,7 +1746,6 @@ void fb_set_suspend(struct fb_info *info, int state) | |||
| 		info->state = FBINFO_STATE_RUNNING; | ||||
| 		fb_notifier_call_chain(FB_EVENT_RESUME, &event); | ||||
| 	} | ||||
| 	unlock_fb_info(info); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -493,7 +493,8 @@ static int get_est_timing(unsigned char *block, struct fb_videomode *mode) | |||
| 	return num; | ||||
| } | ||||
| 
 | ||||
| static int get_std_timing(unsigned char *block, struct fb_videomode *mode) | ||||
| static int get_std_timing(unsigned char *block, struct fb_videomode *mode, | ||||
| 		int ver, int rev) | ||||
| { | ||||
| 	int xres, yres = 0, refresh, ratio, i; | ||||
| 
 | ||||
|  | @ -504,7 +505,11 @@ static int get_std_timing(unsigned char *block, struct fb_videomode *mode) | |||
| 	ratio = (block[1] & 0xc0) >> 6; | ||||
| 	switch (ratio) { | ||||
| 	case 0: | ||||
| 		yres = xres; | ||||
| 		/* in EDID 1.3 the meaning of 0 changed to 16:10 (prior 1:1) */ | ||||
| 		if (ver < 1 || (ver == 1 && rev < 3)) | ||||
| 			yres = xres; | ||||
| 		else | ||||
| 			yres = (xres * 10)/16; | ||||
| 		break; | ||||
| 	case 1: | ||||
| 		yres = (xres * 3)/4; | ||||
|  | @ -533,12 +538,12 @@ static int get_std_timing(unsigned char *block, struct fb_videomode *mode) | |||
| } | ||||
| 
 | ||||
| static int get_dst_timing(unsigned char *block, | ||||
| 			  struct fb_videomode *mode) | ||||
| 			  struct fb_videomode *mode, int ver, int rev) | ||||
| { | ||||
| 	int j, num = 0; | ||||
| 
 | ||||
| 	for (j = 0; j < 6; j++, block += STD_TIMING_DESCRIPTION_SIZE) | ||||
| 		num += get_std_timing(block, &mode[num]); | ||||
| 		num += get_std_timing(block, &mode[num], ver, rev); | ||||
| 
 | ||||
| 	return num; | ||||
| } | ||||
|  | @ -599,6 +604,10 @@ static struct fb_videomode *fb_create_modedb(unsigned char *edid, int *dbsize) | |||
| 	struct fb_videomode *mode, *m; | ||||
| 	unsigned char *block; | ||||
| 	int num = 0, i, first = 1; | ||||
| 	int ver, rev; | ||||
| 
 | ||||
| 	ver = edid[EDID_STRUCT_VERSION]; | ||||
| 	rev = edid[EDID_STRUCT_REVISION]; | ||||
| 
 | ||||
| 	mode = kzalloc(50 * sizeof(struct fb_videomode), GFP_KERNEL); | ||||
| 	if (mode == NULL) | ||||
|  | @ -632,12 +641,12 @@ static struct fb_videomode *fb_create_modedb(unsigned char *edid, int *dbsize) | |||
| 	DPRINTK("   Standard Timings\n"); | ||||
| 	block = edid + STD_TIMING_DESCRIPTIONS_START; | ||||
| 	for (i = 0; i < STD_TIMING; i++, block += STD_TIMING_DESCRIPTION_SIZE) | ||||
| 		num += get_std_timing(block, &mode[num]); | ||||
| 		num += get_std_timing(block, &mode[num], ver, rev); | ||||
| 
 | ||||
| 	block = edid + DETAILED_TIMING_DESCRIPTIONS_START; | ||||
| 	for (i = 0; i < 4; i++, block+= DETAILED_TIMING_DESCRIPTION_SIZE) { | ||||
| 		if (block[0] == 0x00 && block[1] == 0x00 && block[3] == 0xfa) | ||||
| 			num += get_dst_timing(block + 5, &mode[num]); | ||||
| 			num += get_dst_timing(block + 5, &mode[num], ver, rev); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Yikes, EDID data is totally useless */ | ||||
|  |  | |||
|  | @ -399,9 +399,12 @@ static ssize_t store_fbstate(struct device *device, | |||
| 
 | ||||
| 	state = simple_strtoul(buf, &last, 0); | ||||
| 
 | ||||
| 	if (!lock_fb_info(fb_info)) | ||||
| 		return -ENODEV; | ||||
| 	console_lock(); | ||||
| 	fb_set_suspend(fb_info, (int)state); | ||||
| 	console_unlock(); | ||||
| 	unlock_fb_info(fb_info); | ||||
| 
 | ||||
| 	return count; | ||||
| } | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -149,10 +149,11 @@ int g364fb_cursor(struct fb_info *info, struct fb_cursor *cursor) | |||
| static int g364fb_pan_display(struct fb_var_screeninfo *var,  | ||||
| 			      struct fb_info *info) | ||||
| { | ||||
| 	if (var->xoffset || var->yoffset + var->yres > var->yres_virtual) | ||||
| 	if (var->xoffset || | ||||
| 	    var->yoffset + info->var.yres > info->var.yres_virtual) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	*(unsigned int *) TOP_REG = var->yoffset * var->xres; | ||||
| 	*(unsigned int *) TOP_REG = var->yoffset * info->var.xres; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										579
									
								
								drivers/video/grvga.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										579
									
								
								drivers/video/grvga.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,579 @@ | |||
| /*
 | ||||
|  * Driver for Aeroflex Gaisler SVGACTRL framebuffer device. | ||||
|  * | ||||
|  * 2011 (c) Aeroflex Gaisler AB | ||||
|  * | ||||
|  * Full documentation of the core can be found here: | ||||
|  * http://www.gaisler.com/products/grlib/grip.pdf
 | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * Contributors: Kristoffer Glembo <kristoffer@gaisler.com> | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/dma-mapping.h> | ||||
| #include <linux/of_platform.h> | ||||
| #include <linux/of_device.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/string.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/init.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/tty.h> | ||||
| #include <linux/mm.h> | ||||
| #include <linux/fb.h> | ||||
| #include <linux/io.h> | ||||
| 
 | ||||
| struct grvga_regs { | ||||
| 	u32 status; 		/* 0x00 */ | ||||
| 	u32 video_length; 	/* 0x04 */ | ||||
| 	u32 front_porch;	/* 0x08 */ | ||||
| 	u32 sync_length;	/* 0x0C */ | ||||
| 	u32 line_length;	/* 0x10 */ | ||||
| 	u32 fb_pos;		/* 0x14 */ | ||||
| 	u32 clk_vector[4];	/* 0x18 */ | ||||
| 	u32 clut;	        /* 0x20 */ | ||||
| }; | ||||
| 
 | ||||
| struct grvga_par { | ||||
| 	struct grvga_regs *regs; | ||||
| 	u32 color_palette[16];  /* 16 entry pseudo palette used by fbcon in true color mode */ | ||||
| 	int clk_sel; | ||||
| 	int fb_alloced;         /* = 1 if framebuffer is allocated in main memory */ | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static const struct fb_videomode grvga_modedb[] = { | ||||
|     { | ||||
| 	/* 640x480 @ 60 Hz */ | ||||
| 	NULL, 60, 640, 480, 40000, 48, 16, 39, 11, 96, 2, | ||||
| 	0, FB_VMODE_NONINTERLACED | ||||
|     }, { | ||||
| 	/* 800x600 @ 60 Hz */ | ||||
| 	NULL, 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4, | ||||
| 	0, FB_VMODE_NONINTERLACED | ||||
|     }, { | ||||
| 	/* 800x600 @ 72 Hz */ | ||||
| 	NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6, | ||||
| 	0, FB_VMODE_NONINTERLACED | ||||
|     }, { | ||||
| 	/* 1024x768 @ 60 Hz */ | ||||
| 	NULL, 60, 1024, 768, 15385, 160, 24, 29, 3, 136, 6, | ||||
| 	0, FB_VMODE_NONINTERLACED | ||||
|     } | ||||
|  }; | ||||
| 
 | ||||
| static struct fb_fix_screeninfo grvga_fix __initdata = { | ||||
| 	.id =		"AG SVGACTRL", | ||||
| 	.type =		FB_TYPE_PACKED_PIXELS, | ||||
| 	.visual =       FB_VISUAL_PSEUDOCOLOR, | ||||
| 	.xpanstep =	0, | ||||
| 	.ypanstep =	1, | ||||
| 	.ywrapstep =	0, | ||||
| 	.accel =	FB_ACCEL_NONE, | ||||
| }; | ||||
| 
 | ||||
| static int grvga_check_var(struct fb_var_screeninfo *var, | ||||
| 			   struct fb_info *info) | ||||
| { | ||||
| 	struct grvga_par *par = info->par; | ||||
| 	int i; | ||||
| 
 | ||||
| 	if (!var->xres) | ||||
| 		var->xres = 1; | ||||
| 	if (!var->yres) | ||||
| 		var->yres = 1; | ||||
| 	if (var->bits_per_pixel <= 8) | ||||
| 		var->bits_per_pixel = 8; | ||||
| 	else if (var->bits_per_pixel <= 16) | ||||
| 		var->bits_per_pixel = 16; | ||||
| 	else if (var->bits_per_pixel <= 24) | ||||
| 		var->bits_per_pixel = 24; | ||||
| 	else if (var->bits_per_pixel <= 32) | ||||
| 		var->bits_per_pixel = 32; | ||||
| 	else | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	var->xres_virtual = var->xres; | ||||
| 	var->yres_virtual = 2*var->yres; | ||||
| 
 | ||||
| 	if (info->fix.smem_len) { | ||||
| 		if ((var->yres_virtual*var->xres_virtual*var->bits_per_pixel/8) > info->fix.smem_len) | ||||
| 			return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Which clocks that are available can be read out in these registers */ | ||||
| 	for (i = 0; i <= 3 ; i++) { | ||||
| 		if (var->pixclock == par->regs->clk_vector[i]) | ||||
| 			break; | ||||
| 	} | ||||
| 	if (i <= 3) | ||||
| 		par->clk_sel = i; | ||||
| 	else | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	switch (info->var.bits_per_pixel) { | ||||
| 	case 8: | ||||
| 		var->red   = (struct fb_bitfield) {0, 8, 0};      /* offset, length, msb-right */ | ||||
| 		var->green = (struct fb_bitfield) {0, 8, 0}; | ||||
| 		var->blue  = (struct fb_bitfield) {0, 8, 0}; | ||||
| 		var->transp = (struct fb_bitfield) {0, 0, 0}; | ||||
| 		break; | ||||
| 	case 16: | ||||
| 		var->red   = (struct fb_bitfield) {11, 5, 0}; | ||||
| 		var->green = (struct fb_bitfield) {5, 6, 0}; | ||||
| 		var->blue  = (struct fb_bitfield) {0, 5, 0}; | ||||
| 		var->transp = (struct fb_bitfield) {0, 0, 0}; | ||||
| 		break; | ||||
| 	case 24: | ||||
| 	case 32: | ||||
| 		var->red   = (struct fb_bitfield) {16, 8, 0}; | ||||
| 		var->green = (struct fb_bitfield) {8, 8, 0}; | ||||
| 		var->blue  = (struct fb_bitfield) {0, 8, 0}; | ||||
| 		var->transp = (struct fb_bitfield) {24, 8, 0}; | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int grvga_set_par(struct fb_info *info) | ||||
| { | ||||
| 
 | ||||
| 	u32 func = 0; | ||||
| 	struct grvga_par *par = info->par; | ||||
| 
 | ||||
| 	__raw_writel(((info->var.yres - 1) << 16) | (info->var.xres - 1), | ||||
| 		     &par->regs->video_length); | ||||
| 
 | ||||
| 	__raw_writel((info->var.lower_margin << 16) | (info->var.right_margin), | ||||
| 		     &par->regs->front_porch); | ||||
| 
 | ||||
| 	__raw_writel((info->var.vsync_len << 16) | (info->var.hsync_len), | ||||
| 		     &par->regs->sync_length); | ||||
| 
 | ||||
| 	__raw_writel(((info->var.yres + info->var.lower_margin + info->var.upper_margin + info->var.vsync_len - 1) << 16) | | ||||
| 		     (info->var.xres + info->var.right_margin + info->var.left_margin + info->var.hsync_len - 1), | ||||
| 		     &par->regs->line_length); | ||||
| 
 | ||||
| 	switch (info->var.bits_per_pixel) { | ||||
| 	case 8: | ||||
| 		info->fix.visual = FB_VISUAL_PSEUDOCOLOR; | ||||
| 		func = 1; | ||||
| 		break; | ||||
| 	case 16: | ||||
| 		info->fix.visual = FB_VISUAL_TRUECOLOR; | ||||
| 		func = 2; | ||||
| 		break; | ||||
| 	case 24: | ||||
| 	case 32: | ||||
| 		info->fix.visual = FB_VISUAL_TRUECOLOR; | ||||
| 		func = 3; | ||||
| 		break; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	__raw_writel((par->clk_sel << 6) | (func << 4) | 1, | ||||
| 		     &par->regs->status); | ||||
| 
 | ||||
| 	info->fix.line_length = (info->var.xres_virtual*info->var.bits_per_pixel)/8; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int grvga_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *info) | ||||
| { | ||||
| 	struct grvga_par *par; | ||||
| 	par = info->par; | ||||
| 
 | ||||
| 	if (regno >= 256)	/* Size of CLUT */ | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (info->var.grayscale) { | ||||
| 		/* grayscale = 0.30*R + 0.59*G + 0.11*B */ | ||||
| 		red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8; | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #define CNVT_TOHW(val, width) ((((val)<<(width))+0x7FFF-(val))>>16) | ||||
| 
 | ||||
| 	red    = CNVT_TOHW(red,   info->var.red.length); | ||||
| 	green  = CNVT_TOHW(green, info->var.green.length); | ||||
| 	blue   = CNVT_TOHW(blue,  info->var.blue.length); | ||||
| 	transp = CNVT_TOHW(transp, info->var.transp.length); | ||||
| 
 | ||||
| #undef CNVT_TOHW | ||||
| 
 | ||||
| 	/* In PSEUDOCOLOR we use the hardware CLUT */ | ||||
| 	if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) | ||||
| 		__raw_writel((regno << 24) | (red << 16) | (green << 8) | blue, | ||||
| 			     &par->regs->clut); | ||||
| 
 | ||||
| 	/* Truecolor uses the pseudo palette */ | ||||
| 	else if (info->fix.visual == FB_VISUAL_TRUECOLOR) { | ||||
| 		u32 v; | ||||
| 		if (regno >= 16) | ||||
| 			return -EINVAL; | ||||
| 
 | ||||
| 
 | ||||
| 		v =     (red    << info->var.red.offset)   | | ||||
| 			(green  << info->var.green.offset) | | ||||
| 			(blue   << info->var.blue.offset)  | | ||||
| 			(transp << info->var.transp.offset); | ||||
| 
 | ||||
| 		((u32 *) (info->pseudo_palette))[regno] = v; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int grvga_pan_display(struct fb_var_screeninfo *var, | ||||
| 			     struct fb_info *info) | ||||
| { | ||||
| 	struct grvga_par *par = info->par; | ||||
| 	struct fb_fix_screeninfo *fix = &info->fix; | ||||
| 	u32 base_addr; | ||||
| 
 | ||||
| 	if (var->xoffset != 0) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	base_addr = fix->smem_start + (var->yoffset * fix->line_length); | ||||
| 	base_addr &= ~3UL; | ||||
| 
 | ||||
| 	/* Set framebuffer base address  */ | ||||
| 	__raw_writel(base_addr, | ||||
| 		     &par->regs->fb_pos); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct fb_ops grvga_ops = { | ||||
| 	.owner          = THIS_MODULE, | ||||
| 	.fb_check_var   = grvga_check_var, | ||||
| 	.fb_set_par	= grvga_set_par, | ||||
| 	.fb_setcolreg   = grvga_setcolreg, | ||||
| 	.fb_pan_display = grvga_pan_display, | ||||
| 	.fb_fillrect	= cfb_fillrect, | ||||
| 	.fb_copyarea	= cfb_copyarea, | ||||
| 	.fb_imageblit	= cfb_imageblit | ||||
| }; | ||||
| 
 | ||||
| static int __init grvga_parse_custom(char *options, | ||||
| 				     struct fb_var_screeninfo *screendata) | ||||
| { | ||||
| 	char *this_opt; | ||||
| 	int count = 0; | ||||
| 	if (!options || !*options) | ||||
| 		return -1; | ||||
| 
 | ||||
| 	while ((this_opt = strsep(&options, " ")) != NULL) { | ||||
| 		if (!*this_opt) | ||||
| 			continue; | ||||
| 
 | ||||
| 		switch (count) { | ||||
| 		case 0: | ||||
| 			screendata->pixclock = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 1: | ||||
| 			screendata->xres = screendata->xres_virtual = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 2: | ||||
| 			screendata->right_margin = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 3: | ||||
| 			screendata->hsync_len = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 4: | ||||
| 			screendata->left_margin = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 5: | ||||
| 			screendata->yres = screendata->yres_virtual = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 6: | ||||
| 			screendata->lower_margin = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 7: | ||||
| 			screendata->vsync_len = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 8: | ||||
| 			screendata->upper_margin = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		case 9: | ||||
| 			screendata->bits_per_pixel = simple_strtoul(this_opt, NULL, 0); | ||||
| 			count++; | ||||
| 			break; | ||||
| 		default: | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| 	screendata->activate  = FB_ACTIVATE_NOW; | ||||
| 	screendata->vmode     = FB_VMODE_NONINTERLACED; | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int __devinit grvga_probe(struct platform_device *dev) | ||||
| { | ||||
| 	struct fb_info *info; | ||||
| 	int retval = -ENOMEM; | ||||
| 	unsigned long virtual_start; | ||||
| 	unsigned long grvga_fix_addr = 0; | ||||
| 	unsigned long physical_start = 0; | ||||
| 	unsigned long grvga_mem_size = 0; | ||||
| 	struct grvga_par *par = NULL; | ||||
| 	char *options = NULL, *mode_opt = NULL; | ||||
| 
 | ||||
| 	info = framebuffer_alloc(sizeof(struct grvga_par), &dev->dev); | ||||
| 	if (!info) { | ||||
| 		dev_err(&dev->dev, "framebuffer_alloc failed\n"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Expecting: "grvga: modestring, [addr:<framebuffer physical address>], [size:<framebuffer size>]
 | ||||
| 	 * | ||||
| 	 * If modestring is custom:<custom mode string> we parse the string which then contains all videoparameters | ||||
| 	 * If address is left out, we allocate memory, | ||||
| 	 * if size is left out we only allocate enough to support the given mode. | ||||
| 	 */ | ||||
| 	if (fb_get_options("grvga", &options)) { | ||||
| 		retval = -ENODEV; | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!options || !*options) | ||||
| 		options =  "640x480-8@60"; | ||||
| 
 | ||||
| 	while (1) { | ||||
| 		char *this_opt = strsep(&options, ","); | ||||
| 
 | ||||
| 		if (!this_opt) | ||||
| 			break; | ||||
| 
 | ||||
| 		if (!strncmp(this_opt, "custom", 6)) { | ||||
| 			if (grvga_parse_custom(this_opt, &info->var) < 0) { | ||||
| 				dev_err(&dev->dev, "Failed to parse custom mode (%s).\n", this_opt); | ||||
| 				retval = -EINVAL; | ||||
| 				goto err1; | ||||
| 			} | ||||
| 		} else if (!strncmp(this_opt, "addr", 4)) | ||||
| 			grvga_fix_addr = simple_strtoul(this_opt + 5, NULL, 16); | ||||
| 		else if (!strncmp(this_opt, "size", 4)) | ||||
| 			grvga_mem_size = simple_strtoul(this_opt + 5, NULL, 0); | ||||
| 		else | ||||
| 			mode_opt = this_opt; | ||||
| 	} | ||||
| 
 | ||||
| 	par = info->par; | ||||
| 	info->fbops = &grvga_ops; | ||||
| 	info->fix = grvga_fix; | ||||
| 	info->pseudo_palette = par->color_palette; | ||||
| 	info->flags = FBINFO_DEFAULT | FBINFO_PARTIAL_PAN_OK | FBINFO_HWACCEL_YPAN; | ||||
| 	info->fix.smem_len = grvga_mem_size; | ||||
| 
 | ||||
| 	if (!request_mem_region(dev->resource[0].start, resource_size(&dev->resource[0]), "grlib-svgactrl regs")) { | ||||
| 		dev_err(&dev->dev, "registers already mapped\n"); | ||||
| 		retval = -EBUSY; | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	par->regs = of_ioremap(&dev->resource[0], 0, | ||||
| 			       resource_size(&dev->resource[0]), | ||||
| 			       "grlib-svgactrl regs"); | ||||
| 
 | ||||
| 	if (!par->regs) { | ||||
| 		dev_err(&dev->dev, "failed to map registers\n"); | ||||
| 		retval = -ENOMEM; | ||||
| 		goto err1; | ||||
| 	} | ||||
| 
 | ||||
| 	retval = fb_alloc_cmap(&info->cmap, 256, 0); | ||||
| 	if (retval < 0) { | ||||
| 		dev_err(&dev->dev, "failed to allocate mem with fb_alloc_cmap\n"); | ||||
| 		retval = -ENOMEM; | ||||
| 		goto err2; | ||||
| 	} | ||||
| 
 | ||||
| 	if (mode_opt) { | ||||
| 		retval = fb_find_mode(&info->var, info, mode_opt, | ||||
| 				      grvga_modedb, sizeof(grvga_modedb), &grvga_modedb[0], 8); | ||||
| 		if (!retval || retval == 4) { | ||||
| 			retval = -EINVAL; | ||||
| 			goto err3; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (!grvga_mem_size) | ||||
| 		grvga_mem_size = info->var.xres_virtual * info->var.yres_virtual * info->var.bits_per_pixel/8; | ||||
| 
 | ||||
| 	if (grvga_fix_addr) { | ||||
| 		/* Got framebuffer base address from argument list */ | ||||
| 
 | ||||
| 		physical_start = grvga_fix_addr; | ||||
| 
 | ||||
| 		if (!request_mem_region(physical_start, grvga_mem_size, dev->name)) { | ||||
| 			dev_err(&dev->dev, "failed to request memory region\n"); | ||||
| 			retval = -ENOMEM; | ||||
| 			goto err3; | ||||
| 		} | ||||
| 
 | ||||
| 		virtual_start = (unsigned long) ioremap(physical_start, grvga_mem_size); | ||||
| 
 | ||||
| 		if (!virtual_start) { | ||||
| 			dev_err(&dev->dev, "error mapping framebuffer memory\n"); | ||||
| 			retval = -ENOMEM; | ||||
| 			goto err4; | ||||
| 		} | ||||
| 	} else {	/* Allocate frambuffer memory */ | ||||
| 
 | ||||
| 		unsigned long page; | ||||
| 
 | ||||
| 		virtual_start = (unsigned long) __get_free_pages(GFP_DMA, | ||||
| 								 get_order(grvga_mem_size)); | ||||
| 		if (!virtual_start) { | ||||
| 			dev_err(&dev->dev, | ||||
| 				"unable to allocate framebuffer memory (%lu bytes)\n", | ||||
| 				grvga_mem_size); | ||||
| 			retval = -ENOMEM; | ||||
| 			goto err3; | ||||
| 		} | ||||
| 
 | ||||
| 		physical_start = dma_map_single(&dev->dev, (void *)virtual_start, grvga_mem_size, DMA_TO_DEVICE); | ||||
| 
 | ||||
| 		/* Set page reserved so that mmap will work. This is necessary
 | ||||
| 		 * since we'll be remapping normal memory. | ||||
| 		 */ | ||||
| 		for (page = virtual_start; | ||||
| 		     page < PAGE_ALIGN(virtual_start + grvga_mem_size); | ||||
| 		     page += PAGE_SIZE) { | ||||
| 			SetPageReserved(virt_to_page(page)); | ||||
| 		} | ||||
| 
 | ||||
| 		par->fb_alloced = 1; | ||||
| 	} | ||||
| 
 | ||||
| 	memset((unsigned long *) virtual_start, 0, grvga_mem_size); | ||||
| 
 | ||||
| 	info->screen_base = (char __iomem *) virtual_start; | ||||
| 	info->fix.smem_start = physical_start; | ||||
| 	info->fix.smem_len   = grvga_mem_size; | ||||
| 
 | ||||
| 	dev_set_drvdata(&dev->dev, info); | ||||
| 
 | ||||
| 	dev_info(&dev->dev, | ||||
| 		 "Aeroflex Gaisler framebuffer device (fb%d), %dx%d-%d, using %luK of video memory @ %p\n", | ||||
| 		 info->node, info->var.xres, info->var.yres, info->var.bits_per_pixel, | ||||
| 		 grvga_mem_size >> 10, info->screen_base); | ||||
| 
 | ||||
| 	retval = register_framebuffer(info); | ||||
| 	if (retval < 0) { | ||||
| 		dev_err(&dev->dev, "failed to register framebuffer\n"); | ||||
| 		goto err4; | ||||
| 	} | ||||
| 
 | ||||
| 	__raw_writel(physical_start, &par->regs->fb_pos); | ||||
| 	__raw_writel(__raw_readl(&par->regs->status) | 1,  /* Enable framebuffer */ | ||||
| 		     &par->regs->status); | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err4: | ||||
| 	dev_set_drvdata(&dev->dev, NULL); | ||||
| 	if (grvga_fix_addr) { | ||||
| 		release_mem_region(physical_start, grvga_mem_size); | ||||
| 		iounmap((void *)virtual_start); | ||||
| 	} else | ||||
| 		kfree((void *)virtual_start); | ||||
| err3: | ||||
| 	fb_dealloc_cmap(&info->cmap); | ||||
| err2: | ||||
| 	of_iounmap(&dev->resource[0], par->regs, | ||||
| 		   resource_size(&dev->resource[0])); | ||||
| err1: | ||||
| 	release_mem_region(dev->resource[0].start, resource_size(&dev->resource[0])); | ||||
| err: | ||||
| 	framebuffer_release(info); | ||||
| 
 | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| static int __devexit grvga_remove(struct platform_device *device) | ||||
| { | ||||
| 	struct fb_info *info = dev_get_drvdata(&device->dev); | ||||
| 	struct grvga_par *par = info->par; | ||||
| 
 | ||||
| 	if (info) { | ||||
| 		unregister_framebuffer(info); | ||||
| 		fb_dealloc_cmap(&info->cmap); | ||||
| 
 | ||||
| 		of_iounmap(&device->resource[0], par->regs, | ||||
| 			   resource_size(&device->resource[0])); | ||||
| 		release_mem_region(device->resource[0].start, resource_size(&device->resource[0])); | ||||
| 
 | ||||
| 		if (!par->fb_alloced) { | ||||
| 			release_mem_region(info->fix.smem_start, info->fix.smem_len); | ||||
| 			iounmap(info->screen_base); | ||||
| 		} else | ||||
| 			kfree((void *)info->screen_base); | ||||
| 
 | ||||
| 		framebuffer_release(info); | ||||
| 		dev_set_drvdata(&device->dev, NULL); | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct of_device_id svgactrl_of_match[] = { | ||||
| 	{ | ||||
| 		.name = "GAISLER_SVGACTRL", | ||||
| 	}, | ||||
| 	{ | ||||
| 		.name = "01_063", | ||||
| 	}, | ||||
| 	{}, | ||||
| }; | ||||
| MODULE_DEVICE_TABLE(of, svgactrl_of_match); | ||||
| 
 | ||||
| static struct platform_driver grvga_driver = { | ||||
| 	.driver = { | ||||
| 		.name = "grlib-svgactrl", | ||||
| 		.owner = THIS_MODULE, | ||||
| 		.of_match_table = svgactrl_of_match, | ||||
| 	}, | ||||
| 	.probe		= grvga_probe, | ||||
| 	.remove		= __devexit_p(grvga_remove), | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| static int __init grvga_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&grvga_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit grvga_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&grvga_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(grvga_init); | ||||
| module_exit(grvga_exit); | ||||
| 
 | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_AUTHOR("Aeroflex Gaisler"); | ||||
| MODULE_DESCRIPTION("Aeroflex Gaisler framebuffer device driver"); | ||||
|  | @ -543,8 +543,8 @@ static int gxt4500_pan_display(struct fb_var_screeninfo *var, | |||
| 
 | ||||
| 	if (var->xoffset & 7) | ||||
| 		return -EINVAL; | ||||
| 	if (var->xoffset + var->xres > var->xres_virtual || | ||||
| 	    var->yoffset + var->yres > var->yres_virtual) | ||||
| 	if (var->xoffset + info->var.xres > info->var.xres_virtual || | ||||
| 	    var->yoffset + info->var.yres > info->var.yres_virtual) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	writereg(par, REFRESH_START, (var->xoffset << 16) | var->yoffset); | ||||
|  |  | |||
|  | @ -422,8 +422,8 @@ static int hgafb_pan_display(struct fb_var_screeninfo *var, | |||
| 		    var->xoffset) | ||||
| 			return -EINVAL; | ||||
| 	} else { | ||||
| 		if (var->xoffset + var->xres > info->var.xres_virtual | ||||
| 		 || var->yoffset + var->yres > info->var.yres_virtual | ||||
| 		if (var->xoffset + info->var.xres > info->var.xres_virtual | ||||
| 		 || var->yoffset + info->var.yres > info->var.yres_virtual | ||||
| 		 || var->yoffset % 8) | ||||
| 			return -EINVAL; | ||||
| 	} | ||||
|  |  | |||
|  | @ -749,7 +749,7 @@ set_offset (struct fb_var_screeninfo *var, struct fb_info *info) | |||
| { | ||||
| 	struct imstt_par *par = info->par; | ||||
| 	__u32 off = var->yoffset * (info->fix.line_length >> 3) | ||||
| 		    + ((var->xoffset * (var->bits_per_pixel >> 3)) >> 3); | ||||
| 		    + ((var->xoffset * (info->var.bits_per_pixel >> 3)) >> 3); | ||||
| 	write_reg_le32(par->dc_regs, SSR, off); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -390,12 +390,12 @@ int intelfbhw_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) | |||
| 	xoffset = ROUND_DOWN_TO(var->xoffset, 8); | ||||
| 	yoffset = var->yoffset; | ||||
| 
 | ||||
| 	if ((xoffset + var->xres > var->xres_virtual) || | ||||
| 	    (yoffset + var->yres > var->yres_virtual)) | ||||
| 	if ((xoffset + info->var.xres > info->var.xres_virtual) || | ||||
| 	    (yoffset + info->var.yres > info->var.yres_virtual)) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	offset = (yoffset * dinfo->pitch) + | ||||
| 		 (xoffset * var->bits_per_pixel) / 8; | ||||
| 		 (xoffset * info->var.bits_per_pixel) / 8; | ||||
| 
 | ||||
| 	offset += dinfo->fb.offset << 12; | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ static int mb862xx_i2c_wait_event(struct i2c_adapter *adap) | |||
| 	u32 reg; | ||||
| 
 | ||||
| 	do { | ||||
| 		udelay(1); | ||||
| 		udelay(10); | ||||
| 		reg = inreg(i2c, GC_I2C_BCR); | ||||
| 		if (reg & (I2C_INT | I2C_BER)) | ||||
| 			break; | ||||
|  |  | |||
|  | @ -278,7 +278,7 @@ static int mb862xxfb_pan(struct fb_var_screeninfo *var, | |||
| 	reg = pack(var->yoffset, var->xoffset); | ||||
| 	outreg(disp, GC_L0WY_L0WX, reg); | ||||
| 
 | ||||
| 	reg = pack(var->yres_virtual, var->xres_virtual); | ||||
| 	reg = pack(info->var.yres_virtual, info->var.xres_virtual); | ||||
| 	outreg(disp, GC_L0WH_L0WW, reg); | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -737,7 +737,7 @@ static int __devinit of_platform_mb862xx_probe(struct platform_device *ofdev) | |||
| 	if (mb862xx_gdc_init(par)) | ||||
| 		goto io_unmap; | ||||
| 
 | ||||
| 	if (request_irq(par->irq, mb862xx_intr, IRQF_DISABLED, | ||||
| 	if (request_irq(par->irq, mb862xx_intr, 0, | ||||
| 			DRV_NAME, (void *)par)) { | ||||
| 		dev_err(dev, "Cannot request irq\n"); | ||||
| 		goto io_unmap; | ||||
|  | @ -1073,7 +1073,7 @@ static int __devinit mb862xx_pci_probe(struct pci_dev *pdev, | |||
| 	if (mb862xx_pci_gdc_init(par)) | ||||
| 		goto io_unmap; | ||||
| 
 | ||||
| 	if (request_irq(par->irq, mb862xx_intr, IRQF_DISABLED | IRQF_SHARED, | ||||
| 	if (request_irq(par->irq, mb862xx_intr, IRQF_SHARED, | ||||
| 			DRV_NAME, (void *)par)) { | ||||
| 		dev_err(dev, "Cannot request irq\n"); | ||||
| 		goto io_unmap; | ||||
|  |  | |||
|  | @ -491,55 +491,56 @@ EXPORT_SYMBOL(vesa_modes); | |||
| static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info, | ||||
| 		       const struct fb_videomode *mode, unsigned int bpp) | ||||
| { | ||||
|     int err = 0; | ||||
| 	int err = 0; | ||||
| 
 | ||||
|     DPRINTK("Trying mode %s %dx%d-%d@%d\n", mode->name ? mode->name : "noname", | ||||
| 	    mode->xres, mode->yres, bpp, mode->refresh); | ||||
|     var->xres = mode->xres; | ||||
|     var->yres = mode->yres; | ||||
|     var->xres_virtual = mode->xres; | ||||
|     var->yres_virtual = mode->yres; | ||||
|     var->xoffset = 0; | ||||
|     var->yoffset = 0; | ||||
|     var->bits_per_pixel = bpp; | ||||
|     var->activate |= FB_ACTIVATE_TEST; | ||||
|     var->pixclock = mode->pixclock; | ||||
|     var->left_margin = mode->left_margin; | ||||
|     var->right_margin = mode->right_margin; | ||||
|     var->upper_margin = mode->upper_margin; | ||||
|     var->lower_margin = mode->lower_margin; | ||||
|     var->hsync_len = mode->hsync_len; | ||||
|     var->vsync_len = mode->vsync_len; | ||||
|     var->sync = mode->sync; | ||||
|     var->vmode = mode->vmode; | ||||
|     if (info->fbops->fb_check_var) | ||||
|     	err = info->fbops->fb_check_var(var, info); | ||||
|     var->activate &= ~FB_ACTIVATE_TEST; | ||||
|     return err; | ||||
| 	DPRINTK("Trying mode %s %dx%d-%d@%d\n", | ||||
| 		mode->name ? mode->name : "noname", | ||||
| 		mode->xres, mode->yres, bpp, mode->refresh); | ||||
| 	var->xres = mode->xres; | ||||
| 	var->yres = mode->yres; | ||||
| 	var->xres_virtual = mode->xres; | ||||
| 	var->yres_virtual = mode->yres; | ||||
| 	var->xoffset = 0; | ||||
| 	var->yoffset = 0; | ||||
| 	var->bits_per_pixel = bpp; | ||||
| 	var->activate |= FB_ACTIVATE_TEST; | ||||
| 	var->pixclock = mode->pixclock; | ||||
| 	var->left_margin = mode->left_margin; | ||||
| 	var->right_margin = mode->right_margin; | ||||
| 	var->upper_margin = mode->upper_margin; | ||||
| 	var->lower_margin = mode->lower_margin; | ||||
| 	var->hsync_len = mode->hsync_len; | ||||
| 	var->vsync_len = mode->vsync_len; | ||||
| 	var->sync = mode->sync; | ||||
| 	var->vmode = mode->vmode; | ||||
| 	if (info->fbops->fb_check_var) | ||||
| 		err = info->fbops->fb_check_var(var, info); | ||||
| 	var->activate &= ~FB_ACTIVATE_TEST; | ||||
| 	return err; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  *	fb_find_mode - finds a valid video mode | ||||
|  *	@var: frame buffer user defined part of display | ||||
|  *	@info: frame buffer info structure | ||||
|  *	@mode_option: string video mode to find | ||||
|  *	@db: video mode database | ||||
|  *	@dbsize: size of @db | ||||
|  *	@default_mode: default video mode to fall back to | ||||
|  *	@default_bpp: default color depth in bits per pixel | ||||
|  *     fb_find_mode - finds a valid video mode | ||||
|  *     @var: frame buffer user defined part of display | ||||
|  *     @info: frame buffer info structure | ||||
|  *     @mode_option: string video mode to find | ||||
|  *     @db: video mode database | ||||
|  *     @dbsize: size of @db | ||||
|  *     @default_mode: default video mode to fall back to | ||||
|  *     @default_bpp: default color depth in bits per pixel | ||||
|  * | ||||
|  *	Finds a suitable video mode, starting with the specified mode | ||||
|  *	in @mode_option with fallback to @default_mode.  If | ||||
|  *	@default_mode fails, all modes in the video mode database will | ||||
|  *	be tried. | ||||
|  *     Finds a suitable video mode, starting with the specified mode | ||||
|  *     in @mode_option with fallback to @default_mode.  If | ||||
|  *     @default_mode fails, all modes in the video mode database will | ||||
|  *     be tried. | ||||
|  * | ||||
|  *	Valid mode specifiers for @mode_option: | ||||
|  *     Valid mode specifiers for @mode_option: | ||||
|  * | ||||
|  *	<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or | ||||
|  *	<name>[-<bpp>][@<refresh>] | ||||
|  *     <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or | ||||
|  *     <name>[-<bpp>][@<refresh>] | ||||
|  * | ||||
|  *	with <xres>, <yres>, <bpp> and <refresh> decimal numbers and | ||||
|  *	<name> a string. | ||||
|  *     with <xres>, <yres>, <bpp> and <refresh> decimal numbers and | ||||
|  *     <name> a string. | ||||
|  * | ||||
|  *      If 'M' is present after yres (and before refresh/bpp if present), | ||||
|  *      the function will compute the timings using VESA(tm) Coordinated | ||||
|  | @ -551,12 +552,12 @@ static int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info, | |||
|  * | ||||
|  *      1024x768MR-8@60m - Reduced blank with margins at 60Hz. | ||||
|  * | ||||
|  *	NOTE: The passed struct @var is _not_ cleared!  This allows you | ||||
|  *	to supply values for e.g. the grayscale and accel_flags fields. | ||||
|  *     NOTE: The passed struct @var is _not_ cleared!  This allows you | ||||
|  *     to supply values for e.g. the grayscale and accel_flags fields. | ||||
|  * | ||||
|  *	Returns zero for failure, 1 if using specified @mode_option, | ||||
|  *	2 if using specified @mode_option with an ignored refresh rate, | ||||
|  *	3 if default mode is used, 4 if fall back to any valid mode. | ||||
|  *     Returns zero for failure, 1 if using specified @mode_option, | ||||
|  *     2 if using specified @mode_option with an ignored refresh rate, | ||||
|  *     3 if default mode is used, 4 if fall back to any valid mode. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
|  | @ -566,198 +567,203 @@ int fb_find_mode(struct fb_var_screeninfo *var, | |||
| 		 const struct fb_videomode *default_mode, | ||||
| 		 unsigned int default_bpp) | ||||
| { | ||||
|     int i; | ||||
| 	int i; | ||||
| 
 | ||||
|     /* Set up defaults */ | ||||
|     if (!db) { | ||||
| 	db = modedb; | ||||
| 	dbsize = ARRAY_SIZE(modedb); | ||||
|     } | ||||
| 
 | ||||
|     if (!default_mode) | ||||
| 	default_mode = &db[0]; | ||||
| 
 | ||||
|     if (!default_bpp) | ||||
| 	default_bpp = 8; | ||||
| 
 | ||||
|     /* Did the user specify a video mode? */ | ||||
|     if (!mode_option) | ||||
| 	mode_option = fb_mode_option; | ||||
|     if (mode_option) { | ||||
| 	const char *name = mode_option; | ||||
| 	unsigned int namelen = strlen(name); | ||||
| 	int res_specified = 0, bpp_specified = 0, refresh_specified = 0; | ||||
| 	unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0; | ||||
| 	int yres_specified = 0, cvt = 0, rb = 0, interlace = 0, margins = 0; | ||||
| 	u32 best, diff, tdiff; | ||||
| 
 | ||||
| 	for (i = namelen-1; i >= 0; i--) { | ||||
| 	    switch (name[i]) { | ||||
| 		case '@': | ||||
| 		    namelen = i; | ||||
| 		    if (!refresh_specified && !bpp_specified && | ||||
| 			!yres_specified) { | ||||
| 			refresh = simple_strtol(&name[i+1], NULL, 10); | ||||
| 			refresh_specified = 1; | ||||
| 			if (cvt || rb) | ||||
| 			    cvt = 0; | ||||
| 		    } else | ||||
| 			goto done; | ||||
| 		    break; | ||||
| 		case '-': | ||||
| 		    namelen = i; | ||||
| 		    if (!bpp_specified && !yres_specified) { | ||||
| 			bpp = simple_strtol(&name[i+1], NULL, 10); | ||||
| 			bpp_specified = 1; | ||||
| 			if (cvt || rb) | ||||
| 			    cvt = 0; | ||||
| 		    } else | ||||
| 			goto done; | ||||
| 		    break; | ||||
| 		case 'x': | ||||
| 		    if (!yres_specified) { | ||||
| 			yres = simple_strtol(&name[i+1], NULL, 10); | ||||
| 			yres_specified = 1; | ||||
| 		    } else | ||||
| 			goto done; | ||||
| 		    break; | ||||
| 		case '0' ... '9': | ||||
| 		    break; | ||||
| 		case 'M': | ||||
| 		    if (!yres_specified) | ||||
| 			cvt = 1; | ||||
| 		    break; | ||||
| 		case 'R': | ||||
| 		    if (!cvt) | ||||
| 			rb = 1; | ||||
| 		    break; | ||||
| 		case 'm': | ||||
| 		    if (!cvt) | ||||
| 			margins = 1; | ||||
| 		    break; | ||||
| 		case 'i': | ||||
| 		    if (!cvt) | ||||
| 			interlace = 1; | ||||
| 		    break; | ||||
| 		default: | ||||
| 		    goto done; | ||||
| 	    } | ||||
| 	} | ||||
| 	if (i < 0 && yres_specified) { | ||||
| 	    xres = simple_strtol(name, NULL, 10); | ||||
| 	    res_specified = 1; | ||||
| 	} | ||||
| done: | ||||
| 	if (cvt) { | ||||
| 	    struct fb_videomode cvt_mode; | ||||
| 	    int ret; | ||||
| 
 | ||||
| 	    DPRINTK("CVT mode %dx%d@%dHz%s%s%s\n", xres, yres, | ||||
| 		    (refresh) ? refresh : 60, (rb) ? " reduced blanking" : | ||||
| 		    "", (margins) ? " with margins" : "", (interlace) ? | ||||
| 		    " interlaced" : ""); | ||||
| 
 | ||||
| 	    memset(&cvt_mode, 0, sizeof(cvt_mode)); | ||||
| 	    cvt_mode.xres = xres; | ||||
| 	    cvt_mode.yres = yres; | ||||
| 	    cvt_mode.refresh = (refresh) ? refresh : 60; | ||||
| 
 | ||||
| 	    if (interlace) | ||||
| 		cvt_mode.vmode |= FB_VMODE_INTERLACED; | ||||
| 	    else | ||||
| 		cvt_mode.vmode &= ~FB_VMODE_INTERLACED; | ||||
| 
 | ||||
| 	    ret = fb_find_mode_cvt(&cvt_mode, margins, rb); | ||||
| 
 | ||||
| 	    if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) { | ||||
| 		DPRINTK("modedb CVT: CVT mode ok\n"); | ||||
| 		return 1; | ||||
| 	    } | ||||
| 
 | ||||
| 	    DPRINTK("CVT mode invalid, getting mode from database\n"); | ||||
| 	/* Set up defaults */ | ||||
| 	if (!db) { | ||||
| 		db = modedb; | ||||
| 		dbsize = ARRAY_SIZE(modedb); | ||||
| 	} | ||||
| 
 | ||||
| 	DPRINTK("Trying specified video mode%s %ix%i\n", | ||||
| 	    refresh_specified ? "" : " (ignoring refresh rate)", xres, yres); | ||||
| 	if (!default_mode) | ||||
| 		default_mode = &db[0]; | ||||
| 
 | ||||
| 	if (!refresh_specified) { | ||||
| 		/*
 | ||||
| 		 * If the caller has provided a custom mode database and a | ||||
| 		 * valid monspecs structure, we look for the mode with the | ||||
| 		 * highest refresh rate.  Otherwise we play it safe it and | ||||
| 		 * try to find a mode with a refresh rate closest to the | ||||
| 		 * standard 60 Hz. | ||||
| 		 */ | ||||
| 		if (db != modedb && | ||||
| 		    info->monspecs.vfmin && info->monspecs.vfmax && | ||||
| 		    info->monspecs.hfmin && info->monspecs.hfmax && | ||||
| 		    info->monspecs.dclkmax) { | ||||
| 			refresh = 1000; | ||||
| 		} else { | ||||
| 			refresh = 60; | ||||
| 	if (!default_bpp) | ||||
| 		default_bpp = 8; | ||||
| 
 | ||||
| 	/* Did the user specify a video mode? */ | ||||
| 	if (!mode_option) | ||||
| 		mode_option = fb_mode_option; | ||||
| 	if (mode_option) { | ||||
| 		const char *name = mode_option; | ||||
| 		unsigned int namelen = strlen(name); | ||||
| 		int res_specified = 0, bpp_specified = 0, refresh_specified = 0; | ||||
| 		unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0; | ||||
| 		int yres_specified = 0, cvt = 0, rb = 0, interlace = 0; | ||||
| 		int margins = 0; | ||||
| 		u32 best, diff, tdiff; | ||||
| 
 | ||||
| 		for (i = namelen-1; i >= 0; i--) { | ||||
| 			switch (name[i]) { | ||||
| 			case '@': | ||||
| 				namelen = i; | ||||
| 				if (!refresh_specified && !bpp_specified && | ||||
| 				    !yres_specified) { | ||||
| 					refresh = simple_strtol(&name[i+1], NULL, | ||||
| 								10); | ||||
| 					refresh_specified = 1; | ||||
| 					if (cvt || rb) | ||||
| 						cvt = 0; | ||||
| 				} else | ||||
| 					goto done; | ||||
| 				break; | ||||
| 			case '-': | ||||
| 				namelen = i; | ||||
| 				if (!bpp_specified && !yres_specified) { | ||||
| 					bpp = simple_strtol(&name[i+1], NULL, | ||||
| 							    10); | ||||
| 					bpp_specified = 1; | ||||
| 					if (cvt || rb) | ||||
| 						cvt = 0; | ||||
| 				} else | ||||
| 					goto done; | ||||
| 				break; | ||||
| 			case 'x': | ||||
| 				if (!yres_specified) { | ||||
| 					yres = simple_strtol(&name[i+1], NULL, | ||||
| 							     10); | ||||
| 					yres_specified = 1; | ||||
| 				} else | ||||
| 					goto done; | ||||
| 				break; | ||||
| 			case '0' ... '9': | ||||
| 				break; | ||||
| 			case 'M': | ||||
| 				if (!yres_specified) | ||||
| 					cvt = 1; | ||||
| 				break; | ||||
| 			case 'R': | ||||
| 				if (!cvt) | ||||
| 					rb = 1; | ||||
| 				break; | ||||
| 			case 'm': | ||||
| 				if (!cvt) | ||||
| 					margins = 1; | ||||
| 				break; | ||||
| 			case 'i': | ||||
| 				if (!cvt) | ||||
| 					interlace = 1; | ||||
| 				break; | ||||
| 			default: | ||||
| 				goto done; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 		if (i < 0 && yres_specified) { | ||||
| 			xres = simple_strtol(name, NULL, 10); | ||||
| 			res_specified = 1; | ||||
| 		} | ||||
| done: | ||||
| 		if (cvt) { | ||||
| 			struct fb_videomode cvt_mode; | ||||
| 			int ret; | ||||
| 
 | ||||
| 	diff = -1; | ||||
| 	best = -1; | ||||
| 	for (i = 0; i < dbsize; i++) { | ||||
| 		if ((name_matches(db[i], name, namelen) || | ||||
| 		    (res_specified && res_matches(db[i], xres, yres))) && | ||||
| 		    !fb_try_mode(var, info, &db[i], bpp)) { | ||||
| 			if (refresh_specified && db[i].refresh == refresh) { | ||||
| 			DPRINTK("CVT mode %dx%d@%dHz%s%s%s\n", xres, yres, | ||||
| 				(refresh) ? refresh : 60, | ||||
| 				(rb) ? " reduced blanking" : "", | ||||
| 				(margins) ? " with margins" : "", | ||||
| 				(interlace) ? " interlaced" : ""); | ||||
| 
 | ||||
| 			memset(&cvt_mode, 0, sizeof(cvt_mode)); | ||||
| 			cvt_mode.xres = xres; | ||||
| 			cvt_mode.yres = yres; | ||||
| 			cvt_mode.refresh = (refresh) ? refresh : 60; | ||||
| 
 | ||||
| 			if (interlace) | ||||
| 				cvt_mode.vmode |= FB_VMODE_INTERLACED; | ||||
| 			else | ||||
| 				cvt_mode.vmode &= ~FB_VMODE_INTERLACED; | ||||
| 
 | ||||
| 			ret = fb_find_mode_cvt(&cvt_mode, margins, rb); | ||||
| 
 | ||||
| 			if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) { | ||||
| 				DPRINTK("modedb CVT: CVT mode ok\n"); | ||||
| 				return 1; | ||||
| 			} | ||||
| 
 | ||||
| 			DPRINTK("CVT mode invalid, getting mode from database\n"); | ||||
| 		} | ||||
| 
 | ||||
| 		DPRINTK("Trying specified video mode%s %ix%i\n", | ||||
| 			refresh_specified ? "" : " (ignoring refresh rate)", | ||||
| 			xres, yres); | ||||
| 
 | ||||
| 		if (!refresh_specified) { | ||||
| 			/*
 | ||||
| 			 * If the caller has provided a custom mode database and | ||||
| 			 * a valid monspecs structure, we look for the mode with | ||||
| 			 * the highest refresh rate.  Otherwise we play it safe | ||||
| 			 * it and try to find a mode with a refresh rate closest | ||||
| 			 * to the standard 60 Hz. | ||||
| 			 */ | ||||
| 			if (db != modedb && | ||||
| 			    info->monspecs.vfmin && info->monspecs.vfmax && | ||||
| 			    info->monspecs.hfmin && info->monspecs.hfmax && | ||||
| 			    info->monspecs.dclkmax) { | ||||
| 				refresh = 1000; | ||||
| 			} else { | ||||
| 				refresh = 60; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		diff = -1; | ||||
| 		best = -1; | ||||
| 		for (i = 0; i < dbsize; i++) { | ||||
| 			if ((name_matches(db[i], name, namelen) || | ||||
| 			     (res_specified && res_matches(db[i], xres, yres))) && | ||||
| 			    !fb_try_mode(var, info, &db[i], bpp)) { | ||||
| 				if (refresh_specified && db[i].refresh == refresh) | ||||
| 					return 1; | ||||
| 
 | ||||
| 				if (abs(db[i].refresh - refresh) < diff) { | ||||
| 					diff = abs(db[i].refresh - refresh); | ||||
| 					best = i; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if (best != -1) { | ||||
| 		fb_try_mode(var, info, &db[best], bpp); | ||||
| 		return (refresh_specified) ? 2 : 1; | ||||
| 	} | ||||
| 		if (best != -1) { | ||||
| 			fb_try_mode(var, info, &db[best], bpp); | ||||
| 			return (refresh_specified) ? 2 : 1; | ||||
| 		} | ||||
| 
 | ||||
| 	diff = 2 * (xres + yres); | ||||
| 	best = -1; | ||||
| 	DPRINTK("Trying best-fit modes\n"); | ||||
| 	for (i = 0; i < dbsize; i++) { | ||||
| 		DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres); | ||||
| 		if (!fb_try_mode(var, info, &db[i], bpp)) { | ||||
| 			tdiff = abs(db[i].xres - xres) + | ||||
| 				abs(db[i].yres - yres); | ||||
| 		diff = 2 * (xres + yres); | ||||
| 		best = -1; | ||||
| 		DPRINTK("Trying best-fit modes\n"); | ||||
| 		for (i = 0; i < dbsize; i++) { | ||||
| 			DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres); | ||||
| 			if (!fb_try_mode(var, info, &db[i], bpp)) { | ||||
| 				tdiff = abs(db[i].xres - xres) + | ||||
| 					abs(db[i].yres - yres); | ||||
| 
 | ||||
| 			/*
 | ||||
| 			 * Penalize modes with resolutions smaller | ||||
| 			 * than requested. | ||||
| 			 */ | ||||
| 			if (xres > db[i].xres || yres > db[i].yres) | ||||
| 				tdiff += xres + yres; | ||||
| 				/*
 | ||||
| 				 * Penalize modes with resolutions smaller | ||||
| 				 * than requested. | ||||
| 				 */ | ||||
| 				if (xres > db[i].xres || yres > db[i].yres) | ||||
| 					tdiff += xres + yres; | ||||
| 
 | ||||
| 			if (diff > tdiff) { | ||||
| 				diff = tdiff; | ||||
| 				best = i; | ||||
| 				if (diff > tdiff) { | ||||
| 					diff = tdiff; | ||||
| 					best = i; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		if (best != -1) { | ||||
| 			fb_try_mode(var, info, &db[best], bpp); | ||||
| 			return 5; | ||||
| 		} | ||||
| 	} | ||||
| 	if (best != -1) { | ||||
| 	    fb_try_mode(var, info, &db[best], bpp); | ||||
| 	    return 5; | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|     DPRINTK("Trying default video mode\n"); | ||||
|     if (!fb_try_mode(var, info, default_mode, default_bpp)) | ||||
| 	return 3; | ||||
| 	DPRINTK("Trying default video mode\n"); | ||||
| 	if (!fb_try_mode(var, info, default_mode, default_bpp)) | ||||
| 		return 3; | ||||
| 
 | ||||
|     DPRINTK("Trying all modes\n"); | ||||
|     for (i = 0; i < dbsize; i++) | ||||
| 	if (!fb_try_mode(var, info, &db[i], default_bpp)) | ||||
| 	    return 4; | ||||
| 	DPRINTK("Trying all modes\n"); | ||||
| 	for (i = 0; i < dbsize; i++) | ||||
| 		if (!fb_try_mode(var, info, &db[i], default_bpp)) | ||||
| 			return 4; | ||||
| 
 | ||||
|     DPRINTK("No valid mode found\n"); | ||||
|     return 0; | ||||
| 	DPRINTK("No valid mode found\n"); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -715,7 +715,7 @@ static int __devinit mddi_probe(struct platform_device *pdev) | |||
| 
 | ||||
| 	mddi->int_enable = 0; | ||||
| 	mddi_writel(mddi->int_enable, INTEN); | ||||
| 	ret = request_irq(mddi->irq, mddi_isr, IRQF_DISABLED, "mddi", | ||||
| 	ret = request_irq(mddi->irq, mddi_isr, 0, "mddi", | ||||
| 			  &mddi->client_data); | ||||
| 	if (ret) { | ||||
| 		printk(KERN_ERR "mddi: failed to request enable irq!\n"); | ||||
|  |  | |||
|  | @ -421,10 +421,11 @@ int mdp_probe(struct platform_device *pdev) | |||
| 	clk = clk_get(&pdev->dev, "mdp_clk"); | ||||
| 	if (IS_ERR(clk)) { | ||||
| 		printk(KERN_INFO "mdp: failed to get mdp clk"); | ||||
| 		return PTR_ERR(clk); | ||||
| 		ret = PTR_ERR(clk); | ||||
| 		goto error_get_clk; | ||||
| 	} | ||||
| 
 | ||||
| 	ret = request_irq(mdp->irq, mdp_isr, IRQF_DISABLED, "msm_mdp", mdp); | ||||
| 	ret = request_irq(mdp->irq, mdp_isr, 0, "msm_mdp", mdp); | ||||
| 	if (ret) | ||||
| 		goto error_request_irq; | ||||
| 	disable_irq(mdp->irq); | ||||
|  | @ -495,6 +496,7 @@ int mdp_probe(struct platform_device *pdev) | |||
| error_device_register: | ||||
| 	free_irq(mdp->irq, mdp); | ||||
| error_request_irq: | ||||
| error_get_clk: | ||||
| 	iounmap(mdp->base); | ||||
| error_get_irq: | ||||
| error_ioremap: | ||||
|  |  | |||
|  | @ -382,6 +382,9 @@ static void sdc_disable_channel(struct mx3fb_info *mx3_fbi) | |||
| 	uint32_t enabled; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	if (mx3_fbi->txd == NULL) | ||||
| 		return; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&mx3fb->lock, flags); | ||||
| 
 | ||||
| 	enabled = sdc_fb_uninit(mx3_fbi); | ||||
|  | @ -986,9 +989,19 @@ static void __blank(int blank, struct fb_info *fbi) | |||
| { | ||||
| 	struct mx3fb_info *mx3_fbi = fbi->par; | ||||
| 	struct mx3fb_data *mx3fb = mx3_fbi->mx3fb; | ||||
| 	int was_blank = mx3_fbi->blank; | ||||
| 
 | ||||
| 	mx3_fbi->blank = blank; | ||||
| 
 | ||||
| 	/* Attention!
 | ||||
| 	 * Do not call sdc_disable_channel() for a channel that is disabled | ||||
| 	 * already! This will result in a kernel NULL pointer dereference | ||||
| 	 * (mx3_fbi->txd is NULL). Hide the fact, that all blank modes are | ||||
| 	 * handled equally by this driver. | ||||
| 	 */ | ||||
| 	if (blank > FB_BLANK_UNBLANK && was_blank > FB_BLANK_UNBLANK) | ||||
| 		return; | ||||
| 
 | ||||
| 	switch (blank) { | ||||
| 	case FB_BLANK_POWERDOWN: | ||||
| 	case FB_BLANK_VSYNC_SUSPEND: | ||||
|  | @ -1062,15 +1075,15 @@ static int mx3fb_pan_display(struct fb_var_screeninfo *var, | |||
| 	y_bottom = var->yoffset; | ||||
| 
 | ||||
| 	if (!(var->vmode & FB_VMODE_YWRAP)) | ||||
| 		y_bottom += var->yres; | ||||
| 		y_bottom += fbi->var.yres; | ||||
| 
 | ||||
| 	if (y_bottom > fbi->var.yres_virtual) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	mutex_lock(&mx3_fbi->mutex); | ||||
| 
 | ||||
| 	offset = (var->yoffset * var->xres_virtual + var->xoffset) * | ||||
| 		(var->bits_per_pixel / 8); | ||||
| 	offset = var->yoffset * fbi->fix.line_length | ||||
| 	       + var->xoffset * (fbi->var.bits_per_pixel / 8); | ||||
| 	base = fbi->fix.smem_start + offset; | ||||
| 
 | ||||
| 	dev_dbg(fbi->device, "Updating SDC BG buf %d address=0x%08lX\n", | ||||
|  |  | |||
|  | @ -39,6 +39,7 @@ | |||
|  * the required value in the imx_fb_videomode structure. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/clk.h> | ||||
|  |  | |||
|  | @ -1185,8 +1185,8 @@ static int neofb_pan_display(struct fb_var_screeninfo *var, | |||
| 
 | ||||
| 	DBG("neofb_update_start"); | ||||
| 
 | ||||
| 	Base = (var->yoffset * var->xres_virtual + var->xoffset) >> 2; | ||||
| 	Base *= (var->bits_per_pixel + 7) / 8; | ||||
| 	Base = (var->yoffset * info->var.xres_virtual + var->xoffset) >> 2; | ||||
| 	Base *= (info->var.bits_per_pixel + 7) / 8; | ||||
| 
 | ||||
| 	neoUnlock(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -39,7 +39,6 @@ | |||
| #include <mach/regs-clock.h> | ||||
| #include <mach/regs-ldm.h> | ||||
| #include <mach/fb.h> | ||||
| #include <mach/clkdev.h> | ||||
| 
 | ||||
| #include "nuc900fb.h" | ||||
| 
 | ||||
|  | @ -588,7 +587,7 @@ static int __devinit nuc900fb_probe(struct platform_device *pdev) | |||
| 	fbinfo->flags			= FBINFO_FLAG_DEFAULT; | ||||
| 	fbinfo->pseudo_palette		= &fbi->pseudo_pal; | ||||
| 
 | ||||
| 	ret = request_irq(irq, nuc900fb_irqhandler, IRQF_DISABLED, | ||||
| 	ret = request_irq(irq, nuc900fb_irqhandler, 0, | ||||
| 			  pdev->name, fbinfo); | ||||
| 	if (ret) { | ||||
| 		dev_err(&pdev->dev, "cannot register irq handler %d -err %d\n", | ||||
|  |  | |||
|  | @ -9,35 +9,6 @@ config FB_OMAP | |||
| 	help | ||||
|           Frame buffer driver for OMAP based boards. | ||||
| 
 | ||||
| config FB_OMAP_LCD_VGA | ||||
|         bool "Use LCD in VGA mode" | ||||
| 	        depends on MACH_OMAP_3430SDP || MACH_OMAP_LDP | ||||
| 		help | ||||
| 		  Set LCD resolution as VGA (640 X 480). | ||||
| 		  Default resolution without this option is QVGA(320 X 240). | ||||
| 		  Please take a look at drivers/video/omap/lcd_ldp.c file | ||||
| 		  for lcd driver code. | ||||
| choice | ||||
| 	depends on FB_OMAP && MACH_OVERO | ||||
| 	prompt "Screen resolution" | ||||
| 	default FB_OMAP_079M3R | ||||
| 	help | ||||
| 	  Selected desired screen resolution | ||||
| 
 | ||||
| config FB_OMAP_031M3R | ||||
| 	boolean "640 x 480 @ 60 Hz Reduced blanking" | ||||
| 
 | ||||
| config FB_OMAP_048M3R | ||||
| 	boolean "800 x 600 @ 60 Hz Reduced blanking" | ||||
| 
 | ||||
| config FB_OMAP_079M3R | ||||
| 	boolean "1024 x 768 @ 60 Hz Reduced blanking" | ||||
| 
 | ||||
| config FB_OMAP_092M9R | ||||
| 	boolean "1280 x 720 @ 60 Hz Reduced blanking" | ||||
| 
 | ||||
| endchoice | ||||
| 
 | ||||
| config FB_OMAP_LCDC_EXTERNAL | ||||
| 	bool "External LCD controller support" | ||||
| 	depends on FB_OMAP | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ objs-y$(CONFIG_FB_OMAP_LCDC_HWA742) += hwa742.o | |||
| objs-y$(CONFIG_FB_OMAP_LCDC_BLIZZARD) += blizzard.o | ||||
| 
 | ||||
| objs-y$(CONFIG_MACH_AMS_DELTA) += lcd_ams_delta.o | ||||
| objs-y$(CONFIG_MACH_OMAP_H4) += lcd_h4.o | ||||
| objs-y$(CONFIG_MACH_OMAP_H3) += lcd_h3.o | ||||
| objs-y$(CONFIG_MACH_OMAP_PALMTE) += lcd_palmte.o | ||||
| objs-y$(CONFIG_MACH_OMAP_PALMTT) += lcd_palmtt.o | ||||
|  | @ -26,14 +25,7 @@ objs-$(CONFIG_ARCH_OMAP16XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1610.o | |||
| objs-$(CONFIG_ARCH_OMAP15XX)$(CONFIG_MACH_OMAP_INNOVATOR) += lcd_inn1510.o | ||||
| objs-y$(CONFIG_MACH_OMAP_OSK) += lcd_osk.o | ||||
| 
 | ||||
| objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o | ||||
| objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o | ||||
| objs-y$(CONFIG_MACH_OMAP_3430SDP) += lcd_2430sdp.o | ||||
| objs-y$(CONFIG_MACH_OMAP_LDP) += lcd_ldp.o | ||||
| objs-y$(CONFIG_MACH_OMAP3EVM) += lcd_omap3evm.o | ||||
| objs-y$(CONFIG_MACH_OMAP3_BEAGLE) += lcd_omap3beagle.o | ||||
| objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o | ||||
| objs-y$(CONFIG_MACH_OVERO) += lcd_overo.o | ||||
| objs-y$(CONFIG_MACH_HERALD) += lcd_htcherald.o | ||||
| 
 | ||||
| omapfb-objs := $(objs-yy) | ||||
|  |  | |||
|  | @ -1,203 +0,0 @@ | |||
| /*
 | ||||
|  * LCD panel support for the TI 2430SDP board | ||||
|  * | ||||
|  * Copyright (C) 2007 MontaVista | ||||
|  * Author: Hunyue Yau <hyau@mvista.com> | ||||
|  * | ||||
|  * Derived from drivers/video/omap/lcd-apollon.c | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/i2c/twl.h> | ||||
| 
 | ||||
| #include <plat/mux.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "omapfb.h" | ||||
| 
 | ||||
| #define SDP2430_LCD_PANEL_BACKLIGHT_GPIO	91 | ||||
| #define SDP2430_LCD_PANEL_ENABLE_GPIO		154 | ||||
| #define SDP3430_LCD_PANEL_BACKLIGHT_GPIO	24 | ||||
| #define SDP3430_LCD_PANEL_ENABLE_GPIO		28 | ||||
| 
 | ||||
| static unsigned backlight_gpio; | ||||
| static unsigned enable_gpio; | ||||
| 
 | ||||
| #define LCD_PIXCLOCK_MAX		5400 /* freq 5.4 MHz */ | ||||
| #define PM_RECEIVER             TWL4030_MODULE_PM_RECEIVER | ||||
| #define ENABLE_VAUX2_DEDICATED  0x09 | ||||
| #define ENABLE_VAUX2_DEV_GRP    0x20 | ||||
| #define ENABLE_VAUX3_DEDICATED	0x03 | ||||
| #define ENABLE_VAUX3_DEV_GRP	0x20 | ||||
| 
 | ||||
| #define ENABLE_VPLL2_DEDICATED          0x05 | ||||
| #define ENABLE_VPLL2_DEV_GRP            0xE0 | ||||
| #define TWL4030_VPLL2_DEV_GRP           0x33 | ||||
| #define TWL4030_VPLL2_DEDICATED         0x36 | ||||
| 
 | ||||
| #define t2_out(c, r, v) twl_i2c_write_u8(c, r, v) | ||||
| 
 | ||||
| 
 | ||||
| static int sdp2430_panel_init(struct lcd_panel *panel, | ||||
| 				struct omapfb_device *fbdev) | ||||
| { | ||||
| 	if (machine_is_omap_3430sdp()) { | ||||
| 		enable_gpio    = SDP3430_LCD_PANEL_ENABLE_GPIO; | ||||
| 		backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; | ||||
| 	} else { | ||||
| 		enable_gpio    = SDP2430_LCD_PANEL_ENABLE_GPIO; | ||||
| 		backlight_gpio = SDP2430_LCD_PANEL_BACKLIGHT_GPIO; | ||||
| 	} | ||||
| 
 | ||||
| 	gpio_request(enable_gpio, "LCD enable");	/* LCD panel */ | ||||
| 	gpio_request(backlight_gpio, "LCD bl");		/* LCD backlight */ | ||||
| 	gpio_direction_output(enable_gpio, 0); | ||||
| 	gpio_direction_output(backlight_gpio, 0); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void sdp2430_panel_cleanup(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_free(backlight_gpio); | ||||
| 	gpio_free(enable_gpio); | ||||
| } | ||||
| 
 | ||||
| static int sdp2430_panel_enable(struct lcd_panel *panel) | ||||
| { | ||||
| 	u8 ded_val, ded_reg; | ||||
| 	u8 grp_val, grp_reg; | ||||
| 
 | ||||
| 	if (machine_is_omap_3430sdp()) { | ||||
| 		ded_reg = TWL4030_VAUX3_DEDICATED; | ||||
| 		ded_val = ENABLE_VAUX3_DEDICATED; | ||||
| 		grp_reg = TWL4030_VAUX3_DEV_GRP; | ||||
| 		grp_val = ENABLE_VAUX3_DEV_GRP; | ||||
| 
 | ||||
| 		if (omap_rev() > OMAP3430_REV_ES1_0) { | ||||
| 			t2_out(PM_RECEIVER, ENABLE_VPLL2_DEDICATED, | ||||
| 					TWL4030_VPLL2_DEDICATED); | ||||
| 			t2_out(PM_RECEIVER, ENABLE_VPLL2_DEV_GRP, | ||||
| 					TWL4030_VPLL2_DEV_GRP); | ||||
| 		} | ||||
| 	} else { | ||||
| 		ded_reg = TWL4030_VAUX2_DEDICATED; | ||||
| 		ded_val = ENABLE_VAUX2_DEDICATED; | ||||
| 		grp_reg = TWL4030_VAUX2_DEV_GRP; | ||||
| 		grp_val = ENABLE_VAUX2_DEV_GRP; | ||||
| 	} | ||||
| 
 | ||||
| 	gpio_set_value(enable_gpio, 1); | ||||
| 	gpio_set_value(backlight_gpio, 1); | ||||
| 
 | ||||
| 	if (0 != t2_out(PM_RECEIVER, ded_val, ded_reg)) | ||||
| 		return -EIO; | ||||
| 	if (0 != t2_out(PM_RECEIVER, grp_val, grp_reg)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void sdp2430_panel_disable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_set_value(enable_gpio, 0); | ||||
| 	gpio_set_value(backlight_gpio, 0); | ||||
| 	if (omap_rev() > OMAP3430_REV_ES1_0) { | ||||
| 		t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEDICATED); | ||||
| 		t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEV_GRP); | ||||
| 		msleep(4); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static unsigned long sdp2430_panel_get_caps(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct lcd_panel sdp2430_panel = { | ||||
| 	.name		= "sdp2430", | ||||
| 	.config		= OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | | ||||
| 			  OMAP_LCDC_INV_HSYNC, | ||||
| 
 | ||||
| 	.bpp		= 16, | ||||
| 	.data_lines	= 16, | ||||
| 	.x_res		= 240, | ||||
| 	.y_res		= 320, | ||||
| 	.hsw		= 3,		/* hsync_len (4) - 1 */ | ||||
| 	.hfp		= 3,		/* right_margin (4) - 1 */ | ||||
| 	.hbp		= 39,		/* left_margin (40) - 1 */ | ||||
| 	.vsw		= 1,		/* vsync_len (2) - 1 */ | ||||
| 	.vfp		= 2,		/* lower_margin */ | ||||
| 	.vbp		= 7,		/* upper_margin (8) - 1 */ | ||||
| 
 | ||||
| 	.pixel_clock	= LCD_PIXCLOCK_MAX, | ||||
| 
 | ||||
| 	.init		= sdp2430_panel_init, | ||||
| 	.cleanup	= sdp2430_panel_cleanup, | ||||
| 	.enable		= sdp2430_panel_enable, | ||||
| 	.disable	= sdp2430_panel_disable, | ||||
| 	.get_caps	= sdp2430_panel_get_caps, | ||||
| }; | ||||
| 
 | ||||
| static int sdp2430_panel_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	omapfb_register_panel(&sdp2430_panel); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int sdp2430_panel_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int sdp2430_panel_suspend(struct platform_device *pdev, | ||||
| 					pm_message_t mesg) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int sdp2430_panel_resume(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct platform_driver sdp2430_panel_driver = { | ||||
| 	.probe		= sdp2430_panel_probe, | ||||
| 	.remove		= sdp2430_panel_remove, | ||||
| 	.suspend	= sdp2430_panel_suspend, | ||||
| 	.resume		= sdp2430_panel_resume, | ||||
| 	.driver		= { | ||||
| 		.name	= "sdp2430_lcd", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init sdp2430_panel_drv_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&sdp2430_panel_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit sdp2430_panel_drv_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&sdp2430_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(sdp2430_panel_drv_init); | ||||
| module_exit(sdp2430_panel_drv_exit); | ||||
|  | @ -1,136 +0,0 @@ | |||
| /*
 | ||||
|  * LCD panel support for the Samsung OMAP2 Apollon board | ||||
|  * | ||||
|  * Copyright (C) 2005,2006 Samsung Electronics | ||||
|  * Author: Kyungmin Park <kyungmin.park@samsung.com> | ||||
|  * | ||||
|  * Derived from drivers/video/omap/lcd-h4.c | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| #include <asm/gpio.h> | ||||
| 
 | ||||
| #include "omapfb.h" | ||||
| 
 | ||||
| /* #define USE_35INCH_LCD 1 */ | ||||
| 
 | ||||
| static int apollon_panel_init(struct lcd_panel *panel, | ||||
| 				struct omapfb_device *fbdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void apollon_panel_cleanup(struct lcd_panel *panel) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| static int apollon_panel_enable(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void apollon_panel_disable(struct lcd_panel *panel) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| static unsigned long apollon_panel_get_caps(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct lcd_panel apollon_panel = { | ||||
| 	.name		= "apollon", | ||||
| 	.config		= OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | | ||||
| 			  OMAP_LCDC_INV_HSYNC, | ||||
| 
 | ||||
| 	.bpp		= 16, | ||||
| 	.data_lines	= 18, | ||||
| #ifdef USE_35INCH_LCD | ||||
| 	.x_res		= 240, | ||||
| 	.y_res		= 320, | ||||
| 	.hsw		= 2, | ||||
| 	.hfp		= 3, | ||||
| 	.hbp		= 9, | ||||
| 	.vsw		= 4, | ||||
| 	.vfp		= 3, | ||||
| 	.vbp		= 5, | ||||
| #else | ||||
| 	.x_res		= 480, | ||||
| 	.y_res		= 272, | ||||
| 	.hsw		= 41, | ||||
| 	.hfp		= 2, | ||||
| 	.hbp		= 2, | ||||
| 	.vsw		= 10, | ||||
| 	.vfp		= 2, | ||||
| 	.vbp		= 2, | ||||
| #endif | ||||
| 	.pixel_clock	= 6250, | ||||
| 
 | ||||
| 	.init		= apollon_panel_init, | ||||
| 	.cleanup	= apollon_panel_cleanup, | ||||
| 	.enable		= apollon_panel_enable, | ||||
| 	.disable	= apollon_panel_disable, | ||||
| 	.get_caps	= apollon_panel_get_caps, | ||||
| }; | ||||
| 
 | ||||
| static int apollon_panel_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	omapfb_register_panel(&apollon_panel); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int apollon_panel_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int apollon_panel_suspend(struct platform_device *pdev, | ||||
| 				  pm_message_t mesg) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int apollon_panel_resume(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct platform_driver apollon_panel_driver = { | ||||
| 	.probe		= apollon_panel_probe, | ||||
| 	.remove		= apollon_panel_remove, | ||||
| 	.suspend	= apollon_panel_suspend, | ||||
| 	.resume		= apollon_panel_resume, | ||||
| 	.driver		= { | ||||
| 		.name	= "apollon_lcd", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init apollon_panel_drv_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&apollon_panel_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit apollon_panel_drv_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&apollon_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(apollon_panel_drv_init); | ||||
| module_exit(apollon_panel_drv_exit); | ||||
|  | @ -1,117 +0,0 @@ | |||
| /*
 | ||||
|  * LCD panel support for the TI OMAP H4 board | ||||
|  * | ||||
|  * Copyright (C) 2004 Nokia Corporation | ||||
|  * Author: Imre Deak <imre.deak@nokia.com> | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| 
 | ||||
| #include "omapfb.h" | ||||
| 
 | ||||
| static int h4_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void h4_panel_cleanup(struct lcd_panel *panel) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| static int h4_panel_enable(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void h4_panel_disable(struct lcd_panel *panel) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| static unsigned long h4_panel_get_caps(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct lcd_panel h4_panel = { | ||||
| 	.name		= "h4", | ||||
| 	.config		= OMAP_LCDC_PANEL_TFT, | ||||
| 
 | ||||
| 	.bpp		= 16, | ||||
| 	.data_lines	= 16, | ||||
| 	.x_res		= 240, | ||||
| 	.y_res		= 320, | ||||
| 	.pixel_clock	= 6250, | ||||
| 	.hsw		= 15, | ||||
| 	.hfp		= 15, | ||||
| 	.hbp		= 60, | ||||
| 	.vsw		= 1, | ||||
| 	.vfp		= 1, | ||||
| 	.vbp		= 1, | ||||
| 
 | ||||
| 	.init		= h4_panel_init, | ||||
| 	.cleanup	= h4_panel_cleanup, | ||||
| 	.enable		= h4_panel_enable, | ||||
| 	.disable	= h4_panel_disable, | ||||
| 	.get_caps	= h4_panel_get_caps, | ||||
| }; | ||||
| 
 | ||||
| static int h4_panel_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	omapfb_register_panel(&h4_panel); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int h4_panel_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int h4_panel_suspend(struct platform_device *pdev, pm_message_t mesg) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int h4_panel_resume(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver h4_panel_driver = { | ||||
| 	.probe		= h4_panel_probe, | ||||
| 	.remove		= h4_panel_remove, | ||||
| 	.suspend	= h4_panel_suspend, | ||||
| 	.resume		= h4_panel_resume, | ||||
| 	.driver		= { | ||||
| 		.name	= "lcd_h4", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init h4_panel_drv_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&h4_panel_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit h4_panel_drv_cleanup(void) | ||||
| { | ||||
| 	platform_driver_unregister(&h4_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(h4_panel_drv_init); | ||||
| module_exit(h4_panel_drv_cleanup); | ||||
| 
 | ||||
|  | @ -1,201 +0,0 @@ | |||
| /*
 | ||||
|  * LCD panel support for the TI LDP board | ||||
|  * | ||||
|  * Copyright (C) 2007 WindRiver | ||||
|  * Author: Stanley Miao <stanley.miao@windriver.com> | ||||
|  * | ||||
|  * Derived from drivers/video/omap/lcd-2430sdp.c | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/i2c/twl.h> | ||||
| 
 | ||||
| #include <asm/gpio.h> | ||||
| #include <plat/mux.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "omapfb.h" | ||||
| 
 | ||||
| #define LCD_PANEL_BACKLIGHT_GPIO	(15 + OMAP_MAX_GPIO_LINES) | ||||
| #define LCD_PANEL_ENABLE_GPIO		(7 + OMAP_MAX_GPIO_LINES) | ||||
| 
 | ||||
| #define LCD_PANEL_RESET_GPIO		55 | ||||
| #define LCD_PANEL_QVGA_GPIO		56 | ||||
| 
 | ||||
| #ifdef CONFIG_FB_OMAP_LCD_VGA | ||||
| #define LCD_XRES		480 | ||||
| #define LCD_YRES		640 | ||||
| #define LCD_PIXCLOCK_MAX	41700 | ||||
| #else | ||||
| #define LCD_XRES		240 | ||||
| #define LCD_YRES		320 | ||||
| #define LCD_PIXCLOCK_MAX	185186 | ||||
| #endif | ||||
| 
 | ||||
| #define PM_RECEIVER             TWL4030_MODULE_PM_RECEIVER | ||||
| #define ENABLE_VAUX2_DEDICATED  0x09 | ||||
| #define ENABLE_VAUX2_DEV_GRP    0x20 | ||||
| #define ENABLE_VAUX3_DEDICATED	0x03 | ||||
| #define ENABLE_VAUX3_DEV_GRP	0x20 | ||||
| 
 | ||||
| #define ENABLE_VPLL2_DEDICATED          0x05 | ||||
| #define ENABLE_VPLL2_DEV_GRP            0xE0 | ||||
| #define TWL4030_VPLL2_DEV_GRP           0x33 | ||||
| #define TWL4030_VPLL2_DEDICATED         0x36 | ||||
| 
 | ||||
| #define t2_out(c, r, v) twl_i2c_write_u8(c, r, v) | ||||
| 
 | ||||
| 
 | ||||
| static int ldp_panel_init(struct lcd_panel *panel, | ||||
| 				struct omapfb_device *fbdev) | ||||
| { | ||||
| 	gpio_request(LCD_PANEL_RESET_GPIO, "lcd reset"); | ||||
| 	gpio_request(LCD_PANEL_QVGA_GPIO, "lcd qvga"); | ||||
| 	gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd panel"); | ||||
| 	gpio_request(LCD_PANEL_BACKLIGHT_GPIO, "lcd backlight"); | ||||
| 
 | ||||
| 	gpio_direction_output(LCD_PANEL_QVGA_GPIO, 0); | ||||
| 	gpio_direction_output(LCD_PANEL_RESET_GPIO, 0); | ||||
| 	gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); | ||||
| 	gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 0); | ||||
| 
 | ||||
| #ifdef CONFIG_FB_OMAP_LCD_VGA | ||||
| 	gpio_set_value(LCD_PANEL_QVGA_GPIO, 0); | ||||
| #else | ||||
| 	gpio_set_value(LCD_PANEL_QVGA_GPIO, 1); | ||||
| #endif | ||||
| 	gpio_set_value(LCD_PANEL_RESET_GPIO, 1); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void ldp_panel_cleanup(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_free(LCD_PANEL_BACKLIGHT_GPIO); | ||||
| 	gpio_free(LCD_PANEL_ENABLE_GPIO); | ||||
| 	gpio_free(LCD_PANEL_QVGA_GPIO); | ||||
| 	gpio_free(LCD_PANEL_RESET_GPIO); | ||||
| } | ||||
| 
 | ||||
| static int ldp_panel_enable(struct lcd_panel *panel) | ||||
| { | ||||
| 	if (0 != t2_out(PM_RECEIVER, ENABLE_VPLL2_DEDICATED, | ||||
| 			TWL4030_VPLL2_DEDICATED)) | ||||
| 		return -EIO; | ||||
| 	if (0 != t2_out(PM_RECEIVER, ENABLE_VPLL2_DEV_GRP, | ||||
| 			TWL4030_VPLL2_DEV_GRP)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1); | ||||
| 	gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 1); | ||||
| 
 | ||||
| 	if (0 != t2_out(PM_RECEIVER, ENABLE_VAUX3_DEDICATED, | ||||
| 				TWL4030_VAUX3_DEDICATED)) | ||||
| 		return -EIO; | ||||
| 	if (0 != t2_out(PM_RECEIVER, ENABLE_VAUX3_DEV_GRP, | ||||
| 				TWL4030_VAUX3_DEV_GRP)) | ||||
| 		return -EIO; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void ldp_panel_disable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0); | ||||
| 	gpio_direction_output(LCD_PANEL_BACKLIGHT_GPIO, 0); | ||||
| 
 | ||||
| 	t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEDICATED); | ||||
| 	t2_out(PM_RECEIVER, 0x0, TWL4030_VPLL2_DEV_GRP); | ||||
| 	msleep(4); | ||||
| } | ||||
| 
 | ||||
| static unsigned long ldp_panel_get_caps(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct lcd_panel ldp_panel = { | ||||
| 	.name		= "ldp", | ||||
| 	.config		= OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | | ||||
| 			  OMAP_LCDC_INV_HSYNC, | ||||
| 
 | ||||
| 	.bpp		= 16, | ||||
| 	.data_lines	= 18, | ||||
| 	.x_res		= LCD_XRES, | ||||
| 	.y_res		= LCD_YRES, | ||||
| 	.hsw		= 3,		/* hsync_len (4) - 1 */ | ||||
| 	.hfp		= 3,		/* right_margin (4) - 1 */ | ||||
| 	.hbp		= 39,		/* left_margin (40) - 1 */ | ||||
| 	.vsw		= 1,		/* vsync_len (2) - 1 */ | ||||
| 	.vfp		= 2,		/* lower_margin */ | ||||
| 	.vbp		= 7,		/* upper_margin (8) - 1 */ | ||||
| 
 | ||||
| 	.pixel_clock	= LCD_PIXCLOCK_MAX, | ||||
| 
 | ||||
| 	.init		= ldp_panel_init, | ||||
| 	.cleanup	= ldp_panel_cleanup, | ||||
| 	.enable		= ldp_panel_enable, | ||||
| 	.disable	= ldp_panel_disable, | ||||
| 	.get_caps	= ldp_panel_get_caps, | ||||
| }; | ||||
| 
 | ||||
| static int ldp_panel_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	omapfb_register_panel(&ldp_panel); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ldp_panel_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ldp_panel_suspend(struct platform_device *pdev, pm_message_t mesg) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int ldp_panel_resume(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct platform_driver ldp_panel_driver = { | ||||
| 	.probe		= ldp_panel_probe, | ||||
| 	.remove		= ldp_panel_remove, | ||||
| 	.suspend	= ldp_panel_suspend, | ||||
| 	.resume		= ldp_panel_resume, | ||||
| 	.driver		= { | ||||
| 		.name	= "ldp_lcd", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init ldp_panel_drv_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&ldp_panel_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit ldp_panel_drv_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&ldp_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(ldp_panel_drv_init); | ||||
| module_exit(ldp_panel_drv_exit); | ||||
|  | @ -1,130 +0,0 @@ | |||
| /*
 | ||||
|  * LCD panel support for the TI OMAP3 Beagle board | ||||
|  * | ||||
|  * Author: Koen Kooi <koen@openembedded.org> | ||||
|  * | ||||
|  * Derived from drivers/video/omap/lcd-omap3evm.c | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/i2c/twl.h> | ||||
| 
 | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "omapfb.h" | ||||
| 
 | ||||
| #define LCD_PANEL_ENABLE_GPIO       170 | ||||
| 
 | ||||
| static int omap3beagle_panel_init(struct lcd_panel *panel, | ||||
| 				struct omapfb_device *fbdev) | ||||
| { | ||||
| 	gpio_request(LCD_PANEL_ENABLE_GPIO, "LCD enable"); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void omap3beagle_panel_cleanup(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_free(LCD_PANEL_ENABLE_GPIO); | ||||
| } | ||||
| 
 | ||||
| static int omap3beagle_panel_enable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_set_value(LCD_PANEL_ENABLE_GPIO, 1); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void omap3beagle_panel_disable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_set_value(LCD_PANEL_ENABLE_GPIO, 0); | ||||
| } | ||||
| 
 | ||||
| static unsigned long omap3beagle_panel_get_caps(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct lcd_panel omap3beagle_panel = { | ||||
| 	.name		= "omap3beagle", | ||||
| 	.config		= OMAP_LCDC_PANEL_TFT, | ||||
| 
 | ||||
| 	.bpp		= 16, | ||||
| 	.data_lines	= 24, | ||||
| 	.x_res		= 1024, | ||||
| 	.y_res		= 768, | ||||
| 	.hsw		= 3,		/* hsync_len (4) - 1 */ | ||||
| 	.hfp		= 3,		/* right_margin (4) - 1 */ | ||||
| 	.hbp		= 39,		/* left_margin (40) - 1 */ | ||||
| 	.vsw		= 1,		/* vsync_len (2) - 1 */ | ||||
| 	.vfp		= 2,		/* lower_margin */ | ||||
| 	.vbp		= 7,		/* upper_margin (8) - 1 */ | ||||
| 
 | ||||
| 	.pixel_clock	= 64000, | ||||
| 
 | ||||
| 	.init		= omap3beagle_panel_init, | ||||
| 	.cleanup	= omap3beagle_panel_cleanup, | ||||
| 	.enable		= omap3beagle_panel_enable, | ||||
| 	.disable	= omap3beagle_panel_disable, | ||||
| 	.get_caps	= omap3beagle_panel_get_caps, | ||||
| }; | ||||
| 
 | ||||
| static int omap3beagle_panel_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	omapfb_register_panel(&omap3beagle_panel); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap3beagle_panel_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap3beagle_panel_suspend(struct platform_device *pdev, | ||||
| 				   pm_message_t mesg) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap3beagle_panel_resume(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct platform_driver omap3beagle_panel_driver = { | ||||
| 	.probe		= omap3beagle_panel_probe, | ||||
| 	.remove		= omap3beagle_panel_remove, | ||||
| 	.suspend	= omap3beagle_panel_suspend, | ||||
| 	.resume		= omap3beagle_panel_resume, | ||||
| 	.driver		= { | ||||
| 		.name	= "omap3beagle_lcd", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init omap3beagle_panel_drv_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&omap3beagle_panel_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit omap3beagle_panel_drv_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&omap3beagle_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(omap3beagle_panel_drv_init); | ||||
| module_exit(omap3beagle_panel_drv_exit); | ||||
|  | @ -1,193 +0,0 @@ | |||
| /*
 | ||||
|  * LCD panel support for the TI OMAP3 EVM board | ||||
|  * | ||||
|  * Author: Steve Sakoman <steve@sakoman.com> | ||||
|  * | ||||
|  * Derived from drivers/video/omap/lcd-apollon.c | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/i2c/twl.h> | ||||
| 
 | ||||
| #include <plat/mux.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "omapfb.h" | ||||
| 
 | ||||
| #define LCD_PANEL_ENABLE_GPIO       153 | ||||
| #define LCD_PANEL_LR                2 | ||||
| #define LCD_PANEL_UD                3 | ||||
| #define LCD_PANEL_INI               152 | ||||
| #define LCD_PANEL_QVGA              154 | ||||
| #define LCD_PANEL_RESB              155 | ||||
| 
 | ||||
| #define ENABLE_VDAC_DEDICATED	0x03 | ||||
| #define ENABLE_VDAC_DEV_GRP	0x20 | ||||
| #define ENABLE_VPLL2_DEDICATED	0x05 | ||||
| #define ENABLE_VPLL2_DEV_GRP	0xE0 | ||||
| 
 | ||||
| #define TWL_LED_LEDEN		0x00 | ||||
| #define TWL_PWMA_PWMAON		0x00 | ||||
| #define TWL_PWMA_PWMAOFF	0x01 | ||||
| 
 | ||||
| static unsigned int bklight_level; | ||||
| 
 | ||||
| static int omap3evm_panel_init(struct lcd_panel *panel, | ||||
| 				struct omapfb_device *fbdev) | ||||
| { | ||||
| 	gpio_request(LCD_PANEL_LR, "LCD lr"); | ||||
| 	gpio_request(LCD_PANEL_UD, "LCD ud"); | ||||
| 	gpio_request(LCD_PANEL_INI, "LCD ini"); | ||||
| 	gpio_request(LCD_PANEL_RESB, "LCD resb"); | ||||
| 	gpio_request(LCD_PANEL_QVGA, "LCD qvga"); | ||||
| 
 | ||||
| 	gpio_direction_output(LCD_PANEL_RESB, 1); | ||||
| 	gpio_direction_output(LCD_PANEL_INI, 1); | ||||
| 	gpio_direction_output(LCD_PANEL_QVGA, 0); | ||||
| 	gpio_direction_output(LCD_PANEL_LR, 1); | ||||
| 	gpio_direction_output(LCD_PANEL_UD, 1); | ||||
| 
 | ||||
| 	twl_i2c_write_u8(TWL4030_MODULE_LED, 0x11, TWL_LED_LEDEN); | ||||
| 	twl_i2c_write_u8(TWL4030_MODULE_PWMA, 0x01, TWL_PWMA_PWMAON); | ||||
| 	twl_i2c_write_u8(TWL4030_MODULE_PWMA, 0x02, TWL_PWMA_PWMAOFF); | ||||
| 	bklight_level = 100; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void omap3evm_panel_cleanup(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_free(LCD_PANEL_QVGA); | ||||
| 	gpio_free(LCD_PANEL_RESB); | ||||
| 	gpio_free(LCD_PANEL_INI); | ||||
| 	gpio_free(LCD_PANEL_UD); | ||||
| 	gpio_free(LCD_PANEL_LR); | ||||
| } | ||||
| 
 | ||||
| static int omap3evm_panel_enable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_set_value(LCD_PANEL_ENABLE_GPIO, 0); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void omap3evm_panel_disable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_set_value(LCD_PANEL_ENABLE_GPIO, 1); | ||||
| } | ||||
| 
 | ||||
| static unsigned long omap3evm_panel_get_caps(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap3evm_bklight_setlevel(struct lcd_panel *panel, | ||||
| 						unsigned int level) | ||||
| { | ||||
| 	u8 c; | ||||
| 	if ((level >= 0) && (level <= 100)) { | ||||
| 		c = (125 * (100 - level)) / 100 + 2; | ||||
| 		twl_i2c_write_u8(TWL4030_MODULE_PWMA, c, TWL_PWMA_PWMAOFF); | ||||
| 		bklight_level = level; | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static unsigned int omap3evm_bklight_getlevel(struct lcd_panel *panel) | ||||
| { | ||||
| 	return bklight_level; | ||||
| } | ||||
| 
 | ||||
| static unsigned int omap3evm_bklight_getmaxlevel(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 100; | ||||
| } | ||||
| 
 | ||||
| struct lcd_panel omap3evm_panel = { | ||||
| 	.name		= "omap3evm", | ||||
| 	.config		= OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC | | ||||
| 			  OMAP_LCDC_INV_HSYNC, | ||||
| 
 | ||||
| 	.bpp		= 16, | ||||
| 	.data_lines	= 18, | ||||
| 	.x_res		= 480, | ||||
| 	.y_res		= 640, | ||||
| 	.hsw		= 3,		/* hsync_len (4) - 1 */ | ||||
| 	.hfp		= 3,		/* right_margin (4) - 1 */ | ||||
| 	.hbp		= 39,		/* left_margin (40) - 1 */ | ||||
| 	.vsw		= 1,		/* vsync_len (2) - 1 */ | ||||
| 	.vfp		= 2,		/* lower_margin */ | ||||
| 	.vbp		= 7,		/* upper_margin (8) - 1 */ | ||||
| 
 | ||||
| 	.pixel_clock	= 26000, | ||||
| 
 | ||||
| 	.init		= omap3evm_panel_init, | ||||
| 	.cleanup	= omap3evm_panel_cleanup, | ||||
| 	.enable		= omap3evm_panel_enable, | ||||
| 	.disable	= omap3evm_panel_disable, | ||||
| 	.get_caps	= omap3evm_panel_get_caps, | ||||
| 	.set_bklight_level      = omap3evm_bklight_setlevel, | ||||
| 	.get_bklight_level      = omap3evm_bklight_getlevel, | ||||
| 	.get_bklight_max        = omap3evm_bklight_getmaxlevel, | ||||
| }; | ||||
| 
 | ||||
| static int omap3evm_panel_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	omapfb_register_panel(&omap3evm_panel); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap3evm_panel_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap3evm_panel_suspend(struct platform_device *pdev, | ||||
| 				   pm_message_t mesg) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int omap3evm_panel_resume(struct platform_device *pdev) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct platform_driver omap3evm_panel_driver = { | ||||
| 	.probe		= omap3evm_panel_probe, | ||||
| 	.remove		= omap3evm_panel_remove, | ||||
| 	.suspend	= omap3evm_panel_suspend, | ||||
| 	.resume		= omap3evm_panel_resume, | ||||
| 	.driver		= { | ||||
| 		.name	= "omap3evm_lcd", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init omap3evm_panel_drv_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&omap3evm_panel_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit omap3evm_panel_drv_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&omap3evm_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(omap3evm_panel_drv_init); | ||||
| module_exit(omap3evm_panel_drv_exit); | ||||
|  | @ -1,180 +0,0 @@ | |||
| /*
 | ||||
|  * LCD panel support for the Gumstix Overo | ||||
|  * | ||||
|  * Author: Steve Sakoman <steve@sakoman.com> | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify it | ||||
|  * under the terms of the GNU General Public License as published by the | ||||
|  * Free Software Foundation; either version 2 of the License, or (at your | ||||
|  * option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, but | ||||
|  * WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  * General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/i2c/twl.h> | ||||
| 
 | ||||
| #include <asm/gpio.h> | ||||
| #include <plat/mux.h> | ||||
| #include <asm/mach-types.h> | ||||
| 
 | ||||
| #include "omapfb.h" | ||||
| 
 | ||||
| #define LCD_ENABLE       144 | ||||
| 
 | ||||
| static int overo_panel_init(struct lcd_panel *panel, | ||||
| 				struct omapfb_device *fbdev) | ||||
| { | ||||
| 	if ((gpio_request(LCD_ENABLE, "LCD_ENABLE") == 0) && | ||||
| 	    (gpio_direction_output(LCD_ENABLE, 1) == 0)) | ||||
| 		gpio_export(LCD_ENABLE, 0); | ||||
| 	else | ||||
| 		printk(KERN_ERR "could not obtain gpio for LCD_ENABLE\n"); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void overo_panel_cleanup(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_free(LCD_ENABLE); | ||||
| } | ||||
| 
 | ||||
| static int overo_panel_enable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_set_value(LCD_ENABLE, 1); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void overo_panel_disable(struct lcd_panel *panel) | ||||
| { | ||||
| 	gpio_set_value(LCD_ENABLE, 0); | ||||
| } | ||||
| 
 | ||||
| static unsigned long overo_panel_get_caps(struct lcd_panel *panel) | ||||
| { | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct lcd_panel overo_panel = { | ||||
| 	.name		= "overo", | ||||
| 	.config		= OMAP_LCDC_PANEL_TFT, | ||||
| 	.bpp		= 16, | ||||
| 	.data_lines	= 24, | ||||
| 
 | ||||
| #if defined CONFIG_FB_OMAP_031M3R | ||||
| 
 | ||||
| 	/* 640 x 480 @ 60 Hz  Reduced blanking VESA CVT 0.31M3-R */ | ||||
| 	.x_res		= 640, | ||||
| 	.y_res		= 480, | ||||
| 	.hfp		= 48, | ||||
| 	.hsw		= 32, | ||||
| 	.hbp		= 80, | ||||
| 	.vfp		= 3, | ||||
| 	.vsw		= 4, | ||||
| 	.vbp		= 7, | ||||
| 	.pixel_clock	= 23500, | ||||
| 
 | ||||
| #elif defined CONFIG_FB_OMAP_048M3R | ||||
| 
 | ||||
| 	/* 800 x 600 @ 60 Hz  Reduced blanking VESA CVT 0.48M3-R */ | ||||
| 	.x_res		= 800, | ||||
| 	.y_res		= 600, | ||||
| 	.hfp		= 48, | ||||
| 	.hsw		= 32, | ||||
| 	.hbp		= 80, | ||||
| 	.vfp		= 3, | ||||
| 	.vsw		= 4, | ||||
| 	.vbp		= 11, | ||||
| 	.pixel_clock	= 35500, | ||||
| 
 | ||||
| #elif defined CONFIG_FB_OMAP_079M3R | ||||
| 
 | ||||
| 	/* 1024 x 768 @ 60 Hz  Reduced blanking VESA CVT 0.79M3-R */ | ||||
| 	.x_res		= 1024, | ||||
| 	.y_res		= 768, | ||||
| 	.hfp		= 48, | ||||
| 	.hsw		= 32, | ||||
| 	.hbp		= 80, | ||||
| 	.vfp		= 3, | ||||
| 	.vsw		= 4, | ||||
| 	.vbp		= 15, | ||||
| 	.pixel_clock	= 56000, | ||||
| 
 | ||||
| #elif defined CONFIG_FB_OMAP_092M9R | ||||
| 
 | ||||
| 	/* 1280 x 720 @ 60 Hz  Reduced blanking VESA CVT 0.92M9-R */ | ||||
| 	.x_res		= 1280, | ||||
| 	.y_res		= 720, | ||||
| 	.hfp		= 48, | ||||
| 	.hsw		= 32, | ||||
| 	.hbp		= 80, | ||||
| 	.vfp		= 3, | ||||
| 	.vsw		= 5, | ||||
| 	.vbp		= 13, | ||||
| 	.pixel_clock	= 64000, | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| 	/* use 640 x 480 if no config option */ | ||||
| 	/* 640 x 480 @ 60 Hz  Reduced blanking VESA CVT 0.31M3-R */ | ||||
| 	.x_res		= 640, | ||||
| 	.y_res		= 480, | ||||
| 	.hfp		= 48, | ||||
| 	.hsw		= 32, | ||||
| 	.hbp		= 80, | ||||
| 	.vfp		= 3, | ||||
| 	.vsw		= 4, | ||||
| 	.vbp		= 7, | ||||
| 	.pixel_clock	= 23500, | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 	.init		= overo_panel_init, | ||||
| 	.cleanup	= overo_panel_cleanup, | ||||
| 	.enable		= overo_panel_enable, | ||||
| 	.disable	= overo_panel_disable, | ||||
| 	.get_caps	= overo_panel_get_caps, | ||||
| }; | ||||
| 
 | ||||
| static int overo_panel_probe(struct platform_device *pdev) | ||||
| { | ||||
| 	omapfb_register_panel(&overo_panel); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int overo_panel_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	/* omapfb does not have unregister_panel */ | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct platform_driver overo_panel_driver = { | ||||
| 	.probe		= overo_panel_probe, | ||||
| 	.remove		= overo_panel_remove, | ||||
| 	.driver		= { | ||||
| 		.name	= "overo_lcd", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init overo_panel_drv_init(void) | ||||
| { | ||||
| 	return platform_driver_register(&overo_panel_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit overo_panel_drv_exit(void) | ||||
| { | ||||
| 	platform_driver_unregister(&overo_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(overo_panel_drv_init); | ||||
| module_exit(overo_panel_drv_exit); | ||||
|  | @ -10,6 +10,13 @@ config PANEL_GENERIC_DPI | |||
| 	  Supports LCD Panel used in TI SDP3430 and EVM boards, | ||||
| 	  OMAP3517 EVM boards and CM-T35. | ||||
| 
 | ||||
| config PANEL_DVI | ||||
| 	tristate "DVI output" | ||||
| 	depends on OMAP2_DSS_DPI | ||||
| 	help | ||||
| 	  Driver for external monitors, connected via DVI. The driver uses i2c | ||||
| 	  to read EDID information from the monitor. | ||||
| 
 | ||||
| config PANEL_LGPHILIPS_LB035Q02 | ||||
| 	tristate "LG.Philips LB035Q02 LCD Panel" | ||||
| 	depends on OMAP2_DSS_DPI && SPI | ||||
|  | @ -19,20 +26,30 @@ config PANEL_LGPHILIPS_LB035Q02 | |||
| config PANEL_SHARP_LS037V7DW01 | ||||
|         tristate "Sharp LS037V7DW01 LCD Panel" | ||||
|         depends on OMAP2_DSS_DPI | ||||
|         select BACKLIGHT_CLASS_DEVICE | ||||
|         depends on BACKLIGHT_CLASS_DEVICE | ||||
|         help | ||||
|           LCD Panel used in TI's SDP3430 and EVM boards | ||||
| 
 | ||||
| config PANEL_NEC_NL8048HL11_01B | ||||
| 	tristate "NEC NL8048HL11-01B Panel" | ||||
| 	depends on OMAP2_DSS_DPI | ||||
| 	depends on SPI | ||||
| 	depends on BACKLIGHT_CLASS_DEVICE | ||||
| 	help | ||||
| 		This NEC NL8048HL11-01B panel is TFT LCD | ||||
| 		used in the Zoom2/3/3630 sdp boards. | ||||
| 
 | ||||
| config PANEL_PICODLP | ||||
| 	tristate "TI PICO DLP mini-projector" | ||||
| 	depends on OMAP2_DSS && I2C | ||||
| 	help | ||||
| 		A mini-projector used in TI's SDP4430 and EVM boards | ||||
| 		For more info please visit http://www.dlp.com/projector/ | ||||
| 
 | ||||
| config PANEL_TAAL | ||||
|         tristate "Taal DSI Panel" | ||||
|         depends on OMAP2_DSS_DSI | ||||
|         depends on BACKLIGHT_CLASS_DEVICE | ||||
|         help | ||||
|           Taal DSI command mode panel from TPO. | ||||
| 
 | ||||
|  | @ -45,7 +62,14 @@ config PANEL_TPO_TD043MTEA1 | |||
| config PANEL_ACX565AKM | ||||
| 	tristate "ACX565AKM Panel" | ||||
| 	depends on OMAP2_DSS_SDI && SPI | ||||
| 	select BACKLIGHT_CLASS_DEVICE | ||||
| 	depends on BACKLIGHT_CLASS_DEVICE | ||||
| 	help | ||||
| 	  This is the LCD panel used on Nokia N900 | ||||
| 
 | ||||
| config PANEL_N8X0 | ||||
| 	tristate "N8X0 Panel" | ||||
| 	depends on OMAP2_DSS_RFBI && SPI | ||||
| 	depends on BACKLIGHT_CLASS_DEVICE | ||||
| 	help | ||||
| 	  This is the LCD panel used on Nokia N8x0 | ||||
| endmenu | ||||
|  |  | |||
|  | @ -1,8 +1,11 @@ | |||
| obj-$(CONFIG_PANEL_GENERIC_DPI) += panel-generic-dpi.o | ||||
| obj-$(CONFIG_PANEL_DVI) += panel-dvi.o | ||||
| obj-$(CONFIG_PANEL_LGPHILIPS_LB035Q02) += panel-lgphilips-lb035q02.o | ||||
| obj-$(CONFIG_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o | ||||
| obj-$(CONFIG_PANEL_NEC_NL8048HL11_01B) += panel-nec-nl8048hl11-01b.o | ||||
| 
 | ||||
| obj-$(CONFIG_PANEL_TAAL) += panel-taal.o | ||||
| obj-$(CONFIG_PANEL_PICODLP) +=  panel-picodlp.o | ||||
| obj-$(CONFIG_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o | ||||
| obj-$(CONFIG_PANEL_ACX565AKM) += panel-acx565akm.o | ||||
| obj-$(CONFIG_PANEL_N8X0) += panel-n8x0.o | ||||
|  |  | |||
							
								
								
									
										363
									
								
								drivers/video/omap2/displays/panel-dvi.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										363
									
								
								drivers/video/omap2/displays/panel-dvi.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,363 @@ | |||
| /*
 | ||||
|  * DVI output support | ||||
|  * | ||||
|  * Copyright (C) 2011 Texas Instruments Inc | ||||
|  * Author: Tomi Valkeinen <tomi.valkeinen@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/slab.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <drm/drm_edid.h> | ||||
| 
 | ||||
| #include <video/omap-panel-dvi.h> | ||||
| 
 | ||||
| static const struct omap_video_timings panel_dvi_default_timings = { | ||||
| 	.x_res		= 640, | ||||
| 	.y_res		= 480, | ||||
| 
 | ||||
| 	.pixel_clock	= 23500, | ||||
| 
 | ||||
| 	.hfp		= 48, | ||||
| 	.hsw		= 32, | ||||
| 	.hbp		= 80, | ||||
| 
 | ||||
| 	.vfp		= 3, | ||||
| 	.vsw		= 4, | ||||
| 	.vbp		= 7, | ||||
| }; | ||||
| 
 | ||||
| struct panel_drv_data { | ||||
| 	struct omap_dss_device *dssdev; | ||||
| 
 | ||||
| 	struct mutex lock; | ||||
| }; | ||||
| 
 | ||||
| static inline struct panel_dvi_platform_data | ||||
| *get_pdata(const struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	return dssdev->data; | ||||
| } | ||||
| 
 | ||||
| static int panel_dvi_power_on(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_dvi_platform_data *pdata = get_pdata(dssdev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	r = omapdss_dpi_display_enable(dssdev); | ||||
| 	if (r) | ||||
| 		goto err0; | ||||
| 
 | ||||
| 	if (pdata->platform_enable) { | ||||
| 		r = pdata->platform_enable(dssdev); | ||||
| 		if (r) | ||||
| 			goto err1; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| err1: | ||||
| 	omapdss_dpi_display_disable(dssdev); | ||||
| err0: | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void panel_dvi_power_off(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_dvi_platform_data *pdata = get_pdata(dssdev); | ||||
| 
 | ||||
| 	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||||
| 		return; | ||||
| 
 | ||||
| 	if (pdata->platform_disable) | ||||
| 		pdata->platform_disable(dssdev); | ||||
| 
 | ||||
| 	omapdss_dpi_display_disable(dssdev); | ||||
| } | ||||
| 
 | ||||
| static int panel_dvi_probe(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata; | ||||
| 
 | ||||
| 	ddata = kzalloc(sizeof(*ddata), GFP_KERNEL); | ||||
| 	if (!ddata) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	dssdev->panel.timings = panel_dvi_default_timings; | ||||
| 	dssdev->panel.config = OMAP_DSS_LCD_TFT; | ||||
| 
 | ||||
| 	ddata->dssdev = dssdev; | ||||
| 	mutex_init(&ddata->lock); | ||||
| 
 | ||||
| 	dev_set_drvdata(&dssdev->dev, ddata); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void __exit panel_dvi_remove(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	dev_set_drvdata(&dssdev->dev, NULL); | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	kfree(ddata); | ||||
| } | ||||
| 
 | ||||
| static int panel_dvi_enable(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	r = panel_dvi_power_on(dssdev); | ||||
| 	if (r == 0) | ||||
| 		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void panel_dvi_disable(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	panel_dvi_power_off(dssdev); | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| } | ||||
| 
 | ||||
| static int panel_dvi_suspend(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	panel_dvi_power_off(dssdev); | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int panel_dvi_resume(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	r = panel_dvi_power_on(dssdev); | ||||
| 	if (r == 0) | ||||
| 		dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void panel_dvi_set_timings(struct omap_dss_device *dssdev, | ||||
| 		struct omap_video_timings *timings) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 	dpi_set_timings(dssdev, timings); | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| } | ||||
| 
 | ||||
| static void panel_dvi_get_timings(struct omap_dss_device *dssdev, | ||||
| 		struct omap_video_timings *timings) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 	*timings = dssdev->panel.timings; | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| } | ||||
| 
 | ||||
| static int panel_dvi_check_timings(struct omap_dss_device *dssdev, | ||||
| 		struct omap_video_timings *timings) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 	r = dpi_check_timings(dssdev, timings); | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static int panel_dvi_ddc_read(struct i2c_adapter *adapter, | ||||
| 		unsigned char *buf, u16 count, u8 offset) | ||||
| { | ||||
| 	int r, retries; | ||||
| 
 | ||||
| 	for (retries = 3; retries > 0; retries--) { | ||||
| 		struct i2c_msg msgs[] = { | ||||
| 			{ | ||||
| 				.addr   = DDC_ADDR, | ||||
| 				.flags  = 0, | ||||
| 				.len    = 1, | ||||
| 				.buf    = &offset, | ||||
| 			}, { | ||||
| 				.addr   = DDC_ADDR, | ||||
| 				.flags  = I2C_M_RD, | ||||
| 				.len    = count, | ||||
| 				.buf    = buf, | ||||
| 			} | ||||
| 		}; | ||||
| 
 | ||||
| 		r = i2c_transfer(adapter, msgs, 2); | ||||
| 		if (r == 2) | ||||
| 			return 0; | ||||
| 
 | ||||
| 		if (r != -EAGAIN) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	return r < 0 ? r : -EIO; | ||||
| } | ||||
| 
 | ||||
| static int panel_dvi_read_edid(struct omap_dss_device *dssdev, | ||||
| 		u8 *edid, int len) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 	struct panel_dvi_platform_data *pdata = get_pdata(dssdev); | ||||
| 	struct i2c_adapter *adapter; | ||||
| 	int r, l, bytes_read; | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	if (pdata->i2c_bus_num == 0) { | ||||
| 		r = -ENODEV; | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	adapter = i2c_get_adapter(pdata->i2c_bus_num); | ||||
| 	if (!adapter) { | ||||
| 		dev_err(&dssdev->dev, "Failed to get I2C adapter, bus %d\n", | ||||
| 				pdata->i2c_bus_num); | ||||
| 		r = -EINVAL; | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	l = min(EDID_LENGTH, len); | ||||
| 	r = panel_dvi_ddc_read(adapter, edid, l, 0); | ||||
| 	if (r) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	bytes_read = l; | ||||
| 
 | ||||
| 	/* if there are extensions, read second block */ | ||||
| 	if (len > EDID_LENGTH && edid[0x7e] > 0) { | ||||
| 		l = min(EDID_LENGTH, len - EDID_LENGTH); | ||||
| 
 | ||||
| 		r = panel_dvi_ddc_read(adapter, edid + EDID_LENGTH, | ||||
| 				l, EDID_LENGTH); | ||||
| 		if (r) | ||||
| 			goto err; | ||||
| 
 | ||||
| 		bytes_read += l; | ||||
| 	} | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return bytes_read; | ||||
| 
 | ||||
| err: | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static bool panel_dvi_detect(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = dev_get_drvdata(&dssdev->dev); | ||||
| 	struct panel_dvi_platform_data *pdata = get_pdata(dssdev); | ||||
| 	struct i2c_adapter *adapter; | ||||
| 	unsigned char out; | ||||
| 	int r; | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	if (pdata->i2c_bus_num == 0) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	adapter = i2c_get_adapter(pdata->i2c_bus_num); | ||||
| 	if (!adapter) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	r = panel_dvi_ddc_read(adapter, &out, 1, 0); | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return r == 0; | ||||
| 
 | ||||
| out: | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| static struct omap_dss_driver panel_dvi_driver = { | ||||
| 	.probe		= panel_dvi_probe, | ||||
| 	.remove		= __exit_p(panel_dvi_remove), | ||||
| 
 | ||||
| 	.enable		= panel_dvi_enable, | ||||
| 	.disable	= panel_dvi_disable, | ||||
| 	.suspend	= panel_dvi_suspend, | ||||
| 	.resume		= panel_dvi_resume, | ||||
| 
 | ||||
| 	.set_timings	= panel_dvi_set_timings, | ||||
| 	.get_timings	= panel_dvi_get_timings, | ||||
| 	.check_timings	= panel_dvi_check_timings, | ||||
| 
 | ||||
| 	.read_edid	= panel_dvi_read_edid, | ||||
| 	.detect		= panel_dvi_detect, | ||||
| 
 | ||||
| 	.driver         = { | ||||
| 		.name   = "dvi", | ||||
| 		.owner  = THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init panel_dvi_init(void) | ||||
| { | ||||
| 	return omap_dss_register_driver(&panel_dvi_driver); | ||||
| } | ||||
| 
 | ||||
| static void __exit panel_dvi_exit(void) | ||||
| { | ||||
| 	omap_dss_unregister_driver(&panel_dvi_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(panel_dvi_init); | ||||
| module_exit(panel_dvi_exit); | ||||
| MODULE_LICENSE("GPL"); | ||||
|  | @ -58,30 +58,6 @@ struct panel_config { | |||
| 
 | ||||
| /* 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 */ | ||||
| 	{ | ||||
| 		{ | ||||
|  | @ -232,6 +208,95 @@ static struct panel_config generic_dpi_panels[] = { | |||
| 		.power_off_delay	= 0, | ||||
| 		.name			= "powertip_ph480272t", | ||||
| 	}, | ||||
| 
 | ||||
| 	/* Innolux AT070TN83 */ | ||||
| 	{ | ||||
| 		{ | ||||
| 			.x_res		= 800, | ||||
| 			.y_res		= 480, | ||||
| 
 | ||||
| 			.pixel_clock	= 40000, | ||||
| 
 | ||||
| 			.hsw		= 48, | ||||
| 			.hfp		= 1, | ||||
| 			.hbp		= 1, | ||||
| 
 | ||||
| 			.vsw		= 3, | ||||
| 			.vfp		= 12, | ||||
| 			.vbp		= 25, | ||||
| 		}, | ||||
| 		.acbi			= 0x0, | ||||
| 		.acb			= 0x28, | ||||
| 		.config			= OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | | ||||
| 					  OMAP_DSS_LCD_IHS, | ||||
| 		.power_on_delay		= 0, | ||||
| 		.power_off_delay	= 0, | ||||
| 		.name			= "innolux_at070tn83", | ||||
| 	}, | ||||
| 
 | ||||
| 	/* NEC NL2432DR22-11B */ | ||||
| 	{ | ||||
| 		{ | ||||
| 			.x_res		= 240, | ||||
| 			.y_res		= 320, | ||||
| 
 | ||||
| 			.pixel_clock	= 5400, | ||||
| 
 | ||||
| 			.hsw		= 3, | ||||
| 			.hfp		= 3, | ||||
| 			.hbp		= 39, | ||||
| 
 | ||||
| 			.vsw		= 1, | ||||
| 			.vfp		= 2, | ||||
| 			.vbp		= 7, | ||||
| 		}, | ||||
| 		.config			= OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | | ||||
| 						OMAP_DSS_LCD_IHS, | ||||
| 		.name			= "nec_nl2432dr22-11b", | ||||
| 	}, | ||||
| 
 | ||||
| 	/* Unknown panel used in OMAP H4 */ | ||||
| 	{ | ||||
| 		{ | ||||
| 			.x_res		= 240, | ||||
| 			.y_res		= 320, | ||||
| 
 | ||||
| 			.pixel_clock	= 6250, | ||||
| 
 | ||||
| 			.hsw		= 15, | ||||
| 			.hfp		= 15, | ||||
| 			.hbp		= 60, | ||||
| 
 | ||||
| 			.vsw		= 1, | ||||
| 			.vfp		= 1, | ||||
| 			.vbp		= 1, | ||||
| 		}, | ||||
| 		.config			= OMAP_DSS_LCD_TFT, | ||||
| 
 | ||||
| 		.name			= "h4", | ||||
| 	}, | ||||
| 
 | ||||
| 	/* Unknown panel used in Samsung OMAP2 Apollon */ | ||||
| 	{ | ||||
| 		{ | ||||
| 			.x_res		= 480, | ||||
| 			.y_res		= 272, | ||||
| 
 | ||||
| 			.pixel_clock	= 6250, | ||||
| 
 | ||||
| 			.hsw		= 41, | ||||
| 			.hfp		= 2, | ||||
| 			.hbp		= 2, | ||||
| 
 | ||||
| 			.vsw		= 10, | ||||
| 			.vfp		= 2, | ||||
| 			.vbp		= 2, | ||||
| 		}, | ||||
| 		.config			= OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_IVS | | ||||
| 						OMAP_DSS_LCD_IHS, | ||||
| 
 | ||||
| 		.name			= "apollon", | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| struct panel_drv_data { | ||||
|  |  | |||
							
								
								
									
										747
									
								
								drivers/video/omap2/displays/panel-n8x0.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										747
									
								
								drivers/video/omap2/displays/panel-n8x0.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,747 @@ | |||
| /* #define DEBUG */ | ||||
| 
 | ||||
| #include <linux/module.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/gpio.h> | ||||
| #include <linux/spi/spi.h> | ||||
| #include <linux/backlight.h> | ||||
| #include <linux/fb.h> | ||||
| 
 | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-n8x0.h> | ||||
| 
 | ||||
| #define BLIZZARD_REV_CODE                      0x00 | ||||
| #define BLIZZARD_CONFIG                        0x02 | ||||
| #define BLIZZARD_PLL_DIV                       0x04 | ||||
| #define BLIZZARD_PLL_LOCK_RANGE                0x06 | ||||
| #define BLIZZARD_PLL_CLOCK_SYNTH_0             0x08 | ||||
| #define BLIZZARD_PLL_CLOCK_SYNTH_1             0x0a | ||||
| #define BLIZZARD_PLL_MODE                      0x0c | ||||
| #define BLIZZARD_CLK_SRC                       0x0e | ||||
| #define BLIZZARD_MEM_BANK0_ACTIVATE            0x10 | ||||
| #define BLIZZARD_MEM_BANK0_STATUS              0x14 | ||||
| #define BLIZZARD_PANEL_CONFIGURATION           0x28 | ||||
| #define BLIZZARD_HDISP                         0x2a | ||||
| #define BLIZZARD_HNDP                          0x2c | ||||
| #define BLIZZARD_VDISP0                        0x2e | ||||
| #define BLIZZARD_VDISP1                        0x30 | ||||
| #define BLIZZARD_VNDP                          0x32 | ||||
| #define BLIZZARD_HSW                           0x34 | ||||
| #define BLIZZARD_VSW                           0x38 | ||||
| #define BLIZZARD_DISPLAY_MODE                  0x68 | ||||
| #define BLIZZARD_INPUT_WIN_X_START_0           0x6c | ||||
| #define BLIZZARD_DATA_SOURCE_SELECT            0x8e | ||||
| #define BLIZZARD_DISP_MEM_DATA_PORT            0x90 | ||||
| #define BLIZZARD_DISP_MEM_READ_ADDR0           0x92 | ||||
| #define BLIZZARD_POWER_SAVE                    0xE6 | ||||
| #define BLIZZARD_NDISP_CTRL_STATUS             0xE8 | ||||
| 
 | ||||
| /* Data source select */ | ||||
| /* For S1D13745 */ | ||||
| #define BLIZZARD_SRC_WRITE_LCD_BACKGROUND	0x00 | ||||
| #define BLIZZARD_SRC_WRITE_LCD_DESTRUCTIVE	0x01 | ||||
| #define BLIZZARD_SRC_WRITE_OVERLAY_ENABLE	0x04 | ||||
| #define BLIZZARD_SRC_DISABLE_OVERLAY		0x05 | ||||
| /* For S1D13744 */ | ||||
| #define BLIZZARD_SRC_WRITE_LCD			0x00 | ||||
| #define BLIZZARD_SRC_BLT_LCD			0x06 | ||||
| 
 | ||||
| #define BLIZZARD_COLOR_RGB565			0x01 | ||||
| #define BLIZZARD_COLOR_YUV420			0x09 | ||||
| 
 | ||||
| #define BLIZZARD_VERSION_S1D13745		0x01	/* Hailstorm */ | ||||
| #define BLIZZARD_VERSION_S1D13744		0x02	/* Blizzard */ | ||||
| 
 | ||||
| #define MIPID_CMD_READ_DISP_ID		0x04 | ||||
| #define MIPID_CMD_READ_RED		0x06 | ||||
| #define MIPID_CMD_READ_GREEN		0x07 | ||||
| #define MIPID_CMD_READ_BLUE		0x08 | ||||
| #define MIPID_CMD_READ_DISP_STATUS	0x09 | ||||
| #define MIPID_CMD_RDDSDR		0x0F | ||||
| #define MIPID_CMD_SLEEP_IN		0x10 | ||||
| #define MIPID_CMD_SLEEP_OUT		0x11 | ||||
| #define MIPID_CMD_DISP_OFF		0x28 | ||||
| #define MIPID_CMD_DISP_ON		0x29 | ||||
| 
 | ||||
| static struct panel_drv_data { | ||||
| 	struct mutex lock; | ||||
| 
 | ||||
| 	struct omap_dss_device *dssdev; | ||||
| 	struct spi_device *spidev; | ||||
| 	struct backlight_device *bldev; | ||||
| 
 | ||||
| 	int blizzard_ver; | ||||
| } s_drv_data; | ||||
| 
 | ||||
| 
 | ||||
| static inline | ||||
| struct panel_n8x0_data *get_board_data(const struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	return dssdev->data; | ||||
| } | ||||
| 
 | ||||
| static inline | ||||
| struct panel_drv_data *get_drv_data(const struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	return &s_drv_data; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static inline void blizzard_cmd(u8 cmd) | ||||
| { | ||||
| 	omap_rfbi_write_command(&cmd, 1); | ||||
| } | ||||
| 
 | ||||
| static inline void blizzard_write(u8 cmd, const u8 *buf, int len) | ||||
| { | ||||
| 	omap_rfbi_write_command(&cmd, 1); | ||||
| 	omap_rfbi_write_data(buf, len); | ||||
| } | ||||
| 
 | ||||
| static inline void blizzard_read(u8 cmd, u8 *buf, int len) | ||||
| { | ||||
| 	omap_rfbi_write_command(&cmd, 1); | ||||
| 	omap_rfbi_read_data(buf, len); | ||||
| } | ||||
| 
 | ||||
| static u8 blizzard_read_reg(u8 cmd) | ||||
| { | ||||
| 	u8 data; | ||||
| 	blizzard_read(cmd, &data, 1); | ||||
| 	return data; | ||||
| } | ||||
| 
 | ||||
| static void blizzard_ctrl_setup_update(struct omap_dss_device *dssdev, | ||||
| 		int x, int y, int w, int h) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 	u8 tmp[18]; | ||||
| 	int x_end, y_end; | ||||
| 
 | ||||
| 	x_end = x + w - 1; | ||||
| 	y_end = y + h - 1; | ||||
| 
 | ||||
| 	tmp[0] = x; | ||||
| 	tmp[1] = x >> 8; | ||||
| 	tmp[2] = y; | ||||
| 	tmp[3] = y >> 8; | ||||
| 	tmp[4] = x_end; | ||||
| 	tmp[5] = x_end >> 8; | ||||
| 	tmp[6] = y_end; | ||||
| 	tmp[7] = y_end >> 8; | ||||
| 
 | ||||
| 	/* scaling? */ | ||||
| 	tmp[8] = x; | ||||
| 	tmp[9] = x >> 8; | ||||
| 	tmp[10] = y; | ||||
| 	tmp[11] = y >> 8; | ||||
| 	tmp[12] = x_end; | ||||
| 	tmp[13] = x_end >> 8; | ||||
| 	tmp[14] = y_end; | ||||
| 	tmp[15] = y_end >> 8; | ||||
| 
 | ||||
| 	tmp[16] = BLIZZARD_COLOR_RGB565; | ||||
| 
 | ||||
| 	if (ddata->blizzard_ver == BLIZZARD_VERSION_S1D13745) | ||||
| 		tmp[17] = BLIZZARD_SRC_WRITE_LCD_BACKGROUND; | ||||
| 	else | ||||
| 		tmp[17] = ddata->blizzard_ver == BLIZZARD_VERSION_S1D13744 ? | ||||
| 			BLIZZARD_SRC_WRITE_LCD : | ||||
| 			BLIZZARD_SRC_WRITE_LCD_DESTRUCTIVE; | ||||
| 
 | ||||
| 	omap_rfbi_configure(dssdev, 16, 8); | ||||
| 
 | ||||
| 	blizzard_write(BLIZZARD_INPUT_WIN_X_START_0, tmp, 18); | ||||
| 
 | ||||
| 	omap_rfbi_configure(dssdev, 16, 16); | ||||
| } | ||||
| 
 | ||||
| static void mipid_transfer(struct spi_device *spi, int cmd, const u8 *wbuf, | ||||
| 		int wlen, u8 *rbuf, int rlen) | ||||
| { | ||||
| 	struct spi_message	m; | ||||
| 	struct spi_transfer	*x, xfer[4]; | ||||
| 	u16			w; | ||||
| 	int			r; | ||||
| 
 | ||||
| 	spi_message_init(&m); | ||||
| 
 | ||||
| 	memset(xfer, 0, sizeof(xfer)); | ||||
| 	x = &xfer[0]; | ||||
| 
 | ||||
| 	cmd &=  0xff; | ||||
| 	x->tx_buf		= &cmd; | ||||
| 	x->bits_per_word	= 9; | ||||
| 	x->len			= 2; | ||||
| 	spi_message_add_tail(x, &m); | ||||
| 
 | ||||
| 	if (wlen) { | ||||
| 		x++; | ||||
| 		x->tx_buf		= wbuf; | ||||
| 		x->len			= wlen; | ||||
| 		x->bits_per_word	= 9; | ||||
| 		spi_message_add_tail(x, &m); | ||||
| 	} | ||||
| 
 | ||||
| 	if (rlen) { | ||||
| 		x++; | ||||
| 		x->rx_buf	= &w; | ||||
| 		x->len		= 1; | ||||
| 		spi_message_add_tail(x, &m); | ||||
| 
 | ||||
| 		if (rlen > 1) { | ||||
| 			/* Arrange for the extra clock before the first
 | ||||
| 			 * data bit. | ||||
| 			 */ | ||||
| 			x->bits_per_word = 9; | ||||
| 			x->len		 = 2; | ||||
| 
 | ||||
| 			x++; | ||||
| 			x->rx_buf	 = &rbuf[1]; | ||||
| 			x->len		 = rlen - 1; | ||||
| 			spi_message_add_tail(x, &m); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	r = spi_sync(spi, &m); | ||||
| 	if (r < 0) | ||||
| 		dev_dbg(&spi->dev, "spi_sync %d\n", r); | ||||
| 
 | ||||
| 	if (rlen) | ||||
| 		rbuf[0] = w & 0xff; | ||||
| } | ||||
| 
 | ||||
| static inline void mipid_cmd(struct spi_device *spi, int cmd) | ||||
| { | ||||
| 	mipid_transfer(spi, cmd, NULL, 0, NULL, 0); | ||||
| } | ||||
| 
 | ||||
| static inline void mipid_write(struct spi_device *spi, | ||||
| 		int reg, const u8 *buf, int len) | ||||
| { | ||||
| 	mipid_transfer(spi, reg, buf, len, NULL, 0); | ||||
| } | ||||
| 
 | ||||
| static inline void mipid_read(struct spi_device *spi, | ||||
| 		int reg, u8 *buf, int len) | ||||
| { | ||||
| 	mipid_transfer(spi, reg, NULL, 0, buf, len); | ||||
| } | ||||
| 
 | ||||
| static void set_data_lines(struct spi_device *spi, int data_lines) | ||||
| { | ||||
| 	u16 par; | ||||
| 
 | ||||
| 	switch (data_lines) { | ||||
| 	case 16: | ||||
| 		par = 0x150; | ||||
| 		break; | ||||
| 	case 18: | ||||
| 		par = 0x160; | ||||
| 		break; | ||||
| 	case 24: | ||||
| 		par = 0x170; | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	mipid_write(spi, 0x3a, (u8 *)&par, 2); | ||||
| } | ||||
| 
 | ||||
| static void send_init_string(struct spi_device *spi) | ||||
| { | ||||
| 	u16 initpar[] = { 0x0102, 0x0100, 0x0100 }; | ||||
| 	mipid_write(spi, 0xc2, (u8 *)initpar, sizeof(initpar)); | ||||
| } | ||||
| 
 | ||||
| static void send_display_on(struct spi_device *spi) | ||||
| { | ||||
| 	mipid_cmd(spi, MIPID_CMD_DISP_ON); | ||||
| } | ||||
| 
 | ||||
| static void send_display_off(struct spi_device *spi) | ||||
| { | ||||
| 	mipid_cmd(spi, MIPID_CMD_DISP_OFF); | ||||
| } | ||||
| 
 | ||||
| static void send_sleep_out(struct spi_device *spi) | ||||
| { | ||||
| 	mipid_cmd(spi, MIPID_CMD_SLEEP_OUT); | ||||
| 	msleep(120); | ||||
| } | ||||
| 
 | ||||
| static void send_sleep_in(struct spi_device *spi) | ||||
| { | ||||
| 	mipid_cmd(spi, MIPID_CMD_SLEEP_IN); | ||||
| 	msleep(50); | ||||
| } | ||||
| 
 | ||||
| static int n8x0_panel_power_on(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	int r; | ||||
| 	struct panel_n8x0_data *bdata = get_board_data(dssdev); | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 	struct spi_device *spi = ddata->spidev; | ||||
| 	u8 rev, conf; | ||||
| 	u8 display_id[3]; | ||||
| 	const char *panel_name; | ||||
| 
 | ||||
| 	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	gpio_direction_output(bdata->ctrl_pwrdown, 1); | ||||
| 
 | ||||
| 	if (bdata->platform_enable) { | ||||
| 		r = bdata->platform_enable(dssdev); | ||||
| 		if (r) | ||||
| 			goto err_plat_en; | ||||
| 	} | ||||
| 
 | ||||
| 	r = omapdss_rfbi_display_enable(dssdev); | ||||
| 	if (r) | ||||
| 		goto err_rfbi_en; | ||||
| 
 | ||||
| 	rev = blizzard_read_reg(BLIZZARD_REV_CODE); | ||||
| 	conf = blizzard_read_reg(BLIZZARD_CONFIG); | ||||
| 
 | ||||
| 	switch (rev & 0xfc) { | ||||
| 	case 0x9c: | ||||
| 		ddata->blizzard_ver = BLIZZARD_VERSION_S1D13744; | ||||
| 		dev_info(&dssdev->dev, "s1d13744 LCD controller rev %d " | ||||
| 			"initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07); | ||||
| 		break; | ||||
| 	case 0xa4: | ||||
| 		ddata->blizzard_ver = BLIZZARD_VERSION_S1D13745; | ||||
| 		dev_info(&dssdev->dev, "s1d13745 LCD controller rev %d " | ||||
| 			"initialized (CNF pins %x)\n", rev & 0x03, conf & 0x07); | ||||
| 		break; | ||||
| 	default: | ||||
| 		dev_err(&dssdev->dev, "invalid s1d1374x revision %02x\n", rev); | ||||
| 		r = -ENODEV; | ||||
| 		goto err_inv_chip; | ||||
| 	} | ||||
| 
 | ||||
| 	/* panel */ | ||||
| 
 | ||||
| 	gpio_direction_output(bdata->panel_reset, 1); | ||||
| 
 | ||||
| 	mipid_read(spi, MIPID_CMD_READ_DISP_ID, display_id, 3); | ||||
| 	dev_dbg(&spi->dev, "MIPI display ID: %02x%02x%02x\n", | ||||
| 			display_id[0], display_id[1], display_id[2]); | ||||
| 
 | ||||
| 	switch (display_id[0]) { | ||||
| 	case 0x45: | ||||
| 		panel_name = "lph8923"; | ||||
| 		break; | ||||
| 	case 0x83: | ||||
| 		panel_name = "ls041y3"; | ||||
| 		break; | ||||
| 	default: | ||||
| 		dev_err(&dssdev->dev, "invalid display ID 0x%x\n", | ||||
| 				display_id[0]); | ||||
| 		r = -ENODEV; | ||||
| 		goto err_inv_panel; | ||||
| 	} | ||||
| 
 | ||||
| 	dev_info(&dssdev->dev, "%s rev %02x LCD detected\n", | ||||
| 			panel_name, display_id[1]); | ||||
| 
 | ||||
| 	send_sleep_out(spi); | ||||
| 	send_init_string(spi); | ||||
| 	set_data_lines(spi, 24); | ||||
| 	send_display_on(spi); | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err_inv_panel: | ||||
| 	/*
 | ||||
| 	 * HACK: we should turn off the panel here, but there is some problem | ||||
| 	 * with the initialization sequence, and we fail to init the panel if we | ||||
| 	 * have turned it off | ||||
| 	 */ | ||||
| 	/* gpio_direction_output(bdata->panel_reset, 0); */ | ||||
| err_inv_chip: | ||||
| 	omapdss_rfbi_display_disable(dssdev); | ||||
| err_rfbi_en: | ||||
| 	if (bdata->platform_disable) | ||||
| 		bdata->platform_disable(dssdev); | ||||
| err_plat_en: | ||||
| 	gpio_direction_output(bdata->ctrl_pwrdown, 0); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void n8x0_panel_power_off(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_n8x0_data *bdata = get_board_data(dssdev); | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 	struct spi_device *spi = ddata->spidev; | ||||
| 
 | ||||
| 	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||||
| 		return; | ||||
| 
 | ||||
| 	send_display_off(spi); | ||||
| 	send_sleep_in(spi); | ||||
| 
 | ||||
| 	if (bdata->platform_disable) | ||||
| 		bdata->platform_disable(dssdev); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * HACK: we should turn off the panel here, but there is some problem | ||||
| 	 * with the initialization sequence, and we fail to init the panel if we | ||||
| 	 * have turned it off | ||||
| 	 */ | ||||
| 	/* gpio_direction_output(bdata->panel_reset, 0); */ | ||||
| 	gpio_direction_output(bdata->ctrl_pwrdown, 0); | ||||
| 	omapdss_rfbi_display_disable(dssdev); | ||||
| } | ||||
| 
 | ||||
| static const struct rfbi_timings n8x0_panel_timings = { | ||||
| 	.cs_on_time     = 0, | ||||
| 
 | ||||
| 	.we_on_time     = 9000, | ||||
| 	.we_off_time    = 18000, | ||||
| 	.we_cycle_time  = 36000, | ||||
| 
 | ||||
| 	.re_on_time     = 9000, | ||||
| 	.re_off_time    = 27000, | ||||
| 	.re_cycle_time  = 36000, | ||||
| 
 | ||||
| 	.access_time    = 27000, | ||||
| 	.cs_off_time    = 36000, | ||||
| 
 | ||||
| 	.cs_pulse_width = 0, | ||||
| }; | ||||
| 
 | ||||
| static int n8x0_bl_update_status(struct backlight_device *dev) | ||||
| { | ||||
| 	struct omap_dss_device *dssdev = dev_get_drvdata(&dev->dev); | ||||
| 	struct panel_n8x0_data *bdata = get_board_data(dssdev); | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 	int r; | ||||
| 	int level; | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	if (dev->props.fb_blank == FB_BLANK_UNBLANK && | ||||
| 			dev->props.power == FB_BLANK_UNBLANK) | ||||
| 		level = dev->props.brightness; | ||||
| 	else | ||||
| 		level = 0; | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "update brightness to %d\n", level); | ||||
| 
 | ||||
| 	if (!bdata->set_backlight) | ||||
| 		r = -EINVAL; | ||||
| 	else | ||||
| 		r = bdata->set_backlight(dssdev, level); | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static int n8x0_bl_get_intensity(struct backlight_device *dev) | ||||
| { | ||||
| 	if (dev->props.fb_blank == FB_BLANK_UNBLANK && | ||||
| 			dev->props.power == FB_BLANK_UNBLANK) | ||||
| 		return dev->props.brightness; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static const struct backlight_ops n8x0_bl_ops = { | ||||
| 	.get_brightness = n8x0_bl_get_intensity, | ||||
| 	.update_status  = n8x0_bl_update_status, | ||||
| }; | ||||
| 
 | ||||
| static int n8x0_panel_probe(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_n8x0_data *bdata = get_board_data(dssdev); | ||||
| 	struct panel_drv_data *ddata; | ||||
| 	struct backlight_device *bldev; | ||||
| 	struct backlight_properties props; | ||||
| 	int r; | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "probe\n"); | ||||
| 
 | ||||
| 	if (!bdata) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	s_drv_data.dssdev = dssdev; | ||||
| 
 | ||||
| 	ddata = &s_drv_data; | ||||
| 
 | ||||
| 	mutex_init(&ddata->lock); | ||||
| 
 | ||||
| 	dssdev->panel.config = OMAP_DSS_LCD_TFT; | ||||
| 	dssdev->panel.timings.x_res = 800; | ||||
| 	dssdev->panel.timings.y_res = 480; | ||||
| 	dssdev->ctrl.pixel_size = 16; | ||||
| 	dssdev->ctrl.rfbi_timings = n8x0_panel_timings; | ||||
| 
 | ||||
| 	memset(&props, 0, sizeof(props)); | ||||
| 	props.max_brightness = 127; | ||||
| 	props.type = BACKLIGHT_PLATFORM; | ||||
| 	bldev = backlight_device_register(dev_name(&dssdev->dev), &dssdev->dev, | ||||
| 			dssdev, &n8x0_bl_ops, &props); | ||||
| 	if (IS_ERR(bldev)) { | ||||
| 		r = PTR_ERR(bldev); | ||||
| 		dev_err(&dssdev->dev, "register backlight failed\n"); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	ddata->bldev = bldev; | ||||
| 
 | ||||
| 	bldev->props.fb_blank = FB_BLANK_UNBLANK; | ||||
| 	bldev->props.power = FB_BLANK_UNBLANK; | ||||
| 	bldev->props.brightness = 127; | ||||
| 
 | ||||
| 	n8x0_bl_update_status(bldev); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void n8x0_panel_remove(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 	struct backlight_device *bldev; | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "remove\n"); | ||||
| 
 | ||||
| 	bldev = ddata->bldev; | ||||
| 	bldev->props.power = FB_BLANK_POWERDOWN; | ||||
| 	n8x0_bl_update_status(bldev); | ||||
| 	backlight_device_unregister(bldev); | ||||
| 
 | ||||
| 	dev_set_drvdata(&dssdev->dev, NULL); | ||||
| } | ||||
| 
 | ||||
| static int n8x0_panel_enable(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "enable\n"); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	rfbi_bus_lock(); | ||||
| 
 | ||||
| 	r = n8x0_panel_power_on(dssdev); | ||||
| 
 | ||||
| 	rfbi_bus_unlock(); | ||||
| 
 | ||||
| 	if (r) { | ||||
| 		mutex_unlock(&ddata->lock); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void n8x0_panel_disable(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "disable\n"); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	rfbi_bus_lock(); | ||||
| 
 | ||||
| 	n8x0_panel_power_off(dssdev); | ||||
| 
 | ||||
| 	rfbi_bus_unlock(); | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| } | ||||
| 
 | ||||
| static int n8x0_panel_suspend(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "suspend\n"); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	rfbi_bus_lock(); | ||||
| 
 | ||||
| 	n8x0_panel_power_off(dssdev); | ||||
| 
 | ||||
| 	rfbi_bus_unlock(); | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int n8x0_panel_resume(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "resume\n"); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 
 | ||||
| 	rfbi_bus_lock(); | ||||
| 
 | ||||
| 	r = n8x0_panel_power_on(dssdev); | ||||
| 
 | ||||
| 	rfbi_bus_unlock(); | ||||
| 
 | ||||
| 	if (r) { | ||||
| 		mutex_unlock(&ddata->lock); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void n8x0_panel_get_timings(struct omap_dss_device *dssdev, | ||||
| 		struct omap_video_timings *timings) | ||||
| { | ||||
| 	*timings = dssdev->panel.timings; | ||||
| } | ||||
| 
 | ||||
| static void n8x0_panel_get_resolution(struct omap_dss_device *dssdev, | ||||
| 		u16 *xres, u16 *yres) | ||||
| { | ||||
| 	*xres = dssdev->panel.timings.x_res; | ||||
| 	*yres = dssdev->panel.timings.y_res; | ||||
| } | ||||
| 
 | ||||
| static void update_done(void *data) | ||||
| { | ||||
| 	rfbi_bus_unlock(); | ||||
| } | ||||
| 
 | ||||
| static int n8x0_panel_update(struct omap_dss_device *dssdev, | ||||
| 		u16 x, u16 y, u16 w, u16 h) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "update\n"); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 	rfbi_bus_lock(); | ||||
| 
 | ||||
| 	omap_rfbi_prepare_update(dssdev, &x, &y, &w, &h); | ||||
| 
 | ||||
| 	blizzard_ctrl_setup_update(dssdev, x, y, w, h); | ||||
| 
 | ||||
| 	omap_rfbi_update(dssdev, x, y, w, h, update_done, NULL); | ||||
| 
 | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int n8x0_panel_sync(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct panel_drv_data *ddata = get_drv_data(dssdev); | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "sync\n"); | ||||
| 
 | ||||
| 	mutex_lock(&ddata->lock); | ||||
| 	rfbi_bus_lock(); | ||||
| 	rfbi_bus_unlock(); | ||||
| 	mutex_unlock(&ddata->lock); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct omap_dss_driver n8x0_panel_driver = { | ||||
| 	.probe		= n8x0_panel_probe, | ||||
| 	.remove		= n8x0_panel_remove, | ||||
| 
 | ||||
| 	.enable		= n8x0_panel_enable, | ||||
| 	.disable	= n8x0_panel_disable, | ||||
| 	.suspend	= n8x0_panel_suspend, | ||||
| 	.resume		= n8x0_panel_resume, | ||||
| 
 | ||||
| 	.update		= n8x0_panel_update, | ||||
| 	.sync		= n8x0_panel_sync, | ||||
| 
 | ||||
| 	.get_resolution	= n8x0_panel_get_resolution, | ||||
| 	.get_recommended_bpp = omapdss_default_get_recommended_bpp, | ||||
| 
 | ||||
| 	.get_timings	= n8x0_panel_get_timings, | ||||
| 
 | ||||
| 	.driver         = { | ||||
| 		.name   = "n8x0_panel", | ||||
| 		.owner  = THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| /* PANEL */ | ||||
| 
 | ||||
| static int mipid_spi_probe(struct spi_device *spi) | ||||
| { | ||||
| 	dev_dbg(&spi->dev, "mipid_spi_probe\n"); | ||||
| 
 | ||||
| 	spi->mode = SPI_MODE_0; | ||||
| 
 | ||||
| 	s_drv_data.spidev = spi; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int mipid_spi_remove(struct spi_device *spi) | ||||
| { | ||||
| 	dev_dbg(&spi->dev, "mipid_spi_remove\n"); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct spi_driver mipid_spi_driver = { | ||||
| 	.driver = { | ||||
| 		.name	= "lcd_mipid", | ||||
| 		.bus	= &spi_bus_type, | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| 	.probe	= mipid_spi_probe, | ||||
| 	.remove	= __devexit_p(mipid_spi_remove), | ||||
| }; | ||||
| 
 | ||||
| static int __init n8x0_panel_drv_init(void) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	r = spi_register_driver(&mipid_spi_driver); | ||||
| 	if (r) { | ||||
| 		pr_err("n8x0_panel: spi driver registration failed\n"); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r = omap_dss_register_driver(&n8x0_panel_driver); | ||||
| 	if (r) { | ||||
| 		pr_err("n8x0_panel: dss driver registration failed\n"); | ||||
| 		spi_unregister_driver(&mipid_spi_driver); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static void __exit n8x0_panel_drv_exit(void) | ||||
| { | ||||
| 	spi_unregister_driver(&mipid_spi_driver); | ||||
| 
 | ||||
| 	omap_dss_unregister_driver(&n8x0_panel_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(n8x0_panel_drv_init); | ||||
| module_exit(n8x0_panel_drv_exit); | ||||
| MODULE_LICENSE("GPL"); | ||||
							
								
								
									
										594
									
								
								drivers/video/omap2/displays/panel-picodlp.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										594
									
								
								drivers/video/omap2/displays/panel-picodlp.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,594 @@ | |||
| /*
 | ||||
|  * picodlp panel driver | ||||
|  * picodlp_i2c_driver: i2c_client driver | ||||
|  * | ||||
|  * Copyright (C) 2009-2011 Texas Instruments | ||||
|  * Author: Mythri P K <mythripk@ti.com> | ||||
|  * Mayuresh Janorkar <mayur@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/input.h> | ||||
| #include <linux/platform_device.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/firmware.h> | ||||
| #include <linux/slab.h> | ||||
| #include <linux/mutex.h> | ||||
| #include <linux/i2c.h> | ||||
| #include <linux/delay.h> | ||||
| #include <linux/gpio.h> | ||||
| 
 | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-picodlp.h> | ||||
| 
 | ||||
| #include "panel-picodlp.h" | ||||
| 
 | ||||
| struct picodlp_data { | ||||
| 	struct mutex lock; | ||||
| 	struct i2c_client *picodlp_i2c_client; | ||||
| }; | ||||
| 
 | ||||
| static struct i2c_board_info picodlp_i2c_board_info = { | ||||
| 	I2C_BOARD_INFO("picodlp_i2c_driver", 0x1b), | ||||
| }; | ||||
| 
 | ||||
| struct picodlp_i2c_data { | ||||
| 	struct mutex xfer_lock; | ||||
| }; | ||||
| 
 | ||||
| static struct i2c_device_id picodlp_i2c_id[] = { | ||||
| 	{ "picodlp_i2c_driver", 0 }, | ||||
| }; | ||||
| 
 | ||||
| struct picodlp_i2c_command { | ||||
| 	u8 reg; | ||||
| 	u32 value; | ||||
| }; | ||||
| 
 | ||||
| static struct omap_video_timings pico_ls_timings = { | ||||
| 	.x_res		= 864, | ||||
| 	.y_res		= 480, | ||||
| 	.hsw		= 7, | ||||
| 	.hfp		= 11, | ||||
| 	.hbp		= 7, | ||||
| 
 | ||||
| 	.pixel_clock	= 19200, | ||||
| 
 | ||||
| 	.vsw		= 2, | ||||
| 	.vfp		= 3, | ||||
| 	.vbp		= 14, | ||||
| }; | ||||
| 
 | ||||
| static inline struct picodlp_panel_data | ||||
| 		*get_panel_data(const struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	return (struct picodlp_panel_data *) dssdev->data; | ||||
| } | ||||
| 
 | ||||
| static u32 picodlp_i2c_read(struct i2c_client *client, u8 reg) | ||||
| { | ||||
| 	u8 read_cmd[] = {READ_REG_SELECT, reg}, data[4]; | ||||
| 	struct picodlp_i2c_data *picodlp_i2c_data = i2c_get_clientdata(client); | ||||
| 	struct i2c_msg msg[2]; | ||||
| 
 | ||||
| 	mutex_lock(&picodlp_i2c_data->xfer_lock); | ||||
| 
 | ||||
| 	msg[0].addr = client->addr; | ||||
| 	msg[0].flags = 0; | ||||
| 	msg[0].len = 2; | ||||
| 	msg[0].buf = read_cmd; | ||||
| 
 | ||||
| 	msg[1].addr = client->addr; | ||||
| 	msg[1].flags = I2C_M_RD; | ||||
| 	msg[1].len = 4; | ||||
| 	msg[1].buf = data; | ||||
| 
 | ||||
| 	i2c_transfer(client->adapter, msg, 2); | ||||
| 	mutex_unlock(&picodlp_i2c_data->xfer_lock); | ||||
| 	return (data[3] | (data[2] << 8) | (data[1] << 16) | (data[0] << 24)); | ||||
| } | ||||
| 
 | ||||
| static int picodlp_i2c_write_block(struct i2c_client *client, | ||||
| 					u8 *data, int len) | ||||
| { | ||||
| 	struct i2c_msg msg; | ||||
| 	int i, r, msg_count = 1; | ||||
| 
 | ||||
| 	struct picodlp_i2c_data *picodlp_i2c_data = i2c_get_clientdata(client); | ||||
| 
 | ||||
| 	if (len < 1 || len > 32) { | ||||
| 		dev_err(&client->dev, | ||||
| 			"too long syn_write_block len %d\n", len); | ||||
| 		return -EIO; | ||||
| 	} | ||||
| 	mutex_lock(&picodlp_i2c_data->xfer_lock); | ||||
| 
 | ||||
| 	msg.addr = client->addr; | ||||
| 	msg.flags = 0; | ||||
| 	msg.len = len; | ||||
| 	msg.buf = data; | ||||
| 	r = i2c_transfer(client->adapter, &msg, msg_count); | ||||
| 	mutex_unlock(&picodlp_i2c_data->xfer_lock); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * i2c_transfer returns: | ||||
| 	 * number of messages sent in case of success | ||||
| 	 * a negative error number in case of failure | ||||
| 	 */ | ||||
| 	if (r != msg_count) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	/* In case of success */ | ||||
| 	for (i = 0; i < len; i++) | ||||
| 		dev_dbg(&client->dev, | ||||
| 			"addr %x bw 0x%02x[%d]: 0x%02x\n", | ||||
| 			client->addr, data[0] + i, i, data[i]); | ||||
| 
 | ||||
| 	return 0; | ||||
| err: | ||||
| 	dev_err(&client->dev, "picodlp_i2c_write error\n"); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static int picodlp_i2c_write(struct i2c_client *client, u8 reg, u32 value) | ||||
| { | ||||
| 	u8 data[5]; | ||||
| 	int i; | ||||
| 
 | ||||
| 	data[0] = reg; | ||||
| 	for (i = 1; i < 5; i++) | ||||
| 		data[i] = (value >> (32 - (i) * 8)) & 0xFF; | ||||
| 
 | ||||
| 	return picodlp_i2c_write_block(client, data, 5); | ||||
| } | ||||
| 
 | ||||
| static int picodlp_i2c_write_array(struct i2c_client *client, | ||||
| 			const struct picodlp_i2c_command commands[], | ||||
| 			int count) | ||||
| { | ||||
| 	int i, r = 0; | ||||
| 	for (i = 0; i < count; i++) { | ||||
| 		r = picodlp_i2c_write(client, commands[i].reg, | ||||
| 						commands[i].value); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static int picodlp_wait_for_dma_done(struct i2c_client *client) | ||||
| { | ||||
| 	u8 trial = 100; | ||||
| 
 | ||||
| 	do { | ||||
| 		msleep(1); | ||||
| 		if (!trial--) | ||||
| 			return -ETIMEDOUT; | ||||
| 	} while (picodlp_i2c_read(client, MAIN_STATUS) & DMA_STATUS); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * picodlp_i2c_init:	i2c_initialization routine | ||||
|  * client:	i2c_client for communication | ||||
|  * | ||||
|  * return | ||||
|  *		0	: Success, no error | ||||
|  *	error code	: Failure | ||||
|  */ | ||||
| static int picodlp_i2c_init(struct i2c_client *client) | ||||
| { | ||||
| 	int r; | ||||
| 	static const struct picodlp_i2c_command init_cmd_set1[] = { | ||||
| 		{SOFT_RESET, 1}, | ||||
| 		{DMD_PARK_TRIGGER, 1}, | ||||
| 		{MISC_REG, 5}, | ||||
| 		{SEQ_CONTROL, 0}, | ||||
| 		{SEQ_VECTOR, 0x100}, | ||||
| 		{DMD_BLOCK_COUNT, 7}, | ||||
| 		{DMD_VCC_CONTROL, 0x109}, | ||||
| 		{DMD_PARK_PULSE_COUNT, 0xA}, | ||||
| 		{DMD_PARK_PULSE_WIDTH, 0xB}, | ||||
| 		{DMD_PARK_DELAY, 0x2ED}, | ||||
| 		{DMD_SHADOW_ENABLE, 0}, | ||||
| 		{FLASH_OPCODE, 0xB}, | ||||
| 		{FLASH_DUMMY_BYTES, 1}, | ||||
| 		{FLASH_ADDR_BYTES, 3}, | ||||
| 		{PBC_CONTROL, 0}, | ||||
| 		{FLASH_START_ADDR, CMT_LUT_0_START_ADDR}, | ||||
| 		{FLASH_READ_BYTES, CMT_LUT_0_SIZE}, | ||||
| 		{CMT_SPLASH_LUT_START_ADDR, 0}, | ||||
| 		{CMT_SPLASH_LUT_DEST_SELECT, CMT_LUT_ALL}, | ||||
| 		{PBC_CONTROL, 1}, | ||||
| 	}; | ||||
| 
 | ||||
| 	static const struct picodlp_i2c_command init_cmd_set2[] = { | ||||
| 		{PBC_CONTROL, 0}, | ||||
| 		{CMT_SPLASH_LUT_DEST_SELECT, 0}, | ||||
| 		{PBC_CONTROL, 0}, | ||||
| 		{FLASH_START_ADDR, SEQUENCE_0_START_ADDR}, | ||||
| 		{FLASH_READ_BYTES, SEQUENCE_0_SIZE}, | ||||
| 		{SEQ_RESET_LUT_START_ADDR, 0}, | ||||
| 		{SEQ_RESET_LUT_DEST_SELECT, SEQ_SEQ_LUT}, | ||||
| 		{PBC_CONTROL, 1}, | ||||
| 	}; | ||||
| 
 | ||||
| 	static const struct picodlp_i2c_command init_cmd_set3[] = { | ||||
| 		{PBC_CONTROL, 0}, | ||||
| 		{SEQ_RESET_LUT_DEST_SELECT, 0}, | ||||
| 		{PBC_CONTROL, 0}, | ||||
| 		{FLASH_START_ADDR, DRC_TABLE_0_START_ADDR}, | ||||
| 		{FLASH_READ_BYTES, DRC_TABLE_0_SIZE}, | ||||
| 		{SEQ_RESET_LUT_START_ADDR, 0}, | ||||
| 		{SEQ_RESET_LUT_DEST_SELECT, SEQ_DRC_LUT_ALL}, | ||||
| 		{PBC_CONTROL, 1}, | ||||
| 	}; | ||||
| 
 | ||||
| 	static const struct picodlp_i2c_command init_cmd_set4[] = { | ||||
| 		{PBC_CONTROL, 0}, | ||||
| 		{SEQ_RESET_LUT_DEST_SELECT, 0}, | ||||
| 		{SDC_ENABLE, 1}, | ||||
| 		{AGC_CTRL, 7}, | ||||
| 		{CCA_C1A, 0x100}, | ||||
| 		{CCA_C1B, 0x0}, | ||||
| 		{CCA_C1C, 0x0}, | ||||
| 		{CCA_C2A, 0x0}, | ||||
| 		{CCA_C2B, 0x100}, | ||||
| 		{CCA_C2C, 0x0}, | ||||
| 		{CCA_C3A, 0x0}, | ||||
| 		{CCA_C3B, 0x0}, | ||||
| 		{CCA_C3C, 0x100}, | ||||
| 		{CCA_C7A, 0x100}, | ||||
| 		{CCA_C7B, 0x100}, | ||||
| 		{CCA_C7C, 0x100}, | ||||
| 		{CCA_ENABLE, 1}, | ||||
| 		{CPU_IF_MODE, 1}, | ||||
| 		{SHORT_FLIP, 1}, | ||||
| 		{CURTAIN_CONTROL, 0}, | ||||
| 		{DMD_PARK_TRIGGER, 0}, | ||||
| 		{R_DRIVE_CURRENT, 0x298}, | ||||
| 		{G_DRIVE_CURRENT, 0x298}, | ||||
| 		{B_DRIVE_CURRENT, 0x298}, | ||||
| 		{RGB_DRIVER_ENABLE, 7}, | ||||
| 		{SEQ_CONTROL, 0}, | ||||
| 		{ACTGEN_CONTROL, 0x10}, | ||||
| 		{SEQUENCE_MODE, SEQ_LOCK}, | ||||
| 		{DATA_FORMAT, RGB888}, | ||||
| 		{INPUT_RESOLUTION, WVGA_864_LANDSCAPE}, | ||||
| 		{INPUT_SOURCE, PARALLEL_RGB}, | ||||
| 		{CPU_IF_SYNC_METHOD, 1}, | ||||
| 		{SEQ_CONTROL, 1} | ||||
| 	}; | ||||
| 
 | ||||
| 	r = picodlp_i2c_write_array(client, init_cmd_set1, | ||||
| 						ARRAY_SIZE(init_cmd_set1)); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = picodlp_wait_for_dma_done(client); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = picodlp_i2c_write_array(client, init_cmd_set2, | ||||
| 					ARRAY_SIZE(init_cmd_set2)); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = picodlp_wait_for_dma_done(client); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = picodlp_i2c_write_array(client, init_cmd_set3, | ||||
| 					ARRAY_SIZE(init_cmd_set3)); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = picodlp_wait_for_dma_done(client); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = picodlp_i2c_write_array(client, init_cmd_set4, | ||||
| 					ARRAY_SIZE(init_cmd_set4)); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int picodlp_i2c_probe(struct i2c_client *client, | ||||
| 		const struct i2c_device_id *id) | ||||
| { | ||||
| 	struct picodlp_i2c_data *picodlp_i2c_data; | ||||
| 
 | ||||
| 	picodlp_i2c_data = kzalloc(sizeof(struct picodlp_i2c_data), GFP_KERNEL); | ||||
| 
 | ||||
| 	if (!picodlp_i2c_data) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	mutex_init(&picodlp_i2c_data->xfer_lock); | ||||
| 	i2c_set_clientdata(client, picodlp_i2c_data); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int picodlp_i2c_remove(struct i2c_client *client) | ||||
| { | ||||
| 	struct picodlp_i2c_data *picodlp_i2c_data = | ||||
| 					i2c_get_clientdata(client); | ||||
| 	kfree(picodlp_i2c_data); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static struct i2c_driver picodlp_i2c_driver = { | ||||
| 	.driver = { | ||||
| 		.name	= "picodlp_i2c_driver", | ||||
| 	}, | ||||
| 	.probe		= picodlp_i2c_probe, | ||||
| 	.remove		= picodlp_i2c_remove, | ||||
| 	.id_table	= picodlp_i2c_id, | ||||
| }; | ||||
| 
 | ||||
| static int picodlp_panel_power_on(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	int r, trial = 100; | ||||
| 	struct picodlp_data *picod = dev_get_drvdata(&dssdev->dev); | ||||
| 	struct picodlp_panel_data *picodlp_pdata = get_panel_data(dssdev); | ||||
| 
 | ||||
| 	if (dssdev->platform_enable) { | ||||
| 		r = dssdev->platform_enable(dssdev); | ||||
| 		if (r) | ||||
| 			return r; | ||||
| 	} | ||||
| 
 | ||||
| 	gpio_set_value(picodlp_pdata->pwrgood_gpio, 0); | ||||
| 	msleep(1); | ||||
| 	gpio_set_value(picodlp_pdata->pwrgood_gpio, 1); | ||||
| 
 | ||||
| 	while (!gpio_get_value(picodlp_pdata->emu_done_gpio)) { | ||||
| 		if (!trial--) { | ||||
| 			dev_err(&dssdev->dev, "emu_done signal not" | ||||
| 						" going high\n"); | ||||
| 			return -ETIMEDOUT; | ||||
| 		} | ||||
| 		msleep(5); | ||||
| 	} | ||||
| 	/*
 | ||||
| 	 * As per dpp2600 programming guide, | ||||
| 	 * it is required to sleep for 1000ms after emu_done signal goes high | ||||
| 	 * then only i2c commands can be successfully sent to dpp2600 | ||||
| 	 */ | ||||
| 	msleep(1000); | ||||
| 	r = omapdss_dpi_display_enable(dssdev); | ||||
| 	if (r) { | ||||
| 		dev_err(&dssdev->dev, "failed to enable DPI\n"); | ||||
| 		goto err1; | ||||
| 	} | ||||
| 
 | ||||
| 	r = picodlp_i2c_init(picod->picodlp_i2c_client); | ||||
| 	if (r) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | ||||
| 
 | ||||
| 	return r; | ||||
| err: | ||||
| 	omapdss_dpi_display_disable(dssdev); | ||||
| err1: | ||||
| 	if (dssdev->platform_disable) | ||||
| 		dssdev->platform_disable(dssdev); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void picodlp_panel_power_off(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct picodlp_panel_data *picodlp_pdata = get_panel_data(dssdev); | ||||
| 
 | ||||
| 	omapdss_dpi_display_disable(dssdev); | ||||
| 
 | ||||
| 	gpio_set_value(picodlp_pdata->emu_done_gpio, 0); | ||||
| 	gpio_set_value(picodlp_pdata->pwrgood_gpio, 0); | ||||
| 
 | ||||
| 	if (dssdev->platform_disable) | ||||
| 		dssdev->platform_disable(dssdev); | ||||
| } | ||||
| 
 | ||||
| static int picodlp_panel_probe(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct picodlp_data *picod; | ||||
| 	struct picodlp_panel_data *picodlp_pdata = get_panel_data(dssdev); | ||||
| 	struct i2c_adapter *adapter; | ||||
| 	struct i2c_client *picodlp_i2c_client; | ||||
| 	int r = 0, picodlp_adapter_id; | ||||
| 
 | ||||
| 	dssdev->panel.config = OMAP_DSS_LCD_TFT | OMAP_DSS_LCD_ONOFF | | ||||
| 				OMAP_DSS_LCD_IHS | OMAP_DSS_LCD_IVS; | ||||
| 	dssdev->panel.acb = 0x0; | ||||
| 	dssdev->panel.timings = pico_ls_timings; | ||||
| 
 | ||||
| 	picod =  kzalloc(sizeof(struct picodlp_data), GFP_KERNEL); | ||||
| 	if (!picod) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	mutex_init(&picod->lock); | ||||
| 
 | ||||
| 	picodlp_adapter_id = picodlp_pdata->picodlp_adapter_id; | ||||
| 
 | ||||
| 	adapter = i2c_get_adapter(picodlp_adapter_id); | ||||
| 	if (!adapter) { | ||||
| 		dev_err(&dssdev->dev, "can't get i2c adapter\n"); | ||||
| 		r = -ENODEV; | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	picodlp_i2c_client = i2c_new_device(adapter, &picodlp_i2c_board_info); | ||||
| 	if (!picodlp_i2c_client) { | ||||
| 		dev_err(&dssdev->dev, "can't add i2c device::" | ||||
| 					 " picodlp_i2c_client is NULL\n"); | ||||
| 		r = -ENODEV; | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	picod->picodlp_i2c_client = picodlp_i2c_client; | ||||
| 
 | ||||
| 	dev_set_drvdata(&dssdev->dev, picod); | ||||
| 	return r; | ||||
| err: | ||||
| 	kfree(picod); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void picodlp_panel_remove(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct picodlp_data *picod = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	i2c_unregister_device(picod->picodlp_i2c_client); | ||||
| 	dev_set_drvdata(&dssdev->dev, NULL); | ||||
| 	dev_dbg(&dssdev->dev, "removing picodlp panel\n"); | ||||
| 
 | ||||
| 	kfree(picod); | ||||
| } | ||||
| 
 | ||||
| static int picodlp_panel_enable(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct picodlp_data *picod = dev_get_drvdata(&dssdev->dev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "enabling picodlp panel\n"); | ||||
| 
 | ||||
| 	mutex_lock(&picod->lock); | ||||
| 	if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) { | ||||
| 		mutex_unlock(&picod->lock); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	r = picodlp_panel_power_on(dssdev); | ||||
| 	mutex_unlock(&picod->lock); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void picodlp_panel_disable(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct picodlp_data *picod = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	mutex_lock(&picod->lock); | ||||
| 	/* Turn off DLP Power */ | ||||
| 	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||||
| 		picodlp_panel_power_off(dssdev); | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_DISABLED; | ||||
| 	mutex_unlock(&picod->lock); | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "disabling picodlp panel\n"); | ||||
| } | ||||
| 
 | ||||
| static int picodlp_panel_suspend(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct picodlp_data *picod = dev_get_drvdata(&dssdev->dev); | ||||
| 
 | ||||
| 	mutex_lock(&picod->lock); | ||||
| 	/* Turn off DLP Power */ | ||||
| 	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) { | ||||
| 		mutex_unlock(&picod->lock); | ||||
| 		dev_err(&dssdev->dev, "unable to suspend picodlp panel," | ||||
| 					" panel is not ACTIVE\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	picodlp_panel_power_off(dssdev); | ||||
| 
 | ||||
| 	dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; | ||||
| 	mutex_unlock(&picod->lock); | ||||
| 
 | ||||
| 	dev_dbg(&dssdev->dev, "suspending picodlp panel\n"); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int picodlp_panel_resume(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	struct picodlp_data *picod = dev_get_drvdata(&dssdev->dev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	mutex_lock(&picod->lock); | ||||
| 	if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED) { | ||||
| 		mutex_unlock(&picod->lock); | ||||
| 		dev_err(&dssdev->dev, "unable to resume picodlp panel," | ||||
| 			" panel is not ACTIVE\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	r = picodlp_panel_power_on(dssdev); | ||||
| 	mutex_unlock(&picod->lock); | ||||
| 	dev_dbg(&dssdev->dev, "resuming picodlp panel\n"); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void picodlp_get_resolution(struct omap_dss_device *dssdev, | ||||
| 					u16 *xres, u16 *yres) | ||||
| { | ||||
| 	*xres = dssdev->panel.timings.x_res; | ||||
| 	*yres = dssdev->panel.timings.y_res; | ||||
| } | ||||
| 
 | ||||
| static struct omap_dss_driver picodlp_driver = { | ||||
| 	.probe		= picodlp_panel_probe, | ||||
| 	.remove		= picodlp_panel_remove, | ||||
| 
 | ||||
| 	.enable		= picodlp_panel_enable, | ||||
| 	.disable	= picodlp_panel_disable, | ||||
| 
 | ||||
| 	.get_resolution	= picodlp_get_resolution, | ||||
| 
 | ||||
| 	.suspend	= picodlp_panel_suspend, | ||||
| 	.resume		= picodlp_panel_resume, | ||||
| 
 | ||||
| 	.driver		= { | ||||
| 		.name	= "picodlp_panel", | ||||
| 		.owner	= THIS_MODULE, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| static int __init picodlp_init(void) | ||||
| { | ||||
| 	int r = 0; | ||||
| 
 | ||||
| 	r = i2c_add_driver(&picodlp_i2c_driver); | ||||
| 	if (r) { | ||||
| 		printk(KERN_WARNING "picodlp_i2c_driver" \ | ||||
| 			" registration failed\n"); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	r = omap_dss_register_driver(&picodlp_driver); | ||||
| 	if (r) | ||||
| 		i2c_del_driver(&picodlp_i2c_driver); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static void __exit picodlp_exit(void) | ||||
| { | ||||
| 	i2c_del_driver(&picodlp_i2c_driver); | ||||
| 	omap_dss_unregister_driver(&picodlp_driver); | ||||
| } | ||||
| 
 | ||||
| module_init(picodlp_init); | ||||
| module_exit(picodlp_exit); | ||||
| 
 | ||||
| MODULE_AUTHOR("Mythri P K <mythripk@ti.com>"); | ||||
| MODULE_DESCRIPTION("picodlp driver"); | ||||
| MODULE_LICENSE("GPL"); | ||||
							
								
								
									
										288
									
								
								drivers/video/omap2/displays/panel-picodlp.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								drivers/video/omap2/displays/panel-picodlp.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,288 @@ | |||
| /*
 | ||||
|  * Header file required by picodlp panel driver | ||||
|  * | ||||
|  * Copyright (C) 2009-2011 Texas Instruments | ||||
|  * Author: Mythri P K <mythripk@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/>.
 | ||||
| */ | ||||
| 
 | ||||
| #ifndef __OMAP2_DISPLAY_PANEL_PICODLP_H | ||||
| #define __OMAP2_DISPLAY_PANEL_PICODLP_H | ||||
| 
 | ||||
| /* Commands used for configuring picodlp panel */ | ||||
| 
 | ||||
| #define MAIN_STATUS			0x03 | ||||
| #define PBC_CONTROL			0x08 | ||||
| #define INPUT_SOURCE			0x0B | ||||
| #define INPUT_RESOLUTION		0x0C | ||||
| #define DATA_FORMAT			0x0D | ||||
| #define IMG_ROTATION			0x0E | ||||
| #define LONG_FLIP			0x0F | ||||
| #define SHORT_FLIP			0x10 | ||||
| #define TEST_PAT_SELECT			0x11 | ||||
| #define R_DRIVE_CURRENT			0x12 | ||||
| #define G_DRIVE_CURRENT			0x13 | ||||
| #define B_DRIVE_CURRENT			0x14 | ||||
| #define READ_REG_SELECT			0x15 | ||||
| #define RGB_DRIVER_ENABLE		0x16 | ||||
| 
 | ||||
| #define CPU_IF_MODE			0x18 | ||||
| #define FRAME_RATE			0x19 | ||||
| #define CPU_IF_SYNC_METHOD		0x1A | ||||
| #define CPU_IF_SOF			0x1B | ||||
| #define CPU_IF_EOF			0x1C | ||||
| #define CPU_IF_SLEEP			0x1D | ||||
| 
 | ||||
| #define SEQUENCE_MODE			0x1E | ||||
| #define SOFT_RESET			0x1F | ||||
| #define FRONT_END_RESET			0x21 | ||||
| #define AUTO_PWR_ENABLE			0x22 | ||||
| 
 | ||||
| #define VSYNC_LINE_DELAY		0x23 | ||||
| #define CPU_PI_HORIZ_START		0x24 | ||||
| #define CPU_PI_VERT_START		0x25 | ||||
| #define CPU_PI_HORIZ_WIDTH		0x26 | ||||
| #define CPU_PI_VERT_HEIGHT		0x27 | ||||
| 
 | ||||
| #define PIXEL_MASK_CROP			0x28 | ||||
| #define CROP_FIRST_LINE			0x29 | ||||
| #define CROP_LAST_LINE			0x2A | ||||
| #define CROP_FIRST_PIXEL		0x2B | ||||
| #define CROP_LAST_PIXEL			0x2C | ||||
| #define DMD_PARK_TRIGGER		0x2D | ||||
| 
 | ||||
| #define MISC_REG			0x30 | ||||
| 
 | ||||
| /* AGC registers */ | ||||
| #define AGC_CTRL			0x50 | ||||
| #define AGC_CLIPPED_PIXS		0x55 | ||||
| #define AGC_BRIGHT_PIXS			0x56 | ||||
| #define AGC_BG_PIXS			0x57 | ||||
| #define AGC_SAFETY_MARGIN		0x17 | ||||
| 
 | ||||
| /* Color Coordinate Adjustment registers */ | ||||
| #define CCA_ENABLE		0x5E | ||||
| #define CCA_C1A			0x5F | ||||
| #define CCA_C1B			0x60 | ||||
| #define CCA_C1C			0x61 | ||||
| #define CCA_C2A			0x62 | ||||
| #define CCA_C2B			0x63 | ||||
| #define CCA_C2C			0x64 | ||||
| #define CCA_C3A			0x65 | ||||
| #define CCA_C3B			0x66 | ||||
| #define CCA_C3C			0x67 | ||||
| #define CCA_C7A			0x71 | ||||
| #define CCA_C7B			0x72 | ||||
| #define CCA_C7C			0x73 | ||||
| 
 | ||||
| /**
 | ||||
|  * DLP Pico Processor 2600 comes with flash | ||||
|  * We can do DMA operations from flash for accessing Look Up Tables | ||||
|  */ | ||||
| #define DMA_STATUS			0x100 | ||||
| #define FLASH_ADDR_BYTES		0x74 | ||||
| #define FLASH_DUMMY_BYTES		0x75 | ||||
| #define FLASH_WRITE_BYTES		0x76 | ||||
| #define FLASH_READ_BYTES		0x77 | ||||
| #define FLASH_OPCODE			0x78 | ||||
| #define FLASH_START_ADDR		0x79 | ||||
| #define FLASH_DUMMY2			0x7A | ||||
| #define FLASH_WRITE_DATA		0x7B | ||||
| 
 | ||||
| #define TEMPORAL_DITH_DISABLE		0x7E | ||||
| #define SEQ_CONTROL			0x82 | ||||
| #define SEQ_VECTOR			0x83 | ||||
| 
 | ||||
| /* DMD is Digital Micromirror Device */ | ||||
| #define DMD_BLOCK_COUNT			0x84 | ||||
| #define DMD_VCC_CONTROL			0x86 | ||||
| #define DMD_PARK_PULSE_COUNT		0x87 | ||||
| #define DMD_PARK_PULSE_WIDTH		0x88 | ||||
| #define DMD_PARK_DELAY			0x89 | ||||
| #define DMD_SHADOW_ENABLE		0x8E | ||||
| #define SEQ_STATUS			0x8F | ||||
| #define FLASH_CLOCK_CONTROL		0x98 | ||||
| #define DMD_PARK			0x2D | ||||
| 
 | ||||
| #define SDRAM_BIST_ENABLE		0x46 | ||||
| #define DDR_DRIVER_STRENGTH		0x9A | ||||
| #define SDC_ENABLE			0x9D | ||||
| #define SDC_BUFF_SWAP_DISABLE		0xA3 | ||||
| #define CURTAIN_CONTROL			0xA6 | ||||
| #define DDR_BUS_SWAP_ENABLE		0xA7 | ||||
| #define DMD_TRC_ENABLE			0xA8 | ||||
| #define DMD_BUS_SWAP_ENABLE		0xA9 | ||||
| 
 | ||||
| #define ACTGEN_ENABLE			0xAE | ||||
| #define ACTGEN_CONTROL			0xAF | ||||
| #define ACTGEN_HORIZ_BP			0xB0 | ||||
| #define ACTGEN_VERT_BP			0xB1 | ||||
| 
 | ||||
| /* Look Up Table access */ | ||||
| #define CMT_SPLASH_LUT_START_ADDR	0xFA | ||||
| #define CMT_SPLASH_LUT_DEST_SELECT	0xFB | ||||
| #define CMT_SPLASH_LUT_DATA		0xFC | ||||
| #define SEQ_RESET_LUT_START_ADDR	0xFD | ||||
| #define SEQ_RESET_LUT_DEST_SELECT	0xFE | ||||
| #define SEQ_RESET_LUT_DATA		0xFF | ||||
| 
 | ||||
| /* Input source definitions */ | ||||
| #define PARALLEL_RGB		0 | ||||
| #define INT_TEST_PATTERN	1 | ||||
| #define SPLASH_SCREEN		2 | ||||
| #define CPU_INTF		3 | ||||
| #define BT656			4 | ||||
| 
 | ||||
| /* Standard input resolution definitions */ | ||||
| #define QWVGA_LANDSCAPE		3	/* (427h*240v) */ | ||||
| #define WVGA_864_LANDSCAPE	21	/* (864h*480v) */ | ||||
| #define WVGA_DMD_OPTICAL_TEST	35	/* (608h*684v) */ | ||||
| 
 | ||||
| /* Standard data format definitions */ | ||||
| #define RGB565			0 | ||||
| #define RGB666			1 | ||||
| #define RGB888			2 | ||||
| 
 | ||||
| /* Test Pattern definitions */ | ||||
| #define TPG_CHECKERBOARD	0 | ||||
| #define TPG_BLACK		1 | ||||
| #define TPG_WHITE		2 | ||||
| #define TPG_RED			3 | ||||
| #define TPG_BLUE		4 | ||||
| #define TPG_GREEN		5 | ||||
| #define TPG_VLINES_BLACK	6 | ||||
| #define TPG_HLINES_BLACK	7 | ||||
| #define TPG_VLINES_ALT		8 | ||||
| #define TPG_HLINES_ALT		9 | ||||
| #define TPG_DIAG_LINES		10 | ||||
| #define TPG_GREYRAMP_VERT	11 | ||||
| #define TPG_GREYRAMP_HORIZ	12 | ||||
| #define TPG_ANSI_CHECKERBOARD	13 | ||||
| 
 | ||||
| /* sequence mode definitions */ | ||||
| #define SEQ_FREE_RUN		0 | ||||
| #define SEQ_LOCK		1 | ||||
| 
 | ||||
| /* curtain color definitions */ | ||||
| #define CURTAIN_BLACK		0 | ||||
| #define CURTAIN_RED		1 | ||||
| #define CURTAIN_GREEN		2 | ||||
| #define CURTAIN_BLUE		3 | ||||
| #define CURTAIN_YELLOW		4 | ||||
| #define CURTAIN_MAGENTA		5 | ||||
| #define CURTAIN_CYAN		6 | ||||
| #define CURTAIN_WHITE		7 | ||||
| 
 | ||||
| /* LUT definitions */ | ||||
| #define CMT_LUT_NONE		0 | ||||
| #define CMT_LUT_GREEN		1 | ||||
| #define CMT_LUT_RED		2 | ||||
| #define CMT_LUT_BLUE		3 | ||||
| #define CMT_LUT_ALL		4 | ||||
| #define SPLASH_LUT		5 | ||||
| 
 | ||||
| #define SEQ_LUT_NONE		0 | ||||
| #define SEQ_DRC_LUT_0		1 | ||||
| #define SEQ_DRC_LUT_1		2 | ||||
| #define SEQ_DRC_LUT_2		3 | ||||
| #define SEQ_DRC_LUT_3		4 | ||||
| #define SEQ_SEQ_LUT		5 | ||||
| #define SEQ_DRC_LUT_ALL		6 | ||||
| #define WPC_PROGRAM_LUT		7 | ||||
| 
 | ||||
| #define BITSTREAM_START_ADDR		0x00000000 | ||||
| #define BITSTREAM_SIZE			0x00040000 | ||||
| 
 | ||||
| #define WPC_FW_0_START_ADDR		0x00040000 | ||||
| #define WPC_FW_0_SIZE			0x00000ce8 | ||||
| 
 | ||||
| #define SEQUENCE_0_START_ADDR		0x00044000 | ||||
| #define SEQUENCE_0_SIZE			0x00001000 | ||||
| 
 | ||||
| #define SEQUENCE_1_START_ADDR		0x00045000 | ||||
| #define SEQUENCE_1_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define SEQUENCE_2_START_ADDR		0x00046000 | ||||
| #define SEQUENCE_2_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define SEQUENCE_3_START_ADDR		0x00047000 | ||||
| #define SEQUENCE_3_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define SEQUENCE_4_START_ADDR		0x00048000 | ||||
| #define SEQUENCE_4_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define SEQUENCE_5_START_ADDR		0x00049000 | ||||
| #define SEQUENCE_5_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define SEQUENCE_6_START_ADDR		0x0004a000 | ||||
| #define SEQUENCE_6_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define CMT_LUT_0_START_ADDR		0x0004b200 | ||||
| #define CMT_LUT_0_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_1_START_ADDR		0x0004b800 | ||||
| #define CMT_LUT_1_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_2_START_ADDR		0x0004be00 | ||||
| #define CMT_LUT_2_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_3_START_ADDR		0x0004c400 | ||||
| #define CMT_LUT_3_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_4_START_ADDR		0x0004ca00 | ||||
| #define CMT_LUT_4_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_5_START_ADDR		0x0004d000 | ||||
| #define CMT_LUT_5_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_6_START_ADDR		0x0004d600 | ||||
| #define CMT_LUT_6_SIZE			0x00000600 | ||||
| 
 | ||||
| #define DRC_TABLE_0_START_ADDR		0x0004dc00 | ||||
| #define DRC_TABLE_0_SIZE		0x00000100 | ||||
| 
 | ||||
| #define SPLASH_0_START_ADDR		0x0004dd00 | ||||
| #define SPLASH_0_SIZE			0x00032280 | ||||
| 
 | ||||
| #define SEQUENCE_7_START_ADDR		0x00080000 | ||||
| #define SEQUENCE_7_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define SEQUENCE_8_START_ADDR		0x00081800 | ||||
| #define SEQUENCE_8_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define SEQUENCE_9_START_ADDR		0x00083000 | ||||
| #define SEQUENCE_9_SIZE			0x00000d10 | ||||
| 
 | ||||
| #define CMT_LUT_7_START_ADDR		0x0008e000 | ||||
| #define CMT_LUT_7_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_8_START_ADDR		0x0008e800 | ||||
| #define CMT_LUT_8_SIZE			0x00000600 | ||||
| 
 | ||||
| #define CMT_LUT_9_START_ADDR		0x0008f000 | ||||
| #define CMT_LUT_9_SIZE			0x00000600 | ||||
| 
 | ||||
| #define SPLASH_1_START_ADDR		0x0009a000 | ||||
| #define SPLASH_1_SIZE			0x00032280 | ||||
| 
 | ||||
| #define SPLASH_2_START_ADDR		0x000cd000 | ||||
| #define SPLASH_2_SIZE			0x00032280 | ||||
| 
 | ||||
| #define SPLASH_3_START_ADDR		0x00100000 | ||||
| #define SPLASH_3_SIZE			0x00032280 | ||||
| 
 | ||||
| #define OPT_SPLASH_0_START_ADDR		0x00134000 | ||||
| #define OPT_SPLASH_0_SIZE		0x000cb100 | ||||
| 
 | ||||
| #endif | ||||
|  | @ -35,26 +35,12 @@ | |||
| 
 | ||||
| #include <video/omapdss.h> | ||||
| #include <video/omap-panel-nokia-dsi.h> | ||||
| #include <video/mipi_display.h> | ||||
| 
 | ||||
| /* DSI Virtual channel. Hardcoded for now. */ | ||||
| #define TCH 0 | ||||
| 
 | ||||
| #define DCS_READ_NUM_ERRORS	0x05 | ||||
| #define DCS_READ_POWER_MODE	0x0a | ||||
| #define DCS_READ_MADCTL		0x0b | ||||
| #define DCS_READ_PIXEL_FORMAT	0x0c | ||||
| #define DCS_RDDSDR		0x0f | ||||
| #define DCS_SLEEP_IN		0x10 | ||||
| #define DCS_SLEEP_OUT		0x11 | ||||
| #define DCS_DISPLAY_OFF		0x28 | ||||
| #define DCS_DISPLAY_ON		0x29 | ||||
| #define DCS_COLUMN_ADDR		0x2a | ||||
| #define DCS_PAGE_ADDR		0x2b | ||||
| #define DCS_MEMORY_WRITE	0x2c | ||||
| #define DCS_TEAR_OFF		0x34 | ||||
| #define DCS_TEAR_ON		0x35 | ||||
| #define DCS_MEM_ACC_CTRL	0x36 | ||||
| #define DCS_PIXEL_FORMAT	0x3a | ||||
| #define DCS_BRIGHTNESS		0x51 | ||||
| #define DCS_CTRL_DISPLAY	0x53 | ||||
| #define DCS_WRITE_CABC		0x55 | ||||
|  | @ -222,8 +208,6 @@ struct taal_data { | |||
| 
 | ||||
| 	struct delayed_work te_timeout_work; | ||||
| 
 | ||||
| 	bool use_dsi_bl; | ||||
| 
 | ||||
| 	bool cabc_broken; | ||||
| 	unsigned cabc_mode; | ||||
| 
 | ||||
|  | @ -302,7 +286,7 @@ static int taal_sleep_in(struct taal_data *td) | |||
| 
 | ||||
| 	hw_guard_wait(td); | ||||
| 
 | ||||
| 	cmd = DCS_SLEEP_IN; | ||||
| 	cmd = MIPI_DCS_ENTER_SLEEP_MODE; | ||||
| 	r = dsi_vc_dcs_write_nosync(td->dssdev, td->channel, &cmd, 1); | ||||
| 	if (r) | ||||
| 		return r; | ||||
|  | @ -321,7 +305,7 @@ static int taal_sleep_out(struct taal_data *td) | |||
| 
 | ||||
| 	hw_guard_wait(td); | ||||
| 
 | ||||
| 	r = taal_dcs_write_0(td, DCS_SLEEP_OUT); | ||||
| 	r = taal_dcs_write_0(td, MIPI_DCS_EXIT_SLEEP_MODE); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
|  | @ -356,7 +340,7 @@ static int taal_set_addr_mode(struct taal_data *td, u8 rotate, bool mirror) | |||
| 	u8 mode; | ||||
| 	int b5, b6, b7; | ||||
| 
 | ||||
| 	r = taal_dcs_read_1(td, DCS_READ_MADCTL, &mode); | ||||
| 	r = taal_dcs_read_1(td, MIPI_DCS_GET_ADDRESS_MODE, &mode); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
|  | @ -390,7 +374,7 @@ static int taal_set_addr_mode(struct taal_data *td, u8 rotate, bool mirror) | |||
| 	mode &= ~((1<<7) | (1<<6) | (1<<5)); | ||||
| 	mode |= (b7 << 7) | (b6 << 6) | (b5 << 5); | ||||
| 
 | ||||
| 	return taal_dcs_write_1(td, DCS_MEM_ACC_CTRL, mode); | ||||
| 	return taal_dcs_write_1(td, MIPI_DCS_SET_ADDRESS_MODE, mode); | ||||
| } | ||||
| 
 | ||||
| static int taal_set_update_window(struct taal_data *td, | ||||
|  | @ -403,7 +387,7 @@ static int taal_set_update_window(struct taal_data *td, | |||
| 	u16 y2 = y + h - 1; | ||||
| 
 | ||||
| 	u8 buf[5]; | ||||
| 	buf[0] = DCS_COLUMN_ADDR; | ||||
| 	buf[0] = MIPI_DCS_SET_COLUMN_ADDRESS; | ||||
| 	buf[1] = (x1 >> 8) & 0xff; | ||||
| 	buf[2] = (x1 >> 0) & 0xff; | ||||
| 	buf[3] = (x2 >> 8) & 0xff; | ||||
|  | @ -413,7 +397,7 @@ static int taal_set_update_window(struct taal_data *td, | |||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	buf[0] = DCS_PAGE_ADDR; | ||||
| 	buf[0] = MIPI_DCS_SET_PAGE_ADDRESS; | ||||
| 	buf[1] = (y1 >> 8) & 0xff; | ||||
| 	buf[2] = (y1 >> 0) & 0xff; | ||||
| 	buf[3] = (y2 >> 8) & 0xff; | ||||
|  | @ -555,7 +539,6 @@ static int taal_bl_update_status(struct backlight_device *dev) | |||
| { | ||||
| 	struct omap_dss_device *dssdev = dev_get_drvdata(&dev->dev); | ||||
| 	struct taal_data *td = dev_get_drvdata(&dssdev->dev); | ||||
| 	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||||
| 	int r; | ||||
| 	int level; | ||||
| 
 | ||||
|  | @ -569,23 +552,16 @@ static int taal_bl_update_status(struct backlight_device *dev) | |||
| 
 | ||||
| 	mutex_lock(&td->lock); | ||||
| 
 | ||||
| 	if (td->use_dsi_bl) { | ||||
| 		if (td->enabled) { | ||||
| 			dsi_bus_lock(dssdev); | ||||
| 	if (td->enabled) { | ||||
| 		dsi_bus_lock(dssdev); | ||||
| 
 | ||||
| 			r = taal_wake_up(dssdev); | ||||
| 			if (!r) | ||||
| 				r = taal_dcs_write_1(td, DCS_BRIGHTNESS, level); | ||||
| 		r = taal_wake_up(dssdev); | ||||
| 		if (!r) | ||||
| 			r = taal_dcs_write_1(td, DCS_BRIGHTNESS, level); | ||||
| 
 | ||||
| 			dsi_bus_unlock(dssdev); | ||||
| 		} else { | ||||
| 			r = 0; | ||||
| 		} | ||||
| 		dsi_bus_unlock(dssdev); | ||||
| 	} else { | ||||
| 		if (!panel_data->set_backlight) | ||||
| 			r = -EINVAL; | ||||
| 		else | ||||
| 			r = panel_data->set_backlight(dssdev, level); | ||||
| 		r = 0; | ||||
| 	} | ||||
| 
 | ||||
| 	mutex_unlock(&td->lock); | ||||
|  | @ -964,7 +940,7 @@ static int taal_probe(struct omap_dss_device *dssdev) | |||
| { | ||||
| 	struct backlight_properties props; | ||||
| 	struct taal_data *td; | ||||
| 	struct backlight_device *bldev; | ||||
| 	struct backlight_device *bldev = NULL; | ||||
| 	struct nokia_dsi_panel_data *panel_data = get_panel_data(dssdev); | ||||
| 	struct panel_config *panel_config = NULL; | ||||
| 	int r, i; | ||||
|  | @ -990,7 +966,7 @@ static int taal_probe(struct omap_dss_device *dssdev) | |||
| 
 | ||||
| 	dssdev->panel.config = OMAP_DSS_LCD_TFT; | ||||
| 	dssdev->panel.timings = panel_config->timings; | ||||
| 	dssdev->ctrl.pixel_size = 24; | ||||
| 	dssdev->panel.dsi_pix_fmt = OMAP_DSS_DSI_FMT_RGB888; | ||||
| 
 | ||||
| 	td = kzalloc(sizeof(*td), GFP_KERNEL); | ||||
| 	if (!td) { | ||||
|  | @ -1025,35 +1001,26 @@ static int taal_probe(struct omap_dss_device *dssdev) | |||
| 
 | ||||
| 	taal_hw_reset(dssdev); | ||||
| 
 | ||||
| 	/* if no platform set_backlight() defined, presume DSI backlight
 | ||||
| 	 * control */ | ||||
| 	memset(&props, 0, sizeof(struct backlight_properties)); | ||||
| 	if (!panel_data->set_backlight) | ||||
| 		td->use_dsi_bl = true; | ||||
| 
 | ||||
| 	if (td->use_dsi_bl) | ||||
| 	if (panel_data->use_dsi_backlight) { | ||||
| 		memset(&props, 0, sizeof(struct backlight_properties)); | ||||
| 		props.max_brightness = 255; | ||||
| 	else | ||||
| 		props.max_brightness = 127; | ||||
| 
 | ||||
| 	props.type = BACKLIGHT_RAW; | ||||
| 	bldev = backlight_device_register(dev_name(&dssdev->dev), &dssdev->dev, | ||||
| 					dssdev, &taal_bl_ops, &props); | ||||
| 	if (IS_ERR(bldev)) { | ||||
| 		r = PTR_ERR(bldev); | ||||
| 		goto err_bl; | ||||
| 	} | ||||
| 		props.type = BACKLIGHT_RAW; | ||||
| 		bldev = backlight_device_register(dev_name(&dssdev->dev), | ||||
| 				&dssdev->dev, dssdev, &taal_bl_ops, &props); | ||||
| 		if (IS_ERR(bldev)) { | ||||
| 			r = PTR_ERR(bldev); | ||||
| 			goto err_bl; | ||||
| 		} | ||||
| 
 | ||||
| 	td->bldev = bldev; | ||||
| 		td->bldev = bldev; | ||||
| 
 | ||||
| 	bldev->props.fb_blank = FB_BLANK_UNBLANK; | ||||
| 	bldev->props.power = FB_BLANK_UNBLANK; | ||||
| 	if (td->use_dsi_bl) | ||||
| 		bldev->props.fb_blank = FB_BLANK_UNBLANK; | ||||
| 		bldev->props.power = FB_BLANK_UNBLANK; | ||||
| 		bldev->props.brightness = 255; | ||||
| 	else | ||||
| 		bldev->props.brightness = 127; | ||||
| 
 | ||||
| 	taal_bl_update_status(bldev); | ||||
| 		taal_bl_update_status(bldev); | ||||
| 	} | ||||
| 
 | ||||
| 	if (panel_data->use_ext_te) { | ||||
| 		int gpio = panel_data->ext_te_gpio; | ||||
|  | @ -1067,7 +1034,7 @@ static int taal_probe(struct omap_dss_device *dssdev) | |||
| 		gpio_direction_input(gpio); | ||||
| 
 | ||||
| 		r = request_irq(gpio_to_irq(gpio), taal_te_isr, | ||||
| 				IRQF_DISABLED | IRQF_TRIGGER_RISING, | ||||
| 				IRQF_TRIGGER_RISING, | ||||
| 				"taal vsync", dssdev); | ||||
| 
 | ||||
| 		if (r) { | ||||
|  | @ -1111,7 +1078,8 @@ err_irq: | |||
| 	if (panel_data->use_ext_te) | ||||
| 		gpio_free(panel_data->ext_te_gpio); | ||||
| err_gpio: | ||||
| 	backlight_device_unregister(bldev); | ||||
| 	if (bldev != NULL) | ||||
| 		backlight_device_unregister(bldev); | ||||
| err_bl: | ||||
| 	destroy_workqueue(td->workqueue); | ||||
| err_wq: | ||||
|  | @ -1140,9 +1108,11 @@ static void __exit taal_remove(struct omap_dss_device *dssdev) | |||
| 	} | ||||
| 
 | ||||
| 	bldev = td->bldev; | ||||
| 	bldev->props.power = FB_BLANK_POWERDOWN; | ||||
| 	taal_bl_update_status(bldev); | ||||
| 	backlight_device_unregister(bldev); | ||||
| 	if (bldev != NULL) { | ||||
| 		bldev->props.power = FB_BLANK_POWERDOWN; | ||||
| 		taal_bl_update_status(bldev); | ||||
| 		backlight_device_unregister(bldev); | ||||
| 	} | ||||
| 
 | ||||
| 	taal_cancel_ulps_work(dssdev); | ||||
| 	taal_cancel_esd_work(dssdev); | ||||
|  | @ -1195,7 +1165,8 @@ static int taal_power_on(struct omap_dss_device *dssdev) | |||
| 	if (r) | ||||
| 		goto err; | ||||
| 
 | ||||
| 	r = taal_dcs_write_1(td, DCS_PIXEL_FORMAT, 0x7); /* 24bit/pixel */ | ||||
| 	r = taal_dcs_write_1(td, MIPI_DCS_SET_PIXEL_FORMAT, | ||||
| 		MIPI_DCS_PIXEL_FMT_24BIT); | ||||
| 	if (r) | ||||
| 		goto err; | ||||
| 
 | ||||
|  | @ -1209,7 +1180,7 @@ static int taal_power_on(struct omap_dss_device *dssdev) | |||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	r = taal_dcs_write_0(td, DCS_DISPLAY_ON); | ||||
| 	r = taal_dcs_write_0(td, MIPI_DCS_SET_DISPLAY_ON); | ||||
| 	if (r) | ||||
| 		goto err; | ||||
| 
 | ||||
|  | @ -1246,7 +1217,7 @@ static void taal_power_off(struct omap_dss_device *dssdev) | |||
| 	struct taal_data *td = dev_get_drvdata(&dssdev->dev); | ||||
| 	int r; | ||||
| 
 | ||||
| 	r = taal_dcs_write_0(td, DCS_DISPLAY_OFF); | ||||
| 	r = taal_dcs_write_0(td, MIPI_DCS_SET_DISPLAY_OFF); | ||||
| 	if (!r) | ||||
| 		r = taal_sleep_in(td); | ||||
| 
 | ||||
|  | @ -1529,9 +1500,9 @@ static int _taal_enable_te(struct omap_dss_device *dssdev, bool enable) | |||
| 	int r; | ||||
| 
 | ||||
| 	if (enable) | ||||
| 		r = taal_dcs_write_1(td, DCS_TEAR_ON, 0); | ||||
| 		r = taal_dcs_write_1(td, MIPI_DCS_SET_TEAR_ON, 0); | ||||
| 	else | ||||
| 		r = taal_dcs_write_0(td, DCS_TEAR_OFF); | ||||
| 		r = taal_dcs_write_0(td, MIPI_DCS_SET_TEAR_OFF); | ||||
| 
 | ||||
| 	if (!panel_data->use_ext_te) | ||||
| 		omapdss_dsi_enable_te(dssdev, enable); | ||||
|  | @ -1851,7 +1822,7 @@ static void taal_esd_work(struct work_struct *work) | |||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	r = taal_dcs_read_1(td, DCS_RDDSDR, &state1); | ||||
| 	r = taal_dcs_read_1(td, MIPI_DCS_GET_DIAGNOSTIC_RESULT, &state1); | ||||
| 	if (r) { | ||||
| 		dev_err(&dssdev->dev, "failed to read Taal status\n"); | ||||
| 		goto err; | ||||
|  | @ -1864,7 +1835,7 @@ static void taal_esd_work(struct work_struct *work) | |||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	r = taal_dcs_read_1(td, DCS_RDDSDR, &state2); | ||||
| 	r = taal_dcs_read_1(td, MIPI_DCS_GET_DIAGNOSTIC_RESULT, &state2); | ||||
| 	if (r) { | ||||
| 		dev_err(&dssdev->dev, "failed to read Taal status\n"); | ||||
| 		goto err; | ||||
|  | @ -1880,7 +1851,7 @@ static void taal_esd_work(struct work_struct *work) | |||
| 	/* Self-diagnostics result is also shown on TE GPIO line. We need
 | ||||
| 	 * to re-enable TE after self diagnostics */ | ||||
| 	if (td->te_enabled && panel_data->use_ext_te) { | ||||
| 		r = taal_dcs_write_1(td, DCS_TEAR_ON, 0); | ||||
| 		r = taal_dcs_write_1(td, MIPI_DCS_SET_TEAR_ON, 0); | ||||
| 		if (r) | ||||
| 			goto err; | ||||
| 	} | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| menuconfig OMAP2_DSS | ||||
|         tristate "OMAP2+ Display Subsystem support (EXPERIMENTAL)" | ||||
|         tristate "OMAP2+ Display Subsystem support" | ||||
|         depends on ARCH_OMAP2PLUS | ||||
|         help | ||||
| 	  OMAP2+ Display Subsystem support. | ||||
|  |  | |||
|  | @ -6,4 +6,4 @@ omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o | |||
| omapdss-$(CONFIG_OMAP2_DSS_SDI) += sdi.o | ||||
| omapdss-$(CONFIG_OMAP2_DSS_DSI) += dsi.o | ||||
| omapdss-$(CONFIG_OMAP4_DSS_HDMI) += hdmi.o \
 | ||||
| 				    hdmi_omap4_panel.o | ||||
| 				    hdmi_panel.o ti_hdmi_4xxx_ip.o | ||||
|  |  | |||
|  | @ -144,6 +144,10 @@ static int dss_initialize_debugfs(void) | |||
| #ifdef CONFIG_OMAP2_DSS_VENC | ||||
| 	debugfs_create_file("venc", S_IRUGO, dss_debugfs_dir, | ||||
| 			&venc_dump_regs, &dss_debug_fops); | ||||
| #endif | ||||
| #ifdef CONFIG_OMAP4_DSS_HDMI | ||||
| 	debugfs_create_file("hdmi", S_IRUGO, dss_debugfs_dir, | ||||
| 			&hdmi_dump_regs, &dss_debug_fops); | ||||
| #endif | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -291,6 +291,8 @@ static inline u16 DISPC_OVL_BASE(enum omap_plane plane) | |||
| 		return 0x00BC; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x014C; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0300; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -304,6 +306,8 @@ static inline u16 DISPC_BA0_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0000; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0008; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -316,6 +320,8 @@ static inline u16 DISPC_BA1_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0004; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x000C; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -330,6 +336,8 @@ static inline u16 DISPC_BA0_UV_OFFSET(enum omap_plane plane) | |||
| 		return 0x0544; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x04BC; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0310; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -344,6 +352,8 @@ static inline u16 DISPC_BA1_UV_OFFSET(enum omap_plane plane) | |||
| 		return 0x0548; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x04C0; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0314; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -356,6 +366,8 @@ static inline u16 DISPC_POS_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0008; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x009C; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -368,6 +380,8 @@ static inline u16 DISPC_SIZE_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x000C; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x00A8; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -381,6 +395,8 @@ static inline u16 DISPC_ATTR_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0010; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0070; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -395,6 +411,8 @@ static inline u16 DISPC_ATTR2_OFFSET(enum omap_plane plane) | |||
| 		return 0x0568; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x04DC; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x032C; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -408,6 +426,8 @@ static inline u16 DISPC_FIFO_THRESH_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0014; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x008C; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -421,6 +441,8 @@ static inline u16 DISPC_FIFO_SIZE_STATUS_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0018; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0088; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -434,6 +456,8 @@ static inline u16 DISPC_ROW_INC_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x001C; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x00A4; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -447,6 +471,8 @@ static inline u16 DISPC_PIX_INC_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0020; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0098; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -459,6 +485,7 @@ static inline u16 DISPC_WINDOW_SKIP_OFFSET(enum omap_plane plane) | |||
| 		return 0x0034; | ||||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		BUG(); | ||||
| 	default: | ||||
| 		BUG(); | ||||
|  | @ -472,6 +499,7 @@ static inline u16 DISPC_TABLE_BA_OFFSET(enum omap_plane plane) | |||
| 		return 0x0038; | ||||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		BUG(); | ||||
| 	default: | ||||
| 		BUG(); | ||||
|  | @ -486,6 +514,8 @@ static inline u16 DISPC_FIR_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0024; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0090; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -500,6 +530,8 @@ static inline u16 DISPC_FIR2_OFFSET(enum omap_plane plane) | |||
| 		return 0x0580; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x055C; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0424; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -513,6 +545,8 @@ static inline u16 DISPC_PIC_SIZE_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0028; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0094; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -527,6 +561,8 @@ static inline u16 DISPC_ACCU0_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x002C; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0000; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -541,6 +577,8 @@ static inline u16 DISPC_ACCU2_0_OFFSET(enum omap_plane plane) | |||
| 		return 0x0584; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0560; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0428; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -554,6 +592,8 @@ static inline u16 DISPC_ACCU1_OFFSET(enum omap_plane plane) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0030; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0004; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -568,6 +608,8 @@ static inline u16 DISPC_ACCU2_1_OFFSET(enum omap_plane plane) | |||
| 		return 0x0588; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0564; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x042C; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -582,6 +624,8 @@ static inline u16 DISPC_FIR_COEF_H_OFFSET(enum omap_plane plane, u16 i) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0034 + i * 0x8; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0010 + i * 0x8; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -597,6 +641,8 @@ static inline u16 DISPC_FIR_COEF_H2_OFFSET(enum omap_plane plane, u16 i) | |||
| 		return 0x058C + i * 0x8; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0568 + i * 0x8; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0430 + i * 0x8; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -611,6 +657,8 @@ static inline u16 DISPC_FIR_COEF_HV_OFFSET(enum omap_plane plane, u16 i) | |||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x0038 + i * 0x8; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0014 + i * 0x8; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -626,6 +674,8 @@ static inline u16 DISPC_FIR_COEF_HV2_OFFSET(enum omap_plane plane, u16 i) | |||
| 		return 0x0590 + i * 8; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x056C + i * 0x8; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0434 + i * 0x8; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -639,6 +689,7 @@ static inline u16 DISPC_CONV_COEF_OFFSET(enum omap_plane plane, u16 i) | |||
| 		BUG(); | ||||
| 	case OMAP_DSS_VIDEO1: | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0074 + i * 0x4; | ||||
| 	default: | ||||
| 		BUG(); | ||||
|  | @ -655,6 +706,8 @@ static inline u16 DISPC_FIR_COEF_V_OFFSET(enum omap_plane plane, u16 i) | |||
| 		return 0x0124 + i * 0x4; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x00B4 + i * 0x4; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0050 + i * 0x4; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -670,6 +723,8 @@ static inline u16 DISPC_FIR_COEF_V2_OFFSET(enum omap_plane plane, u16 i) | |||
| 		return 0x05CC + i * 0x4; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x05A8 + i * 0x4; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x0470 + i * 0x4; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  | @ -684,6 +739,8 @@ static inline u16 DISPC_PRELOAD_OFFSET(enum omap_plane plane) | |||
| 		return 0x0174; | ||||
| 	case OMAP_DSS_VIDEO2: | ||||
| 		return 0x00E8; | ||||
| 	case OMAP_DSS_VIDEO3: | ||||
| 		return 0x00A0; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  |  | |||
|  | @ -45,14 +45,13 @@ static ssize_t display_enabled_store(struct device *dev, | |||
| 		const char *buf, size_t size) | ||||
| { | ||||
| 	struct omap_dss_device *dssdev = to_dss_device(dev); | ||||
| 	int r, enabled; | ||||
| 	int r; | ||||
| 	bool enabled; | ||||
| 
 | ||||
| 	r = kstrtoint(buf, 0, &enabled); | ||||
| 	r = strtobool(buf, &enabled); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	enabled = !!enabled; | ||||
| 
 | ||||
| 	if (enabled != (dssdev->state != OMAP_DSS_DISPLAY_DISABLED)) { | ||||
| 		if (enabled) { | ||||
| 			r = dssdev->driver->enable(dssdev); | ||||
|  | @ -79,17 +78,16 @@ static ssize_t display_tear_store(struct device *dev, | |||
| 		struct device_attribute *attr, const char *buf, size_t size) | ||||
| { | ||||
| 	struct omap_dss_device *dssdev = to_dss_device(dev); | ||||
| 	int te, r; | ||||
| 	int r; | ||||
| 	bool te; | ||||
| 
 | ||||
| 	if (!dssdev->driver->enable_te || !dssdev->driver->get_te) | ||||
| 		return -ENOENT; | ||||
| 
 | ||||
| 	r = kstrtoint(buf, 0, &te); | ||||
| 	r = strtobool(buf, &te); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	te = !!te; | ||||
| 
 | ||||
| 	r = dssdev->driver->enable_te(dssdev, te); | ||||
| 	if (r) | ||||
| 		return r; | ||||
|  | @ -195,17 +193,16 @@ static ssize_t display_mirror_store(struct device *dev, | |||
| 		struct device_attribute *attr, const char *buf, size_t size) | ||||
| { | ||||
| 	struct omap_dss_device *dssdev = to_dss_device(dev); | ||||
| 	int mirror, r; | ||||
| 	int r; | ||||
| 	bool mirror; | ||||
| 
 | ||||
| 	if (!dssdev->driver->set_mirror || !dssdev->driver->get_mirror) | ||||
| 		return -ENOENT; | ||||
| 
 | ||||
| 	r = kstrtoint(buf, 0, &mirror); | ||||
| 	r = strtobool(buf, &mirror); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	mirror = !!mirror; | ||||
| 
 | ||||
| 	r = dssdev->driver->set_mirror(dssdev, mirror); | ||||
| 	if (r) | ||||
| 		return r; | ||||
|  | @ -302,11 +299,15 @@ int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev) | |||
| 			return 16; | ||||
| 
 | ||||
| 	case OMAP_DISPLAY_TYPE_DBI: | ||||
| 	case OMAP_DISPLAY_TYPE_DSI: | ||||
| 		if (dssdev->ctrl.pixel_size == 24) | ||||
| 			return 24; | ||||
| 		else | ||||
| 			return 16; | ||||
| 	case OMAP_DISPLAY_TYPE_DSI: | ||||
| 		if (dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt) > 16) | ||||
| 			return 24; | ||||
| 		else | ||||
| 			return 16; | ||||
| 	case OMAP_DISPLAY_TYPE_VENC: | ||||
| 	case OMAP_DISPLAY_TYPE_SDI: | ||||
| 	case OMAP_DISPLAY_TYPE_HDMI: | ||||
|  | @ -342,9 +343,11 @@ bool dss_use_replication(struct omap_dss_device *dssdev, | |||
| 		bpp = 24; | ||||
| 		break; | ||||
| 	case OMAP_DISPLAY_TYPE_DBI: | ||||
| 	case OMAP_DISPLAY_TYPE_DSI: | ||||
| 		bpp = dssdev->ctrl.pixel_size; | ||||
| 		break; | ||||
| 	case OMAP_DISPLAY_TYPE_DSI: | ||||
| 		bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); | ||||
| 		break; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 	} | ||||
|  |  | |||
|  | @ -82,9 +82,11 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, bool is_tft, | |||
| 
 | ||||
| 	dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src); | ||||
| 
 | ||||
| 	r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo); | ||||
| 	if (r) | ||||
| 	r = dispc_mgr_set_clock_div(dssdev->manager->id, &dispc_cinfo); | ||||
| 	if (r) { | ||||
| 		dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); | ||||
| 		return r; | ||||
| 	} | ||||
| 
 | ||||
| 	*fck = dsi_cinfo.dsi_pll_hsdiv_dispc_clk; | ||||
| 	*lck_div = dispc_cinfo.lck_div; | ||||
|  | @ -109,7 +111,7 @@ static int dpi_set_dispc_clk(struct omap_dss_device *dssdev, bool is_tft, | |||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
| 	r = dispc_set_clock_div(dssdev->manager->id, &dispc_cinfo); | ||||
| 	r = dispc_mgr_set_clock_div(dssdev->manager->id, &dispc_cinfo); | ||||
| 	if (r) | ||||
| 		return r; | ||||
| 
 | ||||
|  | @ -129,7 +131,7 @@ static int dpi_set_mode(struct omap_dss_device *dssdev) | |||
| 	bool is_tft; | ||||
| 	int r = 0; | ||||
| 
 | ||||
| 	dispc_set_pol_freq(dssdev->manager->id, dssdev->panel.config, | ||||
| 	dispc_mgr_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; | ||||
|  | @ -153,7 +155,7 @@ static int dpi_set_mode(struct omap_dss_device *dssdev) | |||
| 		t->pixel_clock = pck; | ||||
| 	} | ||||
| 
 | ||||
| 	dispc_set_lcd_timings(dssdev->manager->id, t); | ||||
| 	dispc_mgr_set_lcd_timings(dssdev->manager->id, t); | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -164,11 +166,12 @@ static void dpi_basic_init(struct omap_dss_device *dssdev) | |||
| 
 | ||||
| 	is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0; | ||||
| 
 | ||||
| 	dispc_set_parallel_interface_mode(dssdev->manager->id, | ||||
| 			OMAP_DSS_PARALLELMODE_BYPASS); | ||||
| 	dispc_set_lcd_display_type(dssdev->manager->id, is_tft ? | ||||
| 	dispc_mgr_set_io_pad_mode(DSS_IO_PAD_MODE_BYPASS); | ||||
| 	dispc_mgr_enable_stallmode(dssdev->manager->id, false); | ||||
| 
 | ||||
| 	dispc_mgr_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, | ||||
| 	dispc_mgr_set_tft_data_lines(dssdev->manager->id, | ||||
| 			dssdev->phy.dpi.data_lines); | ||||
| } | ||||
| 
 | ||||
|  | @ -176,6 +179,11 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) | |||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	if (dssdev->manager == NULL) { | ||||
| 		DSSERR("failed to enable display: no manager\n"); | ||||
| 		return -ENODEV; | ||||
| 	} | ||||
| 
 | ||||
| 	r = omap_dss_start_device(dssdev); | ||||
| 	if (r) { | ||||
| 		DSSERR("failed to start device\n"); | ||||
|  | @ -277,7 +285,7 @@ void dpi_set_timings(struct omap_dss_device *dssdev, | |||
| 		} | ||||
| 
 | ||||
| 		dpi_set_mode(dssdev); | ||||
| 		dispc_go(dssdev->manager->id); | ||||
| 		dispc_mgr_go(dssdev->manager->id); | ||||
| 
 | ||||
| 		dispc_runtime_put(); | ||||
| 		dss_runtime_put(); | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -639,6 +639,17 @@ void dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select hdmi) | |||
| 	REG_FLD_MOD(DSS_CONTROL, hdmi, 15, 15);	/* VENC_HDMI_SWITCH */ | ||||
| } | ||||
| 
 | ||||
| enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void) | ||||
| { | ||||
| 	enum omap_display_type displays; | ||||
| 
 | ||||
| 	displays = dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_DIGIT); | ||||
| 	if ((displays & OMAP_DISPLAY_TYPE_HDMI) == 0) | ||||
| 		return DSS_VENC_TV_CLK; | ||||
| 
 | ||||
| 	return REG_GET(DSS_CONTROL, 15, 15); | ||||
| } | ||||
| 
 | ||||
| static int dss_get_clocks(void) | ||||
| { | ||||
| 	struct clk *clk; | ||||
|  | @ -691,11 +702,6 @@ static void dss_put_clocks(void) | |||
| 	clk_put(dss.dss_clk); | ||||
| } | ||||
| 
 | ||||
| struct clk *dss_get_ick(void) | ||||
| { | ||||
| 	return clk_get(&dss.pdev->dev, "ick"); | ||||
| } | ||||
| 
 | ||||
| int dss_runtime_get(void) | ||||
| { | ||||
| 	int r; | ||||
|  | @ -824,13 +830,11 @@ static int omap_dsshw_remove(struct platform_device *pdev) | |||
| static int dss_runtime_suspend(struct device *dev) | ||||
| { | ||||
| 	dss_save_context(); | ||||
| 	clk_disable(dss.dss_clk); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static int dss_runtime_resume(struct device *dev) | ||||
| { | ||||
| 	clk_enable(dss.dss_clk); | ||||
| 	dss_restore_context(); | ||||
| 	return 0; | ||||
| } | ||||
|  |  | |||
|  | @ -97,10 +97,10 @@ extern unsigned int dss_debug; | |||
| #define FLD_MOD(orig, val, start, end) \ | ||||
| 	(((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end)) | ||||
| 
 | ||||
| enum omap_parallel_interface_mode { | ||||
| 	OMAP_DSS_PARALLELMODE_BYPASS,		/* MIPI DPI */ | ||||
| 	OMAP_DSS_PARALLELMODE_RFBI,		/* MIPI DBI */ | ||||
| 	OMAP_DSS_PARALLELMODE_DSI, | ||||
| enum dss_io_pad_mode { | ||||
| 	DSS_IO_PAD_MODE_RESET, | ||||
| 	DSS_IO_PAD_MODE_RFBI, | ||||
| 	DSS_IO_PAD_MODE_BYPASS, | ||||
| }; | ||||
| 
 | ||||
| enum dss_hdmi_venc_clk_source_select { | ||||
|  | @ -108,6 +108,11 @@ enum dss_hdmi_venc_clk_source_select { | |||
| 	DSS_HDMI_M_PCLK = 1, | ||||
| }; | ||||
| 
 | ||||
| enum dss_dsi_content_type { | ||||
| 	DSS_DSI_CONTENT_DCS, | ||||
| 	DSS_DSI_CONTENT_GENERIC, | ||||
| }; | ||||
| 
 | ||||
| struct dss_clock_info { | ||||
| 	/* rates that we get with dividers below */ | ||||
| 	unsigned long fck; | ||||
|  | @ -150,16 +155,6 @@ struct dsi_clock_info { | |||
| 	bool use_sys_clk; | ||||
| }; | ||||
| 
 | ||||
| /* HDMI PLL structure */ | ||||
| struct hdmi_pll_info { | ||||
| 	u16 regn; | ||||
| 	u16 regm; | ||||
| 	u32 regmf; | ||||
| 	u16 regm2; | ||||
| 	u16 regsd; | ||||
| 	u16 dcofreq; | ||||
| }; | ||||
| 
 | ||||
| struct seq_file; | ||||
| struct platform_device; | ||||
| 
 | ||||
|  | @ -209,9 +204,8 @@ void dss_uninit_platform_driver(void); | |||
| int dss_runtime_get(void); | ||||
| void dss_runtime_put(void); | ||||
| 
 | ||||
| struct clk *dss_get_ick(void); | ||||
| 
 | ||||
| void dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select); | ||||
| enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void); | ||||
| const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src); | ||||
| void dss_dump_clocks(struct seq_file *s); | ||||
| 
 | ||||
|  | @ -279,6 +273,8 @@ void dsi_create_debugfs_files_reg(struct dentry *debugfs_dir, | |||
| 
 | ||||
| int dsi_init_display(struct omap_dss_device *display); | ||||
| void dsi_irq_handler(void); | ||||
| u8 dsi_get_pixel_size(enum omap_dss_dsi_pixel_format fmt); | ||||
| 
 | ||||
| unsigned long dsi_get_pll_hsdiv_dispc_rate(struct platform_device *dsidev); | ||||
| int dsi_pll_set_clock_div(struct platform_device *dsidev, | ||||
| 		struct dsi_clock_info *cinfo); | ||||
|  | @ -309,6 +305,11 @@ static inline int dsi_runtime_get(struct platform_device *dsidev) | |||
| static inline void dsi_runtime_put(struct platform_device *dsidev) | ||||
| { | ||||
| } | ||||
| static inline u8 dsi_get_pixel_size(enum omap_dss_dsi_pixel_format fmt) | ||||
| { | ||||
| 	WARN("%s: DSI not compiled in, returning pixel_size as 0\n", __func__); | ||||
| 	return 0; | ||||
| } | ||||
| 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__); | ||||
|  | @ -385,90 +386,71 @@ 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(enum omap_channel channel, bool enable); | ||||
| 
 | ||||
| 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_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high); | ||||
| void dispc_enable_fifomerge(bool enable); | ||||
| u32 dispc_get_burst_size(enum omap_plane plane); | ||||
| void dispc_enable_cpr(enum omap_channel channel, bool enable); | ||||
| void dispc_set_cpr_coef(enum omap_channel channel, | ||||
| 		struct omap_dss_cpr_coefs *coefs); | ||||
| 
 | ||||
| void dispc_set_plane_ba0(enum omap_plane plane, u32 paddr); | ||||
| void dispc_set_plane_ba1(enum omap_plane plane, u32 paddr); | ||||
| void dispc_set_plane_pos(enum omap_plane plane, u16 x, u16 y); | ||||
| void dispc_set_plane_size(enum omap_plane plane, u16 width, u16 height); | ||||
| void dispc_set_channel_out(enum omap_plane plane, | ||||
| 		enum omap_channel channel_out); | ||||
| 
 | ||||
| void dispc_enable_gamma_table(bool enable); | ||||
| int dispc_setup_plane(enum omap_plane plane, | ||||
| 		      u32 paddr, u16 screen_width, | ||||
| 		      u16 pos_x, u16 pos_y, | ||||
| 		      u16 width, u16 height, | ||||
| 		      u16 out_width, u16 out_height, | ||||
| 		      enum omap_color_mode color_mode, | ||||
| 		      bool ilace, | ||||
| 		      enum omap_dss_rotation_type rotation_type, | ||||
| 		      u8 rotation, bool mirror, | ||||
| 		      u8 global_alpha, u8 pre_mult_alpha, | ||||
| 		      enum omap_channel channel, | ||||
| 		      u32 puv_addr); | ||||
| 
 | ||||
| bool dispc_go_busy(enum omap_channel channel); | ||||
| void dispc_go(enum omap_channel channel); | ||||
| void dispc_enable_channel(enum omap_channel channel, bool enable); | ||||
| 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_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); | ||||
| u32 dispc_get_default_color(enum omap_channel channel); | ||||
| void dispc_set_trans_key(enum omap_channel ch, | ||||
| 		enum omap_dss_trans_key_type type, | ||||
| 		u32 trans_key); | ||||
| void dispc_get_trans_key(enum omap_channel ch, | ||||
| 		enum omap_dss_trans_key_type *type, | ||||
| 		u32 *trans_key); | ||||
| void dispc_enable_trans_key(enum omap_channel ch, bool enable); | ||||
| void dispc_enable_alpha_blending(enum omap_channel ch, bool enable); | ||||
| 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(enum omap_channel channel, | ||||
| 		struct omap_video_timings *timings); | ||||
| unsigned long dispc_fclk_rate(void); | ||||
| 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(enum omap_channel channel, | ||||
| 		struct dispc_clock_info *cinfo); | ||||
| int dispc_get_clock_div(enum omap_channel channel, | ||||
| 		struct dispc_clock_info *cinfo); | ||||
| 
 | ||||
| 
 | ||||
| u32 dispc_ovl_get_fifo_size(enum omap_plane plane); | ||||
| u32 dispc_ovl_get_burst_size(enum omap_plane plane); | ||||
| int dispc_ovl_setup(enum omap_plane plane, struct omap_overlay_info *oi, | ||||
| 		bool ilace, enum omap_channel channel, bool replication, | ||||
| 		u32 fifo_low, u32 fifo_high); | ||||
| int dispc_ovl_enable(enum omap_plane plane, bool enable); | ||||
| 
 | ||||
| 
 | ||||
| void dispc_mgr_enable_fifohandcheck(enum omap_channel channel, bool enable); | ||||
| void dispc_mgr_set_lcd_size(enum omap_channel channel, u16 width, u16 height); | ||||
| void dispc_mgr_enable_cpr(enum omap_channel channel, bool enable); | ||||
| void dispc_mgr_set_cpr_coef(enum omap_channel channel, | ||||
| 		struct omap_dss_cpr_coefs *coefs); | ||||
| bool dispc_mgr_go_busy(enum omap_channel channel); | ||||
| void dispc_mgr_go(enum omap_channel channel); | ||||
| void dispc_mgr_enable(enum omap_channel channel, bool enable); | ||||
| bool dispc_mgr_is_channel_enabled(enum omap_channel channel); | ||||
| void dispc_mgr_set_io_pad_mode(enum dss_io_pad_mode mode); | ||||
| void dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable); | ||||
| void dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines); | ||||
| void dispc_mgr_set_lcd_display_type(enum omap_channel channel, | ||||
| 		enum omap_lcd_display_type type); | ||||
| void dispc_mgr_set_default_color(enum omap_channel channel, u32 color); | ||||
| u32 dispc_mgr_get_default_color(enum omap_channel channel); | ||||
| void dispc_mgr_set_trans_key(enum omap_channel ch, | ||||
| 		enum omap_dss_trans_key_type type, | ||||
| 		u32 trans_key); | ||||
| void dispc_mgr_get_trans_key(enum omap_channel ch, | ||||
| 		enum omap_dss_trans_key_type *type, | ||||
| 		u32 *trans_key); | ||||
| void dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable); | ||||
| void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch, bool enable); | ||||
| bool dispc_mgr_trans_key_enabled(enum omap_channel ch); | ||||
| bool dispc_mgr_alpha_fixed_zorder_enabled(enum omap_channel ch); | ||||
| void dispc_mgr_set_lcd_timings(enum omap_channel channel, | ||||
| 		struct omap_video_timings *timings); | ||||
| void dispc_mgr_set_pol_freq(enum omap_channel channel, | ||||
| 		enum omap_panel_config config, u8 acbi, u8 acb); | ||||
| unsigned long dispc_mgr_lclk_rate(enum omap_channel channel); | ||||
| unsigned long dispc_mgr_pclk_rate(enum omap_channel channel); | ||||
| int dispc_mgr_set_clock_div(enum omap_channel channel, | ||||
| 		struct dispc_clock_info *cinfo); | ||||
| int dispc_mgr_get_clock_div(enum omap_channel channel, | ||||
| 		struct dispc_clock_info *cinfo); | ||||
| 
 | ||||
| /* VENC */ | ||||
| #ifdef CONFIG_OMAP2_DSS_VENC | ||||
| int venc_init_platform_driver(void); | ||||
| void venc_uninit_platform_driver(void); | ||||
| void venc_dump_regs(struct seq_file *s); | ||||
| int venc_init_display(struct omap_dss_device *display); | ||||
| unsigned long venc_get_pixel_clock(void); | ||||
| #else | ||||
| static inline int venc_init_platform_driver(void) | ||||
| { | ||||
|  | @ -477,6 +459,11 @@ static inline int venc_init_platform_driver(void) | |||
| static inline void venc_uninit_platform_driver(void) | ||||
| { | ||||
| } | ||||
| static inline unsigned long venc_get_pixel_clock(void) | ||||
| { | ||||
| 	WARN("%s: VENC not compiled in, returning pclk as 0\n", __func__); | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* HDMI */ | ||||
|  | @ -484,6 +471,8 @@ static inline void venc_uninit_platform_driver(void) | |||
| int hdmi_init_platform_driver(void); | ||||
| void hdmi_uninit_platform_driver(void); | ||||
| int hdmi_init_display(struct omap_dss_device *dssdev); | ||||
| unsigned long hdmi_get_pixel_clock(void); | ||||
| void hdmi_dump_regs(struct seq_file *s); | ||||
| #else | ||||
| static inline int hdmi_init_display(struct omap_dss_device *dssdev) | ||||
| { | ||||
|  | @ -496,12 +485,19 @@ static inline int hdmi_init_platform_driver(void) | |||
| static inline void hdmi_uninit_platform_driver(void) | ||||
| { | ||||
| } | ||||
| static inline unsigned long hdmi_get_pixel_clock(void) | ||||
| { | ||||
| 	WARN("%s: HDMI not compiled in, returning pclk as 0\n", __func__); | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
| int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev); | ||||
| void omapdss_hdmi_display_disable(struct omap_dss_device *dssdev); | ||||
| void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev); | ||||
| int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev, | ||||
| 					struct omap_video_timings *timings); | ||||
| int omapdss_hdmi_read_edid(u8 *buf, int len); | ||||
| bool omapdss_hdmi_detect(void); | ||||
| int hdmi_panel_init(void); | ||||
| void hdmi_panel_exit(void); | ||||
| 
 | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ struct omap_dss_features { | |||
| 	const int num_ovls; | ||||
| 	const enum omap_display_type *supported_displays; | ||||
| 	const enum omap_color_mode *supported_color_modes; | ||||
| 	const enum omap_overlay_caps *overlay_caps; | ||||
| 	const char * const *clksrc_names; | ||||
| 	const struct dss_param_range *dss_params; | ||||
| 
 | ||||
|  | @ -209,6 +210,68 @@ static const enum omap_color_mode omap4_dss_supported_color_modes[] = { | |||
| 	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 | | ||||
| 	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 | | ||||
| 	OMAP_DSS_COLOR_RGBX32, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO3 */ | ||||
| 	OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U | | ||||
| 	OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 | | ||||
| 	OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 | | ||||
| 	OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U | | ||||
| 	OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY | | ||||
| 	OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 | | ||||
| 	OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 | | ||||
| 	OMAP_DSS_COLOR_RGBX32, | ||||
| }; | ||||
| 
 | ||||
| static const enum omap_overlay_caps omap2_dss_overlay_caps[] = { | ||||
| 	/* OMAP_DSS_GFX */ | ||||
| 	0, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO1 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO2 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE, | ||||
| }; | ||||
| 
 | ||||
| static const enum omap_overlay_caps omap3430_dss_overlay_caps[] = { | ||||
| 	/* OMAP_DSS_GFX */ | ||||
| 	OMAP_DSS_OVL_CAP_GLOBAL_ALPHA, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO1 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO2 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA, | ||||
| }; | ||||
| 
 | ||||
| static const enum omap_overlay_caps omap3630_dss_overlay_caps[] = { | ||||
| 	/* OMAP_DSS_GFX */ | ||||
| 	OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO1 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO2 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | | ||||
| 		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA, | ||||
| }; | ||||
| 
 | ||||
| static const enum omap_overlay_caps omap4_dss_overlay_caps[] = { | ||||
| 	/* OMAP_DSS_GFX */ | ||||
| 	OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | | ||||
| 		OMAP_DSS_OVL_CAP_ZORDER, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO1 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | | ||||
| 		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO2 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | | ||||
| 		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER, | ||||
| 
 | ||||
| 	/* OMAP_DSS_VIDEO3 */ | ||||
| 	OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | | ||||
| 		OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER, | ||||
| }; | ||||
| 
 | ||||
| static const char * const omap2_dss_clk_source_names[] = { | ||||
|  | @ -233,32 +296,38 @@ static const char * const omap4_dss_clk_source_names[] = { | |||
| 
 | ||||
| static const struct dss_param_range omap2_dss_param_range[] = { | ||||
| 	[FEAT_PARAM_DSS_FCK]			= { 0, 173000000 }, | ||||
| 	[FEAT_PARAM_DSS_PCD]			= { 2, 255 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGN]		= { 0, 0 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM]		= { 0, 0 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM_DISPC]		= { 0, 0 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM_DSI]		= { 0, 0 }, | ||||
| 	[FEAT_PARAM_DSIPLL_FINT]		= { 0, 0 }, | ||||
| 	[FEAT_PARAM_DSIPLL_LPDIV]		= { 0, 0 }, | ||||
| 	[FEAT_PARAM_DOWNSCALE]			= { 1, 2 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct dss_param_range omap3_dss_param_range[] = { | ||||
| 	[FEAT_PARAM_DSS_FCK]			= { 0, 173000000 }, | ||||
| 	[FEAT_PARAM_DSS_PCD]			= { 1, 255 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGN]		= { 0, (1 << 7) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM]		= { 0, (1 << 11) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM_DISPC]		= { 0, (1 << 4) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM_DSI]		= { 0, (1 << 4) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_FINT]		= { 750000, 2100000 }, | ||||
| 	[FEAT_PARAM_DSIPLL_LPDIV]		= { 1, (1 << 13) - 1}, | ||||
| 	[FEAT_PARAM_DOWNSCALE]			= { 1, 4 }, | ||||
| }; | ||||
| 
 | ||||
| static const struct dss_param_range omap4_dss_param_range[] = { | ||||
| 	[FEAT_PARAM_DSS_FCK]			= { 0, 186000000 }, | ||||
| 	[FEAT_PARAM_DSS_PCD]			= { 1, 255 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGN]		= { 0, (1 << 8) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM]		= { 0, (1 << 12) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM_DISPC]		= { 0, (1 << 5) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_REGM_DSI]		= { 0, (1 << 5) - 1 }, | ||||
| 	[FEAT_PARAM_DSIPLL_FINT]		= { 500000, 2500000 }, | ||||
| 	[FEAT_PARAM_DSIPLL_LPDIV]		= { 0, (1 << 13) - 1 }, | ||||
| 	[FEAT_PARAM_DOWNSCALE]			= { 1, 4 }, | ||||
| }; | ||||
| 
 | ||||
| /* OMAP2 DSS Features */ | ||||
|  | @ -275,6 +344,7 @@ static const struct omap_dss_features omap2_dss_features = { | |||
| 	.num_ovls = 3, | ||||
| 	.supported_displays = omap2_dss_supported_displays, | ||||
| 	.supported_color_modes = omap2_dss_supported_color_modes, | ||||
| 	.overlay_caps = omap2_dss_overlay_caps, | ||||
| 	.clksrc_names = omap2_dss_clk_source_names, | ||||
| 	.dss_params = omap2_dss_param_range, | ||||
| 	.buffer_size_unit = 1, | ||||
|  | @ -287,18 +357,19 @@ static const struct omap_dss_features omap3430_dss_features = { | |||
| 	.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields), | ||||
| 
 | ||||
| 	.has_feature	= | ||||
| 		FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | | ||||
| 		FEAT_LCDENABLEPOL | | ||||
| 		FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | | ||||
| 		FEAT_FUNCGATED | FEAT_ROWREPEATENABLE | | ||||
| 		FEAT_LINEBUFFERSPLIT | FEAT_RESIZECONF | | ||||
| 		FEAT_DSI_PLL_FREQSEL | FEAT_DSI_REVERSE_TXCLKESC | | ||||
| 		FEAT_VENC_REQUIRES_TV_DAC_CLK | FEAT_CPR | FEAT_PRELOAD | | ||||
| 		FEAT_FIR_COEF_V, | ||||
| 		FEAT_FIR_COEF_V | FEAT_ALPHA_FIXED_ZORDER, | ||||
| 
 | ||||
| 	.num_mgrs = 2, | ||||
| 	.num_ovls = 3, | ||||
| 	.supported_displays = omap3430_dss_supported_displays, | ||||
| 	.supported_color_modes = omap3_dss_supported_color_modes, | ||||
| 	.overlay_caps = omap3430_dss_overlay_caps, | ||||
| 	.clksrc_names = omap3_dss_clk_source_names, | ||||
| 	.dss_params = omap3_dss_param_range, | ||||
| 	.buffer_size_unit = 1, | ||||
|  | @ -310,18 +381,19 @@ static const struct omap_dss_features omap3630_dss_features = { | |||
| 	.num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields), | ||||
| 
 | ||||
| 	.has_feature    = | ||||
| 		FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | | ||||
| 		FEAT_LCDENABLEPOL | | ||||
| 		FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | | ||||
| 		FEAT_PRE_MULT_ALPHA | FEAT_FUNCGATED | | ||||
| 		FEAT_FUNCGATED | | ||||
| 		FEAT_ROWREPEATENABLE | FEAT_LINEBUFFERSPLIT | | ||||
| 		FEAT_RESIZECONF | FEAT_DSI_PLL_PWR_BUG | | ||||
| 		FEAT_DSI_PLL_FREQSEL | FEAT_CPR | FEAT_PRELOAD | | ||||
| 		FEAT_FIR_COEF_V, | ||||
| 		FEAT_FIR_COEF_V | FEAT_ALPHA_FIXED_ZORDER, | ||||
| 
 | ||||
| 	.num_mgrs = 2, | ||||
| 	.num_ovls = 3, | ||||
| 	.supported_displays = omap3630_dss_supported_displays, | ||||
| 	.supported_color_modes = omap3_dss_supported_color_modes, | ||||
| 	.overlay_caps = omap3630_dss_overlay_caps, | ||||
| 	.clksrc_names = omap3_dss_clk_source_names, | ||||
| 	.dss_params = omap3_dss_param_range, | ||||
| 	.buffer_size_unit = 1, | ||||
|  | @ -335,17 +407,18 @@ static const struct omap_dss_features omap4430_es1_0_dss_features  = { | |||
| 	.num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields), | ||||
| 
 | ||||
| 	.has_feature	= | ||||
| 		FEAT_GLOBAL_ALPHA | FEAT_PRE_MULT_ALPHA | | ||||
| 		FEAT_MGR_LCD2 | FEAT_GLOBAL_ALPHA_VID1 | | ||||
| 		FEAT_MGR_LCD2 | | ||||
| 		FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC | | ||||
| 		FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH | | ||||
| 		FEAT_DSI_GNQ | FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 | | ||||
| 		FEAT_CPR | FEAT_PRELOAD | FEAT_FIR_COEF_V, | ||||
| 		FEAT_CPR | FEAT_PRELOAD | FEAT_FIR_COEF_V | | ||||
| 		FEAT_ALPHA_FREE_ZORDER, | ||||
| 
 | ||||
| 	.num_mgrs = 3, | ||||
| 	.num_ovls = 3, | ||||
| 	.num_ovls = 4, | ||||
| 	.supported_displays = omap4_dss_supported_displays, | ||||
| 	.supported_color_modes = omap4_dss_supported_color_modes, | ||||
| 	.overlay_caps = omap4_dss_overlay_caps, | ||||
| 	.clksrc_names = omap4_dss_clk_source_names, | ||||
| 	.dss_params = omap4_dss_param_range, | ||||
| 	.buffer_size_unit = 16, | ||||
|  | @ -358,24 +431,50 @@ static const struct omap_dss_features omap4_dss_features = { | |||
| 	.num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields), | ||||
| 
 | ||||
| 	.has_feature	= | ||||
| 		FEAT_GLOBAL_ALPHA | FEAT_PRE_MULT_ALPHA | | ||||
| 		FEAT_MGR_LCD2 | FEAT_GLOBAL_ALPHA_VID1 | | ||||
| 		FEAT_MGR_LCD2 | | ||||
| 		FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC | | ||||
| 		FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH | | ||||
| 		FEAT_DSI_GNQ | FEAT_HDMI_CTS_SWMODE | | ||||
| 		FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 | FEAT_CPR | | ||||
| 		FEAT_PRELOAD | FEAT_FIR_COEF_V, | ||||
| 		FEAT_PRELOAD | FEAT_FIR_COEF_V | FEAT_ALPHA_FREE_ZORDER, | ||||
| 
 | ||||
| 	.num_mgrs = 3, | ||||
| 	.num_ovls = 3, | ||||
| 	.num_ovls = 4, | ||||
| 	.supported_displays = omap4_dss_supported_displays, | ||||
| 	.supported_color_modes = omap4_dss_supported_color_modes, | ||||
| 	.overlay_caps = omap4_dss_overlay_caps, | ||||
| 	.clksrc_names = omap4_dss_clk_source_names, | ||||
| 	.dss_params = omap4_dss_param_range, | ||||
| 	.buffer_size_unit = 16, | ||||
| 	.burst_size_unit = 16, | ||||
| }; | ||||
| 
 | ||||
| #if defined(CONFIG_OMAP4_DSS_HDMI) | ||||
| /* HDMI OMAP4 Functions*/ | ||||
| static const struct ti_hdmi_ip_ops omap4_hdmi_functions = { | ||||
| 
 | ||||
| 	.video_configure	=	ti_hdmi_4xxx_basic_configure, | ||||
| 	.phy_enable		=	ti_hdmi_4xxx_phy_enable, | ||||
| 	.phy_disable		=	ti_hdmi_4xxx_phy_disable, | ||||
| 	.read_edid		=	ti_hdmi_4xxx_read_edid, | ||||
| 	.detect			=	ti_hdmi_4xxx_detect, | ||||
| 	.pll_enable		=	ti_hdmi_4xxx_pll_enable, | ||||
| 	.pll_disable		=	ti_hdmi_4xxx_pll_disable, | ||||
| 	.video_enable		=	ti_hdmi_4xxx_wp_video_start, | ||||
| 	.dump_wrapper		=	ti_hdmi_4xxx_wp_dump, | ||||
| 	.dump_core		=	ti_hdmi_4xxx_core_dump, | ||||
| 	.dump_pll		=	ti_hdmi_4xxx_pll_dump, | ||||
| 	.dump_phy		=	ti_hdmi_4xxx_phy_dump, | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| void dss_init_hdmi_ip_ops(struct hdmi_ip_data *ip_data) | ||||
| { | ||||
| 	if (cpu_is_omap44xx()) | ||||
| 		ip_data->ops = &omap4_hdmi_functions; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /* Functions returning values related to a DSS feature */ | ||||
| int dss_feat_get_num_mgrs(void) | ||||
| { | ||||
|  | @ -407,6 +506,11 @@ enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane) | |||
| 	return omap_current_dss_features->supported_color_modes[plane]; | ||||
| } | ||||
| 
 | ||||
| enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane) | ||||
| { | ||||
| 	return omap_current_dss_features->overlay_caps[plane]; | ||||
| } | ||||
| 
 | ||||
| bool dss_feat_color_mode_supported(enum omap_plane plane, | ||||
| 		enum omap_color_mode color_mode) | ||||
| { | ||||
|  |  | |||
|  | @ -20,16 +20,17 @@ | |||
| #ifndef __OMAP2_DSS_FEATURES_H | ||||
| #define __OMAP2_DSS_FEATURES_H | ||||
| 
 | ||||
| #if defined(CONFIG_OMAP4_DSS_HDMI) | ||||
| #include "ti_hdmi.h" | ||||
| #endif | ||||
| 
 | ||||
| #define MAX_DSS_MANAGERS	3 | ||||
| #define MAX_DSS_OVERLAYS	3 | ||||
| #define MAX_DSS_OVERLAYS	4 | ||||
| #define MAX_DSS_LCD_MANAGERS	2 | ||||
| #define MAX_NUM_DSI		2 | ||||
| 
 | ||||
| /* 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, | ||||
|  | @ -55,6 +56,8 @@ enum dss_feat_id { | |||
| 	FEAT_CPR			= 1 << 23, | ||||
| 	FEAT_PRELOAD			= 1 << 24, | ||||
| 	FEAT_FIR_COEF_V			= 1 << 25, | ||||
| 	FEAT_ALPHA_FIXED_ZORDER		= 1 << 26, | ||||
| 	FEAT_ALPHA_FREE_ZORDER		= 1 << 27, | ||||
| }; | ||||
| 
 | ||||
| /* DSS register field id */ | ||||
|  | @ -75,12 +78,14 @@ enum dss_feat_reg_field { | |||
| 
 | ||||
| enum dss_range_param { | ||||
| 	FEAT_PARAM_DSS_FCK, | ||||
| 	FEAT_PARAM_DSS_PCD, | ||||
| 	FEAT_PARAM_DSIPLL_REGN, | ||||
| 	FEAT_PARAM_DSIPLL_REGM, | ||||
| 	FEAT_PARAM_DSIPLL_REGM_DISPC, | ||||
| 	FEAT_PARAM_DSIPLL_REGM_DSI, | ||||
| 	FEAT_PARAM_DSIPLL_FINT, | ||||
| 	FEAT_PARAM_DSIPLL_LPDIV, | ||||
| 	FEAT_PARAM_DOWNSCALE, | ||||
| }; | ||||
| 
 | ||||
| /* DSS Feature Functions */ | ||||
|  | @ -90,6 +95,7 @@ unsigned long dss_feat_get_param_min(enum dss_range_param param); | |||
| unsigned long dss_feat_get_param_max(enum dss_range_param param); | ||||
| 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); | ||||
| enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane); | ||||
| bool dss_feat_color_mode_supported(enum omap_plane plane, | ||||
| 		enum omap_color_mode color_mode); | ||||
| const char *dss_feat_get_clk_source_name(enum omap_dss_clk_source id); | ||||
|  | @ -100,4 +106,7 @@ u32 dss_feat_get_burst_size_unit(void);		/* in bytes */ | |||
| 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); | ||||
| void dss_features_init(void); | ||||
| #if defined(CONFIG_OMAP4_DSS_HDMI) | ||||
| void dss_init_hdmi_ip_ops(struct hdmi_ip_data *ip_data); | ||||
| #endif | ||||
| #endif | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,5 +1,5 @@ | |||
| /*
 | ||||
|  * hdmi_omap4_panel.c | ||||
|  * hdmi_panel.c | ||||
|  * | ||||
|  * HDMI library support functions for TI OMAP4 processors. | ||||
|  * | ||||
|  | @ -25,6 +25,7 @@ | |||
| #include <linux/mutex.h> | ||||
| #include <linux/module.h> | ||||
| #include <video/omapdss.h> | ||||
| #include <linux/slab.h> | ||||
| 
 | ||||
| #include "dss.h" | ||||
| 
 | ||||
|  | @ -40,13 +41,7 @@ static int hdmi_panel_probe(struct omap_dss_device *dssdev) | |||
| 	dssdev->panel.config = OMAP_DSS_LCD_TFT | | ||||
| 			OMAP_DSS_LCD_IVS | OMAP_DSS_LCD_IHS; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Initialize the timings to 640 * 480 | ||||
| 	 * This is only for framebuffer update not for TV timing setting | ||||
| 	 * Setting TV timing will be done only on enable | ||||
| 	 */ | ||||
| 	dssdev->panel.timings.x_res = 640; | ||||
| 	dssdev->panel.timings.y_res = 480; | ||||
| 	dssdev->panel.timings = (struct omap_video_timings){640, 480, 25175, 96, 16, 48, 2 , 11, 31}; | ||||
| 
 | ||||
| 	DSSDBG("hdmi_panel_probe x_res= %d y_res = %d\n", | ||||
| 		dssdev->panel.timings.x_res, | ||||
|  | @ -161,12 +156,7 @@ static void hdmi_set_timings(struct omap_dss_device *dssdev, | |||
| 	mutex_lock(&hdmi.hdmi_lock); | ||||
| 
 | ||||
| 	dssdev->panel.timings = *timings; | ||||
| 
 | ||||
| 	if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { | ||||
| 		/* turn the hdmi off and on to get new timings to use */ | ||||
| 		omapdss_hdmi_display_disable(dssdev); | ||||
| 		omapdss_hdmi_display_set_timing(dssdev); | ||||
| 	} | ||||
| 	omapdss_hdmi_display_set_timing(dssdev); | ||||
| 
 | ||||
| 	mutex_unlock(&hdmi.hdmi_lock); | ||||
| } | ||||
|  | @ -181,12 +171,54 @@ static int hdmi_check_timings(struct omap_dss_device *dssdev, | |||
| 	mutex_lock(&hdmi.hdmi_lock); | ||||
| 
 | ||||
| 	r = omapdss_hdmi_display_check_timing(dssdev, timings); | ||||
| 	if (r) { | ||||
| 		DSSERR("Timing cannot be applied\n"); | ||||
| 		goto err; | ||||
| 
 | ||||
| 	mutex_unlock(&hdmi.hdmi_lock); | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static int hdmi_read_edid(struct omap_dss_device *dssdev, u8 *buf, int len) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	mutex_lock(&hdmi.hdmi_lock); | ||||
| 
 | ||||
| 	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) { | ||||
| 		r = omapdss_hdmi_display_enable(dssdev); | ||||
| 		if (r) | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	r = omapdss_hdmi_read_edid(buf, len); | ||||
| 
 | ||||
| 	if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED || | ||||
| 			dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED) | ||||
| 		omapdss_hdmi_display_disable(dssdev); | ||||
| err: | ||||
| 	mutex_unlock(&hdmi.hdmi_lock); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
| static bool hdmi_detect(struct omap_dss_device *dssdev) | ||||
| { | ||||
| 	int r; | ||||
| 
 | ||||
| 	mutex_lock(&hdmi.hdmi_lock); | ||||
| 
 | ||||
| 	if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) { | ||||
| 		r = omapdss_hdmi_display_enable(dssdev); | ||||
| 		if (r) | ||||
| 			goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	r = omapdss_hdmi_detect(); | ||||
| 
 | ||||
| 	if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED || | ||||
| 			dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED) | ||||
| 		omapdss_hdmi_display_disable(dssdev); | ||||
| err: | ||||
| 	mutex_unlock(&hdmi.hdmi_lock); | ||||
| 
 | ||||
| 	return r; | ||||
| } | ||||
| 
 | ||||
|  | @ -200,6 +232,8 @@ static struct omap_dss_driver hdmi_driver = { | |||
| 	.get_timings	= hdmi_get_timings, | ||||
| 	.set_timings	= hdmi_set_timings, | ||||
| 	.check_timings	= hdmi_check_timings, | ||||
| 	.read_edid	= hdmi_read_edid, | ||||
| 	.detect		= hdmi_detect, | ||||
| 	.driver			= { | ||||
| 		.name   = "hdmi_panel", | ||||
| 		.owner  = THIS_MODULE, | ||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Linus Torvalds
						Linus Torvalds