board-m3ref.c 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753
  1. /*
  2. * arch/arm/mach-meson3/board-m3ref.c
  3. *
  4. * Copyright (C) 2011-2012 Amlogic, Inc.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  14. * more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. #include <linux/kernel.h>
  21. #include <linux/init.h>
  22. #include <linux/mm.h>
  23. #include <linux/sched.h>
  24. #include <linux/interrupt.h>
  25. #include <linux/ioport.h>
  26. #include <linux/platform_device.h>
  27. #include <linux/io.h>
  28. #include <linux/dma-mapping.h>
  29. #include <linux/mtd/mtd.h>
  30. #include <linux/mtd/nand.h>
  31. #include <linux/mtd/nand_ecc.h>
  32. #include <linux/mtd/partitions.h>
  33. #include <linux/device.h>
  34. #include <linux/spi/flash.h>
  35. #include <linux/i2c.h>
  36. #include <linux/delay.h>
  37. #include <linux/clk.h>
  38. #include <asm/mach-types.h>
  39. #include <asm/mach/arch.h>
  40. #include <asm/setup.h>
  41. #include <asm/memory.h>
  42. #include <asm/mach/map.h>
  43. #include <plat/platform.h>
  44. #include <plat/plat_dev.h>
  45. #include <plat/platform_data.h>
  46. #include <plat/lm.h>
  47. #include <plat/regops.h>
  48. #include <mach/am_regs.h>
  49. #include <mach/clock.h>
  50. #include <mach/map.h>
  51. #include <mach/i2c_aml.h>
  52. #include <mach/nand.h>
  53. #include <mach/usbclock.h>
  54. #include <mach/usbsetting.h>
  55. #include <mach/gpio.h>
  56. #include "board-m3ref.h"
  57. #ifdef CONFIG_MMC_AML
  58. #include <mach/mmc.h>
  59. #endif
  60. #include <linux/i2c-aml.h>
  61. #ifdef CONFIG_CACHE_L2X0
  62. #include <asm/hardware/cache-l2x0.h>
  63. #endif
  64. //#ifdef CONFIG_AM_UART
  65. #include <linux/uart-aml.h>
  66. //#endif
  67. #ifdef CONFIG_SUSPEND
  68. #include <mach/pm.h>
  69. #endif
  70. #ifdef CONFIG_CARDREADER
  71. #include <mach/card_io.h>
  72. #include <mach/gpio.h>
  73. #endif
  74. #ifdef CONFIG_VIDEO_AMLOGIC_CAPTURE
  75. #include <media/amlogic/aml_camera.h>
  76. #endif
  77. #ifdef CONFIG_MPU3050
  78. #include <linux/mpu/mpu.h>
  79. #endif
  80. #include "board-m3ref-pinmux.h"
  81. #define DEBUG_GPIO_INTERFACE
  82. #ifdef DEBUG_GPIO_INTERFACE
  83. #include <mach/gpio.h>
  84. #include <mach/gpio_data.h>
  85. #endif
  86. #ifdef CONFIG_SND_AML_M3
  87. #include <sound/soc.h>
  88. #include <sound/aml_platform.h>
  89. #endif
  90. #ifdef CONFIG_SARADC_AM
  91. #include <linux/saradc.h>
  92. static struct platform_device saradc_device = {
  93. .name = "saradc",
  94. .id = 0,
  95. .dev = {
  96. .platform_data = NULL,
  97. },
  98. };
  99. #endif
  100. #if defined(CONFIG_ADC_KEYPADS_AM)||defined(CONFIG_ADC_KEYPADS_AM_MODULE)
  101. #include <linux/input.h>
  102. #include <linux/adc_keypad.h>
  103. static struct adc_key adc_kp_key[] = {
  104. {KEY_MENU, "menu", CHAN_4, 0, 60},
  105. {KEY_VOLUMEDOWN, "vol-", CHAN_4, 140, 60},
  106. {KEY_VOLUMEUP, "vol+", CHAN_4, 266, 60},
  107. {KEY_BACK, "exit", CHAN_4, 386, 60},
  108. {KEY_HOME, "home", CHAN_4, 508, 60},
  109. };
  110. static struct adc_kp_platform_data adc_kp_pdata = {
  111. .key = &adc_kp_key[0],
  112. .key_num = ARRAY_SIZE(adc_kp_key),
  113. };
  114. static struct platform_device adc_kp_device = {
  115. .name = "m1-adckp",
  116. .id = 0,
  117. .num_resources = 0,
  118. .resource = NULL,
  119. .dev = {
  120. .platform_data = &adc_kp_pdata,
  121. }
  122. };
  123. #endif
  124. #if defined(CONFIG_KEY_INPUT_CUSTOM_AM) || defined(CONFIG_KEY_INPUT_CUSTOM_AM_MODULE)
  125. #include <linux/input.h>
  126. #include <linux/input/key_input.h>
  127. static int _key_code_list[] = {KEY_POWER};
  128. static inline int key_input_init_func(void)
  129. {
  130. WRITE_AOBUS_REG(AO_RTC_ADDR0, (READ_AOBUS_REG(AO_RTC_ADDR0) &~(1<<11)));
  131. WRITE_AOBUS_REG(AO_RTC_ADDR1, (READ_AOBUS_REG(AO_RTC_ADDR1) &~(1<<3)));
  132. return 0;
  133. }
  134. static inline int key_scan(void* data)
  135. {
  136. int *key_state_list = (int*)data;
  137. int ret = 0;
  138. key_state_list[0] = ((READ_AOBUS_REG(AO_RTC_ADDR1) >> 2) & 1) ? 0 : 1;
  139. return ret;
  140. }
  141. static struct key_input_platform_data key_input_pdata = {
  142. .scan_period = 20,
  143. .fuzz_time = 60,
  144. .key_code_list = &_key_code_list[0],
  145. .key_num = ARRAY_SIZE(_key_code_list),
  146. .scan_func = key_scan,
  147. .init_func = key_input_init_func,
  148. .config = 0,
  149. };
  150. static struct platform_device input_device_key = {
  151. .name = "meson-keyinput",
  152. .id = 0,
  153. .num_resources = 0,
  154. .resource = NULL,
  155. .dev = {
  156. .platform_data = &key_input_pdata,
  157. }
  158. };
  159. #endif
  160. #if 0
  161. static typeof(devices_pins) *cur_board_pinmux;
  162. static struct aml_uart_platform __initdata aml_uart_plat = {
  163. .uart_line[0] = UART_AO,
  164. .uart_line[1] = UART_A,
  165. .uart_line[2] = UART_B,
  166. .uart_line[3] = UART_C,
  167. };
  168. //#endif
  169. static struct aml_i2c_platform_a __initdata aml_i2c_data_a={
  170. .udelay = 8,
  171. .timeout =10 ,
  172. .resource ={
  173. .start = I2C_MASTER_A_START,
  174. .end = I2C_MASTER_A_END,
  175. .flags = IORESOURCE_MEM,
  176. }
  177. } ;
  178. static struct aml_i2c_platform_b __initdata aml_i2c_data_b={
  179. .freq= 3,
  180. .wait=7,
  181. .resource ={
  182. .start = I2C_MASTER_B_START,
  183. .end = I2C_MASTER_B_END,
  184. .flags = IORESOURCE_MEM,
  185. }
  186. };
  187. #endif
  188. static void set_usb_a_vbus_power(char is_power_on)
  189. {
  190. #ifdef DEBUG_GPIO_INTERFACE
  191. #define USB_A_POW_GPIO PAD_GPIOD_9
  192. #define USB_A_POW_GPIO_BIT_ON true
  193. #define USB_A_POW_GPIO_BIT_OFF false
  194. if(is_power_on){
  195. printk(KERN_INFO "set usb port power on (board gpio %d)!\n",USB_A_POW_GPIO);
  196. gpio_out(USB_A_POW_GPIO,USB_A_POW_GPIO_BIT_ON);
  197. }else{
  198. printk(KERN_INFO "set usb port power off (board gpio %d)!\n",USB_A_POW_GPIO);
  199. gpio_out(USB_A_POW_GPIO,USB_A_POW_GPIO_BIT_OFF);
  200. }
  201. #else
  202. #define USB_A_PWR_GPIO_MODE P_PREG_PAD_GPIO2_EN_N
  203. #define USB_A_PWR_GPIO P_PREG_PAD_GPIO2_O
  204. #define USB_A_PWR_GPIO_BIT 25
  205. #define USB_A_PWR_GPIO_ON 1
  206. #define USB_A_PWR_GPIO_OFF 0
  207. aml_set_reg32_bits(P_PERIPHS_PIN_MUX_7,0,16,1);
  208. aml_set_reg32_bits(P_PERIPHS_PIN_MUX_3,0,26,1);
  209. aml_set_reg32_bits(P_PERIPHS_PIN_MUX_0,0,29,1);
  210. aml_set_reg32_bits(USB_A_PWR_GPIO_MODE,0,USB_A_PWR_GPIO_BIT,1);
  211. if(is_power_on){
  212. printk(KERN_INFO "set usb port power on (board gpio %d)!\n",USB_A_PWR_GPIO_BIT);
  213. aml_set_reg32_bits(USB_A_PWR_GPIO,USB_A_PWR_GPIO_ON,USB_A_PWR_GPIO_BIT,1);
  214. }else{
  215. printk(KERN_INFO "set usb port power off (board gpio %d)!\n",USB_A_PWR_GPIO_BIT);
  216. aml_set_reg32_bits(USB_A_PWR_GPIO,USB_A_PWR_GPIO_OFF,USB_A_PWR_GPIO_BIT,1);
  217. }
  218. printk("%x %x\n",aml_read_reg32(USB_A_PWR_GPIO_MODE),aml_read_reg32(USB_A_PWR_GPIO));
  219. #endif
  220. }
  221. static int __init setup_usb_devices(void)
  222. {
  223. struct lm_device * usb_ld_a;
  224. usb_ld_a = alloc_usb_lm_device(USB_PORT_IDX_A);
  225. usb_ld_a->param.usb.set_vbus_power = set_usb_a_vbus_power;
  226. lm_device_register(usb_ld_a);
  227. return 0;
  228. }
  229. #ifdef CONFIG_ITK_CAPACITIVE_TOUCHSCREEN
  230. ///#include <mach/gpio-old.h>
  231. #include <linux/i2c/itk.h>
  232. #define GPIO_ITK_PENIRQ ((GPIOA_bank_bit0_27(16)<<16) | GPIOA_bit_bit0_27(16))
  233. #define GPIO_ITK_RST ((GPIOC_bank_bit0_15(3)<<16) | GPIOC_bit_bit0_15(3))
  234. #define ITK_INT INT_GPIO_0
  235. static int itk_init_irq(void)
  236. {
  237. #ifdef DEBUG_GPIO_INTERFACE
  238. gpio_set_status(PAD_GPIOA_16, gpio_status_in);
  239. gpio_irq_set(PAD_GPIOA_16, GPIO_IRQ(0,GPIO_IRQ_FALLING));
  240. #else
  241. /* set input mode */
  242. gpio_direction_input(GPIO_ITK_PENIRQ);
  243. /* set gpio interrupt #0 source=GPIOD_24, and triggered by falling edge(=1) */
  244. gpio_enable_edge_int(gpio_to_idx(GPIO_ITK_PENIRQ), 1, ITK_INT-INT_GPIO_0);
  245. #endif
  246. return 0;
  247. }
  248. static int itk_get_irq_level(void)
  249. {
  250. return gpio_in_get(PAD_GPIOA_16);
  251. }
  252. static void touch_on(int flag)
  253. {
  254. printk("enter %s flag=%d \n",__FUNCTION__,flag);
  255. if(flag)
  256. gpio_out_high(PAD_GPIOC_3);
  257. else
  258. gpio_out_low(PAD_GPIOC_3);
  259. }
  260. static struct itk_platform_data itk_pdata = {
  261. .init_irq = &itk_init_irq,
  262. .get_irq_level = &itk_get_irq_level,
  263. .touch_on = touch_on,
  264. .tp_max_width = 3328,
  265. .tp_max_height = 2432,
  266. .lcd_max_width = 800,
  267. .lcd_max_height = 600,
  268. .xpol = 1,
  269. .ypol = 1,
  270. };
  271. #endif
  272. #ifdef CONFIG_MPU3050
  273. #define GPIO_mpu3050_PENIRQ ((GPIOA_bank_bit0_27(14)<<16) | GPIOA_bit_bit0_27(14))
  274. #define MPU3050_IRQ INT_GPIO_1
  275. static int mpu3050_init_irq(void)
  276. {
  277. // /* set input mode */
  278. // gpio_direction_input(GPIO_mpu3050_PENIRQ);
  279. // /* map GPIO_mpu3050_PENIRQ map to gpio interrupt, and triggered by rising edge(=0) */
  280. // gpio_enable_edge_int(gpio_to_idx(GPIO_mpu3050_PENIRQ), 0, MPU3050_IRQ-INT_GPIO_0);
  281. gpio_set_status(PAD_GPIOA_14, gpio_status_in);
  282. gpio_irq_set(PAD_GPIOA_14, GPIO_IRQ(MPU3050_IRQ - INT_GPIO_0, GPIO_IRQ_RISING));
  283. return 0;
  284. }
  285. static struct mpu3050_platform_data mpu3050_data = {
  286. .int_config = 0x10,
  287. .orientation = {0,-1,0,-1,0,0,0,0,-1},
  288. .level_shifter = 0,
  289. .accel = {
  290. .get_slave_descr = get_accel_slave_descr,
  291. .adapt_num = 1, // The i2c bus to which the mpu device is
  292. // connected.
  293. .bus = EXT_SLAVE_BUS_SECONDARY, //The secondary I2C of MPU
  294. .address = 0x1c,
  295. .orientation = {0,1,0,1,0,0,0,0,-1},
  296. },
  297. #ifdef CONFIG_MPU_SENSORS_MMC314X
  298. .compass = {
  299. .get_slave_descr = mmc314x_get_slave_descr,
  300. .adapt_num = 0, // The i2c bus to which the compass device is
  301. // connected. It can be different from mpu.
  302. .bus = EXT_SLAVE_BUS_PRIMARY,
  303. .address = 0x30,
  304. .orientation = { -1, 0, 0, 0, 1, 0, 0, 0, -1 },
  305. }
  306. #elif defined (CONFIG_MPU_SENSORS_MMC328X)
  307. .compass = {
  308. .get_slave_descr = mmc328x_get_slave_descr,
  309. .adapt_num = 1, // The i2c bus to which the compass device is.
  310. // connected. It can be different from mpu.
  311. .bus = EXT_SLAVE_BUS_PRIMARY,
  312. .address = 0x30,
  313. .orientation = /*{ 0, 1, 0, 1, 0, 0, 0, 0, -1 }*/ {0,1,0,1,0,0,0,0,-1}
  314. }
  315. #endif
  316. };
  317. #endif
  318. #ifdef CONFIG_VIDEO_AMLOGIC_CAPTURE_GC0308
  319. static int gc0308_init(void)
  320. {
  321. unsigned pwm_cnt;
  322. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1, (1<<29));
  323. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_2, (1<<2));
  324. pwm_cnt = get_ddr_pll_clk()/48000000 - 1;
  325. pwm_cnt &= 0xffff;
  326. WRITE_CBUS_REG(PWM_PWM_C, (pwm_cnt<<16) | pwm_cnt);
  327. SET_CBUS_REG_MASK(PWM_MISC_REG_CD, (1<<15)|(0<<8)|(1<<4)|(1<<0)); //select ddr pll for source, and clk divide
  328. gpio_out(PAD_GPIOY_10, 0);
  329. msleep(20);
  330. gpio_out(PAD_GPIOY_10, 1);
  331. msleep(20);
  332. gpio_out(PAD_GPIOA_25, 0);
  333. msleep(20);
  334. return 0;
  335. }
  336. #endif //CONFIG_VIDEO_AMLOGIC_CAPTURE_GC0308
  337. #if defined (CONFIG_AMLOGIC_VIDEOIN_MANAGER)
  338. static struct resource vm_resources[] = {
  339. [0] = {
  340. .start = VM_ADDR_START,
  341. .end = VM_ADDR_END,
  342. .flags = IORESOURCE_MEM,
  343. },
  344. };
  345. static struct platform_device vm_device =
  346. {
  347. .name = "vm",
  348. .id = 0,
  349. .num_resources = ARRAY_SIZE(vm_resources),
  350. .resource = vm_resources,
  351. };
  352. #endif /* AMLOGIC_VIDEOIN_MANAGER */
  353. #if defined(CONFIG_VIDEO_AMLOGIC_CAPTURE_GC0308)
  354. static void gc0308_v4l2_init(void)
  355. {
  356. gc0308_init();
  357. }
  358. static void gc0308_v4l2_uninit(void)
  359. {
  360. printk( "amlogic camera driver: gc0308_v4l2_uninit. \n");
  361. gpio_out(PAD_GPIOA_25, 1); // set camera power disable
  362. }
  363. static void gc0308_v4l2_early_suspend(void)
  364. {
  365. gpio_out(PAD_GPIOA_25, 1); // set camera power disable
  366. }
  367. static void gc0308_v4l2_late_resume(void)
  368. {
  369. gpio_out(PAD_GPIOA_25, 0); // set camera power enable
  370. }
  371. static aml_plat_cam_data_t video_gc0308_data = {
  372. .name = "video-gc0308",
  373. .video_nr = 0,//1,
  374. .device_init = gc0308_v4l2_init,
  375. .device_uninit = gc0308_v4l2_uninit,
  376. .early_suspend = gc0308_v4l2_early_suspend,
  377. .late_resume = gc0308_v4l2_late_resume,
  378. };
  379. #endif //CONFIG_VIDEO_AMLOGIC_CAPTURE_GC0308
  380. #ifdef CONFIG_POST_PROCESS_MANAGER
  381. static struct resource ppmgr_resources[] = {
  382. [0] = {
  383. .start = PPMGR_ADDR_START,
  384. .end = PPMGR_ADDR_END,
  385. .flags = IORESOURCE_MEM,
  386. },
  387. };
  388. static struct platform_device ppmgr_device = {
  389. .name = "ppmgr",
  390. .id = 0,
  391. .num_resources = ARRAY_SIZE(ppmgr_resources),
  392. .resource = ppmgr_resources,
  393. };
  394. #endif /* CONFIG_POST_PROCESS_MANAGER */
  395. #if defined(CONFIG_I2C_AML) || defined(CONFIG_I2C_HW_AML)
  396. static bool pinmux_dummy_share(bool select)
  397. {
  398. return select;
  399. }
  400. static pinmux_item_t aml_i2c_0_pinmux_item[] = {
  401. {
  402. .reg = 5,
  403. //.clrmask = (3<<24)|(3<<30),
  404. .setmask = 3<<26
  405. },
  406. PINMUX_END_ITEM
  407. };
  408. static struct aml_i2c_platform aml_i2c_plat = {
  409. .wait_count = 50000,
  410. .wait_ack_interval = 5,
  411. .wait_read_interval = 5,
  412. .wait_xfer_interval = 5,
  413. .master_no = AML_I2C_MASTER_A,
  414. .use_pio = 0,
  415. .master_i2c_speed = AML_I2C_SPPED_300K,
  416. .master_pinmux = {
  417. .chip_select = pinmux_dummy_share,
  418. .pinmux = &aml_i2c_0_pinmux_item[0]
  419. }
  420. };
  421. static pinmux_item_t aml_i2c_1_pinmux_item[]={
  422. {
  423. .reg = 5,
  424. //.clrmask = (3<<28)|(3<<26),
  425. .setmask = 3<<30
  426. },
  427. PINMUX_END_ITEM
  428. };
  429. static struct aml_i2c_platform aml_i2c_plat1 = {
  430. .wait_count = 50000,
  431. .wait_ack_interval = 5,
  432. .wait_read_interval = 5,
  433. .wait_xfer_interval = 5,
  434. .master_no = AML_I2C_MASTER_B,
  435. .use_pio = 0,
  436. .master_i2c_speed = AML_I2C_SPPED_300K,
  437. .master_pinmux = {
  438. .chip_select = pinmux_dummy_share,
  439. .pinmux = &aml_i2c_1_pinmux_item[0]
  440. }
  441. };
  442. static pinmux_item_t aml_i2c_ao_pinmux_item[] = {
  443. {
  444. .reg = AO,
  445. .clrmask = 3<<1,
  446. .setmask = 3<<5
  447. },
  448. PINMUX_END_ITEM
  449. };
  450. static struct aml_i2c_platform aml_i2c_plat2 = {
  451. .wait_count = 50000,
  452. .wait_ack_interval = 5,
  453. .wait_read_interval = 5,
  454. .wait_xfer_interval = 5,
  455. .master_no = AML_I2C_MASTER_AO,
  456. .use_pio = 0,
  457. .master_i2c_speed = AML_I2C_SPPED_100K,
  458. .master_pinmux = {
  459. .pinmux = &aml_i2c_ao_pinmux_item[0]
  460. }
  461. };
  462. static struct resource aml_i2c_resource[] = {
  463. [0] = {
  464. .start = MESON_I2C_MASTER_A_START,
  465. .end = MESON_I2C_MASTER_A_END,
  466. .flags = IORESOURCE_MEM,
  467. }
  468. };
  469. static struct resource aml_i2c_resource1[] = {
  470. [0] = {
  471. .start = MESON_I2C_MASTER_A_START,
  472. .end = MESON_I2C_MASTER_A_END,
  473. .flags = IORESOURCE_MEM,
  474. }
  475. };
  476. static struct resource aml_i2c_resource2[] = {
  477. [0]= {
  478. .start = MESON_I2C_MASTER_AO_START,
  479. .end = MESON_I2C_MASTER_AO_END,
  480. .flags = IORESOURCE_MEM,
  481. }
  482. };
  483. static struct platform_device aml_i2c_device = {
  484. .name = "aml-i2c",
  485. .id = 0,
  486. .num_resources = ARRAY_SIZE(aml_i2c_resource),
  487. .resource = aml_i2c_resource,
  488. .dev = {
  489. .platform_data = &aml_i2c_plat,
  490. },
  491. };
  492. static struct platform_device aml_i2c_device1 = {
  493. .name = "aml-i2c",
  494. .id = 1,
  495. .num_resources = ARRAY_SIZE(aml_i2c_resource1),
  496. .resource = aml_i2c_resource1,
  497. .dev = {
  498. .platform_data = &aml_i2c_plat1,
  499. },
  500. };
  501. static struct platform_device aml_i2c_device2 = {
  502. .name = "aml-i2c",
  503. .id = 2,
  504. .num_resources = ARRAY_SIZE(aml_i2c_resource2),
  505. .resource = aml_i2c_resource2,
  506. .dev = {
  507. .platform_data = &aml_i2c_plat2,
  508. },
  509. };
  510. static struct i2c_board_info __initdata aml_i2c_bus_info[] = {
  511. #ifdef CONFIG_ITK_CAPACITIVE_TOUCHSCREEN
  512. {
  513. I2C_BOARD_INFO("itk", 0x41),
  514. .irq = ITK_INT,
  515. .platform_data = (void *)&itk_pdata,
  516. },
  517. #endif
  518. #ifdef CONFIG_VIDEO_AMLOGIC_CAPTURE_GC0308
  519. {
  520. /*gc0308 i2c address is 0x42/0x43*/
  521. I2C_BOARD_INFO("gc0308_i2c", 0x42 >> 1),
  522. .platform_data = (void *)&video_gc0308_data,
  523. },
  524. #endif
  525. };
  526. static struct i2c_board_info __initdata aml_i2c_bus_info1[] = {
  527. #ifdef CONFIG_MPU3050
  528. {
  529. I2C_BOARD_INFO("mpu3050", 0x68),
  530. .irq = MPU3050_IRQ,
  531. .platform_data = (void *)&mpu3050_data,
  532. },
  533. #endif
  534. };
  535. static int __init aml_i2c_init(void)
  536. {
  537. i2c_register_board_info(0, aml_i2c_bus_info,
  538. ARRAY_SIZE(aml_i2c_bus_info));
  539. i2c_register_board_info(1, aml_i2c_bus_info1,
  540. ARRAY_SIZE(aml_i2c_bus_info1));
  541. return 0;
  542. }
  543. #endif
  544. static struct resource meson_fb_resource[] = {
  545. [0] = {
  546. .start = OSD1_ADDR_START,
  547. .end = OSD1_ADDR_END,
  548. .flags = IORESOURCE_MEM,
  549. },
  550. [1] = {
  551. .start = OSD2_ADDR_START,
  552. .end = OSD2_ADDR_END,
  553. .flags = IORESOURCE_MEM,
  554. },
  555. };
  556. static struct resource meson_codec_resource[] = {
  557. [0] = {
  558. .start = CODEC_ADDR_START,
  559. .end = CODEC_ADDR_END,
  560. .flags = IORESOURCE_MEM,
  561. },
  562. [1] = {
  563. .start = STREAMBUF_ADDR_START,
  564. .end = STREAMBUF_ADDR_END,
  565. .flags = IORESOURCE_MEM,
  566. },
  567. };
  568. static int __init setup_devices_resource(void)
  569. {
  570. setup_fb_resource(meson_fb_resource, ARRAY_SIZE(meson_fb_resource));
  571. setup_codec_resource(meson_codec_resource,ARRAY_SIZE(meson_codec_resource));
  572. return 0;
  573. }
  574. #if 0
  575. static int __init setup_i2c_devices(void)
  576. {
  577. //just a sample
  578. meson_i2c1_set_platdata(&aml_i2c_data_a,sizeof(struct aml_i2c_platform_a ));
  579. meson_i2c2_set_platdata(&aml_i2c_data_b,sizeof(struct aml_i2c_platform_b ));
  580. return 0;
  581. }
  582. static int __init setup_uart_devices(void)
  583. {
  584. #if 0
  585. static pinmux_set_t temp;
  586. //#if defined(CONFIG_AM_UART)
  587. aml_uart_plat.public.pinmux_cfg.setup=NULL; //NULL repsent use defaut pinmux_set.
  588. aml_uart_plat.public.pinmux_cfg.clear=NULL;
  589. aml_uart_plat.public.clk_src=clk_get_sys("clk81", NULL);
  590. temp.pinmux=cur_board_pinmux[DEVICE_PIN_ITEM_UART];
  591. aml_uart_plat.public.pinmux_set.pinmux=cur_board_pinmux[DEVICE_PIN_ITEM_UART];
  592. aml_uart_plat.pinmux_uart[0]=&temp;
  593. meson_uart_set_platdata(&aml_uart_plat,sizeof(struct aml_uart_platform));
  594. #endif
  595. return 0;
  596. //#endif
  597. }
  598. #endif
  599. #if defined(CONFIG_TVIN_BT656IN)
  600. static void __init bt656in_pinmux_init(void)
  601. {
  602. #if 0
  603. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_8, 0xf<<6);
  604. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_3, 1<<21);
  605. #else
  606. static pinmux_item_t bt656_pinmux_set_items[] = {
  607. {
  608. .reg =8,
  609. //.clrmask = (3<<24)|(3<<30),
  610. .setmask = 0xf<<6
  611. },
  612. {
  613. .reg =3,
  614. //.clrmask = (3<<24)|(3<<30),
  615. .setmask = 1<<21
  616. },
  617. PINMUX_END_ITEM
  618. };
  619. static pinmux_set_t bt656_pinmux_set={
  620. .chip_select=NULL,
  621. .pinmux=&bt656_pinmux_set_items
  622. };
  623. pinmux_set(&bt656_pinmux_set);
  624. #endif
  625. }
  626. #endif
  627. static void __init device_pinmux_init(void)
  628. {
  629. #if 0 ///@todo Jerry Yu, Compile break , enable it later
  630. clearall_pinmux();
  631. /*other deivce power on*/
  632. uart_set_pinmux(UART_PORT_AO, UART_AO_GPIO_AO0_AO1_STD);
  633. /*pinmux of eth*/
  634. eth_pinmux_init();
  635. set_audio_pinmux(AUDIO_IN_JTAG); // for MIC input
  636. set_audio_pinmux(AUDIO_OUT_TEST_N); //External AUDIO DAC
  637. set_audio_pinmux(SPDIF_OUT_GPIOA); //SPDIF GPIOA_6
  638. #endif
  639. #if defined(CONFIG_TVIN_BT656IN)
  640. bt656in_pinmux_init();
  641. #endif
  642. #ifdef CONFIG_MPU3050
  643. mpu3050_init_irq();
  644. #endif
  645. #if 1
  646. //set clk for wifi
  647. WRITE_CBUS_REG(HHI_GEN_CLK_CNTL,(READ_CBUS_REG(HHI_GEN_CLK_CNTL)&(~(0x7f<<0)))|((0<<0)|(1<<8)|(7<<9)) );
  648. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<15));
  649. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_3, (1<<22));
  650. #endif
  651. }
  652. static void __init device_clk_setting(void)
  653. {
  654. #if 0 ///@todo Jerry Yu, Compile break , enable it later
  655. /*Configurate the ethernet clock*/
  656. eth_clk_set(ETH_CLKSRC_MISC_CLK, get_misc_pll_clk(), (50 * CLK_1M), 0);
  657. #endif
  658. }
  659. static void disable_unused_model(void)
  660. {
  661. #if 0 ///@todo Jerry Yu, Compile break , enable it later
  662. CLK_GATE_OFF(VIDEO_IN);
  663. CLK_GATE_OFF(BT656_IN);
  664. #endif
  665. }
  666. static void __init meson_cache_init(void)
  667. {
  668. #ifdef CONFIG_CACHE_L2X0
  669. /*
  670. * Early BRESP, I/D prefetch enabled
  671. * Non-secure enabled
  672. * 128kb (16KB/way),
  673. * 8-way associativity,
  674. * evmon/parity/share disabled
  675. * Full Line of Zero enabled
  676. * Bits: .111 .... .100 0010 0000 .... .... ...1
  677. */
  678. l2x0_init((void __iomem *)IO_PL310_BASE, 0x7c420001, 0xff800fff);
  679. #endif
  680. }
  681. static void __init backup_board_pinmux(void)
  682. {//devices_pins in __initdata section ,it will be released .
  683. #if 0
  684. cur_board_pinmux=kmemdup(devices_pins, sizeof(devices_pins), GFP_KERNEL);
  685. printk(KERN_INFO " cur_board_pinmux=%p",cur_board_pinmux[0]);
  686. printk(KERN_INFO " cur_board_pinmux=%p",&(cur_board_pinmux[0]));
  687. printk(KERN_INFO " cur_board_pinmux=%x",cur_board_pinmux[0][0]);
  688. printk(KERN_INFO " cur_board_pinmux=%x",cur_board_pinmux[0][0]->reg);
  689. #endif
  690. }
  691. static pinmux_item_t uart_pins[]={
  692. {
  693. .reg=PINMUX_REG(AO),
  694. .clrmask=3<<16,
  695. .setmask=3<<11
  696. },
  697. PINMUX_END_ITEM
  698. };
  699. static pinmux_set_t aml_uart_ao={
  700. .chip_select=NULL,
  701. .pinmux=&uart_pins[0]
  702. };
  703. static struct aml_uart_platform __initdata aml_uart_plat = {
  704. .uart_line[0] = UART_AO,
  705. .uart_line[1] = UART_A,
  706. .uart_line[2] = UART_B,
  707. .uart_line[3] = UART_C,
  708. .pinmux_uart[0] = (void*)&aml_uart_ao,
  709. .pinmux_uart[1] = NULL,
  710. .pinmux_uart[2] = NULL,
  711. .pinmux_uart[3] = NULL,
  712. };
  713. static struct platform_device aml_uart_device = {
  714. .name = "mesonuart",
  715. .id = -1,
  716. .num_resources = 0,
  717. .resource = NULL,
  718. .dev = {
  719. .platform_data = &aml_uart_plat,
  720. },
  721. };
  722. #if defined(CONFIG_AML_RTC)
  723. static struct platform_device meson_rtc_device = {
  724. .name = "aml_rtc",
  725. .id = -1,
  726. };
  727. #endif /* CONFIG_AML_RTC */
  728. #if defined(CONFIG_TVIN_VDIN)
  729. static struct resource vdin_resources[] = {
  730. [0] = {
  731. .start = VDIN_ADDR_START, //pbufAddr
  732. .end = VDIN_ADDR_END, //pbufAddr + size
  733. .flags = IORESOURCE_MEM,
  734. },
  735. [1] = {
  736. .start = VDIN_ADDR_START,
  737. .end = VDIN_ADDR_END,
  738. .flags = IORESOURCE_MEM,
  739. },
  740. [2] = {
  741. .start = INT_VDIN_VSYNC,
  742. .end = INT_VDIN_VSYNC,
  743. .flags = IORESOURCE_IRQ,
  744. },
  745. [3] = {
  746. .start = INT_VDIN_VSYNC,
  747. .end = INT_VDIN_VSYNC,
  748. .flags = IORESOURCE_IRQ,
  749. },
  750. };
  751. static struct platform_device vdin_device = {
  752. .name = "vdin",
  753. .id = -1,
  754. .num_resources = ARRAY_SIZE(vdin_resources),
  755. .resource = vdin_resources,
  756. };
  757. #endif
  758. #ifdef CONFIG_TVIN_BT656IN
  759. //add pin mux info for bt656 input
  760. #if 0
  761. static struct resource bt656in_resources[] = {
  762. [0] = {
  763. .start = VDIN_ADDR_START, //pbufAddr
  764. .end = VDIN_ADDR_END, //pbufAddr + size
  765. .flags = IORESOURCE_MEM,
  766. },
  767. [1] = { //bt656/camera/bt601 input resource pin mux setting
  768. .start = 0x3000, //mask--mux gpioD 15 to bt656 clk; mux gpioD 16:23 to be bt656 dt_in
  769. .end = PERIPHS_PIN_MUX_5 + 0x3000,
  770. .flags = IORESOURCE_MEM,
  771. },
  772. [2] = { //camera/bt601 input resource pin mux setting
  773. .start = 0x1c000, //mask--mux gpioD 12 to bt601 FIQ; mux gpioD 13 to bt601HS; mux gpioD 14 to bt601 VS;
  774. .end = PERIPHS_PIN_MUX_5 + 0x1c000,
  775. .flags = IORESOURCE_MEM,
  776. },
  777. [3] = { //bt601 input resource pin mux setting
  778. .start = 0x800, //mask--mux gpioD 24 to bt601 IDQ;;
  779. .end = PERIPHS_PIN_MUX_5 + 0x800,
  780. .flags = IORESOURCE_MEM,
  781. },
  782. };
  783. #endif
  784. static struct platform_device bt656in_device = {
  785. .name = "amvdec_656in",
  786. .id = -1,
  787. // .num_resources = ARRAY_SIZE(bt656in_resources),
  788. // .resource = bt656in_resources,
  789. };
  790. #endif
  791. #ifdef CONFIG_AM_NAND
  792. static struct mtd_partition normal_partition_info[] = {
  793. {
  794. .name = "logo",
  795. .offset = 32*SZ_1M+40*SZ_1M,
  796. .size = 8*SZ_1M,
  797. },
  798. {
  799. .name = "aml_logo",
  800. .offset = 48*SZ_1M+40*SZ_1M,
  801. .size = 8*SZ_1M,
  802. },
  803. {
  804. .name = "recovery",
  805. .offset = 64*SZ_1M+40*SZ_1M,
  806. .size = 8*SZ_1M,
  807. },
  808. {
  809. .name = "boot",
  810. .offset = 96*SZ_1M+40*SZ_1M,
  811. .size = 8*SZ_1M,
  812. },
  813. {
  814. .name = "system",
  815. .offset = 128*SZ_1M+40*SZ_1M,
  816. .size = 512*SZ_1M,
  817. },
  818. {
  819. .name = "cache",
  820. .offset = 640*SZ_1M+40*SZ_1M,
  821. .size = 128*SZ_1M,
  822. },
  823. {
  824. .name = "userdata",
  825. .offset = 768*SZ_1M+40*SZ_1M,
  826. .size = 512*SZ_1M,
  827. },
  828. {
  829. .name = "NFTL_Part",
  830. .offset = MTDPART_OFS_APPEND,
  831. .size = MTDPART_SIZ_FULL,
  832. },
  833. };
  834. static struct aml_nand_platform aml_nand_mid_platform[] = {
  835. #ifndef CONFIG_AMLOGIC_SPI_NOR
  836. {
  837. .name = NAND_BOOT_NAME,
  838. .chip_enable_pad = AML_NAND_CE0,
  839. .ready_busy_pad = AML_NAND_CE0,
  840. .platform_nand_data = {
  841. .chip = {
  842. .nr_chips = 1,
  843. .options = (NAND_TIMING_MODE5 | NAND_ECC_BCH30_1K_MODE),
  844. },
  845. },
  846. .T_REA = 20,
  847. .T_RHOH = 15,
  848. },
  849. #endif
  850. {
  851. .name = NAND_NORMAL_NAME,
  852. .chip_enable_pad = (AML_NAND_CE0/* | (AML_NAND_CE1 << 4) | (AML_NAND_CE2 << 8) | (AML_NAND_CE3 << 12)*/),
  853. .ready_busy_pad = (AML_NAND_CE0 /*| (AML_NAND_CE0 << 4) | (AML_NAND_CE1 << 8) | (AML_NAND_CE1 << 12)*/),
  854. .platform_nand_data = {
  855. .chip = {
  856. .nr_chips = 1,
  857. .nr_partitions = ARRAY_SIZE(normal_partition_info),
  858. .partitions = normal_partition_info,
  859. .options = (NAND_TIMING_MODE5 | NAND_ECC_BCH30_1K_MODE | NAND_TWO_PLANE_MODE),
  860. },
  861. },
  862. .T_REA = 20,
  863. .T_RHOH = 15,
  864. }
  865. };
  866. static struct aml_nand_device aml_nand_mid_device = {
  867. .aml_nand_platform = aml_nand_mid_platform,
  868. .dev_num = ARRAY_SIZE(aml_nand_mid_platform),
  869. };
  870. static struct resource aml_nand_resources[] = {
  871. {
  872. .start = 0xc1108600,
  873. .end = 0xc1108624,
  874. .flags = IORESOURCE_MEM,
  875. },
  876. };
  877. static struct platform_device aml_nand_device = {
  878. .name = "aml_nand",
  879. .id = 0,
  880. .num_resources = ARRAY_SIZE(aml_nand_resources),
  881. .resource = aml_nand_resources,
  882. .dev = {
  883. .platform_data = &aml_nand_mid_device,
  884. },
  885. };
  886. #endif
  887. /* WIFI ON Flag */
  888. static int WIFI_ON;
  889. /* BT ON Flag */
  890. static int BT_ON;
  891. /* WL_BT_REG_ON control function */
  892. static void reg_on_control(int is_on)
  893. {
  894. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1,(1<<11)); //WIFI_RST GPIO mode
  895. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_0,(1<<18)); //WIFI_EN GPIO mode
  896. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<8));//GPIOC_8 ==WIFI_EN
  897. if(is_on){
  898. SET_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  899. }
  900. else{
  901. /* only pull donw reg_on pin when wifi and bt off */
  902. if((!WIFI_ON) && (!BT_ON)){
  903. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  904. printk("WIFI BT Power down\n");
  905. }
  906. }
  907. }
  908. #ifdef CONFIG_CARDREADER
  909. static struct resource amlogic_card_resource[] = {
  910. [0] = {
  911. .start = 0x1200230, //physical address
  912. .end = 0x120024c,
  913. .flags = 0x200,
  914. }
  915. };
  916. void extern_wifi_power(int is_power)
  917. {
  918. WIFI_ON = is_power;
  919. reg_on_control(is_power);
  920. /*
  921. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1,(1<<11));
  922. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_0,(1<<18));
  923. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<8));
  924. if(is_power)
  925. SET_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  926. else
  927. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  928. */
  929. }
  930. EXPORT_SYMBOL(extern_wifi_power);
  931. void sdio_extern_init(void)
  932. {
  933. #if defined(CONFIG_BCM4329_HW_OOB) || defined(CONFIG_BCM4329_OOB_INTR_ONLY)/* Jone add */
  934. gpio_set_status(PAD_GPIOX_11,gpio_status_in);
  935. gpio_irq_set(PAD_GPIOX_11,GPIO_IRQ(4,GPIO_IRQ_RISING));
  936. #endif
  937. extern_wifi_power(1);
  938. }
  939. static struct aml_card_info amlogic_card_info[] = {
  940. [0] = {
  941. .name = "sd_card",
  942. .work_mode = CARD_HW_MODE,
  943. .io_pad_type = SDIO_B_CARD_0_5,
  944. .card_ins_en_reg = CARD_GPIO_ENABLE,
  945. .card_ins_en_mask = PREG_IO_29_MASK,
  946. .card_ins_input_reg = CARD_GPIO_INPUT,
  947. .card_ins_input_mask = PREG_IO_29_MASK,
  948. .card_power_en_reg = CARD_GPIO_ENABLE,
  949. .card_power_en_mask = PREG_IO_31_MASK,
  950. .card_power_output_reg = CARD_GPIO_OUTPUT,
  951. .card_power_output_mask = PREG_IO_31_MASK,
  952. .card_power_en_lev = 0,
  953. .card_wp_en_reg = 0,
  954. .card_wp_en_mask = 0,
  955. .card_wp_input_reg = 0,
  956. .card_wp_input_mask = 0,
  957. .card_extern_init = 0,
  958. },
  959. [1] = {
  960. .name = "sdio_card",
  961. .work_mode = CARD_HW_MODE,
  962. .io_pad_type = SDIO_A_GPIOX_0_3,
  963. .card_ins_en_reg = 0,
  964. .card_ins_en_mask = 0,
  965. .card_ins_input_reg = 0,
  966. .card_ins_input_mask = 0,
  967. .card_power_en_reg = EGPIO_GPIOC_ENABLE,
  968. .card_power_en_mask = PREG_IO_7_MASK,
  969. .card_power_output_reg = EGPIO_GPIOC_OUTPUT,
  970. .card_power_output_mask = PREG_IO_7_MASK,
  971. .card_power_en_lev = 1,
  972. .card_wp_en_reg = 0,
  973. .card_wp_en_mask = 0,
  974. .card_wp_input_reg = 0,
  975. .card_wp_input_mask = 0,
  976. .card_extern_init = sdio_extern_init,
  977. },
  978. };
  979. void extern_wifi_reset(int is_on)
  980. {
  981. unsigned int val;
  982. /*output*/
  983. //set WIFI_RST
  984. val = aml_read_reg32(amlogic_card_info[1].card_power_en_reg);
  985. val &= ~(amlogic_card_info[1].card_power_en_mask);
  986. aml_write_reg32(amlogic_card_info[1].card_power_en_reg, val);
  987. if(is_on){
  988. /*high*/
  989. val = aml_read_reg32(amlogic_card_info[1].card_power_output_reg);
  990. val |=(amlogic_card_info[1].card_power_output_mask);
  991. aml_write_reg32(amlogic_card_info[1].card_power_output_reg, val);
  992. printk("on val = %x\n", val);
  993. }
  994. else{
  995. /*low*/
  996. val = aml_read_reg32(amlogic_card_info[1].card_power_output_reg);
  997. val &=~(amlogic_card_info[1].card_power_output_mask);
  998. aml_write_reg32(amlogic_card_info[1].card_power_output_reg, val);
  999. printk("off val = %x\n", val);
  1000. }
  1001. printk("ouput %x, bit %d, level %x, bit %d\n",
  1002. amlogic_card_info[1].card_power_en_reg,
  1003. amlogic_card_info[1].card_power_en_mask,
  1004. amlogic_card_info[1].card_power_output_reg,
  1005. amlogic_card_info[1].card_power_output_mask);
  1006. return;
  1007. }
  1008. EXPORT_SYMBOL(extern_wifi_reset);
  1009. static struct aml_card_platform amlogic_card_platform = {
  1010. .card_num = ARRAY_SIZE(amlogic_card_info),
  1011. .card_info = amlogic_card_info,
  1012. };
  1013. static struct platform_device amlogic_card_device = {
  1014. .name = "AMLOGIC_CARD",
  1015. .id = -1,
  1016. .num_resources = ARRAY_SIZE(amlogic_card_resource),
  1017. .resource = amlogic_card_resource,
  1018. .dev = {
  1019. .platform_data = &amlogic_card_platform,
  1020. },
  1021. };
  1022. #endif //END CONFIG_CARDREADER
  1023. #ifdef CONFIG_MMC_AML
  1024. struct platform_device;
  1025. struct mmc_host;
  1026. struct mmc_card;
  1027. struct mmc_ios;
  1028. //return 1: no inserted 0: inserted
  1029. static int aml_sdio_detect(struct aml_sd_host * host)
  1030. {
  1031. SET_CBUS_REG_MASK(PREG_PAD_GPIO5_EN_N,1<<29);//CARD_6
  1032. return READ_CBUS_REG(PREG_PAD_GPIO5_I)&(1<<29)?1:0;
  1033. }
  1034. static void cpu_sdio_pwr_prepare(unsigned port)
  1035. {
  1036. switch(port)
  1037. {
  1038. case M3_SDIO_PORT_A:
  1039. aml_clr_reg32_mask(P_PREG_PAD_GPIO4_EN_N,0x30f);
  1040. aml_clr_reg32_mask(P_PREG_PAD_GPIO4_O ,0x30f);
  1041. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_8,0x3f);
  1042. break;
  1043. case M3_SDIO_PORT_B:
  1044. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,0x3f<<23);
  1045. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_O ,0x3f<<23);
  1046. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,0x3f<<10);
  1047. break;
  1048. case M3_SDIO_PORT_C:
  1049. aml_clr_reg32_mask(P_PREG_PAD_GPIO3_EN_N,0xc0f);
  1050. aml_clr_reg32_mask(P_PREG_PAD_GPIO3_O ,0xc0f);
  1051. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x3f<<24));
  1052. break;
  1053. case M3_SDIO_PORT_XC_A:
  1054. break;
  1055. case M3_SDIO_PORT_XC_B:
  1056. break;
  1057. case M3_SDIO_PORT_XC_C:
  1058. break;
  1059. }
  1060. }
  1061. static int cpu_sdio_init(unsigned port)
  1062. {
  1063. switch(port)
  1064. {
  1065. case M3_SDIO_PORT_A:
  1066. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_8,0x3f);\
  1067. break;
  1068. case M3_SDIO_PORT_B:
  1069. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,0x3f<<10);
  1070. break;
  1071. case M3_SDIO_PORT_C://SDIOC GPIOB_2~GPIOB_7
  1072. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,(0x1f<<22));
  1073. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x3f<<24));
  1074. break;
  1075. case M3_SDIO_PORT_XC_A:
  1076. #if 0
  1077. //sdxc controller can't work
  1078. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_8,(0x3f<<0));
  1079. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_3,(0x0f<<27));
  1080. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_7,((0x3f<<18)|(0x7<<25)));
  1081. //aml_set_reg32_mask(P_PERIPHS_PIN_MUX_5,(0x1f<<10));//data 8 bit
  1082. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_5,(0x1b<<10));//data 4 bit
  1083. #endif
  1084. break;
  1085. case M3_SDIO_PORT_XC_B:
  1086. //sdxc controller can't work
  1087. //aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,(0xf<<4));
  1088. break;
  1089. case M3_SDIO_PORT_XC_C:
  1090. #if 0
  1091. //sdxc controller can't work
  1092. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x3f<<24));
  1093. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,((0x13<<22)|(0x3<<16)));
  1094. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_4,(0x1f<<26));
  1095. printk(KERN_INFO "inand sdio xc-c init\n");
  1096. #endif
  1097. break;
  1098. default:
  1099. return -1;
  1100. }
  1101. return 0;
  1102. }
  1103. static void aml_sdio_pwr_prepare(unsigned port)
  1104. {
  1105. /// @todo NOT FINISH
  1106. ///do nothing here
  1107. cpu_sdio_pwr_prepare(port);
  1108. }
  1109. static void aml_sdio_pwr_on(unsigned port)
  1110. {
  1111. if((aml_read_reg32(P_PREG_PAD_GPIO5_O) & (1<<31)) != 0){
  1112. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_O,(1<<31));
  1113. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,(1<<31));
  1114. udelay(1000);
  1115. }
  1116. /// @todo NOT FINISH
  1117. }
  1118. static void aml_sdio_pwr_off(unsigned port)
  1119. {
  1120. if((aml_read_reg32(P_PREG_PAD_GPIO5_O) & (1<<31)) == 0){
  1121. aml_set_reg32_mask(P_PREG_PAD_GPIO5_O,(1<<31));
  1122. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,(1<<31));//GPIOD13
  1123. udelay(1000);
  1124. }
  1125. /// @todo NOT FINISH
  1126. }
  1127. static int aml_sdio_init(struct aml_sd_host * host)
  1128. { //set pinumx ..
  1129. aml_set_reg32_mask(P_PREG_PAD_GPIO5_EN_N,1<<29);//CARD_6
  1130. cpu_sdio_init(host->sdio_port);
  1131. host->clk = clk_get_sys("clk81",NULL);
  1132. if(!IS_ERR(host->clk))
  1133. host->clk_rate = clk_get_rate(host->clk);
  1134. else
  1135. host->clk_rate = 0;
  1136. return 0;
  1137. }
  1138. static struct resource aml_mmc_resource[] = {
  1139. [0] = {
  1140. .start = 0x1200230, //physical address
  1141. .end = 0x1200248,
  1142. .flags = IORESOURCE_MEM, //0x200
  1143. },
  1144. };
  1145. static u64 aml_mmc_device_dmamask = 0xffffffffUL;
  1146. static struct aml_mmc_platform_data aml_mmc_def_platdata = {
  1147. .no_wprotect = 1,
  1148. .no_detect = 0,
  1149. .wprotect_invert = 0,
  1150. .detect_invert = 0,
  1151. .use_dma = 0,
  1152. .gpio_detect=1,
  1153. .gpio_wprotect=0,
  1154. .ocr_avail = MMC_VDD_33_34,
  1155. .sdio_port = M3_SDIO_PORT_B,
  1156. .max_width = 4,
  1157. .host_caps = (MMC_CAP_4_BIT_DATA |
  1158. MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | MMC_CAP_NEEDS_POLL),
  1159. .f_min = 200000,
  1160. .f_max = 50000000,
  1161. .clock = 300000,
  1162. .sdio_init = aml_sdio_init,
  1163. .sdio_detect = aml_sdio_detect,
  1164. .sdio_pwr_prepare = aml_sdio_pwr_prepare,
  1165. .sdio_pwr_on = aml_sdio_pwr_on,
  1166. .sdio_pwr_off = aml_sdio_pwr_off,
  1167. };
  1168. static struct platform_device aml_mmc_device = {
  1169. .name = "aml_sd_mmc",
  1170. .id = 0,
  1171. .num_resources = ARRAY_SIZE(aml_mmc_resource),
  1172. .resource = aml_mmc_resource,
  1173. .dev = {
  1174. .dma_mask = &aml_mmc_device_dmamask,
  1175. .coherent_dma_mask = 0xffffffffUL,
  1176. .platform_data = &aml_mmc_def_platdata,
  1177. },
  1178. };
  1179. #endif //CONFIG_MMC_AML
  1180. #ifdef CONFIG_BT_DEVICE
  1181. #include <plat/bt_device.h>
  1182. static void bt_device_init(void)
  1183. {
  1184. /* BT_RST_N */
  1185. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_0, (1<<16));
  1186. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1, (1<<5));
  1187. /* UART_RTS_N(BT) */
  1188. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_4, (1<<10));
  1189. /* UART_CTS_N(BT) */
  1190. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_4, (1<<11));
  1191. /* UART_TX(BT) */
  1192. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_4, (1<<13));
  1193. /* UART_RX(BT) */
  1194. SET_CBUS_REG_MASK(PERIPHS_PIN_MUX_4, (1<<12));
  1195. /* BT_WAKE */
  1196. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO4_EN_N, (1 << 10));
  1197. SET_CBUS_REG_MASK(PREG_PAD_GPIO4_O, (1 << 10));
  1198. }
  1199. static void bt_device_on(void)
  1200. {
  1201. /* reg_on */
  1202. BT_ON = 1;
  1203. reg_on_control(1);
  1204. /* BT_RST_N */
  1205. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<6));
  1206. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<6));
  1207. msleep(200);
  1208. SET_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<6));
  1209. }
  1210. static void bt_device_off(void)
  1211. {
  1212. BT_ON = 0;
  1213. reg_on_control(0);
  1214. /* BT_RST_N */
  1215. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<6));
  1216. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<6));
  1217. msleep(200);
  1218. }
  1219. static void bt_device_suspend(void)
  1220. {
  1221. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO4_O, (1 << 10));
  1222. }
  1223. static void bt_device_resume(void)
  1224. {
  1225. SET_CBUS_REG_MASK(PREG_PAD_GPIO4_O, (1 << 10));
  1226. }
  1227. struct bt_dev_data bt_dev = {
  1228. .bt_dev_init = bt_device_init,
  1229. .bt_dev_on = bt_device_on,
  1230. .bt_dev_off = bt_device_off,
  1231. .bt_dev_suspend = bt_device_suspend,
  1232. .bt_dev_resume = bt_device_resume,
  1233. };
  1234. static struct platform_device bt_device = {
  1235. .name = "bt-dev",
  1236. .id = -1,
  1237. .dev.platform_data = &bt_dev,
  1238. };
  1239. #endif
  1240. #if defined(CONFIG_AML_AUDIO_DSP)
  1241. static struct resource audiodsp_resources[] = {
  1242. [0] = {
  1243. .start = AUDIODSP_ADDR_START,
  1244. .end = AUDIODSP_ADDR_END,
  1245. .flags = IORESOURCE_MEM,
  1246. },
  1247. };
  1248. static struct platform_device audiodsp_device = {
  1249. .name = "audiodsp",
  1250. .id = 0,
  1251. .num_resources = ARRAY_SIZE(audiodsp_resources),
  1252. .resource = audiodsp_resources,
  1253. };
  1254. #endif //CONFIG_AML_AUDIO_DSP
  1255. #if defined(CONFIG_SND_AML_M3)
  1256. static struct resource aml_m3_audio_resource[] = {
  1257. [0] = {
  1258. .start = 0,
  1259. .end = 0,
  1260. .flags = IORESOURCE_MEM,
  1261. },
  1262. };
  1263. extern char * get_vout_mode_internal(void);
  1264. /* Check current mode, 0: panel; 1: !panel*/
  1265. static int get_display_mode(void) {
  1266. if (strncmp("panel", get_vout_mode_internal(), 5))
  1267. return 1;
  1268. else
  1269. return 0;
  1270. }
  1271. static int aml_m3_is_hp_plugged(void)
  1272. {
  1273. int val;
  1274. if (get_display_mode() != 0) //if !panel, return 1 to mute spk
  1275. return 1;
  1276. val = aml_get_reg32_bits(P_PREG_PAD_GPIO0_I, 19, 1);//return 1: hp pluged, 0: hp unpluged
  1277. return val;
  1278. }
  1279. static void mute_spk(int flag)
  1280. {
  1281. printk("%s() %s speaker\n", __FUNCTION__, flag ? "Mute" : "Unmute");
  1282. if (flag)
  1283. gpio_out_low(PAD_GPIOC_4); // mute speak
  1284. else
  1285. gpio_out_high(PAD_GPIOC_4); // unmute speak
  1286. }
  1287. static struct aml_audio_platform aml_audio_pdata = {
  1288. .is_hp_pluged = &aml_m3_is_hp_plugged,
  1289. .mute_spk = &mute_spk,
  1290. };
  1291. /* machine platform device */
  1292. static struct platform_device aml_m3_audio = {
  1293. .name = "aml_m3_audio",
  1294. .id = -1,
  1295. .resource = aml_m3_audio_resource,
  1296. .num_resources = ARRAY_SIZE(aml_m3_audio_resource),
  1297. .dev = {
  1298. .platform_data = &aml_audio_pdata,
  1299. },
  1300. };
  1301. /* dai platform device */
  1302. static struct platform_device aml_dai = {
  1303. .name = "aml-dai",
  1304. .id = 0,
  1305. .num_resources = 0,
  1306. };
  1307. /* pcm audio platform device */
  1308. static struct platform_device aml_audio = {
  1309. .name = "aml-audio",
  1310. .id = -1,
  1311. .num_resources = 0,
  1312. };
  1313. #endif //CONFIG_SND_AML_M3
  1314. #if defined(CONFIG_SUSPEND)
  1315. typedef struct {
  1316. char name[32];
  1317. unsigned reg;
  1318. unsigned bits;
  1319. unsigned enable;
  1320. } pinmux_data_t;
  1321. #define MAX_PINMUX 1
  1322. static pinmux_data_t pinmux_data[MAX_PINMUX] = {
  1323. {"HDMI", 0, (1<<2)|(1<<1)|(1<<0), 1},
  1324. };
  1325. static unsigned pinmux_backup[6];
  1326. static void save_pinmux(void)
  1327. {
  1328. int i;
  1329. for (i=0;i<6;i++)
  1330. pinmux_backup[i] = aml_read_reg32(P_PERIPHS_PIN_MUX_0+i);
  1331. for (i=0;i<MAX_PINMUX;i++){
  1332. if (pinmux_data[i].enable){
  1333. printk("%s %x\n", pinmux_data[i].name, pinmux_data[i].bits);
  1334. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_0+pinmux_data[i].reg, pinmux_data[i].bits);
  1335. }
  1336. }
  1337. }
  1338. static void restore_pinmux(void)
  1339. {
  1340. int i;
  1341. for (i=0;i<6;i++)
  1342. aml_write_reg32(P_PERIPHS_PIN_MUX_0+i,pinmux_backup[i]);
  1343. }
  1344. void m3ref_set_vccx2(int power_on)
  1345. {
  1346. if (power_on) {
  1347. //restore_pinmux();
  1348. printk(KERN_INFO "%s() Power ON\n", __FUNCTION__);
  1349. aml_clr_reg32_mask(P_PREG_PAD_GPIO0_EN_N,(1<<26));
  1350. aml_clr_reg32_mask(P_PREG_PAD_GPIO0_O,(1<<26));
  1351. }
  1352. else {
  1353. printk(KERN_INFO "%s() Power OFF\n", __FUNCTION__);
  1354. aml_clr_reg32_mask(P_PREG_PAD_GPIO0_EN_N,(1<<26));
  1355. aml_set_reg32_mask(P_PREG_PAD_GPIO0_O,(1<<26));
  1356. //save_pinmux();
  1357. }
  1358. }
  1359. static struct meson_pm_config aml_pm_pdata = {
  1360. .pctl_reg_base = (void *)IO_APB_BUS_BASE,
  1361. .mmc_reg_base = (void *)APB_REG_ADDR(0x1000),
  1362. .hiu_reg_base = (void *)CBUS_REG_ADDR(0x1000),
  1363. .power_key = (1<<8),
  1364. .ddr_clk = 0x00110820,
  1365. .sleepcount = 128,
  1366. .set_vccx2 = m3ref_set_vccx2,
  1367. .core_voltage_adjust = 7, //5,8
  1368. };
  1369. static struct platform_device aml_pm_device = {
  1370. .name = "pm-meson",
  1371. .dev = {
  1372. .platform_data = &aml_pm_pdata,
  1373. },
  1374. .id = -1,
  1375. };
  1376. #endif //CONFIG_SUSPEND
  1377. static struct platform_device *platform_devs[] = {
  1378. /// &meson_device_uart,
  1379. &meson_device_fb,
  1380. &aml_uart_device,
  1381. &meson_device_codec,
  1382. #if defined(CONFIG_I2C_AML) || defined(CONFIG_I2C_HW_AML)
  1383. &aml_i2c_device,
  1384. &aml_i2c_device1,
  1385. &aml_i2c_device2,
  1386. #endif
  1387. #if defined(CONFIG_SND_AML_M3)
  1388. &aml_audio,
  1389. &aml_dai,
  1390. &aml_m3_audio,
  1391. #endif
  1392. #if defined(CONFIG_KEYPADS_AM)||defined(CONFIG_VIRTUAL_REMOTE)||defined(CONFIG_KEYPADS_AM_MODULE)
  1393. &input_device,
  1394. #endif
  1395. #ifdef CONFIG_SARADC_AM
  1396. &saradc_device,
  1397. #endif
  1398. #if defined(CONFIG_ADC_KEYPADS_AM)||defined(CONFIG_ADC_KEYPADS_AM_MODULE)
  1399. &adc_kp_device,
  1400. #endif
  1401. #if defined(CONFIG_KEY_INPUT_CUSTOM_AM) || defined(CONFIG_KEY_INPUT_CUSTOM_AM_MODULE)
  1402. &input_device_key,
  1403. #endif
  1404. #if defined(CONFIG_MMC_AML)
  1405. &aml_mmc_device,
  1406. #endif
  1407. #if defined(CONFIG_CARDREADER)
  1408. &amlogic_card_device,
  1409. #endif
  1410. #if defined(CONFIG_SUSPEND)
  1411. &aml_pm_device,
  1412. #endif
  1413. #if defined(CONFIG_AM_NAND)
  1414. &aml_nand_device,
  1415. #endif
  1416. #if defined(CONFIG_TVIN_VDIN)
  1417. &vdin_device,
  1418. #endif
  1419. #if defined(CONFIG_TVIN_BT656IN)
  1420. &bt656in_device,
  1421. #endif
  1422. #if defined(CONFIG_AML_AUDIO_DSP)
  1423. &audiodsp_device,
  1424. #endif //CONFIG_AML_AUDIO_DSP
  1425. #ifdef CONFIG_AMLOGIC_VIDEOIN_MANAGER
  1426. &vm_device,
  1427. #endif
  1428. #ifdef CONFIG_POST_PROCESS_MANAGER
  1429. &ppmgr_device,
  1430. #endif
  1431. #if defined(CONFIG_AML_RTC)
  1432. &meson_rtc_device,
  1433. #endif
  1434. #ifdef CONFIG_BT_DEVICE
  1435. &bt_device,
  1436. #endif
  1437. };
  1438. static __init void meson_m3ref_init(void)
  1439. {
  1440. backup_board_pinmux();
  1441. meson_cache_init();
  1442. setup_devices_resource();
  1443. ///setup_i2c_devices();
  1444. ///setup_uart_devices();
  1445. device_clk_setting();
  1446. device_pinmux_init();
  1447. ///platform_device_register(&aml_uart_device);
  1448. platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
  1449. m3ref_lcd_init();
  1450. m3ref_power_init();
  1451. m3ref_set_vccx2(1);
  1452. setup_usb_devices();
  1453. /*
  1454. printk(KERN_INFO"TEST GPIOC 4");
  1455. gpio_out_high(PAD_GPIOC_4);
  1456. gpio_out_low(PAD_GPIOC_4);
  1457. */
  1458. #if defined(CONFIG_TOUCHSCREEN_ADS7846)
  1459. ads7846_init_gpio();
  1460. spi_register_board_info(spi_board_info_list, ARRAY_SIZE(spi_board_info_list));
  1461. #endif
  1462. #if defined(CONFIG_I2C_AML) || defined(CONFIG_I2C_HW_AML)
  1463. aml_i2c_init();
  1464. #endif
  1465. disable_unused_model();
  1466. }
  1467. /***********************************************************************
  1468. * IO Mapping
  1469. **********************************************************************/
  1470. static __initdata struct map_desc meson_io_desc[] = {
  1471. {
  1472. .virtual = IO_CBUS_BASE,
  1473. .pfn = __phys_to_pfn(IO_CBUS_PHY_BASE),
  1474. .length = SZ_2M,
  1475. .type = MT_DEVICE,
  1476. } , {
  1477. .virtual = IO_AXI_BUS_BASE,
  1478. .pfn = __phys_to_pfn(IO_AXI_BUS_PHY_BASE),
  1479. .length = SZ_1M,
  1480. .type = MT_DEVICE,
  1481. } , {
  1482. .virtual = IO_PL310_BASE,
  1483. .pfn = __phys_to_pfn(IO_PL310_PHY_BASE),
  1484. .length = SZ_4K,
  1485. .type = MT_DEVICE,
  1486. } , {
  1487. .virtual = IO_PERIPH_BASE,
  1488. .pfn = __phys_to_pfn(IO_PERIPH_PHY_BASE),
  1489. .length = SZ_4K,
  1490. .type = MT_DEVICE,
  1491. } , {
  1492. .virtual = IO_APB_BUS_BASE,
  1493. .pfn = __phys_to_pfn(IO_APB_BUS_PHY_BASE),
  1494. .length = SZ_512K,
  1495. .type = MT_DEVICE,
  1496. } , {
  1497. .virtual = IO_AOBUS_BASE,
  1498. .pfn = __phys_to_pfn(IO_AOBUS_PHY_BASE),
  1499. .length = SZ_1M,
  1500. .type = MT_DEVICE,
  1501. } , {
  1502. .virtual = IO_AHB_BUS_BASE,
  1503. .pfn = __phys_to_pfn(IO_AHB_BUS_PHY_BASE),
  1504. .length = SZ_16M,
  1505. .type = MT_DEVICE,
  1506. } , {
  1507. .virtual = IO_APB2_BUS_BASE,
  1508. .pfn = __phys_to_pfn(IO_APB2_BUS_PHY_BASE),
  1509. .length = SZ_512K,
  1510. .type = MT_DEVICE,
  1511. }, {
  1512. .virtual = PAGE_ALIGN(__phys_to_virt(RESERVED_MEM_START)),
  1513. .pfn = __phys_to_pfn(RESERVED_MEM_START),
  1514. .length = RESERVED_MEM_END - RESERVED_MEM_START + 1,
  1515. .type = MT_DEVICE,
  1516. },
  1517. #ifdef CONFIG_MESON_SUSPEND
  1518. {
  1519. .virtual = PAGE_ALIGN(0xdff00000),
  1520. .pfn = __phys_to_pfn(0x1ff00000),
  1521. .length = SZ_1M,
  1522. .type = MT_MEMORY,
  1523. },
  1524. #endif
  1525. };
  1526. static void __init meson_map_io(void)
  1527. {
  1528. iotable_init(meson_io_desc, ARRAY_SIZE(meson_io_desc));
  1529. }
  1530. static __init void m3_irq_init(void)
  1531. {
  1532. meson_init_irq();
  1533. }
  1534. static __init void m3_fixup(struct machine_desc *mach, struct tag *tag, char **cmdline, struct meminfo *m)
  1535. {
  1536. struct membank *pbank;
  1537. m->nr_banks = 0;
  1538. pbank = &m->bank[m->nr_banks];
  1539. pbank->start = PAGE_ALIGN(PHYS_MEM_START);
  1540. pbank->size = SZ_64M & PAGE_MASK;
  1541. /// pbank->node = PHYS_TO_NID(PHYS_MEM_START);
  1542. m->nr_banks++;
  1543. pbank = &m->bank[m->nr_banks];
  1544. pbank->start = PAGE_ALIGN(RESERVED_MEM_END + 1);
  1545. #ifdef CONFIG_MESON_SUSPEND
  1546. pbank->size = (PHYS_MEM_END-RESERVED_MEM_END-SZ_1M) & PAGE_MASK;
  1547. #else
  1548. pbank->size = (PHYS_MEM_END-RESERVED_MEM_END) & PAGE_MASK;
  1549. #endif
  1550. /// pbank->node = PHYS_TO_NID(RESERVED_MEM_END + 1);
  1551. m->nr_banks++;
  1552. }
  1553. MACHINE_START(M3_REF, "Amlogic Meson3 reference development platform")
  1554. .boot_params = BOOT_PARAMS_OFFSET,
  1555. .map_io = meson_map_io,
  1556. .init_irq = m3_irq_init,
  1557. .timer = &meson_sys_timer,
  1558. .init_machine = meson_m3ref_init,
  1559. .fixup = m3_fixup,
  1560. .video_start = RESERVED_MEM_START,
  1561. .video_end = RESERVED_MEM_END,
  1562. MACHINE_END
  1563. MACHINE_START(VMX25, "Amlogic Meson3 reference development platform (legacy)")
  1564. .boot_params = BOOT_PARAMS_OFFSET,
  1565. .map_io = meson_map_io,
  1566. .init_irq = m3_irq_init,
  1567. .timer = &meson_sys_timer,
  1568. .init_machine = meson_m3ref_init,
  1569. .fixup = m3_fixup,
  1570. .video_start = RESERVED_MEM_START,
  1571. .video_end = RESERVED_MEM_END,
  1572. MACHINE_END