aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/sunxi/patches-4.9/0003-clk-sunxi-ng-Remove-the-use-of-rational-computations.patch
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2017-07-15 22:50:41 +0200
committerHauke Mehrtens <hauke@hauke-m.de>2017-09-18 20:34:55 +0200
commit34a422794ddab738408edc7e3980ccbc14f28af4 (patch)
tree06f99aeb1acab719dea0a5743d44c2026613edbb /target/linux/sunxi/patches-4.9/0003-clk-sunxi-ng-Remove-the-use-of-rational-computations.patch
parente080a7ce07ee8cd63c71e1469853a233d9bc7a4c (diff)
downloadupstream-34a422794ddab738408edc7e3980ccbc14f28af4.tar.gz
upstream-34a422794ddab738408edc7e3980ccbc14f28af4.tar.bz2
upstream-34a422794ddab738408edc7e3980ccbc14f28af4.zip
sunxi: Backport patches needed for A64
This backports multiple patches from kernel 4.10 which are adding missing support for the A64 and the pine64 board. These are the device tree files, the pinctlk and the clock driver. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Diffstat (limited to 'target/linux/sunxi/patches-4.9/0003-clk-sunxi-ng-Remove-the-use-of-rational-computations.patch')
-rw-r--r--target/linux/sunxi/patches-4.9/0003-clk-sunxi-ng-Remove-the-use-of-rational-computations.patch239
1 files changed, 239 insertions, 0 deletions
diff --git a/target/linux/sunxi/patches-4.9/0003-clk-sunxi-ng-Remove-the-use-of-rational-computations.patch b/target/linux/sunxi/patches-4.9/0003-clk-sunxi-ng-Remove-the-use-of-rational-computations.patch
new file mode 100644
index 0000000000..6b8f46eae0
--- /dev/null
+++ b/target/linux/sunxi/patches-4.9/0003-clk-sunxi-ng-Remove-the-use-of-rational-computations.patch
@@ -0,0 +1,239 @@
+From ee28648cb2b4d4ab5c2eb8199ea86675fe19016b Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime.ripard@free-electrons.com>
+Date: Thu, 29 Sep 2016 22:53:12 +0200
+Subject: clk: sunxi-ng: Remove the use of rational computations
+
+While the rational library works great, it doesn't really allow us to add
+more constraints, like the minimum.
+
+Remove that in order to be able to deal with the constraints we'll need.
+
+Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
+Acked-by: Chen-Yu Tsai <wens@csie.org>
+---
+ drivers/clk/sunxi-ng/Kconfig | 3 ---
+ drivers/clk/sunxi-ng/ccu_nkm.c | 31 ++++++++++++-----------
+ drivers/clk/sunxi-ng/ccu_nkmp.c | 37 ++++++++++++++--------------
+ drivers/clk/sunxi-ng/ccu_nm.c | 54 +++++++++++++++++++++++++++++++----------
+ 4 files changed, 74 insertions(+), 51 deletions(-)
+
+--- a/drivers/clk/sunxi-ng/Kconfig
++++ b/drivers/clk/sunxi-ng/Kconfig
+@@ -35,17 +35,14 @@ config SUNXI_CCU_NK
+
+ config SUNXI_CCU_NKM
+ bool
+- select RATIONAL
+ select SUNXI_CCU_GATE
+
+ config SUNXI_CCU_NKMP
+ bool
+- select RATIONAL
+ select SUNXI_CCU_GATE
+
+ config SUNXI_CCU_NM
+ bool
+- select RATIONAL
+ select SUNXI_CCU_FRAC
+ select SUNXI_CCU_GATE
+
+--- a/drivers/clk/sunxi-ng/ccu_nkm.c
++++ b/drivers/clk/sunxi-ng/ccu_nkm.c
+@@ -9,7 +9,6 @@
+ */
+
+ #include <linux/clk-provider.h>
+-#include <linux/rational.h>
+
+ #include "ccu_gate.h"
+ #include "ccu_nkm.h"
+@@ -28,21 +27,21 @@ static void ccu_nkm_find_best(unsigned l
+ unsigned long _n, _k, _m;
+
+ for (_k = 1; _k <= nkm->max_k; _k++) {
+- unsigned long tmp_rate;
+-
+- rational_best_approximation(rate / _k, parent,
+- nkm->max_n, nkm->max_m, &_n, &_m);
+-
+- tmp_rate = parent * _n * _k / _m;
+-
+- if (tmp_rate > rate)
+- continue;
+-
+- if ((rate - tmp_rate) < (rate - best_rate)) {
+- best_rate = tmp_rate;
+- best_n = _n;
+- best_k = _k;
+- best_m = _m;
++ for (_n = 1; _n <= nkm->max_n; _n++) {
++ for (_m = 1; _n <= nkm->max_m; _m++) {
++ unsigned long tmp_rate;
++
++ tmp_rate = parent * _n * _k / _m;
++
++ if (tmp_rate > rate)
++ continue;
++ if ((rate - tmp_rate) < (rate - best_rate)) {
++ best_rate = tmp_rate;
++ best_n = _n;
++ best_k = _k;
++ best_m = _m;
++ }
++ }
+ }
+ }
+
+--- a/drivers/clk/sunxi-ng/ccu_nkmp.c
++++ b/drivers/clk/sunxi-ng/ccu_nkmp.c
+@@ -9,7 +9,6 @@
+ */
+
+ #include <linux/clk-provider.h>
+-#include <linux/rational.h>
+
+ #include "ccu_gate.h"
+ #include "ccu_nkmp.h"
+@@ -29,24 +28,24 @@ static void ccu_nkmp_find_best(unsigned
+ unsigned long _n, _k, _m, _p;
+
+ for (_k = 1; _k <= nkmp->max_k; _k++) {
+- for (_p = 1; _p <= nkmp->max_p; _p <<= 1) {
+- unsigned long tmp_rate;
+-
+- rational_best_approximation(rate / _k, parent / _p,
+- nkmp->max_n, nkmp->max_m,
+- &_n, &_m);
+-
+- tmp_rate = parent * _n * _k / (_m * _p);
+-
+- if (tmp_rate > rate)
+- continue;
+-
+- if ((rate - tmp_rate) < (rate - best_rate)) {
+- best_rate = tmp_rate;
+- best_n = _n;
+- best_k = _k;
+- best_m = _m;
+- best_p = _p;
++ for (_n = 1; _n <= nkmp->max_n; _n++) {
++ for (_m = 1; _n <= nkmp->max_m; _m++) {
++ for (_p = 1; _p <= nkmp->max_p; _p <<= 1) {
++ unsigned long tmp_rate;
++
++ tmp_rate = parent * _n * _k / (_m * _p);
++
++ if (tmp_rate > rate)
++ continue;
++
++ if ((rate - tmp_rate) < (rate - best_rate)) {
++ best_rate = tmp_rate;
++ best_n = _n;
++ best_k = _k;
++ best_m = _m;
++ best_p = _p;
++ }
++ }
+ }
+ }
+ }
+--- a/drivers/clk/sunxi-ng/ccu_nm.c
++++ b/drivers/clk/sunxi-ng/ccu_nm.c
+@@ -9,12 +9,42 @@
+ */
+
+ #include <linux/clk-provider.h>
+-#include <linux/rational.h>
+
+ #include "ccu_frac.h"
+ #include "ccu_gate.h"
+ #include "ccu_nm.h"
+
++struct _ccu_nm {
++ unsigned long n, max_n;
++ unsigned long m, max_m;
++};
++
++static void ccu_nm_find_best(unsigned long parent, unsigned long rate,
++ struct _ccu_nm *nm)
++{
++ unsigned long best_rate = 0;
++ unsigned long best_n = 0, best_m = 0;
++ unsigned long _n, _m;
++
++ for (_n = 1; _n <= nm->max_n; _n++) {
++ for (_m = 1; _n <= nm->max_m; _m++) {
++ unsigned long tmp_rate = parent * _n / _m;
++
++ if (tmp_rate > rate)
++ continue;
++
++ if ((rate - tmp_rate) < (rate - best_rate)) {
++ best_rate = tmp_rate;
++ best_n = _n;
++ best_m = _m;
++ }
++ }
++ }
++
++ nm->n = best_n;
++ nm->m = best_m;
++}
++
+ static void ccu_nm_disable(struct clk_hw *hw)
+ {
+ struct ccu_nm *nm = hw_to_ccu_nm(hw);
+@@ -61,24 +91,22 @@ static long ccu_nm_round_rate(struct clk
+ unsigned long *parent_rate)
+ {
+ struct ccu_nm *nm = hw_to_ccu_nm(hw);
+- unsigned long max_n, max_m;
+- unsigned long n, m;
++ struct _ccu_nm _nm;
+
+- max_n = 1 << nm->n.width;
+- max_m = nm->m.max ?: 1 << nm->m.width;
++ _nm.max_n = 1 << nm->n.width;
++ _nm.max_m = nm->m.max ?: 1 << nm->m.width;
+
+- rational_best_approximation(rate, *parent_rate, max_n, max_m, &n, &m);
++ ccu_nm_find_best(*parent_rate, rate, &_nm);
+
+- return *parent_rate * n / m;
++ return *parent_rate * _nm.n / _nm.m;
+ }
+
+ static int ccu_nm_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+ {
+ struct ccu_nm *nm = hw_to_ccu_nm(hw);
++ struct _ccu_nm _nm;
+ unsigned long flags;
+- unsigned long max_n, max_m;
+- unsigned long n, m;
+ u32 reg;
+
+ if (ccu_frac_helper_has_rate(&nm->common, &nm->frac, rate))
+@@ -86,10 +114,10 @@ static int ccu_nm_set_rate(struct clk_hw
+ else
+ ccu_frac_helper_disable(&nm->common, &nm->frac);
+
+- max_n = 1 << nm->n.width;
+- max_m = nm->m.max ?: 1 << nm->m.width;
++ _nm.max_n = 1 << nm->n.width;
++ _nm.max_m = nm->m.max ?: 1 << nm->m.width;
+
+- rational_best_approximation(rate, parent_rate, max_n, max_m, &n, &m);
++ ccu_nm_find_best(parent_rate, rate, &_nm);
+
+ spin_lock_irqsave(nm->common.lock, flags);
+
+@@ -97,7 +125,7 @@ static int ccu_nm_set_rate(struct clk_hw
+ reg &= ~GENMASK(nm->n.width + nm->n.shift - 1, nm->n.shift);
+ reg &= ~GENMASK(nm->m.width + nm->m.shift - 1, nm->m.shift);
+
+- writel(reg | ((m - 1) << nm->m.shift) | ((n - 1) << nm->n.shift),
++ writel(reg | ((_nm.m - 1) << nm->m.shift) | ((_nm.n - 1) << nm->n.shift),
+ nm->common.base + nm->common.reg);
+
+ spin_unlock_irqrestore(nm->common.lock, flags);