ti: k3: drivers: ti_sci: Add support for Core control
authorAndrew F. Davis <afd@ti.com>
Fri, 4 May 2018 19:06:12 +0000 (19:06 +0000)
committerAndrew F. Davis <afd@ti.com>
Wed, 22 Aug 2018 15:57:19 +0000 (10:57 -0500)
Since system controller now has control over SoC power management, core
operation such as reset need to be explicitly requested to reboot the SoC.
Add support for this here.

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

index f45118c4695004e63ccf243f2236550b787b2f70..f5d2ce186a1749f36f5d72c244a96c88defa81de 100644 (file)
@@ -1117,6 +1117,41 @@ int ti_sci_clock_get_freq(uint32_t dev_id, uint8_t clk_id, uint64_t *freq)
        return 0;
 }
 
+/**
+ * ti_sci_core_reboot() - Command to request system reset
+ *
+ * Return: 0 if all goes well, else appropriate error message
+ */
+int ti_sci_core_reboot(void)
+{
+       struct ti_sci_msg_req_reboot req;
+       struct ti_sci_msg_hdr resp;
+
+       struct ti_sci_xfer xfer;
+       int ret;
+
+       ret = ti_sci_setup_one_xfer(TI_SCI_MSG_SYS_RESET,
+                                   TI_SCI_FLAG_REQ_ACK_ON_PROCESSED,
+                                   &req, sizeof(req),
+                                   &resp, sizeof(resp),
+                                   &xfer);
+       if (ret) {
+               ERROR("Message alloc failed (%d)\n", ret);
+               return ret;
+       }
+
+       ret = ti_sci_do_xfer(&xfer);
+       if (ret) {
+               ERROR("Transfer send failed (%d)\n", ret);
+               return ret;
+       }
+
+       if (!ti_sci_is_response_ack(&resp))
+               return -ENODEV;
+
+       return 0;
+}
+
 /**
  * ti_sci_init() - Basic initialization
  *
index fc6b5b01da0cdfcb1acf0493215645ff692d5c86..df0c13ec10a43c91f58e5835030852815d1eaaac 100644 (file)
@@ -152,6 +152,15 @@ int ti_sci_clock_set_freq(uint32_t dev_id, uint8_t clk_id,
                          uint64_t max_freq);
 int ti_sci_clock_get_freq(uint32_t dev_id, uint8_t clk_id, uint64_t *freq);
 
+/**
+ * Core control operations
+ *
+ * - ti_sci_core_reboot() - Command to request system reset
+ *
+ * Return: 0 if all went well, else returns appropriate error value.
+ */
+int ti_sci_core_reboot(void);
+
 /**
  * ti_sci_init() - Basic initialization
  *