xref: /openbmc/linux/drivers/media/pci/mantis/mantis_common.h (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
1*74ba9207SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
225aee3deSMauro Carvalho Chehab /*
325aee3deSMauro Carvalho Chehab 	Mantis PCI bridge driver
425aee3deSMauro Carvalho Chehab 
525aee3deSMauro Carvalho Chehab 	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
625aee3deSMauro Carvalho Chehab 
725aee3deSMauro Carvalho Chehab */
825aee3deSMauro Carvalho Chehab 
925aee3deSMauro Carvalho Chehab #ifndef __MANTIS_COMMON_H
1025aee3deSMauro Carvalho Chehab #define __MANTIS_COMMON_H
1125aee3deSMauro Carvalho Chehab 
1225aee3deSMauro Carvalho Chehab #include <linux/interrupt.h>
1325aee3deSMauro Carvalho Chehab #include <linux/mutex.h>
1425aee3deSMauro Carvalho Chehab #include <linux/workqueue.h>
1525aee3deSMauro Carvalho Chehab 
16a96762daSJan Klötzke #include "mantis_reg.h"
1725aee3deSMauro Carvalho Chehab #include "mantis_uart.h"
1825aee3deSMauro Carvalho Chehab 
1925aee3deSMauro Carvalho Chehab #include "mantis_link.h"
2025aee3deSMauro Carvalho Chehab 
2125aee3deSMauro Carvalho Chehab #define MANTIS_ERROR		0
2225aee3deSMauro Carvalho Chehab #define MANTIS_NOTICE		1
2325aee3deSMauro Carvalho Chehab #define MANTIS_INFO		2
2425aee3deSMauro Carvalho Chehab #define MANTIS_DEBUG		3
2525aee3deSMauro Carvalho Chehab #define MANTIS_TMG		9
2625aee3deSMauro Carvalho Chehab 
2725aee3deSMauro Carvalho Chehab #define dprintk(y, z, format, arg...) do {								\
2825aee3deSMauro Carvalho Chehab 	if (z) {											\
2925aee3deSMauro Carvalho Chehab 		if	((mantis->verbose > MANTIS_ERROR) && (mantis->verbose > y))			\
3025aee3deSMauro Carvalho Chehab 			printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
3125aee3deSMauro Carvalho Chehab 		else if	((mantis->verbose > MANTIS_NOTICE) && (mantis->verbose > y))			\
3225aee3deSMauro Carvalho Chehab 			printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
3325aee3deSMauro Carvalho Chehab 		else if ((mantis->verbose > MANTIS_INFO) && (mantis->verbose > y))			\
3425aee3deSMauro Carvalho Chehab 			printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
3525aee3deSMauro Carvalho Chehab 		else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y))			\
3625aee3deSMauro Carvalho Chehab 			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
3725aee3deSMauro Carvalho Chehab 		else if ((mantis->verbose > MANTIS_TMG) && (mantis->verbose > y))			\
3825aee3deSMauro Carvalho Chehab 			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
3925aee3deSMauro Carvalho Chehab 	} else {											\
4025aee3deSMauro Carvalho Chehab 		if (mantis->verbose > y)								\
4125aee3deSMauro Carvalho Chehab 			printk(format , ##arg);								\
4225aee3deSMauro Carvalho Chehab 	}												\
4325aee3deSMauro Carvalho Chehab } while(0)
4425aee3deSMauro Carvalho Chehab 
4525aee3deSMauro Carvalho Chehab #define mwrite(dat, addr)	writel((dat), addr)
4625aee3deSMauro Carvalho Chehab #define mread(addr)		readl(addr)
4725aee3deSMauro Carvalho Chehab 
4825aee3deSMauro Carvalho Chehab #define mmwrite(dat, addr)	mwrite((dat), (mantis->mmio + (addr)))
4925aee3deSMauro Carvalho Chehab #define mmread(addr)		mread(mantis->mmio + (addr))
5025aee3deSMauro Carvalho Chehab 
5125aee3deSMauro Carvalho Chehab #define MANTIS_TS_188		0
5225aee3deSMauro Carvalho Chehab #define MANTIS_TS_204		1
5325aee3deSMauro Carvalho Chehab 
5425aee3deSMauro Carvalho Chehab #define TWINHAN_TECHNOLOGIES	0x1822
5525aee3deSMauro Carvalho Chehab #define MANTIS			0x4e35
5625aee3deSMauro Carvalho Chehab 
5725aee3deSMauro Carvalho Chehab #define TECHNISAT		0x1ae4
5825aee3deSMauro Carvalho Chehab #define TERRATEC		0x153b
5925aee3deSMauro Carvalho Chehab 
60a96762daSJan Klötzke #define MAKE_ENTRY(__subven, __subdev, __configptr, __rc) {		\
6125aee3deSMauro Carvalho Chehab 		.vendor		= TWINHAN_TECHNOLOGIES,			\
6225aee3deSMauro Carvalho Chehab 		.device		= MANTIS,				\
6325aee3deSMauro Carvalho Chehab 		.subvendor	= (__subven),				\
6425aee3deSMauro Carvalho Chehab 		.subdevice	= (__subdev),				\
65a96762daSJan Klötzke 		.driver_data	= (unsigned long)			\
66a96762daSJan Klötzke 			&(struct mantis_pci_drvdata){__configptr, __rc}	\
6725aee3deSMauro Carvalho Chehab }
6825aee3deSMauro Carvalho Chehab 
6925aee3deSMauro Carvalho Chehab enum mantis_i2c_mode {
7025aee3deSMauro Carvalho Chehab 	MANTIS_PAGE_MODE = 0,
7125aee3deSMauro Carvalho Chehab 	MANTIS_BYTE_MODE,
7225aee3deSMauro Carvalho Chehab };
7325aee3deSMauro Carvalho Chehab 
7425aee3deSMauro Carvalho Chehab struct mantis_pci;
7525aee3deSMauro Carvalho Chehab 
7625aee3deSMauro Carvalho Chehab struct mantis_hwconfig {
7725aee3deSMauro Carvalho Chehab 	char			*model_name;
7825aee3deSMauro Carvalho Chehab 	char			*dev_type;
7925aee3deSMauro Carvalho Chehab 	u32			ts_size;
8025aee3deSMauro Carvalho Chehab 
8125aee3deSMauro Carvalho Chehab 	enum mantis_baud	baud_rate;
8225aee3deSMauro Carvalho Chehab 	enum mantis_parity	parity;
8325aee3deSMauro Carvalho Chehab 	u32			bytes;
8425aee3deSMauro Carvalho Chehab 
8525aee3deSMauro Carvalho Chehab 	irqreturn_t (*irq_handler)(int irq, void *dev_id);
8625aee3deSMauro Carvalho Chehab 	int (*frontend_init)(struct mantis_pci *mantis, struct dvb_frontend *fe);
8725aee3deSMauro Carvalho Chehab 
8825aee3deSMauro Carvalho Chehab 	u8			power;
8925aee3deSMauro Carvalho Chehab 	u8			reset;
9025aee3deSMauro Carvalho Chehab 
9125aee3deSMauro Carvalho Chehab 	enum mantis_i2c_mode	i2c_mode;
9225aee3deSMauro Carvalho Chehab };
9325aee3deSMauro Carvalho Chehab 
94a96762daSJan Klötzke struct mantis_pci_drvdata {
95a96762daSJan Klötzke 	struct mantis_hwconfig *hwconfig;
96a96762daSJan Klötzke 	char *rc_map_name;
97a96762daSJan Klötzke };
98a96762daSJan Klötzke 
9925aee3deSMauro Carvalho Chehab struct mantis_pci {
10025aee3deSMauro Carvalho Chehab 	unsigned int		verbose;
10125aee3deSMauro Carvalho Chehab 
10225aee3deSMauro Carvalho Chehab 	/*	PCI stuff		*/
10325aee3deSMauro Carvalho Chehab 	u16			vendor_id;
10425aee3deSMauro Carvalho Chehab 	u16			device_id;
10525aee3deSMauro Carvalho Chehab 	u16			subsystem_vendor;
10625aee3deSMauro Carvalho Chehab 	u16			subsystem_device;
10725aee3deSMauro Carvalho Chehab 
10825aee3deSMauro Carvalho Chehab 	u8			latency;
10925aee3deSMauro Carvalho Chehab 
11025aee3deSMauro Carvalho Chehab 	struct pci_dev		*pdev;
11125aee3deSMauro Carvalho Chehab 
11225aee3deSMauro Carvalho Chehab 	unsigned long		mantis_addr;
11325aee3deSMauro Carvalho Chehab 	void __iomem		*mmio;
11425aee3deSMauro Carvalho Chehab 
11525aee3deSMauro Carvalho Chehab 	u8			irq;
11625aee3deSMauro Carvalho Chehab 	u8			revision;
11725aee3deSMauro Carvalho Chehab 
11825aee3deSMauro Carvalho Chehab 	unsigned int		num;
11925aee3deSMauro Carvalho Chehab 
12025aee3deSMauro Carvalho Chehab 	/*	RISC Core		*/
12125aee3deSMauro Carvalho Chehab 	u32			busy_block;
12225aee3deSMauro Carvalho Chehab 	u32			last_block;
12325aee3deSMauro Carvalho Chehab 	u8			*buf_cpu;
12425aee3deSMauro Carvalho Chehab 	dma_addr_t		buf_dma;
125967a3783SHans Verkuil 	__le32			*risc_cpu;
12625aee3deSMauro Carvalho Chehab 	dma_addr_t		risc_dma;
12725aee3deSMauro Carvalho Chehab 
12825aee3deSMauro Carvalho Chehab 	struct tasklet_struct	tasklet;
129a96762daSJan Klötzke 	spinlock_t		intmask_lock;
13025aee3deSMauro Carvalho Chehab 
13125aee3deSMauro Carvalho Chehab 	struct i2c_adapter	adapter;
13225aee3deSMauro Carvalho Chehab 	int			i2c_rc;
13325aee3deSMauro Carvalho Chehab 	wait_queue_head_t	i2c_wq;
13425aee3deSMauro Carvalho Chehab 	struct mutex		i2c_lock;
13525aee3deSMauro Carvalho Chehab 
13625aee3deSMauro Carvalho Chehab 	/*	DVB stuff		*/
13725aee3deSMauro Carvalho Chehab 	struct dvb_adapter	dvb_adapter;
13825aee3deSMauro Carvalho Chehab 	struct dvb_frontend	*fe;
13925aee3deSMauro Carvalho Chehab 	struct dvb_demux	demux;
14025aee3deSMauro Carvalho Chehab 	struct dmxdev		dmxdev;
14125aee3deSMauro Carvalho Chehab 	struct dmx_frontend	fe_hw;
14225aee3deSMauro Carvalho Chehab 	struct dmx_frontend	fe_mem;
14325aee3deSMauro Carvalho Chehab 	struct dvb_net		dvbnet;
14425aee3deSMauro Carvalho Chehab 
14525aee3deSMauro Carvalho Chehab 	u8			feeds;
14625aee3deSMauro Carvalho Chehab 
14725aee3deSMauro Carvalho Chehab 	struct mantis_hwconfig	*hwconfig;
14825aee3deSMauro Carvalho Chehab 
14925aee3deSMauro Carvalho Chehab 	u32			mantis_int_stat;
15025aee3deSMauro Carvalho Chehab 	u32			mantis_int_mask;
15125aee3deSMauro Carvalho Chehab 
15225aee3deSMauro Carvalho Chehab 	/*	board specific		*/
15325aee3deSMauro Carvalho Chehab 	u8			mac_address[8];
15425aee3deSMauro Carvalho Chehab 	u32			sub_vendor_id;
15525aee3deSMauro Carvalho Chehab 	u32			sub_device_id;
15625aee3deSMauro Carvalho Chehab 
15725aee3deSMauro Carvalho Chehab 	 /*	A12 A13 A14		*/
15825aee3deSMauro Carvalho Chehab 	u32			gpio_status;
15925aee3deSMauro Carvalho Chehab 
16025aee3deSMauro Carvalho Chehab 	u32			gpif_status;
16125aee3deSMauro Carvalho Chehab 
16225aee3deSMauro Carvalho Chehab 	struct mantis_ca	*mantis_ca;
16325aee3deSMauro Carvalho Chehab 
16425aee3deSMauro Carvalho Chehab 	struct work_struct	uart_work;
16525aee3deSMauro Carvalho Chehab 
16625aee3deSMauro Carvalho Chehab 	struct rc_dev		*rc;
167518f4b26SSean Young 	char			device_name[80];
16825aee3deSMauro Carvalho Chehab 	char			input_phys[80];
169a96762daSJan Klötzke 	char			*rc_map_name;
17025aee3deSMauro Carvalho Chehab };
17125aee3deSMauro Carvalho Chehab 
17225aee3deSMauro Carvalho Chehab #define MANTIS_HIF_STATUS	(mantis->gpio_status)
17325aee3deSMauro Carvalho Chehab 
mantis_mask_ints(struct mantis_pci * mantis,u32 mask)174a96762daSJan Klötzke static inline void mantis_mask_ints(struct mantis_pci *mantis, u32 mask)
175a96762daSJan Klötzke {
176a96762daSJan Klötzke 	unsigned long flags;
177a96762daSJan Klötzke 
178a96762daSJan Klötzke 	spin_lock_irqsave(&mantis->intmask_lock, flags);
179a96762daSJan Klötzke 	mmwrite(mmread(MANTIS_INT_MASK) & ~mask, MANTIS_INT_MASK);
180a96762daSJan Klötzke 	spin_unlock_irqrestore(&mantis->intmask_lock, flags);
181a96762daSJan Klötzke }
182a96762daSJan Klötzke 
mantis_unmask_ints(struct mantis_pci * mantis,u32 mask)183a96762daSJan Klötzke static inline void mantis_unmask_ints(struct mantis_pci *mantis, u32 mask)
184a96762daSJan Klötzke {
185a96762daSJan Klötzke 	unsigned long flags;
186a96762daSJan Klötzke 
187a96762daSJan Klötzke 	spin_lock_irqsave(&mantis->intmask_lock, flags);
188a96762daSJan Klötzke 	mmwrite(mmread(MANTIS_INT_MASK) | mask, MANTIS_INT_MASK);
189a96762daSJan Klötzke 	spin_unlock_irqrestore(&mantis->intmask_lock, flags);
190a96762daSJan Klötzke }
191a96762daSJan Klötzke 
19225aee3deSMauro Carvalho Chehab #endif /* __MANTIS_COMMON_H */
193