mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 11:40:19 -04:00
Merge tag 'renesas-clk-for-v5.20-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-renesas
Pull Renesas clk driver updates from Geert Uytterhoeven: - Add GPT/POEG (PWM) clocks and resets on RZ/G2L - Add PFC and WDT clocks and resets on RZ/V2M - Add thermal, SDHI, Z (CPU core), PCIe, and HSCIF (serial) clocks on R-Car S4-8 - Miscellaneous fixes and improvements * tag 'renesas-clk-for-v5.20-tag1' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers: clk: renesas: r8a779f0: Add HSCIF clocks clk: renesas: r8a779f0: Add PCIe clocks clk: renesas: r8a779f0: Add Z0 and Z1 clock support dt-bindings: clock: renesas,rzg2l: Simplify header file references clk: renesas: rza1: Remove struct rz_cpg clk: renesas: r8a7779: Remove struct r8a7779_cpg clk: renesas: r8a7778: Remove struct r8a7778_cpg clk: renesas: sh73a0: Remove sh73a0_cpg.reg clk: renesas: r8a7740: Remove r8a7740_cpg.reg clk: renesas: r8a73a4: Remove r8a73a4_cpg.reg clk: renesas: r8a779f0: Add SDHI0 clock clk: renesas: r8a779f0: Add thermal clock clk: renesas: rzg2l: Fix reset status function clk: renesas: r9a06g032: Fix UART clkgrp bitsel clk: renesas: r9a06g032: Drop some unused fields clk: renesas: r9a09g011: Add WDT clock and reset entries clk: renesas: r9a09g011: Add PFC clock and reset entries clk: renesas: r9a07g044: Add POEG clock and reset entries clk: renesas: r9a07g044: Add GPT clock and reset entry
This commit is contained in:
@@ -45,10 +45,9 @@ properties:
|
||||
description: |
|
||||
- For CPG core clocks, the two clock specifier cells must be "CPG_CORE"
|
||||
and a core clock reference, as defined in
|
||||
<dt-bindings/clock/r9a0*-cpg.h>
|
||||
<dt-bindings/clock/r9a0*-cpg.h>,
|
||||
- For module clocks, the two clock specifier cells must be "CPG_MOD" and
|
||||
a module number, as defined in the <dt-bindings/clock/r9a07g0*-cpg.h> or
|
||||
<dt-bindings/clock/r9a09g011-cpg.h>.
|
||||
a module number, as defined in <dt-bindings/clock/r9a0*-cpg.h>.
|
||||
const: 2
|
||||
|
||||
'#power-domain-cells':
|
||||
@@ -62,7 +61,7 @@ properties:
|
||||
'#reset-cells':
|
||||
description:
|
||||
The single reset specifier cell must be the module number, as defined in
|
||||
the <dt-bindings/clock/r9a07g0*-cpg.h> or <dt-bindings/clock/r9a09g011-cpg.h>.
|
||||
<dt-bindings/clock/r9a0*-cpg.h>.
|
||||
const: 1
|
||||
|
||||
required:
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
struct r8a73a4_cpg {
|
||||
struct clk_onecell_data data;
|
||||
spinlock_t lock;
|
||||
void __iomem *reg;
|
||||
};
|
||||
|
||||
#define CPG_CKSCR 0xc0
|
||||
@@ -59,7 +58,7 @@ static const struct clk_div_table div4_div_table[] = {
|
||||
|
||||
static struct clk * __init
|
||||
r8a73a4_cpg_register_clock(struct device_node *np, struct r8a73a4_cpg *cpg,
|
||||
const char *name)
|
||||
void __iomem *base, const char *name)
|
||||
{
|
||||
const struct clk_div_table *table = NULL;
|
||||
const char *parent_name;
|
||||
@@ -69,7 +68,7 @@ r8a73a4_cpg_register_clock(struct device_node *np, struct r8a73a4_cpg *cpg,
|
||||
|
||||
|
||||
if (!strcmp(name, "main")) {
|
||||
u32 ckscr = readl(cpg->reg + CPG_CKSCR);
|
||||
u32 ckscr = readl(base + CPG_CKSCR);
|
||||
|
||||
switch ((ckscr >> 28) & 3) {
|
||||
case 0: /* extal1 */
|
||||
@@ -93,14 +92,14 @@ r8a73a4_cpg_register_clock(struct device_node *np, struct r8a73a4_cpg *cpg,
|
||||
* clock implementation and we currently have no need to change
|
||||
* the multiplier value.
|
||||
*/
|
||||
u32 value = readl(cpg->reg + CPG_PLL0CR);
|
||||
u32 value = readl(base + CPG_PLL0CR);
|
||||
|
||||
parent_name = "main";
|
||||
mult = ((value >> 24) & 0x7f) + 1;
|
||||
if (value & BIT(20))
|
||||
div = 2;
|
||||
} else if (!strcmp(name, "pll1")) {
|
||||
u32 value = readl(cpg->reg + CPG_PLL1CR);
|
||||
u32 value = readl(base + CPG_PLL1CR);
|
||||
|
||||
parent_name = "main";
|
||||
/* XXX: enable bit? */
|
||||
@@ -123,7 +122,7 @@ r8a73a4_cpg_register_clock(struct device_node *np, struct r8a73a4_cpg *cpg,
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
value = readl(cpg->reg + cr);
|
||||
value = readl(base + cr);
|
||||
switch ((value >> 5) & 7) {
|
||||
case 0:
|
||||
parent_name = "main";
|
||||
@@ -159,7 +158,7 @@ r8a73a4_cpg_register_clock(struct device_node *np, struct r8a73a4_cpg *cpg,
|
||||
shift = 0;
|
||||
}
|
||||
div *= 32;
|
||||
mult = 0x20 - ((readl(cpg->reg + CPG_FRQCRC) >> shift) & 0x1f);
|
||||
mult = 0x20 - ((readl(base + CPG_FRQCRC) >> shift) & 0x1f);
|
||||
} else {
|
||||
struct div4_clk *c;
|
||||
|
||||
@@ -181,7 +180,7 @@ r8a73a4_cpg_register_clock(struct device_node *np, struct r8a73a4_cpg *cpg,
|
||||
mult, div);
|
||||
} else {
|
||||
return clk_register_divider_table(NULL, name, parent_name, 0,
|
||||
cpg->reg + reg, shift, 4, 0,
|
||||
base + reg, shift, 4, 0,
|
||||
table, &cpg->lock);
|
||||
}
|
||||
}
|
||||
@@ -189,6 +188,7 @@ r8a73a4_cpg_register_clock(struct device_node *np, struct r8a73a4_cpg *cpg,
|
||||
static void __init r8a73a4_cpg_clocks_init(struct device_node *np)
|
||||
{
|
||||
struct r8a73a4_cpg *cpg;
|
||||
void __iomem *base;
|
||||
struct clk **clks;
|
||||
unsigned int i;
|
||||
int num_clks;
|
||||
@@ -213,8 +213,8 @@ static void __init r8a73a4_cpg_clocks_init(struct device_node *np)
|
||||
cpg->data.clks = clks;
|
||||
cpg->data.clk_num = num_clks;
|
||||
|
||||
cpg->reg = of_iomap(np, 0);
|
||||
if (WARN_ON(cpg->reg == NULL))
|
||||
base = of_iomap(np, 0);
|
||||
if (WARN_ON(base == NULL))
|
||||
return;
|
||||
|
||||
for (i = 0; i < num_clks; ++i) {
|
||||
@@ -224,7 +224,7 @@ static void __init r8a73a4_cpg_clocks_init(struct device_node *np)
|
||||
of_property_read_string_index(np, "clock-output-names", i,
|
||||
&name);
|
||||
|
||||
clk = r8a73a4_cpg_register_clock(np, cpg, name);
|
||||
clk = r8a73a4_cpg_register_clock(np, cpg, base, name);
|
||||
if (IS_ERR(clk))
|
||||
pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
|
||||
__func__, np, name, PTR_ERR(clk));
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
struct r8a7740_cpg {
|
||||
struct clk_onecell_data data;
|
||||
spinlock_t lock;
|
||||
void __iomem *reg;
|
||||
};
|
||||
|
||||
#define CPG_FRQCRA 0x00
|
||||
@@ -61,7 +60,7 @@ static u32 cpg_mode __initdata;
|
||||
|
||||
static struct clk * __init
|
||||
r8a7740_cpg_register_clock(struct device_node *np, struct r8a7740_cpg *cpg,
|
||||
const char *name)
|
||||
void __iomem *base, const char *name)
|
||||
{
|
||||
const struct clk_div_table *table = NULL;
|
||||
const char *parent_name;
|
||||
@@ -96,20 +95,20 @@ r8a7740_cpg_register_clock(struct device_node *np, struct r8a7740_cpg *cpg,
|
||||
* clock implementation and we currently have no need to change
|
||||
* the multiplier value.
|
||||
*/
|
||||
u32 value = readl(cpg->reg + CPG_FRQCRC);
|
||||
u32 value = readl(base + CPG_FRQCRC);
|
||||
parent_name = "system";
|
||||
mult = ((value >> 24) & 0x7f) + 1;
|
||||
} else if (!strcmp(name, "pllc1")) {
|
||||
u32 value = readl(cpg->reg + CPG_FRQCRA);
|
||||
u32 value = readl(base + CPG_FRQCRA);
|
||||
parent_name = "system";
|
||||
mult = ((value >> 24) & 0x7f) + 1;
|
||||
div = 2;
|
||||
} else if (!strcmp(name, "pllc2")) {
|
||||
u32 value = readl(cpg->reg + CPG_PLLC2CR);
|
||||
u32 value = readl(base + CPG_PLLC2CR);
|
||||
parent_name = "system";
|
||||
mult = ((value >> 24) & 0x3f) + 1;
|
||||
} else if (!strcmp(name, "usb24s")) {
|
||||
u32 value = readl(cpg->reg + CPG_USBCKCR);
|
||||
u32 value = readl(base + CPG_USBCKCR);
|
||||
if (value & BIT(7))
|
||||
/* extal2 */
|
||||
parent_name = of_clk_get_parent_name(np, 1);
|
||||
@@ -137,7 +136,7 @@ r8a7740_cpg_register_clock(struct device_node *np, struct r8a7740_cpg *cpg,
|
||||
mult, div);
|
||||
} else {
|
||||
return clk_register_divider_table(NULL, name, parent_name, 0,
|
||||
cpg->reg + reg, shift, 4, 0,
|
||||
base + reg, shift, 4, 0,
|
||||
table, &cpg->lock);
|
||||
}
|
||||
}
|
||||
@@ -145,6 +144,7 @@ r8a7740_cpg_register_clock(struct device_node *np, struct r8a7740_cpg *cpg,
|
||||
static void __init r8a7740_cpg_clocks_init(struct device_node *np)
|
||||
{
|
||||
struct r8a7740_cpg *cpg;
|
||||
void __iomem *base;
|
||||
struct clk **clks;
|
||||
unsigned int i;
|
||||
int num_clks;
|
||||
@@ -172,8 +172,8 @@ static void __init r8a7740_cpg_clocks_init(struct device_node *np)
|
||||
cpg->data.clks = clks;
|
||||
cpg->data.clk_num = num_clks;
|
||||
|
||||
cpg->reg = of_iomap(np, 0);
|
||||
if (WARN_ON(cpg->reg == NULL))
|
||||
base = of_iomap(np, 0);
|
||||
if (WARN_ON(base == NULL))
|
||||
return;
|
||||
|
||||
for (i = 0; i < num_clks; ++i) {
|
||||
@@ -183,7 +183,7 @@ static void __init r8a7740_cpg_clocks_init(struct device_node *np)
|
||||
of_property_read_string_index(np, "clock-output-names", i,
|
||||
&name);
|
||||
|
||||
clk = r8a7740_cpg_register_clock(np, cpg, name);
|
||||
clk = r8a7740_cpg_register_clock(np, cpg, base, name);
|
||||
if (IS_ERR(clk))
|
||||
pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
|
||||
__func__, np, name, PTR_ERR(clk));
|
||||
|
||||
@@ -11,12 +11,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/soc/renesas/rcar-rst.h>
|
||||
|
||||
struct r8a7778_cpg {
|
||||
struct clk_onecell_data data;
|
||||
spinlock_t lock;
|
||||
void __iomem *reg;
|
||||
};
|
||||
|
||||
/* PLL multipliers per bits 11, 12, and 18 of MODEMR */
|
||||
static const struct {
|
||||
unsigned long plla_mult;
|
||||
@@ -47,8 +41,7 @@ static u32 cpg_mode_rates __initdata;
|
||||
static u32 cpg_mode_divs __initdata;
|
||||
|
||||
static struct clk * __init
|
||||
r8a7778_cpg_register_clock(struct device_node *np, struct r8a7778_cpg *cpg,
|
||||
const char *name)
|
||||
r8a7778_cpg_register_clock(struct device_node *np, const char *name)
|
||||
{
|
||||
if (!strcmp(name, "plla")) {
|
||||
return clk_register_fixed_factor(NULL, "plla",
|
||||
@@ -77,7 +70,7 @@ r8a7778_cpg_register_clock(struct device_node *np, struct r8a7778_cpg *cpg,
|
||||
|
||||
static void __init r8a7778_cpg_clocks_init(struct device_node *np)
|
||||
{
|
||||
struct r8a7778_cpg *cpg;
|
||||
struct clk_onecell_data *data;
|
||||
struct clk **clks;
|
||||
unsigned int i;
|
||||
int num_clks;
|
||||
@@ -100,23 +93,17 @@ static void __init r8a7778_cpg_clocks_init(struct device_node *np)
|
||||
return;
|
||||
}
|
||||
|
||||
cpg = kzalloc(sizeof(*cpg), GFP_KERNEL);
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
clks = kcalloc(num_clks, sizeof(*clks), GFP_KERNEL);
|
||||
if (cpg == NULL || clks == NULL) {
|
||||
if (data == NULL || clks == NULL) {
|
||||
/* We're leaking memory on purpose, there's no point in cleaning
|
||||
* up as the system won't boot anyway.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_init(&cpg->lock);
|
||||
|
||||
cpg->data.clks = clks;
|
||||
cpg->data.clk_num = num_clks;
|
||||
|
||||
cpg->reg = of_iomap(np, 0);
|
||||
if (WARN_ON(cpg->reg == NULL))
|
||||
return;
|
||||
data->clks = clks;
|
||||
data->clk_num = num_clks;
|
||||
|
||||
for (i = 0; i < num_clks; ++i) {
|
||||
const char *name;
|
||||
@@ -125,15 +112,15 @@ static void __init r8a7778_cpg_clocks_init(struct device_node *np)
|
||||
of_property_read_string_index(np, "clock-output-names", i,
|
||||
&name);
|
||||
|
||||
clk = r8a7778_cpg_register_clock(np, cpg, name);
|
||||
clk = r8a7778_cpg_register_clock(np, name);
|
||||
if (IS_ERR(clk))
|
||||
pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
|
||||
__func__, np, name, PTR_ERR(clk));
|
||||
else
|
||||
cpg->data.clks[i] = clk;
|
||||
data->clks[i] = clk;
|
||||
}
|
||||
|
||||
of_clk_add_provider(np, of_clk_src_onecell_get, &cpg->data);
|
||||
of_clk_add_provider(np, of_clk_src_onecell_get, data);
|
||||
|
||||
cpg_mstp_add_clk_domain(np);
|
||||
}
|
||||
|
||||
@@ -21,12 +21,6 @@
|
||||
|
||||
#define CPG_NUM_CLOCKS (R8A7779_CLK_OUT + 1)
|
||||
|
||||
struct r8a7779_cpg {
|
||||
struct clk_onecell_data data;
|
||||
spinlock_t lock;
|
||||
void __iomem *reg;
|
||||
};
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* CPG Clock Data
|
||||
*/
|
||||
@@ -87,7 +81,7 @@ static const unsigned int cpg_plla_mult[4] __initconst = { 42, 48, 56, 64 };
|
||||
*/
|
||||
|
||||
static struct clk * __init
|
||||
r8a7779_cpg_register_clock(struct device_node *np, struct r8a7779_cpg *cpg,
|
||||
r8a7779_cpg_register_clock(struct device_node *np,
|
||||
const struct cpg_clk_config *config,
|
||||
unsigned int plla_mult, const char *name)
|
||||
{
|
||||
@@ -119,7 +113,7 @@ r8a7779_cpg_register_clock(struct device_node *np, struct r8a7779_cpg *cpg,
|
||||
static void __init r8a7779_cpg_clocks_init(struct device_node *np)
|
||||
{
|
||||
const struct cpg_clk_config *config;
|
||||
struct r8a7779_cpg *cpg;
|
||||
struct clk_onecell_data *data;
|
||||
struct clk **clks;
|
||||
unsigned int i, plla_mult;
|
||||
int num_clks;
|
||||
@@ -134,19 +128,17 @@ static void __init r8a7779_cpg_clocks_init(struct device_node *np)
|
||||
return;
|
||||
}
|
||||
|
||||
cpg = kzalloc(sizeof(*cpg), GFP_KERNEL);
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
clks = kcalloc(CPG_NUM_CLOCKS, sizeof(*clks), GFP_KERNEL);
|
||||
if (cpg == NULL || clks == NULL) {
|
||||
if (data == NULL || clks == NULL) {
|
||||
/* We're leaking memory on purpose, there's no point in cleaning
|
||||
* up as the system won't boot anyway.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_init(&cpg->lock);
|
||||
|
||||
cpg->data.clks = clks;
|
||||
cpg->data.clk_num = num_clks;
|
||||
data->clks = clks;
|
||||
data->clk_num = num_clks;
|
||||
|
||||
config = &cpg_clk_configs[CPG_CLK_CONFIG_INDEX(mode)];
|
||||
plla_mult = cpg_plla_mult[CPG_PLLA_MULT_INDEX(mode)];
|
||||
@@ -158,16 +150,15 @@ static void __init r8a7779_cpg_clocks_init(struct device_node *np)
|
||||
of_property_read_string_index(np, "clock-output-names", i,
|
||||
&name);
|
||||
|
||||
clk = r8a7779_cpg_register_clock(np, cpg, config,
|
||||
plla_mult, name);
|
||||
clk = r8a7779_cpg_register_clock(np, config, plla_mult, name);
|
||||
if (IS_ERR(clk))
|
||||
pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
|
||||
__func__, np, name, PTR_ERR(clk));
|
||||
else
|
||||
cpg->data.clks[i] = clk;
|
||||
data->clks[i] = clk;
|
||||
}
|
||||
|
||||
of_clk_add_provider(np, of_clk_src_onecell_get, &cpg->data);
|
||||
of_clk_add_provider(np, of_clk_src_onecell_get, data);
|
||||
|
||||
cpg_mstp_add_clk_domain(np);
|
||||
}
|
||||
|
||||
@@ -15,11 +15,6 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
struct rz_cpg {
|
||||
struct clk_onecell_data data;
|
||||
void __iomem *reg;
|
||||
};
|
||||
|
||||
#define CPG_FRQCR 0x10
|
||||
#define CPG_FRQCR2 0x14
|
||||
|
||||
@@ -49,7 +44,8 @@ static u16 __init rz_cpg_read_mode_pins(void)
|
||||
}
|
||||
|
||||
static struct clk * __init
|
||||
rz_cpg_register_clock(struct device_node *np, struct rz_cpg *cpg, const char *name)
|
||||
rz_cpg_register_clock(struct device_node *np, void __iomem *base,
|
||||
const char *name)
|
||||
{
|
||||
u32 val;
|
||||
unsigned mult;
|
||||
@@ -65,7 +61,7 @@ rz_cpg_register_clock(struct device_node *np, struct rz_cpg *cpg, const char *na
|
||||
}
|
||||
|
||||
/* If mapping regs failed, skip non-pll clocks. System will boot anyhow */
|
||||
if (!cpg->reg)
|
||||
if (!base)
|
||||
return ERR_PTR(-ENXIO);
|
||||
|
||||
/* FIXME:"i" and "g" are variable clocks with non-integer dividers (e.g. 2/3)
|
||||
@@ -73,9 +69,9 @@ rz_cpg_register_clock(struct device_node *np, struct rz_cpg *cpg, const char *na
|
||||
* let them run at fixed current speed and implement the details later.
|
||||
*/
|
||||
if (strcmp(name, "i") == 0)
|
||||
val = (readl(cpg->reg + CPG_FRQCR) >> 8) & 3;
|
||||
val = (readl(base + CPG_FRQCR) >> 8) & 3;
|
||||
else if (strcmp(name, "g") == 0)
|
||||
val = readl(cpg->reg + CPG_FRQCR2) & 3;
|
||||
val = readl(base + CPG_FRQCR2) & 3;
|
||||
else
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@@ -85,8 +81,9 @@ rz_cpg_register_clock(struct device_node *np, struct rz_cpg *cpg, const char *na
|
||||
|
||||
static void __init rz_cpg_clocks_init(struct device_node *np)
|
||||
{
|
||||
struct rz_cpg *cpg;
|
||||
struct clk_onecell_data *data;
|
||||
struct clk **clks;
|
||||
void __iomem *base;
|
||||
unsigned i;
|
||||
int num_clks;
|
||||
|
||||
@@ -94,14 +91,14 @@ static void __init rz_cpg_clocks_init(struct device_node *np)
|
||||
if (WARN(num_clks <= 0, "can't count CPG clocks\n"))
|
||||
return;
|
||||
|
||||
cpg = kzalloc(sizeof(*cpg), GFP_KERNEL);
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
clks = kcalloc(num_clks, sizeof(*clks), GFP_KERNEL);
|
||||
BUG_ON(!cpg || !clks);
|
||||
BUG_ON(!data || !clks);
|
||||
|
||||
cpg->data.clks = clks;
|
||||
cpg->data.clk_num = num_clks;
|
||||
data->clks = clks;
|
||||
data->clk_num = num_clks;
|
||||
|
||||
cpg->reg = of_iomap(np, 0);
|
||||
base = of_iomap(np, 0);
|
||||
|
||||
for (i = 0; i < num_clks; ++i) {
|
||||
const char *name;
|
||||
@@ -109,15 +106,15 @@ static void __init rz_cpg_clocks_init(struct device_node *np)
|
||||
|
||||
of_property_read_string_index(np, "clock-output-names", i, &name);
|
||||
|
||||
clk = rz_cpg_register_clock(np, cpg, name);
|
||||
clk = rz_cpg_register_clock(np, base, name);
|
||||
if (IS_ERR(clk))
|
||||
pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
|
||||
__func__, np, name, PTR_ERR(clk));
|
||||
else
|
||||
cpg->data.clks[i] = clk;
|
||||
data->clks[i] = clk;
|
||||
}
|
||||
|
||||
of_clk_add_provider(np, of_clk_src_onecell_get, &cpg->data);
|
||||
of_clk_add_provider(np, of_clk_src_onecell_get, data);
|
||||
|
||||
cpg_mstp_add_clk_domain(np);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
struct sh73a0_cpg {
|
||||
struct clk_onecell_data data;
|
||||
spinlock_t lock;
|
||||
void __iomem *reg;
|
||||
};
|
||||
|
||||
#define CPG_FRQCRA 0x00
|
||||
@@ -73,7 +72,7 @@ static const struct clk_div_table z_div_table[] = {
|
||||
|
||||
static struct clk * __init
|
||||
sh73a0_cpg_register_clock(struct device_node *np, struct sh73a0_cpg *cpg,
|
||||
const char *name)
|
||||
void __iomem *base, const char *name)
|
||||
{
|
||||
const struct clk_div_table *table = NULL;
|
||||
unsigned int shift, reg, width;
|
||||
@@ -83,12 +82,12 @@ sh73a0_cpg_register_clock(struct device_node *np, struct sh73a0_cpg *cpg,
|
||||
|
||||
if (!strcmp(name, "main")) {
|
||||
/* extal1, extal1_div2, extal2, extal2_div2 */
|
||||
u32 parent_idx = (readl(cpg->reg + CPG_CKSCR) >> 28) & 3;
|
||||
u32 parent_idx = (readl(base + CPG_CKSCR) >> 28) & 3;
|
||||
|
||||
parent_name = of_clk_get_parent_name(np, parent_idx >> 1);
|
||||
div = (parent_idx & 1) + 1;
|
||||
} else if (!strncmp(name, "pll", 3)) {
|
||||
void __iomem *enable_reg = cpg->reg;
|
||||
void __iomem *enable_reg = base;
|
||||
u32 enable_bit = name[3] - '0';
|
||||
|
||||
parent_name = "main";
|
||||
@@ -108,7 +107,7 @@ sh73a0_cpg_register_clock(struct device_node *np, struct sh73a0_cpg *cpg,
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
if (readl(cpg->reg + CPG_PLLECR) & BIT(enable_bit)) {
|
||||
if (readl(base + CPG_PLLECR) & BIT(enable_bit)) {
|
||||
mult = ((readl(enable_reg) >> 24) & 0x3f) + 1;
|
||||
/* handle CFG bit for PLL1 and PLL2 */
|
||||
if (enable_bit == 1 || enable_bit == 2)
|
||||
@@ -117,7 +116,7 @@ sh73a0_cpg_register_clock(struct device_node *np, struct sh73a0_cpg *cpg,
|
||||
}
|
||||
} else if (!strcmp(name, "dsi0phy") || !strcmp(name, "dsi1phy")) {
|
||||
u32 phy_no = name[3] - '0';
|
||||
void __iomem *dsi_reg = cpg->reg +
|
||||
void __iomem *dsi_reg = base +
|
||||
(phy_no ? CPG_DSI1PHYCR : CPG_DSI0PHYCR);
|
||||
|
||||
parent_name = phy_no ? "dsi1pck" : "dsi0pck";
|
||||
@@ -154,7 +153,7 @@ sh73a0_cpg_register_clock(struct device_node *np, struct sh73a0_cpg *cpg,
|
||||
mult, div);
|
||||
} else {
|
||||
return clk_register_divider_table(NULL, name, parent_name, 0,
|
||||
cpg->reg + reg, shift, width, 0,
|
||||
base + reg, shift, width, 0,
|
||||
table, &cpg->lock);
|
||||
}
|
||||
}
|
||||
@@ -162,6 +161,7 @@ sh73a0_cpg_register_clock(struct device_node *np, struct sh73a0_cpg *cpg,
|
||||
static void __init sh73a0_cpg_clocks_init(struct device_node *np)
|
||||
{
|
||||
struct sh73a0_cpg *cpg;
|
||||
void __iomem *base;
|
||||
struct clk **clks;
|
||||
unsigned int i;
|
||||
int num_clks;
|
||||
@@ -186,14 +186,14 @@ static void __init sh73a0_cpg_clocks_init(struct device_node *np)
|
||||
cpg->data.clks = clks;
|
||||
cpg->data.clk_num = num_clks;
|
||||
|
||||
cpg->reg = of_iomap(np, 0);
|
||||
if (WARN_ON(cpg->reg == NULL))
|
||||
base = of_iomap(np, 0);
|
||||
if (WARN_ON(base == NULL))
|
||||
return;
|
||||
|
||||
/* Set SDHI clocks to a known state */
|
||||
writel(0x108, cpg->reg + CPG_SD0CKCR);
|
||||
writel(0x108, cpg->reg + CPG_SD1CKCR);
|
||||
writel(0x108, cpg->reg + CPG_SD2CKCR);
|
||||
writel(0x108, base + CPG_SD0CKCR);
|
||||
writel(0x108, base + CPG_SD1CKCR);
|
||||
writel(0x108, base + CPG_SD2CKCR);
|
||||
|
||||
for (i = 0; i < num_clks; ++i) {
|
||||
const char *name;
|
||||
@@ -202,7 +202,7 @@ static void __init sh73a0_cpg_clocks_init(struct device_node *np)
|
||||
of_property_read_string_index(np, "clock-output-names", i,
|
||||
&name);
|
||||
|
||||
clk = sh73a0_cpg_register_clock(np, cpg, name);
|
||||
clk = sh73a0_cpg_register_clock(np, cpg, base, name);
|
||||
if (IS_ERR(clk))
|
||||
pr_err("%s: failed to register %pOFn %s clock (%ld)\n",
|
||||
__func__, np, name, PTR_ERR(clk));
|
||||
|
||||
@@ -77,6 +77,8 @@ static const struct cpg_core_clk r8a779f0_core_clks[] __initconst = {
|
||||
DEF_BASE(".rpcsrc", CLK_RPCSRC, CLK_TYPE_GEN4_RPCSRC, CLK_PLL5),
|
||||
|
||||
/* Core Clock Outputs */
|
||||
DEF_GEN4_Z("z0", R8A779F0_CLK_Z0, CLK_TYPE_GEN4_Z, CLK_PLL2, 2, 0),
|
||||
DEF_GEN4_Z("z1", R8A779F0_CLK_Z1, CLK_TYPE_GEN4_Z, CLK_PLL2, 2, 8),
|
||||
DEF_FIXED("s0d2", R8A779F0_CLK_S0D2, CLK_S0, 2, 1),
|
||||
DEF_FIXED("s0d3", R8A779F0_CLK_S0D3, CLK_S0, 3, 1),
|
||||
DEF_FIXED("s0d4", R8A779F0_CLK_S0D4, CLK_S0, 4, 1),
|
||||
@@ -118,20 +120,28 @@ static const struct cpg_core_clk r8a779f0_core_clks[] __initconst = {
|
||||
};
|
||||
|
||||
static const struct mssr_mod_clk r8a779f0_mod_clks[] __initconst = {
|
||||
DEF_MOD("hscif0", 514, R8A779F0_CLK_S0D3),
|
||||
DEF_MOD("hscif1", 515, R8A779F0_CLK_S0D3),
|
||||
DEF_MOD("hscif2", 516, R8A779F0_CLK_S0D3),
|
||||
DEF_MOD("hscif3", 517, R8A779F0_CLK_S0D3),
|
||||
DEF_MOD("i2c0", 518, R8A779F0_CLK_S0D6_PER),
|
||||
DEF_MOD("i2c1", 519, R8A779F0_CLK_S0D6_PER),
|
||||
DEF_MOD("i2c2", 520, R8A779F0_CLK_S0D6_PER),
|
||||
DEF_MOD("i2c3", 521, R8A779F0_CLK_S0D6_PER),
|
||||
DEF_MOD("i2c4", 522, R8A779F0_CLK_S0D6_PER),
|
||||
DEF_MOD("i2c5", 523, R8A779F0_CLK_S0D6_PER),
|
||||
DEF_MOD("pcie0", 624, R8A779F0_CLK_S0D2),
|
||||
DEF_MOD("pcie1", 625, R8A779F0_CLK_S0D2),
|
||||
DEF_MOD("scif0", 702, R8A779F0_CLK_S0D12_PER),
|
||||
DEF_MOD("scif1", 703, R8A779F0_CLK_S0D12_PER),
|
||||
DEF_MOD("scif3", 704, R8A779F0_CLK_S0D12_PER),
|
||||
DEF_MOD("scif4", 705, R8A779F0_CLK_S0D12_PER),
|
||||
DEF_MOD("sdhi0", 706, R8A779F0_CLK_SD0),
|
||||
DEF_MOD("sys-dmac0", 709, R8A779F0_CLK_S0D3_PER),
|
||||
DEF_MOD("sys-dmac1", 710, R8A779F0_CLK_S0D3_PER),
|
||||
DEF_MOD("wdt", 907, R8A779F0_CLK_R),
|
||||
DEF_MOD("pfc0", 915, R8A779F0_CLK_CL16M),
|
||||
DEF_MOD("tsc", 919, R8A779F0_CLK_CL16M),
|
||||
DEF_MOD("ufs", 1514, R8A779F0_CLK_S0D4_HSC),
|
||||
};
|
||||
|
||||
|
||||
@@ -51,11 +51,9 @@ struct r9a06g032_clkdesc {
|
||||
struct {
|
||||
u16 div, mul;
|
||||
};
|
||||
unsigned int factor;
|
||||
unsigned int frequency;
|
||||
/* for dual gate */
|
||||
struct {
|
||||
uint16_t group : 1, index: 3;
|
||||
uint16_t group : 1;
|
||||
u16 sel, g1, r1, g2, r2;
|
||||
} dual;
|
||||
};
|
||||
@@ -85,10 +83,10 @@ struct r9a06g032_clkdesc {
|
||||
.source = 1 + R9A06G032_##_src, .name = _n, \
|
||||
.reg = _reg, .div_min = _min, .div_max = _max, \
|
||||
.div_table = { __VA_ARGS__ } }
|
||||
#define D_UGATE(_idx, _n, _src, _g, _gi, _g1, _r1, _g2, _r2) \
|
||||
#define D_UGATE(_idx, _n, _src, _g, _g1, _r1, _g2, _r2) \
|
||||
{ .type = K_DUALGATE, .index = R9A06G032_##_idx, \
|
||||
.source = 1 + R9A06G032_##_src, .name = _n, \
|
||||
.dual = { .group = _g, .index = _gi, \
|
||||
.dual = { .group = _g, \
|
||||
.g1 = _g1, .r1 = _r1, .g2 = _g2, .r2 = _r2 }, }
|
||||
|
||||
enum { K_GATE = 0, K_FFC, K_DIV, K_BITSEL, K_DUALGATE };
|
||||
@@ -290,8 +288,8 @@ static const struct r9a06g032_clkdesc r9a06g032_clocks[] = {
|
||||
.name = "uart_group_012",
|
||||
.type = K_BITSEL,
|
||||
.source = 1 + R9A06G032_DIV_UART,
|
||||
/* R9A06G032_SYSCTRL_REG_PWRCTRL_PG1_PR2 */
|
||||
.dual.sel = ((0xec / 4) << 5) | 24,
|
||||
/* R9A06G032_SYSCTRL_REG_PWRCTRL_PG0_0 */
|
||||
.dual.sel = ((0x34 / 4) << 5) | 30,
|
||||
.dual.group = 0,
|
||||
},
|
||||
{
|
||||
@@ -299,18 +297,18 @@ static const struct r9a06g032_clkdesc r9a06g032_clocks[] = {
|
||||
.name = "uart_group_34567",
|
||||
.type = K_BITSEL,
|
||||
.source = 1 + R9A06G032_DIV_P2_PG,
|
||||
/* R9A06G032_SYSCTRL_REG_PWRCTRL_PG0_0 */
|
||||
.dual.sel = ((0x34 / 4) << 5) | 30,
|
||||
/* R9A06G032_SYSCTRL_REG_PWRCTRL_PG1_PR2 */
|
||||
.dual.sel = ((0xec / 4) << 5) | 24,
|
||||
.dual.group = 1,
|
||||
},
|
||||
D_UGATE(CLK_UART0, "clk_uart0", UART_GROUP_012, 0, 0, 0x1b2, 0x1b3, 0x1b4, 0x1b5),
|
||||
D_UGATE(CLK_UART1, "clk_uart1", UART_GROUP_012, 0, 1, 0x1b6, 0x1b7, 0x1b8, 0x1b9),
|
||||
D_UGATE(CLK_UART2, "clk_uart2", UART_GROUP_012, 0, 2, 0x1ba, 0x1bb, 0x1bc, 0x1bd),
|
||||
D_UGATE(CLK_UART3, "clk_uart3", UART_GROUP_34567, 1, 0, 0x760, 0x761, 0x762, 0x763),
|
||||
D_UGATE(CLK_UART4, "clk_uart4", UART_GROUP_34567, 1, 1, 0x764, 0x765, 0x766, 0x767),
|
||||
D_UGATE(CLK_UART5, "clk_uart5", UART_GROUP_34567, 1, 2, 0x768, 0x769, 0x76a, 0x76b),
|
||||
D_UGATE(CLK_UART6, "clk_uart6", UART_GROUP_34567, 1, 3, 0x76c, 0x76d, 0x76e, 0x76f),
|
||||
D_UGATE(CLK_UART7, "clk_uart7", UART_GROUP_34567, 1, 4, 0x770, 0x771, 0x772, 0x773),
|
||||
D_UGATE(CLK_UART0, "clk_uart0", UART_GROUP_012, 0, 0x1b2, 0x1b3, 0x1b4, 0x1b5),
|
||||
D_UGATE(CLK_UART1, "clk_uart1", UART_GROUP_012, 0, 0x1b6, 0x1b7, 0x1b8, 0x1b9),
|
||||
D_UGATE(CLK_UART2, "clk_uart2", UART_GROUP_012, 0, 0x1ba, 0x1bb, 0x1bc, 0x1bd),
|
||||
D_UGATE(CLK_UART3, "clk_uart3", UART_GROUP_34567, 1, 0x760, 0x761, 0x762, 0x763),
|
||||
D_UGATE(CLK_UART4, "clk_uart4", UART_GROUP_34567, 1, 0x764, 0x765, 0x766, 0x767),
|
||||
D_UGATE(CLK_UART5, "clk_uart5", UART_GROUP_34567, 1, 0x768, 0x769, 0x76a, 0x76b),
|
||||
D_UGATE(CLK_UART6, "clk_uart6", UART_GROUP_34567, 1, 0x76c, 0x76d, 0x76e, 0x76f),
|
||||
D_UGATE(CLK_UART7, "clk_uart7", UART_GROUP_34567, 1, 0x770, 0x771, 0x772, 0x773),
|
||||
};
|
||||
|
||||
struct r9a06g032_priv {
|
||||
|
||||
@@ -182,7 +182,7 @@ static const struct {
|
||||
};
|
||||
|
||||
static const struct {
|
||||
struct rzg2l_mod_clk common[71];
|
||||
struct rzg2l_mod_clk common[76];
|
||||
#ifdef CONFIG_CLK_R9A07G054
|
||||
struct rzg2l_mod_clk drp[0];
|
||||
#endif
|
||||
@@ -204,6 +204,16 @@ static const struct {
|
||||
0x534, 1),
|
||||
DEF_MOD("ostm2_pclk", R9A07G044_OSTM2_PCLK, R9A07G044_CLK_P0,
|
||||
0x534, 2),
|
||||
DEF_MOD("gpt_pclk", R9A07G044_GPT_PCLK, R9A07G044_CLK_P0,
|
||||
0x540, 0),
|
||||
DEF_MOD("poeg_a_clkp", R9A07G044_POEG_A_CLKP, R9A07G044_CLK_P0,
|
||||
0x544, 0),
|
||||
DEF_MOD("poeg_b_clkp", R9A07G044_POEG_B_CLKP, R9A07G044_CLK_P0,
|
||||
0x544, 1),
|
||||
DEF_MOD("poeg_c_clkp", R9A07G044_POEG_C_CLKP, R9A07G044_CLK_P0,
|
||||
0x544, 2),
|
||||
DEF_MOD("poeg_d_clkp", R9A07G044_POEG_D_CLKP, R9A07G044_CLK_P0,
|
||||
0x544, 3),
|
||||
DEF_MOD("wdt0_pclk", R9A07G044_WDT0_PCLK, R9A07G044_CLK_P0,
|
||||
0x548, 0),
|
||||
DEF_MOD("wdt0_clk", R9A07G044_WDT0_CLK, R9A07G044_OSCCLK,
|
||||
@@ -346,6 +356,11 @@ static struct rzg2l_reset r9a07g044_resets[] = {
|
||||
DEF_RST(R9A07G044_OSTM0_PRESETZ, 0x834, 0),
|
||||
DEF_RST(R9A07G044_OSTM1_PRESETZ, 0x834, 1),
|
||||
DEF_RST(R9A07G044_OSTM2_PRESETZ, 0x834, 2),
|
||||
DEF_RST(R9A07G044_GPT_RST_C, 0x840, 0),
|
||||
DEF_RST(R9A07G044_POEG_A_RST, 0x844, 0),
|
||||
DEF_RST(R9A07G044_POEG_B_RST, 0x844, 1),
|
||||
DEF_RST(R9A07G044_POEG_C_RST, 0x844, 2),
|
||||
DEF_RST(R9A07G044_POEG_D_RST, 0x844, 3),
|
||||
DEF_RST(R9A07G044_WDT0_PRESETN, 0x848, 0),
|
||||
DEF_RST(R9A07G044_WDT1_PRESETN, 0x848, 1),
|
||||
DEF_RST(R9A07G044_WDT2_PRESETN, 0x848, 2),
|
||||
|
||||
@@ -126,19 +126,24 @@ static const struct cpg_core_clk r9a09g011_core_clks[] __initconst = {
|
||||
};
|
||||
|
||||
static const struct rzg2l_mod_clk r9a09g011_mod_clks[] __initconst = {
|
||||
DEF_MOD("pfc", R9A09G011_PFC_PCLK, CLK_MAIN, 0x400, 2),
|
||||
DEF_MOD("gic", R9A09G011_GIC_CLK, CLK_SEL_B_D2, 0x400, 5),
|
||||
DEF_COUPLED("eth_axi", R9A09G011_ETH0_CLK_AXI, CLK_PLL2_200, 0x40c, 8),
|
||||
DEF_COUPLED("eth_chi", R9A09G011_ETH0_CLK_CHI, CLK_PLL2_100, 0x40c, 8),
|
||||
DEF_MOD("eth_clk_gptp", R9A09G011_ETH0_GPTP_EXT, CLK_PLL2_100, 0x40c, 9),
|
||||
DEF_MOD("syc_cnt_clk", R9A09G011_SYC_CNT_CLK, CLK_MAIN_24, 0x41c, 12),
|
||||
DEF_MOD("wdt0_pclk", R9A09G011_WDT0_PCLK, CLK_SEL_E, 0x428, 12),
|
||||
DEF_MOD("wdt0_clk", R9A09G011_WDT0_CLK, CLK_MAIN, 0x428, 13),
|
||||
DEF_MOD("urt_pclk", R9A09G011_URT_PCLK, CLK_SEL_E, 0x438, 4),
|
||||
DEF_MOD("urt0_clk", R9A09G011_URT0_CLK, CLK_SEL_W0, 0x438, 5),
|
||||
DEF_MOD("ca53", R9A09G011_CA53_CLK, CLK_DIV_A, 0x448, 0),
|
||||
};
|
||||
|
||||
static const struct rzg2l_reset r9a09g011_resets[] = {
|
||||
DEF_RST(R9A09G011_PFC_PRESETN, 0x600, 2),
|
||||
DEF_RST_MON(R9A09G011_ETH0_RST_HW_N, 0x608, 11, 11),
|
||||
DEF_RST_MON(R9A09G011_SYC_RST_N, 0x610, 9, 13),
|
||||
DEF_RST_MON(R9A09G011_WDT0_PRESETN, 0x614, 12, 19),
|
||||
};
|
||||
|
||||
static const unsigned int r9a09g011_crit_mod_clks[] __initconst = {
|
||||
|
||||
@@ -1180,7 +1180,7 @@ static int rzg2l_cpg_status(struct reset_controller_dev *rcdev,
|
||||
s8 monbit = info->resets[id].monbit;
|
||||
|
||||
if (info->has_clk_mon_regs) {
|
||||
return !(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
|
||||
return !!(readl(priv->base + CLK_MRST_R(reg)) & bitmask);
|
||||
} else if (monbit >= 0) {
|
||||
u32 monbitmask = BIT(monbit);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user