1 /* linux/arch/arm/mach-rk2818/board-phonesdk.c
3 * Copyright (C) 2010 ROCKCHIP, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/platform_device.h>
19 #include <linux/input.h>
21 #include <linux/delay.h>
22 #include <linux/i2c.h>
23 #include <linux/spi/spi.h>
24 #include <linux/mmc/host.h>
25 #include <linux/circ_buf.h>
26 #include <linux/miscdevice.h>
27 #include <linux/usb/android_composite.h>
29 #include <mach/hardware.h>
30 #include <asm/mach-types.h>
31 #include <asm/mach/arch.h>
32 #include <asm/mach/map.h>
33 #include <asm/mach/flash.h>
35 #include <mach/irqs.h>
36 #include <mach/board.h>
37 #include <mach/rk2818_iomap.h>
38 #include <mach/iomux.h>
39 #include <mach/gpio.h>
40 #include <mach/spi_fpga.h>
41 #include <mach/rk2818_camera.h> /* ddl@rock-chips.com : camera support */
42 #include <linux/pda_power.h>
43 #include <linux/regulator/charge-regulator.h>
44 #include <linux/regulator/machine.h>
45 #include <linux/usb/gpio_vbus.h>
46 #include <mach/rk2818_nand.h>
48 #include <linux/mtd/nand.h>
49 #include <linux/mtd/partitions.h>
50 #include <linux/dm9000.h>
51 #include <linux/capella_cm3602.h>
53 #include <media/soc_camera.h> /* ddl@rock-chips.com : camera support */
58 #include "../../../drivers/spi/rk2818_spim.h"
59 #include <linux/regulator/rk2818_lp8725.h>
60 #include "../../../drivers/input/touchscreen/xpt2046_ts.h"
61 #include "../../../drivers/staging/android/timed_gpio.h"
62 #include "../../../sound/soc/codecs/wm8994.h"
63 #include "../../../drivers/headset_observe/rk2818_headset.h"
64 #include <mach/rk2818-socpm.h>
67 /* --------------------------------------------------------------------
68 * ÉùÃ÷ÁËrk2818_gpioBankÊý×飬²¢¶¨ÒåÁËGPIO¼Ä´æÆ÷×éIDºÍ¼Ä´æÆ÷»ùµØÖ·¡£
69 * -------------------------------------------------------------------- */
71 static struct rk2818_gpio_bank rk2818_gpioBank[] = {
74 .offset = RK2818_GPIO0_BASE,
79 .offset = RK2818_GPIO0_BASE,
84 .offset = RK2818_GPIO0_BASE,
89 .offset = RK2818_GPIO0_BASE,
94 .offset = RK2818_GPIO1_BASE,
99 .offset = RK2818_GPIO1_BASE,
103 .id = RK2818_ID_PIOG,
104 .offset = RK2818_GPIO1_BASE,
108 .id = RK2818_ID_PIOH,
109 .offset = RK2818_GPIO1_BASE,
114 //IOÓ³É䷽ʽÃèÊö £¬Ã¿¸öΪһ¶ÎÏßÐÔÁ¬ÐøÓ³Éä
115 static struct map_desc rk2818_io_desc[] __initdata = {
118 .virtual = RK2818_MCDMA_BASE, //ÐéÄâµØÖ·
119 .pfn = __phys_to_pfn(RK2818_MCDMA_PHYS), //ÎïÀíµØÖ·£¬ÐëÓëÒ³±í¶ÔÆë
120 .length = RK2818_MCDMA_SIZE, //³¤¶È
121 .type = MT_DEVICE //Ó³É䷽ʽ
125 .virtual = RK2818_DWDMA_BASE,
126 .pfn = __phys_to_pfn(RK2818_DWDMA_PHYS),
127 .length = RK2818_DWDMA_SIZE,
132 .virtual = RK2818_INTC_BASE,
133 .pfn = __phys_to_pfn(RK2818_INTC_PHYS),
134 .length = RK2818_INTC_SIZE,
139 .virtual = RK2818_NANDC_BASE,
140 .pfn = __phys_to_pfn(RK2818_NANDC_PHYS),
141 .length = RK2818_NANDC_SIZE,
146 .virtual = RK2818_SDRAMC_BASE,
147 .pfn = __phys_to_pfn(RK2818_SDRAMC_PHYS),
148 .length = RK2818_SDRAMC_SIZE,
153 .virtual = RK2818_ARMDARBITER_BASE,
154 .pfn = __phys_to_pfn(RK2818_ARMDARBITER_PHYS),
155 .length = RK2818_ARMDARBITER_SIZE,
160 .virtual = RK2818_APB_BASE,
161 .pfn = __phys_to_pfn(RK2818_APB_PHYS),
167 .virtual = RK2818_WDT_BASE,
168 .pfn = __phys_to_pfn(RK2818_WDT_PHYS),
169 .length = 0xa0000, ///apb bus i2s i2c spi no map in this
174 /*****************************************************************************************
176 * author: kfx@rock-chips.com
177 *****************************************************************************************/
178 static int rk2818_sdmmc0_io_init(void)
180 rk2818_mux_api_set(GPIOH_MMC0D_SEL_NAME, IOMUXA_SDMMC0_DATA123);
181 rk2818_mux_api_set(GPIOH_MMC0_SEL_NAME, IOMUXA_SDMMC0_CMD_DATA0_CLKOUT);
186 static int rk2818_sdmmc1_io_init(void)
188 rk2818_mux_api_set(GPIOG_MMC1_SEL_NAME, IOMUXA_SDMMC1_CMD_DATA0_CLKOUT);
189 rk2818_mux_api_set(GPIOG_MMC1D_SEL_NAME, IOMUXA_SDMMC1_DATA123);
193 #define CONFIG_SDMMC0_USE_DMA
194 #define CONFIG_SDMMC1_USE_DMA
195 struct rk2818_sdmmc_platform_data default_sdmmc0_data = {
196 .host_ocr_avail = (MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
197 MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33|
198 MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),
199 .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
200 .io_init = rk2818_sdmmc0_io_init,
202 .dma_name = "sd_mmc",
203 #ifdef CONFIG_SDMMC0_USE_DMA
210 static int raho_wifi_status(struct device *dev);
211 static int raho_wifi_status_register(void (*callback)(int card_presend, void *dev_id), void *dev_id);
212 struct rk2818_sdmmc_platform_data default_sdmmc1_data = {
213 .host_ocr_avail = (MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|
214 MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|
215 MMC_VDD_32_33|MMC_VDD_33_34),
216 .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ|
217 MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
218 .io_init = rk2818_sdmmc1_io_init,
221 #ifdef CONFIG_SDMMC1_USE_DMA
226 .status = raho_wifi_status,
227 .register_status_notify = raho_wifi_status_register,
230 static int raho_wifi_cd; /* wifi virtual 'card detect' status */
231 static void (*wifi_status_cb)(int card_present, void *dev_id);
232 static void *wifi_status_cb_devid;
234 static int raho_wifi_status(struct device *dev)
239 static int raho_wifi_status_register(void (*callback)(int card_present, void *dev_id), void *dev_id)
243 wifi_status_cb = callback;
244 wifi_status_cb_devid = dev_id;
248 #define RAHO_WIFI_GPIO_POWER_N FPGA_PIO1_06
249 #define RAHO_WIFI_GPIO_RESET_N FPGA_PIO1_03
251 int raho_wifi_power_state = 0;
252 int raho_bt_power_state = 0;
254 static int raho_wifi_power(int on)
256 pr_info("%s: %d\n", __func__, on);
258 gpio_set_value(RAHO_WIFI_GPIO_POWER_N, on);
260 pr_info("wifi turn on power\n");
262 if (!raho_bt_power_state){
263 gpio_set_value(RAHO_WIFI_GPIO_POWER_N, on);
265 pr_info("wifi shut off power\n");
268 pr_info("wifi shouldn't shut off power, bt is using it!\n");
273 raho_wifi_power_state = on;
277 static int raho_wifi_reset_state;
278 static int raho_wifi_reset(int on)
280 pr_info("%s: %d\n", __func__, on);
281 gpio_set_value(RAHO_WIFI_GPIO_RESET_N, on);
283 raho_wifi_reset_state = on;
287 static int raho_wifi_set_carddetect(int val)
289 pr_info("%s:%d\n", __func__, val);
292 wifi_status_cb(val, wifi_status_cb_devid);
294 pr_warning("%s, nobody to notify\n", __func__);
299 static struct wifi_platform_data raho_wifi_control = {
300 .set_power = raho_wifi_power,
301 .set_reset = raho_wifi_reset,
302 .set_carddetect = raho_wifi_set_carddetect,
304 static struct platform_device raho_wifi_device = {
305 .name = "bcm4329_wlan",
308 .platform_data = &raho_wifi_control,
312 /* bluetooth rfkill device */
313 static struct platform_device raho_rfkill = {
314 .name = "raho_rfkill",
318 /*****************************************************************************************
319 * extern gpio devices
320 * author: xxx@rock-chips.com
321 *****************************************************************************************/
322 #if defined (CONFIG_GPIO_PCA9554)
323 struct rk2818_gpio_expander_info extern_gpio_settinginfo[] = {
325 .gpio_num =RK2818_PIN_PI0,
327 //.pin_value =GPIO_HIGH,
331 .gpio_num =RK2818_PIN_PI4,// tp3
333 //.pin_value =GPIO_HIGH,
337 .gpio_num =RK2818_PIN_PI5,//tp4
339 //.pin_value =GPIO_HIGH,
342 .gpio_num =RK2818_PIN_PI6,//tp2
343 .pin_type = GPIO_OUT,
344 //.pin_value =GPIO_HIGH,
347 .gpio_num =RK2818_PIN_PI7,//tp1
348 .pin_type = GPIO_OUT,
349 .pin_value =GPIO_HIGH,
356 struct pca9554_platform_data rk2818_pca9554_data={
357 .gpio_base=GPIO_EXPANDER_BASE,
358 .gpio_pin_num=CONFIG_EXPANDED_GPIO_NUM,
359 .gpio_irq_start=NR_AIC_IRQS + 2*NUM_GROUP,
360 .irq_pin_num=CONFIG_EXPANDED_GPIO_IRQ_NUM,
361 .pca9954_irq_pin=RK2818_PIN_PE2,
362 .settinginfo=extern_gpio_settinginfo,
363 .settinginfolen=ARRAY_SIZE(extern_gpio_settinginfo),
367 /*****************************************************************************************
368 *regulator devices drivers/regulator/rk2818_lp8725.c linux/regulator/rk2818_lp8725.h
370 *****************************************************************************************/
371 #if defined (CONFIG_RK2818_REGULATOR_LP8725)
372 /*ldo1 2V8OUT USB2.5V LCD_VCC*/
373 static struct regulator_consumer_supply ldo1_consumers[] = {
379 static struct regulator_init_data rk2818_lp8725_ldo1_data = {
385 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
387 .num_consumer_supplies = ARRAY_SIZE(ldo1_consumers),
388 .consumer_supplies = ldo1_consumers,
391 /*ldo2 CAMERA_1V8 SD_CARD*/
392 static struct regulator_consumer_supply ldo2_consumers[] = {
398 static struct regulator_init_data rk2818_lp8725_ldo2_data = {
404 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
406 .num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
407 .consumer_supplies = ldo2_consumers,
410 /*ldo3 VCC_NAND WIFI/BT/FM_BCM4325*/
411 static struct regulator_consumer_supply ldo3_consumers[] = {
417 static struct regulator_init_data rk2818_lp8725_ldo3_data = {
423 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
425 .num_consumer_supplies = ARRAY_SIZE(ldo3_consumers),
426 .consumer_supplies = ldo3_consumers,
429 /*ldo4 VCCA CODEC_WM8994*/
430 static struct regulator_consumer_supply ldo4_consumers[] = {
436 static struct regulator_init_data rk2818_lp8725_ldo4_data = {
442 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
444 .num_consumer_supplies = ARRAY_SIZE(ldo4_consumers),
445 .consumer_supplies = ldo4_consumers,
448 /*ldo5 AVDD18 CODEC_WM8994*/
449 static struct regulator_consumer_supply ldo5_consumers[] = {
455 static struct regulator_init_data rk2818_lp8725_ldo5_data = {
461 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
463 .num_consumer_supplies = ARRAY_SIZE(ldo5_consumers),
464 .consumer_supplies = ldo5_consumers,
467 /*lilo1 VCCIO Sensor£¨3M£©*/
468 static struct regulator_consumer_supply lilo1_consumers[] = {
474 static struct regulator_init_data rk2818_lp8725_lilo1_data = {
480 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
482 .num_consumer_supplies = ARRAY_SIZE(lilo1_consumers),
483 .consumer_supplies = lilo1_consumers
486 /*lilo2 VCC33_SD Sensor£¨3M£©*/
487 static struct regulator_consumer_supply lilo2_consumers[] = {
493 static struct regulator_init_data rk2818_lp8725_lilo2_data = {
499 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
501 .num_consumer_supplies = ARRAY_SIZE(lilo2_consumers),
502 .consumer_supplies = lilo2_consumers
506 static struct regulator_consumer_supply buck1_consumers[] = {
512 static struct regulator_init_data rk2818_lp8725_buck1_data = {
519 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE,
520 .valid_modes_mask = REGULATOR_MODE_IDLE | REGULATOR_MODE_NORMAL,
522 .num_consumer_supplies = ARRAY_SIZE(buck1_consumers),
523 .consumer_supplies = buck1_consumers
526 /*buck2 VDDDR MobileDDR VCC*/
527 static struct regulator_consumer_supply buck2_consumers[] = {
533 static struct regulator_init_data rk2818_lp8725_buck2_data = {
540 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
542 .num_consumer_supplies = ARRAY_SIZE(buck2_consumers),
543 .consumer_supplies = buck2_consumers
546 /*buck1_v2 VDD12 Core*/
547 static struct regulator_consumer_supply buck1_v2_consumers[] = {
549 .supply = "vdd12_v2",
553 static struct regulator_init_data rk2818_lp8725_buck1_v2_data = {
560 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_MODE,
562 .num_consumer_supplies = ARRAY_SIZE(buck1_v2_consumers),
563 .consumer_supplies = buck1_v2_consumers
566 /*buck2_v2 VDDDR MobileDDR VCC*/
567 static struct regulator_consumer_supply buck2_v2_consumers[] = {
569 .supply = "vccdr_v2",
573 static struct regulator_init_data rk2818_lp8725_buck2_v2_data = {
580 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
582 .num_consumer_supplies = ARRAY_SIZE(buck2_v2_consumers),
583 .consumer_supplies = buck2_v2_consumers
586 struct lp8725_regulator_subdev rk2818_lp8725_regulator_subdev[] = {
589 .initdata=&rk2818_lp8725_ldo1_data,
594 .initdata=&rk2818_lp8725_ldo2_data,
599 .initdata=&rk2818_lp8725_ldo3_data,
604 .initdata=&rk2818_lp8725_ldo4_data,
609 .initdata=&rk2818_lp8725_ldo5_data,
614 .initdata=&rk2818_lp8725_lilo1_data,
619 .initdata=&rk2818_lp8725_lilo2_data,
624 .initdata=&rk2818_lp8725_buck1_data,
629 .initdata=&rk2818_lp8725_buck2_data,
633 .initdata=&rk2818_lp8725_buck1_v2_data,
638 .initdata=&rk2818_lp8725_buck2_v2_data,
642 struct lp8725_platform_data rk2818_lp8725_data={
643 .num_regulators=LP8725_NUM_REGULATORS,
644 .regulators=rk2818_lp8725_regulator_subdev,
648 /*****************************************************************************************
650 *****************************************************************************************/
651 #define GS_IRQ_PIN RK2818_PIN_PE3
653 struct rk2818_gs_platform_data rk2818_gs_platdata = {
654 .gsensor_irq_pin = GS_IRQ_PIN,
658 /*****************************************************************************************
660 * author: cjq@rock-chips.com
661 *****************************************************************************************/
662 static struct wm8994_platform_data wm8994_data = {
670 .headset_call_vol = 0,
671 .speaker_call_vol = 0,
672 .earpiece_call_vol = 0,
676 /*****************************************************************************************
678 * author: kfx@rock-chips.com
679 *****************************************************************************************/
680 static int rk2818_i2c0_io_init(void)
682 rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0);
686 static int rk2818_i2c1_io_init(void)
688 rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1);
692 struct rk2818_i2c_platform_data default_i2c0_data = {
696 .scl_rate = 400*1000,
697 .mode = I2C_MODE_IRQ, //I2C_MODE_POLL
698 .io_init = rk2818_i2c0_io_init,
700 struct rk2818_i2c_platform_data default_i2c1_data = {
701 #ifdef CONFIG_I2C0_RK2818
708 .scl_rate = 400*1000,
709 .mode = I2C_MODE_POLL, //I2C_MODE_POLL
710 .io_init = rk2818_i2c1_io_init,
713 struct rk2818_i2c_spi_data default_i2c2_data = {
717 .scl_rate = 400*1000,
720 struct rk2818_i2c_spi_data default_i2c3_data = {
725 .scl_rate = 400*1000,
728 static struct i2c_board_info __initdata board_i2c0_devices[] = {
729 #if defined (CONFIG_RK1000_CONTROL)
731 .type = "rk1000_control",
737 #if defined (CONFIG_RK1000_TVOUT)
739 .type = "rk1000_tvout",
744 #if defined (CONFIG_SND_SOC_RK1000)
746 .type = "rk1000_i2c_codec",
751 #if defined (CONFIG_SND_SOC_WM8988)
758 #if defined (CONFIG_TOUCHSCREEN_IT7250) //add by robert for ctp_it7250
760 .type = "Ctp_it7250",
763 .irq = RK2818_PIN_PE1,
767 static struct i2c_board_info __initdata board_i2c1_devices[] = {
768 #if defined (CONFIG_RTC_HYM8563)
770 .type = "rtc_hym8563",
775 #if defined (CONFIG_RTC_DRV_S35392A)
777 .type = "rtc-s35392a",
780 .irq = RK2818_PIN_PE2,
783 #if defined (CONFIG_FM_QN8006)
790 #if defined (CONFIG_GPIO_PCA9554)
792 .type = "extend_gpio_pca9554",
795 .platform_data=&rk2818_pca9554_data.gpio_base,
798 #if defined (CONFIG_RK2818_REGULATOR_LP8725)
803 .platform_data=&rk2818_lp8725_data,
806 #if defined (CONFIG_GS_MMA7660)
808 .type = "gs_mma7660",
812 .platform_data = &rk2818_gs_platdata,
818 static struct i2c_board_info __initdata board_i2c2_devices[] = {
822 static struct i2c_board_info __initdata board_i2c3_devices[] = {
823 #if defined (CONFIG_SND_SOC_WM8994)
828 .platform_data = &wm8994_data,
837 static int power_supply_init(struct device *dev)
839 return gpio_request(FPGA_PIO2_08, "AC charger detect");
842 static int rk2818_is_ac_online(void)
844 return !gpio_get_value(FPGA_PIO2_08);
847 static void power_supply_exit(struct device *dev)
849 gpio_free(FPGA_PIO2_08);
852 static char *rk2818_supplicant[] = {
856 static struct pda_power_pdata power_supply_info = {
857 .init = power_supply_init,
858 .is_ac_online = rk2818_is_ac_online,
859 .exit = power_supply_exit,
860 .supplied_to = rk2818_supplicant,
861 .num_supplicants = ARRAY_SIZE(rk2818_supplicant),
864 static struct resource power_supply_resources[] = {
867 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
868 IORESOURCE_IRQ_LOWEDGE,
872 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
873 IORESOURCE_IRQ_LOWEDGE,
877 static struct platform_device power_supply = {
881 .platform_data = &power_supply_info,
883 .resource = power_supply_resources,
884 .num_resources = ARRAY_SIZE(power_supply_resources),
891 static struct resource gpio_vbus_resource = {
892 .flags = IORESOURCE_IRQ,
897 static struct gpio_vbus_mach_info gpio_vbus_info = {
898 .gpio_vbus = FPGA_PIO4_06,
901 static struct platform_device gpio_vbus = {
905 .resource = &gpio_vbus_resource,
907 .platform_data = &gpio_vbus_info,
915 static struct regulator_consumer_supply rk2818_consumers[] = {
917 .dev=&rk2818_device_battery.dev,
921 .dev = &gpio_vbus.dev,
922 .supply = "vbus_draw",
925 .dev = &power_supply.dev,
930 static struct regulator_init_data charge_init_data = {
933 .valid_ops_mask = REGULATOR_CHANGE_CURRENT,
935 .num_consumer_supplies = ARRAY_SIZE(rk2818_consumers),
936 .consumer_supplies = rk2818_consumers,
939 static struct charge_platform_data charge_current_info = {
940 .gpio_charge = FPGA_PIO2_08,
941 .init_data = &charge_init_data,
944 static struct platform_device charge_current = {
945 .name = "charge-regulator",
948 .platform_data = &charge_current_info,
952 /*****************************************************************************************
954 * author: ddl@rock-chips.com
955 *****************************************************************************************/
956 #ifdef CONFIG_VIDEO_RK2818
957 /* Board-raho camera configuration */
958 #define SENSOR_NAME_0 RK28_CAM_SENSOR_NAME_OV2655
959 #define SENSOR_IIC_ADDR_0 0x60
960 #define SENSOR_IIC_ADAPTER_ID_0 2
961 #define SENSOR_POWER_PIN_0 FPGA_PIO1_05
962 #define SENSOR_RESET_PIN_0 FPGA_PIO1_14
963 #define SENSOR_POWERACTIVE_LEVEL_0 RK28_CAM_POWERACTIVE_L
964 #define SENSOR_RESETACTIVE_LEVEL_0 RK28_CAM_RESETACTIVE_L
967 #define SENSOR_NAME_1 NULL
968 #define SENSOR_IIC_ADDR_1 0x00
969 #define SENSOR_IIC_ADAPTER_ID_1 0xff
970 #define SENSOR_POWER_PIN_1 INVALID_GPIO
971 #define SENSOR_RESET_PIN_1 INVALID_GPIO
972 #define SENSOR_POWERACTIVE_LEVEL_1 RK28_CAM_POWERACTIVE_L
973 #define SENSOR_RESETACTIVE_LEVEL_1 RK28_CAM_RESETACTIVE_L
975 static int rk28_sensor_io_init(void);
976 static int rk28_sensor_io_deinit(void);
978 struct rk28camera_platform_data rk28_camera_platform_data = {
979 .io_init = rk28_sensor_io_init,
980 .io_deinit = rk28_sensor_io_deinit,
983 .gpio_reset = SENSOR_RESET_PIN_0,
984 .gpio_power = SENSOR_POWER_PIN_0,
985 .gpio_flag = (SENSOR_POWERACTIVE_LEVEL_0|SENSOR_RESETACTIVE_LEVEL_0),
986 .dev_name = SENSOR_NAME_0,
988 .gpio_reset = SENSOR_RESET_PIN_1,
989 .gpio_power = SENSOR_POWER_PIN_1,
990 .gpio_flag = (SENSOR_POWERACTIVE_LEVEL_1|SENSOR_RESETACTIVE_LEVEL_1),
991 .dev_name = SENSOR_NAME_1,
996 static int rk28_sensor_io_init(void)
999 unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
1000 unsigned int camera_ioflag;
1001 //printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__);
1003 for (i=0; i<2; i++) {
1004 camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
1005 camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power;
1006 camera_ioflag = rk28_camera_platform_data.gpio_res[i].gpio_flag;
1008 if (camera_power != INVALID_GPIO) {
1009 ret = gpio_request(camera_power, "camera power");
1013 gpio_set_value(camera_reset, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
1014 gpio_direction_output(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
1016 //printk("\n%s....%d %x ******** ddl *********\n",__FUNCTION__,__LINE__,(((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
1020 if (camera_reset != INVALID_GPIO) {
1021 ret = gpio_request(camera_reset, "camera reset");
1023 if (camera_power != INVALID_GPIO)
1024 gpio_free(camera_power);
1029 gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
1030 gpio_direction_output(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
1032 //printk("\n%s....%d %x ******** ddl *********\n",__FUNCTION__,__LINE__,((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
1040 static int rk28_sensor_io_deinit(void)
1043 unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
1045 //printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__);
1047 for (i=0; i<2; i++) {
1048 camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
1049 camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power;
1051 if (camera_power != INVALID_GPIO){
1052 gpio_direction_input(camera_power);
1053 gpio_free(camera_power);
1056 if (camera_reset != INVALID_GPIO) {
1057 gpio_direction_input(camera_reset);
1058 gpio_free(camera_reset);
1066 static int rk28_sensor_power(struct device *dev, int on)
1068 unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
1069 unsigned int camera_ioflag;
1071 if(rk28_camera_platform_data.gpio_res[0].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) {
1072 camera_reset = rk28_camera_platform_data.gpio_res[0].gpio_reset;
1073 camera_power = rk28_camera_platform_data.gpio_res[0].gpio_power;
1074 camera_ioflag = rk28_camera_platform_data.gpio_res[0].gpio_flag;
1075 } else if (rk28_camera_platform_data.gpio_res[1].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[1].dev_name, dev_name(dev)) == 0)) {
1076 camera_reset = rk28_camera_platform_data.gpio_res[1].gpio_reset;
1077 camera_power = rk28_camera_platform_data.gpio_res[1].gpio_power;
1078 camera_ioflag = rk28_camera_platform_data.gpio_res[1].gpio_flag;
1081 if (camera_reset != INVALID_GPIO) {
1082 gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
1083 //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x \n",__FUNCTION__,dev_name(dev),camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
1085 if (camera_power != INVALID_GPIO) {
1087 gpio_set_value(camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
1088 //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x \n",__FUNCTION__,dev_name(dev), camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
1090 gpio_set_value(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
1091 //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x \n",__FUNCTION__,dev_name(dev), camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS));
1094 if (camera_reset != INVALID_GPIO) {
1095 msleep(3); /* delay 3 ms */
1096 gpio_set_value(camera_reset,(((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
1097 //printk("\n%s..%s..ResetPin= %d..PinLevel = %x \n",__FUNCTION__,dev_name(dev), camera_reset, (((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS));
1102 static struct i2c_board_info rk2818_i2c_cam_info[] = {
1104 I2C_BOARD_INFO(SENSOR_NAME_0, SENSOR_IIC_ADDR_0>>1)
1108 struct soc_camera_link rk2818_iclink = {
1109 .bus_id = RK28_CAM_PLATFORM_DEV_ID,
1110 .power = rk28_sensor_power,
1111 .board_info = &rk2818_i2c_cam_info[0],
1112 .i2c_adapter_id = SENSOR_IIC_ADAPTER_ID_0,
1113 .module_name = SENSOR_NAME_0,
1116 /*platform_device : soc-camera need */
1117 struct platform_device rk2818_soc_camera_pdrv = {
1118 .name = "soc-camera-pdrv",
1121 .init_name = SENSOR_NAME_0,
1122 .platform_data = &rk2818_iclink,
1126 /*****************************************************************************************
1128 * author: lw@rock-chips.com
1129 *****************************************************************************************/
1130 #define CHARGEOK_PIN FPGA_PIO0_06
1131 struct rk2818_battery_platform_data rk2818_battery_platdata = {
1132 .charge_ok_pin = CHARGEOK_PIN,
1133 .charge_ok_level = 0,
1137 /*****************************************************************************************
1139 * author: lhh@rock-chips.com
1140 *****************************************************************************************/
1141 static int serial_io_init(void)
1147 //UART0µÄËĸö¹Ü½ÅÏÈIOMUX³ÉGPIO
1148 //È»ºó·Ö±ðÉèÖÃÊäÈëÊä³ö/À¸ßÀµÍ´¦Àí
1150 //·ÀÖ¹Ö±½ÓIOMUX³ÉUARTºóËĸö¹Ü½ÅµÄ״̬²»¶Ôʱ
1151 //²Ù×÷UARTµ¼ÖÂUART_USR_BUSYʼÖÕΪ1Ôì³ÉÈçÏÂËÀÑ»·
1152 //while(rk2818_uart_read(port,UART_USR)&UART_USR_BUSY)
1153 //UARTËĸö¹Ü½ÅÔÚδ´«ÊäʱÕý³£×´Ì¬Ó¦¸ÃΪ£º
1156 //×¢Ò⣺CTS/RTSΪµÍÓÐЧ£¬Ó²¼þÉϲ»Ó¦¸ÃÇ¿ÐÐ×öÉÏÀ
1157 rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_GPIO1_C1 /*IOMUXA_UART0_SOUT*/);
1158 rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_GPIO1_C0 /*IOMUXA_UART0_SIN*/);
1160 ret = gpio_request(RK2818_PIN_PG0, NULL);
1163 gpio_free(RK2818_PIN_PG0);
1165 gpio_direction_output(RK2818_PIN_PG0,GPIO_HIGH);
1168 ret = gpio_request(RK2818_PIN_PG1, NULL);
1171 gpio_free(RK2818_PIN_PG1);
1173 gpio_direction_output(RK2818_PIN_PG1,GPIO_HIGH);
1175 gpio_pull_updown(RK2818_PIN_PG1,GPIOPullUp);
1176 gpio_pull_updown(RK2818_PIN_PG0,GPIOPullUp);
1178 rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_UART0_SOUT);
1179 rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_UART0_SIN);
1181 rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_GPIO0_B2/*IOMUXB_UART0_CTS_N*/);
1182 rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_GPIO0_B3/*IOMUXB_UART0_RTS_N*/);
1184 ret = gpio_request(RK2818_PIN_PB2, NULL);
1187 gpio_free(RK2818_PIN_PB2);
1189 gpio_direction_input(RK2818_PIN_PB2);
1190 // gpio_direction_output(RK2818_PIN_PB2,GPIO_LOW);
1192 ret = gpio_request(RK2818_PIN_PB3, NULL);
1195 gpio_free(RK2818_PIN_PB3);
1197 gpio_direction_output(RK2818_PIN_PB3,GPIO_LOW);
1200 rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_UART0_CTS_N);
1201 rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_UART0_RTS_N);
1206 struct rk2818_serial_platform_data rk2818_serial0_platdata = {
1207 .io_init = serial_io_init,
1210 /*****************************************************************************************
1212 * author: lhhrock-chips.com
1213 *****************************************************************************************/
1214 static int i2s_io_init(void)
1216 /* Configure the I2S pins in correct mode */
1217 rk2818_mux_api_set(CXGPIO_I2S_SEL_NAME,IOMUXB_I2S_INTERFACE);
1221 struct rk2818_i2s_platform_data rk2818_i2s_platdata = {
1222 .io_init = i2s_io_init,
1226 /*****************************************************************************************
1228 * author: lhhrock-chips.com
1229 *****************************************************************************************/
1230 #define SPI_CHIPSELECT_NUM 3
1231 struct spi_cs_gpio rk2818_spi_cs_gpios[SPI_CHIPSELECT_NUM] = {
1234 .cs_gpio = RK2818_PIN_PB4,
1235 .cs_iomux_name = GPIOB4_SPI0CS0_MMC0D4_NAME,//if no iomux,set it NULL
1236 .cs_iomux_mode = IOMUXA_GPIO0_B4,
1240 .cs_gpio = RK2818_PIN_PB0,
1241 .cs_iomux_name = GPIOB0_SPI0CSN1_MMC1PCA_NAME,
1242 .cs_iomux_mode = IOMUXA_GPIO0_B0,
1246 .cs_gpio = RK2818_PIN_PF5,
1247 .cs_iomux_name = GPIOF5_APWM3_DPWM3_NAME,
1248 .cs_iomux_mode = IOMUXB_GPIO1_B5,
1252 static int spi_io_init(struct spi_cs_gpio *cs_gpios, int cs_num)
1256 rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME, IOMUXA_SPI0);
1259 for (i=0; i<cs_num; i++) {
1260 rk2818_mux_api_set(cs_gpios[i].cs_iomux_name, cs_gpios[i].cs_iomux_mode);
1261 ret = gpio_request(cs_gpios[i].cs_gpio, cs_gpios[i].name);
1264 gpio_free(cs_gpios[j].cs_gpio);
1265 rk2818_mux_api_mode_resume(cs_gpios[j].cs_iomux_name);
1267 printk("[fun:%s, line:%d], gpio request err\n", __func__, __LINE__);
1270 gpio_direction_output(cs_gpios[i].cs_gpio, GPIO_HIGH);
1276 static int spi_io_deinit(struct spi_cs_gpio *cs_gpios, int cs_num)
1279 rk2818_mux_api_mode_resume(GPIOB_SPI0_MMC0_NAME);
1282 for (i=0; i<cs_num; i++) {
1283 gpio_free(cs_gpios[i].cs_gpio);
1284 rk2818_mux_api_mode_resume(cs_gpios[i].cs_iomux_name);
1291 struct rk2818_spi_platform_data rk2818_spi_platdata = {
1292 .num_chipselect = SPI_CHIPSELECT_NUM,//raho ´ó°åÐèÒªÖ§³Ö3¸öƬѡ dxj
1293 .chipselect_gpios = rk2818_spi_cs_gpios,
1294 .io_init = spi_io_init,
1295 .io_deinit = spi_io_deinit,
1299 /*****************************************************************************************
1300 * xpt2046 touch panel
1301 * author: dxjrock-chips.com
1302 *****************************************************************************************/
1303 #define XPT2046_GPIO_INT RK2818_PIN_PE1
1304 #define DEBOUNCE_REPTIME 3
1306 #if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI)
1307 static struct xpt2046_platform_data xpt2046_info = {
1316 .debounce_rep = DEBOUNCE_REPTIME,
1318 .gpio_pendown = XPT2046_GPIO_INT,
1319 .penirq_recheck_delay_usecs = 1,
1321 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)
1322 static struct xpt2046_platform_data xpt2046_info = {
1331 .debounce_rep = DEBOUNCE_REPTIME,
1333 .gpio_pendown = XPT2046_GPIO_INT,
1334 .penirq_recheck_delay_usecs = 1,
1336 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_SPI)
1337 static struct xpt2046_platform_data xpt2046_info = {
1346 .debounce_rep = DEBOUNCE_REPTIME,
1348 .gpio_pendown = XPT2046_GPIO_INT,
1350 .penirq_recheck_delay_usecs = 1,
1352 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
1353 static struct xpt2046_platform_data xpt2046_info = {
1362 .debounce_rep = DEBOUNCE_REPTIME,
1364 .gpio_pendown = XPT2046_GPIO_INT,
1366 .penirq_recheck_delay_usecs = 1,
1370 static struct rk2818_spi_chip cmb_spi_chip = {
1371 .transfer_mode = RK2818_SPI_FULL_DUPLEX,
1374 static struct spi_board_info board_spi_devices[] = {
1375 #if defined(CONFIG_SPI_FPGA)
1376 { /* fpga ice65l08xx */
1377 .modalias = "spi_fpga",
1379 .max_speed_hz = 12 * 1000 * 1000,
1382 //.platform_data = &rk2818_spi_platdata,
1385 #if defined(CONFIG_ENC28J60)
1387 .modalias = "enc28j60",
1389 .max_speed_hz = 12 * 1000 * 1000,
1394 #if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\
1395 ||defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
1397 .modalias = "xpt2046_ts",
1399 .max_speed_hz = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */
1401 .irq = XPT2046_GPIO_INT,
1402 .platform_data = &xpt2046_info,
1405 #if defined(CONFIG_SMS_SPI_ROCKCHIP)
1407 .modalias = "siano1186",
1409 .max_speed_hz = 12*1000*1000,
1411 .irq = RK2818_PIN_PA6,
1412 .controller_data = &cmb_spi_chip,
1417 /*****************************************************************************************
1419 * author: zyw@rock-chips.com
1420 *****************************************************************************************/
1421 //#ifdef CONFIG_LCD_TD043MGEA1
1422 #define LCD_TXD_PIN RK2818_PIN_PE4
1423 #define LCD_CLK_PIN RK2818_PIN_PE5
1424 #define LCD_CS_PIN RK2818_PIN_PH6
1425 #define LCD_TXD_MUX_NAME GPIOE_I2C0_SEL_NAME
1426 #define LCD_CLK_MUX_NAME NULL
1427 #define LCD_CS_MUX_NAME GPIOH6_IQ_SEL_NAME
1428 #define LCD_TXD_MUX_MODE 1
1429 #define LCD_CLK_MUX_MODE 1
1430 #define LCD_CS_MUX_MODE 0
1432 static int rk2818_lcd_io_init(void)
1436 rk2818_mux_api_set(LCD_CS_MUX_NAME, LCD_CS_MUX_MODE);
1437 if (LCD_CS_PIN != INVALID_GPIO) {
1438 ret = gpio_request(LCD_CS_PIN, NULL);
1442 printk(">>>>>> lcd cs gpio_request err \n ");
1446 rk2818_mux_api_set(LCD_CLK_MUX_NAME, LCD_CLK_MUX_MODE);
1447 if (LCD_CLK_PIN != INVALID_GPIO) {
1448 ret = gpio_request(LCD_CLK_PIN, NULL);
1452 printk(">>>>>> lcd clk gpio_request err \n ");
1456 rk2818_mux_api_set(LCD_TXD_MUX_NAME, LCD_TXD_MUX_MODE);
1457 if (LCD_TXD_PIN != INVALID_GPIO) {
1458 ret = gpio_request(LCD_TXD_PIN, NULL);
1462 printk(">>>>>> lcd txd gpio_request err \n ");
1469 if (LCD_CLK_PIN != INVALID_GPIO) {
1470 gpio_free(LCD_CLK_PIN);
1473 if (LCD_CS_PIN != INVALID_GPIO) {
1474 gpio_free(LCD_CS_PIN);
1480 static int rk2818_lcd_io_deinit(void)
1483 gpio_free(LCD_CS_PIN);
1484 rk2818_mux_api_mode_resume(LCD_CS_MUX_NAME);
1485 gpio_free(LCD_CLK_PIN);
1486 gpio_free(LCD_TXD_PIN);
1487 rk2818_mux_api_mode_resume(LCD_TXD_MUX_NAME);
1488 rk2818_mux_api_mode_resume(LCD_CLK_MUX_NAME);
1493 struct rk2818lcd_info rk2818_lcd_info = {
1494 .txd_pin = LCD_TXD_PIN,
1495 .clk_pin = LCD_CLK_PIN,
1496 .cs_pin = LCD_CS_PIN,
1497 .io_init = rk2818_lcd_io_init,
1498 .io_deinit = rk2818_lcd_io_deinit,
1502 /*****************************************************************************************
1503 * frame buffe devices
1504 * author: zyw@rock-chips.com
1505 *****************************************************************************************/
1507 #define FB_DISPLAY_ON_PIN INVALID_GPIO
1508 #define FB_LCD_STANDBY_PIN INVALID_GPIO
1509 #define FB_MCU_FMK_PIN INVALID_GPIO
1511 #define FB_DISPLAY_ON_VALUE GPIO_LOW
1512 #define FB_LCD_STANDBY_VALUE 0
1514 #define FB_DISPLAY_ON_MUX_NAME NULL
1515 #define FB_DISPLAY_ON_MUX_MODE 0
1517 #define FB_LCD_STANDBY_MUX_NAME NULL
1518 #define FB_LCD_STANDBY_MUX_MODE 1
1520 #define FB_MCU_FMK_PIN_MUX_NAME NULL
1521 #define FB_MCU_FMK_MUX_MODE 0
1523 #define FB_DATA0_16_MUX_NAME GPIOC_LCDC16BIT_SEL_NAME
1524 #define FB_DATA0_16_MUX_MODE 1
1526 #define FB_DATA17_18_MUX_NAME GPIOC_LCDC18BIT_SEL_NAME
1527 #define FB_DATA17_18_MUX_MODE 1
1529 #define FB_DATA19_24_MUX_NAME GPIOC_LCDC24BIT_SEL_NAME
1530 #define FB_DATA19_24_MUX_MODE 1
1532 #define FB_DEN_MUX_NAME CXGPIO_LCDDEN_SEL_NAME
1533 #define FB_DEN_MUX_MODE 1
1535 #define FB_VSYNC_MUX_NAME CXGPIO_LCDVSYNC_SEL_NAME
1536 #define FB_VSYNC_MUX_MODE 1
1538 #define FB_MCU_FMK_MUX_NAME NULL
1539 #define FB_MCU_FMK_MUX_MODE 0
1541 static int rk2818_fb_io_init(struct rk2818_fb_setting_info *fb_setting)
1544 if(fb_setting->data_num <=16)
1545 rk2818_mux_api_set(FB_DATA0_16_MUX_NAME, FB_DATA0_16_MUX_MODE);
1546 if(fb_setting->data_num >16 && fb_setting->data_num<=18)
1547 rk2818_mux_api_set(FB_DATA17_18_MUX_NAME, FB_DATA17_18_MUX_MODE);
1548 if(fb_setting->data_num >18)
1549 rk2818_mux_api_set(FB_DATA19_24_MUX_NAME, FB_DATA19_24_MUX_MODE);
1551 if(fb_setting->vsync_en)
1552 rk2818_mux_api_set(FB_VSYNC_MUX_NAME, FB_VSYNC_MUX_MODE);
1554 if(fb_setting->den_en)
1555 rk2818_mux_api_set(FB_DEN_MUX_NAME, FB_DEN_MUX_MODE);
1557 if(fb_setting->mcu_fmk_en && FB_MCU_FMK_MUX_NAME && (FB_MCU_FMK_PIN != INVALID_GPIO))
1559 rk2818_mux_api_set(FB_MCU_FMK_MUX_NAME, FB_MCU_FMK_MUX_MODE);
1560 ret = gpio_request(FB_MCU_FMK_PIN, NULL);
1563 gpio_free(FB_MCU_FMK_PIN);
1564 printk(">>>>>> FB_MCU_FMK_PIN gpio_request err \n ");
1566 gpio_direction_input(FB_MCU_FMK_PIN);
1569 if(fb_setting->disp_on_en && FB_DISPLAY_ON_MUX_NAME && (FB_DISPLAY_ON_PIN != INVALID_GPIO))
1571 rk2818_mux_api_set(FB_DISPLAY_ON_MUX_NAME, FB_DISPLAY_ON_MUX_MODE);
1572 ret = gpio_request(FB_DISPLAY_ON_PIN, NULL);
1575 gpio_free(FB_DISPLAY_ON_PIN);
1576 printk(">>>>>> FB_DISPLAY_ON_PIN gpio_request err \n ");
1580 if(fb_setting->disp_on_en && FB_LCD_STANDBY_MUX_NAME && (FB_LCD_STANDBY_PIN != INVALID_GPIO))
1582 rk2818_mux_api_set(FB_LCD_STANDBY_MUX_NAME, FB_LCD_STANDBY_MUX_MODE);
1583 ret = gpio_request(FB_LCD_STANDBY_PIN, NULL);
1586 gpio_free(FB_LCD_STANDBY_PIN);
1587 printk(">>>>>> FB_LCD_STANDBY_PIN gpio_request err \n ");
1594 struct rk2818fb_info rk2818_fb_info = {
1596 .disp_on_pin = FB_DISPLAY_ON_PIN,
1597 .disp_on_value = FB_DISPLAY_ON_VALUE,
1598 .standby_pin = FB_LCD_STANDBY_PIN,
1599 .standby_value = FB_LCD_STANDBY_VALUE,
1600 .mcu_fmk_pin = FB_MCU_FMK_PIN,
1601 .lcd_info = &rk2818_lcd_info,
1602 .io_init = rk2818_fb_io_init,
1605 /*****************************************************************************************
1607 * author: nzy@rock-chips.com
1608 *****************************************************************************************/
1610 GPIOF2_APWM0_SEL_NAME, IOMUXB_PWM0
1611 GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_PWM1
1612 GPIOF4_APWM2_MMC0WPT_NAME, IOMUXA_PWM2
1613 GPIOF5_APWM3_DPWM3_NAME, IOMUXB_PWM3
1617 #define PWM_MUX_NAME GPIOF2_APWM0_SEL_NAME
1618 #define PWM_MUX_MODE IOMUXB_PWM0
1619 #define PWM_EFFECT_VALUE 0
1622 #define BL_EN_MUX_NAME GPIOF34_UART3_SEL_NAME
1623 #define BL_EN_MUX_MODE IOMUXB_GPIO1_B34
1625 #define BL_EN_PIN RK2818_PIN_PF3
1626 #define BL_EN_VALUE GPIO_HIGH
1630 static int rk2818_backlight_io_init(void)
1634 rk2818_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
1636 rk2818_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE);
1638 ret = gpio_request(BL_EN_PIN, NULL);
1641 gpio_free(BL_EN_PIN);
1642 printk(KERN_ERR ">>>>>> lcd_cs gpio_request err \n ");
1645 gpio_direction_output(BL_EN_PIN, 0);
1646 gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
1651 static int rk2818_backlight_io_deinit(void)
1655 gpio_free(BL_EN_PIN);
1657 rk2818_mux_api_mode_resume(PWM_MUX_NAME);
1659 rk2818_mux_api_mode_resume(BL_EN_MUX_NAME);
1664 struct rk2818_bl_info rk2818_bl_info = {
1666 .bl_ref = PWM_EFFECT_VALUE,
1667 .io_init = rk2818_backlight_io_init,
1668 .io_deinit = rk2818_backlight_io_deinit,
1672 /*****************************************************************************************
1674 * author: lyx@rock-chips.com
1675 *****************************************************************************************/
1676 #ifdef CONFIG_DM9000
1678 GPIOA5_FLASHCS1_SEL_NAME IOMUXB_FLASH_CS1
1679 GPIOA6_FLASHCS2_SEL_NAME IOMUXB_FLASH_CS2
1680 GPIOA7_FLASHCS3_SEL_NAME IOMUXB_FLASH_CS3
1681 GPIOE_SPI1_FLASH_SEL1_NAME IOMUXA_FLASH_CS45
1682 GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67
1684 #define DM9000_USE_NAND_CS 1 //cs can be 1,2,3,4,5,6 or 7
1685 #define DM9000_CS_IOMUX_NAME GPIOA5_FLASHCS1_SEL_NAME
1686 #define DM9000_CS_IOMUX_MODE IOMUXB_FLASH_CS1
1687 #define DM9000_NET_INT_PIN RK2818_PIN_PA1
1688 #define DM9000_INT_IOMUX_NAME GPIOA1_HOSTDATA17_SEL_NAME
1689 #define DM9000_INT_IOMUX_MODE IOMUXB_GPIO0_A1
1690 #define DM9000_INT_INIT_VALUE GPIOPullDown
1691 #define DM9000_IRQ IRQF_TRIGGER_HIGH
1692 #define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8)
1693 #define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4)
1695 static int dm9k_gpio_set(void)
1698 rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE);
1700 rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE);
1704 static int dm9k_gpio_free(void)
1706 rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME);
1707 rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME);
1711 static struct resource dm9k_resource[] = {
1713 .start = DM9000_IO_ADDR,
1714 .end = DM9000_IO_ADDR + 3,
1715 .flags = IORESOURCE_MEM,
1718 .start = DM9000_DATA_ADDR,
1719 .end = DM9000_DATA_ADDR + 3,
1720 .flags = IORESOURCE_MEM,
1723 .start = DM9000_NET_INT_PIN,
1724 .end = DM9000_NET_INT_PIN,
1725 .flags = IORESOURCE_IRQ | DM9000_IRQ,
1730 /* for the moment we limit ourselves to 8bit IO until some
1731 * better IO routines can be written and tested
1733 struct dm9000_plat_data dm9k_platdata = {
1734 .flags = DM9000_PLATF_8BITONLY,
1735 .irq_pin = DM9000_NET_INT_PIN,
1736 .irq_pin_value = DM9000_INT_INIT_VALUE,
1737 .io_init = dm9k_gpio_set,
1738 .io_deinit = dm9k_gpio_free,
1741 struct platform_device rk2818_device_dm9k = {
1744 .num_resources = ARRAY_SIZE(dm9k_resource),
1745 .resource = dm9k_resource,
1747 .platform_data = &dm9k_platdata,
1752 #ifdef CONFIG_HEADSET_DET
1753 struct rk2818_headset_data rk2818_headset_info = {
1754 .irq = FPGA_PIO0_00,
1755 .irq_type = IRQF_TRIGGER_FALLING,
1756 .headset_in_type= HEADSET_IN_HIGH,
1759 struct platform_device rk28_device_headset = {
1760 .name = "rk2818_headsetdet",
1763 .platform_data = &rk2818_headset_info,
1768 #ifdef CONFIG_INPUT_LPSENSOR_CM3602
1769 static int capella_cm3602_power(int on);
1771 static struct capella_cm3602_platform_data capella_cm3602_pdata = {
1772 .power = capella_cm3602_power,
1773 .irq_pin = FPGA_PIO0_04,
1774 .pwd_out_pin = FPGA_PIO4_07,
1775 .ps_shutdown_pin = FPGA_PIO5_00,
1776 //.p_out = MAHIMAHI_GPIO_PROXIMITY_INT_N
1779 static int capella_cm3602_power(int on)
1780 { /* TODO eolsen Add Voltage reg control */
1782 printk("[%s]:on---\n",__FUNCTION__);
1783 gpio_direction_output(capella_cm3602_pdata.pwd_out_pin, SPI_GPIO_LOW);
1784 gpio_direction_output(capella_cm3602_pdata.ps_shutdown_pin, SPI_GPIO_LOW);
1787 printk("[%s]:off---\n",__FUNCTION__);
1788 gpio_direction_output(capella_cm3602_pdata.pwd_out_pin, SPI_GPIO_HIGH);
1789 gpio_direction_output(capella_cm3602_pdata.ps_shutdown_pin, SPI_GPIO_HIGH);
1794 struct platform_device rk2818_device_cm3605 = {
1795 .name = CAPELLA_CM3602,
1798 .platform_data = &capella_cm3602_pdata
1803 /*****************************************************************************************
1804 * nand flash devices
1805 * author: hxy@rock-chips.com
1806 *****************************************************************************************/
1808 GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1
1809 GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2
1810 GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3
1811 GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45
1812 GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67
1815 #define NAND_CS_MAX_NUM 1 /*form 0 to 8, it is 0 when no nand flash */
1817 int rk2818_nand_io_init(void)
1819 #if (NAND_CS_MAX_NUM == 2)
1820 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1821 #elif (NAND_CS_MAX_NUM == 3)
1822 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1823 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1824 #elif (NAND_CS_MAX_NUM == 4)
1825 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1826 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1827 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
1828 #elif ((NAND_CS_MAX_NUM == 5) || (NAND_CS_MAX_NUM == 6))
1829 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1830 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1831 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
1832 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45);
1833 #elif ((NAND_CS_MAX_NUM == 7) || (NAND_CS_MAX_NUM == 8))
1834 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1835 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1836 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
1837 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45);
1838 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67);
1843 struct rk2818_nand_platform_data rk2818_nand_data = {
1844 .width = 1, /* data bus width in bytes */
1845 .hw_ecc = 1, /* hw ecc 0: soft ecc */
1847 .io_init = rk2818_nand_io_init,
1851 /********************usb*********************/
1852 struct usb_mass_storage_platform_data mass_storage_pdata = {
1854 .vendor = "RockChip",
1855 .product = "rk2818 sdk",
1860 static struct platform_device *devices[] __initdata = {
1864 #ifdef CONFIG_UART0_RK2818
1865 &rk2818_device_uart0,
1867 #ifdef CONFIG_UART1_RK2818
1868 &rk2818_device_uart1,
1870 #ifdef CONFIG_I2C0_RK2818
1871 &rk2818_device_i2c0,
1873 #ifdef CONFIG_I2C1_RK2818
1874 &rk2818_device_i2c1,
1876 #ifdef CONFIG_SDMMC0_RK2818
1877 &rk2818_device_sdmmc0,
1879 #ifdef CONFIG_SDMMC1_RK2818
1880 &rk2818_device_sdmmc1,
1883 &rk2818_device_spim,
1885 #if defined(CONFIG_ANDROID_PMEM)
1886 &rk2818_device_pmem,
1887 &rk2818_device_pmem_dsp,
1890 &rk2818_device_adckey,
1891 #if defined(CONFIG_RK2818_REGULATOR_CHARGE)
1895 &rk2818_device_battery,
1897 &rk2818_device_backlight,
1900 #ifdef CONFIG_VIDEO_RK2818
1901 &rk2818_device_camera, /* ddl@rock-chips.com : camera support */
1902 &rk2818_soc_camera_pdrv,
1905 #ifdef CONFIG_MTD_NAND_RK2818
1906 &rk2818_nand_device,
1908 #ifdef CONFIG_DM9000
1909 &rk2818_device_dm9k,
1911 #ifdef CONFIG_INPUT_LPSENSOR_CM3602
1912 &rk2818_device_cm3605,
1914 #ifdef CONFIG_HEADSET_DET
1915 &rk28_device_headset,
1917 #ifdef CONFIG_DWC_OTG
1918 &rk2818_device_dwc_otg,
1920 #ifdef CONFIG_RK2818_HOST11
1921 &rk2818_device_host11,
1923 #ifdef CONFIG_USB_ANDROID
1924 &android_usb_device,
1925 &usb_mass_storage_device,
1927 #ifdef CONFIG_ANDROID_TIMED_GPIO
1928 &rk28_device_vibrator,
1932 extern struct sys_timer rk2818_timer;
1933 #define POWER_PIN RK2818_PIN_PB1
1934 static void rk2818_power_on(void)
1937 ret = gpio_request(POWER_PIN, NULL);
1939 printk("failed to request power_off gpio\n");
1943 gpio_pull_updown(POWER_PIN, GPIOPullUp);
1944 ret = gpio_direction_output(POWER_PIN, GPIO_HIGH);
1946 printk("failed to set power_off gpio output\n");
1950 gpio_set_value(POWER_PIN, 1);/*power on*/
1953 gpio_free(POWER_PIN);
1956 static void rk2818_power_off(void)
1958 printk("shut down system now ...\n");
1959 gpio_set_value(POWER_PIN, 0);/*power down*/
1963 #define PLAY_ON_PIN RK2818_PIN_PA3
1964 #define PLAY_ON_LEVEL 1
1965 static ADC_keyst gAdcValueTab[] =
1967 {0x65, AD2KEY1},///VOLUME_DOWN
1968 {0xd3, AD2KEY2},///VOLUME_UP
1969 {0x130, AD2KEY3},///MENU
1970 {0x19d, AD2KEY4},///HOME
1971 {0x202, AD2KEY5},///BACK
1972 {0x2d0, AD2KEY6},///CALL
1973 {0x267, AD2KEY7},///SEARCH
1977 static unsigned char gInitKeyCode[] =
1979 AD2KEY1,AD2KEY2,AD2KEY3,AD2KEY4,AD2KEY5,AD2KEY6,AD2KEY7,
1980 ENDCALL,KEYSTART,KEY_WAKEUP,
1983 struct adc_key_data rk2818_adc_key = {
1984 .pin_playon = PLAY_ON_PIN,
1985 .playon_level = PLAY_ON_LEVEL,
1990 .adc_key_table = gAdcValueTab,
1991 .initKeyCode = gInitKeyCode,
1995 struct rk2818_adckey_platform_data rk2818_adckey_platdata = {
1996 .adc_key = &rk2818_adc_key,
1999 #if CONFIG_ANDROID_TIMED_GPIO
2000 static struct timed_gpio timed_gpios[] = {
2003 .gpio = SPI_GPIO_P1_12,
2004 .max_timeout = 1000,
2009 struct timed_gpio_platform_data rk28_vibrator_info = {
2011 .gpios = timed_gpios,
2014 #if defined (CONFIG_RK2818_SOC_PM)
2015 void __tcmfunc rk2818_pm_scu_suspend(unsigned int *reg,int regoff)
2020 case PM_SCU_CLKGATE0_CON:
2031 void __tcmfunc rk2818_soc_general_reg_suspend(void)
2033 struct rk2818_pm_soc_st *general=rk2818_soc_pm.general;
2035 unsigned int *general_reg_addr=general->reg_base_addr;
2037 general->reg_ctrbit|=(0x1<<PM_GPIO0_AB_PU_CON);
2038 general_reg_addr[PM_GPIO0_AB_PU_CON] =GPIO0_AB_NORMAL;
2040 general->reg_ctrbit|=(0x1<<PM_GPIO0_CD_PU_CON);
2041 general_reg_addr[PM_GPIO0_CD_PU_CON] = GPIO0_CD_NORMAL;
2043 general->reg_ctrbit|=(0x1<<PM_GPIO1_AB_PU_CON);
2044 general_reg_addr[PM_GPIO1_AB_PU_CON] = GPIO1_AB_NORMAL;
2046 general->reg_ctrbit|=(0x1<<PM_GPIO1_CD_PU_CON);
2047 general_reg_addr[PM_GPIO1_CD_PU_CON] = GPIO1_CD_NORMAL;
2050 general->reg_ctrbit|=(0x1<<PM_IOMUX_A_CON);
2051 general->reg_ctrbit|=(0x1<<PM_IOMUX_B_CON);
2053 rk2818_socpm_gpio_pullupdown(RK2818_PIN_PA3,GPIOPullDown);// ´¦Àí°´¼ü
2055 #if 1 //set uart0 pin
2057 general_reg_addr[PM_IOMUX_A_CON] &=(~(0x3<<PM_UART0_OUT))&(~(0x3<<PM_UART0_IN));// 00 gpio 01uart
2058 general_reg_addr[PM_IOMUX_B_CON] &=(~(0x1<<PM_UART0_RTS))&(~(0x1<<PM_UART0_CTS));//
2059 rk2818_socpm_set_gpio(RK2818_PIN_PG0,0,0);//uart0 sin pin
2060 rk2818_socpm_set_gpio(RK2818_PIN_PG1,0,0);//uart0 sout pin
2062 rk2818_socpm_set_gpio(RK2818_PIN_PG0,0,0);//uart0 sin pin
2063 rk2818_socpm_set_gpio(RK2818_PIN_PG1,0,0);//uart0 sout pin
2065 rk2818_socpm_set_gpio(RK2818_PIN_PB2,0,0);//uart0 cts pin
2066 rk2818_socpm_set_gpio(RK2818_PIN_PB3,0,0);//uart0 rts pin
2068 rk2818_socpm_set_gpio(RK2818_PIN_PF7,0,0);//uart0 dtr pin
2069 rk2818_socpm_set_gpio(RK2818_PIN_PE0,0,0);//uart0 dsr pin
2074 #if 1 //set uart1 pin
2076 general_reg_addr[PM_IOMUX_A_CON] &=(~(0x3<<PM_UART1_OUT))&(~(0x3<<PM_UART1_IN));// 00 gpio 01uart
2077 rk2818_socpm_set_gpio(RK2818_PIN_PF0,0,0);//uart0 sin pin
2078 rk2818_socpm_set_gpio(RK2818_PIN_PG1,0,0);//uart0 sout pin
2082 #if 1 //set i2c0 pin
2083 general_reg_addr[PM_IOMUX_A_CON] |=(0x1<<PM_I2C0);// 1 gpio;0 i2c
2084 rk2818_socpm_set_gpio(RK2818_PIN_PE4,0,0);//sda pin
2085 rk2818_socpm_set_gpio(RK2818_PIN_PE5,0,0);//scl dsr pin
2088 #if 1 //set i2c1 pin
2089 general_reg_addr[PM_IOMUX_A_CON] &=(~(0x3<<PM_I2C1));// 0 gpio;1 i2c
2090 rk2818_socpm_set_gpio(RK2818_PIN_PE6,0,0);//sda pin
2091 rk2818_socpm_set_gpio(RK2818_PIN_PE7,0,0);//scl dsr pin
2095 general_reg_addr[PM_IOMUX_A_CON] &=(~(0x1<<PM_SDIO0_CMD))&(~(0x1<<PM_SDIO0_DATA));// 1 gpio;0 i2c
2096 rk2818_socpm_set_gpio(RK2818_PIN_PH0,0,0);
2097 rk2818_socpm_set_gpio(RK2818_PIN_PH1,0,0);
2098 rk2818_socpm_set_gpio(RK2818_PIN_PH2,0,0);
2099 rk2818_socpm_set_gpio(RK2818_PIN_PH3,0,0);
2100 rk2818_socpm_set_gpio(RK2818_PIN_PH4,0,0);
2101 rk2818_socpm_set_gpio(RK2818_PIN_PH5,0,0);
2103 //rk2818_socpm_set_gpio(RK2818_PIN_PF3,0,0);
2108 general_reg_addr[PM_IOMUX_A_CON] &=(~(0x1<<PM_SDIO1_CMD))&(~(0x1<<PM_SDIO1_DATA));// 1 gpio;0 i2c
2109 rk2818_socpm_set_gpio(RK2818_PIN_PG2,0,0);
2110 rk2818_socpm_set_gpio(RK2818_PIN_PG3,0,0);
2111 rk2818_socpm_set_gpio(RK2818_PIN_PG4,0,0);
2112 rk2818_socpm_set_gpio(RK2818_PIN_PG5,0,0);
2113 rk2818_socpm_set_gpio(RK2818_PIN_PG6,0,0);
2114 rk2818_socpm_set_gpio(RK2818_PIN_PG7,0,0);
2117 void __tcmfunc rk2818_pm_set_vol(void)
2119 rk2818_socpm_set_gpio(RK2818_PIN_PC2,1,0);
2121 void __tcmfunc rk2818_pm_resume_vol(void)
2123 rk2818_socpm_set_gpio(RK2818_PIN_PC2,1,1);
2126 #define pm_set_general_cpu_reg(a)
2127 #define rk2818_pm_set_vol()
2128 #define rk2818_pm_resume_vol()
2130 static void __init machine_rk2818_init_irq(void)
2133 rk2818_gpio_init(rk2818_gpioBank, 8);
2134 rk2818_gpio_irq_setup();
2137 static void __init machine_rk2818_board_init(void)
2139 printk("3x machine_rk2818_board_init\n");
2141 rk2818_socpm_int( (pm_scu_suspend) rk2818_pm_scu_suspend,(pm_general_reg_suspend) rk2818_soc_general_reg_suspend,
2142 (pm_set_suspendvol) rk2818_pm_set_vol,(pm_resume_vol) rk2818_pm_resume_vol);
2144 pm_power_off = rk2818_power_off;
2146 #ifdef CONFIG_SPI_FPGA_FW
2150 #ifdef CONFIG_I2C0_RK2818
2151 i2c_register_board_info(default_i2c0_data.bus_num, board_i2c0_devices,
2152 ARRAY_SIZE(board_i2c0_devices));
2154 #ifdef CONFIG_I2C1_RK2818
2155 i2c_register_board_info(default_i2c1_data.bus_num, board_i2c1_devices,
2156 ARRAY_SIZE(board_i2c1_devices));
2158 #ifdef CONFIG_SPI_FPGA_I2C
2159 i2c_register_board_info(default_i2c2_data.bus_num, board_i2c2_devices,
2160 ARRAY_SIZE(board_i2c2_devices));
2161 i2c_register_board_info(default_i2c3_data.bus_num, board_i2c3_devices,
2162 ARRAY_SIZE(board_i2c3_devices));
2164 platform_add_devices(devices, ARRAY_SIZE(devices));
2165 spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
2168 static void __init machine_rk2818_mapio(void)
2170 iotable_init(rk2818_io_desc, ARRAY_SIZE(rk2818_io_desc));
2171 rk2818_clock_init();
2172 rk2818_iomux_init();
2175 MACHINE_START(RK2818, "RK28board")
2177 /* UART for LL DEBUG */
2178 .phys_io = 0x18002000,
2179 .io_pg_offst = ((0xFF100000) >> 18) & 0xfffc,
2180 .boot_params = RK2818_SDRAM_PHYS + 0xf8000,
2181 .map_io = machine_rk2818_mapio,
2182 .init_irq = machine_rk2818_init_irq,
2183 .init_machine = machine_rk2818_board_init,
2184 .timer = &rk2818_timer,