1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 #ifndef __MFD_VIPERBOARD_H__
  13 #define __MFD_VIPERBOARD_H__
  14 
  15 #include <linux/types.h>
  16 #include <linux/usb.h>
  17 
  18 #define VPRBRD_EP_OUT               0x02
  19 #define VPRBRD_EP_IN                0x86
  20 
  21 #define VPRBRD_I2C_MSG_LEN          512 
  22 
  23 #define VPRBRD_I2C_FREQ_6MHZ        1                        
  24 #define VPRBRD_I2C_FREQ_3MHZ        2                        
  25 #define VPRBRD_I2C_FREQ_1MHZ        3                        
  26 #define VPRBRD_I2C_FREQ_FAST        4                        
  27 #define VPRBRD_I2C_FREQ_400KHZ      VPRBRD_I2C_FREQ_FAST
  28 #define VPRBRD_I2C_FREQ_200KHZ      5                        
  29 #define VPRBRD_I2C_FREQ_STD         6                        
  30 #define VPRBRD_I2C_FREQ_100KHZ      VPRBRD_I2C_FREQ_STD
  31 #define VPRBRD_I2C_FREQ_10KHZ       7                        
  32 
  33 #define VPRBRD_I2C_CMD_WRITE        0x00
  34 #define VPRBRD_I2C_CMD_READ         0x01
  35 #define VPRBRD_I2C_CMD_ADDR         0x02
  36 
  37 #define VPRBRD_USB_TYPE_OUT         0x40
  38 #define VPRBRD_USB_TYPE_IN          0xc0
  39 #define VPRBRD_USB_TIMEOUT_MS       100
  40 #define VPRBRD_USB_REQUEST_I2C_FREQ 0xe6
  41 #define VPRBRD_USB_REQUEST_I2C      0xe9
  42 #define VPRBRD_USB_REQUEST_MAJOR    0xea
  43 #define VPRBRD_USB_REQUEST_MINOR    0xeb
  44 #define VPRBRD_USB_REQUEST_ADC      0xec
  45 #define VPRBRD_USB_REQUEST_GPIOA    0xed
  46 #define VPRBRD_USB_REQUEST_GPIOB    0xdd
  47 
  48 struct vprbrd_i2c_write_hdr {
  49         u8 cmd;
  50         u16 addr;
  51         u8 len1;
  52         u8 len2;
  53         u8 last;
  54         u8 chan;
  55         u16 spi;
  56 } __packed;
  57 
  58 struct vprbrd_i2c_read_hdr {
  59         u8 cmd;
  60         u16 addr;
  61         u8 len0;
  62         u8 len1;
  63         u8 len2;
  64         u8 len3;
  65         u8 len4;
  66         u8 len5;
  67         u16 tf1;                        
  68         u16 tf2;                        
  69 } __packed;
  70 
  71 struct vprbrd_i2c_status {
  72         u8 unknown[11];
  73         u8 status;
  74 } __packed;
  75 
  76 struct vprbrd_i2c_write_msg {
  77         struct vprbrd_i2c_write_hdr header;
  78         u8 data[VPRBRD_I2C_MSG_LEN
  79                 - sizeof(struct vprbrd_i2c_write_hdr)];
  80 } __packed;
  81 
  82 struct vprbrd_i2c_read_msg {
  83         struct vprbrd_i2c_read_hdr header;
  84         u8 data[VPRBRD_I2C_MSG_LEN
  85                 - sizeof(struct vprbrd_i2c_read_hdr)];
  86 } __packed;
  87 
  88 struct vprbrd_i2c_addr_msg {
  89         u8 cmd;
  90         u8 addr;
  91         u8 unknown1;
  92         u16 len;
  93         u8 unknown2;
  94         u8 unknown3;
  95 } __packed;
  96 
  97 
  98 struct vprbrd {
  99         struct usb_device *usb_dev; 
 100         struct mutex lock;
 101         u8 buf[sizeof(struct vprbrd_i2c_write_msg)];
 102         struct platform_device pdev;
 103 };
 104 
 105 #endif