mantis_dvb.c revision 3037fd14302d635426996fb7f6fcf7cb98dc15b9
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 14741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamint __devinit 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); 25168fe255cd15cf1fe04877fbbb0eafe80c43eff5dManu Abraham dvb_unregister_frontend(mantis->fe); 25268fe255cd15cf1fe04877fbbb0eafe80c43eff5dManu Abraham dvb_frontend_detach(mantis->fe); 25341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr4: 25441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem); 2553e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 25641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr3: 25741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw); 2583e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 25941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr2: 26041e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmxdev_release(&mantis->dmxdev); 2613e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 26241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr1: 26341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmx_release(&mantis->demux); 2643e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 26541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abrahamerr0: 26641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_unregister_adapter(&mantis->dvb_adapter); 26741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 26841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return result; 26941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 270b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_init); 27141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 272b3b961448f702339444036f94252ff2ba7a99febManu Abrahamint __devexit mantis_dvb_exit(struct mantis_pci *mantis) 27341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham{ 274b3b961448f702339444036f94252ff2ba7a99febManu Abraham int err; 27541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 2763e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham if (mantis->fe) { 277f5ae4f6f482191c531ea9e50ac91d9bd2ffca171Manu Abraham /* mantis_ca_exit(mantis); */ 2783e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham err = mantis_frontend_shutdown(mantis); 2793e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham if (err != 0) 2803e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err); 2813e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham dvb_unregister_frontend(mantis->fe); 282c5e598a6f89ca7335db9f327e24e3abd13d137cfManu Abraham dvb_frontend_detach(mantis->fe); 2833e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham } 28441e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 28541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham tasklet_kill(&mantis->tasklet); 28641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_net_release(&mantis->dvbnet); 2873e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 28841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem); 28941e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw); 2903e978a8284080d801d20cda377d9cf7c12fe68b9Manu Abraham 29141e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmxdev_release(&mantis->dmxdev); 29241e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_dmx_release(&mantis->demux); 29341e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 294b3b961448f702339444036f94252ff2ba7a99febManu Abraham dprintk(MANTIS_DEBUG, 1, "dvb_unregister_adapter"); 29541e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham dvb_unregister_adapter(&mantis->dvb_adapter); 29641e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham 29741e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham return 0; 29841e840b13e111ba18b138d055ddd250bd5ad5e39Manu Abraham} 299b3b961448f702339444036f94252ff2ba7a99febManu AbrahamEXPORT_SYMBOL_GPL(mantis_dvb_exit); 300