1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * include/linux/mfd/viperboard.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Nano River Technologies viperboard definitions 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * (C) 2012 by Lemonage GmbH 8*4882a593Smuzhiyun * Author: Lars Poeschel <poeschel@lemonage.de> 9*4882a593Smuzhiyun * All rights reserved. 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef __MFD_VIPERBOARD_H__ 13*4882a593Smuzhiyun #define __MFD_VIPERBOARD_H__ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/types.h> 16*4882a593Smuzhiyun #include <linux/usb.h> 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define VPRBRD_EP_OUT 0x02 19*4882a593Smuzhiyun #define VPRBRD_EP_IN 0x86 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define VPRBRD_I2C_MSG_LEN 512 /* max length of a msg on USB level */ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_6MHZ 1 /* 6 MBit/s */ 24*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_3MHZ 2 /* 3 MBit/s */ 25*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_1MHZ 3 /* 1 MBit/s */ 26*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_FAST 4 /* 400 kbit/s */ 27*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_400KHZ VPRBRD_I2C_FREQ_FAST 28*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_200KHZ 5 /* 200 kbit/s */ 29*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_STD 6 /* 100 kbit/s */ 30*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_100KHZ VPRBRD_I2C_FREQ_STD 31*4882a593Smuzhiyun #define VPRBRD_I2C_FREQ_10KHZ 7 /* 10 kbit/s */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define VPRBRD_I2C_CMD_WRITE 0x00 34*4882a593Smuzhiyun #define VPRBRD_I2C_CMD_READ 0x01 35*4882a593Smuzhiyun #define VPRBRD_I2C_CMD_ADDR 0x02 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define VPRBRD_USB_TYPE_OUT 0x40 38*4882a593Smuzhiyun #define VPRBRD_USB_TYPE_IN 0xc0 39*4882a593Smuzhiyun #define VPRBRD_USB_TIMEOUT_MS 100 40*4882a593Smuzhiyun #define VPRBRD_USB_REQUEST_I2C_FREQ 0xe6 41*4882a593Smuzhiyun #define VPRBRD_USB_REQUEST_I2C 0xe9 42*4882a593Smuzhiyun #define VPRBRD_USB_REQUEST_MAJOR 0xea 43*4882a593Smuzhiyun #define VPRBRD_USB_REQUEST_MINOR 0xeb 44*4882a593Smuzhiyun #define VPRBRD_USB_REQUEST_ADC 0xec 45*4882a593Smuzhiyun #define VPRBRD_USB_REQUEST_GPIOA 0xed 46*4882a593Smuzhiyun #define VPRBRD_USB_REQUEST_GPIOB 0xdd 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct vprbrd_i2c_write_hdr { 49*4882a593Smuzhiyun u8 cmd; 50*4882a593Smuzhiyun u16 addr; 51*4882a593Smuzhiyun u8 len1; 52*4882a593Smuzhiyun u8 len2; 53*4882a593Smuzhiyun u8 last; 54*4882a593Smuzhiyun u8 chan; 55*4882a593Smuzhiyun u16 spi; 56*4882a593Smuzhiyun } __packed; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct vprbrd_i2c_read_hdr { 59*4882a593Smuzhiyun u8 cmd; 60*4882a593Smuzhiyun u16 addr; 61*4882a593Smuzhiyun u8 len0; 62*4882a593Smuzhiyun u8 len1; 63*4882a593Smuzhiyun u8 len2; 64*4882a593Smuzhiyun u8 len3; 65*4882a593Smuzhiyun u8 len4; 66*4882a593Smuzhiyun u8 len5; 67*4882a593Smuzhiyun u16 tf1; /* transfer 1 length */ 68*4882a593Smuzhiyun u16 tf2; /* transfer 2 length */ 69*4882a593Smuzhiyun } __packed; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct vprbrd_i2c_status { 72*4882a593Smuzhiyun u8 unknown[11]; 73*4882a593Smuzhiyun u8 status; 74*4882a593Smuzhiyun } __packed; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct vprbrd_i2c_write_msg { 77*4882a593Smuzhiyun struct vprbrd_i2c_write_hdr header; 78*4882a593Smuzhiyun u8 data[VPRBRD_I2C_MSG_LEN 79*4882a593Smuzhiyun - sizeof(struct vprbrd_i2c_write_hdr)]; 80*4882a593Smuzhiyun } __packed; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct vprbrd_i2c_read_msg { 83*4882a593Smuzhiyun struct vprbrd_i2c_read_hdr header; 84*4882a593Smuzhiyun u8 data[VPRBRD_I2C_MSG_LEN 85*4882a593Smuzhiyun - sizeof(struct vprbrd_i2c_read_hdr)]; 86*4882a593Smuzhiyun } __packed; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct vprbrd_i2c_addr_msg { 89*4882a593Smuzhiyun u8 cmd; 90*4882a593Smuzhiyun u8 addr; 91*4882a593Smuzhiyun u8 unknown1; 92*4882a593Smuzhiyun u16 len; 93*4882a593Smuzhiyun u8 unknown2; 94*4882a593Smuzhiyun u8 unknown3; 95*4882a593Smuzhiyun } __packed; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* Structure to hold all device specific stuff */ 98*4882a593Smuzhiyun struct vprbrd { 99*4882a593Smuzhiyun struct usb_device *usb_dev; /* the usb device for this device */ 100*4882a593Smuzhiyun struct mutex lock; 101*4882a593Smuzhiyun u8 buf[sizeof(struct vprbrd_i2c_write_msg)]; 102*4882a593Smuzhiyun struct platform_device pdev; 103*4882a593Smuzhiyun }; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #endif /* __MFD_VIPERBOARD_H__ */ 106