Annotation of margi2/streams.c, revision 1.1

1.1     ! cvs         1: /* 
        !             2:     streams.c
        !             3: 
        !             4:     Copyright (C) Christian Wolff for convergence integrated media.
        !             5: 
        !             6:     This program is free software; you can redistribute it and/or modify
        !             7:     it under the terms of the GNU General Public License as published by
        !             8:     the Free Software Foundation; either version 2 of the License, or
        !             9:     (at your option) any later version.
        !            10: 
        !            11:     This program is distributed in the hope that it will be useful,
        !            12:     but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14:     GNU General Public License for more details.
        !            15: 
        !            16:     You should have received a copy of the GNU General Public License
        !            17:     along with this program; if not, write to the Free Software
        !            18:     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            19: */
        !            20: 
        !            21: #define __NO_VERSION__
        !            22: 
        !            23: #include "streams.h"
        !            24: #include "dram.h"
        !            25: #include "l64021.h"
        !            26: #include "video.h"
        !            27: #include "audio.h"
        !            28: 
        !            29: // Frees allocated channel buffers
        !            30: int DecoderKillChannelBuffers(struct cvdv_cards *card)
        !            31: {
        !            32:        printk(KERN_DEBUG LOGNAME ": -- DecoderKillChannelBuffers\n");
        !            33:        DecoderStopDecode(card);
        !            34:        DRAMFree(card, card->VideoES);
        !            35:        card->VideoES = BLANK;
        !            36:        DRAMFree(card, card->AudioES);
        !            37:        card->AudioES = BLANK;
        !            38:        DRAMFree(card, card->VideoPES);
        !            39:        card->VideoPES = BLANK;
        !            40:        DRAMFree(card, card->DataDump);
        !            41:        card->DataDump = BLANK;
        !            42:        DRAMFree(card, card->AudioPES);
        !            43:        card->AudioPES = BLANK;
        !            44:        DRAMFree(card, card->NaviBank);
        !            45:        card->NaviBank = BLANK;
        !            46:        card->ChannelBuffersAllocated = 0;
        !            47: //  DecoderWriteWord(
        !            48:        return 0;
        !            49: }
        !            50: 
        !            51: // Allocates channel buffers
        !            52: // All sizes in bytes, preferably multiple of 256 (will be rounded up otherwise)
        !            53: int DecoderSetChannelBuffers(struct cvdv_cards *card, int VideoES,     // Video ES Channel Buffer size, e.g. 229376 byte for NTSC
        !            54:                             int AudioES,       // Audio ES Channel Buffer size, 4096 byte
        !            55:                             int VideoPES,      // Video PES Header / SPU Channel Buffer size, 512 byte
        !            56:                             int DataDump,      // Data Dump Channel Buffer size, e.g. 80896 byte
        !            57:                             int AudioPES,      // Audio PES Header / System Channel Buffer size, 512 byte
        !            58:                             int NaviBank)
        !            59: {                              // Navi Bank Channel Buffer size, 2048 byte
        !            60: #define BUFFERSET(buf,adr,align)  if (buf>0) {\
        !            61:   if (buf&((1<<align)-1)) buf=(buf&~((1<<align)-1))+(1<<align);\
        !            62:   addr=DRAMAlloc(card,buf,1<<align);\
        !            63:   if (addr==BLANK) return adr;\
        !            64:   card->buf=addr;\
        !            65:   addr>>=align;\
        !            66:   DecoderWriteByte(card,adr,addr&0xFF);\
        !            67:   DecoderWriteByte(card,adr+1,(addr>>8)&(0x003F));\
        !            68:   addr+=(buf>>align);\
        !            69:   DecoderWriteByte(card,adr+2,(addr-1)&0xFF);\
        !            70:   DecoderWriteByte(card,adr+3,((addr-1)>>8)&0x003F);\
        !            71: }
        !            72:        u32 addr;
        !            73:        printk(KERN_DEBUG LOGNAME ": -- DecoderSetChannelBuffers\n");
        !            74:        //DecoderStopDecode(card);
        !            75:        DecoderStopChannel(card);
        !            76:        VideoES >>= 1;          // change to word sizes
        !            77:        AudioES >>= 1;
        !            78:        VideoPES >>= 1;
        !            79:        DataDump >>= 1;
        !            80:        AudioPES >>= 1;
        !            81:        NaviBank >>= 1;
        !            82:        if (card->ChannelBuffersAllocated)
        !            83:                DecoderKillChannelBuffers(card);
        !            84:        BUFFERSET(VideoES, 0x048, 7);
        !            85:        BUFFERSET(AudioES, 0x04C, 7);
        !            86:        BUFFERSET(VideoPES, 0x050, 7);
        !            87:        BUFFERSET(DataDump, 0x054, 7);
        !            88:        BUFFERSET(AudioPES, 0x058, 7);
        !            89:        BUFFERSET(NaviBank, 0x05C, 7);
        !            90: 
        !            91:        card->VideoESSize = VideoES;            
        !            92:        card->AudioESSize = AudioES;            
        !            93:        card->VideoPESSize = VideoPES;          
        !            94:        card->DataDumpSize = DataDump;          
        !            95:        card->AudioPESSize = AudioPES;          
        !            96:        card->NaviBankSize = NaviBank;          
        !            97: 
        !            98:        DecoderWriteByte(card, 0x044, 0x7F);
        !            99:        DecoderWriteByte(card, 0x044, 0x01);
        !           100:        if (NaviBank) {
        !           101:                card->reg07B |= 0x10;   // navi pack counter enable
        !           102:                DecoderWriteByte(card, 0x07B, card->reg07B);
        !           103:                //DecoderSetByte(card,0x07B,0x10);  // navi pack counter enable
        !           104:                card->NaviPackAddress =
        !           105:                    (DecoderReadWord(card, 0x05C) & 0x3FFF) << 7;
        !           106: //printk(KERN_DEBUG LOGNAME ": navi bank init'ed: 0x%08X\n",card->NaviPackAddress);
        !           107:        } else {
        !           108:                card->reg07B &= ~0x10;  // navi pack counter disable
        !           109:                DecoderWriteByte(card, 0x07B, card->reg07B);
        !           110:                //DecoderDelByte(card,0x07B,0x10);  // navi pack counter disable
        !           111:                card->NaviPackAddress = 0;
        !           112:        }
        !           113:        card->ChannelBuffersAllocated = 1;
        !           114: #undef BUFFERSET
        !           115:        return 0;
        !           116: }
        !           117: 
        !           118: //int DecoderReadFifo
        !           119: 
        !           120: int DecoderUnPrepare(struct cvdv_cards *card)
        !           121: {
        !           122:        printk(KERN_ERR LOGNAME ": -- DecoderUnPrepare\n");
        !           123:        //DecoderStopDecode(card);
        !           124:        DecoderStopChannel(card);
        !           125:        DecoderKillChannelBuffers(card);
        !           126:        return 0;
        !           127: }
        !           128: 
        !           129: void DecoderPrepare(struct cvdv_cards *card)
        !           130: {
        !           131:        //VideoSetBackground(card,0,0,0,0);      // Video on black
        !           132:        VideoSetBackground(card, 1, 0, 0, 0);   // black
        !           133:        //VideoSetBackground(card,2,83,90,249);  // Red
        !           134:        //VideoSetBackground(card,2,155,53,53);  // Green
        !           135:        //VideoSetBackground(card,2,35,212,114); // Blue
        !           136:        //VideoSetBackground(card,2,4,128,128);  // Black
        !           137:        //VideoSetBackground(card,3,155,53,53);  // Video on Green
        !           138: 
        !           139: //  DecoderWriteByte(card,0x044,0x00);  // Reset channel buffers on error
        !           140: //  DecoderWriteByte(card,0x044,0x01);  // don't Reset channel buffers on error
        !           141: 
        !           142:        DecoderWriteByte(card, 0x040, 0x01);    // Reset Aux FIFO
        !           143:        DecoderWriteByte(card, 0x041, 0x01);    // Reset Data FIFO
        !           144:        //DecoderWriteByte(card,0x044,0x7E);    // Reset channel buffers, Reset channel buffers on error
        !           145:        DecoderWriteByte(card, 0x044, 0x7F);    // Reset channel buffers, don't Reset channel buffers on error
        !           146: //  udelay(100);
        !           147: //  DecoderWriteByte(card,0x040,0x00);  // Reset Aux FIFO
        !           148: //  DecoderWriteByte(card,0x041,0x00);  // Reset Data FIFO
        !           149: //  DecoderDelByte(card,0x044,0x7E);    // Reset channel buffers
        !           150: }
        !           151: 
        !           152: // Selects audio type MPEG and sets stream ID's
        !           153: // AID:     -1=all MPEG, Audio Stream ID: 0..31
        !           154: // AExt:    -1=unused, Audio Stream Extension ID: 0..31, only used if AType=5
        !           155: void DecoderSelectAudioID(struct cvdv_cards *card)
        !           156: {
        !           157:        int AID = card->setup.audioID;
        !           158:        int AExt = card->setup.audioIDext;
        !           159:        printk(KERN_DEBUG LOGNAME ": -- SelectAudio %d %d\n", AID, AExt);
        !           160:        DecoderWriteByte(card, 0x07C, AExt & 0x1F);     // Audio Stream Extension ID
        !           161:        card->reg08F = (card->reg08F & ~0x1F) | (AID & 0x1F);
        !           162:        DecoderWriteByte(card, 0x08F, card->reg08F);
        !           163:        //DecoderMaskByte(card,0x08F,0x1F,AID&0x1F);   // Set Stream ID
        !           164: }
        !           165: 
        !           166: // AHeader: 0=No Headers, 1=first PTS/DTS header, 2=all headers, 3=All with PTS/DTS
        !           167: // AType:   0=disable audio, 1=MPEG ID (MPEG 1), 2=Lin.PCM ID, 3=AC3 ID, 4=all MPEG (use only, if just one MPEG audio stream), 5=MPEG multichannel ID (MPEG 2)
        !           168: // AID:     -1=all MPEG, Audio Stream ID: 0..31
        !           169: // AExt:    -1=unused, Audio Stream Extension ID: 0..31, only used if AType=5
        !           170: // IEC956:  0:MPEG/AC3 data on digital out 1:IEC956 data on digital S/PDIF out
        !           171: void DecoderPrepareAudio(struct cvdv_cards *card)
        !           172: {
        !           173:        int AHeader = 2;
        !           174:        int AType = 3;
        !           175:        int AID = card->setup.audioID;
        !           176:        int AExt = card->setup.audioIDext;
        !           177:        int IEC956 = card->setup.SPDIFmode;
        !           178:        printk(KERN_DEBUG LOGNAME ": -- PrepAudio %d %d %d %d %d\n",
        !           179:               AHeader, card->setup.audioselect, AID, AExt, IEC956);
        !           180:        switch (card->setup.audioselect) {
        !           181:        case audio_disable:
        !           182:        case audio_none:
        !           183:        case audio_SDDS:
        !           184:                AType = 0;
        !           185:                break;
        !           186:        case audio_MPEG:        // MPEG Audio
        !           187:                AType = 1;
        !           188:                break;
        !           189:        case audio_MPEG_EXT:    // MPEG Audio with extension stream
        !           190:                AType = 5;
        !           191:                break;
        !           192:        case audio_LPCM:        // Linear Pulse Code Modulation LPCM
        !           193:                AType = 2;
        !           194:                break;
        !           195:        case audio_AC3: // AC-3
        !           196:                AType = 3;
        !           197:                break;
        !           198:        case audio_DTS: // DTS
        !           199:                AType = 8;
        !           200:                break;
        !           201:        }
        !           202:        if (AType <= 0) {
        !           203:                card->reg08F = 0x00;    // disable audio and discard all packets
        !           204:                DecoderWriteByte(card, 0x08F, card->reg08F);
        !           205:                //DecoderWriteByte(card,0x08F,0x00);  // disable audio and discard all packets
        !           206:                //DecoderMaskByte(card,0x093,0xC3,0xC0);  // write no headers
        !           207:                card->reg093 = (card->reg093 & ~0x03);  // write no headers
        !           208:                DecoderWriteByte(card, 0x093, card->reg093);
        !           209:        } else {
        !           210:                AudioOpen(card);
        !           211:                DecoderMaskByte(card, 0x165, 0x1F, 0x00);       // reset the register
        !           212:                if (AType == 8) {       // DTS
        !           213:                        card->reg090 |= 0x01;   // DTS in Transport Private 1 Stream stored in AudioES channel buffer
        !           214:                        DecoderWriteByte(card, 0x090, card->reg090);
        !           215:                        //DecoderSetByte(card,0x090,0x01);  // DTS in Transport Private 1 Stream stored in AudioES channel buffer
        !           216:                        AudioSetMode(card, 0);
        !           217:                        DecoderSetByte(card, 0x165, 0x01);
        !           218:                        AudioStartFormat(card);
        !           219:                } else if (AType == 3) {        // AC3
        !           220:                        card->reg090 |= 0x01;   // AC3 in Transport Private 1 Stream stored in AudioES channel buffer
        !           221:                        DecoderWriteByte(card, 0x090, card->reg090);
        !           222:                        //DecoderSetByte(card,0x090,0x01);  // AC3 in Transport Private 1 Stream stored in AudioES channel buffer
        !           223:                        AudioSetMode(card, ((IEC956) ? 1 : 3));
        !           224:                } else if (AType == 2) {        // PCM
        !           225:                        card->reg090 |= 0x01;   // PCM in Transport Private 1 Stream stored in AudioES channel buffer
        !           226:                        DecoderWriteByte(card, 0x090, card->reg090);
        !           227:                        //DecoderSetByte(card,0x090,0x01);  // PCM in Transport Private 1 Stream stored in AudioES channel buffer
        !           228:                        AudioSetMode(card, 4);
        !           229:                } else {        // MPEG
        !           230:                        card->reg090 &= ~0x01;  // MPEG Audio stored in AudioES channel buffer
        !           231:                        DecoderWriteByte(card, 0x090, card->reg090);
        !           232:                        //DecoderDelByte(card,0x090,0x01);  // MPEG Audio stored in AudioES channel buffer
        !           233:                        if (AID < 0)
        !           234:                                AType = 4;
        !           235:                        if (AExt >= 0)
        !           236:                                AType = 5;
        !           237:                        else
        !           238:                                AExt = -1;
        !           239:                        AudioSetMode(card, ((IEC956) ? 0 : 2));
        !           240:                }
        !           241:                card->setup.audioID = AID;
        !           242:                card->setup.audioIDext = AExt;
        !           243:                DecoderSelectAudioID(card);
        !           244:                card->reg08F = (card->reg08F & ~0xE0) | ((AType & 0x07) << 5);  // Set Stream Type
        !           245:                DecoderWriteByte(card, 0x08F, card->reg08F);
        !           246:                //DecoderMaskByte(card,0x08F,0xE0,(AType&0x07)<<5);   // Set Stream Type
        !           247:                AudioSetVolume(card, 0xFF);     // Set PCM scale to full volume
        !           248:                //DecoderMaskByte(card,0x093,0xC3,(AHeader&0x03)|0xC0);  // write header select
        !           249:                card->reg093 = (card->reg093 & ~0x03) | (AHeader & 0x03);       // write header select
        !           250:                DecoderWriteByte(card, 0x093, card->reg093);
        !           251:                //  Mute the card and put it in play mode, then wait for the parameters to be parsed and un-mute if successful
        !           252:                //AudioMute(card,1);
        !           253:                if (AType > 0) {
        !           254:                        AudioStartDecode(card);
        !           255:                        //AudioSetPlayMode(card,AUDIO_PLAY);
        !           256:                        AudioSetPlayMode(card, AUDIO_PAUSE);
        !           257:                }
        !           258:                //card->startingA=1;
        !           259:        }
        !           260:        card->lastaattr = 0;
        !           261: }
        !           262: 
        !           263: // VHeader: -1=disable Video, 0=No Headers, 1=first PTS/DTS header, 2=all headers, 3=All with PTS/DTS
        !           264: // VID: -1=all MPEG, 0..15=Video Stream ID
        !           265: void DecoderPrepareVideo(struct cvdv_cards *card)
        !           266: {
        !           267:        int VHeader = 3;
        !           268:        int VID = card->setup.videoID;
        !           269:        if (VHeader < 0) {
        !           270:                card->reg091 = 0x00;
        !           271:                DecoderWriteByte(card, 0x091, card->reg091);
        !           272:                //DecoderWriteByte(card,0x091,0x00);
        !           273:        } else {
        !           274:                if (VID < 0) {
        !           275:                        card->reg091 = ((VHeader & 0x03) << 6) | (2 << 4);
        !           276:                        DecoderWriteByte(card, 0x091, card->reg091);
        !           277:                        //DecoderWriteByte(card,0x091,((VHeader&0x03)<<6)|(2<<4));
        !           278:                } else {
        !           279:                        card->reg091 =
        !           280:                            ((VHeader & 0x03) << 6) | (1 << 4) | (VID &
        !           281:                                                                  0x0F);
        !           282:                        DecoderWriteByte(card, 0x091, card->reg091);
        !           283:                        //DecoderWriteByte(card,0x091,((VHeader&0x03)<<6)|(1<<4)|(VID&0x0F));
        !           284:                }
        !           285:        }
        !           286: }
        !           287: 
        !           288: // Prepare Decoder for Elementary Streams, Disable Preparser
        !           289: int DecoderPrepareES(struct cvdv_cards *card)
        !           290: {
        !           291:        int i;
        !           292:        printk(KERN_DEBUG LOGNAME ": -- PrepareES\n");
        !           293:        //DecoderStopDecode(card);
        !           294: 
        !           295: //  DecoderWriteByte(card,0x05,0x00);
        !           296: 
        !           297:        DecoderMaskByte(card, 0x007, 0xCE, 0xC2 | (3 << 2));    // Stream Select: A/V Elementary Stream
        !           298: //printk(KERN_DEBUG LOGNAME ": Int - A VideoES w/r addr: %08X %08X\n",
        !           299: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
        !           300: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
        !           301:        // set the decoding buffers
        !           302:        card->reg093 = (card->reg093 & ~0xFC);  // write no header
        !           303:        DecoderWriteByte(card, 0x093, card->reg093);
        !           304:        if ((i = DecoderSetChannelBuffers(card, 256000, 4096, 0, 0, 0, 0))) {
        !           305:                printk(KERN_ERR LOGNAME
        !           306:                       ": SetDecoderBuffers failed for buffer at 0x%03X\n",
        !           307:                       i);
        !           308:                DecoderKillChannelBuffers(card);
        !           309:                return 1;
        !           310:        }
        !           311: //printk(KERN_DEBUG LOGNAME ": Int - B VideoES w/r addr: %08X %08X\n",
        !           312: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
        !           313: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
        !           314: 
        !           315: //printk(KERN_DEBUG LOGNAME ": Int - C VideoES w/r addr: %08X %08X\n",
        !           316: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
        !           317: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
        !           318: 
        !           319: //  DecoderStartChannel(card);   
        !           320: //  DecoderStartDecode(card);
        !           321: 
        !           322: //printk(KERN_DEBUG LOGNAME ": Int - D VideoES w/r addr: %08X %08X\n",
        !           323: //  (DecoderReadByte(card,0x060)|(DecoderReadByte(card,0x061)<<8)|(DecoderReadByte(card,0x062)<<16))<<2,
        !           324: //  (DecoderReadByte(card,0x06C)|(DecoderReadByte(card,0x06D)<<8)|(DecoderReadByte(card,0x06E)<<16))<<2);
        !           325: 
        !           326:        DecoderPrepare(card);
        !           327: 
        !           328:        return 0;
        !           329: }
        !           330: 
        !           331: // Prepare Decoder for Packetised Elementary Streams, set parameters of Preparser
        !           332: int DecoderPreparePES(struct cvdv_cards *card)
        !           333: {
        !           334: 
        !           335:        // SPUID: -1=No SPU, 0..31=Display SPU of this ID
        !           336:        // DataDump: 0=disable DataDump, 1=process DataDump Substreams
        !           337:        // PackHeader: 0=write no headers, 1=write one header, 2=write all headers
        !           338:        // SysHeader: 0=write no headers, 1=write one header, 2=write all headers
        !           339:        // DSIHeader: 0=write no headers, 3=write PCI and DSI headers and packets
        !           340:        int i;
        !           341:        int SPUID = -1;
        !           342:        int DataDump = 0;
        !           343:        int PackHeader = 0;
        !           344:        int SysHeader = 0;
        !           345:        int DSIHeader = 0;
        !           346: 
        !           347:        printk(KERN_DEBUG LOGNAME ": -- PreparePES\n");
        !           348:        DecoderMaskByte(card, 0x007, 0xCE, 0xC2 | (0 << 2));    // Stream Select: A/V PES Packets
        !           349: 
        !           350:        if (SPUID < 0)
        !           351:                card->reg092 = 0;       // Do we use SPU?
        !           352:        else
        !           353:                card->reg092 = 0x20 | (SPUID & 0x1F);
        !           354:        if (DataDump)
        !           355:                card->reg092 |= 0x40;   // Do we use DataDump?
        !           356:        DecoderWriteByte(card, 0x092, card->reg092);
        !           357:        //DecoderMaskByte(card,0x093,0xFC,((DSIHeader&0x03)<<6)|((PackHeader&0x03)<<4)|((SysHeader&0x03)<<2));
        !           358:        card->reg093 =
        !           359:            (card->reg093 & ~0xFC) | (((DSIHeader & 0x03) << 6) |
        !           360:                                      ((PackHeader & 0x03) << 4) |
        !           361:                                      ((SysHeader & 0x03) << 2));
        !           362:        DecoderWriteByte(card, 0x093, card->reg093);
        !           363:        // set the decoding buffers
        !           364:        if (
        !           365:            (i =
        !           366:             DecoderSetChannelBuffers(card, 256000, 4096, 512, 0, 512,
        !           367:                                      0))) {
        !           368:                printk(KERN_ERR LOGNAME
        !           369:                       ": SetDecoderBuffers failed for buffer at 0x%03X\n",
        !           370:                       i);
        !           371:                DecoderKillChannelBuffers(card);
        !           372:                return 1;
        !           373:        }
        !           374: 
        !           375:        DecoderPrepare(card);
        !           376: 
        !           377:        return 0;
        !           378: }
        !           379: 
        !           380: 
        !           381: // Prepare Decoder for MPEG 1 Systems Streams or MPEG 2 Program Streams
        !           382: // SPUID: -1:ignore, 0...15 SPU Substream ID
        !           383: // DataDump: 0:disable data dump stream, 1:enable data dump stream
        !           384: // PackHeader: 0:write no headers, 1:write one header, 2:write all headers, 3:always discard
        !           385: // SysHeader: 0:always discard, 1:write one header, 2:write all headers, 3:always discard
        !           386: // DSIHeader: 0:write no DSI or PCI headers, 3:write DSI and PCI headers + packets
        !           387: // DVD: 0: normal MPEG-2 data, 1: DVD stream with navi pack data
        !           388: int DecoderPreparePS(struct cvdv_cards *card,
        !           389:                     int SPUID, int DataDump,
        !           390:                     int PackHeader, int SysHeader, int DSIHeader, int DVD)
        !           391: {
        !           392:        int i=0;
        !           393:        printk(KERN_DEBUG LOGNAME ": -- PreparePS %s\n",
        !           394:               ((DVD) ? "DVD" : ""));
        !           395:        //DecoderStopDecode(card);
        !           396:        DecoderMaskByte(card, 0x007, 0xCE, 0xC2 | (1 << 2));    // Stream Select: MPEG1 System / MPEG2 Program Stream
        !           397: 
        !           398:        if (SPUID < 0)
        !           399:                card->reg092 = 0;       // Do we use SPU?
        !           400:        else
        !           401:                card->reg092 = 0x20 | (SPUID & 0x1F);
        !           402:        if (DataDump)
        !           403:                card->reg092 |= 0x40;   // Do we use DataDump?
        !           404:        DecoderWriteByte(card, 0x092, card->reg092);
        !           405:        //DecoderMaskByte(card,0x093,0xFC,((DSIHeader&0x03)<<6)|((PackHeader&0x03)<<4)|((SysHeader&0x03)<<2));
        !           406:        card->reg093 =
        !           407:            (card->reg093 & ~0xFC) | (((DSIHeader & 0x03) << 6) |
        !           408:                                      ((PackHeader & 0x03) << 4) |
        !           409:                                      ((SysHeader & 0x03) << 2));
        !           410:        DecoderWriteByte(card, 0x093, card->reg093);
        !           411:        // set the decoding buffers
        !           412:        if (DVD) {              // do we need SPU-, navi- and datadump-buffers?
        !           413:                
        !           414:          //      if(card->videomode == NTSC)
        !           415:                i = DecoderSetChannelBuffers(card, 340000, 32768, 16384, 0, 
        !           416:                                             512,2048) ;
        !           417:                //else
        !           418:                //              i = DecoderSetChannelBuffers(card, 291878, 16384, 512, 0, 
        !           419:                //   512,0) ;
        !           420: 
        !           421:                if (i) {
        !           422:                        printk(KERN_ERR LOGNAME
        !           423:                               ": SetDecoderBuffers failed for buffer at 0x%03X\n",
        !           424:                               i);
        !           425:                        DecoderKillChannelBuffers(card);
        !           426:                        return 1;
        !           427:                }
        !           428:                
        !           429:        } else {                // normal PS
        !           430:                if (
        !           431:                    (i =
        !           432:                   DecoderSetChannelBuffers(card, 300000, 64288, 512,
        !           433:                                   0, 512, 0))) {
        !           434:                        printk(KERN_ERR LOGNAME
        !           435:                               ": SetDecoderBuffers failed for buffer at 0x%03X\n",
        !           436:                               i);
        !           437:                        DecoderKillChannelBuffers(card);
        !           438:                        return 1;
        !           439:                }
        !           440:        }
        !           441: 
        !           442:        DecoderPrepare(card);
        !           443: 
        !           444:        return 0;
        !           445: }

LinuxTV legacy CVS <linuxtv.org/cvs>