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