Takashi Iwai 0ee6e3
From 1f737ffa13efd3da2c703d45894ea234e9290c89 Mon Sep 17 00:00:00 2001
Takashi Iwai 0ee6e3
From: Jerome Brunet <jbrunet@baylibre.com>
Takashi Iwai 0ee6e3
Date: Fri, 28 Jul 2017 18:32:28 +0200
Takashi Iwai 0ee6e3
Subject: [PATCH] clk: meson: mpll: fix mpll0 fractional part ignored
Takashi Iwai 0ee6e3
Git-commit: 1f737ffa13efd3da2c703d45894ea234e9290c89
Takashi Iwai 0ee6e3
Patch-mainline: v4.13-rc4
Takashi Iwai 0ee6e3
References: bsc#1051510
Takashi Iwai 0ee6e3
Takashi Iwai 0ee6e3
mpll0 clock is special compared to the other mplls. It needs another
Takashi Iwai 0ee6e3
bit (ssen) to be set to activate the fractional part the mpll divider
Takashi Iwai 0ee6e3
Takashi Iwai 0ee6e3
Fixes: 007e6e5c5f01 ("clk: meson: mpll: add rw operation")
Takashi Iwai 0ee6e3
Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Takashi Iwai 0ee6e3
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Takashi Iwai 0ee6e3
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 0ee6e3
Takashi Iwai 0ee6e3
---
Takashi Iwai 0ee6e3
 drivers/clk/meson/clk-mpll.c | 7 +++++++
Takashi Iwai 0ee6e3
 drivers/clk/meson/clkc.h     | 1 +
Takashi Iwai 0ee6e3
 drivers/clk/meson/gxbb.c     | 5 +++++
Takashi Iwai 0ee6e3
 drivers/clk/meson/meson8b.c  | 5 +++++
Takashi Iwai 0ee6e3
 4 files changed, 18 insertions(+)
Takashi Iwai 0ee6e3
Takashi Iwai 0ee6e3
diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c
Takashi Iwai 0ee6e3
index 39eab69fe51a..44a5a535ca63 100644
Takashi Iwai 0ee6e3
--- a/drivers/clk/meson/clk-mpll.c
Takashi Iwai 0ee6e3
+++ b/drivers/clk/meson/clk-mpll.c
Takashi Iwai 0ee6e3
@@ -161,6 +161,13 @@ static int mpll_set_rate(struct clk_hw *hw,
Takashi Iwai 0ee6e3
 	reg = PARM_SET(p->width, p->shift, reg, 1);
Takashi Iwai 0ee6e3
 	writel(reg, mpll->base + p->reg_off);
Takashi Iwai 0ee6e3
 
Takashi Iwai 0ee6e3
+	p = &mpll->ssen;
Takashi Iwai 0ee6e3
+	if (p->width != 0) {
Takashi Iwai 0ee6e3
+		reg = readl(mpll->base + p->reg_off);
Takashi Iwai 0ee6e3
+		reg = PARM_SET(p->width, p->shift, reg, 1);
Takashi Iwai 0ee6e3
+		writel(reg, mpll->base + p->reg_off);
Takashi Iwai 0ee6e3
+	}
Takashi Iwai 0ee6e3
+
Takashi Iwai 0ee6e3
 	p = &mpll->n2;
Takashi Iwai 0ee6e3
 	reg = readl(mpll->base + p->reg_off);
Takashi Iwai 0ee6e3
 	reg = PARM_SET(p->width, p->shift, reg, n2);
Takashi Iwai 0ee6e3
diff --git a/drivers/clk/meson/clkc.h b/drivers/clk/meson/clkc.h
Takashi Iwai 0ee6e3
index d6feafe8bd6c..1629da9b4141 100644
Takashi Iwai 0ee6e3
--- a/drivers/clk/meson/clkc.h
Takashi Iwai 0ee6e3
+++ b/drivers/clk/meson/clkc.h
Takashi Iwai 0ee6e3
@@ -118,6 +118,7 @@ struct meson_clk_mpll {
Takashi Iwai 0ee6e3
 	struct parm sdm_en;
Takashi Iwai 0ee6e3
 	struct parm n2;
Takashi Iwai 0ee6e3
 	struct parm en;
Takashi Iwai 0ee6e3
+	struct parm ssen;
Takashi Iwai 0ee6e3
 	spinlock_t *lock;
Takashi Iwai 0ee6e3
 };
Takashi Iwai 0ee6e3
 
Takashi Iwai 0ee6e3
diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c
Takashi Iwai 0ee6e3
index a897ea45327c..a7ea5f3da89d 100644
Takashi Iwai 0ee6e3
--- a/drivers/clk/meson/gxbb.c
Takashi Iwai 0ee6e3
+++ b/drivers/clk/meson/gxbb.c
Takashi Iwai 0ee6e3
@@ -528,6 +528,11 @@ static struct meson_clk_mpll gxbb_mpll0 = {
Takashi Iwai 0ee6e3
 		.shift   = 14,
Takashi Iwai 0ee6e3
 		.width	 = 1,
Takashi Iwai 0ee6e3
 	},
Takashi Iwai 0ee6e3
+	.ssen = {
Takashi Iwai 0ee6e3
+		.reg_off = HHI_MPLL_CNTL,
Takashi Iwai 0ee6e3
+		.shift   = 25,
Takashi Iwai 0ee6e3
+		.width	 = 1,
Takashi Iwai 0ee6e3
+	},
Takashi Iwai 0ee6e3
 	.lock = &clk_lock,
Takashi Iwai 0ee6e3
 	.hw.init = &(struct clk_init_data){
Takashi Iwai 0ee6e3
 		.name = "mpll0",
Takashi Iwai 0ee6e3
diff --git a/drivers/clk/meson/meson8b.c b/drivers/clk/meson/meson8b.c
Takashi Iwai 0ee6e3
index bb3f1de876b1..6ec512ad2598 100644
Takashi Iwai 0ee6e3
--- a/drivers/clk/meson/meson8b.c
Takashi Iwai 0ee6e3
+++ b/drivers/clk/meson/meson8b.c
Takashi Iwai 0ee6e3
@@ -267,6 +267,11 @@ static struct meson_clk_mpll meson8b_mpll0 = {
Takashi Iwai 0ee6e3
 		.shift   = 14,
Takashi Iwai 0ee6e3
 		.width   = 1,
Takashi Iwai 0ee6e3
 	},
Takashi Iwai 0ee6e3
+	.ssen = {
Takashi Iwai 0ee6e3
+		.reg_off = HHI_MPLL_CNTL,
Takashi Iwai 0ee6e3
+		.shift   = 25,
Takashi Iwai 0ee6e3
+		.width   = 1,
Takashi Iwai 0ee6e3
+	},
Takashi Iwai 0ee6e3
 	.lock = &clk_lock,
Takashi Iwai 0ee6e3
 	.hw.init = &(struct clk_init_data){
Takashi Iwai 0ee6e3
 		.name = "mpll0",
Takashi Iwai 0ee6e3
-- 
Takashi Iwai 0ee6e3
2.18.0
Takashi Iwai 0ee6e3