1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright 2009 Daniel Ribeiro <drwyrm@gmail.com> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * For further information, please see http://wiki.openezx.org/PCAP2 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef EZX_PCAP_H 9*4882a593Smuzhiyun #define EZX_PCAP_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct pcap_subdev { 12*4882a593Smuzhiyun int id; 13*4882a593Smuzhiyun const char *name; 14*4882a593Smuzhiyun void *platform_data; 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct pcap_platform_data { 18*4882a593Smuzhiyun unsigned int irq_base; 19*4882a593Smuzhiyun unsigned int config; 20*4882a593Smuzhiyun int gpio; 21*4882a593Smuzhiyun void (*init) (void *); /* board specific init */ 22*4882a593Smuzhiyun int num_subdevs; 23*4882a593Smuzhiyun struct pcap_subdev *subdevs; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct pcap_chip; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun int ezx_pcap_write(struct pcap_chip *, u8, u32); 29*4882a593Smuzhiyun int ezx_pcap_read(struct pcap_chip *, u8, u32 *); 30*4882a593Smuzhiyun int ezx_pcap_set_bits(struct pcap_chip *, u8, u32, u32); 31*4882a593Smuzhiyun int pcap_to_irq(struct pcap_chip *, int); 32*4882a593Smuzhiyun int irq_to_pcap(struct pcap_chip *, int); 33*4882a593Smuzhiyun int pcap_adc_async(struct pcap_chip *, u8, u32, u8[], void *, void *); 34*4882a593Smuzhiyun int pcap_adc_sync(struct pcap_chip *, u8, u32, u8[], u16[]); 35*4882a593Smuzhiyun void pcap_set_ts_bits(struct pcap_chip *, u32); 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define PCAP_SECOND_PORT 1 38*4882a593Smuzhiyun #define PCAP_CS_AH 2 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define PCAP_REGISTER_WRITE_OP_BIT 0x80000000 41*4882a593Smuzhiyun #define PCAP_REGISTER_READ_OP_BIT 0x00000000 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define PCAP_REGISTER_VALUE_MASK 0x01ffffff 44*4882a593Smuzhiyun #define PCAP_REGISTER_ADDRESS_MASK 0x7c000000 45*4882a593Smuzhiyun #define PCAP_REGISTER_ADDRESS_SHIFT 26 46*4882a593Smuzhiyun #define PCAP_REGISTER_NUMBER 32 47*4882a593Smuzhiyun #define PCAP_CLEAR_INTERRUPT_REGISTER 0x01ffffff 48*4882a593Smuzhiyun #define PCAP_MASK_ALL_INTERRUPT 0x01ffffff 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* registers accessible by both pcap ports */ 51*4882a593Smuzhiyun #define PCAP_REG_ISR 0x0 /* Interrupt Status */ 52*4882a593Smuzhiyun #define PCAP_REG_MSR 0x1 /* Interrupt Mask */ 53*4882a593Smuzhiyun #define PCAP_REG_PSTAT 0x2 /* Processor Status */ 54*4882a593Smuzhiyun #define PCAP_REG_VREG2 0x6 /* Regulator Bank 2 Control */ 55*4882a593Smuzhiyun #define PCAP_REG_AUXVREG 0x7 /* Auxiliary Regulator Control */ 56*4882a593Smuzhiyun #define PCAP_REG_BATT 0x8 /* Battery Control */ 57*4882a593Smuzhiyun #define PCAP_REG_ADC 0x9 /* AD Control */ 58*4882a593Smuzhiyun #define PCAP_REG_ADR 0xa /* AD Result */ 59*4882a593Smuzhiyun #define PCAP_REG_CODEC 0xb /* Audio Codec Control */ 60*4882a593Smuzhiyun #define PCAP_REG_RX_AMPS 0xc /* RX Audio Amplifiers Control */ 61*4882a593Smuzhiyun #define PCAP_REG_ST_DAC 0xd /* Stereo DAC Control */ 62*4882a593Smuzhiyun #define PCAP_REG_BUSCTRL 0x14 /* Connectivity Control */ 63*4882a593Smuzhiyun #define PCAP_REG_PERIPH 0x15 /* Peripheral Control */ 64*4882a593Smuzhiyun #define PCAP_REG_LOWPWR 0x18 /* Regulator Low Power Control */ 65*4882a593Smuzhiyun #define PCAP_REG_TX_AMPS 0x1a /* TX Audio Amplifiers Control */ 66*4882a593Smuzhiyun #define PCAP_REG_GP 0x1b /* General Purpose */ 67*4882a593Smuzhiyun #define PCAP_REG_TEST1 0x1c 68*4882a593Smuzhiyun #define PCAP_REG_TEST2 0x1d 69*4882a593Smuzhiyun #define PCAP_REG_VENDOR_TEST1 0x1e 70*4882a593Smuzhiyun #define PCAP_REG_VENDOR_TEST2 0x1f 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* registers accessible by pcap port 1 only (a1200, e2 & e6) */ 73*4882a593Smuzhiyun #define PCAP_REG_INT_SEL 0x3 /* Interrupt Select */ 74*4882a593Smuzhiyun #define PCAP_REG_SWCTRL 0x4 /* Switching Regulator Control */ 75*4882a593Smuzhiyun #define PCAP_REG_VREG1 0x5 /* Regulator Bank 1 Control */ 76*4882a593Smuzhiyun #define PCAP_REG_RTC_TOD 0xe /* RTC Time of Day */ 77*4882a593Smuzhiyun #define PCAP_REG_RTC_TODA 0xf /* RTC Time of Day Alarm */ 78*4882a593Smuzhiyun #define PCAP_REG_RTC_DAY 0x10 /* RTC Day */ 79*4882a593Smuzhiyun #define PCAP_REG_RTC_DAYA 0x11 /* RTC Day Alarm */ 80*4882a593Smuzhiyun #define PCAP_REG_MTRTMR 0x12 /* AD Monitor Timer */ 81*4882a593Smuzhiyun #define PCAP_REG_PWR 0x13 /* Power Control */ 82*4882a593Smuzhiyun #define PCAP_REG_AUXVREG_MASK 0x16 /* Auxiliary Regulator Mask */ 83*4882a593Smuzhiyun #define PCAP_REG_VENDOR_REV 0x17 84*4882a593Smuzhiyun #define PCAP_REG_PERIPH_MASK 0x19 /* Peripheral Mask */ 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* PCAP2 Interrupts */ 87*4882a593Smuzhiyun #define PCAP_NIRQS 23 88*4882a593Smuzhiyun #define PCAP_IRQ_ADCDONE 0 /* ADC done port 1 */ 89*4882a593Smuzhiyun #define PCAP_IRQ_TS 1 /* Touch Screen */ 90*4882a593Smuzhiyun #define PCAP_IRQ_1HZ 2 /* 1HZ timer */ 91*4882a593Smuzhiyun #define PCAP_IRQ_WH 3 /* ADC above high limit */ 92*4882a593Smuzhiyun #define PCAP_IRQ_WL 4 /* ADC below low limit */ 93*4882a593Smuzhiyun #define PCAP_IRQ_TODA 5 /* Time of day alarm */ 94*4882a593Smuzhiyun #define PCAP_IRQ_USB4V 6 /* USB above 4V */ 95*4882a593Smuzhiyun #define PCAP_IRQ_ONOFF 7 /* On/Off button */ 96*4882a593Smuzhiyun #define PCAP_IRQ_ONOFF2 8 /* On/Off button 2 */ 97*4882a593Smuzhiyun #define PCAP_IRQ_USB1V 9 /* USB above 1V */ 98*4882a593Smuzhiyun #define PCAP_IRQ_MOBPORT 10 99*4882a593Smuzhiyun #define PCAP_IRQ_MIC 11 /* Mic attach/HS button */ 100*4882a593Smuzhiyun #define PCAP_IRQ_HS 12 /* Headset attach */ 101*4882a593Smuzhiyun #define PCAP_IRQ_ST 13 102*4882a593Smuzhiyun #define PCAP_IRQ_PC 14 /* Power Cut */ 103*4882a593Smuzhiyun #define PCAP_IRQ_WARM 15 104*4882a593Smuzhiyun #define PCAP_IRQ_EOL 16 /* Battery End Of Life */ 105*4882a593Smuzhiyun #define PCAP_IRQ_CLK 17 106*4882a593Smuzhiyun #define PCAP_IRQ_SYSRST 18 /* System Reset */ 107*4882a593Smuzhiyun #define PCAP_IRQ_DUMMY 19 108*4882a593Smuzhiyun #define PCAP_IRQ_ADCDONE2 20 /* ADC done port 2 */ 109*4882a593Smuzhiyun #define PCAP_IRQ_SOFTRESET 21 110*4882a593Smuzhiyun #define PCAP_IRQ_MNEXB 22 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* voltage regulators */ 113*4882a593Smuzhiyun #define V1 0 114*4882a593Smuzhiyun #define V2 1 115*4882a593Smuzhiyun #define V3 2 116*4882a593Smuzhiyun #define V4 3 117*4882a593Smuzhiyun #define V5 4 118*4882a593Smuzhiyun #define V6 5 119*4882a593Smuzhiyun #define V7 6 120*4882a593Smuzhiyun #define V8 7 121*4882a593Smuzhiyun #define V9 8 122*4882a593Smuzhiyun #define V10 9 123*4882a593Smuzhiyun #define VAUX1 10 124*4882a593Smuzhiyun #define VAUX2 11 125*4882a593Smuzhiyun #define VAUX3 12 126*4882a593Smuzhiyun #define VAUX4 13 127*4882a593Smuzhiyun #define VSIM 14 128*4882a593Smuzhiyun #define VSIM2 15 129*4882a593Smuzhiyun #define VVIB 16 130*4882a593Smuzhiyun #define SW1 17 131*4882a593Smuzhiyun #define SW2 18 132*4882a593Smuzhiyun #define SW3 19 133*4882a593Smuzhiyun #define SW1S 20 134*4882a593Smuzhiyun #define SW2S 21 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #define PCAP_BATT_DAC_MASK 0x000000ff 137*4882a593Smuzhiyun #define PCAP_BATT_DAC_SHIFT 0 138*4882a593Smuzhiyun #define PCAP_BATT_B_FDBK (1 << 8) 139*4882a593Smuzhiyun #define PCAP_BATT_EXT_ISENSE (1 << 9) 140*4882a593Smuzhiyun #define PCAP_BATT_V_COIN_MASK 0x00003c00 141*4882a593Smuzhiyun #define PCAP_BATT_V_COIN_SHIFT 10 142*4882a593Smuzhiyun #define PCAP_BATT_I_COIN (1 << 14) 143*4882a593Smuzhiyun #define PCAP_BATT_COIN_CH_EN (1 << 15) 144*4882a593Smuzhiyun #define PCAP_BATT_EOL_SEL_MASK 0x000e0000 145*4882a593Smuzhiyun #define PCAP_BATT_EOL_SEL_SHIFT 17 146*4882a593Smuzhiyun #define PCAP_BATT_EOL_CMP_EN (1 << 20) 147*4882a593Smuzhiyun #define PCAP_BATT_BATT_DET_EN (1 << 21) 148*4882a593Smuzhiyun #define PCAP_BATT_THERMBIAS_CTRL (1 << 22) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #define PCAP_ADC_ADEN (1 << 0) 151*4882a593Smuzhiyun #define PCAP_ADC_RAND (1 << 1) 152*4882a593Smuzhiyun #define PCAP_ADC_AD_SEL1 (1 << 2) 153*4882a593Smuzhiyun #define PCAP_ADC_AD_SEL2 (1 << 3) 154*4882a593Smuzhiyun #define PCAP_ADC_ADA1_MASK 0x00000070 155*4882a593Smuzhiyun #define PCAP_ADC_ADA1_SHIFT 4 156*4882a593Smuzhiyun #define PCAP_ADC_ADA2_MASK 0x00000380 157*4882a593Smuzhiyun #define PCAP_ADC_ADA2_SHIFT 7 158*4882a593Smuzhiyun #define PCAP_ADC_ATO_MASK 0x00003c00 159*4882a593Smuzhiyun #define PCAP_ADC_ATO_SHIFT 10 160*4882a593Smuzhiyun #define PCAP_ADC_ATOX (1 << 14) 161*4882a593Smuzhiyun #define PCAP_ADC_MTR1 (1 << 15) 162*4882a593Smuzhiyun #define PCAP_ADC_MTR2 (1 << 16) 163*4882a593Smuzhiyun #define PCAP_ADC_TS_M_MASK 0x000e0000 164*4882a593Smuzhiyun #define PCAP_ADC_TS_M_SHIFT 17 165*4882a593Smuzhiyun #define PCAP_ADC_TS_REF_LOWPWR (1 << 20) 166*4882a593Smuzhiyun #define PCAP_ADC_TS_REFENB (1 << 21) 167*4882a593Smuzhiyun #define PCAP_ADC_BATT_I_POLARITY (1 << 22) 168*4882a593Smuzhiyun #define PCAP_ADC_BATT_I_ADC (1 << 23) 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define PCAP_ADC_BANK_0 0 171*4882a593Smuzhiyun #define PCAP_ADC_BANK_1 1 172*4882a593Smuzhiyun /* ADC bank 0 */ 173*4882a593Smuzhiyun #define PCAP_ADC_CH_COIN 0 174*4882a593Smuzhiyun #define PCAP_ADC_CH_BATT 1 175*4882a593Smuzhiyun #define PCAP_ADC_CH_BPLUS 2 176*4882a593Smuzhiyun #define PCAP_ADC_CH_MOBPORTB 3 177*4882a593Smuzhiyun #define PCAP_ADC_CH_TEMPERATURE 4 178*4882a593Smuzhiyun #define PCAP_ADC_CH_CHARGER_ID 5 179*4882a593Smuzhiyun #define PCAP_ADC_CH_AD6 6 180*4882a593Smuzhiyun /* ADC bank 1 */ 181*4882a593Smuzhiyun #define PCAP_ADC_CH_AD7 0 182*4882a593Smuzhiyun #define PCAP_ADC_CH_AD8 1 183*4882a593Smuzhiyun #define PCAP_ADC_CH_AD9 2 184*4882a593Smuzhiyun #define PCAP_ADC_CH_TS_X1 3 185*4882a593Smuzhiyun #define PCAP_ADC_CH_TS_X2 4 186*4882a593Smuzhiyun #define PCAP_ADC_CH_TS_Y1 5 187*4882a593Smuzhiyun #define PCAP_ADC_CH_TS_Y2 6 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun #define PCAP_ADC_T_NOW 0 190*4882a593Smuzhiyun #define PCAP_ADC_T_IN_BURST 1 191*4882a593Smuzhiyun #define PCAP_ADC_T_OUT_BURST 2 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun #define PCAP_ADC_ATO_IN_BURST 6 194*4882a593Smuzhiyun #define PCAP_ADC_ATO_OUT_BURST 0 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun #define PCAP_ADC_TS_M_XY 1 197*4882a593Smuzhiyun #define PCAP_ADC_TS_M_PRESSURE 2 198*4882a593Smuzhiyun #define PCAP_ADC_TS_M_PLATE_X 3 199*4882a593Smuzhiyun #define PCAP_ADC_TS_M_PLATE_Y 4 200*4882a593Smuzhiyun #define PCAP_ADC_TS_M_STANDBY 5 201*4882a593Smuzhiyun #define PCAP_ADC_TS_M_NONTS 6 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun #define PCAP_ADR_ADD1_MASK 0x000003ff 204*4882a593Smuzhiyun #define PCAP_ADR_ADD1_SHIFT 0 205*4882a593Smuzhiyun #define PCAP_ADR_ADD2_MASK 0x000ffc00 206*4882a593Smuzhiyun #define PCAP_ADR_ADD2_SHIFT 10 207*4882a593Smuzhiyun #define PCAP_ADR_ADINC1 (1 << 20) 208*4882a593Smuzhiyun #define PCAP_ADR_ADINC2 (1 << 21) 209*4882a593Smuzhiyun #define PCAP_ADR_ASC (1 << 22) 210*4882a593Smuzhiyun #define PCAP_ADR_ONESHOT (1 << 23) 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define PCAP_BUSCTRL_FSENB (1 << 0) 213*4882a593Smuzhiyun #define PCAP_BUSCTRL_USB_SUSPEND (1 << 1) 214*4882a593Smuzhiyun #define PCAP_BUSCTRL_USB_PU (1 << 2) 215*4882a593Smuzhiyun #define PCAP_BUSCTRL_USB_PD (1 << 3) 216*4882a593Smuzhiyun #define PCAP_BUSCTRL_VUSB_EN (1 << 4) 217*4882a593Smuzhiyun #define PCAP_BUSCTRL_USB_PS (1 << 5) 218*4882a593Smuzhiyun #define PCAP_BUSCTRL_VUSB_MSTR_EN (1 << 6) 219*4882a593Smuzhiyun #define PCAP_BUSCTRL_VBUS_PD_ENB (1 << 7) 220*4882a593Smuzhiyun #define PCAP_BUSCTRL_CURRLIM (1 << 8) 221*4882a593Smuzhiyun #define PCAP_BUSCTRL_RS232ENB (1 << 9) 222*4882a593Smuzhiyun #define PCAP_BUSCTRL_RS232_DIR (1 << 10) 223*4882a593Smuzhiyun #define PCAP_BUSCTRL_SE0_CONN (1 << 11) 224*4882a593Smuzhiyun #define PCAP_BUSCTRL_USB_PDM (1 << 12) 225*4882a593Smuzhiyun #define PCAP_BUSCTRL_BUS_PRI_ADJ (1 << 24) 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun /* leds */ 228*4882a593Smuzhiyun #define PCAP_LED0 0 229*4882a593Smuzhiyun #define PCAP_LED1 1 230*4882a593Smuzhiyun #define PCAP_BL0 2 231*4882a593Smuzhiyun #define PCAP_BL1 3 232*4882a593Smuzhiyun #define PCAP_LED_3MA 0 233*4882a593Smuzhiyun #define PCAP_LED_4MA 1 234*4882a593Smuzhiyun #define PCAP_LED_5MA 2 235*4882a593Smuzhiyun #define PCAP_LED_9MA 3 236*4882a593Smuzhiyun #define PCAP_LED_T_MASK 0xf 237*4882a593Smuzhiyun #define PCAP_LED_C_MASK 0x3 238*4882a593Smuzhiyun #define PCAP_BL_MASK 0x1f 239*4882a593Smuzhiyun #define PCAP_BL0_SHIFT 0 240*4882a593Smuzhiyun #define PCAP_LED0_EN (1 << 5) 241*4882a593Smuzhiyun #define PCAP_LED1_EN (1 << 6) 242*4882a593Smuzhiyun #define PCAP_LED0_T_SHIFT 7 243*4882a593Smuzhiyun #define PCAP_LED1_T_SHIFT 11 244*4882a593Smuzhiyun #define PCAP_LED0_C_SHIFT 15 245*4882a593Smuzhiyun #define PCAP_LED1_C_SHIFT 17 246*4882a593Smuzhiyun #define PCAP_BL1_SHIFT 20 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /* RTC */ 249*4882a593Smuzhiyun #define PCAP_RTC_DAY_MASK 0x3fff 250*4882a593Smuzhiyun #define PCAP_RTC_TOD_MASK 0xffff 251*4882a593Smuzhiyun #define PCAP_RTC_PC_MASK 0x7 252*4882a593Smuzhiyun #define SEC_PER_DAY 86400 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun #endif 255