123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419 |
- /*
- * arch/arm/mach-meson6/board-meson6-skt.c
- *
- * Copyright (C) 2011-2012 Amlogic, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
- #include <linux/kernel.h>
- #include <linux/init.h>
- #include <linux/mm.h>
- #include <linux/sched.h>
- #include <linux/interrupt.h>
- #include <linux/ioport.h>
- #include <linux/platform_device.h>
- #include <linux/io.h>
- #include <linux/dma-mapping.h>
- #include <linux/device.h>
- #include <asm/mach-types.h>
- #include <asm/mach/arch.h>
- #include <asm/setup.h>
- #include <asm/memory.h>
- #include <asm/mach/map.h>
- #include <plat/platform.h>
- #include <plat/plat_dev.h>
- #include <plat/platform_data.h>
- #include <linux/io.h>
- #include <plat/io.h>
- #include <linux/mtd/mtd.h>
- #include <linux/mtd/nand.h>
- #include <linux/mtd/nand_ecc.h>
- #include <linux/mtd/partitions.h>
- #include <linux/device.h>
- #include <linux/spi/flash.h>
- #include <linux/i2c.h>
- #include <linux/delay.h>
- #include <linux/clk.h>
- #include <asm/mach-types.h>
- #include <asm/setup.h>
- #include <asm/memory.h>
- #include <plat/platform.h>
- #include <plat/plat_dev.h>
- #include <plat/platform_data.h>
- #include <plat/lm.h>
- #include <plat/regops.h>
- #include <linux/io.h>
- #include <plat/io.h>
- #include <mach/map.h>
- #include <mach/i2c_aml.h>
- #include <mach/nand.h>
- #include <mach/usbclock.h>
- #include <mach/usbsetting.h>
- #include <mach/pm.h>
- #include <linux/uart-aml.h>
- #include <linux/i2c-aml.h>
- #include "board-m6skt.h"
- #ifdef CONFIG_MMC_AML
- #include <mach/mmc.h>
- #endif
- #ifdef CONFIG_CARDREADER
- #include <mach/card_io.h>
- #endif // CONFIG_CARDREADER
- #include <mach/gpio.h>
- #ifdef CONFIG_EFUSE
- #include <linux/efuse.h>
- #endif
- #ifdef CONFIG_SND_SOC_DUMMY_CODEC
- #include <sound/dummy_codec.h>
- #endif
- /***********************************************************************
- * IO Mapping
- **********************************************************************/
- #define PHYS_MEM_START (0x80000000)
- #define PHYS_MEM_SIZE (512*SZ_1M)
- #define PHYS_MEM_END (PHYS_MEM_START + PHYS_MEM_SIZE -1 )
- /******** Reserved memory setting ************************/
- #define RESERVED_MEM_START (0x80000000+64*SZ_1M) /*start at the second 64M*/
- /******** CODEC memory setting ************************/
- // Codec need 16M for 1080p decode
- // 4M for sd decode;
- #define ALIGN_MSK ((SZ_1M)-1)
- #define U_ALIGN(x) ((x+ALIGN_MSK)&(~ALIGN_MSK))
- #define D_ALIGN(x) ((x)&(~ALIGN_MSK))
- /******** AUDIODSP memory setting ************************/
- #define AUDIODSP_ADDR_START U_ALIGN(RESERVED_MEM_START) /*audiodsp memstart*/
- #define AUDIODSP_ADDR_END (AUDIODSP_ADDR_START+SZ_1M-1) /*audiodsp memend*/
- /******** Frame buffer memory configuration ***********/
- #define OSD_480_PIX (640*480)
- #define OSD_576_PIX (768*576)
- #define OSD_720_PIX (1280*720)
- #define OSD_1080_PIX (1920*1080)
- #define OSD_PANEL_PIX (800*480)
- #define B16BpP (2)
- #define B32BpP (4)
- #define DOUBLE_BUFFER (2)
- #define OSD1_MAX_MEM U_ALIGN(OSD_1080_PIX*B32BpP*DOUBLE_BUFFER)
- #define OSD2_MAX_MEM U_ALIGN(32*32*B32BpP)
- /******** Reserved memory configuration ***************/
- #define OSD1_ADDR_START U_ALIGN(AUDIODSP_ADDR_END )
- #define OSD1_ADDR_END (OSD1_ADDR_START+OSD1_MAX_MEM - 1)
- #define OSD2_ADDR_START U_ALIGN(OSD1_ADDR_END)
- #define OSD2_ADDR_END (OSD2_ADDR_START +OSD2_MAX_MEM -1)
- #if defined(CONFIG_AM_VDEC_H264)
- #define CODEC_MEM_SIZE U_ALIGN(32*SZ_1M)
- #else
- #define CODEC_MEM_SIZE U_ALIGN(16*SZ_1M)
- #endif
- #define CODEC_ADDR_START U_ALIGN(OSD2_ADDR_END)
- #define CODEC_ADDR_END (CODEC_ADDR_START+CODEC_MEM_SIZE-1)
- /********VDIN memory configuration ***************/
- #define VDIN_ADDR_START U_ALIGN(CODEC_ADDR_END)
- #define VDIN_ADDR_END (VDIN_ADDR_START + CODEC_MEM_SIZE - 1)
- #if defined(CONFIG_AMLOGIC_VIDEOIN_MANAGER)
- #define VM_SIZE (SZ_1M*16)
- #else
- #define VM_SIZE (0)
- #endif /* CONFIG_AMLOGIC_VIDEOIN_MANAGER */
- #define VM_ADDR_START U_ALIGN(VDIN_ADDR_END)
- #define VM_ADDR_END (VM_SIZE + VM_ADDR_START - 1)
- #if defined(CONFIG_AM_DEINTERLACE_SD_ONLY)
- #define DI_MEM_SIZE (SZ_1M*3)
- #else
- #define DI_MEM_SIZE (SZ_1M*15)
- #endif
- #define DI_ADDR_START U_ALIGN(VM_ADDR_END)
- #define DI_ADDR_END (DI_ADDR_START+DI_MEM_SIZE-1)
- #ifdef CONFIG_POST_PROCESS_MANAGER
- #ifdef CONFIG_POST_PROCESS_MANAGER_PPSCALER
- #define PPMGR_MEM_SIZE 1280 * 800 * 21
- #else
- #define PPMGR_MEM_SIZE 1280 * 800 * 18
- #endif
- #else
- #define PPMGR_MEM_SIZE 0
- #endif /* CONFIG_POST_PROCESS_MANAGER */
- #define PPMGR_ADDR_START U_ALIGN(DI_ADDR_END)
- #define PPMGR_ADDR_END (PPMGR_ADDR_START+PPMGR_MEM_SIZE-1)
- #define STREAMBUF_MEM_SIZE (SZ_1M*7)
- #define STREAMBUF_ADDR_START U_ALIGN(PPMGR_ADDR_END)
- #define STREAMBUF_ADDR_END (STREAMBUF_ADDR_START+STREAMBUF_MEM_SIZE-1)
- #define RESERVED_MEM_END (STREAMBUF_ADDR_END)
- static struct resource meson_fb_resource[] = {
- [0] = {
- .start = OSD1_ADDR_START,
- .end = OSD1_ADDR_END,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = OSD2_ADDR_START,
- .end = OSD2_ADDR_END,
- .flags = IORESOURCE_MEM,
- },
- };
- static struct resource meson_codec_resource[] = {
- [0] = {
- .start = CODEC_ADDR_START,
- .end = CODEC_ADDR_END,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = STREAMBUF_ADDR_START,
- .end = STREAMBUF_ADDR_END,
- .flags = IORESOURCE_MEM,
- },
- };
- #ifdef CONFIG_POST_PROCESS_MANAGER
- static struct resource ppmgr_resources[] = {
- [0] = {
- .start = PPMGR_ADDR_START,
- .end = PPMGR_ADDR_END,
- .flags = IORESOURCE_MEM,
- },
- };
- static struct platform_device ppmgr_device = {
- .name = "ppmgr",
- .id = 0,
- .num_resources = ARRAY_SIZE(ppmgr_resources),
- .resource = ppmgr_resources,
- };
- #endif
- static int __init setup_devices_resource(void)
- {
- setup_fb_resource(meson_fb_resource, ARRAY_SIZE(meson_fb_resource));
- #ifdef CONFIG_AM_STREAMING
- setup_codec_resource(meson_codec_resource, ARRAY_SIZE(meson_codec_resource));
- #endif
- return 0;
- }
- #ifdef CONFIG_AM_LCD_OUTPUT
- #include "board-m6skt.h"
- #endif
- /***********************************************************
- *Remote Section
- ************************************************************/
- #ifdef CONFIG_AM_REMOTE
- #include <plat/remote.h>
- static pinmux_item_t aml_remote_pins[] = {
- {
- .reg = PINMUX_REG(AO),
- .clrmask = 0,
- .setmask = 1 << 0,
- },
- PINMUX_END_ITEM
- };
- static struct aml_remote_platdata aml_remote_pdata __initdata = {
- .pinmux_items = aml_remote_pins,
- .ao_baseaddr = P_AO_IR_DEC_LDR_ACTIVE,
- };
- static void __init setup_remote_device(void)
- {
- meson_remote_set_platdata(&aml_remote_pdata);
- }
- #endif
- /***********************************************************************
- * I2C Section
- **********************************************************************/
- #if defined(CONFIG_I2C_AML) || defined(CONFIG_I2C_HW_AML)
- static bool pinmux_dummy_share(bool select)
- {
- return select;
- }
- static pinmux_item_t aml_i2c_a_pinmux_item[] = {
- {
- .reg = 5,
- //.clrmask = (3<<24)|(3<<30),
- .setmask = 3<<26
- },
- PINMUX_END_ITEM
- };
- static struct aml_i2c_platform aml_i2c_plat_a = {
- .wait_count = 50000,
- .wait_ack_interval = 5,
- .wait_read_interval = 5,
- .wait_xfer_interval = 5,
- .master_no = AML_I2C_MASTER_A,
- .use_pio = 0,
- .master_i2c_speed = AML_I2C_SPPED_300K,
- .master_pinmux = {
- .chip_select = pinmux_dummy_share,
- .pinmux = &aml_i2c_a_pinmux_item[0]
- }
- };
- static pinmux_item_t aml_i2c_b_pinmux_item[]={
- {
- .reg = 5,
- //.clrmask = (3<<28)|(3<<26),
- .setmask = 3<<30
- },
- PINMUX_END_ITEM
- };
- static struct aml_i2c_platform aml_i2c_plat_b = {
- .wait_count = 50000,
- .wait_ack_interval = 5,
- .wait_read_interval = 5,
- .wait_xfer_interval = 5,
- .master_no = AML_I2C_MASTER_B,
- .use_pio = 0,
- .master_i2c_speed = AML_I2C_SPPED_300K,
- .master_pinmux = {
- .chip_select = pinmux_dummy_share,
- .pinmux = &aml_i2c_b_pinmux_item[0]
- }
- };
- static pinmux_item_t aml_i2c_ao_pinmux_item[] = {
- {
- .reg = AO,
- .clrmask = 3<<1,
- .setmask = 3<<5
- },
- PINMUX_END_ITEM
- };
- static struct aml_i2c_platform aml_i2c_plat_ao = {
- .wait_count = 50000,
- .wait_ack_interval = 5,
- .wait_read_interval = 5,
- .wait_xfer_interval = 5,
- .master_no = AML_I2C_MASTER_AO,
- .use_pio = 0,
- .master_i2c_speed = AML_I2C_SPPED_100K,
- .master_pinmux = {
- .pinmux = &aml_i2c_ao_pinmux_item[0]
- }
- };
- static struct resource aml_i2c_resource_a[] = {
- [0] = {
- .start = MESON_I2C_MASTER_A_START,
- .end = MESON_I2C_MASTER_A_END,
- .flags = IORESOURCE_MEM,
- }
- };
- static struct resource aml_i2c_resource_b[] = {
- [0] = {
- .start = MESON_I2C_MASTER_B_START,
- .end = MESON_I2C_MASTER_B_END,
- .flags = IORESOURCE_MEM,
- }
- };
- static struct resource aml_i2c_resource_ao[] = {
- [0]= {
- .start = MESON_I2C_MASTER_AO_START,
- .end = MESON_I2C_MASTER_AO_END,
- .flags = IORESOURCE_MEM,
- }
- };
- static struct platform_device aml_i2c_device_a = {
- .name = "aml-i2c",
- .id = 0,
- .num_resources = ARRAY_SIZE(aml_i2c_resource_a),
- .resource = aml_i2c_resource_a,
- .dev = {
- .platform_data = &aml_i2c_plat_a,
- },
- };
- static struct platform_device aml_i2c_device_b = {
- .name = "aml-i2c",
- .id = 1,
- .num_resources = ARRAY_SIZE(aml_i2c_resource_b),
- .resource = aml_i2c_resource_b,
- .dev = {
- .platform_data = &aml_i2c_plat_b,
- },
- };
- static struct platform_device aml_i2c_device_ao = {
- .name = "aml-i2c",
- .id = 2,
- .num_resources = ARRAY_SIZE(aml_i2c_resource_ao),
- .resource = aml_i2c_resource_ao,
- .dev = {
- .platform_data = &aml_i2c_plat_ao,
- },
- };
- #endif
- /***********************************************************************
- * UART Section
- **********************************************************************/
- static pinmux_item_t uart_pins[] = {
- {
- .reg = PINMUX_REG(AO),
- .setmask = 3 << 11
- },
- PINMUX_END_ITEM
- };
- static pinmux_set_t aml_uart_ao = {
- .chip_select = NULL,
- .pinmux = &uart_pins[0]
- };
- static struct aml_uart_platform __initdata aml_uart_plat = {
- .uart_line[0] = UART_AO,
- .uart_line[1] = UART_A,
- .uart_line[2] = UART_B,
- .uart_line[3] = UART_C,
- .uart_line[4] = UART_D,
- .pinmux_uart[0] = (void*)&aml_uart_ao,
- .pinmux_uart[1] = NULL,
- .pinmux_uart[2] = NULL,
- .pinmux_uart[3] = NULL,
- .pinmux_uart[4] = NULL
- };
- static struct platform_device aml_uart_device = {
- .name = "mesonuart",
- .id = -1,
- .num_resources = 0,
- .resource = NULL,
- .dev = {
- .platform_data = &aml_uart_plat,
- },
- };
- /***********************************************************************
- * Nand Section
- **********************************************************************/
- #ifdef CONFIG_AM_NAND
- static struct mtd_partition normal_partition_info[] = {
- {
- .name = "logo",
- .offset = 32*SZ_1M+40*SZ_1M,
- .size = 8*SZ_1M,
- },
- {
- .name = "aml_logo",
- .offset = 48*SZ_1M+40*SZ_1M,
- .size = 8*SZ_1M,
- },
- {
- .name = "recovery",
- .offset = 64*SZ_1M+40*SZ_1M,
- .size = 8*SZ_1M,
- },
- {
- .name = "boot",
- .offset = 96*SZ_1M+40*SZ_1M,
- .size = 8*SZ_1M,
- },
- {
- .name = "system",
- .offset = 128*SZ_1M+40*SZ_1M,
- .size = 512*SZ_1M,
- },
- {
- .name = "cache",
- .offset = 640*SZ_1M+40*SZ_1M,
- .size = 128*SZ_1M,
- },
- {
- .name = "userdata",
- .offset = 768*SZ_1M+40*SZ_1M,
- .size = 512*SZ_1M,
- },
- {
- .name = "NFTL_Part",
- .offset = MTDPART_OFS_APPEND,
- .size = MTDPART_SIZ_FULL,
- },
- };
- static struct aml_nand_platform aml_nand_mid_platform[] = {
- #ifndef CONFIG_AMLOGIC_SPI_NOR
- {
- .name = NAND_BOOT_NAME,
- .chip_enable_pad = AML_NAND_CE0,
- .ready_busy_pad = AML_NAND_CE0,
- .platform_nand_data = {
- .chip = {
- .nr_chips = 1,
- .options = (NAND_TIMING_MODE5 | NAND_ECC_BCH30_1K_MODE),
- },
- },
- .T_REA = 20,
- .T_RHOH = 15,
- },
- #endif
- {
- .name = NAND_NORMAL_NAME,
- .chip_enable_pad = (AML_NAND_CE0/* | (AML_NAND_CE1 << 4) | (AML_NAND_CE2 << 8) | (AML_NAND_CE3 << 12)*/),
- .ready_busy_pad = (AML_NAND_CE0 /*| (AML_NAND_CE0 << 4) | (AML_NAND_CE1 << 8) | (AML_NAND_CE1 << 12)*/),
- .platform_nand_data = {
- .chip = {
- .nr_chips = 1,
- .nr_partitions = ARRAY_SIZE(normal_partition_info),
- .partitions = normal_partition_info,
- .options = (NAND_TIMING_MODE5 | NAND_ECC_BCH30_1K_MODE | NAND_TWO_PLANE_MODE),
- },
- },
- .T_REA = 20,
- .T_RHOH = 15,
- }
- };
- static struct aml_nand_device aml_nand_mid_device = {
- .aml_nand_platform = aml_nand_mid_platform,
- .dev_num = ARRAY_SIZE(aml_nand_mid_platform),
- };
- static struct resource aml_nand_resources[] = {
- {
- .start = 0xc1108600,
- .end = 0xc1108624,
- .flags = IORESOURCE_MEM,
- },
- };
- static struct platform_device aml_nand_device = {
- .name = "aml_nand",
- .id = 0,
- .num_resources = ARRAY_SIZE(aml_nand_resources),
- .resource = aml_nand_resources,
- .dev = {
- .platform_data = &aml_nand_mid_device,
- },
- };
- #endif
- /***********************************************************************
- * Card Reader Section
- **********************************************************************/
- /* WIFI ON Flag */
- static int WIFI_ON;
- /* BT ON Flag */
- static int BT_ON;
- /* WL_BT_REG_ON control function */
- static void reg_on_control(int is_on)
- {
- CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1,(1<<11)); //WIFI_RST GPIO mode
- CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_0,(1<<18)); //WIFI_EN GPIO mode
- CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<8));//GPIOC_8 ==WIFI_EN
- if(is_on){
- SET_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
- }
- else{
- /* only pull donw reg_on pin when wifi and bt off */
- if((!WIFI_ON) && (!BT_ON)){
- CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
- printk("WIFI BT Power down\n");
- }
- }
- }
- #ifdef CONFIG_CARDREADER
- static struct resource meson_card_resource[] = {
- [0] = {
- .start = 0x1200230, //physical address
- .end = 0x120024c,
- .flags = 0x200,
- }
- };
- #if 0
- static void extern_wifi_power(int is_power)
- {
- WIFI_ON = is_power;
- reg_on_control(is_power);
- /*
- CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_1,(1<<11));
- CLEAR_CBUS_REG_MASK(PERIPHS_PIN_MUX_0,(1<<18));
- CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_EN_N, (1<<8));
- if(is_power)
- SET_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
- else
- CLEAR_CBUS_REG_MASK(PREG_PAD_GPIO2_O, (1<<8));
- */
- }
- EXPORT_SYMBOL(extern_wifi_power);
- #endif
- static void sdio_extern_init(void)
- {
- #if defined(CONFIG_BCM4329_HW_OOB) || defined(CONFIG_BCM4329_OOB_INTR_ONLY)/* Jone add */
- gpio_set_status(PAD_GPIOX_11,gpio_status_in);
- gpio_irq_set(PAD_GPIOX_11,GPIO_IRQ(4,GPIO_IRQ_RISING));
- extern_wifi_power(1);
- #endif
- }
- static struct aml_card_info meson_card_info[] = {
- [0] = {
- .name = "sd_card",
- .work_mode = CARD_HW_MODE,
- .io_pad_type = SDHC_CARD_0_5,
- .card_ins_en_reg = CARD_GPIO_ENABLE,
- .card_ins_en_mask = PREG_IO_29_MASK,
- .card_ins_input_reg = CARD_GPIO_INPUT,
- .card_ins_input_mask = PREG_IO_29_MASK,
- .card_power_en_reg = CARD_GPIO_ENABLE,
- .card_power_en_mask = PREG_IO_31_MASK,
- .card_power_output_reg = CARD_GPIO_OUTPUT,
- .card_power_output_mask = PREG_IO_31_MASK,
- .card_power_en_lev = 0,
- .card_wp_en_reg = 0,
- .card_wp_en_mask = 0,
- .card_wp_input_reg = 0,
- .card_wp_input_mask = 0,
- .card_extern_init = 0,
- },
- [1] = {
- .name = "sdio_card",
- .work_mode = CARD_HW_MODE,
- .io_pad_type = SDHC_GPIOX_0_9,
- .card_ins_en_reg = 0,
- .card_ins_en_mask = 0,
- .card_ins_input_reg = 0,
- .card_ins_input_mask = 0,
- .card_power_en_reg = EGPIO_GPIOC_ENABLE,
- .card_power_en_mask = PREG_IO_7_MASK,
- .card_power_output_reg = EGPIO_GPIOC_OUTPUT,
- .card_power_output_mask = PREG_IO_7_MASK,
- .card_power_en_lev = 1,
- .card_wp_en_reg = 0,
- .card_wp_en_mask = 0,
- .card_wp_input_reg = 0,
- .card_wp_input_mask = 0,
- .card_extern_init = sdio_extern_init,
- },
- };
- static struct aml_card_platform meson_card_platform = {
- .card_num = ARRAY_SIZE(meson_card_info),
- .card_info = meson_card_info,
- };
- static struct platform_device meson_card_device = {
- .name = "AMLOGIC_CARD",
- .id = -1,
- .num_resources = ARRAY_SIZE(meson_card_resource),
- .resource = meson_card_resource,
- .dev = {
- .platform_data = &meson_card_platform,
- },
- };
- /**
- * Some Meson6 socket board has card detect issue.
- * Force card detect success for socket board.
- */
- static int meson_mmc_detect(void)
- {
- return 0;
- }
- #endif // CONFIG_CARDREADER
- /***********************************************************************
- * MMC SD Card Section
- **********************************************************************/
- #ifdef CONFIG_MMC_AML
- struct platform_device;
- struct mmc_host;
- struct mmc_card;
- struct mmc_ios;
- //return 1: no inserted 0: inserted
- static int aml_sdio_detect(struct aml_sd_host * host)
- {
- aml_set_reg32_mask(P_PREG_PAD_GPIO5_EN_N,1<<29);//CARD_6 input mode
- if((aml_read_reg32(P_PREG_PAD_GPIO5_I)&(1<<29)) == 0)
- return 0;
- else{ //for socket card box
- return 0;
- }
- return 1; //no insert.
- }
- static void cpu_sdio_pwr_prepare(unsigned port)
- {
- switch(port)
- {
- case MESON_SDIO_PORT_A:
- aml_clr_reg32_mask(P_PREG_PAD_GPIO4_EN_N,0x30f);
- aml_clr_reg32_mask(P_PREG_PAD_GPIO4_O ,0x30f);
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_8,0x3f);
- break;
- case MESON_SDIO_PORT_B:
- aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,0x3f<<23);
- aml_clr_reg32_mask(P_PREG_PAD_GPIO5_O ,0x3f<<23);
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,0x3f<<10);
- break;
- case MESON_SDIO_PORT_C:
- aml_clr_reg32_mask(P_PREG_PAD_GPIO3_EN_N,0xc0f);
- aml_clr_reg32_mask(P_PREG_PAD_GPIO3_O ,0xc0f);
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x3f<<24));
- break;
- case MESON_SDIO_PORT_XC_A:
- break;
- case MESON_SDIO_PORT_XC_B:
- break;
- case MESON_SDIO_PORT_XC_C:
- break;
- }
- }
- static int cpu_sdio_init(unsigned port)
- {
- switch(port)
- {
- case MESON_SDIO_PORT_A:
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_8,0x3d<<0);
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_8,0x1<<1);
- break;
- case MESON_SDIO_PORT_B:
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,0x3d<<10);
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,0x1<<11);
- break;
- case MESON_SDIO_PORT_C://SDIOC GPIOB_2~GPIOB_7
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,(0x1f<<22));
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x1f<<25));
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x1<<24));
- break;
- case MESON_SDIO_PORT_XC_A:
- #if 0
- //sdxc controller can't work
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_8,(0x3f<<0));
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_3,(0x0f<<27));
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_7,((0x3f<<18)|(0x7<<25)));
- //aml_set_reg32_mask(P_PERIPHS_PIN_MUX_5,(0x1f<<10));//data 8 bit
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_5,(0x1b<<10));//data 4 bit
- #endif
- break;
- case MESON_SDIO_PORT_XC_B:
- //sdxc controller can't work
- //aml_set_reg32_mask(P_PERIPHS_PIN_MUX_2,(0xf<<4));
- break;
- case MESON_SDIO_PORT_XC_C:
- #if 0
- //sdxc controller can't work
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_6,(0x3f<<24));
- aml_clr_reg32_mask(P_PERIPHS_PIN_MUX_2,((0x13<<22)|(0x3<<16)));
- aml_set_reg32_mask(P_PERIPHS_PIN_MUX_4,(0x1f<<26));
- printk(KERN_INFO "inand sdio xc-c init\n");
- #endif
- break;
- default:
- return -1;
- }
- return 0;
- }
- static void aml_sdio_pwr_prepare(unsigned port)
- {
- /// @todo NOT FINISH
- ///do nothing here
- cpu_sdio_pwr_prepare(port);
- }
- static void aml_sdio_pwr_on(unsigned port)
- {
- if((aml_read_reg32(P_PREG_PAD_GPIO5_O) & (1<<31)) != 0){
- aml_clr_reg32_mask(P_PREG_PAD_GPIO5_O,(1<<31));
- aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,(1<<31));
- udelay(1000);
- }
- /// @todo NOT FINISH
- }
- static void aml_sdio_pwr_off(unsigned port)
- {
- if((aml_read_reg32(P_PREG_PAD_GPIO5_O) & (1<<31)) == 0){
- aml_set_reg32_mask(P_PREG_PAD_GPIO5_O,(1<<31));
- aml_clr_reg32_mask(P_PREG_PAD_GPIO5_EN_N,(1<<31));//GPIOD13
- udelay(1000);
- }
- /// @todo NOT FINISH
- }
- static int aml_sdio_init(struct aml_sd_host * host)
- { //set pinumx ..
- aml_set_reg32_mask(P_PREG_PAD_GPIO5_EN_N,1<<29);//CARD_6
- cpu_sdio_init(host->sdio_port);
- host->clk = clk_get_sys("clk81",NULL);
- if(!IS_ERR(host->clk))
- host->clk_rate = clk_get_rate(host->clk);
- else
- host->clk_rate = 0;
- return 0;
- }
- static struct resource aml_mmc_resource[] = {
- [0] = {
- .start = 0x1200230, //physical address
- .end = 0x1200248,
- .flags = IORESOURCE_MEM, //0x200
- },
- };
- static u64 aml_mmc_device_dmamask = 0xffffffffUL;
- static struct aml_mmc_platform_data aml_mmc_def_platdata = {
- .no_wprotect = 1,
- .no_detect = 0,
- .wprotect_invert = 0,
- .detect_invert = 0,
- .use_dma = 0,
- .gpio_detect=1,
- .gpio_wprotect=0,
- .ocr_avail = MMC_VDD_33_34,
- .sdio_port = MESON_SDIO_PORT_B,
- .max_width = 4,
- .host_caps = (MMC_CAP_4_BIT_DATA |
- MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED | MMC_CAP_NEEDS_POLL),
- .f_min = 200000,
- .f_max = 40000000,
- .clock = 300000,
- .sdio_init = aml_sdio_init,
- .sdio_detect = aml_sdio_detect,
- .sdio_pwr_prepare = aml_sdio_pwr_prepare,
- .sdio_pwr_on = aml_sdio_pwr_on,
- .sdio_pwr_off = aml_sdio_pwr_off,
- };
- static struct platform_device aml_mmc_device = {
- .name = "aml_sd_mmc",
- .id = 0,
- .num_resources = ARRAY_SIZE(aml_mmc_resource),
- .resource = aml_mmc_resource,
- .dev = {
- .dma_mask = &aml_mmc_device_dmamask,
- .coherent_dma_mask = 0xffffffffUL,
- .platform_data = &aml_mmc_def_platdata,
- },
- };
- #endif //CONFIG_MMC_AML
- /***********************************************************************
- * IO Mapping
- **********************************************************************/
- /*
- #define IO_CBUS_BASE 0xf1100000 ///2M
- #define IO_AXI_BUS_BASE 0xf1300000 ///1M
- #define IO_PL310_BASE 0xf2200000 ///4k
- #define IO_PERIPH_BASE 0xf2300000 ///4k
- #define IO_APB_BUS_BASE 0xf3000000 ///8k
- #define IO_DOS_BUS_BASE 0xf3010000 ///64k
- #define IO_AOBUS_BASE 0xf3100000 ///1M
- #define IO_USB_A_BASE 0xf3240000 ///256k
- #define IO_USB_B_BASE 0xf32C0000 ///256k
- #define IO_WIFI_BASE 0xf3300000 ///1M
- #define IO_SATA_BASE 0xf3400000 ///64k
- #define IO_ETH_BASE 0xf3410000 ///64k
- #define IO_SPIMEM_BASE 0xf4000000 ///64M
- #define IO_A9_APB_BASE 0xf8000000 ///256k
- #define IO_DEMOD_APB_BASE 0xf8044000 ///112k
- #define IO_MALI_APB_BASE 0xf8060000 ///128k
- #define IO_APB2_BUS_BASE 0xf8000000
- #define IO_AHB_BASE 0xf9000000 ///128k
- #define IO_BOOTROM_BASE 0xf9040000 ///64k
- #define IO_SECBUS_BASE 0xfa000000
- #define IO_EFUSE_BASE 0xfa000000 ///4k
- */
- static __initdata struct map_desc meson_io_desc[] = {
- {
- .virtual = IO_CBUS_BASE,
- .pfn = __phys_to_pfn(IO_CBUS_PHY_BASE),
- .length = SZ_2M,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_AXI_BUS_BASE,
- .pfn = __phys_to_pfn(IO_AXI_BUS_PHY_BASE),
- .length = SZ_1M,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_PL310_BASE,
- .pfn = __phys_to_pfn(IO_PL310_PHY_BASE),
- .length = SZ_4K,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_PERIPH_BASE,
- .pfn = __phys_to_pfn(IO_PERIPH_PHY_BASE),
- .length = SZ_1M,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_APB_BUS_BASE,
- .pfn = __phys_to_pfn(IO_APB_BUS_PHY_BASE),
- .length = SZ_1M,
- .type = MT_DEVICE,
- } , /*{
- .virtual = IO_DOS_BUS_BASE,
- .pfn = __phys_to_pfn(IO_DOS_BUS_PHY_BASE),
- .length = SZ_64K,
- .type = MT_DEVICE,
- } , */{
- .virtual = IO_AOBUS_BASE,
- .pfn = __phys_to_pfn(IO_AOBUS_PHY_BASE),
- .length = SZ_1M,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_AHB_BUS_BASE,
- .pfn = __phys_to_pfn(IO_AHB_BUS_PHY_BASE),
- .length = SZ_8M,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_SPIMEM_BASE,
- .pfn = __phys_to_pfn(IO_SPIMEM_PHY_BASE),
- .length = SZ_64M,
- .type = MT_ROM,
- } , {
- .virtual = IO_APB2_BUS_BASE,
- .pfn = __phys_to_pfn(IO_APB2_BUS_PHY_BASE),
- .length = SZ_512K,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_AHB_BASE,
- .pfn = __phys_to_pfn(IO_AHB_PHY_BASE),
- .length = SZ_128K,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_BOOTROM_BASE,
- .pfn = __phys_to_pfn(IO_BOOTROM_PHY_BASE),
- .length = SZ_64K,
- .type = MT_DEVICE,
- } , {
- .virtual = IO_SECBUS_BASE,
- .pfn = __phys_to_pfn(IO_SECBUS_PHY_BASE),
- .length = SZ_4K,
- .type = MT_DEVICE,
- }, {
- .virtual = IO_SECURE_BASE,
- .pfn = __phys_to_pfn(IO_SECURE_PHY_BASE),
- .length = SZ_16K,
- .type = MT_DEVICE,
- }, {
- .virtual = PAGE_ALIGN(__phys_to_virt(RESERVED_MEM_START)),
- .pfn = __phys_to_pfn(RESERVED_MEM_START),
- .length = RESERVED_MEM_END - RESERVED_MEM_START + 1,
- .type = MT_MEMORY_NONCACHED,
- },
- #ifdef CONFIG_MESON_SUSPEND
- {
- .virtual = PAGE_ALIGN(__phys_to_virt(0x9ff00000)),
- .pfn = __phys_to_pfn(0x9ff00000),
- .length = SZ_1M,
- .type = MT_MEMORY_NONCACHED,
- },
- #endif
- };
- static void __init meson_map_io(void)
- {
- iotable_init(meson_io_desc, ARRAY_SIZE(meson_io_desc));
- }
- static void __init meson_fixup(struct machine_desc *mach, struct tag *tag, char **cmdline, struct meminfo *m)
- {
- struct membank *pbank;
- mach->video_start = RESERVED_MEM_START;
- mach->video_end = RESERVED_MEM_END;
- m->nr_banks = 0;
- pbank = &m->bank[m->nr_banks];
- pbank->start = PAGE_ALIGN(PHYS_MEM_START);
- pbank->size = SZ_64M & PAGE_MASK;
- m->nr_banks++;
- pbank = &m->bank[m->nr_banks];
- pbank->start = PAGE_ALIGN(RESERVED_MEM_END + 1);
- #ifdef CONFIG_MESON_SUSPEND
- pbank->size = (PHYS_MEM_END-RESERVED_MEM_END-SZ_1M) & PAGE_MASK;
- #else
- pbank->size = (PHYS_MEM_END-RESERVED_MEM_END) & PAGE_MASK;
- #endif
- m->nr_banks++;
- }
- /***********************************************************************
- *USB Setting section
- **********************************************************************/
- static void set_usb_a_vbus_power(char is_power_on)
- {
- //M6 SKT: GPIOD_9, OEN: 0x2012, OUT:0x2013 , Bit25
- #define USB_A_POW_GPIO PREG_EGPIO
- #define USB_A_POW_GPIO_BIT 25
- #define USB_A_POW_GPIO_BIT_ON 1
- #define USB_A_POW_GPIO_BIT_OFF 0
- if(is_power_on){
- printk( "set usb port power on (board gpio %d)!\n",USB_A_POW_GPIO_BIT);
- aml_set_reg32_bits(CBUS_REG_ADDR(0x2012),0,USB_A_POW_GPIO_BIT,1);//mode
- aml_set_reg32_bits(CBUS_REG_ADDR(0x2013),1,USB_A_POW_GPIO_BIT,1);//out
- //set_gpio_mode(USB_A_POW_GPIO,USB_A_POW_GPIO_BIT,GPIO_OUTPUT_MODE);
- //set_gpio_val(USB_A_POW_GPIO,USB_A_POW_GPIO_BIT,USB_A_POW_GPIO_BIT_ON);
- }
- else {
- printk("set usb port power off (board gpio %d)!\n",USB_A_POW_GPIO_BIT);
- aml_set_reg32_bits(CBUS_REG_ADDR(0x2012),0,USB_A_POW_GPIO_BIT,1);//mode
- aml_set_reg32_bits(CBUS_REG_ADDR(0x2013),0,USB_A_POW_GPIO_BIT,1);//out
- }
- }
- static int __init setup_usb_devices(void)
- {
- struct lm_device * usb_ld_a, *usb_ld_b;
- usb_ld_a = alloc_usb_lm_device(USB_PORT_IDX_A);
- usb_ld_b = alloc_usb_lm_device (USB_PORT_IDX_B);
- usb_ld_a->param.usb.set_vbus_power = set_usb_a_vbus_power;
- #ifdef CONFIG_SMP
- usb_ld_a->param.usb.port_type = USB_PORT_TYPE_HOST;
- #endif
- lm_device_register(usb_ld_a);
- lm_device_register(usb_ld_b);
- return 0;
- }
- /***********************************************************************/
- #ifdef CONFIG_EFUSE
- static bool efuse_data_verify(unsigned char *usid)
- { int len;
- len = strlen(usid);
- if((len > 0)&&(len<58) )
- return true;
- else
- return false;
- }
- static struct efuse_platform_data aml_efuse_plat = {
- .pos = 454,
- .count = 58,
- .data_verify = efuse_data_verify,
- };
- static struct platform_device aml_efuse_device = {
- .name = "efuse",
- .id = -1,
- .dev = {
- .platform_data = &aml_efuse_plat,
- },
- };
- // BSP EFUSE layout setting
- static efuseinfo_item_t aml_efuse_setting[] = {
- // usid layout can be defined by customer
- {
- .title = "usid",
- .id = EFUSE_USID_ID,
- .offset = 454, // customer can modify the offset which must >= 454
- .enc_len = 58, // customer can modify the encode length by self must <=58
- .data_len = 58, // customer can modify the data length by self must <=58
- .bch_en = 0, // customer can modify do bch or not
- .bch_reverse = 0,
- },
- // customer also can add new EFUSE item to expand, but must be correct and bo conflict
- };
- static int aml_efuse_getinfoex_byID(unsigned param, efuseinfo_item_t *info)
- {
- unsigned num = sizeof(aml_efuse_setting)/sizeof(efuseinfo_item_t);
- int i=0;
- int ret = -1;
- for(i=0; i<num; i++){
- if(aml_efuse_setting[i].id == param){
- strcpy(info->title, aml_efuse_setting[i].title);
- info->offset = aml_efuse_setting[i].offset;
- info->id = aml_efuse_setting[i].id;
- info->data_len = aml_efuse_setting[i].data_len;
- info->enc_len = aml_efuse_setting[i].enc_len;
- info->bch_en = aml_efuse_setting[i].bch_en;
- info->bch_reverse = aml_efuse_setting[i].bch_reverse;
- ret = 0;
- break;
- }
- }
- return ret;
- }
- static int aml_efuse_getinfoex_byPos(unsigned param, efuseinfo_item_t *info)
- {
- unsigned num = sizeof(aml_efuse_setting)/sizeof(efuseinfo_item_t);
- int i=0;
- int ret = -1;
- for(i=0; i<num; i++){
- if(aml_efuse_setting[i].offset == param){
- strcpy(info->title, aml_efuse_setting[i].title);
- info->offset = aml_efuse_setting[i].offset;
- info->id = aml_efuse_setting[i].id;
- info->data_len = aml_efuse_setting[i].data_len;
- info->enc_len = aml_efuse_setting[i].enc_len;
- info->bch_en = aml_efuse_setting[i].bch_en;
- info->bch_reverse = aml_efuse_setting[i].bch_reverse;
- ret = 0;
- break;
- }
- }
- return ret;
- }
- extern pfn efuse_getinfoex;
- extern pfn efuse_getinfoex_byPos;
- static setup_aml_efuse()
- {
- efuse_getinfoex = aml_efuse_getinfoex_byID;
- efuse_getinfoex_byPos = aml_efuse_getinfoex_byPos;
- }
- #endif
- #if defined(CONFIG_AML_RTC)
- static struct platform_device aml_rtc_device = {
- .name = "aml_rtc",
- .id = -1,
- };
- #endif
- #if defined(CONFIG_SUSPEND)
- static void m6ref_set_vccx2(int power_on)
- {
- if (power_on) {
- //restore_pinmux();
- printk(KERN_INFO "%s() Power ON\n", __FUNCTION__);
- aml_clr_reg32_mask(P_PREG_PAD_GPIO0_EN_N,(1<<26));
- aml_clr_reg32_mask(P_PREG_PAD_GPIO0_O,(1<<26));
- }
- else {
- printk(KERN_INFO "%s() Power OFF\n", __FUNCTION__);
- aml_clr_reg32_mask(P_PREG_PAD_GPIO0_EN_N,(1<<26));
- aml_set_reg32_mask(P_PREG_PAD_GPIO0_O,(1<<26));
- //save_pinmux();
- }
- }
- static struct meson_pm_config aml_pm_pdata = {
- .pctl_reg_base = (void *)IO_APB_BUS_BASE,
- .mmc_reg_base = (void *)APB_REG_ADDR(0x1000),
- .hiu_reg_base = (void *)CBUS_REG_ADDR(0x1000),
- .power_key = (1<<8),
- .ddr_clk = 0x00110820,
- .sleepcount = 128,
- .set_vccx2 = m6ref_set_vccx2,
- .core_voltage_adjust = 7, //5,8
- };
- static struct platform_device aml_pm_device = {
- .name = "pm-meson",
- .dev = {
- .platform_data = &aml_pm_pdata,
- },
- .id = -1,
- };
- #endif
- #ifdef CONFIG_SARADC_AM
- #include <linux/saradc.h>
- static struct platform_device saradc_device = {
- .name = "saradc",
- .id = 0,
- .dev = {
- .platform_data = NULL,
- },
- };
- #endif
- #if defined(CONFIG_ADC_KEYPADS_AM)||defined(CONFIG_ADC_KEYPADS_AM_MODULE)
- #include <linux/input.h>
- #include <linux/adc_keypad.h>
- static struct adc_key adc_kp_key[] = {
- {KEY_VOLUMEDOWN, "vol-", CHAN_4, 150, 40},
- {KEY_VOLUMEUP, "vol+", CHAN_4, 275, 40},
- };
- static struct adc_kp_platform_data adc_kp_pdata = {
- .key = &adc_kp_key[0],
- .key_num = ARRAY_SIZE(adc_kp_key),
- };
- static struct platform_device adc_kp_device = {
- .name = "m1-adckp",
- .id = 0,
- .num_resources = 0,
- .resource = NULL,
- .dev = {
- .platform_data = &adc_kp_pdata,
- }
- };
- #endif
- /***********************************************************************
- * Power Key Section
- **********************************************************************/
- #if defined(CONFIG_KEY_INPUT_CUSTOM_AM) || defined(CONFIG_KEY_INPUT_CUSTOM_AM_MODULE)
- #include <linux/input.h>
- #include <linux/input/key_input.h>
- static int _key_code_list[] = {KEY_POWER};
- static inline int key_input_init_func(void)
- {
- WRITE_AOBUS_REG(AO_RTC_ADDR0, (READ_AOBUS_REG(AO_RTC_ADDR0) &~(1<<11)));
- WRITE_AOBUS_REG(AO_RTC_ADDR1, (READ_AOBUS_REG(AO_RTC_ADDR1) &~(1<<3)));
- return 0;
- }
- static inline int key_scan(void* data)
- {
- int *key_state_list = (int*)data;
- int ret = 0;
- key_state_list[0] = ((READ_AOBUS_REG(AO_RTC_ADDR1) >> 2) & 1) ? 0 : 1;
- return ret;
- }
- static struct key_input_platform_data key_input_pdata = {
- .scan_period = 20,
- .fuzz_time = 60,
- .key_code_list = &_key_code_list[0],
- .key_num = ARRAY_SIZE(_key_code_list),
- .scan_func = key_scan,
- .init_func = key_input_init_func,
- .config = 0,
- };
- static struct platform_device input_device_key = {
- .name = "meson-keyinput",
- .id = 0,
- .num_resources = 0,
- .resource = NULL,
- .dev = {
- .platform_data = &key_input_pdata,
- }
- };
- #endif
- /***********************************************************************
- * Audio section
- **********************************************************************/
- static struct resource aml_m6_audio_resource[] = {
- [0] = {
- .start = 0,
- .end = 0,
- .flags = IORESOURCE_MEM,
- },
- };
- static struct platform_device aml_audio = {
- .name = "aml-audio",
- .id = 0,
- };
- static struct platform_device aml_audio_dai = {
- .name = "aml-dai",
- .id = 0,
- };
- #if defined(CONFIG_SND_SOC_DUMMY_CODEC)
- static pinmux_item_t dummy_codec_pinmux[] = {
- /* I2S_MCLK I2S_BCLK I2S_LRCLK I2S_DOUT */
- {
- .reg = PINMUX_REG(9),
- .setmask = (1 << 7) | (1 << 5) | (1 << 9) | (1 << 4),
- .clrmask = (7 << 19) | (7 << 1) | (3 << 10) | (1 << 6),
- },
- {
- .reg = PINMUX_REG(8),
- .clrmask = (0x7f << 24),
- },
- PINMUX_END_ITEM
- };
- static pinmux_set_t dummy_codec_pinmux_set = {
- .chip_select = NULL,
- .pinmux = &dummy_codec_pinmux[0],
- };
- static void dummy_codec_device_init(void)
- {
- /* audio pinmux */
- pinmux_set(&dummy_codec_pinmux_set);
- }
- static void dummy_codec_device_deinit(void)
- {
- pinmux_clr(&dummy_codec_pinmux_set);
- }
- static struct dummy_codec_platform_data dummy_codec_pdata = {
- .device_init = dummy_codec_device_init,
- .device_uninit = dummy_codec_device_deinit,
- };
- static struct platform_device aml_dummy_codec_audio = {
- .name = "aml_dummy_codec_audio",
- .id = 0,
- .resource = aml_m6_audio_resource,
- .num_resources = ARRAY_SIZE(aml_m6_audio_resource),
- .dev = {
- .platform_data = &dummy_codec_pdata,
- },
- };
- static struct platform_device aml_dummy_codec = {
- .name = "dummy_codec",
- .id = 0,
- };
- #endif
- /***********************************************************************
- * Device Register Section
- **********************************************************************/
- static struct platform_device *platform_devs[] = {
- #if defined(CONFIG_I2C_AML) || defined(CONFIG_I2C_HW_AML)
- &aml_i2c_device_a,
- &aml_i2c_device_b,
- &aml_i2c_device_ao,
- #endif
- &aml_uart_device,
- &meson_device_fb,
- &meson_device_vout,
- #ifdef CONFIG_AM_STREAMING
- &meson_device_codec,
- #endif
- #if defined(CONFIG_AM_NAND)
- &aml_nand_device,
- #endif
- #ifdef CONFIG_SARADC_AM
- &saradc_device,
- #endif
- #if defined(CONFIG_ADC_KEYPADS_AM)||defined(CONFIG_ADC_KEYPADS_AM_MODULE)
- &adc_kp_device,
- #endif
- #if defined(CONFIG_KEY_INPUT_CUSTOM_AM) || defined(CONFIG_KEY_INPUT_CUSTOM_AM_MODULE)
- &input_device_key,
- #endif
- #if defined(CONFIG_CARDREADER)
- &meson_card_device,
- #endif // CONFIG_CARDREADER
- #if defined(CONFIG_MMC_AML)
- &aml_mmc_device,
- #endif
- #if defined(CONFIG_SUSPEND)
- &aml_pm_device,
- #endif
- #ifdef CONFIG_EFUSE
- &aml_efuse_device,
- #endif
- #if defined(CONFIG_AML_RTC)
- &aml_rtc_device,
- #endif
- &aml_audio,
- &aml_audio_dai,
- #if defined(CONFIG_SND_SOC_DUMMY_CODEC)
- &aml_dummy_codec_audio,
- &aml_dummy_codec,
- #endif
- #ifdef CONFIG_AM_REMOTE
- &meson_device_remote,
- #endif
- };
- static __init void meson_init_machine(void)
- {
- // meson_cache_init();
- /**
- * Meson6 socket board ONLY
- * Do *NOT* merge for other BSP
- */
- #if defined(CONFIG_CARDREADER)
- {
- extern int (*sd_mmc_ins_register) (void);
- sd_mmc_ins_register = meson_mmc_detect;
- }
- #endif // CONFIG_CARDREADER
- #ifdef CONFIG_AM_REMOTE
- setup_remote_device();
- #endif
- #ifdef CONFIG_EFUSE
- setup_aml_efuse();
- #endif
- setup_usb_devices();
- setup_devices_resource();
- platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
- #if defined(CONFIG_SUSPEND)
- {//todo: remove it after verified. need set it in uboot environment variable.
- extern int console_suspend_enabled;
- console_suspend_enabled = 0;
- }
- #endif
- #ifdef CONFIG_AM_LCD_OUTPUT
- m6skt_lcd_init();
- #endif
- }
- static __init void meson_init_early(void)
- {///boot seq 1
- }
- MACHINE_START(MESON6_SKT, "Amlogic Meson6 socket board")
- .boot_params = BOOT_PARAMS_OFFSET,
- .map_io = meson_map_io,///2
- .init_early = meson_init_early,///3
- .init_irq = meson_init_irq,///0
- .timer = &meson_sys_timer,
- .init_machine = meson_init_machine,
- .fixup = meson_fixup,///1
- MACHINE_END
|