ti: k3: drivers: ti_sci: Add exclusive device accessors
authorAndrew F. Davis <afd@ti.com>
Mon, 11 Feb 2019 18:58:32 +0000 (12:58 -0600)
committerAndrew F. Davis <afd@ti.com>
Mon, 11 Feb 2019 22:13:30 +0000 (16:13 -0600)
When a device is requested with TI-SCI its control can be made exclusive
to the requesting host. This was currently the default but is not what
is needed most of the time. Add _exclusive versions of the request
functions and remove the exclusive flag from the default version.

Signed-off-by: Andrew F. Davis <afd@ti.com>
plat/ti/k3/common/drivers/ti_sci/ti_sci.c
plat/ti/k3/common/drivers/ti_sci/ti_sci.h

index 00382f02fd17d46d53a07842e9af6d00419305bd..a4e28d1da273d25aca95168fbaee416e16b0c080 100644 (file)
@@ -334,11 +334,30 @@ static int ti_sci_device_get_state(uint32_t id,  uint32_t *clcnt,
  * usage count by balancing get_device with put_device. No refcounting is
  * managed by driver for that purpose.
  *
- * NOTE: The request is for exclusive access for the processor.
- *
  * Return: 0 if all goes well, else appropriate error message
  */
 int ti_sci_device_get(uint32_t id)
+{
+       return ti_sci_device_set_state(id, 0, MSG_DEVICE_SW_STATE_ON);
+}
+
+/**
+ * ti_sci_device_get_exclusive() - Exclusive request for device managed by TISCI
+ *
+ * @id:                Device Identifier
+ *
+ * Request for the device - NOTE: the client MUST maintain integrity of
+ * usage count by balancing get_device with put_device. No refcounting is
+ * managed by driver for that purpose.
+ *
+ * NOTE: This _exclusive version of the get API is for exclusive access to the
+ * device. Any other host in the system will fail to get this device after this
+ * call until exclusive access is released with device_put or a non-exclusive
+ * set call.
+ *
+ * Return: 0 if all goes well, else appropriate error message
+ */
+int ti_sci_device_get_exclusive(uint32_t id)
 {
        return ti_sci_device_set_state(id,
                                       MSG_FLAG_DEVICE_EXCLUSIVE,
@@ -357,6 +376,27 @@ int ti_sci_device_get(uint32_t id)
  * Return: 0 if all goes well, else appropriate error message
  */
 int ti_sci_device_idle(uint32_t id)
+{
+       return ti_sci_device_set_state(id, 0, MSG_DEVICE_SW_STATE_RETENTION);
+}
+
+/**
+ * ti_sci_device_idle_exclusive() - Exclusive idle a device managed by TISCI
+ *
+ * @id:                Device Identifier
+ *
+ * Request for the device - NOTE: the client MUST maintain integrity of
+ * usage count by balancing get_device with put_device. No refcounting is
+ * managed by driver for that purpose.
+ *
+ * NOTE: This _exclusive version of the idle API is for exclusive access to
+ * the device. Any other host in the system will fail to get this device after
+ * this call until exclusive access is released with device_put or a
+ * non-exclusive set call.
+ *
+ * Return: 0 if all goes well, else appropriate error message
+ */
+int ti_sci_device_idle_exclusive(uint32_t id)
 {
        return ti_sci_device_set_state(id,
                                       MSG_FLAG_DEVICE_EXCLUSIVE,
index 1288a665566470d0b1e681a53c31ece931e91aa7..7eb9f6de3c1e683d8363ef4d1e71e9399d55cb1c 100644 (file)
@@ -17,7 +17,9 @@
  * Device control operations
  *
  * - ti_sci_device_get - command to request for device managed by TISCI
+ * - ti_sci_device_get_exclusive - exclusively request a device
  * - ti_sci_device_idle - Command to idle a device managed by TISCI
+ * - ti_sci_device_idle_exclusive - exclusively idle a device
  * - ti_sci_device_put - command to release a device managed by TISCI
  * - ti_sci_device_is_valid - Is the device valid
  * - ti_sci_device_get_clcnt - Get context loss counter
@@ -47,7 +49,9 @@
  * managed by driver for that purpose.
  */
 int ti_sci_device_get(uint32_t id);
+int ti_sci_device_get_exclusive(uint32_t id);
 int ti_sci_device_idle(uint32_t id);
+int ti_sci_device_idle_exclusive(uint32_t id);
 int ti_sci_device_put(uint32_t id);
 int ti_sci_device_is_valid(uint32_t id);
 int ti_sci_device_get_clcnt(uint32_t id, uint32_t *count);