linux/drivers/nfc/pn544.c
<<
>>
Prefs
   1/*
   2 * Driver for the PN544 NFC chip.
   3 *
   4 * Copyright (C) Nokia Corporation
   5 *
   6 * Author: Jari Vanhala <ext-jari.vanhala@nokia.com>
   7 * Contact: Matti Aaltonen <matti.j.aaltonen@nokia.com>
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License
  11 * version 2 as published by the Free Software Foundation.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21 */
  22
  23#include <linux/completion.h>
  24#include <linux/crc-ccitt.h>
  25#include <linux/delay.h>
  26#include <linux/interrupt.h>
  27#include <linux/kernel.h>
  28#include <linux/miscdevice.h>
  29#include <linux/module.h>
  30#include <linux/mutex.h>
  31#include <linux/nfc/pn544.h>
  32#include <linux/poll.h>
  33#include <linux/regulator/consumer.h>
  34#include <linux/serial_core.h> /* for TCGETS */
  35#include <linux/slab.h>
  36
  37#define DRIVER_CARD     "PN544 NFC"
  38#define DRIVER_DESC     "NFC driver for PN544"
  39
  40static struct i2c_device_id pn544_id_table[] = {
  41        { PN544_DRIVER_NAME, 0 },
  42        { }
  43};
  44MODULE_DEVICE_TABLE(i2c, pn544_id_table);
  45
  46#define HCI_MODE        0
  47#define FW_MODE         1
  48
  49enum pn544_state {
  50        PN544_ST_COLD,
  51        PN544_ST_FW_READY,
  52        PN544_ST_READY,
  53};
  54
  55enum pn544_irq {
  56  52        PN54PNNADY,
        PN5INTADY,
};

pn54nfoirq" class="sref">pn54nfoirq {
     /a struct      /a struct icliommeid" class="sref">icliomm 51i2c__id};
     /a struct 
     /a>enum pn544_state         };
        };
     /a>enum pn544_irq };
     /a struct Sx/serizhave"h_44_ accessETS */
     /a struct Sx/serizha4nfo /a struaccessETS */
                };

stator/ct char/a> &quVdh_IO544"};
stator/ct char/a> &quVBat544"};
stator/ct char/a> &quVSim544"};

sysfs ux/infaceETS */
stat   pn5tesmeid" class="sref">pn5tesmBLE,
                       /a struct  {
     /a struct pn54nfoirq" class="sref">pn54nfoirq(     /a struct icliommeid" class="sref">icliomm 51i2c__id};
     /a struct pn5rs/_pegu pn5rs/_pegu 
 t="retu   (&qu%d\n544", );

statsttuct pn5end_table" class="sref">pn5end_taBLEpn54nfoirq" class="sref">pn54nfoirq,
 {
     /a struct pn5rs/_pegu pn5rs/_pegu      /a struct icliommeid" class="sref">icliomm 51i2c__id};

     sttuct 
             if /a>(      52 t="retu   
                PN54PNNADY};
     if /a>(      52 a>(};

     if /a>( {
      52 a>(PN544_ST_FW_READY};
      52 a>(&qunowted FW-u"+c\n544"};
     } else/a> {
      52 a>(PN544_ST_READY};
&qunowted HCI-u"+c\n544"};
     />);
  13<>);
        };

     t="retu0a>};
  17);

  19statvoiduct pn5disd_table" class="sref">pn5disd_taBLEpn54nfoirq" class="sref">pn54nfoirq,
pn5rs/_pegu pn5rs/_pegu      /a struct icliommeid" class="sref">icliomm 51i2c__id};
PN544_ST_COLD};
&quNowted OFF-u"+c\n544"};
PN5RESETVEN_TI_NAME" class="sref">PN5RESETVEN_TI_Nate<)a>};
);
PN54PNNADY};
     sf /a>(PN544_DRIVER_NAME" class="sref">PN544_DRIVER_NAME<> {
&qu: CRC; conterr packet ltone#37;u (%d)\n544", (&qucr=: 544", ,  {
PN544_DRIVER_NAME" class="sref">PN544_DRIVER_NAME< a  &qu: CRC erior 0x%x/!=u0x%x/0x%x\n544" {
};
      52 a>((&qucr=: 544",       52                16, 2/a>,       52 t="retu->,      />);
     t="retu0a>};
);

statsttuct pn5f">it, wr_id" class="sref">pn5f">it, wrBLEicliommeid" class="sref">icliomm 51,  sttuct 
     sf /a>(      52 a>(&qu%s: Illegal message ltogth: %d\n544" {
                     gt       52 t="retu->,      />);

     sf /a>(      52 t="retu->, };
        };

        imaste"lxrne_id" class="sref">imaste"lxrneBLE(        &quxrne: %d\n544"
     if /a>(Retry,NFC c was ux /a>ndbyETS */
      52 a>(};
      52 a>(imaste"lxrne_id" class="sref">imaste"lxrneBLE(      52 a>(&quxrne2: %d\n544" />);
     sf /a>(      52 t="retu->, };
     t="retuct );

statsttuct pn5f">iux"h_id" class="sref">pn5f">iux"hBLEicliommeid" class="sref">icliomm 51,  {
 sttuct               ; 
 * Yc shouux"h a packet ux one go,> * bthen you'd needite ux"hBLe
max sizh >nd uxst w shoube 0xff fill, so we do split ux"hails.
 */
        imaste"lrec__id" class="sref">imaste"lrec_BLE(        &qurec_1: %d\n544"
     sf /a>(      52 t="retu->, 
PN5LLC_f">HOVERHEACOLD" class="sref">PN5LLC_f">HOVERHEACate<)a>,
             a>(PN5LLC_f">HOVERHEACOLD" class="sref">PN5LLC_f">HOVERHEACate};
PN5MSG_MAX_SIZNONE" class="sref+codeMSG_MAX_SIZNate< - 1))>};
PN5MSG_MAX_SIZNONE" class="sref+codeMSG_MAX_SIZNate< - 1a>};
lid+(data+crc16)t"> */
, imaste"lrec__id" class="sref">imaste"lrec_BLE(&qurec_2: %d\n544"
, };

pn5fwit, wr_id" class="sref">pn5fwit, wrBLEicliommeid" class="sref">icliomm 51,      ittuct &qu%s\n544"PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate
PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate(, 
imaste"lxrne_id" class="sref">imaste"lxrneBLE(&qufw xrne: %d\n544"     sf /a>(Retry,NFC c was ux /a>ndbyETS */
};
imaste"lxrne_id" class="sref">imaste"lxrneBLE(&qufw xrne2: %d\n544", pn5fwiux"h_id" class="sref">pn5fwiux"hBLEicliommeid" class="sref">icliomm 51,  {
     ittuct 
     sf /a>(PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate<)a>,
             t="retu->, 
        imaste"lrec__id" class="sref">imaste"lrec_BLE(PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate<)a>};
        &quFW rec_1: %d\n544"
      52 t="retuct 
     sf /a>(PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate<)a>,
      52 t="retu->, };
             if /a>(just hx"her, no additional dataETS */
      52 t="retuct 
     if /a>(PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate<)a>,
      52 t="retu->, 
        imaste"lrec__id" class="sref">imaste"lrec_BLE(PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate<,t>,         &qufw rec_2: %d\n544"};
     if /a>(             t="retu->, 
     t="retuct PN5FW_HEACER_SIZNONE" class="sref+codeFW_HEACER_SIZNate};
);
};
    39 {
   pn54nfoirq" class="sref">pn54nfoirq};
     /a struct icliommeid" class="sref">icliomm 51i2c__id};

                  i2c__iq<-com> 
        &IRQ+c\n544"};
};
        };
        };
};
        };
);
     t="retuct );

stenumd< statsttuct pn54nfoirq" class="sref">pn54nfoirq,
 {
   enumd< statsttuct 
        };
  };
};


PN54P;t"are
 */
statct pwiux"hBLE};
pn54nfoirq" class="sref">pn54nfoirq};
pn54nfoirq" class="sref">pn54nfoire<,t>, icliommeid" class="sref">icliomm 51i2c__id};
             a>(<_m_id< statsttuct   };
&qu%sre4n_2: p, rouio_2: zu;s\n544"             a>(PST_COLE4_atd))/a> {
};
 na3e2="L3228  31<>};
     {
      52(};
};
};
            na> {
PST_FW_READY4_atd))/a> {
      52 a>(
      52};
      52pn5fwiux"hBLE=uct i2c__ie<,t>,            /*ct };
      52};
);
      52(      52        i2c__iq<-com> &quFW ad failerne: %d\n544"      52
      52&quFW adne:n544"      52, };
      52             if /a>(      52      52   goto            52   }   els)/a> {
      5>        
      52};
           /*ct pref"wiux"hBLE=uct i2c__ie<,t>,       52};
                };

      52(      52i2c__iq<-com> &W ad failer (: %);d\n544"      52            .27#L49" 3d18"L49" class="line" na3e18"L38239 51      52&W adne:n544"      52, };
      52             if /a>(      52      52   goto            52   }na3e2="L35213 51            .28c#L8" 3d19="L8" class="line" na3e19"L3926  48
        };
   > t="retuct 
stunsigner atsttuct ppoll"h_id" class="sref">ppollbgBLE
};
   pn54nfoirq" class="sref">pn54nfoirq};
      5>                                  pn54nfoirq" class="sref">pn54nfoire<,t>,    icliommeid" class="sref">icliomm 51i2c__id};
};
&qu%sre4n_2: p;s\n544"PST_COLE4_atd))/a> {
           4.2c#L20" 4d2="L20" class="line" na4e2="L4224" 36

           4.20#L17" 4d2="L27" class="line" na4e2="L42785 5                4.2c#L12" 4d2="L32" class="line" na4e2="L4326  22
statct pn54nfoirq" class="sref">pn54nfoirq};
pn54nfoirq" class="sref">pn54nfoire<,t>, icliommeid" class="sref">icliomm 51i2c__id};
     ittuct &qu%sre4n_2: p, rouio2: zu;s\n544"
PST_COLE4_atd))/a> {
};



 */
PST_FW_READY4_atd))/a> {
      52 a>(
      52(      52                      52      52);
      52      52(      52      5>    na3e2="L35213 51           4.26#L49" 4d26"L49" class="line" na4e26"L4625  39
      52&FW wri4_ne:n544"              52, 
           < statsttuct       52
      52( */
      52
      52i2c__ie<,t>,    }   els)/a> {
             if /a>(      52                   goto            52
      52      52(      52      52};
      52&wri4_ne:n544"                          16, 2e<,t>, 
      52( */
      52};
      5>        i2c__ie<,t>,            5.20#L10" 5d2""L10" class="line" na5e2""L5028  5             
   > t="retuct 

stlong/=uct proctlbgBLE
 {
   pn54nfoirq" class="sref">pn54nfoirq};
pn54nfoirq" class="sref">pn54nfoire<,t>,    icliommeid" class="sref">icliomm 51i2c__id};
pver_platform_l dafoirq" class="srof">pver_platform_l damm 51};
&qu%sre4n_2: p, rmd: 0x: x;s\n544"PST_COLE4_atd))/a> {
      52           5.2c#L24" 5d2="L24" class="line" na5e2="L5228  54
i2c__i1<-com> PGET_FW_MODEidat:8
&qu%s ref">PGET_FW_MODE;s\n544"PST_FW_READY4_atd<)a>};
                   goto                 5.2c#L35" 5d2="L35" class="line" na5e2="L5325  45
PSET_FW_MODEidat:8
&qu%s ref">PSET_FW_MODE;s\n544"
      52           5.2c#L35" 5d2="L45" class="line" na5e2="L5425  45
PST_FW_READY4_atd/a> {
pdisasd_table" class="scof">pdisasd_rs/1++coiirq" clas2ccodnfoirq" class="sre4nfoird<)a>};
penasd_table" class="scof">penasd_rs/1++coiirq" clas2ccodnfoirq" class="sre4nfoirsp/    PST_READY4_atd/a> {
      52pdisasd_table" class="scof">pdisasd_rs/1++coiirq" clas2ccodnfoirq" class="sre4nfoird<)a>};
      5>      52penasd_table" class="scof">penasd_rs/1++coiirq" clas2ccodnfoirq" class="sre4nfoirsp/          52     if /a>(      52           goto                 }na3e2="L35213 51           5.2c#L52" 5d26"L52" class="line" na5e26"L5617  52      52};
           breake};

   case==uct &qu%s TCGETS;s\n544"};
      5>   /*ct       52};

   default:8
      52&Unknown roctl 0x: x;s\n544"           < statsttuct       52};
   }na3e2="L35213 51           5.27c#L6" 5d27="L6" class="line" na5e27"L5723  36
        
   > t="retuct 
statsttuct popoliddeq" class="scof">popolbgBLE};
 {
   pn54nfoirq" class="sref">pn54nfoirq};
      52pn54nfoirq" class="sref">pn54nfoire<,t>,    icliommeid" class="sref">icliomm 51i2c__id};

        &qu%sre4n_2: p, reclio2: p;s\n544"           /*ct i2c__id<)a>};

        
      ; 

 */
PST_COLE4_atd))/a> {
      52           goto         }na3e2="L35213 51           6.3##L22" 6d19"L53" class="line" na6e203L6024  13<>);
        };
        penasd_table" class="scof">penasd_rs/1++coiirq" clas2ccodnfoirq" class="sre4nfoirsp/    
           > t="retuct            6.2c#L11" 6d2""L11" class="line" na6e2"1L6127  31<>};
pclos_table" class="scof">pclos_bgBLE};
pn54nfoirq" class="sref">pn54nfoirq};
pn54nfoirq" class="sref">pn54nfoire<,t>, icliommeid" class="sref">icliomm 51i2c__id};
&qu%sre4n_2: p, reclio2: p;s\n544"};
i2c__id<)a>};

   ruct pdisasd_table" class="scof">pdisasd_rs/1++coiirq" clas2ccodnfoirq" class="sre4nfoird<)a>};
};
           6.20#L17" 6d2="L27" class="line" na6e2="L62277 5)a>};
onstable" class="sfid_popor/a>ons45 51ruct pfopstable" class="scof">pfopsmm 51 {
p  ux_meid" class="srof">p  uxufate1<>};
pwri4_state" class="s href=wri4_bgBLe1<>};
   .     ppoll"h_id" class="srof">ppollbgBLe1<>};
popoliddeq" class="scof">popolbgBLe1<>};
pclos_table" class="scof">pclos_bgBLe1<>};
};
<="+co44_state" class="sco44_bgBLe((       /==uc    href="dri6ers/nfc/pn545.2c#L31" 5d6="L416 class>pclos_bgBLE {
(      6    562c#L35" 5d2="Lef="drivers/nfc/pn545.27#L49" 5d18"L49" class="line" na5e18"L5825  39
&qu%sre4n_2: p, reclio2: p;s\n544"};***\n
(&qu%sre4n_2: p, reclio2: p;s\n544"};    6  52        p="+codnfoirq" class="sre4nfoirq<-com> pdisasd_rs/1++coiirq" cf="+codnfoirq" class="sre4nfoirq<-com>    r         6             goto      <6 href65class="line" na6e204L60413 51      52 {
PST_ass="line" na6e2""L60270 51      52     if /a>(      52};6drivers/nfc/pn545.27#L49" 5d18"L49" claref="drivers/nfc/PERM="+copy_f  if //PERM=r_o       6  52     if /a>(   6  52           goto      <6 href6"+out_meid" cl>PSET_FW_MODEidat:8
           }n63e2="L35213 51      6    562c#L52" 5d26"L52" clasc/pn545.19c#L6" 5d19="L6" class="line" na5e19"L59246 52};
   6href="dri6ers/nfc/pn545.2c#L18" 5d66"L486 class="line" na5e26"L56238 51   6  5>   /*6t PSET_FW_MODEidat:8
      52};

pdisasd_rs/1++coiirq" cf="+co"+codnfoirq" class="sre4nfoirq<-com> 
};
           5.26c#L6"67class="line" na5e2="L54246 51   6href="dri6ers/nfc/pn545.27#L47" 5d6""L176 class>pclos_bgBLE {
        pn54nfoirq  };

           5.27#L52" 5628"L568class="line" na6e2="L6127  58stathref="dri6ers/nfc/pn545.28#L53" 5d68"L5368cof">pdisasd_rs/1++coiirq" ccliommeid" class="srecliomm 51<-com> &qu%sre4n_2: p, reclio2: p;s\n544"};

   6sttuct popoliddeq" 6lass=68i1, pn54nfoi6q" cl68 penasd_tablef="+codnfoirq" class="sre4nfoirq<-com>    r  52icliomme6d" cl6ss="sref">iclioPST_ass="line" na6e2""L60270 51     ittuct <6 href="+coiirq" class="s6er_i168 class="sref">PSET_FW_MODEidat:8
    href="dri6ers/nfc/pn545.19#L50" 5d69"L5068="sre__func__ate/=uct /pn545.19c#L6" 5d19="L6" class="line" na5e19"L59246 52   6  ; PSET_FW_MODEidat:8
    n class="6ommentttttttttXXX: maybe6usec 69_table" class="scof"> class="line" na5e27"L57245 51   6 ittuct <6ommenttttttttt"> */
   if /a>(<6 href="+codnfoirq" class6"sre46foirq<-com> >PSET_FW_MODEidat:8
   7  52   7       go7o                 6.37#L22"70class="line" na5e19"L59213 51   7href="dri7ers/nfc/pn546.c0#L14" 6d70"L1470utex_unlockbgBLE};

   7    }#" cif="line" na6e2="L6228  54
           6.2c#L11" 672""L171class="line" na6e2="L6224  51   7href="dri7ers/nfc/pn546.2c#L12" 6d7="L127 class class=t pclos_table"7class71cof">pdisasd_rs/1++coiirq" c__ATTRn545.28#L51" 5d19ATTRa href="drivers/nfc/24 _tesclass="sre2c__id24 _tescq   7//a struc7 pn54nfoi7q" cl7ss="sr>pclos_bgBLE   7  52                      7   pn54nfoirq" cla"sfid_popor/a>ons45 51ruct <2="L20"icf_ic/pn546.22#L12" 2="L20"icf_icicliomme7d" cl7ss="srs="line" na6e2""L60270 51   7href="dri7ers/nfc/pn546.2c#L18" 6d7="L1871s="sref">icliomm 51   7  52
&qu%sre4n_2: p, reclio2: p;s\n544"};
};
};
pdisasd_table" 7lass=7scof">pdisasd_rs/1++coiirq" ccliommeid" class="srecliomm 51<-com> &qu%sre4n_2: p, reclio2: p;s\n544"};IRQivers/ndrd<)a>};
&quirqrq" class="scontrq class="line" na5e26"L56277 5)a>};
   7href="dri7ers/nfc/pn546.2c#L25" 6d7="L2572<-com> };
penasd_tablebufirq" class="scontass=r_obrs/1++coiirq" clakzallocrq" class="sconkzallocq};
           6.20#L17" 672="L2726class="sref"penasd_tablebufirq" class="scontass=r_oass="line" na6e2""L60270 51   7href="dri7ers/nfc/pn546.2c#L18" 6d7="L2872_table" class="scof">drivers/nfc/pn5cliommeid" class="srecliomm 51<-com> &Unknown roctl 0x: x;s\n54="line" na6e2""L60270 51   7h   };
,    7     };
};
  penasd_tablebufirq" class="scontass=r_o
   7     &Unknown roctl 0x: x;s\n54="line" na6e2""L60270 51   7ine" na5e7="L51270 51    7 52pdisasd_r p;s\n544"};Cannot allocpfe memory for ird};
};
      , pdisasd_rs/1++coiirq" cet_meid" class="s  ux"offsetidate};
ss="sre2i2isupplyACOLD" class="srupply=r_obrs/1++coiirq" cla"dg_vds="snfc/pn546.2c#L1"dg_vds="sclass="line" na5e2="L52246 51   7h    ss="sre2i2isupplyACOLD" class="srupply=r_obrs/1++coiirq" cla"dg_vbafc/pn546.50#L14" 6g_vbafclass="line" na5e2="L52246 51   7h    ss="sre2i2isupplyACOLD" class="srupply=r_obrs/1++coiirq" cla"dg_vsimc/pn546.50#L14" 6g_vsimclass="line" na5e2="L52246 51   7h    penasd_table" class="scof">penasd_rs/1++coiirq" claregulator=bulklgetc/pn546.50#L14" 6gulator=bulklget1<-com> &qu%sre4n_2: p, reclio2:s="string">&quARRAY_SIZEers/nfc/pn545.2ARRAY_SIZEq   7  52(pdisasd_rLE};
(   7  5>     7             breake};7,    7  52        i2c__id<)a>};
PST_CLE4_atd))/a> {
pdisasd_rs/1++coiirq" cet_meid" class="s  ux"offsetidate};
 {
};
      };
penasd_tablebuit_waitqueue_hnfc/pn546.22#L12" buit_waitqueue_hnfc1<-com> };
&qu%sre4n_2: p, recli     penasd_tablepers/nfc/pn545.20#L1626" clasass="line" na6e2""L60270 51   7  52     if /a>(&Unknown roctl 0x: x;s\n54_r p;s\n544"};No 6ef="dri 26" rd<)a>};
};
           goto      <7 href76i1,       7    572c#L52" 5d26"L52" clasref="drivers/nfc/pn5m 5="dgrq" class="sconm 5="dg);
};
   7  52penasd_tablepers/nfc/pn545.20#L1626" clastidate};
   7ase==uct 7a href="+TCGETS_meid" cl7ss="s76 struct &Unknown roctl 0x: x;s\n54_r p;s\n544"};"dquest"resource/() missot;rd<)a>};
};
ref="drivers/nfc/pn5m 5="dgrq" class="sconm 5="dg);
};
   7href="dri7ers/nfc/pn545.27#L51" 5d77"L5177dbgBLEpenasd_rs/1++coiirq" clasers/nfc/pn545.20#L1626" clastidate};

penasdass="line" na6e2""L60270 51   7  52pdisasd_ef="+cof &Unknown roctl 0x: x;s\n54_r p;s\n544"};Cannot get 6ef="dri resource/rd<)a>};
};
);
           5.27c#L6"77class="line" na5e2="L54246 51   7href="dri7ers/nfc/pn545.27#L47" 5d7""L1777"svalmm 5)))/gt penasd_rs/1++coiirq" clarequest"th"drieivirqrq" class="scon"dquest"th"drieivirqclasef="drivers/nfc/_id" class="sre2c__id  &quirqrq" class="scontrq cla href="+code=i2c_NULLlass="sre2c__idNULLq   7ref="+out7meid" class="soutidat:8<7a>
pdisasd__ef="+cof    7r 5>     7f="+mutex_unlockc__id" c7ass="77s="srer_i1
   7 t="retuc7 , &Unknown roctl 0x: x;s\n54_r p;s\n544"};U   };
};
           5.27#L52" 5728"L578c#L52" 5d26"L52" clasref="drivers/nfc/pn5m 5="d/nfc/pn546.2c#L1m 5="d/);
popoliddeq" 7lass=78class="line" na6e204L60413 51   7 href="dr7vers/nfc/pn545.28#L55" 5728"L578<-com> pn54nfoi7q" cl78s_6  51  };
   7 ref="dri7aaaaaaaaaaaaaaaaaaaaaaaa7aaa};
&Unknoicf_c"drte_ dafoirq" class="srknoicf_c"drte_ daf1<-com> &Unknown roctl 0x: x;s\n54_m> };
icliomme7d" cl78_table" class="scof">penasdass="line" na6e2""L60270 51   7 ittuct <7 href="+coiirq" class="s7er_i178s="srer_i1  &Unknown roctl 0x: x;s\n54="line" na6e2""L60270 51   7 ref="dri7ers/nfc/pn545.19#L50" 5d79"L5078="sre__func__ate/=uct    pfops fadafd, m 5orvers/ndrd<)a>};
penasdas="line" na5e26"L56277 5)a>};
p2" clasref="drivers/nfc/pn5m 5=irqrq" class="sconm 5=irq);
);
   7href="dri7ers/nfc/pn545.28#L55" 5d79"L55791      pmino"};
&UnMISC_DYNAMIC_MINORn545.28#L51" 5dMISC_DYNAMIC_MINORpenasd_tablebufirq" class="scontass=r_o
 {
&Unknown roctl 0x: x;s\n5s="line" na6e2="L6228  54
 */
};
&Un2="L_"dgistern546.20#L16" 6d2="L_"dgister1<-com> };
};
   8  52&Unknown roctl 0x: x;s\n54of p;s\n544"};D0"icf "dgist>pfops fadafdrd<)a>};
};
           6.38#L22"80d19"L53" class="line" na6e203L6024  13<>);
   8    &qu%sre4n_2: p, reclio2: p;s\n544"};
   8 5  
 8 9  }drivers/nfc/pn5m 5=sysfsrq" class="sconm 5=sysfss\n5s="line" na6e208L60198 51   835213 51<8a>           6.2c#L11" 682""L1810irq<-com> };
   83      go8ers/nfc/pn546.2c#L12" 6d8="L1281c#L52" 5d26"L52" clascs="string">&Unknoicf_remove_ dafoirq" class="srknoicf_remove_ daf1<-com> &Unknown roctl 0x: x;s\n54_m> };
pclos_table"8class81cof">drivers/nfc/pn5m 5=irqrq" class="sconm 5=irq   83ref="dri8vers/nfc/pn546.c0#L14" 682="L181utex_unlockbgBLE  &quirqrq" class="scontrq cla href="+code=i2c_et_meid" class="s  ux"offsess="line" na6e2="L6228  54
pn54nfoi8q" cl8ss="srdrivers/nfc/pn5m 5="d/nfc/pn546.2c#L1m 5="d/   835                        8     };
   83ref="dri8 icliomme8d" cl81"sreisc_dbgBLE};
   83   }drivers/nfc/pn5m 5=kmallocrq" class="sconm 5=kmallocclass="line" na6e208L60198 51   8href="dri8ers/nfc/pn546.2c#L21" 6d8="L2182dbgBLE   8       8ha3e2="L38f="+cof">pdisasd_table" 8lass=8scof">pdisasd_rs/1++coiirq" ckfreerq" class="sconkfreeclasef="drivers/nfc/bufirq" class="scontass=r_oas="line" na5e2="L52246 51   8 ref="dri8f="+mutex_unlockc__id" c8ass="82classdrivers/nfc/pn5m 5=ict _allocrq" class="sconm 5=uct _allocclass="line" na6e208L60198 51   8h/a struc8ers/nfc/pn546.2c#L25" 6d8="L2582<-com> 
);
           6.20#L17" 682="L282class="line" na6e207L60785 5        8h      8u 52pn54nfoirq  , &qu%sre4n_2: p, recli     pdisasd_rs/1++coiirq" ccliommeid" class="srecliomm 51<-com> &qu%sre4n_2: p, reclio2: p;s\n544"};
};
};
   8     };
};
  };
   8     &Unknown roctl 0x: x;s\n54_m> };
   8swri4_bgB8      };
PST_C!LE4_atd))/a> {
   8  52};
   8href="dri8ers/nfc/pn545.2c#L31" 5d8="L4184_table" class="scof">p2" clasref="+co44_statsers/nfc/pn545.20#L1626" clastidate};
pdisasd_ef="+cof };
 {
);
penasd_tablefree=irqrq" class="sconfree=irqclasef="drivers/nfc/_id" class="sre2c__id  &quirqrq" class="scontrq cla href="+code=i2c_et_meid" class="s  ux"offsess="line" na6e2="L6228  54
(};
   8hne" na5e852(drivers/nfc/pn5sers/nfc/pn545.20#L1626" clastidate};
 8h 52penasd_tables6gulator=bulklfreerq" class="scon"dgulator=bulklfreeclasef="drivers/nfc/ARRAY_SIZEers/nfc/pn545.2ARRAY_SIZEq   8     
 {
);
     if /a>(   8 ne" na5e8aaaaa        8  5>     852 {
   8  52     if /a>( {
      8    582c#L52#" cif="line" na6e2="L6228  54
   8  52   8  5>     8t    8  52};
   8href="dri8ers/nfc/pn545.27#L51" 5d87"L5187dbgBLE
pdisasd_rs/1++coiirq" cprL20bueid" class="srecprL20bueclasef="drivers/nfc/DRIVER_DESCid" class="srecDRIVER_DESC#L16"r p;s\n544"};ivers/nre__func__atd<)a>};
};
   8  52};
};
&UncocladdL2e2="Lfc/pn546.2c5L14cocladdL2e2="L1<-com> };
           5.28c#L6"87s_6  51  penasdass="line" na6e2""L60270 51   8href="dri8ers/nfc/pn545.27#L47" 5d8""L1787"sreisc_dbgBLE};iv6e2""L "dgist>pfops fadafdrd<)a>};
};
26" claers/nfc/pn545.c0#L14" 5d20"L14" class="line" na5e204L5028  54
     8f="+mutex_unlockc__id" c8ass="87 class="sref"s="line" na6e203L6024  13<>);
   8 t="retuc8 , 
           5.27#L52" 5828"L588c#L52s="line" na6e203L6024  13<>);
   8sttuct popoliddeq" 8lass=88class class=void};
   8 href="dr8vers/nfc/pn545.28#L55" 5828"L588<-coms="line" na6e2""L60270 51   8//a struc8 pn54nfoi8q" cl88 penasd_table2="L20lL2e2="Lfc/pn546.2c5L14cocl20lL2e2="L1<-com> };
};, Exicot;.rd<)a>};
};
icliomme8d" cl88_tabls="line" na6e203L6024  13<>);
     8 href="+coiirq" class="s8er_i188ers/nfc/pn545.28#L54" 5d1_2 8 ref="dri8ers/nfc/pn545.19#L50" 5d89"L5088d}drivers/nfc/pn5module=iniclass="sre2c__id odule=inicclasef="drivers/nfc/ href=iniclass="sre2c__id href=inicclasss="line" na5e26"L56277 5)a>};
};
drivers/nfc/pn5MODULE_LICENSEers/nfc/pn545.2MODULE_LICENSEclasef p;s\n544"};GPL<)a>};
};
};
The original LXR software by the "line" nahttp://sourceforge.net/projects/lxrn>LXR ers/unicy cla hthis experi/nfcal 6"L5ops by "line" namadato:lxr@45.ux.no">lxr@45.ux.no cla.
lxr.45.ux.no kindly hosted by "line" nahttp://www.redpill-45.pro.no">Redpill L5.pro AS cla hprovid"L of L5.ux ernsulcot; and operpfopss seroicfs since 1995.