diff options
Diffstat (limited to 'arch/arm/mach-davinci/board-dm644x-evm.c')
| -rw-r--r-- | arch/arm/mach-davinci/board-dm644x-evm.c | 227 | 
1 files changed, 165 insertions, 62 deletions
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c index 0ca90b83458..e583e58b5e1 100644 --- a/arch/arm/mach-davinci/board-dm644x-evm.c +++ b/arch/arm/mach-davinci/board-dm644x-evm.c @@ -15,7 +15,7 @@  #include <linux/gpio.h>  #include <linux/i2c.h>  #include <linux/i2c/pcf857x.h> -#include <linux/i2c/at24.h> +#include <linux/platform_data/at24.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/nand.h>  #include <linux/mtd/partitions.h> @@ -23,23 +23,26 @@  #include <linux/phy.h>  #include <linux/clk.h>  #include <linux/videodev2.h> +#include <linux/v4l2-dv-timings.h> +#include <linux/export.h>  #include <media/tvp514x.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> -#include <mach/dm644x.h>  #include <mach/common.h> -#include <mach/i2c.h> +#include <linux/platform_data/i2c-davinci.h>  #include <mach/serial.h>  #include <mach/mux.h> -#include <mach/nand.h> -#include <mach/mmc.h> -#include <mach/usb.h> -#include <mach/aemif.h> +#include <linux/platform_data/mtd-davinci.h> +#include <linux/platform_data/mmc-davinci.h> +#include <linux/platform_data/usb-davinci.h> +#include <linux/platform_data/mtd-davinci-aemif.h> -#define DM644X_EVM_PHY_ID		"0:01" +#include "davinci.h" + +#define DM644X_EVM_PHY_ID		"davinci_mdio-0:01"  #define LXT971_PHY_ID	(0x001378e2)  #define LXT971_PHY_MASK	(0xfffffff0) @@ -150,7 +153,8 @@ static struct davinci_nand_pdata davinci_evm_nandflash_data = {  	.parts		= davinci_evm_nandflash_partition,  	.nr_parts	= ARRAY_SIZE(davinci_evm_nandflash_partition),  	.ecc_mode	= NAND_ECC_HW, -	.options	= NAND_USE_FLASH_BBT, +	.ecc_bits	= 1, +	.bbt_options	= NAND_BBT_USE_FLASH,  	.timing		= &davinci_evm_nandflash_timing,  }; @@ -188,7 +192,7 @@ static struct platform_device davinci_fb_device = {  	.num_resources = 0,  }; -static struct tvp514x_platform_data tvp5146_pdata = { +static struct tvp514x_platform_data dm644xevm_tvp5146_pdata = {  	.clk_polarity = 0,  	.hs_polarity = 1,  	.vs_polarity = 1 @@ -196,7 +200,7 @@ static struct tvp514x_platform_data tvp5146_pdata = {  #define TVP514X_STD_ALL	(V4L2_STD_NTSC | V4L2_STD_PAL)  /* Inputs available at the TVP5146 */ -static struct v4l2_input tvp5146_inputs[] = { +static struct v4l2_input dm644xevm_tvp5146_inputs[] = {  	{  		.index = 0,  		.name = "Composite", @@ -216,7 +220,7 @@ static struct v4l2_input tvp5146_inputs[] = {   * ouput that goes to vpfe. There is a one to one correspondence   * with tvp5146_inputs   */ -static struct vpfe_route tvp5146_routes[] = { +static struct vpfe_route dm644xevm_tvp5146_routes[] = {  	{  		.input = INPUT_CVBS_VI2B,  		.output = OUTPUT_10BIT_422_EMBEDDED_SYNC, @@ -227,13 +231,13 @@ static struct vpfe_route tvp5146_routes[] = {  	},  }; -static struct vpfe_subdev_info vpfe_sub_devs[] = { +static struct vpfe_subdev_info dm644xevm_vpfe_sub_devs[] = {  	{  		.name = "tvp5146",  		.grp_id = 0, -		.num_inputs = ARRAY_SIZE(tvp5146_inputs), -		.inputs = tvp5146_inputs, -		.routes = tvp5146_routes, +		.num_inputs = ARRAY_SIZE(dm644xevm_tvp5146_inputs), +		.inputs = dm644xevm_tvp5146_inputs, +		.routes = dm644xevm_tvp5146_routes,  		.can_route = 1,  		.ccdc_if_params = {  			.if_type = VPFE_BT656, @@ -242,15 +246,15 @@ static struct vpfe_subdev_info vpfe_sub_devs[] = {  		},  		.board_info = {  			I2C_BOARD_INFO("tvp5146", 0x5d), -			.platform_data = &tvp5146_pdata, +			.platform_data = &dm644xevm_tvp5146_pdata,  		},  	},  }; -static struct vpfe_config vpfe_cfg = { -	.num_subdevs = ARRAY_SIZE(vpfe_sub_devs), +static struct vpfe_config dm644xevm_capture_cfg = { +	.num_subdevs = ARRAY_SIZE(dm644xevm_vpfe_sub_devs),  	.i2c_adapter_id = 1, -	.sub_devs = vpfe_sub_devs, +	.sub_devs = dm644xevm_vpfe_sub_devs,  	.card_name = "DM6446 EVM",  	.ccdc = "DM6446 CCDC",  }; @@ -440,11 +444,6 @@ evm_u35_setup(struct i2c_client *client, int gpio, unsigned ngpio, void *c)  	gpio_request(gpio + 7, "nCF_SEL");  	gpio_direction_output(gpio + 7, 1); -	/* irlml6401 switches over 1A, in under 8 msec; -	 * now it can be managed by nDRV_VBUS ... -	 */ -	davinci_setup_usb(1000, 8); -  	return 0;  } @@ -521,13 +520,11 @@ static int dm6444evm_msp430_get_pins(void)  	char buf[4];  	struct i2c_msg msg[2] = {  		{ -			.addr = dm6446evm_msp->addr,  			.flags = 0,  			.len = 2,  			.buf = (void __force *)txbuf,  		},  		{ -			.addr = dm6446evm_msp->addr,  			.flags = I2C_M_RD,  			.len = 4,  			.buf = buf, @@ -538,6 +535,9 @@ static int dm6444evm_msp430_get_pins(void)  	if (!dm6446evm_msp)  		return -ENXIO; +	msg[0].addr = dm6446evm_msp->addr; +	msg[1].addr = dm6446evm_msp->addr; +  	/* Command 4 == get input state, returns port 2 and port3 data  	 *   S Addr W [A] len=2 [A] cmd=4 [A]  	 *   RS Addr R [A] [len=4] A [cmd=4] A [port2] A [port3] N P @@ -571,7 +571,6 @@ static struct davinci_mmc_config dm6446evm_mmc_config = {  	.get_cd		= dm6444evm_mmc_get_cd,  	.get_ro		= dm6444evm_mmc_get_ro,  	.wires		= 4, -	.version	= MMC_CTLR_VERSION_1  };  static struct i2c_board_info __initdata i2c_info[] =  { @@ -616,20 +615,121 @@ static void __init evm_init_i2c(void)  	i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));  } +#define VENC_STD_ALL	(V4L2_STD_NTSC | V4L2_STD_PAL) + +/* venc standard timings */ +static struct vpbe_enc_mode_info dm644xevm_enc_std_timing[] = { +	{ +		.name		= "ntsc", +		.timings_type	= VPBE_ENC_STD, +		.std_id		= V4L2_STD_NTSC, +		.interlaced	= 1, +		.xres		= 720, +		.yres		= 480, +		.aspect		= {11, 10}, +		.fps		= {30000, 1001}, +		.left_margin	= 0x79, +		.upper_margin	= 0x10, +	}, +	{ +		.name		= "pal", +		.timings_type	= VPBE_ENC_STD, +		.std_id		= V4L2_STD_PAL, +		.interlaced	= 1, +		.xres		= 720, +		.yres		= 576, +		.aspect		= {54, 59}, +		.fps		= {25, 1}, +		.left_margin	= 0x7e, +		.upper_margin	= 0x16, +	}, +}; + +/* venc dv preset timings */ +static struct vpbe_enc_mode_info dm644xevm_enc_preset_timing[] = { +	{ +		.name		= "480p59_94", +		.timings_type	= VPBE_ENC_DV_TIMINGS, +		.dv_timings	= V4L2_DV_BT_CEA_720X480P59_94, +		.interlaced	= 0, +		.xres		= 720, +		.yres		= 480, +		.aspect		= {1, 1}, +		.fps		= {5994, 100}, +		.left_margin	= 0x80, +		.upper_margin	= 0x20, +	}, +	{ +		.name		= "576p50", +		.timings_type	= VPBE_ENC_DV_TIMINGS, +		.dv_timings	= V4L2_DV_BT_CEA_720X576P50, +		.interlaced	= 0, +		.xres		= 720, +		.yres		= 576, +		.aspect		= {1, 1}, +		.fps		= {50, 1}, +		.left_margin	= 0x7e, +		.upper_margin	= 0x30, +	}, +}; + +/* + * The outputs available from VPBE + encoders. Keep the order same + * as that of encoders. First those from venc followed by that from + * encoders. Index in the output refers to index on a particular encoder. + * Driver uses this index to pass it to encoder when it supports more + * than one output. Userspace applications use index of the array to + * set an output. + */ +static struct vpbe_output dm644xevm_vpbe_outputs[] = { +	{ +		.output		= { +			.index		= 0, +			.name		= "Composite", +			.type		= V4L2_OUTPUT_TYPE_ANALOG, +			.std		= VENC_STD_ALL, +			.capabilities	= V4L2_OUT_CAP_STD, +		}, +		.subdev_name	= DM644X_VPBE_VENC_SUBDEV_NAME, +		.default_mode	= "ntsc", +		.num_modes	= ARRAY_SIZE(dm644xevm_enc_std_timing), +		.modes		= dm644xevm_enc_std_timing, +	}, +	{ +		.output		= { +			.index		= 1, +			.name		= "Component", +			.type		= V4L2_OUTPUT_TYPE_ANALOG, +			.capabilities	= V4L2_OUT_CAP_DV_TIMINGS, +		}, +		.subdev_name	= DM644X_VPBE_VENC_SUBDEV_NAME, +		.default_mode	= "480p59_94", +		.num_modes	= ARRAY_SIZE(dm644xevm_enc_preset_timing), +		.modes		= dm644xevm_enc_preset_timing, +	}, +}; + +static struct vpbe_config dm644xevm_display_cfg = { +	.module_name	= "dm644x-vpbe-display", +	.i2c_adapter_id	= 1, +	.osd		= { +		.module_name	= DM644X_VPBE_OSD_SUBDEV_NAME, +	}, +	.venc		= { +		.module_name	= DM644X_VPBE_VENC_SUBDEV_NAME, +	}, +	.num_outputs	= ARRAY_SIZE(dm644xevm_vpbe_outputs), +	.outputs	= dm644xevm_vpbe_outputs, +}; +  static struct platform_device *davinci_evm_devices[] __initdata = {  	&davinci_fb_device,  	&rtc_dev,  }; -static struct davinci_uart_config uart_config __initdata = { -	.enabled_uarts = (1 << 0), -}; -  static void __init  davinci_evm_map_io(void)  { -	/* setup input configuration for VPFE input devices */ -	dm644x_set_vpfe_config(&vpfe_cfg);  	dm644x_init();  } @@ -646,34 +746,24 @@ static int davinci_phy_fixup(struct phy_device *phydev)  	return 0;  } -#if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \ -    defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE) -#define HAS_ATA 1 -#else -#define HAS_ATA 0 -#endif - -#if defined(CONFIG_MTD_PHYSMAP) || \ -    defined(CONFIG_MTD_PHYSMAP_MODULE) -#define HAS_NOR 1 -#else -#define HAS_NOR 0 -#endif - -#if defined(CONFIG_MTD_NAND_DAVINCI) || \ -    defined(CONFIG_MTD_NAND_DAVINCI_MODULE) -#define HAS_NAND 1 -#else -#define HAS_NAND 0 -#endif +#define HAS_ATA		IS_ENABLED(CONFIG_BLK_DEV_PALMCHIP_BK3710) + +#define HAS_NOR		IS_ENABLED(CONFIG_MTD_PHYSMAP) + +#define HAS_NAND	IS_ENABLED(CONFIG_MTD_NAND_DAVINCI)  static __init void davinci_evm_init(void)  { +	int ret;  	struct clk *aemif_clk;  	struct davinci_soc_info *soc_info = &davinci_soc_info; +	ret = dm644x_gpio_register(); +	if (ret) +		pr_warn("%s: GPIO init failed: %d\n", __func__, ret); +  	aemif_clk = clk_get(NULL, "aemif"); -	clk_enable(aemif_clk); +	clk_prepare_enable(aemif_clk);  	if (HAS_ATA) {  		if (HAS_NAND || HAS_NOR) @@ -688,6 +778,11 @@ static __init void davinci_evm_init(void)  		/* only one device will be jumpered and detected */  		if (HAS_NAND) {  			platform_device_register(&davinci_evm_nandflash_device); + +			if (davinci_aemif_setup(&davinci_evm_nandflash_device)) +				pr_warn("%s: Cannot configure AEMIF.\n", +					__func__); +  			evm_leds[7].default_trigger = "nand-disk";  			if (HAS_NOR)  				pr_warning("WARNING: both NAND and NOR flash " @@ -701,22 +796,30 @@ static __init void davinci_evm_init(void)  	evm_init_i2c();  	davinci_setup_mmc(0, &dm6446evm_mmc_config); +	dm644x_init_video(&dm644xevm_capture_cfg, &dm644xevm_display_cfg); -	davinci_serial_init(&uart_config); +	davinci_serial_init(dm644x_serial_device);  	dm644x_init_asp(&dm644x_evm_snd_data); -	soc_info->emac_pdata->phy_id = DM644X_EVM_PHY_ID; -	/* Register the fixup for PHY on DaVinci */ -	phy_register_fixup_for_uid(LXT971_PHY_ID, LXT971_PHY_MASK, -					davinci_phy_fixup); +	/* irlml6401 switches over 1A, in under 8 msec */ +	davinci_setup_usb(1000, 8); +	if (IS_BUILTIN(CONFIG_PHYLIB)) { +		soc_info->emac_pdata->phy_id = DM644X_EVM_PHY_ID; +		/* Register the fixup for PHY on DaVinci */ +		phy_register_fixup_for_uid(LXT971_PHY_ID, LXT971_PHY_MASK, +						davinci_phy_fixup); +	}  }  MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM")  	/* Maintainer: MontaVista Software <source@mvista.com> */ -	.boot_params  = (DAVINCI_DDR_BASE + 0x100), +	.atag_offset  = 0x100,  	.map_io	      = davinci_evm_map_io,  	.init_irq     = davinci_irq_init, -	.timer	      = &davinci_timer, +	.init_time	= davinci_timer_init,  	.init_machine = davinci_evm_init, +	.init_late	= davinci_init_late, +	.dma_zone_size	= SZ_128M, +	.restart	= davinci_restart,  MACHINE_END  | 
