<html><head><title>/tools/findutils/</title></head>
<body>
<h2>/tools/findutils/</h2>
<ul>
<li><a href='/cgit/openwrt/upstream/plain/tools/?h=v17.01.2&amp;id=1a3ebd51adb6ef43e8da4ec8d9cc7555ec04d73a'>../</a></li>
  <li><a href='/cgit/openwrt/upstream/plain/tools/findutils/Makefile?h=v17.01.2&amp;id=1a3ebd51adb6ef43e8da4ec8d9cc7555ec04d73a'>Makefile</a></li>
 </ul>
</body></html>
rnate' title='Atom feed' href='http://openwrt.panaceas.org/cgit/openwrt/upstream/atom/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot' type='application/atom+xml'/>
<link rel='vcs-git' href='git://git.panaceas.org/openwrt/upstream' title='openwrt/upstream Git repository'/>
<link rel='vcs-git' href='ssh://git@git.panaceas.org/git/openwrt/upstream' title='openwrt/upstream Git repository'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/cgit/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/cgit/'>index</a> : <a title='openwrt/upstream' href='/cgit/openwrt/upstream/'>openwrt/upstream</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='eb396d656911024685f1f514036aec091669211f'/><select name='h' onchange='this.form.submit();'>
<option value='attitude_adjustment'>attitude_adjustment</option>
<option value='barrier_breaker'>barrier_breaker</option>
<option value='chaos_calmer'>chaos_calmer</option>
<option value='lede-17.01'>lede-17.01</option>
<option value='less-old-master'>less-old-master</option>
<option value='master'>master</option>
<option value='old-master'>old-master</option>
<option value='openwrt-18.06'>openwrt-18.06</option>
<option value='openwrt-19.07'>openwrt-19.07</option>
<option value='upstream'>upstream</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>upstream openwrt</td><td class='sub right'>James</td></tr></table>
<table class='tabs'><tr><td>
<a href='/cgit/openwrt/upstream/about/?h=reboot'>about</a><a href='/cgit/openwrt/upstream/?h=reboot'>summary</a><a href='/cgit/openwrt/upstream/refs/?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>refs</a><a href='/cgit/openwrt/upstream/log/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot'>log</a><a class='active' href='/cgit/openwrt/upstream/tree/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>tree</a><a href='/cgit/openwrt/upstream/commit/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>commit</a><a href='/cgit/openwrt/upstream/diff/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>diff</a><a href='/cgit/openwrt/upstream/stats/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot'>stats</a></td><td class='form'><form class='right' method='get' action='/cgit/openwrt/upstream/log/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch'>
<input type='hidden' name='h' value='reboot'/><input type='hidden' name='id' value='eb396d656911024685f1f514036aec091669211f'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit/openwrt/upstream/tree/?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>root</a>/<a href='/cgit/openwrt/upstream/tree/target?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>target</a>/<a href='/cgit/openwrt/upstream/tree/target/linux?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>linux</a>/<a href='/cgit/openwrt/upstream/tree/target/linux/sunxi?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>sunxi</a>/<a href='/cgit/openwrt/upstream/tree/target/linux/sunxi/patches-3.14?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>patches-3.14</a>/<a href='/cgit/openwrt/upstream/tree/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>284-ir-backports-from-3.15.patch</a></div><div class='content'>blob: 9e703e7dceeaa6d5e7e624b54fe98393114c6f62 (<a href='/cgit/openwrt/upstream/plain/target/linux/sunxi/patches-3.14/284-ir-backports-from-3.15.patch?h=reboot&amp;id=eb396d656911024685f1f514036aec091669211f'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
<a id='n113' href='#n113'>113</a>
<a id='n114' href='#n114'>114</a>
<a id='n115' href='#n115'>115</a>
<a id='n116' href='#n116'>116</a>
<a id='n117' href='#n117'>117</a>
<a id='n118' href='#n118'>118</a>
<a id='n119' href='#n119'>119</a>
<a id='n120' href='#n120'>120</a>
<a id='n121' href='#n121'>121</a>
<a id='n122' href='#n122'>122</a>
<a id='n123' href='#n123'>123</a>
<a id='n124' href='#n124'>124</a>
<a id='n125' href='#n125'>125</a>
<a id='n126' href='#n126'>126</a>
<a id='n127' href='#n127'>127</a>
<a id='n128' href='#n128'>128</a>
<a id='n129' href='#n129'>129</a>
<a id='n130' href='#n130'>130</a>
<a id='n131' href='#n131'>131</a>
<a id='n132' href='#n132'>132</a>
<a id='n133' href='#n133'>133</a>
<a id='n134' href='#n134'>134</a>
<a id='n135' href='#n135'>135</a>
<a id='n136' href='#n136'>136</a>
<a id='n137' href='#n137'>137</a>
<a id='n138' href='#n138'>138</a>
<a id='n139' href='#n139'>139</a>
<a id='n140' href='#n140'>140</a>
<a id='n141' href='#n141'>141</a>
<a id='n142' href='#n142'>142</a>
<a id='n143' href='#n143'>143</a>
<a id='n144' href='#n144'>144</a>
<a id='n145' href='#n145'>145</a>
<a id='n146' href='#n146'>146</a>
<a id='n147' href='#n147'>147</a>
<a id='n148' href='#n148'>148</a>
<a id='n149' href='#n149'>149</a>
<a id='n150' href='#n150'>150</a>
<a id='n151' href='#n151'>151</a>
<a id='n152' href='#n152'>152</a>
<a id='n153' href='#n153'>153</a>
<a id='n154' href='#n154'>154</a>
<a id='n155' href='#n155'>155</a>
<a id='n156' href='#n156'>156</a>
<a id='n157' href='#n157'>157</a>
<a id='n158' href='#n158'>158</a>
<a id='n159' href='#n159'>159</a>
<a id='n160' href='#n160'>160</a>
<a id='n161' href='#n161'>161</a>
<a id='n162' href='#n162'>162</a>
<a id='n163' href='#n163'>163</a>
<a id='n164' href='#n164'>164</a>
<a id='n165' href='#n165'>165</a>
<a id='n166' href='#n166'>166</a>
<a id='n167' href='#n167'>167</a>
<a id='n168' href='#n168'>168</a>
<a id='n169' href='#n169'>169</a>
<a id='n170' href='#n170'>170</a>
<a id='n171' href='#n171'>171</a>
<a id='n172' href='#n172'>172</a>
<a id='n173' href='#n173'>173</a>
<a id='n174' href='#n174'>174</a>
<a id='n175' href='#n175'>175</a>
<a id='n176' href='#n176'>176</a>
<a id='n177' href='#n177'>177</a>
<a id='n178' href='#n178'>178</a>
<a id='n179' href='#n179'>179</a>
<a id='n180' href='#n180'>180</a>
<a id='n181' href='#n181'>181</a>
<a id='n182' href='#n182'>182</a>
<a id='n183' href='#n183'>183</a>
<a id='n184' href='#n184'>184</a>
<a id='n185' href='#n185'>185</a>
<a id='n186' href='#n186'>186</a>
<a id='n187' href='#n187'>187</a>
<a id='n188' href='#n188'>188</a>
<a id='n189' href='#n189'>189</a>
<a id='n190' href='#n190'>190</a>
<a id='n191' href='#n191'>191</a>
<a id='n192' href='#n192'>192</a>
<a id='n193' href='#n193'>193</a>
<a id='n194' href='#n194'>194</a>
<a id='n195' href='#n195'>195</a>
<a id='n196' href='#n196'>196</a>
<a id='n197' href='#n197'>197</a>
<a id='n198' href='#n198'>198</a>
<a id='n199' href='#n199'>199</a>
<a id='n200' href='#n200'>200</a>
<a id='n201' href='#n201'>201</a>
<a id='n202' href='#n202'>202</a>
<a id='n203' href='#n203'>203</a>
<a id='n204' href='#n204'>204</a>
<a id='n205' href='#n205'>205</a>
<a id='n206' href='#n206'>206</a>
<a id='n207' href='#n207'>207</a>
<a id='n208' href='#n208'>208</a>
<a id='n209' href='#n209'>209</a>
<a id='n210' href='#n210'>210</a>
<a id='n211' href='#n211'>211</a>
<a id='n212' href='#n212'>212</a>
<a id='n213' href='#n213'>213</a>
<a id='n214' href='#n214'>214</a>
<a id='n215' href='#n215'>215</a>
<a id='n216' href='#n216'>216</a>
<a id='n217' href='#n217'>217</a>
<a id='n218' href='#n218'>218</a>
<a id='n219' href='#n219'>219</a>
<a id='n220' href='#n220'>220</a>
<a id='n221' href='#n221'>221</a>
<a id='n222' href='#n222'>222</a>
<a id='n223' href='#n223'>223</a>
<a id='n224' href='#n224'>224</a>
<a id='n225' href='#n225'>225</a>
<a id='n226' href='#n226'>226</a>
<a id='n227' href='#n227'>227</a>
<a id='n228' href='#n228'>228</a>
<a id='n229' href='#n229'>229</a>
<a id='n230' href='#n230'>230</a>
<a id='n231' href='#n231'>231</a>
<a id='n232' href='#n232'>232</a>
<a id='n233' href='#n233'>233</a>
<a id='n234' href='#n234'>234</a>
<a id='n235' href='#n235'>235</a>
<a id='n236' href='#n236'>236</a>
<a id='n237' href='#n237'>237</a>
<a id='n238' href='#n238'>238</a>
<a id='n239' href='#n239'>239</a>
<a id='n240' href='#n240'>240</a>
<a id='n241' href='#n241'>241</a>
<a id='n242' href='#n242'>242</a>
<a id='n243' href='#n243'>243</a>
<a id='n244' href='#n244'>244</a>
<a id='n245' href='#n245'>245</a>
<a id='n246' href='#n246'>246</a>
<a id='n247' href='#n247'>247</a>
<a id='n248' href='#n248'>248</a>
<a id='n249' href='#n249'>249</a>
<a id='n250' href='#n250'>250</a>
<a id='n251' href='#n251'>251</a>
<a id='n252' href='#n252'>252</a>
<a id='n253' href='#n253'>253</a>
<a id='n254' href='#n254'>254</a>
<a id='n255' href='#n255'>255</a>
<a id='n256' href='#n256'>256</a>
<a id='n257' href='#n257'>257</a>
<a id='n258' href='#n258'>258</a>
<a id='n259' href='#n259'>259</a>
<a id='n260' href='#n260'>260</a>
<a id='n261' href='#n261'>261</a>
<a id='n262' href='#n262'>262</a>
<a id='n263' href='#n263'>263</a>
<a id='n264' href='#n264'>264</a>
<a id='n265' href='#n265'>265</a>
<a id='n266' href='#n266'>266</a>
<a id='n267' href='#n267'>267</a>
<a id='n268' href='#n268'>268</a>
<a id='n269' href='#n269'>269</a>
<a id='n270' href='#n270'>270</a>
<a id='n271' href='#n271'>271</a>
<a id='n272' href='#n272'>272</a>
<a id='n273' href='#n273'>273</a>
<a id='n274' href='#n274'>274</a>
<a id='n275' href='#n275'>275</a>
<a id='n276' href='#n276'>276</a>
<a id='n277' href='#n277'>277</a>
<a id='n278' href='#n278'>278</a>
<a id='n279' href='#n279'>279</a>
<a id='n280' href='#n280'>280</a>
<a id='n281' href='#n281'>281</a>
<a id='n282' href='#n282'>282</a>
<a id='n283' href='#n283'>283</a>
<a id='n284' href='#n284'>284</a>
<a id='n285' href='#n285'>285</a>
<a id='n286' href='#n286'>286</a>
<a id='n287' href='#n287'>287</a>
<a id='n288' href='#n288'>288</a>
<a id='n289' href='#n289'>289</a>
<a id='n290' href='#n290'>290</a>
<a id='n291' href='#n291'>291</a>
<a id='n292' href='#n292'>292</a>
<a id='n293' href='#n293'>293</a>
<a id='n294' href='#n294'>294</a>
<a id='n295' href='#n295'>295</a>
<a id='n296' href='#n296'>296</a>
<a id='n297' href='#n297'>297</a>
<a id='n298' href='#n298'>298</a>
<a id='n299' href='#n299'>299</a>
<a id='n300' href='#n300'>300</a>
<a id='n301' href='#n301'>301</a>
<a id='n302' href='#n302'>302</a>
<a id='n303' href='#n303'>303</a>
<a id='n304' href='#n304'>304</a>
<a id='n305' href='#n305'>305</a>
<a id='n306' href='#n306'>306</a>
<a id='n307' href='#n307'>307</a>
<a id='n308' href='#n308'>308</a>
<a id='n309' href='#n309'>309</a>
<a id='n310' href='#n310'>310</a>
<a id='n311' href='#n311'>311</a>
<a id='n312' href='#n312'>312</a>
<a id='n313' href='#n313'>313</a>
<a id='n314' href='#n314'>314</a>
<a id='n315' href='#n315'>315</a>
<a id='n316' href='#n316'>316</a>
<a id='n317' href='#n317'>317</a>
<a id='n318' href='#n318'>318</a>
<a id='n319' href='#n319'>319</a>
<a id='n320' href='#n320'>320</a>
<a id='n321' href='#n321'>321</a>
<a id='n322' href='#n322'>322</a>
<a id='n323' href='#n323'>323</a>
<a id='n324' href='#n324'>324</a>
<a id='n325' href='#n325'>325</a>
<a id='n326' href='#n326'>326</a>
<a id='n327' href='#n327'>327</a>
<a id='n328' href='#n328'>328</a>
<a id='n329' href='#n329'>329</a>
<a id='n330' href='#n330'>330</a>
<a id='n331' href='#n331'>331</a>
<a id='n332' href='#n332'>332</a>
<a id='n333' href='#n333'>333</a>
<a id='n334' href='#n334'>334</a>
<a id='n335' href='#n335'>335</a>
<a id='n336' href='#n336'>336</a>
<a id='n337' href='#n337'>337</a>
<a id='n338' href='#n338'>338</a>
<a id='n339' href='#n339'>339</a>
<a id='n340' href='#n340'>340</a>
<a id='n341' href='#n341'>341</a>
<a id='n342' href='#n342'>342</a>
<a id='n343' href='#n343'>343</a>
<a id='n344' href='#n344'>344</a>
<a id='n345' href='#n345'>345</a>
<a id='n346' href='#n346'>346</a>
<a id='n347' href='#n347'>347</a>
<a id='n348' href='#n348'>348</a>
<a id='n349' href='#n349'>349</a>
<a id='n350' href='#n350'>350</a>
<a id='n351' href='#n351'>351</a>
<a id='n352' href='#n352'>352</a>
<a id='n353' href='#n353'>353</a>
<a id='n354' href='#n354'>354</a>
<a id='n355' href='#n355'>355</a>
<a id='n356' href='#n356'>356</a>
<a id='n357' href='#n357'>357</a>
<a id='n358' href='#n358'>358</a>
<a id='n359' href='#n359'>359</a>
<a id='n360' href='#n360'>360</a>
<a id='n361' href='#n361'>361</a>
<a id='n362' href='#n362'>362</a>
<a id='n363' href='#n363'>363</a>
<a id='n364' href='#n364'>364</a>
<a id='n365' href='#n365'>365</a>
<a id='n366' href='#n366'>366</a>
<a id='n367' href='#n367'>367</a>
<a id='n368' href='#n368'>368</a>
<a id='n369' href='#n369'>369</a>
<a id='n370' href='#n370'>370</a>
<a id='n371' href='#n371'>371</a>
<a id='n372' href='#n372'>372</a>
<a id='n373' href='#n373'>373</a>
<a id='n374' href='#n374'>374</a>
<a id='n375' href='#n375'>375</a>
<a id='n376' href='#n376'>376</a>
<a id='n377' href='#n377'>377</a>
<a id='n378' href='#n378'>378</a>
<a id='n379' href='#n379'>379</a>
<a id='n380' href='#n380'>380</a>
<a id='n381' href='#n381'>381</a>
<a id='n382' href='#n382'>382</a>
<a id='n383' href='#n383'>383</a>
<a id='n384' href='#n384'>384</a>
<a id='n385' href='#n385'>385</a>
<a id='n386' href='#n386'>386</a>
<a id='n387' href='#n387'>387</a>
<a id='n388' href='#n388'>388</a>
<a id='n389' href='#n389'>389</a>
<a id='n390' href='#n390'>390</a>
<a id='n391' href='#n391'>391</a>
<a id='n392' href='#n392'>392</a>
<a id='n393' href='#n393'>393</a>
<a id='n394' href='#n394'>394</a>
<a id='n395' href='#n395'>395</a>
<a id='n396' href='#n396'>396</a>
<a id='n397' href='#n397'>397</a>
<a id='n398' href='#n398'>398</a>
<a id='n399' href='#n399'>399</a>
<a id='n400' href='#n400'>400</a>
<a id='n401' href='#n401'>401</a>
<a id='n402' href='#n402'>402</a>
<a id='n403' href='#n403'>403</a>
<a id='n404' href='#n404'>404</a>
<a id='n405' href='#n405'>405</a>
<a id='n406' href='#n406'>406</a>
<a id='n407' href='#n407'>407</a>
<a id='n408' href='#n408'>408</a>
<a id='n409' href='#n409'>409</a>
<a id='n410' href='#n410'>410</a>
<a id='n411' href='#n411'>411</a>
<a id='n412' href='#n412'>412</a>
<a id='n413' href='#n413'>413</a>
<a id='n414' href='#n414'>414</a>
<a id='n415' href='#n415'>415</a>
<a id='n416' href='#n416'>416</a>
<a id='n417' href='#n417'>417</a>
<a id='n418' href='#n418'>418</a>
<a id='n419' href='#n419'>419</a>
<a id='n420' href='#n420'>420</a>
<a id='n421' href='#n421'>421</a>
<a id='n422' href='#n422'>422</a>
<a id='n423' href='#n423'>423</a>
<a id='n424' href='#n424'>424</a>
<a id='n425' href='#n425'>425</a>
<a id='n426' href='#n426'>426</a>
<a id='n427' href='#n427'>427</a>
<a id='n428' href='#n428'>428</a>
<a id='n429' href='#n429'>429</a>
<a id='n430' href='#n430'>430</a>
<a id='n431' href='#n431'>431</a>
<a id='n432' href='#n432'>432</a>
<a id='n433' href='#n433'>433</a>
<a id='n434' href='#n434'>434</a>
<a id='n435' href='#n435'>435</a>
<a id='n436' href='#n436'>436</a>
<a id='n437' href='#n437'>437</a>
<a id='n438' href='#n438'>438</a>
<a id='n439' href='#n439'>439</a>
<a id='n440' href='#n440'>440</a>
<a id='n441' href='#n441'>441</a>
<a id='n442' href='#n442'>442</a>
<a id='n443' href='#n443'>443</a>
<a id='n444' href='#n444'>444</a>
<a id='n445' href='#n445'>445</a>
<a id='n446' href='#n446'>446</a>
<a id='n447' href='#n447'>447</a>
<a id='n448' href='#n448'>448</a>
<a id='n449' href='#n449'>449</a>
<a id='n450' href='#n450'>450</a>
<a id='n451' href='#n451'>451</a>
<a id='n452' href='#n452'>452</a>
<a id='n453' href='#n453'>453</a>
<a id='n454' href='#n454'>454</a>
<a id='n455' href='#n455'>455</a>
<a id='n456' href='#n456'>456</a>
<a id='n457' href='#n457'>457</a>
<a id='n458' href='#n458'>458</a>
<a id='n459' href='#n459'>459</a>
<a id='n460' href='#n460'>460</a>
<a id='n461' href='#n461'>461</a>
<a id='n462' href='#n462'>462</a>
<a id='n463' href='#n463'>463</a>
<a id='n464' href='#n464'>464</a>
<a id='n465' href='#n465'>465</a>
<a id='n466' href='#n466'>466</a>
<a id='n467' href='#n467'>467</a>
<a id='n468' href='#n468'>468</a>
<a id='n469' href='#n469'>469</a>
<a id='n470' href='#n470'>470</a>
<a id='n471' href='#n471'>471</a>
<a id='n472' href='#n472'>472</a>
<a id='n473' href='#n473'>473</a>
<a id='n474' href='#n474'>474</a>
<a id='n475' href='#n475'>475</a>
<a id='n476' href='#n476'>476</a>
<a id='n477' href='#n477'>477</a>
<a id='n478' href='#n478'>478</a>
<a id='n479' href='#n479'>479</a>
<a id='n480' href='#n480'>480</a>
<a id='n481' href='#n481'>481</a>
<a id='n482' href='#n482'>482</a>
<a id='n483' href='#n483'>483</a>
<a id='n484' href='#n484'>484</a>
<a id='n485' href='#n485'>485</a>
<a id='n486' href='#n486'>486</a>
<a id='n487' href='#n487'>487</a>
<a id='n488' href='#n488'>488</a>
<a id='n489' href='#n489'>489</a>
<a id='n490' href='#n490'>490</a>
<a id='n491' href='#n491'>491</a>
<a id='n492' href='#n492'>492</a>
<a id='n493' href='#n493'>493</a>
<a id='n494' href='#n494'>494</a>
<a id='n495' href='#n495'>495</a>
<a id='n496' href='#n496'>496</a>
<a id='n497' href='#n497'>497</a>
<a id='n498' href='#n498'>498</a>
<a id='n499' href='#n499'>499</a>
<a id='n500' href='#n500'>500</a>
<a id='n501' href='#n501'>501</a>
<a id='n502' href='#n502'>502</a>
<a id='n503' href='#n503'>503</a>
<a id='n504' href='#n504'>504</a>
<a id='n505' href='#n505'>505</a>
<a id='n506' href='#n506'>506</a>
<a id='n507' href='#n507'>507</a>
<a id='n508' href='#n508'>508</a>
<a id='n509' href='#n509'>509</a>
<a id='n510' href='#n510'>510</a>
<a id='n511' href='#n511'>511</a>
<a id='n512' href='#n512'>512</a>
<a id='n513' href='#n513'>513</a>
<a id='n514' href='#n514'>514</a>
<a id='n515' href='#n515'>515</a>
<a id='n516' href='#n516'>516</a>
<a id='n517' href='#n517'>517</a>
<a id='n518' href='#n518'>518</a>
<a id='n519' href='#n519'>519</a>
<a id='n520' href='#n520'>520</a>
<a id='n521' href='#n521'>521</a>
<a id='n522' href='#n522'>522</a>
<a id='n523' href='#n523'>523</a>
<a id='n524' href='#n524'>524</a>
<a id='n525' href='#n525'>525</a>
<a id='n526' href='#n526'>526</a>
<a id='n527' href='#n527'>527</a>
<a id='n528' href='#n528'>528</a>
<a id='n529' href='#n529'>529</a>
<a id='n530' href='#n530'>530</a>
<a id='n531' href='#n531'>531</a>
<a id='n532' href='#n532'>532</a>
<a id='n533' href='#n533'>533</a>
<a id='n534' href='#n534'>534</a>
<a id='n535' href='#n535'>535</a>
<a id='n536' href='#n536'>536</a>
<a id='n537' href='#n537'>537</a>
<a id='n538' href='#n538'>538</a>
<a id='n539' href='#n539'>539</a>
<a id='n540' href='#n540'>540</a>
<a id='n541' href='#n541'>541</a>
<a id='n542' href='#n542'>542</a>
<a id='n543' href='#n543'>543</a>
<a id='n544' href='#n544'>544</a>
<a id='n545' href='#n545'>545</a>
<a id='n546' href='#n546'>546</a>
<a id='n547' href='#n547'>547</a>
<a id='n548' href='#n548'>548</a>
<a id='n549' href='#n549'>549</a>
<a id='n550' href='#n550'>550</a>
<a id='n551' href='#n551'>551</a>
<a id='n552' href='#n552'>552</a>
<a id='n553' href='#n553'>553</a>
<a id='n554' href='#n554'>554</a>
<a id='n555' href='#n555'>555</a>
<a id='n556' href='#n556'>556</a>
<a id='n557' href='#n557'>557</a>
<a id='n558' href='#n558'>558</a>
<a id='n559' href='#n559'>559</a>
<a id='n560' href='#n560'>560</a>
<a id='n561' href='#n561'>561</a>
<a id='n562' href='#n562'>562</a>
<a id='n563' href='#n563'>563</a>
<a id='n564' href='#n564'>564</a>
<a id='n565' href='#n565'>565</a>
<a id='n566' href='#n566'>566</a>
<a id='n567' href='#n567'>567</a>
<a id='n568' href='#n568'>568</a>
<a id='n569' href='#n569'>569</a>
<a id='n570' href='#n570'>570</a>
<a id='n571' href='#n571'>571</a>
<a id='n572' href='#n572'>572</a>
<a id='n573' href='#n573'>573</a>
<a id='n574' href='#n574'>574</a>
<a id='n575' href='#n575'>575</a>
<a id='n576' href='#n576'>576</a>
<a id='n577' href='#n577'>577</a>
<a id='n578' href='#n578'>578</a>
<a id='n579' href='#n579'>579</a>
<a id='n580' href='#n580'>580</a>
<a id='n581' href='#n581'>581</a>
<a id='n582' href='#n582'>582</a>
<a id='n583' href='#n583'>583</a>
<a id='n584' href='#n584'>584</a>
<a id='n585' href='#n585'>585</a>
<a id='n586' href='#n586'>586</a>
<a id='n587' href='#n587'>587</a>
<a id='n588' href='#n588'>588</a>
<a id='n589' href='#n589'>589</a>
<a id='n590' href='#n590'>590</a>
<a id='n591' href='#n591'>591</a>
<a id='n592' href='#n592'>592</a>
<a id='n593' href='#n593'>593</a>
<a id='n594' href='#n594'>594</a>
<a id='n595' href='#n595'>595</a>
<a id='n596' href='#n596'>596</a>
<a id='n597' href='#n597'>597</a>
<a id='n598' href='#n598'>598</a>
<a id='n599' href='#n599'>599</a>
<a id='n600' href='#n600'>600</a>
<a id='n601' href='#n601'>601</a>
<a id='n602' href='#n602'>602</a>
<a id='n603' href='#n603'>603</a>
<a id='n604' href='#n604'>604</a>
<a id='n605' href='#n605'>605</a>
<a id='n606' href='#n606'>606</a>
<a id='n607' href='#n607'>607</a>
<a id='n608' href='#n608'>608</a>
<a id='n609' href='#n609'>609</a>
<a id='n610' href='#n610'>610</a>
<a id='n611' href='#n611'>611</a>
<a id='n612' href='#n612'>612</a>
<a id='n613' href='#n613'>613</a>
<a id='n614' href='#n614'>614</a>
<a id='n615' href='#n615'>615</a>
<a id='n616' href='#n616'>616</a>
<a id='n617' href='#n617'>617</a>
<a id='n618' href='#n618'>618</a>
<a id='n619' href='#n619'>619</a>
<a id='n620' href='#n620'>620</a>
<a id='n621' href='#n621'>621</a>
<a id='n622' href='#n622'>622</a>
<a id='n623' href='#n623'>623</a>
<a id='n624' href='#n624'>624</a>
<a id='n625' href='#n625'>625</a>
<a id='n626' href='#n626'>626</a>
<a id='n627' href='#n627'>627</a>
<a id='n628' href='#n628'>628</a>
<a id='n629' href='#n629'>629</a>
<a id='n630' href='#n630'>630</a>
<a id='n631' href='#n631'>631</a>
<a id='n632' href='#n632'>632</a>
<a id='n633' href='#n633'>633</a>
<a id='n634' href='#n634'>634</a>
<a id='n635' href='#n635'>635</a>
<a id='n636' href='#n636'>636</a>
<a id='n637' href='#n637'>637</a>
<a id='n638' href='#n638'>638</a>
<a id='n639' href='#n639'>639</a>
<a id='n640' href='#n640'>640</a>
<a id='n641' href='#n641'>641</a>
<a id='n642' href='#n642'>642</a>
<a id='n643' href='#n643'>643</a>
<a id='n644' href='#n644'>644</a>
<a id='n645' href='#n645'>645</a>
<a id='n646' href='#n646'>646</a>
<a id='n647' href='#n647'>647</a>
<a id='n648' href='#n648'>648</a>
<a id='n649' href='#n649'>649</a>
<a id='n650' href='#n650'>650</a>
<a id='n651' href='#n651'>651</a>
<a id='n652' href='#n652'>652</a>
<a id='n653' href='#n653'>653</a>
<a id='n654' href='#n654'>654</a>
<a id='n655' href='#n655'>655</a>
<a id='n656' href='#n656'>656</a>
<a id='n657' href='#n657'>657</a>
<a id='n658' href='#n658'>658</a>
<a id='n659' href='#n659'>659</a>
<a id='n660' href='#n660'>660</a>
<a id='n661' href='#n661'>661</a>
<a id='n662' href='#n662'>662</a>
<a id='n663' href='#n663'>663</a>
<a id='n664' href='#n664'>664</a>
<a id='n665' href='#n665'>665</a>
<a id='n666' href='#n666'>666</a>
<a id='n667' href='#n667'>667</a>
<a id='n668' href='#n668'>668</a>
<a id='n669' href='#n669'>669</a>
<a id='n670' href='#n670'>670</a>
<a id='n671' href='#n671'>671</a>
<a id='n672' href='#n672'>672</a>
<a id='n673' href='#n673'>673</a>
<a id='n674' href='#n674'>674</a>
<a id='n675' href='#n675'>675</a>
<a id='n676' href='#n676'>676</a>
<a id='n677' href='#n677'>677</a>
<a id='n678' href='#n678'>678</a>
<a id='n679' href='#n679'>679</a>
<a id='n680' href='#n680'>680</a>
<a id='n681' href='#n681'>681</a>
<a id='n682' href='#n682'>682</a>
<a id='n683' href='#n683'>683</a>
<a id='n684' href='#n684'>684</a>
<a id='n685' href='#n685'>685</a>
<a id='n686' href='#n686'>686</a>
<a id='n687' href='#n687'>687</a>
<a id='n688' href='#n688'>688</a>
<a id='n689' href='#n689'>689</a>
<a id='n690' href='#n690'>690</a>
<a id='n691' href='#n691'>691</a>
<a id='n692' href='#n692'>692</a>
<a id='n693' href='#n693'>693</a>
<a id='n694' href='#n694'>694</a>
<a id='n695' href='#n695'>695</a>
<a id='n696' href='#n696'>696</a>
<a id='n697' href='#n697'>697</a>
<a id='n698' href='#n698'>698</a>
<a id='n699' href='#n699'>699</a>
<a id='n700' href='#n700'>700</a>
<a id='n701' href='#n701'>701</a>
<a id='n702' href='#n702'>702</a>
<a id='n703' href='#n703'>703</a>
<a id='n704' href='#n704'>704</a>
<a id='n705' href='#n705'>705</a>
<a id='n706' href='#n706'>706</a>
<a id='n707' href='#n707'>707</a>
<a id='n708' href='#n708'>708</a>
<a id='n709' href='#n709'>709</a>
<a id='n710' href='#n710'>710</a>
<a id='n711' href='#n711'>711</a>
<a id='n712' href='#n712'>712</a>
<a id='n713' href='#n713'>713</a>
<a id='n714' href='#n714'>714</a>
<a id='n715' href='#n715'>715</a>
<a id='n716' href='#n716'>716</a>
<a id='n717' href='#n717'>717</a>
<a id='n718' href='#n718'>718</a>
<a id='n719' href='#n719'>719</a>
<a id='n720' href='#n720'>720</a>
<a id='n721' href='#n721'>721</a>
<a id='n722' href='#n722'>722</a>
<a id='n723' href='#n723'>723</a>
<a id='n724' href='#n724'>724</a>
<a id='n725' href='#n725'>725</a>
<a id='n726' href='#n726'>726</a>
<a id='n727' href='#n727'>727</a>
<a id='n728' href='#n728'>728</a>
<a id='n729' href='#n729'>729</a>
<a id='n730' href='#n730'>730</a>
<a id='n731' href='#n731'>731</a>
<a id='n732' href='#n732'>732</a>
<a id='n733' href='#n733'>733</a>
<a id='n734' href='#n734'>734</a>
<a id='n735' href='#n735'>735</a>
<a id='n736' href='#n736'>736</a>
<a id='n737' href='#n737'>737</a>
<a id='n738' href='#n738'>738</a>
<a id='n739' href='#n739'>739</a>
<a id='n740' href='#n740'>740</a>
<a id='n741' href='#n741'>741</a>
<a id='n742' href='#n742'>742</a>
<a id='n743' href='#n743'>743</a>
<a id='n744' href='#n744'>744</a>
<a id='n745' href='#n745'>745</a>
<a id='n746' href='#n746'>746</a>
<a id='n747' href='#n747'>747</a>
<a id='n748' href='#n748'>748</a>
<a id='n749' href='#n749'>749</a>
<a id='n750' href='#n750'>750</a>
<a id='n751' href='#n751'>751</a>
<a id='n752' href='#n752'>752</a>
<a id='n753' href='#n753'>753</a>
<a id='n754' href='#n754'>754</a>
<a id='n755' href='#n755'>755</a>
<a id='n756' href='#n756'>756</a>
<a id='n757' href='#n757'>757</a>
<a id='n758' href='#n758'>758</a>
<a id='n759' href='#n759'>759</a>
<a id='n760' href='#n760'>760</a>
<a id='n761' href='#n761'>761</a>
<a id='n762' href='#n762'>762</a>
<a id='n763' href='#n763'>763</a>
<a id='n764' href='#n764'>764</a>
<a id='n765' href='#n765'>765</a>
<a id='n766' href='#n766'>766</a>
<a id='n767' href='#n767'>767</a>
<a id='n768' href='#n768'>768</a>
<a id='n769' href='#n769'>769</a>
<a id='n770' href='#n770'>770</a>
<a id='n771' href='#n771'>771</a>
<a id='n772' href='#n772'>772</a>
<a id='n773' href='#n773'>773</a>
<a id='n774' href='#n774'>774</a>
<a id='n775' href='#n775'>775</a>
<a id='n776' href='#n776'>776</a>
<a id='n777' href='#n777'>777</a>
<a id='n778' href='#n778'>778</a>
<a id='n779' href='#n779'>779</a>
<a id='n780' href='#n780'>780</a>
<a id='n781' href='#n781'>781</a>
<a id='n782' href='#n782'>782</a>
<a id='n783' href='#n783'>783</a>
<a id='n784' href='#n784'>784</a>
<a id='n785' href='#n785'>785</a>
<a id='n786' href='#n786'>786</a>
<a id='n787' href='#n787'>787</a>
<a id='n788' href='#n788'>788</a>
<a id='n789' href='#n789'>789</a>
<a id='n790' href='#n790'>790</a>
<a id='n791' href='#n791'>791</a>
<a id='n792' href='#n792'>792</a>
<a id='n793' href='#n793'>793</a>
<a id='n794' href='#n794'>794</a>
<a id='n795' href='#n795'>795</a>
<a id='n796' href='#n796'>796</a>
<a id='n797' href='#n797'>797</a>
<a id='n798' href='#n798'>798</a>
<a id='n799' href='#n799'>799</a>
<a id='n800' href='#n800'>800</a>
<a id='n801' href='#n801'>801</a>
<a id='n802' href='#n802'>802</a>
<a id='n803' href='#n803'>803</a>
<a id='n804' href='#n804'>804</a>
<a id='n805' href='#n805'>805</a>
<a id='n806' href='#n806'>806</a>
<a id='n807' href='#n807'>807</a>
<a id='n808' href='#n808'>808</a>
<a id='n809' href='#n809'>809</a>
<a id='n810' href='#n810'>810</a>
<a id='n811' href='#n811'>811</a>
<a id='n812' href='#n812'>812</a>
<a id='n813' href='#n813'>813</a>
<a id='n814' href='#n814'>814</a>
<a id='n815' href='#n815'>815</a>
<a id='n816' href='#n816'>816</a>
<a id='n817' href='#n817'>817</a>
<a id='n818' href='#n818'>818</a>
<a id='n819' href='#n819'>819</a>
<a id='n820' href='#n820'>820</a>
<a id='n821' href='#n821'>821</a>
<a id='n822' href='#n822'>822</a>
<a id='n823' href='#n823'>823</a>
<a id='n824' href='#n824'>824</a>
<a id='n825' href='#n825'>825</a>
<a id='n826' href='#n826'>826</a>
<a id='n827' href='#n827'>827</a>
<a id='n828' href='#n828'>828</a>
<a id='n829' href='#n829'>829</a>
<a id='n830' href='#n830'>830</a>
<a id='n831' href='#n831'>831</a>
<a id='n832' href='#n832'>832</a>
<a id='n833' href='#n833'>833</a>
<a id='n834' href='#n834'>834</a>
<a id='n835' href='#n835'>835</a>
<a id='n836' href='#n836'>836</a>
<a id='n837' href='#n837'>837</a>
<a id='n838' href='#n838'>838</a>
<a id='n839' href='#n839'>839</a>
<a id='n840' href='#n840'>840</a>
<a id='n841' href='#n841'>841</a>
<a id='n842' href='#n842'>842</a>
<a id='n843' href='#n843'>843</a>
<a id='n844' href='#n844'>844</a>
<a id='n845' href='#n845'>845</a>
<a id='n846' href='#n846'>846</a>
<a id='n847' href='#n847'>847</a>
<a id='n848' href='#n848'>848</a>
<a id='n849' href='#n849'>849</a>
<a id='n850' href='#n850'>850</a>
<a id='n851' href='#n851'>851</a>
<a id='n852' href='#n852'>852</a>
<a id='n853' href='#n853'>853</a>
<a id='n854' href='#n854'>854</a>
<a id='n855' href='#n855'>855</a>
<a id='n856' href='#n856'>856</a>
<a id='n857' href='#n857'>857</a>
<a id='n858' href='#n858'>858</a>
<a id='n859' href='#n859'>859</a>
<a id='n860' href='#n860'>860</a>
<a id='n861' href='#n861'>861</a>
<a id='n862' href='#n862'>862</a>
<a id='n863' href='#n863'>863</a>
<a id='n864' href='#n864'>864</a>
<a id='n865' href='#n865'>865</a>
<a id='n866' href='#n866'>866</a>
<a id='n867' href='#n867'>867</a>
<a id='n868' href='#n868'>868</a>
<a id='n869' href='#n869'>869</a>
<a id='n870' href='#n870'>870</a>
<a id='n871' href='#n871'>871</a>
<a id='n872' href='#n872'>872</a>
<a id='n873' href='#n873'>873</a>
<a id='n874' href='#n874'>874</a>
<a id='n875' href='#n875'>875</a>
<a id='n876' href='#n876'>876</a>
<a id='n877' href='#n877'>877</a>
<a id='n878' href='#n878'>878</a>
<a id='n879' href='#n879'>879</a>
<a id='n880' href='#n880'>880</a>
<a id='n881' href='#n881'>881</a>
<a id='n882' href='#n882'>882</a>
<a id='n883' href='#n883'>883</a>
<a id='n884' href='#n884'>884</a>
<a id='n885' href='#n885'>885</a>
<a id='n886' href='#n886'>886</a>
<a id='n887' href='#n887'>887</a>
<a id='n888' href='#n888'>888</a>
<a id='n889' href='#n889'>889</a>
<a id='n890' href='#n890'>890</a>
<a id='n891' href='#n891'>891</a>
<a id='n892' href='#n892'>892</a>
<a id='n893' href='#n893'>893</a>
<a id='n894' href='#n894'>894</a>
<a id='n895' href='#n895'>895</a>
<a id='n896' href='#n896'>896</a>
<a id='n897' href='#n897'>897</a>
<a id='n898' href='#n898'>898</a>
<a id='n899' href='#n899'>899</a>
<a id='n900' href='#n900'>900</a>
<a id='n901' href='#n901'>901</a>
<a id='n902' href='#n902'>902</a>
<a id='n903' href='#n903'>903</a>
<a id='n904' href='#n904'>904</a>
<a id='n905' href='#n905'>905</a>
<a id='n906' href='#n906'>906</a>
<a id='n907' href='#n907'>907</a>
<a id='n908' href='#n908'>908</a>
<a id='n909' href='#n909'>909</a>
<a id='n910' href='#n910'>910</a>
<a id='n911' href='#n911'>911</a>
<a id='n912' href='#n912'>912</a>
<a id='n913' href='#n913'>913</a>
<a id='n914' href='#n914'>914</a>
<a id='n915' href='#n915'>915</a>
<a id='n916' href='#n916'>916</a>
<a id='n917' href='#n917'>917</a>
<a id='n918' href='#n918'>918</a>
<a id='n919' href='#n919'>919</a>
<a id='n920' href='#n920'>920</a>
<a id='n921' href='#n921'>921</a>
<a id='n922' href='#n922'>922</a>
<a id='n923' href='#n923'>923</a>
<a id='n924' href='#n924'>924</a>
<a id='n925' href='#n925'>925</a>
<a id='n926' href='#n926'>926</a>
<a id='n927' href='#n927'>927</a>
<a id='n928' href='#n928'>928</a>
<a id='n929' href='#n929'>929</a>
<a id='n930' href='#n930'>930</a>
<a id='n931' href='#n931'>931</a>
<a id='n932' href='#n932'>932</a>
<a id='n933' href='#n933'>933</a>
<a id='n934' href='#n934'>934</a>
<a id='n935' href='#n935'>935</a>
<a id='n936' href='#n936'>936</a>
<a id='n937' href='#n937'>937</a>
<a id='n938' href='#n938'>938</a>
<a id='n939' href='#n939'>939</a>
<a id='n940' href='#n940'>940</a>
<a id='n941' href='#n941'>941</a>
<a id='n942' href='#n942'>942</a>
<a id='n943' href='#n943'>943</a>
<a id='n944' href='#n944'>944</a>
<a id='n945' href='#n945'>945</a>
<a id='n946' href='#n946'>946</a>
<a id='n947' href='#n947'>947</a>
<a id='n948' href='#n948'>948</a>
<a id='n949' href='#n949'>949</a>
<a id='n950' href='#n950'>950</a>
<a id='n951' href='#n951'>951</a>
<a id='n952' href='#n952'>952</a>
<a id='n953' href='#n953'>953</a>
<a id='n954' href='#n954'>954</a>
<a id='n955' href='#n955'>955</a>
<a id='n956' href='#n956'>956</a>
<a id='n957' href='#n957'>957</a>
<a id='n958' href='#n958'>958</a>
<a id='n959' href='#n959'>959</a>
<a id='n960' href='#n960'>960</a>
<a id='n961' href='#n961'>961</a>
<a id='n962' href='#n962'>962</a>
<a id='n963' href='#n963'>963</a>
<a id='n964' href='#n964'>964</a>
<a id='n965' href='#n965'>965</a>
<a id='n966' href='#n966'>966</a>
<a id='n967' href='#n967'>967</a>
<a id='n968' href='#n968'>968</a>
<a id='n969' href='#n969'>969</a>
<a id='n970' href='#n970'>970</a>
<a id='n971' href='#n971'>971</a>
<a id='n972' href='#n972'>972</a>
<a id='n973' href='#n973'>973</a>
<a id='n974' href='#n974'>974</a>
<a id='n975' href='#n975'>975</a>
<a id='n976' href='#n976'>976</a>
<a id='n977' href='#n977'>977</a>
<a id='n978' href='#n978'>978</a>
<a id='n979' href='#n979'>979</a>
<a id='n980' href='#n980'>980</a>
<a id='n981' href='#n981'>981</a>
<a id='n982' href='#n982'>982</a>
<a id='n983' href='#n983'>983</a>
<a id='n984' href='#n984'>984</a>
<a id='n985' href='#n985'>985</a>
<a id='n986' href='#n986'>986</a>
<a id='n987' href='#n987'>987</a>
<a id='n988' href='#n988'>988</a>
<a id='n989' href='#n989'>989</a>
<a id='n990' href='#n990'>990</a>
<a id='n991' href='#n991'>991</a>
<a id='n992' href='#n992'>992</a>
<a id='n993' href='#n993'>993</a>
<a id='n994' href='#n994'>994</a>
<a id='n995' href='#n995'>995</a>
<a id='n996' href='#n996'>996</a>
<a id='n997' href='#n997'>997</a>
<a id='n998' href='#n998'>998</a>
<a id='n999' href='#n999'>999</a>
<a id='n1000' href='#n1000'>1000</a>
<a id='n1001' href='#n1001'>1001</a>
<a id='n1002' href='#n1002'>1002</a>
<a id='n1003' href='#n1003'>1003</a>
<a id='n1004' href='#n1004'>1004</a>
<a id='n1005' href='#n1005'>1005</a>
<a id='n1006' href='#n1006'>1006</a>
<a id='n1007' href='#n1007'>1007</a>
<a id='n1008' href='#n1008'>1008</a>
<a id='n1009' href='#n1009'>1009</a>
<a id='n1010' href='#n1010'>1010</a>
<a id='n1011' href='#n1011'>1011</a>
<a id='n1012' href='#n1012'>1012</a>
<a id='n1013' href='#n1013'>1013</a>
<a id='n1014' href='#n1014'>1014</a>
<a id='n1015' href='#n1015'>1015</a>
<a id='n1016' href='#n1016'>1016</a>
<a id='n1017' href='#n1017'>1017</a>
<a id='n1018' href='#n1018'>1018</a>
<a id='n1019' href='#n1019'>1019</a>
<a id='n1020' href='#n1020'>1020</a>
<a id='n1021' href='#n1021'>1021</a>
<a id='n1022' href='#n1022'>1022</a>
<a id='n1023' href='#n1023'>1023</a>
<a id='n1024' href='#n1024'>1024</a>
<a id='n1025' href='#n1025'>1025</a>
<a id='n1026' href='#n1026'>1026</a>
<a id='n1027' href='#n1027'>1027</a>
<a id='n1028' href='#n1028'>1028</a>
<a id='n1029' href='#n1029'>1029</a>
<a id='n1030' href='#n1030'>1030</a>
<a id='n1031' href='#n1031'>1031</a>
<a id='n1032' href='#n1032'>1032</a>
<a id='n1033' href='#n1033'>1033</a>
<a id='n1034' href='#n1034'>1034</a>
<a id='n1035' href='#n1035'>1035</a>
<a id='n1036' href='#n1036'>1036</a>
<a id='n1037' href='#n1037'>1037</a>
<a id='n1038' href='#n1038'>1038</a>
<a id='n1039' href='#n1039'>1039</a>
<a id='n1040' href='#n1040'>1040</a>
<a id='n1041' href='#n1041'>1041</a>
<a id='n1042' href='#n1042'>1042</a>
<a id='n1043' href='#n1043'>1043</a>
<a id='n1044' href='#n1044'>1044</a>
<a id='n1045' href='#n1045'>1045</a>
<a id='n1046' href='#n1046'>1046</a>
<a id='n1047' href='#n1047'>1047</a>
<a id='n1048' href='#n1048'>1048</a>
<a id='n1049' href='#n1049'>1049</a>
<a id='n1050' href='#n1050'>1050</a>
<a id='n1051' href='#n1051'>1051</a>
<a id='n1052' href='#n1052'>1052</a>
<a id='n1053' href='#n1053'>1053</a>
<a id='n1054' href='#n1054'>1054</a>
<a id='n1055' href='#n1055'>1055</a>
<a id='n1056' href='#n1056'>1056</a>
<a id='n1057' href='#n1057'>1057</a>
<a id='n1058' href='#n1058'>1058</a>
<a id='n1059' href='#n1059'>1059</a>
<a id='n1060' href='#n1060'>1060</a>
<a id='n1061' href='#n1061'>1061</a>
<a id='n1062' href='#n1062'>1062</a>
<a id='n1063' href='#n1063'>1063</a>
<a id='n1064' href='#n1064'>1064</a>
<a id='n1065' href='#n1065'>1065</a>
<a id='n1066' href='#n1066'>1066</a>
<a id='n1067' href='#n1067'>1067</a>
<a id='n1068' href='#n1068'>1068</a>
<a id='n1069' href='#n1069'>1069</a>
<a id='n1070' href='#n1070'>1070</a>
<a id='n1071' href='#n1071'>1071</a>
<a id='n1072' href='#n1072'>1072</a>
<a id='n1073' href='#n1073'>1073</a>
<a id='n1074' href='#n1074'>1074</a>
<a id='n1075' href='#n1075'>1075</a>
<a id='n1076' href='#n1076'>1076</a>
<a id='n1077' href='#n1077'>1077</a>
<a id='n1078' href='#n1078'>1078</a>
<a id='n1079' href='#n1079'>1079</a>
<a id='n1080' href='#n1080'>1080</a>
<a id='n1081' href='#n1081'>1081</a>
<a id='n1082' href='#n1082'>1082</a>
<a id='n1083' href='#n1083'>1083</a>
<a id='n1084' href='#n1084'>1084</a>
<a id='n1085' href='#n1085'>1085</a>
<a id='n1086' href='#n1086'>1086</a>
<a id='n1087' href='#n1087'>1087</a>
<a id='n1088' href='#n1088'>1088</a>
<a id='n1089' href='#n1089'>1089</a>
<a id='n1090' href='#n1090'>1090</a>
<a id='n1091' href='#n1091'>1091</a>
<a id='n1092' href='#n1092'>1092</a>
<a id='n1093' href='#n1093'>1093</a>
<a id='n1094' href='#n1094'>1094</a>
<a id='n1095' href='#n1095'>1095</a>
<a id='n1096' href='#n1096'>1096</a>
<a id='n1097' href='#n1097'>1097</a>
<a id='n1098' href='#n1098'>1098</a>
<a id='n1099' href='#n1099'>1099</a>
<a id='n1100' href='#n1100'>1100</a>
<a id='n1101' href='#n1101'>1101</a>
<a id='n1102' href='#n1102'>1102</a>
<a id='n1103' href='#n1103'>1103</a>
<a id='n1104' href='#n1104'>1104</a>
<a id='n1105' href='#n1105'>1105</a>
<a id='n1106' href='#n1106'>1106</a>
<a id='n1107' href='#n1107'>1107</a>
<a id='n1108' href='#n1108'>1108</a>
<a id='n1109' href='#n1109'>1109</a>
<a id='n1110' href='#n1110'>1110</a>
<a id='n1111' href='#n1111'>1111</a>
<a id='n1112' href='#n1112'>1112</a>
<a id='n1113' href='#n1113'>1113</a>
<a id='n1114' href='#n1114'>1114</a>
<a id='n1115' href='#n1115'>1115</a>
<a id='n1116' href='#n1116'>1116</a>
<a id='n1117' href='#n1117'>1117</a>
<a id='n1118' href='#n1118'>1118</a>
<a id='n1119' href='#n1119'>1119</a>
<a id='n1120' href='#n1120'>1120</a>
<a id='n1121' href='#n1121'>1121</a>
<a id='n1122' href='#n1122'>1122</a>
<a id='n1123' href='#n1123'>1123</a>
<a id='n1124' href='#n1124'>1124</a>
<a id='n1125' href='#n1125'>1125</a>
<a id='n1126' href='#n1126'>1126</a>
<a id='n1127' href='#n1127'>1127</a>
<a id='n1128' href='#n1128'>1128</a>
<a id='n1129' href='#n1129'>1129</a>
<a id='n1130' href='#n1130'>1130</a>
<a id='n1131' href='#n1131'>1131</a>
<a id='n1132' href='#n1132'>1132</a>
<a id='n1133' href='#n1133'>1133</a>
<a id='n1134' href='#n1134'>1134</a>
<a id='n1135' href='#n1135'>1135</a>
<a id='n1136' href='#n1136'>1136</a>
<a id='n1137' href='#n1137'>1137</a>
<a id='n1138' href='#n1138'>1138</a>
<a id='n1139' href='#n1139'>1139</a>
<a id='n1140' href='#n1140'>1140</a>
<a id='n1141' href='#n1141'>1141</a>
<a id='n1142' href='#n1142'>1142</a>
<a id='n1143' href='#n1143'>1143</a>
<a id='n1144' href='#n1144'>1144</a>
<a id='n1145' href='#n1145'>1145</a>
<a id='n1146' href='#n1146'>1146</a>
<a id='n1147' href='#n1147'>1147</a>
<a id='n1148' href='#n1148'>1148</a>
<a id='n1149' href='#n1149'>1149</a>
<a id='n1150' href='#n1150'>1150</a>
<a id='n1151' href='#n1151'>1151</a>
<a id='n1152' href='#n1152'>1152</a>
<a id='n1153' href='#n1153'>1153</a>
<a id='n1154' href='#n1154'>1154</a>
<a id='n1155' href='#n1155'>1155</a>
<a id='n1156' href='#n1156'>1156</a>
<a id='n1157' href='#n1157'>1157</a>
<a id='n1158' href='#n1158'>1158</a>
<a id='n1159' href='#n1159'>1159</a>
<a id='n1160' href='#n1160'>1160</a>
<a id='n1161' href='#n1161'>1161</a>
<a id='n1162' href='#n1162'>1162</a>
<a id='n1163' href='#n1163'>1163</a>
<a id='n1164' href='#n1164'>1164</a>
<a id='n1165' href='#n1165'>1165</a>
<a id='n1166' href='#n1166'>1166</a>
<a id='n1167' href='#n1167'>1167</a>
<a id='n1168' href='#n1168'>1168</a>
<a id='n1169' href='#n1169'>1169</a>
<a id='n1170' href='#n1170'>1170</a>
<a id='n1171' href='#n1171'>1171</a>
<a id='n1172' href='#n1172'>1172</a>
<a id='n1173' href='#n1173'>1173</a>
<a id='n1174' href='#n1174'>1174</a>
<a id='n1175' href='#n1175'>1175</a>
<a id='n1176' href='#n1176'>1176</a>
<a id='n1177' href='#n1177'>1177</a>
<a id='n1178' href='#n1178'>1178</a>
<a id='n1179' href='#n1179'>1179</a>
<a id='n1180' href='#n1180'>1180</a>
<a id='n1181' href='#n1181'>1181</a>
<a id='n1182' href='#n1182'>1182</a>
<a id='n1183' href='#n1183'>1183</a>
<a id='n1184' href='#n1184'>1184</a>
<a id='n1185' href='#n1185'>1185</a>
<a id='n1186' href='#n1186'>1186</a>
<a id='n1187' href='#n1187'>1187</a>
<a id='n1188' href='#n1188'>1188</a>
<a id='n1189' href='#n1189'>1189</a>
<a id='n1190' href='#n1190'>1190</a>
<a id='n1191' href='#n1191'>1191</a>
<a id='n1192' href='#n1192'>1192</a>
<a id='n1193' href='#n1193'>1193</a>
<a id='n1194' href='#n1194'>1194</a>
<a id='n1195' href='#n1195'>1195</a>
<a id='n1196' href='#n1196'>1196</a>
<a id='n1197' href='#n1197'>1197</a>
<a id='n1198' href='#n1198'>1198</a>
<a id='n1199' href='#n1199'>1199</a>
<a id='n1200' href='#n1200'>1200</a>
<a id='n1201' href='#n1201'>1201</a>
<a id='n1202' href='#n1202'>1202</a>
<a id='n1203' href='#n1203'>1203</a>
<a id='n1204' href='#n1204'>1204</a>
<a id='n1205' href='#n1205'>1205</a>
<a id='n1206' href='#n1206'>1206</a>
<a id='n1207' href='#n1207'>1207</a>
<a id='n1208' href='#n1208'>1208</a>
<a id='n1209' href='#n1209'>1209</a>
<a id='n1210' href='#n1210'>1210</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span>From 00942d1a1bd93ac108c1b92d504c568a37be1833 Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Fri, 17 Jan 2014 10:58:49 -0300
Subject: [PATCH] [media] media: rc: add sysfs scancode filtering interface

Add and document a generic sysfs based scancode filtering interface for
making use of IR data matching hardware to filter out uninteresting
scancodes. Two filters exist, one for normal operation and one for
filtering scancodes which are permitted to wake the system from suspend.

The following files are added to /sys/class/rc/rc?/:
 - filter: normal scancode filter value
 - filter_mask: normal scancode filter mask
 - wakeup_filter: wakeup scancode filter value
 - wakeup_filter_mask: wakeup scancode filter mask

A new s_filter() driver callback is added which must arrange for the
specified filter to be applied at the right time. Drivers can convert
the scancode filter into a raw IR data filter, which can be applied
immediately or later (for wake up filters).

Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Cc: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
Cc: linux-media@vger.kernel.org
Cc: Rob Landley &lt;rob@landley.net&gt;
Cc: linux-doc@vger.kernel.org
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 Documentation/ABI/testing/sysfs-class-rc |  58 +++++++++++++
 drivers/media/rc/rc-main.c               | 136 +++++++++++++++++++++++++++++++
 include/media/rc-core.h                  |  29 +++++++
 3 files changed, 223 insertions(+)

From 7b802ce7e8c67510389fdbbe29edd87a75df3a93 Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Mon, 10 Feb 2014 18:31:56 -0300
Subject: [PATCH] [media] rc-main: store_filter: pass errors to userland
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Propagate errors returned by drivers from the s_filter callback back to
userland when updating scancode filters. This allows userland to see
when the filter couldn&#39;t be updated, usually because it&#39;s not a valid
filter for the hardware.

Previously the filter was being updated conditionally on success of
s_filter, but the write always reported success back to userland.

Reported-by: Antti Seppälä &lt;a.seppala@gmail.com&gt;
Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 drivers/media/rc/rc-main.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

From b8c7d915087c97a21fa415fa0e860e59739da202 Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Fri, 28 Feb 2014 20:17:02 -0300
Subject: [PATCH] [media] rc-main: add generic scancode filtering
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add generic scancode filtering of RC input events, and fall back to
permitting any RC_FILTER_NORMAL scancode filter to be set if no s_filter
callback exists. This allows raw IR decoder events to be filtered, and
potentially allows hardware decoders to set looser filters and rely on
generic code to filter out the corner cases.

Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Reviewed-by: Antti Seppälä &lt;a.seppala@gmail.com&gt;
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 drivers/media/rc/rc-main.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

From 1a1934fab0c920f0d3bceeb60c9fe2dae8a56be9 Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Fri, 28 Feb 2014 20:17:03 -0300
Subject: [PATCH] [media] rc: abstract access to allowed/enabled protocols
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The allowed and enabled protocol masks need to be expanded to be per
filter type in order to support wakeup filter protocol selection. To
ease that process abstract access to the rc_dev::allowed_protos and
rc_dev::enabled_protocols members with inline functions.

Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Reviewed-by: Antti Seppälä &lt;a.seppala@gmail.com&gt;
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 drivers/hid/hid-picolcd_cir.c               |  2 +-
 drivers/media/common/siano/smsir.c          |  2 +-
 drivers/media/i2c/ir-kbd-i2c.c              |  4 ++--
 drivers/media/pci/cx23885/cx23885-input.c   |  2 +-
 drivers/media/pci/cx88/cx88-input.c         |  2 +-
 drivers/media/rc/ati_remote.c               |  2 +-
 drivers/media/rc/ene_ir.c                   |  2 +-
 drivers/media/rc/fintek-cir.c               |  2 +-
 drivers/media/rc/gpio-ir-recv.c             |  4 ++--
 drivers/media/rc/iguanair.c                 |  2 +-
 drivers/media/rc/imon.c                     |  7 ++++---
 drivers/media/rc/ir-jvc-decoder.c           |  2 +-
 drivers/media/rc/ir-lirc-codec.c            |  2 +-
 drivers/media/rc/ir-mce_kbd-decoder.c       |  2 +-
 drivers/media/rc/ir-nec-decoder.c           |  2 +-
 drivers/media/rc/ir-raw.c                   |  2 +-
 drivers/media/rc/ir-rc5-decoder.c           |  6 +++---
 drivers/media/rc/ir-rc5-sz-decoder.c        |  2 +-
 drivers/media/rc/ir-rc6-decoder.c           |  6 +++---
 drivers/media/rc/ir-sanyo-decoder.c         |  2 +-
 drivers/media/rc/ir-sharp-decoder.c         |  2 +-
 drivers/media/rc/ir-sony-decoder.c          | 10 +++++-----
 drivers/media/rc/ite-cir.c                  |  2 +-
 drivers/media/rc/mceusb.c                   |  2 +-
 drivers/media/rc/nuvoton-cir.c              |  2 +-
 drivers/media/rc/rc-loopback.c              |  2 +-
 drivers/media/rc/redrat3.c                  |  2 +-
 drivers/media/rc/st_rc.c                    |  2 +-
 drivers/media/rc/streamzap.c                |  2 +-
 drivers/media/rc/ttusbir.c                  |  2 +-
 drivers/media/rc/winbond-cir.c              |  2 +-
 drivers/media/usb/dvb-usb-v2/dvb_usb_core.c |  2 +-
 drivers/media/usb/dvb-usb/dvb-usb-remote.c  |  2 +-
 drivers/media/usb/em28xx/em28xx-input.c     |  8 ++++----
 drivers/media/usb/tm6000/tm6000-input.c     |  2 +-
 include/media/rc-core.h                     | 22 ++++++++++++++++++++++
 36 files changed, 73 insertions(+), 50 deletions(-)

From acff5f24732acc8a55d0a0f0ee1d19442267df63 Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Fri, 28 Feb 2014 20:17:04 -0300
Subject: [PATCH] [media] rc: add allowed/enabled wakeup protocol masks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Only a single allowed and enabled protocol mask currently exists in
struct rc_dev, however to support a separate wakeup filter protocol two
of each are needed, ideally as an array.

Therefore make both rc_dev::allowed_protos and rc_dev::enabled_protocols
arrays, update all users to reference the first element
(RC_FILTER_NORMAL), and add a couple more helper functions for drivers
to use for setting the allowed and enabled wakeup protocols.

We also rename allowed_protos to allowed_protocols while we&#39;re at it,
which is more consistent with enabled_protocols.

Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Reviewed-by: Antti Seppälä &lt;a.seppala@gmail.com&gt;
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 drivers/media/rc/rc-main.c | 10 +++++-----
 include/media/rc-core.h    | 32 ++++++++++++++++++++++++--------
 2 files changed, 29 insertions(+), 13 deletions(-)

From ab88c66deace78989aa71cb139284cf7fb227ba4 Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Fri, 28 Feb 2014 20:17:05 -0300
Subject: [PATCH] [media] rc: add wakeup_protocols sysfs file
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add a wakeup_protocols sysfs file which controls the new
rc_dev::enabled_protocols[RC_FILTER_WAKEUP], which is the mask of
protocols that are used for the wakeup filter.

A new RC driver callback change_wakeup_protocol() is called to change
the wakeup protocol mask.

Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Reviewed-by: Antti Seppälä &lt;a.seppala@gmail.com&gt;
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 Documentation/ABI/testing/sysfs-class-rc           | 23 +++++-
 .../DocBook/media/v4l/remote_controllers.xml       | 20 +++++-
 drivers/media/rc/rc-main.c                         | 82 +++++++++++++---------
 include/media/rc-core.h                            |  3 +
 4 files changed, 90 insertions(+), 38 deletions(-)

From 6bea25af147fcddcd8fd4557f4184c847c5c6ffd Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Fri, 28 Feb 2014 20:17:06 -0300
Subject: [PATCH] [media] rc-main: automatically refresh filter on protocol
 change
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When either of the normal or wakeup filter protocols are changed,
refresh the corresponding scancode filter, i.e. try and set the same
scancode filter with the new protocol. If that fails clear the filter
instead.

If no protocol was selected the filter is just cleared, and if no
s_filter callback exists the filter is left unmodified.

Similarly clear the filter mask when the filter is set if no protocol is
currently selected.

This simplifies driver code which no longer has to explicitly worry
about modifying the filter on a protocol change. This also allows the
change_wakeup_protocol callback to be omitted entirely if there is only
a single available wakeup protocol at a time, since selecting no
protocol will automatically clear the wakeup filter, disabling wakeup.

Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Reviewed-by: Antti Seppälä &lt;a.seppala@gmail.com&gt;
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 drivers/media/rc/rc-main.c | 41 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)

From 262912335c823a2bbcc87003ee55d62cc27f4e48 Mon Sep 17 00:00:00 2001
From: James Hogan &lt;james.hogan@imgtec.com&gt;
Date: Sat, 1 Mar 2014 19:52:25 -0300
Subject: [PATCH] [media] rc-main: fix missing unlock if no devno left

While playing with make coccicheck I noticed this message:
drivers/media/rc/rc-main.c:1245:3-9: preceding lock on line 1238

It was introduced by commit 587d1b06e07b ([media] rc-core: reuse device
numbers) which returns -ENOMEM after a mutex_lock without first
unlocking it when there are no more device numbers left. The added code
doesn&#39;t depend on the device lock, so move it before the lock is taken.

Signed-off-by: James Hogan &lt;james.hogan@imgtec.com&gt;
Signed-off-by: Mauro Carvalho Chehab &lt;m.chehab@samsung.com&gt;
<span class="gd">---</span>
 drivers/media/rc/rc-main.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

<span class="gd">--- a/drivers/hid/hid-picolcd_cir.c</span>
<span class="gi">+++ b/drivers/hid/hid-picolcd_cir.c</span>
<span class="gu">@@ -114,7 +114,7 @@ int picolcd_init_cir(struct picolcd_data</span>
 
 	rdev-&gt;priv             = data;
 	rdev-&gt;driver_type      = RC_DRIVER_IR_RAW;
<span class="gd">-	rdev-&gt;allowed_protos   = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_ALL);</span>
 	rdev-&gt;open             = picolcd_cir_open;
 	rdev-&gt;close            = picolcd_cir_close;
 	rdev-&gt;input_name       = data-&gt;hdev-&gt;name;
<span class="gd">--- a/drivers/media/common/siano/smsir.c</span>
<span class="gi">+++ b/drivers/media/common/siano/smsir.c</span>
<span class="gu">@@ -88,7 +88,7 @@ int sms_ir_init(struct smscore_device_t </span>
 
 	dev-&gt;priv = coredev;
 	dev-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	dev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(dev, RC_BIT_ALL);</span>
 	dev-&gt;map_name = sms_get_board(board_id)-&gt;rc_codes;
 	dev-&gt;driver_name = MODULE_NAME;
 
<span class="gd">--- a/drivers/media/i2c/ir-kbd-i2c.c</span>
<span class="gi">+++ b/drivers/media/i2c/ir-kbd-i2c.c</span>
<span class="gu">@@ -431,8 +431,8 @@ static int ir_probe(struct i2c_client *c</span>
 	 * Initialize the other fields of rc_dev
 	 */
 	rc-&gt;map_name       = ir-&gt;ir_codes;
<span class="gd">-	rc-&gt;allowed_protos = rc_type;</span>
<span class="gd">-	rc-&gt;enabled_protocols = rc_type;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, rc_type);</span>
<span class="gi">+	rc_set_enabled_protocols(rc, rc_type);</span>
 	if (!rc-&gt;driver_name)
 		rc-&gt;driver_name = MODULE_NAME;
 
<span class="gd">--- a/drivers/media/pci/cx23885/cx23885-input.c</span>
<span class="gi">+++ b/drivers/media/pci/cx23885/cx23885-input.c</span>
<span class="gu">@@ -346,7 +346,7 @@ int cx23885_input_init(struct cx23885_de</span>
 	}
 	rc-&gt;dev.parent = &amp;dev-&gt;pci-&gt;dev;
 	rc-&gt;driver_type = driver_type;
<span class="gd">-	rc-&gt;allowed_protos = allowed_protos;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, allowed_protos);</span>
 	rc-&gt;priv = kernel_ir;
 	rc-&gt;open = cx23885_input_ir_open;
 	rc-&gt;close = cx23885_input_ir_close;
<span class="gd">--- a/drivers/media/pci/cx88/cx88-input.c</span>
<span class="gi">+++ b/drivers/media/pci/cx88/cx88-input.c</span>
<span class="gu">@@ -469,7 +469,7 @@ int cx88_ir_init(struct cx88_core *core,</span>
 		dev-&gt;timeout = 10 * 1000 * 1000; /* 10 ms */
 	} else {
 		dev-&gt;driver_type = RC_DRIVER_SCANCODE;
<span class="gd">-		dev-&gt;allowed_protos = rc_type;</span>
<span class="gi">+		rc_set_allowed_protocols(dev, rc_type);</span>
 	}
 
 	ir-&gt;core = core;
<span class="gd">--- a/drivers/media/rc/ati_remote.c</span>
<span class="gi">+++ b/drivers/media/rc/ati_remote.c</span>
<span class="gu">@@ -784,7 +784,7 @@ static void ati_remote_rc_init(struct at</span>
 
 	rdev-&gt;priv = ati_remote;
 	rdev-&gt;driver_type = RC_DRIVER_SCANCODE;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_OTHER;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_OTHER);</span>
 	rdev-&gt;driver_name = &quot;ati_remote&quot;;
 
 	rdev-&gt;open = ati_remote_rc_open;
<span class="gd">--- a/drivers/media/rc/ene_ir.c</span>
<span class="gi">+++ b/drivers/media/rc/ene_ir.c</span>
<span class="gu">@@ -1059,7 +1059,7 @@ static int ene_probe(struct pnp_dev *pnp</span>
 		learning_mode_force = false;
 
 	rdev-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_ALL);</span>
 	rdev-&gt;priv = dev;
 	rdev-&gt;open = ene_open;
 	rdev-&gt;close = ene_close;
<span class="gd">--- a/drivers/media/rc/fintek-cir.c</span>
<span class="gi">+++ b/drivers/media/rc/fintek-cir.c</span>
<span class="gu">@@ -541,7 +541,7 @@ static int fintek_probe(struct pnp_dev *</span>
 	/* Set up the rc device */
 	rdev-&gt;priv = fintek;
 	rdev-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_ALL);</span>
 	rdev-&gt;open = fintek_open;
 	rdev-&gt;close = fintek_close;
 	rdev-&gt;input_name = FINTEK_DESCRIPTION;
<span class="gd">--- a/drivers/media/rc/gpio-ir-recv.c</span>
<span class="gi">+++ b/drivers/media/rc/gpio-ir-recv.c</span>
<span class="gu">@@ -145,9 +145,9 @@ static int gpio_ir_recv_probe(struct pla</span>
 	rcdev-&gt;dev.parent = &amp;pdev-&gt;dev;
 	rcdev-&gt;driver_name = GPIO_IR_DRIVER_NAME;
 	if (pdata-&gt;allowed_protos)
<span class="gd">-		rcdev-&gt;allowed_protos = pdata-&gt;allowed_protos;</span>
<span class="gi">+		rc_set_allowed_protocols(rcdev, pdata-&gt;allowed_protos);</span>
 	else
<span class="gd">-		rcdev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+		rc_set_allowed_protocols(rcdev, RC_BIT_ALL);</span>
 	rcdev-&gt;map_name = pdata-&gt;map_name ?: RC_MAP_EMPTY;
 
 	gpio_dev-&gt;rcdev = rcdev;
<span class="gd">--- a/drivers/media/rc/iguanair.c</span>
<span class="gi">+++ b/drivers/media/rc/iguanair.c</span>
<span class="gu">@@ -494,7 +494,7 @@ static int iguanair_probe(struct usb_int</span>
 	usb_to_input_id(ir-&gt;udev, &amp;rc-&gt;input_id);
 	rc-&gt;dev.parent = &amp;intf-&gt;dev;
 	rc-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rc-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, RC_BIT_ALL);</span>
 	rc-&gt;priv = ir;
 	rc-&gt;open = iguanair_open;
 	rc-&gt;close = iguanair_close;
<span class="gd">--- a/drivers/media/rc/imon.c</span>
<span class="gi">+++ b/drivers/media/rc/imon.c</span>
<span class="gu">@@ -1017,7 +1017,7 @@ static int imon_ir_change_protocol(struc</span>
 	unsigned char ir_proto_packet[] = {
 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86 };
 
<span class="gd">-	if (*rc_type &amp;&amp; !(*rc_type &amp; rc-&gt;allowed_protos))</span>
<span class="gi">+	if (*rc_type &amp;&amp; !rc_protocols_allowed(rc, *rc_type))</span>
 		dev_warn(dev, &quot;Looks like you&#39;re trying to use an IR protocol &quot;
 			 &quot;this device does not support\n&quot;);
 
<span class="gu">@@ -1867,7 +1867,8 @@ static struct rc_dev *imon_init_rdev(str</span>
 
 	rdev-&gt;priv = ictx;
 	rdev-&gt;driver_type = RC_DRIVER_SCANCODE;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_OTHER | RC_BIT_RC6_MCE; /* iMON PAD or MCE */</span>
<span class="gi">+					/* iMON PAD or MCE */</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_OTHER | RC_BIT_RC6_MCE);</span>
 	rdev-&gt;change_protocol = imon_ir_change_protocol;
 	rdev-&gt;driver_name = MOD_NAME;
 
<span class="gu">@@ -1880,7 +1881,7 @@ static struct rc_dev *imon_init_rdev(str</span>
 
 	if (ictx-&gt;product == 0xffdc) {
 		imon_get_ffdc_type(ictx);
<span class="gd">-		rdev-&gt;allowed_protos = ictx-&gt;rc_type;</span>
<span class="gi">+		rc_set_allowed_protocols(rdev, ictx-&gt;rc_type);</span>
 	}
 
 	imon_set_display_type(ictx);
<span class="gd">--- a/drivers/media/rc/ir-jvc-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-jvc-decoder.c</span>
<span class="gu">@@ -47,7 +47,7 @@ static int ir_jvc_decode(struct rc_dev *</span>
 {
 	struct jvc_dec *data = &amp;dev-&gt;raw-&gt;jvc;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp; RC_BIT_JVC))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_JVC))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gd">--- a/drivers/media/rc/ir-lirc-codec.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-lirc-codec.c</span>
<span class="gu">@@ -35,7 +35,7 @@ static int ir_lirc_decode(struct rc_dev </span>
 	struct lirc_codec *lirc = &amp;dev-&gt;raw-&gt;lirc;
 	int sample;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp; RC_BIT_LIRC))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_LIRC))</span>
 		return 0;
 
 	if (!dev-&gt;raw-&gt;lirc.drv || !dev-&gt;raw-&gt;lirc.drv-&gt;rbuf)
<span class="gd">--- a/drivers/media/rc/ir-mce_kbd-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-mce_kbd-decoder.c</span>
<span class="gu">@@ -216,7 +216,7 @@ static int ir_mce_kbd_decode(struct rc_d</span>
 	u32 scancode;
 	unsigned long delay;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp; RC_BIT_MCE_KBD))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_MCE_KBD))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gd">--- a/drivers/media/rc/ir-nec-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-nec-decoder.c</span>
<span class="gu">@@ -52,7 +52,7 @@ static int ir_nec_decode(struct rc_dev *</span>
 	u8 address, not_address, command, not_command;
 	bool send_32bits = false;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp; RC_BIT_NEC))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_NEC))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gd">--- a/drivers/media/rc/ir-raw.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-raw.c</span>
<span class="gu">@@ -256,7 +256,7 @@ int ir_raw_event_register(struct rc_dev </span>
 		return -ENOMEM;
 
 	dev-&gt;raw-&gt;dev = dev;
<span class="gd">-	dev-&gt;enabled_protocols = ~0;</span>
<span class="gi">+	rc_set_enabled_protocols(dev, ~0);</span>
 	rc = kfifo_alloc(&amp;dev-&gt;raw-&gt;kfifo,
 			 sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE,
 			 GFP_KERNEL);
<span class="gd">--- a/drivers/media/rc/ir-rc5-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-rc5-decoder.c</span>
<span class="gu">@@ -52,7 +52,7 @@ static int ir_rc5_decode(struct rc_dev *</span>
 	u8 toggle;
 	u32 scancode;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp; (RC_BIT_RC5 | RC_BIT_RC5X)))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_RC5 | RC_BIT_RC5X))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gu">@@ -128,7 +128,7 @@ again:</span>
 		if (data-&gt;wanted_bits == RC5X_NBITS) {
 			/* RC5X */
 			u8 xdata, command, system;
<span class="gd">-			if (!(dev-&gt;enabled_protocols &amp; RC_BIT_RC5X)) {</span>
<span class="gi">+			if (!rc_protocols_enabled(dev, RC_BIT_RC5X)) {</span>
 				data-&gt;state = STATE_INACTIVE;
 				return 0;
 			}
<span class="gu">@@ -145,7 +145,7 @@ again:</span>
 		} else {
 			/* RC5 */
 			u8 command, system;
<span class="gd">-			if (!(dev-&gt;enabled_protocols &amp; RC_BIT_RC5)) {</span>
<span class="gi">+			if (!rc_protocols_enabled(dev, RC_BIT_RC5)) {</span>
 				data-&gt;state = STATE_INACTIVE;
 				return 0;
 			}
<span class="gd">--- a/drivers/media/rc/ir-rc5-sz-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-rc5-sz-decoder.c</span>
<span class="gu">@@ -48,7 +48,7 @@ static int ir_rc5_sz_decode(struct rc_de</span>
 	u8 toggle, command, system;
 	u32 scancode;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp; RC_BIT_RC5_SZ))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_RC5_SZ))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gd">--- a/drivers/media/rc/ir-rc6-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-rc6-decoder.c</span>
<span class="gu">@@ -89,9 +89,9 @@ static int ir_rc6_decode(struct rc_dev *</span>
 	u32 scancode;
 	u8 toggle;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp;</span>
<span class="gd">-	      (RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 |</span>
<span class="gd">-	       RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE)))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 |</span>
<span class="gi">+				  RC_BIT_RC6_6A_24 | RC_BIT_RC6_6A_32 |</span>
<span class="gi">+				  RC_BIT_RC6_MCE))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gd">--- a/drivers/media/rc/ir-sanyo-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-sanyo-decoder.c</span>
<span class="gu">@@ -58,7 +58,7 @@ static int ir_sanyo_decode(struct rc_dev</span>
 	u32 scancode;
 	u8 address, command, not_command;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp; RC_BIT_SANYO))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_SANYO))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gd">--- a/drivers/media/rc/ir-sony-decoder.c</span>
<span class="gi">+++ b/drivers/media/rc/ir-sony-decoder.c</span>
<span class="gu">@@ -45,8 +45,8 @@ static int ir_sony_decode(struct rc_dev </span>
 	u32 scancode;
 	u8 device, subdevice, function;
 
<span class="gd">-	if (!(dev-&gt;enabled_protocols &amp;</span>
<span class="gd">-	      (RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20)))</span>
<span class="gi">+	if (!rc_protocols_enabled(dev, RC_BIT_SONY12 | RC_BIT_SONY15 |</span>
<span class="gi">+				  RC_BIT_SONY20))</span>
 		return 0;
 
 	if (!is_timing_event(ev)) {
<span class="gu">@@ -124,7 +124,7 @@ static int ir_sony_decode(struct rc_dev </span>
 
 		switch (data-&gt;count) {
 		case 12:
<span class="gd">-			if (!(dev-&gt;enabled_protocols &amp; RC_BIT_SONY12)) {</span>
<span class="gi">+			if (!rc_protocols_enabled(dev, RC_BIT_SONY12)) {</span>
 				data-&gt;state = STATE_INACTIVE;
 				return 0;
 			}
<span class="gu">@@ -133,7 +133,7 @@ static int ir_sony_decode(struct rc_dev </span>
 			function  = bitrev8((data-&gt;bits &gt;&gt;  4) &amp; 0xFE);
 			break;
 		case 15:
<span class="gd">-			if (!(dev-&gt;enabled_protocols &amp; RC_BIT_SONY15)) {</span>
<span class="gi">+			if (!rc_protocols_enabled(dev, RC_BIT_SONY15)) {</span>
 				data-&gt;state = STATE_INACTIVE;
 				return 0;
 			}
<span class="gu">@@ -142,7 +142,7 @@ static int ir_sony_decode(struct rc_dev </span>
 			function  = bitrev8((data-&gt;bits &gt;&gt;  7) &amp; 0xFE);
 			break;
 		case 20:
<span class="gd">-			if (!(dev-&gt;enabled_protocols &amp; RC_BIT_SONY20)) {</span>
<span class="gi">+			if (!rc_protocols_enabled(dev, RC_BIT_SONY20)) {</span>
 				data-&gt;state = STATE_INACTIVE;
 				return 0;
 			}
<span class="gd">--- a/drivers/media/rc/ite-cir.c</span>
<span class="gi">+++ b/drivers/media/rc/ite-cir.c</span>
<span class="gu">@@ -1563,7 +1563,7 @@ static int ite_probe(struct pnp_dev *pde</span>
 	/* set up ir-core props */
 	rdev-&gt;priv = itdev;
 	rdev-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_ALL);</span>
 	rdev-&gt;open = ite_open;
 	rdev-&gt;close = ite_close;
 	rdev-&gt;s_idle = ite_s_idle;
<span class="gd">--- a/drivers/media/rc/mceusb.c</span>
<span class="gi">+++ b/drivers/media/rc/mceusb.c</span>
<span class="gu">@@ -1217,7 +1217,7 @@ static struct rc_dev *mceusb_init_rc_dev</span>
 	rc-&gt;dev.parent = dev;
 	rc-&gt;priv = ir;
 	rc-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rc-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, RC_BIT_ALL);</span>
 	rc-&gt;timeout = MS_TO_NS(100);
 	if (!ir-&gt;flags.no_tx) {
 		rc-&gt;s_tx_mask = mceusb_set_tx_mask;
<span class="gd">--- a/drivers/media/rc/nuvoton-cir.c</span>
<span class="gi">+++ b/drivers/media/rc/nuvoton-cir.c</span>
<span class="gu">@@ -1042,7 +1042,7 @@ static int nvt_probe(struct pnp_dev *pde</span>
 	/* Set up the rc device */
 	rdev-&gt;priv = nvt;
 	rdev-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_ALL);</span>
 	rdev-&gt;open = nvt_open;
 	rdev-&gt;close = nvt_close;
 	rdev-&gt;tx_ir = nvt_tx_ir;
<span class="gd">--- a/drivers/media/rc/rc-loopback.c</span>
<span class="gi">+++ b/drivers/media/rc/rc-loopback.c</span>
<span class="gu">@@ -195,7 +195,7 @@ static int __init loop_init(void)</span>
 	rc-&gt;map_name		= RC_MAP_EMPTY;
 	rc-&gt;priv		= &amp;loopdev;
 	rc-&gt;driver_type		= RC_DRIVER_IR_RAW;
<span class="gd">-	rc-&gt;allowed_protos	= RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, RC_BIT_ALL);</span>
 	rc-&gt;timeout		= 100 * 1000 * 1000; /* 100 ms */
 	rc-&gt;min_timeout		= 1;
 	rc-&gt;max_timeout		= UINT_MAX;
<span class="gd">--- a/drivers/media/rc/rc-main.c</span>
<span class="gi">+++ b/drivers/media/rc/rc-main.c</span>
<span class="gu">@@ -633,6 +633,7 @@ EXPORT_SYMBOL_GPL(rc_repeat);</span>
 static void ir_do_keydown(struct rc_dev *dev, int scancode,
 			  u32 keycode, u8 toggle)
 {
<span class="gi">+	struct rc_scancode_filter *filter;</span>
 	bool new_event = !dev-&gt;keypressed ||
 			 dev-&gt;last_scancode != scancode ||
 			 dev-&gt;last_toggle != toggle;
<span class="gu">@@ -640,6 +641,11 @@ static void ir_do_keydown(struct rc_dev </span>
 	if (new_event &amp;&amp; dev-&gt;keypressed)
 		ir_do_keyup(dev, false);
 
<span class="gi">+	/* Generic scancode filtering */</span>
<span class="gi">+	filter = &amp;dev-&gt;scancode_filters[RC_FILTER_NORMAL];</span>
<span class="gi">+	if (filter-&gt;mask &amp;&amp; ((scancode ^ filter-&gt;data) &amp; filter-&gt;mask))</span>
<span class="gi">+		return;</span>
<span class="gi">+</span>
 	input_event(dev-&gt;input_dev, EV_MSC, MSC_SCAN, scancode);
 
 	if (new_event &amp;&amp; keycode != KEY_RESERVED) {
<span class="gu">@@ -795,13 +801,38 @@ static struct {</span>
 };
 
 /**
<span class="gd">- * show_protocols() - shows the current IR protocol(s)</span>
<span class="gi">+ * struct rc_filter_attribute - Device attribute relating to a filter type.</span>
<span class="gi">+ * @attr:	Device attribute.</span>
<span class="gi">+ * @type:	Filter type.</span>
<span class="gi">+ * @mask:	false for filter value, true for filter mask.</span>
<span class="gi">+ */</span>
<span class="gi">+struct rc_filter_attribute {</span>
<span class="gi">+	struct device_attribute		attr;</span>
<span class="gi">+	enum rc_filter_type		type;</span>
<span class="gi">+	bool				mask;</span>
<span class="gi">+};</span>
<span class="gi">+#define to_rc_filter_attr(a) container_of(a, struct rc_filter_attribute, attr)</span>
<span class="gi">+</span>
<span class="gi">+#define RC_PROTO_ATTR(_name, _mode, _show, _store, _type)		\</span>
<span class="gi">+	struct rc_filter_attribute dev_attr_##_name = {			\</span>
<span class="gi">+		.attr = __ATTR(_name, _mode, _show, _store),		\</span>
<span class="gi">+		.type = (_type),					\</span>
<span class="gi">+	}</span>
<span class="gi">+#define RC_FILTER_ATTR(_name, _mode, _show, _store, _type, _mask)	\</span>
<span class="gi">+	struct rc_filter_attribute dev_attr_##_name = {			\</span>
<span class="gi">+		.attr = __ATTR(_name, _mode, _show, _store),		\</span>
<span class="gi">+		.type = (_type),					\</span>
<span class="gi">+		.mask = (_mask),					\</span>
<span class="gi">+	}</span>
<span class="gi">+</span>
<span class="gi">+/**</span>
<span class="gi">+ * show_protocols() - shows the current/wakeup IR protocol(s)</span>
  * @device:	the device descriptor
  * @mattr:	the device attribute struct (unused)
  * @buf:	a pointer to the output buffer
  *
  * This routine is a callback routine for input read the IR protocol type(s).
<span class="gd">- * it is trigged by reading /sys/class/rc/rc?/protocols.</span>
<span class="gi">+ * it is trigged by reading /sys/class/rc/rc?/[wakeup_]protocols.</span>
  * It returns the protocol names of supported protocols.
  * Enabled protocols are printed in brackets.
  *
<span class="gu">@@ -812,6 +843,7 @@ static ssize_t show_protocols(struct dev</span>
 			      struct device_attribute *mattr, char *buf)
 {
 	struct rc_dev *dev = to_rc_dev(device);
<span class="gi">+	struct rc_filter_attribute *fattr = to_rc_filter_attr(mattr);</span>
 	u64 allowed, enabled;
 	char *tmp = buf;
 	int i;
<span class="gu">@@ -822,9 +854,10 @@ static ssize_t show_protocols(struct dev</span>
 
 	mutex_lock(&amp;dev-&gt;lock);
 
<span class="gd">-	enabled = dev-&gt;enabled_protocols;</span>
<span class="gd">-	if (dev-&gt;driver_type == RC_DRIVER_SCANCODE)</span>
<span class="gd">-		allowed = dev-&gt;allowed_protos;</span>
<span class="gi">+	enabled = dev-&gt;enabled_protocols[fattr-&gt;type];</span>
<span class="gi">+	if (dev-&gt;driver_type == RC_DRIVER_SCANCODE ||</span>
<span class="gi">+	    fattr-&gt;type == RC_FILTER_WAKEUP)</span>
<span class="gi">+		allowed = dev-&gt;allowed_protocols[fattr-&gt;type];</span>
 	else if (dev-&gt;raw)
 		allowed = ir_raw_get_allowed_protocols();
 	else {
<span class="gu">@@ -856,14 +889,14 @@ static ssize_t show_protocols(struct dev</span>
 }
 
 /**
<span class="gd">- * store_protocols() - changes the current IR protocol(s)</span>
<span class="gi">+ * store_protocols() - changes the current/wakeup IR protocol(s)</span>
  * @device:	the device descriptor
  * @mattr:	the device attribute struct (unused)
  * @buf:	a pointer to the input buffer
  * @len:	length of the input buffer
  *
  * This routine is for changing the IR protocol type.
<span class="gd">- * It is trigged by writing to /sys/class/rc/rc?/protocols.</span>
<span class="gi">+ * It is trigged by writing to /sys/class/rc/rc?/[wakeup_]protocols.</span>
  * Writing &quot;+proto&quot; will add a protocol to the list of enabled protocols.
  * Writing &quot;-proto&quot; will remove a protocol from the list of enabled protocols.
  * Writing &quot;proto&quot; will enable only &quot;proto&quot;.
<span class="gu">@@ -880,12 +913,15 @@ static ssize_t store_protocols(struct de</span>
 			       size_t len)
 {
 	struct rc_dev *dev = to_rc_dev(device);
<span class="gi">+	struct rc_filter_attribute *fattr = to_rc_filter_attr(mattr);</span>
 	bool enable, disable;
 	const char *tmp;
<span class="gd">-	u64 type;</span>
<span class="gi">+	u64 old_type, type;</span>
 	u64 mask;
 	int rc, i, count = 0;
 	ssize_t ret;
<span class="gi">+	int (*change_protocol)(struct rc_dev *dev, u64 *rc_type);</span>
<span class="gi">+	struct rc_scancode_filter local_filter, *filter;</span>
 
 	/* Device is being removed */
 	if (!dev)
<span class="gu">@@ -898,7 +934,8 @@ static ssize_t store_protocols(struct de</span>
 		ret = -EINVAL;
 		goto out;
 	}
<span class="gd">-	type = dev-&gt;enabled_protocols;</span>
<span class="gi">+	old_type = dev-&gt;enabled_protocols[fattr-&gt;type];</span>
<span class="gi">+	type = old_type;</span>
 
 	while ((tmp = strsep((char **) &amp;data, &quot; \n&quot;)) != NULL) {
 		if (!*tmp)
<span class="gu">@@ -946,8 +983,10 @@ static ssize_t store_protocols(struct de</span>
 		goto out;
 	}
 
<span class="gd">-	if (dev-&gt;change_protocol) {</span>
<span class="gd">-		rc = dev-&gt;change_protocol(dev, &amp;type);</span>
<span class="gi">+	change_protocol = (fattr-&gt;type == RC_FILTER_NORMAL)</span>
<span class="gi">+		? dev-&gt;change_protocol : dev-&gt;change_wakeup_protocol;</span>
<span class="gi">+	if (change_protocol) {</span>
<span class="gi">+		rc = change_protocol(dev, &amp;type);</span>
 		if (rc &lt; 0) {
 			IR_dprintk(1, &quot;Error setting protocols to 0x%llx\n&quot;,
 				   (long long)type);
<span class="gu">@@ -956,10 +995,40 @@ static ssize_t store_protocols(struct de</span>
 		}
 	}
 
<span class="gd">-	dev-&gt;enabled_protocols = type;</span>
<span class="gi">+	dev-&gt;enabled_protocols[fattr-&gt;type] = type;</span>
 	IR_dprintk(1, &quot;Current protocol(s): 0x%llx\n&quot;,
 		   (long long)type);
 
<span class="gi">+	/*</span>
<span class="gi">+	 * If the protocol is changed the filter needs updating.</span>
<span class="gi">+	 * Try setting the same filter with the new protocol (if any).</span>
<span class="gi">+	 * Fall back to clearing the filter.</span>
<span class="gi">+	 */</span>
<span class="gi">+	filter = &amp;dev-&gt;scancode_filters[fattr-&gt;type];</span>
<span class="gi">+	if (old_type != type &amp;&amp; filter-&gt;mask) {</span>
<span class="gi">+		local_filter = *filter;</span>
<span class="gi">+		if (!type) {</span>
<span class="gi">+			/* no protocol =&gt; clear filter */</span>
<span class="gi">+			ret = -1;</span>
<span class="gi">+		} else if (!dev-&gt;s_filter) {</span>
<span class="gi">+			/* generic filtering =&gt; accept any filter */</span>
<span class="gi">+			ret = 0;</span>
<span class="gi">+		} else {</span>
<span class="gi">+			/* hardware filtering =&gt; try setting, otherwise clear */</span>
<span class="gi">+			ret = dev-&gt;s_filter(dev, fattr-&gt;type, &amp;local_filter);</span>
<span class="gi">+		}</span>
<span class="gi">+		if (ret &lt; 0) {</span>
<span class="gi">+			/* clear the filter */</span>
<span class="gi">+			local_filter.data = 0;</span>
<span class="gi">+			local_filter.mask = 0;</span>
<span class="gi">+			if (dev-&gt;s_filter)</span>
<span class="gi">+				dev-&gt;s_filter(dev, fattr-&gt;type, &amp;local_filter);</span>
<span class="gi">+		}</span>
<span class="gi">+</span>
<span class="gi">+		/* commit the new filter */</span>
<span class="gi">+		*filter = local_filter;</span>
<span class="gi">+	}</span>
<span class="gi">+</span>
 	ret = len;
 
 out:
<span class="gu">@@ -967,6 +1036,115 @@ out:</span>
 	return ret;
 }
 
<span class="gi">+/**</span>
<span class="gi">+ * show_filter() - shows the current scancode filter value or mask</span>
<span class="gi">+ * @device:	the device descriptor</span>
<span class="gi">+ * @attr:	the device attribute struct</span>
<span class="gi">+ * @buf:	a pointer to the output buffer</span>
<span class="gi">+ *</span>
<span class="gi">+ * This routine is a callback routine to read a scancode filter value or mask.</span>
<span class="gi">+ * It is trigged by reading /sys/class/rc/rc?/[wakeup_]filter[_mask].</span>
<span class="gi">+ * It prints the current scancode filter value or mask of the appropriate filter</span>
<span class="gi">+ * type in hexadecimal into @buf and returns the size of the buffer.</span>
<span class="gi">+ *</span>
<span class="gi">+ * Bits of the filter value corresponding to set bits in the filter mask are</span>
<span class="gi">+ * compared against input scancodes and non-matching scancodes are discarded.</span>
<span class="gi">+ *</span>
<span class="gi">+ * dev-&gt;lock is taken to guard against races between device registration,</span>
<span class="gi">+ * store_filter and show_filter.</span>
<span class="gi">+ */</span>
<span class="gi">+static ssize_t show_filter(struct device *device,</span>
<span class="gi">+			   struct device_attribute *attr,</span>
<span class="gi">+			   char *buf)</span>
<span class="gi">+{</span>
<span class="gi">+	struct rc_dev *dev = to_rc_dev(device);</span>
<span class="gi">+	struct rc_filter_attribute *fattr = to_rc_filter_attr(attr);</span>
<span class="gi">+	u32 val;</span>
<span class="gi">+</span>
<span class="gi">+	/* Device is being removed */</span>
<span class="gi">+	if (!dev)</span>
<span class="gi">+		return -EINVAL;</span>
<span class="gi">+</span>
<span class="gi">+	mutex_lock(&amp;dev-&gt;lock);</span>
<span class="gi">+	if (fattr-&gt;mask)</span>
<span class="gi">+		val = dev-&gt;scancode_filters[fattr-&gt;type].mask;</span>
<span class="gi">+	else</span>
<span class="gi">+		val = dev-&gt;scancode_filters[fattr-&gt;type].data;</span>
<span class="gi">+	mutex_unlock(&amp;dev-&gt;lock);</span>
<span class="gi">+</span>
<span class="gi">+	return sprintf(buf, &quot;%#x\n&quot;, val);</span>
<span class="gi">+}</span>
<span class="gi">+</span>
<span class="gi">+/**</span>
<span class="gi">+ * store_filter() - changes the scancode filter value</span>
<span class="gi">+ * @device:	the device descriptor</span>
<span class="gi">+ * @attr:	the device attribute struct</span>
<span class="gi">+ * @buf:	a pointer to the input buffer</span>
<span class="gi">+ * @len:	length of the input buffer</span>
<span class="gi">+ *</span>
<span class="gi">+ * This routine is for changing a scancode filter value or mask.</span>
<span class="gi">+ * It is trigged by writing to /sys/class/rc/rc?/[wakeup_]filter[_mask].</span>
<span class="gi">+ * Returns -EINVAL if an invalid filter value for the current protocol was</span>
<span class="gi">+ * specified or if scancode filtering is not supported by the driver, otherwise</span>
<span class="gi">+ * returns @len.</span>
<span class="gi">+ *</span>
<span class="gi">+ * Bits of the filter value corresponding to set bits in the filter mask are</span>
<span class="gi">+ * compared against input scancodes and non-matching scancodes are discarded.</span>
<span class="gi">+ *</span>
<span class="gi">+ * dev-&gt;lock is taken to guard against races between device registration,</span>
<span class="gi">+ * store_filter and show_filter.</span>
<span class="gi">+ */</span>
<span class="gi">+static ssize_t store_filter(struct device *device,</span>
<span class="gi">+			    struct device_attribute *attr,</span>
<span class="gi">+			    const char *buf,</span>
<span class="gi">+			    size_t count)</span>
<span class="gi">+{</span>
<span class="gi">+	struct rc_dev *dev = to_rc_dev(device);</span>
<span class="gi">+	struct rc_filter_attribute *fattr = to_rc_filter_attr(attr);</span>
<span class="gi">+	struct rc_scancode_filter local_filter, *filter;</span>
<span class="gi">+	int ret;</span>
<span class="gi">+	unsigned long val;</span>
<span class="gi">+</span>
<span class="gi">+	/* Device is being removed */</span>
<span class="gi">+	if (!dev)</span>
<span class="gi">+		return -EINVAL;</span>
<span class="gi">+</span>
<span class="gi">+	ret = kstrtoul(buf, 0, &amp;val);</span>
<span class="gi">+	if (ret &lt; 0)</span>
<span class="gi">+		return ret;</span>
<span class="gi">+</span>
<span class="gi">+	/* Scancode filter not supported (but still accept 0) */</span>
<span class="gi">+	if (!dev-&gt;s_filter &amp;&amp; fattr-&gt;type != RC_FILTER_NORMAL)</span>
<span class="gi">+		return val ? -EINVAL : count;</span>
<span class="gi">+</span>
<span class="gi">+	mutex_lock(&amp;dev-&gt;lock);</span>
<span class="gi">+</span>
<span class="gi">+	/* Tell the driver about the new filter */</span>
<span class="gi">+	filter = &amp;dev-&gt;scancode_filters[fattr-&gt;type];</span>
<span class="gi">+	local_filter = *filter;</span>
<span class="gi">+	if (fattr-&gt;mask)</span>
<span class="gi">+		local_filter.mask = val;</span>
<span class="gi">+	else</span>
<span class="gi">+		local_filter.data = val;</span>
<span class="gi">+	if (!dev-&gt;enabled_protocols[fattr-&gt;type] &amp;&amp; local_filter.mask) {</span>
<span class="gi">+		/* refuse to set a filter unless a protocol is enabled */</span>
<span class="gi">+		ret = -EINVAL;</span>
<span class="gi">+		goto unlock;</span>
<span class="gi">+	}</span>
<span class="gi">+	if (dev-&gt;s_filter) {</span>
<span class="gi">+		ret = dev-&gt;s_filter(dev, fattr-&gt;type, &amp;local_filter);</span>
<span class="gi">+		if (ret &lt; 0)</span>
<span class="gi">+			goto unlock;</span>
<span class="gi">+	}</span>
<span class="gi">+</span>
<span class="gi">+	/* Success, commit the new filter */</span>
<span class="gi">+	*filter = local_filter;</span>
<span class="gi">+</span>
<span class="gi">+unlock:</span>
<span class="gi">+	mutex_unlock(&amp;dev-&gt;lock);</span>
<span class="gi">+	return (ret &lt; 0) ? ret : count;</span>
<span class="gi">+}</span>
<span class="gi">+</span>
 static void rc_dev_release(struct device *device)
 {
 }
<span class="gu">@@ -996,11 +1174,26 @@ static int rc_dev_uevent(struct device *</span>
 /*
  * Static device attribute struct with the sysfs attributes for IR&#39;s
  */
<span class="gd">-static DEVICE_ATTR(protocols, S_IRUGO | S_IWUSR,</span>
<span class="gd">-		   show_protocols, store_protocols);</span>
<span class="gi">+static RC_PROTO_ATTR(protocols, S_IRUGO | S_IWUSR,</span>
<span class="gi">+		     show_protocols, store_protocols, RC_FILTER_NORMAL);</span>
<span class="gi">+static RC_PROTO_ATTR(wakeup_protocols, S_IRUGO | S_IWUSR,</span>
<span class="gi">+		     show_protocols, store_protocols, RC_FILTER_WAKEUP);</span>
<span class="gi">+static RC_FILTER_ATTR(filter, S_IRUGO|S_IWUSR,</span>
<span class="gi">+		      show_filter, store_filter, RC_FILTER_NORMAL, false);</span>
<span class="gi">+static RC_FILTER_ATTR(filter_mask, S_IRUGO|S_IWUSR,</span>
<span class="gi">+		      show_filter, store_filter, RC_FILTER_NORMAL, true);</span>
<span class="gi">+static RC_FILTER_ATTR(wakeup_filter, S_IRUGO|S_IWUSR,</span>
<span class="gi">+		      show_filter, store_filter, RC_FILTER_WAKEUP, false);</span>
<span class="gi">+static RC_FILTER_ATTR(wakeup_filter_mask, S_IRUGO|S_IWUSR,</span>
<span class="gi">+		      show_filter, store_filter, RC_FILTER_WAKEUP, true);</span>
 
 static struct attribute *rc_dev_attrs[] = {
<span class="gd">-	&amp;dev_attr_protocols.attr,</span>
<span class="gi">+	&amp;dev_attr_protocols.attr.attr,</span>
<span class="gi">+	&amp;dev_attr_wakeup_protocols.attr.attr,</span>
<span class="gi">+	&amp;dev_attr_filter.attr.attr,</span>
<span class="gi">+	&amp;dev_attr_filter_mask.attr.attr,</span>
<span class="gi">+	&amp;dev_attr_wakeup_filter.attr.attr,</span>
<span class="gi">+	&amp;dev_attr_wakeup_filter_mask.attr.attr,</span>
 	NULL,
 };
 
<span class="gu">@@ -1091,14 +1284,6 @@ int rc_register_device(struct rc_dev *de</span>
 	if (dev-&gt;close)
 		dev-&gt;input_dev-&gt;close = ir_close;
 
<span class="gd">-	/*</span>
<span class="gd">-	 * Take the lock here, as the device sysfs node will appear</span>
<span class="gd">-	 * when device_add() is called, which may trigger an ir-keytable udev</span>
<span class="gd">-	 * rule, which will in turn call show_protocols and access</span>
<span class="gd">-	 * dev-&gt;enabled_protocols before it has been initialized.</span>
<span class="gd">-	 */</span>
<span class="gd">-	mutex_lock(&amp;dev-&gt;lock);</span>
<span class="gd">-</span>
 	do {
 		devno = find_first_zero_bit(ir_core_dev_number,
 					    IRRCV_NUM_DEVICES);
<span class="gu">@@ -1107,6 +1292,14 @@ int rc_register_device(struct rc_dev *de</span>
 			return -ENOMEM;
 	} while (test_and_set_bit(devno, ir_core_dev_number));
 
<span class="gi">+	/*</span>
<span class="gi">+	 * Take the lock here, as the device sysfs node will appear</span>
<span class="gi">+	 * when device_add() is called, which may trigger an ir-keytable udev</span>
<span class="gi">+	 * rule, which will in turn call show_protocols and access</span>
<span class="gi">+	 * dev-&gt;enabled_protocols before it has been initialized.</span>
<span class="gi">+	 */</span>
<span class="gi">+	mutex_lock(&amp;dev-&gt;lock);</span>
<span class="gi">+</span>
 	dev-&gt;devno = devno;
 	dev_set_name(&amp;dev-&gt;dev, &quot;rc%ld&quot;, dev-&gt;devno);
 	dev_set_drvdata(&amp;dev-&gt;dev, dev);
<span class="gu">@@ -1172,7 +1365,7 @@ int rc_register_device(struct rc_dev *de</span>
 		rc = dev-&gt;change_protocol(dev, &amp;rc_type);
 		if (rc &lt; 0)
 			goto out_raw;
<span class="gd">-		dev-&gt;enabled_protocols = rc_type;</span>
<span class="gi">+		dev-&gt;enabled_protocols[RC_FILTER_NORMAL] = rc_type;</span>
 	}
 
 	mutex_unlock(&amp;dev-&gt;lock);
<span class="gd">--- a/drivers/media/rc/redrat3.c</span>
<span class="gi">+++ b/drivers/media/rc/redrat3.c</span>
<span class="gu">@@ -922,7 +922,7 @@ static struct rc_dev *redrat3_init_rc_de</span>
 	rc-&gt;dev.parent = dev;
 	rc-&gt;priv = rr3;
 	rc-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rc-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, RC_BIT_ALL);</span>
 	rc-&gt;timeout = US_TO_NS(2750);
 	rc-&gt;tx_ir = redrat3_transmit_ir;
 	rc-&gt;s_tx_carrier = redrat3_set_tx_carrier;
<span class="gd">--- a/drivers/media/rc/st_rc.c</span>
<span class="gi">+++ b/drivers/media/rc/st_rc.c</span>
<span class="gu">@@ -287,7 +287,7 @@ static int st_rc_probe(struct platform_d</span>
 	st_rc_hardware_init(rc_dev);
 
 	rdev-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_ALL);</span>
 	/* rx sampling rate is 10Mhz */
 	rdev-&gt;rx_resolution = 100;
 	rdev-&gt;timeout = US_TO_NS(MAX_SYMB_TIME);
<span class="gd">--- a/drivers/media/rc/streamzap.c</span>
<span class="gi">+++ b/drivers/media/rc/streamzap.c</span>
<span class="gu">@@ -322,7 +322,7 @@ static struct rc_dev *streamzap_init_rc_</span>
 	rdev-&gt;dev.parent = dev;
 	rdev-&gt;priv = sz;
 	rdev-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rdev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rdev, RC_BIT_ALL);</span>
 	rdev-&gt;driver_name = DRIVER_NAME;
 	rdev-&gt;map_name = RC_MAP_STREAMZAP;
 
<span class="gd">--- a/drivers/media/rc/ttusbir.c</span>
<span class="gi">+++ b/drivers/media/rc/ttusbir.c</span>
<span class="gu">@@ -318,7 +318,7 @@ static int ttusbir_probe(struct usb_inte</span>
 	usb_to_input_id(tt-&gt;udev, &amp;rc-&gt;input_id);
 	rc-&gt;dev.parent = &amp;intf-&gt;dev;
 	rc-&gt;driver_type = RC_DRIVER_IR_RAW;
<span class="gd">-	rc-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, RC_BIT_ALL);</span>
 	rc-&gt;priv = tt;
 	rc-&gt;driver_name = DRIVER_NAME;
 	rc-&gt;map_name = RC_MAP_TT_1500;
<span class="gd">--- a/drivers/media/rc/winbond-cir.c</span>
<span class="gi">+++ b/drivers/media/rc/winbond-cir.c</span>
<span class="gu">@@ -1082,7 +1082,7 @@ wbcir_probe(struct pnp_dev *device, cons</span>
 	data-&gt;dev-&gt;dev.parent = &amp;device-&gt;dev;
 	data-&gt;dev-&gt;timeout = MS_TO_NS(100);
 	data-&gt;dev-&gt;rx_resolution = US_TO_NS(2);
<span class="gd">-	data-&gt;dev-&gt;allowed_protos = RC_BIT_ALL;</span>
<span class="gi">+	rc_set_allowed_protocols(data-&gt;dev, RC_BIT_ALL);</span>
 
 	err = rc_register_device(data-&gt;dev);
 	if (err)
<span class="gd">--- a/drivers/media/usb/dvb-usb/dvb-usb-remote.c</span>
<span class="gi">+++ b/drivers/media/usb/dvb-usb/dvb-usb-remote.c</span>
<span class="gu">@@ -272,7 +272,7 @@ static int rc_core_dvb_usb_remote_init(s</span>
 	dev-&gt;driver_name = d-&gt;props.rc.core.module_name;
 	dev-&gt;map_name = d-&gt;props.rc.core.rc_codes;
 	dev-&gt;change_protocol = d-&gt;props.rc.core.change_protocol;
<span class="gd">-	dev-&gt;allowed_protos = d-&gt;props.rc.core.allowed_protos;</span>
<span class="gi">+	rc_set_allowed_protocols(dev, d-&gt;props.rc.core.allowed_protos);</span>
 	dev-&gt;driver_type = d-&gt;props.rc.core.driver_type;
 	usb_to_input_id(d-&gt;udev, &amp;dev-&gt;input_id);
 	dev-&gt;input_name = &quot;IR-receiver inside an USB DVB receiver&quot;;
<span class="gd">--- a/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c</span>
<span class="gi">+++ b/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c</span>
<span class="gu">@@ -164,7 +164,7 @@ static int dvb_usbv2_remote_init(struct </span>
 	dev-&gt;driver_name = (char *) d-&gt;props-&gt;driver_name;
 	dev-&gt;map_name = d-&gt;rc.map_name;
 	dev-&gt;driver_type = d-&gt;rc.driver_type;
<span class="gd">-	dev-&gt;allowed_protos = d-&gt;rc.allowed_protos;</span>
<span class="gi">+	rc_set_allowed_protocols(dev, d-&gt;rc.allowed_protos);</span>
 	dev-&gt;change_protocol = d-&gt;rc.change_protocol;
 	dev-&gt;priv = d;
 
<span class="gd">--- a/drivers/media/usb/em28xx/em28xx-input.c</span>
<span class="gi">+++ b/drivers/media/usb/em28xx/em28xx-input.c</span>
<span class="gu">@@ -725,7 +725,7 @@ static int em28xx_ir_init(struct em28xx </span>
 		case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
 			rc-&gt;map_name = RC_MAP_HAUPPAUGE;
 			ir-&gt;get_key_i2c = em28xx_get_key_em_haup;
<span class="gd">-			rc-&gt;allowed_protos = RC_BIT_RC5;</span>
<span class="gi">+			rc_set_allowed_protocols(rc, RC_BIT_RC5);</span>
 			break;
 		case EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE:
 			rc-&gt;map_name = RC_MAP_WINFAST_USBII_DELUXE;
<span class="gu">@@ -741,7 +741,7 @@ static int em28xx_ir_init(struct em28xx </span>
 		switch (dev-&gt;chip_id) {
 		case CHIP_ID_EM2860:
 		case CHIP_ID_EM2883:
<span class="gd">-			rc-&gt;allowed_protos = RC_BIT_RC5 | RC_BIT_NEC;</span>
<span class="gi">+			rc_set_allowed_protocols(rc, RC_BIT_RC5 | RC_BIT_NEC);</span>
 			ir-&gt;get_key = default_polling_getkey;
 			break;
 		case CHIP_ID_EM2884:
<span class="gu">@@ -749,8 +749,8 @@ static int em28xx_ir_init(struct em28xx </span>
 		case CHIP_ID_EM28174:
 		case CHIP_ID_EM28178:
 			ir-&gt;get_key = em2874_polling_getkey;
<span class="gd">-			rc-&gt;allowed_protos = RC_BIT_RC5 | RC_BIT_NEC |</span>
<span class="gd">-					     RC_BIT_RC6_0;</span>
<span class="gi">+			rc_set_allowed_protocols(rc, RC_BIT_RC5 | RC_BIT_NEC |</span>
<span class="gi">+						 RC_BIT_RC6_0);</span>
 			break;
 		default:
 			err = -ENODEV;
<span class="gd">--- a/drivers/media/usb/tm6000/tm6000-input.c</span>
<span class="gi">+++ b/drivers/media/usb/tm6000/tm6000-input.c</span>
<span class="gu">@@ -422,7 +422,7 @@ int tm6000_ir_init(struct tm6000_core *d</span>
 	ir-&gt;rc = rc;
 
 	/* input setup */
<span class="gd">-	rc-&gt;allowed_protos = RC_BIT_RC5 | RC_BIT_NEC;</span>
<span class="gi">+	rc_set_allowed_protocols(rc, RC_BIT_RC5 | RC_BIT_NEC);</span>
 	/* Neded, in order to support NEC remotes with 24 or 32 bits */
 	rc-&gt;scanmask = 0xffff;
 	rc-&gt;priv = ir;
<span class="gd">--- a/include/media/rc-core.h</span>
<span class="gi">+++ b/include/media/rc-core.h</span>
<span class="gu">@@ -35,6 +35,29 @@ enum rc_driver_type {</span>
 };
 
 /**
<span class="gi">+ * struct rc_scancode_filter - Filter scan codes.</span>
<span class="gi">+ * @data:	Scancode data to match.</span>
<span class="gi">+ * @mask:	Mask of bits of scancode to compare.</span>
<span class="gi">+ */</span>
<span class="gi">+struct rc_scancode_filter {</span>
<span class="gi">+	u32 data;</span>
<span class="gi">+	u32 mask;</span>
<span class="gi">+};</span>
<span class="gi">+</span>
<span class="gi">+/**</span>
<span class="gi">+ * enum rc_filter_type - Filter type constants.</span>
<span class="gi">+ * @RC_FILTER_NORMAL:	Filter for normal operation.</span>
<span class="gi">+ * @RC_FILTER_WAKEUP:	Filter for waking from suspend.</span>
<span class="gi">+ * @RC_FILTER_MAX:	Number of filter types.</span>
<span class="gi">+ */</span>
<span class="gi">+enum rc_filter_type {</span>
<span class="gi">+	RC_FILTER_NORMAL = 0,</span>
<span class="gi">+	RC_FILTER_WAKEUP,</span>
<span class="gi">+</span>
<span class="gi">+	RC_FILTER_MAX</span>
<span class="gi">+};</span>
<span class="gi">+</span>
<span class="gi">+/**</span>
  * struct rc_dev - represents a remote control device
  * @dev: driver model&#39;s view of this device
  * @input_name: name of the input child device
<span class="gu">@@ -50,8 +73,10 @@ enum rc_driver_type {</span>
  * @input_dev: the input child device used to communicate events to userspace
  * @driver_type: specifies if protocol decoding is done in hardware or software
  * @idle: used to keep track of RX state
<span class="gd">- * @allowed_protos: bitmask with the supported RC_BIT_* protocols</span>
<span class="gd">- * @enabled_protocols: bitmask with the enabled RC_BIT_* protocols</span>
<span class="gi">+ * @allowed_protocols: bitmask with the supported RC_BIT_* protocols for each</span>
<span class="gi">+ *	filter type</span>
<span class="gi">+ * @enabled_protocols: bitmask with the enabled RC_BIT_* protocols for each</span>
<span class="gi">+ *	filter type</span>
  * @scanmask: some hardware decoders are not capable of providing the full
  *	scancode to the application. As this is a hardware limit, we can&#39;t do
  *	anything with it. Yet, as the same keycode table can be used with other
<span class="gu">@@ -70,7 +95,10 @@ enum rc_driver_type {</span>
  * @max_timeout: maximum timeout supported by device
  * @rx_resolution : resolution (in ns) of input sampler
  * @tx_resolution: resolution (in ns) of output sampler
<span class="gi">+ * @scancode_filters: scancode filters (indexed by enum rc_filter_type)</span>
  * @change_protocol: allow changing the protocol used on hardware decoders
<span class="gi">+ * @change_wakeup_protocol: allow changing the protocol used for wakeup</span>
<span class="gi">+ *	filtering</span>
  * @open: callback to allow drivers to enable polling/irq when IR input device
  *	is opened.
  * @close: callback to allow drivers to disable polling/irq when IR input device
<span class="gu">@@ -84,6 +112,7 @@ enum rc_driver_type {</span>
  *	device doesn&#39;t interrupt host until it sees IR pulses
  * @s_learning_mode: enable wide band receiver used for learning
  * @s_carrier_report: enable carrier reports
<span class="gi">+ * @s_filter: set the scancode filter of a given type</span>
  */
 struct rc_dev {
 	struct device			dev;
<span class="gu">@@ -99,8 +128,8 @@ struct rc_dev {</span>
 	struct input_dev		*input_dev;
 	enum rc_driver_type		driver_type;
 	bool				idle;
<span class="gd">-	u64				allowed_protos;</span>
<span class="gd">-	u64				enabled_protocols;</span>
<span class="gi">+	u64				allowed_protocols[RC_FILTER_MAX];</span>
<span class="gi">+	u64				enabled_protocols[RC_FILTER_MAX];</span>
 	u32				users;
 	u32				scanmask;
 	void				*priv;
<span class="gu">@@ -116,7 +145,9 @@ struct rc_dev {</span>
 	u32				max_timeout;
 	u32				rx_resolution;
 	u32				tx_resolution;
<span class="gi">+	struct rc_scancode_filter	scancode_filters[RC_FILTER_MAX];</span>
 	int				(*change_protocol)(struct rc_dev *dev, u64 *rc_type);
<span class="gi">+	int				(*change_wakeup_protocol)(struct rc_dev *dev, u64 *rc_type);</span>
 	int				(*open)(struct rc_dev *dev);
 	void				(*close)(struct rc_dev *dev);
 	int				(*s_tx_mask)(struct rc_dev *dev, u32 mask);
<span class="gu">@@ -127,10 +158,49 @@ struct rc_dev {</span>
 	void				(*s_idle)(struct rc_dev *dev, bool enable);
 	int				(*s_learning_mode)(struct rc_dev *dev, int enable);
 	int				(*s_carrier_report) (struct rc_dev *dev, int enable);
<span class="gi">+	int				(*s_filter)(struct rc_dev *dev,</span>
<span class="gi">+						    enum rc_filter_type type,</span>
<span class="gi">+						    struct rc_scancode_filter *filter);</span>
 };
 
 #define to_rc_dev(d) container_of(d, struct rc_dev, dev)
 
<span class="gi">+static inline bool rc_protocols_allowed(struct rc_dev *rdev, u64 protos)</span>
<span class="gi">+{</span>
<span class="gi">+	return rdev-&gt;allowed_protocols[RC_FILTER_NORMAL] &amp; protos;</span>
<span class="gi">+}</span>
<span class="gi">+</span>
<span class="gi">+/* should be called prior to registration or with mutex held */</span>
<span class="gi">+static inline void rc_set_allowed_protocols(struct rc_dev *rdev, u64 protos)</span>
<span class="gi">+{</span>
<span class="gi">+	rdev-&gt;allowed_protocols[RC_FILTER_NORMAL] = protos;</span>
<span class="gi">+}</span>
<span class="gi">+</span>
<span class="gi">+static inline bool rc_protocols_enabled(struct rc_dev *rdev, u64 protos)</span>
<span class="gi">+{</span>
<span class="gi">+	return rdev-&gt;enabled_protocols[RC_FILTER_NORMAL] &amp; protos;</span>
<span class="gi">+}</span>
<span class="gi">+</span>
<span class="gi">+/* should be called prior to registration or with mutex held */</span>
<span class="gi">+static inline void rc_set_enabled_protocols(struct rc_dev *rdev, u64 protos)</span>
<span class="gi">+{</span>
<span class="gi">+	rdev-&gt;enabled_protocols[RC_FILTER_NORMAL] = protos;</span>
<span class="gi">+}</span>
<span class="gi">+</span>
<span class="gi">+/* should be called prior to registration or with mutex held */</span>
<span class="gi">+static inline void rc_set_allowed_wakeup_protocols(struct rc_dev *rdev,</span>
<span class="gi">+						   u64 protos)</span>
<span class="gi">+{</span>
<span class="gi">+	rdev-&gt;allowed_protocols[RC_FILTER_WAKEUP] = protos;</span>
<span class="gi">+}</span>
<span class="gi">+</span>
<span class="gi">+/* should be called prior to registration or with mutex held */</span>
<span class="gi">+static inline void rc_set_enabled_wakeup_protocols(struct rc_dev *rdev,</span>
<span class="gi">+						   u64 protos)</span>
<span class="gi">+{</span>
<span class="gi">+	rdev-&gt;enabled_protocols[RC_FILTER_WAKEUP] = protos;</span>
<span class="gi">+}</span>
<span class="gi">+</span>
 /*
  * From rc-main.c
  * Those functions can be used on any type of Remote Controller. They
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2025-10-04 03:51:41 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
