Advertisement
Guest User

Untitled

a guest
Sep 30th, 2016
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.28 KB | None | 0 0
  1. /*
  2. * Board-specific setup code for the AT91SAM9M10G45 Evaluation Kit family
  3. *
  4. * Covers: * AT91SAM9G45-EKES board
  5. * * AT91SAM9M10G45-EK board
  6. *
  7. * Copyright (C) 2009 Atmel Corporation.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 2 of the License, or
  12. * (at your option) any later version.
  13. *
  14. */
  15.  
  16. #include <linux/types.h>
  17. #include <linux/gpio.h>
  18. #include <linux/init.h>
  19. #include <linux/mm.h>
  20. #include <linux/module.h>
  21. #include <linux/platform_device.h>
  22. #include <linux/spi/spi.h>
  23. #include <linux/fb.h>
  24. #include <linux/gpio_keys.h>
  25. #include <linux/input.h>
  26. #include <linux/leds.h>
  27. #include <linux/atmel-mci.h>
  28. #include <linux/delay.h>
  29.  
  30. #include <linux/platform_data/at91_adc.h>
  31.  
  32. #include <mach/hardware.h>
  33. #include <video/atmel_lcdc.h>
  34. #include <media/soc_camera.h>
  35. #include <media/atmel-isi.h>
  36.  
  37. #include <asm/setup.h>
  38. #include <asm/mach-types.h>
  39. #include <asm/irq.h>
  40.  
  41. #include <asm/mach/arch.h>
  42. #include <asm/mach/map.h>
  43. #include <asm/mach/irq.h>
  44.  
  45. #include <mach/at91sam9_smc.h>
  46. #include <mach/system_rev.h>
  47.  
  48. #include "at91_aic.h"
  49. #include "at91_shdwc.h"
  50. #include "board.h"
  51. #include "sam9_smc.h"
  52. #include "generic.h"
  53.  
  54.  
  55. static void __init ek_init_early(void)
  56. {
  57. /* Initialize processor: 12.000 MHz crystal */
  58. at91_initialize(12000000);
  59. }
  60.  
  61. /*
  62. * USB HS Host port (common to OHCI & EHCI)
  63. */
  64. static struct at91_usbh_data __initdata ek_usbh_hs_data = {
  65. .ports = 2,
  66. .vbus_pin = {AT91_PIN_PD1, AT91_PIN_PD3},
  67. .vbus_pin_active_low = {1, 1},
  68. .overcurrent_pin= {-EINVAL, -EINVAL},
  69. };
  70.  
  71.  
  72. /*
  73. * USB HS Device port
  74. */
  75. static struct usba_platform_data __initdata ek_usba_udc_data = {
  76. .vbus_pin = AT91_PIN_PB19,
  77. };
  78.  
  79.  
  80. /*
  81. * SPI devices.
  82. */
  83. static struct spi_board_info ek_spi_devices[] = {
  84. { /* DataFlash chip */
  85. .modalias = "mtd_dataflash",
  86. .chip_select = 0,
  87. .max_speed_hz = 15 * 1000 * 1000,
  88. .bus_num = 0,
  89. },
  90. };
  91.  
  92.  
  93. /*
  94. * MCI (SD/MMC)
  95. */
  96. static struct mci_platform_data __initdata mci0_data = {
  97. .slot[0] = {
  98. .bus_width = 4,
  99. .detect_pin = AT91_PIN_PA31,
  100. .wp_pin = -EINVAL,
  101. },
  102. };
  103.  
  104. /*
  105. static struct mci_platform_data __initdata mci1_data = {
  106. .slot[0] = {
  107. .bus_width = 4,
  108. .detect_pin = AT91_PIN_PD11,
  109. .wp_pin = AT91_PIN_PD29,
  110. },
  111. };
  112. */
  113.  
  114.  
  115. /*
  116. * MACB Ethernet device
  117. */
  118. static struct macb_platform_data __initdata ek_macb_data = {
  119. .phy_irq_pin = AT91_PIN_PB5,
  120. .is_rmii = 1,
  121. };
  122.  
  123.  
  124. /*
  125. * NAND flash
  126. */
  127. static struct mtd_partition __initdata ek_nand_partition[] = {
  128. {
  129. .name = "Partition 1",
  130. .offset = 0,
  131. .size = SZ_64M,
  132. },
  133. {
  134. .name = "Partition 2",
  135. .offset = MTDPART_OFS_NXTBLK,
  136. .size = MTDPART_SIZ_FULL,
  137. },
  138. };
  139.  
  140. /* det_pin is not connected */
  141. static struct atmel_nand_data __initdata ek_nand_data = {
  142. .ale = 21,
  143. .cle = 22,
  144. .rdy_pin = AT91_PIN_PC8,
  145. .enable_pin = AT91_PIN_PC14,
  146. .det_pin = -EINVAL,
  147. .ecc_mode = NAND_ECC_SOFT,
  148. .on_flash_bbt = 1,
  149. .parts = ek_nand_partition,
  150. .num_parts = ARRAY_SIZE(ek_nand_partition),
  151. };
  152.  
  153. static struct sam9_smc_config __initdata ek_nand_smc_config = {
  154. .ncs_read_setup = 0,
  155. .nrd_setup = 2,
  156. .ncs_write_setup = 0,
  157. .nwe_setup = 2,
  158.  
  159. .ncs_read_pulse = 4,
  160. .nrd_pulse = 4,
  161. .ncs_write_pulse = 4,
  162. .nwe_pulse = 4,
  163.  
  164. .read_cycle = 7,
  165. .write_cycle = 7,
  166.  
  167. .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
  168. .tdf_cycles = 3,
  169. };
  170.  
  171. static void __init ek_add_device_nand(void)
  172. {
  173. ek_nand_data.bus_width_16 = board_have_nand_16bit();
  174. /* setup bus-width (8 or 16) */
  175. if (ek_nand_data.bus_width_16)
  176. ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
  177. else
  178. ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
  179.  
  180. /* configure chip-select 3 (NAND) */
  181. sam9_smc_configure(0, 3, &ek_nand_smc_config);
  182.  
  183. at91_add_device_nand(&ek_nand_data);
  184. }
  185.  
  186.  
  187. /*
  188. * ISI
  189. */
  190. static struct isi_platform_data __initdata isi_data = {
  191. .frate = ISI_CFG1_FRATE_CAPTURE_ALL,
  192. /* to use codec and preview path simultaneously */
  193. .full_mode = 1,
  194. .data_width_flags = ISI_DATAWIDTH_8 | ISI_DATAWIDTH_10,
  195. /* ISI_MCK is provided by programmable clock or external clock */
  196. .mck_hz = 25000000,
  197. };
  198.  
  199.  
  200. /*
  201. * soc-camera OV2640
  202. */
  203. #if defined(CONFIG_SOC_CAMERA_OV2640) || \
  204. defined(CONFIG_SOC_CAMERA_OV2640_MODULE)
  205. static unsigned long isi_camera_query_bus_param(struct soc_camera_link *link)
  206. {
  207. /* ISI board for ek using default 8-bits connection */
  208. return SOCAM_DATAWIDTH_8;
  209. }
  210.  
  211. static int i2c_camera_power(struct device *dev, int on)
  212. {
  213. /* enable or disable the camera */
  214. pr_debug("%s: %s the camera\n", __func__, on ? "ENABLE" : "DISABLE");
  215. at91_set_gpio_output(AT91_PIN_PD13, !on);
  216.  
  217. if (!on)
  218. goto out;
  219.  
  220. /* If enabled, give a reset impulse */
  221. at91_set_gpio_output(AT91_PIN_PD12, 0);
  222. msleep(20);
  223. at91_set_gpio_output(AT91_PIN_PD12, 1);
  224. msleep(100);
  225.  
  226. out:
  227. return 0;
  228. }
  229.  
  230. static struct i2c_board_info i2c_camera = {
  231. I2C_BOARD_INFO("ov2640", 0x30),
  232. };
  233.  
  234. static struct soc_camera_link iclink_ov2640 = {
  235. .bus_id = 0,
  236. .board_info = &i2c_camera,
  237. .i2c_adapter_id = 0,
  238. .power = i2c_camera_power,
  239. .query_bus_param = isi_camera_query_bus_param,
  240. };
  241.  
  242. static struct platform_device isi_ov2640 = {
  243. .name = "soc-camera-pdrv",
  244. .id = 0,
  245. .dev = {
  246. .platform_data = &iclink_ov2640,
  247. },
  248. };
  249. #endif
  250.  
  251.  
  252. /*
  253. * LCD Controller
  254. */
  255.  
  256. static struct fb_videomode at91_tft_vga_modes[] = {
  257. {
  258. .name = "SK",
  259. .refresh = 60,
  260. .xres = 800, .yres = 480,
  261. .pixclock = KHZ2PICOS(45000),//33MHz
  262.  
  263. .left_margin = 100, .right_margin = 100,
  264. .upper_margin = 12, .lower_margin = 1,
  265. .hsync_len = 41, .vsync_len = 10,
  266.  
  267. .sync = 0,
  268. .vmode = FB_VMODE_NONINTERLACED,
  269. },
  270. };
  271.  
  272. static struct fb_monspecs at91fb_default_monspecs = {
  273. .manufacturer = "SK",
  274. .monitor = "SK-ATM0700D4-Plug",
  275.  
  276. .modedb = at91_tft_vga_modes,
  277. .modedb_len = ARRAY_SIZE(at91_tft_vga_modes),
  278. .hfmin = 15000,
  279. .hfmax = 64000,
  280. .vfmin = 50,
  281. .vfmax = 150,
  282. };
  283.  
  284. #define AT91SAM9G45_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
  285. | ATMEL_LCDC_DISTYPE_TFT \
  286. | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
  287.  
  288. /* Driver datas */
  289. static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
  290. .lcdcon_is_backlight = true,
  291. .default_bpp = 16,
  292. .default_dmacon = ATMEL_LCDC_DMAEN,
  293. .default_lcdcon2 = AT91SAM9G45_DEFAULT_LCDCON2,
  294. .default_monspecs = &at91fb_default_monspecs,
  295. .guard_time = 9,
  296. .lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB,
  297. };
  298.  
  299.  
  300. /*
  301. * Touchscreen
  302. */
  303. static struct at91_tsadcc_data ek_tsadcc_data = {
  304. .adc_clock = 300000,
  305. .pendet_debounce = 0x0d,
  306. .ts_sample_hold_time = 0x0a,
  307. };
  308.  
  309. /*
  310. * ADCs
  311. */
  312. static struct at91_adc_data ek_adc_data = {
  313. .channels_used = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7),
  314. .use_external_triggers = true,
  315. .vref = 3300,
  316. };
  317.  
  318. /*
  319. * GPIO Buttons
  320. */
  321. #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
  322. static struct gpio_keys_button ek_buttons[] = {
  323. { /* BP1, "leftclic" */
  324. .code = BTN_LEFT,
  325. .gpio = AT91_PIN_PB6,
  326. .active_low = 1,
  327. .desc = "left_click",
  328. .wakeup = 1,
  329. },
  330. { /* BP2, "rightclic" */
  331. .code = BTN_RIGHT,
  332. .gpio = AT91_PIN_PB7,
  333. .active_low = 1,
  334. .desc = "right_click",
  335. .wakeup = 1,
  336. },
  337. /* BP3, "joystick" */
  338. {
  339. .code = KEY_LEFT,
  340. .gpio = AT91_PIN_PB14,
  341. .active_low = 1,
  342. .desc = "Joystick Left",
  343. },
  344. {
  345. .code = KEY_RIGHT,
  346. .gpio = AT91_PIN_PB15,
  347. .active_low = 1,
  348. .desc = "Joystick Right",
  349. },
  350. {
  351. .code = KEY_UP,
  352. .gpio = AT91_PIN_PB16,
  353. .active_low = 1,
  354. .desc = "Joystick Up",
  355. },
  356. {
  357. .code = KEY_DOWN,
  358. .gpio = AT91_PIN_PB17,
  359. .active_low = 1,
  360. .desc = "Joystick Down",
  361. },
  362. {
  363. .code = KEY_ENTER,
  364. .gpio = AT91_PIN_PB18,
  365. .active_low = 1,
  366. .desc = "Joystick Press",
  367. },
  368. };
  369.  
  370. static struct gpio_keys_platform_data ek_button_data = {
  371. .buttons = ek_buttons,
  372. .nbuttons = ARRAY_SIZE(ek_buttons),
  373. };
  374.  
  375. static struct platform_device ek_button_device = {
  376. .name = "gpio-keys",
  377. .id = -1,
  378. .num_resources = 0,
  379. .dev = {
  380. .platform_data = &ek_button_data,
  381. }
  382. };
  383.  
  384. static void __init ek_add_device_buttons(void)
  385. {
  386. int i;
  387.  
  388. for (i = 0; i < ARRAY_SIZE(ek_buttons); i++) {
  389. at91_set_GPIO_periph(ek_buttons[i].gpio, 1);
  390. at91_set_deglitch(ek_buttons[i].gpio, 1);
  391. }
  392.  
  393. platform_device_register(&ek_button_device);
  394. }
  395. #else
  396. static void __init ek_add_device_buttons(void) {}
  397. #endif
  398.  
  399.  
  400. /*
  401. * AC97
  402. * reset_pin is not connected: NRST
  403. */
  404. static struct ac97c_platform_data ek_ac97_data = {
  405. .reset_pin = -EINVAL,
  406. };
  407.  
  408.  
  409. /*
  410. * LEDs ... these could all be PWM-driven, for variable brightness
  411. */
  412. static struct gpio_led ek_leds[] = {
  413. { /* "top" led, red, powerled */
  414. .name = "d8",
  415. .gpio = AT91_PIN_PD30,
  416. .default_trigger = "heartbeat",
  417. },
  418. { /* "left" led, green, userled2, pwm3 */
  419. .name = "d6",
  420. .gpio = AT91_PIN_PD0,
  421. .active_low = 1,
  422. .default_trigger = "nand-disk",
  423. },
  424. #if !(defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE))
  425. { /* "right" led, green, userled1, pwm1 */
  426. .name = "d7",
  427. .gpio = AT91_PIN_PD31,
  428. .active_low = 1,
  429. .default_trigger = "mmc0",
  430. },
  431. #endif
  432. };
  433.  
  434.  
  435. /*
  436. * PWM Leds
  437. */
  438. static struct gpio_led ek_pwm_led[] = {
  439. #if defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE)
  440. { /* "right" led, green, userled1, pwm1 */
  441. .name = "d7",
  442. .gpio = 1, /* is PWM channel number */
  443. .active_low = 1,
  444. .default_trigger = "none",
  445. },
  446. #endif
  447. };
  448.  
  449. static struct platform_device *devices[] __initdata = {
  450. #if defined(CONFIG_SOC_CAMERA_OV2640) || \
  451. defined(CONFIG_SOC_CAMERA_OV2640_MODULE)
  452. &isi_ov2640,
  453. #endif
  454. };
  455.  
  456. static void __init ek_board_init(void)
  457. {
  458. /* Serial */
  459. /* DGBU on ttyS0. (Rx & Tx only) */
  460. at91_register_uart(0, 0, 0);
  461.  
  462. /* USART0 not connected on the -EK board */
  463. /* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */
  464. at91_register_uart(AT91SAM9G45_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
  465. at91_add_device_serial();
  466. /* USB HS Host */
  467. at91_add_device_usbh_ohci(&ek_usbh_hs_data);
  468. at91_add_device_usbh_ehci(&ek_usbh_hs_data);
  469. /* USB HS Device */
  470. at91_add_device_usba(&ek_usba_udc_data);
  471. /* SPI */
  472. at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
  473. /* MMC */
  474. at91_add_device_mci(0, &mci0_data);
  475. /* Ethernet */
  476. at91_add_device_eth(&ek_macb_data);
  477. /* NAND */
  478. ek_add_device_nand();
  479. /* I2C */
  480. at91_add_device_i2c(0, NULL, 0);
  481. /* ISI, using programmable clock as ISI_MCK */
  482. at91_add_device_isi(&isi_data, true);
  483. /* LCD Controller */
  484. at91_add_device_lcdc(&ek_lcdc_data);
  485. /* Touch Screen */
  486. at91_add_device_tsadcc(&ek_tsadcc_data);
  487. /* ADC */
  488. at91_add_device_adc(&ek_adc_data);
  489. /* Push Buttons */
  490. ek_add_device_buttons();
  491. /* AC97 */
  492. at91_add_device_ac97(&ek_ac97_data);
  493. /* LEDs */
  494. at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
  495. at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
  496. /* Other platform devices */
  497. platform_add_devices(devices, ARRAY_SIZE(devices));
  498. }
  499.  
  500. MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")
  501. /* Maintainer: Atmel */
  502. .init_time = at91sam926x_pit_init,
  503. .map_io = at91_map_io,
  504. .handle_irq = at91_aic_handle_irq,
  505. .init_early = ek_init_early,
  506. .init_irq = at91_init_irq_default,
  507. .init_machine = ek_board_init,
  508. MACHINE_END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement