blob: 6a56efd748880eedae31e204f8487d1f7d3732cc [file] [log] [blame] [edit]
/* 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 <linux/usb/android_configfs_uevent.h>
/**
* 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 */