xref: /OK3568_Linux_fs/kernel/include/linux/mfd/viperboard.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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