1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * include/linux/mfd/viperboard.h 4 * 5 * Nano River Technologies viperboard definitions 6 * 7 * (C) 2012 by Lemonage GmbH 8 * Author: Lars Poeschel <poeschel@lemonage.de> 9 * All rights reserved. 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 /* max length of a msg on USB level */ 22 23 #define VPRBRD_I2C_FREQ_6MHZ 1 /* 6 MBit/s */ 24 #define VPRBRD_I2C_FREQ_3MHZ 2 /* 3 MBit/s */ 25 #define VPRBRD_I2C_FREQ_1MHZ 3 /* 1 MBit/s */ 26 #define VPRBRD_I2C_FREQ_FAST 4 /* 400 kbit/s */ 27 #define VPRBRD_I2C_FREQ_400KHZ VPRBRD_I2C_FREQ_FAST 28 #define VPRBRD_I2C_FREQ_200KHZ 5 /* 200 kbit/s */ 29 #define VPRBRD_I2C_FREQ_STD 6 /* 100 kbit/s */ 30 #define VPRBRD_I2C_FREQ_100KHZ VPRBRD_I2C_FREQ_STD 31 #define VPRBRD_I2C_FREQ_10KHZ 7 /* 10 kbit/s */ 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; /* transfer 1 length */ 68 u16 tf2; /* transfer 2 length */ 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 /* Structure to hold all device specific stuff */ 98 struct vprbrd { 99 struct usb_device *usb_dev; /* the usb device for this device */ 100 struct mutex lock; 101 u8 buf[sizeof(struct vprbrd_i2c_write_msg)]; 102 struct platform_device pdev; 103 }; 104 105 #endif /* __MFD_VIPERBOARD_H__ */ 106