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