Browse Source

abcio: split up the callbacks for the main data channel

Split the callbacks for the main data channel (OUT 0/INP 0) since they
will probably need very different actions.
H. Peter Anvin 3 years ago
parent
commit
02cda74b0e
2 changed files with 11 additions and 6 deletions
  1. 7 4
      fw/abcio.c
  2. 4 2
      fw/abcio.h

+ 7 - 4
fw/abcio.c

@@ -47,12 +47,15 @@ IRQHANDLER(abc)
 		if (dev->out_cnt)
 		    callback &= ~1;
 	    }
+	    dev->out_data[addr] = data;
+	    if (callback & 1)
+		dev->callback_out(dev, data);
+	    break;
 
-	    /* fall through */
 	case 2 ... 5:
 	    dev->out_data[addr] = data;
 	    if (callback & (1 << addr))
-		dev->callback_out(dev, data, addr);
+		dev->callback_cmd(dev, data, addr);
 	    break;
 
 	case 1:
@@ -83,14 +86,14 @@ IRQHANDLER(abc)
 	} else {
 	    ABC_INP0_DATA = dev->inp_data[0] = dev->inp_data_def;
 	    if (callback & 0x100)
-		dev->callback_inp(dev, 0);
+		dev->callback_inp(dev);
 	}
     }
 
     if (what & 0x200) {
 	ABC_INP1_DATA = dev->inp_data[1];
 	if (callback & 0x200)
-	    dev->callback_inp(dev, 1);
+	    dev->callback_status(dev);
     }
 
     ABC_BUSY_STATUS = what;

+ 4 - 2
fw/abcio.h

@@ -26,8 +26,10 @@ struct abc_dev {
 	uint32_t inp_data_w;
     };
 
-    void (*callback_out)(struct abc_dev *, uint8_t addr, uint8_t data);
-    void (*callback_inp)(struct abc_dev *, uint8_t addr);
+    void (*callback_out)(struct abc_dev *, uint8_t data);
+    void (*callback_inp)(struct abc_dev *);
+    void (*callback_cmd)(struct abc_dev *, uint8_t addr, uint8_t data);
+    void (*callback_status)(struct abc_dev *);
 };
 
 void abc_setup_out_queue(struct abc_dev *dev, void *buf, size_t len,