linux/drivers/media/pci/pt3/pt3.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Earthsoft PT3 driver
   4 *
   5 * Copyright (C) 2014 Akihiro Tsukada <tskd08@gmail.com>
   6 */
   7
   8#ifndef PT3_H
   9#define PT3_H
  10
  11#include <linux/atomic.h>
  12#include <linux/types.h>
  13
  14#include <media/dvb_demux.h>
  15#include <media/dvb_frontend.h>
  16#include <media/dmxdev.h>
  17
  18#include "tc90522.h"
  19#include "mxl301rf.h"
  20#include "qm1d1c0042.h"
  21
  22#define DRV_NAME KBUILD_MODNAME
  23
  24#define PT3_NUM_FE 4
  25
  26/*
  27 * register index of the FPGA chip
  28 */
  29#define REG_VERSION     0x00
  30#define REG_BUS         0x04
  31#define REG_SYSTEM_W    0x08
  32#define REG_SYSTEM_R    0x0c
  33#define REG_I2C_W       0x10
  34#define REG_I2C_R       0x14
  35#define REG_RAM_W       0x18
  36#define REG_RAM_R       0x1c
  37#define REG_DMA_BASE    0x40    /* regs for FE[i] = REG_DMA_BASE + 0x18 * i */
  38#define OFST_DMA_DESC_L 0x00
  39#define OFST_DMA_DESC_H 0x04
  40#define OFST_DMA_CTL    0x08
  41#define OFST_TS_CTL     0x0c
  42#define OFST_STATUS     0x10
  43#define OFST_TS_ERR     0x14
  44
  45/*
  46 * internal buffer for I2C
  47 */
  48#define PT3_I2C_MAX 4091
  49struct pt3_i2cbuf {
  50        u8  data[PT3_I2C_MAX];
  51        u8  tmp;
  52        u32 num_cmds;
  53};
  54
  55/*
  56 * DMA things
  57 */
  58#define TS_PACKET_SZ  188
  59/* DMA transfers must not cross 4GiB, so use one page / transfer */
  60#define DATA_XFER_SZ   4096
  61#define DATA_BUF_XFERS 47
  62/* (num_bufs * DATA_BUF_SZ) % TS_PACKET_SZ must be 0 */
  63#define DATA_BUF_SZ    (DATA_BUF_XFERS * DATA_XFER_SZ)
  64#define MAX_DATA_BUFS  16
  65#define MIN_DATA_BUFS   2
  66
  67#define DESCS_IN_PAGE (PAGE_SIZE / sizeof(struct xfer_desc))
  68#define MAX_NUM_XFERS (MAX_DATA_BUFS * DATA_BUF_XFERS)
  69#define MAX_DESC_BUFS DIV_ROUND_UP(MAX_NUM_XFERS, DESCS_IN_PAGE)
  70
  71/* DMA transfer description.
  72 * device is passed a pointer to this struct, dma-reads it,
  73 * and gets the DMA buffer ring for storing TS data.
  74 */
  75struct xfer_desc {
  76        u32 addr_l; /* bus address of target data buffer */
  77        u32 addr_h;
  78        u32 size;
  79        u32 next_l; /* bus address of the next xfer_desc */
  80        u32 next_h;
  81};
  82
  83/* A DMA mapping of a page containing xfer_desc's */
  84struct xfer_desc_buffer {
  85        dma_addr_t b_addr;
  86        struct xfer_desc *descs; /* PAGE_SIZE (xfer_desc[DESCS_IN_PAGE]) */
  87};
  88
  89/* A DMA mapping of a data buffer */
  90struct dma_data_buffer {
  91        dma_addr_t b_addr;
  92        u8 *data; /* size: u8[PAGE_SIZE] */
  93};
  94
  95/*
  96 * device things
  97 */
  98struct pt3_adap_config {
  99        struct i2c_board_info demod_info;
 100        struct tc90522_config demod_cfg;
 101
 102        struct i2c_board_info tuner_info;
 103        union tuner_config {
 104                struct qm1d1c0042_config qm1d1c0042;
 105                struct mxl301rf_config   mxl301rf;
 106        } tuner_cfg;
 107        u32 init_freq;
 108};
 109
 110struct pt3_adapter {
 111        struct dvb_adapter  dvb_adap;  /* dvb_adap.priv => struct pt3_board */
 112        int adap_idx;
 113
 114        struct dvb_demux    demux;
 115        struct dmxdev       dmxdev;
 116        struct dvb_frontend *fe;
 117        struct i2c_client   *i2c_demod;
 118        struct i2c_client   *i2c_tuner;
 119
 120        /* data fetch thread */
 121        struct task_struct *thread;
 122        int num_feeds;
 123
 124        bool cur_lna;
 125        bool cur_lnb; /* current LNB power status (on/off) */
 126
 127        /* items below are for DMA */
 128        struct dma_data_buffer buffer[MAX_DATA_BUFS];
 129        int buf_idx;
 130        int buf_ofs;
 131        int num_bufs;  /* == pt3_board->num_bufs */
 132        int num_discard; /* how many access units to discard initially */
 133
 134        struct xfer_desc_buffer desc_buf[MAX_DESC_BUFS];
 135        int num_desc_bufs;  /* == num_bufs * DATA_BUF_XFERS / DESCS_IN_PAGE */
 136};
 137
 138
 139struct pt3_board {
 140        struct pci_dev *pdev;
 141        void __iomem *regs[2];
 142        /* regs[0]: registers, regs[1]: internal memory, used for I2C */
 143
 144        struct mutex lock;
 145
 146        /* LNB power shared among sat-FEs */
 147        int lnb_on_cnt; /* LNB power on count */
 148
 149        /* LNA shared among terr-FEs */
 150        int lna_on_cnt; /* booster enabled count */
 151
 152        int num_bufs;  /* number of DMA buffers allocated/mapped per FE */
 153
 154        struct i2c_adapter i2c_adap;
 155        struct pt3_i2cbuf *i2c_buf;
 156
 157        struct pt3_adapter *adaps[PT3_NUM_FE];
 158};
 159
 160
 161/*
 162 * prototypes
 163 */
 164extern int  pt3_alloc_dmabuf(struct pt3_adapter *adap);
 165extern void pt3_init_dmabuf(struct pt3_adapter *adap);
 166extern void pt3_free_dmabuf(struct pt3_adapter *adap);
 167extern int  pt3_start_dma(struct pt3_adapter *adap);
 168extern int  pt3_stop_dma(struct pt3_adapter *adap);
 169extern int  pt3_proc_dma(struct pt3_adapter *adap);
 170
 171extern int  pt3_i2c_master_xfer(struct i2c_adapter *adap,
 172                                struct i2c_msg *msgs, int num);
 173extern u32  pt3_i2c_functionality(struct i2c_adapter *adap);
 174extern void pt3_i2c_reset(struct pt3_board *pt3);
 175extern int  pt3_init_all_demods(struct pt3_board *pt3);
 176extern int  pt3_init_all_mxl301rf(struct pt3_board *pt3);
 177#endif /* PT3_H */
 178