Merge branch 'irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip...
[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         /* We will remove platform_data field from struct device
251         * if all platform devices pass its platform specific data
252         * from platform_device. The conversion is going to be a
253         * long time, so we allow the two cases coexist to make
254         * this kind of fix more easily*/
255         if (pdev->platform_data && pdev->dev.platform_data) {
256                 printk(KERN_ERR
257                                "%s: use which platform_data?\n",
258                                dev_name(&pdev->dev));
259         } else if (pdev->platform_data) {
260                 pdev->dev.platform_data = pdev->platform_data;
261         } else if (pdev->dev.platform_data) {
262                 pdev->platform_data = pdev->dev.platform_data;
263         }
264
265         for (i = 0; i < pdev->num_resources; i++) {
266                 struct resource *p, *r = &pdev->resource[i];
267
268                 if (r->name == NULL)
269                         r->name = dev_name(&pdev->dev);
270
271                 p = r->parent;
272                 if (!p) {
273                         if (resource_type(r) == IORESOURCE_MEM)
274                                 p = &iomem_resource;
275                         else if (resource_type(r) == IORESOURCE_IO)
276                                 p = &ioport_resource;
277                 }
278
279                 if (p && insert_resource(p, r)) {
280                         printk(KERN_ERR
281                                "%s: failed to claim resource %d\n",
282                                dev_name(&pdev->dev), i);
283                         ret = -EBUSY;
284                         goto failed;
285                 }
286         }
287
288         pr_debug("Registering platform device '%s'. Parent at %s\n",
289                  dev_name(&pdev->dev), dev_name(pdev->dev.parent));
290
291         ret = device_add(&pdev->dev);
292         if (ret == 0)
293                 return ret;
294
295  failed:
296         while (--i >= 0) {
297                 struct resource *r = &pdev->resource[i];
298                 unsigned long type = resource_type(r);
299
300                 if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
301                         release_resource(r);
302         }
303
304         return ret;
305 }
306 EXPORT_SYMBOL_GPL(platform_device_add);
307
308 /**
309  * platform_device_del - remove a platform-level device
310  * @pdev: platform device we're removing
311  *
312  * Note that this function will also release all memory- and port-based
313  * resources owned by the device (@dev->resource).  This function must
314  * _only_ be externally called in error cases.  All other usage is a bug.
315  */
316 void platform_device_del(struct platform_device *pdev)
317 {
318         int i;
319
320         if (pdev) {
321                 device_del(&pdev->dev);
322
323                 for (i = 0; i < pdev->num_resources; i++) {
324                         struct resource *r = &pdev->resource[i];
325                         unsigned long type = resource_type(r);
326
327                         if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
328                                 release_resource(r);
329                 }
330         }
331 }
332 EXPORT_SYMBOL_GPL(platform_device_del);
333
334 /**
335  * platform_device_register - add a platform-level device
336  * @pdev: platform device we're adding
337  */
338 int platform_device_register(struct platform_device *pdev)
339 {
340         device_initialize(&pdev->dev);
341         return platform_device_add(pdev);
342 }
343 EXPORT_SYMBOL_GPL(platform_device_register);
344
345 /**
346  * platform_device_unregister - unregister a platform-level device
347  * @pdev: platform device we're unregistering
348  *
349  * Unregistration is done in 2 steps. First we release all resources
350  * and remove it from the subsystem, then we drop reference count by
351  * calling platform_device_put().
352  */
353 void platform_device_unregister(struct platform_device *pdev)
354 {
355         platform_device_del(pdev);
356         platform_device_put(pdev);
357 }
358 EXPORT_SYMBOL_GPL(platform_device_unregister);
359
360 /**
361  * platform_device_register_simple
362  * @name: base name of the device we're adding
363  * @id: instance id
364  * @res: set of resources that needs to be allocated for the device
365  * @num: number of resources
366  *
367  * This function creates a simple platform device that requires minimal
368  * resource and memory management. Canned release function freeing memory
369  * allocated for the device allows drivers using such devices to be
370  * unloaded without waiting for the last reference to the device to be
371  * dropped.
372  *
373  * This interface is primarily intended for use with legacy drivers which
374  * probe hardware directly.  Because such drivers create sysfs device nodes
375  * themselves, rather than letting system infrastructure handle such device
376  * enumeration tasks, they don't fully conform to the Linux driver model.
377  * In particular, when such drivers are built as modules, they can't be
378  * "hotplugged".
379  */
380 struct platform_device *platform_device_register_simple(const char *name,
381                                                         int id,
382                                                         struct resource *res,
383                                                         unsigned int num)
384 {
385         struct platform_device *pdev;
386         int retval;
387
388         pdev = platform_device_alloc(name, id);
389         if (!pdev) {
390                 retval = -ENOMEM;
391                 goto error;
392         }
393
394         if (num) {
395                 retval = platform_device_add_resources(pdev, res, num);
396                 if (retval)
397                         goto error;
398         }
399
400         retval = platform_device_add(pdev);
401         if (retval)
402                 goto error;
403
404         return pdev;
405
406 error:
407         platform_device_put(pdev);
408         return ERR_PTR(retval);
409 }
410 EXPORT_SYMBOL_GPL(platform_device_register_simple);
411
412 /**
413  * platform_device_register_data
414  * @parent: parent device for the device we're adding
415  * @name: base name of the device we're adding
416  * @id: instance id
417  * @data: platform specific data for this platform device
418  * @size: size of platform specific data
419  *
420  * This function creates a simple platform device that requires minimal
421  * resource and memory management. Canned release function freeing memory
422  * allocated for the device allows drivers using such devices to be
423  * unloaded without waiting for the last reference to the device to be
424  * dropped.
425  */
426 struct platform_device *platform_device_register_data(
427                 struct device *parent,
428                 const char *name, int id,
429                 const void *data, size_t size)
430 {
431         struct platform_device *pdev;
432         int retval;
433
434         pdev = platform_device_alloc(name, id);
435         if (!pdev) {
436                 retval = -ENOMEM;
437                 goto error;
438         }
439
440         pdev->dev.parent = parent;
441
442         if (size) {
443                 retval = platform_device_add_data(pdev, data, size);
444                 if (retval)
445                         goto error;
446         }
447
448         retval = platform_device_add(pdev);
449         if (retval)
450                 goto error;
451
452         return pdev;
453
454 error:
455         platform_device_put(pdev);
456         return ERR_PTR(retval);
457 }
458
459 static int platform_drv_probe(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->probe(dev);
465 }
466
467 static int platform_drv_probe_fail(struct device *_dev)
468 {
469         return -ENXIO;
470 }
471
472 static int platform_drv_remove(struct device *_dev)
473 {
474         struct platform_driver *drv = to_platform_driver(_dev->driver);
475         struct platform_device *dev = to_platform_device(_dev);
476
477         return drv->remove(dev);
478 }
479
480 static void platform_drv_shutdown(struct device *_dev)
481 {
482         struct platform_driver *drv = to_platform_driver(_dev->driver);
483         struct platform_device *dev = to_platform_device(_dev);
484
485         drv->shutdown(dev);
486 }
487
488 static int platform_drv_suspend(struct device *_dev, pm_message_t state)
489 {
490         struct platform_driver *drv = to_platform_driver(_dev->driver);
491         struct platform_device *dev = to_platform_device(_dev);
492
493         return drv->suspend(dev, state);
494 }
495
496 static int platform_drv_resume(struct device *_dev)
497 {
498         struct platform_driver *drv = to_platform_driver(_dev->driver);
499         struct platform_device *dev = to_platform_device(_dev);
500
501         return drv->resume(dev);
502 }
503
504 /**
505  * platform_driver_register
506  * @drv: platform driver structure
507  */
508 int platform_driver_register(struct platform_driver *drv)
509 {
510         drv->driver.bus = &platform_bus_type;
511         if (drv->probe)
512                 drv->driver.probe = platform_drv_probe;
513         if (drv->remove)
514                 drv->driver.remove = platform_drv_remove;
515         if (drv->shutdown)
516                 drv->driver.shutdown = platform_drv_shutdown;
517         if (drv->suspend)
518                 drv->driver.suspend = platform_drv_suspend;
519         if (drv->resume)
520                 drv->driver.resume = platform_drv_resume;
521         return driver_register(&drv->driver);
522 }
523 EXPORT_SYMBOL_GPL(platform_driver_register);
524
525 /**
526  * platform_driver_unregister
527  * @drv: platform driver structure
528  */
529 void platform_driver_unregister(struct platform_driver *drv)
530 {
531         driver_unregister(&drv->driver);
532 }
533 EXPORT_SYMBOL_GPL(platform_driver_unregister);
534
535 /**
536  * platform_driver_probe - register driver for non-hotpluggable device
537  * @drv: platform driver structure
538  * @probe: the driver probe routine, probably from an __init section
539  *
540  * Use this instead of platform_driver_register() when you know the device
541  * is not hotpluggable and has already been registered, and you want to
542  * remove its run-once probe() infrastructure from memory after the driver
543  * has bound to the device.
544  *
545  * One typical use for this would be with drivers for controllers integrated
546  * into system-on-chip processors, where the controller devices have been
547  * configured as part of board setup.
548  *
549  * Returns zero if the driver registered and bound to a device, else returns
550  * a negative error code and with the driver not registered.
551  */
552 int __init_or_module platform_driver_probe(struct platform_driver *drv,
553                 int (*probe)(struct platform_device *))
554 {
555         int retval, code;
556
557         /* temporary section violation during probe() */
558         drv->probe = probe;
559         retval = code = platform_driver_register(drv);
560
561         /* Fixup that section violation, being paranoid about code scanning
562          * the list of drivers in order to probe new devices.  Check to see
563          * if the probe was successful, and make sure any forced probes of
564          * new devices fail.
565          */
566         spin_lock(&platform_bus_type.p->klist_drivers.k_lock);
567         drv->probe = NULL;
568         if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
569                 retval = -ENODEV;
570         drv->driver.probe = platform_drv_probe_fail;
571         spin_unlock(&platform_bus_type.p->klist_drivers.k_lock);
572
573         if (code != retval)
574                 platform_driver_unregister(drv);
575         return retval;
576 }
577 EXPORT_SYMBOL_GPL(platform_driver_probe);
578
579 /* modalias support enables more hands-off userspace setup:
580  * (a) environment variable lets new-style hotplug events work once system is
581  *     fully running:  "modprobe $MODALIAS"
582  * (b) sysfs attribute lets new-style coldplug recover from hotplug events
583  *     mishandled before system is fully running:  "modprobe $(cat modalias)"
584  */
585 static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
586                              char *buf)
587 {
588         struct platform_device  *pdev = to_platform_device(dev);
589         int len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name);
590
591         return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
592 }
593
594 static struct device_attribute platform_dev_attrs[] = {
595         __ATTR_RO(modalias),
596         __ATTR_NULL,
597 };
598
599 static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
600 {
601         struct platform_device  *pdev = to_platform_device(dev);
602
603         add_uevent_var(env, "MODALIAS=%s%s", PLATFORM_MODULE_PREFIX,
604                 (pdev->id_entry) ? pdev->id_entry->name : pdev->name);
605         return 0;
606 }
607
608 static const struct platform_device_id *platform_match_id(
609                         struct platform_device_id *id,
610                         struct platform_device *pdev)
611 {
612         while (id->name[0]) {
613                 if (strcmp(pdev->name, id->name) == 0) {
614                         pdev->id_entry = id;
615                         return id;
616                 }
617                 id++;
618         }
619         return NULL;
620 }
621
622 /**
623  * platform_match - bind platform device to platform driver.
624  * @dev: device.
625  * @drv: driver.
626  *
627  * Platform device IDs are assumed to be encoded like this:
628  * "<name><instance>", where <name> is a short description of the type of
629  * device, like "pci" or "floppy", and <instance> is the enumerated
630  * instance of the device, like '0' or '42'.  Driver IDs are simply
631  * "<name>".  So, extract the <name> from the platform_device structure,
632  * and compare it against the name of the driver. Return whether they match
633  * or not.
634  */
635 static int platform_match(struct device *dev, struct device_driver *drv)
636 {
637         struct platform_device *pdev = to_platform_device(dev);
638         struct platform_driver *pdrv = to_platform_driver(drv);
639
640         /* match against the id table first */
641         if (pdrv->id_table)
642                 return platform_match_id(pdrv->id_table, pdev) != NULL;
643
644         /* fall-back to driver name match */
645         return (strcmp(pdev->name, drv->name) == 0);
646 }
647
648 #ifdef CONFIG_PM_SLEEP
649
650 static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
651 {
652         int ret = 0;
653
654         if (dev->driver && dev->driver->suspend)
655                 ret = dev->driver->suspend(dev, mesg);
656
657         return ret;
658 }
659
660 static int platform_legacy_suspend_late(struct device *dev, pm_message_t mesg)
661 {
662         struct platform_driver *pdrv = to_platform_driver(dev->driver);
663         struct platform_device *pdev = to_platform_device(dev);
664         int ret = 0;
665
666         if (dev->driver && pdrv->suspend_late)
667                 ret = pdrv->suspend_late(pdev, mesg);
668
669         return ret;
670 }
671
672 static int platform_legacy_resume_early(struct device *dev)
673 {
674         struct platform_driver *pdrv = to_platform_driver(dev->driver);
675         struct platform_device *pdev = to_platform_device(dev);
676         int ret = 0;
677
678         if (dev->driver && pdrv->resume_early)
679                 ret = pdrv->resume_early(pdev);
680
681         return ret;
682 }
683
684 static int platform_legacy_resume(struct device *dev)
685 {
686         int ret = 0;
687
688         if (dev->driver && dev->driver->resume)
689                 ret = dev->driver->resume(dev);
690
691         return ret;
692 }
693
694 static int platform_pm_prepare(struct device *dev)
695 {
696         struct device_driver *drv = dev->driver;
697         int ret = 0;
698
699         if (drv && drv->pm && drv->pm->prepare)
700                 ret = drv->pm->prepare(dev);
701
702         return ret;
703 }
704
705 static void platform_pm_complete(struct device *dev)
706 {
707         struct device_driver *drv = dev->driver;
708
709         if (drv && drv->pm && drv->pm->complete)
710                 drv->pm->complete(dev);
711 }
712
713 #ifdef CONFIG_SUSPEND
714
715 static int platform_pm_suspend(struct device *dev)
716 {
717         struct device_driver *drv = dev->driver;
718         int ret = 0;
719
720         if (!drv)
721                 return 0;
722
723         if (drv->pm) {
724                 if (drv->pm->suspend)
725                         ret = drv->pm->suspend(dev);
726         } else {
727                 ret = platform_legacy_suspend(dev, PMSG_SUSPEND);
728         }
729
730         return ret;
731 }
732
733 static int platform_pm_suspend_noirq(struct device *dev)
734 {
735         struct device_driver *drv = dev->driver;
736         int ret = 0;
737
738         if (!drv)
739                 return 0;
740
741         if (drv->pm) {
742                 if (drv->pm->suspend_noirq)
743                         ret = drv->pm->suspend_noirq(dev);
744         } else {
745                 ret = platform_legacy_suspend_late(dev, PMSG_SUSPEND);
746         }
747
748         return ret;
749 }
750
751 static int platform_pm_resume(struct device *dev)
752 {
753         struct device_driver *drv = dev->driver;
754         int ret = 0;
755
756         if (!drv)
757                 return 0;
758
759         if (drv->pm) {
760                 if (drv->pm->resume)
761                         ret = drv->pm->resume(dev);
762         } else {
763                 ret = platform_legacy_resume(dev);
764         }
765
766         return ret;
767 }
768
769 static int platform_pm_resume_noirq(struct device *dev)
770 {
771         struct device_driver *drv = dev->driver;
772         int ret = 0;
773
774         if (!drv)
775                 return 0;
776
777         if (drv->pm) {
778                 if (drv->pm->resume_noirq)
779                         ret = drv->pm->resume_noirq(dev);
780         } else {
781                 ret = platform_legacy_resume_early(dev);
782         }
783
784         return ret;
785 }
786
787 #else /* !CONFIG_SUSPEND */
788
789 #define platform_pm_suspend             NULL
790 #define platform_pm_resume              NULL
791 #define platform_pm_suspend_noirq       NULL
792 #define platform_pm_resume_noirq        NULL
793
794 #endif /* !CONFIG_SUSPEND */
795
796 #ifdef CONFIG_HIBERNATION
797
798 static int platform_pm_freeze(struct device *dev)
799 {
800         struct device_driver *drv = dev->driver;
801         int ret = 0;
802
803         if (!drv)
804                 return 0;
805
806         if (drv->pm) {
807                 if (drv->pm->freeze)
808                         ret = drv->pm->freeze(dev);
809         } else {
810                 ret = platform_legacy_suspend(dev, PMSG_FREEZE);
811         }
812
813         return ret;
814 }
815
816 static int platform_pm_freeze_noirq(struct device *dev)
817 {
818         struct device_driver *drv = dev->driver;
819         int ret = 0;
820
821         if (!drv)
822                 return 0;
823
824         if (drv->pm) {
825                 if (drv->pm->freeze_noirq)
826                         ret = drv->pm->freeze_noirq(dev);
827         } else {
828                 ret = platform_legacy_suspend_late(dev, PMSG_FREEZE);
829         }
830
831         return ret;
832 }
833
834 static int platform_pm_thaw(struct device *dev)
835 {
836         struct device_driver *drv = dev->driver;
837         int ret = 0;
838
839         if (!drv)
840                 return 0;
841
842         if (drv->pm) {
843                 if (drv->pm->thaw)
844                         ret = drv->pm->thaw(dev);
845         } else {
846                 ret = platform_legacy_resume(dev);
847         }
848
849         return ret;
850 }
851
852 static int platform_pm_thaw_noirq(struct device *dev)
853 {
854         struct device_driver *drv = dev->driver;
855         int ret = 0;
856
857         if (!drv)
858                 return 0;
859
860         if (drv->pm) {
861                 if (drv->pm->thaw_noirq)
862                         ret = drv->pm->thaw_noirq(dev);
863         } else {
864                 ret = platform_legacy_resume_early(dev);
865         }
866
867         return ret;
868 }
869
870 static int platform_pm_poweroff(struct device *dev)
871 {
872         struct device_driver *drv = dev->driver;
873         int ret = 0;
874
875         if (!drv)
876                 return 0;
877
878         if (drv->pm) {
879                 if (drv->pm->poweroff)
880                         ret = drv->pm->poweroff(dev);
881         } else {
882                 ret = platform_legacy_suspend(dev, PMSG_HIBERNATE);
883         }
884
885         return ret;
886 }
887
888 static int platform_pm_poweroff_noirq(struct device *dev)
889 {
890         struct device_driver *drv = dev->driver;
891         int ret = 0;
892
893         if (!drv)
894                 return 0;
895
896         if (drv->pm) {
897                 if (drv->pm->poweroff_noirq)
898                         ret = drv->pm->poweroff_noirq(dev);
899         } else {
900                 ret = platform_legacy_suspend_late(dev, PMSG_HIBERNATE);
901         }
902
903         return ret;
904 }
905
906 static int platform_pm_restore(struct device *dev)
907 {
908         struct device_driver *drv = dev->driver;
909         int ret = 0;
910
911         if (!drv)
912                 return 0;
913
914         if (drv->pm) {
915                 if (drv->pm->restore)
916                         ret = drv->pm->restore(dev);
917         } else {
918                 ret = platform_legacy_resume(dev);
919         }
920
921         return ret;
922 }
923
924 static int platform_pm_restore_noirq(struct device *dev)
925 {
926         struct device_driver *drv = dev->driver;
927         int ret = 0;
928
929         if (!drv)
930                 return 0;
931
932         if (drv->pm) {
933                 if (drv->pm->restore_noirq)
934                         ret = drv->pm->restore_noirq(dev);
935         } else {
936                 ret = platform_legacy_resume_early(dev);
937         }
938
939         return ret;
940 }
941
942 #else /* !CONFIG_HIBERNATION */
943
944 #define platform_pm_freeze              NULL
945 #define platform_pm_thaw                NULL
946 #define platform_pm_poweroff            NULL
947 #define platform_pm_restore             NULL
948 #define platform_pm_freeze_noirq        NULL
949 #define platform_pm_thaw_noirq          NULL
950 #define platform_pm_poweroff_noirq      NULL
951 #define platform_pm_restore_noirq       NULL
952
953 #endif /* !CONFIG_HIBERNATION */
954
955 static struct dev_pm_ops platform_dev_pm_ops = {
956         .prepare = platform_pm_prepare,
957         .complete = platform_pm_complete,
958         .suspend = platform_pm_suspend,
959         .resume = platform_pm_resume,
960         .freeze = platform_pm_freeze,
961         .thaw = platform_pm_thaw,
962         .poweroff = platform_pm_poweroff,
963         .restore = platform_pm_restore,
964         .suspend_noirq = platform_pm_suspend_noirq,
965         .resume_noirq = platform_pm_resume_noirq,
966         .freeze_noirq = platform_pm_freeze_noirq,
967         .thaw_noirq = platform_pm_thaw_noirq,
968         .poweroff_noirq = platform_pm_poweroff_noirq,
969         .restore_noirq = platform_pm_restore_noirq,
970 };
971
972 #define PLATFORM_PM_OPS_PTR     (&platform_dev_pm_ops)
973
974 #else /* !CONFIG_PM_SLEEP */
975
976 #define PLATFORM_PM_OPS_PTR     NULL
977
978 #endif /* !CONFIG_PM_SLEEP */
979
980 struct bus_type platform_bus_type = {
981         .name           = "platform",
982         .dev_attrs      = platform_dev_attrs,
983         .match          = platform_match,
984         .uevent         = platform_uevent,
985         .pm             = PLATFORM_PM_OPS_PTR,
986 };
987 EXPORT_SYMBOL_GPL(platform_bus_type);
988
989 int __init platform_bus_init(void)
990 {
991         int error;
992
993         error = device_register(&platform_bus);
994         if (error)
995                 return error;
996         error =  bus_register(&platform_bus_type);
997         if (error)
998                 device_unregister(&platform_bus);
999         return error;
1000 }
1001
1002 #ifndef ARCH_HAS_DMA_GET_REQUIRED_MASK
1003 u64 dma_get_required_mask(struct device *dev)
1004 {
1005         u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT);
1006         u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT));
1007         u64 mask;
1008
1009         if (!high_totalram) {
1010                 /* convert to mask just covering totalram */
1011                 low_totalram = (1 << (fls(low_totalram) - 1));
1012                 low_totalram += low_totalram - 1;
1013                 mask = low_totalram;
1014         } else {
1015                 high_totalram = (1 << (fls(high_totalram) - 1));
1016                 high_totalram += high_totalram - 1;
1017                 mask = (((u64)high_totalram) << 32) + 0xffffffff;
1018         }
1019         return mask;
1020 }
1021 EXPORT_SYMBOL_GPL(dma_get_required_mask);
1022 #endif