Commit bb6eddd1 authored by Martin Blumenstingl's avatar Martin Blumenstingl Committed by Neil Armstrong

clk: meson: meson8b: use the HHI syscon if available

The clock controller is located in a register range (called "HHI") which
contains more than just registers for the clock controller. Known
consumers of the HHI register range are:
- the clock controller
- a reset controller
- temperature sensor calibration coefficient (TSC) (only on Meson8b and
  Meson8m2)
- HDMI controller

The main reason for using a syscon is the "temperature sensor
calibration coefficient" which has to be set for the built-in temperature
sensor to work correctly. Four TSC bits are located in the SAR ADC's
register space. However on Meson8b and Meson8m2 there is a fifth TSC bit
which is unfortunately located in the HHI register space. To be more
precise, bit 9 of the HHI_DPLL_TOP_0 register (which sits right between
the HHI_SYS_PLL and HHI_VID_PLL registers).

Get the regmap from the parent (HHI syscon) node to support all
functionality of the HHI register range. Backwards compatibility with
old .dtbs is ensured by falling back to parsing the registers just like
before this change.
Signed-off-by: default avatarMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Acked-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Link: https://lkml.kernel.org/r/20181028120859.5735-3-martin.blumenstingl@googlemail.com
parent 6c763077
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clk-provider.h> #include <linux/clk-provider.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/mfd/syscon.h>
#include <linux/of_address.h> #include <linux/of_address.h>
#include <linux/reset-controller.h> #include <linux/reset-controller.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -1114,16 +1115,21 @@ static void __init meson8b_clkc_init(struct device_node *np) ...@@ -1114,16 +1115,21 @@ static void __init meson8b_clkc_init(struct device_node *np)
struct regmap *map; struct regmap *map;
int i, ret; int i, ret;
/* Generic clocks, PLLs and some of the reset-bits */ map = syscon_node_to_regmap(of_get_parent(np));
clk_base = of_iomap(np, 1); if (IS_ERR(map)) {
if (!clk_base) { pr_info("failed to get HHI regmap - Trying obsolete regs\n");
pr_err("%s: Unable to map clk base\n", __func__);
return;
}
map = regmap_init_mmio(NULL, clk_base, &clkc_regmap_config); /* Generic clocks, PLLs and some of the reset-bits */
if (IS_ERR(map)) clk_base = of_iomap(np, 1);
return; if (!clk_base) {
pr_err("%s: Unable to map clk base\n", __func__);
return;
}
map = regmap_init_mmio(NULL, clk_base, &clkc_regmap_config);
if (IS_ERR(map))
return;
}
rstc = kzalloc(sizeof(*rstc), GFP_KERNEL); rstc = kzalloc(sizeof(*rstc), GFP_KERNEL);
if (!rstc) if (!rstc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment