diff mbox

[v2,06/10] clk: qoriq: Add ls2080a support.

Message ID 1441349872-4560-7-git-send-email-bhupesh.sharma@freescale.com (mailing list archive)
State New, archived
Headers show

Commit Message

bhupesh.sharma@freescale.com Sept. 4, 2015, 6:57 a.m. UTC
From: Scott Wood <scottwood@freescale.com>

LS2080A is the first implementation of the chassis 3 clockgen, which
has a different register layout than previous chips.  It is also little
endian, unlike previous chips.

Signed-off-by: Scott Wood <scottwood@freescale.com>
---
 drivers/clk/Kconfig     |    2 +-
 drivers/clk/clk-qoriq.c |   78 +++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 70 insertions(+), 10 deletions(-)

Comments

Li Yang-R58472 Sept. 4, 2015, 8:01 p.m. UTC | #1
On Fri, Sep 4, 2015 at 1:57 AM, Bhupesh Sharma
<bhupesh.sharma@freescale.com> wrote:
> From: Scott Wood <scottwood@freescale.com>
>
> LS2080A is the first implementation of the chassis 3 clockgen, which
> has a different register layout than previous chips.  It is also little
> endian, unlike previous chips.
>
> Signed-off-by: Scott Wood <scottwood@freescale.com>
> ---

You should probably mention here that the patch is depending on
another pending patch to apply.  And this patch should be going
through the same sub-system tree as the dependency patch.  Otherwise,
there is no way it can be applied.

Regards,
Leo
bhupesh.sharma@freescale.com Sept. 4, 2015, 8:09 p.m. UTC | #2
> From: pku.leo@gmail.com [mailto:pku.leo@gmail.com]
> Sent: Saturday, September 05, 2015 1:32 AM
> On Fri, Sep 4, 2015 at 1:57 AM, Bhupesh Sharma
> <bhupesh.sharma@freescale.com> wrote:
> > From: Scott Wood <scottwood@freescale.com>
> >
> > LS2080A is the first implementation of the chassis 3 clockgen, which
> > has a different register layout than previous chips.  It is also
> > little endian, unlike previous chips.
> >
> > Signed-off-by: Scott Wood <scottwood@freescale.com>
> > ---
> 
> You should probably mention here that the patch is depending on another
> pending patch to apply.  And this patch should be going through the same
> sub-system tree as the dependency patch.  Otherwise, there is no way it
> can be applied.
> 

Cover-letter already captures this: 
http://www.spinics.net/lists/arm-kernel/msg442910.html

See the section 'Rebasing details'. linux-clk is already copied.

Regards,
Bhupesh
Li Yang-R58472 Sept. 4, 2015, 9:06 p.m. UTC | #3
On Fri, Sep 4, 2015 at 3:09 PM, Sharma Bhupesh
<bhupesh.sharma@freescale.com> wrote:
>> From: pku.leo@gmail.com [mailto:pku.leo@gmail.com]
>> Sent: Saturday, September 05, 2015 1:32 AM
>> On Fri, Sep 4, 2015 at 1:57 AM, Bhupesh Sharma
>> <bhupesh.sharma@freescale.com> wrote:
>> > From: Scott Wood <scottwood@freescale.com>
>> >
>> > LS2080A is the first implementation of the chassis 3 clockgen, which
>> > has a different register layout than previous chips.  It is also
>> > little endian, unlike previous chips.
>> >
>> > Signed-off-by: Scott Wood <scottwood@freescale.com>
>> > ---
>>
>> You should probably mention here that the patch is depending on another
>> pending patch to apply.  And this patch should be going through the same
>> sub-system tree as the dependency patch.  Otherwise, there is no way it
>> can be applied.
>>
>
> Cover-letter already captures this:
> http://www.spinics.net/lists/arm-kernel/msg442910.html
>
> See the section 'Rebasing details'. linux-clk is already copied.

But not all the patches are depending on the clk patches.  You should
probably break up the series to patches that can be applied cleanly
and patches that are depending on the clock patches and should go
through the clk tree.

Regards,
Leo
Scott Wood Sept. 9, 2015, 4:39 p.m. UTC | #4
On Fri, 2015-09-04 at 12:27 +0530, Bhupesh Sharma wrote:
> From: Scott Wood <scottwood@freescale.com>
> 
> LS2080A is the first implementation of the chassis 3 clockgen, which
> has a different register layout than previous chips.  It is also little
> endian, unlike previous chips.
> 
> Signed-off-by: Scott Wood <scottwood@freescale.com>
> ---

You should add your own signoff when passing on someone else's patch.

FWIW, I'm likely to squash this with my previous clk-qoriq patches when I 
resubmit.

-Scott
Scott Wood Sept. 9, 2015, 4:41 p.m. UTC | #5
On Fri, 2015-09-04 at 16:06 -0500, Li Yang wrote:
> On Fri, Sep 4, 2015 at 3:09 PM, Sharma Bhupesh
> <bhupesh.sharma@freescale.com> wrote:
> > > From:  pku.leo@gmail.com[mailto:pku.leo@gmail.com]
> > > Sent: Saturday, September 05, 2015 1:32 AM
> > > On Fri, Sep 4, 2015 at 1:57 AM, Bhupesh Sharma
> > > <bhupesh.sharma@freescale.com> wrote:
> > > > From: Scott Wood <scottwood@freescale.com>
> > > > 
> > > > LS2080A is the first implementation of the chassis 3 clockgen, which
> > > > has a different register layout than previous chips.  It is also
> > > > little endian, unlike previous chips.
> > > > 
> > > > Signed-off-by: Scott Wood <scottwood@freescale.com>
> > > > ---
> > > 
> > > You should probably mention here that the patch is depending on another
> > > pending patch to apply.  And this patch should be going through the same
> > > sub-system tree as the dependency patch.  Otherwise, there is no way it
> > > can be applied.
> > > 
> > 
> > Cover-letter already captures this:
> > http://www.spinics.net/lists/arm-kernel/msg442910.html
> > 
> > See the section 'Rebasing details'. linux-clk is already copied.
> 
> But not all the patches are depending on the clk patches.  You should
> probably break up the series to patches that can be applied cleanly
> and patches that are depending on the clock patches and should go
> through the clk tree.

The clock patches have already been acked, so they don't necessarily need to 
go via the clock tree.  However, there are both ARM and PPC patches that 
depend on them, so maybe we should create a topic branch?

-Scott
diff mbox

Patch

diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 42f7120..9f1970c 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -121,7 +121,7 @@  config COMMON_CLK_AXI_CLKGEN
 
 config CLK_QORIQ
 	bool "Clock driver for Freescale QorIQ platforms"
-	depends on (PPC_E500MC || ARM) && OF
+	depends on (PPC_E500MC || ARM || ARM64) && OF
 	---help---
 	  This adds the clock driver support for Freescale QorIQ platforms
 	  using common clock framework.
diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c
index d9e4402..bae82ac 100644
--- a/drivers/clk/clk-qoriq.c
+++ b/drivers/clk/clk-qoriq.c
@@ -68,7 +68,10 @@  struct clockgen;
  * If not set, cmux freq must be >= platform pll/2
  */
 #define CG_CMUX_GE_PLAT		1
+
 #define CG_PLL_8BIT		2	/* PLLCnGSR[CFG] is 8 bits, not 6 */
+#define CG_VER3			4	/* version 3 cg: reg layout different */
+#define CG_LITTLE_ENDIAN	8
 
 struct clockgen_chipinfo {
 	const char *compat, *guts_compat;
@@ -94,6 +97,26 @@  struct clockgen {
 
 static struct clockgen clockgen;
 
+static void cg_out(struct clockgen *cg, u32 val, u32 __iomem *reg)
+{
+	if (cg->info.flags & CG_LITTLE_ENDIAN)
+		iowrite32(val, reg);
+	else
+		iowrite32be(val, reg);
+}
+
+static u32 cg_in(struct clockgen *cg, u32 __iomem *reg)
+{
+	u32 val;
+
+	if (cg->info.flags & CG_LITTLE_ENDIAN)
+		val = ioread32(reg);
+	else
+		val = ioread32be(reg);
+
+	return val;
+}
+
 static const struct clockgen_muxinfo p2041_cmux_grp1 = {
 	{
 		[0] = { CLKSEL_VALID, CGA_PLL1, PLL_DIV1 },
@@ -429,6 +452,17 @@  static const struct clockgen_chipinfo chipinfo[] = {
 		.pll_mask = 0x03,
 	},
 	{
+		.compat = "fsl,ls2080a-clockgen",
+		.cmux_groups = {
+			&clockgen2_cmux_cga12, &clockgen2_cmux_cgb
+		},
+		.cmux_to_group = {
+			0, 0, 1, 1, -1
+		},
+		.pll_mask = 0x37,
+		.flags = CG_VER3 | CG_LITTLE_ENDIAN,
+	},
+	{
 		.compat = "fsl,p2041-clockgen",
 		.guts_compat = "fsl,qoriq-device-config-1.0",
 		.init_periph = p2041_init_periph,
@@ -575,7 +609,7 @@  static int mux_set_parent(struct clk_hw *hw, u8 idx)
 		return -EINVAL;
 
 	clksel = hwc->parent_to_clksel[idx];
-	iowrite32be((clksel << CLKSEL_SHIFT) & CLKSEL_MASK, hwc->reg);
+	cg_out(hwc->cg, (clksel << CLKSEL_SHIFT) & CLKSEL_MASK, hwc->reg);
 
 	return 0;
 }
@@ -586,7 +620,7 @@  static u8 mux_get_parent(struct clk_hw *hw)
 	u32 clksel;
 	s8 ret;
 
-	clksel = (ioread32be(hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
+	clksel = (cg_in(hwc->cg, hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
 
 	ret = hwc->clksel_to_parent[clksel];
 	if (ret < 0) {
@@ -694,6 +728,7 @@  static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
 	if (!hwc)
 		return NULL;
 
+	hwc->cg = cg;
 	hwc->reg = cg->regs + 0x20 * idx;
 	hwc->info = cg->info.cmux_groups[cg->info.cmux_to_group[idx]];
 
@@ -704,7 +739,7 @@  static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
 	 * default clksel) may be inappropriately excluded on certain
 	 * chips.
 	 */
-	clksel = (ioread32be(hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
+	clksel = (cg_in(cg, hwc->reg) & CLKSEL_MASK) >> CLKSEL_SHIFT;
 	div = get_pll_div(cg, hwc, clksel);
 	if (!div)
 		return NULL;
@@ -873,13 +908,36 @@  static void __init create_one_pll(struct clockgen *cg, int idx)
 	if (!(cg->info.pll_mask & (1 << idx)))
 		return;
 
-	if (idx == PLATFORM_PLL)
-		reg = cg->regs + 0xc00;
-	else
-		reg = cg->regs + 0x800 + 0x20 * (idx - 1);
+	if (cg->info.flags & CG_VER3) {
+		switch (idx) {
+		case PLATFORM_PLL:
+			reg = cg->regs + 0x60080;
+			break;
+		case CGA_PLL1:
+			reg = cg->regs + 0x80;
+			break;
+		case CGA_PLL2:
+			reg = cg->regs + 0xa0;
+			break;
+		case CGB_PLL1:
+			reg = cg->regs + 0x10080;
+			break;
+		case CGB_PLL2:
+			reg = cg->regs + 0x100a0;
+			break;
+		default:
+			WARN_ONCE(1, "index %d\n", idx);
+			return;
+		}
+	} else {
+		if (idx == PLATFORM_PLL)
+			reg = cg->regs + 0xc00;
+		else
+			reg = cg->regs + 0x800 + 0x20 * (idx - 1);
+	}
 
 	/* Get the multiple of PLL */
-	mult = ioread32be(reg);
+	mult = cg_in(cg, reg);
 
 	/* Check if this PLL is disabled */
 	if (mult & PLL_KILL) {
@@ -887,7 +945,8 @@  static void __init create_one_pll(struct clockgen *cg, int idx)
 		return;
 	}
 
-	if ((cg->info.flags & CG_PLL_8BIT) && idx != PLATFORM_PLL)
+	if ((cg->info.flags & CG_VER3) ||
+	    ((cg->info.flags & CG_PLL_8BIT) && idx != PLATFORM_PLL))
 		mult = (mult & GENMASK(8, 1)) >> 1;
 	else
 		mult = (mult & GENMASK(6, 1)) >> 1;
@@ -1168,6 +1227,7 @@  err:
 CLK_OF_DECLARE(qoriq_clockgen_1, "fsl,qoriq-clockgen-1.0", clockgen_init);
 CLK_OF_DECLARE(qoriq_clockgen_2, "fsl,qoriq-clockgen-2.0", clockgen_init);
 CLK_OF_DECLARE(qoriq_clockgen_ls1021a, "fsl,ls1021a-clockgen", clockgen_init);
+CLK_OF_DECLARE(qoriq_clockgen_ls2080a, "fsl,ls2080a-clockgen", clockgen_init);
 
 /* Legacy nodes */
 CLK_OF_DECLARE(qoriq_sysclk_1, "fsl,qoriq-sysclk-1.0", sysclk_init);