Linux 6.10-rc2
[sfrench/cifs-2.6.git] / drivers / media / pci / mantis / mantis_common.h
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
69 enum mantis_i2c_mode {
70         MANTIS_PAGE_MODE = 0,
71         MANTIS_BYTE_MODE,
72 };
73
74 struct mantis_pci;
75
76 struct 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
94 struct mantis_pci_drvdata {
95         struct mantis_hwconfig *hwconfig;
96         char *rc_map_name;
97 };
98
99 struct 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
174 static 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
183 static 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 */