OP-TEE is a popular open-source reference implementation of a Trusted Execution Environment that relis on the Arm Trustzone technology. While working on the OP-TEE port for an ARM 32-bit system-on-chip, the Microchip SAMA5D2, we needed to add support for the complete clock tree of this SoC. OP-TEE did not have any generic clock support at all and we felt the need to add such a framework. Thanks to this framework, support the 10+ clocks of the Microchip SAMA5D2 was easily imported from Linux with less work than a complete rewrite of the clock tree. Using generic subsystems allows to lower the maintenance cost and easily add new clocks.
In this blog post, we will describe in more details this clock framework, and the contributions we are doing to the OP-TEE project.
The clock framework that we contributed to OP-TEE allows to register clocks and represent a full clock tree with parents. Device Tree support has been added to allows parsing the clocks and their relationships from Device Tree. It provides a consumer API that allows device drivers to query clocks from their Device Tree node, enable or disable them, and get or set the needed clock rates.
assigned-clock-rates Device Tree properties are also supported and will apply the clock parents and rates described in these properties. A fixed-clock driver matching the
"fixed-clock" compatible string has also been added since this one is often present in SoC Device Trees.
Peripheral drivers in OP-TEE can now use the functions provided by the clock framework to get clocks from the Device Tree using
clk_dt_get_by_name() and then enable/disable them at will with
clk_disable() . Rates can also be set and retrieved using
The pull request was made on OP-TEE github and contained the following commits, which have now been merged in the official upstream OP-TEE project:
- drivers: add type field to dt_driver struct
- drivers: clk: add generic clock framework
- drivers: clk: add devicetree support
- drivers: clk: add fixed-clock driver
- MAINTAINERS: add clock driver interface entry
With this clock framework in place, we are soon going to contribute support for the Microchip SAMA5D2, which will make use of the new clock framework. Some other platforms will also gain cleaner clock support thanks to this framework: for example, the existing STM32MP1 clock support is expected to be migrated to this clock framework.
In addition, based on this clock framework, SCMI (System Control and Management Interface) clock support has also been added. While OP-TEE already has support for exposing SCMI clocks to clients, the actual callbacks have to be implemented by platform-specific code. This additional support will allow exposing clocks registered within the clock framework to a SCMI client without any custom platform code. A Device Tree description will allow matching SCMI clock identifiers with clocks provided by clock drivers.
We have already submitted a pull request for this support, which is currently under review: Provide plat_scmi_clock_* using clock framework.