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:
Stephen Boyd 2020-12-20 17:18:05 -08:00
10 changed files with 120 additions and 21 deletions

View File

@ -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>;
};

View File

@ -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,.*":

View File

@ -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,

View File

@ -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);

View File

@ -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:

View File

@ -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

View File

@ -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)
{ {

View File

@ -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 = {

View File

@ -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);

View File

@ -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 */