We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 68058

2016.3 PetaLinux Zynq MP Linux Reset Controller Driver


The Zynq Multi-Processor reset-controller has the ability to reset lines connected to different blocks and peripherals (LPD & FPD blocks) in the SoC.



1) Kernel Configuration Options:

These depend on the Rest controller and ARCH_ZYNQMP. Enable the Rest Controller Support option in kernel configuration as an inbuilt module:

Select Device Drivers  --->  [*] Reset Controller Support....

2) Device-tree configurations:

Required Properties:

                               - compatible: "xlnx,zynqmp-reset"
                                - #reset-cells : Specifies the number of cells needed to encode reset line,should be 1.


reset-controller:reset-controller@0 {
        compatible = "xlnx,zynqmp-reset";
        #reset-cells = <1>;


 The below figure describes the reset-controller frame-work under Linux.

In the above example, the frame-work reset-controller driver is accessing the Reset controller hardware directly without issues. This example is a Zynq MPSoC configured with a non-secure FSBL.

If the Zynq MPSoC is configured with a secure FSBL, we cannot access the Reset-controller hardware for the Linux kernel space directly.
In that case we would require Arm Trusted Firmware (ATF) and PMU Components to access contents from the secure region to the non-secure region.

All of our reset-controller registers exist in the secure-zone. If we want to perform any real read/writes on the reset-controller registers, it is possible only through ATF and PMU components.


The Zynq MP Linux Reset-controller driver provides the following generic call-backs to reset the different blocks (i2c, uart, spi....) from the kernel:


int reset_control_reset(struct reset_control *rstc).

reset_control_reset - reset the controlled device.
@rstc : reset controller.

For example:



int reset_control_assert( sstruct reset_control  * rstc)

reset_colntrol_assert - assert the controlled device.
@rstc: reset controller


int reset_control_deassert( sstruct reset_control  * rstc)

reset_colntrol_deassert - deassert the controlled device.
@rstc: reset controller


int reset_control_status( sstruct reset_control  * rstc)

reset_colntrol_status - return a negative errno if not supported, a positive value if the reset line is asserted, or zero if the reset line is not asserted.

@rstc: reset controller


Apply the attached patch.

This patch has debug system entry so that the reset controller driver can be tested from the user space.

  1. echo 3 > /sys/class/reset-mgr/reset    ----> It will reset the IP by providing the High to low signal.
  2. echo 3 > /sys/class/reset-mgr/reset_assert  ---> It will assert the IP by providing the HIGH signal (the relevant bit is set to High until it receives the deassert signal).
  3. echo 3 > /sys/class/reset-mgr/reset_deassert  ---> It will deassert the IP by providing the LOW signal.


Associated Attachments

AR# 68058
Date Created 10/11/2016
Last Updated 10/27/2016
Status Active
Type General Article
  • Zynq UltraScale+ MPSoC
  • PetaLinux - 2016.3
Boards & Kits
  • Zynq UltraScale+ MPSoC Boards and Kits