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>
52 #ifdef CONFIG_MFD_RT5025
53 #include <linux/mfd/rt5025.h>
55 #include <plat/efuse.h>
57 #ifdef CONFIG_CW2015_BATTERY
58 #include <linux/power/cw2015_battery.h>
60 #if defined(CONFIG_MFD_RK610)
61 #include <linux/mfd/rk610_core.h>
64 #if defined(CONFIG_MFD_RK616)
65 #include <linux/mfd/rk616.h>
69 #if defined(CONFIG_RK_HDMI)
70 #include "../../../drivers/video/rockchip/hdmi/rk_hdmi.h"
73 #if defined(CONFIG_SPIM_RK29)
74 #include "../../../drivers/spi/rk29_spim.h"
76 #if defined(CONFIG_GPS_RK)
77 #include "../../../drivers/misc/gps/rk_gps/rk_gps.h"
79 #if defined(CONFIG_MU509)
80 #include <linux/mu509.h>
82 #if defined(CONFIG_MW100)
83 #include <linux/mw100.h>
85 #if defined(CONFIG_MT6229)
86 #include <linux/mt6229.h>
88 #if defined(CONFIG_ANDROID_TIMED_GPIO)
89 #include "../../../drivers/staging/android/timed_gpio.h"
92 #if defined(CONFIG_MT6620)
93 #include <linux/gps.h>
95 #include "board-rk3168-tb-camera.c"
97 #if defined(CONFIG_TOUCHSCREEN_GT8XX)
98 #define TOUCH_RESET_PIN RK30_PIN0_PB6
99 #define TOUCH_PWR_PIN RK30_PIN0_PC5 // need to fly line by hardware engineer
101 /* Android Parameter */
102 static int ap_mdm = 0;
103 module_param(ap_mdm, int, 0644);
104 static int ap_has_alsa = 0;
105 module_param(ap_has_alsa, int, 0644);
106 static int ap_data_only = 2;
107 module_param(ap_data_only, int, 0644);
108 static int ap_has_earphone = 0;
109 module_param(ap_has_earphone, int, 0644);
112 static int goodix_init_platform_hw(void)
116 if (TOUCH_PWR_PIN != INVALID_GPIO) {
117 ret = gpio_request(TOUCH_PWR_PIN, "goodix power pin");
119 gpio_free(TOUCH_PWR_PIN);
120 printk("goodix power error\n");
123 gpio_direction_output(TOUCH_PWR_PIN, 0);
124 gpio_set_value(TOUCH_PWR_PIN, GPIO_LOW);
128 if (TOUCH_RESET_PIN != INVALID_GPIO) {
129 ret = gpio_request(TOUCH_RESET_PIN, "goodix reset pin");
131 gpio_free(TOUCH_RESET_PIN);
132 printk("goodix gpio_request error\n");
135 gpio_direction_output(TOUCH_RESET_PIN, 1);
137 //gpio_set_value(TOUCH_RESET_PIN, GPIO_LOW);
139 //gpio_set_value(TOUCH_RESET_PIN, GPIO_HIGH);
145 struct goodix_platform_data goodix_info = {
147 .irq_pin = RK30_PIN1_PB7,
148 .rest_pin = TOUCH_RESET_PIN,
149 .init_platform_hw = goodix_init_platform_hw,
153 static struct spi_board_info board_spi_devices[] = {
156 /***********************************************************
158 ************************************************************/
159 #ifdef CONFIG_BACKLIGHT_RK29_BL
161 #define PWM_MODE PWM3
162 #define PWM_EFFECT_VALUE 1
164 #define LCD_DISP_ON_PIN
166 #ifdef LCD_DISP_ON_PIN
167 #define BL_EN_PIN RK30_PIN0_PA2
168 #define BL_EN_VALUE GPIO_HIGH
170 static int rk29_backlight_io_init(void)
175 #ifdef LCD_DISP_ON_PIN
176 ret = gpio_request(BL_EN_PIN, "bl_en");
178 gpio_direction_output(BL_EN_PIN, BL_EN_VALUE);
184 static int rk29_backlight_io_deinit(void)
186 int ret = 0, pwm_gpio;
187 #ifdef LCD_DISP_ON_PIN
188 gpio_free(BL_EN_PIN);
190 pwm_gpio = iomux_mode_to_gpio(PWM_MODE);
191 gpio_request(pwm_gpio, "bl_pwm");
192 gpio_direction_output(pwm_gpio, GPIO_LOW);
196 static int rk29_backlight_pwm_suspend(void)
198 int ret, pwm_gpio = iomux_mode_to_gpio(PWM_MODE);
200 ret = gpio_request(pwm_gpio, "bl_pwm");
202 printk("func %s, line %d: request gpio fail\n", __FUNCTION__, __LINE__);
205 gpio_direction_output(pwm_gpio, GPIO_LOW);
206 #ifdef LCD_DISP_ON_PIN
207 gpio_direction_output(BL_EN_PIN, !BL_EN_VALUE);
212 static int rk29_backlight_pwm_resume(void)
214 int pwm_gpio = iomux_mode_to_gpio(PWM_MODE);
218 #ifdef LCD_DISP_ON_PIN
220 gpio_direction_output(BL_EN_PIN, BL_EN_VALUE);
225 static struct rk29_bl_info rk29_bl_info = {
229 .brightness_mode =BRIGHTNESS_MODE_CONIC,
230 .bl_ref = PWM_EFFECT_VALUE,
231 .io_init = rk29_backlight_io_init,
232 .io_deinit = rk29_backlight_io_deinit,
233 .pwm_suspend = rk29_backlight_pwm_suspend,
234 .pwm_resume = rk29_backlight_pwm_resume,
237 static struct platform_device rk29_device_backlight = {
238 .name = "rk29_backlight",
241 .platform_data = &rk29_bl_info,
247 #ifdef CONFIG_RK29_SUPPORT_MODEM
249 #define RK30_MODEM_POWER RK30_PIN0_PC6
250 #define RK30_MODEM_POWER_IOMUX iomux_set(GPIO0_C6)
252 static int rk30_modem_io_init(void)
254 printk("%s\n", __FUNCTION__);
255 RK30_MODEM_POWER_IOMUX;
260 static struct rk29_io_t rk30_modem_io = {
261 .io_addr = RK30_MODEM_POWER,
264 .io_init = rk30_modem_io_init,
267 static struct platform_device rk30_device_modem = {
268 .name = "rk30_modem",
271 .platform_data = &rk30_modem_io,
275 #if defined(CONFIG_MU509)
276 static int mu509_io_init(void)
287 static int mu509_io_deinit(void)
293 struct rk29_mu509_data rk29_mu509_info = {
294 .io_init = mu509_io_init,
295 .io_deinit = mu509_io_deinit,
296 .modem_power_en = RK30_PIN2_PD5,
297 .bp_power = RK30_PIN0_PC6,
298 .bp_reset = RK30_PIN2_PD4,
299 .ap_wakeup_bp = RK30_PIN0_PC4,
300 .bp_wakeup_ap = RK30_PIN0_PC5,
302 struct platform_device rk29_device_mu509 = {
306 .platform_data = &rk29_mu509_info,
310 #if defined(CONFIG_MW100)
311 static int mw100_io_init(void)
321 static int mw100_io_deinit(void)
327 struct rk29_mw100_data rk29_mw100_info = {
328 .io_init = mw100_io_init,
329 .io_deinit = mw100_io_deinit,
330 .modem_power_en = RK30_PIN2_PD5,
331 .bp_power = RK30_PIN0_PC6,
332 .bp_reset = RK30_PIN2_PD4,
333 .ap_wakeup_bp = RK30_PIN0_PC4,
334 .bp_wakeup_ap = RK30_PIN0_PC5,
336 struct platform_device rk29_device_mw100 = {
340 .platform_data = &rk29_mw100_info,
344 #if defined(CONFIG_MT6229)
345 static int mt6229_io_init(void)
355 static int mt6229_io_deinit(void)
361 struct rk29_mt6229_data rk29_mt6229_info = {
362 .io_init = mt6229_io_init,
363 .io_deinit = mt6229_io_deinit,
364 .modem_power_en = RK30_PIN2_PD5,
365 .bp_power = RK30_PIN0_PC6,
366 .bp_reset = RK30_PIN2_PD4,
367 .ap_wakeup_bp = RK30_PIN0_PC4,
368 .bp_wakeup_ap = RK30_PIN0_PC5,
370 struct platform_device rk29_device_mt6229 = {
374 .platform_data = &rk29_mt6229_info,
380 #if defined (CONFIG_GS_MMA8452)
381 #define MMA8452_INT_PIN RK30_PIN0_PB7
383 static int mma8452_init_platform_hw(void)
388 static struct sensor_platform_data mma8452_info = {
389 .type = SENSOR_TYPE_ACCEL,
392 .init_platform_hw = mma8452_init_platform_hw,
393 .orientation = {-1, 0, 0, 0, -1, 0, 0, 0, 1},
396 #if defined (CONFIG_GS_LIS3DH)
397 #define LIS3DH_INT_PIN RK30_PIN0_PB7
399 static int lis3dh_init_platform_hw(void)
405 static struct sensor_platform_data lis3dh_info = {
406 .type = SENSOR_TYPE_ACCEL,
409 .init_platform_hw = lis3dh_init_platform_hw,
410 .orientation = {-1, 0, 0, 0, -1, 0, 0, 0, 1},
413 #if defined (CONFIG_COMPASS_AK8975)
414 static struct sensor_platform_data akm8975_info =
416 .type = SENSOR_TYPE_COMPASS,
449 #if defined(CONFIG_GYRO_L3G4200D)
451 #include <linux/l3g4200d.h>
452 #define L3G4200D_INT_PIN RK30_PIN0_PB4
454 static int l3g4200d_init_platform_hw(void)
459 static struct sensor_platform_data l3g4200d_info = {
460 .type = SENSOR_TYPE_GYROSCOPE,
463 .orientation = {0, 1, 0, -1, 0, 0, 0, 0, 1},
464 .init_platform_hw = l3g4200d_init_platform_hw,
465 .x_min = 40,//x_min,y_min,z_min = (0-100) according to hardware
472 #ifdef CONFIG_LS_CM3217
473 static struct sensor_platform_data cm3217_info = {
474 .type = SENSOR_TYPE_LIGHT,
476 .poll_delay_ms = 500,
481 #ifdef CONFIG_FB_ROCKCHIP
483 #define LCD_CS_PIN INVALID_GPIO
484 #define LCD_CS_VALUE GPIO_HIGH
486 #define LCD_EN_PIN RK30_PIN0_PB0
487 #define MIPI_LCD_RST_PIN RK30_PIN0_PC3 //mipi lcd's reset pin, if no reset pin, set's INVALID_GPIO
488 #define LCD_EN_VALUE GPIO_HIGH
490 static int rk_fb_io_init(struct rk29_fb_setting_info *fb_setting)
494 if(LCD_CS_PIN !=INVALID_GPIO)
496 ret = gpio_request(LCD_CS_PIN, NULL);
499 gpio_free(LCD_CS_PIN);
500 printk(KERN_ERR "request lcd cs pin fail!\n");
505 gpio_direction_output(LCD_CS_PIN, LCD_CS_VALUE);
509 if(LCD_EN_PIN !=INVALID_GPIO)
511 ret = gpio_request(LCD_EN_PIN, NULL);
514 gpio_free(LCD_EN_PIN);
515 printk(KERN_ERR "request lcd en pin fail!\n");
520 gpio_direction_output(LCD_EN_PIN, LCD_EN_VALUE);
524 if(MIPI_LCD_RST_PIN !=INVALID_GPIO)
526 ret = gpio_request(MIPI_LCD_RST_PIN, NULL);
529 gpio_free(MIPI_LCD_RST_PIN);
530 printk(KERN_ERR "request mipi lcd rst pin fail!\n");
536 gpio_set_value(MIPI_LCD_RST_PIN, !GPIO_LOW);
542 static int rk_fb_io_disable(void)
544 if(LCD_CS_PIN !=INVALID_GPIO)
546 gpio_set_value(LCD_CS_PIN, !LCD_CS_VALUE);
548 if(LCD_EN_PIN !=INVALID_GPIO)
550 gpio_set_value(LCD_EN_PIN, !LCD_EN_VALUE);
553 if(MIPI_LCD_RST_PIN !=INVALID_GPIO)
555 gpio_set_value(MIPI_LCD_RST_PIN, GPIO_LOW);
560 static int rk_fb_io_enable(void)
562 if(LCD_CS_PIN !=INVALID_GPIO)
564 gpio_set_value(LCD_CS_PIN, LCD_CS_VALUE);
566 if(LCD_EN_PIN !=INVALID_GPIO)
568 gpio_set_value(LCD_EN_PIN, LCD_EN_VALUE);
571 if(MIPI_LCD_RST_PIN !=INVALID_GPIO)
573 gpio_set_value(MIPI_LCD_RST_PIN, !GPIO_LOW);
579 #if defined(CONFIG_LCDC0_RK3066B) || defined(CONFIG_LCDC0_RK3188)
580 struct rk29fb_info lcdc0_screen_info = {
581 #if defined(CONFIG_RK_HDMI) && defined(CONFIG_HDMI_SOURCE_LCDC0) && defined(CONFIG_DUAL_LCDC_DUAL_DISP_IN_KERNEL)
582 .prop = EXTEND, //extend display device
586 .set_screen_info = hdmi_init_lcdc,
588 .prop = PRMRY, //primary display device
589 .io_init = rk_fb_io_init,
590 .io_disable = rk_fb_io_disable,
591 .io_enable = rk_fb_io_enable,
592 .set_screen_info = set_lcd_info,
597 #if defined(CONFIG_LCDC1_RK3066B) || defined(CONFIG_LCDC1_RK3188)
598 struct rk29fb_info lcdc1_screen_info = {
599 #if defined(CONFIG_RK_HDMI) && defined(CONFIG_HDMI_SOURCE_LCDC1) && defined(CONFIG_DUAL_LCDC_DUAL_DISP_IN_KERNEL)
600 .prop = EXTEND, //extend display device
604 .set_screen_info = hdmi_init_lcdc,
606 .prop = PRMRY, //primary display device
607 .io_init = rk_fb_io_init,
608 .io_disable = rk_fb_io_disable,
609 .io_enable = rk_fb_io_enable,
610 .set_screen_info = set_lcd_info,
615 static struct resource resource_fb[] = {
619 .end = 0,//RK30_FB0_MEM_SIZE - 1,
620 .flags = IORESOURCE_MEM,
623 .name = "ipp buf", //for rotate
625 .end = 0,//RK30_FB0_MEM_SIZE - 1,
626 .flags = IORESOURCE_MEM,
631 .end = 0,//RK30_FB0_MEM_SIZE - 1,
632 .flags = IORESOURCE_MEM,
636 static struct platform_device device_fb = {
639 .num_resources = ARRAY_SIZE(resource_fb),
640 .resource = resource_fb,
643 #if defined(CONFIG_ARCH_RK3188)
644 static struct resource resource_mali[] = {
649 .flags = IORESOURCE_MEM,
654 static struct platform_device device_mali= {
655 .name = "mali400_ump",
657 .num_resources = ARRAY_SIZE(resource_mali),
658 .resource = resource_mali,
662 #if defined(CONFIG_LCDC0_RK3066B) || defined(CONFIG_LCDC0_RK3188)
663 static struct resource resource_lcdc0[] = {
666 .start = RK30_LCDC0_PHYS,
667 .end = RK30_LCDC0_PHYS + RK30_LCDC0_SIZE - 1,
668 .flags = IORESOURCE_MEM,
675 .flags = IORESOURCE_IRQ,
679 static struct platform_device device_lcdc0 = {
682 .num_resources = ARRAY_SIZE(resource_lcdc0),
683 .resource = resource_lcdc0,
685 .platform_data = &lcdc0_screen_info,
689 #if defined(CONFIG_LCDC1_RK3066B) || defined(CONFIG_LCDC1_RK3188)
690 static struct resource resource_lcdc1[] = {
693 .start = RK30_LCDC1_PHYS,
694 .end = RK30_LCDC1_PHYS + RK30_LCDC1_SIZE - 1,
695 .flags = IORESOURCE_MEM,
701 .flags = IORESOURCE_IRQ,
705 static struct platform_device device_lcdc1 = {
708 .num_resources = ARRAY_SIZE(resource_lcdc1),
709 .resource = resource_lcdc1,
711 .platform_data = &lcdc1_screen_info,
716 #if defined(CONFIG_MFD_RK610)
717 #define RK610_RST_PIN RK30_PIN2_PC5
718 static int rk610_power_on_init(void)
721 if(RK610_RST_PIN != INVALID_GPIO)
723 ret = gpio_request(RK610_RST_PIN, "rk610 reset");
726 printk(KERN_ERR "rk610_control_probe request gpio fail\n");
730 gpio_direction_output(RK610_RST_PIN, GPIO_HIGH);
732 gpio_direction_output(RK610_RST_PIN, GPIO_LOW);
734 gpio_set_value(RK610_RST_PIN, GPIO_HIGH);
743 static struct rk610_ctl_platform_data rk610_ctl_pdata = {
744 .rk610_power_on_init = rk610_power_on_init,
748 #if defined(CONFIG_MFD_RK616)
749 #define RK616_RST_PIN RK30_PIN3_PB2
750 #define RK616_PWREN_PIN RK30_PIN0_PA3
751 #define RK616_SCL_RATE (100*1000) //i2c scl rate
752 static int rk616_power_on_init(void)
756 if(RK616_PWREN_PIN != INVALID_GPIO)
758 ret = gpio_request(RK616_PWREN_PIN, "rk616 pwren");
761 printk(KERN_ERR "rk616 pwren gpio request fail\n");
765 gpio_direction_output(RK616_PWREN_PIN,GPIO_HIGH);
769 if(RK616_RST_PIN != INVALID_GPIO)
771 ret = gpio_request(RK616_RST_PIN, "rk616 reset");
774 printk(KERN_ERR "rk616 reset gpio request fail\n");
778 gpio_direction_output(RK616_RST_PIN, GPIO_HIGH);
780 gpio_direction_output(RK616_RST_PIN, GPIO_LOW);
782 gpio_set_value(RK616_RST_PIN, GPIO_HIGH);
791 static int rk616_power_deinit(void)
793 gpio_set_value(RK616_PWREN_PIN,GPIO_LOW);
794 gpio_set_value(RK616_RST_PIN,GPIO_LOW);
795 gpio_free(RK616_PWREN_PIN);
796 gpio_free(RK616_RST_PIN);
801 static struct rk616_platform_data rk616_pdata = {
802 .power_init = rk616_power_on_init,
803 .power_deinit = rk616_power_deinit,
804 .scl_rate = RK616_SCL_RATE,
805 .lcd0_func = INPUT, //port lcd0 as input
806 .lcd1_func = INPUT, //port lcd1 as input
807 .lvds_ch_nr = 1, //the number of used lvds channel
808 .hdmi_irq = RK30_PIN2_PD6,
809 .spk_ctl_gpio = RK30_PIN2_PD7,
810 .hp_ctl_gpio = RK30_PIN2_PD7,
815 #ifdef CONFIG_SND_SOC_RK610
816 static int rk610_codec_io_init(void)
819 //Must not gpio_request
823 static struct rk610_codec_platform_data rk610_codec_pdata = {
824 .spk_ctl_io = RK30_PIN2_PD7,
825 .io_init = rk610_codec_io_init,
829 #ifdef CONFIG_ANDROID_TIMED_GPIO
830 static struct timed_gpio timed_gpios[] = {
833 .gpio = INVALID_GPIO,
836 .adjust_time =20, //adjust for diff product
840 static struct timed_gpio_platform_data rk29_vibrator_info = {
842 .gpios = timed_gpios,
845 static struct platform_device rk29_device_vibrator = {
846 .name = "timed-gpio",
849 .platform_data = &rk29_vibrator_info,
855 #ifdef CONFIG_LEDS_GPIO_PLATFORM
856 static struct gpio_led rk29_leds[] = {
858 .name = "button-backlight",
859 .gpio = INVALID_GPIO,
860 .default_trigger = "timer",
862 .retain_state_suspended = 0,
863 .default_state = LEDS_GPIO_DEFSTATE_OFF,
867 static struct gpio_led_platform_data rk29_leds_pdata = {
869 .num_leds = ARRAY_SIZE(rk29_leds),
872 static struct platform_device rk29_device_gpio_leds = {
876 .platform_data = &rk29_leds_pdata,
881 #ifdef CONFIG_RK_IRDA
882 #define IRDA_IRQ_PIN INVALID_GPIO //RK30_PIN0_PA3
884 static int irda_iomux_init(void)
889 ret = gpio_request(IRDA_IRQ_PIN, NULL);
891 gpio_free(IRDA_IRQ_PIN);
892 printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n ");
894 gpio_pull_updown(IRDA_IRQ_PIN, PullDisable);
895 gpio_direction_input(IRDA_IRQ_PIN);
900 static int irda_iomux_deinit(void)
902 gpio_free(IRDA_IRQ_PIN);
906 static struct irda_info rk29_irda_info = {
907 .intr_pin = IRDA_IRQ_PIN,
908 .iomux_init = irda_iomux_init,
909 .iomux_deinit = irda_iomux_deinit,
910 //.irda_pwr_ctl = bu92747guw_power_ctl,
913 static struct platform_device irda_device = {
914 #ifdef CONFIG_RK_IRDA_NET
917 .name = "bu92747_irda",
921 .platform_data = &rk29_irda_info,
927 #define ION_RESERVE_SIZE (80 * SZ_1M)
928 static struct ion_platform_data rk30_ion_pdata = {
932 .type = ION_HEAP_TYPE_CARVEOUT,
933 .id = ION_NOR_HEAP_ID,
935 .size = ION_RESERVE_SIZE,
940 static struct platform_device device_ion = {
941 .name = "ion-rockchip",
944 .platform_data = &rk30_ion_pdata,
949 /**************************************************************************************************
950 * SDMMC devices, include the module of SD,MMC,and sdio.noted by xbw at 2012-03-05
951 **************************************************************************************************/
952 #ifdef CONFIG_SDMMC_RK29
953 #include "board-rk3168-tb-sdmmc-conifg.c"
954 #include "../plat-rk/rk-sdmmc-ops.c"
955 #include "../plat-rk/rk-sdmmc-wifi.c"
956 #endif //endif ---#ifdef CONFIG_SDMMC_RK29
958 #ifdef CONFIG_SDMMC0_RK29
959 static int rk29_sdmmc0_cfg_gpio(void)
961 #ifdef CONFIG_SDMMC_RK29_OLD
963 iomux_set(MMC0_CLKOUT);
969 iomux_set_gpio_mode(iomux_mode_to_gpio(MMC0_DETN));
971 gpio_request(RK30_PIN3_PA7, "sdmmc-power");
972 gpio_direction_output(RK30_PIN3_PA7, GPIO_LOW);
975 rk29_sdmmc_set_iomux(0, 0xFFFF);
977 #if defined(CONFIG_SDMMC0_RK29_SDCARD_DET_FROM_GPIO)
978 #if SDMMC_USE_NEW_IOMUX_API
979 iomux_set_gpio_mode(iomux_gpio_to_mode(RK29SDK_SD_CARD_DETECT_N));
981 rk30_mux_api_set(RK29SDK_SD_CARD_DETECT_PIN_NAME, RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO);
984 #if SDMMC_USE_NEW_IOMUX_API
985 iomux_set(MMC0_DETN);
987 rk30_mux_api_set(RK29SDK_SD_CARD_DETECT_PIN_NAME, RK29SDK_SD_CARD_DETECT_IOMUX_FMUX);
991 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
992 gpio_request(SDMMC0_WRITE_PROTECT_PIN, "sdmmc-wp");
993 gpio_direction_input(SDMMC0_WRITE_PROTECT_PIN);
1001 #define CONFIG_SDMMC0_USE_DMA
1002 struct rk29_sdmmc_platform_data default_sdmmc0_data = {
1004 (MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 | MMC_VDD_28_29 |
1005 MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33 |
1006 MMC_VDD_33_34 | MMC_VDD_34_35 | MMC_VDD_35_36),
1008 (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1009 .io_init = rk29_sdmmc0_cfg_gpio,
1011 #if !defined(CONFIG_SDMMC_RK29_OLD)
1012 .set_iomux = rk29_sdmmc_set_iomux,
1015 .dma_name = "sd_mmc",
1016 #ifdef CONFIG_SDMMC0_USE_DMA
1022 #if defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC) && defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
1023 .status = rk29sdk_wifi_mmc0_status,
1024 .register_status_notify = rk29sdk_wifi_mmc0_status_register,
1027 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
1028 .power_en = RK29SDK_SD_CARD_PWR_EN,
1029 .power_en_level = RK29SDK_SD_CARD_PWR_EN_LEVEL,
1031 .power_en = INVALID_GPIO,
1032 .power_en_level = GPIO_LOW,
1034 .enable_sd_wakeup = 0,
1036 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
1037 .write_prt = SDMMC0_WRITE_PROTECT_PIN,
1038 .write_prt_enalbe_level = SDMMC0_WRITE_PROTECT_ENABLE_VALUE;
1040 .write_prt = INVALID_GPIO,
1044 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)
1045 .io = RK29SDK_SD_CARD_DETECT_N, //INVALID_GPIO,
1046 .enable = RK29SDK_SD_CARD_INSERT_LEVEL,
1047 #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
1049 .name = RK29SDK_SD_CARD_DETECT_PIN_NAME,
1050 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
1051 .fgpio = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
1053 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
1054 .fmux = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
1065 #endif // CONFIG_SDMMC0_RK29
1067 #ifdef CONFIG_SDMMC1_RK29
1068 #define CONFIG_SDMMC1_USE_DMA
1069 static int rk29_sdmmc1_cfg_gpio(void)
1071 #if defined(CONFIG_SDMMC_RK29_OLD)
1072 iomux_set(MMC1_CMD);
1073 iomux_set(MMC1_CLKOUT);
1080 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1081 gpio_request(SDMMC1_WRITE_PROTECT_PIN, "sdio-wp");
1082 gpio_direction_input(SDMMC1_WRITE_PROTECT_PIN);
1090 struct rk29_sdmmc_platform_data default_sdmmc1_data = {
1092 (MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 | MMC_VDD_28_29 |
1093 MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33 |
1096 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1097 .host_caps = (MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ |
1098 MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1101 (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1104 .io_init = rk29_sdmmc1_cfg_gpio,
1106 #if !defined(CONFIG_SDMMC_RK29_OLD)
1107 .set_iomux = rk29_sdmmc_set_iomux,
1111 #ifdef CONFIG_SDMMC1_USE_DMA
1117 #if defined(CONFIG_WIFI_CONTROL_FUNC) || defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
1118 .status = rk29sdk_wifi_status,
1119 .register_status_notify = rk29sdk_wifi_status_register,
1122 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1123 .write_prt = SDMMC1_WRITE_PROTECT_PIN,
1124 .write_prt_enalbe_level = SDMMC1_WRITE_PROTECT_ENABLE_VALUE;
1126 .write_prt = INVALID_GPIO,
1129 #if defined(CONFIG_RK29_SDIO_IRQ_FROM_GPIO)
1130 .sdio_INT_gpio = RK29SDK_WIFI_SDIO_CARD_INT,
1134 #if defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1135 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)
1136 .io = RK29SDK_SD_CARD_DETECT_N,
1141 .enable = RK29SDK_SD_CARD_INSERT_LEVEL,
1142 #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
1144 .name = RK29SDK_SD_CARD_DETECT_PIN_NAME,
1145 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
1146 .fgpio = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
1148 #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
1149 .fmux = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
1159 .enable_sd_wakeup = 0,
1161 #endif //endif--#ifdef CONFIG_SDMMC1_RK29
1163 /**************************************************************************************************
1164 * the end of setting for SDMMC devices
1165 **************************************************************************************************/
1167 #ifdef CONFIG_BATTERY_RK30_ADC
1168 static struct rk30_adc_battery_platform_data rk30_adc_battery_platdata = {
1169 .dc_det_pin = RK30_PIN0_PB2,
1170 .batt_low_pin = RK30_PIN0_PB1,
1171 .charge_set_pin = INVALID_GPIO,
1172 .charge_ok_pin = RK30_PIN0_PA6,
1173 .dc_det_level = GPIO_LOW,
1174 .charge_ok_level = GPIO_HIGH,
1177 static struct platform_device rk30_device_adc_battery = {
1178 .name = "rk30-battery",
1181 .platform_data = &rk30_adc_battery_platdata,
1185 #ifdef CONFIG_CW2015_BATTERY
1187 note the follow array must set depend on the battery that you use
1188 you must send the battery to cellwise-semi the contact information:
1189 name: chen gan; tel:13416876079; E-mail: ben.chen@cellwise-semi.com
1191 static u8 config_info[SIZE_BATINFO] = {
1192 0x15, 0x42, 0x60, 0x59, 0x52,
1193 0x58, 0x4D, 0x48, 0x48, 0x44,
1194 0x44, 0x46, 0x49, 0x48, 0x32,
1195 0x24, 0x20, 0x17, 0x13, 0x0F,
1196 0x19, 0x3E, 0x51, 0x45, 0x08,
1197 0x76, 0x0B, 0x85, 0x0E, 0x1C,
1198 0x2E, 0x3E, 0x4D, 0x52, 0x52,
1199 0x57, 0x3D, 0x1B, 0x6A, 0x2D,
1200 0x25, 0x43, 0x52, 0x87, 0x8F,
1201 0x91, 0x94, 0x52, 0x82, 0x8C,
1202 0x92, 0x96, 0xFF, 0x7B, 0xBB,
1203 0xCB, 0x2F, 0x7D, 0x72, 0xA5,
1204 0xB5, 0xC1, 0x46, 0xAE
1207 static struct cw_bat_platform_data cw_bat_platdata = {
1208 .dc_det_pin = RK30_PIN0_PB2,
1209 .dc_det_level = GPIO_LOW,
1211 .bat_low_pin = RK30_PIN0_PB1,
1212 .bat_low_level = GPIO_LOW,
1213 .chg_ok_pin = INVALID_GPIO,
1214 .chg_ok_level = GPIO_HIGH,
1217 .chg_mode_sel_pin = INVALID_GPIO,
1218 .chg_mode_sel_level = GPIO_HIGH,
1220 .cw_bat_config_info = config_info,
1225 #ifdef CONFIG_RK30_PWM_REGULATOR
1226 static int pwm_voltage_map[] = {
1227 800000,825000,850000, 875000,900000, 925000 ,950000, 975000,1000000, 1025000, 1050000, 1075000, 1100000, 1125000, 1150000, 1175000, 1200000, 1225000, 1250000, 1275000, 1300000, 1325000, 1350000,1375000
1229 static struct regulator_consumer_supply pwm_dcdc1_consumers[] = {
1231 .supply = "vdd_cpu",
1235 struct regulator_init_data pwm_regulator_init_dcdc[1] =
1239 .name = "PWM_DCDC1",
1241 .max_uV = 1800000, //0.6-1.8V
1243 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
1245 .num_consumer_supplies = ARRAY_SIZE(pwm_dcdc1_consumers),
1246 .consumer_supplies = pwm_dcdc1_consumers,
1250 static struct pwm_platform_data pwm_regulator_info[1] = {
1253 .pwm_gpio = RK30_PIN3_PD4,
1254 .pwm_iomux_pwm = PWM1,
1255 .pwm_iomux_gpio = GPIO3_D4,
1256 .pwm_voltage = 1100000,
1257 .suspend_voltage = 1000000,
1260 .coefficient = 575, //57.5%
1261 .pwm_voltage_map = pwm_voltage_map,
1262 .init_data = &pwm_regulator_init_dcdc[0],
1266 struct platform_device pwm_regulator_device[1] = {
1268 .name = "pwm-voltage-regulator",
1271 .platform_data = &pwm_regulator_info[0],
1277 #ifdef CONFIG_RK29_VMAC
1278 #define PHY_PWR_EN_GPIO RK30_PIN1_PD6
1279 #include "board-rk30-sdk-vmac.c"
1282 #ifdef CONFIG_RFKILL_RK
1283 // bluetooth rfkill device, its driver in net/rfkill/rfkill-rk.c
1284 static struct rfkill_rk_platform_data rfkill_rk_platdata = {
1285 .type = RFKILL_TYPE_BLUETOOTH,
1287 .poweron_gpio = { // BT_REG_ON
1288 .io = INVALID_GPIO, //RK30_PIN3_PC7,
1289 .enable = GPIO_HIGH,
1291 .name = "bt_poweron",
1296 .reset_gpio = { // BT_RST
1297 .io = RK30_PIN3_PC7, // set io to INVALID_GPIO for disable it
1305 .wake_gpio = { // BT_WAKE, use to control bt's sleep and wakeup
1306 .io = RK30_PIN3_PC6, // set io to INVALID_GPIO for disable it
1307 .enable = GPIO_HIGH,
1314 .wake_host_irq = { // BT_HOST_WAKE, for bt wakeup host when it is in deep sleep
1316 .io = RK30_PIN0_PA5, // set io to INVALID_GPIO for disable it
1317 .enable = GPIO_LOW, // set GPIO_LOW for falling, set 0 for rising
1324 .rts_gpio = { // UART_RTS, enable or disable BT's data coming
1325 .io = RK30_PIN1_PA3, // set io to INVALID_GPIO for disable it
1335 static struct platform_device device_rfkill_rk = {
1336 .name = "rfkill_rk",
1339 .platform_data = &rfkill_rk_platdata,
1344 #if defined(CONFIG_GPS_RK)
1345 int rk_gps_io_init(void)
1347 printk("%s \n", __FUNCTION__);
1349 gpio_request(RK30_PIN1_PB5, NULL);
1350 gpio_direction_output(RK30_PIN1_PB5, GPIO_LOW);
1352 iomux_set(GPS_RFCLK);//GPS_CLK
1353 iomux_set(GPS_MAG);//GPS_MAG
1354 iomux_set(GPS_SIG);//GPS_SIGN
1356 gpio_request(RK30_PIN1_PA6, NULL);
1357 gpio_direction_output(RK30_PIN1_PA6, GPIO_LOW);
1359 gpio_request(RK30_PIN1_PA5, NULL);
1360 gpio_direction_output(RK30_PIN1_PA5, GPIO_LOW);
1362 gpio_request(RK30_PIN1_PA7, NULL);
1363 gpio_direction_output(RK30_PIN1_PA7, GPIO_LOW);
1366 int rk_gps_power_up(void)
1368 printk("%s \n", __FUNCTION__);
1373 int rk_gps_power_down(void)
1375 printk("%s \n", __FUNCTION__);
1380 int rk_gps_reset_set(int level)
1384 int rk_enable_hclk_gps(void)
1386 struct clk *gps_aclk = NULL;
1387 gps_aclk = clk_get(NULL, "aclk_gps");
1389 clk_enable(gps_aclk);
1391 printk("%s \n", __FUNCTION__);
1394 printk("get gps aclk fail\n");
1397 int rk_disable_hclk_gps(void)
1399 struct clk *gps_aclk = NULL;
1400 gps_aclk = clk_get(NULL, "aclk_gps");
1402 //TO wait long enough until GPS ISR is finished.
1404 clk_disable(gps_aclk);
1406 printk("%s \n", __FUNCTION__);
1409 printk("get gps aclk fail\n");
1412 struct rk_gps_data rk_gps_info = {
1413 .io_init = rk_gps_io_init,
1414 .power_up = rk_gps_power_up,
1415 .power_down = rk_gps_power_down,
1416 .reset = rk_gps_reset_set,
1417 .enable_hclk_gps = rk_enable_hclk_gps,
1418 .disable_hclk_gps = rk_disable_hclk_gps,
1419 .GpsSign = RK30_PIN1_PB3,
1420 .GpsMag = RK30_PIN1_PB2, //GPIO index
1421 .GpsClk = RK30_PIN1_PB4, //GPIO index
1422 .GpsVCCEn = RK30_PIN1_PB5, //GPIO index
1423 .GpsSpi_CSO = RK30_PIN1_PA4, //GPIO index
1424 .GpsSpiClk = RK30_PIN1_PA5, //GPIO index
1425 .GpsSpiMOSI = RK30_PIN1_PA7, //GPIO index
1429 .u32GpsPhyAddr = RK30_GPS_PHYS,
1430 .u32GpsPhySize = RK30_GPS_SIZE,
1433 struct platform_device rk_device_gps = {
1434 .name = "gps_hv5820b",
1437 .platform_data = &rk_gps_info,
1442 #if defined(CONFIG_MT5931_MT6622)
1443 static struct mt6622_platform_data mt6622_platdata = {
1444 .power_gpio = { // BT_REG_ON
1445 .io = RK30_PIN3_PD5, // set io to INVALID_GPIO for disable it
1446 .enable = GPIO_HIGH,
1452 .reset_gpio = { // BT_RST
1453 .io = RK30_PIN0_PD7,
1454 .enable = GPIO_HIGH,
1461 .io = RK30_PIN3_PD2,
1462 .enable = GPIO_HIGH,
1468 .rts_gpio = { // UART_RTS
1469 .io = RK30_PIN1_PA3,
1479 static struct platform_device device_mt6622 = {
1483 .platform_data = &mt6622_platdata,
1488 static struct platform_device *devices[] __initdata = {
1492 #ifdef CONFIG_ANDROID_TIMED_GPIO
1493 &rk29_device_vibrator,
1495 #ifdef CONFIG_LEDS_GPIO_PLATFORM
1496 &rk29_device_gpio_leds,
1498 #ifdef CONFIG_RK_IRDA
1501 #if defined(CONFIG_WIFI_CONTROL_FUNC)||defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
1502 &rk29sdk_wifi_device,
1505 #if defined(CONFIG_MT6620)
1509 #ifdef CONFIG_RK29_SUPPORT_MODEM
1512 #if defined(CONFIG_MU509)
1515 #if defined(CONFIG_MW100)
1518 #if defined(CONFIG_MT6229)
1519 &rk29_device_mt6229,
1521 #ifdef CONFIG_BATTERY_RK30_ADC
1522 &rk30_device_adc_battery,
1524 #ifdef CONFIG_RFKILL_RK
1527 #ifdef CONFIG_GPS_RK
1530 #if defined(CONFIG_ARCH_RK3188)
1533 #ifdef CONFIG_MT5931_MT6622
1538 static int rk_platform_add_display_devices(void)
1540 struct platform_device *fb = NULL; //fb
1541 struct platform_device *lcdc0 = NULL; //lcdc0
1542 struct platform_device *lcdc1 = NULL; //lcdc1
1543 struct platform_device *bl = NULL; //backlight
1544 #ifdef CONFIG_FB_ROCKCHIP
1548 #if defined(CONFIG_LCDC0_RK3066B) || defined(CONFIG_LCDC0_RK3188)
1549 lcdc0 = &device_lcdc0,
1552 #if defined(CONFIG_LCDC1_RK3066B) || defined(CONFIG_LCDC1_RK3188)
1553 lcdc1 = &device_lcdc1,
1556 #ifdef CONFIG_BACKLIGHT_RK29_BL
1557 bl = &rk29_device_backlight,
1559 __rk_platform_add_display_devices(fb,lcdc0,lcdc1,bl);
1566 #ifdef CONFIG_I2C0_RK30
1567 static struct i2c_board_info __initdata i2c0_info[] = {
1568 #if defined (CONFIG_GS_MMA8452)
1570 .type = "gs_mma8452",
1573 .irq = MMA8452_INT_PIN,
1574 .platform_data = &mma8452_info,
1577 #if defined (CONFIG_GS_LIS3DH)
1579 .type = "gs_lis3dh",
1580 .addr = 0x19, //0x19(SA0-->VCC), 0x18(SA0-->GND)
1582 .irq = LIS3DH_INT_PIN,
1583 .platform_data = &lis3dh_info,
1586 #if defined (CONFIG_COMPASS_AK8975)
1591 .irq = RK30_PIN3_PD7,
1592 .platform_data = &akm8975_info,
1595 #if defined (CONFIG_GYRO_L3G4200D)
1597 .type = "l3g4200d_gryo",
1600 .irq = L3G4200D_INT_PIN,
1601 .platform_data = &l3g4200d_info,
1604 #if defined (CONFIG_SND_SOC_RK1000)
1606 .type = "rk1000_i2c_codec",
1611 .type = "rk1000_control",
1617 #if defined (CONFIG_SND_SOC_RT5631)
1625 #if defined (CONFIG_SND_SOC_RT5512)
1633 #if defined (CONFIG_SND_SOC_CX2070X)
1641 #if defined (CONFIG_SND_SOC_RT5640)
1649 #ifdef CONFIG_MFD_RK610
1651 .type = "rk610_ctl",
1654 .platform_data = &rk610_ctl_pdata,
1656 #ifdef CONFIG_RK610_TVOUT
1658 .type = "rk610_tvout",
1663 #ifdef CONFIG_HDMI_RK610
1665 .type = "rk610_hdmi",
1668 .irq = INVALID_GPIO,
1671 #ifdef CONFIG_SND_SOC_RK610
1672 {//RK610_CODEC addr from 0x60 to 0x80 (0x60~0x80)
1673 .type = "rk610_i2c_codec",
1676 .platform_data = &rk610_codec_pdata,
1684 int __sramdata g_pmic_type = 0;
1685 #ifdef CONFIG_I2C1_RK30
1686 #ifdef CONFIG_MFD_WM831X_I2C
1687 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1689 static struct pmu_info wm8326_dcdc_info[] = {
1691 .name = "vdd_core", //logic
1694 .suspend_vol = 950000,
1697 .name = "vdd_cpu", //arm
1700 .suspend_vol = 950000,
1703 .name = "dcdc3", //ddr
1706 .suspend_vol = 1150000,
1708 #ifdef CONFIG_MACH_RK3066_SDK
1710 .name = "dcdc4", //vcc_io
1713 .suspend_vol = 3000000,
1717 .name = "dcdc4", //vcc_io
1720 .suspend_vol = 2800000,
1725 static struct pmu_info wm8326_ldo_info[] = {
1727 .name = "ldo1", //vcc18_cif
1730 .suspend_vol = 1800000,
1733 .name = "ldo2", //vccio_wl
1736 .suspend_vol = 1800000,
1742 .suspend_vol = 1100000,
1745 .name = "ldo4", //vdd11
1748 .suspend_vol = 1000000,
1751 .name = "ldo5", //vcc25
1754 .suspend_vol = 1800000,
1757 .name = "ldo6", //vcc33
1760 .suspend_vol = 3300000,
1763 .name = "ldo7", //vcc28_cif
1766 .suspend_vol = 2800000,
1769 .name = "ldo8", //vcca33
1772 .suspend_vol = 3300000,
1775 .name = "ldo9", //vcc_tp
1778 .suspend_vol = 3300000,
1781 .name = "ldo10", //flash_io
1784 .suspend_vol = 1800000,
1788 #include "board-pmu-wm8326.c"
1791 #ifdef CONFIG_MFD_TPS65910
1792 #define TPS65910_HOST_IRQ RK30_PIN0_PB3
1794 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1796 static struct pmu_info tps65910_dcdc_info[] = {
1798 .name = "vdd_core", //logic
1803 .name = "vdd2", //ddr
1808 .name = "vio", //vcc_io
1814 static struct pmu_info tps65910_ldo_info[] = {
1816 .name = "vpll", //vdd10
1821 .name = "vdig1", //vcc18_cif
1826 .name = "vdig2", //vdd_jetta
1831 .name = "vaux1", //vcc28_cif
1836 .name = "vaux2", //vcca33
1841 .name = "vaux33", //vcc_tp
1846 .name = "vmmc", //vcc30
1851 .name = "vdac", //vcc18
1857 #include "board-pmu-tps65910.c"
1860 #ifdef CONFIG_REGULATOR_ACT8846
1861 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1862 #define PMU_VSEL RK30_PIN3_PD3
1863 static struct pmu_info act8846_dcdc_info[] = {
1865 .name = "act_dcdc1", //ddr
1868 .suspend_vol = 1200000,
1871 .name = "vdd_core", //logic
1874 #ifdef CONFIG_ACT8846_SUPPORT_RESET
1875 .suspend_vol = 1200000,
1877 .suspend_vol = 900000,
1882 .name = "vdd_cpu", //arm
1885 #ifdef CONFIG_ACT8846_SUPPORT_RESET
1886 .suspend_vol = 1200000,
1888 .suspend_vol = 900000,
1893 .name = "act_dcdc4", //vccio
1896 #ifdef CONFIG_ACT8846_SUPPORT_RESET
1897 .suspend_vol = 3000000,
1899 .suspend_vol = 2800000,
1905 static struct pmu_info act8846_ldo_info[] = {
1907 .name = "act_ldo1", //vdd11
1912 .name = "act_ldo2", //vdd12
1917 .name = "act_ldo3", //vcc18_cif
1922 .name = "act_ldo4", //vcca33
1927 .name = "act_ldo5", //vcctp
1932 .name = "act_ldo6", //vcc33
1937 .name = "act_ldo7", //vccio_wl
1942 .name = "act_ldo8", //vcc28_cif
1948 #include "board-pmu-act8846.c"
1951 #ifdef CONFIG_MFD_RK808
1952 #define PMU_POWER_SLEEP RK30_PIN0_PA1
1953 #define RK808_HOST_IRQ RK30_PIN0_PB3
1955 static struct pmu_info rk808_dcdc_info[] = {
1957 .name = "vdd_cpu", //arm
1960 .suspend_vol = 900000,
1963 .name = "vdd_core", //logic
1966 .suspend_vol = 900000,
1969 .name = "rk_dcdc3", //ddr
1972 .suspend_vol = 1200000,
1975 .name = "rk_dcdc4", //vccio
1978 .suspend_vol = 3000000,
1982 static struct pmu_info rk808_ldo_info[] = {
1984 .name = "rk_ldo1", //vcc33
1987 .suspend_vol = 3300000,
1990 .name = "rk_ldo2", //vcctp
1993 .suspend_vol = 3300000,
1997 .name = "rk_ldo3", //vdd10
2000 .suspend_vol = 1000000,
2003 .name = "rk_ldo4", //vcc18
2006 .suspend_vol = 1800000,
2009 .name = "rk_ldo5", //vcc28_cif
2012 .suspend_vol = 2800000,
2015 .name = "rk_ldo6", //vdd12
2018 .suspend_vol = 1200000,
2021 .name = "rk_ldo7", //vcc18_cif
2024 .suspend_vol = 1800000,
2027 .name = "rk_ldo8", //vcca_33
2030 .suspend_vol = 3300000,
2034 #include "board-pmu-rk808.c"
2036 #ifdef CONFIG_MFD_RICOH619
2037 #define PMU_POWER_SLEEP RK30_PIN0_PA1
2038 #define RICOH619_HOST_IRQ RK30_PIN0_PB3
2040 static struct pmu_info ricoh619_dcdc_info[] = {
2042 .name = "vdd_cpu", //arm
2045 .suspend_vol = 900000,
2048 .name = "vdd_core", //logic
2051 .suspend_vol = 900000,
2055 .name = "ricoh_dc3", //vcc18
2058 .suspend_vol = 1800000,
2062 .name = "ricoh_dc4", //vccio
2065 .suspend_vol = 3300000,
2069 .name = "ricoh_dc5", //ddr
2072 .suspend_vol = 1200000,
2076 static struct pmu_info ricoh619_ldo_info[] = {
2078 .name = "ricoh_ldo1", //vcc30
2083 .name = "ricoh_ldo2", //vcca33
2088 .name = "ricoh_ldo3", //vcctp
2093 .name = "ricoh_ldo4", //vccsd
2098 .name = "ricoh_ldo5", //vcc18_cif
2103 .name = "ricoh_ldo6", //vdd12
2108 .name = "ricoh_ldo7", //vcc28_cif
2113 .name = "ricoh_ldo8", //vcc25
2118 .name = "ricoh_ldo9", //vdd10
2123 .name = "ricoh_ldo10", //vcca18
2130 #include "board-pmu-ricoh619.c"
2133 #ifdef CONFIG_MFD_RT5025
2134 #define RT5025_HOST_IRQ RK30_PIN0_PB3
2136 static struct pmu_info rt5025_dcdc_info[] = {
2138 .name = "vdd_cpu", //arm
2143 .name = "vdd_core", //logic
2149 .name = "rt5025-dcdc3", //vccio
2155 .name = "rt5025-dcdc4", //vccio
2161 static struct pmu_info rt5025_ldo_info[] = {
2163 .name = "rt5025-ldo1", //vcc18
2168 .name = "rt5025-ldo2", //vddjetta
2173 .name = "rt5025-ldo3", //vdd10
2178 .name = "rt5025-ldo4", //vccjetta
2183 .name = "rt5025-ldo5", //vccio_wl
2188 .name = "rt5025-ldo6", //vcc_tp
2195 #include "board-pmu-rt5025.c"
2200 static struct i2c_board_info __initdata i2c1_info[] = {
2201 #if defined (CONFIG_MFD_WM831X_I2C)
2206 .irq = RK30_PIN0_PB3,
2207 .platform_data = &wm831x_platdata,
2210 #if defined (CONFIG_MFD_TPS65910)
2213 .addr = TPS65910_I2C_ID0,
2215 .irq = TPS65910_HOST_IRQ,
2216 .platform_data = &tps65910_data,
2220 #if defined (CONFIG_REGULATOR_ACT8846)
2225 // .irq = ACT8846_HOST_IRQ,
2226 .platform_data=&act8846_data,
2229 #if defined (CONFIG_MFD_RK808)
2234 // .irq = ACT8846_HOST_IRQ,
2235 .platform_data=&rk808_data,
2239 #if defined (CONFIG_MFD_RICOH619)
2244 .irq = RICOH619_HOST_IRQ,
2245 .platform_data=&ricoh619_data,
2249 #if defined (CONFIG_MFD_RT5025)
2254 .irq = RT5025_HOST_IRQ,
2255 .platform_data=&rt5025_data,
2259 #if defined (CONFIG_RTC_HYM8563)
2261 .type = "rtc_hym8563",
2264 .irq = RK30_PIN1_PA4,
2266 #if defined (CONFIG_CW2015_BATTERY)
2271 .platform_data = &cw_bat_platdata,
2279 void __sramfunc board_pmu_suspend(void)
2281 #if defined (CONFIG_MFD_WM831X_I2C)
2282 if(pmic_is_wm8326())
2283 board_pmu_wm8326_suspend();
2285 #if defined (CONFIG_MFD_TPS65910)
2286 if(pmic_is_tps65910())
2287 board_pmu_tps65910_suspend();
2289 #if defined (CONFIG_REGULATOR_ACT8846)
2290 if(pmic_is_act8846())
2291 board_pmu_act8846_suspend();
2293 #if defined (CONFIG_MFD_RK808)
2295 board_pmu_rk808_suspend();
2297 #if defined (CONFIG_MFD_RICOH619)
2298 if(pmic_is_ricoh619())
2299 board_pmu_ricoh619_suspend();
2304 void __sramfunc board_pmu_resume(void)
2306 #if defined (CONFIG_MFD_WM831X_I2C)
2307 if(pmic_is_wm8326())
2308 board_pmu_wm8326_resume();
2310 #if defined (CONFIG_MFD_TPS65910)
2311 if(pmic_is_tps65910())
2312 board_pmu_tps65910_resume();
2314 #if defined (CONFIG_REGULATOR_ACT8846)
2315 if(pmic_is_act8846())
2316 board_pmu_act8846_resume();
2318 #if defined (CONFIG_MFD_RK808)
2320 board_pmu_rk808_resume();
2322 #if defined (CONFIG_MFD_RICOH619)
2323 if(pmic_is_ricoh619())
2324 board_pmu_ricoh619_resume();
2329 int __sramdata gpio3d6_iomux,gpio3d6_do,gpio3d6_dir,gpio3d6_en;
2331 #define grf_readl(offset) readl_relaxed(RK30_GRF_BASE + offset)
2332 #define grf_writel(v, offset) do { writel_relaxed(v, RK30_GRF_BASE + offset); dsb(); } while (0)
2334 void __sramfunc rk30_pwm_logic_suspend_voltage(void)
2336 #ifdef CONFIG_RK30_PWM_REGULATOR
2338 // int gpio0d7_iomux,gpio0d7_do,gpio0d7_dir,gpio0d7_en;
2340 gpio3d6_iomux = grf_readl(GRF_GPIO3D_IOMUX);
2341 gpio3d6_do = grf_readl(GRF_GPIO3H_DO);
2342 gpio3d6_dir = grf_readl(GRF_GPIO3H_DIR);
2343 gpio3d6_en = grf_readl(GRF_GPIO3H_EN);
2345 grf_writel((0x03000300), GRF_GPIO3D_IOMUX);
2346 grf_writel((1<<28)|(1<<12), GRF_GPIO3H_DIR);
2347 grf_writel((1<<28)|(1<<12), GRF_GPIO3H_DO);
2348 grf_writel((1<<28)|(1<<12), GRF_GPIO3H_EN);
2351 void __sramfunc rk30_pwm_logic_resume_voltage(void)
2353 #ifdef CONFIG_RK30_PWM_REGULATOR
2354 grf_writel((1<<28)|gpio3d6_iomux, GRF_GPIO3D_IOMUX);
2355 grf_writel((1<<30)|gpio3d6_en, GRF_GPIO3H_EN);
2356 grf_writel((1<<30)|gpio3d6_dir, GRF_GPIO3H_DIR);
2357 grf_writel((1<<30)|gpio3d6_do, GRF_GPIO3H_DO);
2363 extern void pwm_suspend_voltage(void);
2364 extern void pwm_resume_voltage(void);
2365 void rk30_pwm_suspend_voltage_set(void)
2367 #ifdef CONFIG_RK30_PWM_REGULATOR
2368 pwm_suspend_voltage();
2371 void rk30_pwm_resume_voltage_set(void)
2373 #ifdef CONFIG_RK30_PWM_REGULATOR
2374 pwm_resume_voltage();
2379 #ifdef CONFIG_I2C2_RK30
2380 static struct i2c_board_info __initdata i2c2_info[] = {
2381 #if defined (CONFIG_TOUCHSCREEN_GT8XX)
2383 .type = "Goodix-TS",
2386 .irq = RK30_PIN1_PB7,
2387 .platform_data = &goodix_info,
2390 #if defined (CONFIG_LS_CM3217)
2392 .type = "lightsensor",
2395 .platform_data = &cm3217_info,
2401 #ifdef CONFIG_I2C3_RK30
2402 static struct i2c_board_info __initdata i2c3_info[] = {
2406 #ifdef CONFIG_I2C4_RK30
2407 static struct i2c_board_info __initdata i2c4_info[] = {
2408 #if defined (CONFIG_MFD_RK616)
2413 .platform_data = &rk616_pdata,
2420 #ifdef CONFIG_I2C_GPIO_RK30
2421 #define I2C_SDA_PIN INVALID_GPIO// RK30_PIN2_PD6 //set sda_pin here
2422 #define I2C_SCL_PIN INVALID_GPIO//RK30_PIN2_PD7 //set scl_pin here
2423 static int rk30_i2c_io_init(void)
2425 //set iomux (gpio) here
2426 //rk30_mux_api_set(GPIO2D7_I2C1SCL_NAME, GPIO2D_GPIO2D7);
2427 //rk30_mux_api_set(GPIO2D6_I2C1SDA_NAME, GPIO2D_GPIO2D6);
2431 struct i2c_gpio_platform_data default_i2c_gpio_data = {
2432 .sda_pin = I2C_SDA_PIN,
2433 .scl_pin = I2C_SCL_PIN,
2434 .udelay = 5, // clk = 500/udelay = 100Khz
2435 .timeout = 100,//msecs_to_jiffies(100),
2437 .io_init = rk30_i2c_io_init,
2439 static struct i2c_board_info __initdata i2c_gpio_info[] = {
2443 static void __init rk30_i2c_register_board_info(void)
2445 #ifdef CONFIG_I2C0_RK30
2446 i2c_register_board_info(0, i2c0_info, ARRAY_SIZE(i2c0_info));
2448 #ifdef CONFIG_I2C1_RK30
2449 i2c_register_board_info(1, i2c1_info, ARRAY_SIZE(i2c1_info));
2451 #ifdef CONFIG_I2C2_RK30
2452 i2c_register_board_info(2, i2c2_info, ARRAY_SIZE(i2c2_info));
2454 #ifdef CONFIG_I2C3_RK30
2455 i2c_register_board_info(3, i2c3_info, ARRAY_SIZE(i2c3_info));
2457 #ifdef CONFIG_I2C4_RK30
2458 i2c_register_board_info(4, i2c4_info, ARRAY_SIZE(i2c4_info));
2460 #ifdef CONFIG_I2C_GPIO_RK30
2461 i2c_register_board_info(5, i2c_gpio_info, ARRAY_SIZE(i2c_gpio_info));
2466 // ========== Begin of rk3168 top board keypad defination ============
2468 #include <plat/key.h>
2470 static struct rk29_keys_button key_button[] = {
2473 .code = KEY_VOLUMEDOWN,
2475 .gpio = INVALID_GPIO,
2476 .active_low = PRESS_LEV_LOW,
2481 .gpio = RK30_PIN0_PA4,
2482 .active_low = PRESS_LEV_LOW,
2487 .code = KEY_VOLUMEUP,
2489 .gpio = INVALID_GPIO,
2490 .active_low = PRESS_LEV_LOW,
2496 .gpio = INVALID_GPIO,
2497 .active_low = PRESS_LEV_LOW,
2503 .gpio = INVALID_GPIO,
2504 .active_low = PRESS_LEV_LOW,
2510 .gpio = INVALID_GPIO,
2511 .active_low = PRESS_LEV_LOW,
2517 .gpio = INVALID_GPIO,
2518 .active_low = PRESS_LEV_LOW,
2521 struct rk29_keys_platform_data rk29_keys_pdata = {
2522 .buttons = key_button,
2523 .nbuttons = ARRAY_SIZE(key_button),
2524 .chn = 1, //chn: 0-7, if do not use ADC,set 'chn' -1
2527 // =========== End of rk3168 top board keypad defination =============
2530 #define POWER_ON_PIN RK30_PIN0_PA0 //power_hold
2531 static void rk30_pm_power_off(void)
2533 printk(KERN_ERR "rk30_pm_power_off start...\n");
2534 #if defined(CONFIG_MFD_WM831X)
2535 if(pmic_is_wm8326()){
2536 wm831x_set_bits(Wm831x,WM831X_GPIO_LEVEL,0x0001,0x0000); //set sys_pwr 0
2537 wm831x_device_shutdown(Wm831x);//wm8326 shutdown
2541 #if defined(CONFIG_REGULATOR_ACT8846)
2542 if(pmic_is_act8846())
2544 act8846_device_shutdown();
2548 #if defined(CONFIG_MFD_TPS65910)
2549 if(pmic_is_tps65910())
2551 tps65910_device_shutdown();//tps65910 shutdown
2555 #if defined(CONFIG_MFD_RK808)
2558 rk808_device_shutdown();//rk808 shutdown
2561 #if defined(CONFIG_MFD_RICOH619)
2562 if(pmic_is_ricoh619()){
2563 ricoh619_power_off(); //ricoh619 shutdown
2567 #if defined(CONFIG_MFD_RT5025)
2568 if(pmic_is_rt5025()){
2569 rt5025_power_off(); //rt5025 shutdown
2573 gpio_direction_output(POWER_ON_PIN, GPIO_LOW);
2577 static void __init machine_rk30_board_init(void)
2580 gpio_request(POWER_ON_PIN, "poweronpin");
2581 gpio_direction_output(POWER_ON_PIN, GPIO_HIGH);
2583 pm_power_off = rk30_pm_power_off;
2585 gpio_direction_output(POWER_ON_PIN, GPIO_HIGH);
2588 rk30_i2c_register_board_info();
2589 spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
2590 platform_add_devices(devices, ARRAY_SIZE(devices));
2591 rk_platform_add_display_devices();
2592 board_usb_detect_init(RK30_PIN0_PA7);
2594 #if defined(CONFIG_WIFI_CONTROL_FUNC)
2595 rk29sdk_wifi_bt_gpio_control_init();
2596 #elif defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
2597 rk29sdk_wifi_combo_module_gpio_init();
2600 #if defined(CONFIG_MT6620)
2601 clk_set_rate(clk_get_sys("rk_serial.0", "uart"), 48*1000000);
2604 #if defined(CONFIG_MT5931_MT6622)
2605 clk_set_rate(clk_get_sys("rk_serial.0", "uart"), 24*1000000);
2608 #define HD_SCREEN_SIZE 1920UL*1200UL*4*3
2609 static void __init rk30_reserve(void)
2611 #if defined(CONFIG_ARCH_RK3188)
2612 /*if lcd resolution great than or equal to 1920*1200,reserve the ump memory */
2613 if(!(get_fb_size() < ALIGN(HD_SCREEN_SIZE,SZ_1M)))
2615 int ump_mem_phy_size=512UL*1024UL*1024UL;
2616 resource_mali[0].start = board_mem_reserve_add("ump buf", ump_mem_phy_size);
2617 resource_mali[0].end = resource_mali[0].start + ump_mem_phy_size -1;
2621 rk30_ion_pdata.heaps[0].base = board_mem_reserve_add("ion", ION_RESERVE_SIZE);
2623 #ifdef CONFIG_FB_ROCKCHIP
2624 resource_fb[0].start = board_mem_reserve_add("fb0 buf", get_fb_size());
2625 resource_fb[0].end = resource_fb[0].start + get_fb_size()- 1;
2627 resource_fb[1].start = board_mem_reserve_add("ipp buf", RK30_FB0_MEM_SIZE);
2628 resource_fb[1].end = resource_fb[1].start + RK30_FB0_MEM_SIZE - 1;
2631 #if defined(CONFIG_FB_ROTATE) || !defined(CONFIG_THREE_FB_BUFFER)
2632 resource_fb[2].start = board_mem_reserve_add("fb2 buf",get_fb_size());
2633 resource_fb[2].end = resource_fb[2].start + get_fb_size() - 1;
2637 #ifdef CONFIG_VIDEO_RK29
2638 rk30_camera_request_reserve_mem();
2641 #ifdef CONFIG_GPS_RK
2642 //it must be more than 8MB
2643 rk_gps_info.u32MemoryPhyAddr = board_mem_reserve_add("gps", SZ_8M);
2645 board_mem_reserved();
2647 /******************************** arm dvfs frequency volt table **********************************/
2649 * dvfs_cpu_logic_table: table for arm and logic dvfs
2650 * @frequency : arm frequency
2651 * @cpu_volt : arm voltage depend on frequency
2654 #if defined(CONFIG_ARCH_RK3188)
2657 static struct cpufreq_frequency_table dvfs_arm_table_volt_level0[] = {
2658 {.frequency = 312 * 1000, .index = 850 * 1000},
2659 {.frequency = 504 * 1000, .index = 900 * 1000},
2660 {.frequency = 816 * 1000, .index = 950 * 1000},
2661 {.frequency = 1008 * 1000, .index = 1025 * 1000},
2662 {.frequency = 1200 * 1000, .index = 1100 * 1000},
2663 {.frequency = 1416 * 1000, .index = 1200 * 1000},
2664 {.frequency = 1608 * 1000, .index = 1300 * 1000},
2665 {.frequency = CPUFREQ_TABLE_END},
2667 //default for rk sdk testing
2668 static struct cpufreq_frequency_table dvfs_arm_table_volt_level1[] = {
2669 {.frequency = 312 * 1000, .index = 875 * 1000},
2670 {.frequency = 504 * 1000, .index = 925 * 1000},
2671 {.frequency = 816 * 1000, .index = 975 * 1000},
2672 {.frequency = 1008 * 1000, .index = 1075 * 1000},
2673 {.frequency = 1200 * 1000, .index = 1150 * 1000},
2674 {.frequency = 1416 * 1000, .index = 1250 * 1000},
2675 {.frequency = 1608 * 1000, .index = 1350 * 1000},
2676 {.frequency = CPUFREQ_TABLE_END},
2679 // for production , fixed: 2013.9.13
2680 static struct cpufreq_frequency_table dvfs_arm_table_volt_level2[] = {
2681 {.frequency = 312 * 1000, .index = 925 * 1000},
2682 {.frequency = 504 * 1000, .index = 950 * 1000},
2683 {.frequency = 816 * 1000, .index = 1000 * 1000},
2684 {.frequency = 1008 * 1000, .index = 1075 * 1000},
2685 {.frequency = 1200 * 1000, .index = 1200 * 1000},
2686 {.frequency = 1416 * 1000, .index = 1250 * 1000},
2687 {.frequency = 1608 * 1000, .index = 1350 * 1000},
2688 {.frequency = CPUFREQ_TABLE_END},
2691 /******************************** gpu dvfs frequency volt table **********************************/
2693 static struct cpufreq_frequency_table dvfs_gpu_table_volt_level0[] = {
2694 {.frequency = 133 * 1000, .index = 975 * 1000},//the mininum rate is limited 133M for rk3188
2695 {.frequency = 200 * 1000, .index = 975 * 1000},
2696 {.frequency = 266 * 1000, .index = 1000 * 1000},
2697 {.frequency = 300 * 1000, .index = 1050 * 1000},
2698 {.frequency = 400 * 1000, .index = 1100 * 1000},
2699 {.frequency = 600 * 1000, .index = 1200 * 1000},
2700 {.frequency = CPUFREQ_TABLE_END},
2703 static struct cpufreq_frequency_table dvfs_gpu_table_volt_level1[] = {
2704 {.frequency = 133 * 1000, .index = 975 * 1000},//the mininum rate is limited 133M for rk3188
2705 {.frequency = 200 * 1000, .index = 1000 * 1000},
2706 {.frequency = 266 * 1000, .index = 1025 * 1000},
2707 {.frequency = 300 * 1000, .index = 1050 * 1000},
2708 {.frequency = 400 * 1000, .index = 1100 * 1000},
2709 {.frequency = 600 * 1000, .index = 1250 * 1000},
2710 {.frequency = CPUFREQ_TABLE_END},
2713 /******************************** ddr dvfs frequency volt table **********************************/
2714 static struct cpufreq_frequency_table dvfs_ddr_table_volt_level0[] = {
2715 {.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 950 * 1000},
2716 {.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1000 * 1000},
2717 {.frequency = 396 * 1000 + DDR_FREQ_NORMAL, .index = 1100 * 1000},
2718 {.frequency = 460 * 1000 + DDR_FREQ_DUALVIEW, .index = 1150 * 1000},
2719 //{.frequency = 528 * 1000 + DDR_FREQ_NORMAL, .index = 1200 * 1000},
2720 {.frequency = CPUFREQ_TABLE_END},
2723 static struct cpufreq_frequency_table dvfs_ddr_table_t[] = {
2724 {.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 950 * 1000},
2725 {.frequency = 460 * 1000 + DDR_FREQ_NORMAL, .index = 1150 * 1000},
2726 {.frequency = CPUFREQ_TABLE_END},
2729 //if you board is good for volt quality,select dvfs_arm_table_volt_level0
2730 #define dvfs_arm_table dvfs_arm_table_volt_level2
2731 #define dvfs_gpu_table dvfs_gpu_table_volt_level1
2732 #define dvfs_ddr_table dvfs_ddr_table_volt_level0
2735 //for RK3168 && RK3066B
2736 static struct cpufreq_frequency_table dvfs_arm_table[] = {
2737 {.frequency = 312 * 1000, .index = 950 * 1000},
2738 {.frequency = 504 * 1000, .index = 1000 * 1000},
2739 {.frequency = 816 * 1000, .index = 1050 * 1000},
2740 {.frequency = 1008 * 1000, .index = 1125 * 1000},
2741 {.frequency = 1200 * 1000, .index = 1200 * 1000},
2742 //{.frequency = 1416 * 1000, .index = 1250 * 1000},
2743 //{.frequency = 1608 * 1000, .index = 1300 * 1000},
2744 {.frequency = CPUFREQ_TABLE_END},
2747 static struct cpufreq_frequency_table dvfs_gpu_table[] = {
2748 {.frequency = 100 * 1000, .index = 1000 * 1000},
2749 {.frequency = 200 * 1000, .index = 1000 * 1000},
2750 {.frequency = 266 * 1000, .index = 1050 * 1000},
2751 //{.frequency = 300 * 1000, .index = 1050 * 1000},
2752 {.frequency = 400 * 1000, .index = 1125 * 1000},
2753 {.frequency = CPUFREQ_TABLE_END},
2756 static struct cpufreq_frequency_table dvfs_ddr_table[] = {
2757 {.frequency = 200 * 1000 + DDR_FREQ_SUSPEND, .index = 1000 * 1000},
2758 {.frequency = 300 * 1000 + DDR_FREQ_VIDEO, .index = 1050 * 1000},
2759 {.frequency = 400 * 1000 + DDR_FREQ_NORMAL, .index = 1100 * 1000},
2760 {.frequency = 450 * 1000, .index = 1150 * 1000},
2761 {.frequency = CPUFREQ_TABLE_END},
2764 /******************************** arm dvfs frequency volt table end **********************************/
2765 //#define DVFS_CPU_TABLE_SIZE (ARRAY_SIZE(dvfs_cpu_logic_table))
2766 //static struct cpufreq_frequency_table cpu_dvfs_table[DVFS_CPU_TABLE_SIZE];
2767 //static struct cpufreq_frequency_table dep_cpu2core_table[DVFS_CPU_TABLE_SIZE];
2768 int get_max_freq(struct cpufreq_frequency_table *table)
2772 for(i=0;table[i].frequency!= CPUFREQ_TABLE_END;i++)
2774 if(temp<table[i].frequency)
2775 temp=table[i].frequency;
2777 printk("get_max_freq=%d\n",temp);
2781 void __init board_clock_init(void)
2783 u32 flags=RK30_CLOCKS_DEFAULT_FLAGS;
2784 #if !defined(CONFIG_ARCH_RK3188)
2785 if(get_max_freq(dvfs_gpu_table)<=(400*1000))
2787 flags=RK30_CLOCKS_DEFAULT_FLAGS|CLK_GPU_GPLL;
2790 flags=RK30_CLOCKS_DEFAULT_FLAGS|CLK_GPU_CPLL;
2792 rk30_clock_data_init(periph_pll_default, codec_pll_default, flags);
2793 //dvfs_set_arm_logic_volt(dvfs_cpu_logic_table, cpu_dvfs_table, dep_cpu2core_table);
2794 dvfs_set_freq_volt_table(clk_get(NULL, "cpu"), dvfs_arm_table);
2795 dvfs_set_freq_volt_table(clk_get(NULL, "gpu"), dvfs_gpu_table);
2796 #if defined(CONFIG_ARCH_RK3188)
2797 if (rk_pll_flag() == 0)
2798 dvfs_set_freq_volt_table(clk_get(NULL, "ddr"), dvfs_ddr_table);
2800 dvfs_set_freq_volt_table(clk_get(NULL, "ddr"), dvfs_ddr_table_t);
2802 dvfs_set_freq_volt_table(clk_get(NULL, "ddr"), dvfs_ddr_table);
2806 MACHINE_START(RK30, "RK30board")
2807 .boot_params = PLAT_PHYS_OFFSET + 0x800,
2808 .fixup = rk30_fixup,
2809 .reserve = &rk30_reserve,
2810 .map_io = rk30_map_io,
2811 .init_irq = rk30_init_irq,
2812 .timer = &rk30_timer,
2813 .init_machine = machine_rk30_board_init,