board-dm646x-evm.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. /*
  2. * TI DaVinci DM646X EVM board
  3. *
  4. * Derived from: arch/arm/mach-davinci/board-evm.c
  5. * Copyright (C) 2006 Texas Instruments.
  6. *
  7. * (C) 2007-2008, MontaVista Software, Inc.
  8. *
  9. * This file is licensed under the terms of the GNU General Public License
  10. * version 2. This program is licensed "as is" without any warranty of any
  11. * kind, whether express or implied.
  12. *
  13. */
  14. /**************************************************************************
  15. * Included Files
  16. **************************************************************************/
  17. #include <linux/kernel.h>
  18. #include <linux/module.h>
  19. #include <linux/init.h>
  20. #include <linux/fs.h>
  21. #include <linux/major.h>
  22. #include <linux/root_dev.h>
  23. #include <linux/dma-mapping.h>
  24. #include <linux/serial.h>
  25. #include <linux/serial_8250.h>
  26. #include <linux/leds.h>
  27. #include <linux/gpio.h>
  28. #include <linux/io.h>
  29. #include <linux/platform_device.h>
  30. #include <linux/i2c.h>
  31. #include <linux/i2c/at24.h>
  32. #include <linux/i2c/pcf857x.h>
  33. #include <linux/etherdevice.h>
  34. #include <media/tvp514x.h>
  35. #include <asm/setup.h>
  36. #include <asm/mach-types.h>
  37. #include <asm/mach/arch.h>
  38. #include <asm/mach/map.h>
  39. #include <asm/mach/flash.h>
  40. #include <mach/dm646x.h>
  41. #include <mach/common.h>
  42. #include <mach/psc.h>
  43. #include <mach/serial.h>
  44. #include <mach/i2c.h>
  45. #include <mach/mmc.h>
  46. #include <mach/emac.h>
  47. #if defined(CONFIG_BLK_DEV_PALMCHIP_BK3710) || \
  48. defined(CONFIG_BLK_DEV_PALMCHIP_BK3710_MODULE)
  49. #define HAS_ATA 1
  50. #else
  51. #define HAS_ATA 0
  52. #endif
  53. /* CPLD Register 0 bits to control ATA */
  54. #define DM646X_EVM_ATA_RST BIT(0)
  55. #define DM646X_EVM_ATA_PWD BIT(1)
  56. #define DM646X_EVM_PHY_MASK (0x2)
  57. #define DM646X_EVM_MDIO_FREQUENCY (2200000) /* PHY bus frequency */
  58. #define VIDCLKCTL_OFFSET (DAVINCI_SYSTEM_MODULE_BASE + 0x38)
  59. #define VSCLKDIS_OFFSET (DAVINCI_SYSTEM_MODULE_BASE + 0x6c)
  60. #define VCH2CLK_MASK (BIT_MASK(10) | BIT_MASK(9) | BIT_MASK(8))
  61. #define VCH2CLK_SYSCLK8 (BIT(9))
  62. #define VCH2CLK_AUXCLK (BIT(9) | BIT(8))
  63. #define VCH3CLK_MASK (BIT_MASK(14) | BIT_MASK(13) | BIT_MASK(12))
  64. #define VCH3CLK_SYSCLK8 (BIT(13))
  65. #define VCH3CLK_AUXCLK (BIT(14) | BIT(13))
  66. #define VIDCH2CLK (BIT(10))
  67. #define VIDCH3CLK (BIT(11))
  68. #define VIDCH1CLK (BIT(4))
  69. #define TVP7002_INPUT (BIT(4))
  70. #define TVP5147_INPUT (~BIT(4))
  71. #define VPIF_INPUT_ONE_CHANNEL (BIT(5))
  72. #define VPIF_INPUT_TWO_CHANNEL (~BIT(5))
  73. #define TVP5147_CH0 "tvp514x-0"
  74. #define TVP5147_CH1 "tvp514x-1"
  75. static void __iomem *vpif_vidclkctl_reg;
  76. static void __iomem *vpif_vsclkdis_reg;
  77. /* spin lock for updating above registers */
  78. static spinlock_t vpif_reg_lock;
  79. static struct davinci_uart_config uart_config __initdata = {
  80. .enabled_uarts = (1 << 0),
  81. };
  82. /* CPLD Register 0 Client: used for I/O Control */
  83. static int cpld_reg0_probe(struct i2c_client *client,
  84. const struct i2c_device_id *id)
  85. {
  86. if (HAS_ATA) {
  87. u8 data;
  88. struct i2c_msg msg[2] = {
  89. {
  90. .addr = client->addr,
  91. .flags = I2C_M_RD,
  92. .len = 1,
  93. .buf = &data,
  94. },
  95. {
  96. .addr = client->addr,
  97. .flags = 0,
  98. .len = 1,
  99. .buf = &data,
  100. },
  101. };
  102. /* Clear ATA_RSTn and ATA_PWD bits to enable ATA operation. */
  103. i2c_transfer(client->adapter, msg, 1);
  104. data &= ~(DM646X_EVM_ATA_RST | DM646X_EVM_ATA_PWD);
  105. i2c_transfer(client->adapter, msg + 1, 1);
  106. }
  107. return 0;
  108. }
  109. static const struct i2c_device_id cpld_reg_ids[] = {
  110. { "cpld_reg0", 0, },
  111. { },
  112. };
  113. static struct i2c_driver dm6467evm_cpld_driver = {
  114. .driver.name = "cpld_reg0",
  115. .id_table = cpld_reg_ids,
  116. .probe = cpld_reg0_probe,
  117. };
  118. /* LEDS */
  119. static struct gpio_led evm_leds[] = {
  120. { .name = "DS1", .active_low = 1, },
  121. { .name = "DS2", .active_low = 1, },
  122. { .name = "DS3", .active_low = 1, },
  123. { .name = "DS4", .active_low = 1, },
  124. };
  125. static __initconst struct gpio_led_platform_data evm_led_data = {
  126. .num_leds = ARRAY_SIZE(evm_leds),
  127. .leds = evm_leds,
  128. };
  129. static struct platform_device *evm_led_dev;
  130. static int evm_led_setup(struct i2c_client *client, int gpio,
  131. unsigned int ngpio, void *c)
  132. {
  133. struct gpio_led *leds = evm_leds;
  134. int status;
  135. while (ngpio--) {
  136. leds->gpio = gpio++;
  137. leds++;
  138. };
  139. evm_led_dev = platform_device_alloc("leds-gpio", 0);
  140. platform_device_add_data(evm_led_dev, &evm_led_data,
  141. sizeof(evm_led_data));
  142. evm_led_dev->dev.parent = &client->dev;
  143. status = platform_device_add(evm_led_dev);
  144. if (status < 0) {
  145. platform_device_put(evm_led_dev);
  146. evm_led_dev = NULL;
  147. }
  148. return status;
  149. }
  150. static int evm_led_teardown(struct i2c_client *client, int gpio,
  151. unsigned ngpio, void *c)
  152. {
  153. if (evm_led_dev) {
  154. platform_device_unregister(evm_led_dev);
  155. evm_led_dev = NULL;
  156. }
  157. return 0;
  158. }
  159. static int evm_sw_gpio[4] = { -EINVAL, -EINVAL, -EINVAL, -EINVAL };
  160. static int evm_sw_setup(struct i2c_client *client, int gpio,
  161. unsigned ngpio, void *c)
  162. {
  163. int status;
  164. int i;
  165. char label[10];
  166. for (i = 0; i < 4; ++i) {
  167. snprintf(label, 10, "user_sw%d", i);
  168. status = gpio_request(gpio, label);
  169. if (status)
  170. goto out_free;
  171. evm_sw_gpio[i] = gpio++;
  172. status = gpio_direction_input(evm_sw_gpio[i]);
  173. if (status) {
  174. gpio_free(evm_sw_gpio[i]);
  175. evm_sw_gpio[i] = -EINVAL;
  176. goto out_free;
  177. }
  178. status = gpio_export(evm_sw_gpio[i], 0);
  179. if (status) {
  180. gpio_free(evm_sw_gpio[i]);
  181. evm_sw_gpio[i] = -EINVAL;
  182. goto out_free;
  183. }
  184. }
  185. return status;
  186. out_free:
  187. for (i = 0; i < 4; ++i) {
  188. if (evm_sw_gpio[i] != -EINVAL) {
  189. gpio_free(evm_sw_gpio[i]);
  190. evm_sw_gpio[i] = -EINVAL;
  191. }
  192. }
  193. return status;
  194. }
  195. static int evm_sw_teardown(struct i2c_client *client, int gpio,
  196. unsigned ngpio, void *c)
  197. {
  198. int i;
  199. for (i = 0; i < 4; ++i) {
  200. if (evm_sw_gpio[i] != -EINVAL) {
  201. gpio_unexport(evm_sw_gpio[i]);
  202. gpio_free(evm_sw_gpio[i]);
  203. evm_sw_gpio[i] = -EINVAL;
  204. }
  205. }
  206. return 0;
  207. }
  208. static int evm_pcf_setup(struct i2c_client *client, int gpio,
  209. unsigned int ngpio, void *c)
  210. {
  211. int status;
  212. if (ngpio < 8)
  213. return -EINVAL;
  214. status = evm_sw_setup(client, gpio, 4, c);
  215. if (status)
  216. return status;
  217. return evm_led_setup(client, gpio+4, 4, c);
  218. }
  219. static int evm_pcf_teardown(struct i2c_client *client, int gpio,
  220. unsigned int ngpio, void *c)
  221. {
  222. BUG_ON(ngpio < 8);
  223. evm_sw_teardown(client, gpio, 4, c);
  224. evm_led_teardown(client, gpio+4, 4, c);
  225. return 0;
  226. }
  227. static struct pcf857x_platform_data pcf_data = {
  228. .gpio_base = DAVINCI_N_GPIO+1,
  229. .setup = evm_pcf_setup,
  230. .teardown = evm_pcf_teardown,
  231. };
  232. /* Most of this EEPROM is unused, but U-Boot uses some data:
  233. * - 0x7f00, 6 bytes Ethernet Address
  234. * - ... newer boards may have more
  235. */
  236. static struct at24_platform_data eeprom_info = {
  237. .byte_len = (256*1024) / 8,
  238. .page_size = 64,
  239. .flags = AT24_FLAG_ADDR16,
  240. .setup = davinci_get_mac_addr,
  241. .context = (void *)0x7f00,
  242. };
  243. static u8 dm646x_iis_serializer_direction[] = {
  244. TX_MODE, RX_MODE, INACTIVE_MODE, INACTIVE_MODE,
  245. };
  246. static u8 dm646x_dit_serializer_direction[] = {
  247. TX_MODE,
  248. };
  249. static struct snd_platform_data dm646x_evm_snd_data[] = {
  250. {
  251. .tx_dma_offset = 0x400,
  252. .rx_dma_offset = 0x400,
  253. .op_mode = DAVINCI_MCASP_IIS_MODE,
  254. .num_serializer = ARRAY_SIZE(dm646x_iis_serializer_direction),
  255. .tdm_slots = 2,
  256. .serial_dir = dm646x_iis_serializer_direction,
  257. .eventq_no = EVENTQ_0,
  258. },
  259. {
  260. .tx_dma_offset = 0x400,
  261. .rx_dma_offset = 0,
  262. .op_mode = DAVINCI_MCASP_DIT_MODE,
  263. .num_serializer = ARRAY_SIZE(dm646x_dit_serializer_direction),
  264. .tdm_slots = 32,
  265. .serial_dir = dm646x_dit_serializer_direction,
  266. .eventq_no = EVENTQ_0,
  267. },
  268. };
  269. static struct i2c_client *cpld_client;
  270. static int cpld_video_probe(struct i2c_client *client,
  271. const struct i2c_device_id *id)
  272. {
  273. cpld_client = client;
  274. return 0;
  275. }
  276. static int __devexit cpld_video_remove(struct i2c_client *client)
  277. {
  278. cpld_client = NULL;
  279. return 0;
  280. }
  281. static const struct i2c_device_id cpld_video_id[] = {
  282. { "cpld_video", 0 },
  283. { }
  284. };
  285. static struct i2c_driver cpld_video_driver = {
  286. .driver = {
  287. .name = "cpld_video",
  288. },
  289. .probe = cpld_video_probe,
  290. .remove = cpld_video_remove,
  291. .id_table = cpld_video_id,
  292. };
  293. static void evm_init_cpld(void)
  294. {
  295. i2c_add_driver(&cpld_video_driver);
  296. }
  297. static struct i2c_board_info __initdata i2c_info[] = {
  298. {
  299. I2C_BOARD_INFO("24c256", 0x50),
  300. .platform_data = &eeprom_info,
  301. },
  302. {
  303. I2C_BOARD_INFO("pcf8574a", 0x38),
  304. .platform_data = &pcf_data,
  305. },
  306. {
  307. I2C_BOARD_INFO("cpld_reg0", 0x3a),
  308. },
  309. {
  310. I2C_BOARD_INFO("tlv320aic33", 0x18),
  311. },
  312. {
  313. I2C_BOARD_INFO("cpld_video", 0x3b),
  314. },
  315. };
  316. static struct davinci_i2c_platform_data i2c_pdata = {
  317. .bus_freq = 100 /* kHz */,
  318. .bus_delay = 0 /* usec */,
  319. };
  320. static int set_vpif_clock(int mux_mode, int hd)
  321. {
  322. unsigned long flags;
  323. unsigned int value;
  324. int val = 0;
  325. int err = 0;
  326. if (!vpif_vidclkctl_reg || !vpif_vsclkdis_reg || !cpld_client)
  327. return -ENXIO;
  328. /* disable the clock */
  329. spin_lock_irqsave(&vpif_reg_lock, flags);
  330. value = __raw_readl(vpif_vsclkdis_reg);
  331. value |= (VIDCH3CLK | VIDCH2CLK);
  332. __raw_writel(value, vpif_vsclkdis_reg);
  333. spin_unlock_irqrestore(&vpif_reg_lock, flags);
  334. val = i2c_smbus_read_byte(cpld_client);
  335. if (val < 0)
  336. return val;
  337. if (mux_mode == 1)
  338. val &= ~0x40;
  339. else
  340. val |= 0x40;
  341. err = i2c_smbus_write_byte(cpld_client, val);
  342. if (err)
  343. return err;
  344. value = __raw_readl(vpif_vidclkctl_reg);
  345. value &= ~(VCH2CLK_MASK);
  346. value &= ~(VCH3CLK_MASK);
  347. if (hd >= 1)
  348. value |= (VCH2CLK_SYSCLK8 | VCH3CLK_SYSCLK8);
  349. else
  350. value |= (VCH2CLK_AUXCLK | VCH3CLK_AUXCLK);
  351. __raw_writel(value, vpif_vidclkctl_reg);
  352. spin_lock_irqsave(&vpif_reg_lock, flags);
  353. value = __raw_readl(vpif_vsclkdis_reg);
  354. /* enable the clock */
  355. value &= ~(VIDCH3CLK | VIDCH2CLK);
  356. __raw_writel(value, vpif_vsclkdis_reg);
  357. spin_unlock_irqrestore(&vpif_reg_lock, flags);
  358. return 0;
  359. }
  360. static struct vpif_subdev_info dm646x_vpif_subdev[] = {
  361. {
  362. .name = "adv7343",
  363. .board_info = {
  364. I2C_BOARD_INFO("adv7343", 0x2a),
  365. },
  366. },
  367. {
  368. .name = "ths7303",
  369. .board_info = {
  370. I2C_BOARD_INFO("ths7303", 0x2c),
  371. },
  372. },
  373. };
  374. static const char *output[] = {
  375. "Composite",
  376. "Component",
  377. "S-Video",
  378. };
  379. static struct vpif_display_config dm646x_vpif_display_config = {
  380. .set_clock = set_vpif_clock,
  381. .subdevinfo = dm646x_vpif_subdev,
  382. .subdev_count = ARRAY_SIZE(dm646x_vpif_subdev),
  383. .output = output,
  384. .output_count = ARRAY_SIZE(output),
  385. .card_name = "DM646x EVM",
  386. };
  387. /**
  388. * setup_vpif_input_path()
  389. * @channel: channel id (0 - CH0, 1 - CH1)
  390. * @sub_dev_name: ptr sub device name
  391. *
  392. * This will set vpif input to capture data from tvp514x or
  393. * tvp7002.
  394. */
  395. static int setup_vpif_input_path(int channel, const char *sub_dev_name)
  396. {
  397. int err = 0;
  398. int val;
  399. /* for channel 1, we don't do anything */
  400. if (channel != 0)
  401. return 0;
  402. if (!cpld_client)
  403. return -ENXIO;
  404. val = i2c_smbus_read_byte(cpld_client);
  405. if (val < 0)
  406. return val;
  407. if (!strcmp(sub_dev_name, TVP5147_CH0) ||
  408. !strcmp(sub_dev_name, TVP5147_CH1))
  409. val &= TVP5147_INPUT;
  410. else
  411. val |= TVP7002_INPUT;
  412. err = i2c_smbus_write_byte(cpld_client, val);
  413. if (err)
  414. return err;
  415. return 0;
  416. }
  417. /**
  418. * setup_vpif_input_channel_mode()
  419. * @mux_mode: mux mode. 0 - 1 channel or (1) - 2 channel
  420. *
  421. * This will setup input mode to one channel (TVP7002) or 2 channel (TVP5147)
  422. */
  423. static int setup_vpif_input_channel_mode(int mux_mode)
  424. {
  425. unsigned long flags;
  426. int err = 0;
  427. int val;
  428. u32 value;
  429. if (!vpif_vsclkdis_reg || !cpld_client)
  430. return -ENXIO;
  431. val = i2c_smbus_read_byte(cpld_client);
  432. if (val < 0)
  433. return val;
  434. spin_lock_irqsave(&vpif_reg_lock, flags);
  435. value = __raw_readl(vpif_vsclkdis_reg);
  436. if (mux_mode) {
  437. val &= VPIF_INPUT_TWO_CHANNEL;
  438. value |= VIDCH1CLK;
  439. } else {
  440. val |= VPIF_INPUT_ONE_CHANNEL;
  441. value &= ~VIDCH1CLK;
  442. }
  443. __raw_writel(value, vpif_vsclkdis_reg);
  444. spin_unlock_irqrestore(&vpif_reg_lock, flags);
  445. err = i2c_smbus_write_byte(cpld_client, val);
  446. if (err)
  447. return err;
  448. return 0;
  449. }
  450. static struct tvp514x_platform_data tvp5146_pdata = {
  451. .clk_polarity = 0,
  452. .hs_polarity = 1,
  453. .vs_polarity = 1
  454. };
  455. #define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL)
  456. static struct vpif_subdev_info vpif_capture_sdev_info[] = {
  457. {
  458. .name = TVP5147_CH0,
  459. .board_info = {
  460. I2C_BOARD_INFO("tvp5146", 0x5d),
  461. .platform_data = &tvp5146_pdata,
  462. },
  463. .input = INPUT_CVBS_VI2B,
  464. .output = OUTPUT_10BIT_422_EMBEDDED_SYNC,
  465. .can_route = 1,
  466. .vpif_if = {
  467. .if_type = VPIF_IF_BT656,
  468. .hd_pol = 1,
  469. .vd_pol = 1,
  470. .fid_pol = 0,
  471. },
  472. },
  473. {
  474. .name = TVP5147_CH1,
  475. .board_info = {
  476. I2C_BOARD_INFO("tvp5146", 0x5c),
  477. .platform_data = &tvp5146_pdata,
  478. },
  479. .input = INPUT_SVIDEO_VI2C_VI1C,
  480. .output = OUTPUT_10BIT_422_EMBEDDED_SYNC,
  481. .can_route = 1,
  482. .vpif_if = {
  483. .if_type = VPIF_IF_BT656,
  484. .hd_pol = 1,
  485. .vd_pol = 1,
  486. .fid_pol = 0,
  487. },
  488. },
  489. };
  490. static const struct vpif_input dm6467_ch0_inputs[] = {
  491. {
  492. .input = {
  493. .index = 0,
  494. .name = "Composite",
  495. .type = V4L2_INPUT_TYPE_CAMERA,
  496. .std = TVP514X_STD_ALL,
  497. },
  498. .subdev_name = TVP5147_CH0,
  499. },
  500. };
  501. static const struct vpif_input dm6467_ch1_inputs[] = {
  502. {
  503. .input = {
  504. .index = 0,
  505. .name = "S-Video",
  506. .type = V4L2_INPUT_TYPE_CAMERA,
  507. .std = TVP514X_STD_ALL,
  508. },
  509. .subdev_name = TVP5147_CH1,
  510. },
  511. };
  512. static struct vpif_capture_config dm646x_vpif_capture_cfg = {
  513. .setup_input_path = setup_vpif_input_path,
  514. .setup_input_channel_mode = setup_vpif_input_channel_mode,
  515. .subdev_info = vpif_capture_sdev_info,
  516. .subdev_count = ARRAY_SIZE(vpif_capture_sdev_info),
  517. .chan_config[0] = {
  518. .inputs = dm6467_ch0_inputs,
  519. .input_count = ARRAY_SIZE(dm6467_ch0_inputs),
  520. },
  521. .chan_config[1] = {
  522. .inputs = dm6467_ch1_inputs,
  523. .input_count = ARRAY_SIZE(dm6467_ch1_inputs),
  524. },
  525. };
  526. static void __init evm_init_video(void)
  527. {
  528. vpif_vidclkctl_reg = ioremap(VIDCLKCTL_OFFSET, 4);
  529. vpif_vsclkdis_reg = ioremap(VSCLKDIS_OFFSET, 4);
  530. if (!vpif_vidclkctl_reg || !vpif_vsclkdis_reg) {
  531. pr_err("Can't map VPIF VIDCLKCTL or VSCLKDIS registers\n");
  532. return;
  533. }
  534. spin_lock_init(&vpif_reg_lock);
  535. dm646x_setup_vpif(&dm646x_vpif_display_config,
  536. &dm646x_vpif_capture_cfg);
  537. }
  538. static void __init evm_init_i2c(void)
  539. {
  540. davinci_init_i2c(&i2c_pdata);
  541. i2c_add_driver(&dm6467evm_cpld_driver);
  542. i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));
  543. evm_init_cpld();
  544. evm_init_video();
  545. }
  546. static void __init davinci_map_io(void)
  547. {
  548. dm646x_init();
  549. }
  550. static __init void evm_init(void)
  551. {
  552. struct davinci_soc_info *soc_info = &davinci_soc_info;
  553. evm_init_i2c();
  554. davinci_serial_init(&uart_config);
  555. dm646x_init_mcasp0(&dm646x_evm_snd_data[0]);
  556. dm646x_init_mcasp1(&dm646x_evm_snd_data[1]);
  557. if (HAS_ATA)
  558. dm646x_init_ide();
  559. soc_info->emac_pdata->phy_mask = DM646X_EVM_PHY_MASK;
  560. soc_info->emac_pdata->mdio_max_freq = DM646X_EVM_MDIO_FREQUENCY;
  561. }
  562. static __init void davinci_dm646x_evm_irq_init(void)
  563. {
  564. davinci_irq_init();
  565. }
  566. MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM")
  567. .phys_io = IO_PHYS,
  568. .io_pg_offst = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
  569. .boot_params = (0x80000100),
  570. .map_io = davinci_map_io,
  571. .init_irq = davinci_dm646x_evm_irq_init,
  572. .timer = &davinci_timer,
  573. .init_machine = evm_init,
  574. MACHINE_END