From: 黄涛 <huangtao@rock-chips.com> Date: Fri, 1 Feb 2013 09:37:55 +0000 (+0800) Subject: rk: ddr_freq: version 2.1 X-Git-Tag: firefly_0821_release~7648 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=55fb7315afda554b947c5ec20ecff6094e6b2b9d;p=firefly-linux-kernel-4.4.55.git rk: ddr_freq: version 2.1 fix this bug: BUG: scheduling while atomic: ddrfreqd/65/0x00000002 [<c043e504>] (unwind_backtrace+0x0/0xf8) from [<c08fe368>] (__schedule+0x7ec/0x8a8) [<c08fe368>] (__schedule+0x7ec/0x8a8) from [<c08ff620>] (__mutex_lock_slowpath+0x128/0x1bc) [<c08ff620>] (__mutex_lock_slowpath+0x128/0x1bc) from [<c08ff720>] (mutex_lock+0x6c/0x70) [<c08ff720>] (mutex_lock+0x6c/0x70) from [<c045328c>] (ddr_scale_rate_for_dvfs+0x30/0x16c) [<c045328c>] (ddr_scale_rate_for_dvfs+0x30/0x16c) from [<c044da6c>] (dvfs_target+0x12c/0x1a0) [<c044da6c>] (dvfs_target+0x12c/0x1a0) from [<c0453b10>] (dvfs_set_rate+0x48/0x68) [<c0453b10>] (dvfs_set_rate+0x48/0x68) from [<c0453504>] (ddrfreq_mode+0x70/0xc4) [<c0453504>] (ddrfreq_mode+0x70/0xc4) from [<c04536c8>] (ddrfreq_task+0x38/0x160) [<c04536c8>] (ddrfreq_task+0x38/0x160) from [<c048a704>] (kthread+0x80/0x88) [<c048a704>] (kthread+0x80/0x88) from [<c04399c8>] (kernel_thread_exit+0x0/0x8) --- diff --git a/arch/arm/plat-rk/ddr_freq.c b/arch/arm/plat-rk/ddr_freq.c index f46d8d412b62..8a2a3184b973 100644 --- a/arch/arm/plat-rk/ddr_freq.c +++ b/arch/arm/plat-rk/ddr_freq.c @@ -165,7 +165,8 @@ static void _ddr_change_freq(uint32_t nMHz) { u32 timeout = MAX_TIMEOUT; unsigned int cpu; - unsigned int this_cpu = get_cpu(); + unsigned int this_cpu = smp_processor_id(); + cpu_maps_update_begin(); set_other_cpus_pause(false); @@ -187,7 +188,6 @@ static void _ddr_change_freq(uint32_t nMHz) out: cpu_maps_update_done(); - put_cpu(); } #else static void _ddr_change_freq(uint32_t nMHz) @@ -416,7 +416,7 @@ static int ddrfreq_late_init(void) kthread_bind(ddr.task, 0); wake_up_process(ddr.task); - pr_info("verion 2.0\n"); + pr_info("verion 2.1\n"); dprintk(DEBUG_DDR, "normal %luMHz video %luMHz idle %luMHz suspend %luMHz\n", ddr.normal_rate / MHZ, ddr.video_rate / MHZ, ddr.idle_rate / MHZ, ddr.suspend_rate / MHZ);