mantis_dvb.c revision f5ae4f6f482191c531ea9e50ac91d9bd2ffca171
141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham/* 241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham Mantis PCI bridge driver 341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham Copyright (C) 2005, 2006 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"); 50b3b961448f702339444036f94252ff2ba7a99febManu Abraham gpio_set_bits(mantis, config->power, POWER_ON); 51b3b961448f702339444036f94252ff2ba7a99febManu Abraham msleep(100); 52b3b961448f702339444036f94252ff2ba7a99febManu Abraham 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"); 58b3b961448f702339444036f94252ff2ba7a99febManu Abraham 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"); 76b3b961448f702339444036f94252ff2ba7a99febManu Abraham gpio_set_bits(mantis, config->reset, 0); 77b3b961448f702339444036f94252ff2ba7a99febManu Abraham msleep(100); 78b3b961448f702339444036f94252ff2ba7a99febManu Abraham gpio_set_bits(mantis, config->reset, 0); 79b3b961448f702339444036f94252ff2ba7a99febManu Abraham msleep(100); 80b3b961448f702339444036f94252ff2ba7a99febManu Abraham gpio_set_bits(mantis, config->reset, 1); 81b3b961448f702339444036f94252ff2ba7a99febManu Abraham msleep(100); 82b3b961448f702339444036f94252ff2ba7a99febManu Abraham 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); 12041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 12141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 12241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return mantis->feeds; 12341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 12441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 12541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamstatic int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed) 12641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 12741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct dvb_demux *dvbdmx = dvbdmxfeed->demux; 12841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham struct mantis_pci *mantis = dvbdmx->priv; 12941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 130b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "Mantis DVB Stop feed"); 13141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (!dvbdmx->dmx.frontend) { 132b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "no frontend ?"); 13341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -EINVAL; 13441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 135b3b961448f702339444036f94252ff2ba7a99febManu Abraham 13641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->feeds--; 13741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham if (mantis->feeds == 0) { 138b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma"); 13941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis_dma_stop(mantis); 14041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 141b3b961448f702339444036f94252ff2ba7a99febManu Abraham 14241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 14341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 14441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 14541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamint __devinit mantis_dvb_init(struct mantis_pci *mantis) 14641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 147b3b961448f702339444036f94252ff2ba7a99febManu Abraham struct mantis_hwconfig *config = mantis->hwconfig; 148b3b961448f702339444036f94252ff2ba7a99febManu Abraham int result = -1; 149b3b961448f702339444036f94252ff2ba7a99febManu Abraham 150b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "dvb_register_adapter"); 151b3b961448f702339444036f94252ff2ba7a99febManu Abraham 152b3b961448f702339444036f94252ff2ba7a99febManu Abraham result = dvb_register_adapter(&mantis->dvb_adapter, 153b3b961448f702339444036f94252ff2ba7a99febManu Abraham "Mantis DVB adapter", 154b3b961448f702339444036f94252ff2ba7a99febManu Abraham THIS_MODULE, 155b3b961448f702339444036f94252ff2ba7a99febManu Abraham &mantis->pdev->dev, 156b3b961448f702339444036f94252ff2ba7a99febManu Abraham adapter_nr); 15741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 158b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (result < 0) { 15941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 160b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "Error registering adapter"); 16141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return -ENODEV; 16241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 163b3b961448f702339444036f94252ff2ba7a99febManu Abraham 164b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->dvb_adapter.priv = mantis; 165b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->demux.dmx.capabilities = DMX_TS_FILTERING | 16641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham DMX_SECTION_FILTERING | 16741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham DMX_MEMORY_BASED_FILTERING; 16841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 169b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->demux.priv = mantis; 170b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->demux.filternum = 256; 171b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->demux.feednum = 256; 172b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->demux.start_feed = mantis_dvb_start_feed; 173b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->demux.stop_feed = mantis_dvb_stop_feed; 174b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->demux.write_to_decoder = NULL; 175b3b961448f702339444036f94252ff2ba7a99febManu Abraham 176b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "dvb_dmx_init"); 177b3b961448f702339444036f94252ff2ba7a99febManu Abraham result = dvb_dmx_init(&mantis->demux); 178b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (result < 0) { 179b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result); 18041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 18141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err0; 18241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 183b3b961448f702339444036f94252ff2ba7a99febManu Abraham 184b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->dmxdev.filternum = 256; 185b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->dmxdev.demux = &mantis->demux.dmx; 186b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->dmxdev.capabilities = 0; 187b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "dvb_dmxdev_init"); 188b3b961448f702339444036f94252ff2ba7a99febManu Abraham 189b3b961448f702339444036f94252ff2ba7a99febManu Abraham result = dvb_dmxdev_init(&mantis->dmxdev, &mantis->dvb_adapter); 190b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (result < 0) { 191b3b961448f702339444036f94252ff2ba7a99febManu Abraham 192b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "dvb_dmxdev_init failed, ERROR=%d", result); 19341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err1; 19441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 19541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 196b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->fe_hw.source = DMX_FRONTEND_0; 197b3b961448f702339444036f94252ff2ba7a99febManu Abraham result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_hw); 198b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (result < 0) { 19941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 200b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result); 20141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err2; 20241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 20341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 204b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->fe_mem.source = DMX_MEMORY_FE; 205f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_mem); 206b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (result < 0) { 207f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result); 20841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err3; 20941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 21041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 211b3b961448f702339444036f94252ff2ba7a99febManu Abraham result = mantis->demux.dmx.connect_frontend(&mantis->demux.dmx, &mantis->fe_hw); 212b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (result < 0) { 213b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result); 21441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham goto err4; 21541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham } 216b3b961448f702339444036f94252ff2ba7a99febManu Abraham 21741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx); 21841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis); 219b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (mantis->hwconfig) { 220b3b961448f702339444036f94252ff2ba7a99febManu Abraham result = config->frontend_init(mantis, mantis->fe); 221b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (result < 0) { 222b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "!!! NO Frontends found !!!"); 223b3b961448f702339444036f94252ff2ba7a99febManu Abraham goto err5; 224b3b961448f702339444036f94252ff2ba7a99febManu Abraham } else { 225b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (mantis->fe == NULL) { 226b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "FE <NULL>"); 227b3b961448f702339444036f94252ff2ba7a99febManu Abraham goto err5; 228b3b961448f702339444036f94252ff2ba7a99febManu Abraham } 229b3b961448f702339444036f94252ff2ba7a99febManu Abraham 230b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (dvb_register_frontend(&mantis->dvb_adapter, mantis->fe)) { 231b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_ERROR, 1, "ERROR: Frontend registration failed"); 232b3b961448f702339444036f94252ff2ba7a99febManu Abraham 233b3b961448f702339444036f94252ff2ba7a99febManu Abraham if (mantis->fe->ops.release) 234b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->fe->ops.release(mantis->fe); 235b3b961448f702339444036f94252ff2ba7a99febManu Abraham 236b3b961448f702339444036f94252ff2ba7a99febManu Abraham mantis->fe = NULL; 237b3b961448f702339444036f94252ff2ba7a99febManu Abraham goto err5; 238b3b961448f702339444036f94252ff2ba7a99febManu Abraham } 239b3b961448f702339444036f94252ff2ba7a99febManu Abraham } 240b3b961448f702339444036f94252ff2ba7a99febManu Abraham } 241d9dd5f7168d6a61491996fc02e4deb9d96308178Manu Abraham 24241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 24341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 244b3b961448f702339444036f94252ff2ba7a99febManu Abraham /* Error conditions .. */ 245b3b961448f702339444036f94252ff2ba7a99febManu Abrahamerr5: 246b3b961448f702339444036f94252ff2ba7a99febManu Abraham tasklet_kill(&mantis->tasklet); 247b3b961448f702339444036f94252ff2ba7a99febManu Abraham dvb_net_release(&mantis->dvbnet); 24868fe255cd15cf1fe04877fbbb0eafe80c43eff5dManu Abraham dvb_unregister_frontend(mantis->fe); 24968fe255cd15cf1fe04877fbbb0eafe80c43eff5dManu Abraham dvb_frontend_detach(mantis->fe); 25041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr4: 25141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem); 2523e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 25341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr3: 25441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw); 2553e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 25641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr2: 25741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmxdev_release(&mantis->dmxdev); 2583e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 25941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr1: 26041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmx_release(&mantis->demux); 2613e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 26241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr0: 26341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_unregister_adapter(&mantis->dvb_adapter); 26441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 26541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return result; 26641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 267b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_init); 26841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 269b3b961448f702339444036f94252ff2ba7a99febManu Abrahamint __devexit mantis_dvb_exit(struct mantis_pci *mantis) 27041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 271b3b961448f702339444036f94252ff2ba7a99febManu Abraham int err; 27241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 2733e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham if (mantis->fe) { 274f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* mantis_ca_exit(mantis); */ 2753e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham err = mantis_frontend_shutdown(mantis); 2763e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham if (err != 0) 2773e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err); 2783e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham dvb_unregister_frontend(mantis->fe); 279c5e598a6f89ca7335db9f327e24e3abd13d137cfManu Abraham dvb_frontend_detach(mantis->fe); 2803e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham } 28141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 28241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham tasklet_kill(&mantis->tasklet); 28341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_net_release(&mantis->dvbnet); 2843e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 28541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem); 28641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw); 2873e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 28841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmxdev_release(&mantis->dmxdev); 28941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmx_release(&mantis->demux); 29041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 291b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "dvb_unregister_adapter"); 29241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_unregister_adapter(&mantis->dvb_adapter); 29341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 29441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 29541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 296b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_exit); 297