linux/drivers/media/pci/cx88/cx88-core.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * device driver for Conexant 2388x based TV cards
   4 * driver core
   5 *
   6 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
   7 *
   8 * (c) 2005-2006 Mauro Carvalho Chehab <mchehab@kernel.org>
   9 *     - Multituner support
  10 *     - video_ioctl2 conversion
  11 *     - PAL/M fixes
  12 */
  13
  14#include "cx88.h"
  15
  16#include <linux/init.h>
  17#include <linux/list.h>
  18#include <linux/module.h>
  19#include <linux/kernel.h>
  20#include <linux/slab.h>
  21#include <linux/kmod.h>
  22#include <linux/sound.h>
  23#include <linux/interrupt.h>
  24#include <linux/pci.h>
  25#include <linux/delay.h>
  26#include <linux/videodev2.h>
  27#include <linux/mutex.h>
  28
  29#include <media/v4l2-common.h>
  30#include <media/v4l2-ioctl.h>
  31
  32MODULE_DESCRIPTION("v4l2 driver module for cx2388x based TV cards");
  33MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
  34MODULE_LICENSE("GPL v2");
  35
  36/* ------------------------------------------------------------------ */
  37
  38unsigned int cx88_core_debug;
  39module_param_named(core_debug, cx88_core_debug, int, 0644);
  40MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
  41
  42static unsigned int nicam;
  43module_param(nicam, int, 0644);
  44MODULE_PARM_DESC(nicam, "tv audio is nicam");
  45
  46static unsigned int nocomb;
  47module_param(nocomb, int, 0644);
  48MODULE_PARM_DESC(nocomb, "disable comb filter");
  49
  50#define dprintk0(fmt, arg...)                           \
  51        printk(KERN_DEBUG pr_fmt("%s: core:" fmt),      \
  52                __func__, ##arg)                        \
  53
  54#define dprintk(level, fmt, arg...)     do {                    \
  55        if (cx88_core_debug >= level)                           \
  56                printk(KERN_DEBUG pr_fmt("%s: core:" fmt),      \
  57                       __func__, ##arg);                        \
  58} while (0)
  59
  60static unsigned int cx88_devcount;
  61static LIST_HEAD(cx88_devlist);
  62static DEFINE_MUTEX(devlist);
  63
  64#define NO_SYNC_LINE (-1U)
  65
  66/*
  67 * @lpi: lines per IRQ, or 0 to not generate irqs. Note: IRQ to be
  68 * generated _after_ lpi lines are transferred.
  69 */
  70static __le32 *cx88_risc_field(__le32 *rp, struct scatterlist *sglist,
  71                               unsigned int offset, u32 sync_line,
  72                               unsigned int bpl, unsigned int padding,
  73                               unsigned int lines, unsigned int lpi, bool jump)
  74{
  75        struct scatterlist *sg;
  76        unsigned int line, todo, sol;
  77
  78        if (jump) {
  79                (*rp++) = cpu_to_le32(RISC_JUMP);
  80                (*rp++) = 0;
  81        }
  82
  83        /* sync instruction */
  84        if (sync_line != NO_SYNC_LINE)
  85                *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
  86
  87        /* scan lines */
  88        sg = sglist;
  89        for (line = 0; line < lines; line++) {
  90                while (offset && offset >= sg_dma_len(sg)) {
  91                        offset -= sg_dma_len(sg);
  92                        sg = sg_next(sg);
  93                }
  94                if (lpi && line > 0 && !(line % lpi))
  95                        sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
  96                else
  97                        sol = RISC_SOL;
  98                if (bpl <= sg_dma_len(sg) - offset) {
  99                        /* fits into current chunk */
 100                        *(rp++) = cpu_to_le32(RISC_WRITE | sol |
 101                                              RISC_EOL | bpl);
 102                        *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
 103                        offset += bpl;
 104                } else {
 105                        /* scanline needs to be split */
 106                        todo = bpl;
 107                        *(rp++) = cpu_to_le32(RISC_WRITE | sol |
 108                                              (sg_dma_len(sg) - offset));
 109                        *(rp++) = cpu_to_le32(sg_dma_address(sg) + offset);
 110                        todo -= (sg_dma_len(sg) - offset);
 111                        offset = 0;
 112                        sg = sg_next(sg);
 113                        while (todo > sg_dma_len(sg)) {
 114                                *(rp++) = cpu_to_le32(RISC_WRITE |
 115                                                      sg_dma_len(sg));
 116                                *(rp++) = cpu_to_le32(sg_dma_address(sg));
 117                                todo -= sg_dma_len(sg);
 118                                sg = sg_next(sg);
 119                        }
 120                        *(rp++) = cpu_to_le32(RISC_WRITE | RISC_EOL | todo);
 121                        *(rp++) = cpu_to_le32(sg_dma_address(sg));
 122                        offset += todo;
 123                }
 124                offset += padding;
 125        }
 126
 127        return rp;
 128}
 129
 130int cx88_risc_buffer(struct pci_dev *pci, struct cx88_riscmem *risc,
 131                     struct scatterlist *sglist,
 132                     unsigned int top_offset, unsigned int bottom_offset,
 133                     unsigned int bpl, unsigned int padding, unsigned int lines)
 134{
 135        u32 instructions, fields;
 136        __le32 *rp;
 137
 138        fields = 0;
 139        if (top_offset != UNSET)
 140                fields++;
 141        if (bottom_offset != UNSET)
 142                fields++;
 143
 144        /*
 145         * estimate risc mem: worst case is one write per page border +
 146         * one write per scan line + syncs + jump (all 2 dwords).  Padding
 147         * can cause next bpl to start close to a page border.  First DMA
 148         * region may be smaller than PAGE_SIZE
 149         */
 150        instructions  = fields * (1 + ((bpl + padding) * lines) /
 151                                  PAGE_SIZE + lines);
 152        instructions += 4;
 153        risc->size = instructions * 8;
 154        risc->dma = 0;
 155        risc->cpu = pci_zalloc_consistent(pci, risc->size, &risc->dma);
 156        if (!risc->cpu)
 157                return -ENOMEM;
 158
 159        /* write risc instructions */
 160        rp = risc->cpu;
 161        if (top_offset != UNSET)
 162                rp = cx88_risc_field(rp, sglist, top_offset, 0,
 163                                     bpl, padding, lines, 0, true);
 164        if (bottom_offset != UNSET)
 165                rp = cx88_risc_field(rp, sglist, bottom_offset, 0x200,
 166                                     bpl, padding, lines, 0,
 167                                     top_offset == UNSET);
 168
 169        /* save pointer to jmp instruction address */
 170        risc->jmp = rp;
 171        WARN_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
 172        return 0;
 173}
 174EXPORT_SYMBOL(cx88_risc_buffer);
 175
 176int cx88_risc_databuffer(struct pci_dev *pci, struct cx88_riscmem *risc,
 177                         struct scatterlist *sglist, unsigned int bpl,
 178                         unsigned int lines, unsigned int lpi)
 179{
 180        u32 instructions;
 181        __le32 *rp;
 182
 183        /*
 184         * estimate risc mem: worst case is one write per page border +
 185         * one write per scan line + syncs + jump (all 2 dwords).  Here
 186         * there is no padding and no sync.  First DMA region may be smaller
 187         * than PAGE_SIZE
 188         */
 189        instructions  = 1 + (bpl * lines) / PAGE_SIZE + lines;
 190        instructions += 3;
 191        risc->size = instructions * 8;
 192        risc->dma = 0;
 193        risc->cpu = pci_zalloc_consistent(pci, risc->size, &risc->dma);
 194        if (!risc->cpu)
 195                return -ENOMEM;
 196
 197        /* write risc instructions */
 198        rp = risc->cpu;
 199        rp = cx88_risc_field(rp, sglist, 0, NO_SYNC_LINE, bpl, 0,
 200                             lines, lpi, !lpi);
 201
 202        /* save pointer to jmp instruction address */
 203        risc->jmp = rp;
 204        WARN_ON((risc->jmp - risc->cpu + 2) * sizeof(*risc->cpu) > risc->size);
 205        return 0;
 206}
 207EXPORT_SYMBOL(cx88_risc_databuffer);
 208
 209/*
 210 * our SRAM memory layout
 211 */
 212
 213/*
 214 * we are going to put all thr risc programs into host memory, so we
 215 * can use the whole SDRAM for the DMA fifos.  To simplify things, we
 216 * use a static memory layout.  That surely will waste memory in case
 217 * we don't use all DMA channels at the same time (which will be the
 218 * case most of the time).  But that still gives us enough FIFO space
 219 * to be able to deal with insane long pci latencies ...
 220 *
 221 * FIFO space allocations:
 222 *    channel  21    (y video)  - 10.0k
 223 *    channel  22    (u video)  -  2.0k
 224 *    channel  23    (v video)  -  2.0k
 225 *    channel  24    (vbi)      -  4.0k
 226 *    channels 25+26 (audio)    -  4.0k
 227 *    channel  28    (mpeg)     -  4.0k
 228 *    channel  27    (audio rds)-  3.0k
 229 *    TOTAL                     = 29.0k
 230 *
 231 * Every channel has 160 bytes control data (64 bytes instruction
 232 * queue and 6 CDT entries), which is close to 2k total.
 233 *
 234 * Address layout:
 235 *    0x0000 - 0x03ff    CMDs / reserved
 236 *    0x0400 - 0x0bff    instruction queues + CDs
 237 *    0x0c00 -           FIFOs
 238 */
 239
 240const struct sram_channel cx88_sram_channels[] = {
 241        [SRAM_CH21] = {
 242                .name       = "video y / packed",
 243                .cmds_start = 0x180040,
 244                .ctrl_start = 0x180400,
 245                .cdt        = 0x180400 + 64,
 246                .fifo_start = 0x180c00,
 247                .fifo_size  = 0x002800,
 248                .ptr1_reg   = MO_DMA21_PTR1,
 249                .ptr2_reg   = MO_DMA21_PTR2,
 250                .cnt1_reg   = MO_DMA21_CNT1,
 251                .cnt2_reg   = MO_DMA21_CNT2,
 252        },
 253        [SRAM_CH22] = {
 254                .name       = "video u",
 255                .cmds_start = 0x180080,
 256                .ctrl_start = 0x1804a0,
 257                .cdt        = 0x1804a0 + 64,
 258                .fifo_start = 0x183400,
 259                .fifo_size  = 0x000800,
 260                .ptr1_reg   = MO_DMA22_PTR1,
 261                .ptr2_reg   = MO_DMA22_PTR2,
 262                .cnt1_reg   = MO_DMA22_CNT1,
 263                .cnt2_reg   = MO_DMA22_CNT2,
 264        },
 265        [SRAM_CH23] = {
 266                .name       = "video v",
 267                .cmds_start = 0x1800c0,
 268                .ctrl_start = 0x180540,
 269                .cdt        = 0x180540 + 64,
 270                .fifo_start = 0x183c00,
 271                .fifo_size  = 0x000800,
 272                .ptr1_reg   = MO_DMA23_PTR1,
 273                .ptr2_reg   = MO_DMA23_PTR2,
 274                .cnt1_reg   = MO_DMA23_CNT1,
 275                .cnt2_reg   = MO_DMA23_CNT2,
 276        },
 277        [SRAM_CH24] = {
 278                .name       = "vbi",
 279                .cmds_start = 0x180100,
 280                .ctrl_start = 0x1805e0,
 281                .cdt        = 0x1805e0 + 64,
 282                .fifo_start = 0x184400,
 283                .fifo_size  = 0x001000,
 284                .ptr1_reg   = MO_DMA24_PTR1,
 285                .ptr2_reg   = MO_DMA24_PTR2,
 286                .cnt1_reg   = MO_DMA24_CNT1,
 287                .cnt2_reg   = MO_DMA24_CNT2,
 288        },
 289        [SRAM_CH25] = {
 290                .name       = "audio from",
 291                .cmds_start = 0x180140,
 292                .ctrl_start = 0x180680,
 293                .cdt        = 0x180680 + 64,
 294                .fifo_start = 0x185400,
 295                .fifo_size  = 0x001000,
 296                .ptr1_reg   = MO_DMA25_PTR1,
 297                .ptr2_reg   = MO_DMA25_PTR2,
 298                .cnt1_reg   = MO_DMA25_CNT1,
 299                .cnt2_reg   = MO_DMA25_CNT2,
 300        },
 301        [SRAM_CH26] = {
 302                .name       = "audio to",
 303                .cmds_start = 0x180180,
 304                .ctrl_start = 0x180720,
 305                .cdt        = 0x180680 + 64,  /* same as audio IN */
 306                .fifo_start = 0x185400,       /* same as audio IN */
 307                .fifo_size  = 0x001000,       /* same as audio IN */
 308                .ptr1_reg   = MO_DMA26_PTR1,
 309                .ptr2_reg   = MO_DMA26_PTR2,
 310                .cnt1_reg   = MO_DMA26_CNT1,
 311                .cnt2_reg   = MO_DMA26_CNT2,
 312        },
 313        [SRAM_CH28] = {
 314                .name       = "mpeg",
 315                .cmds_start = 0x180200,
 316                .ctrl_start = 0x1807C0,
 317                .cdt        = 0x1807C0 + 64,
 318                .fifo_start = 0x186400,
 319                .fifo_size  = 0x001000,
 320                .ptr1_reg   = MO_DMA28_PTR1,
 321                .ptr2_reg   = MO_DMA28_PTR2,
 322                .cnt1_reg   = MO_DMA28_CNT1,
 323                .cnt2_reg   = MO_DMA28_CNT2,
 324        },
 325        [SRAM_CH27] = {
 326                .name       = "audio rds",
 327                .cmds_start = 0x1801C0,
 328                .ctrl_start = 0x180860,
 329                .cdt        = 0x180860 + 64,
 330                .fifo_start = 0x187400,
 331                .fifo_size  = 0x000C00,
 332                .ptr1_reg   = MO_DMA27_PTR1,
 333                .ptr2_reg   = MO_DMA27_PTR2,
 334                .cnt1_reg   = MO_DMA27_CNT1,
 335                .cnt2_reg   = MO_DMA27_CNT2,
 336        },
 337};
 338EXPORT_SYMBOL(cx88_sram_channels);
 339
 340int cx88_sram_channel_setup(struct cx88_core *core,
 341                            const struct sram_channel *ch,
 342                            unsigned int bpl, u32 risc)
 343{
 344        unsigned int i, lines;
 345        u32 cdt;
 346
 347        bpl   = (bpl + 7) & ~7; /* alignment */
 348        cdt   = ch->cdt;
 349        lines = ch->fifo_size / bpl;
 350        if (lines > 6)
 351                lines = 6;
 352        WARN_ON(lines < 2);
 353
 354        /* write CDT */
 355        for (i = 0; i < lines; i++)
 356                cx_write(cdt + 16 * i, ch->fifo_start + bpl * i);
 357
 358        /* write CMDS */
 359        cx_write(ch->cmds_start +  0, risc);
 360        cx_write(ch->cmds_start +  4, cdt);
 361        cx_write(ch->cmds_start +  8, (lines * 16) >> 3);
 362        cx_write(ch->cmds_start + 12, ch->ctrl_start);
 363        cx_write(ch->cmds_start + 16, 64 >> 2);
 364        for (i = 20; i < 64; i += 4)
 365                cx_write(ch->cmds_start + i, 0);
 366
 367        /* fill registers */
 368        cx_write(ch->ptr1_reg, ch->fifo_start);
 369        cx_write(ch->ptr2_reg, cdt);
 370        cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
 371        cx_write(ch->cnt2_reg, (lines * 16) >> 3);
 372
 373        dprintk(2, "sram setup %s: bpl=%d lines=%d\n", ch->name, bpl, lines);
 374        return 0;
 375}
 376EXPORT_SYMBOL(cx88_sram_channel_setup);
 377
 378/* ------------------------------------------------------------------ */
 379/* debug helper code                                                  */
 380
 381static int cx88_risc_decode(u32 risc)
 382{
 383        static const char * const instr[16] = {
 384                [RISC_SYNC    >> 28] = "sync",
 385                [RISC_WRITE   >> 28] = "write",
 386                [RISC_WRITEC  >> 28] = "writec",
 387                [RISC_READ    >> 28] = "read",
 388                [RISC_READC   >> 28] = "readc",
 389                [RISC_JUMP    >> 28] = "jump",
 390                [RISC_SKIP    >> 28] = "skip",
 391                [RISC_WRITERM >> 28] = "writerm",
 392                [RISC_WRITECM >> 28] = "writecm",
 393                [RISC_WRITECR >> 28] = "writecr",
 394        };
 395        static int const incr[16] = {
 396                [RISC_WRITE   >> 28] = 2,
 397                [RISC_JUMP    >> 28] = 2,
 398                [RISC_WRITERM >> 28] = 3,
 399                [RISC_WRITECM >> 28] = 3,
 400                [RISC_WRITECR >> 28] = 4,
 401        };
 402        static const char * const bits[] = {
 403                "12",   "13",   "14",   "resync",
 404                "cnt0", "cnt1", "18",   "19",
 405                "20",   "21",   "22",   "23",
 406                "irq1", "irq2", "eol",  "sol",
 407        };
 408        int i;
 409
 410        dprintk0("0x%08x [ %s", risc,
 411                 instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
 412        for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--)
 413                if (risc & (1 << (i + 12)))
 414                        pr_cont(" %s", bits[i]);
 415        pr_cont(" count=%d ]\n", risc & 0xfff);
 416        return incr[risc >> 28] ? incr[risc >> 28] : 1;
 417}
 418
 419void cx88_sram_channel_dump(struct cx88_core *core,
 420                            const struct sram_channel *ch)
 421{
 422        static const char * const name[] = {
 423                "initial risc",
 424                "cdt base",
 425                "cdt size",
 426                "iq base",
 427                "iq size",
 428                "risc pc",
 429                "iq wr ptr",
 430                "iq rd ptr",
 431                "cdt current",
 432                "pci target",
 433                "line / byte",
 434        };
 435        u32 risc;
 436        unsigned int i, j, n;
 437
 438        dprintk0("%s - dma channel status dump\n", ch->name);
 439        for (i = 0; i < ARRAY_SIZE(name); i++)
 440                dprintk0("   cmds: %-12s: 0x%08x\n",
 441                         name[i], cx_read(ch->cmds_start + 4 * i));
 442        for (n = 1, i = 0; i < 4; i++) {
 443                risc = cx_read(ch->cmds_start + 4 * (i + 11));
 444                pr_cont("  risc%d: ", i);
 445                if (--n)
 446                        pr_cont("0x%08x [ arg #%d ]\n", risc, n);
 447                else
 448                        n = cx88_risc_decode(risc);
 449        }
 450        for (i = 0; i < 16; i += n) {
 451                risc = cx_read(ch->ctrl_start + 4 * i);
 452                dprintk0("  iq %x: ", i);
 453                n = cx88_risc_decode(risc);
 454                for (j = 1; j < n; j++) {
 455                        risc = cx_read(ch->ctrl_start + 4 * (i + j));
 456                        pr_cont("  iq %x: 0x%08x [ arg #%d ]\n",
 457                                i + j, risc, j);
 458                }
 459        }
 460
 461        dprintk0("fifo: 0x%08x -> 0x%x\n",
 462                 ch->fifo_start, ch->fifo_start + ch->fifo_size);
 463        dprintk0("ctrl: 0x%08x -> 0x%x\n",
 464                 ch->ctrl_start, ch->ctrl_start + 6 * 16);
 465        dprintk0("  ptr1_reg: 0x%08x\n", cx_read(ch->ptr1_reg));
 466        dprintk0("  ptr2_reg: 0x%08x\n", cx_read(ch->ptr2_reg));
 467        dprintk0("  cnt1_reg: 0x%08x\n", cx_read(ch->cnt1_reg));
 468        dprintk0("  cnt2_reg: 0x%08x\n", cx_read(ch->cnt2_reg));
 469}
 470EXPORT_SYMBOL(cx88_sram_channel_dump);
 471
 472static const char *cx88_pci_irqs[32] = {
 473        "vid", "aud", "ts", "vip", "hst", "5", "6", "tm1",
 474        "src_dma", "dst_dma", "risc_rd_err", "risc_wr_err",
 475        "brdg_err", "src_dma_err", "dst_dma_err", "ipb_dma_err",
 476        "i2c", "i2c_rack", "ir_smp", "gpio0", "gpio1"
 477};
 478
 479void cx88_print_irqbits(const char *tag, const char *strings[],
 480                        int len, u32 bits, u32 mask)
 481{
 482        unsigned int i;
 483
 484        dprintk0("%s [0x%x]", tag, bits);
 485        for (i = 0; i < len; i++) {
 486                if (!(bits & (1 << i)))
 487                        continue;
 488                if (strings[i])
 489                        pr_cont(" %s", strings[i]);
 490                else
 491                        pr_cont(" %d", i);
 492                if (!(mask & (1 << i)))
 493                        continue;
 494                pr_cont("*");
 495        }
 496        pr_cont("\n");
 497}
 498EXPORT_SYMBOL(cx88_print_irqbits);
 499
 500/* ------------------------------------------------------------------ */
 501
 502int cx88_core_irq(struct cx88_core *core, u32 status)
 503{
 504        int handled = 0;
 505
 506        if (status & PCI_INT_IR_SMPINT) {
 507                cx88_ir_irq(core);
 508                handled++;
 509        }
 510        if (!handled)
 511                cx88_print_irqbits("irq pci",
 512                                   cx88_pci_irqs, ARRAY_SIZE(cx88_pci_irqs),
 513                                   status, core->pci_irqmask);
 514        return handled;
 515}
 516EXPORT_SYMBOL(cx88_core_irq);
 517
 518void cx88_wakeup(struct cx88_core *core,
 519                 struct cx88_dmaqueue *q, u32 count)
 520{
 521        struct cx88_buffer *buf;
 522
 523        buf = list_entry(q->active.next,
 524                         struct cx88_buffer, list);
 525        buf->vb.vb2_buf.timestamp = ktime_get_ns();
 526        buf->vb.field = core->field;
 527        buf->vb.sequence = q->count++;
 528        list_del(&buf->list);
 529        vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
 530}
 531EXPORT_SYMBOL(cx88_wakeup);
 532
 533void cx88_shutdown(struct cx88_core *core)
 534{
 535        /* disable RISC controller + IRQs */
 536        cx_write(MO_DEV_CNTRL2, 0);
 537
 538        /* stop dma transfers */
 539        cx_write(MO_VID_DMACNTRL, 0x0);
 540        cx_write(MO_AUD_DMACNTRL, 0x0);
 541        cx_write(MO_TS_DMACNTRL, 0x0);
 542        cx_write(MO_VIP_DMACNTRL, 0x0);
 543        cx_write(MO_GPHST_DMACNTRL, 0x0);
 544
 545        /* stop interrupts */
 546        cx_write(MO_PCI_INTMSK, 0x0);
 547        cx_write(MO_VID_INTMSK, 0x0);
 548        cx_write(MO_AUD_INTMSK, 0x0);
 549        cx_write(MO_TS_INTMSK, 0x0);
 550        cx_write(MO_VIP_INTMSK, 0x0);
 551        cx_write(MO_GPHST_INTMSK, 0x0);
 552
 553        /* stop capturing */
 554        cx_write(VID_CAPTURE_CONTROL, 0);
 555}
 556EXPORT_SYMBOL(cx88_shutdown);
 557
 558int cx88_reset(struct cx88_core *core)
 559{
 560        dprintk(1, "");
 561        cx88_shutdown(core);
 562
 563        /* clear irq status */
 564        cx_write(MO_VID_INTSTAT, 0xFFFFFFFF); // Clear PIV int
 565        cx_write(MO_PCI_INTSTAT, 0xFFFFFFFF); // Clear PCI int
 566        cx_write(MO_INT1_STAT,   0xFFFFFFFF); // Clear RISC int
 567
 568        /* wait a bit */
 569        msleep(100);
 570
 571        /* init sram */
 572        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH21],
 573                                720 * 4, 0);
 574        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH22], 128, 0);
 575        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH23], 128, 0);
 576        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH24], 128, 0);
 577        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], 128, 0);
 578        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], 128, 0);
 579        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH28],
 580                                188 * 4, 0);
 581        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH27], 128, 0);
 582
 583        /* misc init ... */
 584        cx_write(MO_INPUT_FORMAT, ((1 << 13) |   // agc enable
 585                                   (1 << 12) |   // agc gain
 586                                   (1 << 11) |   // adaptibe agc
 587                                   (0 << 10) |   // chroma agc
 588                                   (0 <<  9) |   // ckillen
 589                                   (7)));
 590
 591        /* setup image format */
 592        cx_andor(MO_COLOR_CTRL, 0x4000, 0x4000);
 593
 594        /* setup FIFO Thresholds */
 595        cx_write(MO_PDMA_STHRSH,   0x0807);
 596        cx_write(MO_PDMA_DTHRSH,   0x0807);
 597
 598        /* fixes flashing of image */
 599        cx_write(MO_AGC_SYNC_TIP1, 0x0380000F);
 600        cx_write(MO_AGC_BACK_VBI,  0x00E00555);
 601
 602        cx_write(MO_VID_INTSTAT,   0xFFFFFFFF); // Clear PIV int
 603        cx_write(MO_PCI_INTSTAT,   0xFFFFFFFF); // Clear PCI int
 604        cx_write(MO_INT1_STAT,     0xFFFFFFFF); // Clear RISC int
 605
 606        /* Reset on-board parts */
 607        cx_write(MO_SRST_IO, 0);
 608        usleep_range(10000, 20000);
 609        cx_write(MO_SRST_IO, 1);
 610
 611        return 0;
 612}
 613EXPORT_SYMBOL(cx88_reset);
 614
 615/* ------------------------------------------------------------------ */
 616
 617static inline unsigned int norm_swidth(v4l2_std_id norm)
 618{
 619        return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 754 : 922;
 620}
 621
 622static inline unsigned int norm_hdelay(v4l2_std_id norm)
 623{
 624        return (norm & (V4L2_STD_MN & ~V4L2_STD_PAL_Nc)) ? 135 : 186;
 625}
 626
 627static inline unsigned int norm_vdelay(v4l2_std_id norm)
 628{
 629        return (norm & V4L2_STD_625_50) ? 0x24 : 0x18;
 630}
 631
 632static inline unsigned int norm_fsc8(v4l2_std_id norm)
 633{
 634        if (norm & V4L2_STD_PAL_M)
 635                return 28604892;      // 3.575611 MHz
 636
 637        if (norm & (V4L2_STD_PAL_Nc))
 638                return 28656448;      // 3.582056 MHz
 639
 640        if (norm & V4L2_STD_NTSC) // All NTSC/M and variants
 641                return 28636360;      // 3.57954545 MHz +/- 10 Hz
 642
 643        /*
 644         * SECAM have also different sub carrier for chroma,
 645         * but step_db and step_dr, at cx88_set_tvnorm already handles that.
 646         *
 647         * The same FSC applies to PAL/BGDKIH, PAL/60, NTSC/4.43 and PAL/N
 648         */
 649
 650        return 35468950;      // 4.43361875 MHz +/- 5 Hz
 651}
 652
 653static inline unsigned int norm_htotal(v4l2_std_id norm)
 654{
 655        unsigned int fsc4 = norm_fsc8(norm) / 2;
 656
 657        /* returns 4*FSC / vtotal / frames per seconds */
 658        return (norm & V4L2_STD_625_50) ?
 659                                ((fsc4 + 312) / 625 + 12) / 25 :
 660                                ((fsc4 + 262) / 525 * 1001 + 15000) / 30000;
 661}
 662
 663static inline unsigned int norm_vbipack(v4l2_std_id norm)
 664{
 665        return (norm & V4L2_STD_625_50) ? 511 : 400;
 666}
 667
 668int cx88_set_scale(struct cx88_core *core, unsigned int width,
 669                   unsigned int height, enum v4l2_field field)
 670{
 671        unsigned int swidth  = norm_swidth(core->tvnorm);
 672        unsigned int sheight = norm_maxh(core->tvnorm);
 673        u32 value;
 674
 675        dprintk(1, "set_scale: %dx%d [%s%s,%s]\n", width, height,
 676                V4L2_FIELD_HAS_TOP(field)    ? "T" : "",
 677                V4L2_FIELD_HAS_BOTTOM(field) ? "B" : "",
 678                v4l2_norm_to_name(core->tvnorm));
 679        if (!V4L2_FIELD_HAS_BOTH(field))
 680                height *= 2;
 681
 682        // recalc H delay and scale registers
 683        value = (width * norm_hdelay(core->tvnorm)) / swidth;
 684        value &= 0x3fe;
 685        cx_write(MO_HDELAY_EVEN,  value);
 686        cx_write(MO_HDELAY_ODD,   value);
 687        dprintk(1, "set_scale: hdelay  0x%04x (width %d)\n", value, swidth);
 688
 689        value = (swidth * 4096 / width) - 4096;
 690        cx_write(MO_HSCALE_EVEN,  value);
 691        cx_write(MO_HSCALE_ODD,   value);
 692        dprintk(1, "set_scale: hscale  0x%04x\n", value);
 693
 694        cx_write(MO_HACTIVE_EVEN, width);
 695        cx_write(MO_HACTIVE_ODD,  width);
 696        dprintk(1, "set_scale: hactive 0x%04x\n", width);
 697
 698        // recalc V scale Register (delay is constant)
 699        cx_write(MO_VDELAY_EVEN, norm_vdelay(core->tvnorm));
 700        cx_write(MO_VDELAY_ODD,  norm_vdelay(core->tvnorm));
 701        dprintk(1, "set_scale: vdelay  0x%04x\n", norm_vdelay(core->tvnorm));
 702
 703        value = (0x10000 - (sheight * 512 / height - 512)) & 0x1fff;
 704        cx_write(MO_VSCALE_EVEN,  value);
 705        cx_write(MO_VSCALE_ODD,   value);
 706        dprintk(1, "set_scale: vscale  0x%04x\n", value);
 707
 708        cx_write(MO_VACTIVE_EVEN, sheight);
 709        cx_write(MO_VACTIVE_ODD,  sheight);
 710        dprintk(1, "set_scale: vactive 0x%04x\n", sheight);
 711
 712        // setup filters
 713        value = 0;
 714        value |= (1 << 19);        // CFILT (default)
 715        if (core->tvnorm & V4L2_STD_SECAM) {
 716                value |= (1 << 15);
 717                value |= (1 << 16);
 718        }
 719        if (INPUT(core->input).type == CX88_VMUX_SVIDEO)
 720                value |= (1 << 13) | (1 << 5);
 721        if (field == V4L2_FIELD_INTERLACED)
 722                value |= (1 << 3); // VINT (interlaced vertical scaling)
 723        if (width < 385)
 724                value |= (1 << 0); // 3-tap interpolation
 725        if (width < 193)
 726                value |= (1 << 1); // 5-tap interpolation
 727        if (nocomb)
 728                value |= (3 << 5); // disable comb filter
 729
 730        cx_andor(MO_FILTER_EVEN,  0x7ffc7f, value); /* preserve PEAKEN, PSEL */
 731        cx_andor(MO_FILTER_ODD,   0x7ffc7f, value);
 732        dprintk(1, "set_scale: filter  0x%04x\n", value);
 733
 734        return 0;
 735}
 736EXPORT_SYMBOL(cx88_set_scale);
 737
 738static const u32 xtal = 28636363;
 739
 740static int set_pll(struct cx88_core *core, int prescale, u32 ofreq)
 741{
 742        static const u32 pre[] = { 0, 0, 0, 3, 2, 1 };
 743        u64 pll;
 744        u32 reg;
 745        int i;
 746
 747        if (prescale < 2)
 748                prescale = 2;
 749        if (prescale > 5)
 750                prescale = 5;
 751
 752        pll = ofreq * 8 * prescale * (u64)(1 << 20);
 753        do_div(pll, xtal);
 754        reg = (pll & 0x3ffffff) | (pre[prescale] << 26);
 755        if (((reg >> 20) & 0x3f) < 14) {
 756                pr_err("pll out of range\n");
 757                return -1;
 758        }
 759
 760        dprintk(1, "set_pll:    MO_PLL_REG       0x%08x [old=0x%08x,freq=%d]\n",
 761                reg, cx_read(MO_PLL_REG), ofreq);
 762        cx_write(MO_PLL_REG, reg);
 763        for (i = 0; i < 100; i++) {
 764                reg = cx_read(MO_DEVICE_STATUS);
 765                if (reg & (1 << 2)) {
 766                        dprintk(1, "pll locked [pre=%d,ofreq=%d]\n",
 767                                prescale, ofreq);
 768                        return 0;
 769                }
 770                dprintk(1, "pll not locked yet, waiting ...\n");
 771                usleep_range(10000, 20000);
 772        }
 773        dprintk(1, "pll NOT locked [pre=%d,ofreq=%d]\n", prescale, ofreq);
 774        return -1;
 775}
 776
 777int cx88_start_audio_dma(struct cx88_core *core)
 778{
 779        /* constant 128 made buzz in analog Nicam-stereo for bigger fifo_size */
 780        int bpl = cx88_sram_channels[SRAM_CH25].fifo_size / 4;
 781
 782        int rds_bpl = cx88_sram_channels[SRAM_CH27].fifo_size / AUD_RDS_LINES;
 783
 784        /* If downstream RISC is enabled, bail out; ALSA is managing DMA */
 785        if (cx_read(MO_AUD_DMACNTRL) & 0x10)
 786                return 0;
 787
 788        /* setup fifo + format */
 789        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH25], bpl, 0);
 790        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH26], bpl, 0);
 791        cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH27],
 792                                rds_bpl, 0);
 793
 794        cx_write(MO_AUDD_LNGTH, bpl); /* fifo bpl size */
 795        cx_write(MO_AUDR_LNGTH, rds_bpl); /* fifo bpl size */
 796
 797        /* enable Up, Down and Audio RDS fifo */
 798        cx_write(MO_AUD_DMACNTRL, 0x0007);
 799
 800        return 0;
 801}
 802
 803int cx88_stop_audio_dma(struct cx88_core *core)
 804{
 805        /* If downstream RISC is enabled, bail out; ALSA is managing DMA */
 806        if (cx_read(MO_AUD_DMACNTRL) & 0x10)
 807                return 0;
 808
 809        /* stop dma */
 810        cx_write(MO_AUD_DMACNTRL, 0x0000);
 811
 812        return 0;
 813}
 814
 815static int set_tvaudio(struct cx88_core *core)
 816{
 817        v4l2_std_id norm = core->tvnorm;
 818
 819        if (INPUT(core->input).type != CX88_VMUX_TELEVISION &&
 820            INPUT(core->input).type != CX88_VMUX_CABLE)
 821                return 0;
 822
 823        if (V4L2_STD_PAL_BG & norm) {
 824                core->tvaudio = WW_BG;
 825
 826        } else if (V4L2_STD_PAL_DK & norm) {
 827                core->tvaudio = WW_DK;
 828
 829        } else if (V4L2_STD_PAL_I & norm) {
 830                core->tvaudio = WW_I;
 831
 832        } else if (V4L2_STD_SECAM_L & norm) {
 833                core->tvaudio = WW_L;
 834
 835        } else if ((V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H) &
 836                   norm) {
 837                core->tvaudio = WW_BG;
 838
 839        } else if (V4L2_STD_SECAM_DK & norm) {
 840                core->tvaudio = WW_DK;
 841
 842        } else if ((V4L2_STD_NTSC_M & norm) ||
 843                   (V4L2_STD_PAL_M  & norm)) {
 844                core->tvaudio = WW_BTSC;
 845
 846        } else if (V4L2_STD_NTSC_M_JP & norm) {
 847                core->tvaudio = WW_EIAJ;
 848
 849        } else {
 850                pr_info("tvaudio support needs work for this tv norm [%s], sorry\n",
 851                        v4l2_norm_to_name(core->tvnorm));
 852                core->tvaudio = WW_NONE;
 853                return 0;
 854        }
 855
 856        cx_andor(MO_AFECFG_IO, 0x1f, 0x0);
 857        cx88_set_tvaudio(core);
 858        /* cx88_set_stereo(dev,V4L2_TUNER_MODE_STEREO); */
 859
 860/*
 861 * This should be needed only on cx88-alsa. It seems that some cx88 chips have
 862 * bugs and does require DMA enabled for it to work.
 863 */
 864        cx88_start_audio_dma(core);
 865        return 0;
 866}
 867
 868int cx88_set_tvnorm(struct cx88_core *core, v4l2_std_id norm)
 869{
 870        u32 fsc8;
 871        u32 adc_clock;
 872        u32 vdec_clock;
 873        u32 step_db, step_dr;
 874        u64 tmp64;
 875        u32 bdelay, agcdelay, htotal;
 876        u32 cxiformat, cxoformat;
 877
 878        if (norm == core->tvnorm)
 879                return 0;
 880        if (core->v4ldev && (vb2_is_busy(&core->v4ldev->vb2_vidq) ||
 881                             vb2_is_busy(&core->v4ldev->vb2_vbiq)))
 882                return -EBUSY;
 883        if (core->dvbdev && vb2_is_busy(&core->dvbdev->vb2_mpegq))
 884                return -EBUSY;
 885        core->tvnorm = norm;
 886        fsc8       = norm_fsc8(norm);
 887        adc_clock  = xtal;
 888        vdec_clock = fsc8;
 889        step_db    = fsc8;
 890        step_dr    = fsc8;
 891
 892        if (norm & V4L2_STD_NTSC_M_JP) {
 893                cxiformat = VideoFormatNTSCJapan;
 894                cxoformat = 0x181f0008;
 895        } else if (norm & V4L2_STD_NTSC_443) {
 896                cxiformat = VideoFormatNTSC443;
 897                cxoformat = 0x181f0008;
 898        } else if (norm & V4L2_STD_PAL_M) {
 899                cxiformat = VideoFormatPALM;
 900                cxoformat = 0x1c1f0008;
 901        } else if (norm & V4L2_STD_PAL_N) {
 902                cxiformat = VideoFormatPALN;
 903                cxoformat = 0x1c1f0008;
 904        } else if (norm & V4L2_STD_PAL_Nc) {
 905                cxiformat = VideoFormatPALNC;
 906                cxoformat = 0x1c1f0008;
 907        } else if (norm & V4L2_STD_PAL_60) {
 908                cxiformat = VideoFormatPAL60;
 909                cxoformat = 0x181f0008;
 910        } else if (norm & V4L2_STD_NTSC) {
 911                cxiformat = VideoFormatNTSC;
 912                cxoformat = 0x181f0008;
 913        } else if (norm & V4L2_STD_SECAM) {
 914                step_db = 4250000 * 8;
 915                step_dr = 4406250 * 8;
 916
 917                cxiformat = VideoFormatSECAM;
 918                cxoformat = 0x181f0008;
 919        } else { /* PAL */
 920                cxiformat = VideoFormatPAL;
 921                cxoformat = 0x181f0008;
 922        }
 923
 924        dprintk(1, "set_tvnorm: \"%s\" fsc8=%d adc=%d vdec=%d db/dr=%d/%d\n",
 925                v4l2_norm_to_name(core->tvnorm), fsc8, adc_clock, vdec_clock,
 926                step_db, step_dr);
 927        set_pll(core, 2, vdec_clock);
 928
 929        dprintk(1, "set_tvnorm: MO_INPUT_FORMAT  0x%08x [old=0x%08x]\n",
 930                cxiformat, cx_read(MO_INPUT_FORMAT) & 0x0f);
 931        /*
 932         * Chroma AGC must be disabled if SECAM is used, we enable it
 933         * by default on PAL and NTSC
 934         */
 935        cx_andor(MO_INPUT_FORMAT, 0x40f,
 936                 norm & V4L2_STD_SECAM ? cxiformat : cxiformat | 0x400);
 937
 938        // FIXME: as-is from DScaler
 939        dprintk(1, "set_tvnorm: MO_OUTPUT_FORMAT 0x%08x [old=0x%08x]\n",
 940                cxoformat, cx_read(MO_OUTPUT_FORMAT));
 941        cx_write(MO_OUTPUT_FORMAT, cxoformat);
 942
 943        // MO_SCONV_REG = adc clock / video dec clock * 2^17
 944        tmp64  = adc_clock * (u64)(1 << 17);
 945        do_div(tmp64, vdec_clock);
 946        dprintk(1, "set_tvnorm: MO_SCONV_REG     0x%08x [old=0x%08x]\n",
 947                (u32)tmp64, cx_read(MO_SCONV_REG));
 948        cx_write(MO_SCONV_REG, (u32)tmp64);
 949
 950        // MO_SUB_STEP = 8 * fsc / video dec clock * 2^22
 951        tmp64  = step_db * (u64)(1 << 22);
 952        do_div(tmp64, vdec_clock);
 953        dprintk(1, "set_tvnorm: MO_SUB_STEP      0x%08x [old=0x%08x]\n",
 954                (u32)tmp64, cx_read(MO_SUB_STEP));
 955        cx_write(MO_SUB_STEP, (u32)tmp64);
 956
 957        // MO_SUB_STEP_DR = 8 * 4406250 / video dec clock * 2^22
 958        tmp64  = step_dr * (u64)(1 << 22);
 959        do_div(tmp64, vdec_clock);
 960        dprintk(1, "set_tvnorm: MO_SUB_STEP_DR   0x%08x [old=0x%08x]\n",
 961                (u32)tmp64, cx_read(MO_SUB_STEP_DR));
 962        cx_write(MO_SUB_STEP_DR, (u32)tmp64);
 963
 964        // bdelay + agcdelay
 965        bdelay   = vdec_clock * 65 / 20000000 + 21;
 966        agcdelay = vdec_clock * 68 / 20000000 + 15;
 967        dprintk(1,
 968                "set_tvnorm: MO_AGC_BURST     0x%08x [old=0x%08x,bdelay=%d,agcdelay=%d]\n",
 969                (bdelay << 8) | agcdelay, cx_read(MO_AGC_BURST),
 970                bdelay, agcdelay);
 971        cx_write(MO_AGC_BURST, (bdelay << 8) | agcdelay);
 972
 973        // htotal
 974        tmp64 = norm_htotal(norm) * (u64)vdec_clock;
 975        do_div(tmp64, fsc8);
 976        htotal = (u32)tmp64;
 977        dprintk(1,
 978                "set_tvnorm: MO_HTOTAL        0x%08x [old=0x%08x,htotal=%d]\n",
 979                htotal, cx_read(MO_HTOTAL), (u32)tmp64);
 980        cx_andor(MO_HTOTAL, 0x07ff, htotal);
 981
 982        // vbi stuff, set vbi offset to 10 (for 20 Clk*2 pixels), this makes
 983        // the effective vbi offset ~244 samples, the same as the Bt8x8
 984        cx_write(MO_VBI_PACKET, (10 << 11) | norm_vbipack(norm));
 985
 986        // this is needed as well to set all tvnorm parameter
 987        cx88_set_scale(core, 320, 240, V4L2_FIELD_INTERLACED);
 988
 989        // audio
 990        set_tvaudio(core);
 991
 992        // tell i2c chips
 993        call_all(core, video, s_std, norm);
 994
 995        /*
 996         * The chroma_agc control should be inaccessible
 997         * if the video format is SECAM
 998         */
 999        v4l2_ctrl_grab(core->chroma_agc, cxiformat == VideoFormatSECAM);
1000
1001        // done
1002        return 0;
1003}
1004EXPORT_SYMBOL(cx88_set_tvnorm);
1005
1006/* ------------------------------------------------------------------ */
1007
1008void cx88_vdev_init(struct cx88_core *core,
1009                    struct pci_dev *pci,
1010                    struct video_device *vfd,
1011                    const struct video_device *template_,
1012                    const char *type)
1013{
1014        *vfd = *template_;
1015
1016        /*
1017         * The dev pointer of v4l2_device is NULL, instead we set the
1018         * video_device dev_parent pointer to the correct PCI bus device.
1019         * This driver is a rare example where there is one v4l2_device,
1020         * but the video nodes have different parent (PCI) devices.
1021         */
1022        vfd->v4l2_dev = &core->v4l2_dev;
1023        vfd->dev_parent = &pci->dev;
1024        vfd->release = video_device_release_empty;
1025        vfd->lock = &core->lock;
1026        snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
1027                 core->name, type, core->board.name);
1028}
1029EXPORT_SYMBOL(cx88_vdev_init);
1030
1031struct cx88_core *cx88_core_get(struct pci_dev *pci)
1032{
1033        struct cx88_core *core;
1034
1035        mutex_lock(&devlist);
1036        list_for_each_entry(core, &cx88_devlist, devlist) {
1037                if (pci->bus->number != core->pci_bus)
1038                        continue;
1039                if (PCI_SLOT(pci->devfn) != core->pci_slot)
1040                        continue;
1041
1042                if (cx88_get_resources(core, pci) != 0) {
1043                        mutex_unlock(&devlist);
1044                        return NULL;
1045                }
1046                refcount_inc(&core->refcount);
1047                mutex_unlock(&devlist);
1048                return core;
1049        }
1050
1051        core = cx88_core_create(pci, cx88_devcount);
1052        if (core) {
1053                cx88_devcount++;
1054                list_add_tail(&core->devlist, &cx88_devlist);
1055        }
1056
1057        mutex_unlock(&devlist);
1058        return core;
1059}
1060EXPORT_SYMBOL(cx88_core_get);
1061
1062void cx88_core_put(struct cx88_core *core, struct pci_dev *pci)
1063{
1064        release_mem_region(pci_resource_start(pci, 0),
1065                           pci_resource_len(pci, 0));
1066
1067        if (!refcount_dec_and_test(&core->refcount))
1068                return;
1069
1070        mutex_lock(&devlist);
1071        cx88_ir_fini(core);
1072        if (core->i2c_rc == 0) {
1073                i2c_unregister_device(core->i2c_rtc);
1074                i2c_del_adapter(&core->i2c_adap);
1075        }
1076        list_del(&core->devlist);
1077        iounmap(core->lmmio);
1078        cx88_devcount--;
1079        mutex_unlock(&devlist);
1080        v4l2_ctrl_handler_free(&core->video_hdl);
1081        v4l2_ctrl_handler_free(&core->audio_hdl);
1082        v4l2_device_unregister(&core->v4l2_dev);
1083        kfree(core);
1084}
1085EXPORT_SYMBOL(cx88_core_put);
1086