]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/s390/cio/ioasm.h
Merge branch 'linus' into release
[karo-tx-linux.git] / drivers / s390 / cio / ioasm.h
index fac06155773f11864041bc4cca74dd742e270579..4d80fc67a06b140639b6410f2668ff21e21e545f 100644 (file)
@@ -3,6 +3,8 @@
 
 #include <asm/chpid.h>
 #include <asm/schid.h>
+#include "orb.h"
+#include "cio.h"
 
 /*
  * TPI info structure
@@ -87,6 +89,38 @@ static inline int tsch(struct subchannel_id schid, struct irb *addr)
        return ccode;
 }
 
+static inline int ssch(struct subchannel_id schid, union orb *addr)
+{
+       register struct subchannel_id reg1 asm("1") = schid;
+       int ccode = -EIO;
+
+       asm volatile(
+               "       ssch    0(%2)\n"
+               "0:     ipm     %0\n"
+               "       srl     %0,28\n"
+               "1:\n"
+               EX_TABLE(0b, 1b)
+               : "+d" (ccode)
+               : "d" (reg1), "a" (addr), "m" (*addr)
+               : "cc", "memory");
+       return ccode;
+}
+
+static inline int csch(struct subchannel_id schid)
+{
+       register struct subchannel_id reg1 asm("1") = schid;
+       int ccode;
+
+       asm volatile(
+               "       csch\n"
+               "       ipm     %0\n"
+               "       srl     %0,28"
+               : "=d" (ccode)
+               : "d" (reg1)
+               : "cc");
+       return ccode;
+}
+
 static inline int tpi(struct tpi_info *addr)
 {
        int ccode;