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