[U-Boot] [PATCH v3 00/11] clk: Port Linux common clock framework [CCF] to U-boot (tag: 5.0-rc3)

Lukasz Majewski lukma at denx.de
Thu Apr 25 10:29:42 UTC 2019


This patch series brings the files from Linux kernel to provide clocks support
as it is used on the Linux kernel with common clock framework [CCF] setup.

This series also fixes several problems with current clocks and provides
sandbox tests for functions addded to clk-uclass.c file.

Design decisions/issues:
=========================

- U-boot's DM for clk differs from Linux CCF. The most notably difference
is the lack of support for hierarchical clocks and "clock as a manager
driver" (single clock DTS node acts as a starting point for all other
clocks).

- The clk_get_rate() now caches the previously read data (no need for
recursive access.

- On purpose the "manager" clk driver (clk-imx6q.c) is not using large
table to store pointers to clocks - e.g. clk[IMX6QDL_CLK_USDHC2_SEL] = ....
Instead we use udevice's linked list for the same class (UCLASS_CLK).
The rationale - when porting the code as is from Linux, one would need
~1KiB of RAM to store it. This is way too much if we do plan to use this
driver in SPL.

- The "central" structure of this patch series is struct udevice and its
driver_data field contains the struct clk pointer (to the originally created
one).

- Up till now U-boot's driver model's CLK operates on udevice (main access to
  clock is by udevice ops)
  In the CCF the access to struct clk (comprising pointer to *dev) is
  possible via dev_get_driver_data()

  Storing back pointer (from udevice to struct clk) as driver_data is a
  convention for CCF.

- I could use *private_alloc_size to allocate driver's 'private"
  structures (dev->priv) for e.g. divider (struct clk_divider *divider)
  for IMX6Q clock, but this would change the original structure of the CCF code.

The question is if it would be better to use private_alloc_size (and
dev->private) or stay with driver_data.
The former requires some rewritting in CCF original code (to remove
(c)malloc, etc), but comply with u-boot DM. The latter allows re-using the
CCF code as is, but introduces some convention special for CCF (I'm not
sure thought if dev->priv is NOT another convention as well).

- I've added the clk_get_parent(), which reads parent's dev->driver_data to
  provide parent's struct clk pointer. This seems the easiest way to get
  child/parent relationship for struct clk in U-boot's udevice
  based clocks.

- For tests I had to "emulate" CCF code structure to test functionality of clk_get_parent_rate()
  and clk_get_by_id(). Those functions will not work properly with
  "standard" (i.e. non CCF) clock setup(with not set dev->driver_data to
  struct clk).

Repository:
https://github.com/lmajewski/u-boot-dfu/commits/CCF-v3


Changes in v3:
- New patch
- The rate information is now cached into struct clk field
- The clk_get_parent() is used to get pointer to the parent struct clk
- Replace -ENODEV with -ENOENT
- Use **clkp instead of **c
- New patch
- New patch

Lukasz Majewski (11):
  dm: Fix documentation entry as there is no UCLASS_CLOCK uclass
  cmd: Do not show frequency for clocks which .get_rate() return error
  clk: Remove clock ID check in .get_rate() of clk_fixed_*
  clk: Extend struct clk to provide information regarding clock rate
  clk: Provide struct clk for fixed rate clock (clk_fixed_rate.c)
  dm: clk: Define clk_get_parent() for clk operations
  dm: clk: Define clk_get_parent_rate() for clk operations
  dm: clk: Define clk_get_by_id() for clk operations
  clk: test: Provide unit test for clk_get_by_id() method
  clk: test: Provide unit test for clk_get_parent_rate() method
  clk: Port Linux common clock framework [CCF] for imx6q to U-boot (tag:
    5.0-rc3)

 arch/sandbox/include/asm/clk.h |  16 ++++
 cmd/clk.c                      |   5 +-
 drivers/clk/Kconfig            |  14 ++++
 drivers/clk/Makefile           |   2 +
 drivers/clk/clk-divider.c      | 148 ++++++++++++++++++++++++++++++++++
 drivers/clk/clk-fixed-factor.c |  87 ++++++++++++++++++++
 drivers/clk/clk-mux.c          | 164 +++++++++++++++++++++++++++++++++++++
 drivers/clk/clk-uclass.c       |  59 ++++++++++++++
 drivers/clk/clk.c              |  56 +++++++++++++
 drivers/clk/clk_fixed_factor.c |   3 -
 drivers/clk/clk_fixed_rate.c   |   8 +-
 drivers/clk/clk_sandbox_test.c |  49 +++++++++++
 drivers/clk/imx/Kconfig        |   9 +++
 drivers/clk/imx/Makefile       |   2 +
 drivers/clk/imx/clk-gate2.c    | 113 ++++++++++++++++++++++++++
 drivers/clk/imx/clk-imx6q.c    | 179 +++++++++++++++++++++++++++++++++++++++++
 drivers/clk/imx/clk-pfd.c      |  91 +++++++++++++++++++++
 drivers/clk/imx/clk-pllv3.c    |  83 +++++++++++++++++++
 drivers/clk/imx/clk.h          |  75 +++++++++++++++++
 include/clk.h                  |  33 +++++++-
 include/linux/clk-provider.h   |  94 ++++++++++++++++++++++
 test/dm/clk.c                  |   4 +-
 22 files changed, 1285 insertions(+), 9 deletions(-)
 create mode 100644 drivers/clk/clk-divider.c
 create mode 100644 drivers/clk/clk-fixed-factor.c
 create mode 100644 drivers/clk/clk-mux.c
 create mode 100644 drivers/clk/clk.c
 create mode 100644 drivers/clk/imx/clk-gate2.c
 create mode 100644 drivers/clk/imx/clk-imx6q.c
 create mode 100644 drivers/clk/imx/clk-pfd.c
 create mode 100644 drivers/clk/imx/clk-pllv3.c
 create mode 100644 drivers/clk/imx/clk.h
 create mode 100644 include/linux/clk-provider.h

-- 
2.11.0



More information about the U-Boot mailing list