Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/base/platform.c
15109 views
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/string.h>
14
#include <linux/platform_device.h>
15
#include <linux/of_device.h>
16
#include <linux/module.h>
17
#include <linux/init.h>
18
#include <linux/dma-mapping.h>
19
#include <linux/bootmem.h>
20
#include <linux/err.h>
21
#include <linux/slab.h>
22
#include <linux/pm_runtime.h>
23
24
#include "base.h"
25
26
#define to_platform_driver(drv) (container_of((drv), struct platform_driver, \
27
driver))
28
29
struct device platform_bus = {
30
.init_name = "platform",
31
};
32
EXPORT_SYMBOL_GPL(platform_bus);
33
34
/**
35
* platform_get_resource - get a resource for a device
36
* @dev: platform device
37
* @type: resource type
38
* @num: resource index
39
*/
40
struct resource *platform_get_resource(struct platform_device *dev,
41
unsigned int type, unsigned int num)
42
{
43
int i;
44
45
for (i = 0; i < dev->num_resources; i++) {
46
struct resource *r = &dev->resource[i];
47
48
if (type == resource_type(r) && num-- == 0)
49
return r;
50
}
51
return NULL;
52
}
53
EXPORT_SYMBOL_GPL(platform_get_resource);
54
55
/**
56
* platform_get_irq - get an IRQ for a device
57
* @dev: platform device
58
* @num: IRQ number index
59
*/
60
int platform_get_irq(struct platform_device *dev, unsigned int num)
61
{
62
struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num);
63
64
return r ? r->start : -ENXIO;
65
}
66
EXPORT_SYMBOL_GPL(platform_get_irq);
67
68
/**
69
* platform_get_resource_byname - get a resource for a device by name
70
* @dev: platform device
71
* @type: resource type
72
* @name: resource name
73
*/
74
struct resource *platform_get_resource_byname(struct platform_device *dev,
75
unsigned int type,
76
const char *name)
77
{
78
int i;
79
80
for (i = 0; i < dev->num_resources; i++) {
81
struct resource *r = &dev->resource[i];
82
83
if (type == resource_type(r) && !strcmp(r->name, name))
84
return r;
85
}
86
return NULL;
87
}
88
EXPORT_SYMBOL_GPL(platform_get_resource_byname);
89
90
/**
91
* platform_get_irq - get an IRQ for a device
92
* @dev: platform device
93
* @name: IRQ name
94
*/
95
int platform_get_irq_byname(struct platform_device *dev, const char *name)
96
{
97
struct resource *r = platform_get_resource_byname(dev, IORESOURCE_IRQ,
98
name);
99
100
return r ? r->start : -ENXIO;
101
}
102
EXPORT_SYMBOL_GPL(platform_get_irq_byname);
103
104
/**
105
* platform_add_devices - add a numbers of platform devices
106
* @devs: array of platform devices to add
107
* @num: number of platform devices in array
108
*/
109
int platform_add_devices(struct platform_device **devs, int num)
110
{
111
int i, ret = 0;
112
113
for (i = 0; i < num; i++) {
114
ret = platform_device_register(devs[i]);
115
if (ret) {
116
while (--i >= 0)
117
platform_device_unregister(devs[i]);
118
break;
119
}
120
}
121
122
return ret;
123
}
124
EXPORT_SYMBOL_GPL(platform_add_devices);
125
126
struct platform_object {
127
struct platform_device pdev;
128
char name[1];
129
};
130
131
/**
132
* platform_device_put - destroy a platform device
133
* @pdev: platform device to free
134
*
135
* Free all memory associated with a platform device. This function must
136
* _only_ be externally called in error cases. All other usage is a bug.
137
*/
138
void platform_device_put(struct platform_device *pdev)
139
{
140
if (pdev)
141
put_device(&pdev->dev);
142
}
143
EXPORT_SYMBOL_GPL(platform_device_put);
144
145
static void platform_device_release(struct device *dev)
146
{
147
struct platform_object *pa = container_of(dev, struct platform_object,
148
pdev.dev);
149
150
of_device_node_put(&pa->pdev.dev);
151
kfree(pa->pdev.dev.platform_data);
152
kfree(pa->pdev.mfd_cell);
153
kfree(pa->pdev.resource);
154
kfree(pa);
155
}
156
157
/**
158
* platform_device_alloc - create a platform device
159
* @name: base name of the device we're adding
160
* @id: instance id
161
*
162
* Create a platform device object which can have other objects attached
163
* to it, and which will have attached objects freed when it is released.
164
*/
165
struct platform_device *platform_device_alloc(const char *name, int id)
166
{
167
struct platform_object *pa;
168
169
pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
170
if (pa) {
171
strcpy(pa->name, name);
172
pa->pdev.name = pa->name;
173
pa->pdev.id = id;
174
device_initialize(&pa->pdev.dev);
175
pa->pdev.dev.release = platform_device_release;
176
}
177
178
return pa ? &pa->pdev : NULL;
179
}
180
EXPORT_SYMBOL_GPL(platform_device_alloc);
181
182
/**
183
* platform_device_add_resources - add resources to a platform device
184
* @pdev: platform device allocated by platform_device_alloc to add resources to
185
* @res: set of resources that needs to be allocated for the device
186
* @num: number of resources
187
*
188
* Add a copy of the resources to the platform device. The memory
189
* associated with the resources will be freed when the platform device is
190
* released.
191
*/
192
int platform_device_add_resources(struct platform_device *pdev,
193
const struct resource *res, unsigned int num)
194
{
195
struct resource *r = NULL;
196
197
if (res) {
198
r = kmemdup(res, sizeof(struct resource) * num, GFP_KERNEL);
199
if (!r)
200
return -ENOMEM;
201
}
202
203
kfree(pdev->resource);
204
pdev->resource = r;
205
pdev->num_resources = num;
206
return 0;
207
}
208
EXPORT_SYMBOL_GPL(platform_device_add_resources);
209
210
/**
211
* platform_device_add_data - add platform-specific data to a platform device
212
* @pdev: platform device allocated by platform_device_alloc to add resources to
213
* @data: platform specific data for this platform device
214
* @size: size of platform specific data
215
*
216
* Add a copy of platform specific data to the platform device's
217
* platform_data pointer. The memory associated with the platform data
218
* will be freed when the platform device is released.
219
*/
220
int platform_device_add_data(struct platform_device *pdev, const void *data,
221
size_t size)
222
{
223
void *d = NULL;
224
225
if (data) {
226
d = kmemdup(data, size, GFP_KERNEL);
227
if (!d)
228
return -ENOMEM;
229
}
230
231
kfree(pdev->dev.platform_data);
232
pdev->dev.platform_data = d;
233
return 0;
234
}
235
EXPORT_SYMBOL_GPL(platform_device_add_data);
236
237
/**
238
* platform_device_add - add a platform device to device hierarchy
239
* @pdev: platform device we're adding
240
*
241
* This is part 2 of platform_device_register(), though may be called
242
* separately _iff_ pdev was allocated by platform_device_alloc().
243
*/
244
int platform_device_add(struct platform_device *pdev)
245
{
246
int i, ret = 0;
247
248
if (!pdev)
249
return -EINVAL;
250
251
if (!pdev->dev.parent)
252
pdev->dev.parent = &platform_bus;
253
254
pdev->dev.bus = &platform_bus_type;
255
256
if (pdev->id != -1)
257
dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
258
else
259
dev_set_name(&pdev->dev, "%s", pdev->name);
260
261
for (i = 0; i < pdev->num_resources; i++) {
262
struct resource *p, *r = &pdev->resource[i];
263
264
if (r->name == NULL)
265
r->name = dev_name(&pdev->dev);
266
267
p = r->parent;
268
if (!p) {
269
if (resource_type(r) == IORESOURCE_MEM)
270
p = &iomem_resource;
271
else if (resource_type(r) == IORESOURCE_IO)
272
p = &ioport_resource;
273
}
274
275
if (p && insert_resource(p, r)) {
276
printk(KERN_ERR
277
"%s: failed to claim resource %d\n",
278
dev_name(&pdev->dev), i);
279
ret = -EBUSY;
280
goto failed;
281
}
282
}
283
284
pr_debug("Registering platform device '%s'. Parent at %s\n",
285
dev_name(&pdev->dev), dev_name(pdev->dev.parent));
286
287
ret = device_add(&pdev->dev);
288
if (ret == 0)
289
return ret;
290
291
failed:
292
while (--i >= 0) {
293
struct resource *r = &pdev->resource[i];
294
unsigned long type = resource_type(r);
295
296
if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
297
release_resource(r);
298
}
299
300
return ret;
301
}
302
EXPORT_SYMBOL_GPL(platform_device_add);
303
304
/**
305
* platform_device_del - remove a platform-level device
306
* @pdev: platform device we're removing
307
*
308
* Note that this function will also release all memory- and port-based
309
* resources owned by the device (@dev->resource). This function must
310
* _only_ be externally called in error cases. All other usage is a bug.
311
*/
312
void platform_device_del(struct platform_device *pdev)
313
{
314
int i;
315
316
if (pdev) {
317
device_del(&pdev->dev);
318
319
for (i = 0; i < pdev->num_resources; i++) {
320
struct resource *r = &pdev->resource[i];
321
unsigned long type = resource_type(r);
322
323
if (type == IORESOURCE_MEM || type == IORESOURCE_IO)
324
release_resource(r);
325
}
326
}
327
}
328
EXPORT_SYMBOL_GPL(platform_device_del);
329
330
/**
331
* platform_device_register - add a platform-level device
332
* @pdev: platform device we're adding
333
*/
334
int platform_device_register(struct platform_device *pdev)
335
{
336
device_initialize(&pdev->dev);
337
return platform_device_add(pdev);
338
}
339
EXPORT_SYMBOL_GPL(platform_device_register);
340
341
/**
342
* platform_device_unregister - unregister a platform-level device
343
* @pdev: platform device we're unregistering
344
*
345
* Unregistration is done in 2 steps. First we release all resources
346
* and remove it from the subsystem, then we drop reference count by
347
* calling platform_device_put().
348
*/
349
void platform_device_unregister(struct platform_device *pdev)
350
{
351
platform_device_del(pdev);
352
platform_device_put(pdev);
353
}
354
EXPORT_SYMBOL_GPL(platform_device_unregister);
355
356
/**
357
* platform_device_register_resndata - add a platform-level device with
358
* resources and platform-specific data
359
*
360
* @parent: parent device for the device we're adding
361
* @name: base name of the device we're adding
362
* @id: instance id
363
* @res: set of resources that needs to be allocated for the device
364
* @num: number of resources
365
* @data: platform specific data for this platform device
366
* @size: size of platform specific data
367
*
368
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
369
*/
370
struct platform_device *platform_device_register_resndata(
371
struct device *parent,
372
const char *name, int id,
373
const struct resource *res, unsigned int num,
374
const void *data, size_t size)
375
{
376
int ret = -ENOMEM;
377
struct platform_device *pdev;
378
379
pdev = platform_device_alloc(name, id);
380
if (!pdev)
381
goto err;
382
383
pdev->dev.parent = parent;
384
385
ret = platform_device_add_resources(pdev, res, num);
386
if (ret)
387
goto err;
388
389
ret = platform_device_add_data(pdev, data, size);
390
if (ret)
391
goto err;
392
393
ret = platform_device_add(pdev);
394
if (ret) {
395
err:
396
platform_device_put(pdev);
397
return ERR_PTR(ret);
398
}
399
400
return pdev;
401
}
402
EXPORT_SYMBOL_GPL(platform_device_register_resndata);
403
404
static int platform_drv_probe(struct device *_dev)
405
{
406
struct platform_driver *drv = to_platform_driver(_dev->driver);
407
struct platform_device *dev = to_platform_device(_dev);
408
409
return drv->probe(dev);
410
}
411
412
static int platform_drv_probe_fail(struct device *_dev)
413
{
414
return -ENXIO;
415
}
416
417
static int platform_drv_remove(struct device *_dev)
418
{
419
struct platform_driver *drv = to_platform_driver(_dev->driver);
420
struct platform_device *dev = to_platform_device(_dev);
421
422
return drv->remove(dev);
423
}
424
425
static void platform_drv_shutdown(struct device *_dev)
426
{
427
struct platform_driver *drv = to_platform_driver(_dev->driver);
428
struct platform_device *dev = to_platform_device(_dev);
429
430
drv->shutdown(dev);
431
}
432
433
/**
434
* platform_driver_register - register a driver for platform-level devices
435
* @drv: platform driver structure
436
*/
437
int platform_driver_register(struct platform_driver *drv)
438
{
439
drv->driver.bus = &platform_bus_type;
440
if (drv->probe)
441
drv->driver.probe = platform_drv_probe;
442
if (drv->remove)
443
drv->driver.remove = platform_drv_remove;
444
if (drv->shutdown)
445
drv->driver.shutdown = platform_drv_shutdown;
446
447
return driver_register(&drv->driver);
448
}
449
EXPORT_SYMBOL_GPL(platform_driver_register);
450
451
/**
452
* platform_driver_unregister - unregister a driver for platform-level devices
453
* @drv: platform driver structure
454
*/
455
void platform_driver_unregister(struct platform_driver *drv)
456
{
457
driver_unregister(&drv->driver);
458
}
459
EXPORT_SYMBOL_GPL(platform_driver_unregister);
460
461
/**
462
* platform_driver_probe - register driver for non-hotpluggable device
463
* @drv: platform driver structure
464
* @probe: the driver probe routine, probably from an __init section
465
*
466
* Use this instead of platform_driver_register() when you know the device
467
* is not hotpluggable and has already been registered, and you want to
468
* remove its run-once probe() infrastructure from memory after the driver
469
* has bound to the device.
470
*
471
* One typical use for this would be with drivers for controllers integrated
472
* into system-on-chip processors, where the controller devices have been
473
* configured as part of board setup.
474
*
475
* Returns zero if the driver registered and bound to a device, else returns
476
* a negative error code and with the driver not registered.
477
*/
478
int __init_or_module platform_driver_probe(struct platform_driver *drv,
479
int (*probe)(struct platform_device *))
480
{
481
int retval, code;
482
483
/* make sure driver won't have bind/unbind attributes */
484
drv->driver.suppress_bind_attrs = true;
485
486
/* temporary section violation during probe() */
487
drv->probe = probe;
488
retval = code = platform_driver_register(drv);
489
490
/*
491
* Fixup that section violation, being paranoid about code scanning
492
* the list of drivers in order to probe new devices. Check to see
493
* if the probe was successful, and make sure any forced probes of
494
* new devices fail.
495
*/
496
spin_lock(&drv->driver.bus->p->klist_drivers.k_lock);
497
drv->probe = NULL;
498
if (code == 0 && list_empty(&drv->driver.p->klist_devices.k_list))
499
retval = -ENODEV;
500
drv->driver.probe = platform_drv_probe_fail;
501
spin_unlock(&drv->driver.bus->p->klist_drivers.k_lock);
502
503
if (code != retval)
504
platform_driver_unregister(drv);
505
return retval;
506
}
507
EXPORT_SYMBOL_GPL(platform_driver_probe);
508
509
/**
510
* platform_create_bundle - register driver and create corresponding device
511
* @driver: platform driver structure
512
* @probe: the driver probe routine, probably from an __init section
513
* @res: set of resources that needs to be allocated for the device
514
* @n_res: number of resources
515
* @data: platform specific data for this platform device
516
* @size: size of platform specific data
517
*
518
* Use this in legacy-style modules that probe hardware directly and
519
* register a single platform device and corresponding platform driver.
520
*
521
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
522
*/
523
struct platform_device * __init_or_module platform_create_bundle(
524
struct platform_driver *driver,
525
int (*probe)(struct platform_device *),
526
struct resource *res, unsigned int n_res,
527
const void *data, size_t size)
528
{
529
struct platform_device *pdev;
530
int error;
531
532
pdev = platform_device_alloc(driver->driver.name, -1);
533
if (!pdev) {
534
error = -ENOMEM;
535
goto err_out;
536
}
537
538
error = platform_device_add_resources(pdev, res, n_res);
539
if (error)
540
goto err_pdev_put;
541
542
error = platform_device_add_data(pdev, data, size);
543
if (error)
544
goto err_pdev_put;
545
546
error = platform_device_add(pdev);
547
if (error)
548
goto err_pdev_put;
549
550
error = platform_driver_probe(driver, probe);
551
if (error)
552
goto err_pdev_del;
553
554
return pdev;
555
556
err_pdev_del:
557
platform_device_del(pdev);
558
err_pdev_put:
559
platform_device_put(pdev);
560
err_out:
561
return ERR_PTR(error);
562
}
563
EXPORT_SYMBOL_GPL(platform_create_bundle);
564
565
/* modalias support enables more hands-off userspace setup:
566
* (a) environment variable lets new-style hotplug events work once system is
567
* fully running: "modprobe $MODALIAS"
568
* (b) sysfs attribute lets new-style coldplug recover from hotplug events
569
* mishandled before system is fully running: "modprobe $(cat modalias)"
570
*/
571
static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
572
char *buf)
573
{
574
struct platform_device *pdev = to_platform_device(dev);
575
int len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name);
576
577
return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
578
}
579
580
static struct device_attribute platform_dev_attrs[] = {
581
__ATTR_RO(modalias),
582
__ATTR_NULL,
583
};
584
585
static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
586
{
587
struct platform_device *pdev = to_platform_device(dev);
588
int rc;
589
590
/* Some devices have extra OF data and an OF-style MODALIAS */
591
rc = of_device_uevent(dev,env);
592
if (rc != -ENODEV)
593
return rc;
594
595
add_uevent_var(env, "MODALIAS=%s%s", PLATFORM_MODULE_PREFIX,
596
(pdev->id_entry) ? pdev->id_entry->name : pdev->name);
597
return 0;
598
}
599
600
static const struct platform_device_id *platform_match_id(
601
const struct platform_device_id *id,
602
struct platform_device *pdev)
603
{
604
while (id->name[0]) {
605
if (strcmp(pdev->name, id->name) == 0) {
606
pdev->id_entry = id;
607
return id;
608
}
609
id++;
610
}
611
return NULL;
612
}
613
614
/**
615
* platform_match - bind platform device to platform driver.
616
* @dev: device.
617
* @drv: driver.
618
*
619
* Platform device IDs are assumed to be encoded like this:
620
* "<name><instance>", where <name> is a short description of the type of
621
* device, like "pci" or "floppy", and <instance> is the enumerated
622
* instance of the device, like '0' or '42'. Driver IDs are simply
623
* "<name>". So, extract the <name> from the platform_device structure,
624
* and compare it against the name of the driver. Return whether they match
625
* or not.
626
*/
627
static int platform_match(struct device *dev, struct device_driver *drv)
628
{
629
struct platform_device *pdev = to_platform_device(dev);
630
struct platform_driver *pdrv = to_platform_driver(drv);
631
632
/* Attempt an OF style match first */
633
if (of_driver_match_device(dev, drv))
634
return 1;
635
636
/* Then try to match against the id table */
637
if (pdrv->id_table)
638
return platform_match_id(pdrv->id_table, pdev) != NULL;
639
640
/* fall-back to driver name match */
641
return (strcmp(pdev->name, drv->name) == 0);
642
}
643
644
#ifdef CONFIG_PM_SLEEP
645
646
static int platform_legacy_suspend(struct device *dev, pm_message_t mesg)
647
{
648
struct platform_driver *pdrv = to_platform_driver(dev->driver);
649
struct platform_device *pdev = to_platform_device(dev);
650
int ret = 0;
651
652
if (dev->driver && pdrv->suspend)
653
ret = pdrv->suspend(pdev, mesg);
654
655
return ret;
656
}
657
658
static int platform_legacy_resume(struct device *dev)
659
{
660
struct platform_driver *pdrv = to_platform_driver(dev->driver);
661
struct platform_device *pdev = to_platform_device(dev);
662
int ret = 0;
663
664
if (dev->driver && pdrv->resume)
665
ret = pdrv->resume(pdev);
666
667
return ret;
668
}
669
670
int platform_pm_prepare(struct device *dev)
671
{
672
struct device_driver *drv = dev->driver;
673
int ret = 0;
674
675
if (drv && drv->pm && drv->pm->prepare)
676
ret = drv->pm->prepare(dev);
677
678
return ret;
679
}
680
681
void platform_pm_complete(struct device *dev)
682
{
683
struct device_driver *drv = dev->driver;
684
685
if (drv && drv->pm && drv->pm->complete)
686
drv->pm->complete(dev);
687
}
688
689
#endif /* CONFIG_PM_SLEEP */
690
691
#ifdef CONFIG_SUSPEND
692
693
int platform_pm_suspend(struct device *dev)
694
{
695
struct device_driver *drv = dev->driver;
696
int ret = 0;
697
698
if (!drv)
699
return 0;
700
701
if (drv->pm) {
702
if (drv->pm->suspend)
703
ret = drv->pm->suspend(dev);
704
} else {
705
ret = platform_legacy_suspend(dev, PMSG_SUSPEND);
706
}
707
708
return ret;
709
}
710
711
int platform_pm_suspend_noirq(struct device *dev)
712
{
713
struct device_driver *drv = dev->driver;
714
int ret = 0;
715
716
if (!drv)
717
return 0;
718
719
if (drv->pm) {
720
if (drv->pm->suspend_noirq)
721
ret = drv->pm->suspend_noirq(dev);
722
}
723
724
return ret;
725
}
726
727
int platform_pm_resume(struct device *dev)
728
{
729
struct device_driver *drv = dev->driver;
730
int ret = 0;
731
732
if (!drv)
733
return 0;
734
735
if (drv->pm) {
736
if (drv->pm->resume)
737
ret = drv->pm->resume(dev);
738
} else {
739
ret = platform_legacy_resume(dev);
740
}
741
742
return ret;
743
}
744
745
int platform_pm_resume_noirq(struct device *dev)
746
{
747
struct device_driver *drv = dev->driver;
748
int ret = 0;
749
750
if (!drv)
751
return 0;
752
753
if (drv->pm) {
754
if (drv->pm->resume_noirq)
755
ret = drv->pm->resume_noirq(dev);
756
}
757
758
return ret;
759
}
760
761
#endif /* CONFIG_SUSPEND */
762
763
#ifdef CONFIG_HIBERNATE_CALLBACKS
764
765
int platform_pm_freeze(struct device *dev)
766
{
767
struct device_driver *drv = dev->driver;
768
int ret = 0;
769
770
if (!drv)
771
return 0;
772
773
if (drv->pm) {
774
if (drv->pm->freeze)
775
ret = drv->pm->freeze(dev);
776
} else {
777
ret = platform_legacy_suspend(dev, PMSG_FREEZE);
778
}
779
780
return ret;
781
}
782
783
int platform_pm_freeze_noirq(struct device *dev)
784
{
785
struct device_driver *drv = dev->driver;
786
int ret = 0;
787
788
if (!drv)
789
return 0;
790
791
if (drv->pm) {
792
if (drv->pm->freeze_noirq)
793
ret = drv->pm->freeze_noirq(dev);
794
}
795
796
return ret;
797
}
798
799
int platform_pm_thaw(struct device *dev)
800
{
801
struct device_driver *drv = dev->driver;
802
int ret = 0;
803
804
if (!drv)
805
return 0;
806
807
if (drv->pm) {
808
if (drv->pm->thaw)
809
ret = drv->pm->thaw(dev);
810
} else {
811
ret = platform_legacy_resume(dev);
812
}
813
814
return ret;
815
}
816
817
int platform_pm_thaw_noirq(struct device *dev)
818
{
819
struct device_driver *drv = dev->driver;
820
int ret = 0;
821
822
if (!drv)
823
return 0;
824
825
if (drv->pm) {
826
if (drv->pm->thaw_noirq)
827
ret = drv->pm->thaw_noirq(dev);
828
}
829
830
return ret;
831
}
832
833
int platform_pm_poweroff(struct device *dev)
834
{
835
struct device_driver *drv = dev->driver;
836
int ret = 0;
837
838
if (!drv)
839
return 0;
840
841
if (drv->pm) {
842
if (drv->pm->poweroff)
843
ret = drv->pm->poweroff(dev);
844
} else {
845
ret = platform_legacy_suspend(dev, PMSG_HIBERNATE);
846
}
847
848
return ret;
849
}
850
851
int platform_pm_poweroff_noirq(struct device *dev)
852
{
853
struct device_driver *drv = dev->driver;
854
int ret = 0;
855
856
if (!drv)
857
return 0;
858
859
if (drv->pm) {
860
if (drv->pm->poweroff_noirq)
861
ret = drv->pm->poweroff_noirq(dev);
862
}
863
864
return ret;
865
}
866
867
int platform_pm_restore(struct device *dev)
868
{
869
struct device_driver *drv = dev->driver;
870
int ret = 0;
871
872
if (!drv)
873
return 0;
874
875
if (drv->pm) {
876
if (drv->pm->restore)
877
ret = drv->pm->restore(dev);
878
} else {
879
ret = platform_legacy_resume(dev);
880
}
881
882
return ret;
883
}
884
885
int platform_pm_restore_noirq(struct device *dev)
886
{
887
struct device_driver *drv = dev->driver;
888
int ret = 0;
889
890
if (!drv)
891
return 0;
892
893
if (drv->pm) {
894
if (drv->pm->restore_noirq)
895
ret = drv->pm->restore_noirq(dev);
896
}
897
898
return ret;
899
}
900
901
#endif /* CONFIG_HIBERNATE_CALLBACKS */
902
903
static const struct dev_pm_ops platform_dev_pm_ops = {
904
.runtime_suspend = pm_generic_runtime_suspend,
905
.runtime_resume = pm_generic_runtime_resume,
906
.runtime_idle = pm_generic_runtime_idle,
907
USE_PLATFORM_PM_SLEEP_OPS
908
};
909
910
struct bus_type platform_bus_type = {
911
.name = "platform",
912
.dev_attrs = platform_dev_attrs,
913
.match = platform_match,
914
.uevent = platform_uevent,
915
.pm = &platform_dev_pm_ops,
916
};
917
EXPORT_SYMBOL_GPL(platform_bus_type);
918
919
int __init platform_bus_init(void)
920
{
921
int error;
922
923
early_platform_cleanup();
924
925
error = device_register(&platform_bus);
926
if (error)
927
return error;
928
error = bus_register(&platform_bus_type);
929
if (error)
930
device_unregister(&platform_bus);
931
return error;
932
}
933
934
#ifndef ARCH_HAS_DMA_GET_REQUIRED_MASK
935
u64 dma_get_required_mask(struct device *dev)
936
{
937
u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT);
938
u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT));
939
u64 mask;
940
941
if (!high_totalram) {
942
/* convert to mask just covering totalram */
943
low_totalram = (1 << (fls(low_totalram) - 1));
944
low_totalram += low_totalram - 1;
945
mask = low_totalram;
946
} else {
947
high_totalram = (1 << (fls(high_totalram) - 1));
948
high_totalram += high_totalram - 1;
949
mask = (((u64)high_totalram) << 32) + 0xffffffff;
950
}
951
return mask;
952
}
953
EXPORT_SYMBOL_GPL(dma_get_required_mask);
954
#endif
955
956
static __initdata LIST_HEAD(early_platform_driver_list);
957
static __initdata LIST_HEAD(early_platform_device_list);
958
959
/**
960
* early_platform_driver_register - register early platform driver
961
* @epdrv: early_platform driver structure
962
* @buf: string passed from early_param()
963
*
964
* Helper function for early_platform_init() / early_platform_init_buffer()
965
*/
966
int __init early_platform_driver_register(struct early_platform_driver *epdrv,
967
char *buf)
968
{
969
char *tmp;
970
int n;
971
972
/* Simply add the driver to the end of the global list.
973
* Drivers will by default be put on the list in compiled-in order.
974
*/
975
if (!epdrv->list.next) {
976
INIT_LIST_HEAD(&epdrv->list);
977
list_add_tail(&epdrv->list, &early_platform_driver_list);
978
}
979
980
/* If the user has specified device then make sure the driver
981
* gets prioritized. The driver of the last device specified on
982
* command line will be put first on the list.
983
*/
984
n = strlen(epdrv->pdrv->driver.name);
985
if (buf && !strncmp(buf, epdrv->pdrv->driver.name, n)) {
986
list_move(&epdrv->list, &early_platform_driver_list);
987
988
/* Allow passing parameters after device name */
989
if (buf[n] == '\0' || buf[n] == ',')
990
epdrv->requested_id = -1;
991
else {
992
epdrv->requested_id = simple_strtoul(&buf[n + 1],
993
&tmp, 10);
994
995
if (buf[n] != '.' || (tmp == &buf[n + 1])) {
996
epdrv->requested_id = EARLY_PLATFORM_ID_ERROR;
997
n = 0;
998
} else
999
n += strcspn(&buf[n + 1], ",") + 1;
1000
}
1001
1002
if (buf[n] == ',')
1003
n++;
1004
1005
if (epdrv->bufsize) {
1006
memcpy(epdrv->buffer, &buf[n],
1007
min_t(int, epdrv->bufsize, strlen(&buf[n]) + 1));
1008
epdrv->buffer[epdrv->bufsize - 1] = '\0';
1009
}
1010
}
1011
1012
return 0;
1013
}
1014
1015
/**
1016
* early_platform_add_devices - adds a number of early platform devices
1017
* @devs: array of early platform devices to add
1018
* @num: number of early platform devices in array
1019
*
1020
* Used by early architecture code to register early platform devices and
1021
* their platform data.
1022
*/
1023
void __init early_platform_add_devices(struct platform_device **devs, int num)
1024
{
1025
struct device *dev;
1026
int i;
1027
1028
/* simply add the devices to list */
1029
for (i = 0; i < num; i++) {
1030
dev = &devs[i]->dev;
1031
1032
if (!dev->devres_head.next) {
1033
INIT_LIST_HEAD(&dev->devres_head);
1034
list_add_tail(&dev->devres_head,
1035
&early_platform_device_list);
1036
}
1037
}
1038
}
1039
1040
/**
1041
* early_platform_driver_register_all - register early platform drivers
1042
* @class_str: string to identify early platform driver class
1043
*
1044
* Used by architecture code to register all early platform drivers
1045
* for a certain class. If omitted then only early platform drivers
1046
* with matching kernel command line class parameters will be registered.
1047
*/
1048
void __init early_platform_driver_register_all(char *class_str)
1049
{
1050
/* The "class_str" parameter may or may not be present on the kernel
1051
* command line. If it is present then there may be more than one
1052
* matching parameter.
1053
*
1054
* Since we register our early platform drivers using early_param()
1055
* we need to make sure that they also get registered in the case
1056
* when the parameter is missing from the kernel command line.
1057
*
1058
* We use parse_early_options() to make sure the early_param() gets
1059
* called at least once. The early_param() may be called more than
1060
* once since the name of the preferred device may be specified on
1061
* the kernel command line. early_platform_driver_register() handles
1062
* this case for us.
1063
*/
1064
parse_early_options(class_str);
1065
}
1066
1067
/**
1068
* early_platform_match - find early platform device matching driver
1069
* @epdrv: early platform driver structure
1070
* @id: id to match against
1071
*/
1072
static __init struct platform_device *
1073
early_platform_match(struct early_platform_driver *epdrv, int id)
1074
{
1075
struct platform_device *pd;
1076
1077
list_for_each_entry(pd, &early_platform_device_list, dev.devres_head)
1078
if (platform_match(&pd->dev, &epdrv->pdrv->driver))
1079
if (pd->id == id)
1080
return pd;
1081
1082
return NULL;
1083
}
1084
1085
/**
1086
* early_platform_left - check if early platform driver has matching devices
1087
* @epdrv: early platform driver structure
1088
* @id: return true if id or above exists
1089
*/
1090
static __init int early_platform_left(struct early_platform_driver *epdrv,
1091
int id)
1092
{
1093
struct platform_device *pd;
1094
1095
list_for_each_entry(pd, &early_platform_device_list, dev.devres_head)
1096
if (platform_match(&pd->dev, &epdrv->pdrv->driver))
1097
if (pd->id >= id)
1098
return 1;
1099
1100
return 0;
1101
}
1102
1103
/**
1104
* early_platform_driver_probe_id - probe drivers matching class_str and id
1105
* @class_str: string to identify early platform driver class
1106
* @id: id to match against
1107
* @nr_probe: number of platform devices to successfully probe before exiting
1108
*/
1109
static int __init early_platform_driver_probe_id(char *class_str,
1110
int id,
1111
int nr_probe)
1112
{
1113
struct early_platform_driver *epdrv;
1114
struct platform_device *match;
1115
int match_id;
1116
int n = 0;
1117
int left = 0;
1118
1119
list_for_each_entry(epdrv, &early_platform_driver_list, list) {
1120
/* only use drivers matching our class_str */
1121
if (strcmp(class_str, epdrv->class_str))
1122
continue;
1123
1124
if (id == -2) {
1125
match_id = epdrv->requested_id;
1126
left = 1;
1127
1128
} else {
1129
match_id = id;
1130
left += early_platform_left(epdrv, id);
1131
1132
/* skip requested id */
1133
switch (epdrv->requested_id) {
1134
case EARLY_PLATFORM_ID_ERROR:
1135
case EARLY_PLATFORM_ID_UNSET:
1136
break;
1137
default:
1138
if (epdrv->requested_id == id)
1139
match_id = EARLY_PLATFORM_ID_UNSET;
1140
}
1141
}
1142
1143
switch (match_id) {
1144
case EARLY_PLATFORM_ID_ERROR:
1145
pr_warning("%s: unable to parse %s parameter\n",
1146
class_str, epdrv->pdrv->driver.name);
1147
/* fall-through */
1148
case EARLY_PLATFORM_ID_UNSET:
1149
match = NULL;
1150
break;
1151
default:
1152
match = early_platform_match(epdrv, match_id);
1153
}
1154
1155
if (match) {
1156
/*
1157
* Set up a sensible init_name to enable
1158
* dev_name() and others to be used before the
1159
* rest of the driver core is initialized.
1160
*/
1161
if (!match->dev.init_name && slab_is_available()) {
1162
if (match->id != -1)
1163
match->dev.init_name =
1164
kasprintf(GFP_KERNEL, "%s.%d",
1165
match->name,
1166
match->id);
1167
else
1168
match->dev.init_name =
1169
kasprintf(GFP_KERNEL, "%s",
1170
match->name);
1171
1172
if (!match->dev.init_name)
1173
return -ENOMEM;
1174
}
1175
1176
if (epdrv->pdrv->probe(match))
1177
pr_warning("%s: unable to probe %s early.\n",
1178
class_str, match->name);
1179
else
1180
n++;
1181
}
1182
1183
if (n >= nr_probe)
1184
break;
1185
}
1186
1187
if (left)
1188
return n;
1189
else
1190
return -ENODEV;
1191
}
1192
1193
/**
1194
* early_platform_driver_probe - probe a class of registered drivers
1195
* @class_str: string to identify early platform driver class
1196
* @nr_probe: number of platform devices to successfully probe before exiting
1197
* @user_only: only probe user specified early platform devices
1198
*
1199
* Used by architecture code to probe registered early platform drivers
1200
* within a certain class. For probe to happen a registered early platform
1201
* device matching a registered early platform driver is needed.
1202
*/
1203
int __init early_platform_driver_probe(char *class_str,
1204
int nr_probe,
1205
int user_only)
1206
{
1207
int k, n, i;
1208
1209
n = 0;
1210
for (i = -2; n < nr_probe; i++) {
1211
k = early_platform_driver_probe_id(class_str, i, nr_probe - n);
1212
1213
if (k < 0)
1214
break;
1215
1216
n += k;
1217
1218
if (user_only)
1219
break;
1220
}
1221
1222
return n;
1223
}
1224
1225
/**
1226
* early_platform_cleanup - clean up early platform code
1227
*/
1228
void __init early_platform_cleanup(void)
1229
{
1230
struct platform_device *pd, *pd2;
1231
1232
/* clean up the devres list used to chain devices */
1233
list_for_each_entry_safe(pd, pd2, &early_platform_device_list,
1234
dev.devres_head) {
1235
list_del(&pd->dev.devres_head);
1236
memset(&pd->dev.devres_head, 0, sizeof(pd->dev.devres_head));
1237
}
1238
}
1239
1240
1241