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(lock: &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(lock: &mantis->intmask_lock, flags);
190}
191
192#endif /* __MANTIS_COMMON_H */
193

source code of linux/drivers/media/pci/mantis/mantis_common.h