Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b12d7b6 authored by Steve Sakoman's avatar Steve Sakoman Committed by Tomi Valkeinen
Browse files

OMAP: DSS2: Add DSS2 support for Overo



This patch adds DSS2 support for DVI, S-video, the 480x272 Samsung
LTE430WQ-F0C panel, and the 320x240 LG.Philips LB035Q02 panel.

Signed-off-by: default avatarSteve Sakoman <steve@sakoman.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 7654b4d3
Loading
Loading
Loading
Loading
+200 −37
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/i2c/twl.h>
#include <linux/i2c/twl.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/machine.h>
#include <linux/spi/spi.h>


#include <linux/mtd/mtd.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand.h>
@@ -41,10 +42,14 @@


#include <plat/board.h>
#include <plat/board.h>
#include <plat/common.h>
#include <plat/common.h>
#include <plat/display.h>
#include <plat/panel-generic-dpi.h>
#include <mach/gpio.h>
#include <mach/gpio.h>
#include <plat/gpmc.h>
#include <plat/gpmc.h>
#include <mach/hardware.h>
#include <mach/hardware.h>
#include <plat/nand.h>
#include <plat/nand.h>
#include <plat/mcspi.h>
#include <plat/mux.h>
#include <plat/usb.h>
#include <plat/usb.h>


#include "mux.h"
#include "mux.h"
@@ -68,8 +73,6 @@
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
	defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
	defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)


#include <plat/mcspi.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/spi/ads7846.h>


static struct omap2_mcspi_device_config ads7846_mcspi_config = {
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
@@ -94,18 +97,6 @@ static struct ads7846_platform_data ads7846_config = {
	.keep_vref_on		= 1,
	.keep_vref_on		= 1,
};
};


static struct spi_board_info overo_spi_board_info[] __initdata = {
	{
		.modalias		= "ads7846",
		.bus_num		= 1,
		.chip_select		= 0,
		.max_speed_hz		= 1500000,
		.controller_data	= &ads7846_mcspi_config,
		.irq			= OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN),
		.platform_data		= &ads7846_config,
	}
};

static void __init overo_ads7846_init(void)
static void __init overo_ads7846_init(void)
{
{
	if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
	if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
@@ -115,9 +106,6 @@ static void __init overo_ads7846_init(void)
		printk(KERN_ERR "could not obtain gpio for ADS7846_PENDOWN\n");
		printk(KERN_ERR "could not obtain gpio for ADS7846_PENDOWN\n");
		return;
		return;
	}
	}

	spi_register_board_info(overo_spi_board_info,
			ARRAY_SIZE(overo_spi_board_info));
}
}


#else
#else
@@ -233,6 +221,137 @@ static inline void __init overo_init_smsc911x(void)
static inline void __init overo_init_smsc911x(void) { return; }
static inline void __init overo_init_smsc911x(void) { return; }
#endif
#endif


/* DSS */
static int lcd_enabled;
static int dvi_enabled;

#define OVERO_GPIO_LCD_EN 144
#define OVERO_GPIO_LCD_BL 145

static void __init overo_display_init(void)
{
	if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) &&
	    (gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0))
		gpio_export(OVERO_GPIO_LCD_EN, 0);
	else
		printk(KERN_ERR "could not obtain gpio for "
					"OVERO_GPIO_LCD_EN\n");

	if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) &&
	    (gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0))
		gpio_export(OVERO_GPIO_LCD_BL, 0);
	else
		printk(KERN_ERR "could not obtain gpio for "
					"OVERO_GPIO_LCD_BL\n");
}

static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
{
	if (lcd_enabled) {
		printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
		return -EINVAL;
	}
	dvi_enabled = 1;

	return 0;
}

static void overo_panel_disable_dvi(struct omap_dss_device *dssdev)
{
	dvi_enabled = 0;
}

static struct panel_generic_dpi_data dvi_panel = {
	.name			= "generic",
	.platform_enable	= overo_panel_enable_dvi,
	.platform_disable	= overo_panel_disable_dvi,
};

static struct omap_dss_device overo_dvi_device = {
	.name			= "dvi",
	.type			= OMAP_DISPLAY_TYPE_DPI,
	.driver_name		= "generic_dpi_panel",
	.data			= &dvi_panel,
	.phy.dpi.data_lines	= 24,
};

static struct omap_dss_device overo_tv_device = {
	.name = "tv",
	.driver_name = "venc",
	.type = OMAP_DISPLAY_TYPE_VENC,
	.phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
};

static int overo_panel_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(OVERO_GPIO_LCD_EN, 1);
	gpio_set_value(OVERO_GPIO_LCD_BL, 1);
	lcd_enabled = 1;
	return 0;
}

static void overo_panel_disable_lcd(struct omap_dss_device *dssdev)
{
	gpio_set_value(OVERO_GPIO_LCD_EN, 0);
	gpio_set_value(OVERO_GPIO_LCD_BL, 0);
	lcd_enabled = 0;
}

static struct panel_generic_dpi_data lcd43_panel = {
	.name			= "samsung_lte430wq_f0c",
	.platform_enable	= overo_panel_enable_lcd,
	.platform_disable	= overo_panel_disable_lcd,
};

static struct omap_dss_device overo_lcd43_device = {
	.name			= "lcd43",
	.type			= OMAP_DISPLAY_TYPE_DPI,
	.driver_name		= "generic_dpi_panel",
	.data			= &lcd43_panel,
	.phy.dpi.data_lines	= 24,
};

#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
	defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
static struct omap_dss_device overo_lcd35_device = {
	.type			= OMAP_DISPLAY_TYPE_DPI,
	.name			= "lcd35",
	.driver_name		= "lgphilips_lb035q02_panel",
	.phy.dpi.data_lines	= 24,
	.platform_enable	= overo_panel_enable_lcd,
	.platform_disable	= overo_panel_disable_lcd,
};
#endif

static struct omap_dss_device *overo_dss_devices[] = {
	&overo_dvi_device,
	&overo_tv_device,
#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
	defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
	&overo_lcd35_device,
#endif
	&overo_lcd43_device,
};

static struct omap_dss_board_info overo_dss_data = {
	.num_devices	= ARRAY_SIZE(overo_dss_devices),
	.devices	= overo_dss_devices,
	.default_device	= &overo_dvi_device,
};

static struct regulator_consumer_supply overo_vdda_dac_supply =
	REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");

static struct regulator_consumer_supply overo_vdds_dsi_supply[] = {
	REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
};

static struct mtd_partition overo_nand_partitions[] = {
static struct mtd_partition overo_nand_partitions[] = {
	{
	{
		.name           = "xloader",
		.name           = "xloader",
@@ -358,6 +477,35 @@ static struct regulator_init_data overo_vmmc1 = {
	.consumer_supplies	= &overo_vmmc1_supply,
	.consumer_supplies	= &overo_vmmc1_supply,
};
};


/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
static struct regulator_init_data overo_vdac = {
	.constraints = {
		.min_uV			= 1800000,
		.max_uV			= 1800000,
		.valid_modes_mask	= REGULATOR_MODE_NORMAL
					| REGULATOR_MODE_STANDBY,
		.valid_ops_mask		= REGULATOR_CHANGE_MODE
					| REGULATOR_CHANGE_STATUS,
	},
	.num_consumer_supplies	= 1,
	.consumer_supplies	= &overo_vdda_dac_supply,
};

/* VPLL2 for digital video outputs */
static struct regulator_init_data overo_vpll2 = {
	.constraints = {
		.name			= "VDVI",
		.min_uV			= 1800000,
		.max_uV			= 1800000,
		.valid_modes_mask	= REGULATOR_MODE_NORMAL
					| REGULATOR_MODE_STANDBY,
		.valid_ops_mask		= REGULATOR_CHANGE_MODE
					| REGULATOR_CHANGE_STATUS,
	},
	.num_consumer_supplies	= ARRAY_SIZE(overo_vdds_dsi_supply),
	.consumer_supplies	= overo_vdds_dsi_supply,
};

static struct twl4030_codec_audio_data overo_audio_data;
static struct twl4030_codec_audio_data overo_audio_data;


static struct twl4030_codec_data overo_codec_data = {
static struct twl4030_codec_data overo_codec_data = {
@@ -365,8 +513,6 @@ static struct twl4030_codec_data overo_codec_data = {
	.audio = &overo_audio_data,
	.audio = &overo_audio_data,
};
};


/* mmc2 (WLAN) and Bluetooth don't use twl4030 regulators */

static struct twl4030_platform_data overo_twldata = {
static struct twl4030_platform_data overo_twldata = {
	.irq_base	= TWL4030_IRQ_BASE,
	.irq_base	= TWL4030_IRQ_BASE,
	.irq_end	= TWL4030_IRQ_END,
	.irq_end	= TWL4030_IRQ_END,
@@ -374,6 +520,8 @@ static struct twl4030_platform_data overo_twldata = {
	.usb		= &overo_usb_data,
	.usb		= &overo_usb_data,
	.codec		= &overo_codec_data,
	.codec		= &overo_codec_data,
	.vmmc1		= &overo_vmmc1,
	.vmmc1		= &overo_vmmc1,
	.vdac		= &overo_vdac,
	.vpll2		= &overo_vpll2,
};
};


static struct i2c_board_info __initdata overo_i2c_boardinfo[] = {
static struct i2c_board_info __initdata overo_i2c_boardinfo[] = {
@@ -394,18 +542,38 @@ static int __init overo_i2c_init(void)
	return 0;
	return 0;
}
}


static struct platform_device overo_lcd_device = {
static struct spi_board_info overo_spi_board_info[] __initdata = {
	.name		= "overo_lcd",
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
	.id		= -1,
	defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
};
	{

		.modalias		= "ads7846",
static struct omap_lcd_config overo_lcd_config __initdata = {
		.bus_num		= 1,
	.ctrl_name	= "internal",
		.chip_select		= 0,
		.max_speed_hz		= 1500000,
		.controller_data	= &ads7846_mcspi_config,
		.irq			= OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN),
		.platform_data		= &ads7846_config,
	},
#endif
#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
	defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
	{
		.modalias		= "lgphilips_lb035q02_panel-spi",
		.bus_num		= 1,
		.chip_select		= 1,
		.max_speed_hz		= 500000,
		.mode			= SPI_MODE_3,
	},
#endif
};
};


static struct omap_board_config_kernel overo_config[] __initdata = {
static int __init overo_spi_init(void)
	{ OMAP_TAG_LCD,		&overo_lcd_config },
{
};
	overo_ads7846_init();
	spi_register_board_info(overo_spi_board_info,
			ARRAY_SIZE(overo_spi_board_info));
	return 0;
}


static void __init overo_init_early(void)
static void __init overo_init_early(void)
{
{
@@ -414,10 +582,6 @@ static void __init overo_init_early(void)
				  mt46h32m32lf6_sdrc_params);
				  mt46h32m32lf6_sdrc_params);
}
}


static struct platform_device *overo_devices[] __initdata = {
	&overo_lcd_device,
};

static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
	.port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
	.port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
	.port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
	.port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
@@ -444,16 +608,15 @@ static struct omap_musb_board_data musb_board_data = {
static void __init overo_init(void)
static void __init overo_init(void)
{
{
	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
	omap_board_config = overo_config;
	omap_board_config_size = ARRAY_SIZE(overo_config);
	overo_i2c_init();
	overo_i2c_init();
	platform_add_devices(overo_devices, ARRAY_SIZE(overo_devices));
	omap_display_init(&overo_dss_data);
	omap_serial_init();
	omap_serial_init();
	overo_flash_init();
	overo_flash_init();
	usb_musb_init(&musb_board_data);
	usb_musb_init(&musb_board_data);
	usb_ehci_init(&ehci_pdata);
	usb_ehci_init(&ehci_pdata);
	overo_ads7846_init();
	overo_spi_init();
	overo_init_smsc911x();
	overo_init_smsc911x();
	overo_display_init();


	/* Ensure SDRC pins are mux'd for self-refresh */
	/* Ensure SDRC pins are mux'd for self-refresh */
	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
	omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);