text: /* Copyright (c) 2012, The Linux Foundation. All rights reserved.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 and
   * only version 2 as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   */
  
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
  #include <linux/kernel.h>
  #include <linux/types.h>
  #include <linux/bug.h>
  #include <asm/hardware/cp14.h>
  
  #include "coresight-etm.h"
  
  int etm_readl_cp14(u32 reg, unsigned int *val)
  {
  	switch (reg) {
  	case ETMCR:
  		*val = etm_read(ETMCR);
  		return 0;
  	case ETMCCR:
  		*val = etm_read(ETMCCR);
  		return 0;
  	case ETMTRIGGER:
  		*val = etm_read(ETMTRIGGER);
  		return 0;
  	case ETMSR:
  		*val = etm_read(ETMSR);
  		return 0;
  	case ETMSCR:
  		*val = etm_read(ETMSCR);
  		return 0;
  	case ETMTSSCR:
  		*val = etm_read(ETMTSSCR);
  		return 0;
  	case ETMTEEVR:
  		*val = etm_read(ETMTEEVR);
  		return 0;
  	case ETMTECR1:
  		*val = etm_read(ETMTECR1);
  		return 0;
  	case ETMFFLR:
  		*val = etm_read(ETMFFLR);
  		return 0;
  	case ETMACVRn(0):
  		*val = etm_read(ETMACVR0);
  		return 0;
  	case ETMACVRn(1):
  		*val = etm_read(ETMACVR1);
  		return 0;
  	case ETMACVRn(2):
  		*val = etm_read(ETMACVR2);
  		return 0;
  	case ETMACVRn(3):
  		*val = etm_read(ETMACVR3);
  		return 0;
  	case ETMACVRn(4):
  		*val = etm_read(ETMACVR4);
  		return 0;
  	case ETMACVRn(5):
  		*val = etm_read(ETMACVR5);
  		return 0;
  	case ETMACVRn(6):
  		*val = etm_read(ETMACVR6);
  		return 0;
  	case ETMACVRn(7):
  		*val = etm_read(ETMACVR7);
  		return 0;
  	case ETMACVRn(8):
  		*val = etm_read(ETMACVR8);
  		return 0;
  	case ETMACVRn(9):
  		*val = etm_read(ETMACVR9);
  		return 0;
  	case ETMACVRn(10):
  		*val = etm_read(ETMACVR10);
  		return 0;
  	case ETMACVRn(11):
  		*val = etm_read(ETMACVR11);
  		return 0;
  	case ETMACVRn(12):
  		*val = etm_read(ETMACVR12);
  		return 0;
  	case ETMACVRn(13):
  		*val = etm_read(ETMACVR13);
  		return 0;
  	case ETMACVRn(14):
  		*val = etm_read(ETMACVR14);
  		return 0;
  	case ETMACVRn(15):
  		*val = etm_read(ETMACVR15);
  		return 0;
  	case ETMACTRn(0):
  		*val = etm_read(ETMACTR0);
  		return 0;
  	case ETMACTRn(1):
  		*val = etm_read(ETMACTR1);
  		return 0;
  	case ETMACTRn(2):
  		*val = etm_read(ETMACTR2);
  		return 0;
  	case ETMACTRn(3):
  		*val = etm_read(ETMACTR3);
  		return 0;
  	case ETMACTRn(4):
  		*val = etm_read(ETMACTR4);
  		return 0;
  	case ETMACTRn(5):
  		*val = etm_read(ETMACTR5);
  		return 0;
  	case ETMACTRn(6):
  		*val = etm_read(ETMACTR6);
  		return 0;
  	case ETMACTRn(7):
  		*val = etm_read(ETMACTR7);
  		return 0;
  	case ETMACTRn(8):
  		*val = etm_read(ETMACTR8);
  		return 0;
  	case ETMACTRn(9):
  		*val = etm_read(ETMACTR9);
  		return 0;
  	case ETMACTRn(10):
  		*val = etm_read(ETMACTR10);
  		return 0;
  	case ETMACTRn(11):
  		*val = etm_read(ETMACTR11);
  		return 0;
  	case ETMACTRn(12):
  		*val = etm_read(ETMACTR12);
  		return 0;
  	case ETMACTRn(13):
  		*val = etm_read(ETMACTR13);
  		return 0;
  	case ETMACTRn(14):
  		*val = etm_read(ETMACTR14);
  		return 0;
  	case ETMACTRn(15):
  		*val = etm_read(ETMACTR15);
  		return 0;
  	case ETMCNTRLDVRn(0):
  		*val = etm_read(ETMCNTRLDVR0);
  		return 0;
  	case ETMCNTRLDVRn(1):
  		*val = etm_read(ETMCNTRLDVR1);
  		return 0;
  	case ETMCNTRLDVRn(2):
  		*val = etm_read(ETMCNTRLDVR2);
  		return 0;
  	case ETMCNTRLDVRn(3):
  		*val = etm_read(ETMCNTRLDVR3);
  		return 0;
  	case ETMCNTENRn(0):
  		*val = etm_read(ETMCNTENR0);
  		return 0;
  	case ETMCNTENRn(1):
  		*val = etm_read(ETMCNTENR1);
  		return 0;
  	case ETMCNTENRn(2):
  		*val = etm_read(ETMCNTENR2);
  		return 0;
  	case ETMCNTENRn(3):
  		*val = etm_read(ETMCNTENR3);
  		return 0;
  	case ETMCNTRLDEVRn(0):
  		*val = etm_read(ETMCNTRLDEVR0);
  		return 0;
  	case ETMCNTRLDEVRn(1):
  		*val = etm_read(ETMCNTRLDEVR1);
  		return 0;
  	case ETMCNTRLDEVRn(2):
  		*val = etm_read(ETMCNTRLDEVR2);
  		return 0;
  	case ETMCNTRLDEVRn(3):
  		*val = etm_read(ETMCNTRLDEVR3);
  		return 0;
  	case ETMCNTVRn(0):
  		*val = etm_read(ETMCNTVR0);
  		return 0;
  	case ETMCNTVRn(1):
  		*val = etm_read(ETMCNTVR1);
  		return 0;
  	case ETMCNTVRn(2):
  		*val = etm_read(ETMCNTVR2);
  		return 0;
  	case ETMCNTVRn(3):
  		*val = etm_read(ETMCNTVR3);
  		return 0;
  	case ETMSQ12EVR:
  		*val = etm_read(ETMSQ12EVR);
  		return 0;
  	case ETMSQ21EVR:
  		*val = etm_read(ETMSQ21EVR);
  		return 0;
  	case ETMSQ23EVR:
  		*val = etm_read(ETMSQ23EVR);
  		return 0;
  	case ETMSQ31EVR:
  		*val = etm_read(ETMSQ31EVR);
  		return 0;
  	case ETMSQ32EVR:
  		*val = etm_read(ETMSQ32EVR);
  		return 0;
  	case ETMSQ13EVR:
  		*val = etm_read(ETMSQ13EVR);
  		return 0;
  	case ETMSQR:
  		*val = etm_read(ETMSQR);
  		return 0;
  	case ETMEXTOUTEVRn(0):
  		*val = etm_read(ETMEXTOUTEVR0);
  		return 0;
  	case ETMEXTOUTEVRn(1):
  		*val = etm_read(ETMEXTOUTEVR1);
  		return 0;
  	case ETMEXTOUTEVRn(2):
  		*val = etm_read(ETMEXTOUTEVR2);
  		return 0;
  	case ETMEXTOUTEVRn(3):
  		*val = etm_read(ETMEXTOUTEVR3);
  		return 0;
  	case ETMCIDCVRn(0):
  		*val = etm_read(ETMCIDCVR0);
  		return 0;
  	case ETMCIDCVRn(1):
  		*val = etm_read(ETMCIDCVR1);
  		return 0;
  	case ETMCIDCVRn(2):
  		*val = etm_read(ETMCIDCVR2);
  		return 0;
  	case ETMCIDCMR:
  		*val = etm_read(ETMCIDCMR);
  		return 0;
  	case ETMIMPSPEC0:
  		*val = etm_read(ETMIMPSPEC0);
  		return 0;
  	case ETMIMPSPEC1:
  		*val = etm_read(ETMIMPSPEC1);
  		return 0;
  	case ETMIMPSPEC2:
  		*val = etm_read(ETMIMPSPEC2);
  		return 0;
  	case ETMIMPSPEC3:
  		*val = etm_read(ETMIMPSPEC3);
  		return 0;
  	case ETMIMPSPEC4:
  		*val = etm_read(ETMIMPSPEC4);
  		return 0;
  	case ETMIMPSPEC5:
  		*val = etm_read(ETMIMPSPEC5);
  		return 0;
  	case ETMIMPSPEC6:
  		*val = etm_read(ETMIMPSPEC6);
  		return 0;
  	case ETMIMPSPEC7:
  		*val = etm_read(ETMIMPSPEC7);
  		return 0;
  	case ETMSYNCFR:
  		*val = etm_read(ETMSYNCFR);
  		return 0;
  	case ETMIDR:
  		*val = etm_read(ETMIDR);
  		return 0;
  	case ETMCCER:
  		*val = etm_read(ETMCCER);
  		return 0;
  	case ETMEXTINSELR:
  		*val = etm_read(ETMEXTINSELR);
  		return 0;
  	case ETMTESSEICR:
  		*val = etm_read(ETMTESSEICR);
  		return 0;
  	case ETMEIBCR:
  		*val = etm_read(ETMEIBCR);
  		return 0;
  	case ETMTSEVR:
  		*val = etm_read(ETMTSEVR);
  		return 0;
  	case ETMAUXCR:
  		*val = etm_read(ETMAUXCR);
  		return 0;
  	case ETMTRACEIDR:
  		*val = etm_read(ETMTRACEIDR);
  		return 0;
  	case ETMVMIDCVR:
  		*val = etm_read(ETMVMIDCVR);
  		return 0;
  	case ETMOSLSR:
  		*val = etm_read(ETMOSLSR);
  		return 0;
  	case ETMOSSRR:
  		*val = etm_read(ETMOSSRR);
  		return 0;
  	case ETMPDCR:
  		*val = etm_read(ETMPDCR);
  		return 0;
  	case ETMPDSR:
  		*val = etm_read(ETMPDSR);
  		return 0;
  	default:
  		*val = 0;
  		return -EINVAL;
  	}
  }
  
  int etm_writel_cp14(u32 reg, u32 val)
  {
  	switch (reg) {
  	case ETMCR:
  		etm_write(val, ETMCR);
  		break;
  	case ETMTRIGGER:
  		etm_write(val, ETMTRIGGER);
  		break;
  	case ETMSR:
  		etm_write(val, ETMSR);
  		break;
  	case ETMTSSCR:
  		etm_write(val, ETMTSSCR);
  		break;
  	case ETMTEEVR:
  		etm_write(val, ETMTEEVR);
  		break;
  	case ETMTECR1:
  		etm_write(val, ETMTECR1);
  		break;
  	case ETMFFLR:
  		etm_write(val, ETMFFLR);
  		break;
  	case ETMACVRn(0):
  		etm_write(val, ETMACVR0);
  		break;
  	case ETMACVRn(1):
  		etm_write(val, ETMACVR1);
  		break;
  	case ETMACVRn(2):
  		etm_write(val, ETMACVR2);
  		break;
  	case ETMACVRn(3):
  		etm_write(val, ETMACVR3);
  		break;
  	case ETMACVRn(4):
  		etm_write(val, ETMACVR4);
  		break;
  	case ETMACVRn(5):
  		etm_write(val, ETMACVR5);
  		break;
  	case ETMACVRn(6):
  		etm_write(val, ETMACVR6);
  		break;
  	case ETMACVRn(7):
  		etm_write(val, ETMACVR7);
  		break;
  	case ETMACVRn(8):
  		etm_write(val, ETMACVR8);
  		break;
  	case ETMACVRn(9):
  		etm_write(val, ETMACVR9);
  		break;
  	case ETMACVRn(10):
  		etm_write(val, ETMACVR10);
  		break;
  	case ETMACVRn(11):
  		etm_write(val, ETMACVR11);
  		break;
  	case ETMACVRn(12):
  		etm_write(val, ETMACVR12);
  		break;
  	case ETMACVRn(13):
  		etm_write(val, ETMACVR13);
  		break;
  	case ETMACVRn(14):
  		etm_write(val, ETMACVR14);
  		break;
  	case ETMACVRn(15):
  		etm_write(val, ETMACVR15);
  		break;
  	case ETMACTRn(0):
  		etm_write(val, ETMACTR0);
  		break;
  	case ETMACTRn(1):
  		etm_write(val, ETMACTR1);
  		break;
  	case ETMACTRn(2):
  		etm_write(val, ETMACTR2);
  		break;
  	case ETMACTRn(3):
  		etm_write(val, ETMACTR3);
  		break;
  	case ETMACTRn(4):
  		etm_write(val, ETMACTR4);
  		break;
  	case ETMACTRn(5):
  		etm_write(val, ETMACTR5);
  		break;
  	case ETMACTRn(6):
  		etm_write(val, ETMACTR6);
  		break;
  	case ETMACTRn(7):
  		etm_write(val, ETMACTR7);
  		break;
  	case ETMACTRn(8):
  		etm_write(val, ETMACTR8);
  		break;
  	case ETMACTRn(9):
  		etm_write(val, ETMACTR9);
  		break;
  	case ETMACTRn(10):
  		etm_write(val, ETMACTR10);
  		break;
  	case ETMACTRn(11):
  		etm_write(val, ETMACTR11);
  		break;
  	case ETMACTRn(12):
  		etm_write(val, ETMACTR12);
  		break;
  	case ETMACTRn(13):
  		etm_write(val, ETMACTR13);
  		break;
  	case ETMACTRn(14):
  		etm_write(val, ETMACTR14);
  		break;
  	case ETMACTRn(15):
  		etm_write(val, ETMACTR15);
  		break;
  	case ETMCNTRLDVRn(0):
  		etm_write(val, ETMCNTRLDVR0);
  		break;
  	case ETMCNTRLDVRn(1):
  		etm_write(val, ETMCNTRLDVR1);
  		break;
  	case ETMCNTRLDVRn(2):
  		etm_write(val, ETMCNTRLDVR2);
  		break;
  	case ETMCNTRLDVRn(3):
  		etm_write(val, ETMCNTRLDVR3);
  		break;
  	case ETMCNTENRn(0):
  		etm_write(val, ETMCNTENR0);
  		break;
  	case ETMCNTENRn(1):
  		etm_write(val, ETMCNTENR1);
  		break;
  	case ETMCNTENRn(2):
  		etm_write(val, ETMCNTENR2);
  		break;
  	case ETMCNTENRn(3):
  		etm_write(val, ETMCNTENR3);
  		break;
  	case ETMCNTRLDEVRn(0):
  		etm_write(val, ETMCNTRLDEVR0);
  		break;
  	case ETMCNTRLDEVRn(1):
  		etm_write(val, ETMCNTRLDEVR1);
  		break;
  	case ETMCNTRLDEVRn(2):
  		etm_write(val, ETMCNTRLDEVR2);
  		break;
  	case ETMCNTRLDEVRn(3):
  		etm_write(val, ETMCNTRLDEVR3);
  		break;
  	case ETMCNTVRn(0):
  		etm_write(val, ETMCNTVR0);
  		break;
  	case ETMCNTVRn(1):
  		etm_write(val, ETMCNTVR1);
  		break;
  	case ETMCNTVRn(2):
  		etm_write(val, ETMCNTVR2);
  		break;
  	case ETMCNTVRn(3):
  		etm_write(val, ETMCNTVR3);
  		break;
  	case ETMSQ12EVR:
  		etm_write(val, ETMSQ12EVR);
  		break;
  	case ETMSQ21EVR:
  		etm_write(val, ETMSQ21EVR);
  		break;
  	case ETMSQ23EVR:
  		etm_write(val, ETMSQ23EVR);
  		break;
  	case ETMSQ31EVR:
  		etm_write(val, ETMSQ31EVR);
  		break;
  	case ETMSQ32EVR:
  		etm_write(val, ETMSQ32EVR);
  		break;
  	case ETMSQ13EVR:
  		etm_write(val, ETMSQ13EVR);
  		break;
  	case ETMSQR:
  		etm_write(val, ETMSQR);
  		break;
  	case ETMEXTOUTEVRn(0):
  		etm_write(val, ETMEXTOUTEVR0);
  		break;
  	case ETMEXTOUTEVRn(1):
  		etm_write(val, ETMEXTOUTEVR1);
  		break;
  	case ETMEXTOUTEVRn(2):
  		etm_write(val, ETMEXTOUTEVR2);
  		break;
  	case ETMEXTOUTEVRn(3):
  		etm_write(val, ETMEXTOUTEVR3);
  		break;
  	case ETMCIDCVRn(0):
  		etm_write(val, ETMCIDCVR0);
  		break;
  	case ETMCIDCVRn(1):
  		etm_write(val, ETMCIDCVR1);
  		break;
  	case ETMCIDCVRn(2):
  		etm_write(val, ETMCIDCVR2);
  		break;
  	case ETMCIDCMR:
  		etm_write(val, ETMCIDCMR);
  		break;
  	case ETMIMPSPEC0:
  		etm_write(val, ETMIMPSPEC0);
  		break;
  	case ETMIMPSPEC1:
  		etm_write(val, ETMIMPSPEC1);
  		break;
  	case ETMIMPSPEC2:
  		etm_write(val, ETMIMPSPEC2);
  		break;
  	case ETMIMPSPEC3:
  		etm_write(val, ETMIMPSPEC3);
  		break;
  	case ETMIMPSPEC4:
  		etm_write(val, ETMIMPSPEC4);
  		break;
  	case ETMIMPSPEC5:
  		etm_write(val, ETMIMPSPEC5);
  		break;
  	case ETMIMPSPEC6:
  		etm_write(val, ETMIMPSPEC6);
  		break;
  	case ETMIMPSPEC7:
  		etm_write(val, ETMIMPSPEC7);
  		break;
  	case ETMSYNCFR:
  		etm_write(val, ETMSYNCFR);
  		break;
  	case ETMEXTINSELR:
  		etm_write(val, ETMEXTINSELR);
  		break;
  	case ETMTESSEICR:
  		etm_write(val, ETMTESSEICR);
  		break;
  	case ETMEIBCR:
  		etm_write(val, ETMEIBCR);
  		break;
  	case ETMTSEVR:
  		etm_write(val, ETMTSEVR);
  		break;
  	case ETMAUXCR:
  		etm_write(val, ETMAUXCR);
  		break;
  	case ETMTRACEIDR:
  		etm_write(val, ETMTRACEIDR);
  		break;
  	case ETMVMIDCVR:
  		etm_write(val, ETMVMIDCVR);
  		break;
  	case ETMOSLAR:
  		etm_write(val, ETMOSLAR);
  		break;
  	case ETMOSSRR:
  		etm_write(val, ETMOSSRR);
  		break;
  	case ETMPDCR:
  		etm_write(val, ETMPDCR);
  		break;
  	case ETMPDSR:
  		etm_write(val, ETMPDSR);
  		break;
  	default:
  		return -EINVAL;
  	}
  
  	return 0;
  }
  