summaryrefslogblamecommitdiff
path: root/nuttx/arch/arm/src/tiva/tiva_adc.c
blob: 26f3b6890fa34846eb2aeca44e64c2dd27d8f229 (plain) (tree)















































                                                                                
                                                                        
                             

                                                                     









































                                                                              
                                                                              
 


                                                  
 




                                                                      
 


                                               
 


                                                                                
 





                                                                                   
 


                                                                                     
        


                                                                                            

      
 


                                 
 
 































                                                                              


                                                                              





                                                                              

                                              
 
                                                                              
 

                                        
 

                                    
 
                                                    
 




                                               
 
                                             

                                                                                           
                              
 
                                


                                                                       

                             
 
                                                                              
 


                                 



                                                                                  

   





                                    
 


                              
































                                                                              












                                                                           
                               
                   
 



                                                    
                                                            



                     
                                                     
                               
                                                              
                                                                                 
      








                                                                              
                                                                      

                                                              

                                                                  
      
 
                               

                                                                          


                                                                                             






                                                                              
                               
                                   



                                     






                                                                    
                                  


                                                                               


                                                                                  










                                                                                
                          

                                                                     
      


                                                                          
                                                                              
 
                       

                                            
                                 
                                              
        
                              
                                    
                                   
                                                        
          

                              
                                    
                                   
                                                        
          

                              
                                    
                                   
                                                        
          

                              
                                    
                                   
                                                        
          
        
      
 
                       

                                            
                                 
                                              
        
                              
                                    
                                   
                                                        
          

                              
                                    
                                   
                                                        
          

                              
                                    
                                   
                                                        
          

                              
                                    
                                   
                                                        
          
        
      








                                                                              

         
          



         






          

         

  
                       




                                  
                              
                                   

                              
                                   

                              
                                   

                              

                                   
      
 
                       




                                  
                              
                                   

                              
                                   

                              
                                   

                              

                                   
      
















                                                                              
 
                          
 








                                                                          
                                            
                



                                                      
                                                   




















                                                                              
                   
 
                                                                      



                                                                               

     

                                                              























                                                                              
 
                      

                                
 

                      
                




























                                                                              
 
                                  
 
                





                                                                       
                                         






















                                                                              

                      
 
                                      
 

              



                            

                            


                                                          

                                                   
           
                                                       





                                 

                          





                                    
                                   










                                                                       
           
                                                                      
           
 
              



                      
 
                                          
 


                      





                                                                             













































                                                                              


                                                                              
                               



















































                                                                              
                                     











                                                                              
                               


                                                                          
                      
                               
                                       




                                      
                                     














                                                                              
 

                                                        
                               


                                                 
                          
                                                           
     
                                                           
      

                
                                     


                                                  
                          
                                                           
     
                                                           
      


                


              


















                                                                              
 

                                    
                                     


                                                                               
                                                




                                                          
                                        


























                                                          


                                          

 










                                                                              
                               











                                                            
      


















                                                                              
                                                                   






























                                                                              


                                                         
































                                                                              
 


                                                                      
                               



































                                                                              

                                        
                                                                             





                                                                              
     


















                                                                               

                                                                          


                                                                              

                                                                                 
 
                                                                         
 
                                                  
 






                                                

     
      





















                                                                              
                               















































































                                                                                
                                              

























                                                                                
                     
 

                    
                                                                             


                                                                              
                                                                    



                                                  
                                                                         
























                                                                              
                                                  

                                                                         
                    
 

              
                                                                           



                                                 
                                                                           


                                                 
                               
                                                                              








                                                                       

                                                 
      


















                                                                              


                                                   
 




                                                                              
      

















                                                                              
 
                          












                                                                            
      


















                                                                              
                                                                      



























                                                                              
                                                                       




                                                                              
                                 


                                                        

                         
                       






                       
                                 



                          
                                                                   


                           
                              


                                
                                   
                                                       
          
                           
                                                                
 
                              
                        
                                
                    
                                   
                                                       
          
                           
                                                                
 
                              
                        
                                
                    
                                   
                                                       
          
                           
                                                                
 
                              
                        
                                
                    
                                   
                                                       
          
                           
                                                                








                                                           
                                                           
 
                       






                       
                                 



                          
                                                                   


                           
                              
                        
                                  
                    
                                   
                                                       
          
                           
                                                                
 
                              
                        
                                  
                    
                                   
                                                       

          
                           
                                                                
 
                              
                        
                                  
                    
                                   
                                                       
          
                           
                                                                
 
                              
                        
                                  
                    
                                   
                                                       
          
                           
                                                                








                                                           
                                                           


                  

                                                                             







                                                                            



                                              
         

                                                                     


                      
                     


                                       
                             


                                                    
                               
                             

                 
                                                                   




                                         
                                                                               




                        
                    







                                                        
                              
                                        
        

                                      
      
 
                    







                                                        
                              
                                        
        

                                      
      
 





                                                  
                                                 










                                                
                                    












                                                                              
                            
          
 
                     
 



                                               
                                                                             





                                                      
      











                                                                              
                            
                       
                                     
      









                                                                              
                               





























                                                                              
                                                                   











                                                                              
                       

                                    
                              
                                        


                                                         

                              
                                        


                                                         

                              
                                        


                                                         

                              
                                        


                                                         
        
 
                                                           
 
                       

                                    
                              
                                        


                                                         

                              
                                        


                                                         

                              
                                        


                                                         

                              
                                        


                                                         
        
 
                                                           


                                                                              
                               

                                             
                         
                   
                                
                                                           

              
                                                                   

             
                           
          
                                
                                                           

              
                                                                   

             
                           
          
                                
                                                           

              
                                                                   

             
                           
          
                                
                                                           

              
                                                                   

             
                           

          
  
 

                                             
                         
                   
                                
                                                           

              
                                                                   

             
                           
          
                                
                                                           

              
                                                                   

             
                           
          
                                
                                                           

              
                                                                   

             
                           
          
                                
                                                           

              
                                                                   

             
                           

          
  
                                     


                                                                           
                               

                                

                                                       








                                                               
                                            


                              
                          








                                                                    
     
                                                     
     
 
          
                                

                                                       




                                                       
                                            
                          


                                                                  
     

                                                              
     
 
          
                                

                                                       




                                                       
                                            
                          


                                                                  
     

                                                              
     
 
          
                                

                                                       




                                                       
                                            
                          


                                                                  
     

                                                              
     
 

                               
 

                                

                                                       




                                                       
                                            
                          


                                                                  
     

                                                              
     
 
          
                                

                                                       




                                                       
                                            
                          


                                                                  
     

                                                              
     
 
          
                                

                                                       




                                                       
                                            
                          


                                                                  
     

                                                              
     
 
          
                                

                                                       




                                                       
                                            
                          


                                                                  
     

                                                              
     
 


                                     


                                                                              
                       

                                           
                              
                      

                              
                      

                              
                      

                              
                      
        
 
      
 
                       

                                           
                              
                      

                              
                      

                              
                      

                              
                      
        
 
      
 
                                                                              
 

                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              

                                                    
             
                                    


                                             
                                       
             
                        
              


                                                                 
                                                                                                    
                                                       
                

                                                    
               
                                    


                                               
                                       
               
                        
                


                                                                 
                                                                                                      
                                                       
                  

                                                    
                 
                                    


                                                 
                                       
                 
                        
                  


                                                                 
                                                                                                        
                                                       
                    

                                                    
                   
                                    


                                                   
                                       
                   
                        
                    


                                                                 
                                                                                                          
                                                       
                      

                                                    
                     
                                    


                                                     
                                       
                     
                        
                      


                                                                 
                                                                                                            
                                                       
                        

                                                     
                       
                                    


                                                       
                                       
                       
                        
                        


                                                                 
                                                                                                              
                                                       
                          

                                                       
                         
                                    


                                                         
                                       
                         
                        
                          


                                                                 
                                                                                                                
                                                       
                            
                                                    







                                                          
 
                                    
 
                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              

                                                    
             
                                    


                                             
                                       
             
                        
              


                                                                 
                                                                                                    
                                                       
                

                                                    
               
                                    


                                               
                                       
               
                        
                


                                                                 
                                                                                                      
                                                       
                  

                                                    
                 
                                    


                                                 
                                       
                 
                        
                  


                                                                 
                                                                                                        
                                                       
                    
                                                    



                                                  
 
                                    
 
                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              

                                                    
             
                                    


                                             
                                       
             
                        
              


                                                                 
                                                                                                    
                                                       
                

                                                    
               
                                    


                                               
                                       
               
                        
                


                                                                 
                                                                                                      
                                                       
                  

                                                    
                 
                                    


                                                 
                                       
                 
                        
                  


                                                                 
                                                                                                        
                                                       
                    
                                                    



                                                  
 
                                    
 
                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              
                                                    
                                            
 

                                    
 

                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              

                                                    
             
                                    


                                             
                                       
             
                        
              


                                                                 
                                                                                                    
                                                       
                

                                                    
               
                                    


                                               
                                       
               
                        
                


                                                                 
                                                                                                      
                                                       
                  

                                                    
                 
                                    


                                                 
                                       
                 
                        
                  


                                                                 
                                                                                                        
                                                       
                    

                                                    
                   
                                    


                                                   
                                       
                   
                        
                    


                                                                 
                                                                                                          
                                                       
                      

                                                    
                     
                                    


                                                     
                                       
                     
                        
                      


                                                                 
                                                                                                            
                                                       
                        

                                                     
                       
                                    


                                                       
                                       
                       
                        
                        


                                                                 
                                                                                                              
                                                       
                          

                                                       
                         
                                    


                                                         
                                       
                         
                        
                          


                                                                 
                                                                                                                
                                                       
                            
                                                    







                                                          
 
                                    
 
                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              

                                                    
             
                                    


                                             
                                       
             
                        
              


                                                                 
                                                                                                    
                                                       
                

                                                    
               
                                    


                                               
                                       
               
                        
                


                                                                 
                                                                                                      
                                                       
                  

                                                    
                 
                                    


                                                 
                                       
                 
                        
                  


                                                                 
                                                                                                        
                                                       
                    
                                                    



                                                  
 
                                    
 
                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              

                                                    
             
                                    


                                             
                                       
             
                        
              


                                                                 
                                                                                                    
                                                       
                

                                                    
               
                                    


                                               
                                       
               
                        
                


                                                                 
                                                                                                      
                                                       
                  

                                                    
                 
                                    


                                                 
                                       
                 
                        
                  


                                                                 
                                                                                                        
                                                       
                    
                                                    



                                                  
 
                                    
 
                              


                                   

                                           
                                       
           
                        
            


                                                                 
                                                                                                  
                                                       
              
                                                    
                                            
 

                                    
 
                                                
/****************************************************************************
 * arch/arm/src/tiva/tiva_adc.c
 *
 *   Copyright (C) 2015 TRD2 Inc. All rights reserved.
 *   Author: Calvin Maguranis <calvin.maguranis@trd2inc.com>
 *
 * References:
 *
 *   TM4C123GH6PM Series Data Sheet
 *   TI Tivaware driverlib ADC sample code.
 *
 * The Tivaware sample code has a BSD compatible license that requires this
 * copyright notice:
 *
 * Copyright (c) 2005-2014 Texas Instruments Incorporated.  All rights reserved.
 * Software License Agreement
 *
 *   Redistribution and use in source and binary forms, with or without
 *   modification, are permitted provided that the following conditions
 *   are met:
 *
 *   Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 *   Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the
 *   distribution.
 *
 *   Neither the name of Texas Instruments Incorporated nor the names of
 *   its contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This is part of revision 2.1.0.12573 of the Tiva Peripheral Driver Library.
 *****************************************************************************/

/* Keep in mind that for every step there should be another entry in the
 * CONFIG_ADC_FIFOSIZE value.
 * e.g. if there are 12 steps in use; CONFIG_ADC_FIFOSIZE = 12+1 = 13
 *      if there are  3 steps in use; CONFIG_ADC_FIFOSIZE = 3+1 = 4
 */

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>

#include <sys/types.h>
#include <sys/ioctl.h>

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <semaphore.h>
#include <errno.h>
#include <debug.h>
#include <assert.h>

#include <arch/board/board.h>

#include <nuttx/arch.h>
#include <nuttx/wqueue.h>
#include <nuttx/analog/adc.h>

#include "up_internal.h"
#include "up_arch.h"

#include "chip.h"

#include "tiva_gpio.h"
#include "tiva_adc.h"
#include "chip/tiva_pinmap.h"
#include "chip/tiva_syscontrol.h"
#include "chip/tiva_adc.h"

#if defined (CONFIG_TIVA_ADC0) || defined (CONFIG_TIVA_ADC1)

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/* Configuration ************************************************************/

#ifndef CONFIG_TIVA_ADC_CLOCK
#  define CONFIG_TIVA_ADC_CLOCK TIVA_ADC_CLOCK_MIN
#endif

#ifdef CONFIG_TIVA_ADC_VREF
#  ifndef CONFIG_ARCH_CHIP_TM4C129
#    error Voltage reference selection only supported in TM4C129 parts
#  endif
#endif

#ifdef CONFIG_TIVA_ADC_ALT_CLK
#  warning CONFIG_TIVA_ADC_ALT_CLK unsupported.
#endif

/* Are we using interrupt-based triggering (opposed to SW triggering)? Then work
 * queues are required.
 */

#if (CONFIG_TIVA_ADC0_SSE0_TRIGGER > 0) || (CONFIG_TIVA_ADC0_SSE1_TRIGGER > 0) || \
    (CONFIG_TIVA_ADC0_SSE2_TRIGGER > 0) || (CONFIG_TIVA_ADC0_SSE3_TRIGGER > 0) || \
    (CONFIG_TIVA_ADC0_SSE0_TRIGGER > 0) || (CONFIG_TIVA_ADC0_SSE1_TRIGGER > 0) || \
    (CONFIG_TIVA_ADC0_SSE2_TRIGGER > 0) || (CONFIG_TIVA_ADC0_SSE3_TRIGGER > 0)
#  define TIVA_ADC_HAVE_INTERRUPTS 1
#endif

#ifdef TIVA_ADC_HAVE_INTERRUPTS
#  ifndef CONFIG_SCHED_WORKQUEUE
#    error Work queue support is required (CONFIG_SCHED_WORKQUEUE) for ADC interrupts
#  endif
#  ifndef CONFIG_SCHED_HPWORK
#    error High priority worker threads is required (CONFIG_SCHED_HPWORK) for ADC interrupts
#  endif
#endif


#ifndef CONFIG_DEBUG
#  undef CONFIG_TIVA_ADC_REGDEBUG
#endif


/* Misc utility defines *****************************************************/

#define TIVA_ADC_ENABLE  true
#define TIVA_ADC_DISABLE false

#define TIVA_ADC_RESOLUTION 4095

#ifdef CONFIG_ARCH_CHIP_TM4C123
#  define TIVA_ADC_CLOCK_MAX (16000000)
#  define TIVA_ADC_CLOCK_MIN (16000000)
#elif CONFIG_ARCH_CHIP_TM4C129
#  define TIVA_ADC_CLOCK_MAX (32000000)
#  define TIVA_ADC_CLOCK_MIN (16000000)
#else
#  error TIVA_ADC_CLOCK: unsupported architecture
#endif

/* Allow the same function call to be used for sample rate */

#ifdef CONFIG_ARCH_CHIP_TM4C123
#  define TIVA_ADC_SAMPLE_RATE_SLOWEST  (ADC_PC_SR_125K)
#  define TIVA_ADC_SAMPLE_RATE_SLOW     (ADC_PC_SR_250K)
#  define TIVA_ADC_SAMPLE_RATE_FAST     (ADC_PC_SR_500K)
#  define TIVA_ADC_SAMPLE_RATE_FASTEST  (ADC_PC_SR_1M)
#elif CONFIG_ARCH_CHIP_TM4C129
#  define TIVA_ADC_SAMPLE_RATE_SLOWEST  (ADC_PC_MCR_1_8)
#  define TIVA_ADC_SAMPLE_RATE_SLOW     (ADC_PC_MCR_1_4)
#  define TIVA_ADC_SAMPLE_RATE_FAST     (ADC_PC_MCR_1_2)
#  define TIVA_ADC_SAMPLE_RATE_FASTEST  (ADC_PC_MCR_FULL)
#else
#  error TIVA_ADC_SAMPLE_RATE: unsupported architecture
#endif

/* Utility macros ***********************************************************/

/* PWM trigger support definitions ******************************************/

/* Decodes the PWM generator and module from trigger and converts
 * to the TSSEL_PS register
 */

#define ADC_TRIG_PWM_CFG(t) \
    (1<<(ADC_TSSEL_PS_SHIFT(ADC_TRIG_gen(t))))

/* ADC support definitions **************************************************/

#define ADC_CHN_AIN(n)   GPIO_ADC_AIN##n
#define TIVA_ADC_PIN(n)  ADC_CHN_AIN(n)

#define SSE_PROC_TRIG(n)  (1 << (n))
#define SSE_PROC_TRIG_ALL (0xF)

#define SSE_IDX(a,s)      (((a)*SSE_PER_BASE) + (s))

#define MAX_NORMAL_CHN 15
#define BASE_PER_ADC   2
#define SSE_PER_BASE   4
#define SSE_MAX_STEP   8
#define NUM_SSE(n)     (sizeof(n)/sizeof(n[0]))

#define GET_AIN(a,s,c) (uint8_t)((getreg32( \
    TIVA_ADC_BASE(a)+TIVA_ADC_SSMUX(s)) & ADC_SSMUX_MUX_MASK(c)) >> ADC_SSMUX_MUX_SHIFT(c))

#define ADC_SSE_STEP_NULL 0xFF

#define CLOCK_CONFIG(div, src) \
    ( ((((div) << ADC_CC_CLKDIV_SHIFT) & ADC_CC_CLKDIV_MASK) | \
    ((src) & ADC_CC_CS_MASK)) & (ADC_CC_CLKDIV_MASK + ADC_CC_CS_MASK) )

#define SEM_PROCESS_PRIVATE 0
#define SEM_PROCESS_SHARED  1

/* Debug ********************************************************************/

#ifndef CONFIG_DEBUG
#  undef CONFIG_TIVA_ADC_REGDEBUG
#endif

/* ADC event trace logic.  NOTE:  trace uses the internal, non-standard, low-level
 * debug interface syslog() but does not require that any other debug
 * is enabled.
 */

#ifndef CONFIG_ADC_TRACE
#  define tiva_adc_tracereset(p)
#  define tiva_adc_tracenew(p,s)
#  define tiva_adc_traceevent(p,e,a)
#  define tiva_adc_tracedump(p)
#endif

#ifndef CONFIG_ADC_NTRACE
#  define CONFIG_ADC_NTRACE 32
#endif

/****************************************************************************
 * Public Functions
 * **************************************************************************/

/* Upper level ADC driver ***************************************************/

static void tiva_adc_reset(struct adc_dev_s *dev);
static int tiva_adc_setup(struct adc_dev_s *dev);
static void tiva_adc_shutdown(struct adc_dev_s *dev);
static void tiva_adc_rxint(struct adc_dev_s *dev, bool enable);
static int tiva_adc_ioctl(struct adc_dev_s *dev, int cmd, unsigned long arg);

/****************************************************************************
 * Public Data
 ****************************************************************************/

/* ADC lower half device operations */

static const struct adc_ops_s g_adcops =
{
  .ao_reset = tiva_adc_reset,
  .ao_setup = tiva_adc_setup,
  .ao_shutdown = tiva_adc_shutdown,
  .ao_rxint = tiva_adc_rxint,
  .ao_ioctl = tiva_adc_ioctl,
};

/****************************************************************************
 * Private Types
 ****************************************************************************/

/* tracks overall ADC peripherals one-time initialization state */
struct tiva_adc_state_s
{
  bool init[BASE_PER_ADC];
  bool sse[BASE_PER_ADC * SSE_PER_BASE];
};

struct tiva_adc_s
{
  struct adc_dev_s *dev;
  bool ena;                   /* Operation state */
  uint8_t devno;              /* ADC device number */
  struct tiva_adc_sse_s *sse[SSE_PER_BASE];   /* Sample sequencer operation
                                               * state */
#ifdef CONFIG_TIVA_ADC_REGDEBUG
  /* Debug stuff */

  bool wrlast;                /* Last was a write */
  uintptr_t addrlast;         /* Last address */
  uint32_t vallast;           /* Last value */
  int ntimes;                 /* Number of times */
#endif                        /* CONFIG_TIVA_ADC_REGDEBUG */
};

struct tiva_adc_sse_s
{
  struct tiva_adc_s *adc;     /* Parent peripheral */
#ifdef TIVA_ADC_HAVE_INTERRUPTS
  sem_t exclsem;              /* Mutual exclusion semaphore */
  struct work_s work;         /* Supports the interrupt handling "bottom half" */
#endif
  bool ena;                   /* Sample sequencer operation state */
  uint32_t irq;               /* SSE interrupt vectors */
  uint8_t num;                /* SSE number */
};

/****************************************************************************
 * Private Function Definitions
 ****************************************************************************/

/* Debug ADC functions **********************************************/

#if defined(CONFIG_TIVA_ADC_REGDEBUG) && defined(CONFIG_DEBUG)
static bool tiva_adc_checkreg(struct tiva_adc_s *priv, bool wr,
                              uint32_t regval, uintptr_t address);
#endif

#ifdef CONFIG_TIVA_ADC_REGDEBUG
static void tiva_adc_modifyreg(struct tiva_adc_s *priv, unsigned int addr,
                               uint32_t clearbits, uint32_t setbits);
#else
#  define tiva_adc_modifyreg(priv,addr,clearbits,setbits) modifyreg32(addr,clearbits,setbits)
#endif

/* TM4C-specific ADC functions **********************************************/

/* Common peripheral level */

static int adc_state(struct tiva_adc_s *adc, bool state);
static void adc_clock(uint32_t freq);
#ifdef CONFIG_ARCH_CHIP_TM4C129
static void adc_vref(uint8_t vref);
#endif
#ifdef CONFIG_TIVA_ADC_INTERRUPTS
static void tiva_adc_read(void *arg);
#endif

/* Peripheral (base) level */

static void adc_sample_rate(uint8_t rate);
static void adc_proc_trig(struct tiva_adc_s *adc, uint8_t sse_mask);
static uint32_t adc_int_status(struct tiva_adc_s *adc);

/* Sample Sequencer (SSE) level */

static void sse_state(struct tiva_adc_s *adc, uint8_t sse, bool state);
static void sse_trigger(struct tiva_adc_s *adc, uint8_t sse, uint32_t trigger);
#ifdef CONFIG_EXPERIMENTAL
static void sse_pwm_trig_ioctl(struct tiva_adc_s *adc, uint8_t sse, uint32_t cfg);
#endif
static int sse_data(struct tiva_adc_s *adc, uint8_t sse);
static void sse_priority(struct tiva_adc_s *adc, uint8_t sse, uint8_t priority);

static void sse_int_state(struct tiva_adc_s *adc, uint8_t sse, bool state);
static bool sse_int_status(struct tiva_adc_s *adc, uint8_t sse);
static void sse_clear_int(struct tiva_adc_s *adc, uint8_t sse);

static void sse_register_chn(struct tiva_adc_s *adc, uint8_t sse, uint8_t chn,
                             uint32_t ain);
static void sse_differential(struct tiva_adc_s *adc, uint8_t sse, uint8_t chn,
                             uint32_t diff);
#ifdef CONFIG_EXPERIMENTAL
static void sse_sample_hold_time(struct tiva_adc_s *adc, uint8_t sse,
                                 uint8_t chn, uint32_t shold);
#endif
static void sse_step_cfg(struct tiva_adc_s *adc, uint8_t sse, uint8_t chn,
                         uint8_t cfg);

/* Helper functions *********************************************************/

#ifdef CONFIG_TIVA_ADC0
static void tiva_adc0_sse_init(void);
static void tiva_adc0_assign_channels(void);
#  ifdef TIVA_ADC_HAVE_INTERRUPTS
static void tiva_adc0_assign_interrupts(void);
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE0
static void adc0_sse0_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc0_sse0_interrupt(int irq, void *context);
#    endif
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE1
static void adc0_sse1_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc0_sse1_interrupt(int irq, void *context);
#    endif
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE2
static void adc0_sse2_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc0_sse2_interrupt(int irq, void *context);
#    endif
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE3
static void adc0_sse3_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc0_sse3_interrupt(int irq, void *context);
#    endif
#  endif
#endif

#ifdef CONFIG_TIVA_ADC1
static void tiva_adc1_sse_init(void);
static void tiva_adc1_assign_channels(void);
#  ifdef TIVA_ADC_HAVE_INTERRUPTS
static void tiva_adc1_assign_interrupts(void);
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE0
static void adc1_sse0_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc1_sse0_interrupt(int irq, void *context);
#    endif
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE1
static void adc1_sse1_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc1_sse1_interrupt(int irq, void *context);
#    endif
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE2
static void adc1_sse2_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc1_sse2_interrupt(int irq, void *context);
#    endif
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE3
static void adc1_sse3_chn_cfg(void);
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
static void adc1_sse3_interrupt(int irq, void *context);
#    endif
#  endif
#endif

/****************************************************************************
 * Private Data
 ****************************************************************************/

/* Tracks overall peripheral state */

static struct tiva_adc_state_s adc_common =
{
  .init =
  {
    false,
    false
  },
  .sse =
  {
    false,
    false,
    false,
    false,
    false,
    false,
    false,
    false
  },
};

#ifdef CONFIG_TIVA_ADC0

/* ADC device instance 0 */

static struct adc_dev_s g_adcdev0;
static struct tiva_adc_s adc0;
#  ifdef CONFIG_TIVA_ADC0_SSE0
static struct tiva_adc_sse_s sse00;
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE1
static struct tiva_adc_sse_s sse01;
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE2
static struct tiva_adc_sse_s sse02;
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE3
static struct tiva_adc_sse_s sse03;
#  endif
#endif

#ifdef CONFIG_TIVA_ADC1

/* ADC device instance 1 */

static struct adc_dev_s g_adcdev1;
static struct tiva_adc_s adc1;
#  ifdef CONFIG_TIVA_ADC1_SSE0
static struct tiva_adc_sse_s sse10;
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE1
static struct tiva_adc_sse_s sse11;
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE2
static struct tiva_adc_sse_s sse12;
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE3
static struct tiva_adc_sse_s sse13;
#  endif
#endif

/****************************************************************************
 * Private Functions
 ****************************************************************************/

/****************************************************************************
 * Name: tiva_adc_reset
 *
 * Description:
 *   Reset the ADC device. Called early to initialize the hardware. This is
 *   called before tiva_adc_setup() and on error conditions.
 *
 ****************************************************************************/

static void tiva_adc_reset(struct adc_dev_s *dev)
{
  struct tiva_adc_s *priv = (struct tiva_adc_s *)dev->ad_priv;

  avdbg("Resetting...\n");

  /* Only if ADCs are active do we run the reset routine: - disable ADC
   * interrupts - clear interrupt bits - disable all active sequences
   * Otherwise, if the peripheral is inactive, perform no operations since
   * register access to a peripheral that is not active will result in a
   * segmentation fault.
   */

  if (priv->ena)
    {
      tiva_adc_rxint(dev, TIVA_ADC_DISABLE);
      uint8_t s;
      for (s = 0; s < SSE_PER_BASE; ++s)
        {
          if (adc_common.sse[SSE_IDX(priv->devno, s)])
            {
              sse_state(priv, s, TIVA_ADC_DISABLE);
            }
        }
    }
}

/****************************************************************************
 * Name: tiva_adc_setup
 *
 * Description:
 *   Configure the ADC. This method is called the first time that the ADC
 *   device is opened. This will occur when the port is first opened.
 *   this setup includes configuring and attaching ADC interrupts. Interrupts
 *   are all disabled upon return.
 *
 * Returned Value:
 *   Non negative value on success; negative value on failure.
 *
 ****************************************************************************/

static int tiva_adc_setup(struct adc_dev_s *dev)
{
  avdbg("Setup\n");

  /* Only if ADCs are active do we run the reset routine: - enable ADC
   * interrupts - clear interrupt bits - enable all active sequences - register
   * triggers and respective interrupt handlers Otherwise, if the peripheral is
   * inactive, perform no operations since register access to a peripheral that
   * is not active will result in a segmentation fault.
   */

  struct tiva_adc_s *priv = (struct tiva_adc_s *)dev->ad_priv;
  uint8_t s = 0;
  for (s = 0; s < SSE_PER_BASE; ++s)
    {
      if (adc_common.sse[SSE_IDX(priv->devno, s)])
        {
          sse_state(priv, s, true);
        }
    }

  tiva_adc_rxint(dev, false);
  return OK;
}

/****************************************************************************
 * Name: tiva_adc_shutdown
 *
 * Description:
 *   Disable the ADC. This method is called when the ADC device is closed.
 *   This method reverses the operation the setup method.
 *
 ****************************************************************************/

static void tiva_adc_shutdown(struct adc_dev_s *dev)
{
  struct tiva_adc_s *priv = (struct tiva_adc_s *)dev->ad_priv;

  avdbg("Shutdown\n");

  /* Reset the ADC peripheral */

  tiva_adc_reset(dev);

  uint8_t s = 0;
  for (s = 0; s < SSE_PER_BASE; ++s)
    {
      if (adc_common.sse[SSE_IDX(priv->devno, s)])
        {
          /* Disable ADC interrupts at the level of the AIC */

          up_disable_irq(priv->sse[s]->irq);

          /* Then detach the ADC interrupt handler. */

          irq_detach(priv->sse[s]->irq);
        }
    }
}

/****************************************************************************
 * Name: tiva_adc_rxint
 *
 * Description:
 *   Call to enable or disable RX interrupts
 *
 * Input Parameters:
 *   enable - the enable state of interrupts for this device
 *
 ****************************************************************************/

static void tiva_adc_rxint(struct adc_dev_s *dev, bool enable)
{
  struct tiva_adc_s *priv = (struct tiva_adc_s *)dev->ad_priv;

  avdbg("rx enable=%d\n", enable);

  uint8_t s = 0;
  for (s = 0; s < SSE_PER_BASE; ++s)
    {
      uint32_t trigger =
        (tiva_adc_getreg(priv, TIVA_ADC_EMUX(priv->devno)) >> s) & 0xF;
      if (adc_common.sse[SSE_IDX(priv->devno, s)] && (trigger > 0))
        {
          sse_int_state(priv, s, enable);
        }
    }
}

/****************************************************************************
 * Name: tiva_adc_ioctl
 *
 * Description:
 *   All ioctl calls will be routed through this method.
 *
 * Input Parameters:
 *   cmd - ADC ioctl command
 *   arg - argument for the ioctl command
 *
 * Returned Value:
 *   Non negative value on success; negative value on failure.
 *
 ****************************************************************************/

static int tiva_adc_ioctl(struct adc_dev_s *dev, int cmd, unsigned long arg)
{
  struct tiva_adc_s *priv = (struct tiva_adc_s *)dev->ad_priv;
  int ret = OK;
  uint32_t regval = 0;
  uint8_t sse = 0;

  avdbg("cmd=%d arg=%ld\n", cmd, arg);

  switch (cmd)
    {
      /* Software trigger */

      case ANIOC_TRIGGER:

        sse = (uint8_t) arg;

        /* start conversion and read to buffer */

        adc_proc_trig(priv, (uint8_t) SSE_PROC_TRIG(sse));
        regval = adc_int_status(priv) & (1 << sse);
        while (!regval)
          {
            regval = adc_int_status(priv) & (1 << sse);
          }

        sse_clear_int(priv, sse);
        sse_data(priv, sse);
        break;

      /* PWM triggering */

#warning Missing Logic

      /* TODO: Needs to be tested */

#ifdef CONFIG_EXPERIMENTAL

      case TIVA_ADC_PWM_TRIG_IOCTL:

        /* Verify input SSE trigger is a PWM trigger */

        sse = (uint8_t)(arg & 0x2);
        regval = (tiva_adc_getreg(priv, (TIVA_ADC_EMUX(adc->devno))) >>
            ADC_EMUX_SHIFT(sse)) & ADC_EMUX_MASK(sse);

        if ((regval == ADC_EMUX_PWM0) ||
            (regval == ADC_EMUX_PWM1) ||
            (regval == ADC_EMUX_PWM2) ||
            (regval == ADC_EMUX_PWM3))
          {
            sse_pwm_trig_ioctl(priv, sse, (uint32_t)(arg&0xFFFFFFFC));
          }

        break;

#endif

#warning Missing Logic

      /* Unsupported or invalid command */

      default:
        ret = -ENOTTY;
        break;
    }

  return ret;
}

/****************************************************************************
 * Name: tiva_adc_read
 *
 * Description:
 *   This function executes on the worker thread.  It is scheduled by
 *   sam_adc_interrupt whenever any enabled event occurs. All interrupts
 *   are disabled when this function runs. tiva_adc_read will
 *   re-enable interrupts when it completes processing all pending events.
 *
 * Input Parameters
 *   arg - The ADC SSE data structure cast to (void *)
 *
 * Returned Value:
 *   None
 *
 ****************************************************************************/

static void tiva_adc_read(void *arg)
{
  struct tiva_adc_sse_s *sse = (struct tiva_adc_sse_s *)arg;
  uint32_t data = 0;
  uint8_t fifo_count = 0;

  /* Get exclusive access to the driver data structure */

  tiva_adc_lock(sse->adc, sse->num);

  /* Get sampled data */

  while (!(tiva_adc_getreg(&adc0, TIVA_ADC_BASE(0) + TIVA_ADC_SSFSTAT(0)) &
          ADC_SSFSTAT_EMPTY) && fifo_count < SSE_MAX_STEP)
    {
      data = tiva_adc_getreg(&adc0, TIVA_ADC_BASE(0) + TIVA_ADC_SSFIFO(0));
      (void)adc_receive(adc0.dev, GET_AIN(0, 0, fifo_count), data);
      ++fifo_count;
    }

  /* Exit, re-enabling ADC interrupts */

  sse_int_state(&adc0, 0, TIVA_ADC_ENABLE);

  /* Release our lock on the ADC structure */

  tiva_adc_unlock(sse->adc, sse->num);
}

/****************************************************************************
 * Register Operations
 ****************************************************************************/

#ifdef CONFIG_TIVA_ADC_REGDEBUG

/****************************************************************************
 * Name: tiva_adc_checkreg
 *
 * Description:
 *   Check if the current register access is a duplicate of the preceding.
 *
 * Input Parameters:
 *   regval  - The value to be written
 *   address - The address of the register to write to
 *
 * Returned Value:
 *   true:  This is the first register access of this type.
 *   flase: This is the same as the preceding register access.
 *
 ****************************************************************************/

static bool tiva_adc_checkreg(struct tiva_adc_s *priv, bool wr,
                              uint32_t regval, uintptr_t address)
{
  if (wr == priv->wrlast &&             /* Same kind of access? */
      regval == priv->vallast &&        /* Same value? */
      address == priv->addrlast)        /* Same address? */
    {
      /* Yes, then just keep a count of the number of times we did this. */

      priv->ntimes++;
      return false;
    }
  else
    {
      /* Did we do the previous operation more than once? */

      if (priv->ntimes > 0)
        {
          /* Yes... show how many times we did it */

          lldbg("...[Repeats %d times]...\n", priv->ntimes);
        }

      /* Save information about the new access */

      priv->wrlast = wr;
      priv->vallast = regval;
      priv->addrlast = address;
      priv->ntimes = 0;
    }

  /* Return true if this is the first time that we have done this operation */

  return true;
}
#endif /* CONFIG_TIVA_ADC_REGDEBUG */

/****************************************************************************
 * Name: tiva_adc_modifyreg
 *
 * Description:
 *   Atomically modify the specified bits in a memory mapped register
 *
 * Input Parameters:
 *   addr - The address of the register to write to
 *
 ****************************************************************************/

#ifdef CONFIG_TIVA_ADC_REGDEBUG
static void tiva_adc_modifyreg(struct tiva_adc_s *priv, unsigned int addr,
                               uint32_t clearbits, uint32_t setbits)
{
  uint32_t regval = 0;
  irqstate_t flags = irqsave();
  regval = tiva_adc_getreg(priv, addr);
  regval &= ~clearbits;
  regval |= setbits;
  tiva_adc_putreg(priv, addr, regval);
  irqrestore(flags);
}
#endif /* CONFIG_TIVA_ADC_REGDEBUG */

/* TM4C-specific ADC functions **********************************************/

/* Peripheral (base) level **************************************************/

/****************************************************************************
 * Name: adc_state
 *
 * Description:
 *  Toggles the operational state of the ADC peripheral
 *
 * Input Parameters:
 *  state - operation state
 *
 ****************************************************************************/

static int adc_state(struct tiva_adc_s *adc, bool state)
{
  if (state == TIVA_ADC_ENABLE)
    {
      /* Enable clocking to the ADC peripheral */

#ifdef TIVA_SYSCON_RCGCADC
      modifyreg32(TIVA_SYSCON_RCGCADC, 0, 1 << adc->devno);
#else
      modifyreg32(TIVA_SYSCON_RCGC0, 0, SYSCON_RCGC0_ADC0);
#endif
      return OK;
    }
  else if (state == TIVA_ADC_DISABLE)
    {
      /* Disable clocking to the ADC peripheral */

#ifdef TIVA_SYSCON_RCGCADC
      modifyreg32(TIVA_SYSCON_RCGCADC, 1 << adc->devno, 0);
#else
      modifyreg32(TIVA_SYSCON_RCGC0, SYSCON_RCGC0_ADC0, 0);
#endif
      return OK;
    }

  /* ERROR! */

  return -1;
}

/****************************************************************************
 * Name: adc_clock
 *
 * Description:
 *  Sets the ADC peripherals clock to the desired frequency.
 *
 * Input Parameters:
 *  freq - ADC clock value; dependent on platform:
 *
 *  TM4C123 - Select either MOSC or PIOSC. Both result in 16 MHz operation,
 *  however the PIOSC allows the ADC to operate in deep sleep mode.
 *
 *  TM4C129 - For the 129, there is still a selection between various internal
 *  clocks, however the output frequency is variable (16 MHz - 32 MHz); so it
 *  is much more intuitive to allow the clock variable be a frequency value.
 *
 ****************************************************************************/

static void adc_clock(uint32_t freq)
{
#if defined(CONFIG_ARCH_CHIP_TM4C123)
  /* For the TM4C123, the ADC clock source does not affect the frequency, it
   * runs at 16 MHz regardless. You end up selecting between the MOSC (default)
   * or the PIOSC. The PIOSC allows the ADC to operate even in deep sleep mode.
   * Since this is the case, the clock value for
   */

  uintptr_t ccreg = (TIVA_ADC0_BASE + TIVA_ADC_CC_OFFSET);
  modifyreg32(ccreg, 0, (freq & ADC_CC_CS_MASK));

#elif defined (CONFIG_ARCH_CHIP_TM4C129)
  /* check clock bounds and specific match cases */

  uint32_t clk_src = 0;
  uint32_t div = 0;
  if (clock > TIVA_ADC_CLOCK_MAX)
    {
      clk_src = ADC_CC_CS_SYSPLL;
      div = (BOARD_FVCO_FREQUENCY / TIVA_ADC_CLOCK_MAX);
    }
  else if (clock < TIVA_ADC_CLOCK_MIN)
    {
      clk_src = ADC_CC_CS_PIOSC;
      div = 1;
    }
  else if (clock == XTAL_FREQUENCY)
    {
      clk_src = ADC_CC_CS_MOSC;
      div = 1;
    }
  else
    {
      clk_src = ADC_CC_CS_SYSPLL;
      div = (BOARD_FVCO_FREQUENCY / freq);
    }

  uintptr_t ccreg = (TIVA_ADC0_BASE + TIVA_ADC_CC_OFFSET);
  modifyreg32(ccreg, 0, CLOCK_CONFIG(div, clk_src));
#else
#  error Unsupported architecture reported
#endif
}

/****************************************************************************
 * Name: adc_vref
 *
 * Description:
 *  Sets the ADC peripherals clock to the desired frequency.
 *
 * Input Parameters:
 *  vref - ADC clock voltage reference source
 *
 ****************************************************************************/

#ifdef CONFIG_ARCH_CHIP_TM4C129
static void adc_vref(uint8_t vref)
{
  uintptr_t ctlreg = (TIVA_ADC0_BASE + TIVA_ADC_CTL_OFFSET);
  if (vref == 0)
    {
      modifyreg32(ctlreg, vref, 0);
    }
  else
    {
      modifyreg32(ctlreg, 0, vref);
    }
}
#endif

/****************************************************************************
 * Name: adc_sample_rate
 *
 * Description:
 *  Sets the ADC sample rate as follows for each processor.
 *  TM4C123 - by maximum samples: 125 ksps, 250 ksps, 500 ksps or 1 Msps
 *  TM4C129 - by a divisor either being full, half, quarter or
 *  an eighth.
 *
 * Input Parameters:
 *  rate - ADC sample rate divisor
 *
 ****************************************************************************/

static void adc_sample_rate(uint8_t rate)
{
  uintptr_t pcreg = (TIVA_ADC0_BASE + TIVA_ADC_PC_OFFSET);

  /* NOTE: ADC_PC_SR_MASK is intended for use with the TM4C123, the
   * alternative is ADC_PC_MCR_MASK for the TM4C129. However both masks
   * mask off the first 4 bits (0xF) so there is no need to distinguish
   * between the two.
   */

  modifyreg32(pcreg, 0, (rate & ADC_PC_SR_MASK));
}

/****************************************************************************
 * Name: adc_proc_trig
 *
 * Description:
 *   Triggers the sample sequence to start it's conversion(s) and store them
 *   to the FIFO. This is only required when the trigger source is set to the
 *   processor.
 *
 * Input parameters:
 *   adc - which ADC peripherals' sample sequencers to trigger
 *   sse_mask - sample sequencer bitmask, each sse is 1 shifted by the sse
 *              number. e.g.
 *              SSE0 = 1 << 0
 *              SSE1 = 1 << 1
 *              SSE2 = 1 << 2
 *              SSE3 = 1 << 3
 *
 ****************************************************************************/

static void adc_proc_trig(struct tiva_adc_s *adc, uint8_t sse_mask)
{
  uintptr_t pssireg = TIVA_ADC_PSSI(adc->devno);
  tiva_adc_modifyreg(adc, pssireg, 0, sse_mask);
#ifdef CONFIG_TIVA_ADC_SYNC
#  warning CONFIG_TIVA_ADC_SYNC unsupported at this time.
#endif
}

/****************************************************************************
 * Name: adc_int_status
 *
 * Description:
 *   Returns raw interrupt status for the input ADC
 *
 * Input parameters:
 *   adc - which ADC peripherals' interrupt status to retrieve
 *
 ****************************************************************************/

static uint32_t adc_int_status(struct tiva_adc_s *adc)
{
  return tiva_adc_getreg(adc, TIVA_ADC_RIS(adc->devno));
}

/* Sample sequencer (SSE) functions *****************************************/

/****************************************************************************
 * Name: sse_state
 *
 * Description:
 *   Sets the operation state of an ADC's sample sequencer (SSE). SSEs must
 *   be configured before being enabled.
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   state - sample sequencer enable/disable state
 *
 ****************************************************************************/

static void sse_state(struct tiva_adc_s *adc, uint8_t sse, bool state)
{
  uintptr_t actssreg = TIVA_ADC_ACTSS(adc->devno);
  if (state == TIVA_ADC_ENABLE)
    {
      tiva_adc_modifyreg(adc, actssreg, 0, (1 << sse));
    }
  else
    {
      tiva_adc_modifyreg(adc, actssreg, (1 << sse), 0);
    }

  adc->sse[sse]->ena = state;
}

/****************************************************************************
 * Name: sse_trigger
 *
 * Description:
 *   Sets the trigger configuration for an ADC's sample sequencer (SSE).
 *   Possible triggers are the following:
 *      - Processor
 *      - PWMs, requires that one of the PWMnn_TRIG_CFG defines be OR'd
 *        into the trigger value.
 *      - Timers
 *      - GPIO (which GPIO is platform specific, consult the datasheet)
 *      - Always
 *      - !!UNSUPPORTED: Comparators
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   trigger - interrupt trigger
 *
 ****************************************************************************/

static void sse_trigger(struct tiva_adc_s *adc, uint8_t sse, uint32_t trigger)
{
  uintptr_t emuxreg = (TIVA_ADC_EMUX(adc->devno));
  uint32_t trig = 0;
  if ((trigger & ADC_EMUX_MASK(0)) == 0)
    {
      /* The 0 value is a special case since using modifyregn() results in an
       * ORing of the register value; we need to unset those bits if it's a 0.
       */

      tiva_adc_modifyreg(adc, emuxreg, (0xF << sse), 0);
    }
  else
    {
      trig = ((trigger << ADC_EMUX_SHIFT(sse)) & ADC_EMUX_MASK(sse));
      tiva_adc_modifyreg(adc, emuxreg, 0, trig);
    }

  /* NOTE: PWM triggering needs an additional register to be set (ADC_TSSEL)
   * A platform specific IOCTL command is provided to configure the triggering.
   */
}

/****************************************************************************
 * Name: sse_pwm_trig_ioctl
 *
 * Description:
 *   Additional triggering configuration for PWM. Sets which PWM and which
 *   generator.
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   cfg - which PWM modulator and generator to use, use TIVA_ADC_PWM_TRIG
 *         to encode the value correctly
 *
 ****************************************************************************/

#ifdef CONFIG_EXPERIMENTAL
static void sse_pwm_trig_ioctl(struct tiva_adc_s *adc, uint8_t sse, uint32_t cfg)
{
  /* PWM triggering needs an additional register to be set (ADC_TSSEL) */

  uintptr_t tsselreg = TIVA_ADC_TSSEL(adc->devno);

  if ((cfg & ADC_EMUX_MASK(0)) == 1)
    {
      tiva_adc_modifyreg(adc, tsselreg, 0, cfg);
    }
  else
    {
      tiva_adc_modifyreg(adc, tsselreg, cfg, 0);
    }
}
#endif

/****************************************************************************
 * Name: sse_int
 *
 * Description:
 *   Sets the interrupt state of an ADC's sample sequencer (SSE). SSEs must
 *   be enabled before setting interrupt state.
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   state - sample sequencer enable/disable interrupt state
 *
 ****************************************************************************/

static void sse_int_state(struct tiva_adc_s *adc, uint8_t sse, bool state)
{
  uintptr_t imreg = TIVA_ADC_IM(adc->devno);
  if (adc->sse[sse])
    {
      sse_clear_int(adc, sse);
    }
  if (state == TIVA_ADC_ENABLE)
    {
      tiva_adc_modifyreg(adc, imreg, 0, (1 << sse));
    }
  else
    {
      tiva_adc_modifyreg(adc, imreg, (1 << sse), 0);
    }
}

/****************************************************************************
 * Name: sse_int_status
 *
 * Description:
 *   Returns interrupt status for the specificed SSE
 *
 * Input parameters:
 *   adc - which ADC peripherals' interrupt status to retrieve
 *   sse - which SSE interrupt status to retrieve
 *
 ****************************************************************************/

static bool sse_int_status(struct tiva_adc_s *adc, uint8_t sse)
{
  return (adc_int_status(adc) & (1 << sse)) > 0 ? true : false;
}

/****************************************************************************
 * Name: sse_clear_int
 *
 * Description:
 *   Clears the interrupt bit for the SSE.
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   state - sample sequencer
 *
 ****************************************************************************/

static void sse_clear_int(struct tiva_adc_s *adc, uint8_t sse)
{
  uintptr_t iscreg = TIVA_ADC_ISC(adc->devno);
  tiva_adc_modifyreg(adc, iscreg, 0, (1 << sse));
}

/****************************************************************************
 * Name: sse_data
 *
 * Description:
 *   Retrieves data from the FIFOs for all steps in the given sample sequencer.
 *   The input data buffer MUST be as large or larger than the sample sequencer.
 *   otherwise
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *
 * Return value:
 *   number of steps read from FIFO.
 *
 ****************************************************************************/

static int sse_data(struct tiva_adc_s *adc, uint8_t sse)
{
  uint32_t ssfstatreg =
    tiva_adc_getreg(adc, TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSFSTAT(sse));
  int32_t data = 0;
  uint8_t fifo_count = 0;

  /* Read samples from the FIFO until it is empty */

  while (!(ssfstatreg & ADC_SSFSTAT_EMPTY) && fifo_count < SSE_MAX_STEP)
    {
      /* Read the FIFO and copy it to the destination */

      data =
        tiva_adc_getreg(adc, TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSFIFO(sse));
      (void)adc_receive(adc->dev, GET_AIN(adc->devno, sse, fifo_count), data);
      fifo_count++;

      /* refresh fifo status register state */

      ssfstatreg =
        tiva_adc_getreg(adc, TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSFSTAT(sse));
    }

  return fifo_count;
}

/****************************************************************************
 * Name: sse_priority
 *
 * Description:
 *   Sets the priority configuration for an ADC's sample sequencer (SSE). The
 *   priority value ranges from 0 to 3, 0 being the highest priority, 3 being
 *   the lowest. There can be no duplicate values.
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   priority - conversion priority
 *
 ****************************************************************************/

static void sse_priority(struct tiva_adc_s *adc, uint8_t sse, uint8_t priority)
{
  uintptr_t ssprireg = TIVA_ADC_SSPRI(adc->devno);
  uint32_t sspri = 0;

  if (priority == 0)
    {
      /* The 0 value is a special case since using modifyregn() results in an
       * ORing of the register value; we need to unset those bits if it's a 0.
       */

      sspri = (ADC_SSPRI_MASK(sse) & (0x3 << ADC_SSPRI_SHIFT(sse)));
      tiva_adc_modifyreg(adc, ssprireg, sspri, 0);
    }
  else
    {
      sspri = (ADC_SSPRI_MASK(sse) & (priority << ADC_SSPRI_SHIFT(sse)));
      tiva_adc_modifyreg(adc, ssprireg, 0, sspri);
    }
}

/****************************************************************************
 * Name: sse_register_chn
 *
 * Description:
 *   Registers an input channel to an SSE. Channels are registered according
 *   to the step and channel values stored in the channel struct. If the SSE
 *   already has a channel registered, it is overwritten by the new channel.
 *
 *   *SSEMUX only supported on TM4C129 devices
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   chn - sample sequencer step
 *   ain - analog input pin
 *
 ****************************************************************************/

static void sse_register_chn(struct tiva_adc_s *adc, uint8_t sse, uint8_t chn,
                             uint32_t ain)
{
  /* Configure SSE mux (SSMUX) with step number */

  uintptr_t ssmuxreg = (TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSMUX(sse));
  uint32_t step = 0;

  if (ain > 0)
    {
      step = ((ain << ADC_SSMUX_MUX_SHIFT(chn)) & ADC_SSMUX_MUX_MASK(chn));
      tiva_adc_modifyreg(adc, ssmuxreg, 0, step);
    }
  else
    {
      step = ((0xF << ADC_SSMUX_MUX_SHIFT(chn)) & ADC_SSMUX_MUX_MASK(chn));
      tiva_adc_modifyreg(adc, ssmuxreg, step, 0);
    }

#ifdef CONFIG_ARCH_CHIP_TM4C129
  /* Configure SSE extended mux (SSEMUX) with step number and configuration */

  ssmuxreg = (TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSMUX(sse));
  step = ((1 << ADC_SSEMUX_MUX_SHIFT(chn)) & ADC_SSEMUX_MUX_MASK(chn));
  if (chn > MAX_NORMAL_CHN)
    {
      tiva_adc_modifyreg(adc, ssmuxreg, 0, step);
    }
  else
    {
      tiva_adc_modifyreg(adc, ssmuxreg, step, 0);
    }
#endif
}

/****************************************************************************
 * Name: sse_differential
 *
 * Description:
 *   Sets the differential capability for a SSE. !! UNSUPPORTED
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   chn - sample sequencer channel
 *   diff - differential configuration
 *
 ****************************************************************************/

static void sse_differential(struct tiva_adc_s *adc, uint8_t sse, uint8_t chn,
                             uint32_t diff)
{
#ifdef CONFIG_TIVA_ADC_DIFFERENTIAL
#  error CONFIG_TIVA_ADC_DIFFERENTIAL unsupported!!
#else

  /* for now, ensure the FIFO is used and differential sampling is disabled */

  uintptr_t ssopreg = (TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSOP(sse));
  uint32_t sdcopcfg = (1 << chn);
  tiva_adc_modifyreg(adc, ssopreg, sdcopcfg, 0);
#endif
}

/****************************************************************************
 * Name: sse_sample_hold_time
 *
 * Description:
 *  Set the sample and hold time for this step.
 *
 *  This is not available on all devices, however on devices that do not
 *  support this feature these reserved bits are ignored on write access.
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   chn - sample sequencer channel
 *   shold - sample and hold time
 *
 ****************************************************************************/

#ifdef CONFIG_EXPERIMENTAL
static void sse_sample_hold_time(struct tiva_adc_s *adc, uint8_t sse,
                                 uint8_t chn, uint32_t shold)
{
  uintptr_t sstshreg = (TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSTSH(sse));
  if (shold > 0)
    {
      tiva_adc_modifyreg(adc, sstshreg, 0, (shold << ADC_SSTSH_SHIFT(sse)));
    }
  else
    {
      tiva_adc_modifyreg(adc, sstshreg, ADC_SSTSH_MASK(sse), 0);
    }
}
#endif

/****************************************************************************
 * Name: sse_step_cfg
 *
 * Description:
 *   Configures the given SSE step to one of the following options:
 *      -Temperature sensor select: this step is muxed to the internal
 *       temperature sensor.
 *      -Interrupt enabled select: this step causes the interrupt bit to
 *       be set and, if the MASK0 bit in ADC_IM register is set, the
 *       interrupt is promoted to the interrupt controller.
 *      -Sequence end select: This step is the last sequence to be sampled.
 *       This MUST be set somewhere in the SSE.
 *      -*Comparator/Differential select: The analog input is differentially
 *       sampled. The corresponding ADCSSMUXn nibble must be set to the pair
 *       number "i", where the paired inputs are "2i and 2i+1". Because the
 *       temperature sensor does not have a differential option, this bit must
 *       not be set when the TS3 bit is set.
 *
 *  *Comparator/Differential functionality is unsupported and ignored.
 *
 * Input parameters:
 *   adc - peripheral state
 *   sse - sample sequencer
 *   chn - sample sequencer channel
 *   cfg - step configuration
 *
 ****************************************************************************/

static void sse_step_cfg(struct tiva_adc_s *adc, uint8_t sse, uint8_t chn,
                         uint8_t cfg)
{
  uintptr_t ssctlreg = (TIVA_ADC_BASE(adc->devno) + TIVA_ADC_SSCTL(sse));
  uint32_t ctlcfg = cfg << ADC_SSCTL_SHIFT(chn);
  tiva_adc_modifyreg(adc, ssctlreg, 0, ctlcfg);
}

/****************************************************************************
 * Public Functions
 ****************************************************************************/

/****************************************************************************
 * Name: tiva_adc_initialize
 *
 * Description:
 *   Initialize the ADC
 *
 * Returned Value:
 *   Valid can device structure reference on success; a NULL on failure
 *
 ****************************************************************************/

struct adc_dev_s *tiva_adc_initialize(int adc_num)
{
  avdbg("tiva_adc_initialize\n");

  /* Initialize the private ADC device data structure */

  struct tiva_adc_s *adc;
  uint8_t s;
#ifdef CONFIG_TIVA_ADC0
  if (adc_num == 0)
    {
      adc0.ena = false;
      adc0.devno = 0;

      /* Debug stuff */

#  ifdef CONFIG_TIVA_ADC_REGDEBUG
      adc0.wrlast = false;
      adc0.addrlast = 0x0;
      adc0.vallast = 0x0;
      adc0.ntimes = 0;
#  endif                             /* CONFIG_TIVA_ADC_REGDEBUG */

      /* Initialize SSEs */

#  ifdef CONFIG_TIVA_ADC0_SSE0
      sse00.ena = false;
      sse00.irq = TIVA_IRQ_ADC0;
      sse00.num = 0;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse00.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif
      adc0.sse[0] = &sse00;
#  endif                             /* CONFIG_TIVA_ADC0_SSE0 */

#  ifdef CONFIG_TIVA_ADC0_SSE1
      sse01.ena = false;
      sse01.irq = TIVA_IRQ_ADC1;
      sse01.num = 1;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse01.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif
      adc0.sse[1] = &sse01;
#  endif                             /* CONFIG_TIVA_ADC0_SSE1 */

#  ifdef CONFIG_TIVA_ADC0_SSE2
      sse02.ena = false;
      sse02.irq = TIVA_IRQ_ADC2;
      sse02.num = 2;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse02.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif
      adc0.sse[2] = &sse02;
#  endif                             /* CONFIG_TIVA_ADC0_SSE2 */

#  ifdef CONFIG_TIVA_ADC0_SSE3
      sse03.ena = false;
      sse03.irq = TIVA_IRQ_ADC3;
      sse03.num = 3;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse03.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif
      adc0.sse[3] = &sse03;
#  endif                             /* CONFIG_TIVA_ADC0_SSE3 */

      adc0.dev = &g_adcdev0;
      adc = &adc0;

      /* Initialize the public ADC device data structure */

      g_adcdev0.ad_ops = &g_adcops;
      g_adcdev0.ad_priv = &adc0;
    }
#endif                               /* CONFIG_TIVA_ADC0 */

#ifdef CONFIG_TIVA_ADC1
  if (adc_num == 1)
    {
      adc1.ena = false;
      adc1.devno = 0;

      /* Debug stuff */

#  ifdef CONFIG_TIVA_ADC_REGDEBUG
      adc1.wrlast = false;
      adc1.addrlast = 0x0;
      adc1.vallast = 0x0;
      adc1.ntimes = 0;
#  endif                             /* CONFIG_TIVA_ADC_REGDEBUG */

      /* Initialize SSEs */

#  ifdef CONFIG_TIVA_ADC1_SSE0
      sse10.ena = false;
      sse10.irq = TIVA_IRQ_ADC1_0;
      sse10.num = 0;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse10.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif
      adc1.sse[0] = &sse10;
#  endif                             /* CONFIG_TIVA_ADC1_SSE0 */

#  ifdef CONFIG_TIVA_ADC1_SSE1
      sse11.ena = false;
      sse11.irq = TIVA_IRQ_ADC1_1;
      sse11.num = 1;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse11.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif

      adc1.sse[1] = &sse11;
#  endif                             /* CONFIG_TIVA_ADC1_SSE1 */

#  ifdef CONFIG_TIVA_ADC1_SSE2
      sse12.ena = false;
      sse12.irq = TIVA_IRQ_ADC1_2;
      sse12.num = 2;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse12.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif
      adc1.sse[2] = &sse12;
#  endif                             /* CONFIG_TIVA_ADC1_SSE2 */

#  ifdef CONFIG_TIVA_ADC1_SSE3
      sse13.ena = false;
      sse13.irq = TIVA_IRQ_ADC1_3;
      sse13.num = 3;
#    ifdef TIVA_ADC_HAVE_INTERRUPTS
      sem_init(&sse13.exclsem, SEM_PROCESS_PRIVATE, 1);
#    endif
      adc1.sse[3] = &sse13;
#  endif                             /* CONFIG_TIVA_ADC1_SSE3 */

      adc1.dev = &g_adcdev1;
      adc = &adc1;

      /* Initialize the public ADC device data structure */

      g_adcdev1.ad_ops = &g_adcops;
      g_adcdev1.ad_priv = &adc1;
    }
#endif                               /* CONFIG_TIVA_ADC1 */

  if (adc_num > 1)
    {
      adbg("ERROR: Invalid ADV devno given, must be 0 or 1! ADC Devno: %d\n",
           adc_num);
      return NULL;
    }

  /* Have the common peripheral properties already been initialized? If yes,
   * continue.
   */

  if (adc_common.init[adc->devno] == false)
    {
      /* turn on peripheral */

      if (adc_state(adc, TIVA_ADC_ENABLE) < 0)
        {
          adbg("ERROR: failure to power ADC peripheral (devno=%d)\n",
               adc_num);
          return NULL;
        }

      /* set clock */

      adc_clock(CONFIG_TIVA_ADC_CLOCK);

      /* set sampling rate */

      adc_sample_rate(TIVA_ADC_SAMPLE_RATE_FASTEST);

#ifdef CONFIG_ARCH_CHIP_TM4C129
      /* voltage reference */

      adc_vref();
#endif                               /* CONFIG_ARCH_CHIP_TM4C129 */
      adc_common.init[adc->devno] = true;
    }

  /* Initialize peripheral */

  /* Have we already been initialized? If yes, than just hand out the interface
   * one more time.
   */

  if (adc->ena == false)
    {
#if CONFIG_TIVA_ADC0
      if (adc_num == 0)
        {
          /* Configure sample sequencers */

          tiva_adc0_sse_init();

          /* Configure channels & register interrupts */

#  if TIVA_ADC_HAVE_INTERRUPTS
          tiva_adc0_assign_interrupts();
#  endif
          tiva_adc0_assign_channels();
        }
#endif

#if CONFIG_TIVA_ADC1
      if (adc_num == 1)
        {
          /* Configure sample sequencers */

          tiva_adc1_sse_init();

          /* Configure channels & register interrupts */

#  if TIVA_ADC_HAVE_INTERRUPTS
          tiva_adc1_assign_interrupts();
#  endif
          tiva_adc1_assign_channels();
        }
#endif

      /* Enable SSEs */

      for (s = 0; s < SSE_PER_BASE; ++s)
        {
          if (adc_common.sse[SSE_IDX(adc_num, s)])
            {
              sse_state(adc, s, TIVA_ADC_ENABLE);
              sse_clear_int(adc, s);
            }
        }

      /* Now we are initialized */

      adc->ena = true;
    }

  /* Return a pointer to the device structure */

  avdbg("Returning %x\n", adc->dev);
  return adc->dev;
}

/****************************************************************************
 * Name: tiva_adc_lock
 *
 * Description:
 *   Get exclusive access to the ADC interface
 *
 ****************************************************************************/

void tiva_adc_lock(FAR struct tiva_adc_s *priv, int sse)
{
#if TIVA_ADC_HAVE_INTERRUPTS
  int ret;

  avdbg("Locking\n");

  do
    {
      ret = sem_wait(&priv->sse[sse]->exclsem);

      /* This should only fail if the wait was canceled by an signal (and the
       * worker thread will receive a lot of signals).
       */

      DEBUGASSERT(ret == OK || errno == EINTR);
    }
  while (ret < 0);
#endif
}

/****************************************************************************
 * Name: tiva_adc_unlock
 *
 * Description:
 *   Relinquish the lock on the ADC interface
 *
 ****************************************************************************/

void tiva_adc_unlock(FAR struct tiva_adc_s *priv, int sse)
{
#if TIVA_ADC_HAVE_INTERRUPTS
  avdbg("Unlocking\n");
  sem_post(&priv->sse[sse]->exclsem);
#endif
}

/****************************************************************************
 * Name: tiva_adc_getreg
 *
 * Description:
 *  Read any 32-bit register using an absolute address.
 *
 ****************************************************************************/

#ifdef CONFIG_TIVA_ADC_REGDEBUG
uint32_t tiva_adc_getreg(struct tiva_adc_s *priv, uintptr_t address)
{
  uint32_t regval = getreg32(address);

  if (tiva_adc_checkreg(priv, false, regval, address))
    {
      lldbg("%08x->%08x\n", address, regval);
    }

  return regval;
}

/****************************************************************************
 * Name: tiva_adc_putreg
 *
 * Description:
 *  Write to any 32-bit register using an absolute address.
 *
 ****************************************************************************/

void tiva_adc_putreg(struct tiva_adc_s *priv, uintptr_t address,
                     uint32_t regval)
{
  if (tiva_adc_checkreg(priv, true, regval, address))
    {
      lldbg("%08x<-%08x\n", address, regval);
    }

  putreg32(regval, address);
}
#endif                               /* CONFIG_TIVA_ADC_REGDEBUG */

/****************************************************************************
 * Name: Verbose, generated code
 *
 * Description:
 *  Generated with a python script, the following code is used to deal with
 *  the defines generated from the Kconfig menu. Read at your own risk.
 *
 ****************************************************************************/

/* Sample sequencer initialization ******************************************/

#ifdef CONFIG_TIVA_ADC0
static void tiva_adc0_sse_init(void)
{
#  ifdef CONFIG_TIVA_ADC0_SSE0
  sse_state(&adc0, 0, TIVA_ADC_DISABLE);
  sse_priority(&adc0, 0, CONFIG_TIVA_ADC0_SSE0_PRIORITY);
  sse_trigger(&adc0, 0, CONFIG_TIVA_ADC0_SSE0_TRIGGER);
  adc_common.sse[SSE_IDX(0, 0)] = true;
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE1
  sse_state(&adc0, 1, TIVA_ADC_DISABLE);
  sse_priority(&adc0, 1, CONFIG_TIVA_ADC0_SSE1_PRIORITY);
  sse_trigger(&adc0, 1, CONFIG_TIVA_ADC0_SSE1_TRIGGER);
  adc_common.sse[SSE_IDX(0, 1)] = true;
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE2
  sse_state(&adc0, 2, TIVA_ADC_DISABLE);
  sse_priority(&adc0, 2, CONFIG_TIVA_ADC0_SSE2_PRIORITY);
  sse_trigger(&adc0, 2, CONFIG_TIVA_ADC0_SSE2_TRIGGER);
  adc_common.sse[SSE_IDX(0, 2)] = true;
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE3
  sse_state(&adc0, 3, TIVA_ADC_DISABLE);
  sse_priority(&adc0, 3, CONFIG_TIVA_ADC0_SSE3_PRIORITY);
  sse_trigger(&adc0, 3, CONFIG_TIVA_ADC0_SSE3_TRIGGER);
  adc_common.sse[SSE_IDX(0, 3)] = true;
#  endif
}
#endif                               /* CONFIG_TIVA_ADC0 */

#ifdef CONFIG_TIVA_ADC1
static void tiva_adc1_sse_init(void)
{
#  ifdef CONFIG_TIVA_ADC1_SSE0
  sse_state(&adc1, 0, TIVA_ADC_DISABLE);
  sse_priority(&adc1, 0, CONFIG_TIVA_ADC1_SSE0_PRIORITY);
  sse_trigger(&adc1, 0, CONFIG_TIVA_ADC1_SSE0_TRIGGER);
  adc_common.sse[SSE_IDX(1, 0)] = true;
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE1
  sse_state(&adc1, 1, TIVA_ADC_DISABLE);
  sse_priority(&adc1, 1, CONFIG_TIVA_ADC1_SSE1_PRIORITY);
  sse_trigger(&adc1, 1, CONFIG_TIVA_ADC1_SSE1_TRIGGER);
  adc_common.sse[SSE_IDX(1, 1)] = true;
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE2
  sse_state(&adc1, 2, TIVA_ADC_DISABLE);
  sse_priority(&adc1, 2, CONFIG_TIVA_ADC1_SSE2_PRIORITY);
  sse_trigger(&adc1, 2, CONFIG_TIVA_ADC1_SSE2_TRIGGER);
  adc_common.sse[SSE_IDX(1, 2)] = true;
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE3
  sse_state(&adc1, 3, TIVA_ADC_DISABLE);
  sse_priority(&adc1, 3, CONFIG_TIVA_ADC1_SSE3_PRIORITY);
  sse_trigger(&adc1, 3, CONFIG_TIVA_ADC1_SSE3_TRIGGER);
  adc_common.sse[SSE_IDX(1, 3)] = true;
#  endif
}
#endif                               /* CONFIG_TIVA_ADC1 */

/* Sample sequencer interrupt initialization ********************************/

#ifdef TIVA_ADC_HAVE_INTERRUPTS
static void tiva_adc0_assign_interrupts(void)
{
#  ifdef CONFIG_TIVA_ADC0
  uint32_t ret = 0;
#    ifdef CONFIG_TIVA_ADC0_SSE0
  ret = irq_attach(sse00.irq, (xcpt_t)adc0_sse0_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse00.irq, ret);
      return;
    }
  up_enable_irq(sse00.irq);
#    endif
#    ifdef CONFIG_TIVA_ADC0_SSE1
  ret = irq_attach(sse01.irq, (xcpt_t)adc0_sse1_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse01.irq, ret);
      return;
    }
  up_enable_irq(sse01.irq);
#    endif
#    ifdef CONFIG_TIVA_ADC0_SSE2
  ret = irq_attach(sse02.irq, (xcpt_t)adc0_sse2_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse02.irq, ret);
      return;
    }
  up_enable_irq(sse02.irq);
#    endif
#    ifdef CONFIG_TIVA_ADC0_SSE3
  ret = irq_attach(sse03.irq, (xcpt_t)adc0_sse3_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse03.irq, ret);
      return;
    }
  up_enable_irq(sse03.irq);
#    endif
#  endif
};

static void tiva_adc1_assign_interrupts(void)
{
#  ifdef CONFIG_TIVA_ADC1
  uint32_t ret = 0;
#    ifdef CONFIG_TIVA_ADC1_SSE0
  ret = irq_attach(sse10.irq, (xcpt_t)adc1_sse0_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse10.irq, ret);
      return;
    }
  up_enable_irq(sse10.irq);
#    endif
#    ifdef CONFIG_TIVA_ADC1_SSE1
  ret = irq_attach(sse11.irq, (xcpt_t)adc1_sse1_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse11.irq, ret);
      return;
    }
  up_enable_irq(sse11.irq);
#    endif
#    ifdef CONFIG_TIVA_ADC1_SSE2
  ret = irq_attach(sse12.irq, (xcpt_t)adc1_sse2_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse12.irq, ret);
      return;
    }
  up_enable_irq(sse12.irq);
#    endif
#    ifdef CONFIG_TIVA_ADC1_SSE3
  ret = irq_attach(sse13.irq, (xcpt_t)adc1_sse3_interrupt);
  if (ret < 0)
    {
      adbg("ERROR: Failed to attach IRQ %d: %d\n", sse13.irq, ret);
      return;
    }
  up_enable_irq(sse13.irq);
#    endif
#  endif
};
#endif /* TIVA_ADC_HAVE_INTERRUPTS */

/* Sample sequencer interrupt declaration ********************************/

#ifdef TIVA_ADC_HAVE_INTERRUPTS
#  ifdef CONFIG_TIVA_ADC0
#    ifdef CONFIG_TIVA_ADC0_SSE0
static void adc0_sse0_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse00.ena == true) &&
              (adc_common.sse[SSE_IDX(0, 0)] == true));

  /* disable further  interrupts. Interrupts will be re-enabled
   * after the worker thread executes.
   */

  sse_int_state(&adc0, 0, TIVA_ADC_DISABLE);

  /* Clear interrupt status */

  sse_clear_int(&adc0, 0);

  /* Transfer processing to the worker thread.  Since interrupts are
   * disabled while the work is pending, no special action should be
   * required to protected the work queue.
   */

  DEBUGASSERT(sse00.work.worker == NULL);
  ret = work_queue(HPWORK, &sse00.work, tiva_adc_read, &sse00, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d\n", ret);
    }
}
#    endif
#    ifdef CONFIG_TIVA_ADC0_SSE1
static void adc0_sse1_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse01.ena == true) &&
              (adc_common.sse[SSE_IDX(0, 1)] == true));

  sse_int_state(&adc0, 1, TIVA_ADC_DISABLE);
  sse_clear_int(&adc0, 1);
  DEBUGASSERT(sse01.work.worker == NULL);
  ret = work_queue(HPWORK, &sse01.work, tiva_adc_read, &sse01, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n",
           ret, adc0.devno, sse01.num);
    }
}
#    endif
#    ifdef CONFIG_TIVA_ADC0_SSE2
static void adc0_sse2_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse02.ena == true) &&
              (adc_common.sse[SSE_IDX(0, 2)] == true));

  sse_int_state(&adc0, 2, TIVA_ADC_DISABLE);
  sse_clear_int(&adc0, 2);
  DEBUGASSERT(sse02.work.worker == NULL);
  ret = work_queue(HPWORK, &sse02.work, tiva_adc_read, &sse02, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n",
           ret, adc0.devno, sse02.num);
    }
}
#    endif
#    ifdef CONFIG_TIVA_ADC0_SSE3
static void adc0_sse3_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse03.ena == true) &&
              (adc_common.sse[SSE_IDX(0, 3)] == true));

  sse_int_state(&adc0, 3, TIVA_ADC_DISABLE);
  sse_clear_int(&adc0, 3);
  DEBUGASSERT(sse03.work.worker == NULL);
  ret = work_queue(HPWORK, &sse03.work, tiva_adc_read, &sse03, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n",
           ret, adc0.devno, sse03.num);
    }
}
#    endif
#  endif /* CONFIG_TIVA_ADC0 */

#  ifdef CONFIG_TIVA_ADC1
#    ifdef CONFIG_TIVA_ADC1_SSE0
static void adc1_sse0_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse10.ena == true) &&
              (adc_common.sse[SSE_IDX(1, 0)] == true));

  sse_int_state(&adc1, 0, TIVA_ADC_DISABLE);
  sse_clear_int(&adc1, 0);
  DEBUGASSERT(sse10.work.worker == NULL);
  ret = work_queue(HPWORK, &sse10.work, tiva_adc_read, &sse10, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n",
           ret, adc1.devno, sse10.num);
    }
}
#    endif
#    ifdef CONFIG_TIVA_ADC1_SSE1
static void adc1_sse1_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse11.ena == true) &&
              (adc_common.sse[SSE_IDX(1, 1)] == true));

  sse_int_state(&adc1, 1, TIVA_ADC_DISABLE);
  sse_clear_int(&adc1, 1);
  DEBUGASSERT(sse11.work.worker == NULL);
  ret = work_queue(HPWORK, &sse11.work, tiva_adc_read, &sse11, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n",
           ret, adc1.devno, sse11.num);
    }
}
#    endif
#    ifdef CONFIG_TIVA_ADC1_SSE2
static void adc1_sse2_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse12.ena == true) &&
              (adc_common.sse[SSE_IDX(1, 2)] == true));

  sse_int_state(&adc1, 2, TIVA_ADC_DISABLE);
  sse_clear_int(&adc1, 2);
  DEBUGASSERT(sse12.work.worker == NULL);
  ret = work_queue(HPWORK, &sse12.work, tiva_adc_read, &sse12, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n",
           ret, adc1.devno, sse12.num);
    }
}
#    endif
#    ifdef CONFIG_TIVA_ADC1_SSE3
static void adc1_sse3_interrupt(int irq, void *context)
{
  int ret;

  DEBUGASSERT((sse13.ena == true) &&
              (adc_common.sse[SSE_IDX(1, 3)] == true));

  sse_int_state(&adc1, 3, TIVA_ADC_DISABLE);
  sse_clear_int(&adc1, 3);
  DEBUGASSERT(sse13.work.worker == NULL);
  ret = work_queue(HPWORK, &sse13.work, tiva_adc_read, &sse13, 0);
  if (ret != 0)
    {
      adbg("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n",
           ret, adc1.devno, sse13.num);
    }
}
#    endif
#  endif /* CONFIG_TIVA_ADC1 */
#endif /* TIVA_ADC_HAVE_INTERRUPTS */

/* Channel assignment *******************************************************/

#ifdef CONFIG_TIVA_ADC0
static void tiva_adc0_assign_channels(void)
{
#  ifdef CONFIG_TIVA_ADC0_SSE0
  adc0_sse0_chn_cfg();
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE1
  adc0_sse1_chn_cfg();
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE2
  adc0_sse2_chn_cfg();
#  endif
#  ifdef CONFIG_TIVA_ADC0_SSE3
  adc0_sse3_chn_cfg();
#  endif
}
#endif

#ifdef CONFIG_TIVA_ADC1
static void tiva_adc1_assign_channels(void)
{
#  ifdef CONFIG_TIVA_ADC1_SSE0
  adc1_sse0_chn_cfg();
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE1
  adc1_sse1_chn_cfg();
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE2
  adc1_sse2_chn_cfg();
#  endif
#  ifdef CONFIG_TIVA_ADC1_SSE3
  adc1_sse3_chn_cfg();
#  endif
}
#endif

/* Channel config ***********************************************************/

#ifdef CONFIG_TIVA_ADC0
#  ifdef CONFIG_TIVA_ADC0_SSE0
static void adc0_sse0_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC0_SSE0_STEP0
#      ifdef CONFIG_TIVA_ADC0_SSE0_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP0_AIN));
  sse_register_chn(&adc0, 0, 0, CONFIG_TIVA_ADC0_SSE0_STEP0_AIN);
  sse_differential(&adc0, 0, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 0, ADC_SSTH_SHOLD_16);
#        endif
#        ifndef CONFIG_TIVA_ADC0_SSE0_STEP1
  sse_step_cfg(&adc0, 0, 0, chncfg | ADC_SSCTL_END);
#        else
  sse_step_cfg(&adc0, 0, 0, chncfg);
#        endif
#      ifdef CONFIG_TIVA_ADC0_SSE0_STEP1
#        ifdef CONFIG_TIVA_ADC0_SSE0_STEP1_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#        else
  chncfg = ADC_SSCTL_IE;
#        endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP1_AIN));
  sse_register_chn(&adc0, 0, 1, CONFIG_TIVA_ADC0_SSE0_STEP1_AIN);
  sse_differential(&adc0, 0, 1, 0);
#          if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 1, ADC_SSTH_SHOLD_16);
#          endif
#          ifndef CONFIG_TIVA_ADC0_SSE0_STEP2
  sse_step_cfg(&adc0, 0, 1, chncfg | ADC_SSCTL_END);
#          else
  sse_step_cfg(&adc0, 0, 1, chncfg);
#          endif
#        ifdef CONFIG_TIVA_ADC0_SSE0_STEP2
#          ifdef CONFIG_TIVA_ADC0_SSE0_STEP2_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#          else
  chncfg = ADC_SSCTL_IE;
#          endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP2_AIN));
  sse_register_chn(&adc0, 0, 2, CONFIG_TIVA_ADC0_SSE0_STEP2_AIN);
  sse_differential(&adc0, 0, 2, 0);
#            if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 2, ADC_SSTH_SHOLD_16);
#            endif
#            ifndef CONFIG_TIVA_ADC0_SSE0_STEP3
  sse_step_cfg(&adc0, 0, 2, chncfg | ADC_SSCTL_END);
#            else
  sse_step_cfg(&adc0, 0, 2, chncfg);
#            endif
#          ifdef CONFIG_TIVA_ADC0_SSE0_STEP3
#            ifdef CONFIG_TIVA_ADC0_SSE0_STEP3_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#            else
  chncfg = ADC_SSCTL_IE;
#            endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP3_AIN));
  sse_register_chn(&adc0, 0, 3, CONFIG_TIVA_ADC0_SSE0_STEP3_AIN);
  sse_differential(&adc0, 0, 3, 0);
#              if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 3, ADC_SSTH_SHOLD_16);
#              endif
#              ifndef CONFIG_TIVA_ADC0_SSE0_STEP4
  sse_step_cfg(&adc0, 0, 3, chncfg | ADC_SSCTL_END);
#              else
  sse_step_cfg(&adc0, 0, 3, chncfg);
#              endif
#            ifdef CONFIG_TIVA_ADC0_SSE0_STEP4
#              ifdef CONFIG_TIVA_ADC0_SSE0_STEP4_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#              else
  chncfg = ADC_SSCTL_IE;
#              endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP4_AIN));
  sse_register_chn(&adc0, 0, 4, CONFIG_TIVA_ADC0_SSE0_STEP4_AIN);
  sse_differential(&adc0, 0, 4, 0);
#                if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 4, ADC_SSTH_SHOLD_16);
#                endif
#                ifndef CONFIG_TIVA_ADC0_SSE0_STEP5
  sse_step_cfg(&adc0, 0, 4, chncfg | ADC_SSCTL_END);
#                else
  sse_step_cfg(&adc0, 0, 4, chncfg);
#                endif
#              ifdef CONFIG_TIVA_ADC0_SSE0_STEP5
#                ifdef CONFIG_TIVA_ADC0_SSE0_STEP5_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#                else
  chncfg = ADC_SSCTL_IE;
#                endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP5_AIN));
  sse_register_chn(&adc0, 0, 5, CONFIG_TIVA_ADC0_SSE0_STEP5_AIN);
  sse_differential(&adc0, 0, 5, 0);
#                  if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 5, ADC_SSTH_SHOLD_16);
#                  endif
#                  ifndef CONFIG_TIVA_ADC0_SSE0_STEP6
  sse_step_cfg(&adc0, 0, 5, chncfg | ADC_SSCTL_END);
#                  else
  sse_step_cfg(&adc0, 0, 5, chncfg);
#                  endif
#                ifdef CONFIG_TIVA_ADC0_SSE0_STEP6
#                  ifdef CONFIG_TIVA_ADC0_SSE0_STEP6_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#                  else
  chncfg = ADC_SSCTL_IE;
#                  endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP6_AIN));
  sse_register_chn(&adc0, 0, 6, CONFIG_TIVA_ADC0_SSE0_STEP6_AIN);
  sse_differential(&adc0, 0, 6, 0);
#                    if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 6, ADC_SSTH_SHOLD_16);
#                    endif
#                    ifndef CONFIG_TIVA_ADC0_SSE0_STEP7
  sse_step_cfg(&adc0, 0, 6, chncfg | ADC_SSCTL_END);
#                    else
  sse_step_cfg(&adc0, 0, 6, chncfg);
#                    endif
#                  ifdef CONFIG_TIVA_ADC0_SSE0_STEP7
#                    ifdef CONFIG_TIVA_ADC0_SSE0_STEP7_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#                    else
  chncfg = ADC_SSCTL_IE;
#                    endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE0_STEP7_AIN));
  sse_register_chn(&adc0, 0, 7, CONFIG_TIVA_ADC0_SSE0_STEP7_AIN);
  sse_differential(&adc0, 0, 7, 0);
#                      if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 0, 7, ADC_SSTH_SHOLD_16);
#                      endif
  sse_step_cfg(&adc0, 0, 7, chncfg | ADC_SSCTL_END);
#                  endif /* CONFIG_TIVA_ADC0_SSE0_STEP7 */
#                endif /* CONFIG_TIVA_ADC0_SSE0_STEP6 */
#              endif /* CONFIG_TIVA_ADC0_SSE0_STEP5 */
#            endif /* CONFIG_TIVA_ADC0_SSE0_STEP4 */
#          endif /* CONFIG_TIVA_ADC0_SSE0_STEP3 */
#        endif /* CONFIG_TIVA_ADC0_SSE0_STEP2 */
#      endif /* CONFIG_TIVA_ADC0_SSE0_STEP1 */
#    endif /* CONFIG_TIVA_ADC0_SSE0_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC0_SSE0 */

#  ifdef CONFIG_TIVA_ADC0_SSE1
static void adc0_sse1_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC0_SSE1_STEP0
#      ifdef CONFIG_TIVA_ADC0_SSE1_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE1_STEP0_AIN));
  sse_register_chn(&adc0, 1, 0, CONFIG_TIVA_ADC0_SSE1_STEP0_AIN);
  sse_differential(&adc0, 1, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 1, 0, ADC_SSTH_SHOLD_16);
#        endif
#        ifndef CONFIG_TIVA_ADC0_SSE1_STEP1
  sse_step_cfg(&adc0, 1, 0, chncfg | ADC_SSCTL_END);
#        else
  sse_step_cfg(&adc0, 1, 0, chncfg);
#        endif
#      ifdef CONFIG_TIVA_ADC0_SSE1_STEP1
#        ifdef CONFIG_TIVA_ADC0_SSE1_STEP1_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#        else
  chncfg = ADC_SSCTL_IE;
#        endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE1_STEP1_AIN));
  sse_register_chn(&adc0, 1, 1, CONFIG_TIVA_ADC0_SSE1_STEP1_AIN);
  sse_differential(&adc0, 1, 1, 0);
#          if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 1, 1, ADC_SSTH_SHOLD_16);
#          endif
#          ifndef CONFIG_TIVA_ADC0_SSE1_STEP2
  sse_step_cfg(&adc0, 1, 1, chncfg | ADC_SSCTL_END);
#          else
  sse_step_cfg(&adc0, 1, 1, chncfg);
#          endif
#        ifdef CONFIG_TIVA_ADC0_SSE1_STEP2
#          ifdef CONFIG_TIVA_ADC0_SSE1_STEP2_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#          else
  chncfg = ADC_SSCTL_IE;
#          endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE1_STEP2_AIN));
  sse_register_chn(&adc0, 1, 2, CONFIG_TIVA_ADC0_SSE1_STEP2_AIN);
  sse_differential(&adc0, 1, 2, 0);
#            if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 1, 2, ADC_SSTH_SHOLD_16);
#            endif
#            ifndef CONFIG_TIVA_ADC0_SSE1_STEP3
  sse_step_cfg(&adc0, 1, 2, chncfg | ADC_SSCTL_END);
#            else
  sse_step_cfg(&adc0, 1, 2, chncfg);
#            endif
#          ifdef CONFIG_TIVA_ADC0_SSE1_STEP3
#            ifdef CONFIG_TIVA_ADC0_SSE1_STEP3_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#            else
  chncfg = ADC_SSCTL_IE;
#            endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE1_STEP3_AIN));
  sse_register_chn(&adc0, 1, 3, CONFIG_TIVA_ADC0_SSE1_STEP3_AIN);
  sse_differential(&adc0, 1, 3, 0);
#              if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 1, 3, ADC_SSTH_SHOLD_16);
#              endif
  sse_step_cfg(&adc0, 1, 3, chncfg | ADC_SSCTL_END);
#          endif /* CONFIG_TIVA_ADC0_SSE1_STEP3 */
#        endif /* CONFIG_TIVA_ADC0_SSE1_STEP2 */
#      endif /* CONFIG_TIVA_ADC0_SSE1_STEP1 */
#    endif /* CONFIG_TIVA_ADC0_SSE1_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC0_SSE1 */

#  ifdef CONFIG_TIVA_ADC0_SSE2
static void adc0_sse2_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC0_SSE2_STEP0
#      ifdef CONFIG_TIVA_ADC0_SSE2_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE2_STEP0_AIN));
  sse_register_chn(&adc0, 2, 0, CONFIG_TIVA_ADC0_SSE2_STEP0_AIN);
  sse_differential(&adc0, 2, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 2, 0, ADC_SSTH_SHOLD_16);
#        endif
#        ifndef CONFIG_TIVA_ADC0_SSE2_STEP1
  sse_step_cfg(&adc0, 2, 0, chncfg | ADC_SSCTL_END);
#        else
  sse_step_cfg(&adc0, 2, 0, chncfg);
#        endif
#      ifdef CONFIG_TIVA_ADC0_SSE2_STEP1
#        ifdef CONFIG_TIVA_ADC0_SSE2_STEP1_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#        else
  chncfg = ADC_SSCTL_IE;
#        endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE2_STEP1_AIN));
  sse_register_chn(&adc0, 2, 1, CONFIG_TIVA_ADC0_SSE2_STEP1_AIN);
  sse_differential(&adc0, 2, 1, 0);
#          if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 2, 1, ADC_SSTH_SHOLD_16);
#          endif
#          ifndef CONFIG_TIVA_ADC0_SSE2_STEP2
  sse_step_cfg(&adc0, 2, 1, chncfg | ADC_SSCTL_END);
#          else
  sse_step_cfg(&adc0, 2, 1, chncfg);
#          endif
#        ifdef CONFIG_TIVA_ADC0_SSE2_STEP2
#          ifdef CONFIG_TIVA_ADC0_SSE2_STEP2_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#          else
  chncfg = ADC_SSCTL_IE;
#          endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE2_STEP2_AIN));
  sse_register_chn(&adc0, 2, 2, CONFIG_TIVA_ADC0_SSE2_STEP2_AIN);
  sse_differential(&adc0, 2, 2, 0);
#            if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 2, 2, ADC_SSTH_SHOLD_16);
#            endif
#            ifndef CONFIG_TIVA_ADC0_SSE2_STEP3
  sse_step_cfg(&adc0, 2, 2, chncfg | ADC_SSCTL_END);
#            else
  sse_step_cfg(&adc0, 2, 2, chncfg);
#            endif
#          ifdef CONFIG_TIVA_ADC0_SSE2_STEP3
#            ifdef CONFIG_TIVA_ADC0_SSE2_STEP3_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#            else
  chncfg = ADC_SSCTL_IE;
#            endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE2_STEP3_AIN));
  sse_register_chn(&adc0, 2, 3, CONFIG_TIVA_ADC0_SSE2_STEP3_AIN);
  sse_differential(&adc0, 2, 3, 0);
#              if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 2, 3, ADC_SSTH_SHOLD_16);
#              endif
  sse_step_cfg(&adc0, 2, 3, chncfg | ADC_SSCTL_END);
#          endif /* CONFIG_TIVA_ADC0_SSE2_STEP3 */
#        endif /* CONFIG_TIVA_ADC0_SSE2_STEP2 */
#      endif /* CONFIG_TIVA_ADC0_SSE2_STEP1 */
#    endif /* CONFIG_TIVA_ADC0_SSE2_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC0_SSE2 */

#  ifdef CONFIG_TIVA_ADC0_SSE3
static void adc0_sse3_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC0_SSE3_STEP0
#      ifdef CONFIG_TIVA_ADC0_SSE3_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC0_SSE3_STEP0_AIN));
  sse_register_chn(&adc0, 3, 0, CONFIG_TIVA_ADC0_SSE3_STEP0_AIN);
  sse_differential(&adc0, 3, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC0_SSE3_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc0, 3, 0, ADC_SSTH_SHOLD_16);
#        endif
  sse_step_cfg(&adc0, 3, 0, chncfg | ADC_SSCTL_END);
#    endif /* CONFIG_TIVA_ADC0_SSE3_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC0_SSE3 */
#endif /* CONFIG_TIVA_ADC0 */

#ifdef CONFIG_TIVA_ADC1
#  ifdef CONFIG_TIVA_ADC1_SSE0
static void adc1_sse0_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC1_SSE0_STEP0
#      ifdef CONFIG_TIVA_ADC1_SSE0_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP0_AIN));
  sse_register_chn(&adc1, 0, 0, CONFIG_TIVA_ADC1_SSE0_STEP0_AIN);
  sse_differential(&adc1, 0, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 0, ADC_SSTH_SHOLD_16);
#        endif
#        ifndef CONFIG_TIVA_ADC1_SSE0_STEP1
  sse_step_cfg(&adc1, 0, 0, chncfg | ADC_SSCTL_END);
#        else
  sse_step_cfg(&adc1, 0, 0, chncfg);
#        endif
#      ifdef CONFIG_TIVA_ADC1_SSE0_STEP1
#        ifdef CONFIG_TIVA_ADC1_SSE0_STEP1_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#        else
  chncfg = ADC_SSCTL_IE;
#        endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP1_AIN));
  sse_register_chn(&adc1, 0, 1, CONFIG_TIVA_ADC1_SSE0_STEP1_AIN);
  sse_differential(&adc1, 0, 1, 0);
#          if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 1, ADC_SSTH_SHOLD_16);
#          endif
#          ifndef CONFIG_TIVA_ADC1_SSE0_STEP2
  sse_step_cfg(&adc1, 0, 1, chncfg | ADC_SSCTL_END);
#          else
  sse_step_cfg(&adc1, 0, 1, chncfg);
#          endif
#        ifdef CONFIG_TIVA_ADC1_SSE0_STEP2
#          ifdef CONFIG_TIVA_ADC1_SSE0_STEP2_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#          else
  chncfg = ADC_SSCTL_IE;
#          endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP2_AIN));
  sse_register_chn(&adc1, 0, 2, CONFIG_TIVA_ADC1_SSE0_STEP2_AIN);
  sse_differential(&adc1, 0, 2, 0);
#            if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 2, ADC_SSTH_SHOLD_16);
#            endif
#            ifndef CONFIG_TIVA_ADC1_SSE0_STEP3
  sse_step_cfg(&adc1, 0, 2, chncfg | ADC_SSCTL_END);
#            else
  sse_step_cfg(&adc1, 0, 2, chncfg);
#            endif
#          ifdef CONFIG_TIVA_ADC1_SSE0_STEP3
#            ifdef CONFIG_TIVA_ADC1_SSE0_STEP3_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#            else
  chncfg = ADC_SSCTL_IE;
#            endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP3_AIN));
  sse_register_chn(&adc1, 0, 3, CONFIG_TIVA_ADC1_SSE0_STEP3_AIN);
  sse_differential(&adc1, 0, 3, 0);
#              if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 3, ADC_SSTH_SHOLD_16);
#              endif
#              ifndef CONFIG_TIVA_ADC1_SSE0_STEP4
  sse_step_cfg(&adc1, 0, 3, chncfg | ADC_SSCTL_END);
#              else
  sse_step_cfg(&adc1, 0, 3, chncfg);
#              endif
#            ifdef CONFIG_TIVA_ADC1_SSE0_STEP4
#              ifdef CONFIG_TIVA_ADC1_SSE0_STEP4_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#              else
  chncfg = ADC_SSCTL_IE;
#              endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP4_AIN));
  sse_register_chn(&adc1, 0, 4, CONFIG_TIVA_ADC1_SSE0_STEP4_AIN);
  sse_differential(&adc1, 0, 4, 0);
#                if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 4, ADC_SSTH_SHOLD_16);
#                endif
#                ifndef CONFIG_TIVA_ADC1_SSE0_STEP5
  sse_step_cfg(&adc1, 0, 4, chncfg | ADC_SSCTL_END);
#                else
  sse_step_cfg(&adc1, 0, 4, chncfg);
#                endif
#              ifdef CONFIG_TIVA_ADC1_SSE0_STEP5
#                ifdef CONFIG_TIVA_ADC1_SSE0_STEP5_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#                else
  chncfg = ADC_SSCTL_IE;
#                endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP5_AIN));
  sse_register_chn(&adc1, 0, 5, CONFIG_TIVA_ADC1_SSE0_STEP5_AIN);
  sse_differential(&adc1, 0, 5, 0);
#                  if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 5, ADC_SSTH_SHOLD_16);
#                  endif
#                  ifndef CONFIG_TIVA_ADC1_SSE0_STEP6
  sse_step_cfg(&adc1, 0, 5, chncfg | ADC_SSCTL_END);
#                  else
  sse_step_cfg(&adc1, 0, 5, chncfg);
#                  endif
#                ifdef CONFIG_TIVA_ADC1_SSE0_STEP6
#                  ifdef CONFIG_TIVA_ADC1_SSE0_STEP6_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#                  else
  chncfg = ADC_SSCTL_IE;
#                  endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP6_AIN));
  sse_register_chn(&adc1, 0, 6, CONFIG_TIVA_ADC1_SSE0_STEP6_AIN);
  sse_differential(&adc1, 0, 6, 0);
#                    if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 6, ADC_SSTH_SHOLD_16);
#                    endif
#                    ifndef CONFIG_TIVA_ADC1_SSE0_STEP7
  sse_step_cfg(&adc1, 0, 6, chncfg | ADC_SSCTL_END);
#                    else
  sse_step_cfg(&adc1, 0, 6, chncfg);
#                    endif
#                  ifdef CONFIG_TIVA_ADC1_SSE0_STEP7
#                    ifdef CONFIG_TIVA_ADC1_SSE0_STEP7_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#                    else
  chncfg = ADC_SSCTL_IE;
#                    endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE0_STEP7_AIN));
  sse_register_chn(&adc1, 0, 7, CONFIG_TIVA_ADC1_SSE0_STEP7_AIN);
  sse_differential(&adc1, 0, 7, 0);
#                      if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE0_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 0, 7, ADC_SSTH_SHOLD_16);
#                      endif
  sse_step_cfg(&adc1, 0, 7, chncfg | ADC_SSCTL_END);
#                  endif /* CONFIG_TIVA_ADC1_SSE0_STEP7 */
#                endif /* CONFIG_TIVA_ADC1_SSE0_STEP6 */
#              endif /* CONFIG_TIVA_ADC1_SSE0_STEP5 */
#            endif /* CONFIG_TIVA_ADC1_SSE0_STEP4 */
#          endif /* CONFIG_TIVA_ADC1_SSE0_STEP3 */
#        endif /* CONFIG_TIVA_ADC1_SSE0_STEP2 */
#      endif /* CONFIG_TIVA_ADC1_SSE0_STEP1 */
#    endif /* CONFIG_TIVA_ADC1_SSE0_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC1_SSE0 */

#  ifdef CONFIG_TIVA_ADC1_SSE1
static void adc1_sse1_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC1_SSE1_STEP0
#      ifdef CONFIG_TIVA_ADC1_SSE1_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE1_STEP0_AIN));
  sse_register_chn(&adc1, 1, 0, CONFIG_TIVA_ADC1_SSE1_STEP0_AIN);
  sse_differential(&adc1, 1, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 1, 0, ADC_SSTH_SHOLD_16);
#        endif
#        ifndef CONFIG_TIVA_ADC1_SSE1_STEP1
  sse_step_cfg(&adc1, 1, 0, chncfg | ADC_SSCTL_END);
#        else
  sse_step_cfg(&adc1, 1, 0, chncfg);
#        endif
#      ifdef CONFIG_TIVA_ADC1_SSE1_STEP1
#        ifdef CONFIG_TIVA_ADC1_SSE1_STEP1_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#        else
  chncfg = ADC_SSCTL_IE;
#        endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE1_STEP1_AIN));
  sse_register_chn(&adc1, 1, 1, CONFIG_TIVA_ADC1_SSE1_STEP1_AIN);
  sse_differential(&adc1, 1, 1, 0);
#          if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 1, 1, ADC_SSTH_SHOLD_16);
#          endif
#          ifndef CONFIG_TIVA_ADC1_SSE1_STEP2
  sse_step_cfg(&adc1, 1, 1, chncfg | ADC_SSCTL_END);
#          else
  sse_step_cfg(&adc1, 1, 1, chncfg);
#          endif
#        ifdef CONFIG_TIVA_ADC1_SSE1_STEP2
#          ifdef CONFIG_TIVA_ADC1_SSE1_STEP2_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#          else
  chncfg = ADC_SSCTL_IE;
#          endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE1_STEP2_AIN));
  sse_register_chn(&adc1, 1, 2, CONFIG_TIVA_ADC1_SSE1_STEP2_AIN);
  sse_differential(&adc1, 1, 2, 0);
#            if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 1, 2, ADC_SSTH_SHOLD_16);
#            endif
#            ifndef CONFIG_TIVA_ADC1_SSE1_STEP3
  sse_step_cfg(&adc1, 1, 2, chncfg | ADC_SSCTL_END);
#            else
  sse_step_cfg(&adc1, 1, 2, chncfg);
#            endif
#          ifdef CONFIG_TIVA_ADC1_SSE1_STEP3
#            ifdef CONFIG_TIVA_ADC1_SSE1_STEP3_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#            else
  chncfg = ADC_SSCTL_IE;
#            endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE1_STEP3_AIN));
  sse_register_chn(&adc1, 1, 3, CONFIG_TIVA_ADC1_SSE1_STEP3_AIN);
  sse_differential(&adc1, 1, 3, 0);
#              if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE1_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 1, 3, ADC_SSTH_SHOLD_16);
#              endif
  sse_step_cfg(&adc1, 1, 3, chncfg | ADC_SSCTL_END);
#          endif /* CONFIG_TIVA_ADC1_SSE1_STEP3 */
#        endif /* CONFIG_TIVA_ADC1_SSE1_STEP2 */
#      endif /* CONFIG_TIVA_ADC1_SSE1_STEP1 */
#    endif /* CONFIG_TIVA_ADC1_SSE1_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC1_SSE1 */

#  ifdef CONFIG_TIVA_ADC1_SSE2
static void adc1_sse2_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC1_SSE2_STEP0
#      ifdef CONFIG_TIVA_ADC1_SSE2_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE2_STEP0_AIN));
  sse_register_chn(&adc1, 2, 0, CONFIG_TIVA_ADC1_SSE2_STEP0_AIN);
  sse_differential(&adc1, 2, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 2, 0, ADC_SSTH_SHOLD_16);
#        endif
#        ifndef CONFIG_TIVA_ADC1_SSE2_STEP1
  sse_step_cfg(&adc1, 2, 0, chncfg | ADC_SSCTL_END);
#        else
  sse_step_cfg(&adc1, 2, 0, chncfg);
#        endif
#      ifdef CONFIG_TIVA_ADC1_SSE2_STEP1
#        ifdef CONFIG_TIVA_ADC1_SSE2_STEP1_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#        else
  chncfg = ADC_SSCTL_IE;
#        endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE2_STEP1_AIN));
  sse_register_chn(&adc1, 2, 1, CONFIG_TIVA_ADC1_SSE2_STEP1_AIN);
  sse_differential(&adc1, 2, 1, 0);
#          if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 2, 1, ADC_SSTH_SHOLD_16);
#          endif
#          ifndef CONFIG_TIVA_ADC1_SSE2_STEP2
  sse_step_cfg(&adc1, 2, 1, chncfg | ADC_SSCTL_END);
#          else
  sse_step_cfg(&adc1, 2, 1, chncfg);
#          endif
#        ifdef CONFIG_TIVA_ADC1_SSE2_STEP2
#          ifdef CONFIG_TIVA_ADC1_SSE2_STEP2_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#          else
  chncfg = ADC_SSCTL_IE;
#          endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE2_STEP2_AIN));
  sse_register_chn(&adc1, 2, 2, CONFIG_TIVA_ADC1_SSE2_STEP2_AIN);
  sse_differential(&adc1, 2, 2, 0);
#            if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 2, 2, ADC_SSTH_SHOLD_16);
#            endif
#            ifndef CONFIG_TIVA_ADC1_SSE2_STEP3
  sse_step_cfg(&adc1, 2, 2, chncfg | ADC_SSCTL_END);
#            else
  sse_step_cfg(&adc1, 2, 2, chncfg);
#            endif
#          ifdef CONFIG_TIVA_ADC1_SSE2_STEP3
#            ifdef CONFIG_TIVA_ADC1_SSE2_STEP3_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#            else
  chncfg = ADC_SSCTL_IE;
#            endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE2_STEP3_AIN));
  sse_register_chn(&adc1, 2, 3, CONFIG_TIVA_ADC1_SSE2_STEP3_AIN);
  sse_differential(&adc1, 2, 3, 0);
#              if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE2_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 2, 3, ADC_SSTH_SHOLD_16);
#              endif
  sse_step_cfg(&adc1, 2, 3, chncfg | ADC_SSCTL_END);
#          endif /* CONFIG_TIVA_ADC1_SSE2_STEP3 */
#        endif /* CONFIG_TIVA_ADC1_SSE2_STEP2 */
#      endif /* CONFIG_TIVA_ADC1_SSE2_STEP1 */
#    endif /* CONFIG_TIVA_ADC1_SSE2_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC1_SSE2 */

#  ifdef CONFIG_TIVA_ADC1_SSE3
static void adc1_sse3_chn_cfg(void)
{
  uint32_t chncfg = 0;
#    ifdef CONFIG_TIVA_ADC1_SSE3_STEP0
#      ifdef CONFIG_TIVA_ADC1_SSE3_STEP0_TS
  chncfg = ADC_SSCTL_IE | ADC_SSCTL_TS;
#      else
  chncfg = ADC_SSCTL_IE;
#      endif
  tiva_configgpio(TIVA_ADC_PIN(CONFIG_TIVA_ADC1_SSE3_STEP0_AIN));
  sse_register_chn(&adc1, 3, 0, CONFIG_TIVA_ADC1_SSE3_STEP0_AIN);
  sse_differential(&adc1, 3, 0, 0);
#        if defined (CONFIG_ARCH_CHIP_TM4C129) && (CONFIG_TIVA_ADC1_SSE3_TRIGGER == ADC_EMUX_PROC)
  sse_sample_hold_time(&adc1, 3, 0, ADC_SSTH_SHOLD_16);
#        endif
  sse_step_cfg(&adc1, 3, 0, chncfg | ADC_SSCTL_END);
#    endif /* CONFIG_TIVA_ADC1_SSE3_STEP0 */
}
#  endif /* CONFIG_TIVA_ADC1_SSE3 */
#endif /* CONFIG_TIVA_ADC1 */

#endif /* CONFIG_TIVA_ADC0 | CONFIG_TIVA_ADC1 */