1 /* arch/arm/mach-rk30/board-rk30-sdk.c
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>
28 #include <asm/setup.h>
29 #include <asm/mach-types.h>
30 #include <asm/mach/arch.h>
31 #include <asm/mach/map.h>
32 #include <asm/mach/flash.h>
33 #include <asm/hardware/gic.h>
35 #include <mach/board.h>
36 #include <mach/hardware.h>
38 #include <mach/gpio.h>
39 #include <mach/iomux.h>
40 /*set touchscreen different type header*/
41 #if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI)
42 #include "../../../drivers/input/touchscreen/xpt2046_ts.h"
43 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_TSLIB_SPI)
44 #include "../../../drivers/input/touchscreen/xpt2046_tslib_ts.h"
45 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
46 #include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h"
48 #if defined(CONFIG_SPIM_RK29)
49 #include "../../../drivers/spi/rk29_spim.h"
51 #if defined(CONFIG_ANDROID_TIMED_GPIO)
52 #include "../../../drivers/staging/android/timed_gpio.h"
55 #define RK30_FB0_MEM_SIZE 8*SZ_1M
57 #ifdef CONFIG_VIDEO_RK29
58 /*---------------- Camera Sensor Macro Define Begin ------------------------*/
59 /*---------------- Camera Sensor Configuration Macro Begin ------------------------*/
60 #define CONFIG_SENSOR_0 RK29_CAM_SENSOR_OV2659//RK_CAM_SENSOR_OV5642 /* back camera sensor */
61 #define CONFIG_SENSOR_IIC_ADDR_0 0x60//0x78
62 #define CONFIG_SENSOR_IIC_ADAPTER_ID_0 1
63 #define CONFIG_SENSOR_CIF_INDEX_0 0
64 #define CONFIG_SENSOR_ORIENTATION_0 90
65 #define CONFIG_SENSOR_POWER_PIN_0 INVALID_GPIO
66 #define CONFIG_SENSOR_RESET_PIN_0 INVALID_GPIO
67 #define CONFIG_SENSOR_POWERDN_PIN_0 INVALID_GPIO
68 #define CONFIG_SENSOR_FALSH_PIN_0 INVALID_GPIO
69 #define CONFIG_SENSOR_POWERACTIVE_LEVEL_0 RK29_CAM_POWERACTIVE_L
70 #define CONFIG_SENSOR_RESETACTIVE_LEVEL_0 RK29_CAM_RESETACTIVE_L
71 #define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_H
72 #define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
74 #define CONFIG_SENSOR_QCIF_FPS_FIXED_0 15000
75 #define CONFIG_SENSOR_QVGA_FPS_FIXED_0 15000
76 #define CONFIG_SENSOR_CIF_FPS_FIXED_0 15000
77 #define CONFIG_SENSOR_VGA_FPS_FIXED_0 15000
78 #define CONFIG_SENSOR_480P_FPS_FIXED_0 15000
79 #define CONFIG_SENSOR_SVGA_FPS_FIXED_0 15000
80 #define CONFIG_SENSOR_720P_FPS_FIXED_0 30000
82 #define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV2659 /* front camera sensor */
83 #define CONFIG_SENSOR_IIC_ADDR_1 0x60
84 #define CONFIG_SENSOR_IIC_ADAPTER_ID_1 1
85 #define CONFIG_SENSOR_CIF_INDEX_1 1
86 #define CONFIG_SENSOR_ORIENTATION_1 270
87 #define CONFIG_SENSOR_POWER_PIN_1 INVALID_GPIO
88 #define CONFIG_SENSOR_RESET_PIN_1 INVALID_GPIO
89 #define CONFIG_SENSOR_POWERDN_PIN_1 INVALID_GPIO
90 #define CONFIG_SENSOR_FALSH_PIN_1 INVALID_GPIO
91 #define CONFIG_SENSOR_POWERACTIVE_LEVEL_1 RK29_CAM_POWERACTIVE_L
92 #define CONFIG_SENSOR_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
93 #define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1 RK29_CAM_POWERDNACTIVE_H
94 #define CONFIG_SENSOR_FLASHACTIVE_LEVEL_1 RK29_CAM_FLASHACTIVE_L
96 #define CONFIG_SENSOR_QCIF_FPS_FIXED_1 15000
97 #define CONFIG_SENSOR_QVGA_FPS_FIXED_1 15000
98 #define CONFIG_SENSOR_CIF_FPS_FIXED_1 15000
99 #define CONFIG_SENSOR_VGA_FPS_FIXED_1 15000
100 #define CONFIG_SENSOR_480P_FPS_FIXED_1 15000
101 #define CONFIG_SENSOR_SVGA_FPS_FIXED_1 15000
102 #define CONFIG_SENSOR_720P_FPS_FIXED_1 30000
104 #define CONFIG_USE_CIF_0 1
105 #define CONFIG_USE_CIF_1 0
106 #endif //#ifdef CONFIG_VIDEO_RK29
107 /*---------------- Camera Sensor Configuration Macro End------------------------*/
108 #include "../../../drivers/media/video/rk30_camera.c"
109 /*---------------- Camera Sensor Macro Define End ---------*/
111 #define PMEM_CAM_SIZE PMEM_CAM_NECESSARY
112 #ifdef CONFIG_VIDEO_RK29_WORK_IPP
113 #define MEM_CAMIPP_SIZE PMEM_CAMIPP_NECESSARY
115 #define MEM_CAMIPP_SIZE 0
117 /*****************************************************************************************
119 * author: ddl@rock-chips.com
120 *****************************************************************************************/
121 #ifdef CONFIG_VIDEO_RK29
122 #define CONFIG_SENSOR_POWER_IOCTL_USR 0
123 #define CONFIG_SENSOR_RESET_IOCTL_USR 0
124 #define CONFIG_SENSOR_POWERDOWN_IOCTL_USR 0
125 #define CONFIG_SENSOR_FLASH_IOCTL_USR 0
127 #if CONFIG_SENSOR_POWER_IOCTL_USR
128 static int sensor_power_usr_cb (struct rk29camera_gpio_res *res,int on)
130 #error "CONFIG_SENSOR_POWER_IOCTL_USR is 1, sensor_power_usr_cb function must be writed!!";
134 #if CONFIG_SENSOR_RESET_IOCTL_USR
135 static int sensor_reset_usr_cb (struct rk29camera_gpio_res *res,int on)
137 #error "CONFIG_SENSOR_RESET_IOCTL_USR is 1, sensor_reset_usr_cb function must be writed!!";
141 #if CONFIG_SENSOR_POWERDOWN_IOCTL_USR
142 static int sensor_powerdown_usr_cb (struct rk29camera_gpio_res *res,int on)
144 #error "CONFIG_SENSOR_POWERDOWN_IOCTL_USR is 1, sensor_powerdown_usr_cb function must be writed!!";
148 #if CONFIG_SENSOR_FLASH_IOCTL_USR
149 static int sensor_flash_usr_cb (struct rk29camera_gpio_res *res,int on)
151 #error "CONFIG_SENSOR_FLASH_IOCTL_USR is 1, sensor_flash_usr_cb function must be writed!!";
155 static struct rk29camera_platform_ioctl_cb sensor_ioctl_cb = {
156 #if CONFIG_SENSOR_POWER_IOCTL_USR
157 .sensor_power_cb = sensor_power_usr_cb,
159 .sensor_power_cb = NULL,
162 #if CONFIG_SENSOR_RESET_IOCTL_USR
163 .sensor_reset_cb = sensor_reset_usr_cb,
165 .sensor_reset_cb = NULL,
168 #if CONFIG_SENSOR_POWERDOWN_IOCTL_USR
169 .sensor_powerdown_cb = sensor_powerdown_usr_cb,
171 .sensor_powerdown_cb = NULL,
174 #if CONFIG_SENSOR_FLASH_IOCTL_USR
175 .sensor_flash_cb = sensor_flash_usr_cb,
177 .sensor_flash_cb = NULL,
180 static struct reginfo_t rk_init_data_sensor_reg_0[] =
184 static struct reginfo_t rk_init_data_sensor_winseqreg_0[] ={
187 static rk_sensor_user_init_data_s rk_init_data_sensor_0 =
189 .rk_sensor_init_width = INVALID_VALUE,
190 .rk_sensor_init_height = INVALID_VALUE,
191 .rk_sensor_init_bus_param = INVALID_VALUE,
192 .rk_sensor_init_pixelcode = INVALID_VALUE,
193 .rk_sensor_init_data = rk_init_data_sensor_reg_0,
194 .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_0,
195 .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
198 static rk_sensor_user_init_data_s* rk_init_data_sensor_0_p = &rk_init_data_sensor_0;
199 static rk_sensor_user_init_data_s* rk_init_data_sensor_1_p = NULL;
200 #include "../../../drivers/media/video/rk30_camera.c"
204 #if defined(CONFIG_TOUCHSCREEN_GT8XX)
205 #define TOUCH_RESET_PIN RK30_PIN4_PD0
206 #define TOUCH_PWR_PIN INVALID_GPIO
207 int goodix_init_platform_hw(void)
210 printk("goodix_init_platform_hw\n");
211 if(TOUCH_PWR_PIN != INVALID_GPIO)
213 ret = gpio_request(TOUCH_PWR_PIN, "goodix power pin");
215 gpio_free(TOUCH_PWR_PIN);
216 printk("goodix power error\n");
219 gpio_direction_output(TOUCH_PWR_PIN, 0);
220 gpio_set_value(TOUCH_PWR_PIN,GPIO_LOW);
224 if(TOUCH_RESET_PIN != INVALID_GPIO)
226 ret = gpio_request(TOUCH_RESET_PIN, "goodix reset pin");
228 gpio_free(TOUCH_RESET_PIN);
229 printk("goodix gpio_request error\n");
232 gpio_direction_output(TOUCH_RESET_PIN, 0);
233 gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW);
235 gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH);
241 struct goodix_platform_data goodix_info = {
243 .irq_pin = RK30_PIN4_PC2,
244 .rest_pin = TOUCH_RESET_PIN,
245 .init_platform_hw = goodix_init_platform_hw,
250 /*****************************************************************************************
251 * xpt2046 touch panel
252 * author: hhb@rock-chips.com
253 *****************************************************************************************/
254 #if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_TSLIB_SPI)
255 #define XPT2046_GPIO_INT RK30_PIN4_PC2
256 #define DEBOUNCE_REPTIME 3
259 static struct xpt2046_platform_data xpt2046_info = {
264 .debounce_rep = DEBOUNCE_REPTIME,
266 .gpio_pendown = XPT2046_GPIO_INT,
267 .pendown_iomux_name = GPIO4C2_SMCDATA2_TRACEDATA2_NAME,
268 .pendown_iomux_mode = GPIO4C_GPIO4C2,
269 .touch_virtualkey_length = 60,
270 .penirq_recheck_delay_usecs = 1,
271 #if defined(CONFIG_TOUCHSCREEN_480X800)
276 .touch_ad_top = 3940,
277 .touch_ad_bottom = 310,
278 .touch_ad_left = 3772,
279 .touch_ad_right = 340,
280 #elif defined(CONFIG_TOUCHSCREEN_800X480)
285 .touch_ad_top = 2447,
286 .touch_ad_bottom = 207,
287 .touch_ad_left = 5938,
288 .touch_ad_right = 153,
289 #elif defined(CONFIG_TOUCHSCREEN_320X480)
294 .touch_ad_top = 3166,
295 .touch_ad_bottom = 256,
296 .touch_ad_left = 3658,
297 .touch_ad_right = 380,
300 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
301 static struct xpt2046_platform_data xpt2046_info = {
306 .debounce_rep = DEBOUNCE_REPTIME,
308 .gpio_pendown = XPT2046_GPIO_INT,
309 .pendown_iomux_name = GPIO4C2_SMCDATA2_TRACEDATA2_NAME,
310 .pendown_iomux_mode = GPIO4C_GPIO4C2,
311 .touch_virtualkey_length = 60,
312 .penirq_recheck_delay_usecs = 1,
314 #if defined(CONFIG_TOUCHSCREEN_480X800)
319 .screen_x = { 70, 410, 70, 410, 240},
320 .screen_y = { 50, 50, 740, 740, 400},
321 .uncali_x_default = { 3267, 831, 3139, 715, 1845 },
322 .uncali_y_default = { 3638, 3664, 564, 591, 2087 },
323 #elif defined(CONFIG_TOUCHSCREEN_800X480)
328 .screen_x[5] = { 50, 750, 50, 750, 400};
329 .screen_y[5] = { 40, 40, 440, 440, 240};
330 .uncali_x_default[5] = { 438, 565, 3507, 3631, 2105 };
331 .uncali_y_default[5] = { 3756, 489, 3792, 534, 2159 };
332 #elif defined(CONFIG_TOUCHSCREEN_320X480)
337 .screen_x[5] = { 50, 270, 50, 270, 160};
338 .screen_y[5] = { 40, 40, 440, 440, 240};
339 .uncali_x_default[5] = { 812, 3341, 851, 3371, 2183 };
340 .uncali_y_default[5] = { 442, 435, 3193, 3195, 2004 };
344 #if defined(CONFIG_TOUCHSCREEN_XPT2046_SPI)
345 static struct rk29xx_spi_chip xpt2046_chip = {
350 static struct spi_board_info board_spi_devices[] = {
351 #if defined(CONFIG_TOUCHSCREEN_XPT2046_SPI)
353 .modalias = "xpt2046_ts",
354 .chip_select = 1,// 2,
355 .max_speed_hz = 1 * 1000 * 800,/* (max sample rate @ 3V) * (cmd + data + overhead) */
357 .irq = XPT2046_GPIO_INT,
358 .platform_data = &xpt2046_info,
359 .controller_data = &xpt2046_chip,
366 /***********************************************************
368 ************************************************************/
369 #ifdef CONFIG_BACKLIGHT_RK29_BL
371 #define PWM_MUX_NAME GPIO0A3_PWM0_NAME
372 #define PWM_MUX_MODE GPIO0A_PWM0
373 #define PWM_MUX_MODE_GPIO GPIO0A_GPIO0A3
374 #define PWM_GPIO RK30_PIN0_PA3
375 #define PWM_EFFECT_VALUE 1
377 #define LCD_DISP_ON_PIN
379 #ifdef LCD_DISP_ON_PIN
380 //#define BL_EN_MUX_NAME GPIOF34_UART3_SEL_NAME
381 //#define BL_EN_MUX_MODE IOMUXB_GPIO1_B34
383 #define BL_EN_PIN RK30_PIN6_PB3
384 #define BL_EN_VALUE GPIO_HIGH
386 static int rk29_backlight_io_init(void)
389 rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
390 #ifdef LCD_DISP_ON_PIN
391 // rk30_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE);
393 ret = gpio_request(BL_EN_PIN, NULL);
396 gpio_free(BL_EN_PIN);
399 gpio_direction_output(BL_EN_PIN, 0);
400 gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
405 static int rk29_backlight_io_deinit(void)
408 #ifdef LCD_DISP_ON_PIN
409 gpio_free(BL_EN_PIN);
411 rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO);
415 static int rk29_backlight_pwm_suspend(void)
418 rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO);
419 if (gpio_request(PWM_GPIO, NULL)) {
420 printk("func %s, line %d: request gpio fail\n", __FUNCTION__, __LINE__);
423 gpio_direction_output(PWM_GPIO, GPIO_LOW);
424 #ifdef LCD_DISP_ON_PIN
425 gpio_direction_output(BL_EN_PIN, 0);
426 gpio_set_value(BL_EN_PIN, !BL_EN_VALUE);
431 static int rk29_backlight_pwm_resume(void)
434 rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
435 #ifdef LCD_DISP_ON_PIN
437 gpio_direction_output(BL_EN_PIN, 1);
438 gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
443 static struct rk29_bl_info rk29_bl_info = {
445 .bl_ref = PWM_EFFECT_VALUE,
446 .io_init = rk29_backlight_io_init,
447 .io_deinit = rk29_backlight_io_deinit,
448 .pwm_suspend = rk29_backlight_pwm_suspend,
449 .pwm_resume = rk29_backlight_pwm_resume,
453 static struct platform_device rk29_device_backlight = {
454 .name = "rk29_backlight",
457 .platform_data = &rk29_bl_info,
464 #if defined (CONFIG_GS_MMA8452)
465 #define MMA8452_INT_PIN RK30_PIN4_PC0
467 static int mma8452_init_platform_hw(void)
469 rk30_mux_api_set(GPIO4C0_SMCDATA0_TRACEDATA0_NAME, GPIO4C_GPIO4C0);
471 if(gpio_request(MMA8452_INT_PIN,NULL) != 0){
472 gpio_free(MMA8452_INT_PIN);
473 printk("mma8452_init_platform_hw gpio_request error\n");
476 gpio_pull_updown(MMA8452_INT_PIN, 1);
481 static struct mma8452_platform_data mma8452_info = {
485 .init_platform_hw= mma8452_init_platform_hw,
486 .orientation = { -1, 0, 0, 0, 0, 1, 0, -1, 0},
489 #if defined (CONFIG_COMPASS_AK8975)
490 static struct akm8975_platform_data akm8975_info =
523 #if defined(CONFIG_GYRO_L3G4200D)
525 #include <linux/l3g4200d.h>
526 #define L3G4200D_INT_PIN RK30_PIN4_PC3
528 static int l3g4200d_init_platform_hw(void)
530 if (gpio_request(L3G4200D_INT_PIN, NULL) != 0) {
531 gpio_free(L3G4200D_INT_PIN);
532 printk("%s: request l3g4200d int pin error\n", __func__);
535 gpio_pull_updown(L3G4200D_INT_PIN, 1);
539 static struct l3g4200d_platform_data l3g4200d_info = {
550 .init = l3g4200d_init_platform_hw,
555 #ifdef CONFIG_LS_CM3217
557 #define CM3217_POWER_PIN INVALID_GPIO
558 #define CM3217_IRQ_PIN INVALID_GPIO
559 static int cm3217_init_hw(void)
562 if (gpio_request(CM3217_POWER_PIN, NULL) != 0) {
563 gpio_free(CM3217_POWER_PIN);
564 printk("%s: request cm3217 power pin error\n", __func__);
567 gpio_pull_updown(CM3217_POWER_PIN, PullDisable);
569 if (gpio_request(CM3217_IRQ_PIN, NULL) != 0) {
570 gpio_free(CM3217_IRQ_PIN);
571 printk("%s: request cm3217 int pin error\n", __func__);
574 gpio_pull_updown(CM3217_IRQ_PIN, PullDisable);
579 static void cm3217_exit_hw(void)
582 gpio_free(CM3217_POWER_PIN);
583 gpio_free(CM3217_IRQ_PIN);
588 struct cm3217_platform_data cm3217_info = {
589 .irq_pin = CM3217_IRQ_PIN,
590 .power_pin = CM3217_POWER_PIN,
591 .init_platform_hw = cm3217_init_hw,
592 .exit_platform_hw = cm3217_exit_hw,
598 #ifdef CONFIG_FB_ROCKCHIP
599 static struct resource resource_fb[] = {
603 .end = 0,//RK30_FB0_MEM_SIZE - 1,
604 .flags = IORESOURCE_MEM,
607 .name = "ipp buf", //for rotate
609 .end = 0,//RK30_FB0_MEM_SIZE - 1,
610 .flags = IORESOURCE_MEM,
615 .end = 0,//RK30_FB0_MEM_SIZE - 1,
616 .flags = IORESOURCE_MEM,
620 static struct platform_device device_fb = {
623 .num_resources = ARRAY_SIZE(resource_fb),
624 .resource = resource_fb,
628 #ifdef CONFIG_ANDROID_TIMED_GPIO
629 static struct timed_gpio timed_gpios[] = {
632 .gpio = RK30_PIN0_PA4,
635 .adjust_time =20, //adjust for diff product
639 struct timed_gpio_platform_data rk29_vibrator_info = {
641 .gpios = timed_gpios,
644 struct platform_device rk29_device_vibrator ={
645 .name = "timed-gpio",
648 .platform_data = &rk29_vibrator_info,
654 #ifdef CONFIG_LEDS_GPIO_PLATFORM
655 struct gpio_led rk29_leds[] = {
657 .name = "button-backlight",
658 .gpio = RK30_PIN4_PD7,
659 .default_trigger = "timer",
661 .retain_state_suspended = 0,
662 .default_state = LEDS_GPIO_DEFSTATE_OFF,
666 struct gpio_led_platform_data rk29_leds_pdata = {
668 .num_leds = ARRAY_SIZE(rk29_leds),
671 struct platform_device rk29_device_gpio_leds = {
675 .platform_data = &rk29_leds_pdata,
680 #ifdef CONFIG_RK_IRDA
681 #define IRDA_IRQ_PIN RK30_PIN6_PA1
683 int irda_iomux_init(void)
688 ret = gpio_request(IRDA_IRQ_PIN, NULL);
691 gpio_free(IRDA_IRQ_PIN);
692 printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n ");
694 gpio_pull_updown(IRDA_IRQ_PIN, PullDisable);
695 gpio_direction_input(IRDA_IRQ_PIN);
700 int irda_iomux_deinit(void)
702 gpio_free(IRDA_IRQ_PIN);
706 static struct irda_info rk29_irda_info = {
707 .intr_pin = IRDA_IRQ_PIN,
708 .iomux_init = irda_iomux_init,
709 .iomux_deinit = irda_iomux_deinit,
710 //.irda_pwr_ctl = bu92747guw_power_ctl,
713 static struct platform_device irda_device = {
714 #ifdef CONFIG_RK_IRDA_NET
717 .name = "bu92747_irda",
721 .platform_data = &rk29_irda_info,
727 #define ION_RESERVE_SIZE (80 * SZ_1M)
728 static struct ion_platform_data rk30_ion_pdata = {
732 .type = ION_HEAP_TYPE_CARVEOUT,
733 .id = ION_NOR_HEAP_ID,
735 .size = ION_RESERVE_SIZE,
740 static struct platform_device device_ion = {
741 .name = "ion-rockchip",
744 .platform_data = &rk30_ion_pdata,
749 static struct platform_device *devices[] __initdata = {
750 #ifdef CONFIG_BACKLIGHT_RK29_BL
751 &rk29_device_backlight,
753 #ifdef CONFIG_FB_ROCKCHIP
759 #ifdef CONFIG_ANDROID_TIMED_GPIO
760 &rk29_device_vibrator,
762 #ifdef CONFIG_LEDS_GPIO_PLATFORM
763 &rk29_device_gpio_leds,
765 #ifdef CONFIG_RK_IRDA
771 #ifdef CONFIG_I2C0_RK30
772 static struct i2c_board_info __initdata i2c0_info[] = {
773 #if defined (CONFIG_GS_MMA8452)
775 .type = "gs_mma8452",
778 .irq = MMA8452_INT_PIN,
779 .platform_data = &mma8452_info,
782 #if defined (CONFIG_COMPASS_AK8975)
787 .irq = RK30_PIN4_PC1,
788 .platform_data = &akm8975_info,
791 #if defined (CONFIG_GYRO_L3G4200D)
793 .type = "l3g4200d_gryo",
796 .irq = L3G4200D_INT_PIN,
797 .platform_data = &l3g4200d_info,
801 #if defined (CONFIG_SND_SOC_RK1000)
803 .type = "rk1000_i2c_codec",
808 .type = "rk1000_control",
816 #ifdef CONFIG_I2C1_RK30
817 #include "board-rk30-sdk-wm8326.c"
819 static struct i2c_board_info __initdata i2c1_info[] = {
820 #if defined (CONFIG_MFD_WM831X_I2C)
823 .addr = 0x36, //0x34 ,is Decided by cs
825 .irq = RK30_PIN6_PA4,
826 .platform_data = &wm831x_platdata,
832 #ifdef CONFIG_I2C2_RK30
833 static struct i2c_board_info __initdata i2c2_info[] = {
834 #if defined (CONFIG_TOUCHSCREEN_GT8XX)
840 .platform_data = &goodix_info,
843 #if defined (CONFIG_LS_CM3217)
845 .type = "lightsensor",
848 .irq = CM3217_IRQ_PIN,
849 .platform_data = &cm3217_info,
856 #ifdef CONFIG_I2C3_RK30
857 static struct i2c_board_info __initdata i2c3_info[] = {
861 #ifdef CONFIG_I2C4_RK30
862 static struct i2c_board_info __initdata i2c4_info[] = {
866 static void __init rk30_i2c_register_board_info(void)
868 #ifdef CONFIG_I2C0_RK30
869 i2c_register_board_info(0, i2c0_info, ARRAY_SIZE(i2c0_info));
871 #ifdef CONFIG_I2C1_RK30
872 i2c_register_board_info(1, i2c1_info, ARRAY_SIZE(i2c1_info));
874 #ifdef CONFIG_I2C2_RK30
875 i2c_register_board_info(2, i2c2_info, ARRAY_SIZE(i2c2_info));
877 #ifdef CONFIG_I2C3_RK30
878 i2c_register_board_info(3, i2c3_info, ARRAY_SIZE(i2c3_info));
880 #ifdef CONFIG_I2C4_RK30
881 i2c_register_board_info(4, i2c4_info, ARRAY_SIZE(i2c4_info));
887 /**************************************************************************************************
888 * SDMMC devices, include the module of SD,MMC,sdio,and some BT.noted by xbw at 2012-03-05
889 **************************************************************************************************/
890 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
891 #define SDMMC0_WRITE_PROTECT_PIN RK30_PIN3_PB7 //According to your own project to set the value of write-protect-pin.
895 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
896 #define SDMMC1_WRITE_PROTECT_PIN RK30_PIN3_PC7 //According to your own project to set the value of write-protect-pin.
899 #if !defined(CONFIG_SDMMC_RK29_OLD)
900 static void rk29_sdmmc_gpio_open(int device_id, int on)
906 #ifdef CONFIG_SDMMC0_RK29
909 gpio_direction_output(GPIO3B_GPIO3B0,GPIO_HIGH);//set mmc0-clk to high
910 gpio_direction_output(GPIO3B_GPIO3B1,GPIO_HIGH);// set mmc0-cmd to high.
911 gpio_direction_output(GPIO3B_GPIO3B2,GPIO_HIGH);//set mmc0-data0 to high.
912 gpio_direction_output(GPIO3B_GPIO3B3,GPIO_HIGH);//set mmc0-data1 to high.
913 gpio_direction_output(GPIO3B_GPIO3B4,GPIO_HIGH);//set mmc0-data2 to high.
914 gpio_direction_output(GPIO3B_GPIO3B5,GPIO_HIGH);//set mmc0-data3 to high.
920 rk30_mux_api_set(GPIO3B0_SDMMC0CLKOUT_NAME, GPIO3B_GPIO3B0);
921 gpio_request(RK30_PIN3_PB0, "mmc0-clk");
922 gpio_direction_output(RK30_PIN3_PB0,GPIO_LOW);//set mmc0-clk to low.
924 rk30_mux_api_set(GPIO3B1_SDMMC0CMD_NAME, GPIO3B_GPIO3B1);
925 gpio_request(RK30_PIN3_PB1, "mmc0-cmd");
926 gpio_direction_output(RK30_PIN3_PB1,GPIO_LOW);//set mmc0-cmd to low.
928 rk30_mux_api_set(GPIO3B2_SDMMC0DATA0_NAME, GPIO3B_GPIO3B2);
929 gpio_request(RK30_PIN3_PB2, "mmc0-data0");
930 gpio_direction_output(RK30_PIN3_PB2,GPIO_LOW);//set mmc0-data0 to low.
932 rk30_mux_api_set(GPIO3B3_SDMMC0DATA1_NAME, GPIO3B_GPIO3B3);
933 gpio_request(RK30_PIN3_PB3, "mmc0-data1");
934 gpio_direction_output(RK30_PIN3_PB3,GPIO_LOW);//set mmc0-data1 to low.
936 rk30_mux_api_set(GPIO3B4_SDMMC0DATA2_NAME, GPIO3B_GPIO3B4);
937 gpio_request(RK30_PIN3_PB4, "mmc0-data2");
938 gpio_direction_output(RK30_PIN3_PB4,GPIO_LOW);//set mmc0-data2 to low.
940 rk30_mux_api_set(GPIO3B5_SDMMC0DATA3_NAME, GPIO3B_GPIO3B5);
941 gpio_request(RK30_PIN3_PB5, "mmc0-data3");
942 gpio_direction_output(RK30_PIN3_PB5,GPIO_LOW);//set mmc0-data3 to low.
952 #ifdef CONFIG_SDMMC1_RK29
955 gpio_direction_output(RK30_PIN3_PC5,GPIO_HIGH);//set mmc1-clk to high
956 gpio_direction_output(RK30_PIN3_PC0,GPIO_HIGH);//set mmc1-cmd to high.
957 gpio_direction_output(RK30_PIN3_PC1,GPIO_HIGH);//set mmc1-data0 to high.
958 gpio_direction_output(RK30_PIN3_PC2,GPIO_HIGH);//set mmc1-data1 to high.
959 gpio_direction_output(RK30_PIN3_PC3,GPIO_HIGH);//set mmc1-data2 to high.
960 gpio_direction_output(RK30_PIN3_PC5,GPIO_HIGH);//set mmc1-data3 to high.
965 rk30_mux_api_set(GPIO3C5_SDMMC1CLKOUT_NAME, GPIO3C_GPIO3C5);
966 gpio_request(RK30_PIN3_PC5, "mmc1-clk");
967 gpio_direction_output(RK30_PIN3_PC5,GPIO_LOW);//set mmc1-clk to low.
969 rk30_mux_api_set(GPIO3C0_SMMC1CMD_NAME, GPIO3C_GPIO3C0);
970 gpio_request(RK30_PIN3_PC0, "mmc1-cmd");
971 gpio_direction_output(RK30_PIN3_PC0,GPIO_LOW);//set mmc1-cmd to low.
973 rk30_mux_api_set(GPIO3C1_SDMMC1DATA0_NAME, GPIO3C_GPIO3C1);
974 gpio_request(RK30_PIN3_PC1, "mmc1-data0");
975 gpio_direction_output(RK30_PIN3_PC1,GPIO_LOW);//set mmc1-data0 to low.
991 static void rk29_sdmmc_set_iomux_mmc0(unsigned int bus_width)
996 case 1://SDMMC_CTYPE_4BIT:
998 rk30_mux_api_set(GPIO3B3_SDMMC0DATA1_NAME, GPIO3B_SDMMC0_DATA1);
999 rk30_mux_api_set(GPIO3B4_SDMMC0DATA2_NAME, GPIO3B_SDMMC0_DATA2);
1000 rk30_mux_api_set(GPIO3B5_SDMMC0DATA3_NAME, GPIO3B_SDMMC0_DATA3);
1004 case 0x10000://SDMMC_CTYPE_8BIT:
1006 case 0xFFFF: //gpio_reset
1008 rk30_mux_api_set(GPIO3A7_SDMMC0PWREN_NAME, GPIO3A_GPIO3A7);
1009 gpio_request(RK30_PIN3_PA7,"sdmmc-power");
1010 gpio_direction_output(RK30_PIN3_PA7,GPIO_HIGH); //power-off
1012 rk29_sdmmc_gpio_open(0, 0);
1014 gpio_direction_output(RK30_PIN3_PA7,GPIO_LOW); //power-on
1016 rk29_sdmmc_gpio_open(0, 1);
1020 default: //case 0://SDMMC_CTYPE_1BIT:
1022 rk30_mux_api_set(GPIO3B1_SDMMC0CMD_NAME, GPIO3B_SDMMC0_CMD);
1023 rk30_mux_api_set(GPIO3B0_SDMMC0CLKOUT_NAME, GPIO3B_SDMMC0_CLKOUT);
1024 rk30_mux_api_set(GPIO3B2_SDMMC0DATA0_NAME, GPIO3B_SDMMC0_DATA0);
1026 rk30_mux_api_set(GPIO3B3_SDMMC0DATA1_NAME, GPIO3B_GPIO3B3);
1027 gpio_request(RK30_PIN3_PB3, "mmc0-data1");
1028 gpio_direction_output(RK30_PIN3_PB3,GPIO_HIGH);//set mmc0-data1 to high.
1030 rk30_mux_api_set(GPIO3B4_SDMMC0DATA2_NAME, GPIO3B_GPIO3B4);
1031 gpio_request(RK30_PIN3_PB4, "mmc0-data2");
1032 gpio_direction_output(RK30_PIN3_PB4,GPIO_HIGH);//set mmc0-data2 to high.
1034 rk30_mux_api_set(GPIO3B5_SDMMC0DATA3_NAME, GPIO3B_GPIO3B5);
1035 gpio_request(RK30_PIN3_PB5, "mmc0-data3");
1036 gpio_direction_output(RK30_PIN3_PB5,GPIO_HIGH);//set mmc0-data3 to high.
1042 static void rk29_sdmmc_set_iomux_mmc1(unsigned int bus_width)
1044 rk30_mux_api_set(GPIO3C0_SMMC1CMD_NAME, GPIO3C_SMMC1_CMD);
1045 rk30_mux_api_set(GPIO3C5_SDMMC1CLKOUT_NAME, GPIO3C_SDMMC1_CLKOUT);
1046 rk30_mux_api_set(GPIO3C1_SDMMC1DATA0_NAME, GPIO3C_SDMMC1_DATA0);
1047 rk30_mux_api_set(GPIO3C2_SDMMC1DATA1_NAME, GPIO3C_SDMMC1_DATA1);
1048 rk30_mux_api_set(GPIO3C3_SDMMC1DATA2_NAME, GPIO3C_SDMMC1_DATA2);
1049 rk30_mux_api_set(GPIO3C4_SDMMC1DATA3_NAME, GPIO3C_SDMMC1_DATA3);
1052 static void rk29_sdmmc_set_iomux_mmc2(unsigned int bus_width)
1057 static void rk29_sdmmc_set_iomux(int device_id, unsigned int bus_width)
1062 #ifdef CONFIG_SDMMC0_RK29
1063 rk29_sdmmc_set_iomux_mmc0(bus_width);
1067 #ifdef CONFIG_SDMMC1_RK29
1068 rk29_sdmmc_set_iomux_mmc1(bus_width);
1072 rk29_sdmmc_set_iomux_mmc2(bus_width);
1082 #ifdef CONFIG_SDMMC0_RK29
1083 static int rk29_sdmmc0_cfg_gpio(void)
1085 #ifdef CONFIG_SDMMC_RK29_OLD
1086 rk30_mux_api_set(GPIO3B1_SDMMC0CMD_NAME, GPIO3B_SDMMC0_CMD);
1087 rk30_mux_api_set(GPIO3B0_SDMMC0CLKOUT_NAME, GPIO3B_SDMMC0_CLKOUT);
1088 rk30_mux_api_set(GPIO3B2_SDMMC0DATA0_NAME, GPIO3B_SDMMC0_DATA0);
1089 rk30_mux_api_set(GPIO3B3_SDMMC0DATA1_NAME, GPIO3B_SDMMC0_DATA1);
1090 rk30_mux_api_set(GPIO3B4_SDMMC0DATA2_NAME, GPIO3B_SDMMC0_DATA2);
1091 rk30_mux_api_set(GPIO3B5_SDMMC0DATA3_NAME, GPIO3B_SDMMC0_DATA3);
1093 rk30_mux_api_set(GPIO3B6_SDMMC0DETECTN_NAME, GPIO3B_GPIO3B6);
1095 rk30_mux_api_set(GPIO3A7_SDMMC0PWREN_NAME, GPIO3A_GPIO3A7);
1096 gpio_request(RK30_PIN3_PA7,"sdmmc-power");
1097 gpio_direction_output(RK30_PIN3_PA7,GPIO_LOW);
1100 rk29_sdmmc_set_iomux(0, 0xFFFF);
1102 rk30_mux_api_set(GPIO3B6_SDMMC0DETECTN_NAME, GPIO3B_SDMMC0_DETECT_N);
1104 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
1105 gpio_request(SDMMC0_WRITE_PROTECT_PIN,"sdmmc-wp");
1106 gpio_direction_input(SDMMC0_WRITE_PROTECT_PIN);
1114 #define CONFIG_SDMMC0_USE_DMA
1115 struct rk29_sdmmc_platform_data default_sdmmc0_data = {
1116 .host_ocr_avail = (MMC_VDD_25_26|MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
1117 MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33|
1118 MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),
1119 .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
1120 .io_init = rk29_sdmmc0_cfg_gpio,
1122 #if !defined(CONFIG_SDMMC_RK29_OLD)
1123 .set_iomux = rk29_sdmmc_set_iomux,
1126 .dma_name = "sd_mmc",
1127 #ifdef CONFIG_SDMMC0_USE_DMA
1132 .detect_irq = RK30_PIN3_PB6, // INVALID_GPIO
1133 .enable_sd_wakeup = 0,
1135 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
1136 .write_prt = SDMMC0_WRITE_PROTECT_PIN,
1138 .write_prt = INVALID_GPIO,
1141 #endif//endif--#ifdef CONFIG_SDMMC0_RK29
1143 #ifdef CONFIG_SDMMC1_RK29
1144 #define CONFIG_SDMMC1_USE_DMA
1145 static int rk29_sdmmc1_cfg_gpio(void)
1147 #if defined(CONFIG_SDMMC_RK29_OLD)
1148 rk30_mux_api_set(GPIO3C0_SMMC1CMD_NAME, GPIO3C_SMMC1_CMD);
1149 rk30_mux_api_set(GPIO3C5_SDMMC1CLKOUT_NAME, GPIO3C_SDMMC1_CLKOUT);
1150 rk30_mux_api_set(GPIO3C1_SDMMC1DATA0_NAME, GPIO3C_SDMMC1_DATA0);
1151 rk30_mux_api_set(GPIO3C2_SDMMC1DATA1_NAME, GPIO3C_SDMMC1_DATA1);
1152 rk30_mux_api_set(GPIO3C3_SDMMC1DATA2_NAME, GPIO3C_SDMMC1_DATA2);
1153 rk30_mux_api_set(GPIO3C4_SDMMC1DATA3_NAME, GPIO3C_SDMMC1_DATA3);
1154 //rk30_mux_api_set(GPIO3C6_SDMMC1DETECTN_NAME, GPIO3C_SDMMC1_DETECT_N);
1158 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1159 gpio_request(SDMMC1_WRITE_PROTECT_PIN,"sdio-wp");
1160 gpio_direction_input(SDMMC1_WRITE_PROTECT_PIN);
1170 #define RK29SDK_WIFI_SDIO_CARD_DETECT_N RK30_PIN6_PB2
1172 struct rk29_sdmmc_platform_data default_sdmmc1_data = {
1173 .host_ocr_avail = (MMC_VDD_25_26|MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|
1174 MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|
1175 MMC_VDD_32_33|MMC_VDD_33_34),
1177 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1178 .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ|
1179 MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
1181 .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
1184 .io_init = rk29_sdmmc1_cfg_gpio,
1186 #if !defined(CONFIG_SDMMC_RK29_OLD)
1187 .set_iomux = rk29_sdmmc_set_iomux,
1191 #ifdef CONFIG_SDMMC1_USE_DMA
1197 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1198 #ifdef CONFIG_WIFI_CONTROL_FUNC
1199 .status = rk29sdk_wifi_status,
1200 .register_status_notify = rk29sdk_wifi_status_register,
1203 .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N,
1206 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1207 .write_prt = SDMMC1_WRITE_PROTECT_PIN,
1209 .write_prt = INVALID_GPIO,
1213 .detect_irq = INVALID_GPIO,
1214 .enable_sd_wakeup = 0,
1218 #endif //endif--#ifdef CONFIG_SDMMC1_RK29
1220 int rk29sdk_wifi_power_state = 0;
1221 int rk29sdk_bt_power_state = 0;
1223 #ifdef CONFIG_WIFI_CONTROL_FUNC
1224 #define RK29SDK_WIFI_BT_GPIO_POWER_N RK30_PIN3_PD0
1225 #define RK29SDK_WIFI_GPIO_RESET_N RK30_PIN3_PD2
1226 #define RK29SDK_BT_GPIO_RESET_N RK30_PIN3_PD1
1228 static int rk29sdk_wifi_cd = 0; /* wifi virtual 'card detect' status */
1229 static void (*wifi_status_cb)(int card_present, void *dev_id);
1230 static void *wifi_status_cb_devid;
1232 static int rk29sdk_wifi_status(struct device *dev)
1234 return rk29sdk_wifi_cd;
1237 static int rk29sdk_wifi_status_register(void (*callback)(int card_present, void *dev_id), void *dev_id)
1241 wifi_status_cb = callback;
1242 wifi_status_cb_devid = dev_id;
1246 static int rk29sdk_wifi_bt_gpio_control_init(void)
1248 if (gpio_request(RK29SDK_WIFI_BT_GPIO_POWER_N, "wifi_bt_power")) {
1249 pr_info("%s: request wifi_bt power gpio failed\n", __func__);
1253 if (gpio_request(RK29SDK_WIFI_GPIO_RESET_N, "wifi reset")) {
1254 pr_info("%s: request wifi reset gpio failed\n", __func__);
1255 gpio_free(RK29SDK_WIFI_BT_GPIO_POWER_N);
1259 if (gpio_request(RK29SDK_BT_GPIO_RESET_N, "bt reset")) {
1260 pr_info("%s: request bt reset gpio failed\n", __func__);
1261 gpio_free(RK29SDK_WIFI_GPIO_RESET_N);
1265 gpio_direction_output(RK29SDK_WIFI_BT_GPIO_POWER_N, GPIO_LOW);
1266 gpio_direction_output(RK29SDK_WIFI_GPIO_RESET_N, GPIO_LOW);
1267 gpio_direction_output(RK29SDK_BT_GPIO_RESET_N, GPIO_LOW);
1269 #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
1271 rk29_mux_api_set(GPIO3C2_SDMMC1DATA1_NAME, GPIO3C_GPIO3C2);
1272 gpio_request(RK30_PIN3_PC2, "mmc1-data1");
1273 gpio_direction_output(RK30_PIN3_PC2,GPIO_LOW);//set mmc1-data1 to low.
1275 rk29_mux_api_set(GPIO3C3_SDMMC1DATA2_NAME, GPIO3C_GPIO3C3);
1276 gpio_request(RK30_PIN3_PC3, "mmc1-data2");
1277 gpio_direction_output(RK30_PIN3_PC3,GPIO_LOW);//set mmc1-data2 to low.
1279 rk29_mux_api_set(GPIO3C4_SDMMC1DATA3_NAME, GPIO3C_GPIO3C4);
1280 gpio_request(RK30_PIN3_PC4, "mmc1-data3");
1281 gpio_direction_output(RK30_PIN3_PC4,GPIO_LOW);//set mmc1-data3 to low.
1283 rk29_sdmmc_gpio_open(1, 0); //added by xbw at 2011-10-13
1285 pr_info("%s: init finished\n",__func__);
1290 static int rk29sdk_wifi_power(int on)
1292 pr_info("%s: %d\n", __func__, on);
1294 gpio_set_value(RK29SDK_WIFI_BT_GPIO_POWER_N, GPIO_HIGH);
1296 #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
1297 rk29_sdmmc_gpio_open(1, 1); //added by xbw at 2011-10-13
1300 gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, GPIO_HIGH);
1302 pr_info("wifi turn on power\n");
1304 if (!rk29sdk_bt_power_state){
1305 gpio_set_value(RK29SDK_WIFI_BT_GPIO_POWER_N, GPIO_LOW);
1307 #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
1308 rk29_sdmmc_gpio_open(1, 0); //added by xbw at 2011-10-13
1312 pr_info("wifi shut off power\n");
1315 pr_info("wifi shouldn't shut off power, bt is using it!\n");
1317 gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, GPIO_LOW);
1321 rk29sdk_wifi_power_state = on;
1325 static int rk29sdk_wifi_reset_state;
1326 static int rk29sdk_wifi_reset(int on)
1328 pr_info("%s: %d\n", __func__, on);
1329 gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, on);
1331 rk29sdk_wifi_reset_state = on;
1335 int rk29sdk_wifi_set_carddetect(int val)
1337 pr_info("%s:%d\n", __func__, val);
1338 rk29sdk_wifi_cd = val;
1339 if (wifi_status_cb){
1340 wifi_status_cb(val, wifi_status_cb_devid);
1342 pr_warning("%s, nobody to notify\n", __func__);
1346 EXPORT_SYMBOL(rk29sdk_wifi_set_carddetect);
1348 static struct wifi_mem_prealloc wifi_mem_array[PREALLOC_WLAN_SEC_NUM] = {
1349 {NULL, (WLAN_SECTION_SIZE_0 + PREALLOC_WLAN_SECTION_HEADER)},
1350 {NULL, (WLAN_SECTION_SIZE_1 + PREALLOC_WLAN_SECTION_HEADER)},
1351 {NULL, (WLAN_SECTION_SIZE_2 + PREALLOC_WLAN_SECTION_HEADER)},
1352 {NULL, (WLAN_SECTION_SIZE_3 + PREALLOC_WLAN_SECTION_HEADER)}
1355 static void *rk29sdk_mem_prealloc(int section, unsigned long size)
1357 if (section == PREALLOC_WLAN_SEC_NUM)
1358 return wlan_static_skb;
1360 if ((section < 0) || (section > PREALLOC_WLAN_SEC_NUM))
1363 if (wifi_mem_array[section].size < size)
1366 return wifi_mem_array[section].mem_ptr;
1369 int __init rk29sdk_init_wifi_mem(void)
1374 for (i = 0 ; i < WLAN_SKB_BUF_NUM ; i++) {
1375 wlan_static_skb[i] = dev_alloc_skb(
1376 ((i < (WLAN_SKB_BUF_NUM / 2)) ? 4096 : 8192));
1378 if (!wlan_static_skb[i])
1382 for (i = 0 ; i < PREALLOC_WLAN_SEC_NUM ; i++) {
1383 wifi_mem_array[i].mem_ptr =
1384 kmalloc(wifi_mem_array[i].size, GFP_KERNEL);
1386 if (!wifi_mem_array[i].mem_ptr)
1392 pr_err("Failed to mem_alloc for WLAN\n");
1393 for (j = 0 ; j < i ; j++)
1394 kfree(wifi_mem_array[j].mem_ptr);
1396 i = WLAN_SKB_BUF_NUM;
1399 pr_err("Failed to skb_alloc for WLAN\n");
1400 for (j = 0 ; j < i ; j++)
1401 dev_kfree_skb(wlan_static_skb[j]);
1406 static struct wifi_platform_data rk29sdk_wifi_control = {
1407 .set_power = rk29sdk_wifi_power,
1408 .set_reset = rk29sdk_wifi_reset,
1409 .set_carddetect = rk29sdk_wifi_set_carddetect,
1410 .mem_prealloc = rk29sdk_mem_prealloc,
1412 static struct platform_device rk29sdk_wifi_device = {
1413 .name = "bcm4329_wlan",
1416 .platform_data = &rk29sdk_wifi_control,
1422 /* bluetooth rfkill device */
1423 static struct platform_device rk29sdk_rfkill = {
1424 .name = "rk29sdk_rfkill",
1428 /**************************************************************************************************
1429 * the end of setting for SDMMC devices
1430 **************************************************************************************************/
1432 static void __init machine_rk30_board_init(void)
1434 rk30_i2c_register_board_info();
1435 spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
1436 platform_add_devices(devices, ARRAY_SIZE(devices));
1439 static void __init rk30_reserve(void)
1442 rk30_ion_pdata.heaps[0].base = board_mem_reserve_add("ion",ION_RESERVE_SIZE);
1444 #ifdef CONFIG_FB_ROCKCHIP
1445 resource_fb[0].start = board_mem_reserve_add("fb0",RK30_FB0_MEM_SIZE);
1446 resource_fb[0].end = resource_fb[0].start + RK30_FB0_MEM_SIZE - 1;
1447 resource_fb[1].start = board_mem_reserve_add("ipp buf",RK30_FB0_MEM_SIZE);
1448 resource_fb[1].end = resource_fb[1].start + RK30_FB0_MEM_SIZE - 1;
1449 resource_fb[2].start = board_mem_reserve_add("fb2",RK30_FB0_MEM_SIZE);
1450 resource_fb[2].end = resource_fb[2].start + RK30_FB0_MEM_SIZE - 1;
1453 #if (MEM_CAMIPP_SIZE != 0)
1454 #if CONFIG_USE_CIF_0
1455 rk_camera_platform_data.meminfo.name = "camera_ipp_mem_0";
1456 rk_camera_platform_data.meminfo.start = board_mem_reserve_add("camera_ipp_mem_0",MEM_CAMIPP_SIZE);
1457 rk_camera_platform_data.meminfo.size= MEM_CAMIPP_SIZE;
1459 #if CONFIG_USE_CIF_1
1460 rk_camera_platform_data.meminfo_cif1.name = "camera_ipp_mem_1";
1461 rk_camera_platform_data.meminfo_cif1.start =board_mem_reserve_add("camera_ipp_mem_1",MEM_CAMIPP_SIZE);
1462 rk_camera_platform_data.meminfo_cif1.size= MEM_CAMIPP_SIZE;
1466 #if (PMEM_CAM_SIZE != 0)
1467 android_pmem_cam_pdata.start = board_mem_reserve_add("camera_pmem",PMEM_CAM_SIZE);
1468 android_pmem_cam_pdata.size = PMEM_CAM_SIZE;
1471 board_mem_reserved();
1474 MACHINE_START(RK30, "RK30board")
1475 .boot_params = PLAT_PHYS_OFFSET + 0x800,
1476 .fixup = rk30_fixup,
1477 .reserve = &rk30_reserve,
1478 .map_io = rk30_map_io,
1479 .init_irq = rk30_init_irq,
1480 .timer = &rk30_timer,
1481 .init_machine = machine_rk30_board_init,