Index: firmware/kernel.c =================================================================== --- firmware/kernel.c (revision 31209) +++ firmware/kernel.c (working copy) @@ -1214,7 +1214,7 @@ corelock_unlock(&s->cl); restore_irq(oldlevel); -#if defined(HAVE_PRIORITY_SCHEDULING) && defined(irq_enabled_checkval) +#if 0 //defined(HAVE_PRIORITY_SCHEDULING) && defined(irq_enabled_checkval) /* No thread switch if IRQ disabled - it's probably called via ISR. * switch_thread would as well enable them anyway. */ if((result & THREAD_SWITCH) && irq_enabled_checkval(oldlevel)) Index: firmware/target/arm/crt0.S =================================================================== --- firmware/target/arm/crt0.S (revision 31209) +++ firmware/target/arm/crt0.S (working copy) @@ -100,17 +100,17 @@ strhi r4, [r2], #4 bhi 1b - /* Set up stack for IRQ mode */ + /* Set up stack for IRQ mode */ msr cpsr_c, #0xd2 ldr sp, =irq_stack - - /* Set up stack for FIQ mode */ +#if 0 + /* Set up stack for FIQ mode */ msr cpsr_c, #0xd1 ldr sp, =fiq_stack - +#endif /* Let svc, abort and undefined modes use irq stack */ msr cpsr_c, #0xd3 - ldr sp, =irq_stack + ldr sp, =svc_stack msr cpsr_c, #0xd7 ldr sp, =irq_stack msr cpsr_c, #0xdb @@ -159,7 +159,7 @@ b UIE data_abort_handler: - sub r0, lr, #8 + sub r0, lr, #8 mov r1, #2 b UIE @@ -169,5 +169,5 @@ /* 256 words of FIQ stack */ .space 256*4 -fiq_stack: +svc_stack: end: Index: firmware/target/arm/as3525/ascodec-as3525.c =================================================================== --- firmware/target/arm/as3525/ascodec-as3525.c (revision 31209) +++ firmware/target/arm/as3525/ascodec-as3525.c (working copy) @@ -161,7 +161,7 @@ while (i2c_busy()); /* disable clock - already in IRQ context */ - CGU_PERI &= ~CGU_I2C_AUDIO_MASTER_CLOCK_ENABLE; + bitclr32(&CGU_PERI, CGU_I2C_AUDIO_MASTER_CLOCK_ENABLE); req->status = 1; @@ -339,7 +339,10 @@ static void ascodec_wait(struct ascodec_request *req) { - if (irq_enabled()) { + unsigned long value; + asm volatile ("mrs %0, cpsr\n" : "=r"(value)); + + if ((value & 0x1f) == 0x1f && irq_enabled()) { semaphore_wait(&req->complete, TIMEOUT_BLOCK); return; } Index: firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c =================================================================== --- firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c (revision 31209) +++ firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c (working copy) @@ -78,10 +78,17 @@ unsigned int btn = BUTTON_NONE; - if (old_wheel_value == wheel_tbl[0][wheel_value]) + if (hold_button) + { + } + else if (old_wheel_value == wheel_tbl[0][wheel_value]) + { btn = BUTTON_SCROLL_FWD; + } else if (old_wheel_value == wheel_tbl[1][wheel_value]) + { btn = BUTTON_SCROLL_BACK; + } if (btn == BUTTON_NONE) { @@ -225,8 +232,10 @@ int delay = 30; while(delay--) nop; + int oldlevel = disable_irq_save(); + bool ccu_io_bit12 = CCU_IO & (1<<12); - bitclr32(&CCU_IO, 1<<12); + CCU_IO &= ~(1<<12); /* B1 is shared with FM i2c */ bool gpiob_pin0_dir = GPIOB_DIR & (1<<1); @@ -256,8 +265,10 @@ GPIOB_DIR |= 1<<1; if(ccu_io_bit12) - bitset32(&CCU_IO, 1<<12); + CCU_IO |= (1<<12); + restore_irq(oldlevel); + #ifdef HAS_BUTTON_HOLD #ifndef BOOTLOADER /* light handling */ @@ -265,12 +276,6 @@ { hold_button = hold; backlight_hold_changed(hold); - /* mask scrollwheel irq so we don't need to check for - * the hold button in the isr */ - if (hold) - GPIOA_IE &= ~SCROLLWHEEL_BITS; - else - GPIOA_IE |= SCROLLWHEEL_BITS; } #else hold_button = hold;