linux/drivers/media/pci/mantis/mantis_common.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3        Mantis PCI bridge driver
   4
   5        Copyright (C) Manu Abraham (abraham.manu@gmail.com)
   6
   7*/
   8
   9#ifndef __MANTIS_COMMON_H
  10#define __MANTIS_COMMON_H
  11
  12#include <linux/interrupt.h>
  13#include <linux/mutex.h>
  14#include <linux/workqueue.h>
  15
  16#include "mantis_reg.h"
  17#include "mantis_uart.h"
  18
  19#include "mantis_link.h"
  20
  21#define MANTIS_ERROR            0
  22#define MANTIS_NOTICE           1
  23#define MANTIS_INFO             2
  24#define MANTIS_DEBUG            3
  25#define MANTIS_TMG              9
  26
  27#define dprintk(y, z, format, arg...) do {                                                              \
  28        if (z) {                                                                                        \
  29                if      ((mantis->verbose > MANTIS_ERROR) && (mantis->verbose > y))                     \
  30                        printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);      \
  31                else if ((mantis->verbose > MANTIS_NOTICE) && (mantis->verbose > y))                    \
  32                        printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);   \
  33                else if ((mantis->verbose > MANTIS_INFO) && (mantis->verbose > y))                      \
  34                        printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);     \
  35                else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y))                     \
  36                        printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);    \
  37                else if ((mantis->verbose > MANTIS_TMG) && (mantis->verbose > y))                       \
  38                        printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);    \
  39        } else {                                                                                        \
  40                if (mantis->verbose > y)                                                                \
  41                        printk(format , ##arg);                                                         \
  42        }                                                                                               \
  43} while(0)
  44
  45#define mwrite(dat, addr)       writel((dat), addr)
  46#define mread(addr)             readl(addr)
  47
  48#define mmwrite(dat, addr)      mwrite((dat), (mantis->mmio + (addr)))
  49#define mmread(addr)            mread(mantis->mmio + (addr))
  50
  51#define MANTIS_TS_188           0
  52#define MANTIS_TS_204           1
  53
  54#define TWINHAN_TECHNOLOGIES    0x1822
  55#define MANTIS                  0x4e35
  56
  57#define TECHNISAT               0x1ae4
  58#define TERRATEC                0x153b
  59
  60#define MAKE_ENTRY(__subven, __subdev, __configptr, __rc) {             \
  61                .vendor         = TWINHAN_TECHNOLOGIES,                 \
  62                .device         = MANTIS,                               \
  63                .subvendor      = (__subven),                           \
  64                .subdevice      = (__subdev),                           \
  65                .driver_data    = (unsigned long)                       \
  66                        &(struct mantis_pci_drvdata){__configptr, __rc} \
  67}
  68
  69enum mantis_i2c_mode {
  70        MANTIS_PAGE_MODE = 0,
  71        MANTIS_BYTE_MODE,
  72};
  73
  74struct mantis_pci;
  75
  76struct mantis_hwconfig {
  77        char                    *model_name;
  78        char                    *dev_type;
  79        u32                     ts_size;
  80
  81        enum mantis_baud        baud_rate;
  82        enum mantis_parity      parity;
  83        u32                     bytes;
  84
  85        irqreturn_t (*irq_handler)(int irq, void *dev_id);
  86        int (*frontend_init)(struct mantis_pci *mantis, struct dvb_frontend *fe);
  87
  88        u8                      power;
  89        u8                      reset;
  90
  91        enum mantis_i2c_mode    i2c_mode;
  92};
  93
  94struct mantis_pci_drvdata {
  95        struct mantis_hwconfig *hwconfig;
  96        char *rc_map_name;
  97};
  98
  99struct mantis_pci {
 100        unsigned int            verbose;
 101
 102        /*      PCI stuff               */
 103        u16                     vendor_id;
 104        u16                     device_id;
 105        u16                     subsystem_vendor;
 106        u16                     subsystem_device;
 107
 108        u8                      latency;
 109
 110        struct pci_dev          *pdev;
 111
 112        unsigned long           mantis_addr;
 113        void __iomem            *mmio;
 114
 115        u8                      irq;
 116        u8                      revision;
 117
 118        unsigned int            num;
 119
 120        /*      RISC Core               */
 121        u32                     busy_block;
 122        u32                     last_block;
 123        u8                      *buf_cpu;
 124        dma_addr_t              buf_dma;
 125        __le32                  *risc_cpu;
 126        dma_addr_t              risc_dma;
 127
 128        struct tasklet_struct   tasklet;
 129        spinlock_t              intmask_lock;
 130
 131        struct i2c_adapter      adapter;
 132        int                     i2c_rc;
 133        wait_queue_head_t       i2c_wq;
 134        struct mutex            i2c_lock;
 135
 136        /*      DVB stuff               */
 137        struct dvb_adapter      dvb_adapter;
 138        struct dvb_frontend     *fe;
 139        struct dvb_demux        demux;
 140        struct dmxdev           dmxdev;
 141        struct dmx_frontend     fe_hw;
 142        struct dmx_frontend     fe_mem;
 143        struct dvb_net          dvbnet;
 144
 145        u8                      feeds;
 146
 147        struct mantis_hwconfig  *hwconfig;
 148
 149        u32                     mantis_int_stat;
 150        u32                     mantis_int_mask;
 151
 152        /*      board specific          */
 153        u8                      mac_address[8];
 154        u32                     sub_vendor_id;
 155        u32                     sub_device_id;
 156
 157         /*     A12 A13 A14             */
 158        u32                     gpio_status;
 159
 160        u32                     gpif_status;
 161
 162        struct mantis_ca        *mantis_ca;
 163
 164        struct work_struct      uart_work;
 165
 166        struct rc_dev           *rc;
 167        char                    device_name[80];
 168        char                    input_phys[80];
 169        char                    *rc_map_name;
 170};
 171
 172#define MANTIS_HIF_STATUS       (mantis->gpio_status)
 173
 174static inline void mantis_mask_ints(struct mantis_pci *mantis, u32 mask)
 175{
 176        unsigned long flags;
 177
 178        spin_lock_irqsave(&mantis->intmask_lock, flags);
 179        mmwrite(mmread(MANTIS_INT_MASK) & ~mask, MANTIS_INT_MASK);
 180        spin_unlock_irqrestore(&mantis->intmask_lock, flags);
 181}
 182
 183static inline void mantis_unmask_ints(struct mantis_pci *mantis, u32 mask)
 184{
 185        unsigned long flags;
 186
 187        spin_lock_irqsave(&mantis->intmask_lock, flags);
 188        mmwrite(mmread(MANTIS_INT_MASK) | mask, MANTIS_INT_MASK);
 189        spin_unlock_irqrestore(&mantis->intmask_lock, flags);
 190}
 191
 192#endif /* __MANTIS_COMMON_H */
 193