File indexing completed on 2025-05-11 08:23:39
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #include <stdint.h>
0041 #include <rtems.h>
0042 #include <dev/slcr/zynq-slcr.h>
0043 #include <dev/slcr/zynq-slcr-regs.h>
0044
0045 static uint32_t rst_mask = 0xf;
0046
0047 #if RTEMS_INTERRUPT_LOCK_NEEDS_OBJECT
0048 static rtems_interrupt_lock zynq_slcr_lock =
0049 RTEMS_INTERRUPT_LOCK_INITIALIZER( "zynq_slcr" );
0050 #endif
0051
0052 static inline void slcr_unlock( void )
0053 {
0054 zynq_slcr_write32( ZYNQ_SLCR_UNLOCK_OFF, ZYNQ_SLCR_UNLOCK_KEY );
0055 }
0056
0057 static inline void slcr_lock( void )
0058 {
0059 zynq_slcr_write32( ZYNQ_SLCR_LOCK_OFF, ZYNQ_SLCR_LOCK_KEY );
0060 }
0061
0062 void zynq_slcr_fpga_clk_rst_mask_set(
0063 uint32_t mask
0064 )
0065 {
0066 rtems_interrupt_lock_context lcontext;
0067
0068 rtems_interrupt_lock_acquire( &zynq_slcr_lock, &lcontext );
0069 rst_mask = 0xf & mask;
0070 rtems_interrupt_lock_release( &zynq_slcr_lock, &lcontext );
0071 }
0072
0073 void zynq_slcr_fpga_clk_rst(
0074 uint32_t val
0075 )
0076 {
0077 uint32_t rst_ctrl;
0078 rtems_interrupt_lock_context lcontext;
0079
0080 rtems_interrupt_lock_acquire( &zynq_slcr_lock, &lcontext );
0081 slcr_unlock();
0082 rst_ctrl = ZYNQ_SLCR_FPGA_RST_CTRL_FPGA_OUT_RST_GET(
0083 zynq_slcr_read32( ZYNQ_SLCR_FPGA_RST_CTRL_OFF )
0084 );
0085
0086 zynq_slcr_write32( ZYNQ_SLCR_FPGA_RST_CTRL_OFF,
0087 ZYNQ_SLCR_FPGA_RST_CTRL_FPGA_OUT_RST(
0088 ( ~rst_mask & rst_ctrl ) | ( rst_mask & val )
0089 )
0090 );
0091 slcr_lock();
0092 rtems_interrupt_lock_release( &zynq_slcr_lock, &lcontext );
0093 }
0094
0095 void zynq_slcr_level_shifter_enable(
0096 uint32_t val
0097 )
0098 {
0099 rtems_interrupt_lock_context lcontext;
0100
0101 rtems_interrupt_lock_acquire( &zynq_slcr_lock, &lcontext );
0102 slcr_unlock();
0103 zynq_slcr_write32( ZYNQ_SLCR_LVL_SHFTR_EN_OFF, val );
0104 slcr_lock();
0105 rtems_interrupt_lock_release( &zynq_slcr_lock, &lcontext );
0106 }