zynqmp: pm: Add API to get number of clocks
authorRajan Vaja <rajan.vaja@xilinx.com>
Fri, 20 Jul 2018 10:16:27 +0000 (03:16 -0700)
committerRajan Vaja <rajan.vaja@xilinx.com>
Mon, 27 Aug 2018 13:49:46 +0000 (06:49 -0700)
Currently in Linux maximum number of clocks is hard-coded and
so it needs to allocate static memory. It can get actual clock
number after querying all clock names by special clock name
string. Add new query data parameter to get actual number of
clocks so Linux can get actual clock numbers in advance.

Signed-off-by: Rajan Vaja <rajan.vaja@xilinx.com>
plat/xilinx/zynqmp/pm_service/pm_api_clock.c
plat/xilinx/zynqmp/pm_service/pm_api_clock.h
plat/xilinx/zynqmp/pm_service/pm_api_sys.c
plat/xilinx/zynqmp/pm_service/pm_api_sys.h

index a41eebbc065ae64807bf6c92aea2438f9d02631d..fefd9ea8fea96b8b37101c0d425702d4610e1ce2 100644 (file)
@@ -2306,6 +2306,21 @@ static unsigned int pm_clock_type(unsigned int clock_id)
                CLK_TYPE_OUTPUT : CLK_TYPE_EXTERNAL;
 }
 
+/**
+ * pm_api_clock_get_num_clocks() - PM call to request number of clocks
+ * @nclocks    Number of clocks
+ *
+ * This function is used by master to get number of clocks.
+ *
+ * @return     Returns success.
+ */
+enum pm_ret_status pm_api_clock_get_num_clocks(unsigned int *nclocks)
+{
+       *nclocks = CLK_MAX;
+
+       return PM_RET_SUCCESS;
+}
+
 /**
  * pm_api_clock_get_name() - PM call to request a clock's name
  * @clock_id   Clock ID
index 56f850a49180fffd835a8d27147e6a5befca606e..386f2753b6616b458bc0556ebaf1d4503b209dae 100644 (file)
@@ -276,6 +276,7 @@ enum {
 
 
 enum pm_ret_status pm_api_clock_get_name(unsigned int clock_id, char *name);
+enum pm_ret_status pm_api_clock_get_num_clocks(unsigned int *nclocks);
 enum pm_ret_status pm_api_clock_get_topology(unsigned int clock_id,
                                             unsigned int index,
                                             uint32_t *topology);
index 133043da5dcfe9892d6c3acfb4b2bc093b30e36e..fe1029f6606f9d6919549d6b43cd9e4b084761f0 100644 (file)
@@ -712,6 +712,19 @@ enum pm_ret_status pm_ioctl(enum pm_node_id nid,
        return pm_api_ioctl(nid, ioctl_id, arg1, arg2, value);
 }
 
+/**
+ * pm_clock_get_num_clocks - PM call to request number of clocks
+ * @nclockss: Number of clocks
+ *
+ * This function is used by master to get number of clocks.
+ *
+ * Return: Returns status, either success or error+reason.
+ */
+static enum pm_ret_status pm_clock_get_num_clocks(uint32_t *nclocks)
+{
+       return pm_api_clock_get_num_clocks(nclocks);
+}
+
 /**
  * pm_clock_get_name() - PM call to request a clock's name
  * @clock_id   Clock ID
@@ -1118,6 +1131,10 @@ enum pm_ret_status pm_query_data(enum pm_query_id qid,
                                                (uint16_t *)&data[1]);
                data[0] = (unsigned int)ret;
                break;
+       case PM_QID_CLOCK_GET_NUM_CLOCKS:
+               ret = pm_clock_get_num_clocks(&data[1]);
+               data[0] = (unsigned int)ret;
+               break;
        default:
                ret = PM_RET_ERROR_ARGS;
                WARN("Unimplemented query service call: 0x%x\n", qid);
index 55a8a6ea19f6aaff775ed393d1e47e756be58ae6..c304895ac9ed40799adb301ae528f356653469f6 100644 (file)
@@ -23,6 +23,7 @@ enum pm_query_id {
        PM_QID_PINCTRL_GET_FUNCTION_NAME,
        PM_QID_PINCTRL_GET_FUNCTION_GROUPS,
        PM_QID_PINCTRL_GET_PIN_GROUPS,
+       PM_QID_CLOCK_GET_NUM_CLOCKS,
 };
 
 /**********************************************************