 static uint32_t wm8711lgefl_register_read(uint8_t reg_addr, uint16_t * p_reg_data, bool blocking) 
 { 
 nrf_drv_spi_xfer_desc_t spi_xfer; 
 uint32_t spi_flags; 
 uint32_t err_code; 
 uint8_t reg_addr_buf[1]; 
 uint8_t reg_data_buf[2]; 
  
 reg_addr_buf[0] = (reg_addr >> 1) & 0x7F; 
 spi_flags = NRF_DRV_SPI_FLAG_REPEATED_XFER; 
  
 spi_xfer.tx_length = sizeof(reg_addr_buf); 
 spi_xfer.p_tx_buffer = reg_addr_buf; 
 spi_xfer.rx_length = sizeof(reg_data_buf); 
 spi_xfer.p_rx_buffer = reg_data_buf; 
  
 memset(reg_data_buf, 0, sizeof(reg_data_buf)); 
  
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
  
 err_code = nrf_drv_spi_xfer(&m_spi_instance, &spi_xfer, spi_flags); 
  
 if (err_code != NRF_SUCCESS) 
 { 
 wm8711lgefl_mclk_disable(); 
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
 return err_code; 
 } 
  
 while (blocking && (m_spi_transfer_state == WM8711LGEFL_SPI_TRANSFER_PENDING)) 
 { 
 __WFE(); 
 } 
  
 // wm8711lgefl_mclk_disable(); 
  
 if (err_code != NRF_SUCCESS || m_spi_transfer_state != WM8711LGEFL_SPI_TRANSFER_SUCCESS) 
 { 
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
 return err_code; 
 } 
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
  
 *p_reg_data = (reg_data_buf[0] << 8 | reg_data_buf[1]); 
  
 return NRF_SUCCESS; 
 } 
    
 static uint32_t wm8711lgefl_register_write(uint8_t reg_addr, uint16_t reg_data, bool blocking) 
 { 
 nrf_drv_spi_xfer_desc_t spi_xfer; 
 uint32_t spi_flags; 
 uint32_t err_code; 
 uint8_t write_buf[3]; 
  
 write_buf[0] = (reg_addr >> 1) & 0x7F; 
 write_buf[1] = (reg_data >> 0) & 0xFF; 
 write_buf[2] = (reg_data) & 0x01; 
 spi_flags = 0; 
	
 spi_xfer.tx_length = sizeof(write_buf); 
 spi_xfer.p_tx_buffer = write_buf; 
  
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
  
 err_code = nrf_drv_spi_xfer(&m_spi_instance, &spi_xfer, spi_flags); 
  
 if (err_code != NRF_SUCCESS) 
 { 
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_PENDING; 
 return err_code; 
 } 
  
 while (blocking && (m_spi_transfer_state == WM8711LGEFL_SPI_TRANSFER_PENDING)) 
 { 
 __WFE(); 
 } 
  
 if (err_code != NRF_SUCCESS || m_spi_transfer_state != WM8711LGEFL_SPI_TRANSFER_SUCCESS) 
 { 
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
 return err_code; 
 } 
 m_spi_transfer_state = WM8711LGEFL_SPI_TRANSFER_IDLE; 
  
 return NRF_SUCCESS; 
 } 

static void wm8711lgefl_register_write_verify(uint8_t reg_addr, uint16_t reg_data, uint16_t ro_mask) 
 { 
 uint16_t read_value; 
  
 NRF_LOG_PRINTF("Writing 0x%04x to register 0x%04x\r\n", reg_data, reg_addr); 
  
 do 
 { 
 nrf_delay_us(50); 
 wm8711lgefl_register_write(reg_addr, reg_data, true); 
 nrf_delay_us(50); 
 wm8711lgefl_register_read(reg_addr, &read_value, true); 
 } while ((read_value & ro_mask) != reg_data); 
 } 