Thread (37 messages) 37 messages, 3 authors, 2016-08-23

[PATCH 04/13] scpi: Add legacy SCP functions calling legacy_scpi_send_message

From: Neil Armstrong <hidden>
Date: 2016-08-23 08:19:51
Also in: linux-amlogic, lkml

On 08/19/2016 06:22 PM, Sudeep Holla wrote:

On 18/08/16 11:10, Neil Armstrong wrote:
quoted
In order to support legacy SCP functions from kernel-wide driver, add legacy
functions using the legacy command enums and calling legacy_scpi_send_message.

Signed-off-by: Neil Armstrong <redacted>
---
 drivers/firmware/arm_scpi.c | 118 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)
diff --git a/drivers/firmware/arm_scpi.c b/drivers/firmware/arm_scpi.c
index 50b1297..bb9965f 100644
--- a/drivers/firmware/arm_scpi.c
+++ b/drivers/firmware/arm_scpi.c
@@ -578,6 +578,8 @@ scpi_clk_get_range(u16 clk_id, unsigned long *min, unsigned long *max)
     return ret;
 }

+/* scpi_clk_get_range not available for legacy */
+
 static unsigned long scpi_clk_get_val(u16 clk_id)
 {
     int ret;
@@ -589,6 +591,18 @@ static unsigned long scpi_clk_get_val(u16 clk_id)
     return ret ? ret : le32_to_cpu(clk.rate);
 }

+static unsigned long legacy_scpi_clk_get_val(u16 clk_id)
+{
+    int ret;
+    struct clk_get_value clk;
+    __le16 le_clk_id = cpu_to_le16(clk_id);
+
+    ret = legacy_scpi_send_message(LEGACY_SCPI_CMD_GET_CLOCK_VALUE,
+                       &le_clk_id, sizeof(le_clk_id),
+                       &clk, sizeof(clk));
+    return ret ? ret : le32_to_cpu(clk.rate);
+}
+
 static int scpi_clk_set_val(u16 clk_id, unsigned long rate)
 {
     int stat;
@@ -601,6 +615,19 @@ static int scpi_clk_set_val(u16 clk_id, unsigned long rate)
                  &stat, sizeof(stat));
 }

+static int legacy_scpi_clk_set_val(u16 clk_id, unsigned long rate)
+{
+    int stat;
+    struct legacy_clk_set_value clk = {
+        .id = cpu_to_le16(clk_id),
+        .rate = cpu_to_le32(rate)
+    };
+
+    return legacy_scpi_send_message(LEGACY_SCPI_CMD_SET_CLOCK_VALUE,
+                    &clk, sizeof(clk),
+                    &stat, sizeof(stat));
Except this one which has a different structure format, why do we need
to define legacy versions of other functions ? Can't we play with
function pointer or have a boolean in drvinfo structure and use then in
the existing functions as I had shown in one of the earlier emails.
The main problem is that the command indexes deviates starting at
SCPI_CMD_SET_CSS_PWR_STATE, I'll be pleased to know how to implement it.

Should I add a test :
if (scpi_drvinfo->is_legacy)
	legacy_scpi_send_message(...)
else
	scpi_send_message(...)

In each function ?

My strategy was to leave the "final" function untouched ans provide
alternatives to legacy.
I can add this "is_legacy" if/else instead of ops structures.

Please tell me how you'll implement this, so I'll adapt the merge.

Neil
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help