board-meson6-skt.c 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419
  1. /*
  2. * arch/arm/mach-meson6/board-meson6-skt.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/device.h>
  30. #include <asm/mach-types.h>
  31. #include <asm/mach/arch.h>
  32. #include <asm/setup.h>
  33. #include <asm/memory.h>
  34. #include <asm/mach/map.h>
  35. #include <plat/platform.h>
  36. #include <plat/plat_dev.h>
  37. #include <plat/platform_data.h>
  38. #include <linux/io.h>
  39. #include <plat/io.h>
  40. #include <linux/mtd/mtd.h>
  41. #include <linux/mtd/nand.h>
  42. #include <linux/mtd/nand_ecc.h>
  43. #include <linux/mtd/partitions.h>
  44. #include <linux/device.h>
  45. #include <linux/spi/flash.h>
  46. #include <linux/i2c.h>
  47. #include <linux/delay.h>
  48. #include <linux/clk.h>
  49. #include <asm/mach-types.h>
  50. #include <asm/setup.h>
  51. #include <asm/memory.h>
  52. #include <plat/platform.h>
  53. #include <plat/plat_dev.h>
  54. #include <plat/platform_data.h>
  55. #include <plat/lm.h>
  56. #include <plat/regops.h>
  57. #include <linux/io.h>
  58. #include <plat/io.h>
  59. #include <mach/map.h>
  60. #include <mach/i2c_aml.h>
  61. #include <mach/nand.h>
  62. #include <mach/usbclock.h>
  63. #include <mach/usbsetting.h>
  64. #include <mach/pm.h>
  65. #include <linux/uart-aml.h>
  66. #include <linux/i2c-aml.h>
  67. #include "board-m6skt.h"
  68. #ifdef CONFIG_MMC_AML
  69. #include <mach/mmc.h>
  70. #endif
  71. #ifdef CONFIG_CARDREADER
  72. #include <mach/card_io.h>
  73. #endif // CONFIG_CARDREADER
  74. #include <mach/gpio.h>
  75. #ifdef CONFIG_EFUSE
  76. #include <linux/efuse.h>
  77. #endif
  78. #ifdef CONFIG_SND_SOC_DUMMY_CODEC
  79. #include <sound/dummy_codec.h>
  80. #endif
  81. /***********************************************************************
  82. * IO Mapping
  83. **********************************************************************/
  84. #define PHYS_MEM_START (0x80000000)
  85. #define PHYS_MEM_SIZE (512*SZ_1M)
  86. #define PHYS_MEM_END (PHYS_MEM_START + PHYS_MEM_SIZE -1 )
  87. /******** Reserved memory setting ************************/
  88. #define RESERVED_MEM_START (0x80000000+64*SZ_1M) /*start at the second 64M*/
  89. /******** CODEC memory setting ************************/
  90. // Codec need 16M for 1080p decode
  91. // 4M for sd decode;
  92. #define ALIGN_MSK ((SZ_1M)-1)
  93. #define U_ALIGN(x) ((x+ALIGN_MSK)&(~ALIGN_MSK))
  94. #define D_ALIGN(x) ((x)&(~ALIGN_MSK))
  95. /******** AUDIODSP memory setting ************************/
  96. #define AUDIODSP_ADDR_START U_ALIGN(RESERVED_MEM_START) /*audiodsp memstart*/
  97. #define AUDIODSP_ADDR_END (AUDIODSP_ADDR_START+SZ_1M-1) /*audiodsp memend*/
  98. /******** Frame buffer memory configuration ***********/
  99. #define OSD_480_PIX (640*480)
  100. #define OSD_576_PIX (768*576)
  101. #define OSD_720_PIX (1280*720)
  102. #define OSD_1080_PIX (1920*1080)
  103. #define OSD_PANEL_PIX (800*480)
  104. #define B16BpP (2)
  105. #define B32BpP (4)
  106. #define DOUBLE_BUFFER (2)
  107. #define OSD1_MAX_MEM U_ALIGN(OSD_1080_PIX*B32BpP*DOUBLE_BUFFER)
  108. #define OSD2_MAX_MEM U_ALIGN(32*32*B32BpP)
  109. /******** Reserved memory configuration ***************/
  110. #define OSD1_ADDR_START U_ALIGN(AUDIODSP_ADDR_END )
  111. #define OSD1_ADDR_END (OSD1_ADDR_START+OSD1_MAX_MEM - 1)
  112. #define OSD2_ADDR_START U_ALIGN(OSD1_ADDR_END)
  113. #define OSD2_ADDR_END (OSD2_ADDR_START +OSD2_MAX_MEM -1)
  114. #if defined(CONFIG_AM_VDEC_H264)
  115. #define CODEC_MEM_SIZE U_ALIGN(32*SZ_1M)
  116. #else
  117. #define CODEC_MEM_SIZE U_ALIGN(16*SZ_1M)
  118. #endif
  119. #define CODEC_ADDR_START U_ALIGN(OSD2_ADDR_END)
  120. #define CODEC_ADDR_END (CODEC_ADDR_START+CODEC_MEM_SIZE-1)
  121. /********VDIN memory configuration ***************/
  122. #define VDIN_ADDR_START U_ALIGN(CODEC_ADDR_END)
  123. #define VDIN_ADDR_END (VDIN_ADDR_START + CODEC_MEM_SIZE - 1)
  124. #if defined(CONFIG_AMLOGIC_VIDEOIN_MANAGER)
  125. #define VM_SIZE (SZ_1M*16)
  126. #else
  127. #define VM_SIZE (0)
  128. #endif /* CONFIG_AMLOGIC_VIDEOIN_MANAGER */
  129. #define VM_ADDR_START U_ALIGN(VDIN_ADDR_END)
  130. #define VM_ADDR_END (VM_SIZE + VM_ADDR_START - 1)
  131. #if defined(CONFIG_AM_DEINTERLACE_SD_ONLY)
  132. #define DI_MEM_SIZE (SZ_1M*3)
  133. #else
  134. #define DI_MEM_SIZE (SZ_1M*15)
  135. #endif
  136. #define DI_ADDR_START U_ALIGN(VM_ADDR_END)
  137. #define DI_ADDR_END (DI_ADDR_START+DI_MEM_SIZE-1)
  138. #ifdef CONFIG_POST_PROCESS_MANAGER
  139. #ifdef CONFIG_POST_PROCESS_MANAGER_PPSCALER
  140. #define PPMGR_MEM_SIZE 1280 * 800 * 21
  141. #else
  142. #define PPMGR_MEM_SIZE 1280 * 800 * 18
  143. #endif
  144. #else
  145. #define PPMGR_MEM_SIZE 0
  146. #endif /* CONFIG_POST_PROCESS_MANAGER */
  147. #define PPMGR_ADDR_START U_ALIGN(DI_ADDR_END)
  148. #define PPMGR_ADDR_END (PPMGR_ADDR_START+PPMGR_MEM_SIZE-1)
  149. #define STREAMBUF_MEM_SIZE (SZ_1M*7)
  150. #define STREAMBUF_ADDR_START U_ALIGN(PPMGR_ADDR_END)
  151. #define STREAMBUF_ADDR_END (STREAMBUF_ADDR_START+STREAMBUF_MEM_SIZE-1)
  152. #define RESERVED_MEM_END (STREAMBUF_ADDR_END)
  153. static struct resource meson_fb_resource[] = {
  154. [0] = {
  155. .start = OSD1_ADDR_START,
  156. .end = OSD1_ADDR_END,
  157. .flags = IORESOURCE_MEM,
  158. },
  159. [1] = {
  160. .start = OSD2_ADDR_START,
  161. .end = OSD2_ADDR_END,
  162. .flags = IORESOURCE_MEM,
  163. },
  164. };
  165. static struct resource meson_codec_resource[] = {
  166. [0] = {
  167. .start = CODEC_ADDR_START,
  168. .end = CODEC_ADDR_END,
  169. .flags = IORESOURCE_MEM,
  170. },
  171. [1] = {
  172. .start = STREAMBUF_ADDR_START,
  173. .end = STREAMBUF_ADDR_END,
  174. .flags = IORESOURCE_MEM,
  175. },
  176. };
  177. #ifdef CONFIG_POST_PROCESS_MANAGER
  178. static struct resource ppmgr_resources[] = {
  179. [0] = {
  180. .start = PPMGR_ADDR_START,
  181. .end = PPMGR_ADDR_END,
  182. .flags = IORESOURCE_MEM,
  183. },
  184. };
  185. static struct platform_device ppmgr_device = {
  186. .name = "ppmgr",
  187. .id = 0,
  188. .num_resources = ARRAY_SIZE(ppmgr_resources),
  189. .resource = ppmgr_resources,
  190. };
  191. #endif
  192. static int __init setup_devices_resource(void)
  193. {
  194. setup_fb_resource(meson_fb_resource, ARRAY_SIZE(meson_fb_resource));
  195. #ifdef CONFIG_AM_STREAMING
  196. setup_codec_resource(meson_codec_resource, ARRAY_SIZE(meson_codec_resource));
  197. #endif
  198. return 0;
  199. }
  200. #ifdef CONFIG_AM_LCD_OUTPUT
  201. #include "board-m6skt.h"
  202. #endif
  203. /***********************************************************
  204. *Remote Section
  205. ************************************************************/
  206. #ifdef CONFIG_AM_REMOTE
  207. #include <plat/remote.h>
  208. static pinmux_item_t aml_remote_pins[] = {
  209. {
  210. .reg = PINMUX_REG(AO),
  211. .clrmask = 0,
  212. .setmask = 1 << 0,
  213. },
  214. PINMUX_END_ITEM
  215. };
  216. static struct aml_remote_platdata aml_remote_pdata __initdata = {
  217. .pinmux_items = aml_remote_pins,
  218. .ao_baseaddr = P_AO_IR_DEC_LDR_ACTIVE,
  219. };
  220. static void __init setup_remote_device(void)
  221. {
  222. meson_remote_set_platdata(&aml_remote_pdata);
  223. }
  224. #endif
  225. /***********************************************************************
  226. * I2C Section
  227. **********************************************************************/
  228. #if defined(CONFIG_I2C_AML) || defined(CONFIG_I2C_HW_AML)
  229. static bool pinmux_dummy_share(bool select)
  230. {
  231. return select;
  232. }
  233. static pinmux_item_t aml_i2c_a_pinmux_item[] = {
  234. {
  235. .reg = 5,
  236. //.clrmask = (3<<24)|(3<<30),
  237. .setmask = 3<<26
  238. },
  239. PINMUX_END_ITEM
  240. };
  241. static struct aml_i2c_platform aml_i2c_plat_a = {
  242. .wait_count = 50000,
  243. .wait_ack_interval = 5,
  244. .wait_read_interval = 5,
  245. .wait_xfer_interval = 5,
  246. .master_no = AML_I2C_MASTER_A,
  247. .use_pio = 0,
  248. .master_i2c_speed = AML_I2C_SPPED_300K,
  249. .master_pinmux = {
  250. .chip_select = pinmux_dummy_share,
  251. .pinmux = &aml_i2c_a_pinmux_item[0]
  252. }
  253. };
  254. static pinmux_item_t aml_i2c_b_pinmux_item[]={
  255. {
  256. .reg = 5,
  257. //.clrmask = (3<<28)|(3<<26),
  258. .setmask = 3<<30
  259. },
  260. PINMUX_END_ITEM
  261. };
  262. static struct aml_i2c_platform aml_i2c_plat_b = {
  263. .wait_count = 50000,
  264. .wait_ack_interval = 5,
  265. .wait_read_interval = 5,
  266. .wait_xfer_interval = 5,
  267. .master_no = AML_I2C_MASTER_B,
  268. .use_pio = 0,
  269. .master_i2c_speed = AML_I2C_SPPED_300K,
  270. .master_pinmux = {
  271. .chip_select = pinmux_dummy_share,
  272. .pinmux = &aml_i2c_b_pinmux_item[0]
  273. }
  274. };
  275. static pinmux_item_t aml_i2c_ao_pinmux_item[] = {
  276. {
  277. .reg = AO,
  278. .clrmask = 3<<1,
  279. .setmask = 3<<5
  280. },
  281. PINMUX_END_ITEM
  282. };
  283. static struct aml_i2c_platform aml_i2c_plat_ao = {
  284. .wait_count = 50000,
  285. .wait_ack_interval = 5,
  286. .wait_read_interval = 5,
  287. .wait_xfer_interval = 5,
  288. .master_no = AML_I2C_MASTER_AO,
  289. .use_pio = 0,
  290. .master_i2c_speed = AML_I2C_SPPED_100K,
  291. .master_pinmux = {
  292. .pinmux = &aml_i2c_ao_pinmux_item[0]
  293. }
  294. };
  295. static struct resource aml_i2c_resource_a[] = {
  296. [0] = {
  297. .start = MESON_I2C_MASTER_A_START,
  298. .end = MESON_I2C_MASTER_A_END,
  299. .flags = IORESOURCE_MEM,
  300. }
  301. };
  302. static struct resource aml_i2c_resource_b[] = {
  303. [0] = {
  304. .start = MESON_I2C_MASTER_B_START,
  305. .end = MESON_I2C_MASTER_B_END,
  306. .flags = IORESOURCE_MEM,
  307. }
  308. };
  309. static struct resource aml_i2c_resource_ao[] = {
  310. [0]= {
  311. .start = MESON_I2C_MASTER_AO_START,
  312. .end = MESON_I2C_MASTER_AO_END,
  313. .flags = IORESOURCE_MEM,
  314. }
  315. };
  316. static struct platform_device aml_i2c_device_a = {
  317. .name = "aml-i2c",
  318. .id = 0,
  319. .num_resources = ARRAY_SIZE(aml_i2c_resource_a),
  320. .resource = aml_i2c_resource_a,
  321. .dev = {
  322. .platform_data = &aml_i2c_plat_a,
  323. },
  324. };
  325. static struct platform_device aml_i2c_device_b = {
  326. .name = "aml-i2c",
  327. .id = 1,
  328. .num_resources = ARRAY_SIZE(aml_i2c_resource_b),
  329. .resource = aml_i2c_resource_b,
  330. .dev = {
  331. .platform_data = &aml_i2c_plat_b,
  332. },
  333. };
  334. static struct platform_device aml_i2c_device_ao = {
  335. .name = "aml-i2c",
  336. .id = 2,
  337. .num_resources = ARRAY_SIZE(aml_i2c_resource_ao),
  338. .resource = aml_i2c_resource_ao,
  339. .dev = {
  340. .platform_data = &aml_i2c_plat_ao,
  341. },
  342. };
  343. #endif
  344. /***********************************************************************
  345. * UART Section
  346. **********************************************************************/
  347. static pinmux_item_t uart_pins[] = {
  348. {
  349. .reg = PINMUX_REG(AO),
  350. .setmask = 3 << 11
  351. },
  352. PINMUX_END_ITEM
  353. };
  354. static pinmux_set_t aml_uart_ao = {
  355. .chip_select = NULL,
  356. .pinmux = &uart_pins[0]
  357. };
  358. static struct aml_uart_platform __initdata aml_uart_plat = {
  359. .uart_line[0] = UART_AO,
  360. .uart_line[1] = UART_A,
  361. .uart_line[2] = UART_B,
  362. .uart_line[3] = UART_C,
  363. .uart_line[4] = UART_D,
  364. .pinmux_uart[0] = (void*)&aml_uart_ao,
  365. .pinmux_uart[1] = NULL,
  366. .pinmux_uart[2] = NULL,
  367. .pinmux_uart[3] = NULL,
  368. .pinmux_uart[4] = NULL
  369. };
  370. static struct platform_device aml_uart_device = {
  371. .name = "mesonuart",
  372. .id = -1,
  373. .num_resources = 0,
  374. .resource = NULL,
  375. .dev = {
  376. .platform_data = &aml_uart_plat,
  377. },
  378. };
  379. /***********************************************************************
  380. * Nand Section
  381. **********************************************************************/
  382. #ifdef CONFIG_AM_NAND
  383. static struct mtd_partition normal_partition_info[] = {
  384. {
  385. .name = "logo",
  386. .offset = 32*SZ_1M+40*SZ_1M,
  387. .size = 8*SZ_1M,
  388. },
  389. {
  390. .name = "aml_logo",
  391. .offset = 48*SZ_1M+40*SZ_1M,
  392. .size = 8*SZ_1M,
  393. },
  394. {
  395. .name = "recovery",
  396. .offset = 64*SZ_1M+40*SZ_1M,
  397. .size = 8*SZ_1M,
  398. },
  399. {
  400. .name = "boot",
  401. .offset = 96*SZ_1M+40*SZ_1M,
  402. .size = 8*SZ_1M,
  403. },
  404. {
  405. .name = "system",
  406. .offset = 128*SZ_1M+40*SZ_1M,
  407. .size = 512*SZ_1M,
  408. },
  409. {
  410. .name = "cache",
  411. .offset = 640*SZ_1M+40*SZ_1M,
  412. .size = 128*SZ_1M,
  413. },
  414. {
  415. .name = "userdata",
  416. .offset = 768*SZ_1M+40*SZ_1M,
  417. .size = 512*SZ_1M,
  418. },
  419. {
  420. .name = "NFTL_Part",
  421. .offset = MTDPART_OFS_APPEND,
  422. .size = MTDPART_SIZ_FULL,
  423. },
  424. };
  425. static struct aml_nand_platform aml_nand_mid_platform[] = {
  426. #ifndef CONFIG_AMLOGIC_SPI_NOR
  427. {
  428. .name = NAND_BOOT_NAME,
  429. .chip_enable_pad = AML_NAND_CE0,
  430. .ready_busy_pad = AML_NAND_CE0,
  431. .platform_nand_data = {
  432. .chip = {
  433. .nr_chips = 1,
  434. .options = (NAND_TIMING_MODE5 | NAND_ECC_BCH30_1K_MODE),
  435. },
  436. },
  437. .T_REA = 20,
  438. .T_RHOH = 15,
  439. },
  440. #endif
  441. {
  442. .name = NAND_NORMAL_NAME,
  443. .chip_enable_pad = (AML_NAND_CE0/* | (AML_NAND_CE1 << 4) | (AML_NAND_CE2 << 8) | (AML_NAND_CE3 << 12)*/),
  444. .ready_busy_pad = (AML_NAND_CE0 /*| (AML_NAND_CE0 << 4) | (AML_NAND_CE1 << 8) | (AML_NAND_CE1 << 12)*/),
  445. .platform_nand_data = {
  446. .chip = {
  447. .nr_chips = 1,
  448. .nr_partitions = ARRAY_SIZE(normal_partition_info),
  449. .partitions = normal_partition_info,
  450. .options = (NAND_TIMING_MODE5 | NAND_ECC_BCH30_1K_MODE | NAND_TWO_PLANE_MODE),
  451. },
  452. },
  453. .T_REA = 20,
  454. .T_RHOH = 15,
  455. }
  456. };
  457. static struct aml_nand_device aml_nand_mid_device = {
  458. .aml_nand_platform = aml_nand_mid_platform,
  459. .dev_num = ARRAY_SIZE(aml_nand_mid_platform),
  460. };
  461. static struct resource aml_nand_resources[] = {
  462. {
  463. .start = 0xc1108600,
  464. .end = 0xc1108624,
  465. .flags = IORESOURCE_MEM,
  466. },
  467. };
  468. static struct platform_device aml_nand_device = {
  469. .name = "aml_nand",
  470. .id = 0,
  471. .num_resources = ARRAY_SIZE(aml_nand_resources),
  472. .resource = aml_nand_resources,
  473. .dev = {
  474. .platform_data = &aml_nand_mid_device,
  475. },
  476. };
  477. #endif
  478. /***********************************************************************
  479. * Card Reader Section
  480. **********************************************************************/
  481. /* WIFI ON Flag */
  482. static int WIFI_ON;
  483. /* BT ON Flag */
  484. static int BT_ON;
  485. /* WL_BT_REG_ON control function */
  486. static void reg_on_control(int is_on)
  487. {
  488. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1,(1<<11)); //WIFI_RST GPIO mode
  489. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_0,(1<<18)); //WIFI_EN GPIO mode
  490. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<8));//GPIOC_8 ==WIFI_EN
  491. if(is_on){
  492. SET_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  493. }
  494. else{
  495. /* only pull donw reg_on pin when wifi and bt off */
  496. if((!WIFI_ON) && (!BT_ON)){
  497. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  498. printk("WIFI BT Power down\n");
  499. }
  500. }
  501. }
  502. #ifdef CONFIG_CARDREADER
  503. static struct resource meson_card_resource[] = {
  504. [0] = {
  505. .start = 0x1200230, //physical address
  506. .end = 0x120024c,
  507. .flags = 0x200,
  508. }
  509. };
  510. #if 0
  511. static void extern_wifi_power(int is_power)
  512. {
  513. WIFI_ON = is_power;
  514. reg_on_control(is_power);
  515. /*
  516. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1,(1<<11));
  517. CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_0,(1<<18));
  518. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<8));
  519. if(is_power)
  520. SET_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  521. else
  522. CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
  523. */
  524. }
  525. EXPORT_SYMBOL(extern_wifi_power);
  526. #endif
  527. static void sdio_extern_init(void)
  528. {
  529. #if defined(CONFIG_BCM4329_HW_OOB) || defined(CONFIG_BCM4329_OOB_INTR_ONLY)/* Jone add */
  530. gpio_set_status(PAD_GPIOX_11,gpio_status_in);
  531. gpio_irq_set(PAD_GPIOX_11,GPIO_IRQ(4,GPIO_IRQ_RISING));
  532. extern_wifi_power(1);
  533. #endif
  534. }
  535. static struct aml_card_info meson_card_info[] = {
  536. [0] = {
  537. .name = "sd_card",
  538. .work_mode = CARD_HW_MODE,
  539. .io_pad_type = SDHC_CARD_0_5,
  540. .card_ins_en_reg = CARD_GPIO_ENABLE,
  541. .card_ins_en_mask = PREG_IO_29_MASK,
  542. .card_ins_input_reg = CARD_GPIO_INPUT,
  543. .card_ins_input_mask = PREG_IO_29_MASK,
  544. .card_power_en_reg = CARD_GPIO_ENABLE,
  545. .card_power_en_mask = PREG_IO_31_MASK,
  546. .card_power_output_reg = CARD_GPIO_OUTPUT,
  547. .card_power_output_mask = PREG_IO_31_MASK,
  548. .card_power_en_lev = 0,
  549. .card_wp_en_reg = 0,
  550. .card_wp_en_mask = 0,
  551. .card_wp_input_reg = 0,
  552. .card_wp_input_mask = 0,
  553. .card_extern_init = 0,
  554. },
  555. [1] = {
  556. .name = "sdio_card",
  557. .work_mode = CARD_HW_MODE,
  558. .io_pad_type = SDHC_GPIOX_0_9,
  559. .card_ins_en_reg = 0,
  560. .card_ins_en_mask = 0,
  561. .card_ins_input_reg = 0,
  562. .card_ins_input_mask = 0,
  563. .card_power_en_reg = EGPIO_GPIOC_ENABLE,
  564. .card_power_en_mask = PREG_IO_7_MASK,
  565. .card_power_output_reg = EGPIO_GPIOC_OUTPUT,
  566. .card_power_output_mask = PREG_IO_7_MASK,
  567. .card_power_en_lev = 1,
  568. .card_wp_en_reg = 0,
  569. .card_wp_en_mask = 0,
  570. .card_wp_input_reg = 0,
  571. .card_wp_input_mask = 0,
  572. .card_extern_init = sdio_extern_init,
  573. },
  574. };
  575. static struct aml_card_platform meson_card_platform = {
  576. .card_num = ARRAY_SIZE(meson_card_info),
  577. .card_info = meson_card_info,
  578. };
  579. static struct platform_device meson_card_device = {
  580. .name = "AMLOGIC_CARD",
  581. .id = -1,
  582. .num_resources = ARRAY_SIZE(meson_card_resource),
  583. .resource = meson_card_resource,
  584. .dev = {
  585. .platform_data = &meson_card_platform,
  586. },
  587. };
  588. /**
  589. * Some Meson6 socket board has card detect issue.
  590. * Force card detect success for socket board.
  591. */
  592. static int meson_mmc_detect(void)
  593. {
  594. return 0;
  595. }
  596. #endif // CONFIG_CARDREADER
  597. /***********************************************************************
  598. * MMC SD Card Section
  599. **********************************************************************/
  600. #ifdef CONFIG_MMC_AML
  601. struct platform_device;
  602. struct mmc_host;
  603. struct mmc_card;
  604. struct mmc_ios;
  605. //return 1: no inserted 0: inserted
  606. static int aml_sdio_detect(struct aml_sd_host * host)
  607. {
  608. aml_set_reg32_mask(P_PREG_PAD_GPIO5_EN_N,1<<29);//CARD_6 input mode
  609. if((aml_read_reg32(P_PREG_PAD_GPIO5_I)&(1<<29)) == 0)
  610. return 0;
  611. else{ //for socket card box
  612. return 0;
  613. }
  614. return 1; //no insert.
  615. }
  616. static void cpu_sdio_pwr_prepare(unsigned port)
  617. {
  618. switch(port)
  619. {
  620. case MESON_SDIO_PORT_A:
  621. aml_clr_reg32_mask(P_PREG_PAD_GPIO4_EN_N,0x30f);
  622. aml_clr_reg32_mask(P_PREG_PAD_GPIO4_O ,0x30f);
  623. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_8,0x3f);
  624. break;
  625. case MESON_SDIO_PORT_B:
  626. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,0x3f<<23);
  627. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_O ,0x3f<<23);
  628. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,0x3f<<10);
  629. break;
  630. case MESON_SDIO_PORT_C:
  631. aml_clr_reg32_mask(P_PREG_PAD_GPIO3_EN_N,0xc0f);
  632. aml_clr_reg32_mask(P_PREG_PAD_GPIO3_O ,0xc0f);
  633. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x3f<<24));
  634. break;
  635. case MESON_SDIO_PORT_XC_A:
  636. break;
  637. case MESON_SDIO_PORT_XC_B:
  638. break;
  639. case MESON_SDIO_PORT_XC_C:
  640. break;
  641. }
  642. }
  643. static int cpu_sdio_init(unsigned port)
  644. {
  645. switch(port)
  646. {
  647. case MESON_SDIO_PORT_A:
  648. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_8,0x3d<<0);
  649. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_8,0x1<<1);
  650. break;
  651. case MESON_SDIO_PORT_B:
  652. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,0x3d<<10);
  653. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,0x1<<11);
  654. break;
  655. case MESON_SDIO_PORT_C://SDIOC GPIOB_2~GPIOB_7
  656. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,(0x1f<<22));
  657. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x1f<<25));
  658. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x1<<24));
  659. break;
  660. case MESON_SDIO_PORT_XC_A:
  661. #if 0
  662. //sdxc controller can't work
  663. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_8,(0x3f<<0));
  664. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_3,(0x0f<<27));
  665. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_7,((0x3f<<18)|(0x7<<25)));
  666. //aml_set_reg32_mask(P_PERIPHS_PIN_MUX_5,(0x1f<<10));//data 8 bit
  667. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_5,(0x1b<<10));//data 4 bit
  668. #endif
  669. break;
  670. case MESON_SDIO_PORT_XC_B:
  671. //sdxc controller can't work
  672. //aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,(0xf<<4));
  673. break;
  674. case MESON_SDIO_PORT_XC_C:
  675. #if 0
  676. //sdxc controller can't work
  677. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x3f<<24));
  678. aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,((0x13<<22)|(0x3<<16)));
  679. aml_set_reg32_mask(P_PERIPHS_PIN_MUX_4,(0x1f<<26));
  680. printk(KERN_INFO "inand sdio xc-c init\n");
  681. #endif
  682. break;
  683. default:
  684. return -1;
  685. }
  686. return 0;
  687. }
  688. static void aml_sdio_pwr_prepare(unsigned port)
  689. {
  690. /// @todo NOT FINISH
  691. ///do nothing here
  692. cpu_sdio_pwr_prepare(port);
  693. }
  694. static void aml_sdio_pwr_on(unsigned port)
  695. {
  696. if((aml_read_reg32(P_PREG_PAD_GPIO5_O) & (1<<31)) != 0){
  697. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_O,(1<<31));
  698. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,(1<<31));
  699. udelay(1000);
  700. }
  701. /// @todo NOT FINISH
  702. }
  703. static void aml_sdio_pwr_off(unsigned port)
  704. {
  705. if((aml_read_reg32(P_PREG_PAD_GPIO5_O) & (1<<31)) == 0){
  706. aml_set_reg32_mask(P_PREG_PAD_GPIO5_O,(1<<31));
  707. aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,(1<<31));//GPIOD13
  708. udelay(1000);
  709. }
  710. /// @todo NOT FINISH
  711. }
  712. static int aml_sdio_init(struct aml_sd_host * host)
  713. { //set pinumx ..
  714. aml_set_reg32_mask(P_PREG_PAD_GPIO5_EN_N,1<<29);//CARD_6
  715. cpu_sdio_init(host->sdio_port);
  716. host->clk = clk_get_sys("clk81",NULL);
  717. if(!IS_ERR(host->clk))
  718. host->clk_rate = clk_get_rate(host->clk);
  719. else
  720. host->clk_rate = 0;
  721. return 0;
  722. }
  723. static struct resource aml_mmc_resource[] = {
  724. [0] = {
  725. .start = 0x1200230, //physical address
  726. .end = 0x1200248,
  727. .flags = IORESOURCE_MEM, //0x200
  728. },
  729. };
  730. static u64 aml_mmc_device_dmamask = 0xffffffffUL;
  731. static struct aml_mmc_platform_data aml_mmc_def_platdata = {
  732. .no_wprotect = 1,
  733. .no_detect = 0,
  734. .wprotect_invert = 0,
  735. .detect_invert = 0,
  736. .use_dma = 0,
  737. .gpio_detect=1,
  738. .gpio_wprotect=0,
  739. .ocr_avail = MMC_VDD_33_34,
  740. .sdio_port = MESON_SDIO_PORT_B,
  741. .max_width = 4,
  742. .host_caps = (MMC_CAP_4_BIT_DATA |
  743. MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | MMC_CAP_NEEDS_POLL),
  744. .f_min = 200000,
  745. .f_max = 40000000,
  746. .clock = 300000,
  747. .sdio_init = aml_sdio_init,
  748. .sdio_detect = aml_sdio_detect,
  749. .sdio_pwr_prepare = aml_sdio_pwr_prepare,
  750. .sdio_pwr_on = aml_sdio_pwr_on,
  751. .sdio_pwr_off = aml_sdio_pwr_off,
  752. };
  753. static struct platform_device aml_mmc_device = {
  754. .name = "aml_sd_mmc",
  755. .id = 0,
  756. .num_resources = ARRAY_SIZE(aml_mmc_resource),
  757. .resource = aml_mmc_resource,
  758. .dev = {
  759. .dma_mask = &aml_mmc_device_dmamask,
  760. .coherent_dma_mask = 0xffffffffUL,
  761. .platform_data = &aml_mmc_def_platdata,
  762. },
  763. };
  764. #endif //CONFIG_MMC_AML
  765. /***********************************************************************
  766. * IO Mapping
  767. **********************************************************************/
  768. /*
  769. #define IO_CBUS_BASE 0xf1100000 ///2M
  770. #define IO_AXI_BUS_BASE 0xf1300000 ///1M
  771. #define IO_PL310_BASE 0xf2200000 ///4k
  772. #define IO_PERIPH_BASE 0xf2300000 ///4k
  773. #define IO_APB_BUS_BASE 0xf3000000 ///8k
  774. #define IO_DOS_BUS_BASE 0xf3010000 ///64k
  775. #define IO_AOBUS_BASE 0xf3100000 ///1M
  776. #define IO_USB_A_BASE 0xf3240000 ///256k
  777. #define IO_USB_B_BASE 0xf32C0000 ///256k
  778. #define IO_WIFI_BASE 0xf3300000 ///1M
  779. #define IO_SATA_BASE 0xf3400000 ///64k
  780. #define IO_ETH_BASE 0xf3410000 ///64k
  781. #define IO_SPIMEM_BASE 0xf4000000 ///64M
  782. #define IO_A9_APB_BASE 0xf8000000 ///256k
  783. #define IO_DEMOD_APB_BASE 0xf8044000 ///112k
  784. #define IO_MALI_APB_BASE 0xf8060000 ///128k
  785. #define IO_APB2_BUS_BASE 0xf8000000
  786. #define IO_AHB_BASE 0xf9000000 ///128k
  787. #define IO_BOOTROM_BASE 0xf9040000 ///64k
  788. #define IO_SECBUS_BASE 0xfa000000
  789. #define IO_EFUSE_BASE 0xfa000000 ///4k
  790. */
  791. static __initdata struct map_desc meson_io_desc[] = {
  792. {
  793. .virtual = IO_CBUS_BASE,
  794. .pfn = __phys_to_pfn(IO_CBUS_PHY_BASE),
  795. .length = SZ_2M,
  796. .type = MT_DEVICE,
  797. } , {
  798. .virtual = IO_AXI_BUS_BASE,
  799. .pfn = __phys_to_pfn(IO_AXI_BUS_PHY_BASE),
  800. .length = SZ_1M,
  801. .type = MT_DEVICE,
  802. } , {
  803. .virtual = IO_PL310_BASE,
  804. .pfn = __phys_to_pfn(IO_PL310_PHY_BASE),
  805. .length = SZ_4K,
  806. .type = MT_DEVICE,
  807. } , {
  808. .virtual = IO_PERIPH_BASE,
  809. .pfn = __phys_to_pfn(IO_PERIPH_PHY_BASE),
  810. .length = SZ_1M,
  811. .type = MT_DEVICE,
  812. } , {
  813. .virtual = IO_APB_BUS_BASE,
  814. .pfn = __phys_to_pfn(IO_APB_BUS_PHY_BASE),
  815. .length = SZ_1M,
  816. .type = MT_DEVICE,
  817. } , /*{
  818. .virtual = IO_DOS_BUS_BASE,
  819. .pfn = __phys_to_pfn(IO_DOS_BUS_PHY_BASE),
  820. .length = SZ_64K,
  821. .type = MT_DEVICE,
  822. } , */{
  823. .virtual = IO_AOBUS_BASE,
  824. .pfn = __phys_to_pfn(IO_AOBUS_PHY_BASE),
  825. .length = SZ_1M,
  826. .type = MT_DEVICE,
  827. } , {
  828. .virtual = IO_AHB_BUS_BASE,
  829. .pfn = __phys_to_pfn(IO_AHB_BUS_PHY_BASE),
  830. .length = SZ_8M,
  831. .type = MT_DEVICE,
  832. } , {
  833. .virtual = IO_SPIMEM_BASE,
  834. .pfn = __phys_to_pfn(IO_SPIMEM_PHY_BASE),
  835. .length = SZ_64M,
  836. .type = MT_ROM,
  837. } , {
  838. .virtual = IO_APB2_BUS_BASE,
  839. .pfn = __phys_to_pfn(IO_APB2_BUS_PHY_BASE),
  840. .length = SZ_512K,
  841. .type = MT_DEVICE,
  842. } , {
  843. .virtual = IO_AHB_BASE,
  844. .pfn = __phys_to_pfn(IO_AHB_PHY_BASE),
  845. .length = SZ_128K,
  846. .type = MT_DEVICE,
  847. } , {
  848. .virtual = IO_BOOTROM_BASE,
  849. .pfn = __phys_to_pfn(IO_BOOTROM_PHY_BASE),
  850. .length = SZ_64K,
  851. .type = MT_DEVICE,
  852. } , {
  853. .virtual = IO_SECBUS_BASE,
  854. .pfn = __phys_to_pfn(IO_SECBUS_PHY_BASE),
  855. .length = SZ_4K,
  856. .type = MT_DEVICE,
  857. }, {
  858. .virtual = IO_SECURE_BASE,
  859. .pfn = __phys_to_pfn(IO_SECURE_PHY_BASE),
  860. .length = SZ_16K,
  861. .type = MT_DEVICE,
  862. }, {
  863. .virtual = PAGE_ALIGN(__phys_to_virt(RESERVED_MEM_START)),
  864. .pfn = __phys_to_pfn(RESERVED_MEM_START),
  865. .length = RESERVED_MEM_END - RESERVED_MEM_START + 1,
  866. .type = MT_MEMORY_NONCACHED,
  867. },
  868. #ifdef CONFIG_MESON_SUSPEND
  869. {
  870. .virtual = PAGE_ALIGN(__phys_to_virt(0x9ff00000)),
  871. .pfn = __phys_to_pfn(0x9ff00000),
  872. .length = SZ_1M,
  873. .type = MT_MEMORY_NONCACHED,
  874. },
  875. #endif
  876. };
  877. static void __init meson_map_io(void)
  878. {
  879. iotable_init(meson_io_desc, ARRAY_SIZE(meson_io_desc));
  880. }
  881. static void __init meson_fixup(struct machine_desc *mach, struct tag *tag, char **cmdline, struct meminfo *m)
  882. {
  883. struct membank *pbank;
  884. mach->video_start = RESERVED_MEM_START;
  885. mach->video_end = RESERVED_MEM_END;
  886. m->nr_banks = 0;
  887. pbank = &m->bank[m->nr_banks];
  888. pbank->start = PAGE_ALIGN(PHYS_MEM_START);
  889. pbank->size = SZ_64M & PAGE_MASK;
  890. m->nr_banks++;
  891. pbank = &m->bank[m->nr_banks];
  892. pbank->start = PAGE_ALIGN(RESERVED_MEM_END + 1);
  893. #ifdef CONFIG_MESON_SUSPEND
  894. pbank->size = (PHYS_MEM_END-RESERVED_MEM_END-SZ_1M) & PAGE_MASK;
  895. #else
  896. pbank->size = (PHYS_MEM_END-RESERVED_MEM_END) & PAGE_MASK;
  897. #endif
  898. m->nr_banks++;
  899. }
  900. /***********************************************************************
  901. *USB Setting section
  902. **********************************************************************/
  903. static void set_usb_a_vbus_power(char is_power_on)
  904. {
  905. //M6 SKT: GPIOD_9, OEN: 0x2012, OUT:0x2013 , Bit25
  906. #define USB_A_POW_GPIO PREG_EGPIO
  907. #define USB_A_POW_GPIO_BIT 25
  908. #define USB_A_POW_GPIO_BIT_ON 1
  909. #define USB_A_POW_GPIO_BIT_OFF 0
  910. if(is_power_on){
  911. printk( "set usb port power on (board gpio %d)!\n",USB_A_POW_GPIO_BIT);
  912. aml_set_reg32_bits(CBUS_REG_ADDR(0x2012),0,USB_A_POW_GPIO_BIT,1);//mode
  913. aml_set_reg32_bits(CBUS_REG_ADDR(0x2013),1,USB_A_POW_GPIO_BIT,1);//out
  914. //set_gpio_mode(USB_A_POW_GPIO,USB_A_POW_GPIO_BIT,GPIO_OUTPUT_MODE);
  915. //set_gpio_val(USB_A_POW_GPIO,USB_A_POW_GPIO_BIT,USB_A_POW_GPIO_BIT_ON);
  916. }
  917. else {
  918. printk("set usb port power off (board gpio %d)!\n",USB_A_POW_GPIO_BIT);
  919. aml_set_reg32_bits(CBUS_REG_ADDR(0x2012),0,USB_A_POW_GPIO_BIT,1);//mode
  920. aml_set_reg32_bits(CBUS_REG_ADDR(0x2013),0,USB_A_POW_GPIO_BIT,1);//out
  921. }
  922. }
  923. static int __init setup_usb_devices(void)
  924. {
  925. struct lm_device * usb_ld_a, *usb_ld_b;
  926. usb_ld_a = alloc_usb_lm_device(USB_PORT_IDX_A);
  927. usb_ld_b = alloc_usb_lm_device (USB_PORT_IDX_B);
  928. usb_ld_a->param.usb.set_vbus_power = set_usb_a_vbus_power;
  929. #ifdef CONFIG_SMP
  930. usb_ld_a->param.usb.port_type = USB_PORT_TYPE_HOST;
  931. #endif
  932. lm_device_register(usb_ld_a);
  933. lm_device_register(usb_ld_b);
  934. return 0;
  935. }
  936. /***********************************************************************/
  937. #ifdef CONFIG_EFUSE
  938. static bool efuse_data_verify(unsigned char *usid)
  939. { int len;
  940. len = strlen(usid);
  941. if((len > 0)&&(len<58) )
  942. return true;
  943. else
  944. return false;
  945. }
  946. static struct efuse_platform_data aml_efuse_plat = {
  947. .pos = 454,
  948. .count = 58,
  949. .data_verify = efuse_data_verify,
  950. };
  951. static struct platform_device aml_efuse_device = {
  952. .name = "efuse",
  953. .id = -1,
  954. .dev = {
  955. .platform_data = &aml_efuse_plat,
  956. },
  957. };
  958. // BSP EFUSE layout setting
  959. static efuseinfo_item_t aml_efuse_setting[] = {
  960. // usid layout can be defined by customer
  961. {
  962. .title = "usid",
  963. .id = EFUSE_USID_ID,
  964. .offset = 454, // customer can modify the offset which must >= 454
  965. .enc_len = 58, // customer can modify the encode length by self must <=58
  966. .data_len = 58, // customer can modify the data length by self must <=58
  967. .bch_en = 0, // customer can modify do bch or not
  968. .bch_reverse = 0,
  969. },
  970. // customer also can add new EFUSE item to expand, but must be correct and bo conflict
  971. };
  972. static int aml_efuse_getinfoex_byID(unsigned param, efuseinfo_item_t *info)
  973. {
  974. unsigned num = sizeof(aml_efuse_setting)/sizeof(efuseinfo_item_t);
  975. int i=0;
  976. int ret = -1;
  977. for(i=0; i<num; i++){
  978. if(aml_efuse_setting[i].id == param){
  979. strcpy(info->title, aml_efuse_setting[i].title);
  980. info->offset = aml_efuse_setting[i].offset;
  981. info->id = aml_efuse_setting[i].id;
  982. info->data_len = aml_efuse_setting[i].data_len;
  983. info->enc_len = aml_efuse_setting[i].enc_len;
  984. info->bch_en = aml_efuse_setting[i].bch_en;
  985. info->bch_reverse = aml_efuse_setting[i].bch_reverse;
  986. ret = 0;
  987. break;
  988. }
  989. }
  990. return ret;
  991. }
  992. static int aml_efuse_getinfoex_byPos(unsigned param, efuseinfo_item_t *info)
  993. {
  994. unsigned num = sizeof(aml_efuse_setting)/sizeof(efuseinfo_item_t);
  995. int i=0;
  996. int ret = -1;
  997. for(i=0; i<num; i++){
  998. if(aml_efuse_setting[i].offset == param){
  999. strcpy(info->title, aml_efuse_setting[i].title);
  1000. info->offset = aml_efuse_setting[i].offset;
  1001. info->id = aml_efuse_setting[i].id;
  1002. info->data_len = aml_efuse_setting[i].data_len;
  1003. info->enc_len = aml_efuse_setting[i].enc_len;
  1004. info->bch_en = aml_efuse_setting[i].bch_en;
  1005. info->bch_reverse = aml_efuse_setting[i].bch_reverse;
  1006. ret = 0;
  1007. break;
  1008. }
  1009. }
  1010. return ret;
  1011. }
  1012. extern pfn efuse_getinfoex;
  1013. extern pfn efuse_getinfoex_byPos;
  1014. static setup_aml_efuse()
  1015. {
  1016. efuse_getinfoex = aml_efuse_getinfoex_byID;
  1017. efuse_getinfoex_byPos = aml_efuse_getinfoex_byPos;
  1018. }
  1019. #endif
  1020. #if defined(CONFIG_AML_RTC)
  1021. static struct platform_device aml_rtc_device = {
  1022. .name = "aml_rtc",
  1023. .id = -1,
  1024. };
  1025. #endif
  1026. #if defined(CONFIG_SUSPEND)
  1027. static void m6ref_set_vccx2(int power_on)
  1028. {
  1029. if (power_on) {
  1030. //restore_pinmux();
  1031. printk(KERN_INFO "%s() Power ON\n", __FUNCTION__);
  1032. aml_clr_reg32_mask(P_PREG_PAD_GPIO0_EN_N,(1<<26));
  1033. aml_clr_reg32_mask(P_PREG_PAD_GPIO0_O,(1<<26));
  1034. }
  1035. else {
  1036. printk(KERN_INFO "%s() Power OFF\n", __FUNCTION__);
  1037. aml_clr_reg32_mask(P_PREG_PAD_GPIO0_EN_N,(1<<26));
  1038. aml_set_reg32_mask(P_PREG_PAD_GPIO0_O,(1<<26));
  1039. //save_pinmux();
  1040. }
  1041. }
  1042. static struct meson_pm_config aml_pm_pdata = {
  1043. .pctl_reg_base = (void *)IO_APB_BUS_BASE,
  1044. .mmc_reg_base = (void *)APB_REG_ADDR(0x1000),
  1045. .hiu_reg_base = (void *)CBUS_REG_ADDR(0x1000),
  1046. .power_key = (1<<8),
  1047. .ddr_clk = 0x00110820,
  1048. .sleepcount = 128,
  1049. .set_vccx2 = m6ref_set_vccx2,
  1050. .core_voltage_adjust = 7, //5,8
  1051. };
  1052. static struct platform_device aml_pm_device = {
  1053. .name = "pm-meson",
  1054. .dev = {
  1055. .platform_data = &aml_pm_pdata,
  1056. },
  1057. .id = -1,
  1058. };
  1059. #endif
  1060. #ifdef CONFIG_SARADC_AM
  1061. #include <linux/saradc.h>
  1062. static struct platform_device saradc_device = {
  1063. .name = "saradc",
  1064. .id = 0,
  1065. .dev = {
  1066. .platform_data = NULL,
  1067. },
  1068. };
  1069. #endif
  1070. #if defined(CONFIG_ADC_KEYPADS_AM)||defined(CONFIG_ADC_KEYPADS_AM_MODULE)
  1071. #include <linux/input.h>
  1072. #include <linux/adc_keypad.h>
  1073. static struct adc_key adc_kp_key[] = {
  1074. {KEY_VOLUMEDOWN, "vol-", CHAN_4, 150, 40},
  1075. {KEY_VOLUMEUP, "vol+", CHAN_4, 275, 40},
  1076. };
  1077. static struct adc_kp_platform_data adc_kp_pdata = {
  1078. .key = &adc_kp_key[0],
  1079. .key_num = ARRAY_SIZE(adc_kp_key),
  1080. };
  1081. static struct platform_device adc_kp_device = {
  1082. .name = "m1-adckp",
  1083. .id = 0,
  1084. .num_resources = 0,
  1085. .resource = NULL,
  1086. .dev = {
  1087. .platform_data = &adc_kp_pdata,
  1088. }
  1089. };
  1090. #endif
  1091. /***********************************************************************
  1092. * Power Key Section
  1093. **********************************************************************/
  1094. #if defined(CONFIG_KEY_INPUT_CUSTOM_AM) || defined(CONFIG_KEY_INPUT_CUSTOM_AM_MODULE)
  1095. #include <linux/input.h>
  1096. #include <linux/input/key_input.h>
  1097. static int _key_code_list[] = {KEY_POWER};
  1098. static inline int key_input_init_func(void)
  1099. {
  1100. WRITE_AOBUS_REG(AO_RTC_ADDR0, (READ_AOBUS_REG(AO_RTC_ADDR0) &~(1<<11)));
  1101. WRITE_AOBUS_REG(AO_RTC_ADDR1, (READ_AOBUS_REG(AO_RTC_ADDR1) &~(1<<3)));
  1102. return 0;
  1103. }
  1104. static inline int key_scan(void* data)
  1105. {
  1106. int *key_state_list = (int*)data;
  1107. int ret = 0;
  1108. key_state_list[0] = ((READ_AOBUS_REG(AO_RTC_ADDR1) >> 2) & 1) ? 0 : 1;
  1109. return ret;
  1110. }
  1111. static struct key_input_platform_data key_input_pdata = {
  1112. .scan_period = 20,
  1113. .fuzz_time = 60,
  1114. .key_code_list = &_key_code_list[0],
  1115. .key_num = ARRAY_SIZE(_key_code_list),
  1116. .scan_func = key_scan,
  1117. .init_func = key_input_init_func,
  1118. .config = 0,
  1119. };
  1120. static struct platform_device input_device_key = {
  1121. .name = "meson-keyinput",
  1122. .id = 0,
  1123. .num_resources = 0,
  1124. .resource = NULL,
  1125. .dev = {
  1126. .platform_data = &key_input_pdata,
  1127. }
  1128. };
  1129. #endif
  1130. /***********************************************************************
  1131. * Audio section
  1132. **********************************************************************/
  1133. static struct resource aml_m6_audio_resource[] = {
  1134. [0] = {
  1135. .start = 0,
  1136. .end = 0,
  1137. .flags = IORESOURCE_MEM,
  1138. },
  1139. };
  1140. static struct platform_device aml_audio = {
  1141. .name = "aml-audio",
  1142. .id = 0,
  1143. };
  1144. static struct platform_device aml_audio_dai = {
  1145. .name = "aml-dai",
  1146. .id = 0,
  1147. };
  1148. #if defined(CONFIG_SND_SOC_DUMMY_CODEC)
  1149. static pinmux_item_t dummy_codec_pinmux[] = {
  1150. /* I2S_MCLK I2S_BCLK I2S_LRCLK I2S_DOUT */
  1151. {
  1152. .reg = PINMUX_REG(9),
  1153. .setmask = (1 << 7) | (1 << 5) | (1 << 9) | (1 << 4),
  1154. .clrmask = (7 << 19) | (7 << 1) | (3 << 10) | (1 << 6),
  1155. },
  1156. {
  1157. .reg = PINMUX_REG(8),
  1158. .clrmask = (0x7f << 24),
  1159. },
  1160. PINMUX_END_ITEM
  1161. };
  1162. static pinmux_set_t dummy_codec_pinmux_set = {
  1163. .chip_select = NULL,
  1164. .pinmux = &dummy_codec_pinmux[0],
  1165. };
  1166. static void dummy_codec_device_init(void)
  1167. {
  1168. /* audio pinmux */
  1169. pinmux_set(&dummy_codec_pinmux_set);
  1170. }
  1171. static void dummy_codec_device_deinit(void)
  1172. {
  1173. pinmux_clr(&dummy_codec_pinmux_set);
  1174. }
  1175. static struct dummy_codec_platform_data dummy_codec_pdata = {
  1176. .device_init = dummy_codec_device_init,
  1177. .device_uninit = dummy_codec_device_deinit,
  1178. };
  1179. static struct platform_device aml_dummy_codec_audio = {
  1180. .name = "aml_dummy_codec_audio",
  1181. .id = 0,
  1182. .resource = aml_m6_audio_resource,
  1183. .num_resources = ARRAY_SIZE(aml_m6_audio_resource),
  1184. .dev = {
  1185. .platform_data = &dummy_codec_pdata,
  1186. },
  1187. };
  1188. static struct platform_device aml_dummy_codec = {
  1189. .name = "dummy_codec",
  1190. .id = 0,
  1191. };
  1192. #endif
  1193. /***********************************************************************
  1194. * Device Register Section
  1195. **********************************************************************/
  1196. static struct platform_device *platform_devs[] = {
  1197. #if defined(CONFIG_I2C_AML) || defined(CONFIG_I2C_HW_AML)
  1198. &aml_i2c_device_a,
  1199. &aml_i2c_device_b,
  1200. &aml_i2c_device_ao,
  1201. #endif
  1202. &aml_uart_device,
  1203. &meson_device_fb,
  1204. &meson_device_vout,
  1205. #ifdef CONFIG_AM_STREAMING
  1206. &meson_device_codec,
  1207. #endif
  1208. #if defined(CONFIG_AM_NAND)
  1209. &aml_nand_device,
  1210. #endif
  1211. #ifdef CONFIG_SARADC_AM
  1212. &saradc_device,
  1213. #endif
  1214. #if defined(CONFIG_ADC_KEYPADS_AM)||defined(CONFIG_ADC_KEYPADS_AM_MODULE)
  1215. &adc_kp_device,
  1216. #endif
  1217. #if defined(CONFIG_KEY_INPUT_CUSTOM_AM) || defined(CONFIG_KEY_INPUT_CUSTOM_AM_MODULE)
  1218. &input_device_key,
  1219. #endif
  1220. #if defined(CONFIG_CARDREADER)
  1221. &meson_card_device,
  1222. #endif // CONFIG_CARDREADER
  1223. #if defined(CONFIG_MMC_AML)
  1224. &aml_mmc_device,
  1225. #endif
  1226. #if defined(CONFIG_SUSPEND)
  1227. &aml_pm_device,
  1228. #endif
  1229. #ifdef CONFIG_EFUSE
  1230. &aml_efuse_device,
  1231. #endif
  1232. #if defined(CONFIG_AML_RTC)
  1233. &aml_rtc_device,
  1234. #endif
  1235. &aml_audio,
  1236. &aml_audio_dai,
  1237. #if defined(CONFIG_SND_SOC_DUMMY_CODEC)
  1238. &aml_dummy_codec_audio,
  1239. &aml_dummy_codec,
  1240. #endif
  1241. #ifdef CONFIG_AM_REMOTE
  1242. &meson_device_remote,
  1243. #endif
  1244. };
  1245. static __init void meson_init_machine(void)
  1246. {
  1247. // meson_cache_init();
  1248. /**
  1249. * Meson6 socket board ONLY
  1250. * Do *NOT* merge for other BSP
  1251. */
  1252. #if defined(CONFIG_CARDREADER)
  1253. {
  1254. extern int (*sd_mmc_ins_register) (void);
  1255. sd_mmc_ins_register = meson_mmc_detect;
  1256. }
  1257. #endif // CONFIG_CARDREADER
  1258. #ifdef CONFIG_AM_REMOTE
  1259. setup_remote_device();
  1260. #endif
  1261. #ifdef CONFIG_EFUSE
  1262. setup_aml_efuse();
  1263. #endif
  1264. setup_usb_devices();
  1265. setup_devices_resource();
  1266. platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
  1267. #if defined(CONFIG_SUSPEND)
  1268. {//todo: remove it after verified. need set it in uboot environment variable.
  1269. extern int console_suspend_enabled;
  1270. console_suspend_enabled = 0;
  1271. }
  1272. #endif
  1273. #ifdef CONFIG_AM_LCD_OUTPUT
  1274. m6skt_lcd_init();
  1275. #endif
  1276. }
  1277. static __init void meson_init_early(void)
  1278. {///boot seq 1
  1279. }
  1280. MACHINE_START(MESON6_SKT, "Amlogic Meson6 socket board")
  1281. .boot_params = BOOT_PARAMS_OFFSET,
  1282. .map_io = meson_map_io,///2
  1283. .init_early = meson_init_early,///3
  1284. .init_irq = meson_init_irq,///0
  1285. .timer = &meson_sys_timer,
  1286. .init_machine = meson_init_machine,
  1287. .fixup = meson_fixup,///1
  1288. MACHINE_END