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 */
193