141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham/*
241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	Mantis PCI bridge driver
38825a0970cef408fb2f1a44e3cb05d6ba41a18dbManu Abraham	Copyright (C) Manu Abraham (abraham.manu@gmail.com)
441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	This program is free software; you can redistribute it and/or modify
641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	it under the terms of the GNU General Public License as published by
741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	the Free Software Foundation; either version 2 of the License, or
841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	(at your option) any later version.
941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
1041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	This program is distributed in the hope that it will be useful,
1141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	but WITHOUT ANY WARRANTY; without even the implied warranty of
1241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	GNU General Public License for more details.
1441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
1541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	You should have received a copy of the GNU General Public License
1641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	along with this program; if not, write to the Free Software
1741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
1841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham*/
1941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
20b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/kernel.h>
2141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include <linux/bitops.h>
22b3b961448f702339444036f94252ff2ba7a99febManu Abraham
23b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/signal.h>
24b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/sched.h>
25b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/interrupt.h>
26b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/pci.h>
27b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include <linux/i2c.h>
2841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
2941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dmxdev.h"
3041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dvbdev.h"
3141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dvb_demux.h"
3241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham#include "dvb_frontend.h"
33b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "dvb_net.h"
3441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
35b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_common.h"
36b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_dma.h"
37b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_ca.h"
38b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_ioc.h"
39b3b961448f702339444036f94252ff2ba7a99febManu Abraham#include "mantis_dvb.h"
40616f75e1979f5bd1f3241581c720349c2c31f6e7Manu Abraham
41b3b961448f702339444036f94252ff2ba7a99febManu AbrahamDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
4241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
43b3b961448f702339444036f94252ff2ba7a99febManu Abrahamint mantis_frontend_power(struct mantis_pci *mantis, enum mantis_power power)
4441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
45b3b961448f702339444036f94252ff2ba7a99febManu Abraham	struct mantis_hwconfig *config = mantis->hwconfig;
46b3b961448f702339444036f94252ff2ba7a99febManu Abraham
47b3b961448f702339444036f94252ff2ba7a99febManu Abraham	switch (power) {
48b3b961448f702339444036f94252ff2ba7a99febManu Abraham	case POWER_ON:
49b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Power ON");
503037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings		mantis_gpio_set_bits(mantis, config->power, POWER_ON);
51b3b961448f702339444036f94252ff2ba7a99febManu Abraham		msleep(100);
523037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings		mantis_gpio_set_bits(mantis, config->power, POWER_ON);
53b3b961448f702339444036f94252ff2ba7a99febManu Abraham		msleep(100);
54b3b961448f702339444036f94252ff2ba7a99febManu Abraham		break;
5541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
56b3b961448f702339444036f94252ff2ba7a99febManu Abraham	case POWER_OFF:
57b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Power OFF");
583037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings		mantis_gpio_set_bits(mantis, config->power, POWER_OFF);
59b3b961448f702339444036f94252ff2ba7a99febManu Abraham		msleep(100);
60b3b961448f702339444036f94252ff2ba7a99febManu Abraham		break;
6141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
62b3b961448f702339444036f94252ff2ba7a99febManu Abraham	default:
63b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "Unknown state <%02x>", power);
64b3b961448f702339444036f94252ff2ba7a99febManu Abraham		return -1;
65b3b961448f702339444036f94252ff2ba7a99febManu Abraham	}
6641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
6741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
6841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
69b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_frontend_power);
7041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
71b3b961448f702339444036f94252ff2ba7a99febManu Abrahamvoid mantis_frontend_soft_reset(struct mantis_pci *mantis)
7241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
73b3b961448f702339444036f94252ff2ba7a99febManu Abraham	struct mantis_hwconfig *config = mantis->hwconfig;
74b3b961448f702339444036f94252ff2ba7a99febManu Abraham
75b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Frontend RESET");
763037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings	mantis_gpio_set_bits(mantis, config->reset, 0);
77b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
783037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings	mantis_gpio_set_bits(mantis, config->reset, 0);
79b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
803037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings	mantis_gpio_set_bits(mantis, config->reset, 1);
81b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
823037fd14302d635426996fb7f6fcf7cb98dc15b9Ben Hutchings	mantis_gpio_set_bits(mantis, config->reset, 1);
83b3b961448f702339444036f94252ff2ba7a99febManu Abraham	msleep(100);
84b3b961448f702339444036f94252ff2ba7a99febManu Abraham
85b3b961448f702339444036f94252ff2ba7a99febManu Abraham	return;
86b3b961448f702339444036f94252ff2ba7a99febManu Abraham}
87b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_frontend_soft_reset);
88b3b961448f702339444036f94252ff2ba7a99febManu Abraham
89b3b961448f702339444036f94252ff2ba7a99febManu Abrahamstatic int mantis_frontend_shutdown(struct mantis_pci *mantis)
90b3b961448f702339444036f94252ff2ba7a99febManu Abraham{
91b3b961448f702339444036f94252ff2ba7a99febManu Abraham	int err;
92b3b961448f702339444036f94252ff2ba7a99febManu Abraham
93b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis_frontend_soft_reset(mantis);
94b3b961448f702339444036f94252ff2ba7a99febManu Abraham	err = mantis_frontend_power(mantis, POWER_OFF);
95b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (err != 0) {
96b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "Frontend POWER OFF failed! <%d>", err);
97b3b961448f702339444036f94252ff2ba7a99febManu Abraham		return 1;
98b3b961448f702339444036f94252ff2ba7a99febManu Abraham	}
9941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
10041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
10141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
10241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
10341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mantis_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
10441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
10541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
10641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct mantis_pci *mantis = dvbdmx->priv;
10741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
108b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Mantis DVB Start feed");
10941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (!dvbdmx->dmx.frontend) {
110b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "no frontend ?");
11141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		return -EINVAL;
11241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
113b3b961448f702339444036f94252ff2ba7a99febManu Abraham
11441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->feeds++;
115b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "mantis start feed, feeds=%d",	mantis->feeds);
11641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
11741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (mantis->feeds == 1)	 {
118b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma");
11941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		mantis_dma_start(mantis);
1209c81496a88b04206d0607b23b298b6529da1fcb0Marko Ristola		tasklet_enable(&mantis->tasklet);
12141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
12241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
12341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return mantis->feeds;
12441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
12541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
12641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
12741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
12841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
12941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	struct mantis_pci *mantis = dvbdmx->priv;
13041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
131b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "Mantis DVB Stop feed");
13241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (!dvbdmx->dmx.frontend) {
133b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "no frontend ?");
13441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		return -EINVAL;
13541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
136b3b961448f702339444036f94252ff2ba7a99febManu Abraham
13741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->feeds--;
13841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	if (mantis->feeds == 0) {
139b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma");
1409c81496a88b04206d0607b23b298b6529da1fcb0Marko Ristola		tasklet_disable(&mantis->tasklet);
14141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		mantis_dma_stop(mantis);
14241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
143b3b961448f702339444036f94252ff2ba7a99febManu Abraham
14441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
14541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
14641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
1474c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanint mantis_dvb_init(struct mantis_pci *mantis)
14841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
149b3b961448f702339444036f94252ff2ba7a99febManu Abraham	struct mantis_hwconfig *config = mantis->hwconfig;
150b3b961448f702339444036f94252ff2ba7a99febManu Abraham	int result = -1;
151b3b961448f702339444036f94252ff2ba7a99febManu Abraham
152b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_register_adapter");
153b3b961448f702339444036f94252ff2ba7a99febManu Abraham
154b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = dvb_register_adapter(&mantis->dvb_adapter,
155b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      "Mantis DVB adapter",
156b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      THIS_MODULE,
157b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      &mantis->pdev->dev,
158b3b961448f702339444036f94252ff2ba7a99febManu Abraham				      adapter_nr);
15941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
160b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
16141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
162b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "Error registering adapter");
16341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		return -ENODEV;
16441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
165b3b961448f702339444036f94252ff2ba7a99febManu Abraham
166b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dvb_adapter.priv	= mantis;
167b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.dmx.capabilities	= DMX_TS_FILTERING	|
16841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham					 DMX_SECTION_FILTERING	|
16941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham					 DMX_MEMORY_BASED_FILTERING;
17041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
171b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.priv		= mantis;
172b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.filternum		= 256;
173b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.feednum		= 256;
174b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.start_feed	= mantis_dvb_start_feed;
175b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.stop_feed		= mantis_dvb_stop_feed;
176b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->demux.write_to_decoder	= NULL;
177b3b961448f702339444036f94252ff2ba7a99febManu Abraham
178b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_dmx_init");
179b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = dvb_dmx_init(&mantis->demux);
180b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
181b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
18241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
18341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err0;
18441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
185b3b961448f702339444036f94252ff2ba7a99febManu Abraham
186b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dmxdev.filternum	= 256;
187b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dmxdev.demux		= &mantis->demux.dmx;
188b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->dmxdev.capabilities	= 0;
189b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_dmxdev_init");
190b3b961448f702339444036f94252ff2ba7a99febManu Abraham
191b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = dvb_dmxdev_init(&mantis->dmxdev, &mantis->dvb_adapter);
192b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
193b3b961448f702339444036f94252ff2ba7a99febManu Abraham
194b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmxdev_init failed, ERROR=%d", result);
19541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err1;
19641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
19741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
198b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->fe_hw.source		= DMX_FRONTEND_0;
199b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_hw);
200b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
20141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
202b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
20341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err2;
20441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
20541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
206b3b961448f702339444036f94252ff2ba7a99febManu Abraham	mantis->fe_mem.source		= DMX_MEMORY_FE;
207f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_mem);
208b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
209f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
21041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err3;
21141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
21241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
213b3b961448f702339444036f94252ff2ba7a99febManu Abraham	result = mantis->demux.dmx.connect_frontend(&mantis->demux.dmx, &mantis->fe_hw);
214b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (result < 0) {
215b3b961448f702339444036f94252ff2ba7a99febManu Abraham		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
21641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham		goto err4;
21741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	}
218b3b961448f702339444036f94252ff2ba7a99febManu Abraham
21941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx);
22041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis);
2219c81496a88b04206d0607b23b298b6529da1fcb0Marko Ristola	tasklet_disable(&mantis->tasklet);
222b3b961448f702339444036f94252ff2ba7a99febManu Abraham	if (mantis->hwconfig) {
223b3b961448f702339444036f94252ff2ba7a99febManu Abraham		result = config->frontend_init(mantis, mantis->fe);
224b3b961448f702339444036f94252ff2ba7a99febManu Abraham		if (result < 0) {
225b3b961448f702339444036f94252ff2ba7a99febManu Abraham			dprintk(MANTIS_ERROR, 1, "!!! NO Frontends found !!!");
226b3b961448f702339444036f94252ff2ba7a99febManu Abraham			goto err5;
227b3b961448f702339444036f94252ff2ba7a99febManu Abraham		} else {
228b3b961448f702339444036f94252ff2ba7a99febManu Abraham			if (mantis->fe == NULL) {
229b3b961448f702339444036f94252ff2ba7a99febManu Abraham				dprintk(MANTIS_ERROR, 1, "FE <NULL>");
230b3b961448f702339444036f94252ff2ba7a99febManu Abraham				goto err5;
231b3b961448f702339444036f94252ff2ba7a99febManu Abraham			}
232b3b961448f702339444036f94252ff2ba7a99febManu Abraham
233b3b961448f702339444036f94252ff2ba7a99febManu Abraham			if (dvb_register_frontend(&mantis->dvb_adapter, mantis->fe)) {
234b3b961448f702339444036f94252ff2ba7a99febManu Abraham				dprintk(MANTIS_ERROR, 1, "ERROR: Frontend registration failed");
235b3b961448f702339444036f94252ff2ba7a99febManu Abraham
236b3b961448f702339444036f94252ff2ba7a99febManu Abraham				if (mantis->fe->ops.release)
237b3b961448f702339444036f94252ff2ba7a99febManu Abraham					mantis->fe->ops.release(mantis->fe);
238b3b961448f702339444036f94252ff2ba7a99febManu Abraham
239b3b961448f702339444036f94252ff2ba7a99febManu Abraham				mantis->fe = NULL;
240b3b961448f702339444036f94252ff2ba7a99febManu Abraham				goto err5;
241b3b961448f702339444036f94252ff2ba7a99febManu Abraham			}
242b3b961448f702339444036f94252ff2ba7a99febManu Abraham		}
243b3b961448f702339444036f94252ff2ba7a99febManu Abraham	}
244d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham
24541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
24641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
247b3b961448f702339444036f94252ff2ba7a99febManu Abraham	/* Error conditions ..	*/
248b3b961448f702339444036f94252ff2ba7a99febManu Abrahamerr5:
249b3b961448f702339444036f94252ff2ba7a99febManu Abraham	tasklet_kill(&mantis->tasklet);
250b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dvb_net_release(&mantis->dvbnet);
251e1d45ae10aea8e8a403e5d96bf5902ee670007ffAlan Cox	if (mantis->fe) {
252e1d45ae10aea8e8a403e5d96bf5902ee670007ffAlan Cox		dvb_unregister_frontend(mantis->fe);
253e1d45ae10aea8e8a403e5d96bf5902ee670007ffAlan Cox		dvb_frontend_detach(mantis->fe);
254e1d45ae10aea8e8a403e5d96bf5902ee670007ffAlan Cox	}
25541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr4:
25641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
2573e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
25841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr3:
25941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
2603e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
26141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr2:
26241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmxdev_release(&mantis->dmxdev);
2633e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
26441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr1:
26541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmx_release(&mantis->demux);
2663e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
26741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr0:
26841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_unregister_adapter(&mantis->dvb_adapter);
26941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
27041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return result;
27141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
272b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_init);
27341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
2744c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanint mantis_dvb_exit(struct mantis_pci *mantis)
27541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{
276b3b961448f702339444036f94252ff2ba7a99febManu Abraham	int err;
27741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
2783e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham	if (mantis->fe) {
279f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham		/* mantis_ca_exit(mantis); */
2803e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham		err = mantis_frontend_shutdown(mantis);
2813e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham		if (err != 0)
2823e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham			dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
2833e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham		dvb_unregister_frontend(mantis->fe);
284c5e598a6f89ca7335db9f327e24e3abd13d137cfManu Abraham		dvb_frontend_detach(mantis->fe);
2853e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham	}
28641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
28741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	tasklet_kill(&mantis->tasklet);
28841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_net_release(&mantis->dvbnet);
2893e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
29041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
29141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
2923e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham
29341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmxdev_release(&mantis->dmxdev);
29441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_dmx_release(&mantis->demux);
29541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
296b3b961448f702339444036f94252ff2ba7a99febManu Abraham	dprintk(MANTIS_DEBUG, 1, "dvb_unregister_adapter");
29741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	dvb_unregister_adapter(&mantis->dvb_adapter);
29841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham
29941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham	return 0;
30041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham}
301b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_exit);
302