From 84499f302127984b81cfb9e1f5a66fd1e3f47e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E7=9B=9B=E9=A3=9E?= Date: Fri, 20 Jul 2012 10:45:52 +0800 Subject: [PATCH 1/7] rk30:phone: the battery power display about the system resume --- drivers/power/twl6030_bci_battery.c | 133 ++++++++++++++++------------ 1 file changed, 77 insertions(+), 56 deletions(-) diff --git a/drivers/power/twl6030_bci_battery.c b/drivers/power/twl6030_bci_battery.c index 7deb26c04a43..4441fe252dbc 100644 --- a/drivers/power/twl6030_bci_battery.c +++ b/drivers/power/twl6030_bci_battery.c @@ -339,7 +339,9 @@ struct twl6030_bci_device_info { int capacitytmp; int usb_status; int usb_old_satus; - int gBatCapacityChargeCnt; + int gBatCapacityChargeCnt; + int suspend_capacity; + int resume_status; }; static BLOCKING_NOTIFIER_HEAD(notifier_list); @@ -1709,77 +1711,93 @@ static int twl6030_batt_vol_to_capacity (struct twl6030_bci_device_info *di) { - int i = 0; - int capacity = 0; - int BatVoltage; + int i = 0; + int capacity = 0; + int BatVoltage; - struct batt_vol_cal *p; - p = batt_table; + struct batt_vol_cal *p; + p = batt_table; - BatVoltage = di ->voltage_mV; + BatVoltage = di ->voltage_mV; - if (di->charge_status == POWER_SUPPLY_STATUS_CHARGING){ //charge - if(BatVoltage >= (p[BATT_NUM - 1].charge_vol)){ - capacity = 100; - } - else{ - if(BatVoltage <= (p[0].charge_vol)){ - capacity = 0; - } - else{ - for(i = 0; i < BATT_NUM - 1; i++){ + if (di->charge_status == POWER_SUPPLY_STATUS_CHARGING){ //charge + if(BatVoltage >= (p[BATT_NUM - 1].charge_vol)){ + capacity = 100; + } + else{ + if(BatVoltage <= (p[0].charge_vol)){ + capacity = 0; + } + else{ + for(i = 0; i < BATT_NUM - 1; i++){ - if(((p[i].charge_vol) <= BatVoltage) && (BatVoltage < (p[i+1].charge_vol))){ - // capacity = p[i].disp_cal ; + if(((p[i].charge_vol) <= BatVoltage) && (BatVoltage < (p[i+1].charge_vol))){ + // capacity = p[i].disp_cal ; capacity = i * 10 + ((BatVoltage - p[i].charge_vol) * 10) / (p[i+1] .charge_vol- p[i].charge_vol); - break; - } - } - } - } + break; + } + } + } + } - } - else{ //discharge - if(BatVoltage >= (p[BATT_NUM - 1].dis_charge_vol)){ - capacity = 100; - } - else{ - if(BatVoltage <= (p[0].dis_charge_vol)){ - capacity = 0; - } - else{ - for(i = 0; i < BATT_NUM - 1; i++){ - if(((p[i].dis_charge_vol) <= BatVoltage) && (BatVoltage < (p[i+1].dis_charge_vol))){ - // capacity = p[i].disp_cal ; + } + else{ //discharge + if(BatVoltage >= (p[BATT_NUM - 1].dis_charge_vol)){ + capacity = 100; + } + else{ + if(BatVoltage <= (p[0].dis_charge_vol)){ + capacity = 0; + } + else{ + for(i = 0; i < BATT_NUM - 1; i++){ + if(((p[i].dis_charge_vol) <= BatVoltage) && (BatVoltage < (p[i+1].dis_charge_vol))){ + // capacity = p[i].disp_cal ; capacity = i * 10 + ((BatVoltage - p[i].dis_charge_vol) * 10) / (p[i+1] .dis_charge_vol- p[i].dis_charge_vol); - break; - } - } - } + break; + } + } + } - } + } - } + } - return capacity; + return capacity; } -void twl6030_batt_capacity_samples(struct twl6030_bci_device_info *di) +static void twl6030_batt_capacity_samples(struct twl6030_bci_device_info *di) { int capacity = 0; capacity = twl6030_batt_vol_to_capacity (di); - twl6030battery_current(di); - //printk("old-capactiyt == %d, now-capacity == %d , di->charge_status == %d,di->current_uA = %d\n", di->capacity, capacity, di->charge_status,di->current_uA); -/////////////////////////////////////////////////////////////////////////////////////////////////////// + twl6030battery_current(di); + if( 1 == di->resume_status ){ + di->resume_status = 0; + if (di->charge_status == POWER_SUPPLY_STATUS_CHARGING){\ + if (di->suspend_capacity > capacity){ -// capacity = twl6030_batt_vol_to_capacity (di); + di->capacity = di->suspend_capacity; + }else{ + di->capacity = capacity; + } + }else{ + if (di->suspend_capacity > capacity){ + di->capacity = capacity; + }else{ + di->capacity = di->suspend_capacity; + } + + } + return; + + } if (di->charge_status == POWER_SUPPLY_STATUS_FULL){ if (capacity < di->capacity){ @@ -3176,8 +3194,8 @@ static int __devexit twl6030_bci_battery_remove(struct platform_device *pdev) #ifdef CONFIG_PM static int twl6030_bci_battery_suspend(struct device *dev) { -// struct platform_device *pdev = to_platform_device(dev); -// struct twl6030_bci_device_info *di = platform_get_drvdata(pdev); + struct platform_device *pdev = to_platform_device(dev); + struct twl6030_bci_device_info *di = platform_get_drvdata(pdev); long int events; u8 rd_reg = 0; int ret; @@ -3194,10 +3212,12 @@ static int twl6030_bci_battery_suspend(struct device *dev) if (ret) goto err; - //cancel_delayed_work(&di->work); - //cancel_delayed_work(&di->twl6030_bci_monitor_work); + //cancel_delayed_work(&di->work); + cancel_delayed_work(&di->twl6030_bci_monitor_work); //cancel_delayed_work(&di->twl6030_current_avg_work); + di->suspend_capacity = di->capacity; + /* We cannot tolarate a sleep longer than 30 seconds * while on ac charging we have to reset the BQ watchdog timer. */ @@ -3232,12 +3252,13 @@ static int twl6030_bci_battery_suspend(struct device *dev) static int twl6030_bci_battery_resume(struct device *dev) { -// struct platform_device *pdev = to_platform_device(dev); -// struct twl6030_bci_device_info *di = platform_get_drvdata(pdev); + struct platform_device *pdev = to_platform_device(dev); + struct twl6030_bci_device_info *di = platform_get_drvdata(pdev); long int events; u8 rd_reg = 0; int ret; + di->resume_status =1; ret = twl6030battery_temp_setup(true); if (ret) { pr_err("%s: Temp measurement setup failed (%d)!\n", @@ -3262,7 +3283,7 @@ static int twl6030_bci_battery_resume(struct device *dev) if (ret) goto err; - //queue_delayed_work(di->freezable_work, &di->twl6030_bci_monitor_work, 0); + queue_delayed_work(di->freezable_work, &di->twl6030_bci_monitor_work, 0); //queue_delayed_work(di->freezable_work, &di->twl6030_current_avg_work, 50); //queue_delayed_work(di->freezable_work, &di->work, di->interval); From ca57f3db93e745aa6933eff4e4e50c5c7e68dfe8 Mon Sep 17 00:00:00 2001 From: Zhaoyifeng Date: Fri, 20 Jul 2012 17:05:53 +0800 Subject: [PATCH 2/7] nand:add suspend and resume function. --- drivers/mtd/rknand/rknand_base.h | 2 ++ drivers/mtd/rknand/rknand_base_ko.c | 28 +++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/drivers/mtd/rknand/rknand_base.h b/drivers/mtd/rknand/rknand_base.h index e74761a8a323..b7fa95ab0b84 100755 --- a/drivers/mtd/rknand/rknand_base.h +++ b/drivers/mtd/rknand/rknand_base.h @@ -70,6 +70,8 @@ struct rknand_info { int emmc_clk_power_save_en; char *pdmaBuf; void (*nand_timing_config)(unsigned long AHBnKHz); + void (*rknand_suspend)(void); + void (*rknand_resume)(void); int reserved[20]; }; diff --git a/drivers/mtd/rknand/rknand_base_ko.c b/drivers/mtd/rknand/rknand_base_ko.c index 7043d2d68734..ea49e277ea8a 100755 --- a/drivers/mtd/rknand/rknand_base_ko.c +++ b/drivers/mtd/rknand/rknand_base_ko.c @@ -23,10 +23,11 @@ //#include "api_flash.h" #include "rknand_base.h" #include +#include #define DRIVER_NAME "rk29xxnand" -const char rknand_base_version[] = "rknand_base.c version: 4.34 20120401"; +const char rknand_base_version[] = "rknand_base.c version: 4.38 20120717"; #define NAND_DEBUG_LEVEL0 0 #define NAND_DEBUG_LEVEL1 1 #define NAND_DEBUG_LEVEL2 2 @@ -67,10 +68,23 @@ static char grknand_trac_buf[MAX_TRAC_BUFFER_SIZE]; static char *ptrac_buf = grknand_trac_buf; void trac_log(long lba,int len, int mod) { + unsigned long long t; + unsigned long nanosec_rem; + t = cpu_clock(UINT_MAX); + nanosec_rem = do_div(t, 1000000000); if(mod) - ptrac_buf += sprintf(ptrac_buf,"W %d %d \n",lba,len); + ptrac_buf += sprintf(ptrac_buf,"[%5lu.%06lu] W %d %d \n",(unsigned long) t, nanosec_rem / 1000,lba,len); else - ptrac_buf += sprintf(ptrac_buf,"R %d %d \n",lba,len); + ptrac_buf += sprintf(ptrac_buf,"[%5lu.%06lu] R %d %d \n",(unsigned long) t, nanosec_rem / 1000,lba,len); +} + +void trac_logs(char *s) +{ + unsigned long long t; + unsigned long nanosec_rem; + t = cpu_clock(UINT_MAX); + nanosec_rem = do_div(t, 1000000000); + ptrac_buf += sprintf(ptrac_buf,"[%5lu.%06lu] %s\n",(unsigned long) t, nanosec_rem / 1000,s); } static int rkNand_trac_read(char *page, char **start, off_t off, int count, int *eof, @@ -80,7 +94,7 @@ static int rkNand_trac_read(char *page, char **start, off_t off, int count, int int len; len = ptrac_buf - grknand_trac_buf - off; - printk("rkNand_trac_read: page=%x,off=%x,count=%x ,len=%x \n",(int)page,(int)off,count,len); + //printk("rkNand_trac_read: page=%x,off=%x,count=%x ,len=%x \n",(int)page,(int)off,count,len); if (len < 0) len = 0; @@ -321,7 +335,7 @@ static int rknand_nand_timing_cfg(void) if(gpNandInfo->nand_timing_config) { nandc_clk_rate = newclk; - gpNandInfo->nand_timing_config( nandc_clk_rate / 1000); // KHz + //gpNandInfo->nand_timing_config( nandc_clk_rate / 1000); // KHz } } return 0; @@ -493,12 +507,16 @@ static int rknand_probe(struct platform_device *pdev) static int rknand_suspend(struct platform_device *pdev, pm_message_t state) { gpNandInfo->rknand.rknand_schedule_enable = 0; + if(gpNandInfo->rknand_suspend) + gpNandInfo->rknand_suspend(); NAND_DEBUG(NAND_DEBUG_LEVEL0,"rknand_suspend: \n"); return 0; } static int rknand_resume(struct platform_device *pdev) { + if(gpNandInfo->rknand_resume) + gpNandInfo->rknand_resume(); gpNandInfo->rknand.rknand_schedule_enable = 1; NAND_DEBUG(NAND_DEBUG_LEVEL0,"rknand_resume: \n"); return 0; From 72c0f25381cd23994915d98dba3872cdf4b986c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E7=A7=80=E6=9D=B0?= Date: Fri, 20 Jul 2012 21:12:20 +0800 Subject: [PATCH 3/7] codec: update rt3261.c and rt5623.c. --- sound/soc/codecs/rt3261.c | 15 ++-- sound/soc/codecs/rt5623.c | 158 ++++++++++++++++++++++++++++++++++---- 2 files changed, 154 insertions(+), 19 deletions(-) diff --git a/sound/soc/codecs/rt3261.c b/sound/soc/codecs/rt3261.c index 716287475ad1..a172c67c1f68 100644 --- a/sound/soc/codecs/rt3261.c +++ b/sound/soc/codecs/rt3261.c @@ -80,8 +80,10 @@ static struct rt3261_init_reg init_list[] = { {RT3261_PRIV_DATA , 0x6115}, {RT3261_PRIV_INDEX , 0x0023},//PR23 = 0804'h {RT3261_PRIV_DATA , 0x0804}, - {RT3261_SPK_VOL , 0x8b8b},//SPKMIX -> SPKVOL - {RT3261_HP_VOL , 0x8888}, + {RT3261_SPK_VOL , 0x8b8b},//SPKMIX -> SPKVOL + {RT3261_HP_VOL , 0x8888}, + {RT3261_OUTPUT , 0x8888},//unmute OUTVOLL/R + }; #define RT3261_INIT_REG_LEN ARRAY_SIZE(init_list) @@ -216,7 +218,6 @@ static int do_hw_write(struct snd_soc_codec *codec, unsigned int reg, static int rt3261_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value) { - struct rt3261_priv *rt3261 = snd_soc_codec_get_drvdata(codec); u8 data[3]; data[0] = reg; @@ -1080,6 +1081,8 @@ static const struct snd_kcontrol_new rt3261_spk_r_mix[] = { static const struct snd_kcontrol_new rt3261_out_l_mix[] = { SOC_DAPM_SINGLE("SPK MIXL Switch", RT3261_OUT_L3_MIXER, RT3261_M_SM_L_OM_L_SFT, 1, 1), + SOC_DAPM_SINGLE("BST3 Switch", RT3261_OUT_L3_MIXER, + RT3261_M_BST2_OM_L_SFT, 1, 1), SOC_DAPM_SINGLE("BST1 Switch", RT3261_OUT_L3_MIXER, RT3261_M_BST1_OM_L_SFT, 1, 1), SOC_DAPM_SINGLE("INL Switch", RT3261_OUT_L3_MIXER, @@ -1097,6 +1100,8 @@ static const struct snd_kcontrol_new rt3261_out_l_mix[] = { static const struct snd_kcontrol_new rt3261_out_r_mix[] = { SOC_DAPM_SINGLE("SPK MIXR Switch", RT3261_OUT_R3_MIXER, RT3261_M_SM_L_OM_R_SFT, 1, 1), + SOC_DAPM_SINGLE("BST3 Switch", RT3261_OUT_R3_MIXER, + RT3261_M_BST2_OM_R_SFT, 1, 1), SOC_DAPM_SINGLE("BST2 Switch", RT3261_OUT_R3_MIXER, RT3261_M_BST4_OM_R_SFT, 1, 1), SOC_DAPM_SINGLE("BST1 Switch", RT3261_OUT_R3_MIXER, @@ -2198,7 +2203,7 @@ static const struct snd_soc_dapm_route rt3261_dapm_routes[] = { {"SPK MIXR", "DAC R2 Switch", "DAC R2"}, {"SPK MIXR", "OUT MIXR Switch", "OUT MIXR"}, - {"OUT MIXL", "SPK MIXL Switch", "SPK MIXL"}, + {"OUT MIXL", "BST3 Switch", "BST3"}, {"OUT MIXL", "BST1 Switch", "BST1"}, {"OUT MIXL", "INL Switch", "INL VOL"}, {"OUT MIXL", "REC MIXL Switch", "RECMIXL"}, @@ -2206,7 +2211,7 @@ static const struct snd_soc_dapm_route rt3261_dapm_routes[] = { {"OUT MIXL", "DAC L2 Switch", "DAC L2"}, {"OUT MIXL", "DAC L1 Switch", "DAC L1"}, - {"OUT MIXR", "SPK MIXR Switch", "SPK MIXR"}, + {"OUT MIXR", "BST3 Switch", "BST3"}, {"OUT MIXR", "BST2 Switch", "BST2"}, {"OUT MIXR", "BST1 Switch", "BST1"}, {"OUT MIXR", "INR Switch", "INR VOL"}, diff --git a/sound/soc/codecs/rt5623.c b/sound/soc/codecs/rt5623.c index e9c017ccc914..602ad39870e4 100644 --- a/sound/soc/codecs/rt5623.c +++ b/sound/soc/codecs/rt5623.c @@ -27,13 +27,19 @@ #include "rt5623.h" +#define RT5623_PROC +#ifdef RT5623_PROC +#include +#include +#include +#endif + static struct i2c_client *i2c_client; static int codec_write(struct i2c_client *client, unsigned int reg, unsigned int value) { u8 data[3]; - int ret; data[0] = reg; data[1] = (value >> 8) & 0xff; @@ -59,12 +65,14 @@ static unsigned int codec_read(struct i2c_client *client, xfer[0].flags = 0; xfer[0].len = 1; xfer[0].buf = ® + xfer[0].scl_rate = 100 * 1000; /* Read data */ xfer[1].addr = client->addr; xfer[1].flags = I2C_M_RD; xfer[1].len = 2; xfer[1].buf = (u8 *)&data; + xfer[1].scl_rate = 100 * 1000; ret = i2c_transfer(client->adapter, xfer, 2); if (ret != 2) { @@ -82,19 +90,22 @@ struct rt5623_reg { }; static struct rt5623_reg init_data[] = { - {RT5623_PWR_MANAG_ADD3 , 0x8000}, - {RT5623_PWR_MANAG_ADD2 , 0x2000}, - {RT5623_LINE_IN_VOL , 0xe808}, - {RT5623_STEREO_DAC_VOL , 0x6808}, - {RT5623_OUTPUT_MIXER_CTRL , 0x1400}, - {RT5623_ADC_REC_GAIN , 0xf58b}, - {RT5623_ADC_REC_MIXER , 0x6f6f}, - {RT5623_AUDIO_INTERFACE , 0x8000}, + {RT5623_PWR_MANAG_ADD3 , 0x8000}, + {RT5623_PWR_MANAG_ADD2 , 0x2000}, + {RT5623_LINE_IN_VOL , 0xe808}, + {RT5623_STEREO_DAC_VOL , 0x6808}, + {RT5623_OUTPUT_MIXER_CTRL , 0x1400}, + {RT5623_ADC_REC_GAIN , 0xf58b}, + {RT5623_ADC_REC_MIXER , 0x6f6f}, + {RT5623_AUDIO_INTERFACE , 0x8083}, {RT5623_STEREO_AD_DA_CLK_CTRL , 0x0a2d}, - {RT5623_PWR_MANAG_ADD1 , 0x8000}, - {RT5623_PWR_MANAG_ADD2 , 0x27f3}, - {RT5623_PWR_MANAG_ADD3 , 0x9c00}, - {RT5623_SPK_OUT_VOL , 0x0000}, + {RT5623_PWR_MANAG_ADD1 , 0x8000}, + {RT5623_PWR_MANAG_ADD2 , 0xb7f3}, + {RT5623_PWR_MANAG_ADD3 , 0x90c0}, + {RT5623_SPK_OUT_VOL , 0x0000}, + {RT5623_PLL_CTRL , 0x481f}, + {RT5623_GLOBAL_CLK_CTRL_REG , 0x8000}, + {RT5623_STEREO_AD_DA_CLK_CTRL , 0x3a2d}, }; #define RT5623_INIT_REG_NUM ARRAY_SIZE(init_data) @@ -139,11 +150,17 @@ static const struct i2c_device_id rt5623_i2c_id[] = { }; MODULE_DEVICE_TABLE(i2c, rt5623_i2c_id); +static int rt5623_proc_init(void); + static int __devinit rt5623_i2c_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { pr_info("%s(%d)\n", __func__, __LINE__); + #ifdef RT5623_PROC + rt5623_proc_init(); + #endif + i2c_client = i2c; rt5623_reset(i2c); @@ -171,7 +188,7 @@ static int __init rt5623_modinit(void) { return i2c_add_driver(&rt5623_i2c_driver); } -module_init(rt5623_modinit); +late_initcall(rt5623_modinit); static void __exit rt5623_modexit(void) { @@ -182,3 +199,116 @@ module_exit(rt5623_modexit); MODULE_DESCRIPTION("ASoC RT5623 driver"); MODULE_AUTHOR("Johnny Hsu "); MODULE_LICENSE("GPL"); + + +#ifdef RT5623_PROC + +static ssize_t rt5623_proc_write(struct file *file, const char __user *buffer, + unsigned long len, void *data) +{ + char *cookie_pot; + char *p; + int reg; + int value; + + cookie_pot = (char *)vmalloc( len ); + if (!cookie_pot) + { + return -ENOMEM; + } + else + { + if (copy_from_user( cookie_pot, buffer, len )) + return -EFAULT; + } + + switch(cookie_pot[0]) + { + case 'r': + case 'R': + printk("Read reg debug\n"); + if(cookie_pot[1] ==':') + { + strsep(&cookie_pot,":"); + while((p=strsep(&cookie_pot,","))) + { + reg = simple_strtol(p,NULL,16); + value = codec_read(i2c_client,reg); + printk("codec_read:0x%04x = 0x%04x\n",reg,value); + } + printk("\n"); + } + else + { + printk("Error Read reg debug.\n"); + printk("For example: echo r:22,23,24,25>rt5623_ts\n"); + } + break; + case 'w': + case 'W': + printk("Write reg debug\n"); + if(cookie_pot[1] ==':') + { + strsep(&cookie_pot,":"); + while((p=strsep(&cookie_pot,"="))) + { + reg = simple_strtol(p,NULL,16); + p=strsep(&cookie_pot,","); + value = simple_strtol(p,NULL,16); + codec_write(i2c_client,reg,value); + printk("codec_write:0x%04x = 0x%04x\n",reg,value); + } + printk("\n"); + } + else + { + printk("Error Write reg debug.\n"); + printk("For example: w:22=0,23=0,24=0,25=0>rt5623_ts\n"); + } + break; + case 'a': + printk("Dump reg \n"); + + for(reg = 0; reg < 0x6e; reg+=2) + { + value = codec_read(i2c_client,reg); + printk("codec_read:0x%04x = 0x%04x\n",reg,value); + } + + break; + default: + printk("Help for rt5623_ts .\n-->The Cmd list: \n"); + printk("-->'d&&D' Open or Off the debug\n"); + printk("-->'r&&R' Read reg debug,Example: echo 'r:22,23,24,25'>rt5623_ts\n"); + printk("-->'w&&W' Write reg debug,Example: echo 'w:22=0,23=0,24=0,25=0'>rt5623_ts\n"); + break; + } + + return len; +} + +static const struct file_operations rt5623_proc_fops = { + .owner = THIS_MODULE, +}; + +static int rt5623_proc_init(void) +{ + struct proc_dir_entry *rt5623_proc_entry; + rt5623_proc_entry = create_proc_entry("driver/rt5623_ts", 0777, NULL); + if(rt5623_proc_entry != NULL) + { + rt5623_proc_entry->write_proc = rt5623_proc_write; + return 0; + } + else + { + printk("create proc error !\n"); + return -1; + } +} +#endif + + + + + From dd6104654141aff3aa5870344cf9238c8fd13220 Mon Sep 17 00:00:00 2001 From: yxj Date: Mon, 23 Jul 2012 16:09:57 +0800 Subject: [PATCH 4/7] rkfb: hdmi and screen share the same buffer in three buffer mode --- drivers/video/rockchip/rk_fb.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index ecd893dbdd7e..05afa24c92b7 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -227,7 +227,9 @@ static int rk_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) par2->y_offset = par->y_offset; //memcpy(info2->screen_base+par2->y_offset,info->screen_base+par->y_offset, // var->xres*var->yres*var->bits_per_pixel>>3); + #if !defined(CONFIG_THREE_FB_BUFFER) fb_copy_by_ipp(info2,info,par->y_offset); + #endif dev_drv1->pan_display(dev_drv1,layer_id); //queue_delayed_work(inf->workqueue, &inf->delay_work,0); } @@ -754,6 +756,7 @@ static int rk_request_fb_buffer(struct fb_info *fbi,int fb_id) struct resource *res; struct resource *mem; int ret = 0; + struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev); switch(fb_id) { case 0: @@ -782,6 +785,7 @@ static int rk_request_fb_buffer(struct fb_info *fbi,int fb_id) #endif break; case 2: + #if !defined(CONFIG_THREE_FB_BUFFER) res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "fb2 buf"); if (res == NULL) { @@ -793,6 +797,11 @@ static int rk_request_fb_buffer(struct fb_info *fbi,int fb_id) mem = request_mem_region(res->start, resource_size(res), g_fb_pdev->name); fbi->screen_base = ioremap(res->start, fbi->fix.smem_len); memset(fbi->screen_base, 0, fbi->fix.smem_len); + #else //three buffer no need to copy + fbi->fix.smem_start = fb_inf->fb[0]->fix.smem_start; + fbi->fix.smem_len = fb_inf->fb[0]->fix.smem_len; + fbi->screen_base = fb_inf->fb[0]->screen_base; + #endif printk("fb%d:phy:%lx>>vir:%p>>len:0x%x\n",fb_id, fbi->fix.smem_start,fbi->screen_base,fbi->fix.smem_len); break; From 1110b791232d64e83f269d20dfff0ce36f6bf809 Mon Sep 17 00:00:00 2001 From: yangkai Date: Mon, 23 Jul 2012 17:39:01 +0800 Subject: [PATCH 5/7] fix pcd connect and disconnect bug --- drivers/usb/dwc_otg/dwc_otg_driver.c | 14 +++++++++----- drivers/usb/dwc_otg/dwc_otg_hcd.c | 1 + drivers/usb/dwc_otg/dwc_otg_pcd.c | 2 +- drivers/usb/dwc_otg/dwc_otg_pcd_intr.c | 4 +--- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/usb/dwc_otg/dwc_otg_driver.c b/drivers/usb/dwc_otg/dwc_otg_driver.c index 34af78a3a4dd..5efdecdd4705 100755 --- a/drivers/usb/dwc_otg/dwc_otg_driver.c +++ b/drivers/usb/dwc_otg/dwc_otg_driver.c @@ -1498,6 +1498,9 @@ static __devinit int dwc_otg_driver_probe(struct platform_device *pdev) dwc_otg_device->core_if->usb_mode = USB_MODE_FORCE_HOST; #else dwc_otg_device->core_if->usb_mode = USB_MODE_NORMAL; +#ifdef CONFIG_DWC_OTG_DEFAULT_DEVICE + dwc_otg_device->core_if->usb_mode = USB_MODE_FORCE_DEVICE; +#endif #endif #endif @@ -2044,16 +2047,17 @@ static __devinit int host20_driver_probe(struct platform_device *pdev) */ #ifdef CONFIG_ARCH_RK29 unsigned int * otg_phy_con1 = (unsigned int*)(USB_GRF_CON); -#endif -#ifdef CONFIG_ARCH_RK30 - unsigned int * otg_phy_con1 = (unsigned int*)(USBGRF_UOC1_CON2); -#endif - otgreg = * otg_phy_con1; otgreg |= (0x01<<13); // software control otgreg |= (0x01<<14); // exit suspend. otgreg &= ~(0x01<<13); // software control *otg_phy_con1 = otgreg; +#endif +#ifdef CONFIG_ARCH_RK30 + unsigned int * otg_phy_con1 = (unsigned int*)(USBGRF_UOC1_CON2); + *otg_phy_con1 = ((0x01<<2)<<16); // exit suspend. +#endif + #if 0 *otg_phy_con1 |= (0x01<<2); *otg_phy_con1 |= (0x01<<3); // exit suspend. diff --git a/drivers/usb/dwc_otg/dwc_otg_hcd.c b/drivers/usb/dwc_otg/dwc_otg_hcd.c index e85ada78ead6..bef6e0db01d9 100755 --- a/drivers/usb/dwc_otg/dwc_otg_hcd.c +++ b/drivers/usb/dwc_otg/dwc_otg_hcd.c @@ -1267,6 +1267,7 @@ int __devinit host20_hcd_init(struct device *dev) } #ifdef CONFIG_ARCH_RK30 + dwc_otg_hcd->host_setenable = 1; dwc_otg_hcd->connect_detect_timer.function = dwc_otg_hcd_connect_detect; dwc_otg_hcd->connect_detect_timer.data = (unsigned long)(dwc_otg_hcd); init_timer( &dwc_otg_hcd->connect_detect_timer); diff --git a/drivers/usb/dwc_otg/dwc_otg_pcd.c b/drivers/usb/dwc_otg/dwc_otg_pcd.c index c89715f0e4dc..35b8a9e08d67 100755 --- a/drivers/usb/dwc_otg/dwc_otg_pcd.c +++ b/drivers/usb/dwc_otg/dwc_otg_pcd.c @@ -1845,7 +1845,7 @@ static void dwc_otg_pcd_check_vbus_timer( unsigned long pdata ) dwc_otg_msc_unlock(_pcd); } /* every 500 ms open usb phy power and start 1 jiffies timer to get vbus */ - if( _pcd->phy_suspend == 0 ) + else if( _pcd->phy_suspend == 0 ) /* no vbus detect here , close usb phy */ dwc_otg20phy_suspend( 0 ); } diff --git a/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c b/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c index 991ff028339f..e514b558a7d7 100755 --- a/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c +++ b/drivers/usb/dwc_otg/dwc_otg_pcd_intr.c @@ -1053,10 +1053,8 @@ static inline void do_gadget_setup( dwc_otg_pcd_t *_pcd, { SPIN_UNLOCK(&_pcd->lock); ret = _pcd->driver->setup(&_pcd->gadget, _ctrl); - if(spin_is_locked(&_pcd->lock)){ + if(spin_is_locked(&_pcd->lock)) DWC_PRINT("%s warning: pcd->lock locked without unlock\n", __func__); - SPIN_UNLOCK(&_pcd->lock); - } SPIN_LOCK(&_pcd->lock); if (ret < 0) { From df6862b91e9313765e14e04b2ec77955bdd3b31c Mon Sep 17 00:00:00 2001 From: yangkai Date: Mon, 23 Jul 2012 18:07:50 +0800 Subject: [PATCH 6/7] usb transfer speed up --- drivers/usb/gadget/storage_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index 68d6fddeb6eb..e881ba4450c7 100755 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c @@ -270,7 +270,7 @@ static struct fsg_lun *fsg_lun_from_dev(struct device *dev) #define FSG_NUM_BUFFERS 2 /* Default size of buffer length. */ -#define FSG_BUFLEN ((u32)65536) +#define FSG_BUFLEN ((u32)16384) /* Maximal number of LUNs supported in mass storage function */ #define FSG_MAX_LUNS 8 From 71d45b2e979a8844eddfe796afdb542ece7262ed Mon Sep 17 00:00:00 2001 From: yxj Date: Tue, 24 Jul 2012 11:38:40 +0800 Subject: [PATCH 7/7] rkfb: fix bug in commit 7d80392f6c0338239b7d1e9b7c80a2343e23f118 rkfb and lcdc driver use different macro to distinguish data format rkfb use macro defined by android,lcdc use marco to better match the lcdc register --- drivers/video/rockchip/rk_fb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 05afa24c92b7..5ed678bf8c5e 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -456,7 +456,7 @@ static int rk_fb_set_par(struct fb_info *info) cblen = crlen = (xvir*yvir); break; default: - printk("un supported format:0x%x\n",data_format); + printk("%s:un supported format:0x%x\n",__func__,data_format); return -EINVAL; } #else @@ -498,7 +498,7 @@ static int rk_fb_set_par(struct fb_info *info) par2->yact = par->yact; par2->format = par->format; info2->var.nonstd &= 0xffffff00; - info2->var.nonstd |= par->format; + info2->var.nonstd |= data_format; dev_drv1->set_par(dev_drv1,layer_id); } }