aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of
diff options
context:
space:
mode:
authorGrant Likely <grant.likely@linaro.org>2014-11-24 12:58:01 -0500
committerGrant Likely <grant.likely@linaro.org>2014-11-24 17:25:03 -0500
commitf5242e5a883bf1c1aba6bfd87b85e7dda0e62191 (patch)
treeff348e70ad50d96de50212f9a6e6b6088bb7feef /drivers/of
parent00aa37206e1a54dae61a0dba96bf2ee0938b99d7 (diff)
of/reconfig: Always use the same structure for notifiers
The OF_RECONFIG notifier callback uses a different structure depending on whether it is a node change or a property change. This is silly, and not very safe. Rework the code to use the same data structure regardless of the type of notifier. Signed-off-by: Grant Likely <grant.likely@linaro.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Rob Herring <robh+dt@kernel.org> Cc: Pantelis Antoniou <pantelis.antoniou@konsulko.com> Cc: <linuxppc-dev@lists.ozlabs.org>
Diffstat (limited to 'drivers/of')
-rw-r--r--drivers/of/dynamic.c41
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c
index cc106529dca8..3351ef408125 100644
--- a/drivers/of/dynamic.c
+++ b/drivers/of/dynamic.c
@@ -87,18 +87,17 @@ const char *action_names[] = {
87}; 87};
88#endif 88#endif
89 89
90int of_reconfig_notify(unsigned long action, void *p) 90int of_reconfig_notify(unsigned long action, struct of_reconfig_data *p)
91{ 91{
92 int rc; 92 int rc;
93#ifdef DEBUG 93#ifdef DEBUG
94 struct device_node *dn = p; 94 struct of_reconfig_data *pr = p;
95 struct of_prop_reconfig *pr = p;
96 95
97 switch (action) { 96 switch (action) {
98 case OF_RECONFIG_ATTACH_NODE: 97 case OF_RECONFIG_ATTACH_NODE:
99 case OF_RECONFIG_DETACH_NODE: 98 case OF_RECONFIG_DETACH_NODE:
100 pr_debug("of/notify %-15s %s\n", action_names[action], 99 pr_debug("of/notify %-15s %s\n", action_names[action],
101 dn->full_name); 100 pr->dn->full_name);
102 break; 101 break;
103 case OF_RECONFIG_ADD_PROPERTY: 102 case OF_RECONFIG_ADD_PROPERTY:
104 case OF_RECONFIG_REMOVE_PROPERTY: 103 case OF_RECONFIG_REMOVE_PROPERTY:
@@ -122,31 +121,22 @@ int of_reconfig_notify(unsigned long action, void *p)
122 * Returns 0 on device going from enabled to disabled, 1 on device 121 * Returns 0 on device going from enabled to disabled, 1 on device
123 * going from disabled to enabled and -1 on no change. 122 * going from disabled to enabled and -1 on no change.
124 */ 123 */
125int of_reconfig_get_state_change(unsigned long action, void *arg) 124int of_reconfig_get_state_change(unsigned long action, struct of_reconfig_data *pr)
126{ 125{
127 struct device_node *dn; 126 struct property *prop, *old_prop = NULL;
128 struct property *prop, *old_prop;
129 struct of_prop_reconfig *pr;
130 int is_status, status_state, old_status_state, prev_state, new_state; 127 int is_status, status_state, old_status_state, prev_state, new_state;
131 128
132 /* figure out if a device should be created or destroyed */ 129 /* figure out if a device should be created or destroyed */
133 dn = NULL;
134 prop = old_prop = NULL;
135 switch (action) { 130 switch (action) {
136 case OF_RECONFIG_ATTACH_NODE: 131 case OF_RECONFIG_ATTACH_NODE:
137 case OF_RECONFIG_DETACH_NODE: 132 case OF_RECONFIG_DETACH_NODE:
138 dn = arg; 133 prop = of_find_property(pr->dn, "status", NULL);
139 prop = of_find_property(dn, "status", NULL);
140 break; 134 break;
141 case OF_RECONFIG_ADD_PROPERTY: 135 case OF_RECONFIG_ADD_PROPERTY:
142 case OF_RECONFIG_REMOVE_PROPERTY: 136 case OF_RECONFIG_REMOVE_PROPERTY:
143 pr = arg;
144 dn = pr->dn;
145 prop = pr->prop; 137 prop = pr->prop;
146 break; 138 break;
147 case OF_RECONFIG_UPDATE_PROPERTY: 139 case OF_RECONFIG_UPDATE_PROPERTY:
148 pr = arg;
149 dn = pr->dn;
150 prop = pr->prop; 140 prop = pr->prop;
151 old_prop = pr->old_prop; 141 old_prop = pr->old_prop;
152 break; 142 break;
@@ -212,7 +202,7 @@ EXPORT_SYMBOL_GPL(of_reconfig_get_state_change);
212int of_property_notify(int action, struct device_node *np, 202int of_property_notify(int action, struct device_node *np,
213 struct property *prop, struct property *oldprop) 203 struct property *prop, struct property *oldprop)
214{ 204{
215 struct of_prop_reconfig pr; 205 struct of_reconfig_data pr;
216 206
217 /* only call notifiers if the node is attached */ 207 /* only call notifiers if the node is attached */
218 if (!of_node_is_attached(np)) 208 if (!of_node_is_attached(np))
@@ -250,8 +240,12 @@ void __of_attach_node(struct device_node *np)
250 */ 240 */
251int of_attach_node(struct device_node *np) 241int of_attach_node(struct device_node *np)
252{ 242{
243 struct of_reconfig_data rd;
253 unsigned long flags; 244 unsigned long flags;
254 245
246 memset(&rd, 0, sizeof(rd));
247 rd.dn = np;
248
255 mutex_lock(&of_mutex); 249 mutex_lock(&of_mutex);
256 raw_spin_lock_irqsave(&devtree_lock, flags); 250 raw_spin_lock_irqsave(&devtree_lock, flags);
257 __of_attach_node(np); 251 __of_attach_node(np);
@@ -260,7 +254,7 @@ int of_attach_node(struct device_node *np)
260 __of_attach_node_sysfs(np); 254 __of_attach_node_sysfs(np);
261 mutex_unlock(&of_mutex); 255 mutex_unlock(&of_mutex);
262 256
263 of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, np); 257 of_reconfig_notify(OF_RECONFIG_ATTACH_NODE, &rd);
264 258
265 return 0; 259 return 0;
266} 260}
@@ -298,9 +292,13 @@ void __of_detach_node(struct device_node *np)
298 */ 292 */
299int of_detach_node(struct device_node *np) 293int of_detach_node(struct device_node *np)
300{ 294{
295 struct of_reconfig_data rd;
301 unsigned long flags; 296 unsigned long flags;
302 int rc = 0; 297 int rc = 0;
303 298
299 memset(&rd, 0, sizeof(rd));
300 rd.dn = np;
301
304 mutex_lock(&of_mutex); 302 mutex_lock(&of_mutex);
305 raw_spin_lock_irqsave(&devtree_lock, flags); 303 raw_spin_lock_irqsave(&devtree_lock, flags);
306 __of_detach_node(np); 304 __of_detach_node(np);
@@ -309,7 +307,7 @@ int of_detach_node(struct device_node *np)
309 __of_detach_node_sysfs(np); 307 __of_detach_node_sysfs(np);
310 mutex_unlock(&of_mutex); 308 mutex_unlock(&of_mutex);
311 309
312 of_reconfig_notify(OF_RECONFIG_DETACH_NODE, np); 310 of_reconfig_notify(OF_RECONFIG_DETACH_NODE, &rd);
313 311
314 return rc; 312 return rc;
315} 313}
@@ -505,6 +503,7 @@ static void __of_changeset_entry_invert(struct of_changeset_entry *ce,
505 503
506static void __of_changeset_entry_notify(struct of_changeset_entry *ce, bool revert) 504static void __of_changeset_entry_notify(struct of_changeset_entry *ce, bool revert)
507{ 505{
506 struct of_reconfig_data rd;
508 struct of_changeset_entry ce_inverted; 507 struct of_changeset_entry ce_inverted;
509 int ret; 508 int ret;
510 509
@@ -516,7 +515,9 @@ static void __of_changeset_entry_notify(struct of_changeset_entry *ce, bool reve
516 switch (ce->action) { 515 switch (ce->action) {
517 case OF_RECONFIG_ATTACH_NODE: 516 case OF_RECONFIG_ATTACH_NODE:
518 case OF_RECONFIG_DETACH_NODE: 517 case OF_RECONFIG_DETACH_NODE:
519 ret = of_reconfig_notify(ce->action, ce->np); 518 memset(&rd, 0, sizeof(rd));
519 rd.dn = ce->np;
520 ret = of_reconfig_notify(ce->action, &rd);
520 break; 521 break;
521 case OF_RECONFIG_ADD_PROPERTY: 522 case OF_RECONFIG_ADD_PROPERTY:
522 case OF_RECONFIG_REMOVE_PROPERTY: 523 case OF_RECONFIG_REMOVE_PROPERTY: