Merge remote-tracking branch 'remotes/tegra/android-tegra-2.6.36-honeycomb-mr1' into...
[firefly-linux-kernel-4.4.55.git] / drivers / base / devices_filter.h
1 #ifndef __DEVICES_FILTER_H
2 #define __DEVICES_FILTER_H
3 //lt 2010-12-03...
4
5 #define USB_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
6
7 typedef  struct {
8         int  vid;
9         int  pid;
10         const char *manufacturer;
11         const char *product;
12         void *data;
13 }usb_parameter;
14
15 static usb_parameter not_skip_device_list[] = {
16         {0x12D1, 0x1001, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", "HUAWEI Mobile",NULL},
17 //      {0x12D1, 0x1411, "HUAWEI Technology", "HUAWEI Mobile",NULL},
18 };
19
20 static usb_parameter skip_device_list[] = {
21         {0x12D1, 0x1DA1, NULL, NULL, NULL},
22         {0x12D1, 0x1D09, NULL, NULL, NULL},
23         {0x12D1, 0x1520, NULL, NULL, NULL},
24         {0x12D1, 0x14AC, NULL, NULL, NULL},
25         {0x12D1, 0x1465, NULL, NULL, NULL},
26         {0x12D1, 0x1446, NULL, NULL, NULL},
27         {0x12D1, 0x1414, NULL, NULL, NULL},
28         {0x12D1, 0x140C, NULL, NULL, NULL},
29         {0x12D1, 0x1003, NULL, NULL, NULL},
30         {0x12D1, 0x1001, NULL, NULL, NULL},
31
32         {0x19D2, 0xFFF5, NULL, NULL, NULL},
33         {0x19D2, 0xFFF1, NULL, NULL, NULL},
34         {0x19D2, 0x2000, NULL, NULL, NULL},
35         {0x19D2, 0x0120, NULL, NULL, NULL},
36         {0x19D2, 0x0094, NULL, NULL, NULL},
37         {0x19D2, 0x0079, NULL, NULL, NULL},
38         {0x19D2, 0x0073, NULL, NULL, NULL},
39         {0x19D2, 0x0033, NULL, NULL, NULL},
40         {0x19D2, 0x0031, NULL, NULL, NULL},
41         {0x19D2, 0x0026, NULL, NULL, NULL},
42         {0x19D2, 0x0017, NULL, NULL, NULL},
43         {0x19D2, 0x0015, NULL, NULL, NULL},
44
45         {0x04CC, 0x225A, NULL, NULL, NULL},
46         {0x04CC, 0x2259, NULL, NULL, NULL},
47
48         {0x1410, 0x5010, NULL, NULL, NULL},
49         {0x1410, 0x4400, NULL, NULL, NULL},
50         
51         {0x1D09, 0xAEF4, NULL, NULL, NULL},
52
53         {0x1BBB, 0xF000, NULL, NULL, NULL},
54         {0x1BBB, 0x0017, NULL, NULL, NULL},
55         
56 // 山寨
57 //      {0x05C6, -1, NULL, NULL, NULL},
58         {0x20B9, 0x1682, NULL, NULL, NULL},
59
60         {0x028A, 0x1006, NULL, NULL, NULL},
61         
62         {0x1C9E, 0x6061, NULL, NULL, NULL},
63         {0x1C9E, 0x6000, NULL, NULL, NULL},
64         {0x1C9E, 0x1001, NULL, NULL, NULL},
65         
66         {0x21F5, 0x2008, NULL, NULL, NULL},
67         {0x21F5, 0x1000, NULL, NULL, NULL},
68         
69         {0x6000, 0x1000, NULL, NULL, NULL},
70
71         {0x0685, 0x7000, NULL, NULL, NULL},
72 };
73
74 /*
75     0 - 不同
76     1 - 相同
77  */
78 static int match_string(const char* s1, const char* s2)
79 {
80     int count = 0;
81     while( s1[count] && s2[count] && !(s1[count]-s2[count]) )
82         ++count;
83
84     return !(s1[count]-s2[count]);
85 }
86
87 /* 1 - match
88   * 0 - no match
89   */
90 static int __must_check inline match_for_each_entry(usb_parameter* pusbp1, usb_parameter* pusbp2)
91 {
92         if( pusbp1->vid>=0 && pusbp1->vid!=pusbp2->vid)
93             return 0;
94
95         if( pusbp1->pid>=0 && pusbp1->pid!=pusbp2->pid)
96             return 0;
97
98     if( pusbp1->manufacturer )
99     {
100         if( pusbp2->manufacturer==NULL )
101             return 0;
102         else if( strcmp(pusbp1->manufacturer, pusbp2->manufacturer) )
103             return 0;
104     }
105
106     if( pusbp1->product )
107     {
108         if( pusbp2->product==NULL )
109             return 0;
110         else if( strcmp(pusbp1->product, pusbp2->product) )
111             return 0;
112     }
113
114     return 1;
115 }
116
117 /*
118     0 - don't skip
119     1 - skip the device
120  */
121 static int is_skip_device(usb_parameter *pusbp)
122 {
123         int i = 0;
124 /*
125     在 not_skip_device_list 中寻找匹配,找到则该 device 正常流程
126     在 skip_device_list 中寻找匹配,找到则该 device 跳过attach
127     对于不在 skip_device_list,not_skip_device_list,则正常流程
128  */
129         for(i = 0; i < USB_ARRAY_SIZE(not_skip_device_list); i++)
130         {
131                 if(match_for_each_entry(not_skip_device_list+i, pusbp)){
132                     return 0;
133                 }
134         }
135         
136         for(i = 0; i < USB_ARRAY_SIZE(skip_device_list); i++)
137         {
138                 if(match_for_each_entry(skip_device_list+i, pusbp)){
139                     return 1;
140                 }
141         }
142
143         return 0;
144 }
145
146 #endif //__DEVICES_FILTER_H