99#include <linux/errno.h>
1010#include <linux/module.h>
1111#include <linux/of.h>
12+ #include <linux/of_irq.h>
1213#include <linux/list.h>
1314#include <linux/mutex.h>
1415#include <linux/slab.h>
1516#include <linux/device.h>
1617
17- static bool selftest_passed = true;
18+ static struct selftest_results {
19+ int passed ;
20+ int failed ;
21+ } selftest_results ;
22+
1823#define selftest (result , fmt , ...) { \
1924 if (!(result)) { \
20- pr_err("FAIL %s:%i " fmt, __FILE__, __LINE__, ##__VA_ARGS__) ; \
21- selftest_passed = false ; \
25+ selftest_results.failed++ ; \
26+ pr_err("FAIL %s():%i " fmt, __func__, __LINE__, ##__VA_ARGS__) ; \
2227 } else { \
23- pr_info("pass %s:%i\n", __FILE__, __LINE__); \
28+ selftest_results.passed++; \
29+ pr_debug("pass %s():%i\n", __func__, __LINE__); \
2430 } \
2531}
2632
@@ -131,7 +137,6 @@ static void __init of_selftest_property_match_string(void)
131137 struct device_node * np ;
132138 int rc ;
133139
134- pr_info ("start\n" );
135140 np = of_find_node_by_path ("/testcase-data/phandle-tests/consumer-a" );
136141 if (!np ) {
137142 pr_err ("No testcase data in device tree\n" );
@@ -154,6 +159,78 @@ static void __init of_selftest_property_match_string(void)
154159 selftest (rc == - EILSEQ , "unterminated string; rc=%i" , rc );
155160}
156161
162+ static void __init of_selftest_parse_interrupts (void )
163+ {
164+ struct device_node * np ;
165+ struct of_phandle_args args ;
166+ int i , rc ;
167+
168+ np = of_find_node_by_path ("/testcase-data/interrupts/interrupts0" );
169+ if (!np ) {
170+ pr_err ("missing testcase data\n" );
171+ return ;
172+ }
173+
174+ for (i = 0 ; i < 4 ; i ++ ) {
175+ bool passed = true;
176+ args .args_count = 0 ;
177+ rc = of_irq_parse_one (np , i , & args );
178+
179+ passed &= !rc ;
180+ passed &= (args .args_count == 1 );
181+ passed &= (args .args [0 ] == (i + 1 ));
182+
183+ selftest (passed , "index %i - data error on node %s rc=%i\n" ,
184+ i , args .np -> full_name , rc );
185+ }
186+ of_node_put (np );
187+
188+ np = of_find_node_by_path ("/testcase-data/interrupts/interrupts1" );
189+ if (!np ) {
190+ pr_err ("missing testcase data\n" );
191+ return ;
192+ }
193+
194+ for (i = 0 ; i < 4 ; i ++ ) {
195+ bool passed = true;
196+ args .args_count = 0 ;
197+ rc = of_irq_parse_one (np , i , & args );
198+
199+ /* Test the values from tests-phandle.dtsi */
200+ switch (i ) {
201+ case 0 :
202+ passed &= !rc ;
203+ passed &= (args .args_count == 1 );
204+ passed &= (args .args [0 ] == 9 );
205+ break ;
206+ case 1 :
207+ passed &= !rc ;
208+ passed &= (args .args_count == 3 );
209+ passed &= (args .args [0 ] == 10 );
210+ passed &= (args .args [1 ] == 11 );
211+ passed &= (args .args [2 ] == 12 );
212+ break ;
213+ case 2 :
214+ passed &= !rc ;
215+ passed &= (args .args_count == 2 );
216+ passed &= (args .args [0 ] == 13 );
217+ passed &= (args .args [1 ] == 14 );
218+ break ;
219+ case 3 :
220+ passed &= !rc ;
221+ passed &= (args .args_count == 2 );
222+ passed &= (args .args [0 ] == 15 );
223+ passed &= (args .args [1 ] == 16 );
224+ break ;
225+ default :
226+ passed = false;
227+ }
228+ selftest (passed , "index %i - data error on node %s rc=%i\n" ,
229+ i , args .np -> full_name , rc );
230+ }
231+ of_node_put (np );
232+ }
233+
157234static int __init of_selftest (void )
158235{
159236 struct device_node * np ;
@@ -168,7 +245,9 @@ static int __init of_selftest(void)
168245 pr_info ("start of selftest - you will see error messages\n" );
169246 of_selftest_parse_phandle_with_args ();
170247 of_selftest_property_match_string ();
171- pr_info ("end of selftest - %s\n" , selftest_passed ? "PASS" : "FAIL" );
248+ of_selftest_parse_interrupts ();
249+ pr_info ("end of selftest - %i passed, %i failed\n" ,
250+ selftest_results .passed , selftest_results .failed );
172251 return 0 ;
173252}
174253late_initcall (of_selftest );
0 commit comments