powerpc/pseries: Add pseries update notifier for OFDT prop changes
authorKent Yoder <key@linux.vnet.ibm.com>
Thu, 12 Apr 2012 05:04:11 +0000 (05:04 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 14 May 2012 00:49:06 +0000 (10:49 +1000)
This adds an update notifier mechanism for changes to properties in the
device tree.  One use of this would be a device driver that needs to act
on changes to it's properties in the device tree after a live migration
or a dynamic activation that is triggered by updates to ofdt properties.

Signed-off-by: Robert Jennings <rcj@linux.vnet.ibm.com>
Signed-off-by: Kent Yoder <key@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/pSeries_reconfig.h
arch/powerpc/platforms/pseries/reconfig.c

index 23cd6cc30bcf8fa54ed2b48faa530e495f611bb4..c07edfe98b9899a4c81cf9e0f71e85b3a97df965 100644 (file)
 #define PSERIES_RECONFIG_REMOVE                0x0002
 #define PSERIES_DRCONF_MEM_ADD         0x0003
 #define PSERIES_DRCONF_MEM_REMOVE      0x0004
+#define PSERIES_UPDATE_PROPERTY                0x0005
+
+/**
+ * pSeries_reconfig_notify - Notifier value structure for OFDT property updates
+ *
+ * @node: Device tree node which owns the property being updated
+ * @property: Updated property
+ */
+struct pSeries_reconfig_prop_update {
+       struct device_node *node;
+       struct property *property;
+};
 
 #ifdef CONFIG_PPC_PSERIES
 extern int pSeries_reconfig_notifier_register(struct notifier_block *);
index 168651acdd83e003dae22f9bdee6147e89c1b1f5..7b3bf76ef8344f0d36c5d99fa221a175aec36bba 100644 (file)
@@ -103,11 +103,13 @@ int pSeries_reconfig_notifier_register(struct notifier_block *nb)
 {
        return blocking_notifier_chain_register(&pSeries_reconfig_chain, nb);
 }
+EXPORT_SYMBOL_GPL(pSeries_reconfig_notifier_register);
 
 void pSeries_reconfig_notifier_unregister(struct notifier_block *nb)
 {
        blocking_notifier_chain_unregister(&pSeries_reconfig_chain, nb);
 }
+EXPORT_SYMBOL_GPL(pSeries_reconfig_notifier_unregister);
 
 int pSeries_reconfig_notify(unsigned long action, void *p)
 {
@@ -426,6 +428,7 @@ static int do_remove_property(char *buf, size_t bufsize)
 static int do_update_property(char *buf, size_t bufsize)
 {
        struct device_node *np;
+       struct pSeries_reconfig_prop_update upd_value;
        unsigned char *value;
        char *name, *end, *next_prop;
        int rc, length;
@@ -454,6 +457,10 @@ static int do_update_property(char *buf, size_t bufsize)
                return -ENODEV;
        }
 
+       upd_value.node = np;
+       upd_value.property = newprop;
+       pSeries_reconfig_notify(PSERIES_UPDATE_PROPERTY, &upd_value);
+
        rc = prom_update_property(np, newprop, oldprop);
        if (rc)
                return rc;