1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Sunxi platform Push-Push i2c register definition. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * (c) Copyright 2013 Oliver Schinagl <oliver@schinagl.nl> 5*4882a593Smuzhiyun * http://linux-sunxi.org 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * (c)Copyright 2006-2013 8*4882a593Smuzhiyun * Allwinner Technology Co., Ltd. <www.allwinnertech.com> 9*4882a593Smuzhiyun * Berg Xing <bergxing@allwinnertech.com> 10*4882a593Smuzhiyun * Tom Cubie <tangliang@allwinnertech.com> 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifndef _SUNXI_P2WI_H 16*4882a593Smuzhiyun #define _SUNXI_P2WI_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #include <linux/types.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define P2WI_CTRL_RESET (0x1 << 0) 21*4882a593Smuzhiyun #define P2WI_CTRL_IRQ_EN (0x1 << 1) 22*4882a593Smuzhiyun #define P2WI_CTRL_TRANS_ABORT (0x1 << 6) 23*4882a593Smuzhiyun #define P2WI_CTRL_TRANS_START (0x1 << 7) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define __P2WI_CC_CLK(n) (((n) & 0xff) << 0) 26*4882a593Smuzhiyun #define P2WI_CC_CLK_MASK __P2WI_CC_CLK_DIV(0xff) 27*4882a593Smuzhiyun #define __P2WI_CC_CLK_DIV(n) (((n) >> 1) - 1) 28*4882a593Smuzhiyun #define P2WI_CC_CLK_DIV(n) \ 29*4882a593Smuzhiyun __P2WI_CC_CLK(__P2WI_CC_CLK_DIV(n)) 30*4882a593Smuzhiyun #define P2WI_CC_SDA_OUT_DELAY(n) (((n) & 0x7) << 8) 31*4882a593Smuzhiyun #define P2WI_CC_SDA_OUT_DELAY_MASK P2WI_CC_SDA_OUT_DELAY(0x7) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define P2WI_IRQ_TRANS_DONE (0x1 << 0) 34*4882a593Smuzhiyun #define P2WI_IRQ_TRANS_ERR (0x1 << 1) 35*4882a593Smuzhiyun #define P2WI_IRQ_LOAD_BUSY (0x1 << 2) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define P2WI_STAT_TRANS_DONE (0x1 << 0) 38*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR (0x1 << 1) 39*4882a593Smuzhiyun #define P2WI_STAT_LOAD_BUSY (0x1 << 2) 40*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR(n) (((n) & 0xff) << 8) 41*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_MASK __P2WI_STAT_TRANS_ERR_ID(0xff) 42*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_1 0x01 43*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_2 0x02 44*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_3 0x04 45*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_4 0x08 46*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_5 0x10 47*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_6 0x20 48*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_7 0x40 49*4882a593Smuzhiyun #define __P2WI_STAT_TRANS_ERR_BYTE_8 0x80 50*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_1 \ 51*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_1) 52*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_2 \ 53*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_2) 54*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_3 \ 55*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_3) 56*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_4 \ 57*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_4) 58*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_5 \ 59*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_5) 60*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_6 \ 61*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_6) 62*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_7 \ 63*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_7) 64*4882a593Smuzhiyun #define P2WI_STAT_TRANS_ERR_BYTE_8 \ 65*4882a593Smuzhiyun __P2WI_STAT_TRANS_ERR(__P2WI_STAT_TRANS_ERR_BYTE_8) 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_1(n) (((n) & 0xff) << 0) 68*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_1_MASK P2WI_DATADDR_BYTE_1(0xff) 69*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_2(n) (((n) & 0xff) << 8) 70*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_2_MASK P2WI_DATADDR_BYTE_2(0xff) 71*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_3(n) (((n) & 0xff) << 16) 72*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_3_MASK P2WI_DATADDR_BYTE_3(0xff) 73*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_4(n) (((n) & 0xff) << 24) 74*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_4_MASK P2WI_DATADDR_BYTE_4(0xff) 75*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_5(n) (((n) & 0xff) << 0) 76*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_5_MASK P2WI_DATADDR_BYTE_5(0xff) 77*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_6(n) (((n) & 0xff) << 8) 78*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_6_MASK P2WI_DATADDR_BYTE_6(0xff) 79*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_7(n) (((n) & 0xff) << 16) 80*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_7_MASK P2WI_DATADDR_BYTE_7(0xff) 81*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_8(n) (((n) & 0xff) << 24) 82*4882a593Smuzhiyun #define P2WI_DATADDR_BYTE_8_MASK P2WI_DATADDR_BYTE_8(0xff) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define __P2WI_DATA_NUM_BYTES(n) (((n) & 0x7) << 0) 85*4882a593Smuzhiyun #define P2WI_DATA_NUM_BYTES_MASK __P2WI_DATA_NUM_BYTES(0x7) 86*4882a593Smuzhiyun #define P2WI_DATA_NUM_BYTES(n) __P2WI_DATA_NUM_BYTES((n) - 1) 87*4882a593Smuzhiyun #define P2WI_DATA_NUM_BYTES_READ (0x1 << 4) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define P2WI_DATA_BYTE_1(n) (((n) & 0xff) << 0) 90*4882a593Smuzhiyun #define P2WI_DATA_BYTE_1_MASK P2WI_DATA_BYTE_1(0xff) 91*4882a593Smuzhiyun #define P2WI_DATA_BYTE_2(n) (((n) & 0xff) << 8) 92*4882a593Smuzhiyun #define P2WI_DATA_BYTE_2_MASK P2WI_DATA_BYTE_2(0xff) 93*4882a593Smuzhiyun #define P2WI_DATA_BYTE_3(n) (((n) & 0xff) << 16) 94*4882a593Smuzhiyun #define P2WI_DATA_BYTE_3_MASK P2WI_DATA_BYTE_3(0xff) 95*4882a593Smuzhiyun #define P2WI_DATA_BYTE_4(n) (((n) & 0xff) << 24) 96*4882a593Smuzhiyun #define P2WI_DATA_BYTE_4_MASK P2WI_DATA_BYTE_4(0xff) 97*4882a593Smuzhiyun #define P2WI_DATA_BYTE_5(n) (((n) & 0xff) << 0) 98*4882a593Smuzhiyun #define P2WI_DATA_BYTE_5_MASK P2WI_DATA_BYTE_5(0xff) 99*4882a593Smuzhiyun #define P2WI_DATA_BYTE_6(n) (((n) & 0xff) << 8) 100*4882a593Smuzhiyun #define P2WI_DATA_BYTE_6_MASK P2WI_DATA_BYTE_6(0xff) 101*4882a593Smuzhiyun #define P2WI_DATA_BYTE_7(n) (((n) & 0xff) << 16) 102*4882a593Smuzhiyun #define P2WI_DATA_BYTE_7_MASK P2WI_DATA_BYTE_7(0xff) 103*4882a593Smuzhiyun #define P2WI_DATA_BYTE_8(n) (((n) & 0xff) << 24) 104*4882a593Smuzhiyun #define P2WI_DATA_BYTE_8_MASK P2WI_DATA_BYTE_8(0xff) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define P2WI_LINECTRL_SDA_CTRL_EN (0x1 << 0) 107*4882a593Smuzhiyun #define P2WI_LINECTRL_SDA_OUT_HIGH (0x1 << 1) 108*4882a593Smuzhiyun #define P2WI_LINECTRL_SCL_CTRL_EN (0x1 << 2) 109*4882a593Smuzhiyun #define P2WI_LINECTRL_SCL_OUT_HIGH (0x1 << 3) 110*4882a593Smuzhiyun #define P2WI_LINECTRL_SDA_STATE_HIGH (0x1 << 4) 111*4882a593Smuzhiyun #define P2WI_LINECTRL_SCL_STATE_HIGH (0x1 << 5) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define P2WI_PM_DEV_ADDR(n) (((n) & 0xff) << 0) 114*4882a593Smuzhiyun #define P2WI_PM_DEV_ADDR_MASK P2WI_PM_DEV_ADDR(0xff) 115*4882a593Smuzhiyun #define P2WI_PM_CTRL_ADDR(n) (((n) & 0xff) << 8) 116*4882a593Smuzhiyun #define P2WI_PM_CTRL_ADDR_MASK P2WI_PM_CTRL_ADDR(0xff) 117*4882a593Smuzhiyun #define P2WI_PM_INIT_DATA(n) (((n) & 0xff) << 16) 118*4882a593Smuzhiyun #define P2WI_PM_INIT_DATA_MASK P2WI_PM_INIT_DATA(0xff) 119*4882a593Smuzhiyun #define P2WI_PM_INIT_SEND (0x1 << 31) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun struct sunxi_p2wi_reg { 122*4882a593Smuzhiyun u32 ctrl; /* 0x00 control */ 123*4882a593Smuzhiyun u32 cc; /* 0x04 clock control */ 124*4882a593Smuzhiyun u32 irq; /* 0x08 interrupt */ 125*4882a593Smuzhiyun u32 status; /* 0x0c status */ 126*4882a593Smuzhiyun u32 dataddr0; /* 0x10 data address 0 */ 127*4882a593Smuzhiyun u32 dataddr1; /* 0x14 data address 1 */ 128*4882a593Smuzhiyun u32 numbytes; /* 0x18 num bytes */ 129*4882a593Smuzhiyun u32 data0; /* 0x1c data buffer 0 */ 130*4882a593Smuzhiyun u32 data1; /* 0x20 data buffer 1 */ 131*4882a593Smuzhiyun u32 linectrl; /* 0x24 line control */ 132*4882a593Smuzhiyun u32 pm; /* 0x28 power management */ 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun void p2wi_init(void); 136*4882a593Smuzhiyun int p2wi_change_to_p2wi_mode(u8 slave_addr, u8 ctrl_reg, u8 init_data); 137*4882a593Smuzhiyun int p2wi_read(const u8 addr, u8 *data); 138*4882a593Smuzhiyun int p2wi_write(const u8 addr, u8 data); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #endif /* _SUNXI_P2WI_H */ 141