| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 | 
							- /*
 
-  * CompuLab CM-T35/CM-T3730 modules support
 
-  *
 
-  * Copyright (C) 2009-2011 CompuLab, Ltd.
 
-  * Authors: Mike Rapoport <mike@compulab.co.il>
 
-  *	    Igor Grinberg <grinberg@compulab.co.il>
 
-  *
 
-  * 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.
 
-  *
 
-  */
 
- #include <linux/kernel.h>
 
- #include <linux/init.h>
 
- #include <linux/platform_device.h>
 
- #include <linux/input.h>
 
- #include <linux/input/matrix_keypad.h>
 
- #include <linux/delay.h>
 
- #include <linux/gpio.h>
 
- #include <linux/platform_data/gpio-omap.h>
 
- #include <linux/i2c/at24.h>
 
- #include <linux/i2c/twl.h>
 
- #include <linux/regulator/fixed.h>
 
- #include <linux/regulator/machine.h>
 
- #include <linux/mmc/host.h>
 
- #include <linux/spi/spi.h>
 
- #include <linux/spi/tdo24m.h>
 
- #include <asm/mach-types.h>
 
- #include <asm/mach/arch.h>
 
- #include <asm/mach/map.h>
 
- #include <linux/platform_data/mtd-nand-omap2.h>
 
- #include <video/omapdss.h>
 
- #include <video/omap-panel-generic-dpi.h>
 
- #include <video/omap-panel-tfp410.h>
 
- #include <linux/platform_data/spi-omap2-mcspi.h>
 
- #include "common.h"
 
- #include "mux.h"
 
- #include "sdram-micron-mt46h32m32lf-6.h"
 
- #include "hsmmc.h"
 
- #include "common-board-devices.h"
 
- #include "gpmc.h"
 
- #include "gpmc-nand.h"
 
- #define CM_T35_GPIO_PENDOWN		57
 
- #define SB_T35_USB_HUB_RESET_GPIO	167
 
- #define CM_T35_SMSC911X_CS	5
 
- #define CM_T35_SMSC911X_GPIO	163
 
- #define SB_T35_SMSC911X_CS	4
 
- #define SB_T35_SMSC911X_GPIO	65
 
- #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
 
- #include <linux/smsc911x.h>
 
- #include "gpmc-smsc911x.h"
 
- static struct omap_smsc911x_platform_data cm_t35_smsc911x_cfg = {
 
- 	.id		= 0,
 
- 	.cs             = CM_T35_SMSC911X_CS,
 
- 	.gpio_irq       = CM_T35_SMSC911X_GPIO,
 
- 	.gpio_reset     = -EINVAL,
 
- 	.flags		= SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
 
- };
 
- static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = {
 
- 	.id		= 1,
 
- 	.cs             = SB_T35_SMSC911X_CS,
 
- 	.gpio_irq       = SB_T35_SMSC911X_GPIO,
 
- 	.gpio_reset     = -EINVAL,
 
- 	.flags		= SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
 
- };
 
- static struct regulator_consumer_supply cm_t35_smsc911x_supplies[] = {
 
- 	REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
 
- 	REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
 
- };
 
- static struct regulator_consumer_supply sb_t35_smsc911x_supplies[] = {
 
- 	REGULATOR_SUPPLY("vddvario", "smsc911x.1"),
 
- 	REGULATOR_SUPPLY("vdd33a", "smsc911x.1"),
 
- };
 
- static void __init cm_t35_init_ethernet(void)
 
- {
 
- 	regulator_register_fixed(0, cm_t35_smsc911x_supplies,
 
- 				 ARRAY_SIZE(cm_t35_smsc911x_supplies));
 
- 	regulator_register_fixed(1, sb_t35_smsc911x_supplies,
 
- 				 ARRAY_SIZE(sb_t35_smsc911x_supplies));
 
- 	gpmc_smsc911x_init(&cm_t35_smsc911x_cfg);
 
- 	gpmc_smsc911x_init(&sb_t35_smsc911x_cfg);
 
- }
 
- #else
 
- static inline void __init cm_t35_init_ethernet(void) { return; }
 
- #endif
 
- #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
 
- #include <linux/leds.h>
 
- static struct gpio_led cm_t35_leds[] = {
 
- 	[0] = {
 
- 		.gpio			= 186,
 
- 		.name			= "cm-t35:green",
 
- 		.default_trigger	= "heartbeat",
 
- 		.active_low		= 0,
 
- 	},
 
- };
 
- static struct gpio_led_platform_data cm_t35_led_pdata = {
 
- 	.num_leds	= ARRAY_SIZE(cm_t35_leds),
 
- 	.leds		= cm_t35_leds,
 
- };
 
- static struct platform_device cm_t35_led_device = {
 
- 	.name		= "leds-gpio",
 
- 	.id		= -1,
 
- 	.dev		= {
 
- 		.platform_data	= &cm_t35_led_pdata,
 
- 	},
 
- };
 
- static void __init cm_t35_init_led(void)
 
- {
 
- 	platform_device_register(&cm_t35_led_device);
 
- }
 
- #else
 
- static inline void cm_t35_init_led(void) {}
 
- #endif
 
- #if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
 
- #include <linux/mtd/mtd.h>
 
- #include <linux/mtd/nand.h>
 
- #include <linux/mtd/partitions.h>
 
- static struct mtd_partition cm_t35_nand_partitions[] = {
 
- 	{
 
- 		.name           = "xloader",
 
- 		.offset         = 0,			/* Offset = 0x00000 */
 
- 		.size           = 4 * NAND_BLOCK_SIZE,
 
- 		.mask_flags     = MTD_WRITEABLE
 
- 	},
 
- 	{
 
- 		.name           = "uboot",
 
- 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x80000 */
 
- 		.size           = 15 * NAND_BLOCK_SIZE,
 
- 	},
 
- 	{
 
- 		.name           = "uboot environment",
 
- 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x260000 */
 
- 		.size           = 2 * NAND_BLOCK_SIZE,
 
- 	},
 
- 	{
 
- 		.name           = "linux",
 
- 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x2A0000 */
 
- 		.size           = 32 * NAND_BLOCK_SIZE,
 
- 	},
 
- 	{
 
- 		.name           = "rootfs",
 
- 		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x6A0000 */
 
- 		.size           = MTDPART_SIZ_FULL,
 
- 	},
 
- };
 
- static struct omap_nand_platform_data cm_t35_nand_data = {
 
- 	.parts			= cm_t35_nand_partitions,
 
- 	.nr_parts		= ARRAY_SIZE(cm_t35_nand_partitions),
 
- 	.cs			= 0,
 
- };
 
- static void __init cm_t35_init_nand(void)
 
- {
 
- 	if (gpmc_nand_init(&cm_t35_nand_data, NULL) < 0)
 
- 		pr_err("CM-T35: Unable to register NAND device\n");
 
- }
 
- #else
 
- static inline void cm_t35_init_nand(void) {}
 
- #endif
 
- #define CM_T35_LCD_EN_GPIO 157
 
- #define CM_T35_LCD_BL_GPIO 58
 
- #define CM_T35_DVI_EN_GPIO 54
 
- static int lcd_enabled;
 
- static int dvi_enabled;
 
- static int cm_t35_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(CM_T35_LCD_EN_GPIO, 1);
 
- 	gpio_set_value(CM_T35_LCD_BL_GPIO, 1);
 
- 	lcd_enabled = 1;
 
- 	return 0;
 
- }
 
- static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)
 
- {
 
- 	lcd_enabled = 0;
 
- 	gpio_set_value(CM_T35_LCD_BL_GPIO, 0);
 
- 	gpio_set_value(CM_T35_LCD_EN_GPIO, 0);
 
- }
 
- static int cm_t35_panel_enable_tv(struct omap_dss_device *dssdev)
 
- {
 
- 	return 0;
 
- }
 
- static void cm_t35_panel_disable_tv(struct omap_dss_device *dssdev)
 
- {
 
- }
 
- static struct panel_generic_dpi_data lcd_panel = {
 
- 	.name			= "toppoly_tdo35s",
 
- 	.platform_enable	= cm_t35_panel_enable_lcd,
 
- 	.platform_disable	= cm_t35_panel_disable_lcd,
 
- };
 
- static struct omap_dss_device cm_t35_lcd_device = {
 
- 	.name			= "lcd",
 
- 	.type			= OMAP_DISPLAY_TYPE_DPI,
 
- 	.driver_name		= "generic_dpi_panel",
 
- 	.data			= &lcd_panel,
 
- 	.phy.dpi.data_lines	= 18,
 
- };
 
- static struct tfp410_platform_data dvi_panel = {
 
- 	.power_down_gpio	= CM_T35_DVI_EN_GPIO,
 
- 	.i2c_bus_num		= -1,
 
- };
 
- static struct omap_dss_device cm_t35_dvi_device = {
 
- 	.name			= "dvi",
 
- 	.type			= OMAP_DISPLAY_TYPE_DPI,
 
- 	.driver_name		= "tfp410",
 
- 	.data			= &dvi_panel,
 
- 	.phy.dpi.data_lines	= 24,
 
- };
 
- static struct omap_dss_device cm_t35_tv_device = {
 
- 	.name			= "tv",
 
- 	.driver_name		= "venc",
 
- 	.type			= OMAP_DISPLAY_TYPE_VENC,
 
- 	.phy.venc.type		= OMAP_DSS_VENC_TYPE_SVIDEO,
 
- 	.platform_enable	= cm_t35_panel_enable_tv,
 
- 	.platform_disable	= cm_t35_panel_disable_tv,
 
- };
 
- static struct omap_dss_device *cm_t35_dss_devices[] = {
 
- 	&cm_t35_lcd_device,
 
- 	&cm_t35_dvi_device,
 
- 	&cm_t35_tv_device,
 
- };
 
- static struct omap_dss_board_info cm_t35_dss_data = {
 
- 	.num_devices	= ARRAY_SIZE(cm_t35_dss_devices),
 
- 	.devices	= cm_t35_dss_devices,
 
- 	.default_device	= &cm_t35_dvi_device,
 
- };
 
- static struct omap2_mcspi_device_config tdo24m_mcspi_config = {
 
- 	.turbo_mode	= 0,
 
- };
 
- static struct tdo24m_platform_data tdo24m_config = {
 
- 	.model = TDO35S,
 
- };
 
- static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = {
 
- 	{
 
- 		.modalias		= "tdo24m",
 
- 		.bus_num		= 4,
 
- 		.chip_select		= 0,
 
- 		.max_speed_hz		= 1000000,
 
- 		.controller_data	= &tdo24m_mcspi_config,
 
- 		.platform_data		= &tdo24m_config,
 
- 	},
 
- };
 
- static struct gpio cm_t35_dss_gpios[] __initdata = {
 
- 	{ CM_T35_LCD_EN_GPIO, GPIOF_OUT_INIT_LOW,  "lcd enable"    },
 
- 	{ CM_T35_LCD_BL_GPIO, GPIOF_OUT_INIT_LOW,  "lcd bl enable" },
 
- };
 
- static void __init cm_t35_init_display(void)
 
- {
 
- 	int err;
 
- 	spi_register_board_info(cm_t35_lcd_spi_board_info,
 
- 				ARRAY_SIZE(cm_t35_lcd_spi_board_info));
 
- 	err = gpio_request_array(cm_t35_dss_gpios,
 
- 				 ARRAY_SIZE(cm_t35_dss_gpios));
 
- 	if (err) {
 
- 		pr_err("CM-T35: failed to request DSS control GPIOs\n");
 
- 		return;
 
- 	}
 
- 	gpio_export(CM_T35_LCD_EN_GPIO, 0);
 
- 	gpio_export(CM_T35_LCD_BL_GPIO, 0);
 
- 	msleep(50);
 
- 	gpio_set_value(CM_T35_LCD_EN_GPIO, 1);
 
- 	err = omap_display_init(&cm_t35_dss_data);
 
- 	if (err) {
 
- 		pr_err("CM-T35: failed to register DSS device\n");
 
- 		gpio_free_array(cm_t35_dss_gpios, ARRAY_SIZE(cm_t35_dss_gpios));
 
- 	}
 
- }
 
- static struct regulator_consumer_supply cm_t35_vmmc1_supply[] = {
 
- 	REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
 
- };
 
- static struct regulator_consumer_supply cm_t35_vsim_supply[] = {
 
- 	REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
 
- };
 
- static struct regulator_consumer_supply cm_t35_vio_supplies[] = {
 
- 	REGULATOR_SUPPLY("vcc", "spi1.0"),
 
- 	REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
 
- 	REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
 
- };
 
- /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
 
- static struct regulator_init_data cm_t35_vmmc1 = {
 
- 	.constraints = {
 
- 		.min_uV			= 1850000,
 
- 		.max_uV			= 3150000,
 
- 		.valid_modes_mask	= REGULATOR_MODE_NORMAL
 
- 					| REGULATOR_MODE_STANDBY,
 
- 		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
 
- 					| REGULATOR_CHANGE_MODE
 
- 					| REGULATOR_CHANGE_STATUS,
 
- 	},
 
- 	.num_consumer_supplies	= ARRAY_SIZE(cm_t35_vmmc1_supply),
 
- 	.consumer_supplies	= cm_t35_vmmc1_supply,
 
- };
 
- /* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
 
- static struct regulator_init_data cm_t35_vsim = {
 
- 	.constraints = {
 
- 		.min_uV			= 1800000,
 
- 		.max_uV			= 3000000,
 
- 		.valid_modes_mask	= REGULATOR_MODE_NORMAL
 
- 					| REGULATOR_MODE_STANDBY,
 
- 		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
 
- 					| REGULATOR_CHANGE_MODE
 
- 					| REGULATOR_CHANGE_STATUS,
 
- 	},
 
- 	.num_consumer_supplies	= ARRAY_SIZE(cm_t35_vsim_supply),
 
- 	.consumer_supplies	= cm_t35_vsim_supply,
 
- };
 
- static struct regulator_init_data cm_t35_vio = {
 
- 	.constraints = {
 
- 		.min_uV			= 1800000,
 
- 		.max_uV			= 1800000,
 
- 		.apply_uV		= true,
 
- 		.valid_modes_mask	= REGULATOR_MODE_NORMAL
 
- 					| REGULATOR_MODE_STANDBY,
 
- 		.valid_ops_mask		= REGULATOR_CHANGE_MODE,
 
- 	},
 
- 	.num_consumer_supplies	= ARRAY_SIZE(cm_t35_vio_supplies),
 
- 	.consumer_supplies	= cm_t35_vio_supplies,
 
- };
 
- static uint32_t cm_t35_keymap[] = {
 
- 	KEY(0, 0, KEY_A),	KEY(0, 1, KEY_B),	KEY(0, 2, KEY_LEFT),
 
- 	KEY(1, 0, KEY_UP),	KEY(1, 1, KEY_ENTER),	KEY(1, 2, KEY_DOWN),
 
- 	KEY(2, 0, KEY_RIGHT),	KEY(2, 1, KEY_C),	KEY(2, 2, KEY_D),
 
- };
 
- static struct matrix_keymap_data cm_t35_keymap_data = {
 
- 	.keymap			= cm_t35_keymap,
 
- 	.keymap_size		= ARRAY_SIZE(cm_t35_keymap),
 
- };
 
- static struct twl4030_keypad_data cm_t35_kp_data = {
 
- 	.keymap_data	= &cm_t35_keymap_data,
 
- 	.rows		= 3,
 
 
  |