[U-Boot] [PATCH v3 06/11] clk: Add MPC83xx clock driver

Mario Six mario.six at gdsys.cc
Mon Jun 25 09:30:19 UTC 2018


Hi Simon,

On Fri, May 25, 2018 at 4:42 AM, Simon Glass <sjg at chromium.org> wrote:
> Hi Mario,
>
> On 24 May 2018 at 02:42, Mario Six <mario.six at gdsys.cc> wrote:
>> Add a clock driver for the MPC83xx architecture.
>>
>> Signed-off-by: Mario Six <mario.six at gdsys.cc>
>>
>> ---
>>
>> v2 -> v3:
>> * Added driver files to MAINTAINERS
>>
>> v1 -> v2:
>> * Added binding of sysreset driver
>>
>> ---
>>  MAINTAINERS                           |   3 +
>>  arch/powerpc/cpu/mpc83xx/speed.c      |   4 +
>>  arch/powerpc/include/asm/config.h     |   2 +-
>>  drivers/clk/Kconfig                   |   6 +
>>  drivers/clk/Makefile                  |   1 +
>>  drivers/clk/mpc83xx_clk.c             | 426 ++++++++++++++++++++++++++++++++++
>>  drivers/clk/mpc83xx_clk.h             | 121 ++++++++++
>>  include/dt-bindings/clk/mpc83xx-clk.h |  33 +++
>>  8 files changed, 595 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/clk/mpc83xx_clk.c
>>  create mode 100644 drivers/clk/mpc83xx_clk.h
>>  create mode 100644 include/dt-bindings/clk/mpc83xx-clk.h
>>
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index b43e4bc179d..ab0f6a0a5d0 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -471,6 +471,9 @@ T:  git git://git.denx.de/u-boot-mpc83xx.git
>>  F:     drivers/ram/mpc83xx_sdram.c
>>  F:     include/dt-bindings/memory/mpc83xx-sdram.h
>>  F:     drivers/sysreset/sysreset_mpc83xx.c
>> +F:     drivers/clk/mpc83xx_clk.c
>> +F:     drivers/clk/mpc83xx_clk.h
>> +F:     include/dt-bindings/clk/mpc83xx-clk.h
>>  F:     arch/powerpc/cpu/mpc83xx/
>>  F:     arch/powerpc/include/asm/arch-mpc83xx/
>>
>> diff --git a/arch/powerpc/cpu/mpc83xx/speed.c b/arch/powerpc/cpu/mpc83xx/speed.c
>> index f0945281cd2..39bc1c53406 100644
>> --- a/arch/powerpc/cpu/mpc83xx/speed.c
>> +++ b/arch/powerpc/cpu/mpc83xx/speed.c
>> @@ -6,6 +6,8 @@
>>   * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
>>   */
>>
>> +#ifndef CONFIG_CLK_MPC83XX
>> +
>>  #include <common.h>
>>  #include <mpc83xx.h>
>>  #include <command.h>
>> @@ -590,3 +592,5 @@ U_BOOT_CMD(clocks, 1, 0, do_clocks,
>>         "print clock configuration",
>>         "    clocks"
>>  );
>> +
>> +#endif
>> diff --git a/arch/powerpc/include/asm/config.h b/arch/powerpc/include/asm/config.h
>> index 284cfe21ab0..7bc8f5006ec 100644
>> --- a/arch/powerpc/include/asm/config.h
>> +++ b/arch/powerpc/include/asm/config.h
>> @@ -78,7 +78,7 @@
>>  /* All PPC boards must swap IDE bytes */
>>  #define CONFIG_IDE_SWAP_IO
>>
>> -#if defined(CONFIG_DM_SERIAL)
>> +#if defined(CONFIG_DM_SERIAL) && !defined(CONFIG_CLK_MPC83XX)
>>  /*
>>   * TODO: Convert this to a clock driver exists that can give us the UART
>>   * clock here.
>> diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
>> index edb4ca58ea5..e6ebff0a9d4 100644
>> --- a/drivers/clk/Kconfig
>> +++ b/drivers/clk/Kconfig
>> @@ -98,4 +98,10 @@ config ICS8N3QV01
>>           Crystal Oscillator). The output frequency can be programmed via an
>>           I2C interface.
>>
>> +config CLK_MPC83XX
>> +       bool "Enable MPC83xx clock driver"
>> +       depends on CLK
>> +       help
>> +         Support for the clock driver of the MPC83xx series of SoCs.
>> +
>>  endmenu
>> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
>> index 58139b13a89..58f497d3a15 100644
>> --- a/drivers/clk/Makefile
>> +++ b/drivers/clk/Makefile
>> @@ -16,6 +16,7 @@ obj-$(CONFIG_CLK_BCM6345) += clk_bcm6345.o
>>  obj-$(CONFIG_CLK_BOSTON) += clk_boston.o
>>  obj-$(CONFIG_CLK_EXYNOS) += exynos/
>>  obj-$(CONFIG_CLK_HSDK) += clk-hsdk-cgu.o
>> +obj-$(CONFIG_CLK_MPC83XX) += mpc83xx_clk.o
>>  obj-$(CONFIG_CLK_RENESAS) += renesas/
>>  obj-$(CONFIG_CLK_STM32F) += clk_stm32f.o
>>  obj-$(CONFIG_CLK_STM32MP1) += clk_stm32mp1.o
>> diff --git a/drivers/clk/mpc83xx_clk.c b/drivers/clk/mpc83xx_clk.c
>> new file mode 100644
>> index 00000000000..80be597332d
>> --- /dev/null
>> +++ b/drivers/clk/mpc83xx_clk.c
>> @@ -0,0 +1,426 @@
>> +// SPDX-License-Identifier: GPL-2.0+
>> +/*
>> + * (C) Copyright 2017
>> + * Mario Six, Guntermann & Drunck GmbH, mario.six at gdsys.cc
>> + */
>> +
>> +#include <common.h>
>> +#include <clk-uclass.h>
>> +#include <dm.h>
>> +#include <dm/lists.h>
>> +#include <dt-bindings/clk/mpc83xx-clk.h>
>> +
>> +#include "mpc83xx_clk.h"
>> +
>> +DECLARE_GLOBAL_DATA_PTR;
>> +
>> +static u32 *speed;
>> +
>> +struct mpc83xx_clk_priv {
>> +       u32 *speed;
>> +};
>> +
>> +static const char * const names[] = {
>> +       [MPC83XX_CLK_CORE] = "Core",
>> +       [MPC83XX_CLK_CSB] = "Coherent System Bus",
>> +       [MPC83XX_CLK_QE] = "QE",
>> +       [MPC83XX_CLK_BRG] = "BRG",
>> +       [MPC83XX_CLK_LBIU] = "Local Bus Controller",
>> +       [MPC83XX_CLK_LCLK] = "Local Bus",
>> +       [MPC83XX_CLK_MEM] = "DDR",
>> +       [MPC83XX_CLK_MEM_SEC] = "DDR Secondary",
>> +       [MPC83XX_CLK_ENC] = "SEC",
>> +       [MPC83XX_CLK_I2C1] = "I2C1",
>> +       [MPC83XX_CLK_I2C2] = "I2C2",
>> +       [MPC83XX_CLK_TDM] = "TDM",
>> +       [MPC83XX_CLK_SDHC] = "SDHC",
>> +       [MPC83XX_CLK_TSEC1] = "TSEC1",
>> +       [MPC83XX_CLK_TSEC2] = "TSEC2",
>> +       [MPC83XX_CLK_USBDR] = "USB DR",
>> +       [MPC83XX_CLK_USBMPH] = "USB MPH",
>> +       [MPC83XX_CLK_PCIEXP1] = "PCIEXP1",
>> +       [MPC83XX_CLK_PCIEXP2] = "PCIEXP2",
>> +       [MPC83XX_CLK_SATA] = "SATA",
>> +       [MPC83XX_CLK_DMAC] = "DMAC",
>> +       [MPC83XX_CLK_PCI] = "PCI",
>> +};
>> +
>> +struct clk_mode {
>> +       u8 low;
>> +       u8 high;
>> +       int type;
>> +};
>> +
>> +const struct clk_mode modes[] = {
>> +       [MPC83XX_CLK_CORE] = {0, 0, TYPE_SPECIAL},
>> +       [MPC83XX_CLK_CSB] = {0, 0, TYPE_SPECIAL},
>> +       [MPC83XX_CLK_QE] = {0, 0, TYPE_SPECIAL},
>> +       [MPC83XX_CLK_BRG] = {0, 0, TYPE_SPECIAL},
>> +       [MPC83XX_CLK_MEM] = {1, 1, TYPE_SPMR_DIRECT_MULTIPLY },
>> +       [MPC83XX_CLK_LBIU] = {0, 0, TYPE_SPMR_DIRECT_MULTIPLY },
>> +       [MPC83XX_CLK_LCLK] = {0, 0, TYPE_SPECIAL},
>> +       [MPC83XX_CLK_MEM_SEC] = {0, 0, TYPE_SPMR_DIRECT_MULTIPLY }, /* The same as LBIU */
>> +#ifndef CONFIG_MPC8313
>> +       [MPC83XX_CLK_TSEC1] = {0, 1, TYPE_SCCR_STANDARD },
>> +       [MPC83XX_CLK_TSEC2] = {2, 3, TYPE_SCCR_STANDARD },
>> +#else
>> +       [MPC83XX_CLK_TSEC1] = {0, 1, TYPE_SCCR_STANDARD }, /* FIXME: This has separate enable/disable bit! */
>> +       [MPC83XX_CLK_TSEC2] = {0, 1, TYPE_SCCR_STANDARD }, /* FIXME: This has separate enable/disable bit! */
>> +#endif
>
> Do you really need all these #ifdefs? It's really unfortunate to have
> a driver which requires build-time #ifdefs. You have the device tree
> which should be enough to determine what to do. What is the issue
> here?
>

The code was mostly copied from the old MPC83xx support, which uses ifdefs to
distinguish between the different types of MPC83xx SoCs, which all have
slightly different memory layout in regards to the clock registers.

It shouldn't be too hard to make the decision depend on the compatible string.
Will be done for v4.

> Regards,
> Simon

Best regards,
Mario


More information about the U-Boot mailing list