libpayload: Remove bitfield use from OHCI data structures
[coreboot.git] / payloads / libpayload / drivers / usb / ohci_private.h
index a340be1f3ad5b5176c6c53ff0b9125a18527c6b4..d0b8ffcca9c82b6d246eb2c0f4d859cc15062593 100644 (file)
        typedef enum { OHCI_SETUP=0, OHCI_OUT=1, OHCI_IN=2, OHCI_FROM_TD=3 } ohci_pid_t;
 
        typedef volatile struct {
-               union {
-                       u32 dword0;
-                       struct {
-                               unsigned long function_address:7;
-                               unsigned long endpoint_number:4;
-                               unsigned long direction:2;
-                               unsigned long lowspeed:1;
-                               unsigned long skip:1;
-                               unsigned long format:1;
-                               unsigned long maximum_packet_size:11;
-                               unsigned long:5;
-                       } __attribute__ ((packed));
-               };
+               u32 config;
                u32 tail_pointer;
-               union {
-                       u32 head_pointer;
-                       struct {
-                               unsigned long halted:1;
-                               unsigned long toggle:1;
-                               unsigned long:30;
-                       } __attribute__ ((packed));
-               };
+               u32 head_pointer;
                u32 next_ed;
        } __attribute__ ((packed)) ed_t;
+#define ED_HALTED 1
+#define ED_TOGGLE 2
+
+#define ED_FUNC_SHIFT 0
+#define ED_FUNC_MASK MASK(7, 0)
+#define ED_EP_SHIFT 7
+#define ED_EP_MASK MASK(4, 7)
+#define ED_DIR_SHIFT 11
+#define ED_DIR_MASK MASK(2, 11)
+#define ED_LOWSPEED (1 << 13)
+#define ED_MPS_SHIFT 16
 
        typedef volatile struct {
-               union {
-                       u32 dword0;
-                       struct {
-                               unsigned long:18;
-                               unsigned long buffer_rounding:1;
-                               unsigned long direction:2;
-                               unsigned long delay_interrupt:3;
-                               unsigned long toggle:1;
-                               unsigned long toggle_from_td:1;
-                               unsigned long error_count:2;
-                               unsigned long condition_code:4;
-                       } __attribute__ ((packed));
-               };
+               u32 config;
                u32 current_buffer_pointer;
                u32 next_td;
                u32 buffer_end;
        } __attribute__ ((packed)) td_t;
+#define TD_DIRECTION_SHIFT 19
+#define TD_DIRECTION_MASK MASK(2, TD_DIRECTION_SHIFT)
+#define TD_DIRECTION_SETUP OHCI_SETUP << TD_DIRECTION_SHIFT
+#define TD_DIRECTION_IN OHCI_IN << TD_DIRECTION_SHIFT
+#define TD_DIRECTION_OUT OHCI_OUT << TD_DIRECTION_SHIFT
+#define TD_DELAY_INTERRUPT_NODELAY (7 << 21)
+#define TD_TOGGLE_DATA0 0
+#define TD_TOGGLE_DATA1 (1 << 24)
+#define TD_TOGGLE_FROM_ED 0
+#define TD_TOGGLE_FROM_TD (1 << 25)
+#define TD_CC_SHIFT 28
+#define TD_CC_MASK MASK(4, TD_CC_SHIFT)
+#define TD_CC_NOERR 0
+#define TD_CC_NOACCESS (14 << TD_CC_SHIFT) /* the lower of the two values, so "no access" can be tested with >= */
 
 #define OHCI_INST(controller) ((ohci_t*)((controller)->instance))