Linux Audio

Check our new training course

Loading...
v4.17
   1/*
   2 * TI DaVinci DM365 chip specific setup
   3 *
   4 * Copyright (C) 2009 Texas Instruments
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License as
   8 * published by the Free Software Foundation version 2.
   9 *
  10 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  11 * kind, whether express or implied; without even the implied warranty
  12 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 */
  15#include <linux/init.h>
  16#include <linux/clk.h>
  17#include <linux/serial_8250.h>
  18#include <linux/platform_device.h>
  19#include <linux/dma-mapping.h>
  20#include <linux/dmaengine.h>
  21#include <linux/spi/spi.h>
  22#include <linux/platform_data/edma.h>
  23#include <linux/platform_data/gpio-davinci.h>
  24#include <linux/platform_data/keyscan-davinci.h>
  25#include <linux/platform_data/spi-davinci.h>
  26
  27#include <asm/mach/map.h>
  28
 
  29#include <mach/cputype.h>
  30#include "psc.h"
 
  31#include <mach/mux.h>
  32#include <mach/irqs.h>
  33#include <mach/time.h>
  34#include <mach/serial.h>
  35#include <mach/common.h>
 
 
 
 
  36
  37#include "davinci.h"
  38#include "clock.h"
  39#include "mux.h"
  40#include "asp.h"
  41
  42#define DM365_REF_FREQ		24000000	/* 24 MHz on the DM365 EVM */
  43#define DM365_RTC_BASE			0x01c69000
  44#define DM365_KEYSCAN_BASE		0x01c69400
  45#define DM365_OSD_BASE			0x01c71c00
  46#define DM365_VENC_BASE			0x01c71e00
  47#define DAVINCI_DM365_VC_BASE		0x01d0c000
  48#define DAVINCI_DMA_VC_TX		2
  49#define DAVINCI_DMA_VC_RX		3
  50#define DM365_EMAC_BASE			0x01d07000
  51#define DM365_EMAC_MDIO_BASE		(DM365_EMAC_BASE + 0x4000)
  52#define DM365_EMAC_CNTRL_OFFSET		0x0000
  53#define DM365_EMAC_CNTRL_MOD_OFFSET	0x3000
  54#define DM365_EMAC_CNTRL_RAM_OFFSET	0x1000
  55#define DM365_EMAC_CNTRL_RAM_SIZE	0x2000
  56
  57static struct pll_data pll1_data = {
  58	.num		= 1,
  59	.phys_base	= DAVINCI_PLL1_BASE,
  60	.flags		= PLL_HAS_POSTDIV | PLL_HAS_PREDIV,
  61};
  62
  63static struct pll_data pll2_data = {
  64	.num		= 2,
  65	.phys_base	= DAVINCI_PLL2_BASE,
  66	.flags		= PLL_HAS_POSTDIV | PLL_HAS_PREDIV,
  67};
  68
  69static struct clk ref_clk = {
  70	.name		= "ref_clk",
  71	.rate		= DM365_REF_FREQ,
  72};
  73
  74static struct clk pll1_clk = {
  75	.name		= "pll1",
  76	.parent		= &ref_clk,
  77	.flags		= CLK_PLL,
  78	.pll_data	= &pll1_data,
  79};
  80
  81static struct clk pll1_aux_clk = {
  82	.name		= "pll1_aux_clk",
  83	.parent		= &pll1_clk,
  84	.flags		= CLK_PLL | PRE_PLL,
  85};
  86
  87static struct clk pll1_sysclkbp = {
  88	.name		= "pll1_sysclkbp",
  89	.parent		= &pll1_clk,
  90	.flags 		= CLK_PLL | PRE_PLL,
  91	.div_reg	= BPDIV
  92};
  93
  94static struct clk clkout0_clk = {
  95	.name		= "clkout0",
  96	.parent		= &pll1_clk,
  97	.flags		= CLK_PLL | PRE_PLL,
  98};
  99
 100static struct clk pll1_sysclk1 = {
 101	.name		= "pll1_sysclk1",
 102	.parent		= &pll1_clk,
 103	.flags		= CLK_PLL,
 104	.div_reg	= PLLDIV1,
 105};
 106
 107static struct clk pll1_sysclk2 = {
 108	.name		= "pll1_sysclk2",
 109	.parent		= &pll1_clk,
 110	.flags		= CLK_PLL,
 111	.div_reg	= PLLDIV2,
 112};
 113
 114static struct clk pll1_sysclk3 = {
 115	.name		= "pll1_sysclk3",
 116	.parent		= &pll1_clk,
 117	.flags		= CLK_PLL,
 118	.div_reg	= PLLDIV3,
 119};
 120
 121static struct clk pll1_sysclk4 = {
 122	.name		= "pll1_sysclk4",
 123	.parent		= &pll1_clk,
 124	.flags		= CLK_PLL,
 125	.div_reg	= PLLDIV4,
 126};
 127
 128static struct clk pll1_sysclk5 = {
 129	.name		= "pll1_sysclk5",
 130	.parent		= &pll1_clk,
 131	.flags		= CLK_PLL,
 132	.div_reg	= PLLDIV5,
 133};
 134
 135static struct clk pll1_sysclk6 = {
 136	.name		= "pll1_sysclk6",
 137	.parent		= &pll1_clk,
 138	.flags		= CLK_PLL,
 139	.div_reg	= PLLDIV6,
 140};
 141
 142static struct clk pll1_sysclk7 = {
 143	.name		= "pll1_sysclk7",
 144	.parent		= &pll1_clk,
 145	.flags		= CLK_PLL,
 146	.div_reg	= PLLDIV7,
 147};
 148
 149static struct clk pll1_sysclk8 = {
 150	.name		= "pll1_sysclk8",
 151	.parent		= &pll1_clk,
 152	.flags		= CLK_PLL,
 153	.div_reg	= PLLDIV8,
 154};
 155
 156static struct clk pll1_sysclk9 = {
 157	.name		= "pll1_sysclk9",
 158	.parent		= &pll1_clk,
 159	.flags		= CLK_PLL,
 160	.div_reg	= PLLDIV9,
 161};
 162
 163static struct clk pll2_clk = {
 164	.name		= "pll2",
 165	.parent		= &ref_clk,
 166	.flags		= CLK_PLL,
 167	.pll_data	= &pll2_data,
 168};
 169
 170static struct clk pll2_aux_clk = {
 171	.name		= "pll2_aux_clk",
 172	.parent		= &pll2_clk,
 173	.flags		= CLK_PLL | PRE_PLL,
 174};
 175
 176static struct clk clkout1_clk = {
 177	.name		= "clkout1",
 178	.parent		= &pll2_clk,
 179	.flags		= CLK_PLL | PRE_PLL,
 180};
 181
 182static struct clk pll2_sysclk1 = {
 183	.name		= "pll2_sysclk1",
 184	.parent		= &pll2_clk,
 185	.flags		= CLK_PLL,
 186	.div_reg	= PLLDIV1,
 187};
 188
 189static struct clk pll2_sysclk2 = {
 190	.name		= "pll2_sysclk2",
 191	.parent		= &pll2_clk,
 192	.flags		= CLK_PLL,
 193	.div_reg	= PLLDIV2,
 194};
 195
 196static struct clk pll2_sysclk3 = {
 197	.name		= "pll2_sysclk3",
 198	.parent		= &pll2_clk,
 199	.flags		= CLK_PLL,
 200	.div_reg	= PLLDIV3,
 201};
 202
 203static struct clk pll2_sysclk4 = {
 204	.name		= "pll2_sysclk4",
 205	.parent		= &pll2_clk,
 206	.flags		= CLK_PLL,
 207	.div_reg	= PLLDIV4,
 208};
 209
 210static struct clk pll2_sysclk5 = {
 211	.name		= "pll2_sysclk5",
 212	.parent		= &pll2_clk,
 213	.flags		= CLK_PLL,
 214	.div_reg	= PLLDIV5,
 215};
 216
 217static struct clk pll2_sysclk6 = {
 218	.name		= "pll2_sysclk6",
 219	.parent		= &pll2_clk,
 220	.flags		= CLK_PLL,
 221	.div_reg	= PLLDIV6,
 222};
 223
 224static struct clk pll2_sysclk7 = {
 225	.name		= "pll2_sysclk7",
 226	.parent		= &pll2_clk,
 227	.flags		= CLK_PLL,
 228	.div_reg	= PLLDIV7,
 229};
 230
 231static struct clk pll2_sysclk8 = {
 232	.name		= "pll2_sysclk8",
 233	.parent		= &pll2_clk,
 234	.flags		= CLK_PLL,
 235	.div_reg	= PLLDIV8,
 236};
 237
 238static struct clk pll2_sysclk9 = {
 239	.name		= "pll2_sysclk9",
 240	.parent		= &pll2_clk,
 241	.flags		= CLK_PLL,
 242	.div_reg	= PLLDIV9,
 243};
 244
 245static struct clk vpss_dac_clk = {
 246	.name		= "vpss_dac",
 247	.parent		= &pll1_sysclk3,
 248	.lpsc		= DM365_LPSC_DAC_CLK,
 249};
 250
 251static struct clk vpss_master_clk = {
 252	.name		= "vpss_master",
 253	.parent		= &pll1_sysclk5,
 254	.lpsc		= DM365_LPSC_VPSSMSTR,
 255	.flags		= CLK_PSC,
 256};
 257
 258static struct clk vpss_slave_clk = {
 259	.name		= "vpss_slave",
 260	.parent		= &pll1_sysclk5,
 261	.lpsc		= DAVINCI_LPSC_VPSSSLV,
 262};
 263
 264static struct clk arm_clk = {
 265	.name		= "arm_clk",
 266	.parent		= &pll2_sysclk2,
 267	.lpsc		= DAVINCI_LPSC_ARM,
 268	.flags		= ALWAYS_ENABLED,
 269};
 270
 271static struct clk uart0_clk = {
 272	.name		= "uart0",
 273	.parent		= &pll1_aux_clk,
 274	.lpsc		= DAVINCI_LPSC_UART0,
 275};
 276
 277static struct clk uart1_clk = {
 278	.name		= "uart1",
 279	.parent		= &pll1_sysclk4,
 280	.lpsc		= DAVINCI_LPSC_UART1,
 281};
 282
 283static struct clk i2c_clk = {
 284	.name		= "i2c",
 285	.parent		= &pll1_aux_clk,
 286	.lpsc		= DAVINCI_LPSC_I2C,
 287};
 288
 289static struct clk mmcsd0_clk = {
 290	.name		= "mmcsd0",
 291	.parent		= &pll1_sysclk8,
 292	.lpsc		= DAVINCI_LPSC_MMC_SD,
 293};
 294
 295static struct clk mmcsd1_clk = {
 296	.name		= "mmcsd1",
 297	.parent		= &pll1_sysclk4,
 298	.lpsc		= DM365_LPSC_MMC_SD1,
 299};
 300
 301static struct clk spi0_clk = {
 302	.name		= "spi0",
 303	.parent		= &pll1_sysclk4,
 304	.lpsc		= DAVINCI_LPSC_SPI,
 305};
 306
 307static struct clk spi1_clk = {
 308	.name		= "spi1",
 309	.parent		= &pll1_sysclk4,
 310	.lpsc		= DM365_LPSC_SPI1,
 311};
 312
 313static struct clk spi2_clk = {
 314	.name		= "spi2",
 315	.parent		= &pll1_sysclk4,
 316	.lpsc		= DM365_LPSC_SPI2,
 317};
 318
 319static struct clk spi3_clk = {
 320	.name		= "spi3",
 321	.parent		= &pll1_sysclk4,
 322	.lpsc		= DM365_LPSC_SPI3,
 323};
 324
 325static struct clk spi4_clk = {
 326	.name		= "spi4",
 327	.parent		= &pll1_aux_clk,
 328	.lpsc		= DM365_LPSC_SPI4,
 329};
 330
 331static struct clk gpio_clk = {
 332	.name		= "gpio",
 333	.parent		= &pll1_sysclk4,
 334	.lpsc		= DAVINCI_LPSC_GPIO,
 335};
 336
 337static struct clk aemif_clk = {
 338	.name		= "aemif",
 339	.parent		= &pll1_sysclk4,
 340	.lpsc		= DAVINCI_LPSC_AEMIF,
 341};
 342
 343static struct clk pwm0_clk = {
 344	.name		= "pwm0",
 345	.parent		= &pll1_aux_clk,
 346	.lpsc		= DAVINCI_LPSC_PWM0,
 347};
 348
 349static struct clk pwm1_clk = {
 350	.name		= "pwm1",
 351	.parent		= &pll1_aux_clk,
 352	.lpsc		= DAVINCI_LPSC_PWM1,
 353};
 354
 355static struct clk pwm2_clk = {
 356	.name		= "pwm2",
 357	.parent		= &pll1_aux_clk,
 358	.lpsc		= DAVINCI_LPSC_PWM2,
 359};
 360
 361static struct clk pwm3_clk = {
 362	.name		= "pwm3",
 363	.parent		= &ref_clk,
 364	.lpsc		= DM365_LPSC_PWM3,
 365};
 366
 367static struct clk timer0_clk = {
 368	.name		= "timer0",
 369	.parent		= &pll1_aux_clk,
 370	.lpsc		= DAVINCI_LPSC_TIMER0,
 371};
 372
 373static struct clk timer1_clk = {
 374	.name		= "timer1",
 375	.parent		= &pll1_aux_clk,
 376	.lpsc		= DAVINCI_LPSC_TIMER1,
 377};
 378
 379static struct clk timer2_clk = {
 380	.name		= "timer2",
 381	.parent		= &pll1_aux_clk,
 382	.lpsc		= DAVINCI_LPSC_TIMER2,
 383	.usecount	= 1,
 384};
 385
 386static struct clk timer3_clk = {
 387	.name		= "timer3",
 388	.parent		= &pll1_aux_clk,
 389	.lpsc		= DM365_LPSC_TIMER3,
 390};
 391
 392static struct clk usb_clk = {
 393	.name		= "usb",
 394	.parent		= &pll1_aux_clk,
 395	.lpsc		= DAVINCI_LPSC_USB,
 396};
 397
 398static struct clk emac_clk = {
 399	.name		= "emac",
 400	.parent		= &pll1_sysclk4,
 401	.lpsc		= DM365_LPSC_EMAC,
 402};
 403
 404static struct clk voicecodec_clk = {
 405	.name		= "voice_codec",
 406	.parent		= &pll2_sysclk4,
 407	.lpsc		= DM365_LPSC_VOICE_CODEC,
 408};
 409
 410static struct clk asp0_clk = {
 411	.name		= "asp0",
 412	.parent		= &pll1_sysclk4,
 413	.lpsc		= DM365_LPSC_McBSP1,
 414};
 415
 416static struct clk rto_clk = {
 417	.name		= "rto",
 418	.parent		= &pll1_sysclk4,
 419	.lpsc		= DM365_LPSC_RTO,
 420};
 421
 422static struct clk mjcp_clk = {
 423	.name		= "mjcp",
 424	.parent		= &pll1_sysclk3,
 425	.lpsc		= DM365_LPSC_MJCP,
 426};
 427
 428static struct clk_lookup dm365_clks[] = {
 429	CLK(NULL, "ref", &ref_clk),
 430	CLK(NULL, "pll1", &pll1_clk),
 431	CLK(NULL, "pll1_aux", &pll1_aux_clk),
 432	CLK(NULL, "pll1_sysclkbp", &pll1_sysclkbp),
 433	CLK(NULL, "clkout0", &clkout0_clk),
 434	CLK(NULL, "pll1_sysclk1", &pll1_sysclk1),
 435	CLK(NULL, "pll1_sysclk2", &pll1_sysclk2),
 436	CLK(NULL, "pll1_sysclk3", &pll1_sysclk3),
 437	CLK(NULL, "pll1_sysclk4", &pll1_sysclk4),
 438	CLK(NULL, "pll1_sysclk5", &pll1_sysclk5),
 439	CLK(NULL, "pll1_sysclk6", &pll1_sysclk6),
 440	CLK(NULL, "pll1_sysclk7", &pll1_sysclk7),
 441	CLK(NULL, "pll1_sysclk8", &pll1_sysclk8),
 442	CLK(NULL, "pll1_sysclk9", &pll1_sysclk9),
 443	CLK(NULL, "pll2", &pll2_clk),
 444	CLK(NULL, "pll2_aux", &pll2_aux_clk),
 445	CLK(NULL, "clkout1", &clkout1_clk),
 446	CLK(NULL, "pll2_sysclk1", &pll2_sysclk1),
 447	CLK(NULL, "pll2_sysclk2", &pll2_sysclk2),
 448	CLK(NULL, "pll2_sysclk3", &pll2_sysclk3),
 449	CLK(NULL, "pll2_sysclk4", &pll2_sysclk4),
 450	CLK(NULL, "pll2_sysclk5", &pll2_sysclk5),
 451	CLK(NULL, "pll2_sysclk6", &pll2_sysclk6),
 452	CLK(NULL, "pll2_sysclk7", &pll2_sysclk7),
 453	CLK(NULL, "pll2_sysclk8", &pll2_sysclk8),
 454	CLK(NULL, "pll2_sysclk9", &pll2_sysclk9),
 455	CLK(NULL, "vpss_dac", &vpss_dac_clk),
 456	CLK("vpss", "master", &vpss_master_clk),
 457	CLK("vpss", "slave", &vpss_slave_clk),
 458	CLK(NULL, "arm", &arm_clk),
 459	CLK("serial8250.0", NULL, &uart0_clk),
 460	CLK("serial8250.1", NULL, &uart1_clk),
 461	CLK("i2c_davinci.1", NULL, &i2c_clk),
 462	CLK("da830-mmc.0", NULL, &mmcsd0_clk),
 463	CLK("da830-mmc.1", NULL, &mmcsd1_clk),
 464	CLK("spi_davinci.0", NULL, &spi0_clk),
 465	CLK("spi_davinci.1", NULL, &spi1_clk),
 466	CLK("spi_davinci.2", NULL, &spi2_clk),
 467	CLK("spi_davinci.3", NULL, &spi3_clk),
 468	CLK("spi_davinci.4", NULL, &spi4_clk),
 469	CLK(NULL, "gpio", &gpio_clk),
 470	CLK(NULL, "aemif", &aemif_clk),
 471	CLK(NULL, "pwm0", &pwm0_clk),
 472	CLK(NULL, "pwm1", &pwm1_clk),
 473	CLK(NULL, "pwm2", &pwm2_clk),
 474	CLK(NULL, "pwm3", &pwm3_clk),
 475	CLK(NULL, "timer0", &timer0_clk),
 476	CLK(NULL, "timer1", &timer1_clk),
 477	CLK("davinci-wdt", NULL, &timer2_clk),
 478	CLK(NULL, "timer3", &timer3_clk),
 479	CLK(NULL, "usb", &usb_clk),
 480	CLK("davinci_emac.1", NULL, &emac_clk),
 481	CLK("davinci_mdio.0", "fck", &emac_clk),
 482	CLK("davinci_voicecodec", NULL, &voicecodec_clk),
 483	CLK("davinci-mcbsp", NULL, &asp0_clk),
 484	CLK(NULL, "rto", &rto_clk),
 485	CLK(NULL, "mjcp", &mjcp_clk),
 486	CLK(NULL, NULL, NULL),
 487};
 488
 489/*----------------------------------------------------------------------*/
 490
 491#define INTMUX		0x18
 492#define EVTMUX		0x1c
 493
 494
 495static const struct mux_config dm365_pins[] = {
 496#ifdef CONFIG_DAVINCI_MUX
 497MUX_CFG(DM365,	MMCSD0,		0,   24,     1,	  0,	 false)
 498
 499MUX_CFG(DM365,	SD1_CLK,	0,   16,    3,	  1,	 false)
 500MUX_CFG(DM365,	SD1_CMD,	4,   30,    3,	  1,	 false)
 501MUX_CFG(DM365,	SD1_DATA3,	4,   28,    3,	  1,	 false)
 502MUX_CFG(DM365,	SD1_DATA2,	4,   26,    3,	  1,	 false)
 503MUX_CFG(DM365,	SD1_DATA1,	4,   24,    3,	  1,	 false)
 504MUX_CFG(DM365,	SD1_DATA0,	4,   22,    3,	  1,	 false)
 505
 506MUX_CFG(DM365,	I2C_SDA,	3,   23,    3,	  2,	 false)
 507MUX_CFG(DM365,	I2C_SCL,	3,   21,    3,	  2,	 false)
 508
 509MUX_CFG(DM365,	AEMIF_AR_A14,	2,   0,     3,	  1,	 false)
 510MUX_CFG(DM365,	AEMIF_AR_BA0,	2,   0,     3,	  2,	 false)
 511MUX_CFG(DM365,	AEMIF_A3,	2,   2,     3,	  1,	 false)
 512MUX_CFG(DM365,	AEMIF_A7,	2,   4,     3,	  1,	 false)
 513MUX_CFG(DM365,	AEMIF_D15_8,	2,   6,     1,	  1,	 false)
 514MUX_CFG(DM365,	AEMIF_CE0,	2,   7,     1,	  0,	 false)
 515MUX_CFG(DM365,	AEMIF_CE1,	2,   8,     1,    0,     false)
 516MUX_CFG(DM365,	AEMIF_WE_OE,	2,   9,     1,    0,     false)
 517
 518MUX_CFG(DM365,	MCBSP0_BDX,	0,   23,    1,	  1,	 false)
 519MUX_CFG(DM365,	MCBSP0_X,	0,   22,    1,	  1,	 false)
 520MUX_CFG(DM365,	MCBSP0_BFSX,	0,   21,    1,	  1,	 false)
 521MUX_CFG(DM365,	MCBSP0_BDR,	0,   20,    1,	  1,	 false)
 522MUX_CFG(DM365,	MCBSP0_R,	0,   19,    1,	  1,	 false)
 523MUX_CFG(DM365,	MCBSP0_BFSR,	0,   18,    1,	  1,	 false)
 524
 525MUX_CFG(DM365,	SPI0_SCLK,	3,   28,    1,    1,	 false)
 526MUX_CFG(DM365,	SPI0_SDI,	3,   26,    3,    1,	 false)
 527MUX_CFG(DM365,	SPI0_SDO,	3,   25,    1,    1,	 false)
 528MUX_CFG(DM365,	SPI0_SDENA0,	3,   29,    3,    1,	 false)
 529MUX_CFG(DM365,	SPI0_SDENA1,	3,   26,    3,    2,	 false)
 530
 531MUX_CFG(DM365,	UART0_RXD,	3,   20,    1,    1,	 false)
 532MUX_CFG(DM365,	UART0_TXD,	3,   19,    1,    1,	 false)
 533MUX_CFG(DM365,	UART1_RXD,	3,   17,    3,    2,	 false)
 534MUX_CFG(DM365,	UART1_TXD,	3,   15,    3,    2,	 false)
 535MUX_CFG(DM365,	UART1_RTS,	3,   23,    3,    1,	 false)
 536MUX_CFG(DM365,	UART1_CTS,	3,   21,    3,    1,	 false)
 537
 538MUX_CFG(DM365,  EMAC_TX_EN,	3,   17,    3,    1,     false)
 539MUX_CFG(DM365,  EMAC_TX_CLK,	3,   15,    3,    1,     false)
 540MUX_CFG(DM365,  EMAC_COL,	3,   14,    1,    1,     false)
 541MUX_CFG(DM365,  EMAC_TXD3,	3,   13,    1,    1,     false)
 542MUX_CFG(DM365,  EMAC_TXD2,	3,   12,    1,    1,     false)
 543MUX_CFG(DM365,  EMAC_TXD1,	3,   11,    1,    1,     false)
 544MUX_CFG(DM365,  EMAC_TXD0,	3,   10,    1,    1,     false)
 545MUX_CFG(DM365,  EMAC_RXD3,	3,   9,     1,    1,     false)
 546MUX_CFG(DM365,  EMAC_RXD2,	3,   8,     1,    1,     false)
 547MUX_CFG(DM365,  EMAC_RXD1,	3,   7,     1,    1,     false)
 548MUX_CFG(DM365,  EMAC_RXD0,	3,   6,     1,    1,     false)
 549MUX_CFG(DM365,  EMAC_RX_CLK,	3,   5,     1,    1,     false)
 550MUX_CFG(DM365,  EMAC_RX_DV,	3,   4,     1,    1,     false)
 551MUX_CFG(DM365,  EMAC_RX_ER,	3,   3,     1,    1,     false)
 552MUX_CFG(DM365,  EMAC_CRS,	3,   2,     1,    1,     false)
 553MUX_CFG(DM365,  EMAC_MDIO,	3,   1,     1,    1,     false)
 554MUX_CFG(DM365,  EMAC_MDCLK,	3,   0,     1,    1,     false)
 555
 556MUX_CFG(DM365,	KEYSCAN,	2,   0,     0x3f, 0x3f,  false)
 557
 558MUX_CFG(DM365,	PWM0,		1,   0,     3,    2,     false)
 559MUX_CFG(DM365,	PWM0_G23,	3,   26,    3,    3,     false)
 560MUX_CFG(DM365,	PWM1,		1,   2,     3,    2,     false)
 561MUX_CFG(DM365,	PWM1_G25,	3,   29,    3,    2,     false)
 562MUX_CFG(DM365,	PWM2_G87,	1,   10,    3,    2,     false)
 563MUX_CFG(DM365,	PWM2_G88,	1,   8,     3,    2,     false)
 564MUX_CFG(DM365,	PWM2_G89,	1,   6,     3,    2,     false)
 565MUX_CFG(DM365,	PWM2_G90,	1,   4,     3,    2,     false)
 566MUX_CFG(DM365,	PWM3_G80,	1,   20,    3,    3,     false)
 567MUX_CFG(DM365,	PWM3_G81,	1,   18,    3,    3,     false)
 568MUX_CFG(DM365,	PWM3_G85,	1,   14,    3,    2,     false)
 569MUX_CFG(DM365,	PWM3_G86,	1,   12,    3,    2,     false)
 570
 571MUX_CFG(DM365,	SPI1_SCLK,	4,   2,     3,    1,	 false)
 572MUX_CFG(DM365,	SPI1_SDI,	3,   31,    1,    1,	 false)
 573MUX_CFG(DM365,	SPI1_SDO,	4,   0,     3,    1,	 false)
 574MUX_CFG(DM365,	SPI1_SDENA0,	4,   4,     3,    1,	 false)
 575MUX_CFG(DM365,	SPI1_SDENA1,	4,   0,     3,    2,	 false)
 576
 577MUX_CFG(DM365,	SPI2_SCLK,	4,   10,    3,    1,	 false)
 578MUX_CFG(DM365,	SPI2_SDI,	4,   6,     3,    1,	 false)
 579MUX_CFG(DM365,	SPI2_SDO,	4,   8,     3,    1,	 false)
 580MUX_CFG(DM365,	SPI2_SDENA0,	4,   12,    3,    1,	 false)
 581MUX_CFG(DM365,	SPI2_SDENA1,	4,   8,     3,    2,	 false)
 582
 583MUX_CFG(DM365,	SPI3_SCLK,	0,   0,	    3,    2,	 false)
 584MUX_CFG(DM365,	SPI3_SDI,	0,   2,     3,    2,	 false)
 585MUX_CFG(DM365,	SPI3_SDO,	0,   6,     3,    2,	 false)
 586MUX_CFG(DM365,	SPI3_SDENA0,	0,   4,     3,    2,	 false)
 587MUX_CFG(DM365,	SPI3_SDENA1,	0,   6,     3,    3,	 false)
 588
 589MUX_CFG(DM365,	SPI4_SCLK,	4,   18,    3,    1,	 false)
 590MUX_CFG(DM365,	SPI4_SDI,	4,   14,    3,    1,	 false)
 591MUX_CFG(DM365,	SPI4_SDO,	4,   16,    3,    1,	 false)
 592MUX_CFG(DM365,	SPI4_SDENA0,	4,   20,    3,    1,	 false)
 593MUX_CFG(DM365,	SPI4_SDENA1,	4,   16,    3,    2,	 false)
 594
 595MUX_CFG(DM365,	CLKOUT0,	4,   20,    3,    3,     false)
 596MUX_CFG(DM365,	CLKOUT1,	4,   16,    3,    3,     false)
 597MUX_CFG(DM365,	CLKOUT2,	4,   8,     3,    3,     false)
 598
 599MUX_CFG(DM365,	GPIO20,		3,   21,    3,    0,	 false)
 600MUX_CFG(DM365,	GPIO30,		4,   6,     3,	  0,	 false)
 601MUX_CFG(DM365,	GPIO31,		4,   8,     3,	  0,	 false)
 602MUX_CFG(DM365,	GPIO32,		4,   10,    3,	  0,	 false)
 603MUX_CFG(DM365,	GPIO33,		4,   12,    3,	  0,	 false)
 604MUX_CFG(DM365,	GPIO40,		4,   26,    3,	  0,	 false)
 605MUX_CFG(DM365,	GPIO64_57,	2,   6,     1,	  0,	 false)
 606
 607MUX_CFG(DM365,	VOUT_FIELD,	1,   18,    3,	  1,	 false)
 608MUX_CFG(DM365,	VOUT_FIELD_G81,	1,   18,    3,	  0,	 false)
 609MUX_CFG(DM365,	VOUT_HVSYNC,	1,   16,    1,	  0,	 false)
 610MUX_CFG(DM365,	VOUT_COUTL_EN,	1,   0,     0xff, 0x55,  false)
 611MUX_CFG(DM365,	VOUT_COUTH_EN,	1,   8,     0xff, 0x55,  false)
 612MUX_CFG(DM365,	VIN_CAM_WEN,	0,   14,    3,	  0,	 false)
 613MUX_CFG(DM365,	VIN_CAM_VD,	0,   13,    1,	  0,	 false)
 614MUX_CFG(DM365,	VIN_CAM_HD,	0,   12,    1,	  0,	 false)
 615MUX_CFG(DM365,	VIN_YIN4_7_EN,	0,   0,     0xff, 0,	 false)
 616MUX_CFG(DM365,	VIN_YIN0_3_EN,	0,   8,     0xf,  0,	 false)
 617
 618INT_CFG(DM365,  INT_EDMA_CC,         2,     1,    1,     false)
 619INT_CFG(DM365,  INT_EDMA_TC0_ERR,    3,     1,    1,     false)
 620INT_CFG(DM365,  INT_EDMA_TC1_ERR,    4,     1,    1,     false)
 621INT_CFG(DM365,  INT_EDMA_TC2_ERR,    22,    1,    1,     false)
 622INT_CFG(DM365,  INT_EDMA_TC3_ERR,    23,    1,    1,     false)
 623INT_CFG(DM365,  INT_PRTCSS,          10,    1,    1,     false)
 624INT_CFG(DM365,  INT_EMAC_RXTHRESH,   14,    1,    1,     false)
 625INT_CFG(DM365,  INT_EMAC_RXPULSE,    15,    1,    1,     false)
 626INT_CFG(DM365,  INT_EMAC_TXPULSE,    16,    1,    1,     false)
 627INT_CFG(DM365,  INT_EMAC_MISCPULSE,  17,    1,    1,     false)
 628INT_CFG(DM365,  INT_IMX0_ENABLE,     0,     1,    0,     false)
 629INT_CFG(DM365,  INT_IMX0_DISABLE,    0,     1,    1,     false)
 630INT_CFG(DM365,  INT_HDVICP_ENABLE,   0,     1,    1,     false)
 631INT_CFG(DM365,  INT_HDVICP_DISABLE,  0,     1,    0,     false)
 632INT_CFG(DM365,  INT_IMX1_ENABLE,     24,    1,    1,     false)
 633INT_CFG(DM365,  INT_IMX1_DISABLE,    24,    1,    0,     false)
 634INT_CFG(DM365,  INT_NSF_ENABLE,      25,    1,    1,     false)
 635INT_CFG(DM365,  INT_NSF_DISABLE,     25,    1,    0,     false)
 636
 637EVT_CFG(DM365,	EVT2_ASP_TX,         0,     1,    0,     false)
 638EVT_CFG(DM365,	EVT3_ASP_RX,         1,     1,    0,     false)
 639EVT_CFG(DM365,	EVT2_VC_TX,          0,     1,    1,     false)
 640EVT_CFG(DM365,	EVT3_VC_RX,          1,     1,    1,     false)
 641#endif
 642};
 643
 644static u64 dm365_spi0_dma_mask = DMA_BIT_MASK(32);
 645
 646static struct davinci_spi_platform_data dm365_spi0_pdata = {
 647	.version 	= SPI_VERSION_1,
 648	.num_chipselect = 2,
 649	.dma_event_q	= EVENTQ_3,
 650	.prescaler_limit = 1,
 651};
 652
 653static struct resource dm365_spi0_resources[] = {
 654	{
 655		.start = 0x01c66000,
 656		.end   = 0x01c667ff,
 657		.flags = IORESOURCE_MEM,
 658	},
 659	{
 660		.start = IRQ_DM365_SPIINT0_0,
 661		.flags = IORESOURCE_IRQ,
 662	},
 
 
 
 
 
 
 
 
 663};
 664
 665static struct platform_device dm365_spi0_device = {
 666	.name = "spi_davinci",
 667	.id = 0,
 668	.dev = {
 669		.dma_mask = &dm365_spi0_dma_mask,
 670		.coherent_dma_mask = DMA_BIT_MASK(32),
 671		.platform_data = &dm365_spi0_pdata,
 672	},
 673	.num_resources = ARRAY_SIZE(dm365_spi0_resources),
 674	.resource = dm365_spi0_resources,
 675};
 676
 677void __init dm365_init_spi0(unsigned chipselect_mask,
 678		const struct spi_board_info *info, unsigned len)
 679{
 680	davinci_cfg_reg(DM365_SPI0_SCLK);
 681	davinci_cfg_reg(DM365_SPI0_SDI);
 682	davinci_cfg_reg(DM365_SPI0_SDO);
 683
 684	/* not all slaves will be wired up */
 685	if (chipselect_mask & BIT(0))
 686		davinci_cfg_reg(DM365_SPI0_SDENA0);
 687	if (chipselect_mask & BIT(1))
 688		davinci_cfg_reg(DM365_SPI0_SDENA1);
 689
 690	spi_register_board_info(info, len);
 691
 692	platform_device_register(&dm365_spi0_device);
 693}
 694
 695static struct resource dm365_gpio_resources[] = {
 696	{	/* registers */
 697		.start	= DAVINCI_GPIO_BASE,
 698		.end	= DAVINCI_GPIO_BASE + SZ_4K - 1,
 699		.flags	= IORESOURCE_MEM,
 700	},
 701	{	/* interrupt */
 702		.start	= IRQ_DM365_GPIO0,
 703		.end	= IRQ_DM365_GPIO7,
 704		.flags	= IORESOURCE_IRQ,
 705	},
 706};
 707
 708static struct davinci_gpio_platform_data dm365_gpio_platform_data = {
 709	.ngpio		= 104,
 710	.gpio_unbanked	= 8,
 711};
 712
 713int __init dm365_gpio_register(void)
 714{
 715	return davinci_gpio_register(dm365_gpio_resources,
 716				     ARRAY_SIZE(dm365_gpio_resources),
 717				     &dm365_gpio_platform_data);
 718}
 719
 720static struct emac_platform_data dm365_emac_pdata = {
 721	.ctrl_reg_offset	= DM365_EMAC_CNTRL_OFFSET,
 722	.ctrl_mod_reg_offset	= DM365_EMAC_CNTRL_MOD_OFFSET,
 723	.ctrl_ram_offset	= DM365_EMAC_CNTRL_RAM_OFFSET,
 724	.ctrl_ram_size		= DM365_EMAC_CNTRL_RAM_SIZE,
 725	.version		= EMAC_VERSION_2,
 726};
 727
 728static struct resource dm365_emac_resources[] = {
 729	{
 730		.start	= DM365_EMAC_BASE,
 731		.end	= DM365_EMAC_BASE + SZ_16K - 1,
 732		.flags	= IORESOURCE_MEM,
 733	},
 734	{
 735		.start	= IRQ_DM365_EMAC_RXTHRESH,
 736		.end	= IRQ_DM365_EMAC_RXTHRESH,
 737		.flags	= IORESOURCE_IRQ,
 738	},
 739	{
 740		.start	= IRQ_DM365_EMAC_RXPULSE,
 741		.end	= IRQ_DM365_EMAC_RXPULSE,
 742		.flags	= IORESOURCE_IRQ,
 743	},
 744	{
 745		.start	= IRQ_DM365_EMAC_TXPULSE,
 746		.end	= IRQ_DM365_EMAC_TXPULSE,
 747		.flags	= IORESOURCE_IRQ,
 748	},
 749	{
 750		.start	= IRQ_DM365_EMAC_MISCPULSE,
 751		.end	= IRQ_DM365_EMAC_MISCPULSE,
 752		.flags	= IORESOURCE_IRQ,
 753	},
 754};
 755
 756static struct platform_device dm365_emac_device = {
 757	.name		= "davinci_emac",
 758	.id		= 1,
 759	.dev = {
 760		.platform_data	= &dm365_emac_pdata,
 761	},
 762	.num_resources	= ARRAY_SIZE(dm365_emac_resources),
 763	.resource	= dm365_emac_resources,
 764};
 765
 766static struct resource dm365_mdio_resources[] = {
 767	{
 768		.start	= DM365_EMAC_MDIO_BASE,
 769		.end	= DM365_EMAC_MDIO_BASE + SZ_4K - 1,
 770		.flags	= IORESOURCE_MEM,
 771	},
 772};
 773
 774static struct platform_device dm365_mdio_device = {
 775	.name		= "davinci_mdio",
 776	.id		= 0,
 777	.num_resources	= ARRAY_SIZE(dm365_mdio_resources),
 778	.resource	= dm365_mdio_resources,
 779};
 780
 781static u8 dm365_default_priorities[DAVINCI_N_AINTC_IRQ] = {
 782	[IRQ_VDINT0]			= 2,
 783	[IRQ_VDINT1]			= 6,
 784	[IRQ_VDINT2]			= 6,
 785	[IRQ_HISTINT]			= 6,
 786	[IRQ_H3AINT]			= 6,
 787	[IRQ_PRVUINT]			= 6,
 788	[IRQ_RSZINT]			= 6,
 789	[IRQ_DM365_INSFINT]		= 7,
 790	[IRQ_VENCINT]			= 6,
 791	[IRQ_ASQINT]			= 6,
 792	[IRQ_IMXINT]			= 6,
 793	[IRQ_DM365_IMCOPINT]		= 4,
 794	[IRQ_USBINT]			= 4,
 795	[IRQ_DM365_RTOINT]		= 7,
 796	[IRQ_DM365_TINT5]		= 7,
 797	[IRQ_DM365_TINT6]		= 5,
 798	[IRQ_CCINT0]			= 5,
 799	[IRQ_CCERRINT]			= 5,
 800	[IRQ_TCERRINT0]			= 5,
 801	[IRQ_TCERRINT]			= 7,
 802	[IRQ_PSCIN]			= 4,
 803	[IRQ_DM365_SPINT2_1]		= 7,
 804	[IRQ_DM365_TINT7]		= 7,
 805	[IRQ_DM365_SDIOINT0]		= 7,
 806	[IRQ_MBXINT]			= 7,
 807	[IRQ_MBRINT]			= 7,
 808	[IRQ_MMCINT]			= 7,
 809	[IRQ_DM365_MMCINT1]		= 7,
 810	[IRQ_DM365_PWMINT3]		= 7,
 811	[IRQ_AEMIFINT]			= 2,
 812	[IRQ_DM365_SDIOINT1]		= 2,
 813	[IRQ_TINT0_TINT12]		= 7,
 814	[IRQ_TINT0_TINT34]		= 7,
 815	[IRQ_TINT1_TINT12]		= 7,
 816	[IRQ_TINT1_TINT34]		= 7,
 817	[IRQ_PWMINT0]			= 7,
 818	[IRQ_PWMINT1]			= 3,
 819	[IRQ_PWMINT2]			= 3,
 820	[IRQ_I2C]			= 3,
 821	[IRQ_UARTINT0]			= 3,
 822	[IRQ_UARTINT1]			= 3,
 823	[IRQ_DM365_RTCINT]		= 3,
 824	[IRQ_DM365_SPIINT0_0]		= 3,
 825	[IRQ_DM365_SPIINT3_0]		= 3,
 826	[IRQ_DM365_GPIO0]		= 3,
 827	[IRQ_DM365_GPIO1]		= 7,
 828	[IRQ_DM365_GPIO2]		= 4,
 829	[IRQ_DM365_GPIO3]		= 4,
 830	[IRQ_DM365_GPIO4]		= 7,
 831	[IRQ_DM365_GPIO5]		= 7,
 832	[IRQ_DM365_GPIO6]		= 7,
 833	[IRQ_DM365_GPIO7]		= 7,
 834	[IRQ_DM365_EMAC_RXTHRESH]	= 7,
 835	[IRQ_DM365_EMAC_RXPULSE]	= 7,
 836	[IRQ_DM365_EMAC_TXPULSE]	= 7,
 837	[IRQ_DM365_EMAC_MISCPULSE]	= 7,
 838	[IRQ_DM365_GPIO12]		= 7,
 839	[IRQ_DM365_GPIO13]		= 7,
 840	[IRQ_DM365_GPIO14]		= 7,
 841	[IRQ_DM365_GPIO15]		= 7,
 842	[IRQ_DM365_KEYINT]		= 7,
 843	[IRQ_DM365_TCERRINT2]		= 7,
 844	[IRQ_DM365_TCERRINT3]		= 7,
 845	[IRQ_DM365_EMUINT]		= 7,
 846};
 847
 848/* Four Transfer Controllers on DM365 */
 849static s8 dm365_queue_priority_mapping[][2] = {
 
 
 
 
 
 
 
 
 
 
 
 850	/* {event queue no, Priority} */
 851	{0, 7},
 852	{1, 7},
 853	{2, 7},
 854	{3, 0},
 855	{-1, -1},
 856};
 857
 858static const struct dma_slave_map dm365_edma_map[] = {
 859	{ "davinci-mcbsp.0", "tx", EDMA_FILTER_PARAM(0, 2) },
 860	{ "davinci-mcbsp.0", "rx", EDMA_FILTER_PARAM(0, 3) },
 861	{ "davinci_voicecodec", "tx", EDMA_FILTER_PARAM(0, 2) },
 862	{ "davinci_voicecodec", "rx", EDMA_FILTER_PARAM(0, 3) },
 863	{ "spi_davinci.2", "tx", EDMA_FILTER_PARAM(0, 10) },
 864	{ "spi_davinci.2", "rx", EDMA_FILTER_PARAM(0, 11) },
 865	{ "spi_davinci.1", "tx", EDMA_FILTER_PARAM(0, 14) },
 866	{ "spi_davinci.1", "rx", EDMA_FILTER_PARAM(0, 15) },
 867	{ "spi_davinci.0", "tx", EDMA_FILTER_PARAM(0, 16) },
 868	{ "spi_davinci.0", "rx", EDMA_FILTER_PARAM(0, 17) },
 869	{ "spi_davinci.3", "tx", EDMA_FILTER_PARAM(0, 18) },
 870	{ "spi_davinci.3", "rx", EDMA_FILTER_PARAM(0, 19) },
 871	{ "da830-mmc.0", "rx", EDMA_FILTER_PARAM(0, 26) },
 872	{ "da830-mmc.0", "tx", EDMA_FILTER_PARAM(0, 27) },
 873	{ "da830-mmc.1", "rx", EDMA_FILTER_PARAM(0, 30) },
 874	{ "da830-mmc.1", "tx", EDMA_FILTER_PARAM(0, 31) },
 875};
 876
 877static struct edma_soc_info dm365_edma_pdata = {
 878	.queue_priority_mapping	= dm365_queue_priority_mapping,
 879	.default_queue		= EVENTQ_3,
 880	.slave_map		= dm365_edma_map,
 881	.slavecnt		= ARRAY_SIZE(dm365_edma_map),
 
 
 882};
 883
 884static struct resource edma_resources[] = {
 885	{
 886		.name	= "edma3_cc",
 887		.start	= 0x01c00000,
 888		.end	= 0x01c00000 + SZ_64K - 1,
 889		.flags	= IORESOURCE_MEM,
 890	},
 891	{
 892		.name	= "edma3_tc0",
 893		.start	= 0x01c10000,
 894		.end	= 0x01c10000 + SZ_1K - 1,
 895		.flags	= IORESOURCE_MEM,
 896	},
 897	{
 898		.name	= "edma3_tc1",
 899		.start	= 0x01c10400,
 900		.end	= 0x01c10400 + SZ_1K - 1,
 901		.flags	= IORESOURCE_MEM,
 902	},
 903	{
 904		.name	= "edma3_tc2",
 905		.start	= 0x01c10800,
 906		.end	= 0x01c10800 + SZ_1K - 1,
 907		.flags	= IORESOURCE_MEM,
 908	},
 909	{
 910		.name	= "edma3_tc3",
 911		.start	= 0x01c10c00,
 912		.end	= 0x01c10c00 + SZ_1K - 1,
 913		.flags	= IORESOURCE_MEM,
 914	},
 915	{
 916		.name	= "edma3_ccint",
 917		.start	= IRQ_CCINT0,
 918		.flags	= IORESOURCE_IRQ,
 919	},
 920	{
 921		.name	= "edma3_ccerrint",
 922		.start	= IRQ_CCERRINT,
 923		.flags	= IORESOURCE_IRQ,
 924	},
 925	/* not using TC*_ERR */
 926};
 927
 928static const struct platform_device_info dm365_edma_device __initconst = {
 929	.name		= "edma",
 930	.id		= 0,
 931	.dma_mask	= DMA_BIT_MASK(32),
 932	.res		= edma_resources,
 933	.num_res	= ARRAY_SIZE(edma_resources),
 934	.data		= &dm365_edma_pdata,
 935	.size_data	= sizeof(dm365_edma_pdata),
 936};
 937
 938static struct resource dm365_asp_resources[] = {
 939	{
 940		.name	= "mpu",
 941		.start	= DAVINCI_DM365_ASP0_BASE,
 942		.end	= DAVINCI_DM365_ASP0_BASE + SZ_8K - 1,
 943		.flags	= IORESOURCE_MEM,
 944	},
 945	{
 946		.start	= DAVINCI_DMA_ASP0_TX,
 947		.end	= DAVINCI_DMA_ASP0_TX,
 948		.flags	= IORESOURCE_DMA,
 949	},
 950	{
 951		.start	= DAVINCI_DMA_ASP0_RX,
 952		.end	= DAVINCI_DMA_ASP0_RX,
 953		.flags	= IORESOURCE_DMA,
 954	},
 955};
 956
 957static struct platform_device dm365_asp_device = {
 958	.name		= "davinci-mcbsp",
 959	.id		= -1,
 960	.num_resources	= ARRAY_SIZE(dm365_asp_resources),
 961	.resource	= dm365_asp_resources,
 962};
 963
 964static struct resource dm365_vc_resources[] = {
 965	{
 966		.start	= DAVINCI_DM365_VC_BASE,
 967		.end	= DAVINCI_DM365_VC_BASE + SZ_1K - 1,
 968		.flags	= IORESOURCE_MEM,
 969	},
 970	{
 971		.start	= DAVINCI_DMA_VC_TX,
 972		.end	= DAVINCI_DMA_VC_TX,
 973		.flags	= IORESOURCE_DMA,
 974	},
 975	{
 976		.start	= DAVINCI_DMA_VC_RX,
 977		.end	= DAVINCI_DMA_VC_RX,
 978		.flags	= IORESOURCE_DMA,
 979	},
 980};
 981
 982static struct platform_device dm365_vc_device = {
 983	.name		= "davinci_voicecodec",
 984	.id		= -1,
 985	.num_resources	= ARRAY_SIZE(dm365_vc_resources),
 986	.resource	= dm365_vc_resources,
 987};
 988
 989static struct resource dm365_rtc_resources[] = {
 990	{
 991		.start = DM365_RTC_BASE,
 992		.end = DM365_RTC_BASE + SZ_1K - 1,
 993		.flags = IORESOURCE_MEM,
 994	},
 995	{
 996		.start = IRQ_DM365_RTCINT,
 997		.flags = IORESOURCE_IRQ,
 998	},
 999};
1000
1001static struct platform_device dm365_rtc_device = {
1002	.name = "rtc_davinci",
1003	.id = 0,
1004	.num_resources = ARRAY_SIZE(dm365_rtc_resources),
1005	.resource = dm365_rtc_resources,
1006};
1007
1008static struct map_desc dm365_io_desc[] = {
1009	{
1010		.virtual	= IO_VIRT,
1011		.pfn		= __phys_to_pfn(IO_PHYS),
1012		.length		= IO_SIZE,
1013		.type		= MT_DEVICE
1014	},
 
 
 
 
 
 
1015};
1016
1017static struct resource dm365_ks_resources[] = {
1018	{
1019		/* registers */
1020		.start = DM365_KEYSCAN_BASE,
1021		.end = DM365_KEYSCAN_BASE + SZ_1K - 1,
1022		.flags = IORESOURCE_MEM,
1023	},
1024	{
1025		/* interrupt */
1026		.start = IRQ_DM365_KEYINT,
1027		.end = IRQ_DM365_KEYINT,
1028		.flags = IORESOURCE_IRQ,
1029	},
1030};
1031
1032static struct platform_device dm365_ks_device = {
1033	.name		= "davinci_keyscan",
1034	.id		= 0,
1035	.num_resources	= ARRAY_SIZE(dm365_ks_resources),
1036	.resource	= dm365_ks_resources,
1037};
1038
1039/* Contents of JTAG ID register used to identify exact cpu type */
1040static struct davinci_id dm365_ids[] = {
1041	{
1042		.variant	= 0x0,
1043		.part_no	= 0xb83e,
1044		.manufacturer	= 0x017,
1045		.cpu_id		= DAVINCI_CPU_ID_DM365,
1046		.name		= "dm365_rev1.1",
1047	},
1048	{
1049		.variant	= 0x8,
1050		.part_no	= 0xb83e,
1051		.manufacturer	= 0x017,
1052		.cpu_id		= DAVINCI_CPU_ID_DM365,
1053		.name		= "dm365_rev1.2",
1054	},
1055};
1056
1057static u32 dm365_psc_bases[] = { DAVINCI_PWR_SLEEP_CNTRL_BASE };
1058
1059static struct davinci_timer_info dm365_timer_info = {
1060	.timers		= davinci_timer_instance,
1061	.clockevent_id	= T0_BOT,
1062	.clocksource_id	= T0_TOP,
1063};
1064
1065#define DM365_UART1_BASE	(IO_PHYS + 0x106000)
1066
1067static struct plat_serial8250_port dm365_serial0_platform_data[] = {
1068	{
1069		.mapbase	= DAVINCI_UART0_BASE,
1070		.irq		= IRQ_UARTINT0,
1071		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
1072				  UPF_IOREMAP,
1073		.iotype		= UPIO_MEM,
1074		.regshift	= 2,
1075	},
1076	{
1077		.flags	= 0,
1078	}
1079};
1080static struct plat_serial8250_port dm365_serial1_platform_data[] = {
1081	{
1082		.mapbase	= DM365_UART1_BASE,
1083		.irq		= IRQ_UARTINT1,
1084		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
1085				  UPF_IOREMAP,
1086		.iotype		= UPIO_MEM,
1087		.regshift	= 2,
1088	},
1089	{
1090		.flags	= 0,
1091	}
1092};
1093
1094struct platform_device dm365_serial_device[] = {
1095	{
1096		.name			= "serial8250",
1097		.id			= PLAT8250_DEV_PLATFORM,
1098		.dev			= {
1099			.platform_data	= dm365_serial0_platform_data,
1100		}
1101	},
1102	{
1103		.name			= "serial8250",
1104		.id			= PLAT8250_DEV_PLATFORM1,
1105		.dev			= {
1106			.platform_data	= dm365_serial1_platform_data,
1107		}
1108	},
1109	{
1110	}
1111};
1112
1113static const struct davinci_soc_info davinci_soc_info_dm365 = {
1114	.io_desc		= dm365_io_desc,
1115	.io_desc_num		= ARRAY_SIZE(dm365_io_desc),
1116	.jtag_id_reg		= 0x01c40028,
1117	.ids			= dm365_ids,
1118	.ids_num		= ARRAY_SIZE(dm365_ids),
 
1119	.psc_bases		= dm365_psc_bases,
1120	.psc_bases_num		= ARRAY_SIZE(dm365_psc_bases),
1121	.pinmux_base		= DAVINCI_SYSTEM_MODULE_BASE,
1122	.pinmux_pins		= dm365_pins,
1123	.pinmux_pins_num	= ARRAY_SIZE(dm365_pins),
1124	.intc_base		= DAVINCI_ARM_INTC_BASE,
1125	.intc_type		= DAVINCI_INTC_TYPE_AINTC,
1126	.intc_irq_prios		= dm365_default_priorities,
1127	.intc_irq_num		= DAVINCI_N_AINTC_IRQ,
1128	.timer_info		= &dm365_timer_info,
 
 
 
 
 
 
1129	.emac_pdata		= &dm365_emac_pdata,
1130	.sram_dma		= 0x00010000,
1131	.sram_len		= SZ_32K,
 
1132};
1133
1134void __init dm365_init_asp(void)
1135{
1136	davinci_cfg_reg(DM365_MCBSP0_BDX);
1137	davinci_cfg_reg(DM365_MCBSP0_X);
1138	davinci_cfg_reg(DM365_MCBSP0_BFSX);
1139	davinci_cfg_reg(DM365_MCBSP0_BDR);
1140	davinci_cfg_reg(DM365_MCBSP0_R);
1141	davinci_cfg_reg(DM365_MCBSP0_BFSR);
1142	davinci_cfg_reg(DM365_EVT2_ASP_TX);
1143	davinci_cfg_reg(DM365_EVT3_ASP_RX);
 
1144	platform_device_register(&dm365_asp_device);
1145}
1146
1147void __init dm365_init_vc(void)
1148{
1149	davinci_cfg_reg(DM365_EVT2_VC_TX);
1150	davinci_cfg_reg(DM365_EVT3_VC_RX);
 
1151	platform_device_register(&dm365_vc_device);
1152}
1153
1154void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
1155{
1156	dm365_ks_device.dev.platform_data = pdata;
1157	platform_device_register(&dm365_ks_device);
1158}
1159
1160void __init dm365_init_rtc(void)
1161{
1162	davinci_cfg_reg(DM365_INT_PRTCSS);
1163	platform_device_register(&dm365_rtc_device);
1164}
1165
1166void __init dm365_init(void)
1167{
1168	davinci_common_init(&davinci_soc_info_dm365);
1169	davinci_map_sysmod();
1170}
1171
1172void __init dm365_init_time(void)
1173{
1174	davinci_clk_init(dm365_clks);
1175	davinci_timer_init();
1176}
1177
1178static struct resource dm365_vpss_resources[] = {
1179	{
1180		/* VPSS ISP5 Base address */
1181		.name           = "isp5",
1182		.start          = 0x01c70000,
1183		.end            = 0x01c70000 + 0xff,
1184		.flags          = IORESOURCE_MEM,
1185	},
1186	{
1187		/* VPSS CLK Base address */
1188		.name           = "vpss",
1189		.start          = 0x01c70200,
1190		.end            = 0x01c70200 + 0xff,
1191		.flags          = IORESOURCE_MEM,
1192	},
1193};
1194
1195static struct platform_device dm365_vpss_device = {
1196       .name                   = "vpss",
1197       .id                     = -1,
1198       .dev.platform_data      = "dm365_vpss",
1199       .num_resources          = ARRAY_SIZE(dm365_vpss_resources),
1200       .resource               = dm365_vpss_resources,
1201};
1202
1203static struct resource vpfe_resources[] = {
1204	{
1205		.start          = IRQ_VDINT0,
1206		.end            = IRQ_VDINT0,
1207		.flags          = IORESOURCE_IRQ,
1208	},
1209	{
1210		.start          = IRQ_VDINT1,
1211		.end            = IRQ_VDINT1,
1212		.flags          = IORESOURCE_IRQ,
1213	},
1214};
1215
1216static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
1217static struct platform_device vpfe_capture_dev = {
1218	.name           = CAPTURE_DRV_NAME,
1219	.id             = -1,
1220	.num_resources  = ARRAY_SIZE(vpfe_resources),
1221	.resource       = vpfe_resources,
1222	.dev = {
1223		.dma_mask               = &vpfe_capture_dma_mask,
1224		.coherent_dma_mask      = DMA_BIT_MASK(32),
1225	},
1226};
1227
1228static void dm365_isif_setup_pinmux(void)
1229{
1230	davinci_cfg_reg(DM365_VIN_CAM_WEN);
1231	davinci_cfg_reg(DM365_VIN_CAM_VD);
1232	davinci_cfg_reg(DM365_VIN_CAM_HD);
1233	davinci_cfg_reg(DM365_VIN_YIN4_7_EN);
1234	davinci_cfg_reg(DM365_VIN_YIN0_3_EN);
1235}
1236
1237static struct resource isif_resource[] = {
1238	/* ISIF Base address */
1239	{
1240		.start          = 0x01c71000,
1241		.end            = 0x01c71000 + 0x1ff,
1242		.flags          = IORESOURCE_MEM,
1243	},
1244	/* ISIF Linearization table 0 */
1245	{
1246		.start          = 0x1C7C000,
1247		.end            = 0x1C7C000 + 0x2ff,
1248		.flags          = IORESOURCE_MEM,
1249	},
1250	/* ISIF Linearization table 1 */
1251	{
1252		.start          = 0x1C7C400,
1253		.end            = 0x1C7C400 + 0x2ff,
1254		.flags          = IORESOURCE_MEM,
1255	},
1256};
1257static struct platform_device dm365_isif_dev = {
1258	.name           = "isif",
1259	.id             = -1,
1260	.num_resources  = ARRAY_SIZE(isif_resource),
1261	.resource       = isif_resource,
1262	.dev = {
1263		.dma_mask               = &vpfe_capture_dma_mask,
1264		.coherent_dma_mask      = DMA_BIT_MASK(32),
1265		.platform_data		= dm365_isif_setup_pinmux,
1266	},
1267};
1268
1269static struct resource dm365_osd_resources[] = {
1270	{
1271		.start = DM365_OSD_BASE,
1272		.end   = DM365_OSD_BASE + 0xff,
1273		.flags = IORESOURCE_MEM,
1274	},
1275};
1276
1277static u64 dm365_video_dma_mask = DMA_BIT_MASK(32);
1278
1279static struct platform_device dm365_osd_dev = {
1280	.name		= DM365_VPBE_OSD_SUBDEV_NAME,
1281	.id		= -1,
1282	.num_resources	= ARRAY_SIZE(dm365_osd_resources),
1283	.resource	= dm365_osd_resources,
1284	.dev		= {
1285		.dma_mask		= &dm365_video_dma_mask,
1286		.coherent_dma_mask	= DMA_BIT_MASK(32),
1287	},
1288};
1289
1290static struct resource dm365_venc_resources[] = {
1291	{
1292		.start = IRQ_VENCINT,
1293		.end   = IRQ_VENCINT,
1294		.flags = IORESOURCE_IRQ,
1295	},
1296	/* venc registers io space */
1297	{
1298		.start = DM365_VENC_BASE,
1299		.end   = DM365_VENC_BASE + 0x177,
1300		.flags = IORESOURCE_MEM,
1301	},
1302	/* vdaccfg registers io space */
1303	{
1304		.start = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG,
1305		.end   = DAVINCI_SYSTEM_MODULE_BASE + SYSMOD_VDAC_CONFIG + 3,
1306		.flags = IORESOURCE_MEM,
1307	},
1308};
1309
1310static struct resource dm365_v4l2_disp_resources[] = {
1311	{
1312		.start = IRQ_VENCINT,
1313		.end   = IRQ_VENCINT,
1314		.flags = IORESOURCE_IRQ,
1315	},
1316	/* venc registers io space */
1317	{
1318		.start = DM365_VENC_BASE,
1319		.end   = DM365_VENC_BASE + 0x177,
1320		.flags = IORESOURCE_MEM,
1321	},
1322};
1323
1324static int dm365_vpbe_setup_pinmux(u32 if_type, int field)
1325{
1326	switch (if_type) {
1327	case MEDIA_BUS_FMT_SGRBG8_1X8:
1328		davinci_cfg_reg(DM365_VOUT_FIELD_G81);
1329		davinci_cfg_reg(DM365_VOUT_COUTL_EN);
1330		davinci_cfg_reg(DM365_VOUT_COUTH_EN);
1331		break;
1332	case MEDIA_BUS_FMT_YUYV10_1X20:
1333		if (field)
1334			davinci_cfg_reg(DM365_VOUT_FIELD);
1335		else
1336			davinci_cfg_reg(DM365_VOUT_FIELD_G81);
1337		davinci_cfg_reg(DM365_VOUT_COUTL_EN);
1338		davinci_cfg_reg(DM365_VOUT_COUTH_EN);
1339		break;
1340	default:
1341		return -EINVAL;
1342	}
1343
1344	return 0;
1345}
1346
1347static int dm365_venc_setup_clock(enum vpbe_enc_timings_type type,
1348				  unsigned int pclock)
1349{
1350	void __iomem *vpss_clkctl_reg;
1351	u32 val;
1352
1353	vpss_clkctl_reg = DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL);
1354
1355	switch (type) {
1356	case VPBE_ENC_STD:
1357		val = VPSS_VENCCLKEN_ENABLE | VPSS_DACCLKEN_ENABLE;
1358		break;
1359	case VPBE_ENC_DV_TIMINGS:
1360		if (pclock <= 27000000) {
1361			val = VPSS_VENCCLKEN_ENABLE | VPSS_DACCLKEN_ENABLE;
1362		} else {
1363			/* set sysclk4 to output 74.25 MHz from pll1 */
1364			val = VPSS_PLLC2SYSCLK5_ENABLE | VPSS_DACCLKEN_ENABLE |
1365			      VPSS_VENCCLKEN_ENABLE;
1366		}
1367		break;
1368	default:
1369		return -EINVAL;
1370	}
1371	writel(val, vpss_clkctl_reg);
1372
1373	return 0;
1374}
1375
1376static struct platform_device dm365_vpbe_display = {
1377	.name		= "vpbe-v4l2",
1378	.id		= -1,
1379	.num_resources  = ARRAY_SIZE(dm365_v4l2_disp_resources),
1380	.resource	= dm365_v4l2_disp_resources,
1381	.dev		= {
1382		.dma_mask		= &dm365_video_dma_mask,
1383		.coherent_dma_mask	= DMA_BIT_MASK(32),
1384	},
1385};
1386
1387static struct venc_platform_data dm365_venc_pdata = {
1388	.setup_pinmux	= dm365_vpbe_setup_pinmux,
1389	.setup_clock	= dm365_venc_setup_clock,
1390};
1391
1392static struct platform_device dm365_venc_dev = {
1393	.name		= DM365_VPBE_VENC_SUBDEV_NAME,
1394	.id		= -1,
1395	.num_resources	= ARRAY_SIZE(dm365_venc_resources),
1396	.resource	= dm365_venc_resources,
1397	.dev		= {
1398		.dma_mask		= &dm365_video_dma_mask,
1399		.coherent_dma_mask	= DMA_BIT_MASK(32),
1400		.platform_data		= (void *)&dm365_venc_pdata,
1401	},
1402};
1403
1404static struct platform_device dm365_vpbe_dev = {
1405	.name		= "vpbe_controller",
1406	.id		= -1,
1407	.dev		= {
1408		.dma_mask		= &dm365_video_dma_mask,
1409		.coherent_dma_mask	= DMA_BIT_MASK(32),
1410	},
1411};
1412
1413int __init dm365_init_video(struct vpfe_config *vpfe_cfg,
1414				struct vpbe_config *vpbe_cfg)
1415{
1416	if (vpfe_cfg || vpbe_cfg)
1417		platform_device_register(&dm365_vpss_device);
1418
1419	if (vpfe_cfg) {
1420		vpfe_capture_dev.dev.platform_data = vpfe_cfg;
1421		platform_device_register(&dm365_isif_dev);
1422		platform_device_register(&vpfe_capture_dev);
1423	}
1424	if (vpbe_cfg) {
1425		dm365_vpbe_dev.dev.platform_data = vpbe_cfg;
1426		platform_device_register(&dm365_osd_dev);
1427		platform_device_register(&dm365_venc_dev);
1428		platform_device_register(&dm365_vpbe_dev);
1429		platform_device_register(&dm365_vpbe_display);
1430	}
1431
1432	return 0;
1433}
1434
1435static int __init dm365_init_devices(void)
1436{
1437	struct platform_device *edma_pdev;
1438	int ret = 0;
1439
1440	if (!cpu_is_davinci_dm365())
1441		return 0;
1442
1443	davinci_cfg_reg(DM365_INT_EDMA_CC);
1444	edma_pdev = platform_device_register_full(&dm365_edma_device);
1445	if (IS_ERR(edma_pdev)) {
1446		pr_warn("%s: Failed to register eDMA\n", __func__);
1447		return PTR_ERR(edma_pdev);
1448	}
1449
1450	platform_device_register(&dm365_mdio_device);
1451	platform_device_register(&dm365_emac_device);
 
 
1452
1453	ret = davinci_init_wdt();
1454	if (ret)
1455		pr_warn("%s: watchdog init failed: %d\n", __func__, ret);
1456
1457	return ret;
 
1458}
1459postcore_initcall(dm365_init_devices);
v3.1
   1/*
   2 * TI DaVinci DM365 chip specific setup
   3 *
   4 * Copyright (C) 2009 Texas Instruments
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License as
   8 * published by the Free Software Foundation version 2.
   9 *
  10 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  11 * kind, whether express or implied; without even the implied warranty
  12 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 */
  15#include <linux/init.h>
  16#include <linux/clk.h>
  17#include <linux/serial_8250.h>
  18#include <linux/platform_device.h>
  19#include <linux/dma-mapping.h>
  20#include <linux/gpio.h>
  21#include <linux/spi/spi.h>
 
 
 
 
  22
  23#include <asm/mach/map.h>
  24
  25#include <mach/dm365.h>
  26#include <mach/cputype.h>
  27#include <mach/edma.h>
  28#include <mach/psc.h>
  29#include <mach/mux.h>
  30#include <mach/irqs.h>
  31#include <mach/time.h>
  32#include <mach/serial.h>
  33#include <mach/common.h>
  34#include <mach/asp.h>
  35#include <mach/keyscan.h>
  36#include <mach/spi.h>
  37
  38
 
  39#include "clock.h"
  40#include "mux.h"
 
  41
  42#define DM365_REF_FREQ		24000000	/* 24 MHz on the DM365 EVM */
 
 
 
 
 
 
 
 
 
 
 
 
 
  43
  44static struct pll_data pll1_data = {
  45	.num		= 1,
  46	.phys_base	= DAVINCI_PLL1_BASE,
  47	.flags		= PLL_HAS_POSTDIV | PLL_HAS_PREDIV,
  48};
  49
  50static struct pll_data pll2_data = {
  51	.num		= 2,
  52	.phys_base	= DAVINCI_PLL2_BASE,
  53	.flags		= PLL_HAS_POSTDIV | PLL_HAS_PREDIV,
  54};
  55
  56static struct clk ref_clk = {
  57	.name		= "ref_clk",
  58	.rate		= DM365_REF_FREQ,
  59};
  60
  61static struct clk pll1_clk = {
  62	.name		= "pll1",
  63	.parent		= &ref_clk,
  64	.flags		= CLK_PLL,
  65	.pll_data	= &pll1_data,
  66};
  67
  68static struct clk pll1_aux_clk = {
  69	.name		= "pll1_aux_clk",
  70	.parent		= &pll1_clk,
  71	.flags		= CLK_PLL | PRE_PLL,
  72};
  73
  74static struct clk pll1_sysclkbp = {
  75	.name		= "pll1_sysclkbp",
  76	.parent		= &pll1_clk,
  77	.flags 		= CLK_PLL | PRE_PLL,
  78	.div_reg	= BPDIV
  79};
  80
  81static struct clk clkout0_clk = {
  82	.name		= "clkout0",
  83	.parent		= &pll1_clk,
  84	.flags		= CLK_PLL | PRE_PLL,
  85};
  86
  87static struct clk pll1_sysclk1 = {
  88	.name		= "pll1_sysclk1",
  89	.parent		= &pll1_clk,
  90	.flags		= CLK_PLL,
  91	.div_reg	= PLLDIV1,
  92};
  93
  94static struct clk pll1_sysclk2 = {
  95	.name		= "pll1_sysclk2",
  96	.parent		= &pll1_clk,
  97	.flags		= CLK_PLL,
  98	.div_reg	= PLLDIV2,
  99};
 100
 101static struct clk pll1_sysclk3 = {
 102	.name		= "pll1_sysclk3",
 103	.parent		= &pll1_clk,
 104	.flags		= CLK_PLL,
 105	.div_reg	= PLLDIV3,
 106};
 107
 108static struct clk pll1_sysclk4 = {
 109	.name		= "pll1_sysclk4",
 110	.parent		= &pll1_clk,
 111	.flags		= CLK_PLL,
 112	.div_reg	= PLLDIV4,
 113};
 114
 115static struct clk pll1_sysclk5 = {
 116	.name		= "pll1_sysclk5",
 117	.parent		= &pll1_clk,
 118	.flags		= CLK_PLL,
 119	.div_reg	= PLLDIV5,
 120};
 121
 122static struct clk pll1_sysclk6 = {
 123	.name		= "pll1_sysclk6",
 124	.parent		= &pll1_clk,
 125	.flags		= CLK_PLL,
 126	.div_reg	= PLLDIV6,
 127};
 128
 129static struct clk pll1_sysclk7 = {
 130	.name		= "pll1_sysclk7",
 131	.parent		= &pll1_clk,
 132	.flags		= CLK_PLL,
 133	.div_reg	= PLLDIV7,
 134};
 135
 136static struct clk pll1_sysclk8 = {
 137	.name		= "pll1_sysclk8",
 138	.parent		= &pll1_clk,
 139	.flags		= CLK_PLL,
 140	.div_reg	= PLLDIV8,
 141};
 142
 143static struct clk pll1_sysclk9 = {
 144	.name		= "pll1_sysclk9",
 145	.parent		= &pll1_clk,
 146	.flags		= CLK_PLL,
 147	.div_reg	= PLLDIV9,
 148};
 149
 150static struct clk pll2_clk = {
 151	.name		= "pll2",
 152	.parent		= &ref_clk,
 153	.flags		= CLK_PLL,
 154	.pll_data	= &pll2_data,
 155};
 156
 157static struct clk pll2_aux_clk = {
 158	.name		= "pll2_aux_clk",
 159	.parent		= &pll2_clk,
 160	.flags		= CLK_PLL | PRE_PLL,
 161};
 162
 163static struct clk clkout1_clk = {
 164	.name		= "clkout1",
 165	.parent		= &pll2_clk,
 166	.flags		= CLK_PLL | PRE_PLL,
 167};
 168
 169static struct clk pll2_sysclk1 = {
 170	.name		= "pll2_sysclk1",
 171	.parent		= &pll2_clk,
 172	.flags		= CLK_PLL,
 173	.div_reg	= PLLDIV1,
 174};
 175
 176static struct clk pll2_sysclk2 = {
 177	.name		= "pll2_sysclk2",
 178	.parent		= &pll2_clk,
 179	.flags		= CLK_PLL,
 180	.div_reg	= PLLDIV2,
 181};
 182
 183static struct clk pll2_sysclk3 = {
 184	.name		= "pll2_sysclk3",
 185	.parent		= &pll2_clk,
 186	.flags		= CLK_PLL,
 187	.div_reg	= PLLDIV3,
 188};
 189
 190static struct clk pll2_sysclk4 = {
 191	.name		= "pll2_sysclk4",
 192	.parent		= &pll2_clk,
 193	.flags		= CLK_PLL,
 194	.div_reg	= PLLDIV4,
 195};
 196
 197static struct clk pll2_sysclk5 = {
 198	.name		= "pll2_sysclk5",
 199	.parent		= &pll2_clk,
 200	.flags		= CLK_PLL,
 201	.div_reg	= PLLDIV5,
 202};
 203
 204static struct clk pll2_sysclk6 = {
 205	.name		= "pll2_sysclk6",
 206	.parent		= &pll2_clk,
 207	.flags		= CLK_PLL,
 208	.div_reg	= PLLDIV6,
 209};
 210
 211static struct clk pll2_sysclk7 = {
 212	.name		= "pll2_sysclk7",
 213	.parent		= &pll2_clk,
 214	.flags		= CLK_PLL,
 215	.div_reg	= PLLDIV7,
 216};
 217
 218static struct clk pll2_sysclk8 = {
 219	.name		= "pll2_sysclk8",
 220	.parent		= &pll2_clk,
 221	.flags		= CLK_PLL,
 222	.div_reg	= PLLDIV8,
 223};
 224
 225static struct clk pll2_sysclk9 = {
 226	.name		= "pll2_sysclk9",
 227	.parent		= &pll2_clk,
 228	.flags		= CLK_PLL,
 229	.div_reg	= PLLDIV9,
 230};
 231
 232static struct clk vpss_dac_clk = {
 233	.name		= "vpss_dac",
 234	.parent		= &pll1_sysclk3,
 235	.lpsc		= DM365_LPSC_DAC_CLK,
 236};
 237
 238static struct clk vpss_master_clk = {
 239	.name		= "vpss_master",
 240	.parent		= &pll1_sysclk5,
 241	.lpsc		= DM365_LPSC_VPSSMSTR,
 242	.flags		= CLK_PSC,
 243};
 244
 
 
 
 
 
 
 245static struct clk arm_clk = {
 246	.name		= "arm_clk",
 247	.parent		= &pll2_sysclk2,
 248	.lpsc		= DAVINCI_LPSC_ARM,
 249	.flags		= ALWAYS_ENABLED,
 250};
 251
 252static struct clk uart0_clk = {
 253	.name		= "uart0",
 254	.parent		= &pll1_aux_clk,
 255	.lpsc		= DAVINCI_LPSC_UART0,
 256};
 257
 258static struct clk uart1_clk = {
 259	.name		= "uart1",
 260	.parent		= &pll1_sysclk4,
 261	.lpsc		= DAVINCI_LPSC_UART1,
 262};
 263
 264static struct clk i2c_clk = {
 265	.name		= "i2c",
 266	.parent		= &pll1_aux_clk,
 267	.lpsc		= DAVINCI_LPSC_I2C,
 268};
 269
 270static struct clk mmcsd0_clk = {
 271	.name		= "mmcsd0",
 272	.parent		= &pll1_sysclk8,
 273	.lpsc		= DAVINCI_LPSC_MMC_SD,
 274};
 275
 276static struct clk mmcsd1_clk = {
 277	.name		= "mmcsd1",
 278	.parent		= &pll1_sysclk4,
 279	.lpsc		= DM365_LPSC_MMC_SD1,
 280};
 281
 282static struct clk spi0_clk = {
 283	.name		= "spi0",
 284	.parent		= &pll1_sysclk4,
 285	.lpsc		= DAVINCI_LPSC_SPI,
 286};
 287
 288static struct clk spi1_clk = {
 289	.name		= "spi1",
 290	.parent		= &pll1_sysclk4,
 291	.lpsc		= DM365_LPSC_SPI1,
 292};
 293
 294static struct clk spi2_clk = {
 295	.name		= "spi2",
 296	.parent		= &pll1_sysclk4,
 297	.lpsc		= DM365_LPSC_SPI2,
 298};
 299
 300static struct clk spi3_clk = {
 301	.name		= "spi3",
 302	.parent		= &pll1_sysclk4,
 303	.lpsc		= DM365_LPSC_SPI3,
 304};
 305
 306static struct clk spi4_clk = {
 307	.name		= "spi4",
 308	.parent		= &pll1_aux_clk,
 309	.lpsc		= DM365_LPSC_SPI4,
 310};
 311
 312static struct clk gpio_clk = {
 313	.name		= "gpio",
 314	.parent		= &pll1_sysclk4,
 315	.lpsc		= DAVINCI_LPSC_GPIO,
 316};
 317
 318static struct clk aemif_clk = {
 319	.name		= "aemif",
 320	.parent		= &pll1_sysclk4,
 321	.lpsc		= DAVINCI_LPSC_AEMIF,
 322};
 323
 324static struct clk pwm0_clk = {
 325	.name		= "pwm0",
 326	.parent		= &pll1_aux_clk,
 327	.lpsc		= DAVINCI_LPSC_PWM0,
 328};
 329
 330static struct clk pwm1_clk = {
 331	.name		= "pwm1",
 332	.parent		= &pll1_aux_clk,
 333	.lpsc		= DAVINCI_LPSC_PWM1,
 334};
 335
 336static struct clk pwm2_clk = {
 337	.name		= "pwm2",
 338	.parent		= &pll1_aux_clk,
 339	.lpsc		= DAVINCI_LPSC_PWM2,
 340};
 341
 342static struct clk pwm3_clk = {
 343	.name		= "pwm3",
 344	.parent		= &ref_clk,
 345	.lpsc		= DM365_LPSC_PWM3,
 346};
 347
 348static struct clk timer0_clk = {
 349	.name		= "timer0",
 350	.parent		= &pll1_aux_clk,
 351	.lpsc		= DAVINCI_LPSC_TIMER0,
 352};
 353
 354static struct clk timer1_clk = {
 355	.name		= "timer1",
 356	.parent		= &pll1_aux_clk,
 357	.lpsc		= DAVINCI_LPSC_TIMER1,
 358};
 359
 360static struct clk timer2_clk = {
 361	.name		= "timer2",
 362	.parent		= &pll1_aux_clk,
 363	.lpsc		= DAVINCI_LPSC_TIMER2,
 364	.usecount	= 1,
 365};
 366
 367static struct clk timer3_clk = {
 368	.name		= "timer3",
 369	.parent		= &pll1_aux_clk,
 370	.lpsc		= DM365_LPSC_TIMER3,
 371};
 372
 373static struct clk usb_clk = {
 374	.name		= "usb",
 375	.parent		= &pll1_aux_clk,
 376	.lpsc		= DAVINCI_LPSC_USB,
 377};
 378
 379static struct clk emac_clk = {
 380	.name		= "emac",
 381	.parent		= &pll1_sysclk4,
 382	.lpsc		= DM365_LPSC_EMAC,
 383};
 384
 385static struct clk voicecodec_clk = {
 386	.name		= "voice_codec",
 387	.parent		= &pll2_sysclk4,
 388	.lpsc		= DM365_LPSC_VOICE_CODEC,
 389};
 390
 391static struct clk asp0_clk = {
 392	.name		= "asp0",
 393	.parent		= &pll1_sysclk4,
 394	.lpsc		= DM365_LPSC_McBSP1,
 395};
 396
 397static struct clk rto_clk = {
 398	.name		= "rto",
 399	.parent		= &pll1_sysclk4,
 400	.lpsc		= DM365_LPSC_RTO,
 401};
 402
 403static struct clk mjcp_clk = {
 404	.name		= "mjcp",
 405	.parent		= &pll1_sysclk3,
 406	.lpsc		= DM365_LPSC_MJCP,
 407};
 408
 409static struct clk_lookup dm365_clks[] = {
 410	CLK(NULL, "ref", &ref_clk),
 411	CLK(NULL, "pll1", &pll1_clk),
 412	CLK(NULL, "pll1_aux", &pll1_aux_clk),
 413	CLK(NULL, "pll1_sysclkbp", &pll1_sysclkbp),
 414	CLK(NULL, "clkout0", &clkout0_clk),
 415	CLK(NULL, "pll1_sysclk1", &pll1_sysclk1),
 416	CLK(NULL, "pll1_sysclk2", &pll1_sysclk2),
 417	CLK(NULL, "pll1_sysclk3", &pll1_sysclk3),
 418	CLK(NULL, "pll1_sysclk4", &pll1_sysclk4),
 419	CLK(NULL, "pll1_sysclk5", &pll1_sysclk5),
 420	CLK(NULL, "pll1_sysclk6", &pll1_sysclk6),
 421	CLK(NULL, "pll1_sysclk7", &pll1_sysclk7),
 422	CLK(NULL, "pll1_sysclk8", &pll1_sysclk8),
 423	CLK(NULL, "pll1_sysclk9", &pll1_sysclk9),
 424	CLK(NULL, "pll2", &pll2_clk),
 425	CLK(NULL, "pll2_aux", &pll2_aux_clk),
 426	CLK(NULL, "clkout1", &clkout1_clk),
 427	CLK(NULL, "pll2_sysclk1", &pll2_sysclk1),
 428	CLK(NULL, "pll2_sysclk2", &pll2_sysclk2),
 429	CLK(NULL, "pll2_sysclk3", &pll2_sysclk3),
 430	CLK(NULL, "pll2_sysclk4", &pll2_sysclk4),
 431	CLK(NULL, "pll2_sysclk5", &pll2_sysclk5),
 432	CLK(NULL, "pll2_sysclk6", &pll2_sysclk6),
 433	CLK(NULL, "pll2_sysclk7", &pll2_sysclk7),
 434	CLK(NULL, "pll2_sysclk8", &pll2_sysclk8),
 435	CLK(NULL, "pll2_sysclk9", &pll2_sysclk9),
 436	CLK(NULL, "vpss_dac", &vpss_dac_clk),
 437	CLK(NULL, "vpss_master", &vpss_master_clk),
 
 438	CLK(NULL, "arm", &arm_clk),
 439	CLK(NULL, "uart0", &uart0_clk),
 440	CLK(NULL, "uart1", &uart1_clk),
 441	CLK("i2c_davinci.1", NULL, &i2c_clk),
 442	CLK("davinci_mmc.0", NULL, &mmcsd0_clk),
 443	CLK("davinci_mmc.1", NULL, &mmcsd1_clk),
 444	CLK("spi_davinci.0", NULL, &spi0_clk),
 445	CLK("spi_davinci.1", NULL, &spi1_clk),
 446	CLK("spi_davinci.2", NULL, &spi2_clk),
 447	CLK("spi_davinci.3", NULL, &spi3_clk),
 448	CLK("spi_davinci.4", NULL, &spi4_clk),
 449	CLK(NULL, "gpio", &gpio_clk),
 450	CLK(NULL, "aemif", &aemif_clk),
 451	CLK(NULL, "pwm0", &pwm0_clk),
 452	CLK(NULL, "pwm1", &pwm1_clk),
 453	CLK(NULL, "pwm2", &pwm2_clk),
 454	CLK(NULL, "pwm3", &pwm3_clk),
 455	CLK(NULL, "timer0", &timer0_clk),
 456	CLK(NULL, "timer1", &timer1_clk),
 457	CLK("watchdog", NULL, &timer2_clk),
 458	CLK(NULL, "timer3", &timer3_clk),
 459	CLK(NULL, "usb", &usb_clk),
 460	CLK("davinci_emac.1", NULL, &emac_clk),
 
 461	CLK("davinci_voicecodec", NULL, &voicecodec_clk),
 462	CLK("davinci-mcbsp", NULL, &asp0_clk),
 463	CLK(NULL, "rto", &rto_clk),
 464	CLK(NULL, "mjcp", &mjcp_clk),
 465	CLK(NULL, NULL, NULL),
 466};
 467
 468/*----------------------------------------------------------------------*/
 469
 470#define INTMUX		0x18
 471#define EVTMUX		0x1c
 472
 473
 474static const struct mux_config dm365_pins[] = {
 475#ifdef CONFIG_DAVINCI_MUX
 476MUX_CFG(DM365,	MMCSD0,		0,   24,     1,	  0,	 false)
 477
 478MUX_CFG(DM365,	SD1_CLK,	0,   16,    3,	  1,	 false)
 479MUX_CFG(DM365,	SD1_CMD,	4,   30,    3,	  1,	 false)
 480MUX_CFG(DM365,	SD1_DATA3,	4,   28,    3,	  1,	 false)
 481MUX_CFG(DM365,	SD1_DATA2,	4,   26,    3,	  1,	 false)
 482MUX_CFG(DM365,	SD1_DATA1,	4,   24,    3,	  1,	 false)
 483MUX_CFG(DM365,	SD1_DATA0,	4,   22,    3,	  1,	 false)
 484
 485MUX_CFG(DM365,	I2C_SDA,	3,   23,    3,	  2,	 false)
 486MUX_CFG(DM365,	I2C_SCL,	3,   21,    3,	  2,	 false)
 487
 488MUX_CFG(DM365,	AEMIF_AR_A14,	2,   0,     3,	  1,	 false)
 489MUX_CFG(DM365,	AEMIF_AR_BA0,	2,   0,     3,	  2,	 false)
 490MUX_CFG(DM365,	AEMIF_A3,	2,   2,     3,	  1,	 false)
 491MUX_CFG(DM365,	AEMIF_A7,	2,   4,     3,	  1,	 false)
 492MUX_CFG(DM365,	AEMIF_D15_8,	2,   6,     1,	  1,	 false)
 493MUX_CFG(DM365,	AEMIF_CE0,	2,   7,     1,	  0,	 false)
 494MUX_CFG(DM365,	AEMIF_CE1,	2,   8,     1,    0,     false)
 495MUX_CFG(DM365,	AEMIF_WE_OE,	2,   9,     1,    0,     false)
 496
 497MUX_CFG(DM365,	MCBSP0_BDX,	0,   23,    1,	  1,	 false)
 498MUX_CFG(DM365,	MCBSP0_X,	0,   22,    1,	  1,	 false)
 499MUX_CFG(DM365,	MCBSP0_BFSX,	0,   21,    1,	  1,	 false)
 500MUX_CFG(DM365,	MCBSP0_BDR,	0,   20,    1,	  1,	 false)
 501MUX_CFG(DM365,	MCBSP0_R,	0,   19,    1,	  1,	 false)
 502MUX_CFG(DM365,	MCBSP0_BFSR,	0,   18,    1,	  1,	 false)
 503
 504MUX_CFG(DM365,	SPI0_SCLK,	3,   28,    1,    1,	 false)
 505MUX_CFG(DM365,	SPI0_SDI,	3,   26,    3,    1,	 false)
 506MUX_CFG(DM365,	SPI0_SDO,	3,   25,    1,    1,	 false)
 507MUX_CFG(DM365,	SPI0_SDENA0,	3,   29,    3,    1,	 false)
 508MUX_CFG(DM365,	SPI0_SDENA1,	3,   26,    3,    2,	 false)
 509
 510MUX_CFG(DM365,	UART0_RXD,	3,   20,    1,    1,	 false)
 511MUX_CFG(DM365,	UART0_TXD,	3,   19,    1,    1,	 false)
 512MUX_CFG(DM365,	UART1_RXD,	3,   17,    3,    2,	 false)
 513MUX_CFG(DM365,	UART1_TXD,	3,   15,    3,    2,	 false)
 514MUX_CFG(DM365,	UART1_RTS,	3,   23,    3,    1,	 false)
 515MUX_CFG(DM365,	UART1_CTS,	3,   21,    3,    1,	 false)
 516
 517MUX_CFG(DM365,  EMAC_TX_EN,	3,   17,    3,    1,     false)
 518MUX_CFG(DM365,  EMAC_TX_CLK,	3,   15,    3,    1,     false)
 519MUX_CFG(DM365,  EMAC_COL,	3,   14,    1,    1,     false)
 520MUX_CFG(DM365,  EMAC_TXD3,	3,   13,    1,    1,     false)
 521MUX_CFG(DM365,  EMAC_TXD2,	3,   12,    1,    1,     false)
 522MUX_CFG(DM365,  EMAC_TXD1,	3,   11,    1,    1,     false)
 523MUX_CFG(DM365,  EMAC_TXD0,	3,   10,    1,    1,     false)
 524MUX_CFG(DM365,  EMAC_RXD3,	3,   9,     1,    1,     false)
 525MUX_CFG(DM365,  EMAC_RXD2,	3,   8,     1,    1,     false)
 526MUX_CFG(DM365,  EMAC_RXD1,	3,   7,     1,    1,     false)
 527MUX_CFG(DM365,  EMAC_RXD0,	3,   6,     1,    1,     false)
 528MUX_CFG(DM365,  EMAC_RX_CLK,	3,   5,     1,    1,     false)
 529MUX_CFG(DM365,  EMAC_RX_DV,	3,   4,     1,    1,     false)
 530MUX_CFG(DM365,  EMAC_RX_ER,	3,   3,     1,    1,     false)
 531MUX_CFG(DM365,  EMAC_CRS,	3,   2,     1,    1,     false)
 532MUX_CFG(DM365,  EMAC_MDIO,	3,   1,     1,    1,     false)
 533MUX_CFG(DM365,  EMAC_MDCLK,	3,   0,     1,    1,     false)
 534
 535MUX_CFG(DM365,	KEYSCAN,	2,   0,     0x3f, 0x3f,  false)
 536
 537MUX_CFG(DM365,	PWM0,		1,   0,     3,    2,     false)
 538MUX_CFG(DM365,	PWM0_G23,	3,   26,    3,    3,     false)
 539MUX_CFG(DM365,	PWM1,		1,   2,     3,    2,     false)
 540MUX_CFG(DM365,	PWM1_G25,	3,   29,    3,    2,     false)
 541MUX_CFG(DM365,	PWM2_G87,	1,   10,    3,    2,     false)
 542MUX_CFG(DM365,	PWM2_G88,	1,   8,     3,    2,     false)
 543MUX_CFG(DM365,	PWM2_G89,	1,   6,     3,    2,     false)
 544MUX_CFG(DM365,	PWM2_G90,	1,   4,     3,    2,     false)
 545MUX_CFG(DM365,	PWM3_G80,	1,   20,    3,    3,     false)
 546MUX_CFG(DM365,	PWM3_G81,	1,   18,    3,    3,     false)
 547MUX_CFG(DM365,	PWM3_G85,	1,   14,    3,    2,     false)
 548MUX_CFG(DM365,	PWM3_G86,	1,   12,    3,    2,     false)
 549
 550MUX_CFG(DM365,	SPI1_SCLK,	4,   2,     3,    1,	 false)
 551MUX_CFG(DM365,	SPI1_SDI,	3,   31,    1,    1,	 false)
 552MUX_CFG(DM365,	SPI1_SDO,	4,   0,     3,    1,	 false)
 553MUX_CFG(DM365,	SPI1_SDENA0,	4,   4,     3,    1,	 false)
 554MUX_CFG(DM365,	SPI1_SDENA1,	4,   0,     3,    2,	 false)
 555
 556MUX_CFG(DM365,	SPI2_SCLK,	4,   10,    3,    1,	 false)
 557MUX_CFG(DM365,	SPI2_SDI,	4,   6,     3,    1,	 false)
 558MUX_CFG(DM365,	SPI2_SDO,	4,   8,     3,    1,	 false)
 559MUX_CFG(DM365,	SPI2_SDENA0,	4,   12,    3,    1,	 false)
 560MUX_CFG(DM365,	SPI2_SDENA1,	4,   8,     3,    2,	 false)
 561
 562MUX_CFG(DM365,	SPI3_SCLK,	0,   0,	    3,    2,	 false)
 563MUX_CFG(DM365,	SPI3_SDI,	0,   2,     3,    2,	 false)
 564MUX_CFG(DM365,	SPI3_SDO,	0,   6,     3,    2,	 false)
 565MUX_CFG(DM365,	SPI3_SDENA0,	0,   4,     3,    2,	 false)
 566MUX_CFG(DM365,	SPI3_SDENA1,	0,   6,     3,    3,	 false)
 567
 568MUX_CFG(DM365,	SPI4_SCLK,	4,   18,    3,    1,	 false)
 569MUX_CFG(DM365,	SPI4_SDI,	4,   14,    3,    1,	 false)
 570MUX_CFG(DM365,	SPI4_SDO,	4,   16,    3,    1,	 false)
 571MUX_CFG(DM365,	SPI4_SDENA0,	4,   20,    3,    1,	 false)
 572MUX_CFG(DM365,	SPI4_SDENA1,	4,   16,    3,    2,	 false)
 573
 574MUX_CFG(DM365,	CLKOUT0,	4,   20,    3,    3,     false)
 575MUX_CFG(DM365,	CLKOUT1,	4,   16,    3,    3,     false)
 576MUX_CFG(DM365,	CLKOUT2,	4,   8,     3,    3,     false)
 577
 578MUX_CFG(DM365,	GPIO20,		3,   21,    3,    0,	 false)
 579MUX_CFG(DM365,	GPIO30,		4,   6,     3,	  0,	 false)
 580MUX_CFG(DM365,	GPIO31,		4,   8,     3,	  0,	 false)
 581MUX_CFG(DM365,	GPIO32,		4,   10,    3,	  0,	 false)
 582MUX_CFG(DM365,	GPIO33,		4,   12,    3,	  0,	 false)
 583MUX_CFG(DM365,	GPIO40,		4,   26,    3,	  0,	 false)
 584MUX_CFG(DM365,	GPIO64_57,	2,   6,     1,	  0,	 false)
 585
 586MUX_CFG(DM365,	VOUT_FIELD,	1,   18,    3,	  1,	 false)
 587MUX_CFG(DM365,	VOUT_FIELD_G81,	1,   18,    3,	  0,	 false)
 588MUX_CFG(DM365,	VOUT_HVSYNC,	1,   16,    1,	  0,	 false)
 589MUX_CFG(DM365,	VOUT_COUTL_EN,	1,   0,     0xff, 0x55,  false)
 590MUX_CFG(DM365,	VOUT_COUTH_EN,	1,   8,     0xff, 0x55,  false)
 591MUX_CFG(DM365,	VIN_CAM_WEN,	0,   14,    3,	  0,	 false)
 592MUX_CFG(DM365,	VIN_CAM_VD,	0,   13,    1,	  0,	 false)
 593MUX_CFG(DM365,	VIN_CAM_HD,	0,   12,    1,	  0,	 false)
 594MUX_CFG(DM365,	VIN_YIN4_7_EN,	0,   0,     0xff, 0,	 false)
 595MUX_CFG(DM365,	VIN_YIN0_3_EN,	0,   8,     0xf,  0,	 false)
 596
 597INT_CFG(DM365,  INT_EDMA_CC,         2,     1,    1,     false)
 598INT_CFG(DM365,  INT_EDMA_TC0_ERR,    3,     1,    1,     false)
 599INT_CFG(DM365,  INT_EDMA_TC1_ERR,    4,     1,    1,     false)
 600INT_CFG(DM365,  INT_EDMA_TC2_ERR,    22,    1,    1,     false)
 601INT_CFG(DM365,  INT_EDMA_TC3_ERR,    23,    1,    1,     false)
 602INT_CFG(DM365,  INT_PRTCSS,          10,    1,    1,     false)
 603INT_CFG(DM365,  INT_EMAC_RXTHRESH,   14,    1,    1,     false)
 604INT_CFG(DM365,  INT_EMAC_RXPULSE,    15,    1,    1,     false)
 605INT_CFG(DM365,  INT_EMAC_TXPULSE,    16,    1,    1,     false)
 606INT_CFG(DM365,  INT_EMAC_MISCPULSE,  17,    1,    1,     false)
 607INT_CFG(DM365,  INT_IMX0_ENABLE,     0,     1,    0,     false)
 608INT_CFG(DM365,  INT_IMX0_DISABLE,    0,     1,    1,     false)
 609INT_CFG(DM365,  INT_HDVICP_ENABLE,   0,     1,    1,     false)
 610INT_CFG(DM365,  INT_HDVICP_DISABLE,  0,     1,    0,     false)
 611INT_CFG(DM365,  INT_IMX1_ENABLE,     24,    1,    1,     false)
 612INT_CFG(DM365,  INT_IMX1_DISABLE,    24,    1,    0,     false)
 613INT_CFG(DM365,  INT_NSF_ENABLE,      25,    1,    1,     false)
 614INT_CFG(DM365,  INT_NSF_DISABLE,     25,    1,    0,     false)
 615
 616EVT_CFG(DM365,	EVT2_ASP_TX,         0,     1,    0,     false)
 617EVT_CFG(DM365,	EVT3_ASP_RX,         1,     1,    0,     false)
 618EVT_CFG(DM365,	EVT2_VC_TX,          0,     1,    1,     false)
 619EVT_CFG(DM365,	EVT3_VC_RX,          1,     1,    1,     false)
 620#endif
 621};
 622
 623static u64 dm365_spi0_dma_mask = DMA_BIT_MASK(32);
 624
 625static struct davinci_spi_platform_data dm365_spi0_pdata = {
 626	.version 	= SPI_VERSION_1,
 627	.num_chipselect = 2,
 628	.dma_event_q	= EVENTQ_3,
 
 629};
 630
 631static struct resource dm365_spi0_resources[] = {
 632	{
 633		.start = 0x01c66000,
 634		.end   = 0x01c667ff,
 635		.flags = IORESOURCE_MEM,
 636	},
 637	{
 638		.start = IRQ_DM365_SPIINT0_0,
 639		.flags = IORESOURCE_IRQ,
 640	},
 641	{
 642		.start = 17,
 643		.flags = IORESOURCE_DMA,
 644	},
 645	{
 646		.start = 16,
 647		.flags = IORESOURCE_DMA,
 648	},
 649};
 650
 651static struct platform_device dm365_spi0_device = {
 652	.name = "spi_davinci",
 653	.id = 0,
 654	.dev = {
 655		.dma_mask = &dm365_spi0_dma_mask,
 656		.coherent_dma_mask = DMA_BIT_MASK(32),
 657		.platform_data = &dm365_spi0_pdata,
 658	},
 659	.num_resources = ARRAY_SIZE(dm365_spi0_resources),
 660	.resource = dm365_spi0_resources,
 661};
 662
 663void __init dm365_init_spi0(unsigned chipselect_mask,
 664		struct spi_board_info *info, unsigned len)
 665{
 666	davinci_cfg_reg(DM365_SPI0_SCLK);
 667	davinci_cfg_reg(DM365_SPI0_SDI);
 668	davinci_cfg_reg(DM365_SPI0_SDO);
 669
 670	/* not all slaves will be wired up */
 671	if (chipselect_mask & BIT(0))
 672		davinci_cfg_reg(DM365_SPI0_SDENA0);
 673	if (chipselect_mask & BIT(1))
 674		davinci_cfg_reg(DM365_SPI0_SDENA1);
 675
 676	spi_register_board_info(info, len);
 677
 678	platform_device_register(&dm365_spi0_device);
 679}
 680
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 681static struct emac_platform_data dm365_emac_pdata = {
 682	.ctrl_reg_offset	= DM365_EMAC_CNTRL_OFFSET,
 683	.ctrl_mod_reg_offset	= DM365_EMAC_CNTRL_MOD_OFFSET,
 684	.ctrl_ram_offset	= DM365_EMAC_CNTRL_RAM_OFFSET,
 685	.ctrl_ram_size		= DM365_EMAC_CNTRL_RAM_SIZE,
 686	.version		= EMAC_VERSION_2,
 687};
 688
 689static struct resource dm365_emac_resources[] = {
 690	{
 691		.start	= DM365_EMAC_BASE,
 692		.end	= DM365_EMAC_BASE + SZ_16K - 1,
 693		.flags	= IORESOURCE_MEM,
 694	},
 695	{
 696		.start	= IRQ_DM365_EMAC_RXTHRESH,
 697		.end	= IRQ_DM365_EMAC_RXTHRESH,
 698		.flags	= IORESOURCE_IRQ,
 699	},
 700	{
 701		.start	= IRQ_DM365_EMAC_RXPULSE,
 702		.end	= IRQ_DM365_EMAC_RXPULSE,
 703		.flags	= IORESOURCE_IRQ,
 704	},
 705	{
 706		.start	= IRQ_DM365_EMAC_TXPULSE,
 707		.end	= IRQ_DM365_EMAC_TXPULSE,
 708		.flags	= IORESOURCE_IRQ,
 709	},
 710	{
 711		.start	= IRQ_DM365_EMAC_MISCPULSE,
 712		.end	= IRQ_DM365_EMAC_MISCPULSE,
 713		.flags	= IORESOURCE_IRQ,
 714	},
 715};
 716
 717static struct platform_device dm365_emac_device = {
 718	.name		= "davinci_emac",
 719	.id		= 1,
 720	.dev = {
 721		.platform_data	= &dm365_emac_pdata,
 722	},
 723	.num_resources	= ARRAY_SIZE(dm365_emac_resources),
 724	.resource	= dm365_emac_resources,
 725};
 726
 727static struct resource dm365_mdio_resources[] = {
 728	{
 729		.start	= DM365_EMAC_MDIO_BASE,
 730		.end	= DM365_EMAC_MDIO_BASE + SZ_4K - 1,
 731		.flags	= IORESOURCE_MEM,
 732	},
 733};
 734
 735static struct platform_device dm365_mdio_device = {
 736	.name		= "davinci_mdio",
 737	.id		= 0,
 738	.num_resources	= ARRAY_SIZE(dm365_mdio_resources),
 739	.resource	= dm365_mdio_resources,
 740};
 741
 742static u8 dm365_default_priorities[DAVINCI_N_AINTC_IRQ] = {
 743	[IRQ_VDINT0]			= 2,
 744	[IRQ_VDINT1]			= 6,
 745	[IRQ_VDINT2]			= 6,
 746	[IRQ_HISTINT]			= 6,
 747	[IRQ_H3AINT]			= 6,
 748	[IRQ_PRVUINT]			= 6,
 749	[IRQ_RSZINT]			= 6,
 750	[IRQ_DM365_INSFINT]		= 7,
 751	[IRQ_VENCINT]			= 6,
 752	[IRQ_ASQINT]			= 6,
 753	[IRQ_IMXINT]			= 6,
 754	[IRQ_DM365_IMCOPINT]		= 4,
 755	[IRQ_USBINT]			= 4,
 756	[IRQ_DM365_RTOINT]		= 7,
 757	[IRQ_DM365_TINT5]		= 7,
 758	[IRQ_DM365_TINT6]		= 5,
 759	[IRQ_CCINT0]			= 5,
 760	[IRQ_CCERRINT]			= 5,
 761	[IRQ_TCERRINT0]			= 5,
 762	[IRQ_TCERRINT]			= 7,
 763	[IRQ_PSCIN]			= 4,
 764	[IRQ_DM365_SPINT2_1]		= 7,
 765	[IRQ_DM365_TINT7]		= 7,
 766	[IRQ_DM365_SDIOINT0]		= 7,
 767	[IRQ_MBXINT]			= 7,
 768	[IRQ_MBRINT]			= 7,
 769	[IRQ_MMCINT]			= 7,
 770	[IRQ_DM365_MMCINT1]		= 7,
 771	[IRQ_DM365_PWMINT3]		= 7,
 772	[IRQ_AEMIFINT]			= 2,
 773	[IRQ_DM365_SDIOINT1]		= 2,
 774	[IRQ_TINT0_TINT12]		= 7,
 775	[IRQ_TINT0_TINT34]		= 7,
 776	[IRQ_TINT1_TINT12]		= 7,
 777	[IRQ_TINT1_TINT34]		= 7,
 778	[IRQ_PWMINT0]			= 7,
 779	[IRQ_PWMINT1]			= 3,
 780	[IRQ_PWMINT2]			= 3,
 781	[IRQ_I2C]			= 3,
 782	[IRQ_UARTINT0]			= 3,
 783	[IRQ_UARTINT1]			= 3,
 784	[IRQ_DM365_RTCINT]		= 3,
 785	[IRQ_DM365_SPIINT0_0]		= 3,
 786	[IRQ_DM365_SPIINT3_0]		= 3,
 787	[IRQ_DM365_GPIO0]		= 3,
 788	[IRQ_DM365_GPIO1]		= 7,
 789	[IRQ_DM365_GPIO2]		= 4,
 790	[IRQ_DM365_GPIO3]		= 4,
 791	[IRQ_DM365_GPIO4]		= 7,
 792	[IRQ_DM365_GPIO5]		= 7,
 793	[IRQ_DM365_GPIO6]		= 7,
 794	[IRQ_DM365_GPIO7]		= 7,
 795	[IRQ_DM365_EMAC_RXTHRESH]	= 7,
 796	[IRQ_DM365_EMAC_RXPULSE]	= 7,
 797	[IRQ_DM365_EMAC_TXPULSE]	= 7,
 798	[IRQ_DM365_EMAC_MISCPULSE]	= 7,
 799	[IRQ_DM365_GPIO12]		= 7,
 800	[IRQ_DM365_GPIO13]		= 7,
 801	[IRQ_DM365_GPIO14]		= 7,
 802	[IRQ_DM365_GPIO15]		= 7,
 803	[IRQ_DM365_KEYINT]		= 7,
 804	[IRQ_DM365_TCERRINT2]		= 7,
 805	[IRQ_DM365_TCERRINT3]		= 7,
 806	[IRQ_DM365_EMUINT]		= 7,
 807};
 808
 809/* Four Transfer Controllers on DM365 */
 810static const s8
 811dm365_queue_tc_mapping[][2] = {
 812	/* {event queue no, TC no} */
 813	{0, 0},
 814	{1, 1},
 815	{2, 2},
 816	{3, 3},
 817	{-1, -1},
 818};
 819
 820static const s8
 821dm365_queue_priority_mapping[][2] = {
 822	/* {event queue no, Priority} */
 823	{0, 7},
 824	{1, 7},
 825	{2, 7},
 826	{3, 0},
 827	{-1, -1},
 828};
 829
 830static struct edma_soc_info edma_cc0_info = {
 831	.n_channel		= 64,
 832	.n_region		= 4,
 833	.n_slot			= 256,
 834	.n_tc			= 4,
 835	.n_cc			= 1,
 836	.queue_tc_mapping	= dm365_queue_tc_mapping,
 
 
 
 
 
 
 
 
 
 
 
 
 
 837	.queue_priority_mapping	= dm365_queue_priority_mapping,
 838	.default_queue		= EVENTQ_3,
 839};
 840
 841static struct edma_soc_info *dm365_edma_info[EDMA_MAX_CC] = {
 842	&edma_cc0_info,
 843};
 844
 845static struct resource edma_resources[] = {
 846	{
 847		.name	= "edma_cc0",
 848		.start	= 0x01c00000,
 849		.end	= 0x01c00000 + SZ_64K - 1,
 850		.flags	= IORESOURCE_MEM,
 851	},
 852	{
 853		.name	= "edma_tc0",
 854		.start	= 0x01c10000,
 855		.end	= 0x01c10000 + SZ_1K - 1,
 856		.flags	= IORESOURCE_MEM,
 857	},
 858	{
 859		.name	= "edma_tc1",
 860		.start	= 0x01c10400,
 861		.end	= 0x01c10400 + SZ_1K - 1,
 862		.flags	= IORESOURCE_MEM,
 863	},
 864	{
 865		.name	= "edma_tc2",
 866		.start	= 0x01c10800,
 867		.end	= 0x01c10800 + SZ_1K - 1,
 868		.flags	= IORESOURCE_MEM,
 869	},
 870	{
 871		.name	= "edma_tc3",
 872		.start	= 0x01c10c00,
 873		.end	= 0x01c10c00 + SZ_1K - 1,
 874		.flags	= IORESOURCE_MEM,
 875	},
 876	{
 877		.name	= "edma0",
 878		.start	= IRQ_CCINT0,
 879		.flags	= IORESOURCE_IRQ,
 880	},
 881	{
 882		.name	= "edma0_err",
 883		.start	= IRQ_CCERRINT,
 884		.flags	= IORESOURCE_IRQ,
 885	},
 886	/* not using TC*_ERR */
 887};
 888
 889static struct platform_device dm365_edma_device = {
 890	.name			= "edma",
 891	.id			= 0,
 892	.dev.platform_data	= dm365_edma_info,
 893	.num_resources		= ARRAY_SIZE(edma_resources),
 894	.resource		= edma_resources,
 
 
 895};
 896
 897static struct resource dm365_asp_resources[] = {
 898	{
 
 899		.start	= DAVINCI_DM365_ASP0_BASE,
 900		.end	= DAVINCI_DM365_ASP0_BASE + SZ_8K - 1,
 901		.flags	= IORESOURCE_MEM,
 902	},
 903	{
 904		.start	= DAVINCI_DMA_ASP0_TX,
 905		.end	= DAVINCI_DMA_ASP0_TX,
 906		.flags	= IORESOURCE_DMA,
 907	},
 908	{
 909		.start	= DAVINCI_DMA_ASP0_RX,
 910		.end	= DAVINCI_DMA_ASP0_RX,
 911		.flags	= IORESOURCE_DMA,
 912	},
 913};
 914
 915static struct platform_device dm365_asp_device = {
 916	.name		= "davinci-mcbsp",
 917	.id		= -1,
 918	.num_resources	= ARRAY_SIZE(dm365_asp_resources),
 919	.resource	= dm365_asp_resources,
 920};
 921
 922static struct resource dm365_vc_resources[] = {
 923	{
 924		.start	= DAVINCI_DM365_VC_BASE,
 925		.end	= DAVINCI_DM365_VC_BASE + SZ_1K - 1,
 926		.flags	= IORESOURCE_MEM,
 927	},
 928	{
 929		.start	= DAVINCI_DMA_VC_TX,
 930		.end	= DAVINCI_DMA_VC_TX,
 931		.flags	= IORESOURCE_DMA,
 932	},
 933	{
 934		.start	= DAVINCI_DMA_VC_RX,
 935		.end	= DAVINCI_DMA_VC_RX,
 936		.flags	= IORESOURCE_DMA,
 937	},
 938};
 939
 940static struct platform_device dm365_vc_device = {
 941	.name		= "davinci_voicecodec",
 942	.id		= -1,
 943	.num_resources	= ARRAY_SIZE(dm365_vc_resources),
 944	.resource	= dm365_vc_resources,
 945};
 946
 947static struct resource dm365_rtc_resources[] = {
 948	{
 949		.start = DM365_RTC_BASE,
 950		.end = DM365_RTC_BASE + SZ_1K - 1,
 951		.flags = IORESOURCE_MEM,
 952	},
 953	{
 954		.start = IRQ_DM365_RTCINT,
 955		.flags = IORESOURCE_IRQ,
 956	},
 957};
 958
 959static struct platform_device dm365_rtc_device = {
 960	.name = "rtc_davinci",
 961	.id = 0,
 962	.num_resources = ARRAY_SIZE(dm365_rtc_resources),
 963	.resource = dm365_rtc_resources,
 964};
 965
 966static struct map_desc dm365_io_desc[] = {
 967	{
 968		.virtual	= IO_VIRT,
 969		.pfn		= __phys_to_pfn(IO_PHYS),
 970		.length		= IO_SIZE,
 971		.type		= MT_DEVICE
 972	},
 973	{
 974		.virtual	= SRAM_VIRT,
 975		.pfn		= __phys_to_pfn(0x00010000),
 976		.length		= SZ_32K,
 977		.type		= MT_MEMORY_NONCACHED,
 978	},
 979};
 980
 981static struct resource dm365_ks_resources[] = {
 982	{
 983		/* registers */
 984		.start = DM365_KEYSCAN_BASE,
 985		.end = DM365_KEYSCAN_BASE + SZ_1K - 1,
 986		.flags = IORESOURCE_MEM,
 987	},
 988	{
 989		/* interrupt */
 990		.start = IRQ_DM365_KEYINT,
 991		.end = IRQ_DM365_KEYINT,
 992		.flags = IORESOURCE_IRQ,
 993	},
 994};
 995
 996static struct platform_device dm365_ks_device = {
 997	.name		= "davinci_keyscan",
 998	.id		= 0,
 999	.num_resources	= ARRAY_SIZE(dm365_ks_resources),
1000	.resource	= dm365_ks_resources,
1001};
1002
1003/* Contents of JTAG ID register used to identify exact cpu type */
1004static struct davinci_id dm365_ids[] = {
1005	{
1006		.variant	= 0x0,
1007		.part_no	= 0xb83e,
1008		.manufacturer	= 0x017,
1009		.cpu_id		= DAVINCI_CPU_ID_DM365,
1010		.name		= "dm365_rev1.1",
1011	},
1012	{
1013		.variant	= 0x8,
1014		.part_no	= 0xb83e,
1015		.manufacturer	= 0x017,
1016		.cpu_id		= DAVINCI_CPU_ID_DM365,
1017		.name		= "dm365_rev1.2",
1018	},
1019};
1020
1021static u32 dm365_psc_bases[] = { DAVINCI_PWR_SLEEP_CNTRL_BASE };
1022
1023static struct davinci_timer_info dm365_timer_info = {
1024	.timers		= davinci_timer_instance,
1025	.clockevent_id	= T0_BOT,
1026	.clocksource_id	= T0_TOP,
1027};
1028
1029#define DM365_UART1_BASE	(IO_PHYS + 0x106000)
1030
1031static struct plat_serial8250_port dm365_serial_platform_data[] = {
1032	{
1033		.mapbase	= DAVINCI_UART0_BASE,
1034		.irq		= IRQ_UARTINT0,
1035		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
1036				  UPF_IOREMAP,
1037		.iotype		= UPIO_MEM,
1038		.regshift	= 2,
1039	},
1040	{
 
 
 
 
 
1041		.mapbase	= DM365_UART1_BASE,
1042		.irq		= IRQ_UARTINT1,
1043		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
1044				  UPF_IOREMAP,
1045		.iotype		= UPIO_MEM,
1046		.regshift	= 2,
1047	},
1048	{
1049		.flags		= 0
1050	},
1051};
1052
1053static struct platform_device dm365_serial_device = {
1054	.name			= "serial8250",
1055	.id			= PLAT8250_DEV_PLATFORM,
1056	.dev			= {
1057		.platform_data	= dm365_serial_platform_data,
 
 
1058	},
 
 
 
 
 
 
 
 
 
1059};
1060
1061static struct davinci_soc_info davinci_soc_info_dm365 = {
1062	.io_desc		= dm365_io_desc,
1063	.io_desc_num		= ARRAY_SIZE(dm365_io_desc),
1064	.jtag_id_reg		= 0x01c40028,
1065	.ids			= dm365_ids,
1066	.ids_num		= ARRAY_SIZE(dm365_ids),
1067	.cpu_clks		= dm365_clks,
1068	.psc_bases		= dm365_psc_bases,
1069	.psc_bases_num		= ARRAY_SIZE(dm365_psc_bases),
1070	.pinmux_base		= DAVINCI_SYSTEM_MODULE_BASE,
1071	.pinmux_pins		= dm365_pins,
1072	.pinmux_pins_num	= ARRAY_SIZE(dm365_pins),
1073	.intc_base		= DAVINCI_ARM_INTC_BASE,
1074	.intc_type		= DAVINCI_INTC_TYPE_AINTC,
1075	.intc_irq_prios		= dm365_default_priorities,
1076	.intc_irq_num		= DAVINCI_N_AINTC_IRQ,
1077	.timer_info		= &dm365_timer_info,
1078	.gpio_type		= GPIO_TYPE_DAVINCI,
1079	.gpio_base		= DAVINCI_GPIO_BASE,
1080	.gpio_num		= 104,
1081	.gpio_irq		= IRQ_DM365_GPIO0,
1082	.gpio_unbanked		= 8,	/* really 16 ... skip muxed GPIOs */
1083	.serial_dev		= &dm365_serial_device,
1084	.emac_pdata		= &dm365_emac_pdata,
1085	.sram_dma		= 0x00010000,
1086	.sram_len		= SZ_32K,
1087	.reset_device		= &davinci_wdt_device,
1088};
1089
1090void __init dm365_init_asp(struct snd_platform_data *pdata)
1091{
1092	davinci_cfg_reg(DM365_MCBSP0_BDX);
1093	davinci_cfg_reg(DM365_MCBSP0_X);
1094	davinci_cfg_reg(DM365_MCBSP0_BFSX);
1095	davinci_cfg_reg(DM365_MCBSP0_BDR);
1096	davinci_cfg_reg(DM365_MCBSP0_R);
1097	davinci_cfg_reg(DM365_MCBSP0_BFSR);
1098	davinci_cfg_reg(DM365_EVT2_ASP_TX);
1099	davinci_cfg_reg(DM365_EVT3_ASP_RX);
1100	dm365_asp_device.dev.platform_data = pdata;
1101	platform_device_register(&dm365_asp_device);
1102}
1103
1104void __init dm365_init_vc(struct snd_platform_data *pdata)
1105{
1106	davinci_cfg_reg(DM365_EVT2_VC_TX);
1107	davinci_cfg_reg(DM365_EVT3_VC_RX);
1108	dm365_vc_device.dev.platform_data = pdata;
1109	platform_device_register(&dm365_vc_device);
1110}
1111
1112void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
1113{
1114	dm365_ks_device.dev.platform_data = pdata;
1115	platform_device_register(&dm365_ks_device);
1116}
1117
1118void __init dm365_init_rtc(void)
1119{
1120	davinci_cfg_reg(DM365_INT_PRTCSS);
1121	platform_device_register(&dm365_rtc_device);
1122}
1123
1124void __init dm365_init(void)
1125{
1126	davinci_common_init(&davinci_soc_info_dm365);
 
 
 
 
 
 
 
1127}
1128
1129static struct resource dm365_vpss_resources[] = {
1130	{
1131		/* VPSS ISP5 Base address */
1132		.name           = "isp5",
1133		.start          = 0x01c70000,
1134		.end            = 0x01c70000 + 0xff,
1135		.flags          = IORESOURCE_MEM,
1136	},
1137	{
1138		/* VPSS CLK Base address */
1139		.name           = "vpss",
1140		.start          = 0x01c70200,
1141		.end            = 0x01c70200 + 0xff,
1142		.flags          = IORESOURCE_MEM,
1143	},
1144};
1145
1146static struct platform_device dm365_vpss_device = {
1147       .name                   = "vpss",
1148       .id                     = -1,
1149       .dev.platform_data      = "dm365_vpss",
1150       .num_resources          = ARRAY_SIZE(dm365_vpss_resources),
1151       .resource               = dm365_vpss_resources,
1152};
1153
1154static struct resource vpfe_resources[] = {
1155	{
1156		.start          = IRQ_VDINT0,
1157		.end            = IRQ_VDINT0,
1158		.flags          = IORESOURCE_IRQ,
1159	},
1160	{
1161		.start          = IRQ_VDINT1,
1162		.end            = IRQ_VDINT1,
1163		.flags          = IORESOURCE_IRQ,
1164	},
1165};
1166
1167static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
1168static struct platform_device vpfe_capture_dev = {
1169	.name           = CAPTURE_DRV_NAME,
1170	.id             = -1,
1171	.num_resources  = ARRAY_SIZE(vpfe_resources),
1172	.resource       = vpfe_resources,
1173	.dev = {
1174		.dma_mask               = &vpfe_capture_dma_mask,
1175		.coherent_dma_mask      = DMA_BIT_MASK(32),
1176	},
1177};
1178
1179static void dm365_isif_setup_pinmux(void)
1180{
1181	davinci_cfg_reg(DM365_VIN_CAM_WEN);
1182	davinci_cfg_reg(DM365_VIN_CAM_VD);
1183	davinci_cfg_reg(DM365_VIN_CAM_HD);
1184	davinci_cfg_reg(DM365_VIN_YIN4_7_EN);
1185	davinci_cfg_reg(DM365_VIN_YIN0_3_EN);
1186}
1187
1188static struct resource isif_resource[] = {
1189	/* ISIF Base address */
1190	{
1191		.start          = 0x01c71000,
1192		.end            = 0x01c71000 + 0x1ff,
1193		.flags          = IORESOURCE_MEM,
1194	},
1195	/* ISIF Linearization table 0 */
1196	{
1197		.start          = 0x1C7C000,
1198		.end            = 0x1C7C000 + 0x2ff,
1199		.flags          = IORESOURCE_MEM,
1200	},
1201	/* ISIF Linearization table 1 */
1202	{
1203		.start          = 0x1C7C400,
1204		.end            = 0x1C7C400 + 0x2ff,
1205		.flags          = IORESOURCE_MEM,
1206	},
1207};
1208static struct platform_device dm365_isif_dev = {
1209	.name           = "isif",
1210	.id             = -1,
1211	.num_resources  = ARRAY_SIZE(isif_resource),
1212	.resource       = isif_resource,
1213	.dev = {
1214		.dma_mask               = &vpfe_capture_dma_mask,
1215		.coherent_dma_mask      = DMA_BIT_MASK(32),
1216		.platform_data		= dm365_isif_setup_pinmux,
1217	},
1218};
1219
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1220static int __init dm365_init_devices(void)
1221{
 
 
 
1222	if (!cpu_is_davinci_dm365())
1223		return 0;
1224
1225	davinci_cfg_reg(DM365_INT_EDMA_CC);
1226	platform_device_register(&dm365_edma_device);
 
 
 
 
1227
1228	platform_device_register(&dm365_mdio_device);
1229	platform_device_register(&dm365_emac_device);
1230	clk_add_alias(NULL, dev_name(&dm365_mdio_device.dev),
1231		      NULL, &dm365_emac_device.dev);
1232
1233	/* Add isif clock alias */
1234	clk_add_alias("master", dm365_isif_dev.name, "vpss_master", NULL);
1235	platform_device_register(&dm365_vpss_device);
1236	platform_device_register(&dm365_isif_dev);
1237	platform_device_register(&vpfe_capture_dev);
1238	return 0;
1239}
1240postcore_initcall(dm365_init_devices);
1241
1242void dm365_set_vpfe_config(struct vpfe_config *cfg)
1243{
1244       vpfe_capture_dev.dev.platform_data = cfg;
1245}