#define OPAL_IPMI_SEND                         107
 #define OPAL_IPMI_RECV                         108
 #define OPAL_I2C_REQUEST                       109
-#define OPAL_LAST                              109
+#define OPAL_FLASH_READ                                110
+#define OPAL_FLASH_WRITE                       111
+#define OPAL_FLASH_ERASE                       112
+#define OPAL_LAST                              112
 
 /* Device tree flags */
 
 
 int64_t opal_i2c_request(uint64_t async_token, uint32_t bus_id,
                         struct opal_i2c_request *oreq);
 
+int64_t opal_flash_read(uint64_t id, uint64_t offset, uint64_t buf,
+               uint64_t size, uint64_t token);
+int64_t opal_flash_write(uint64_t id, uint64_t offset, uint64_t buf,
+               uint64_t size, uint64_t token);
+int64_t opal_flash_erase(uint64_t id, uint64_t offset, uint64_t size,
+               uint64_t token);
+
 /* Internal functions */
 extern int early_init_dt_scan_opal(unsigned long node, const char *uname,
                                   int depth, void *data);
 struct rtc_time;
 extern unsigned long opal_get_boot_time(void);
 extern void opal_nvram_init(void);
-extern void opal_flash_init(void);
+extern void opal_flash_update_init(void);
 extern void opal_flash_term_callback(void);
 extern int opal_elog_init(void);
 extern void opal_platform_dump_init(void);
 
        .attrs = image_op_attrs,
 };
 
-void __init opal_flash_init(void)
+void __init opal_flash_update_init(void)
 {
        int ret;
 
 
 OPAL_CALL(opal_ipmi_send,                      OPAL_IPMI_SEND);
 OPAL_CALL(opal_ipmi_recv,                      OPAL_IPMI_RECV);
 OPAL_CALL(opal_i2c_request,                    OPAL_I2C_REQUEST);
+OPAL_CALL(opal_flash_read,                     OPAL_FLASH_READ);
+OPAL_CALL(opal_flash_write,                    OPAL_FLASH_WRITE);
+OPAL_CALL(opal_flash_erase,                    OPAL_FLASH_ERASE);
 
                        "rc = %d\n", rc);
 }
 
+static void opal_flash_init(struct device_node *opal_node)
+{
+       struct device_node *np;
+
+       for_each_child_of_node(opal_node, np)
+               if (of_device_is_compatible(np, "ibm,opal-flash"))
+                       of_platform_device_create(np, NULL, NULL);
+}
+
 static void opal_ipmi_init(struct device_node *opal_node)
 {
        struct device_node *np;
                /* Setup error log interface */
                rc = opal_elog_init();
                /* Setup code update interface */
-               opal_flash_init();
+               opal_flash_update_init();
                /* Setup platform dump extract interface */
                opal_platform_dump_init();
                /* Setup system parameters interface */
        /* Initialize OPAL IPMI backend */
        opal_ipmi_init(opal_node);
 
+       opal_flash_init(opal_node);
+
        return 0;
 }
 machine_subsys_initcall(powernv, opal_init);
 EXPORT_SYMBOL_GPL(opal_invalid_call);
 EXPORT_SYMBOL_GPL(opal_ipmi_send);
 EXPORT_SYMBOL_GPL(opal_ipmi_recv);
+EXPORT_SYMBOL_GPL(opal_flash_read);
+EXPORT_SYMBOL_GPL(opal_flash_write);
+EXPORT_SYMBOL_GPL(opal_flash_erase);
 
 /* Convert a region of vmalloc memory to an opal sg list */
 struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr,