dm1105.c revision 519a4bdcf8221c6b2d129b3c720761b7cab7f2c1
1a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* 2a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * dm1105.c - driver for DVB cards based on SDMC DM1105 PCI chip 3a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * 4a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * Copyright (C) 2008 Igor M. Liplianin <liplianin@me.by> 5a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * 6a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * This program is free software; you can redistribute it and/or modify 7a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * it under the terms of the GNU General Public License as published by 8a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * the Free Software Foundation; either version 2 of the License, or 9a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * (at your option) any later version. 10a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * 11a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * This program is distributed in the hope that it will be useful, 12a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * but WITHOUT ANY WARRANTY; without even the implied warranty of 13a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * GNU General Public License for more details. 15a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * 16a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * You should have received a copy of the GNU General Public License 17a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * along with this program; if not, write to the Free Software 18a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * 20a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin */ 21a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 22a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/i2c.h> 23a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/init.h> 24a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/kernel.h> 25a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/module.h> 26a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/proc_fs.h> 27a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/pci.h> 28a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/dma-mapping.h> 29a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/input.h> 30a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <media/ir-common.h> 31a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 32a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "demux.h" 33a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dmxdev.h" 34a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb_demux.h" 35a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb_frontend.h" 36a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb_net.h" 37a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvbdev.h" 38a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb-pll.h" 39a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 40a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "stv0299.h" 41e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin#include "stv0288.h" 42e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin#include "stb6000.h" 4304ad28c9916da709f38b1d43817892142c2c3508Igor M. Liplianin#include "si21xx.h" 4435d9c42779ef5e8cb46902bb6987443e136c0517Igor M. Liplianin#include "cx24116.h" 45a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "z0194a.h" 46a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 47a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* ----------------------------------------------- */ 48a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* 49a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * PCI ID's 50a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin */ 51a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_VENDOR_ID_TRIGEM 52a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_VENDOR_ID_TRIGEM 0x109f 53a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 54519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#ifndef PCI_VENDOR_ID_AXESS 55519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#define PCI_VENDOR_ID_AXESS 0x195d 56519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#endif 57a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_DEVICE_ID_DM1105 58a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_DEVICE_ID_DM1105 0x036f 59a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 60a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_DEVICE_ID_DW2002 61a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_DEVICE_ID_DW2002 0x2002 62a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 63a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_DEVICE_ID_DW2004 64a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_DEVICE_ID_DW2004 0x2004 65a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 66519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#ifndef PCI_DEVICE_ID_DM05 67519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#define PCI_DEVICE_ID_DM05 0x1105 68519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#endif 69a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* ----------------------------------------------- */ 70a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* sdmc dm1105 registers */ 71a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 72a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* TS Control */ 73a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_TSCTR 0x00 74a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DTALENTH 0x04 75a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 76a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* GPIO Interface */ 77a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_GPIOVAL 0x08 78a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_GPIOCTR 0x0c 79a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 80a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* PID serial number */ 81a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_PIDN 0x10 82a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 83a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Odd-even secret key select */ 84a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_CWSEL 0x14 85a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 86a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Host Command Interface */ 87a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_HOST_CTR 0x18 88a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_HOST_AD 0x1c 89a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 90a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* PCI Interface */ 91a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_CR 0x30 92a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_RST 0x34 93a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_STADR 0x38 94a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_RLEN 0x3c 95a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_WRP 0x40 96a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_INTCNT 0x44 97a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_INTMAK 0x48 98a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_INTSTS 0x4c 99a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 100a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* CW Value */ 101a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_ODD 0x50 102a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_EVEN 0x58 103a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 104a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* PID Value */ 105a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_PID 0x60 106a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 107a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* IR Control */ 108a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IRCTR 0x64 109a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IRMODE 0x68 110a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_SYSTEMCODE 0x6c 111a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IRCODE 0x70 112a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 113a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Unknown Values */ 114a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_ENCRYPT 0x74 115a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_VER 0x7c 116a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 117a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* I2C Interface */ 118a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2CCTR 0x80 119a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2CSTS 0x81 120a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2CDAT 0x82 121a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2C_RA 0x83 122a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* ----------------------------------------------- */ 123a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Interrupt Mask Bits */ 124a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 125a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_TSIRQM 0x01 126a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_HIRQM 0x04 127a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_IRM 0x08 128a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_ALLMASK (INTMAK_TSIRQM | \ 129a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin INTMAK_HIRQM | \ 130a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin INTMAK_IRM) 131a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_NONEMASK 0x00 132a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 133a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Interrupt Status Bits */ 134a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTSTS_TSIRQ 0x01 135a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTSTS_HIRQ 0x04 136a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTSTS_IR 0x08 137a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 138a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* IR Control Bits */ 139a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IR_EN 0x01 140a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_SYS_CHK 0x02 141a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_REP_FLG 0x08 142a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 143a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* EEPROM addr */ 144a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define IIC_24C01_addr 0xa0 145a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Max board count */ 146a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_MAX 0x04 147a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 148a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DRIVER_NAME "dm1105" 149a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 150a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DMA_PACKETS 47 151a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DMA_PACKET_LENGTH (128*4) 152a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DMA_BYTES (128 * 4 * DM1105_DMA_PACKETS) 153a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 154a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* GPIO's for LNB power control */ 155a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_LNB_MASK 0x00000000 156a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_LNB_13V 0x00010100 157a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_LNB_18V 0x00000100 158a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 159519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin/* GPIO's for LNB power control for Axess DM05 */ 160519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#define DM05_LNB_MASK 0x00000000 161519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#define DM05_LNB_13V 0x00020000 162519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#define DM05_LNB_18V 0x00030000 163519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin 164a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int ir_debug; 165a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinmodule_param(ir_debug, int, 0644); 166a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding"); 167a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 168a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 169a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 170a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* infrared remote control */ 171a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstruct infrared { 172a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct input_dev *input_dev; 173b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin struct ir_input_state ir; 174a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin char input_phys[32]; 175b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin struct work_struct work; 176a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 ir_command; 177a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 178a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 179a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstruct dm1105dvb { 180a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* pci */ 181a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct pci_dev *pdev; 182a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u8 __iomem *io_mem; 183a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 184a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* ir */ 185a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct infrared ir; 186a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 187a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* dvb */ 188a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_frontend hw_frontend; 189a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_frontend mem_frontend; 190a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmxdev dmxdev; 191a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_adapter dvb_adapter; 192a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_demux demux; 193a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_frontend *fe; 194a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_net dvbnet; 195a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned int full_ts_users; 196a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 197a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* i2c */ 198a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct i2c_adapter i2c_adap; 199a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 200d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin /* irq */ 201d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin struct work_struct work; 202519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin struct workqueue_struct *wq; 203519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin char wqn[16]; 204d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 205a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* dma */ 206a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dma_addr_t dma_addr; 207a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned char *ts_buf; 208a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 wrp; 209d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin u32 nextwrp; 210a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 buffer_size; 211a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned int PacketErrorCount; 212a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned int dmarst; 213a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin spinlock_t lock; 214a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 215a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 216a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 217a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define dm_io_mem(reg) ((unsigned long)(&dm1105dvb->io_mem[reg])) 218a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 219a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap, 220a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct i2c_msg *msgs, int num) 221a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 222a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dm1105dvb *dm1105dvb ; 223a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 224a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin int addr, rc, i, j, k, len, byte, data; 225a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u8 status; 226a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 227a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb = i2c_adap->algo_data; 228a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (i = 0; i < num; i++) { 229a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0x00, dm_io_mem(DM1105_I2CCTR)); 230a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (msgs[i].flags & I2C_M_RD) { 231a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* read bytes */ 232a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin addr = msgs[i].addr << 1; 233a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin addr |= 1; 234a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(addr, dm_io_mem(DM1105_I2CDAT)); 235a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (byte = 0; byte < msgs[i].len; byte++) 236a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0, dm_io_mem(DM1105_I2CDAT + byte + 1)); 237a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 238a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0x81 + msgs[i].len, dm_io_mem(DM1105_I2CCTR)); 239a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (j = 0; j < 55; j++) { 240a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin mdelay(10); 241a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin status = inb(dm_io_mem(DM1105_I2CSTS)); 242a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if ((status & 0xc0) == 0x40) 243a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 244a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 245a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (j >= 55) 246a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -1; 247a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 248a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (byte = 0; byte < msgs[i].len; byte++) { 249a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin rc = inb(dm_io_mem(DM1105_I2CDAT + byte + 1)); 250a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (rc < 0) 251a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err; 252a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin msgs[i].buf[byte] = rc; 253a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 254a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } else { 255a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if ((msgs[i].buf[0] == 0xf7) && (msgs[i].addr == 0x55)) { 256a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* prepaired for cx24116 firmware */ 257a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* Write in small blocks */ 258a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin len = msgs[i].len - 1; 259a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin k = 1; 260a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin do { 261a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(msgs[i].addr << 1, dm_io_mem(DM1105_I2CDAT)); 262a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0xf7, dm_io_mem(DM1105_I2CDAT + 1)); 263a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (byte = 0; byte < (len > 48 ? 48 : len); byte++) { 264a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin data = msgs[i].buf[k+byte]; 265a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(data, dm_io_mem(DM1105_I2CDAT + byte + 2)); 266a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 267a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0x82 + (len > 48 ? 48 : len), dm_io_mem(DM1105_I2CCTR)); 268a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (j = 0; j < 25; j++) { 269a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin mdelay(10); 270a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin status = inb(dm_io_mem(DM1105_I2CSTS)); 271a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if ((status & 0xc0) == 0x40) 272a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 273a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 274a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 275a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (j >= 25) 276a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -1; 277a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 278a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin k += 48; 279a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin len -= 48; 280a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } while (len > 0); 281a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } else { 282a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* write bytes */ 283a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(msgs[i].addr<<1, dm_io_mem(DM1105_I2CDAT)); 284a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (byte = 0; byte < msgs[i].len; byte++) { 285a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin data = msgs[i].buf[byte]; 286a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(data, dm_io_mem(DM1105_I2CDAT + byte + 1)); 287a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 288a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0x81 + msgs[i].len, dm_io_mem(DM1105_I2CCTR)); 289a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (j = 0; j < 25; j++) { 290a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin mdelay(10); 291a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin status = inb(dm_io_mem(DM1105_I2CSTS)); 292a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if ((status & 0xc0) == 0x40) 293a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 294a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 295a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 296a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (j >= 25) 297a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -1; 298a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 299a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 300a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 301a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return num; 302a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin err: 303a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return rc; 304a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 305a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 306a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic u32 functionality(struct i2c_adapter *adap) 307a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 308a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return I2C_FUNC_I2C; 309a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 310a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 311a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct i2c_algorithm dm1105_algo = { 312a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .master_xfer = dm1105_i2c_xfer, 313a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .functionality = functionality, 314a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 315a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 316a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic inline struct dm1105dvb *feed_to_dm1105dvb(struct dvb_demux_feed *feed) 317a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 318a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return container_of(feed->demux, struct dm1105dvb, demux); 319a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 320a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 321a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic inline struct dm1105dvb *frontend_to_dm1105dvb(struct dvb_frontend *fe) 322a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 323a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return container_of(fe->dvb, struct dm1105dvb, dvb_adapter); 324a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 325a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 326a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 327a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 328a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dm1105dvb *dm1105dvb = frontend_to_dm1105dvb(fe); 329519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin u32 lnb_mask, lnb_13v, lnb_18v; 330a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 331519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin switch (dm1105dvb->pdev->subsystem_device) { 332519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin case PCI_DEVICE_ID_DM05: 333519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin lnb_mask = DM05_LNB_MASK; 334519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin lnb_13v = DM05_LNB_13V; 335519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin lnb_18v = DM05_LNB_18V; 336519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin break; 337519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin default: 338519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin lnb_mask = DM1105_LNB_MASK; 339519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin lnb_13v = DM1105_LNB_13V; 340519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin lnb_18v = DM1105_LNB_18V; 341519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin } 342519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin 343519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin outl(lnb_mask, dm_io_mem(DM1105_GPIOCTR)); 344519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin if (voltage == SEC_VOLTAGE_18) 345519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin outl(lnb_18v , dm_io_mem(DM1105_GPIOVAL)); 346519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin else 347519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin outl(lnb_13v, dm_io_mem(DM1105_GPIOVAL)); 348a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 349a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 350a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 351a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 352a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic void dm1105dvb_set_dma_addr(struct dm1105dvb *dm1105dvb) 353a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 354a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outl(cpu_to_le32(dm1105dvb->dma_addr), dm_io_mem(DM1105_STADR)); 355a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 356a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 357a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int __devinit dm1105dvb_dma_map(struct dm1105dvb *dm1105dvb) 358a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 359a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->ts_buf = pci_alloc_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, &dm1105dvb->dma_addr); 360a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 3617b51a70cbf0c9995caf59f7126d251e14a9e0686FUJITA Tomonori return !dm1105dvb->ts_buf; 362a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 363a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 364a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic void dm1105dvb_dma_unmap(struct dm1105dvb *dm1105dvb) 365a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 366a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_free_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, dm1105dvb->ts_buf, dm1105dvb->dma_addr); 367a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 368a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 369df4533af7f45e87a4be470502fa3cea2f6c96da9Igor M. Liplianinstatic void dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb) 370a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 371a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(INTMAK_ALLMASK, dm_io_mem(DM1105_INTMAK)); 372a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(1, dm_io_mem(DM1105_CR)); 373a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 374a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 375a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic void dm1105dvb_disable_irqs(struct dm1105dvb *dm1105dvb) 376a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 377a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(INTMAK_IRM, dm_io_mem(DM1105_INTMAK)); 378a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0, dm_io_mem(DM1105_CR)); 379a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 380a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 381a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int dm1105dvb_start_feed(struct dvb_demux_feed *f) 382a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 383a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dm1105dvb *dm1105dvb = feed_to_dm1105dvb(f); 384a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 385a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (dm1105dvb->full_ts_users++ == 0) 386a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_enable_irqs(dm1105dvb); 387a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 388a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 389a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 390a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 391a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int dm1105dvb_stop_feed(struct dvb_demux_feed *f) 392a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 393a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dm1105dvb *dm1105dvb = feed_to_dm1105dvb(f); 394a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 395a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (--dm1105dvb->full_ts_users == 0) 396a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_disable_irqs(dm1105dvb); 397a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 398a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 399a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 400a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 401b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin/* ir work handler */ 402b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianinstatic void dm1105_emit_key(struct work_struct *work) 403a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 404b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin struct infrared *ir = container_of(work, struct infrared, work); 405a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 ircom = ir->ir_command; 406a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u8 data; 407a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 408d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if (ir_debug) 409d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin printk(KERN_INFO "%s: received byte 0x%04x\n", __func__, ircom); 410d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 411a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin data = (ircom >> 8) & 0x7f; 412a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 413b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin ir_input_keydown(ir->input_dev, &ir->ir, data, data); 414b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin ir_input_nokey(ir->input_dev, &ir->ir); 415a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 416a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 417d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin/* work handler */ 418d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianinstatic void dm1105_dmx_buffer(struct work_struct *work) 419d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin{ 420d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin struct dm1105dvb *dm1105dvb = 421d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin container_of(work, struct dm1105dvb, work); 422d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin unsigned int nbpackets; 423d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin u32 oldwrp = dm1105dvb->wrp; 424d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin u32 nextwrp = dm1105dvb->nextwrp; 425d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 426d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if (!((dm1105dvb->ts_buf[oldwrp] == 0x47) && 427d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin (dm1105dvb->ts_buf[oldwrp + 188] == 0x47) && 428d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin (dm1105dvb->ts_buf[oldwrp + 188 * 2] == 0x47))) { 429d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->PacketErrorCount++; 430d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin /* bad packet found */ 431d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if ((dm1105dvb->PacketErrorCount >= 2) && 432d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin (dm1105dvb->dmarst == 0)) { 433d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin outb(1, dm_io_mem(DM1105_RST)); 434d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->wrp = 0; 435d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->PacketErrorCount = 0; 436d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->dmarst = 0; 437d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return; 438d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin } 439d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin } 440d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 441d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if (nextwrp < oldwrp) { 442d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin memcpy(dm1105dvb->ts_buf + dm1105dvb->buffer_size, 443d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->ts_buf, nextwrp); 444d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin nbpackets = ((dm1105dvb->buffer_size - oldwrp) + nextwrp) / 188; 445d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin } else 446d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin nbpackets = (nextwrp - oldwrp) / 188; 447d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 448d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->wrp = nextwrp; 449d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dvb_dmx_swfilter_packets(&dm1105dvb->demux, 450d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin &dm1105dvb->ts_buf[oldwrp], nbpackets); 451d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin} 452d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 453a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic irqreturn_t dm1105dvb_irq(int irq, void *dev_id) 454a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 455a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dm1105dvb *dm1105dvb = dev_id; 456a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 457a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* Read-Write INSTS Ack's Interrupt for DM1105 chip 16.03.2008 */ 458a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned int intsts = inb(dm_io_mem(DM1105_INTSTS)); 459a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(intsts, dm_io_mem(DM1105_INTSTS)); 460a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 461a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin switch (intsts) { 462a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin case INTSTS_TSIRQ: 463a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin case (INTSTS_TSIRQ | INTSTS_IR): 464d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->nextwrp = inl(dm_io_mem(DM1105_WRP)) - 465d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin inl(dm_io_mem(DM1105_STADR)); 466519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin queue_work(dm1105dvb->wq, &dm1105dvb->work); 467a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 468a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin case INTSTS_IR: 469d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin dm1105dvb->ir.ir_command = inl(dm_io_mem(DM1105_IRCODE)); 470b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin schedule_work(&dm1105dvb->ir.work); 471a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 472a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 473a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 474d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return IRQ_HANDLED; 475a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 476a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 477a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinint __devinit dm1105_ir_init(struct dm1105dvb *dm1105) 478a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 479a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct input_dev *input_dev; 480b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin IR_KEYTAB_TYPE *ir_codes = ir_codes_dm1105_nec; 481b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin int ir_type = IR_TYPE_OTHER; 482b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin int err = -ENOMEM; 483a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 484a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev = input_allocate_device(); 485a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (!input_dev) 486a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -ENOMEM; 487a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 488a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105->ir.input_dev = input_dev; 489a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), 490a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin "pci-%s/ir0", pci_name(dm1105->pdev)); 491a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 492b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin ir_input_init(input_dev, &dm1105->ir.ir, ir_type, ir_codes); 493a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->name = "DVB on-card IR receiver"; 494a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->phys = dm1105->ir.input_phys; 495a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->id.bustype = BUS_PCI; 496b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin input_dev->id.version = 1; 497a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (dm1105->pdev->subsystem_vendor) { 498a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->id.vendor = dm1105->pdev->subsystem_vendor; 499a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->id.product = dm1105->pdev->subsystem_device; 500a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } else { 501a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->id.vendor = dm1105->pdev->vendor; 502a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->id.product = dm1105->pdev->device; 503a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 504b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin 505a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_dev->dev.parent = &dm1105->pdev->dev; 506b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin 507b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin INIT_WORK(&dm1105->ir.work, dm1105_emit_key); 508b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin 509a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin err = input_register_device(input_dev); 510a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (err) { 511a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_free_device(input_dev); 512a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return err; 513a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 514a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 515a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 516a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 517a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 518a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinvoid __devexit dm1105_ir_exit(struct dm1105dvb *dm1105) 519a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 520a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin input_unregister_device(dm1105->ir.input_dev); 521a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 522a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 523a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 524a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int __devinit dm1105dvb_hw_init(struct dm1105dvb *dm1105dvb) 525a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 526a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_disable_irqs(dm1105dvb); 527a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 528a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0, dm_io_mem(DM1105_HOST_CTR)); 529a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 530a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /*DATALEN 188,*/ 531a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(188, dm_io_mem(DM1105_DTALENTH)); 532a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /*TS_STRT TS_VALP MSBFIRST TS_MODE ALPAS TSPES*/ 533a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outw(0xc10a, dm_io_mem(DM1105_TSCTR)); 534a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 535a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* map DMA and set address */ 536a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_dma_map(dm1105dvb); 537a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_set_dma_addr(dm1105dvb); 538a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* big buffer */ 539a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outl(5*DM1105_DMA_BYTES, dm_io_mem(DM1105_RLEN)); 540a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(47, dm_io_mem(DM1105_INTCNT)); 541a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 542a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* IR NEC mode enable */ 543a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb((DM1105_IR_EN | DM1105_SYS_CHK), dm_io_mem(DM1105_IRCTR)); 544a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0, dm_io_mem(DM1105_IRMODE)); 545a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outw(0, dm_io_mem(DM1105_SYSTEMCODE)); 546a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 547a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 548a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 549a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 550a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic void dm1105dvb_hw_exit(struct dm1105dvb *dm1105dvb) 551a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 552a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_disable_irqs(dm1105dvb); 553a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 554a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* IR disable */ 555a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(0, dm_io_mem(DM1105_IRCTR)); 556a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin outb(INTMAK_NONEMASK, dm_io_mem(DM1105_INTMAK)); 557a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 558a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_dma_unmap(dm1105dvb); 559a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 560e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin 561d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianinstatic struct stv0299_config sharp_z0194a_config = { 562d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .demod_address = 0x68, 563d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .inittab = sharp_z0194a_inittab, 564d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .mclk = 88000000UL, 565d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .invert = 1, 566d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .skip_reinit = 0, 567d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .lock_output = STV0299_LOCKOUTPUT_1, 568d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .volt13_op0_op1 = STV0299_VOLT13_OP1, 569d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .min_delay_ms = 100, 570d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .set_symbol_rate = sharp_z0194a_set_symbol_rate, 571d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin}; 572d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin 573a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct stv0288_config earda_config = { 574a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .demod_address = 0x68, 575a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .min_delay_ms = 100, 576a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 577a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 578a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct si21xx_config serit_config = { 579a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .demod_address = 0x68, 580a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .min_delay_ms = 100, 581a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 582a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 583a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 584a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct cx24116_config serit_sp2633_config = { 585a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .demod_address = 0x55, 586a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 587a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 588a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int __devinit frontend_init(struct dm1105dvb *dm1105dvb) 589a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 590a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin int ret; 591a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 592a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin switch (dm1105dvb->pdev->subsystem_device) { 593519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin case PCI_DEVICE_ID_DW2004: 594a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->fe = dvb_attach( 595519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin cx24116_attach, &serit_sp2633_config, 596a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin &dm1105dvb->i2c_adap); 597519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin if (dm1105dvb->fe) 598519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb->fe->ops.set_voltage = dm1105dvb_set_voltage; 599a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 600519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin break; 601519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin default: 602519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb->fe = dvb_attach( 603519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin stv0299_attach, &sharp_z0194a_config, 604519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin &dm1105dvb->i2c_adap); 605a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (dm1105dvb->fe) { 606a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->fe->ops.set_voltage = 607a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_set_voltage; 608a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_attach(dvb_pll_attach, dm1105dvb->fe, 0x60, 609a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin &dm1105dvb->i2c_adap, DVB_PLL_OPERA1); 610519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin break; 611a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 612e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin 613519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb->fe = dvb_attach( 614519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin stv0288_attach, &earda_config, 615519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin &dm1105dvb->i2c_adap); 616519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin if (dm1105dvb->fe) { 617519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb->fe->ops.set_voltage = 618519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb_set_voltage; 619519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dvb_attach(stb6000_attach, dm1105dvb->fe, 0x61, 620519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin &dm1105dvb->i2c_adap); 621519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin break; 622a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 623e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin 624a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->fe = dvb_attach( 625519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin si21xx_attach, &serit_config, 626a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin &dm1105dvb->i2c_adap); 627a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (dm1105dvb->fe) 628519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb->fe->ops.set_voltage = 629519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb_set_voltage; 630519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin 631a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 632a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 633a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (!dm1105dvb->fe) { 634a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dev_err(&dm1105dvb->pdev->dev, "could not attach frontend\n"); 635a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -ENODEV; 636a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 637a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 638a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dvb_register_frontend(&dm1105dvb->dvb_adapter, dm1105dvb->fe); 639a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) { 640a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (dm1105dvb->fe->ops.release) 641a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->fe->ops.release(dm1105dvb->fe); 642a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->fe = NULL; 643a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return ret; 644a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 645a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 646a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 647a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 648a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 649a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic void __devinit dm1105dvb_read_mac(struct dm1105dvb *dm1105dvb, u8 *mac) 650a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 651a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin static u8 command[1] = { 0x28 }; 652a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 653a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct i2c_msg msg[] = { 654519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin { 655519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .addr = IIC_24C01_addr >> 1, 656519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .flags = 0, 657519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .buf = command, 658519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .len = 1 659519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin }, { 660519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .addr = IIC_24C01_addr >> 1, 661519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .flags = I2C_M_RD, 662519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .buf = mac, 663519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .len = 6 664519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin }, 665a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin }; 666a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 667a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105_i2c_xfer(&dm1105dvb->i2c_adap, msg , 2); 6687c510e4b730a92cecf94ada45c989d8be0200d47Johannes Berg dev_info(&dm1105dvb->pdev->dev, "MAC %pM\n", mac); 669a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 670a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 671a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int __devinit dm1105_probe(struct pci_dev *pdev, 672a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin const struct pci_device_id *ent) 673a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 674a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dm1105dvb *dm1105dvb; 675a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_adapter *dvb_adapter; 676a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_demux *dvbdemux; 677a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_demux *dmx; 678a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin int ret = -ENOMEM; 679a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 680a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb = kzalloc(sizeof(struct dm1105dvb), GFP_KERNEL); 681a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (!dm1105dvb) 682d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return -ENOMEM; 683a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 684a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->pdev = pdev; 685a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->buffer_size = 5 * DM1105_DMA_BYTES; 686a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->PacketErrorCount = 0; 687a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->dmarst = 0; 688a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 689a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = pci_enable_device(pdev); 690a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 691a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_kfree; 692a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 693284901a90a9e0b812ca3f5f852cbbfb60d10249dYang Hongyang ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 694a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 695a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_pci_disable_device; 696a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 697a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_set_master(pdev); 698a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 699a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = pci_request_regions(pdev, DRIVER_NAME); 700a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 701a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_pci_disable_device; 702a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 703a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->io_mem = pci_iomap(pdev, 0, pci_resource_len(pdev, 0)); 704a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (!dm1105dvb->io_mem) { 705a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = -EIO; 706a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_pci_release_regions; 707a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 708a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 709a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin spin_lock_init(&dm1105dvb->lock); 710a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_set_drvdata(pdev, dm1105dvb); 711a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 712a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dm1105dvb_hw_init(dm1105dvb); 713a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 714d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin goto err_pci_iounmap; 715a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 716a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* i2c */ 717a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin i2c_set_adapdata(&dm1105dvb->i2c_adap, dm1105dvb); 718a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin strcpy(dm1105dvb->i2c_adap.name, DRIVER_NAME); 719a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->i2c_adap.owner = THIS_MODULE; 720a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->i2c_adap.class = I2C_CLASS_TV_DIGITAL; 721a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->i2c_adap.dev.parent = &pdev->dev; 722a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->i2c_adap.algo = &dm1105_algo; 723a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->i2c_adap.algo_data = dm1105dvb; 724a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = i2c_add_adapter(&dm1105dvb->i2c_adap); 725a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 726a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 727a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_dm1105dvb_hw_exit; 728a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 729a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* dvb */ 730a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dvb_register_adapter(&dm1105dvb->dvb_adapter, DRIVER_NAME, 731a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin THIS_MODULE, &pdev->dev, adapter_nr); 732a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 733a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_i2c_del_adapter; 734a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 735a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_adapter = &dm1105dvb->dvb_adapter; 736a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 737a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_read_mac(dm1105dvb, dvb_adapter->proposed_mac); 738a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 739a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux = &dm1105dvb->demux; 740a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->filternum = 256; 741a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->feednum = 256; 742a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->start_feed = dm1105dvb_start_feed; 743a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->stop_feed = dm1105dvb_stop_feed; 744a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | 745a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING); 746a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dvb_dmx_init(dvbdemux); 747a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 748a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_dvb_unregister_adapter; 749a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 750a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx = &dvbdemux->dmx; 751a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->dmxdev.filternum = 256; 752a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->dmxdev.demux = dmx; 753a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->dmxdev.capabilities = 0; 754a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 755a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dvb_dmxdev_init(&dm1105dvb->dmxdev, dvb_adapter); 756a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 757a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_dvb_dmx_release; 758a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 759a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->hw_frontend.source = DMX_FRONTEND_0; 760a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 761a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dmx->add_frontend(dmx, &dm1105dvb->hw_frontend); 762a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 763a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_dvb_dmxdev_release; 764a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 765a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb->mem_frontend.source = DMX_MEMORY_FE; 766a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 767a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dmx->add_frontend(dmx, &dm1105dvb->mem_frontend); 768a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 769a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_remove_hw_frontend; 770a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 771a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dmx->connect_frontend(dmx, &dm1105dvb->hw_frontend); 772a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 773a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_remove_mem_frontend; 774a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 775a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = frontend_init(dm1105dvb); 776a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 777a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_disconnect_frontend; 778a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 779a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_net_init(dvb_adapter, &dm1105dvb->dvbnet, dmx); 780a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105_ir_init(dm1105dvb); 781d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 782d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin INIT_WORK(&dm1105dvb->work, dm1105_dmx_buffer); 783519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin sprintf(dm1105dvb->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num); 784519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dm1105dvb->wq = create_singlethread_workqueue(dm1105dvb->wqn); 785519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin if (!dm1105dvb->wq) 786519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin goto err_dvb_net; 787d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 788d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin ret = request_irq(pdev->irq, dm1105dvb_irq, IRQF_SHARED, 789d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin DRIVER_NAME, dm1105dvb); 790d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if (ret < 0) 791519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin goto err_workqueue; 792d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 793d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return 0; 794a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 795519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianinerr_workqueue: 796519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin destroy_workqueue(dm1105dvb->wq); 797519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianinerr_dvb_net: 798519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin dvb_net_release(&dm1105dvb->dvbnet); 799a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_disconnect_frontend: 800a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->disconnect_frontend(dmx); 801a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_remove_mem_frontend: 802a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->remove_frontend(dmx, &dm1105dvb->mem_frontend); 803a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_remove_hw_frontend: 804a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->remove_frontend(dmx, &dm1105dvb->hw_frontend); 805a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_dvb_dmxdev_release: 806a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_dmxdev_release(&dm1105dvb->dmxdev); 807a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_dvb_dmx_release: 808a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_dmx_release(dvbdemux); 809a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_dvb_unregister_adapter: 810a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_unregister_adapter(dvb_adapter); 811a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_i2c_del_adapter: 812a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin i2c_del_adapter(&dm1105dvb->i2c_adap); 813a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_dm1105dvb_hw_exit: 814a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_hw_exit(dm1105dvb); 815a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_pci_iounmap: 816a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_iounmap(pdev, dm1105dvb->io_mem); 817a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_pci_release_regions: 818a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_release_regions(pdev); 819a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_pci_disable_device: 820a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_disable_device(pdev); 821a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_kfree: 822a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_set_drvdata(pdev, NULL); 823a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin kfree(dm1105dvb); 824d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return ret; 825a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 826a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 827a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic void __devexit dm1105_remove(struct pci_dev *pdev) 828a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 829a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dm1105dvb *dm1105dvb = pci_get_drvdata(pdev); 830a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_adapter *dvb_adapter = &dm1105dvb->dvb_adapter; 831a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_demux *dvbdemux = &dm1105dvb->demux; 832a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_demux *dmx = &dvbdemux->dmx; 833a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 834a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105_ir_exit(dm1105dvb); 835a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->close(dmx); 836a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_net_release(&dm1105dvb->dvbnet); 837a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (dm1105dvb->fe) 838a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_unregister_frontend(dm1105dvb->fe); 839a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 840a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->disconnect_frontend(dmx); 841a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->remove_frontend(dmx, &dm1105dvb->mem_frontend); 842a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->remove_frontend(dmx, &dm1105dvb->hw_frontend); 843a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_dmxdev_release(&dm1105dvb->dmxdev); 844a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_dmx_release(dvbdemux); 845a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_unregister_adapter(dvb_adapter); 846a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (&dm1105dvb->i2c_adap) 847a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin i2c_del_adapter(&dm1105dvb->i2c_adap); 848a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 849a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dm1105dvb_hw_exit(dm1105dvb); 850a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin synchronize_irq(pdev->irq); 851a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin free_irq(pdev->irq, dm1105dvb); 852a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_iounmap(pdev, dm1105dvb->io_mem); 853a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_release_regions(pdev); 854a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_disable_device(pdev); 855a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_set_drvdata(pdev, NULL); 856a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin kfree(dm1105dvb); 857a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 858a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 859a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct pci_device_id dm1105_id_table[] __devinitdata = { 860a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin { 861a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .vendor = PCI_VENDOR_ID_TRIGEM, 862a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .device = PCI_DEVICE_ID_DM1105, 863a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .subvendor = PCI_ANY_ID, 864a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .subdevice = PCI_DEVICE_ID_DW2002, 865a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin }, { 866a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .vendor = PCI_VENDOR_ID_TRIGEM, 867a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .device = PCI_DEVICE_ID_DM1105, 868a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .subvendor = PCI_ANY_ID, 869a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .subdevice = PCI_DEVICE_ID_DW2004, 870a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin }, { 871519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .vendor = PCI_VENDOR_ID_AXESS, 872519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .device = PCI_DEVICE_ID_DM05, 873519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .subvendor = PCI_VENDOR_ID_AXESS, 874519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .subdevice = PCI_DEVICE_ID_DM05, 875519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin }, { 876a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* empty */ 877a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin }, 878a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 879a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 880a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_DEVICE_TABLE(pci, dm1105_id_table); 881a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 882a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct pci_driver dm1105_driver = { 883a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .name = DRIVER_NAME, 884a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .id_table = dm1105_id_table, 885a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .probe = dm1105_probe, 886a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .remove = __devexit_p(dm1105_remove), 887a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 888a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 889a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int __init dm1105_init(void) 890a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 891a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return pci_register_driver(&dm1105_driver); 892a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 893a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 894a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic void __exit dm1105_exit(void) 895a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 896a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_unregister_driver(&dm1105_driver); 897a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 898a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 899a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinmodule_init(dm1105_init); 900a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinmodule_exit(dm1105_exit); 901a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 902a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_AUTHOR("Igor M. Liplianin <liplianin@me.by>"); 903a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_DESCRIPTION("SDMC DM1105 DVB driver"); 904a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_LICENSE("GPL"); 905