#include <linux/bits.h>
 #include <uapi/asm/ptrace.h>
+#include <asm/tpi.h>
 
 #define PIF_SYSCALL            0       /* inside a system call */
 #define PIF_SYSCALL_RESTART    1       /* restart the current system call */
                };
        };
        unsigned long orig_gpr2;
-       unsigned int int_code;
-       unsigned int int_parm;
-       unsigned long int_parm_long;
+       union {
+               struct {
+                       unsigned int int_code;
+                       unsigned int int_parm;
+                       unsigned long int_parm_long;
+               };
+               struct tpi_info tpi_info;
+       };
        unsigned long flags;
        unsigned long cr1;
 };
 
 #include <linux/types.h>
 #include <uapi/asm/schid.h>
 
+#ifndef __ASSEMBLY__
+
 /* I/O-Interruption Code as stored by TEST PENDING INTERRUPTION (TPI). */
 struct tpi_info {
        struct subchannel_id schid;
        u32 :12;
 } __packed __aligned(4);
 
+#endif /* __ASSEMBLY__ */
+
 #endif /* _ASM_S390_TPI_H */
 
 
 #include <linux/types.h>
 
+#ifndef __ASSEMBLY__
+
 struct subchannel_id {
        __u32 cssid : 8;
        __u32 : 4;
        __u32 sch_no : 16;
 } __attribute__ ((packed, aligned(4)));
 
+#endif /* __ASSEMBLY__ */
 
 #endif /* _UAPIASM_SCHID_H */
 
        struct hlist_head *head;
 
        set_cpu_flag(CIF_NOHZ_DELAY);
-       tpi_info = (struct tpi_info *) &get_irq_regs()->int_code;
+       tpi_info = &get_irq_regs()->tpi_info;
        trace_s390_cio_adapter_int(tpi_info);
        head = &airq_lists[tpi_info->isc];
        rcu_read_lock();
 
        struct irb *irb;
 
        set_cpu_flag(CIF_NOHZ_DELAY);
-       tpi_info = (struct tpi_info *) &get_irq_regs()->int_code;
+       tpi_info = &get_irq_regs()->tpi_info;
        trace_s390_cio_interrupt(tpi_info);
        irb = this_cpu_ptr(&cio_irb);
        sch = (struct subchannel *)(unsigned long) tpi_info->intparm;