int __init early_platform_driver_register(struct early_platform_driver *epdrv,
                                          char *buf)
 {
-       unsigned long index;
+       char *tmp;
        int n;
 
        /* Simply add the driver to the end of the global list.
        if (buf && !strncmp(buf, epdrv->pdrv->driver.name, n)) {
                list_move(&epdrv->list, &early_platform_driver_list);
 
-               if (!strcmp(buf, epdrv->pdrv->driver.name))
+               /* Allow passing parameters after device name */
+               if (buf[n] == '\0' || buf[n] == ',')
                        epdrv->requested_id = -1;
-               else if (buf[n] == '.' && strict_strtoul(&buf[n + 1], 10,
-                                                        &index) == 0)
-                       epdrv->requested_id = index;
-               else
-                       epdrv->requested_id = EARLY_PLATFORM_ID_ERROR;
+               else {
+                       epdrv->requested_id = simple_strtoul(&buf[n + 1],
+                                                            &tmp, 10);
+
+                       if (buf[n] != '.' || (tmp == &buf[n + 1])) {
+                               epdrv->requested_id = EARLY_PLATFORM_ID_ERROR;
+                               n = 0;
+                       } else
+                               n += strcspn(&buf[n + 1], ",") + 1;
+               }
+
+               if (buf[n] == ',')
+                       n++;
+
+               if (epdrv->bufsize) {
+                       memcpy(epdrv->buffer, &buf[n],
+                              min_t(int, epdrv->bufsize, strlen(&buf[n]) + 1));
+                       epdrv->buffer[epdrv->bufsize - 1] = '\0';
+               }
        }
 
        return 0;
 
        struct platform_driver *pdrv;
        struct list_head list;
        int requested_id;
+       char *buffer;
+       int bufsize;
 };
 
 #define EARLY_PLATFORM_ID_UNSET -2
                                       int nr_probe, int user_only);
 extern void early_platform_cleanup(void);
 
+#define early_platform_init(class_string, platdrv)             \
+       early_platform_init_buffer(class_string, platdrv, NULL, 0)
 
 #ifndef MODULE
-#define early_platform_init(class_string, platform_driver)             \
+#define early_platform_init_buffer(class_string, platdrv, buf, bufsiz) \
 static __initdata struct early_platform_driver early_driver = {                \
        .class_str = class_string,                                      \
-       .pdrv = platform_driver,                                        \
+       .buffer = buf,                                                  \
+       .bufsize = bufsiz,                                              \
+       .pdrv = platdrv,                                                \
        .requested_id = EARLY_PLATFORM_ID_UNSET,                        \
 };                                                                     \
-static int __init early_platform_driver_setup_func(char *buf)          \
+static int __init early_platform_driver_setup_func(char *buffer)       \
 {                                                                      \
-       return early_platform_driver_register(&early_driver, buf);      \
+       return early_platform_driver_register(&early_driver, buffer);   \
 }                                                                      \
 early_param(class_string, early_platform_driver_setup_func)
 #else /* MODULE */
-#define early_platform_init(class_string, platform_driver)
+#define early_platform_init_buffer(class_string, platdrv, buf, bufsiz) \
+static inline char *early_platform_driver_setup_func(void)             \
+{                                                                      \
+       return bufsiz ? buf : NULL;                                     \
+}
 #endif /* MODULE */
 
 #endif /* _PLATFORM_DEVICE_H_ */