1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | /* |
3 | * Greybus bundles |
4 | * |
5 | * Copyright 2014 Google Inc. |
6 | * Copyright 2014 Linaro Ltd. |
7 | */ |
8 | |
9 | #ifndef __BUNDLE_H |
10 | #define __BUNDLE_H |
11 | |
12 | #include <linux/types.h> |
13 | #include <linux/list.h> |
14 | #include <linux/pm_runtime.h> |
15 | #include <linux/device.h> |
16 | |
17 | #define BUNDLE_ID_NONE U8_MAX |
18 | |
19 | /* Greybus "public" definitions" */ |
20 | struct gb_bundle { |
21 | struct device dev; |
22 | struct gb_interface *intf; |
23 | |
24 | u8 id; |
25 | u8 class; |
26 | u8 class_major; |
27 | u8 class_minor; |
28 | |
29 | size_t num_cports; |
30 | struct greybus_descriptor_cport *cport_desc; |
31 | |
32 | struct list_head connections; |
33 | u8 *state; |
34 | |
35 | struct list_head links; /* interface->bundles */ |
36 | }; |
37 | #define to_gb_bundle(d) container_of(d, struct gb_bundle, dev) |
38 | |
39 | /* Greybus "private" definitions" */ |
40 | struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id, |
41 | u8 class); |
42 | int gb_bundle_add(struct gb_bundle *bundle); |
43 | void gb_bundle_destroy(struct gb_bundle *bundle); |
44 | |
45 | /* Bundle Runtime PM wrappers */ |
46 | #ifdef CONFIG_PM |
47 | static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) |
48 | { |
49 | int retval; |
50 | |
51 | retval = pm_runtime_get_sync(dev: &bundle->dev); |
52 | if (retval < 0) { |
53 | dev_err(&bundle->dev, |
54 | "pm_runtime_get_sync failed: %d\n", retval); |
55 | pm_runtime_put_noidle(dev: &bundle->dev); |
56 | return retval; |
57 | } |
58 | |
59 | return 0; |
60 | } |
61 | |
62 | static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) |
63 | { |
64 | int retval; |
65 | |
66 | pm_runtime_mark_last_busy(dev: &bundle->dev); |
67 | retval = pm_runtime_put_autosuspend(dev: &bundle->dev); |
68 | |
69 | return retval; |
70 | } |
71 | |
72 | static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle) |
73 | { |
74 | pm_runtime_get_noresume(dev: &bundle->dev); |
75 | } |
76 | |
77 | static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) |
78 | { |
79 | pm_runtime_put_noidle(dev: &bundle->dev); |
80 | } |
81 | |
82 | #else |
83 | static inline int gb_pm_runtime_get_sync(struct gb_bundle *bundle) |
84 | { return 0; } |
85 | static inline int gb_pm_runtime_put_autosuspend(struct gb_bundle *bundle) |
86 | { return 0; } |
87 | |
88 | static inline void gb_pm_runtime_get_noresume(struct gb_bundle *bundle) {} |
89 | static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) {} |
90 | #endif |
91 | |
92 | #endif /* __BUNDLE_H */ |
93 |