Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Earthsoft PT3 driver
0004  *
0005  * Copyright (C) 2014 Akihiro Tsukada <tskd08@gmail.com>
0006  */
0007 
0008 #ifndef PT3_H
0009 #define PT3_H
0010 
0011 #include <linux/atomic.h>
0012 #include <linux/types.h>
0013 
0014 #include <media/dvb_demux.h>
0015 #include <media/dvb_frontend.h>
0016 #include <media/dmxdev.h>
0017 
0018 #include "tc90522.h"
0019 #include "mxl301rf.h"
0020 #include "qm1d1c0042.h"
0021 
0022 #define DRV_NAME KBUILD_MODNAME
0023 
0024 #define PT3_NUM_FE 4
0025 
0026 /*
0027  * register index of the FPGA chip
0028  */
0029 #define REG_VERSION 0x00
0030 #define REG_BUS     0x04
0031 #define REG_SYSTEM_W    0x08
0032 #define REG_SYSTEM_R    0x0c
0033 #define REG_I2C_W   0x10
0034 #define REG_I2C_R   0x14
0035 #define REG_RAM_W   0x18
0036 #define REG_RAM_R   0x1c
0037 #define REG_DMA_BASE    0x40    /* regs for FE[i] = REG_DMA_BASE + 0x18 * i */
0038 #define OFST_DMA_DESC_L 0x00
0039 #define OFST_DMA_DESC_H 0x04
0040 #define OFST_DMA_CTL    0x08
0041 #define OFST_TS_CTL 0x0c
0042 #define OFST_STATUS 0x10
0043 #define OFST_TS_ERR 0x14
0044 
0045 /*
0046  * internal buffer for I2C
0047  */
0048 #define PT3_I2C_MAX 4091
0049 struct pt3_i2cbuf {
0050     u8  data[PT3_I2C_MAX];
0051     u8  tmp;
0052     u32 num_cmds;
0053 };
0054 
0055 /*
0056  * DMA things
0057  */
0058 #define TS_PACKET_SZ  188
0059 /* DMA transfers must not cross 4GiB, so use one page / transfer */
0060 #define DATA_XFER_SZ   4096
0061 #define DATA_BUF_XFERS 47
0062 /* (num_bufs * DATA_BUF_SZ) % TS_PACKET_SZ must be 0 */
0063 #define DATA_BUF_SZ    (DATA_BUF_XFERS * DATA_XFER_SZ)
0064 #define MAX_DATA_BUFS  16
0065 #define MIN_DATA_BUFS   2
0066 
0067 #define DESCS_IN_PAGE (PAGE_SIZE / sizeof(struct xfer_desc))
0068 #define MAX_NUM_XFERS (MAX_DATA_BUFS * DATA_BUF_XFERS)
0069 #define MAX_DESC_BUFS DIV_ROUND_UP(MAX_NUM_XFERS, DESCS_IN_PAGE)
0070 
0071 /* DMA transfer description.
0072  * device is passed a pointer to this struct, dma-reads it,
0073  * and gets the DMA buffer ring for storing TS data.
0074  */
0075 struct xfer_desc {
0076     u32 addr_l; /* bus address of target data buffer */
0077     u32 addr_h;
0078     u32 size;
0079     u32 next_l; /* bus address of the next xfer_desc */
0080     u32 next_h;
0081 };
0082 
0083 /* A DMA mapping of a page containing xfer_desc's */
0084 struct xfer_desc_buffer {
0085     dma_addr_t b_addr;
0086     struct xfer_desc *descs; /* PAGE_SIZE (xfer_desc[DESCS_IN_PAGE]) */
0087 };
0088 
0089 /* A DMA mapping of a data buffer */
0090 struct dma_data_buffer {
0091     dma_addr_t b_addr;
0092     u8 *data; /* size: u8[PAGE_SIZE] */
0093 };
0094 
0095 /*
0096  * device things
0097  */
0098 struct pt3_adap_config {
0099     struct i2c_board_info demod_info;
0100     struct tc90522_config demod_cfg;
0101 
0102     struct i2c_board_info tuner_info;
0103     union tuner_config {
0104         struct qm1d1c0042_config qm1d1c0042;
0105         struct mxl301rf_config   mxl301rf;
0106     } tuner_cfg;
0107     u32 init_freq;
0108 };
0109 
0110 struct pt3_adapter {
0111     struct dvb_adapter  dvb_adap;  /* dvb_adap.priv => struct pt3_board */
0112     int adap_idx;
0113 
0114     struct dvb_demux    demux;
0115     struct dmxdev       dmxdev;
0116     struct dvb_frontend *fe;
0117     struct i2c_client   *i2c_demod;
0118     struct i2c_client   *i2c_tuner;
0119 
0120     /* data fetch thread */
0121     struct task_struct *thread;
0122     int num_feeds;
0123 
0124     bool cur_lna;
0125     bool cur_lnb; /* current LNB power status (on/off) */
0126 
0127     /* items below are for DMA */
0128     struct dma_data_buffer buffer[MAX_DATA_BUFS];
0129     int buf_idx;
0130     int buf_ofs;
0131     int num_bufs;  /* == pt3_board->num_bufs */
0132     int num_discard; /* how many access units to discard initially */
0133 
0134     struct xfer_desc_buffer desc_buf[MAX_DESC_BUFS];
0135     int num_desc_bufs;  /* == num_bufs * DATA_BUF_XFERS / DESCS_IN_PAGE */
0136 };
0137 
0138 
0139 struct pt3_board {
0140     struct pci_dev *pdev;
0141     void __iomem *regs[2];
0142     /* regs[0]: registers, regs[1]: internal memory, used for I2C */
0143 
0144     struct mutex lock;
0145 
0146     /* LNB power shared among sat-FEs */
0147     int lnb_on_cnt; /* LNB power on count */
0148 
0149     /* LNA shared among terr-FEs */
0150     int lna_on_cnt; /* booster enabled count */
0151 
0152     int num_bufs;  /* number of DMA buffers allocated/mapped per FE */
0153 
0154     struct i2c_adapter i2c_adap;
0155     struct pt3_i2cbuf *i2c_buf;
0156 
0157     struct pt3_adapter *adaps[PT3_NUM_FE];
0158 };
0159 
0160 
0161 /*
0162  * prototypes
0163  */
0164 extern int  pt3_alloc_dmabuf(struct pt3_adapter *adap);
0165 extern void pt3_init_dmabuf(struct pt3_adapter *adap);
0166 extern void pt3_free_dmabuf(struct pt3_adapter *adap);
0167 extern int  pt3_start_dma(struct pt3_adapter *adap);
0168 extern int  pt3_stop_dma(struct pt3_adapter *adap);
0169 extern int  pt3_proc_dma(struct pt3_adapter *adap);
0170 
0171 extern int  pt3_i2c_master_xfer(struct i2c_adapter *adap,
0172                 struct i2c_msg *msgs, int num);
0173 extern u32  pt3_i2c_functionality(struct i2c_adapter *adap);
0174 extern void pt3_i2c_reset(struct pt3_board *pt3);
0175 extern int  pt3_init_all_demods(struct pt3_board *pt3);
0176 extern int  pt3_init_all_mxl301rf(struct pt3_board *pt3);
0177 #endif /* PT3_H */