/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright 2024 Google LLC */ #ifndef __ANDROID_CONFIGFS_UEVENT_H #define __ANDROID_CONFIGFS_UEVENT_H #ifdef CONFIG_ANDROID_USB_CONFIGFS_UEVENT #include /** * android_class_create - essentially the __init() function for the * configfs_uevent library, since it is not a standalone driver. * * Creates the android_usb class of device * * Returns: the result of class_register (0 for success, err otherwise) */ int android_class_create(void); /** * android_class_destroy - essentially the __exit() function for the * configfs_uevent library, since it is not a standalone driver. * * Removes the android_usb class of devices and performs any necessary * cleanup. */ void android_class_destroy(void); /** * android_device_create - Creates an android device instance and * a state attribute file which can be read to determine the state of the * usb gadget. * @opts: contextual data for the configfs_uevent library. * * Note: the state file created by this function mimics the functionaltiy * of the UDC driver and is likely redundant, but maintained for legacy * support. * * The state can be one of "DISCONNECTED", "CONNECTED", or "CONFIGURED" * * Returns: 0 for success, or if an error is encountered during ida_allocation * or device_creation, that error is returned. */ int android_device_create(struct android_uevent_opts *opts); /** * android_device_destroy - Removes the android device instance and performs * any necessary cleanup. * @opts: contextual data for the configfs_uevent library. */ void android_device_destroy(struct android_uevent_opts *opts); /** * android_set_connected - set the internal state of android_uevent_opts to * connected and schedule the work to emit a uevent with this status update. * @opts: contextual data for the configfs_uevent library * * This should be called by the gadget composite driver when a usb_ctrlrequest * is received by the gadget driver. * * This function locks the android specific android_uevent_opts->lock and * therefore should not require locking the containing composite device * structure as the internal lock is also used in the teardown path of the * composite driver in android_device_destroy(). */ void android_set_connected(struct android_uevent_opts *opts); /** * android_set_disconnected - reset the internal state of android_uevent_opts to * disconnected and schedule the work to emit a uevent with this status update. * @opts: contextual data for the configfs_uevent library * * This should be called by the gadget composite driver when the link is * disconnected. * * This function locks the android specific android_uevent_opts->lock and * therefore should not require locking the containing composite device * structure as the internal lock is also used in the teardown path of the * composite driver in android_device_destroy(). */ void android_set_disconnected(struct android_uevent_opts *opts); /** * android_set_configured - set the internal state of android_uevent_opts to * configured and schedule the work to emit a uevent with this status update. * @opts: contextual data for the configfs_uevent library * * This should be called by the gadget composite driver when the configuration * is applied to the gadget composite device * * This function locks the android specific android_uevent_opts->lock and * therefore should not require locking the containing composite device * structure as the internal lock is also used in the teardown path of the * composite driver in android_device_destroy(). */ void android_set_configured(struct android_uevent_opts *opts); /** * android_set_unconfigured - reset the internal state of android_uevent_opts to * unconfigured and schedule the work to emit a uevent with this status update. * @opts: contextual data for the configfs_uevent library * * This should be called by the gadget composite driver when the gadget * configuration is torn down. * * This function locks the android specific android_uevent_opts->lock and * therefore should not require locking the containing composite device * structure as the internal lock is also used in the teardown path of the * composite driver in android_device_destroy(). */ void android_set_unconfigured(struct android_uevent_opts *opts); #else static inline int android_class_create(void) { return 0; } static inline void android_class_destroy(void) { } static inline int android_device_create(struct android_uevent_opts *opts) { return 0; } static inline void android_device_destroy(struct android_uevent_opts *opts) { } static inline void android_set_connected(struct android_uevent_opts *opts) { } static inline void android_set_disconnected(struct android_uevent_opts *opts) { } static inline void android_set_configured(struct android_uevent_opts *opts) { } static inline void android_set_unconfigured(struct android_uevent_opts *opts) { } #endif /* CONFIG_ANDROID_USB_CONFIGFS_UEVENT */ #endif /* __ANDROID_CONFIGFS_UEVENT_H */