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