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