Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * linux/arch/arm/mach-integrator/lm.c | |
3 | * | |
4 | * Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 as | |
8 | * published by the Free Software Foundation. | |
9 | */ | |
10 | #include <linux/module.h> | |
11 | #include <linux/init.h> | |
12 | #include <linux/device.h> | |
4e57b681 | 13 | #include <linux/slab.h> |
1da177e4 LT |
14 | |
15 | #include <asm/arch/lm.h> | |
16 | ||
17 | #define to_lm_device(d) container_of(d, struct lm_device, dev) | |
18 | #define to_lm_driver(d) container_of(d, struct lm_driver, drv) | |
19 | ||
20 | static int lm_match(struct device *dev, struct device_driver *drv) | |
21 | { | |
22 | return 1; | |
23 | } | |
24 | ||
25 | static struct bus_type lm_bustype = { | |
26 | .name = "logicmodule", | |
27 | .match = lm_match, | |
28 | // .suspend = lm_suspend, | |
29 | // .resume = lm_resume, | |
30 | }; | |
31 | ||
32 | static int __init lm_init(void) | |
33 | { | |
34 | return bus_register(&lm_bustype); | |
35 | } | |
36 | ||
37 | postcore_initcall(lm_init); | |
38 | ||
39 | static int lm_bus_probe(struct device *dev) | |
40 | { | |
41 | struct lm_device *lmdev = to_lm_device(dev); | |
42 | struct lm_driver *lmdrv = to_lm_driver(dev->driver); | |
43 | ||
44 | return lmdrv->probe(lmdev); | |
45 | } | |
46 | ||
47 | static int lm_bus_remove(struct device *dev) | |
48 | { | |
49 | struct lm_device *lmdev = to_lm_device(dev); | |
50 | struct lm_driver *lmdrv = to_lm_driver(dev->driver); | |
51 | ||
52 | lmdrv->remove(lmdev); | |
53 | return 0; | |
54 | } | |
55 | ||
56 | int lm_driver_register(struct lm_driver *drv) | |
57 | { | |
58 | drv->drv.bus = &lm_bustype; | |
59 | drv->drv.probe = lm_bus_probe; | |
60 | drv->drv.remove = lm_bus_remove; | |
61 | ||
62 | return driver_register(&drv->drv); | |
63 | } | |
64 | ||
65 | void lm_driver_unregister(struct lm_driver *drv) | |
66 | { | |
67 | driver_unregister(&drv->drv); | |
68 | } | |
69 | ||
70 | static void lm_device_release(struct device *dev) | |
71 | { | |
72 | struct lm_device *d = to_lm_device(dev); | |
73 | ||
74 | kfree(d); | |
75 | } | |
76 | ||
77 | int lm_device_register(struct lm_device *dev) | |
78 | { | |
79 | int ret; | |
80 | ||
81 | dev->dev.release = lm_device_release; | |
82 | dev->dev.bus = &lm_bustype; | |
83 | ||
84 | snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), "lm%d", dev->id); | |
85 | dev->resource.name = dev->dev.bus_id; | |
86 | ||
87 | ret = request_resource(&iomem_resource, &dev->resource); | |
88 | if (ret == 0) { | |
89 | ret = device_register(&dev->dev); | |
90 | if (ret) | |
91 | release_resource(&dev->resource); | |
92 | } | |
93 | return ret; | |
94 | } | |
95 | ||
96 | EXPORT_SYMBOL(lm_driver_register); | |
97 | EXPORT_SYMBOL(lm_driver_unregister); |