On 10/15/2015 02:05 AM, Stephen Boyd wrote:
On 10/14, Archit Taneja wrote:
diff --git a/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c 
b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c
new file mode 100644
index 0000000..e71b4ee
--- /dev/null
+++ b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c
@@ -0,0 +1,529 @@
+/*
+ * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk.h>

Is this include used?

It isn't. I'll remove it.


+#include <linux/clk-provider.h>
+
+#include "dsi_pll.h"
+#include "dsi.xml.h"
+
+/*
[..]
+
+#define to_pll_28nm(x) container_of(x, struct dsi_pll_28nm, base)
+
+static bool pll_28nm_poll_for_ready(struct dsi_pll_28nm *pll_28nm,
+                                   u32 nb_tries, u32 timeout_us)

Why not use unsigned types for these counts? I don't imagine we
care about being precisely 32 bits.

Yeah. We don't even need an unsigned type. I'll replace it with integer type.


+{
+       bool pll_locked = false;
+       u32 val;
+
[..]
+       DBG("id=%d", pll_28nm->id);
+
+       /*
+        * before enabling the PLL, configure the bit clock divider since we
+        * don't expose it as a clock to the outside world
+        * 1: read back the byte clock divider that should aready be set

s/aready/already/

Thanks, I'll fix this.


+        * 2: divide by 8 to get bit clock divider
+        * 3: write it to POSTDIV1
+        */
+       val = pll_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_9);
+       byte_div = val + 1;
+       bit_div = byte_div / 8;
+
+       val = pll_read(base + REG_DSI_28nm_8960_PHY_PLL_CTRL_8);
[..]
+
+static void dsi_pll_28nm_destroy(struct msm_dsi_pll *pll)
+{
+       struct dsi_pll_28nm *pll_28nm = to_pll_28nm(pll);
+       int i;
+
+       msm_dsi_pll_helper_unregister_clks(pll_28nm->pdev,
+                                       pll_28nm->clks, pll_28nm->num_clks);
+
+       for (i = 0; i < NUM_PROVIDED_CLKS; i++)
+               pll_28nm->provided_clks[i] = NULL;
+
+       pll_28nm->num_clks = 0;
+       pll_28nm->clk_data.clks = NULL;
+       pll_28nm->clk_data.clk_num = 0;

Is all this really necessary?

It isn't. I copy pasted from dsi_pll_28nm.c and it had this. Will make
a patch to remove it from that file too.


+}
+
+static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm)
+{
+       char clk_name[32], parent[32], vco_name[32];
+       struct clk_init_data vco_init = {
+               .parent_names = (const char *[]){ "pxo" },
+               .num_parents = 1,
+               .name = vco_name,
+               .ops = &clk_ops_dsi_pll_28nm_vco,
+       };
+       struct device *dev = &pll_28nm->pdev->dev;
+       struct clk **clks = pll_28nm->clks;
+       struct clk **provided_clks = pll_28nm->provided_clks;
+       struct clk_bytediv *bytediv;
+       struct clk_init_data bytediv_init;


        struct clk_init_data bytediv_init = { };

Just in case we add some new field there?

Will do.


+       int ret, num = 0;
+
+       DBG("%d", pll_28nm->id);
+
+       bytediv = devm_kzalloc(dev, sizeof(*bytediv), GFP_KERNEL);
+       if (!bytediv)
+               return -ENOMEM;
+
+       pll_28nm->bytediv = bytediv;
+
+       snprintf(vco_name, 32, "dsi%dvco_clk", pll_28nm->id);
+       pll_28nm->base.clk_hw.init = &vco_init;
+
+       clks[num++] = clk_register(dev, &pll_28nm->base.clk_hw);
+
+       /* prepare and register bytediv */
+       bytediv->hw.init = &bytediv_init;
+       bytediv->reg = pll_28nm->mmio + REG_DSI_28nm_8960_PHY_PLL_CTRL_9;
+
+       snprintf(parent, 32, "dsi%dvco_clk", pll_28nm->id);
+       snprintf(clk_name, 32, "dsi%dpllbyte", pll_28nm->id);
+
+       bytediv_init.name = clk_name;
+       bytediv_init.ops = &clk_bytediv_ops;
+       bytediv_init.flags = CLK_SET_RATE_PARENT;
+       bytediv_init.parent_names = (const char *[]) { parent };

Can't we just do &parent instead of this anonymous array?

&parent doesn't make sense here. parent in this function is an array
of characters, not a pointer to a character.

I can think of only this way. We do something similar when we call
clk_register_mux() in dsi_pll_28nm.c.

Archit


+       bytediv_init.num_parents = 1;
+
+       /* DIV2 */


--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to