1
0
Эх сурвалжийг харах

deploy: 9952f38afbeabf30de99d21e55e8dff0711eb1f5

jserv 1 жил өмнө
parent
commit
4c6ef1b34a
2 өөрчлөгдсөн 136 нэмэгдсэн , 132 устгасан
  1. 68 66
      index.html
  2. 68 66
      lkmpg-for-ht.html

+ 68 - 66
index.html

@@ -5527,74 +5527,76 @@ halves, but using threads.
 <a id='x1-60163r79'></a><span class='ecrm-0500'>79</span> 
 <a id='x1-60165r80'></a><span class='ecrm-0500'>80</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2871'><span class='ectt-0800'>"Successfully requested BUTTON1 IRQ # %d</span></span><span id='textcolor2872'><span class='ectt-0800'>\n</span></span><span id='textcolor2873'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, button_irqs[0]);</span> 
 <a id='x1-60167r81'></a><span class='ecrm-0500'>81</span> 
-<a id='x1-60169r82'></a><span class='ecrm-0500'>82</span><span class='ectt-0800'>    ret = request_threaded_irq(</span> 
-<a id='x1-60171r83'></a><span class='ecrm-0500'>83</span><span class='ectt-0800'>        button_irqs[0], button_top_half, button_bottom_half,</span> 
-<a id='x1-60173r84'></a><span class='ecrm-0500'>84</span><span class='ectt-0800'>        IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, </span><span id='textcolor2874'><span class='ectt-0800'>"gpiomod#button1"</span></span><span class='ectt-0800'>, &amp;buttons[0]);</span> 
-<a id='x1-60175r85'></a><span class='ecrm-0500'>85</span> 
-<a id='x1-60177r86'></a><span class='ecrm-0500'>86</span><span class='ectt-0800'>    </span><span id='textcolor2875'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
-<a id='x1-60179r87'></a><span class='ecrm-0500'>87</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2876'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2877'><span class='ectt-0800'>\n</span></span><span id='textcolor2878'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
-<a id='x1-60181r88'></a><span class='ecrm-0500'>88</span><span class='ectt-0800'>        </span><span id='textcolor2879'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
-<a id='x1-60183r89'></a><span class='ecrm-0500'>89</span><span class='ectt-0800'>    }</span> 
-<a id='x1-60185r90'></a><span class='ecrm-0500'>90</span> 
-<a id='x1-60187r91'></a><span class='ecrm-0500'>91</span><span class='ectt-0800'>    ret = gpio_to_irq(buttons[1].gpio);</span> 
-<a id='x1-60189r92'></a><span class='ecrm-0500'>92</span> 
-<a id='x1-60191r93'></a><span class='ecrm-0500'>93</span><span class='ectt-0800'>    </span><span id='textcolor2880'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret &lt; 0) {</span> 
-<a id='x1-60193r94'></a><span class='ecrm-0500'>94</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2881'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2882'><span class='ectt-0800'>\n</span></span><span id='textcolor2883'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
-<a id='x1-60195r95'></a><span class='ecrm-0500'>95</span><span class='ectt-0800'>        </span><span id='textcolor2884'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
-<a id='x1-60197r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'>    }</span> 
-<a id='x1-60199r97'></a><span class='ecrm-0500'>97</span> 
-<a id='x1-60201r98'></a><span class='ecrm-0500'>98</span><span class='ectt-0800'>    button_irqs[1] = ret;</span> 
-<a id='x1-60203r99'></a><span class='ecrm-0500'>99</span> 
-<a id='x1-60205r100'></a><span class='ecrm-0500'>100</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2885'><span class='ectt-0800'>"Successfully requested BUTTON2 IRQ # %d</span></span><span id='textcolor2886'><span class='ectt-0800'>\n</span></span><span id='textcolor2887'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, button_irqs[1]);</span> 
-<a id='x1-60207r101'></a><span class='ecrm-0500'>101</span> 
-<a id='x1-60209r102'></a><span class='ecrm-0500'>102</span><span class='ectt-0800'>    ret = request_threaded_irq(</span> 
-<a id='x1-60211r103'></a><span class='ecrm-0500'>103</span><span class='ectt-0800'>        button_irqs[1], button_top_half, button_bottom_half,</span> 
-<a id='x1-60213r104'></a><span class='ecrm-0500'>104</span><span class='ectt-0800'>        IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, </span><span id='textcolor2888'><span class='ectt-0800'>"gpiomod#button2"</span></span><span class='ectt-0800'>, &amp;buttons[1]);</span> 
-<a id='x1-60215r105'></a><span class='ecrm-0500'>105</span> 
-<a id='x1-60217r106'></a><span class='ecrm-0500'>106</span><span class='ectt-0800'>    </span><span id='textcolor2889'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
-<a id='x1-60219r107'></a><span class='ecrm-0500'>107</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2890'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2891'><span class='ectt-0800'>\n</span></span><span id='textcolor2892'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
-<a id='x1-60221r108'></a><span class='ecrm-0500'>108</span><span class='ectt-0800'>        </span><span id='textcolor2893'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail3;</span> 
-<a id='x1-60223r109'></a><span class='ecrm-0500'>109</span><span class='ectt-0800'>    }</span> 
-<a id='x1-60225r110'></a><span class='ecrm-0500'>110</span> 
-<a id='x1-60227r111'></a><span class='ecrm-0500'>111</span><span class='ectt-0800'>    </span><span id='textcolor2894'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span> 
+<a id='x1-60169r82'></a><span class='ecrm-0500'>82</span><span class='ectt-0800'>    ret = request_threaded_irq(button_irqs[0], button_top_half,</span> 
+<a id='x1-60171r83'></a><span class='ecrm-0500'>83</span><span class='ectt-0800'>                               button_bottom_half,</span> 
+<a id='x1-60173r84'></a><span class='ecrm-0500'>84</span><span class='ectt-0800'>                               IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,</span> 
+<a id='x1-60175r85'></a><span class='ecrm-0500'>85</span><span class='ectt-0800'>                               </span><span id='textcolor2874'><span class='ectt-0800'>"gpiomod#button1"</span></span><span class='ectt-0800'>, &amp;buttons[0]);</span> 
+<a id='x1-60177r86'></a><span class='ecrm-0500'>86</span> 
+<a id='x1-60179r87'></a><span class='ecrm-0500'>87</span><span class='ectt-0800'>    </span><span id='textcolor2875'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
+<a id='x1-60181r88'></a><span class='ecrm-0500'>88</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2876'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2877'><span class='ectt-0800'>\n</span></span><span id='textcolor2878'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
+<a id='x1-60183r89'></a><span class='ecrm-0500'>89</span><span class='ectt-0800'>        </span><span id='textcolor2879'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
+<a id='x1-60185r90'></a><span class='ecrm-0500'>90</span><span class='ectt-0800'>    }</span> 
+<a id='x1-60187r91'></a><span class='ecrm-0500'>91</span> 
+<a id='x1-60189r92'></a><span class='ecrm-0500'>92</span><span class='ectt-0800'>    ret = gpio_to_irq(buttons[1].gpio);</span> 
+<a id='x1-60191r93'></a><span class='ecrm-0500'>93</span> 
+<a id='x1-60193r94'></a><span class='ecrm-0500'>94</span><span class='ectt-0800'>    </span><span id='textcolor2880'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret &lt; 0) {</span> 
+<a id='x1-60195r95'></a><span class='ecrm-0500'>95</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2881'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2882'><span class='ectt-0800'>\n</span></span><span id='textcolor2883'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
+<a id='x1-60197r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'>        </span><span id='textcolor2884'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
+<a id='x1-60199r97'></a><span class='ecrm-0500'>97</span><span class='ectt-0800'>    }</span> 
+<a id='x1-60201r98'></a><span class='ecrm-0500'>98</span> 
+<a id='x1-60203r99'></a><span class='ecrm-0500'>99</span><span class='ectt-0800'>    button_irqs[1] = ret;</span> 
+<a id='x1-60205r100'></a><span class='ecrm-0500'>100</span> 
+<a id='x1-60207r101'></a><span class='ecrm-0500'>101</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2885'><span class='ectt-0800'>"Successfully requested BUTTON2 IRQ # %d</span></span><span id='textcolor2886'><span class='ectt-0800'>\n</span></span><span id='textcolor2887'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, button_irqs[1]);</span> 
+<a id='x1-60209r102'></a><span class='ecrm-0500'>102</span> 
+<a id='x1-60211r103'></a><span class='ecrm-0500'>103</span><span class='ectt-0800'>    ret = request_threaded_irq(button_irqs[1], button_top_half,</span> 
+<a id='x1-60213r104'></a><span class='ecrm-0500'>104</span><span class='ectt-0800'>                               button_bottom_half,</span> 
+<a id='x1-60215r105'></a><span class='ecrm-0500'>105</span><span class='ectt-0800'>                               IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,</span> 
+<a id='x1-60217r106'></a><span class='ecrm-0500'>106</span><span class='ectt-0800'>                               </span><span id='textcolor2888'><span class='ectt-0800'>"gpiomod#button2"</span></span><span class='ectt-0800'>, &amp;buttons[1]);</span> 
+<a id='x1-60219r107'></a><span class='ecrm-0500'>107</span> 
+<a id='x1-60221r108'></a><span class='ecrm-0500'>108</span><span class='ectt-0800'>    </span><span id='textcolor2889'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
+<a id='x1-60223r109'></a><span class='ecrm-0500'>109</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2890'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2891'><span class='ectt-0800'>\n</span></span><span id='textcolor2892'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
+<a id='x1-60225r110'></a><span class='ecrm-0500'>110</span><span class='ectt-0800'>        </span><span id='textcolor2893'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail3;</span> 
+<a id='x1-60227r111'></a><span class='ecrm-0500'>111</span><span class='ectt-0800'>    }</span> 
 <a id='x1-60229r112'></a><span class='ecrm-0500'>112</span> 
-<a id='x1-60231r113'></a><span class='ecrm-0500'>113</span><span id='textcolor2895'><span class='ectt-0800'>/* cleanup what has been setup so far */</span></span> 
-<a id='x1-60233r114'></a><span class='ecrm-0500'>114</span><span class='ectt-0800'>fail3:</span> 
-<a id='x1-60235r115'></a><span class='ecrm-0500'>115</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
-<a id='x1-60237r116'></a><span class='ecrm-0500'>116</span> 
-<a id='x1-60239r117'></a><span class='ecrm-0500'>117</span><span class='ectt-0800'>fail2:</span> 
-<a id='x1-60241r118'></a><span class='ecrm-0500'>118</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(leds));</span> 
-<a id='x1-60243r119'></a><span class='ecrm-0500'>119</span> 
-<a id='x1-60245r120'></a><span class='ecrm-0500'>120</span><span class='ectt-0800'>fail1:</span> 
-<a id='x1-60247r121'></a><span class='ecrm-0500'>121</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
-<a id='x1-60249r122'></a><span class='ecrm-0500'>122</span> 
-<a id='x1-60251r123'></a><span class='ecrm-0500'>123</span><span class='ectt-0800'>    </span><span id='textcolor2896'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> ret;</span> 
-<a id='x1-60253r124'></a><span class='ecrm-0500'>124</span><span class='ectt-0800'>}</span> 
-<a id='x1-60255r125'></a><span class='ecrm-0500'>125</span> 
-<a id='x1-60257r126'></a><span class='ecrm-0500'>126</span><span id='textcolor2897'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor2898'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit bottomhalf_exit(</span><span id='textcolor2899'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span> 
-<a id='x1-60259r127'></a><span class='ecrm-0500'>127</span><span class='ectt-0800'>{</span> 
-<a id='x1-60261r128'></a><span class='ecrm-0500'>128</span><span class='ectt-0800'>    </span><span id='textcolor2900'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> i;</span> 
-<a id='x1-60263r129'></a><span class='ecrm-0500'>129</span> 
-<a id='x1-60265r130'></a><span class='ecrm-0500'>130</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2901'><span class='ectt-0800'>"%s</span></span><span id='textcolor2902'><span class='ectt-0800'>\n</span></span><span id='textcolor2903'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, __func__);</span> 
+<a id='x1-60231r113'></a><span class='ecrm-0500'>113</span><span class='ectt-0800'>    </span><span id='textcolor2894'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span> 
+<a id='x1-60233r114'></a><span class='ecrm-0500'>114</span> 
+<a id='x1-60235r115'></a><span class='ecrm-0500'>115</span><span id='textcolor2895'><span class='ectt-0800'>/* cleanup what has been setup so far */</span></span> 
+<a id='x1-60237r116'></a><span class='ecrm-0500'>116</span><span class='ectt-0800'>fail3:</span> 
+<a id='x1-60239r117'></a><span class='ecrm-0500'>117</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
+<a id='x1-60241r118'></a><span class='ecrm-0500'>118</span> 
+<a id='x1-60243r119'></a><span class='ecrm-0500'>119</span><span class='ectt-0800'>fail2:</span> 
+<a id='x1-60245r120'></a><span class='ecrm-0500'>120</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(leds));</span> 
+<a id='x1-60247r121'></a><span class='ecrm-0500'>121</span> 
+<a id='x1-60249r122'></a><span class='ecrm-0500'>122</span><span class='ectt-0800'>fail1:</span> 
+<a id='x1-60251r123'></a><span class='ecrm-0500'>123</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
+<a id='x1-60253r124'></a><span class='ecrm-0500'>124</span> 
+<a id='x1-60255r125'></a><span class='ecrm-0500'>125</span><span class='ectt-0800'>    </span><span id='textcolor2896'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> ret;</span> 
+<a id='x1-60257r126'></a><span class='ecrm-0500'>126</span><span class='ectt-0800'>}</span> 
+<a id='x1-60259r127'></a><span class='ecrm-0500'>127</span> 
+<a id='x1-60261r128'></a><span class='ecrm-0500'>128</span><span id='textcolor2897'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor2898'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit bottomhalf_exit(</span><span id='textcolor2899'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span> 
+<a id='x1-60263r129'></a><span class='ecrm-0500'>129</span><span class='ectt-0800'>{</span> 
+<a id='x1-60265r130'></a><span class='ecrm-0500'>130</span><span class='ectt-0800'>    </span><span id='textcolor2900'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> i;</span> 
 <a id='x1-60267r131'></a><span class='ecrm-0500'>131</span> 
-<a id='x1-60269r132'></a><span class='ecrm-0500'>132</span><span class='ectt-0800'>    </span><span id='textcolor2904'><span class='ectt-0800'>/* free irqs */</span></span> 
-<a id='x1-60271r133'></a><span class='ecrm-0500'>133</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
-<a id='x1-60273r134'></a><span class='ecrm-0500'>134</span><span class='ectt-0800'>    free_irq(button_irqs[1], NULL);</span> 
-<a id='x1-60275r135'></a><span class='ecrm-0500'>135</span> 
-<a id='x1-60277r136'></a><span class='ecrm-0500'>136</span><span class='ectt-0800'>    </span><span id='textcolor2905'><span class='ectt-0800'>/* turn all LEDs off */</span></span> 
-<a id='x1-60279r137'></a><span class='ecrm-0500'>137</span><span class='ectt-0800'>    </span><span id='textcolor2906'><span class='ectt-0800'>for</span></span><span class='ectt-0800'> (i = 0; i &lt; ARRAY_SIZE(leds); i++)</span> 
-<a id='x1-60281r138'></a><span class='ecrm-0500'>138</span><span class='ectt-0800'>        gpio_set_value(leds[i].gpio, 0);</span> 
-<a id='x1-60283r139'></a><span class='ecrm-0500'>139</span> 
-<a id='x1-60285r140'></a><span class='ecrm-0500'>140</span><span class='ectt-0800'>    </span><span id='textcolor2907'><span class='ectt-0800'>/* unregister */</span></span> 
-<a id='x1-60287r141'></a><span class='ecrm-0500'>141</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
-<a id='x1-60289r142'></a><span class='ecrm-0500'>142</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(buttons));</span> 
-<a id='x1-60291r143'></a><span class='ecrm-0500'>143</span><span class='ectt-0800'>}</span> 
-<a id='x1-60293r144'></a><span class='ecrm-0500'>144</span> 
-<a id='x1-60295r145'></a><span class='ecrm-0500'>145</span><span class='ectt-0800'>module_init(bottomhalf_init);</span> 
-<a id='x1-60297r146'></a><span class='ecrm-0500'>146</span><span class='ectt-0800'>module_exit(bottomhalf_exit);</span> 
-<a id='x1-60299r147'></a><span class='ecrm-0500'>147</span> 
-<a id='x1-60301r148'></a><span class='ecrm-0500'>148</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor2908'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span> 
-<a id='x1-60303r149'></a><span class='ecrm-0500'>149</span><span class='ectt-0800'>MODULE_DESCRIPTION(</span><span id='textcolor2909'><span class='ectt-0800'>"Interrupt with top and bottom half"</span></span><span class='ectt-0800'>);</span></pre>
+<a id='x1-60269r132'></a><span class='ecrm-0500'>132</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2901'><span class='ectt-0800'>"%s</span></span><span id='textcolor2902'><span class='ectt-0800'>\n</span></span><span id='textcolor2903'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, __func__);</span> 
+<a id='x1-60271r133'></a><span class='ecrm-0500'>133</span> 
+<a id='x1-60273r134'></a><span class='ecrm-0500'>134</span><span class='ectt-0800'>    </span><span id='textcolor2904'><span class='ectt-0800'>/* free irqs */</span></span> 
+<a id='x1-60275r135'></a><span class='ecrm-0500'>135</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
+<a id='x1-60277r136'></a><span class='ecrm-0500'>136</span><span class='ectt-0800'>    free_irq(button_irqs[1], NULL);</span> 
+<a id='x1-60279r137'></a><span class='ecrm-0500'>137</span> 
+<a id='x1-60281r138'></a><span class='ecrm-0500'>138</span><span class='ectt-0800'>    </span><span id='textcolor2905'><span class='ectt-0800'>/* turn all LEDs off */</span></span> 
+<a id='x1-60283r139'></a><span class='ecrm-0500'>139</span><span class='ectt-0800'>    </span><span id='textcolor2906'><span class='ectt-0800'>for</span></span><span class='ectt-0800'> (i = 0; i &lt; ARRAY_SIZE(leds); i++)</span> 
+<a id='x1-60285r140'></a><span class='ecrm-0500'>140</span><span class='ectt-0800'>        gpio_set_value(leds[i].gpio, 0);</span> 
+<a id='x1-60287r141'></a><span class='ecrm-0500'>141</span> 
+<a id='x1-60289r142'></a><span class='ecrm-0500'>142</span><span class='ectt-0800'>    </span><span id='textcolor2907'><span class='ectt-0800'>/* unregister */</span></span> 
+<a id='x1-60291r143'></a><span class='ecrm-0500'>143</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
+<a id='x1-60293r144'></a><span class='ecrm-0500'>144</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(buttons));</span> 
+<a id='x1-60295r145'></a><span class='ecrm-0500'>145</span><span class='ectt-0800'>}</span> 
+<a id='x1-60297r146'></a><span class='ecrm-0500'>146</span> 
+<a id='x1-60299r147'></a><span class='ecrm-0500'>147</span><span class='ectt-0800'>module_init(bottomhalf_init);</span> 
+<a id='x1-60301r148'></a><span class='ecrm-0500'>148</span><span class='ectt-0800'>module_exit(bottomhalf_exit);</span> 
+<a id='x1-60303r149'></a><span class='ecrm-0500'>149</span> 
+<a id='x1-60305r150'></a><span class='ecrm-0500'>150</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor2908'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span> 
+<a id='x1-60307r151'></a><span class='ecrm-0500'>151</span><span class='ectt-0800'>MODULE_DESCRIPTION(</span><span id='textcolor2909'><span class='ectt-0800'>"Interrupt with top and bottom half"</span></span><span class='ectt-0800'>);</span></pre>
 <!-- l. 1953 --><p class='indent'>   A threaded IRQ is registered using <code>  <span class='ectt-1000'>request_threaded_irq()</span>
 </code>. This function only takes one additional parameter than the
 <code> <span class='ectt-1000'>request_irq()</span>

+ 68 - 66
lkmpg-for-ht.html

@@ -5527,74 +5527,76 @@ halves, but using threads.
 <a id='x1-60163r79'></a><span class='ecrm-0500'>79</span> 
 <a id='x1-60165r80'></a><span class='ecrm-0500'>80</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2871'><span class='ectt-0800'>"Successfully requested BUTTON1 IRQ # %d</span></span><span id='textcolor2872'><span class='ectt-0800'>\n</span></span><span id='textcolor2873'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, button_irqs[0]);</span> 
 <a id='x1-60167r81'></a><span class='ecrm-0500'>81</span> 
-<a id='x1-60169r82'></a><span class='ecrm-0500'>82</span><span class='ectt-0800'>    ret = request_threaded_irq(</span> 
-<a id='x1-60171r83'></a><span class='ecrm-0500'>83</span><span class='ectt-0800'>        button_irqs[0], button_top_half, button_bottom_half,</span> 
-<a id='x1-60173r84'></a><span class='ecrm-0500'>84</span><span class='ectt-0800'>        IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, </span><span id='textcolor2874'><span class='ectt-0800'>"gpiomod#button1"</span></span><span class='ectt-0800'>, &amp;buttons[0]);</span> 
-<a id='x1-60175r85'></a><span class='ecrm-0500'>85</span> 
-<a id='x1-60177r86'></a><span class='ecrm-0500'>86</span><span class='ectt-0800'>    </span><span id='textcolor2875'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
-<a id='x1-60179r87'></a><span class='ecrm-0500'>87</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2876'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2877'><span class='ectt-0800'>\n</span></span><span id='textcolor2878'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
-<a id='x1-60181r88'></a><span class='ecrm-0500'>88</span><span class='ectt-0800'>        </span><span id='textcolor2879'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
-<a id='x1-60183r89'></a><span class='ecrm-0500'>89</span><span class='ectt-0800'>    }</span> 
-<a id='x1-60185r90'></a><span class='ecrm-0500'>90</span> 
-<a id='x1-60187r91'></a><span class='ecrm-0500'>91</span><span class='ectt-0800'>    ret = gpio_to_irq(buttons[1].gpio);</span> 
-<a id='x1-60189r92'></a><span class='ecrm-0500'>92</span> 
-<a id='x1-60191r93'></a><span class='ecrm-0500'>93</span><span class='ectt-0800'>    </span><span id='textcolor2880'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret &lt; 0) {</span> 
-<a id='x1-60193r94'></a><span class='ecrm-0500'>94</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2881'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2882'><span class='ectt-0800'>\n</span></span><span id='textcolor2883'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
-<a id='x1-60195r95'></a><span class='ecrm-0500'>95</span><span class='ectt-0800'>        </span><span id='textcolor2884'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
-<a id='x1-60197r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'>    }</span> 
-<a id='x1-60199r97'></a><span class='ecrm-0500'>97</span> 
-<a id='x1-60201r98'></a><span class='ecrm-0500'>98</span><span class='ectt-0800'>    button_irqs[1] = ret;</span> 
-<a id='x1-60203r99'></a><span class='ecrm-0500'>99</span> 
-<a id='x1-60205r100'></a><span class='ecrm-0500'>100</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2885'><span class='ectt-0800'>"Successfully requested BUTTON2 IRQ # %d</span></span><span id='textcolor2886'><span class='ectt-0800'>\n</span></span><span id='textcolor2887'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, button_irqs[1]);</span> 
-<a id='x1-60207r101'></a><span class='ecrm-0500'>101</span> 
-<a id='x1-60209r102'></a><span class='ecrm-0500'>102</span><span class='ectt-0800'>    ret = request_threaded_irq(</span> 
-<a id='x1-60211r103'></a><span class='ecrm-0500'>103</span><span class='ectt-0800'>        button_irqs[1], button_top_half, button_bottom_half,</span> 
-<a id='x1-60213r104'></a><span class='ecrm-0500'>104</span><span class='ectt-0800'>        IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, </span><span id='textcolor2888'><span class='ectt-0800'>"gpiomod#button2"</span></span><span class='ectt-0800'>, &amp;buttons[1]);</span> 
-<a id='x1-60215r105'></a><span class='ecrm-0500'>105</span> 
-<a id='x1-60217r106'></a><span class='ecrm-0500'>106</span><span class='ectt-0800'>    </span><span id='textcolor2889'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
-<a id='x1-60219r107'></a><span class='ecrm-0500'>107</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2890'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2891'><span class='ectt-0800'>\n</span></span><span id='textcolor2892'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
-<a id='x1-60221r108'></a><span class='ecrm-0500'>108</span><span class='ectt-0800'>        </span><span id='textcolor2893'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail3;</span> 
-<a id='x1-60223r109'></a><span class='ecrm-0500'>109</span><span class='ectt-0800'>    }</span> 
-<a id='x1-60225r110'></a><span class='ecrm-0500'>110</span> 
-<a id='x1-60227r111'></a><span class='ecrm-0500'>111</span><span class='ectt-0800'>    </span><span id='textcolor2894'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span> 
+<a id='x1-60169r82'></a><span class='ecrm-0500'>82</span><span class='ectt-0800'>    ret = request_threaded_irq(button_irqs[0], button_top_half,</span> 
+<a id='x1-60171r83'></a><span class='ecrm-0500'>83</span><span class='ectt-0800'>                               button_bottom_half,</span> 
+<a id='x1-60173r84'></a><span class='ecrm-0500'>84</span><span class='ectt-0800'>                               IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,</span> 
+<a id='x1-60175r85'></a><span class='ecrm-0500'>85</span><span class='ectt-0800'>                               </span><span id='textcolor2874'><span class='ectt-0800'>"gpiomod#button1"</span></span><span class='ectt-0800'>, &amp;buttons[0]);</span> 
+<a id='x1-60177r86'></a><span class='ecrm-0500'>86</span> 
+<a id='x1-60179r87'></a><span class='ecrm-0500'>87</span><span class='ectt-0800'>    </span><span id='textcolor2875'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
+<a id='x1-60181r88'></a><span class='ecrm-0500'>88</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2876'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2877'><span class='ectt-0800'>\n</span></span><span id='textcolor2878'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
+<a id='x1-60183r89'></a><span class='ecrm-0500'>89</span><span class='ectt-0800'>        </span><span id='textcolor2879'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
+<a id='x1-60185r90'></a><span class='ecrm-0500'>90</span><span class='ectt-0800'>    }</span> 
+<a id='x1-60187r91'></a><span class='ecrm-0500'>91</span> 
+<a id='x1-60189r92'></a><span class='ecrm-0500'>92</span><span class='ectt-0800'>    ret = gpio_to_irq(buttons[1].gpio);</span> 
+<a id='x1-60191r93'></a><span class='ecrm-0500'>93</span> 
+<a id='x1-60193r94'></a><span class='ecrm-0500'>94</span><span class='ectt-0800'>    </span><span id='textcolor2880'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret &lt; 0) {</span> 
+<a id='x1-60195r95'></a><span class='ecrm-0500'>95</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2881'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2882'><span class='ectt-0800'>\n</span></span><span id='textcolor2883'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
+<a id='x1-60197r96'></a><span class='ecrm-0500'>96</span><span class='ectt-0800'>        </span><span id='textcolor2884'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail2;</span> 
+<a id='x1-60199r97'></a><span class='ecrm-0500'>97</span><span class='ectt-0800'>    }</span> 
+<a id='x1-60201r98'></a><span class='ecrm-0500'>98</span> 
+<a id='x1-60203r99'></a><span class='ecrm-0500'>99</span><span class='ectt-0800'>    button_irqs[1] = ret;</span> 
+<a id='x1-60205r100'></a><span class='ecrm-0500'>100</span> 
+<a id='x1-60207r101'></a><span class='ecrm-0500'>101</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2885'><span class='ectt-0800'>"Successfully requested BUTTON2 IRQ # %d</span></span><span id='textcolor2886'><span class='ectt-0800'>\n</span></span><span id='textcolor2887'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, button_irqs[1]);</span> 
+<a id='x1-60209r102'></a><span class='ecrm-0500'>102</span> 
+<a id='x1-60211r103'></a><span class='ecrm-0500'>103</span><span class='ectt-0800'>    ret = request_threaded_irq(button_irqs[1], button_top_half,</span> 
+<a id='x1-60213r104'></a><span class='ecrm-0500'>104</span><span class='ectt-0800'>                               button_bottom_half,</span> 
+<a id='x1-60215r105'></a><span class='ecrm-0500'>105</span><span class='ectt-0800'>                               IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,</span> 
+<a id='x1-60217r106'></a><span class='ecrm-0500'>106</span><span class='ectt-0800'>                               </span><span id='textcolor2888'><span class='ectt-0800'>"gpiomod#button2"</span></span><span class='ectt-0800'>, &amp;buttons[1]);</span> 
+<a id='x1-60219r107'></a><span class='ecrm-0500'>107</span> 
+<a id='x1-60221r108'></a><span class='ecrm-0500'>108</span><span class='ectt-0800'>    </span><span id='textcolor2889'><span class='ectt-0800'>if</span></span><span class='ectt-0800'> (ret) {</span> 
+<a id='x1-60223r109'></a><span class='ecrm-0500'>109</span><span class='ectt-0800'>        pr_err(</span><span id='textcolor2890'><span class='ectt-0800'>"Unable to request IRQ: %d</span></span><span id='textcolor2891'><span class='ectt-0800'>\n</span></span><span id='textcolor2892'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, ret);</span> 
+<a id='x1-60225r110'></a><span class='ecrm-0500'>110</span><span class='ectt-0800'>        </span><span id='textcolor2893'><span class='ectt-0800'>goto</span></span><span class='ectt-0800'> fail3;</span> 
+<a id='x1-60227r111'></a><span class='ecrm-0500'>111</span><span class='ectt-0800'>    }</span> 
 <a id='x1-60229r112'></a><span class='ecrm-0500'>112</span> 
-<a id='x1-60231r113'></a><span class='ecrm-0500'>113</span><span id='textcolor2895'><span class='ectt-0800'>/* cleanup what has been setup so far */</span></span> 
-<a id='x1-60233r114'></a><span class='ecrm-0500'>114</span><span class='ectt-0800'>fail3:</span> 
-<a id='x1-60235r115'></a><span class='ecrm-0500'>115</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
-<a id='x1-60237r116'></a><span class='ecrm-0500'>116</span> 
-<a id='x1-60239r117'></a><span class='ecrm-0500'>117</span><span class='ectt-0800'>fail2:</span> 
-<a id='x1-60241r118'></a><span class='ecrm-0500'>118</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(leds));</span> 
-<a id='x1-60243r119'></a><span class='ecrm-0500'>119</span> 
-<a id='x1-60245r120'></a><span class='ecrm-0500'>120</span><span class='ectt-0800'>fail1:</span> 
-<a id='x1-60247r121'></a><span class='ecrm-0500'>121</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
-<a id='x1-60249r122'></a><span class='ecrm-0500'>122</span> 
-<a id='x1-60251r123'></a><span class='ecrm-0500'>123</span><span class='ectt-0800'>    </span><span id='textcolor2896'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> ret;</span> 
-<a id='x1-60253r124'></a><span class='ecrm-0500'>124</span><span class='ectt-0800'>}</span> 
-<a id='x1-60255r125'></a><span class='ecrm-0500'>125</span> 
-<a id='x1-60257r126'></a><span class='ecrm-0500'>126</span><span id='textcolor2897'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor2898'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit bottomhalf_exit(</span><span id='textcolor2899'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span> 
-<a id='x1-60259r127'></a><span class='ecrm-0500'>127</span><span class='ectt-0800'>{</span> 
-<a id='x1-60261r128'></a><span class='ecrm-0500'>128</span><span class='ectt-0800'>    </span><span id='textcolor2900'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> i;</span> 
-<a id='x1-60263r129'></a><span class='ecrm-0500'>129</span> 
-<a id='x1-60265r130'></a><span class='ecrm-0500'>130</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2901'><span class='ectt-0800'>"%s</span></span><span id='textcolor2902'><span class='ectt-0800'>\n</span></span><span id='textcolor2903'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, __func__);</span> 
+<a id='x1-60231r113'></a><span class='ecrm-0500'>113</span><span class='ectt-0800'>    </span><span id='textcolor2894'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> 0;</span> 
+<a id='x1-60233r114'></a><span class='ecrm-0500'>114</span> 
+<a id='x1-60235r115'></a><span class='ecrm-0500'>115</span><span id='textcolor2895'><span class='ectt-0800'>/* cleanup what has been setup so far */</span></span> 
+<a id='x1-60237r116'></a><span class='ecrm-0500'>116</span><span class='ectt-0800'>fail3:</span> 
+<a id='x1-60239r117'></a><span class='ecrm-0500'>117</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
+<a id='x1-60241r118'></a><span class='ecrm-0500'>118</span> 
+<a id='x1-60243r119'></a><span class='ecrm-0500'>119</span><span class='ectt-0800'>fail2:</span> 
+<a id='x1-60245r120'></a><span class='ecrm-0500'>120</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(leds));</span> 
+<a id='x1-60247r121'></a><span class='ecrm-0500'>121</span> 
+<a id='x1-60249r122'></a><span class='ecrm-0500'>122</span><span class='ectt-0800'>fail1:</span> 
+<a id='x1-60251r123'></a><span class='ecrm-0500'>123</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
+<a id='x1-60253r124'></a><span class='ecrm-0500'>124</span> 
+<a id='x1-60255r125'></a><span class='ecrm-0500'>125</span><span class='ectt-0800'>    </span><span id='textcolor2896'><span class='ectt-0800'>return</span></span><span class='ectt-0800'> ret;</span> 
+<a id='x1-60257r126'></a><span class='ecrm-0500'>126</span><span class='ectt-0800'>}</span> 
+<a id='x1-60259r127'></a><span class='ecrm-0500'>127</span> 
+<a id='x1-60261r128'></a><span class='ecrm-0500'>128</span><span id='textcolor2897'><span class='ectt-0800'>static</span></span><span class='ectt-0800'> </span><span id='textcolor2898'><span class='ectt-0800'>void</span></span><span class='ectt-0800'> __exit bottomhalf_exit(</span><span id='textcolor2899'><span class='ectt-0800'>void</span></span><span class='ectt-0800'>)</span> 
+<a id='x1-60263r129'></a><span class='ecrm-0500'>129</span><span class='ectt-0800'>{</span> 
+<a id='x1-60265r130'></a><span class='ecrm-0500'>130</span><span class='ectt-0800'>    </span><span id='textcolor2900'><span class='ectt-0800'>int</span></span><span class='ectt-0800'> i;</span> 
 <a id='x1-60267r131'></a><span class='ecrm-0500'>131</span> 
-<a id='x1-60269r132'></a><span class='ecrm-0500'>132</span><span class='ectt-0800'>    </span><span id='textcolor2904'><span class='ectt-0800'>/* free irqs */</span></span> 
-<a id='x1-60271r133'></a><span class='ecrm-0500'>133</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
-<a id='x1-60273r134'></a><span class='ecrm-0500'>134</span><span class='ectt-0800'>    free_irq(button_irqs[1], NULL);</span> 
-<a id='x1-60275r135'></a><span class='ecrm-0500'>135</span> 
-<a id='x1-60277r136'></a><span class='ecrm-0500'>136</span><span class='ectt-0800'>    </span><span id='textcolor2905'><span class='ectt-0800'>/* turn all LEDs off */</span></span> 
-<a id='x1-60279r137'></a><span class='ecrm-0500'>137</span><span class='ectt-0800'>    </span><span id='textcolor2906'><span class='ectt-0800'>for</span></span><span class='ectt-0800'> (i = 0; i &lt; ARRAY_SIZE(leds); i++)</span> 
-<a id='x1-60281r138'></a><span class='ecrm-0500'>138</span><span class='ectt-0800'>        gpio_set_value(leds[i].gpio, 0);</span> 
-<a id='x1-60283r139'></a><span class='ecrm-0500'>139</span> 
-<a id='x1-60285r140'></a><span class='ecrm-0500'>140</span><span class='ectt-0800'>    </span><span id='textcolor2907'><span class='ectt-0800'>/* unregister */</span></span> 
-<a id='x1-60287r141'></a><span class='ecrm-0500'>141</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
-<a id='x1-60289r142'></a><span class='ecrm-0500'>142</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(buttons));</span> 
-<a id='x1-60291r143'></a><span class='ecrm-0500'>143</span><span class='ectt-0800'>}</span> 
-<a id='x1-60293r144'></a><span class='ecrm-0500'>144</span> 
-<a id='x1-60295r145'></a><span class='ecrm-0500'>145</span><span class='ectt-0800'>module_init(bottomhalf_init);</span> 
-<a id='x1-60297r146'></a><span class='ecrm-0500'>146</span><span class='ectt-0800'>module_exit(bottomhalf_exit);</span> 
-<a id='x1-60299r147'></a><span class='ecrm-0500'>147</span> 
-<a id='x1-60301r148'></a><span class='ecrm-0500'>148</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor2908'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span> 
-<a id='x1-60303r149'></a><span class='ecrm-0500'>149</span><span class='ectt-0800'>MODULE_DESCRIPTION(</span><span id='textcolor2909'><span class='ectt-0800'>"Interrupt with top and bottom half"</span></span><span class='ectt-0800'>);</span></pre>
+<a id='x1-60269r132'></a><span class='ecrm-0500'>132</span><span class='ectt-0800'>    pr_info(</span><span id='textcolor2901'><span class='ectt-0800'>"%s</span></span><span id='textcolor2902'><span class='ectt-0800'>\n</span></span><span id='textcolor2903'><span class='ectt-0800'>"</span></span><span class='ectt-0800'>, __func__);</span> 
+<a id='x1-60271r133'></a><span class='ecrm-0500'>133</span> 
+<a id='x1-60273r134'></a><span class='ecrm-0500'>134</span><span class='ectt-0800'>    </span><span id='textcolor2904'><span class='ectt-0800'>/* free irqs */</span></span> 
+<a id='x1-60275r135'></a><span class='ecrm-0500'>135</span><span class='ectt-0800'>    free_irq(button_irqs[0], NULL);</span> 
+<a id='x1-60277r136'></a><span class='ecrm-0500'>136</span><span class='ectt-0800'>    free_irq(button_irqs[1], NULL);</span> 
+<a id='x1-60279r137'></a><span class='ecrm-0500'>137</span> 
+<a id='x1-60281r138'></a><span class='ecrm-0500'>138</span><span class='ectt-0800'>    </span><span id='textcolor2905'><span class='ectt-0800'>/* turn all LEDs off */</span></span> 
+<a id='x1-60283r139'></a><span class='ecrm-0500'>139</span><span class='ectt-0800'>    </span><span id='textcolor2906'><span class='ectt-0800'>for</span></span><span class='ectt-0800'> (i = 0; i &lt; ARRAY_SIZE(leds); i++)</span> 
+<a id='x1-60285r140'></a><span class='ecrm-0500'>140</span><span class='ectt-0800'>        gpio_set_value(leds[i].gpio, 0);</span> 
+<a id='x1-60287r141'></a><span class='ecrm-0500'>141</span> 
+<a id='x1-60289r142'></a><span class='ecrm-0500'>142</span><span class='ectt-0800'>    </span><span id='textcolor2907'><span class='ectt-0800'>/* unregister */</span></span> 
+<a id='x1-60291r143'></a><span class='ecrm-0500'>143</span><span class='ectt-0800'>    gpio_free_array(leds, ARRAY_SIZE(leds));</span> 
+<a id='x1-60293r144'></a><span class='ecrm-0500'>144</span><span class='ectt-0800'>    gpio_free_array(buttons, ARRAY_SIZE(buttons));</span> 
+<a id='x1-60295r145'></a><span class='ecrm-0500'>145</span><span class='ectt-0800'>}</span> 
+<a id='x1-60297r146'></a><span class='ecrm-0500'>146</span> 
+<a id='x1-60299r147'></a><span class='ecrm-0500'>147</span><span class='ectt-0800'>module_init(bottomhalf_init);</span> 
+<a id='x1-60301r148'></a><span class='ecrm-0500'>148</span><span class='ectt-0800'>module_exit(bottomhalf_exit);</span> 
+<a id='x1-60303r149'></a><span class='ecrm-0500'>149</span> 
+<a id='x1-60305r150'></a><span class='ecrm-0500'>150</span><span class='ectt-0800'>MODULE_LICENSE(</span><span id='textcolor2908'><span class='ectt-0800'>"GPL"</span></span><span class='ectt-0800'>);</span> 
+<a id='x1-60307r151'></a><span class='ecrm-0500'>151</span><span class='ectt-0800'>MODULE_DESCRIPTION(</span><span id='textcolor2909'><span class='ectt-0800'>"Interrupt with top and bottom half"</span></span><span class='ectt-0800'>);</span></pre>
 <!-- l. 1953 --><p class='indent'>   A threaded IRQ is registered using <code>  <span class='ectt-1000'>request_threaded_irq()</span>
 </code>. This function only takes one additional parameter than the
 <code> <span class='ectt-1000'>request_irq()</span>