supplicants the communication goes in the other direction, the TEE sends
 requests to the supplicant which then sends back the result.
 
+The TEE kernel interface
+========================
+
+Kernel provides a TEE bus infrastructure where a Trusted Application is
+represented as a device identified via Universally Unique Identifier (UUID) and
+client drivers register a table of supported device UUIDs.
+
+TEE bus infrastructure registers following APIs:
+-  match(): iterates over the client driver UUID table to find a corresponding
+   match for device UUID. If a match is found, then this particular device is
+   probed via corresponding probe API registered by the client driver. This
+   process happens whenever a device or a client driver is registered with TEE
+   bus.
+-  uevent(): notifies user-space (udev) whenever a new device is registered on
+   TEE bus for auto-loading of modularized client drivers.
+
+TEE bus device enumeration is specific to underlying TEE implementation, so it
+is left open for TEE drivers to provide corresponding implementation.
+
+Then TEE client driver can talk to a matched Trusted Application using APIs
+listed in include/linux/tee_drv.h.
+
+TEE client driver example
+-------------------------
+
+Suppose a TEE client driver needs to communicate with a Trusted Application
+having UUID: ``ac6a4085-0e82-4c33-bf98-8eb8e118b6c2``, so driver registration
+snippet would look like::
+
+       static const struct tee_client_device_id client_id_table[] = {
+               {UUID_INIT(0xac6a4085, 0x0e82, 0x4c33,
+                          0xbf, 0x98, 0x8e, 0xb8, 0xe1, 0x18, 0xb6, 0xc2)},
+               {}
+       };
+
+       MODULE_DEVICE_TABLE(tee, client_id_table);
+
+       static struct tee_client_driver client_driver = {
+               .id_table       = client_id_table,
+               .driver         = {
+                       .name           = DRIVER_NAME,
+                       .bus            = &tee_bus_type,
+                       .probe          = client_probe,
+                       .remove         = client_remove,
+               },
+       };
+
+       static int __init client_init(void)
+       {
+               return driver_register(&client_driver.driver);
+       }
+
+       static void __exit client_exit(void)
+       {
+               driver_unregister(&client_driver.driver);
+       }
+
+       module_init(client_init);
+       module_exit(client_exit);
+
 OP-TEE driver
 =============
 
 tee-supplicant without further involvement of the driver, except switching
 shared memory buffer representation.
 
+OP-TEE device enumeration
+-------------------------
+
+OP-TEE provides a pseudo Trusted Application: drivers/tee/optee/device.c in
+order to support device enumeration. In other words, OP-TEE driver invokes this
+application to retrieve a list of Trusted Applications which can be registered
+as devices on the TEE bus.
+
 AMD-TEE driver
 ==============