174ba9207SThomas 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 #include <linux/kernel.h>
1025aee3deSMauro Carvalho Chehab #include <linux/i2c.h>
1125aee3deSMauro Carvalho Chehab 
1225aee3deSMauro Carvalho Chehab #include <linux/signal.h>
1325aee3deSMauro Carvalho Chehab #include <linux/sched.h>
1425aee3deSMauro Carvalho Chehab #include <linux/interrupt.h>
1525aee3deSMauro Carvalho Chehab #include <asm/io.h>
1625aee3deSMauro Carvalho Chehab 
17fada1935SMauro Carvalho Chehab #include <media/dmxdev.h>
18fada1935SMauro Carvalho Chehab #include <media/dvbdev.h>
19fada1935SMauro Carvalho Chehab #include <media/dvb_demux.h>
20fada1935SMauro Carvalho Chehab #include <media/dvb_frontend.h>
21fada1935SMauro Carvalho Chehab #include <media/dvb_net.h>
2225aee3deSMauro Carvalho Chehab 
2325aee3deSMauro Carvalho Chehab #include "mantis_common.h"
2425aee3deSMauro Carvalho Chehab #include "mantis_reg.h"
2525aee3deSMauro Carvalho Chehab #include "mantis_ioc.h"
2625aee3deSMauro Carvalho Chehab 
read_eeprom_bytes(struct mantis_pci * mantis,u8 reg,u8 * data,u8 length)2725aee3deSMauro Carvalho Chehab static int read_eeprom_bytes(struct mantis_pci *mantis, u8 reg, u8 *data, u8 length)
2825aee3deSMauro Carvalho Chehab {
2925aee3deSMauro Carvalho Chehab 	struct i2c_adapter *adapter = &mantis->adapter;
3025aee3deSMauro Carvalho Chehab 	int err;
3125aee3deSMauro Carvalho Chehab 	u8 buf = reg;
3225aee3deSMauro Carvalho Chehab 
3325aee3deSMauro Carvalho Chehab 	struct i2c_msg msg[] = {
3425aee3deSMauro Carvalho Chehab 		{ .addr = 0x50, .flags = 0, .buf = &buf, .len = 1 },
3525aee3deSMauro Carvalho Chehab 		{ .addr = 0x50, .flags = I2C_M_RD, .buf = data, .len = length },
3625aee3deSMauro Carvalho Chehab 	};
3725aee3deSMauro Carvalho Chehab 
3825aee3deSMauro Carvalho Chehab 	err = i2c_transfer(adapter, msg, 2);
3925aee3deSMauro Carvalho Chehab 	if (err < 0) {
4025aee3deSMauro Carvalho Chehab 		dprintk(MANTIS_ERROR, 1, "ERROR: i2c read: < err=%i d0=0x%02x d1=0x%02x >",
4125aee3deSMauro Carvalho Chehab 			err, data[0], data[1]);
4225aee3deSMauro Carvalho Chehab 
4325aee3deSMauro Carvalho Chehab 		return err;
4425aee3deSMauro Carvalho Chehab 	}
4525aee3deSMauro Carvalho Chehab 
4625aee3deSMauro Carvalho Chehab 	return 0;
4725aee3deSMauro Carvalho Chehab }
mantis_get_mac(struct mantis_pci * mantis)4825aee3deSMauro Carvalho Chehab int mantis_get_mac(struct mantis_pci *mantis)
4925aee3deSMauro Carvalho Chehab {
5025aee3deSMauro Carvalho Chehab 	int err;
5125aee3deSMauro Carvalho Chehab 	u8 mac_addr[6] = {0};
5225aee3deSMauro Carvalho Chehab 
5325aee3deSMauro Carvalho Chehab 	err = read_eeprom_bytes(mantis, 0x08, mac_addr, 6);
5425aee3deSMauro Carvalho Chehab 	if (err < 0) {
5525aee3deSMauro Carvalho Chehab 		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis EEPROM read error <%d>", err);
5625aee3deSMauro Carvalho Chehab 
5725aee3deSMauro Carvalho Chehab 		return err;
5825aee3deSMauro Carvalho Chehab 	}
5925aee3deSMauro Carvalho Chehab 
6025aee3deSMauro Carvalho Chehab 	dprintk(MANTIS_ERROR, 0, "    MAC Address=[%pM]\n", mac_addr);
6125aee3deSMauro Carvalho Chehab 
6225aee3deSMauro Carvalho Chehab 	return 0;
6325aee3deSMauro Carvalho Chehab }
6425aee3deSMauro Carvalho Chehab EXPORT_SYMBOL_GPL(mantis_get_mac);
6525aee3deSMauro Carvalho Chehab 
6625aee3deSMauro Carvalho Chehab /* Turn the given bit on or off. */
mantis_gpio_set_bits(struct mantis_pci * mantis,u32 bitpos,u8 value)6725aee3deSMauro Carvalho Chehab void mantis_gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
6825aee3deSMauro Carvalho Chehab {
6925aee3deSMauro Carvalho Chehab 	u32 cur;
7025aee3deSMauro Carvalho Chehab 
7125aee3deSMauro Carvalho Chehab 	dprintk(MANTIS_DEBUG, 1, "Set Bit <%d> to <%d>", bitpos, value);
7225aee3deSMauro Carvalho Chehab 	cur = mmread(MANTIS_GPIF_ADDR);
7325aee3deSMauro Carvalho Chehab 	if (value)
7425aee3deSMauro Carvalho Chehab 		mantis->gpio_status = cur | (1 << bitpos);
7525aee3deSMauro Carvalho Chehab 	else
7625aee3deSMauro Carvalho Chehab 		mantis->gpio_status = cur & (~(1 << bitpos));
7725aee3deSMauro Carvalho Chehab 
7825aee3deSMauro Carvalho Chehab 	dprintk(MANTIS_DEBUG, 1, "GPIO Value <%02x>", mantis->gpio_status);
7925aee3deSMauro Carvalho Chehab 	mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR);
8025aee3deSMauro Carvalho Chehab 	mmwrite(0x00, MANTIS_GPIF_DOUT);
8125aee3deSMauro Carvalho Chehab }
8225aee3deSMauro Carvalho Chehab EXPORT_SYMBOL_GPL(mantis_gpio_set_bits);
8325aee3deSMauro Carvalho Chehab 
mantis_stream_control(struct mantis_pci * mantis,enum mantis_stream_control stream_ctl)8425aee3deSMauro Carvalho Chehab int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl)
8525aee3deSMauro Carvalho Chehab {
8625aee3deSMauro Carvalho Chehab 	u32 reg;
8725aee3deSMauro Carvalho Chehab 
8825aee3deSMauro Carvalho Chehab 	reg = mmread(MANTIS_CONTROL);
8925aee3deSMauro Carvalho Chehab 	switch (stream_ctl) {
9025aee3deSMauro Carvalho Chehab 	case STREAM_TO_HIF:
9125aee3deSMauro Carvalho Chehab 		dprintk(MANTIS_DEBUG, 1, "Set stream to HIF");
9225aee3deSMauro Carvalho Chehab 		reg &= 0xff - MANTIS_BYPASS;
9325aee3deSMauro Carvalho Chehab 		mmwrite(reg, MANTIS_CONTROL);
9425aee3deSMauro Carvalho Chehab 		reg |= MANTIS_BYPASS;
9525aee3deSMauro Carvalho Chehab 		mmwrite(reg, MANTIS_CONTROL);
9625aee3deSMauro Carvalho Chehab 		break;
9725aee3deSMauro Carvalho Chehab 
9825aee3deSMauro Carvalho Chehab 	case STREAM_TO_CAM:
9925aee3deSMauro Carvalho Chehab 		dprintk(MANTIS_DEBUG, 1, "Set stream to CAM");
10025aee3deSMauro Carvalho Chehab 		reg |= MANTIS_BYPASS;
10125aee3deSMauro Carvalho Chehab 		mmwrite(reg, MANTIS_CONTROL);
10225aee3deSMauro Carvalho Chehab 		reg &= 0xff - MANTIS_BYPASS;
10325aee3deSMauro Carvalho Chehab 		mmwrite(reg, MANTIS_CONTROL);
10425aee3deSMauro Carvalho Chehab 		break;
10525aee3deSMauro Carvalho Chehab 	default:
10625aee3deSMauro Carvalho Chehab 		dprintk(MANTIS_ERROR, 1, "Unknown MODE <%02x>", stream_ctl);
10725aee3deSMauro Carvalho Chehab 		return -1;
10825aee3deSMauro Carvalho Chehab 	}
10925aee3deSMauro Carvalho Chehab 
11025aee3deSMauro Carvalho Chehab 	return 0;
11125aee3deSMauro Carvalho Chehab }
11225aee3deSMauro Carvalho Chehab EXPORT_SYMBOL_GPL(mantis_stream_control);
113