xref: /OK3568_Linux_fs/kernel/scripts/coccinelle/api/check_bq27xxx_data.cocci (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun/// Detect BQ27XXX_DATA structures with identical registers, dm registers or
3*4882a593Smuzhiyun/// properties.
4*4882a593Smuzhiyun//# Doesn't unfold macros used in register or property fields.
5*4882a593Smuzhiyun//# Requires OCaml scripting
6*4882a593Smuzhiyun///
7*4882a593Smuzhiyun// Confidence: High
8*4882a593Smuzhiyun// Copyright: (C) 2017 Julia Lawall, Inria/LIP6,
9*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/
10*4882a593Smuzhiyun// Requires: 1.0.7
11*4882a593Smuzhiyun// Keywords: BQ27XXX_DATA
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunvirtual report
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun@initialize:ocaml@
16*4882a593Smuzhiyun@@
17*4882a593Smuzhiyun
18*4882a593Smuzhiyunlet print_report p msg =
19*4882a593Smuzhiyun  let p = List.hd p in
20*4882a593Smuzhiyun  Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun@str depends on report@
23*4882a593Smuzhiyuntype t;
24*4882a593Smuzhiyunidentifier i,i1,i2;
25*4882a593Smuzhiyunexpression e1,e2;
26*4882a593Smuzhiyun@@
27*4882a593Smuzhiyun
28*4882a593Smuzhiyunt i[] = {
29*4882a593Smuzhiyun  ...,
30*4882a593Smuzhiyun  [e1] = BQ27XXX_DATA(i1,...),
31*4882a593Smuzhiyun  ...,
32*4882a593Smuzhiyun  [e2] = BQ27XXX_DATA(i2,...),
33*4882a593Smuzhiyun  ...,
34*4882a593Smuzhiyun};
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun@script:ocaml tocheck@
37*4882a593Smuzhiyuni1 << str.i1;
38*4882a593Smuzhiyuni2 << str.i2;
39*4882a593Smuzhiyuni1regs; i2regs;
40*4882a593Smuzhiyuni1dmregs; i2dmregs;
41*4882a593Smuzhiyuni1props; i2props;
42*4882a593Smuzhiyun@@
43*4882a593Smuzhiyun
44*4882a593Smuzhiyunif not(i1 = i2)
45*4882a593Smuzhiyunthen
46*4882a593Smuzhiyun  begin
47*4882a593Smuzhiyun    i1regs := make_ident (i1 ^ "_regs");
48*4882a593Smuzhiyun    i2regs := make_ident (i2 ^ "_regs");
49*4882a593Smuzhiyun    i1dmregs := make_ident (i1 ^ "_dm_regs");
50*4882a593Smuzhiyun    i2dmregs := make_ident (i2 ^ "_dm_regs");
51*4882a593Smuzhiyun    i1props := make_ident (i1 ^ "_props");
52*4882a593Smuzhiyun    i2props := make_ident (i2 ^ "_props")
53*4882a593Smuzhiyun  end
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun(* ---------------------------------------------------------------- *)
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun@getregs1@
58*4882a593Smuzhiyuntypedef u8;
59*4882a593Smuzhiyunidentifier tocheck.i1regs;
60*4882a593Smuzhiyuninitializer list i1regs_vals;
61*4882a593Smuzhiyunposition p1;
62*4882a593Smuzhiyun@@
63*4882a593Smuzhiyun
64*4882a593Smuzhiyunu8 i1regs@p1[...] = { i1regs_vals, };
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun@getregs2@
67*4882a593Smuzhiyunidentifier tocheck.i2regs;
68*4882a593Smuzhiyuninitializer list i2regs_vals;
69*4882a593Smuzhiyunposition p2;
70*4882a593Smuzhiyun@@
71*4882a593Smuzhiyun
72*4882a593Smuzhiyunu8 i2regs@p2[...] = { i2regs_vals, };
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun@script:ocaml@
75*4882a593Smuzhiyun(_,i1regs_vals) << getregs1.i1regs_vals;
76*4882a593Smuzhiyun(_,i2regs_vals) << getregs2.i2regs_vals;
77*4882a593Smuzhiyuni1regs << tocheck.i1regs;
78*4882a593Smuzhiyuni2regs << tocheck.i2regs;
79*4882a593Smuzhiyunp1 << getregs1.p1;
80*4882a593Smuzhiyunp2 << getregs2.p2;
81*4882a593Smuzhiyun@@
82*4882a593Smuzhiyun
83*4882a593Smuzhiyunif i1regs < i2regs &&
84*4882a593Smuzhiyun   List.sort compare i1regs_vals = List.sort compare i2regs_vals
85*4882a593Smuzhiyunthen
86*4882a593Smuzhiyun  let msg =
87*4882a593Smuzhiyun    Printf.sprintf
88*4882a593Smuzhiyun      "WARNING %s and %s (line %d) are identical\n"
89*4882a593Smuzhiyun      i1regs i2regs (List.hd p2).line in
90*4882a593Smuzhiyun  print_report p1 msg
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun(* ---------------------------------------------------------------- *)
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun@getdmregs1@
95*4882a593Smuzhiyunidentifier tocheck.i1dmregs;
96*4882a593Smuzhiyuninitializer list i1dmregs_vals;
97*4882a593Smuzhiyunposition p1;
98*4882a593Smuzhiyun@@
99*4882a593Smuzhiyun
100*4882a593Smuzhiyunstruct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, };
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun@getdmregs2@
103*4882a593Smuzhiyunidentifier tocheck.i2dmregs;
104*4882a593Smuzhiyuninitializer list i2dmregs_vals;
105*4882a593Smuzhiyunposition p2;
106*4882a593Smuzhiyun@@
107*4882a593Smuzhiyun
108*4882a593Smuzhiyunstruct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, };
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun@script:ocaml@
111*4882a593Smuzhiyun(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
112*4882a593Smuzhiyun(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
113*4882a593Smuzhiyuni1dmregs << tocheck.i1dmregs;
114*4882a593Smuzhiyuni2dmregs << tocheck.i2dmregs;
115*4882a593Smuzhiyunp1 << getdmregs1.p1;
116*4882a593Smuzhiyunp2 << getdmregs2.p2;
117*4882a593Smuzhiyun@@
118*4882a593Smuzhiyun
119*4882a593Smuzhiyunif i1dmregs < i2dmregs &&
120*4882a593Smuzhiyun   List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
121*4882a593Smuzhiyunthen
122*4882a593Smuzhiyun  let msg =
123*4882a593Smuzhiyun    Printf.sprintf
124*4882a593Smuzhiyun      "WARNING %s and %s (line %d) are identical\n"
125*4882a593Smuzhiyun      i1dmregs i2dmregs (List.hd p2).line in
126*4882a593Smuzhiyun  print_report p1 msg
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun(* ---------------------------------------------------------------- *)
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun@getprops1@
131*4882a593Smuzhiyunidentifier tocheck.i1props;
132*4882a593Smuzhiyuninitializer list[n1] i1props_vals;
133*4882a593Smuzhiyunposition p1;
134*4882a593Smuzhiyun@@
135*4882a593Smuzhiyun
136*4882a593Smuzhiyunenum power_supply_property i1props@p1[] = { i1props_vals, };
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun@getprops2@
139*4882a593Smuzhiyunidentifier tocheck.i2props;
140*4882a593Smuzhiyuninitializer list[n2] i2props_vals;
141*4882a593Smuzhiyunposition p2;
142*4882a593Smuzhiyun@@
143*4882a593Smuzhiyun
144*4882a593Smuzhiyunenum power_supply_property i2props@p2[] = { i2props_vals, };
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun@script:ocaml@
147*4882a593Smuzhiyun(_,i1props_vals) << getprops1.i1props_vals;
148*4882a593Smuzhiyun(_,i2props_vals) << getprops2.i2props_vals;
149*4882a593Smuzhiyuni1props << tocheck.i1props;
150*4882a593Smuzhiyuni2props << tocheck.i2props;
151*4882a593Smuzhiyunp1 << getprops1.p1;
152*4882a593Smuzhiyunp2 << getprops2.p2;
153*4882a593Smuzhiyun@@
154*4882a593Smuzhiyun
155*4882a593Smuzhiyunif i1props < i2props &&
156*4882a593Smuzhiyun   List.sort compare i1props_vals = List.sort compare i2props_vals
157*4882a593Smuzhiyunthen
158*4882a593Smuzhiyun  let msg =
159*4882a593Smuzhiyun    Printf.sprintf
160*4882a593Smuzhiyun      "WARNING %s and %s (line %d) are identical\n"
161*4882a593Smuzhiyun      i1props i2props (List.hd p2).line in
162*4882a593Smuzhiyun  print_report p1 msg
163