driver core: move platform_data into platform_device
[safe/jmp/linux-2.6] / drivers / base / platform.c
1 /*
2  * platform.c - platform 'pseudo' bus for legacy devices
3  *
4  * Copyright (c) 2002-3 Patrick Mochel
5  * Copyright (c) 2002-3 Open Source Development Labs
6  *
7  * This file is released under the GPLv2
8  *
9  * Please see Documentation/driver-model/platform.txt for more
10  * information.
11  */
12
13 #include <linux/platform_device.h>
14 #include <linux/module.h>
15 #include <linux/init.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/bootmem.h>
18 #include <linux/err.h>
19 #include <linux/slab.h>
20
21 #include "base.h"
22
23 #define to_platform_driver(drv) (container_of((drv), struct platform_driver, \
24                                  driver))
25
26 struct device platform_bus = {
27         .init_name      = "platform",
28 };
29 EXPORT_SYMBOL_GPL(platform_bus);
30
31 /**
32  * platform_get_resource - get a resource for a device
33  * @dev: platform device
34  * @type: resource type
35  * @num: resource index
36  */
37 struct resource *platform_get_resource(struct platform_device *dev,
38                                        unsigned int type, unsigned int num)
39 {
40         int i;
41
42         for (i = 0; i < dev->num_resources; i++) {
43                 struct resource *r = &dev->resource[i];
44
45                 if (type == resource_type(r) && num-- == 0)
46                         return r;
47         }
48         return NULL;
49 }
50 EXPORT_SYMBOL_GPL(platform_get_resource);
51
52 /**
53  * platform_get_irq - get an IRQ for a device
54  * @dev: platform device
55  * @num: IRQ number index
56  */
57 int platform_get_irq(struct platform_device *dev, unsigned int num)
58 {
59         struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);
60
61         return r ? r->start : -ENXIO;
62 }
63 EXPORT_SYMBOL_GPL(platform_get_irq);
64
65 /**
66  * platform_get_resource_byname - get a resource for a device by name
67  * @dev: platform device
68  * @type: resource type
69  * @name: resource name
70  */
71 struct resource *platform_get_resource_byname(struct platform_device *dev,
72                                               unsigned int type, char *name)
73 {
74         int i;
75
76         for (i = 0; i < dev->num_resources; i++) {
77                 struct resource *r = &dev->resource[i];
78
79                 if (type == resource_type(r) && !strcmp(r->name, name))
80                         return r;
81         }
82         return NULL;
83 }
84 EXPORT_SYMBOL_GPL(platform_get_resource_byname);
85
86 /**
87  * platform_get_irq - get an IRQ for a device
88  * @dev: platform device
89  * @name: IRQ name
90  */
91 int platform_get_irq_byname(struct platform_device *dev, char *name)
92 {
93         struct resource *r = platform_get_resource_byname(dev, IORESOURCE_IRQ,
94                                                           name);
95
96         return r ? r->start : -ENXIO;
97 }
98 EXPORT_SYMBOL_GPL(platform_get_irq_byname);
99
100 /**
101  * platform_add_devices - add a numbers of platform devices
102  * @devs: array of platform devices to add
103  * @num: number of platform devices in array
104  */
105 int platform_add_devices(struct platform_device **devs, int num)
106 {
107         int i, ret = 0;
108
109         for (i = 0; i < num; i++) {
110                 ret = platform_device_register(devs[i]);
111                 if (ret) {
112                         while (--i >= 0)
113                                 platform_device_unregister(devs[i]);
114                         break;
115                 }
116         }
117
118         return ret;
119 }
120 EXPORT_SYMBOL_GPL(platform_add_devices);
121
122 struct platform_object {
123         struct platform_device pdev;
124         char name[1];
125 };
126
127 /**
128  * platform_device_put
129  * @pdev: platform device to free
130  *
131  * Free all memory associated with a platform device.  This function must
132  * _only_ be externally called in error cases.  All other usage is a bug.
133  */
134 void platform_device_put(struct platform_device *pdev)
135 {
136         if (pdev)
137                 put_device(&pdev->dev);
138 }
139 EXPORT_SYMBOL_GPL(platform_device_put);
140
141 static void platform_device_release(struct device *dev)
142 {
143         struct platform_object *pa = container_of(dev, struct platform_object,
144                                                   pdev.dev);
145
146         kfree(pa->pdev.dev.platform_data);
147         kfree(pa->pdev.resource);
148         kfree(pa);
149 }
150
151 /**
152  * platform_device_alloc
153  * @name: base name of the device we're adding
154  * @id: instance id
155  *
156  * Create a platform device object which can have other objects attached
157  * to it, and which will have attached objects freed when it is released.
158  */
159 struct platform_device *platform_device_alloc(const char *name, int id)
160 {
161         struct platform_object *pa;
162
163         pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
164         if (pa) {
165                 strcpy(pa->name, name);
166                 pa->pdev.name = pa->name;
167                 pa->pdev.id = id;
168                 device_initialize(&pa->pdev.dev);
169                 pa->pdev.dev.release = platform_device_release;
170         }
171
172         return pa ? &pa->pdev : NULL;
173 }
174 EXPORT_SYMBOL_GPL(platform_device_alloc);
175
176 /**
177  * platform_device_add_resources
178  * @pdev: platform device allocated by platform_device_alloc to add resources to
179  * @res: set of resources that needs to be allocated for the device
180  * @num: number of resources
181  *
182  * Add a copy of the resources to the platform device.  The memory
183  * associated with the resources will be freed when the platform device is
184  * released.
185  */
186 int platform_device_add_resources(struct platform_device *pdev,
187                                   struct resource *res, unsigned int num)
188 {
189         struct resource *r;
190
191         r = kmalloc(sizeof(struct resource) * num, GFP_KERNEL);
192         if (r) {
193                 memcpy(r, res, sizeof(struct resource) * num);
194                 pdev->resource = r;
195                 pdev->num_resources = num;
196         }
197         return r ? 0 : -ENOMEM;
198 }
199 EXPORT_SYMBOL_GPL(platform_device_add_resources);
200
201 /**
202  * platform_device_add_data
203  * @pdev: platform device allocated by platform_device_alloc to add resources to
204  * @data: platform specific data for this platform device
205  * @size: size of platform specific data
206  *
207  * Add a copy of platform specific data to the platform device's
208  * platform_data pointer.  The memory associated with the platform data
209  * will be freed when the platform device is released.
210  */
211 int platform_device_add_data(struct platform_device *pdev, const void *data,
212                              size_t size)
213 {
214         void *d;
215
216         d = kmalloc(size, GFP_KERNEL);
217         if (d) {
218                 memcpy(d, data, size);
219                 pdev->dev.platform_data = d;
220                 pdev->platform_data = d;
221         }
222         return d ? 0 : -ENOMEM;
223 }
224 EXPORT_SYMBOL_GPL(platform_device_add_data);
225
226 /**
227  * platform_device_add - add a platform device to device hierarchy
228  * @pdev: platform device we're adding
229  *
230  * This is part 2 of platform_device_register(), though may be called
231  * separately _iff_ pdev was allocated by platform_device_alloc().
232  */
233 int platform_device_add(struct platform_device *pdev)
234 {
235         int i, ret = 0;
236
237         if (!pdev)
238                 return -EINVAL;
239
240         if (!pdev->dev.parent)
241                 pdev->dev.parent = &platform_bus;
242
243         pdev->dev.bus = &platform_bus_type;
244
245         if (pdev->id != -1)
246                 dev_set_name(&pdev->dev, "%s.%d", pdev->name,  pdev->id);
247         else
248                 dev_set_name(&pdev->dev, pdev->name);
249
250         pdev->platform_data = pdev->dev.platform_data;
251
252         for (i = 0; i < pdev->num_resources; i++) {
253                 struct resource *p, *r = &pdev->resource[i];
254
255                 if (r->name == NULL)
256                         r->name = dev_name(&pdev->dev);
257
258                 p = r->parent;
259                 if (!p) {
260                         if (resource_type(r) == IORESOURCE_MEM)
261                                 p = &iomem_resource;
262                         else if (resource_type(r) == IORESOURCE_IO)
263                                 p = &ioport_resource;
264                 }
265
266                 if (p && insert_resource(p, r)) {
267                         printk(KERN_ERR
268                                "%s: failed to claim resource %d\n",
269                                dev_name(&pdev->dev), i);
270                         ret = -EBUSY;
271                         goto failed;
272                 }
273         }
274
275         pr_debug("Registering platform device '%s'. Parent at %s\n",
276                  dev_name(&pdev->dev), dev_name(pdev->dev.parent));
277
278         ret = device_add(&pdev->dev);
279         if (ret == 0)
280                 return ret;
281
282  failed:
283         while (--i >= 0) {
284                 struct resource *r = &pdev->resource[i];
285                 unsigned long type = resource_type(r);
286
287                 if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
288                         release_resource(r);
289         }
290
291         return ret;
292 }
293 EXPORT_SYMBOL_GPL(platform_device_add);
294
295 /**
296  * platform_device_del - remove a platform-level device
297  * @pdev: platform device we're removing
298  *
299  * Note that this function will also release all memory- and port-based
300  * resources owned by the device (@dev->resource).  This function must
301  * _only_ be externally called in error cases.  All other usage is a bug.
302  */
303 void platform_device_del(struct platform_device *pdev)
304 {
305         int i;
306
307         if (pdev) {
308                 device_del(&pdev->dev);
309
310                 for (i = 0; i < pdev->num_resources; i++) {
311                         struct resource *r = &pdev->resource[i];
312                         unsigned long type = resource_type(r);
313
314                         if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
315                                 release_resource(r);
316                 }
317         }
318 }
319 EXPORT_SYMBOL_GPL(platform_device_del);
320
321 /**
322  * platform_device_register - add a platform-level device
323  * @pdev: platform device we're adding
324  */
325 int platform_device_register(struct platform_device *pdev)
326 {
327         device_initialize(&pdev->dev);
328         return platform_device_add(pdev);
329 }
330 EXPORT_SYMBOL_GPL(platform_device_register);
331
332 /**
333  * platform_device_unregister - unregister a platform-level device
334  * @pdev: platform device we're unregistering
335  *
336  * Unregistration is done in 2 steps. First we release all resources
337  * and remove it from the subsystem, then we drop reference count by
338  * calling platform_device_put().
339  */
340 void platform_device_unregister(struct platform_device *pdev)
341 {
342         platform_device_del(pdev);
343         platform_device_put(pdev);
344 }
345 EXPORT_SYMBOL_GPL(platform_device_unregister);
346
347 /**
348  * platform_device_register_simple
349  * @name: base name of the device we're adding
350  * @id: instance id
351  * @res: set of resources that needs to be allocated for the device
352  * @num: number of resources
353  *
354  * This function creates a simple platform device that requires minimal
355  * resource and memory management. Canned release function freeing memory
356  * allocated for the device allows drivers using such devices to be
357  * unloaded without waiting for the last reference to the device to be
358  * dropped.
359  *
360  * This interface is primarily intended for use with legacy drivers which
361  * probe hardware directly.  Because such drivers create sysfs device nodes
362  * themselves, rather than letting system infrastructure handle such device
363  * enumeration tasks, they don't fully conform to the Linux driver model.
364  * In particular, when such drivers are built as modules, they can't be
365  * "hotplugged".
366  */
367 struct platform_device *platform_device_register_simple(const char *name,
368                                                         int id,
369                                                         struct resource *res,
370                                                         unsigned int num)
371 {
372         struct platform_device *pdev;
373         int retval;
374
375         pdev = platform_device_alloc(name, id);
376         if (!pdev) {
377                 retval = -ENOMEM;
378                 goto error;
379         }
380
381         if (num) {
382                 retval = platform_device_add_resources(pdev, res, num);
383                 if (retval)
384                         goto error;
385         }
386
387         retval = platform_device_add(pdev);
388         if (retval)
389                 goto error;
390
391         return pdev;
392
393 error:
394         platform_device_put(pdev);
395         return ERR_PTR(retval);
396 }
397 EXPORT_SYMBOL_GPL(platform_device_register_simple);
398
399 /**
400  * platform_device_register_data
401  * @parent: parent device for the device we're adding
402  * @name: base name of the device we're adding
403  * @id: instance id
404  * @data: platform specific data for this platform device
405  * @size: size of platform specific data
406  *
407  * This function creates a simple platform device that requires minimal
408  * resource and memory management. Canned release function freeing memory
409  * allocated for the device allows drivers using such devices to be
410  * unloaded without waiting for the last reference to the device to be
411  * dropped.
412  */
413 struct platform_device *platform_device_register_data(
414                 struct device *parent,
415                 const char *name, int id,
416                 const void *data, size_t size)
417 {
418         struct platform_device *pdev;
419         int retval;
420
421         pdev = platform_device_alloc(name, id);
422         if (!pdev) {
423                 retval = -ENOMEM;
424                 goto error;
425         }
426
427         pdev->dev.parent = parent;
428
429         if (size) {
430                 retval = platform_device_add_data(pdev, data, size);
431                 if (retval)
432                         goto error;
433         }
434
435         retval = platform_device_add(pdev);
436         if (retval)
437                 goto error;
438
439         return pdev;
440
441 error:
442         platform_device_put(pdev);
443         return ERR_PTR(retval);
444 }
445
446 static int platform_drv_probe(struct device *_dev)
447 {
448         struct platform_driver *drv = to_platform_driver(_dev->driver);
449         struct platform_device *dev = to_platform_device(_dev);
450
451         return drv->probe(dev);
452 }
453
454 static int platform_drv_probe_fail(struct device *_dev)
455 {
456         return -ENXIO;
457 }
458
459 static int platform_drv_remove(struct device *_dev)
460 {
461         struct platform_driver *drv = to_platform_driver(_dev->driver);
462         struct platform_device *dev = to_platform_device(_dev);
463
464         return drv->remove(dev);
465 }
466
467 static void platform_drv_shutdown(struct device *_dev)
468 {
469         struct platform_driver *drv = to_platform_driver(_dev->driver);
470         struct platform_device *dev = to_platform_device(_dev);
471
472         drv->shutdown(dev);
473 }
474
475 static int platform_drv_suspend(struct device *_dev, pm_message_t state)
476 {
477         struct platform_driver *drv = to_platform_driver(_dev->driver);
478         struct platform_device *dev = to_platform_device(_dev);
479
480         return drv->suspend(dev, state);
481 }
482
483 static int platform_drv_resume(struct device *_dev)
484 {
485         struct platform_driver *drv = to_platform_driver(_dev->driver);
486         struct platform_device *dev = to_platform_device(_dev);
487
488         return drv->resume(dev);
489 }
490
491 /**
492  * platform_driver_register
493  * @drv: platform driver structure
494  */
495 int platform_driver_register(struct platform_driver *drv)
496 {
497         drv->driver.bus = &platform_bus_type;
498         if (drv->probe)
499                 drv->driver.probe = platform_drv_probe;
500         if (drv->remove)
501                 drv->driver.remove = platform_drv_remove;
502         if (drv->shutdown)
503                 drv->driver.shutdown = platform_drv_shutdown;
504         if (drv->suspend)
505                 drv->driver.suspend = platform_drv_suspend;
506         if (drv->resume)
507                 drv->driver.resume = platform_drv_resume;
508         return driver_register(&drv->driver);
509 }
510 EXPORT_SYMBOL_GPL(platform_driver_register);
511
512 /**
513  * platform_driver_unregister
514  * @drv: platform driver structure
515  */
516 void platform_driver_unregister(struct platform_driver *drv)
517 {
518         driver_unregister(&drv->driver);
519 }
520 EXPORT_SYMBOL_GPL(platform_driver_unregister);
521
522 /**
523  * platform_driver_probe - register driver for non-hotpluggable device
524  * @drv: platform driver structure
525  * @probe: the driver probe routine, probably from an __init section
526  *
527  * Use this instead of platform_driver_register() when you know the device
528  * is not hotpluggable and has already been registered, and you want to
529  * remove its run-once probe() infrastructure from memory after the driver
530  * has bound to the device.
531  *
532  * One typical use for this would be with drivers for controllers integrated
533  * into system-on-chip processors, where the controller devices have been
534  * configured as part of board setup.
535  *
536  * Returns zero if the driver registered and bound to a device, else returns
537  * a negative error code and with the driver not registered.
538  */
539 int __init_or_module platform_driver_probe(struct platform_driver *drv,
540                 int (*probe)(struct platform_device *))
541 {
542         int retval, code;
543
544         /* temporary section violation during probe() */
545         drv->probe = probe;
546         retval = code = platform_driver_register(drv);
547
548         /* Fixup that section violation, being paranoid about code scanning
549          * the list of drivers in order to probe new devices.  Check to see
550          * if the probe was successful, and make sure any forced probes of
551          * new devices fail.
552          */
553         spin_lock(&platform_bus_type.p->klist_drivers.k_lock);
554         drv->probe = NULL;
555         if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
556                 retval = -ENODEV;
557         drv->driver.probe = platform_drv_probe_fail;
558         spin_unlock(&platform_bus_type.p->klist_drivers.k_lock);
559
560         if (code != retval)
561                 platform_driver_unregister(drv);
562         return retval;
563 }
564 EXPORT_SYMBOL_GPL(platform_driver_probe);
565
566 /* modalias support enables more hands-off userspace setup:
567  * (a) environment variable lets new-style hotplug events work once system is
568  *     fully running:  "modprobe $MODALIAS"
569  * (b) sysfs attribute lets new-style coldplug recover from hotplug events
570  *     mishandled before system is fully running:  "modprobe $(cat modalias)"
571  */
572 static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
573                              char *buf)
574 {
575         struct platform_device  *pdev = to_platform_device(dev);
576         int len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name);
577
578         return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
579 }
580
581 static struct device_attribute platform_dev_attrs[] = {
582         __ATTR_RO(modalias),
583         __ATTR_NULL,
584 };
585
586 static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
587 {
588         struct platform_device  *pdev = to_platform_device(dev);
589
590         add_uevent_var(env, "MODALIAS=%s%s", PLATFORM_MODULE_PREFIX,
591                 (pdev->id_entry) ? pdev->id_entry->name : pdev->name);
592         return 0;
593 }
594
595 static const struct platform_device_id *platform_match_id(
596                         struct platform_device_id *id,
597                         struct platform_device *pdev)
598 {
599         while (id->name[0]) {
600                 if (strcmp(pdev->name, id->name) == 0) {
601                         pdev->id_entry = id;
602                         return id;
603                 }
604                 id++;
605         }
606         return NULL;
607 }
608
609 /**
610  * platform_match - bind platform device to platform driver.
611  * @dev: device.
612  * @drv: driver.
613  *
614  * Platform device IDs are assumed to be encoded like this:
615  * "<name><instance>", where <name> is a short description of the type of
616  * device, like "pci" or "floppy", and <instance> is the enumerated
617  * instance of the device, like '0' or '42'.  Driver IDs are simply
618  * "<name>".  So, extract the <name> from the platform_device structure,
619  * and compare it against the name of the driver. Return whether they match
620  * or not.
621  */
622 static int platform_match(struct device *dev, struct device_driver *drv)
623 {
624         struct platform_device *pdev = to_platform_device(dev);
625         struct platform_driver *pdrv = to_platform_driver(drv);
626
627         /* match against the id table first */
628         if (pdrv->id_table)
629                 return platform_match_id(pdrv->id_table, pdev) != NULL;
630
631         /* fall-back to driver name match */
632         return (strcmp(pdev->name, drv->name) == 0);
633 }
634
635 #ifdef CONFIG_PM_SLEEP
636
637 static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
638 {
639         int ret = 0;
640
641         if (dev->driver && dev->driver->suspend)
642                 ret = dev->driver->suspend(dev, mesg);
643
644         return ret;
645 }
646
647 static int platform_legacy_suspend_late(struct device *dev, pm_message_t mesg)
648 {
649         struct platform_driver *pdrv = to_platform_driver(dev->driver);
650         struct platform_device *pdev = to_platform_device(dev);
651         int ret = 0;
652
653         if (dev->driver && pdrv->suspend_late)
654                 ret = pdrv->suspend_late(pdev, mesg);
655
656         return ret;
657 }
658
659 static int platform_legacy_resume_early(struct device *dev)
660 {
661         struct platform_driver *pdrv = to_platform_driver(dev->driver);
662         struct platform_device *pdev = to_platform_device(dev);
663         int ret = 0;
664
665         if (dev->driver && pdrv->resume_early)
666                 ret = pdrv->resume_early(pdev);
667
668         return ret;
669 }
670
671 static int platform_legacy_resume(struct device *dev)
672 {
673         int ret = 0;
674
675         if (dev->driver && dev->driver->resume)
676                 ret = dev->driver->resume(dev);
677
678         return ret;
679 }
680
681 static int platform_pm_prepare(struct device *dev)
682 {
683         struct device_driver *drv = dev->driver;
684         int ret = 0;
685
686         if (drv && drv->pm && drv->pm->prepare)
687                 ret = drv->pm->prepare(dev);
688
689         return ret;
690 }
691
692 static void platform_pm_complete(struct device *dev)
693 {
694         struct device_driver *drv = dev->driver;
695
696         if (drv && drv->pm && drv->pm->complete)
697                 drv->pm->complete(dev);
698 }
699
700 #ifdef CONFIG_SUSPEND
701
702 static int platform_pm_suspend(struct device *dev)
703 {
704         struct device_driver *drv = dev->driver;
705         int ret = 0;
706
707         if (!drv)
708                 return 0;
709
710         if (drv->pm) {
711                 if (drv->pm->suspend)
712                         ret = drv->pm->suspend(dev);
713         } else {
714                 ret = platform_legacy_suspend(dev, PMSG_SUSPEND);
715         }
716
717         return ret;
718 }
719
720 static int platform_pm_suspend_noirq(struct device *dev)
721 {
722         struct device_driver *drv = dev->driver;
723         int ret = 0;
724
725         if (!drv)
726                 return 0;
727
728         if (drv->pm) {
729                 if (drv->pm->suspend_noirq)
730                         ret = drv->pm->suspend_noirq(dev);
731         } else {
732                 ret = platform_legacy_suspend_late(dev, PMSG_SUSPEND);
733         }
734
735         return ret;
736 }
737
738 static int platform_pm_resume(struct device *dev)
739 {
740         struct device_driver *drv = dev->driver;
741         int ret = 0;
742
743         if (!drv)
744                 return 0;
745
746         if (drv->pm) {
747                 if (drv->pm->resume)
748                         ret = drv->pm->resume(dev);
749         } else {
750                 ret = platform_legacy_resume(dev);
751         }
752
753         return ret;
754 }
755
756 static int platform_pm_resume_noirq(struct device *dev)
757 {
758         struct device_driver *drv = dev->driver;
759         int ret = 0;
760
761         if (!drv)
762                 return 0;
763
764         if (drv->pm) {
765                 if (drv->pm->resume_noirq)
766                         ret = drv->pm->resume_noirq(dev);
767         } else {
768                 ret = platform_legacy_resume_early(dev);
769         }
770
771         return ret;
772 }
773
774 #else /* !CONFIG_SUSPEND */
775
776 #define platform_pm_suspend             NULL
777 #define platform_pm_resume              NULL
778 #define platform_pm_suspend_noirq       NULL
779 #define platform_pm_resume_noirq        NULL
780
781 #endif /* !CONFIG_SUSPEND */
782
783 #ifdef CONFIG_HIBERNATION
784
785 static int platform_pm_freeze(struct device *dev)
786 {
787         struct device_driver *drv = dev->driver;
788         int ret = 0;
789
790         if (!drv)
791                 return 0;
792
793         if (drv->pm) {
794                 if (drv->pm->freeze)
795                         ret = drv->pm->freeze(dev);
796         } else {
797                 ret = platform_legacy_suspend(dev, PMSG_FREEZE);
798         }
799
800         return ret;
801 }
802
803 static int platform_pm_freeze_noirq(struct device *dev)
804 {
805         struct device_driver *drv = dev->driver;
806         int ret = 0;
807
808         if (!drv)
809                 return 0;
810
811         if (drv->pm) {
812                 if (drv->pm->freeze_noirq)
813                         ret = drv->pm->freeze_noirq(dev);
814         } else {
815                 ret = platform_legacy_suspend_late(dev, PMSG_FREEZE);
816         }
817
818         return ret;
819 }
820
821 static int platform_pm_thaw(struct device *dev)
822 {
823         struct device_driver *drv = dev->driver;
824         int ret = 0;
825
826         if (!drv)
827                 return 0;
828
829         if (drv->pm) {
830                 if (drv->pm->thaw)
831                         ret = drv->pm->thaw(dev);
832         } else {
833                 ret = platform_legacy_resume(dev);
834         }
835
836         return ret;
837 }
838
839 static int platform_pm_thaw_noirq(struct device *dev)
840 {
841         struct device_driver *drv = dev->driver;
842         int ret = 0;
843
844         if (!drv)
845                 return 0;
846
847         if (drv->pm) {
848                 if (drv->pm->thaw_noirq)
849                         ret = drv->pm->thaw_noirq(dev);
850         } else {
851                 ret = platform_legacy_resume_early(dev);
852         }
853
854         return ret;
855 }
856
857 static int platform_pm_poweroff(struct device *dev)
858 {
859         struct device_driver *drv = dev->driver;
860         int ret = 0;
861
862         if (!drv)
863                 return 0;
864
865         if (drv->pm) {
866                 if (drv->pm->poweroff)
867                         ret = drv->pm->poweroff(dev);
868         } else {
869                 ret = platform_legacy_suspend(dev, PMSG_HIBERNATE);
870         }
871
872         return ret;
873 }
874
875 static int platform_pm_poweroff_noirq(struct device *dev)
876 {
877         struct device_driver *drv = dev->driver;
878         int ret = 0;
879
880         if (!drv)
881                 return 0;
882
883         if (drv->pm) {
884                 if (drv->pm->poweroff_noirq)
885                         ret = drv->pm->poweroff_noirq(dev);
886         } else {
887                 ret = platform_legacy_suspend_late(dev, PMSG_HIBERNATE);
888         }
889
890         return ret;
891 }
892
893 static int platform_pm_restore(struct device *dev)
894 {
895         struct device_driver *drv = dev->driver;
896         int ret = 0;
897
898         if (!drv)
899                 return 0;
900
901         if (drv->pm) {
902                 if (drv->pm->restore)
903                         ret = drv->pm->restore(dev);
904         } else {
905                 ret = platform_legacy_resume(dev);
906         }
907
908         return ret;
909 }
910
911 static int platform_pm_restore_noirq(struct device *dev)
912 {
913         struct device_driver *drv = dev->driver;
914         int ret = 0;
915
916         if (!drv)
917                 return 0;
918
919         if (drv->pm) {
920                 if (drv->pm->restore_noirq)
921                         ret = drv->pm->restore_noirq(dev);
922         } else {
923                 ret = platform_legacy_resume_early(dev);
924         }
925
926         return ret;
927 }
928
929 #else /* !CONFIG_HIBERNATION */
930
931 #define platform_pm_freeze              NULL
932 #define platform_pm_thaw                NULL
933 #define platform_pm_poweroff            NULL
934 #define platform_pm_restore             NULL
935 #define platform_pm_freeze_noirq        NULL
936 #define platform_pm_thaw_noirq          NULL
937 #define platform_pm_poweroff_noirq      NULL
938 #define platform_pm_restore_noirq       NULL
939
940 #endif /* !CONFIG_HIBERNATION */
941
942 static struct dev_pm_ops platform_dev_pm_ops = {
943         .prepare = platform_pm_prepare,
944         .complete = platform_pm_complete,
945         .suspend = platform_pm_suspend,
946         .resume = platform_pm_resume,
947         .freeze = platform_pm_freeze,
948         .thaw = platform_pm_thaw,
949         .poweroff = platform_pm_poweroff,
950         .restore = platform_pm_restore,
951         .suspend_noirq = platform_pm_suspend_noirq,
952         .resume_noirq = platform_pm_resume_noirq,
953         .freeze_noirq = platform_pm_freeze_noirq,
954         .thaw_noirq = platform_pm_thaw_noirq,
955         .poweroff_noirq = platform_pm_poweroff_noirq,
956         .restore_noirq = platform_pm_restore_noirq,
957 };
958
959 #define PLATFORM_PM_OPS_PTR     (&platform_dev_pm_ops)
960
961 #else /* !CONFIG_PM_SLEEP */
962
963 #define PLATFORM_PM_OPS_PTR     NULL
964
965 #endif /* !CONFIG_PM_SLEEP */
966
967 struct bus_type platform_bus_type = {
968         .name           = "platform",
969         .dev_attrs      = platform_dev_attrs,
970         .match          = platform_match,
971         .uevent         = platform_uevent,
972         .pm             = PLATFORM_PM_OPS_PTR,
973 };
974 EXPORT_SYMBOL_GPL(platform_bus_type);
975
976 int __init platform_bus_init(void)
977 {
978         int error;
979
980         error = device_register(&platform_bus);
981         if (error)
982                 return error;
983         error =  bus_register(&platform_bus_type);
984         if (error)
985                 device_unregister(&platform_bus);
986         return error;
987 }
988
989 #ifndef ARCH_HAS_DMA_GET_REQUIRED_MASK
990 u64 dma_get_required_mask(struct device *dev)
991 {
992         u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT);
993         u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT));
994         u64 mask;
995
996         if (!high_totalram) {
997                 /* convert to mask just covering totalram */
998                 low_totalram = (1 << (fls(low_totalram) - 1));
999                 low_totalram += low_totalram - 1;
1000                 mask = low_totalram;
1001         } else {
1002                 high_totalram = (1 << (fls(high_totalram) - 1));
1003                 high_totalram += high_totalram - 1;
1004                 mask = (((u64)high_totalram) << 32) + 0xffffffff;
1005         }
1006         return mask;
1007 }
1008 EXPORT_SYMBOL_GPL(dma_get_required_mask);
1009 #endif