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(&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(&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(&bundle->dev); 67 retval = pm_runtime_put_autosuspend(&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(&bundle->dev); 75 } 76 77 static inline void gb_pm_runtime_put_noidle(struct gb_bundle *bundle) 78 { 79 pm_runtime_put_noidle(&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