Merge branches 'clk-ingenic', 'clk-vc5', 'clk-cleanup', 'clk-canaan' and 'clk-marvell' into clk-next
- Bindings for Canaan K210 SoC clks * clk-ingenic: clk: ingenic: Fix divider calculation with div tables * clk-vc5: clk: vc5: Use "idt,voltage-microvolt" instead of "idt,voltage-microvolts" * clk-cleanup: clk: sunxi-ng: Make sure divider tables have sentinel clk: s2mps11: Fix a resource leak in error handling paths in the probe function clk: bcm: dvp: Add MODULE_DEVICE_TABLE() clk: bcm: dvp: drop a variable that is assigned to only * clk-canaan: dt-binding: clock: Document canaan,k210-clk bindings dt-bindings: Add Canaan vendor prefix * clk-marvell: clk: mvebu: a3700: fix the XTAL MODE pin to MPP1_9
This commit is contained in:
commit
abe7e32f1d
|
@ -0,0 +1,54 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/clock/canaan,k210-clk.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Canaan Kendryte K210 Clock Device Tree Bindings
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Damien Le Moal <damien.lemoal@wdc.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Canaan Kendryte K210 SoC clocks driver bindings. The clock
|
||||||
|
controller node must be defined as a child node of the K210
|
||||||
|
system controller node.
|
||||||
|
|
||||||
|
See also:
|
||||||
|
- dt-bindings/clock/k210-clk.h
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: canaan,k210-clk
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
description:
|
||||||
|
Phandle of the SoC 26MHz fixed-rate oscillator clock.
|
||||||
|
|
||||||
|
'#clock-cells':
|
||||||
|
const: 1
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- '#clock-cells'
|
||||||
|
- clocks
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
#include <dt-bindings/clock/k210-clk.h>
|
||||||
|
clocks {
|
||||||
|
in0: oscillator {
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
#clock-cells = <0>;
|
||||||
|
clock-frequency = <26000000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ... */
|
||||||
|
sysclk: clock-controller {
|
||||||
|
#clock-cells = <1>;
|
||||||
|
compatible = "canaan,k210-clk";
|
||||||
|
clocks = <&in0>;
|
||||||
|
};
|
|
@ -179,6 +179,8 @@ patternProperties:
|
||||||
description: CALAO Systems SAS
|
description: CALAO Systems SAS
|
||||||
"^calxeda,.*":
|
"^calxeda,.*":
|
||||||
description: Calxeda
|
description: Calxeda
|
||||||
|
"^canaan,.*":
|
||||||
|
description: Canaan, Inc.
|
||||||
"^caninos,.*":
|
"^caninos,.*":
|
||||||
description: Caninos Loucos Program
|
description: Caninos Loucos Program
|
||||||
"^capella,.*":
|
"^capella,.*":
|
||||||
|
|
|
@ -25,7 +25,6 @@ static const struct clk_parent_data clk_dvp_parent = {
|
||||||
static int clk_dvp_probe(struct platform_device *pdev)
|
static int clk_dvp_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct clk_hw_onecell_data *data;
|
struct clk_hw_onecell_data *data;
|
||||||
struct resource *res;
|
|
||||||
struct clk_dvp *dvp;
|
struct clk_dvp *dvp;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -42,7 +41,7 @@ static int clk_dvp_probe(struct platform_device *pdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
data = dvp->data;
|
data = dvp->data;
|
||||||
|
|
||||||
base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
if (IS_ERR(base))
|
if (IS_ERR(base))
|
||||||
return PTR_ERR(base);
|
return PTR_ERR(base);
|
||||||
|
|
||||||
|
@ -108,6 +107,7 @@ static const struct of_device_id clk_dvp_dt_ids[] = {
|
||||||
{ .compatible = "brcm,brcm2711-dvp", },
|
{ .compatible = "brcm,brcm2711-dvp", },
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, clk_dvp_dt_ids);
|
||||||
|
|
||||||
static struct platform_driver clk_dvp_driver = {
|
static struct platform_driver clk_dvp_driver = {
|
||||||
.probe = clk_dvp_probe,
|
.probe = clk_dvp_probe,
|
||||||
|
|
|
@ -195,6 +195,7 @@ static int s2mps11_clk_probe(struct platform_device *pdev)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
err_reg:
|
err_reg:
|
||||||
|
of_node_put(s2mps11_clks[0].clk_np);
|
||||||
while (--i >= 0)
|
while (--i >= 0)
|
||||||
clkdev_drop(s2mps11_clks[i].lookup);
|
clkdev_drop(s2mps11_clks[i].lookup);
|
||||||
|
|
||||||
|
|
|
@ -739,8 +739,8 @@ static int vc5_update_power(struct device_node *np_output,
|
||||||
{
|
{
|
||||||
u32 value;
|
u32 value;
|
||||||
|
|
||||||
if (!of_property_read_u32(np_output,
|
if (!of_property_read_u32(np_output, "idt,voltage-microvolt",
|
||||||
"idt,voltage-microvolts", &value)) {
|
&value)) {
|
||||||
clk_out->clk_output_cfg0_mask |= VC5_CLK_OUTPUT_CFG0_PWR_MASK;
|
clk_out->clk_output_cfg0_mask |= VC5_CLK_OUTPUT_CFG0_PWR_MASK;
|
||||||
switch (value) {
|
switch (value) {
|
||||||
case 1800000:
|
case 1800000:
|
||||||
|
|
|
@ -392,15 +392,21 @@ static unsigned int
|
||||||
ingenic_clk_calc_hw_div(const struct ingenic_cgu_clk_info *clk_info,
|
ingenic_clk_calc_hw_div(const struct ingenic_cgu_clk_info *clk_info,
|
||||||
unsigned int div)
|
unsigned int div)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i, best_i = 0, best = (unsigned int)-1;
|
||||||
|
|
||||||
for (i = 0; i < (1 << clk_info->div.bits)
|
for (i = 0; i < (1 << clk_info->div.bits)
|
||||||
&& clk_info->div.div_table[i]; i++) {
|
&& clk_info->div.div_table[i]; i++) {
|
||||||
if (clk_info->div.div_table[i] >= div)
|
if (clk_info->div.div_table[i] >= div &&
|
||||||
return i;
|
clk_info->div.div_table[i] < best) {
|
||||||
|
best = clk_info->div.div_table[i];
|
||||||
|
best_i = i;
|
||||||
|
|
||||||
|
if (div == best)
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return i - 1;
|
return best_i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
static unsigned
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/regmap.h>
|
#include <linux/regmap.h>
|
||||||
|
|
||||||
#define NB_GPIO1_LATCH 0xC
|
#define NB_GPIO1_LATCH 0x8
|
||||||
#define XTAL_MODE BIT(31)
|
#define XTAL_MODE BIT(9)
|
||||||
|
|
||||||
static int armada_3700_xtal_clock_probe(struct platform_device *pdev)
|
static int armada_3700_xtal_clock_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
|
|
|
@ -389,6 +389,7 @@ static struct clk_div_table ths_div_table[] = {
|
||||||
{ .val = 1, .div = 2 },
|
{ .val = 1, .div = 2 },
|
||||||
{ .val = 2, .div = 4 },
|
{ .val = 2, .div = 4 },
|
||||||
{ .val = 3, .div = 6 },
|
{ .val = 3, .div = 6 },
|
||||||
|
{ /* Sentinel */ },
|
||||||
};
|
};
|
||||||
static const char * const ths_parents[] = { "osc24M" };
|
static const char * const ths_parents[] = { "osc24M" };
|
||||||
static struct ccu_div ths_clk = {
|
static struct ccu_div ths_clk = {
|
||||||
|
|
|
@ -322,6 +322,7 @@ static struct clk_div_table ths_div_table[] = {
|
||||||
{ .val = 1, .div = 2 },
|
{ .val = 1, .div = 2 },
|
||||||
{ .val = 2, .div = 4 },
|
{ .val = 2, .div = 4 },
|
||||||
{ .val = 3, .div = 6 },
|
{ .val = 3, .div = 6 },
|
||||||
|
{ /* Sentinel */ },
|
||||||
};
|
};
|
||||||
static SUNXI_CCU_DIV_TABLE_WITH_GATE(ths_clk, "ths", "osc24M",
|
static SUNXI_CCU_DIV_TABLE_WITH_GATE(ths_clk, "ths", "osc24M",
|
||||||
0x074, 0, 2, ths_div_table, BIT(31), 0);
|
0x074, 0, 2, ths_div_table, BIT(31), 0);
|
||||||
|
|
|
@ -3,18 +3,52 @@
|
||||||
* Copyright (C) 2019-20 Sean Anderson <seanga2@gmail.com>
|
* Copyright (C) 2019-20 Sean Anderson <seanga2@gmail.com>
|
||||||
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
|
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
|
||||||
*/
|
*/
|
||||||
#ifndef K210_CLK_H
|
#ifndef CLOCK_K210_CLK_H
|
||||||
#define K210_CLK_H
|
#define CLOCK_K210_CLK_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Arbitrary identifiers for clocks.
|
* Kendryte K210 SoC clock identifiers (arbitrary values).
|
||||||
* The structure is: in0 -> pll0 -> aclk -> cpu
|
|
||||||
*
|
|
||||||
* Since we use the hardware defaults for now, set all these to the same clock.
|
|
||||||
*/
|
*/
|
||||||
#define K210_CLK_PLL0 0
|
#define K210_CLK_ACLK 0
|
||||||
#define K210_CLK_PLL1 0
|
#define K210_CLK_CPU 0
|
||||||
#define K210_CLK_ACLK 0
|
#define K210_CLK_SRAM0 1
|
||||||
#define K210_CLK_CPU 0
|
#define K210_CLK_SRAM1 2
|
||||||
|
#define K210_CLK_AI 3
|
||||||
|
#define K210_CLK_DMA 4
|
||||||
|
#define K210_CLK_FFT 5
|
||||||
|
#define K210_CLK_ROM 6
|
||||||
|
#define K210_CLK_DVP 7
|
||||||
|
#define K210_CLK_APB0 8
|
||||||
|
#define K210_CLK_APB1 9
|
||||||
|
#define K210_CLK_APB2 10
|
||||||
|
#define K210_CLK_I2S0 11
|
||||||
|
#define K210_CLK_I2S1 12
|
||||||
|
#define K210_CLK_I2S2 13
|
||||||
|
#define K210_CLK_I2S0_M 14
|
||||||
|
#define K210_CLK_I2S1_M 15
|
||||||
|
#define K210_CLK_I2S2_M 16
|
||||||
|
#define K210_CLK_WDT0 17
|
||||||
|
#define K210_CLK_WDT1 18
|
||||||
|
#define K210_CLK_SPI0 19
|
||||||
|
#define K210_CLK_SPI1 20
|
||||||
|
#define K210_CLK_SPI2 21
|
||||||
|
#define K210_CLK_I2C0 22
|
||||||
|
#define K210_CLK_I2C1 23
|
||||||
|
#define K210_CLK_I2C2 24
|
||||||
|
#define K210_CLK_SPI3 25
|
||||||
|
#define K210_CLK_TIMER0 26
|
||||||
|
#define K210_CLK_TIMER1 27
|
||||||
|
#define K210_CLK_TIMER2 28
|
||||||
|
#define K210_CLK_GPIO 29
|
||||||
|
#define K210_CLK_UART1 30
|
||||||
|
#define K210_CLK_UART2 31
|
||||||
|
#define K210_CLK_UART3 32
|
||||||
|
#define K210_CLK_FPIOA 33
|
||||||
|
#define K210_CLK_SHA 34
|
||||||
|
#define K210_CLK_AES 35
|
||||||
|
#define K210_CLK_OTP 36
|
||||||
|
#define K210_CLK_RTC 37
|
||||||
|
|
||||||
#endif /* K210_CLK_H */
|
#define K210_NUM_CLKS 38
|
||||||
|
|
||||||
|
#endif /* CLOCK_K210_CLK_H */
|
||||||
|
|
Loading…
Reference in New Issue