|
@@ -40,6 +40,9 @@ struct host1x_subdev {
|
|
|
|
|
|
/**
|
|
|
* host1x_subdev_add() - add a new subdevice with an associated device node
|
|
|
+ * @device: host1x device to add the subdevice to
|
|
|
+ * @driver: host1x driver
|
|
|
+ * @np: device node
|
|
|
*/
|
|
|
static int host1x_subdev_add(struct host1x_device *device,
|
|
|
struct device_node *np)
|
|
@@ -62,6 +65,7 @@ static int host1x_subdev_add(struct host1x_device *device,
|
|
|
|
|
|
/**
|
|
|
* host1x_subdev_del() - remove subdevice
|
|
|
+ * @subdev: subdevice to remove
|
|
|
*/
|
|
|
static void host1x_subdev_del(struct host1x_subdev *subdev)
|
|
|
{
|
|
@@ -72,6 +76,8 @@ static void host1x_subdev_del(struct host1x_subdev *subdev)
|
|
|
|
|
|
/**
|
|
|
* host1x_device_parse_dt() - scan device tree and add matching subdevices
|
|
|
+ * @device: host1x logical device
|
|
|
+ * @driver: host1x driver
|
|
|
*/
|
|
|
static int host1x_device_parse_dt(struct host1x_device *device,
|
|
|
struct host1x_driver *driver)
|
|
@@ -166,6 +172,16 @@ static void host1x_subdev_unregister(struct host1x_device *device,
|
|
|
mutex_unlock(&device->subdevs_lock);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_device_init() - initialize a host1x logical device
|
|
|
+ * @device: host1x logical device
|
|
|
+ *
|
|
|
+ * The driver for the host1x logical device can call this during execution of
|
|
|
+ * its &host1x_driver.probe implementation to initialize each of its clients.
|
|
|
+ * The client drivers access the subsystem specific driver data using the
|
|
|
+ * &host1x_client.parent field and driver data associated with it (usually by
|
|
|
+ * calling dev_get_drvdata()).
|
|
|
+ */
|
|
|
int host1x_device_init(struct host1x_device *device)
|
|
|
{
|
|
|
struct host1x_client *client;
|
|
@@ -192,6 +208,15 @@ int host1x_device_init(struct host1x_device *device)
|
|
|
}
|
|
|
EXPORT_SYMBOL(host1x_device_init);
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_device_exit() - uninitialize host1x logical device
|
|
|
+ * @device: host1x logical device
|
|
|
+ *
|
|
|
+ * When the driver for a host1x logical device is unloaded, it can call this
|
|
|
+ * function to tear down each of its clients. Typically this is done after a
|
|
|
+ * subsystem-specific data structure is removed and the functionality can no
|
|
|
+ * longer be used.
|
|
|
+ */
|
|
|
int host1x_device_exit(struct host1x_device *device)
|
|
|
{
|
|
|
struct host1x_client *client;
|
|
@@ -446,6 +471,14 @@ static void host1x_detach_driver(struct host1x *host1x,
|
|
|
mutex_unlock(&host1x->devices_lock);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_register() - register a host1x controller
|
|
|
+ * @host1x: host1x controller
|
|
|
+ *
|
|
|
+ * The host1x controller driver uses this to register a host1x controller with
|
|
|
+ * the infrastructure. Note that all Tegra SoC generations have only ever come
|
|
|
+ * with a single host1x instance, so this function is somewhat academic.
|
|
|
+ */
|
|
|
int host1x_register(struct host1x *host1x)
|
|
|
{
|
|
|
struct host1x_driver *driver;
|
|
@@ -464,6 +497,13 @@ int host1x_register(struct host1x *host1x)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_unregister() - unregister a host1x controller
|
|
|
+ * @host1x: host1x controller
|
|
|
+ *
|
|
|
+ * The host1x controller driver uses this to remove a host1x controller from
|
|
|
+ * the infrastructure.
|
|
|
+ */
|
|
|
int host1x_unregister(struct host1x *host1x)
|
|
|
{
|
|
|
struct host1x_driver *driver;
|
|
@@ -513,6 +553,16 @@ static void host1x_device_shutdown(struct device *dev)
|
|
|
driver->shutdown(device);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_driver_register_full() - register a host1x driver
|
|
|
+ * @driver: host1x driver
|
|
|
+ * @owner: owner module
|
|
|
+ *
|
|
|
+ * Drivers for host1x logical devices call this function to register a driver
|
|
|
+ * with the infrastructure. Note that since these drive logical devices, the
|
|
|
+ * registration of the driver actually triggers tho logical device creation.
|
|
|
+ * A logical device will be created for each host1x instance.
|
|
|
+ */
|
|
|
int host1x_driver_register_full(struct host1x_driver *driver,
|
|
|
struct module *owner)
|
|
|
{
|
|
@@ -541,6 +591,13 @@ int host1x_driver_register_full(struct host1x_driver *driver,
|
|
|
}
|
|
|
EXPORT_SYMBOL(host1x_driver_register_full);
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_driver_unregister() - unregister a host1x driver
|
|
|
+ * @driver: host1x driver
|
|
|
+ *
|
|
|
+ * Unbinds the driver from each of the host1x logical devices that it is
|
|
|
+ * bound to, effectively removing the subsystem devices that they represent.
|
|
|
+ */
|
|
|
void host1x_driver_unregister(struct host1x_driver *driver)
|
|
|
{
|
|
|
driver_unregister(&driver->driver);
|
|
@@ -551,6 +608,17 @@ void host1x_driver_unregister(struct host1x_driver *driver)
|
|
|
}
|
|
|
EXPORT_SYMBOL(host1x_driver_unregister);
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_client_register() - register a host1x client
|
|
|
+ * @client: host1x client
|
|
|
+ *
|
|
|
+ * Registers a host1x client with each host1x controller instance. Note that
|
|
|
+ * each client will only match their parent host1x controller and will only be
|
|
|
+ * associated with that instance. Once all clients have been registered with
|
|
|
+ * their parent host1x controller, the infrastructure will set up the logical
|
|
|
+ * device and call host1x_device_init(), which will in turn call each client's
|
|
|
+ * &host1x_client_ops.init implementation.
|
|
|
+ */
|
|
|
int host1x_client_register(struct host1x_client *client)
|
|
|
{
|
|
|
struct host1x *host1x;
|
|
@@ -576,6 +644,13 @@ int host1x_client_register(struct host1x_client *client)
|
|
|
}
|
|
|
EXPORT_SYMBOL(host1x_client_register);
|
|
|
|
|
|
+/**
|
|
|
+ * host1x_client_unregister() - unregister a host1x client
|
|
|
+ * @client: host1x client
|
|
|
+ *
|
|
|
+ * Removes a host1x client from its host1x controller instance. If a logical
|
|
|
+ * device has already been initialized, it will be torn down.
|
|
|
+ */
|
|
|
int host1x_client_unregister(struct host1x_client *client)
|
|
|
{
|
|
|
struct host1x_client *c;
|