2011-07-01 04:38:18     SPI read/write within interrupt !!

Document created by Aaronwu Employee on Aug 27, 2013
Version 1Show Document
  • View in full screen mode

2011-07-01 04:38:18     SPI read/write within interrupt !!

Ganesh krish (INDIA)

Message: 101974   

 

Hi,

 

     I need to call SPI_read & SPI_write inside ISR . At present apart from ISR , when i invoke SPI_write (spi_sync) it was working properly ,But when i use spi_async it was not working it crashes .....

 

In spi.h::

 

static inline int

spi_write_dwas(struct spi_device *spi, const u8 *buf, size_t len)

{

    int retn;

    struct spi_transfer    t = {

            .tx_buf        = buf,

            .len        = len,

        };

    struct spi_message    m;

    spi_message_init(&m);

    spi_message_add_tail(&t, &m);      

    //return spi_sync_dwas(spi, &m);

    retn = spi_async(spi, &m);

    printk("\nReturn value on write :%d\n",retn);

    return retn;  

}

 

In max driver ::

 

int max7301_spi_write(unsigned int reg,

                unsigned int val)

{

    int ret;

    struct spi_device *spi = to_spi_device(spi_iodev->dev);

    printk("\nInside max7301 spi_write:%x\n",spi);

    spi_lock_bus(spi);

    u16 word = ((reg & 0x7F) << 8) | (val & 0xFF);

//    ret = spi_write(spi, (const u8 *)&word, sizeof(word));

    ret = spi_write_dwas(spi, (const u8 *)&word, sizeof(word));

//    printk("\nSpi write length :%d\n",ret);

    spi_unlock_bus(spi);

    return ret;

 

}

 

 

 

crash msg :::

 

bfin-spi bfin-spi.0: transfer: unsupported bits_per_word

bfin-spi bfin-spi.0: transfer: unsupported bits_per_word

rtc-bfin rtc-bfin: rtc core: registered rtc-bfin as rtc0

bfin-spi bfin-spi.0: transfer: unsupported bits_per_word

Undefined instruction

<5> - May be used to emulate instructions that are not defined for

<5>   a particular processor implementation.

Kernel OOPS in progress

Deferred Exception context

CURRENT PROCESS:

COMM=swapper PID=1  CPU=0

invalid mm

return address: [0x00186d68]; contents of:

0x00186d40:  0000  0000  0000  0000  0000  0000  0000  0000

0x00186d50:  0000  0000  0000  0000  0000  0000  0000  0000

0x00186d60:  ceb0  0014  ffff  ffff [ecb0] 0018  74a0  0203

0x00186d70:  26c0  0204  6e38  0018  6cb0  0018  ecb8  0018

 

ADSP-BF537-0.3 500(MHz CCLK) 125(MHz SCLK) (mpu off)

Linux version 2.6.34.7-ADI-2010R1-svn9581 (ganesh@ubuntu) (gcc version 4.3.5 (ADI/svn-4960) ) #88 Fri Jul 1 13:41:54 IST 2011

 

SEQUENCER STATUS:               Not tainted

SEQSTAT: 00000021  IPEND: c008  IMASK: ffff  SYSCFG: 0006

  EXCAUSE   : 0x21

  physical IVG3 asserted : <0xffa007b0> { _trap + 0x0 }

  physical IVG14 asserted : <0xffa00af8> { _evt_evt14 + 0x0 }

  physical IVG15 asserted : <0xffa00fec> { _evt_system_call + 0x0 }

  logical irq   6 mapped  : <0xffa003ec> { _bfin_coretmr_interrupt + 0x0 }

  logical irq  24 mapped  : <0x000bee30> { _bfin_mac_interrupt + 0x0 }

  logical irq  75 mapped  : <0x000c5aa0> { _dwas_keypad_isr + 0x0 }

RETE: <0x00000000> /* Maybe null pointer? */

RETN: <0x0201bc64> /* kernel dynamic memory (maybe user-space) */

RETX: <0x00000480> /* Maybe fixed code section */

RETS: <0x000156d0> { _tasklet_action + 0x64 }

PC  : <0x00186d68> /* kernel dynamic memory (maybe user-space) */

DCPLB_FAULT_ADDR: <0x0201bc60> /* kernel dynamic memory (maybe user-space) */

ICPLB_FAULT_ADDR: <0x00186d68> /* kernel dynamic memory (maybe user-space) */

PROCESSOR STATE:

R0 : 00004000    R1 : 0000bfff    R2 : 00000000    R3 : 0078ce7b

R4 : 00000000    R5 : ffffffc0    R6 : 0000003f    R7 : 00000000

P0 : 00000000    P1 : 020618a8    P2 : 00186d68    P3 : 0017ecc0

P4 : 00186ac0    P5 : 00187ce4    FP : 0017ecc0    SP : 0201bb88

LB0: 000b60ee    LT0: 000b60ee    LC0: 00000000

LB1: 000949d4    LT1: 000949c8    LC1: 00000000

B0 : 00000000    L0 : 00000000    M0 : 00000000    I0 : 00000000

B1 : 00000000    L1 : 00000000    M1 : 00000000    I1 : ffffff8e

B2 : 00000000    L2 : 00000000    M2 : 00000000    I2 : 00053440

B3 : 00000000    L3 : 00000000    M3 : 00000000    I3 : 00000000

A0.w: 00001088   A0.x: 00000000   A1.w: 00000088   A1.x: 00000000

USP : 00000000  ASTAT: 00002000

 

Hardware Trace:

   0 Target : <0x00003efc> { _trap_c + 0x0 }

     Source : <0xffa00744> { _exception_to_level5 + 0xa4 } CALL pcrel

   1 Target : <0xffa006a0> { _exception_to_level5 + 0x0 }

     Source : <0xffa00554> { _bfin_return_from_exception + 0x18 } RTX

   2 Target : <0xffa0053c> { _bfin_return_from_exception + 0x0 }

     Source : <0xffa005f8> { _ex_trap_c + 0x74 } JUMP.S

   3 Target : <0xffa00584> { _ex_trap_c + 0x0 }

     Source : <0xffa0080a> { _trap + 0x5a } JUMP (P4)

   4 Target : <0xffa007b0> { _trap + 0x0 }

      FAULT : <0x00186d68> /* kernel dynamic memory (maybe user-space) */ 0xecb00018

     Source : <0x000b6190> { _bfin_spi_giveback + 0x80 } JUMP (P2)

   5 Target : <0x000b6162> { _bfin_spi_giveback + 0x52 }

     Source : <0x000b619a> { _bfin_spi_giveback + 0x8a } JUMP.S

   6 Target : <0x000b619a> { _bfin_spi_giveback + 0x8a }

     Source : <0x000b60f6> { _bfin_spi_cs_deactive + 0x52 } RTS

   7 Target : <0x000b60ee> { _bfin_spi_cs_deactive + 0x4a }

     Source : <0xffa00cf8> { __common_int_entry + 0xcc } RTI

   8 Target : <0xffa00c96> { __common_int_entry + 0x6a }

     Source : <0xffa00ae0> { _return_from_int + 0x58 } RTS

   9 Target : <0xffa00ae0> { _return_from_int + 0x58 }

     Source : <0xffa00ab6> { _return_from_int + 0x2e } IF !CC JUMP pcrel

  10 Target : <0xffa00a88> { _return_from_int + 0x0 }

     Source : <0xffa00c92> { __common_int_entry + 0x66 } JUMP.L

  11 Target : <0xffa00c90> { __common_int_entry + 0x64 }

     Source : <0xffa0038e> { _asm_do_IRQ + 0x6a } RTS

  12 Target : <0xffa00386> { _asm_do_IRQ + 0x62 }

     Source : <0x00015c98> { _irq_exit + 0x30 } RTS

  13 Target : <0x00015c98> { _irq_exit + 0x30 }

     Source : <0x00015c86> { _irq_exit + 0x1e } IF !CC JUMP pcrel

  14 Target : <0x00015c68> { _irq_exit + 0x0 }

     Source : <0xffa00382> { _asm_do_IRQ + 0x5e } JUMP.L

  15 Target : <0xffa00382> { _asm_do_IRQ + 0x5e }

     Source : <0xffa0037c> { _asm_do_IRQ + 0x58 } IF !CC JUMP pcrel (BP)

Kernel Stack

Stack info:

SP: [0x0201bcbc] <0x0201bcbc> /* kernel dynamic memory (maybe user-space) */

FP: (0x0201bf74)

Memory from 0x0201bcb0 to 0201c000

0201bcb0: 0018e318  025116b8  0017e8e4 [00000006] 00000000  00044b83  10624dd3  0201bcfc

0201bcd0: ffa01dda  00000000  ffa00c90  00187ca8  00000000  0000003f  0000003f  0201bd30

0201bcf0: 0201a008  00011f9e  00008050  00000026  00000000  00000000  00000000  00011f9e

0201bd10: 00012072  00000006  00003004  000949d4  ffa016f8  000949c8  ffa016f6  00000000

0201bd30: 00000000  00000000  00000000  00000000  00000000  00000000  00000000  00000000

0201bd50: 00000000  00000000  00000000  00000000  00000000  00000000  00000000  00000000

0201bd70: 00000000  00000000  00000000  0015a798  00186ac0  00000000  00187ca8  00187ca8

0201bd90: 025116b8  0017e8e4  00186ac0  00187c4c  000012f3  00000000  0000003f  00044b83

0201bdb0: 10624dd3  000012f4  0000003f  0000ffff  0000ffff  0000ffff  000012f3  00000006

0201bdd0: 02015420  023fe6e0  00074d78  0201be60  0201bdec  00000036  0000ffff  0014ceb0

0201bdf0: fffedcc6  00000000  00008124  00000001  0201be0c  00049102  02511600  0000011b

0201be10: 00074ef2  023fe620  025116b8  00186d68  00004000  0014ceb0  ffffffea  0011a038

0201be30: 02511600  00000000  00186d68  00000000  0014ceb0  fffedcc6  00000000  02015420

0201be50: 00125888  02511600  000c61bc  00000000  0014ceb0  020426c0  025116b8  023ffb40

0201be70: 00000000  00119b14  0251c820  00186d60  00188a74  00186d68  00000000  00000000

0201be90: 0201be94  023fe6e0  00000000  00000001  000acd4e <000ace34> 00186d68  001836a8

0201beb0: 0018ffbc  00186d9c  0201bf0c  0018ffbc  001456a4  0201216c  00000000  0007a2b6

0201bed0: 000acf78  00186d68  0018ffbc  0018ffbc  00186d9c  00000000  0201beec  023fe6e0

0201bef0:<000ac814> 000acf14  0018ed60  00000000  00000000  0251c820  00090e82  020055d8

0201bf10: 020374d0  000acd0a  001b0924  00000000  00000000  00000000  000ac212  0201bf4c

0201bf30: 000ac24c  000acf14  000ac26a  000bf042  0018fd88  00000000  001456a4  0014ceb0

0201bf50: 001a8fdc  000ad1ac  001b0924  0017500c  0018ffbc  00000000  00000000  00000000

0201bf70: 0017500c (00000000)<00001028> 001b0924  0017500c  00170000  00000000  00000000

0201bf90: 00000000  00180000  00033ef0  00189878  001b0728  00000000  00196130  001b0924

0201bfb0: 001b0968  00000000  00000000  00000000  00000000  001b0728  001b0728  00000000

0201bfd0: 001961a4  001b0728  001b0728  00000000  00000000  00000000 <000014ae> 00000000

0201bff0: 00000000  00000000  ffffffff  00000006

Return addresses in stack:

    address : <0x000ace34> { _really_probe + 0x64 }

    address : <0x000ac814> { _bus_for_each_dev + 0x44 }

   frame  1 : <0x00001028> { _do_one_initcall + 0x28 }

    address : <0x000014ae> { _kernel_thread_helper + 0x6 }

Modules linked in:

Kernel panic - not syncing: Kernel exception

Hardware Trace:

Stack info:

SP: [0x0201baac] <0x0201baac> /* kernel dynamic memory (maybe user-space) */

FP: (0x0201bf74)

Memory from 0x0201baa0 to 0201c000

0201baa0: 00000004  0201baac  00000013 [00147354] 00119fb6  0201bb88  00147354  0017a3ce

0201bac0: 0017a3ce  0017a3ce  0201badc  00004338  0201bb88  0000c008  0201bb88  0000003f

0201bae0: 0000003f <00031f76> 00011f9e  00030001  00000006  00033760  00189a5c  0201be0c

0201bb00: 0017ecc0  00000006  0201bcf4  ffffffc0  00000000  0017ecc0  00015b3a  00187714

0201bb20:<ffa003a0> 0018e318  00000006  00000001  00000000  00000000  ffa00c90  02029404

0201bb40: 0000ffc0  02029404 <0000aab2> 02029340  00187714  000b60ee  0000c050  00000026

0201bb60: 00000000  ffa00748  00177000  0000c008  00000021  ffffffc0  00000000  000949d4

0201bb80: 000b60ee  00000480  00000480  0000c008  00000021  00000000  0201bc64  00000480

0201bba0: 00186d68 <000156d0> 00004000  00002000  000949d4  000b60ee  000949c8  000b60ee

0201bbc0: 00000000  00000000  00000088  00000000  00001088  00000000  00000000  00000000

0201bbe0: 00000000  00000000  00000000  00000000  00000000  00000000  00000000  00000000

0201bc00: 00000000  00000000  00000000  00053440  ffffff8e  00000000  00000000  0017ecc0

0201bc20: 00187ce4  00186ac0  0017ecc0  00186d68  020618a8  00000000  00000000  0000003f

0201bc40: ffffffc0  00000000  0078ce7b  00000000  0000bfff  00004000  00004000  00000000

0201bc60: 00000006  0201bc64  0201bc64  0017ecc0 <00015c0e> 00000006  0017ece0  0201a000

0201bc80: 00000009  00000018  00000100  0000000a  0000cb62  00033760  00189a5c  025116b8

0201bca0: 0017e8e4  00000006  00187ca8  ffa00386  0018e318  025116b8  0017e8e4  00000006

0201bcc0: 00000000  00044b83  10624dd3  0201bcfc  ffa01dda  00000000  ffa00c90  00187ca8

0201bce0: 00000000  0000003f  0000003f  0201bd30  0201a008  00011f9e  00008050  00000026

0201bd00: 00000000  00000000  00000000  00011f9e  00012072  00000006  00003004  000949d4

0201bd20: ffa016f8  000949c8  ffa016f6  00000000  00000000  00000000  00000000  00000000

0201bd40: 00000000  00000000  00000000  00000000  00000000  00000000  00000000  00000000

0201bd60: 00000000  00000000  00000000  00000000  00000000  00000000  00000000  0015a798

0201bd80: 00186ac0  00000000  00187ca8  00187ca8  025116b8  0017e8e4  00186ac0  00187c4c

0201bda0: 000012f3  00000000  0000003f  00044b83  10624dd3  000012f4  0000003f  0000ffff

0201bdc0: 0000ffff  0000ffff  000012f3  00000006  02015420  023fe6e0  00074d78  0201be60

0201bde0: 0201bdec  00000036  0000ffff  0014ceb0  fffedcc6  00000000  00008124  00000001

0201be00: 0201be0c  00049102  02511600  0000011b  00074ef2  023fe620  025116b8  00186d68

0201be20: 00004000  0014ceb0  ffffffea  0011a038  02511600  00000000  00186d68  00000000

0201be40: 0014ceb0  fffedcc6  00000000  02015420  00125888  02511600  000c61bc  00000000

0201be60: 0014ceb0  020426c0  025116b8  023ffb40  00000000  00119b14  0251c820  00186d60

0201be80: 00188a74  00186d68  00000000  00000000  0201be94  023fe6e0  00000000  00000001

0201bea0: 000acd4e <000ace34> 00186d68  001836a8  0018ffbc  00186d9c  0201bf0c  0018ffbc

0201bec0: 001456a4  0201216c  00000000  0007a2b6  000acf78  00186d68  0018ffbc  0018ffbc

0201bee0: 00186d9c  00000000  0201beec  023fe6e0 <000ac814> 000acf14  0018ed60  00000000

0201bf00: 00000000  0251c820  00090e82  020055d8  020374d0  000acd0a  001b0924  00000000

0201bf20: 00000000  00000000  000ac212  0201bf4c  000ac24c  000acf14  000ac26a  000bf042

0201bf40: 0018fd88  00000000  001456a4  0014ceb0  001a8fdc  000ad1ac  001b0924  0017500c

0201bf60: 0018ffbc  00000000  00000000  00000000  0017500c (00000000)<00001028> 001b0924

0201bf80: 0017500c  00170000  00000000  00000000  00000000  00180000  00033ef0  00189878

0201bfa0: 001b0728  00000000  00196130  001b0924  001b0968  00000000  00000000  00000000

0201bfc0: 00000000  001b0728  001b0728  00000000  001961a4  001b0728  001b0728  00000000

0201bfe0: 00000000  00000000 <000014ae> 00000000  00000000  00000000  ffffffff  00000006

Return addresses in stack:

    address : <0x00031f76> { _handle_IRQ_event + 0x4a }

    address : <0xffa003a0> { _asm_do_IRQ + 0x7c }

    address : <0x0000aab2> { _activate_task + 0x3e }

    address : <0x000156d0> { _tasklet_action + 0x64 }

    address : <0x00015c0e> { ___do_softirq + 0x76 }

    address : <0x000ace34> { _really_probe + 0x64 }

    address : <0x000ac814> { _bus_for_each_dev + 0x44 }

   frame  1 : <0x00001028> { _do_one_initcall + 0x28 }

    address : <0x000014ae> { _kernel_thread_helper + 0x6 }

 

But htis was happening after returning from my driver probe , that is after all the SPI_write was completed (it returns "0" but not successful !!!)

 

Help me with this !!!!!!!!

QuoteReplyEditDelete

 

 

2011-07-01 10:21:23     Re: SPI read/write within interrupt !!

Mike Frysinger (UNITED STATES)

Message: 101981   

 

SPI transfers can sleep, so if you want to use them from an interrupt handler, you need to use a threaded one so that your interrupt handler can sleep as well

Attachments

    Outcomes