3 * Copyright (C) 2012 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/skbuff.h>
24 #include <linux/spi/spi.h>
25 #include <linux/mmc/host.h>
26 #include <linux/ion.h>
27 #include <linux/cpufreq.h>
28 #include <linux/clk.h>
29 #include <mach/dvfs.h>
31 #include <asm/setup.h>
32 #include <asm/mach-types.h>
33 #include <asm/mach/arch.h>
34 #include <asm/mach/map.h>
35 #include <asm/mach/flash.h>
36 #include <asm/hardware/gic.h>
38 #include <mach/board.h>
39 #include <mach/hardware.h>
41 #include <mach/gpio.h>
42 #include <mach/iomux.h>
43 #include <linux/rk_fb.h>
44 #include <linux/regulator/machine.h>
45 #include <linux/rfkill-rk.h>
46 #include <linux/sensor-dev.h>
47 #include <linux/mfd/tps65910.h>
48 #include <linux/regulator/act8846.h>
49 #include <linux/mfd/rk808.h>
50 #include <linux/mfd/ricoh619.h>
51 #include <linux/regulator/rk29-pwm-regulator.h>
53 #ifdef CONFIG_CW2015_BATTERY
54 #include <linux/power/cw2015_battery.h>
56 #if defined(CONFIG_MFD_RK610)
57 #include <linux/mfd/rk610_core.h>
60 #if defined(CONFIG_MFD_RK616)
61 #include <linux/mfd/rk616.h>
65 #if defined(CONFIG_RK_HDMI)
66 #include "../../../drivers/video/rockchip/hdmi/rk_hdmi.h"
69 #if defined(CONFIG_SPIM_RK29)
70 #include "../../../drivers/spi/rk29_spim.h"
72 #if defined(CONFIG_GPS_RK)
73 #include "../../../drivers/misc/gps/rk_gps/rk_gps.h"
75 #if defined(CONFIG_MU509)
76 #include <linux/mu509.h>
78 #if defined(CONFIG_MW100)
79 #include <linux/mw100.h>
81 #if defined(CONFIG_MT6229)
82 #include <linux/mt6229.h>
84 #if defined(CONFIG_ANDROID_TIMED_GPIO)
85 #include "../../../drivers/staging/android/timed_gpio.h"
88 #if defined(CONFIG_MT6620)
89 #include <linux/gps.h>
91 #include "board-rk3168-tb-camera.c"
93 #if defined(CONFIG_TOUCHSCREEN_GT8XX)
94 #define TOUCH_RESET_PIN RK30_PIN0_PB6
95 #define TOUCH_PWR_PIN RK30_PIN0_PC5 // need to fly line by hardware engineer
97 /* Android Parameter */
98 static int ap_mdm = 0;
99 module_param(ap_mdm, int, 0644);
100 static int ap_has_alsa = 0;
101 module_param(ap_has_alsa, int, 0644);
102 static int ap_data_only = 2;
103 module_param(ap_data_only, int, 0644);
104 static int ap_has_earphone = 0;
105 module_param(ap_has_earphone, int, 0644);
108 static int goodix_init_platform_hw(void)
112 if (TOUCH_PWR_PIN != INVALID_GPIO) {
113 ret = gpio_request(TOUCH_PWR_PIN, "goodix power pin");
115 gpio_free(TOUCH_PWR_PIN);
116 printk("goodix power error\n");
119 gpio_direction_output(TOUCH_PWR_PIN, 0);
120 gpio_set_value(TOUCH_PWR_PIN, GPIO_LOW);
124 if (TOUCH_RESET_PIN != INVALID_GPIO) {
125 ret = gpio_request(TOUCH_RESET_PIN, "goodix reset pin");
127 gpio_free(TOUCH_RESET_PIN);
128 printk("goodix gpio_request error\n");
131 gpio_direction_output(TOUCH_RESET_PIN, 1);
133 //gpio_set_value(TOUCH_RESET_PIN, GPIO_LOW);
135 //gpio_set_value(TOUCH_RESET_PIN, GPIO_HIGH);
141 struct goodix_platform_data goodix_info = {
143 .irq_pin = RK30_PIN1_PB7,
144 .rest_pin = TOUCH_RESET_PIN,
145 .init_platform_hw = goodix_init_platform_hw,
149 static struct spi_board_info board_spi_devices[] = {
152 /***********************************************************
154 ************************************************************/
155 #ifdef CONFIG_BACKLIGHT_RK29_BL
157 #define PWM_MODE PWM3
158 #define PWM_EFFECT_VALUE 1
160 #define LCD_DISP_ON_PIN
162 #ifdef LCD_DISP_ON_PIN
163 #define BL_EN_PIN RK30_PIN0_PA2
164 #define BL_EN_VALUE GPIO_HIGH
166 static int rk29_backlight_io_init(void)
171 #ifdef LCD_DISP_ON_PIN
172 ret = gpio_request(BL_EN_PIN, "bl_en");
174 gpio_direction_output(BL_EN_PIN, BL_EN_VALUE);
180 static int rk29_backlight_io_deinit(void)
182 int ret = 0, pwm_gpio;
183 #ifdef LCD_DISP_ON_PIN
184 gpio_free(BL_EN_PIN);
186 pwm_gpio = iomux_mode_to_gpio(PWM_MODE);
187 gpio_request(pwm_gpio, "bl_pwm");
188 gpio_direction_output(pwm_gpio, GPIO_LOW);
192 static int rk29_backlight_pwm_suspend(void)
194 int ret, pwm_gpio = iomux_mode_to_gpio(PWM_MODE);
196 ret = gpio_request(pwm_gpio, "bl_pwm");
198 printk("func %s, line %d: request gpio fail\n", __FUNCTION__, __LINE__);
201 gpio_direction_output(pwm_gpio, GPIO_LOW);
202 #ifdef LCD_DISP_ON_PIN
203 gpio_direction_output(BL_EN_PIN, !BL_EN_VALUE);
208 static int rk29_backlight_pwm_resume(void)
210 int pwm_gpio = iomux_mode_to_gpio(PWM_MODE);
214 #ifdef LCD_DISP_ON_PIN
216 gpio_direction_output(BL_EN_PIN, BL_EN_VALUE);
221 static struct rk29_bl_info rk29_bl_info = {
225 .brightness_mode =BRIGHTNESS_MODE_CONIC,
226 .bl_ref = PWM_EFFECT_VALUE,
227 .io_init = rk29_backlight_io_init,
228 .io_deinit = rk29_backlight_io_deinit,
229 .pwm_suspend = rk29_backlight_pwm_suspend,
230 .pwm_resume = rk29_backlight_pwm_resume,
233 static struct platform_device rk29_device_backlight = {
234 .name = "rk29_backlight",
237 .platform_data = &rk29_bl_info,
243 #ifdef CONFIG_RK29_SUPPORT_MODEM
245 #define RK30_MODEM_POWER RK30_PIN0_PC6
246 #define RK30_MODEM_POWER_IOMUX iomux_set(GPIO0_C6)
248 static int rk30_modem_io_init(void)
250 printk("%s\n", __FUNCTION__);
251 RK30_MODEM_POWER_IOMUX;
256 static struct rk29_io_t rk30_modem_io = {
257 .io_addr = RK30_MODEM_POWER,
260 .io_init = rk30_modem_io_init,
263 static struct platform_device rk30_device_modem = {
264 .name = "rk30_modem",
267 .platform_data = &rk30_modem_io,
271 #if defined(CONFIG_MU509)
272 static int mu509_io_init(void)
283 static int mu509_io_deinit(void)
289 struct rk29_mu509_data rk29_mu509_info = {
290 .io_init = mu509_io_init,
291 .io_deinit = mu509_io_deinit,
292 .modem_power_en = RK30_PIN2_PD5,
293 .bp_power = RK30_PIN0_PC6,
294 .bp_reset = RK30_PIN2_PD4,
295 .ap_wakeup_bp = RK30_PIN0_PC4,
296 .bp_wakeup_ap = RK30_PIN0_PC5,
298 struct platform_device rk29_device_mu509 = {
302 .platform_data = &rk29_mu509_info,
306 #if defined(CONFIG_MW100)
307 static int mw100_io_init(void)
317 static int mw100_io_deinit(void)
323 struct rk29_mw100_data rk29_mw100_info = {
324 .io_init = mw100_io_init,
325 .io_deinit = mw100_io_deinit,
326 .modem_power_en = RK30_PIN2_PD5,
327 .bp_power = RK30_PIN0_PC6,
328 .bp_reset = RK30_PIN2_PD4,
329 .ap_wakeup_bp = RK30_PIN0_PC4,
330 .bp_wakeup_ap = RK30_PIN0_PC5,
332 struct platform_device rk29_device_mw100 = {
336 .platform_data = &rk29_mw100_info,
340 #if defined(CONFIG_MT6229)
341 static int mt6229_io_init(void)
351 static int mt6229_io_deinit(void)
357 struct rk29_mt6229_data rk29_mt6229_info = {
358 .io_init = mt6229_io_init,
359 .io_deinit = mt6229_io_deinit,
360 .modem_power_en = RK30_PIN2_PD5,
361 .bp_power = RK30_PIN0_PC6,
362 .bp_reset = RK30_PIN2_PD4,
363 .ap_wakeup_bp = RK30_PIN0_PC4,
364 .bp_wakeup_ap = RK30_PIN0_PC5,
366 struct platform_device rk29_device_mt6229 = {
370 .platform_data = &rk29_mt6229_info,
376 #if defined (CONFIG_GS_MMA8452)
377 #define MMA8452_INT_PIN RK30_PIN0_PB7
379 static int mma8452_init_platform_hw(void)
384 static struct sensor_platform_data mma8452_info = {
385 .type = SENSOR_TYPE_ACCEL,
388 .init_platform_hw = mma8452_init_platform_hw,
389 .orientation = {-1, 0, 0, 0, -1, 0, 0, 0, 1},
392 #if defined (CONFIG_GS_LIS3DH)
393 #define LIS3DH_INT_PIN RK30_PIN0_PB7
395 static int lis3dh_init_platform_hw(void)
401 static struct sensor_platform_data lis3dh_info = {
402 .type = SENSOR_TYPE_ACCEL,
405 .init_platform_hw = lis3dh_init_platform_hw,
406 .orientation = {-1, 0, 0, 0, -1, 0, 0, 0, 1},
409 #if defined (CONFIG_COMPASS_AK8975)
410 static struct sensor_platform_data akm8975_info =
412 .type = SENSOR_TYPE_COMPASS,
445 #if defined(CONFIG_GYRO_L3G4200D)
447 #include <linux/l3g4200d.h>
448 #define L3G4200D_INT_PIN RK30_PIN0_PB4
450 static int l3g4200d_init_platform_hw(void)
455 static struct sensor_platform_data l3g4200d_info = {
456 .type = SENSOR_TYPE_GYROSCOPE,
459 .orientation = {0, 1, 0, -1, 0, 0, 0, 0, 1},
460 .init_platform_hw = l3g4200d_init_platform_hw,
461 .x_min = 40,//x_min,y_min,z_min = (0-100) according to hardware
468 #ifdef CONFIG_LS_CM3217
469 static struct sensor_platform_data cm3217_info = {
470 .type = SENSOR_TYPE_LIGHT,
472 .poll_delay_ms = 500,
477 #ifdef CONFIG_FB_ROCKCHIP
479 #define LCD_CS_PIN INVALID_GPIO
480 #define LCD_CS_VALUE GPIO_HIGH
482 #define LCD_EN_PIN RK30_PIN0_PB0
483 #define LCD_EN_VALUE GPIO_HIGH
485 static int rk_fb_io_init(struct rk29_fb_setting_info *fb_setting)
489 if(LCD_CS_PIN !=INVALID_GPIO)
491 ret = gpio_request(LCD_CS_PIN, NULL);
494 gpio_free(LCD_CS_PIN);
495 printk(KERN_ERR "request lcd cs pin fail!\n");
500 gpio_direction_output(LCD_CS_PIN, LCD_CS_VALUE);
504 if(LCD_EN_PIN !=INVALID_GPIO)
506 ret = gpio_request(LCD_EN_PIN, NULL);
509 gpio_free(LCD_EN_PIN);
510 printk(KERN_ERR "request lcd en pin fail!\n");
515 gpio_direction_output(LCD_EN_PIN, LCD_EN_VALUE);
520 static int rk_fb_io_disable(void)
522 if(LCD_CS_PIN !=INVALID_GPIO)
524 gpio_set_value(LCD_CS_PIN, !LCD_CS_VALUE);
526 if(LCD_EN_PIN !=INVALID_GPIO)
528 gpio_set_value(LCD_EN_PIN, !LCD_EN_VALUE);
532 static int rk_fb_io_enable(void)
534 if(LCD_CS_PIN !=INVALID_GPIO)
536 gpio_set_value(LCD_CS_PIN, LCD_CS_VALUE);
538 if(LCD_EN_PIN !=INVALID_GPIO)
540 gpio_set_value(LCD_EN_PIN, LCD_EN_VALUE);
545 #if defined(CONFIG_LCDC0_RK3066B) || defined(CONFIG_LCDC0_RK3188)
546 struct rk29fb_info lcdc0_screen_info = {
547 .prop = PRMRY, //primary display device
548 .io_init = rk_fb_io_init,
549 .io_disable = rk_fb_io_disable,
550 .io_enable = rk_fb_io_enable,
551 .set_screen_info = set_lcd_info,
555 #if defined(CONFIG_LCDC1_RK3066B) || defined(CONFIG_LCDC1_RK3188)
556 struct rk29fb_info lcdc1_screen_info = {
557 #if defined(CONFIG_RK_HDMI)
558 .prop = EXTEND, //extend display device
560 .set_screen_info = hdmi_init_lcdc,
565 static struct resource resource_fb[] = {
569 .end = 0,//RK30_FB0_MEM_SIZE - 1,
570 .flags = IORESOURCE_MEM,
573 .name = "ipp buf", //for rotate
575 .end = 0,//RK30_FB0_MEM_SIZE - 1,
576 .flags = IORESOURCE_MEM,
581 .end = 0,//RK30_FB0_MEM_SIZE - 1,
582 .flags = IORESOURCE_MEM,
586 static struct platform_device device_fb = {
589 .num_resources = ARRAY_SIZE(resource_fb),
590 .resource = resource_fb,
593 #if defined(CONFIG_ARCH_RK3188)
594 static struct resource resource_mali[] = {
599 .flags = IORESOURCE_MEM,
604 static struct platform_device device_mali= {
605 .name = "mali400_ump",
607 .num_resources = ARRAY_SIZE(resource_mali),
608 .resource = resource_mali,
612 #if defined(CONFIG_LCDC0_RK3066B) || defined(CONFIG_LCDC0_RK3188)
613 static struct resource resource_lcdc0[] = {
616 .start = RK30_LCDC0_PHYS,
617 .end = RK30_LCDC0_PHYS + RK30_LCDC0_SIZE - 1,
618 .flags = IORESOURCE_MEM,
625 .flags = IORESOURCE_IRQ,
629 static struct platform_device device_lcdc0 = {
632 .num_resources = ARRAY_SIZE(resource_lcdc0),
633 .resource = resource_lcdc0,
635 .platform_data = &lcdc0_screen_info,
639 #if defined(CONFIG_LCDC1_RK3066B) || defined(CONFIG_LCDC1_RK3188)
640 static struct resource resource_lcdc1[] = {
643 .start = RK30_LCDC1_PHYS,
644 .end = RK30_LCDC1_PHYS + RK30_LCDC1_SIZE - 1,
645 .flags = IORESOURCE_MEM,
651 .flags = IORESOURCE_IRQ,
655 static struct platform_device device_lcdc1 = {
658 .num_resources = ARRAY_SIZE(resource_lcdc1),
659 .resource = resource_lcdc1,
661 .platform_data = &lcdc1_screen_info,
666 #if defined(CONFIG_MFD_RK610)
667 #define RK610_RST_PIN RK30_PIN2_PC5
668 static int rk610_power_on_init(void)
671 if(RK610_RST_PIN != INVALID_GPIO)
673 ret = gpio_request(RK610_RST_PIN, "rk610 reset");
676 printk(KERN_ERR "rk610_control_probe request gpio fail\n");
680 gpio_direction_output(RK610_RST_PIN, GPIO_HIGH);
682 gpio_direction_output(RK610_RST_PIN, GPIO_LOW);
684 gpio_set_value(RK610_RST_PIN, GPIO_HIGH);
693 static struct rk610_ctl_platform_data rk610_ctl_pdata = {
694 .rk610_power_on_init = rk610_power_on_init,
698 #if defined(CONFIG_MFD_RK616)
699 #define RK616_RST_PIN RK30_PIN3_PB2
700 #define RK616_PWREN_PIN RK30_PIN0_PA3
701 #define RK616_SCL_RATE (100*1000) //i2c scl rate
702 static int rk616_power_on_init(void)
706 if(RK616_PWREN_PIN != INVALID_GPIO)
708 ret = gpio_request(RK616_PWREN_PIN, "rk616 pwren");
711 printk(KERN_ERR "rk616 pwren gpio request fail\n");
715 gpio_direction_output(RK616_PWREN_PIN,GPIO_HIGH);
719 if(RK616_RST_PIN != INVALID_GPIO)
721 ret = gpio_request(RK616_RST_PIN, "rk616 reset");
724 printk(KERN_ERR "rk616 reset gpio request fail\n");
728 gpio_direction_output(RK616_RST_PIN, GPIO_HIGH);
730 gpio_direction_output(RK616_RST_PIN, GPIO_LOW);
732 gpio_set_value(RK616_RST_PIN, GPIO_HIGH);
741 static struct rk616_platform_data rk616_pdata = {
742 .power_init = rk616_power_on_init,
743 .scl_rate = RK616_SCL_RATE,
747 #ifdef CONFIG_SND_SOC_RK610
748 static int rk610_codec_io_init(void)
751 //Must not gpio_request
755 static struct rk610_codec_platform_data rk610_codec_pdata = {
756 .spk_ctl_io = RK30_PIN2_PD7,
757 .io_init = rk610_codec_io_init,
761 #ifdef CONFIG_ANDROID_TIMED_GPIO
762 static struct timed_gpio timed_gpios[] = {
765 .gpio = INVALID_GPIO,
768 .adjust_time =20, //adjust for diff product
772 static struct timed_gpio_platform_data rk29_vibrator_info = {
774 .gpios = timed_gpios,
777 static struct platform_device rk29_device_vibrator = {
778 .name = "timed-gpio",
781 .platform_data = &rk29_vibrator_info,
787 #ifdef CONFIG_LEDS_GPIO_PLATFORM
788 static struct gpio_led rk29_leds[] = {
790 .name = "button-backlight",
791 .gpio = INVALID_GPIO,
792 .default_trigger = "timer",
794 .retain_state_suspended = 0,
795 .default_state = LEDS_GPIO_DEFSTATE_OFF,
799 static struct gpio_led_platform_data rk29_leds_pdata = {
801 .num_leds = ARRAY_SIZE(rk29_leds),
804 static struct platform_device rk29_device_gpio_leds = {
808 .platform_data = &rk29_leds_pdata,
813 #ifdef CONFIG_RK_IRDA
814 #define IRDA_IRQ_PIN INVALID_GPIO //RK30_PIN0_PA3
816 static int irda_iomux_init(void)
821 ret = gpio_request(IRDA_IRQ_PIN, NULL);
823 gpio_free(IRDA_IRQ_PIN);
824 printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n ");
826 gpio_pull_updown(IRDA_IRQ_PIN, PullDisable);
827 gpio_direction_input(IRDA_IRQ_PIN);
832 static int irda_iomux_deinit(void)
834 gpio_free(IRDA_IRQ_PIN);
838 static struct irda_info rk29_irda_info = {
839 .intr_pin = IRDA_IRQ_PIN,
840 .iomux_init = irda_iomux_init,
841 .iomux_deinit = irda_iomux_deinit,
842 //.irda_pwr_ctl = bu92747guw_power_ctl,
845 static struct platform_device irda_device = {
846 #ifdef CONFIG_RK_IRDA_NET
849 .name = "bu92747_irda",
853 .platform_data = &rk29_irda_info,
859 #define ION_RESERVE_SIZE (80 * SZ_1M)
860 static struct ion_platform_data rk30_ion_pdata = {
864 .type = ION_HEAP_TYPE_CARVEOUT,
865 .id = ION_NOR_HEAP_ID,
867 .size = ION_RESERVE_SIZE,
872 static struct platform_device device_ion = {
873 .name = "ion-rockchip",
876 .platform_data = &rk30_ion_pdata,
881 /**************************************************************************************************
882 * SDMMC devices, include the module of SD,MMC,and sdio.noted by xbw at 2012-03-05
883 **************************************************************************************************/
884 #ifdef CONFIG_SDMMC_RK29
885 #include "board-rk3168-tb-sdmmc-conifg.c"
886 #include "../plat-rk/rk-sdmmc-ops.c"
887 #include "../plat-rk/rk-sdmmc-wifi.c"
888 #endif //endif ---#ifdef CONFIG_SDMMC_RK29
890 #ifdef CONFIG_SDMMC0_RK29
891 static int rk29_sdmmc0_cfg_gpio(void)
893 #ifdef CONFIG_SDMMC_RK29_OLD
895 iomux_set(MMC0_CLKOUT);
901 iomux_set_gpio_mode(iomux_mode_to_gpio(MMC0_DETN));
903 gpio_request(RK30_PIN3_PA7, "sdmmc-power");
904 gpio_direction_output(RK30_PIN3_PA7, GPIO_LOW);
907 rk29_sdmmc_set_iomux(0, 0xFFFF);
909 #if defined(CONFIG_SDMMC0_RK29_SDCARD_DET_FROM_GPIO)
910 #if SDMMC_USE_NEW_IOMUX_API
911 iomux_set_gpio_mode(iomux_gpio_to_mode(RK29SDK_SD_CARD_DETECT_N));
913 rk30_mux_api_set(RK29SDK_SD_CARD_DETECT_PIN_NAME, RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO);
916 #if SDMMC_USE_NEW_IOMUX_API
917 iomux_set(MMC0_DETN);
919 rk30_mux_api_set(RK29SDK_SD_CARD_DETECT_PIN_NAME, RK29SDK_SD_CARD_DETECT_IOMUX_FMUX);
923 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
924 gpio_request(SDMMC0_WRITE_PROTECT_PIN, "sdmmc-wp");
925 gpio_direction_input(SDMMC0_WRITE_PROTECT_PIN);
933 #define CONFIG_SDMMC0_USE_DMA
934 struct rk29_sdmmc_platform_data default_sdmmc0_data = {
936 (MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 | MMC_VDD_28_29 |
937 MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33 |
938 MMC_VDD_33_34 | MMC_VDD_34_35 | MMC_VDD_35_36),
940 (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
941 .io_init = rk29_sdmmc0_cfg_gpio,
943 #if !defined(CONFIG_SDMMC_RK29_OLD)
944 .set_iomux = rk29_sdmmc_set_iomux,
947 .dma_name = "sd_mmc",
948 #ifdef CONFIG_SDMMC0_USE_DMA
954 #if defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC) && defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
955 .status = rk29sdk_wifi_mmc0_status,
956 .register_status_notify = rk29sdk_wifi_mmc0_status_register,
959 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
960 .power_en = RK29SDK_SD_CARD_PWR_EN,
961 .power_en_level = RK29SDK_SD_CARD_PWR_EN_LEVEL,
963 .power_en = INVALID_GPIO,
964 .power_en_level = GPIO_LOW,
966 .enable_sd_wakeup = 0,
968 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
969 .write_prt = SDMMC0_WRITE_PROTECT_PIN,
970 .write_prt_enalbe_level = SDMMC0_WRITE_PROTECT_ENABLE_VALUE;
972 .write_prt = INVALID_GPIO,
976 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)
977 .io = RK29SDK_SD_CARD_DETECT_N, //INVALID_GPIO,
978 .enable = RK29SDK_SD_CARD_INSERT_LEVEL,
979 #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
981 .name = RK29SDK_SD_CARD_DETECT_PIN_NAME,
982 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
983 .fgpio = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
985 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
986 .fmux = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
997 #endif // CONFIG_SDMMC0_RK29
999 #ifdef CONFIG_SDMMC1_RK29
1000 #define CONFIG_SDMMC1_USE_DMA
1001 static int rk29_sdmmc1_cfg_gpio(void)
1003 #if defined(CONFIG_SDMMC_RK29_OLD)
1004 iomux_set(MMC1_CMD);
1005 iomux_set(MMC1_CLKOUT);
1012 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1013 gpio_request(SDMMC1_WRITE_PROTECT_PIN, "sdio-wp");
1014 gpio_direction_input(SDMMC1_WRITE_PROTECT_PIN);
1022 struct rk29_sdmmc_platform_data default_sdmmc1_data = {
1024 (MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 | MMC_VDD_28_29 |
1025 MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33 |
1028 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1029 .host_caps = (MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ |
1030 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1033 (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1036 .io_init = rk29_sdmmc1_cfg_gpio,
1038 #if !defined(CONFIG_SDMMC_RK29_OLD)
1039 .set_iomux = rk29_sdmmc_set_iomux,
1043 #ifdef CONFIG_SDMMC1_USE_DMA
1049 #if defined(CONFIG_WIFI_CONTROL_FUNC) || defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
1050 .status = rk29sdk_wifi_status,
1051 .register_status_notify = rk29sdk_wifi_status_register,
1054 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1055 .write_prt = SDMMC1_WRITE_PROTECT_PIN,
1056 .write_prt_enalbe_level = SDMMC1_WRITE_PROTECT_ENABLE_VALUE;
1058 .write_prt = INVALID_GPIO,
1061 #if defined(CONFIG_RK29_SDIO_IRQ_FROM_GPIO)
1062 .sdio_INT_gpio = RK29SDK_WIFI_SDIO_CARD_INT,
1066 #if defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1067 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)
1068 .io = RK29SDK_SD_CARD_DETECT_N,
1073 .enable = RK29SDK_SD_CARD_INSERT_LEVEL,
1074 #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
1076 .name = RK29SDK_SD_CARD_DETECT_PIN_NAME,
1077 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
1078 .fgpio = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
1080 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
1081 .fmux = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
1091 .enable_sd_wakeup = 0,
1093 #endif //endif--#ifdef CONFIG_SDMMC1_RK29
1095 /**************************************************************************************************
1096 * the end of setting for SDMMC devices
1097 **************************************************************************************************/
1099 #ifdef CONFIG_BATTERY_RK30_ADC
1100 static struct rk30_adc_battery_platform_data rk30_adc_battery_platdata = {
1101 .dc_det_pin = RK30_PIN0_PB2,
1102 .batt_low_pin = RK30_PIN0_PB1,
1103 .charge_set_pin = INVALID_GPIO,
1104 .charge_ok_pin = RK30_PIN0_PA6,
1105 .dc_det_level = GPIO_LOW,
1106 .charge_ok_level = GPIO_HIGH,
1109 static struct platform_device rk30_device_adc_battery = {
1110 .name = "rk30-battery",
1113 .platform_data = &rk30_adc_battery_platdata,
1117 #ifdef CONFIG_CW2015_BATTERY
1119 note the follow array must set depend on the battery that you use
1120 you must send the battery to cellwise-semi the contact information:
1121 name: chen gan; tel:13416876079; E-mail: ben.chen@cellwise-semi.com
1123 static u8 config_info[SIZE_BATINFO] = {
1124 0x15, 0x42, 0x60, 0x59, 0x52,
1125 0x58, 0x4D, 0x48, 0x48, 0x44,
1126 0x44, 0x46, 0x49, 0x48, 0x32,
1127 0x24, 0x20, 0x17, 0x13, 0x0F,
1128 0x19, 0x3E, 0x51, 0x45, 0x08,
1129 0x76, 0x0B, 0x85, 0x0E, 0x1C,
1130 0x2E, 0x3E, 0x4D, 0x52, 0x52,
1131 0x57, 0x3D, 0x1B, 0x6A, 0x2D,
1132 0x25, 0x43, 0x52, 0x87, 0x8F,
1133 0x91, 0x94, 0x52, 0x82, 0x8C,
1134 0x92, 0x96, 0xFF, 0x7B, 0xBB,
1135 0xCB, 0x2F, 0x7D, 0x72, 0xA5,
1136 0xB5, 0xC1, 0x46, 0xAE
1139 static struct cw_bat_platform_data cw_bat_platdata = {
1140 .dc_det_pin = RK30_PIN0_PB2,
1141 .bat_low_pin = RK30_PIN0_PB1,
1142 .chg_ok_pin = RK30_PIN0_PA6,
1143 .dc_det_level = GPIO_LOW,
1144 .bat_low_level = GPIO_LOW,
1145 .chg_ok_level = GPIO_HIGH,
1147 .cw_bat_config_info = config_info,
1152 #ifdef CONFIG_RK30_PWM_REGULATOR
1153 static int pwm_voltage_map[] = {
1154 800000,825000,850000, 875000,900000, 925000 ,950000, 975000,1000000, 1025000, 1050000, 1075000, 1100000, 1125000, 1150000, 1175000, 1200000, 1225000, 1250000, 1275000, 1300000, 1325000, 1350000,1375000
1156 static struct regulator_consumer_supply pwm_dcdc1_consumers[] = {
1158 .supply = "vdd_cpu",
1162 struct regulator_init_data pwm_regulator_init_dcdc[1] =
1166 .name = "PWM_DCDC1",
1168 .max_uV = 1800000, //0.6-1.8V
1170 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
1172 .num_consumer_supplies = ARRAY_SIZE(pwm_dcdc1_consumers),
1173 .consumer_supplies = pwm_dcdc1_consumers,
1177 static struct pwm_platform_data pwm_regulator_info[1] = {
1180 .pwm_gpio = RK30_PIN3_PD4,
1181 .pwm_iomux_pwm = PWM1,
1182 .pwm_iomux_gpio = GPIO3_D4,
1183 .pwm_voltage = 1100000,
1184 .suspend_voltage = 1000000,
1187 .coefficient = 575, //57.5%
1188 .pwm_voltage_map = pwm_voltage_map,
1189 .init_data = &pwm_regulator_init_dcdc[0],
1193 struct platform_device pwm_regulator_device[1] = {
1195 .name = "pwm-voltage-regulator",
1198 .platform_data = &pwm_regulator_info[0],
1204 #ifdef CONFIG_RK29_VMAC
1205 #define PHY_PWR_EN_GPIO RK30_PIN1_PD6
1206 #include "board-rk30-sdk-vmac.c"
1209 #ifdef CONFIG_RFKILL_RK
1210 // bluetooth rfkill device, its driver in net/rfkill/rfkill-rk.c
1211 static struct rfkill_rk_platform_data rfkill_rk_platdata = {
1212 .type = RFKILL_TYPE_BLUETOOTH,
1214 .poweron_gpio = { // BT_REG_ON
1215 .io = INVALID_GPIO, //RK30_PIN3_PC7,
1216 .enable = GPIO_HIGH,
1218 .name = "bt_poweron",
1223 .reset_gpio = { // BT_RST
1224 .io = RK30_PIN3_PC7, // set io to INVALID_GPIO for disable it
1232 .wake_gpio = { // BT_WAKE, use to control bt's sleep and wakeup
1233 .io = RK30_PIN3_PC6, // set io to INVALID_GPIO for disable it
1234 .enable = GPIO_HIGH,
1241 .wake_host_irq = { // BT_HOST_WAKE, for bt wakeup host when it is in deep sleep
1243 .io = RK30_PIN0_PA5, // set io to INVALID_GPIO for disable it
1244 .enable = GPIO_LOW, // set GPIO_LOW for falling, set 0 for rising
1251 .rts_gpio = { // UART_RTS, enable or disable BT's data coming
1252 .io = RK30_PIN1_PA3, // set io to INVALID_GPIO for disable it
1262 static struct platform_device device_rfkill_rk = {
1263 .name = "rfkill_rk",
1266 .platform_data = &rfkill_rk_platdata,
1271 #if defined(CONFIG_GPS_RK)
1272 int rk_gps_io_init(void)
1274 printk("%s \n", __FUNCTION__);
1276 gpio_request(RK30_PIN1_PB5, NULL);
1277 gpio_direction_output(RK30_PIN1_PB5, GPIO_LOW);
1279 iomux_set(GPS_RFCLK);//GPS_CLK
1280 iomux_set(GPS_MAG);//GPS_MAG
1281 iomux_set(GPS_SIG);//GPS_SIGN
1283 gpio_request(RK30_PIN1_PA6, NULL);
1284 gpio_direction_output(RK30_PIN1_PA6, GPIO_LOW);
1286 gpio_request(RK30_PIN1_PA5, NULL);
1287 gpio_direction_output(RK30_PIN1_PA5, GPIO_LOW);
1289 gpio_request(RK30_PIN1_PA7, NULL);
1290 gpio_direction_output(RK30_PIN1_PA7, GPIO_LOW);
1293 int rk_gps_power_up(void)
1295 printk("%s \n", __FUNCTION__);
1300 int rk_gps_power_down(void)
1302 printk("%s \n", __FUNCTION__);
1307 int rk_gps_reset_set(int level)
1311 int rk_enable_hclk_gps(void)
1313 struct clk *gps_aclk = NULL;
1314 gps_aclk = clk_get(NULL, "aclk_gps");
1316 clk_enable(gps_aclk);
1318 printk("%s \n", __FUNCTION__);
1321 printk("get gps aclk fail\n");
1324 int rk_disable_hclk_gps(void)
1326 struct clk *gps_aclk = NULL;
1327 gps_aclk = clk_get(NULL, "aclk_gps");
1329 //TO wait long enough until GPS ISR is finished.
1331 clk_disable(gps_aclk);
1333 printk("%s \n", __FUNCTION__);
1336 printk("get gps aclk fail\n");
1339 struct rk_gps_data rk_gps_info = {
1340 .io_init = rk_gps_io_init,
1341 .power_up = rk_gps_power_up,
1342 .power_down = rk_gps_power_down,
1343 .reset = rk_gps_reset_set,
1344 .enable_hclk_gps = rk_enable_hclk_gps,
1345 .disable_hclk_gps = rk_disable_hclk_gps,
1346 .GpsSign = RK30_PIN1_PB3,
1347 .GpsMag = RK30_PIN1_PB2, //GPIO index
1348 .GpsClk = RK30_PIN1_PB4, //GPIO index
1349 .GpsVCCEn = RK30_PIN1_PB5, //GPIO index
1350 .GpsSpi_CSO = RK30_PIN1_PA4, //GPIO index
1351 .GpsSpiClk = RK30_PIN1_PA5, //GPIO index
1352 .GpsSpiMOSI = RK30_PIN1_PA7, //GPIO index
1356 .u32GpsPhyAddr = RK30_GPS_PHYS,
1357 .u32GpsPhySize = RK30_GPS_SIZE,
1360 struct platform_device rk_device_gps = {
1361 .name = "gps_hv5820b",
1364 .platform_data = &rk_gps_info,
1369 #if defined(CONFIG_MT5931_MT6622)
1370 static struct mt6622_platform_data mt6622_platdata = {
1371 .power_gpio = { // BT_REG_ON
1372 .io = RK30_PIN3_PD5, // set io to INVALID_GPIO for disable it
1373 .enable = GPIO_HIGH,
1379 .reset_gpio = { // BT_RST
1380 .io = RK30_PIN0_PD7,
1381 .enable = GPIO_HIGH,
1388 .io = RK30_PIN3_PD2,
1389 .enable = GPIO_HIGH,
1396 static struct platform_device device_mt6622 = {
1400 .platform_data = &mt6622_platdata,
1405 static struct platform_device *devices[] __initdata = {
1409 #ifdef CONFIG_ANDROID_TIMED_GPIO
1410 &rk29_device_vibrator,
1412 #ifdef CONFIG_LEDS_GPIO_PLATFORM
1413 &rk29_device_gpio_leds,
1415 #ifdef CONFIG_RK_IRDA
1418 #if defined(CONFIG_WIFI_CONTROL_FUNC)||defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
1419 &rk29sdk_wifi_device,
1422 #if defined(CONFIG_MT6620)
1426 #ifdef CONFIG_RK29_SUPPORT_MODEM
1429 #if defined(CONFIG_MU509)
1432 #if defined(CONFIG_MW100)
1435 #if defined(CONFIG_MT6229)
1436 &rk29_device_mt6229,
1438 #ifdef CONFIG_BATTERY_RK30_ADC
1439 &rk30_device_adc_battery,
1441 #ifdef CONFIG_RFKILL_RK
1444 #ifdef CONFIG_GPS_RK
1447 #if defined(CONFIG_ARCH_RK3188)
1450 #ifdef CONFIG_MT5931_MT6622
1455 static int rk_platform_add_display_devices(void)
1457 struct platform_device *fb = NULL; //fb
1458 struct platform_device *lcdc0 = NULL; //lcdc0
1459 struct platform_device *lcdc1 = NULL; //lcdc1
1460 struct platform_device *bl = NULL; //backlight
1461 #ifdef CONFIG_FB_ROCKCHIP
1465 #if defined(CONFIG_LCDC0_RK3066B) || defined(CONFIG_LCDC0_RK3188)
1466 lcdc0 = &device_lcdc0,
1469 #if defined(CONFIG_LCDC1_RK3066B) || defined(CONFIG_LCDC1_RK3188)
1470 lcdc1 = &device_lcdc1,
1473 #ifdef CONFIG_BACKLIGHT_RK29_BL
1474 bl = &rk29_device_backlight,
1476 __rk_platform_add_display_devices(fb,lcdc0,lcdc1,bl);
1483 #ifdef CONFIG_I2C0_RK30
1484 static struct i2c_board_info __initdata i2c0_info[] = {
1485 #if defined (CONFIG_GS_MMA8452)
1487 .type = "gs_mma8452",
1490 .irq = MMA8452_INT_PIN,
1491 .platform_data = &mma8452_info,
1494 #if defined (CONFIG_GS_LIS3DH)
1496 .type = "gs_lis3dh",
1497 .addr = 0x19, //0x19(SA0-->VCC), 0x18(SA0-->GND)
1499 .irq = LIS3DH_INT_PIN,
1500 .platform_data = &lis3dh_info,
1503 #if defined (CONFIG_COMPASS_AK8975)
1508 .irq = RK30_PIN3_PD7,
1509 .platform_data = &akm8975_info,
1512 #if defined (CONFIG_GYRO_L3G4200D)
1514 .type = "l3g4200d_gryo",
1517 .irq = L3G4200D_INT_PIN,
1518 .platform_data = &l3g4200d_info,
1521 #if defined (CONFIG_SND_SOC_RK1000)
1523 .type = "rk1000_i2c_codec",
1528 .type = "rk1000_control",
1533 #if defined (CONFIG_SND_SOC_RT5631)
1541 #if defined (CONFIG_SND_SOC_RT5640)
1549 #ifdef CONFIG_MFD_RK610
1551 .type = "rk610_ctl",
1554 .platform_data = &rk610_ctl_pdata,
1556 #ifdef CONFIG_RK610_TVOUT
1558 .type = "rk610_tvout",
1563 #ifdef CONFIG_HDMI_RK610
1565 .type = "rk610_hdmi",
1568 .irq = INVALID_GPIO,
1571 #ifdef CONFIG_SND_SOC_RK610
1572 {//RK610_CODEC addr from 0x60 to 0x80 (0x60~0x80)
1573 .type = "rk610_i2c_codec",
1576 .platform_data = &rk610_codec_pdata,
1584 int __sramdata g_pmic_type = 0;
1585 #ifdef CONFIG_I2C1_RK30
1586 #ifdef CONFIG_MFD_WM831X_I2C
1587 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1589 static struct pmu_info wm8326_dcdc_info[] = {
1591 .name = "vdd_core", //logic
1594 .suspend_vol = 950000,
1597 .name = "vdd_cpu", //arm
1600 .suspend_vol = 950000,
1603 .name = "dcdc3", //ddr
1606 .suspend_vol = 1150000,
1608 #ifdef CONFIG_MACH_RK3066_SDK
1610 .name = "dcdc4", //vcc_io
1613 .suspend_vol = 3000000,
1617 .name = "dcdc4", //vcc_io
1620 .suspend_vol = 2800000,
1625 static struct pmu_info wm8326_ldo_info[] = {
1627 .name = "ldo1", //vcc18_cif
1630 .suspend_vol = 1800000,
1633 .name = "ldo2", //vccio_wl
1636 .suspend_vol = 1800000,
1642 .suspend_vol = 1100000,
1645 .name = "ldo4", //vdd11
1648 .suspend_vol = 1000000,
1651 .name = "ldo5", //vcc25
1654 .suspend_vol = 1800000,
1657 .name = "ldo6", //vcc33
1660 .suspend_vol = 3300000,
1663 .name = "ldo7", //vcc28_cif
1666 .suspend_vol = 2800000,
1669 .name = "ldo8", //vcca33
1672 .suspend_vol = 3300000,
1675 .name = "ldo9", //vcc_tp
1678 .suspend_vol = 3300000,
1681 .name = "ldo10", //flash_io
1684 .suspend_vol = 1800000,
1688 #include "board-pmu-wm8326.c"
1691 #ifdef CONFIG_MFD_TPS65910
1692 #define TPS65910_HOST_IRQ RK30_PIN0_PB3
1694 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1696 static struct pmu_info tps65910_dcdc_info[] = {
1698 .name = "vdd_core", //logic
1703 .name = "vdd2", //ddr
1708 .name = "vio", //vcc_io
1714 static struct pmu_info tps65910_ldo_info[] = {
1716 .name = "vpll", //vdd10
1721 .name = "vdig1", //vcc18_cif
1726 .name = "vdig2", //vdd_jetta
1731 .name = "vaux1", //vcc28_cif
1736 .name = "vaux2", //vcca33
1741 .name = "vaux33", //vcc_tp
1746 .name = "vmmc", //vcc30
1751 .name = "vdac", //vcc18
1757 #include "board-pmu-tps65910.c"
1760 #ifdef CONFIG_REGULATOR_ACT8846
1761 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1762 #define PMU_VSEL RK30_PIN3_PD3
1763 static struct pmu_info act8846_dcdc_info[] = {
1765 .name = "act_dcdc1", //ddr
1768 .suspend_vol = 1200000,
1771 .name = "vdd_core", //logic
1774 #ifdef CONFIG_ACT8846_SUPPORT_RESET
1775 .suspend_vol = 1200000,
1777 .suspend_vol = 900000,
1782 .name = "vdd_cpu", //arm
1785 #ifdef CONFIG_ACT8846_SUPPORT_RESET
1786 .suspend_vol = 1200000,
1788 .suspend_vol = 900000,
1793 .name = "act_dcdc4", //vccio
1796 #ifdef CONFIG_ACT8846_SUPPORT_RESET
1797 .suspend_vol = 3000000,
1799 .suspend_vol = 2800000,
1805 static struct pmu_info act8846_ldo_info[] = {
1807 .name = "act_ldo1", //vdd11
1812 .name = "act_ldo2", //vdd12
1817 .name = "act_ldo3", //vcc18_cif
1822 .name = "act_ldo4", //vcca33
1827 .name = "act_ldo5", //vcctp
1832 .name = "act_ldo6", //vcc33
1837 .name = "act_ldo7", //vccio_wl
1842 .name = "act_ldo8", //vcc28_cif
1848 #include "board-pmu-act8846.c"
1851 #ifdef CONFIG_MFD_RK808
1852 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1853 #define RK808_HOST_IRQ RK30_PIN0_PB3
1855 static struct pmu_info rk808_dcdc_info[] = {
1857 .name = "vdd_cpu", //arm
1860 .suspend_vol = 900000,
1863 .name = "vdd_core", //logic
1866 .suspend_vol = 900000,
1869 .name = "rk_dcdc3", //ddr
1872 .suspend_vol = 1200000,
1875 .name = "rk_dcdc4", //vccio
1878 .suspend_vol = 3000000,
1882 static struct pmu_info rk808_ldo_info[] = {
1884 .name = "rk_ldo1", //vcc33
1887 .suspend_vol = 3300000,
1890 .name = "rk_ldo2", //vcctp
1893 .suspend_vol = 3300000,
1897 .name = "rk_ldo3", //vdd10
1900 .suspend_vol = 1000000,
1903 .name = "rk_ldo4", //vcc18
1906 .suspend_vol = 1800000,
1909 .name = "rk_ldo5", //vcc28_cif
1912 .suspend_vol = 2800000,
1915 .name = "rk_ldo6", //vdd12
1918 .suspend_vol = 1200000,
1921 .name = "rk_ldo7", //vcc18_cif
1924 .suspend_vol = 1800000,
1927 .name = "rk_ldo8", //vcca_33
1930 .suspend_vol = 3300000,
1934 #include "board-pmu-rk808.c"
1936 #ifdef CONFIG_MFD_RICOH619
1937 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1938 #define RICOH619_HOST_IRQ RK30_PIN0_PB3
1940 static struct pmu_info ricoh619_dcdc_info[] = {
1942 .name = "vdd_cpu", //arm
1945 .suspend_vol = 900000,
1948 .name = "vdd_core", //logic
1951 .suspend_vol = 900000,
1955 .name = "ricoh_dc3", //vcc18
1958 .suspend_vol = 1800000,
1962 .name = "ricoh_dc4", //vccio
1965 .suspend_vol = 3300000,
1969 .name = "ricoh_dc5", //ddr
1972 .suspend_vol = 1200000,
1976 static struct pmu_info ricoh619_ldo_info[] = {
1978 .name = "ricoh_ldo1", //vcc30
1983 .name = "ricoh_ldo2", //vcca33
1988 .name = "ricoh_ldo3", //vcctp
1993 .name = "ricoh_ldo4", //vccsd
1998 .name = "ricoh_ldo5", //vcc18_cif
2003 .name = "ricoh_ldo6", //vdd12
2008 .name = "ricoh_ldo7", //vcc28_cif
2013 .name = "ricoh_ldo8", //vcc25
2018 .name = "ricoh_ldo9", //vdd10
2023 .name = "ricoh_ldo10", //vcca18
2030 #include "board-pmu-ricoh619.c"
2035 static struct i2c_board_info __initdata i2c1_info[] = {
2036 #if defined (CONFIG_MFD_WM831X_I2C)
2041 .irq = RK30_PIN0_PB3,
2042 .platform_data = &wm831x_platdata,
2045 #if defined (CONFIG_MFD_TPS65910)
2048 .addr = TPS65910_I2C_ID0,
2050 .irq = TPS65910_HOST_IRQ,
2051 .platform_data = &tps65910_data,
2055 #if defined (CONFIG_REGULATOR_ACT8846)
2060 // .irq = ACT8846_HOST_IRQ,
2061 .platform_data=&act8846_data,
2064 #if defined (CONFIG_MFD_RK808)
2069 // .irq = ACT8846_HOST_IRQ,
2070 .platform_data=&rk808_data,
2074 #if defined (CONFIG_MFD_RICOH619)
2079 .irq = RICOH619_HOST_IRQ,
2080 .platform_data=&ricoh619_data,
2084 #if defined (CONFIG_RTC_HYM8563)
2086 .type = "rtc_hym8563",
2089 .irq = RK30_PIN1_PA4,
2091 #if defined (CONFIG_CW2015_BATTERY)
2096 .platform_data = &cw_bat_platdata,
2104 void __sramfunc board_pmu_suspend(void)
2106 #if defined (CONFIG_MFD_WM831X_I2C)
2107 if(pmic_is_wm8326())
2108 board_pmu_wm8326_suspend();
2110 #if defined (CONFIG_MFD_TPS65910)
2111 if(pmic_is_tps65910())
2112 board_pmu_tps65910_suspend();
2114 #if defined (CONFIG_REGULATOR_ACT8846)
2115 if(pmic_is_act8846())
2116 board_pmu_act8846_suspend();
2118 #if defined (CONFIG_MFD_RK808)
2120 board_pmu_rk808_suspend();
2122 #if defined (CONFIG_MFD_RICOH619)
2123 if(pmic_is_ricoh619())
2124 board_pmu_ricoh619_suspend();
2129 void __sramfunc board_pmu_resume(void)
2131 #if defined (CONFIG_MFD_WM831X_I2C)
2132 if(pmic_is_wm8326())
2133 board_pmu_wm8326_resume();
2135 #if defined (CONFIG_MFD_TPS65910)
2136 if(pmic_is_tps65910())
2137 board_pmu_tps65910_resume();
2139 #if defined (CONFIG_REGULATOR_ACT8846)
2140 if(pmic_is_act8846())
2141 board_pmu_act8846_resume();
2143 #if defined (CONFIG_MFD_RK808)
2145 board_pmu_rk808_resume();
2147 #if defined (CONFIG_MFD_RICOH619)
2148 if(pmic_is_ricoh619())
2149 board_pmu_ricoh619_resume();
2154 int __sramdata gpio3d6_iomux,gpio3d6_do,gpio3d6_dir,gpio3d6_en;
2156 #define grf_readl(offset) readl_relaxed(RK30_GRF_BASE + offset)
2157 #define grf_writel(v, offset) do { writel_relaxed(v, RK30_GRF_BASE + offset); dsb(); } while (0)
2159 void __sramfunc rk30_pwm_logic_suspend_voltage(void)
2161 #ifdef CONFIG_RK30_PWM_REGULATOR
2163 // int gpio0d7_iomux,gpio0d7_do,gpio0d7_dir,gpio0d7_en;
2165 gpio3d6_iomux = grf_readl(GRF_GPIO3D_IOMUX);
2166 gpio3d6_do = grf_readl(GRF_GPIO3H_DO);
2167 gpio3d6_dir = grf_readl(GRF_GPIO3H_DIR);
2168 gpio3d6_en = grf_readl(GRF_GPIO3H_EN);
2170 grf_writel((1<<28), GRF_GPIO3D_IOMUX);
2171 grf_writel((1<<30)|(1<<14), GRF_GPIO3H_DIR);
2172 grf_writel((1<<30)|(1<<14), GRF_GPIO3H_DO);
2173 grf_writel((1<<30)|(1<<14), GRF_GPIO3H_EN);
2176 void __sramfunc rk30_pwm_logic_resume_voltage(void)
2178 #ifdef CONFIG_RK30_PWM_REGULATOR
2179 grf_writel((1<<28)|gpio3d6_iomux, GRF_GPIO3D_IOMUX);
2180 grf_writel((1<<30)|gpio3d6_en, GRF_GPIO3H_EN);
2181 grf_writel((1<<30)|gpio3d6_dir, GRF_GPIO3H_DIR);
2182 grf_writel((1<<30)|gpio3d6_do, GRF_GPIO3H_DO);
2188 extern void pwm_suspend_voltage(void);
2189 extern void pwm_resume_voltage(void);
2190 void rk30_pwm_suspend_voltage_set(void)
2192 #ifdef CONFIG_RK30_PWM_REGULATOR
2193 pwm_suspend_voltage();
2196 void rk30_pwm_resume_voltage_set(void)
2198 #ifdef CONFIG_RK30_PWM_REGULATOR
2199 pwm_resume_voltage();
2204 #ifdef CONFIG_I2C2_RK30
2205 static struct i2c_board_info __initdata i2c2_info[] = {
2206 #if defined (CONFIG_TOUCHSCREEN_GT8XX)
2208 .type = "Goodix-TS",
2211 .irq = RK30_PIN1_PB7,
2212 .platform_data = &goodix_info,
2215 #if defined (CONFIG_LS_CM3217)
2217 .type = "lightsensor",
2220 .platform_data = &cm3217_info,
2226 #ifdef CONFIG_I2C3_RK30
2227 static struct i2c_board_info __initdata i2c3_info[] = {
2231 #ifdef CONFIG_I2C4_RK30
2232 static struct i2c_board_info __initdata i2c4_info[] = {
2233 #if defined (CONFIG_MFD_RK616)
2238 .platform_data = &rk616_pdata,
2245 #ifdef CONFIG_I2C_GPIO_RK30
2246 #define I2C_SDA_PIN INVALID_GPIO// RK30_PIN2_PD6 //set sda_pin here
2247 #define I2C_SCL_PIN INVALID_GPIO//RK30_PIN2_PD7 //set scl_pin here
2248 static int rk30_i2c_io_init(void)
2250 //set iomux (gpio) here
2251 //rk30_mux_api_set(GPIO2D7_I2C1SCL_NAME, GPIO2D_GPIO2D7);
2252 //rk30_mux_api_set(GPIO2D6_I2C1SDA_NAME, GPIO2D_GPIO2D6);
2256 struct i2c_gpio_platform_data default_i2c_gpio_data = {
2257 .sda_pin = I2C_SDA_PIN,
2258 .scl_pin = I2C_SCL_PIN,
2259 .udelay = 5, // clk = 500/udelay = 100Khz
2260 .timeout = 100,//msecs_to_jiffies(100),
2262 .io_init = rk30_i2c_io_init,
2264 static struct i2c_board_info __initdata i2c_gpio_info[] = {
2268 static void __init rk30_i2c_register_board_info(void)
2270 #ifdef CONFIG_I2C0_RK30
2271 i2c_register_board_info(0, i2c0_info, ARRAY_SIZE(i2c0_info));
2273 #ifdef CONFIG_I2C1_RK30
2274 i2c_register_board_info(1, i2c1_info, ARRAY_SIZE(i2c1_info));
2276 #ifdef CONFIG_I2C2_RK30
2277 i2c_register_board_info(2, i2c2_info, ARRAY_SIZE(i2c2_info));
2279 #ifdef CONFIG_I2C3_RK30
2280 i2c_register_board_info(3, i2c3_info, ARRAY_SIZE(i2c3_info));
2282 #ifdef CONFIG_I2C4_RK30
2283 i2c_register_board_info(4, i2c4_info, ARRAY_SIZE(i2c4_info));
2285 #ifdef CONFIG_I2C_GPIO_RK30
2286 i2c_register_board_info(5, i2c_gpio_info, ARRAY_SIZE(i2c_gpio_info));
2291 // ========== Begin of rk3168 top board keypad defination ============
2293 #include <plat/key.h>
2295 static struct rk29_keys_button key_button[] = {
2298 .code = KEY_VOLUMEDOWN,
2300 .gpio = INVALID_GPIO,
2301 .active_low = PRESS_LEV_LOW,
2306 .gpio = RK30_PIN0_PA4,
2307 .active_low = PRESS_LEV_LOW,
2312 .code = KEY_VOLUMEUP,
2314 .gpio = INVALID_GPIO,
2315 .active_low = PRESS_LEV_LOW,
2321 .gpio = INVALID_GPIO,
2322 .active_low = PRESS_LEV_LOW,
2328 .gpio = INVALID_GPIO,
2329 .active_low = PRESS_LEV_LOW,
2335 .gpio = INVALID_GPIO,
2336 .active_low = PRESS_LEV_LOW,
2342 .gpio = INVALID_GPIO,
2343 .active_low = PRESS_LEV_LOW,
2346 struct rk29_keys_platform_data rk29_keys_pdata = {
2347 .buttons = key_button,
2348 .nbuttons = ARRAY_SIZE(key_button),
2349 .chn = 1, //chn: 0-7, if do not use ADC,set 'chn' -1
2352 // =========== End of rk3168 top board keypad defination =============
2355 #define POWER_ON_PIN RK30_PIN0_PA0 //power_hold
2356 static void rk30_pm_power_off(void)
2358 printk(KERN_ERR "rk30_pm_power_off start...\n");
2359 #if defined(CONFIG_MFD_WM831X)
2360 if(pmic_is_wm8326()){
2361 wm831x_set_bits(Wm831x,WM831X_GPIO_LEVEL,0x0001,0x0000); //set sys_pwr 0
2362 wm831x_device_shutdown(Wm831x);//wm8326 shutdown
2366 #if defined(CONFIG_REGULATOR_ACT8846)
2367 if(pmic_is_act8846())
2369 act8846_device_shutdown();
2373 #if defined(CONFIG_MFD_TPS65910)
2374 if(pmic_is_tps65910())
2376 tps65910_device_shutdown();//tps65910 shutdown
2380 #if defined(CONFIG_MFD_RK808)
2383 rk808_device_shutdown();//rk808 shutdown
2386 #if defined(CONFIG_MFD_RICOH619)
2387 if(pmic_is_ricoh619()){
2388 ricoh619_power_off(); //ricoh619 shutdown
2392 gpio_direction_output(POWER_ON_PIN, GPIO_LOW);
2396 static void __init machine_rk30_board_init(void)
2399 gpio_request(POWER_ON_PIN, "poweronpin");
2400 gpio_direction_output(POWER_ON_PIN, GPIO_HIGH);
2402 pm_power_off = rk30_pm_power_off;
2404 gpio_direction_output(POWER_ON_PIN, GPIO_HIGH);
2407 rk30_i2c_register_board_info();
2408 spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
2409 platform_add_devices(devices, ARRAY_SIZE(devices));
2410 rk_platform_add_display_devices();
2411 board_usb_detect_init(RK30_PIN0_PA7);
2413 #if defined(CONFIG_WIFI_CONTROL_FUNC)
2414 rk29sdk_wifi_bt_gpio_control_init();
2415 #elif defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
2416 rk29sdk_wifi_combo_module_gpio_init();
2419 #if defined(CONFIG_MT6620)
2420 clk_set_rate(clk_get_sys("rk_serial.0", "uart"), 48*1000000);
2423 #if defined(CONFIG_MT5931_MT6622)
2424 clk_set_rate(clk_get_sys("rk_serial.0", "uart"), 24*1000000);
2427 #define HD_SCREEN_SIZE 1920UL*1200UL*4*3
2428 static void __init rk30_reserve(void)
2430 #if defined(CONFIG_ARCH_RK3188)
2431 /*if lcd resolution great than or equal to 1920*1200,reserve the ump memory */
2432 if(!(get_fb_size() < ALIGN(HD_SCREEN_SIZE,SZ_1M)))
2434 int ump_mem_phy_size=512UL*1024UL*1024UL;
2435 resource_mali[0].start = board_mem_reserve_add("ump buf", ump_mem_phy_size);
2436 resource_mali[0].end = resource_mali[0].start + ump_mem_phy_size -1;
2440 rk30_ion_pdata.heaps[0].base = board_mem_reserve_add("ion", ION_RESERVE_SIZE);
2442 #ifdef CONFIG_FB_ROCKCHIP
2443 resource_fb[0].start = board_mem_reserve_add("fb0 buf", get_fb_size());
2444 resource_fb[0].end = resource_fb[0].start + get_fb_size()- 1;
2446 resource_fb[1].start = board_mem_reserve_add("ipp buf", RK30_FB0_MEM_SIZE);
2447 resource_fb[1].end = resource_fb[1].start + RK30_FB0_MEM_SIZE - 1;
2450 #if defined(CONFIG_FB_ROTATE) || !defined(CONFIG_THREE_FB_BUFFER)
2451 resource_fb[2].start = board_mem_reserve_add("fb2 buf",get_fb_size());
2452 resource_fb[2].end = resource_fb[2].start + get_fb_size() - 1;
2456 #ifdef CONFIG_VIDEO_RK29
2457 rk30_camera_request_reserve_mem();
2460 #ifdef CONFIG_GPS_RK
2461 //it must be more than 8MB
2462 rk_gps_info.u32MemoryPhyAddr = board_mem_reserve_add("gps", SZ_8M);
2464 board_mem_reserved();
2466 /******************************** arm dvfs frequency volt table **********************************/
2468 * dvfs_cpu_logic_table: table for arm and logic dvfs
2469 * @frequency : arm frequency
2470 * @cpu_volt : arm voltage depend on frequency
2473 #if defined(CONFIG_ARCH_RK3188)
2475 static struct cpufreq_frequency_table dvfs_arm_table_volt_level0[] = {
2476 {.frequency = 312 * 1000, .index = 850 * 1000},
2477 {.frequency = 504 * 1000, .index = 900 * 1000},
2478 {.frequency = 816 * 1000, .index = 950 * 1000},
2479 {.frequency = 1008 * 1000, .index = 1025 * 1000},
2480 {.frequency = 1200 * 1000, .index = 1100 * 1000},
2481 {.frequency = 1416 * 1000, .index = 1200 * 1000},
2482 {.frequency = 1608 * 1000, .index = 1300 * 1000},
2483 {.frequency = CPUFREQ_TABLE_END},
2486 static struct cpufreq_frequency_table dvfs_arm_table_volt_level1[] = {
2487 {.frequency = 312 * 1000, .index = 875 * 1000},
2488 {.frequency = 504 * 1000, .index = 925 * 1000},
2489 {.frequency = 816 * 1000, .index = 975 * 1000},
2490 {.frequency = 1008 * 1000, .index = 1075 * 1000},
2491 {.frequency = 1200 * 1000, .index = 1150 * 1000},
2492 {.frequency = 1416 * 1000, .index = 1250 * 1000},
2493 {.frequency = 1608 * 1000, .index = 1350 * 1000},
2494 {.frequency = CPUFREQ_TABLE_END},
2497 static struct cpufreq_frequency_table dvfs_arm_table_volt_level2[] = {
2498 {.frequency = 312 * 1000, .index = 900 * 1000},
2499 {.frequency = 504 * 1000, .index = 925 * 1000},
2500 {.frequency = 816 * 1000, .index = 1000 * 1000},
2501 {.frequency = 1008 * 1000, .index = 1075 * 1000},
2502 {.frequency = 1200 * 1000, .index = 1200 * 1000},
2503 {.frequency = 1416 * 1000, .index = 1250 * 1000},
2504 {.frequency = 1608 * 1000, .index = 1350 * 1000},
2505 {.frequency = CPUFREQ_TABLE_END},
2508 /******************************** gpu dvfs frequency volt table **********************************/
2510 static struct cpufreq_frequency_table dvfs_gpu_table_volt_level0[] = {
2511 {.frequency = 133 * 1000, .index = 975 * 1000},//the mininum rate is limited 133M for rk3188
2512 {.frequency = 200 * 1000, .index = 975 * 1000},
2513 {.frequency = 266 * 1000, .index = 1000 * 1000},
2514 {.frequency = 300 * 1000, .index = 1050 * 1000},
2515 {.frequency = 400 * 1000, .index = 1100 * 1000},
2516 {.frequency = 600 * 1000, .index = 1200 * 1000},
2517 {.frequency = CPUFREQ_TABLE_END},
2520 static struct cpufreq_frequency_table dvfs_gpu_table_volt_level1[] = {
2521 {.frequency = 133 * 1000, .index = 975 * 1000},//the mininum rate is limited 133M for rk3188
2522 {.frequency = 200 * 1000, .index = 1000 * 1000},
2523 {.frequency = 266 * 1000, .index = 1025 * 1000},
2524 {.frequency = 300 * 1000, .index = 1050 * 1000},
2525 {.frequency = 400 * 1000, .index = 1100 * 1000},
2526 {.frequency = 600 * 1000, .index = 1250 * 1000},
2527 {.frequency = CPUFREQ_TABLE_END},
2530 /******************************** ddr dvfs frequency volt table **********************************/
2531 static struct cpufreq_frequency_table dvfs_ddr_table_volt_level0[] = {
2532 {.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 950 * 1000},
2533 {.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1000 * 1000},
2534 {.frequency = 396 * 1000 + DDR_FREQ_NORMAL, .index = 1100 * 1000},
2535 {.frequency = 460 * 1000 + DDR_FREQ_DUALVIEW, .index = 1150 * 1000},
2536 //{.frequency = 528 * 1000 + DDR_FREQ_NORMAL, .index = 1200 * 1000},
2537 {.frequency = CPUFREQ_TABLE_END},
2540 //if you board is good for volt quality,select dvfs_arm_table_volt_level0
2541 #define dvfs_arm_table dvfs_arm_table_volt_level1
2542 #define dvfs_gpu_table dvfs_gpu_table_volt_level1
2543 #define dvfs_ddr_table dvfs_ddr_table_volt_level0
2546 //for RK3168 && RK3066B
2547 static struct cpufreq_frequency_table dvfs_arm_table[] = {
2548 {.frequency = 312 * 1000, .index = 950 * 1000},
2549 {.frequency = 504 * 1000, .index = 1000 * 1000},
2550 {.frequency = 816 * 1000, .index = 1050 * 1000},
2551 {.frequency = 1008 * 1000, .index = 1125 * 1000},
2552 {.frequency = 1200 * 1000, .index = 1200 * 1000},
2553 //{.frequency = 1416 * 1000, .index = 1250 * 1000},
2554 //{.frequency = 1608 * 1000, .index = 1300 * 1000},
2555 {.frequency = CPUFREQ_TABLE_END},
2558 static struct cpufreq_frequency_table dvfs_gpu_table[] = {
2559 {.frequency = 100 * 1000, .index = 1000 * 1000},
2560 {.frequency = 200 * 1000, .index = 1000 * 1000},
2561 {.frequency = 266 * 1000, .index = 1050 * 1000},
2562 //{.frequency = 300 * 1000, .index = 1050 * 1000},
2563 {.frequency = 400 * 1000, .index = 1125 * 1000},
2564 {.frequency = CPUFREQ_TABLE_END},
2567 static struct cpufreq_frequency_table dvfs_ddr_table[] = {
2568 {.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 1000 * 1000},
2569 {.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1050 * 1000},
2570 {.frequency = 400 * 1000 + DDR_FREQ_NORMAL, .index = 1100 * 1000},
2571 {.frequency = 450 * 1000, .index = 1150 * 1000},
2572 {.frequency = CPUFREQ_TABLE_END},
2575 /******************************** arm dvfs frequency volt table end **********************************/
2576 //#define DVFS_CPU_TABLE_SIZE (ARRAY_SIZE(dvfs_cpu_logic_table))
2577 //static struct cpufreq_frequency_table cpu_dvfs_table[DVFS_CPU_TABLE_SIZE];
2578 //static struct cpufreq_frequency_table dep_cpu2core_table[DVFS_CPU_TABLE_SIZE];
2579 int get_max_freq(struct cpufreq_frequency_table *table)
2583 for(i=0;table[i].frequency!= CPUFREQ_TABLE_END;i++)
2585 if(temp<table[i].frequency)
2586 temp=table[i].frequency;
2588 printk("get_max_freq=%d\n",temp);
2592 void __init board_clock_init(void)
2594 u32 flags=RK30_CLOCKS_DEFAULT_FLAGS;
2595 #if !defined(CONFIG_ARCH_RK3188)
2596 if(get_max_freq(dvfs_gpu_table)<=(400*1000))
2598 flags=RK30_CLOCKS_DEFAULT_FLAGS|CLK_GPU_GPLL;
2601 flags=RK30_CLOCKS_DEFAULT_FLAGS|CLK_GPU_CPLL;
2603 rk30_clock_data_init(periph_pll_default, codec_pll_default, flags);
2604 //dvfs_set_arm_logic_volt(dvfs_cpu_logic_table, cpu_dvfs_table, dep_cpu2core_table);
2605 dvfs_set_freq_volt_table(clk_get(NULL, "cpu"), dvfs_arm_table);
2606 dvfs_set_freq_volt_table(clk_get(NULL, "gpu"), dvfs_gpu_table);
2607 dvfs_set_freq_volt_table(clk_get(NULL, "ddr"), dvfs_ddr_table);
2610 MACHINE_START(RK30, "RK30board")
2611 .boot_params = PLAT_PHYS_OFFSET + 0x800,
2612 .fixup = rk30_fixup,
2613 .reserve = &rk30_reserve,
2614 .map_io = rk30_map_io,
2615 .init_irq = rk30_init_irq,
2616 .timer = &rk30_timer,
2617 .init_machine = machine_rk30_board_init,