xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/parser/Device.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright (c) 1997  Metro Link Incorporated
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
6*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
7*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
8*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
10*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
13*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*4882a593Smuzhiyun  * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19*4882a593Smuzhiyun  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
20*4882a593Smuzhiyun  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*4882a593Smuzhiyun  * SOFTWARE.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * Except as contained in this notice, the name of the Metro Link shall not be
24*4882a593Smuzhiyun  * used in advertising or otherwise to promote the sale, use or other dealings
25*4882a593Smuzhiyun  * in this Software without prior written authorization from Metro Link.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun  * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
32*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
33*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
34*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
35*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
36*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
37*4882a593Smuzhiyun  *
38*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
39*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
40*4882a593Smuzhiyun  *
41*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
42*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
43*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
44*4882a593Smuzhiyun  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
45*4882a593Smuzhiyun  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
46*4882a593Smuzhiyun  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
47*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
48*4882a593Smuzhiyun  *
49*4882a593Smuzhiyun  * Except as contained in this notice, the name of the copyright holder(s)
50*4882a593Smuzhiyun  * and author(s) shall not be used in advertising or otherwise to promote
51*4882a593Smuzhiyun  * the sale, use or other dealings in this Software without prior written
52*4882a593Smuzhiyun  * authorization from the copyright holder(s) and author(s).
53*4882a593Smuzhiyun  */
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #ifdef HAVE_XORG_CONFIG_H
56*4882a593Smuzhiyun #include <xorg-config.h>
57*4882a593Smuzhiyun #endif
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #include "xf86Parser.h"
60*4882a593Smuzhiyun #include "xf86tokens.h"
61*4882a593Smuzhiyun #include "Configint.h"
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun static const xf86ConfigSymTabRec DeviceTab[] = {
65*4882a593Smuzhiyun     {ENDSECTION, "endsection"},
66*4882a593Smuzhiyun     {IDENTIFIER, "identifier"},
67*4882a593Smuzhiyun     {VENDOR, "vendorname"},
68*4882a593Smuzhiyun     {BOARD, "boardname"},
69*4882a593Smuzhiyun     {CHIPSET, "chipset"},
70*4882a593Smuzhiyun     {RAMDAC, "ramdac"},
71*4882a593Smuzhiyun     {DACSPEED, "dacspeed"},
72*4882a593Smuzhiyun     {CLOCKS, "clocks"},
73*4882a593Smuzhiyun     {MATCHSEAT, "matchseat"},
74*4882a593Smuzhiyun     {OPTION, "option"},
75*4882a593Smuzhiyun     {VIDEORAM, "videoram"},
76*4882a593Smuzhiyun     {BIOSBASE, "biosbase"},
77*4882a593Smuzhiyun     {MEMBASE, "membase"},
78*4882a593Smuzhiyun     {IOBASE, "iobase"},
79*4882a593Smuzhiyun     {CLOCKCHIP, "clockchip"},
80*4882a593Smuzhiyun     {CHIPID, "chipid"},
81*4882a593Smuzhiyun     {CHIPREV, "chiprev"},
82*4882a593Smuzhiyun     {CARD, "card"},
83*4882a593Smuzhiyun     {DRIVER, "driver"},
84*4882a593Smuzhiyun     {BUSID, "busid"},
85*4882a593Smuzhiyun     {IRQ, "irq"},
86*4882a593Smuzhiyun     {SCREEN, "screen"},
87*4882a593Smuzhiyun     {-1, ""},
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun #define CLEANUP xf86freeDeviceList
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun XF86ConfDevicePtr
xf86parseDeviceSection(void)93*4882a593Smuzhiyun xf86parseDeviceSection(void)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun     int i;
96*4882a593Smuzhiyun     int has_ident = FALSE;
97*4882a593Smuzhiyun     int token;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun     parsePrologue(XF86ConfDevicePtr, XF86ConfDeviceRec)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun         /* Zero is a valid value for these */
102*4882a593Smuzhiyun         ptr->dev_chipid = -1;
103*4882a593Smuzhiyun     ptr->dev_chiprev = -1;
104*4882a593Smuzhiyun     ptr->dev_irq = -1;
105*4882a593Smuzhiyun     while ((token = xf86getToken(DeviceTab)) != ENDSECTION) {
106*4882a593Smuzhiyun         switch (token) {
107*4882a593Smuzhiyun         case COMMENT:
108*4882a593Smuzhiyun             ptr->dev_comment = xf86addComment(ptr->dev_comment, xf86_lex_val.str);
109*4882a593Smuzhiyun             break;
110*4882a593Smuzhiyun         case IDENTIFIER:
111*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
112*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Identifier");
113*4882a593Smuzhiyun             if (has_ident == TRUE)
114*4882a593Smuzhiyun                 Error(MULTIPLE_MSG, "Identifier");
115*4882a593Smuzhiyun             ptr->dev_identifier = xf86_lex_val.str;
116*4882a593Smuzhiyun             has_ident = TRUE;
117*4882a593Smuzhiyun             break;
118*4882a593Smuzhiyun         case VENDOR:
119*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
120*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Vendor");
121*4882a593Smuzhiyun             ptr->dev_vendor = xf86_lex_val.str;
122*4882a593Smuzhiyun             break;
123*4882a593Smuzhiyun         case BOARD:
124*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
125*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Board");
126*4882a593Smuzhiyun             ptr->dev_board = xf86_lex_val.str;
127*4882a593Smuzhiyun             break;
128*4882a593Smuzhiyun         case CHIPSET:
129*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
130*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Chipset");
131*4882a593Smuzhiyun             ptr->dev_chipset = xf86_lex_val.str;
132*4882a593Smuzhiyun             break;
133*4882a593Smuzhiyun         case CARD:
134*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
135*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Card");
136*4882a593Smuzhiyun             ptr->dev_card = xf86_lex_val.str;
137*4882a593Smuzhiyun             break;
138*4882a593Smuzhiyun         case DRIVER:
139*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
140*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Driver");
141*4882a593Smuzhiyun             ptr->dev_driver = xf86_lex_val.str;
142*4882a593Smuzhiyun             break;
143*4882a593Smuzhiyun         case RAMDAC:
144*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
145*4882a593Smuzhiyun                 Error(QUOTE_MSG, "Ramdac");
146*4882a593Smuzhiyun             ptr->dev_ramdac = xf86_lex_val.str;
147*4882a593Smuzhiyun             break;
148*4882a593Smuzhiyun         case DACSPEED:
149*4882a593Smuzhiyun             for (i = 0; i < CONF_MAXDACSPEEDS; i++)
150*4882a593Smuzhiyun                 ptr->dev_dacSpeeds[i] = 0;
151*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER) {
152*4882a593Smuzhiyun                 Error(DACSPEED_MSG, CONF_MAXDACSPEEDS);
153*4882a593Smuzhiyun             }
154*4882a593Smuzhiyun             else {
155*4882a593Smuzhiyun                 ptr->dev_dacSpeeds[0] = (int) (xf86_lex_val.realnum * 1000.0 + 0.5);
156*4882a593Smuzhiyun                 for (i = 1; i < CONF_MAXDACSPEEDS; i++) {
157*4882a593Smuzhiyun                     if (xf86getSubToken(&(ptr->dev_comment)) == NUMBER)
158*4882a593Smuzhiyun                         ptr->dev_dacSpeeds[i] = (int)
159*4882a593Smuzhiyun                             (xf86_lex_val.realnum * 1000.0 + 0.5);
160*4882a593Smuzhiyun                     else {
161*4882a593Smuzhiyun                         xf86unGetToken(token);
162*4882a593Smuzhiyun                         break;
163*4882a593Smuzhiyun                     }
164*4882a593Smuzhiyun                 }
165*4882a593Smuzhiyun             }
166*4882a593Smuzhiyun             break;
167*4882a593Smuzhiyun         case VIDEORAM:
168*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
169*4882a593Smuzhiyun                 Error(NUMBER_MSG, "VideoRam");
170*4882a593Smuzhiyun             ptr->dev_videoram = xf86_lex_val.num;
171*4882a593Smuzhiyun             break;
172*4882a593Smuzhiyun         case BIOSBASE:
173*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
174*4882a593Smuzhiyun                 Error(NUMBER_MSG, "BIOSBase");
175*4882a593Smuzhiyun             /* ignored */
176*4882a593Smuzhiyun             break;
177*4882a593Smuzhiyun         case MEMBASE:
178*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
179*4882a593Smuzhiyun                 Error(NUMBER_MSG, "MemBase");
180*4882a593Smuzhiyun             ptr->dev_mem_base = xf86_lex_val.num;
181*4882a593Smuzhiyun             break;
182*4882a593Smuzhiyun         case IOBASE:
183*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
184*4882a593Smuzhiyun                 Error(NUMBER_MSG, "IOBase");
185*4882a593Smuzhiyun             ptr->dev_io_base = xf86_lex_val.num;
186*4882a593Smuzhiyun             break;
187*4882a593Smuzhiyun         case CLOCKCHIP:
188*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
189*4882a593Smuzhiyun                 Error(QUOTE_MSG, "ClockChip");
190*4882a593Smuzhiyun             ptr->dev_clockchip = xf86_lex_val.str;
191*4882a593Smuzhiyun             break;
192*4882a593Smuzhiyun         case CHIPID:
193*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
194*4882a593Smuzhiyun                 Error(NUMBER_MSG, "ChipID");
195*4882a593Smuzhiyun             ptr->dev_chipid = xf86_lex_val.num;
196*4882a593Smuzhiyun             break;
197*4882a593Smuzhiyun         case CHIPREV:
198*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
199*4882a593Smuzhiyun                 Error(NUMBER_MSG, "ChipRev");
200*4882a593Smuzhiyun             ptr->dev_chiprev = xf86_lex_val.num;
201*4882a593Smuzhiyun             break;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun         case CLOCKS:
204*4882a593Smuzhiyun             token = xf86getSubToken(&(ptr->dev_comment));
205*4882a593Smuzhiyun             for (i = ptr->dev_clocks;
206*4882a593Smuzhiyun                  token == NUMBER && i < CONF_MAXCLOCKS; i++) {
207*4882a593Smuzhiyun                 ptr->dev_clock[i] = (int) (xf86_lex_val.realnum * 1000.0 + 0.5);
208*4882a593Smuzhiyun                 token = xf86getSubToken(&(ptr->dev_comment));
209*4882a593Smuzhiyun             }
210*4882a593Smuzhiyun             ptr->dev_clocks = i;
211*4882a593Smuzhiyun             xf86unGetToken(token);
212*4882a593Smuzhiyun             break;
213*4882a593Smuzhiyun         case MATCHSEAT:
214*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
215*4882a593Smuzhiyun                 Error(QUOTE_MSG, "MatchSeat");
216*4882a593Smuzhiyun             ptr->match_seat = xf86_lex_val.str;
217*4882a593Smuzhiyun             break;
218*4882a593Smuzhiyun         case OPTION:
219*4882a593Smuzhiyun             ptr->dev_option_lst = xf86parseOption(ptr->dev_option_lst);
220*4882a593Smuzhiyun             break;
221*4882a593Smuzhiyun         case BUSID:
222*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
223*4882a593Smuzhiyun                 Error(QUOTE_MSG, "BusID");
224*4882a593Smuzhiyun             ptr->dev_busid = xf86_lex_val.str;
225*4882a593Smuzhiyun             break;
226*4882a593Smuzhiyun         case IRQ:
227*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
228*4882a593Smuzhiyun                 Error(QUOTE_MSG, "IRQ");
229*4882a593Smuzhiyun             ptr->dev_irq = xf86_lex_val.num;
230*4882a593Smuzhiyun             break;
231*4882a593Smuzhiyun         case SCREEN:
232*4882a593Smuzhiyun             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
233*4882a593Smuzhiyun                 Error(NUMBER_MSG, "Screen");
234*4882a593Smuzhiyun             ptr->dev_screen = xf86_lex_val.num;
235*4882a593Smuzhiyun             break;
236*4882a593Smuzhiyun         case EOF_TOKEN:
237*4882a593Smuzhiyun             Error(UNEXPECTED_EOF_MSG);
238*4882a593Smuzhiyun             break;
239*4882a593Smuzhiyun         default:
240*4882a593Smuzhiyun             Error(INVALID_KEYWORD_MSG, xf86tokenString());
241*4882a593Smuzhiyun             break;
242*4882a593Smuzhiyun         }
243*4882a593Smuzhiyun     }
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun     if (!has_ident)
246*4882a593Smuzhiyun         Error(NO_IDENT_MSG);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun #ifdef DEBUG
249*4882a593Smuzhiyun     printf("Device section parsed\n");
250*4882a593Smuzhiyun #endif
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun     return ptr;
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun #undef CLEANUP
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun void
xf86printDeviceSection(FILE * cf,XF86ConfDevicePtr ptr)258*4882a593Smuzhiyun xf86printDeviceSection(FILE * cf, XF86ConfDevicePtr ptr)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun     int i;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun     while (ptr) {
263*4882a593Smuzhiyun         fprintf(cf, "Section \"Device\"\n");
264*4882a593Smuzhiyun         if (ptr->dev_comment)
265*4882a593Smuzhiyun             fprintf(cf, "%s", ptr->dev_comment);
266*4882a593Smuzhiyun         if (ptr->dev_identifier)
267*4882a593Smuzhiyun             fprintf(cf, "\tIdentifier  \"%s\"\n", ptr->dev_identifier);
268*4882a593Smuzhiyun         if (ptr->dev_driver)
269*4882a593Smuzhiyun             fprintf(cf, "\tDriver      \"%s\"\n", ptr->dev_driver);
270*4882a593Smuzhiyun         if (ptr->dev_vendor)
271*4882a593Smuzhiyun             fprintf(cf, "\tVendorName  \"%s\"\n", ptr->dev_vendor);
272*4882a593Smuzhiyun         if (ptr->dev_board)
273*4882a593Smuzhiyun             fprintf(cf, "\tBoardName   \"%s\"\n", ptr->dev_board);
274*4882a593Smuzhiyun         if (ptr->dev_chipset)
275*4882a593Smuzhiyun             fprintf(cf, "\tChipSet     \"%s\"\n", ptr->dev_chipset);
276*4882a593Smuzhiyun         if (ptr->dev_card)
277*4882a593Smuzhiyun             fprintf(cf, "\tCard        \"%s\"\n", ptr->dev_card);
278*4882a593Smuzhiyun         if (ptr->dev_ramdac)
279*4882a593Smuzhiyun             fprintf(cf, "\tRamDac      \"%s\"\n", ptr->dev_ramdac);
280*4882a593Smuzhiyun         if (ptr->dev_dacSpeeds[0] > 0) {
281*4882a593Smuzhiyun             fprintf(cf, "\tDacSpeed    ");
282*4882a593Smuzhiyun             for (i = 0; i < CONF_MAXDACSPEEDS && ptr->dev_dacSpeeds[i] > 0; i++)
283*4882a593Smuzhiyun                 fprintf(cf, "%g ", (double) (ptr->dev_dacSpeeds[i]) / 1000.0);
284*4882a593Smuzhiyun             fprintf(cf, "\n");
285*4882a593Smuzhiyun         }
286*4882a593Smuzhiyun         if (ptr->dev_videoram)
287*4882a593Smuzhiyun             fprintf(cf, "\tVideoRam    %d\n", ptr->dev_videoram);
288*4882a593Smuzhiyun         if (ptr->dev_mem_base)
289*4882a593Smuzhiyun             fprintf(cf, "\tMemBase     0x%lx\n", ptr->dev_mem_base);
290*4882a593Smuzhiyun         if (ptr->dev_io_base)
291*4882a593Smuzhiyun             fprintf(cf, "\tIOBase      0x%lx\n", ptr->dev_io_base);
292*4882a593Smuzhiyun         if (ptr->dev_clockchip)
293*4882a593Smuzhiyun             fprintf(cf, "\tClockChip   \"%s\"\n", ptr->dev_clockchip);
294*4882a593Smuzhiyun         if (ptr->dev_chipid != -1)
295*4882a593Smuzhiyun             fprintf(cf, "\tChipId      0x%x\n", ptr->dev_chipid);
296*4882a593Smuzhiyun         if (ptr->dev_chiprev != -1)
297*4882a593Smuzhiyun             fprintf(cf, "\tChipRev     0x%x\n", ptr->dev_chiprev);
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun         xf86printOptionList(cf, ptr->dev_option_lst, 1);
300*4882a593Smuzhiyun         if (ptr->dev_clocks > 0) {
301*4882a593Smuzhiyun             fprintf(cf, "\tClocks      ");
302*4882a593Smuzhiyun             for (i = 0; i < ptr->dev_clocks; i++)
303*4882a593Smuzhiyun                 fprintf(cf, "%.1f ", (double) ptr->dev_clock[i] / 1000.0);
304*4882a593Smuzhiyun             fprintf(cf, "\n");
305*4882a593Smuzhiyun         }
306*4882a593Smuzhiyun         if (ptr->dev_busid)
307*4882a593Smuzhiyun             fprintf(cf, "\tBusID       \"%s\"\n", ptr->dev_busid);
308*4882a593Smuzhiyun         if (ptr->dev_screen > 0)
309*4882a593Smuzhiyun             fprintf(cf, "\tScreen      %d\n", ptr->dev_screen);
310*4882a593Smuzhiyun         if (ptr->dev_irq >= 0)
311*4882a593Smuzhiyun             fprintf(cf, "\tIRQ         %d\n", ptr->dev_irq);
312*4882a593Smuzhiyun         fprintf(cf, "EndSection\n\n");
313*4882a593Smuzhiyun         ptr = ptr->list.next;
314*4882a593Smuzhiyun     }
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun void
xf86freeDeviceList(XF86ConfDevicePtr ptr)318*4882a593Smuzhiyun xf86freeDeviceList(XF86ConfDevicePtr ptr)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun     XF86ConfDevicePtr prev;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun     while (ptr) {
323*4882a593Smuzhiyun         TestFree(ptr->dev_identifier);
324*4882a593Smuzhiyun         TestFree(ptr->dev_vendor);
325*4882a593Smuzhiyun         TestFree(ptr->dev_board);
326*4882a593Smuzhiyun         TestFree(ptr->dev_chipset);
327*4882a593Smuzhiyun         TestFree(ptr->dev_card);
328*4882a593Smuzhiyun         TestFree(ptr->dev_driver);
329*4882a593Smuzhiyun         TestFree(ptr->dev_ramdac);
330*4882a593Smuzhiyun         TestFree(ptr->dev_clockchip);
331*4882a593Smuzhiyun         TestFree(ptr->dev_comment);
332*4882a593Smuzhiyun         xf86optionListFree(ptr->dev_option_lst);
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun         prev = ptr;
335*4882a593Smuzhiyun         ptr = ptr->list.next;
336*4882a593Smuzhiyun         free(prev);
337*4882a593Smuzhiyun     }
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun XF86ConfDevicePtr
xf86findDevice(const char * ident,XF86ConfDevicePtr p)341*4882a593Smuzhiyun xf86findDevice(const char *ident, XF86ConfDevicePtr p)
342*4882a593Smuzhiyun {
343*4882a593Smuzhiyun     while (p) {
344*4882a593Smuzhiyun         if (xf86nameCompare(ident, p->dev_identifier) == 0)
345*4882a593Smuzhiyun             return p;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun         p = p->list.next;
348*4882a593Smuzhiyun     }
349*4882a593Smuzhiyun     return NULL;
350*4882a593Smuzhiyun }
351