1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Handles the M-Systems DiskOnChip G3 chip 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2011 Robert Jarzmik 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _MTD_DOCG3_H 9*4882a593Smuzhiyun #define _MTD_DOCG3_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/mtd/mtd.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* 14*4882a593Smuzhiyun * Flash memory areas : 15*4882a593Smuzhiyun * - 0x0000 .. 0x07ff : IPL 16*4882a593Smuzhiyun * - 0x0800 .. 0x0fff : Data area 17*4882a593Smuzhiyun * - 0x1000 .. 0x17ff : Registers 18*4882a593Smuzhiyun * - 0x1800 .. 0x1fff : Unknown 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun #define DOC_IOSPACE_IPL 0x0000 21*4882a593Smuzhiyun #define DOC_IOSPACE_DATA 0x0800 22*4882a593Smuzhiyun #define DOC_IOSPACE_SIZE 0x2000 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* 25*4882a593Smuzhiyun * DOC G3 layout and adressing scheme 26*4882a593Smuzhiyun * A page address for the block "b", plane "P" and page "p": 27*4882a593Smuzhiyun * address = [bbbb bPpp pppp] 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define DOC_ADDR_PAGE_MASK 0x3f 31*4882a593Smuzhiyun #define DOC_ADDR_BLOCK_SHIFT 6 32*4882a593Smuzhiyun #define DOC_LAYOUT_NBPLANES 2 33*4882a593Smuzhiyun #define DOC_LAYOUT_PAGES_PER_BLOCK 64 34*4882a593Smuzhiyun #define DOC_LAYOUT_PAGE_SIZE 512 35*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_SIZE 16 36*4882a593Smuzhiyun #define DOC_LAYOUT_WEAR_SIZE 8 37*4882a593Smuzhiyun #define DOC_LAYOUT_PAGE_OOB_SIZE \ 38*4882a593Smuzhiyun (DOC_LAYOUT_PAGE_SIZE + DOC_LAYOUT_OOB_SIZE) 39*4882a593Smuzhiyun #define DOC_LAYOUT_WEAR_OFFSET (DOC_LAYOUT_PAGE_OOB_SIZE * 2) 40*4882a593Smuzhiyun #define DOC_LAYOUT_BLOCK_SIZE \ 41*4882a593Smuzhiyun (DOC_LAYOUT_PAGES_PER_BLOCK * DOC_LAYOUT_PAGE_SIZE) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* 44*4882a593Smuzhiyun * ECC related constants 45*4882a593Smuzhiyun */ 46*4882a593Smuzhiyun #define DOC_ECC_BCH_M 14 47*4882a593Smuzhiyun #define DOC_ECC_BCH_T 4 48*4882a593Smuzhiyun #define DOC_ECC_BCH_PRIMPOLY 0x4443 49*4882a593Smuzhiyun #define DOC_ECC_BCH_SIZE 7 50*4882a593Smuzhiyun #define DOC_ECC_BCH_COVERED_BYTES \ 51*4882a593Smuzhiyun (DOC_LAYOUT_PAGE_SIZE + DOC_LAYOUT_OOB_PAGEINFO_SZ + \ 52*4882a593Smuzhiyun DOC_LAYOUT_OOB_HAMMING_SZ) 53*4882a593Smuzhiyun #define DOC_ECC_BCH_TOTAL_BYTES \ 54*4882a593Smuzhiyun (DOC_ECC_BCH_COVERED_BYTES + DOC_LAYOUT_OOB_BCH_SZ) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* 57*4882a593Smuzhiyun * Blocks distribution 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun #define DOC_LAYOUT_BLOCK_BBT 0 60*4882a593Smuzhiyun #define DOC_LAYOUT_BLOCK_OTP 0 61*4882a593Smuzhiyun #define DOC_LAYOUT_BLOCK_FIRST_DATA 6 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define DOC_LAYOUT_PAGE_BBT 4 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* 66*4882a593Smuzhiyun * Extra page OOB (16 bytes wide) layout 67*4882a593Smuzhiyun */ 68*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_PAGEINFO_OFS 0 69*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_HAMMING_OFS 7 70*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_BCH_OFS 8 71*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_UNUSED_OFS 15 72*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_PAGEINFO_SZ 7 73*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_HAMMING_SZ 1 74*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_BCH_SZ 7 75*4882a593Smuzhiyun #define DOC_LAYOUT_OOB_UNUSED_SZ 1 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define DOC_CHIPID_G3 0x200 79*4882a593Smuzhiyun #define DOC_ERASE_MARK 0xaa 80*4882a593Smuzhiyun #define DOC_MAX_NBFLOORS 4 81*4882a593Smuzhiyun /* 82*4882a593Smuzhiyun * Flash registers 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun #define DOC_CHIPID 0x1000 85*4882a593Smuzhiyun #define DOC_TEST 0x1004 86*4882a593Smuzhiyun #define DOC_BUSLOCK 0x1006 87*4882a593Smuzhiyun #define DOC_ENDIANCONTROL 0x1008 88*4882a593Smuzhiyun #define DOC_DEVICESELECT 0x100a 89*4882a593Smuzhiyun #define DOC_ASICMODE 0x100c 90*4882a593Smuzhiyun #define DOC_CONFIGURATION 0x100e 91*4882a593Smuzhiyun #define DOC_INTERRUPTCONTROL 0x1010 92*4882a593Smuzhiyun #define DOC_READADDRESS 0x101a 93*4882a593Smuzhiyun #define DOC_DATAEND 0x101e 94*4882a593Smuzhiyun #define DOC_INTERRUPTSTATUS 0x1020 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define DOC_FLASHSEQUENCE 0x1032 97*4882a593Smuzhiyun #define DOC_FLASHCOMMAND 0x1034 98*4882a593Smuzhiyun #define DOC_FLASHADDRESS 0x1036 99*4882a593Smuzhiyun #define DOC_FLASHCONTROL 0x1038 100*4882a593Smuzhiyun #define DOC_NOP 0x103e 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #define DOC_ECCCONF0 0x1040 103*4882a593Smuzhiyun #define DOC_ECCCONF1 0x1042 104*4882a593Smuzhiyun #define DOC_ECCPRESET 0x1044 105*4882a593Smuzhiyun #define DOC_HAMMINGPARITY 0x1046 106*4882a593Smuzhiyun #define DOC_BCH_HW_ECC(idx) (0x1048 + idx) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define DOC_PROTECTION 0x1056 109*4882a593Smuzhiyun #define DOC_DPS0_KEY 0x105c 110*4882a593Smuzhiyun #define DOC_DPS1_KEY 0x105e 111*4882a593Smuzhiyun #define DOC_DPS0_ADDRLOW 0x1060 112*4882a593Smuzhiyun #define DOC_DPS0_ADDRHIGH 0x1062 113*4882a593Smuzhiyun #define DOC_DPS1_ADDRLOW 0x1064 114*4882a593Smuzhiyun #define DOC_DPS1_ADDRHIGH 0x1066 115*4882a593Smuzhiyun #define DOC_DPS0_STATUS 0x106c 116*4882a593Smuzhiyun #define DOC_DPS1_STATUS 0x106e 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define DOC_ASICMODECONFIRM 0x1072 119*4882a593Smuzhiyun #define DOC_CHIPID_INV 0x1074 120*4882a593Smuzhiyun #define DOC_POWERMODE 0x107c 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* 123*4882a593Smuzhiyun * Flash sequences 124*4882a593Smuzhiyun * A sequence is preset before one or more commands are input to the chip. 125*4882a593Smuzhiyun */ 126*4882a593Smuzhiyun #define DOC_SEQ_RESET 0x00 127*4882a593Smuzhiyun #define DOC_SEQ_PAGE_SIZE_532 0x03 128*4882a593Smuzhiyun #define DOC_SEQ_SET_FASTMODE 0x05 129*4882a593Smuzhiyun #define DOC_SEQ_SET_RELIABLEMODE 0x09 130*4882a593Smuzhiyun #define DOC_SEQ_READ 0x12 131*4882a593Smuzhiyun #define DOC_SEQ_SET_PLANE1 0x0e 132*4882a593Smuzhiyun #define DOC_SEQ_SET_PLANE2 0x10 133*4882a593Smuzhiyun #define DOC_SEQ_PAGE_SETUP 0x1d 134*4882a593Smuzhiyun #define DOC_SEQ_ERASE 0x27 135*4882a593Smuzhiyun #define DOC_SEQ_PLANES_STATUS 0x31 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* 138*4882a593Smuzhiyun * Flash commands 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun #define DOC_CMD_READ_PLANE1 0x00 141*4882a593Smuzhiyun #define DOC_CMD_SET_ADDR_READ 0x05 142*4882a593Smuzhiyun #define DOC_CMD_READ_ALL_PLANES 0x30 143*4882a593Smuzhiyun #define DOC_CMD_READ_PLANE2 0x50 144*4882a593Smuzhiyun #define DOC_CMD_READ_FLASH 0xe0 145*4882a593Smuzhiyun #define DOC_CMD_PAGE_SIZE_532 0x3c 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun #define DOC_CMD_PROG_BLOCK_ADDR 0x60 148*4882a593Smuzhiyun #define DOC_CMD_PROG_CYCLE1 0x80 149*4882a593Smuzhiyun #define DOC_CMD_PROG_CYCLE2 0x10 150*4882a593Smuzhiyun #define DOC_CMD_PROG_CYCLE3 0x11 151*4882a593Smuzhiyun #define DOC_CMD_ERASECYCLE2 0xd0 152*4882a593Smuzhiyun #define DOC_CMD_READ_STATUS 0x70 153*4882a593Smuzhiyun #define DOC_CMD_PLANES_STATUS 0x71 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #define DOC_CMD_RELIABLE_MODE 0x22 156*4882a593Smuzhiyun #define DOC_CMD_FAST_MODE 0xa2 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define DOC_CMD_RESET 0xff 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* 161*4882a593Smuzhiyun * Flash register : DOC_FLASHCONTROL 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun #define DOC_CTRL_VIOLATION 0x20 164*4882a593Smuzhiyun #define DOC_CTRL_CE 0x10 165*4882a593Smuzhiyun #define DOC_CTRL_UNKNOWN_BITS 0x08 166*4882a593Smuzhiyun #define DOC_CTRL_PROTECTION_ERROR 0x04 167*4882a593Smuzhiyun #define DOC_CTRL_SEQUENCE_ERROR 0x02 168*4882a593Smuzhiyun #define DOC_CTRL_FLASHREADY 0x01 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun /* 171*4882a593Smuzhiyun * Flash register : DOC_ASICMODE 172*4882a593Smuzhiyun */ 173*4882a593Smuzhiyun #define DOC_ASICMODE_RESET 0x00 174*4882a593Smuzhiyun #define DOC_ASICMODE_NORMAL 0x01 175*4882a593Smuzhiyun #define DOC_ASICMODE_POWERDOWN 0x02 176*4882a593Smuzhiyun #define DOC_ASICMODE_MDWREN 0x04 177*4882a593Smuzhiyun #define DOC_ASICMODE_BDETCT_RESET 0x08 178*4882a593Smuzhiyun #define DOC_ASICMODE_RSTIN_RESET 0x10 179*4882a593Smuzhiyun #define DOC_ASICMODE_RAM_WE 0x20 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* 182*4882a593Smuzhiyun * Flash register : DOC_ECCCONF0 183*4882a593Smuzhiyun */ 184*4882a593Smuzhiyun #define DOC_ECCCONF0_WRITE_MODE 0x0000 185*4882a593Smuzhiyun #define DOC_ECCCONF0_READ_MODE 0x8000 186*4882a593Smuzhiyun #define DOC_ECCCONF0_AUTO_ECC_ENABLE 0x4000 187*4882a593Smuzhiyun #define DOC_ECCCONF0_HAMMING_ENABLE 0x1000 188*4882a593Smuzhiyun #define DOC_ECCCONF0_BCH_ENABLE 0x0800 189*4882a593Smuzhiyun #define DOC_ECCCONF0_DATA_BYTES_MASK 0x07ff 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* 192*4882a593Smuzhiyun * Flash register : DOC_ECCCONF1 193*4882a593Smuzhiyun */ 194*4882a593Smuzhiyun #define DOC_ECCCONF1_BCH_SYNDROM_ERR 0x80 195*4882a593Smuzhiyun #define DOC_ECCCONF1_UNKOWN1 0x40 196*4882a593Smuzhiyun #define DOC_ECCCONF1_PAGE_IS_WRITTEN 0x20 197*4882a593Smuzhiyun #define DOC_ECCCONF1_UNKOWN3 0x10 198*4882a593Smuzhiyun #define DOC_ECCCONF1_HAMMING_BITS_MASK 0x0f 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /* 201*4882a593Smuzhiyun * Flash register : DOC_PROTECTION 202*4882a593Smuzhiyun */ 203*4882a593Smuzhiyun #define DOC_PROTECT_FOUNDRY_OTP_LOCK 0x01 204*4882a593Smuzhiyun #define DOC_PROTECT_CUSTOMER_OTP_LOCK 0x02 205*4882a593Smuzhiyun #define DOC_PROTECT_LOCK_INPUT 0x04 206*4882a593Smuzhiyun #define DOC_PROTECT_STICKY_LOCK 0x08 207*4882a593Smuzhiyun #define DOC_PROTECT_PROTECTION_ENABLED 0x10 208*4882a593Smuzhiyun #define DOC_PROTECT_IPL_DOWNLOAD_LOCK 0x20 209*4882a593Smuzhiyun #define DOC_PROTECT_PROTECTION_ERROR 0x80 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun /* 212*4882a593Smuzhiyun * Flash register : DOC_DPS0_STATUS and DOC_DPS1_STATUS 213*4882a593Smuzhiyun */ 214*4882a593Smuzhiyun #define DOC_DPS_OTP_PROTECTED 0x01 215*4882a593Smuzhiyun #define DOC_DPS_READ_PROTECTED 0x02 216*4882a593Smuzhiyun #define DOC_DPS_WRITE_PROTECTED 0x04 217*4882a593Smuzhiyun #define DOC_DPS_HW_LOCK_ENABLED 0x08 218*4882a593Smuzhiyun #define DOC_DPS_KEY_OK 0x80 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun /* 221*4882a593Smuzhiyun * Flash register : DOC_CONFIGURATION 222*4882a593Smuzhiyun */ 223*4882a593Smuzhiyun #define DOC_CONF_IF_CFG 0x80 224*4882a593Smuzhiyun #define DOC_CONF_MAX_ID_MASK 0x30 225*4882a593Smuzhiyun #define DOC_CONF_VCCQ_3V 0x01 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun /* 228*4882a593Smuzhiyun * Flash register : DOC_READADDRESS 229*4882a593Smuzhiyun */ 230*4882a593Smuzhiyun #define DOC_READADDR_INC 0x8000 231*4882a593Smuzhiyun #define DOC_READADDR_ONE_BYTE 0x4000 232*4882a593Smuzhiyun #define DOC_READADDR_ADDR_MASK 0x1fff 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* 235*4882a593Smuzhiyun * Flash register : DOC_POWERMODE 236*4882a593Smuzhiyun */ 237*4882a593Smuzhiyun #define DOC_POWERDOWN_READY 0x80 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* 240*4882a593Smuzhiyun * Status of erase and write operation 241*4882a593Smuzhiyun */ 242*4882a593Smuzhiyun #define DOC_PLANES_STATUS_FAIL 0x01 243*4882a593Smuzhiyun #define DOC_PLANES_STATUS_PLANE0_KO 0x02 244*4882a593Smuzhiyun #define DOC_PLANES_STATUS_PLANE1_KO 0x04 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* 247*4882a593Smuzhiyun * DPS key management 248*4882a593Smuzhiyun * 249*4882a593Smuzhiyun * Each floor of docg3 has 2 protection areas: DPS0 and DPS1. These areas span 250*4882a593Smuzhiyun * across block boundaries, and define whether these blocks can be read or 251*4882a593Smuzhiyun * written. 252*4882a593Smuzhiyun * The definition is dynamically stored in page 0 of blocks (2,3) for DPS0, and 253*4882a593Smuzhiyun * page 0 of blocks (4,5) for DPS1. 254*4882a593Smuzhiyun */ 255*4882a593Smuzhiyun #define DOC_LAYOUT_DPS_KEY_LENGTH 8 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun /** 258*4882a593Smuzhiyun * struct docg3_cascade - Cascade of 1 to 4 docg3 chips 259*4882a593Smuzhiyun * @floors: floors (ie. one physical docg3 chip is one floor) 260*4882a593Smuzhiyun * @base: IO space to access all chips in the cascade 261*4882a593Smuzhiyun * @bch: the BCH correcting control structure 262*4882a593Smuzhiyun * @lock: lock to protect docg3 IO space from concurrent accesses 263*4882a593Smuzhiyun */ 264*4882a593Smuzhiyun struct docg3_cascade { 265*4882a593Smuzhiyun struct mtd_info *floors[DOC_MAX_NBFLOORS]; 266*4882a593Smuzhiyun void __iomem *base; 267*4882a593Smuzhiyun struct bch_control *bch; 268*4882a593Smuzhiyun struct mutex lock; 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /** 272*4882a593Smuzhiyun * struct docg3 - DiskOnChip driver private data 273*4882a593Smuzhiyun * @dev: the device currently under control 274*4882a593Smuzhiyun * @cascade: the cascade this device belongs to 275*4882a593Smuzhiyun * @device_id: number of the cascaded DoCG3 device (0, 1, 2 or 3) 276*4882a593Smuzhiyun * @if_cfg: if true, reads are on 16bits, else reads are on 8bits 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun * @reliable: if 0, docg3 in normal mode, if 1 docg3 in fast mode, if 2 in 279*4882a593Smuzhiyun * reliable mode 280*4882a593Smuzhiyun * Fast mode implies more errors than normal mode. 281*4882a593Smuzhiyun * Reliable mode implies that page 2*n and 2*n+1 are clones. 282*4882a593Smuzhiyun * @bbt: bad block table cache 283*4882a593Smuzhiyun * @oob_write_ofs: offset of the MTD where this OOB should belong (ie. in next 284*4882a593Smuzhiyun * page_write) 285*4882a593Smuzhiyun * @oob_autoecc: if 1, use only bytes 0-7, 15, and fill the others with HW ECC 286*4882a593Smuzhiyun * if 0, use all the 16 bytes. 287*4882a593Smuzhiyun * @oob_write_buf: prepared OOB for next page_write 288*4882a593Smuzhiyun */ 289*4882a593Smuzhiyun struct docg3 { 290*4882a593Smuzhiyun struct device *dev; 291*4882a593Smuzhiyun struct docg3_cascade *cascade; 292*4882a593Smuzhiyun unsigned int device_id:4; 293*4882a593Smuzhiyun unsigned int if_cfg:1; 294*4882a593Smuzhiyun unsigned int reliable:2; 295*4882a593Smuzhiyun int max_block; 296*4882a593Smuzhiyun u8 *bbt; 297*4882a593Smuzhiyun loff_t oob_write_ofs; 298*4882a593Smuzhiyun int oob_autoecc; 299*4882a593Smuzhiyun u8 oob_write_buf[DOC_LAYOUT_OOB_SIZE]; 300*4882a593Smuzhiyun }; 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun #define doc_err(fmt, arg...) dev_err(docg3->dev, (fmt), ## arg) 303*4882a593Smuzhiyun #define doc_info(fmt, arg...) dev_info(docg3->dev, (fmt), ## arg) 304*4882a593Smuzhiyun #define doc_dbg(fmt, arg...) dev_dbg(docg3->dev, (fmt), ## arg) 305*4882a593Smuzhiyun #define doc_vdbg(fmt, arg...) dev_vdbg(docg3->dev, (fmt), ## arg) 306*4882a593Smuzhiyun #endif 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun /* 309*4882a593Smuzhiyun * Trace events part 310*4882a593Smuzhiyun */ 311*4882a593Smuzhiyun #undef TRACE_SYSTEM 312*4882a593Smuzhiyun #define TRACE_SYSTEM docg3 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun #if !defined(_MTD_DOCG3_TRACE) || defined(TRACE_HEADER_MULTI_READ) 315*4882a593Smuzhiyun #define _MTD_DOCG3_TRACE 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun #include <linux/tracepoint.h> 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun TRACE_EVENT(docg3_io, 320*4882a593Smuzhiyun TP_PROTO(int op, int width, u16 reg, int val), 321*4882a593Smuzhiyun TP_ARGS(op, width, reg, val), 322*4882a593Smuzhiyun TP_STRUCT__entry( 323*4882a593Smuzhiyun __field(int, op) 324*4882a593Smuzhiyun __field(unsigned char, width) 325*4882a593Smuzhiyun __field(u16, reg) 326*4882a593Smuzhiyun __field(int, val)), 327*4882a593Smuzhiyun TP_fast_assign( 328*4882a593Smuzhiyun __entry->op = op; 329*4882a593Smuzhiyun __entry->width = width; 330*4882a593Smuzhiyun __entry->reg = reg; 331*4882a593Smuzhiyun __entry->val = val;), 332*4882a593Smuzhiyun TP_printk("docg3: %s%02d reg=%04x, val=%04x", 333*4882a593Smuzhiyun __entry->op ? "write" : "read", __entry->width, 334*4882a593Smuzhiyun __entry->reg, __entry->val) 335*4882a593Smuzhiyun ); 336*4882a593Smuzhiyun #endif 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun /* This part must be outside protection */ 339*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 340*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 341*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 342*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE docg3 343*4882a593Smuzhiyun #include <trace/define_trace.h> 344