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> 230017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#include <linux/i2c-algo-bit.h> 24a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/init.h> 25a6b7a407865aab9f849dd99a71072b7cd1175116Alexey Dobriyan#include <linux/interrupt.h> 26a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/kernel.h> 27a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/module.h> 28a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/proc_fs.h> 29a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/pci.h> 30a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include <linux/dma-mapping.h> 315a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 326bda96447cef24fbf97a798b1ea664224d5fdc25Mauro Carvalho Chehab#include <media/rc-core.h> 33a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 34a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "demux.h" 35a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dmxdev.h" 36a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb_demux.h" 37a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb_frontend.h" 38a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb_net.h" 39a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvbdev.h" 40a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "dvb-pll.h" 41a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 42a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "stv0299.h" 43e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin#include "stv0288.h" 44e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin#include "stb6000.h" 4504ad28c9916da709f38b1d43817892142c2c3508Igor M. Liplianin#include "si21xx.h" 4635d9c42779ef5e8cb46902bb6987443e136c0517Igor M. Liplianin#include "cx24116.h" 47a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#include "z0194a.h" 4873f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov#include "ts2020.h" 49b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin#include "ds3000.h" 50a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 51727e625cc2c114e449a78f851b0c12edac897a83Mauro Carvalho Chehab#define MODULE_NAME "dm1105" 52727e625cc2c114e449a78f851b0c12edac897a83Mauro Carvalho Chehab 53d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin#define UNSET (-1U) 54d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 550017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_BOARD_NOAUTO UNSET 560017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_BOARD_UNKNOWN 0 570017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_BOARD_DVBWORLD_2002 1 580017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_BOARD_DVBWORLD_2004 2 590017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_BOARD_AXESS_DM05 3 600017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_BOARD_UNBRANDED_I2C_ON_GPIO 4 61d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 62a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* ----------------------------------------------- */ 63a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* 64a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin * PCI ID's 65a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin */ 66a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_VENDOR_ID_TRIGEM 67a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_VENDOR_ID_TRIGEM 0x109f 68a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 69519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#ifndef PCI_VENDOR_ID_AXESS 70519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#define PCI_VENDOR_ID_AXESS 0x195d 71519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#endif 72a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_DEVICE_ID_DM1105 73a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_DEVICE_ID_DM1105 0x036f 74a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 75a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_DEVICE_ID_DW2002 76a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_DEVICE_ID_DW2002 0x2002 77a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 78a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#ifndef PCI_DEVICE_ID_DW2004 79a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define PCI_DEVICE_ID_DW2004 0x2004 80a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#endif 81519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#ifndef PCI_DEVICE_ID_DM05 82519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#define PCI_DEVICE_ID_DM05 0x1105 83519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin#endif 84a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* ----------------------------------------------- */ 85a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* sdmc dm1105 registers */ 86a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 87a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* TS Control */ 88a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_TSCTR 0x00 89a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DTALENTH 0x04 90a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 91a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* GPIO Interface */ 92a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_GPIOVAL 0x08 93a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_GPIOCTR 0x0c 94a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 95a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* PID serial number */ 96a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_PIDN 0x10 97a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 98a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Odd-even secret key select */ 99a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_CWSEL 0x14 100a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 101a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Host Command Interface */ 102a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_HOST_CTR 0x18 103a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_HOST_AD 0x1c 104a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 105a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* PCI Interface */ 106a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_CR 0x30 107a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_RST 0x34 108a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_STADR 0x38 109a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_RLEN 0x3c 110a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_WRP 0x40 111a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_INTCNT 0x44 112a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_INTMAK 0x48 113a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_INTSTS 0x4c 114a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 115a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* CW Value */ 116a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_ODD 0x50 117a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_EVEN 0x58 118a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 119a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* PID Value */ 120a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_PID 0x60 121a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 122a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* IR Control */ 123a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IRCTR 0x64 124a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IRMODE 0x68 125a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_SYSTEMCODE 0x6c 126a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IRCODE 0x70 127a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 128a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Unknown Values */ 129a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_ENCRYPT 0x74 130a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_VER 0x7c 131a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 132a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* I2C Interface */ 133a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2CCTR 0x80 134a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2CSTS 0x81 135a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2CDAT 0x82 136a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_I2C_RA 0x83 137a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* ----------------------------------------------- */ 138a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Interrupt Mask Bits */ 139a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 140a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_TSIRQM 0x01 141a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_HIRQM 0x04 142a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_IRM 0x08 143a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_ALLMASK (INTMAK_TSIRQM | \ 144a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin INTMAK_HIRQM | \ 145a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin INTMAK_IRM) 146a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTMAK_NONEMASK 0x00 147a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 148a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Interrupt Status Bits */ 149a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTSTS_TSIRQ 0x01 150a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTSTS_HIRQ 0x04 151a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define INTSTS_IR 0x08 152a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 153a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* IR Control Bits */ 154a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_IR_EN 0x01 155a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_SYS_CHK 0x02 156a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_REP_FLG 0x08 157a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 158a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* EEPROM addr */ 159a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define IIC_24C01_addr 0xa0 160a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* Max board count */ 161a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_MAX 0x04 162a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 163a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DRIVER_NAME "dm1105" 1640017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_I2C_GPIO_NAME "dm1105-gpio" 165a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 166a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DMA_PACKETS 47 167a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DMA_PACKET_LENGTH (128*4) 168a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin#define DM1105_DMA_BYTES (128 * 4 * DM1105_DMA_PACKETS) 169a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1700017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin/* */ 1710017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define GPIO08 (1 << 8) 1720017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define GPIO13 (1 << 13) 1730017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define GPIO14 (1 << 14) 1740017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define GPIO15 (1 << 15) 1750017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define GPIO16 (1 << 16) 1760017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define GPIO17 (1 << 17) 1770017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define GPIO_ALL 0x03ffff 1780017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 179a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* GPIO's for LNB power control */ 1800017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_LNB_MASK (GPIO_ALL & ~(GPIO14 | GPIO13)) 1810017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_LNB_OFF GPIO17 1820017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_LNB_13V (GPIO16 | GPIO08) 1830017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM1105_LNB_18V GPIO08 184a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 185519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin/* GPIO's for LNB power control for Axess DM05 */ 1860017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM05_LNB_MASK (GPIO_ALL & ~(GPIO14 | GPIO13)) 1870017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM05_LNB_OFF GPIO17/* actually 13v */ 1880017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM05_LNB_13V GPIO17 1890017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define DM05_LNB_18V (GPIO17 | GPIO16) 1900017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 1910017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin/* GPIO's for LNB power control for unbranded with I2C on GPIO */ 1920017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define UNBR_LNB_MASK (GPIO17 | GPIO16) 1930017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define UNBR_LNB_OFF 0 1940017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define UNBR_LNB_13V GPIO17 1950017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin#define UNBR_LNB_18V (GPIO17 | GPIO16) 196519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin 197d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinstatic unsigned int card[] = {[0 ... 3] = UNSET }; 198d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinmodule_param_array(card, int, NULL, 0444); 199d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. LiplianinMODULE_PARM_DESC(card, "card type"); 200d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 201a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int ir_debug; 202a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinmodule_param(ir_debug, int, 0644); 203a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding"); 204a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 205d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinstatic unsigned int dm1105_devcount; 206d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 207a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinDVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 208a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 209d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinstruct dm1105_board { 2100017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin char *name; 2110017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin struct { 2120017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin u32 mask, off, v13, v18; 2130017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin } lnb; 2140017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin u32 gpio_scl, gpio_sda; 215d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin}; 216d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 217d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinstruct dm1105_subid { 218d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin u16 subvendor; 219d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin u16 subdevice; 220d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin u32 card; 221d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin}; 222d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 223d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinstatic const struct dm1105_board dm1105_boards[] = { 224d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin [DM1105_BOARD_UNKNOWN] = { 225d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .name = "UNKNOWN/GENERIC", 2260017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .lnb = { 2270017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .mask = DM1105_LNB_MASK, 2280017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .off = DM1105_LNB_OFF, 2290017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v13 = DM1105_LNB_13V, 2300017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v18 = DM1105_LNB_18V, 2310017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin }, 232d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, 233d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin [DM1105_BOARD_DVBWORLD_2002] = { 234d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .name = "DVBWorld PCI 2002", 2350017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .lnb = { 2360017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .mask = DM1105_LNB_MASK, 2370017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .off = DM1105_LNB_OFF, 2380017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v13 = DM1105_LNB_13V, 2390017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v18 = DM1105_LNB_18V, 2400017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin }, 241d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, 242d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin [DM1105_BOARD_DVBWORLD_2004] = { 243d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .name = "DVBWorld PCI 2004", 2440017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .lnb = { 2450017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .mask = DM1105_LNB_MASK, 2460017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .off = DM1105_LNB_OFF, 2470017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v13 = DM1105_LNB_13V, 2480017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v18 = DM1105_LNB_18V, 2490017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin }, 250d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, 251d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin [DM1105_BOARD_AXESS_DM05] = { 252d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .name = "Axess/EasyTv DM05", 2530017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .lnb = { 2540017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .mask = DM05_LNB_MASK, 2550017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .off = DM05_LNB_OFF, 2560017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v13 = DM05_LNB_13V, 2570017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v18 = DM05_LNB_18V, 2580017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin }, 2590017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin }, 2600017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin [DM1105_BOARD_UNBRANDED_I2C_ON_GPIO] = { 2610017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .name = "Unbranded DM1105 with i2c on GPIOs", 2620017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .lnb = { 2630017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .mask = UNBR_LNB_MASK, 2640017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .off = UNBR_LNB_OFF, 2650017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v13 = UNBR_LNB_13V, 2660017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .v18 = UNBR_LNB_18V, 2670017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin }, 2680017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .gpio_scl = GPIO14, 2690017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin .gpio_sda = GPIO13, 270d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, 271d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin}; 272d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 273d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinstatic const struct dm1105_subid dm1105_subids[] = { 274d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin { 275d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subvendor = 0x0000, 276d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subdevice = 0x2002, 277d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .card = DM1105_BOARD_DVBWORLD_2002, 278d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, { 279d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subvendor = 0x0001, 280d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subdevice = 0x2002, 281d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .card = DM1105_BOARD_DVBWORLD_2002, 282d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, { 283d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subvendor = 0x0000, 284d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subdevice = 0x2004, 285d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .card = DM1105_BOARD_DVBWORLD_2004, 286d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, { 287d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subvendor = 0x0001, 288d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subdevice = 0x2004, 289d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .card = DM1105_BOARD_DVBWORLD_2004, 290d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, { 291d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subvendor = 0x195d, 292d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subdevice = 0x1105, 293d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .card = DM1105_BOARD_AXESS_DM05, 294d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin }, 295d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin}; 296d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 297d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianinstatic void dm1105_card_list(struct pci_dev *pci) 298d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin{ 299d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin int i; 300d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 301d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin if (0 == pci->subsystem_vendor && 302d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 0 == pci->subsystem_device) { 303d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin printk(KERN_ERR 304d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: Your board has no valid PCI Subsystem ID\n" 305d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: and thus can't be autodetected\n" 306d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: Please pass card=<n> insmod option to\n" 307d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: workaround that. Redirect complaints to\n" 308d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: the vendor of the TV card. Best regards,\n" 309d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: -- tux\n"); 310d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin } else { 311d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin printk(KERN_ERR 312d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: Your board isn't known (yet) to the driver.\n" 313d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: You can try to pick one of the existing\n" 314d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: card configs via card=<n> insmod option.\n" 315d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: Updating to the latest version might help\n" 316d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "dm1105: as well.\n"); 317d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin } 318d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin printk(KERN_ERR "Here is a list of valid choices for the card=<n> " 319d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin "insmod option:\n"); 320d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin for (i = 0; i < ARRAY_SIZE(dm1105_boards); i++) 321d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin printk(KERN_ERR "dm1105: card=%d -> %s\n", 322d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin i, dm1105_boards[i].name); 323d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin} 324d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 325a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin/* infrared remote control */ 326a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstruct infrared { 327d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman struct rc_dev *dev; 328a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin char input_phys[32]; 329b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin struct work_struct work; 330a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 ir_command; 331a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 332a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 33334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstruct dm1105_dev { 334a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* pci */ 335a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct pci_dev *pdev; 336a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u8 __iomem *io_mem; 337a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 338a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* ir */ 339a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct infrared ir; 340a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 341a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* dvb */ 342a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_frontend hw_frontend; 343a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_frontend mem_frontend; 344a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmxdev dmxdev; 345a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_adapter dvb_adapter; 346a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_demux demux; 347a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_frontend *fe; 348a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_net dvbnet; 349a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned int full_ts_users; 350d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin unsigned int boardnr; 351d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin int nr; 352a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 353a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* i2c */ 354a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct i2c_adapter i2c_adap; 3550017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin struct i2c_adapter i2c_bb_adap; 3560017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin struct i2c_algo_bit_data i2c_bit; 357a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 358d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin /* irq */ 359d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin struct work_struct work; 360519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin struct workqueue_struct *wq; 361519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin char wqn[16]; 362d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 363a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* dma */ 364a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dma_addr_t dma_addr; 365a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned char *ts_buf; 366a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 wrp; 367d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin u32 nextwrp; 368a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 buffer_size; 369a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned int PacketErrorCount; 370a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin unsigned int dmarst; 371a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin spinlock_t lock; 372a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 373a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 37434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin#define dm_io_mem(reg) ((unsigned long)(&dev->io_mem[reg])) 375a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 3765eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_readb(reg) inb(dm_io_mem(reg)) 3775eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_writeb(reg, value) outb((value), (dm_io_mem(reg))) 3785eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin 3795eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_readw(reg) inw(dm_io_mem(reg)) 3805eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_writew(reg, value) outw((value), (dm_io_mem(reg))) 3815eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin 3825eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_readl(reg) inl(dm_io_mem(reg)) 3835eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_writel(reg, value) outl((value), (dm_io_mem(reg))) 3845eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin 3855eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_andorl(reg, mask, value) \ 3865eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin outl((inl(dm_io_mem(reg)) & ~(mask)) |\ 3875eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin ((value) & (mask)), (dm_io_mem(reg))) 3885eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin 3895eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_setl(reg, bit) dm_andorl((reg), (bit), (bit)) 3905eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin#define dm_clearl(reg, bit) dm_andorl((reg), (bit), 0) 3915eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin 3920017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin/* The chip has 18 GPIOs. In HOST mode GPIO's used as 15 bit address lines, 3930017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin so we can use only 3 GPIO's from GPIO15 to GPIO17. 3940017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin Here I don't check whether HOST is enebled as it is not implemented yet. 3950017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin */ 3960017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic void dm1105_gpio_set(struct dm1105_dev *dev, u32 mask) 3970017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 3980017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0xfffc0000) 3990017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); 4000017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4010017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0x0003ffff) 4020017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm_setl(DM1105_GPIOVAL, mask & 0x0003ffff); 4030017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4040017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4050017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4060017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic void dm1105_gpio_clear(struct dm1105_dev *dev, u32 mask) 4070017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4080017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0xfffc0000) 4090017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); 4100017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4110017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0x0003ffff) 4120017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm_clearl(DM1105_GPIOVAL, mask & 0x0003ffff); 4130017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4140017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4150017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4160017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic void dm1105_gpio_andor(struct dm1105_dev *dev, u32 mask, u32 val) 4170017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4180017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0xfffc0000) 4190017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); 4200017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4210017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0x0003ffff) 4220017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm_andorl(DM1105_GPIOVAL, mask & 0x0003ffff, val); 4230017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4240017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4250017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4260017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic u32 dm1105_gpio_get(struct dm1105_dev *dev, u32 mask) 4270017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4280017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0xfffc0000) 4290017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); 4300017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4310017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0x0003ffff) 4320017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin return dm_readl(DM1105_GPIOVAL) & mask & 0x0003ffff; 4330017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4340017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin return 0; 4350017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4360017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4370017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic void dm1105_gpio_enable(struct dm1105_dev *dev, u32 mask, int asoutput) 4380017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4390017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (mask & 0xfffc0000) 4400017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__); 4410017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4420017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if ((mask & 0x0003ffff) && asoutput) 4430017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm_clearl(DM1105_GPIOCTR, mask & 0x0003ffff); 4440017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin else if ((mask & 0x0003ffff) && !asoutput) 4450017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm_setl(DM1105_GPIOCTR, mask & 0x0003ffff); 4460017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4470017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4480017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4490017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic void dm1105_setline(struct dm1105_dev *dev, u32 line, int state) 4500017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4510017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (state) 4520017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_enable(dev, line, 0); 4530017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin else { 4540017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_enable(dev, line, 1); 4550017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_clear(dev, line); 4560017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin } 4570017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4580017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4590017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic void dm1105_setsda(void *data, int state) 4600017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4610017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin struct dm1105_dev *dev = data; 4620017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4630017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_setline(dev, dm1105_boards[dev->boardnr].gpio_sda, state); 4640017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4650017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4660017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic void dm1105_setscl(void *data, int state) 4670017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4680017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin struct dm1105_dev *dev = data; 4690017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4700017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_setline(dev, dm1105_boards[dev->boardnr].gpio_scl, state); 4710017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4720017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4730017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic int dm1105_getsda(void *data) 4740017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4750017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin struct dm1105_dev *dev = data; 4760017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4770017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin return dm1105_gpio_get(dev, dm1105_boards[dev->boardnr].gpio_sda) 4780017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin ? 1 : 0; 4790017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4800017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4810017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinstatic int dm1105_getscl(void *data) 4820017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin{ 4830017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin struct dm1105_dev *dev = data; 4840017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 4850017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin return dm1105_gpio_get(dev, dm1105_boards[dev->boardnr].gpio_scl) 4860017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin ? 1 : 0; 4870017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin} 4880017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 489a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap, 490a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct i2c_msg *msgs, int num) 491a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 49234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev ; 493a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 494a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin int addr, rc, i, j, k, len, byte, data; 495a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u8 status; 496a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 49734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev = i2c_adap->algo_data; 498a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (i = 0; i < num; i++) { 4995eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CCTR, 0x00); 500a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (msgs[i].flags & I2C_M_RD) { 501a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* read bytes */ 502a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin addr = msgs[i].addr << 1; 503a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin addr |= 1; 5045eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CDAT, addr); 505a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (byte = 0; byte < msgs[i].len; byte++) 5065eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CDAT + byte + 1, 0); 507a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 5085eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CCTR, 0x81 + msgs[i].len); 509a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (j = 0; j < 55; j++) { 510a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin mdelay(10); 5115eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin status = dm_readb(DM1105_I2CSTS); 512a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if ((status & 0xc0) == 0x40) 513a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 514a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 515a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (j >= 55) 516a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -1; 517a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 518a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (byte = 0; byte < msgs[i].len; byte++) { 5195eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin rc = dm_readb(DM1105_I2CDAT + byte + 1); 520a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (rc < 0) 521a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err; 522a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin msgs[i].buf[byte] = rc; 523a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 524ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin } else if ((msgs[i].buf[0] == 0xf7) && (msgs[i].addr == 0x55)) { 525ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin /* prepaired for cx24116 firmware */ 526ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin /* Write in small blocks */ 527ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin len = msgs[i].len - 1; 528ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin k = 1; 529ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin do { 5305eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CDAT, msgs[i].addr << 1); 5315eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CDAT + 1, 0xf7); 532ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin for (byte = 0; byte < (len > 48 ? 48 : len); byte++) { 533ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin data = msgs[i].buf[k + byte]; 5345eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CDAT + byte + 2, data); 535a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 5365eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CCTR, 0x82 + (len > 48 ? 48 : len)); 537a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin for (j = 0; j < 25; j++) { 538a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin mdelay(10); 5395eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin status = dm_readb(DM1105_I2CSTS); 540a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if ((status & 0xc0) == 0x40) 541a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 542a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 543a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 544a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (j >= 25) 545a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -1; 546ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin 547ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin k += 48; 548ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin len -= 48; 549ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin } while (len > 0); 550ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin } else { 551ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin /* write bytes */ 5525eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CDAT, msgs[i].addr << 1); 553ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin for (byte = 0; byte < msgs[i].len; byte++) { 554ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin data = msgs[i].buf[byte]; 5555eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CDAT + byte + 1, data); 556ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin } 5575eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_I2CCTR, 0x81 + msgs[i].len); 558ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin for (j = 0; j < 25; j++) { 559ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin mdelay(10); 5605eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin status = dm_readb(DM1105_I2CSTS); 561ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin if ((status & 0xc0) == 0x40) 562ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin break; 563a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 564ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin 565ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin if (j >= 25) 566ed7c847aef137a5e1f5de0eac0ad2c03e183839dIgor M. Liplianin return -1; 567a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 568a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 569a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return num; 570a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin err: 571a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return rc; 572a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 573a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 574a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic u32 functionality(struct i2c_adapter *adap) 575a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 576a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return I2C_FUNC_I2C; 577a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 578a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 579a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct i2c_algorithm dm1105_algo = { 580a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .master_xfer = dm1105_i2c_xfer, 581a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .functionality = functionality, 582a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 583a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 58434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic inline struct dm1105_dev *feed_to_dm1105_dev(struct dvb_demux_feed *feed) 585a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 58634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin return container_of(feed->demux, struct dm1105_dev, demux); 587a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 588a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 58934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic inline struct dm1105_dev *frontend_to_dm1105_dev(struct dvb_frontend *fe) 590a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 59134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin return container_of(fe->dvb, struct dm1105_dev, dvb_adapter); 592a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 593a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 59434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic int dm1105_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 595a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 59634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev = frontend_to_dm1105_dev(fe); 597a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 5980017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_enable(dev, dm1105_boards[dev->boardnr].lnb.mask, 1); 599519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin if (voltage == SEC_VOLTAGE_18) 6000017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_andor(dev, 6010017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_boards[dev->boardnr].lnb.mask, 6020017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_boards[dev->boardnr].lnb.v18); 603d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin else if (voltage == SEC_VOLTAGE_13) 6040017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_andor(dev, 6050017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_boards[dev->boardnr].lnb.mask, 6060017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_boards[dev->boardnr].lnb.v13); 607d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin else 6080017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_andor(dev, 6090017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_boards[dev->boardnr].lnb.mask, 6100017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_boards[dev->boardnr].lnb.off); 611a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 612a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 613a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 614a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 61534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic void dm1105_set_dma_addr(struct dm1105_dev *dev) 616a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 617888bd5dcb68437273ffc3752c4976f851205b25dHans Verkuil dm_writel(DM1105_STADR, (__force u32)cpu_to_le32(dev->dma_addr)); 618a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 619a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 6204c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic int dm1105_dma_map(struct dm1105_dev *dev) 621a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 62234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->ts_buf = pci_alloc_consistent(dev->pdev, 62334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin 6 * DM1105_DMA_BYTES, 62434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->dma_addr); 625a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 62634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin return !dev->ts_buf; 627a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 628a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 62934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic void dm1105_dma_unmap(struct dm1105_dev *dev) 630a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 63134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin pci_free_consistent(dev->pdev, 63234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin 6 * DM1105_DMA_BYTES, 63334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->ts_buf, 63434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->dma_addr); 635a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 636a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 63734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic void dm1105_enable_irqs(struct dm1105_dev *dev) 638a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 6395eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_INTMAK, INTMAK_ALLMASK); 6405eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_CR, 1); 641a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 642a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 64334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic void dm1105_disable_irqs(struct dm1105_dev *dev) 644a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 6455eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_INTMAK, INTMAK_IRM); 6465eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_CR, 0); 647a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 648a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 64934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic int dm1105_start_feed(struct dvb_demux_feed *f) 650a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 65134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev = feed_to_dm1105_dev(f); 652a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 65334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (dev->full_ts_users++ == 0) 65434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_enable_irqs(dev); 655a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 656a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 657a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 658a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 65934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic int dm1105_stop_feed(struct dvb_demux_feed *f) 660a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 66134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev = feed_to_dm1105_dev(f); 662a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 66334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (--dev->full_ts_users == 0) 66434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_disable_irqs(dev); 665a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 666a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 667a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 668a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 669b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin/* ir work handler */ 670b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianinstatic void dm1105_emit_key(struct work_struct *work) 671a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 672b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin struct infrared *ir = container_of(work, struct infrared, work); 673a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u32 ircom = ir->ir_command; 674a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin u8 data; 675a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 676d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if (ir_debug) 677d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin printk(KERN_INFO "%s: received byte 0x%04x\n", __func__, ircom); 678d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 679a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin data = (ircom >> 8) & 0x7f; 680a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 681120703f9eb32033f0e39bdc552c0273c8ab45f33David Härdeman /* FIXME: UNKNOWN because we don't generate a full NEC scancode (yet?) */ 682120703f9eb32033f0e39bdc552c0273c8ab45f33David Härdeman rc_keydown(ir->dev, RC_TYPE_UNKNOWN, data, 0); 683a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 684a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 685d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin/* work handler */ 686d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianinstatic void dm1105_dmx_buffer(struct work_struct *work) 687d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin{ 68834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev = container_of(work, struct dm1105_dev, work); 689d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin unsigned int nbpackets; 69034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin u32 oldwrp = dev->wrp; 69134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin u32 nextwrp = dev->nextwrp; 692d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 69334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (!((dev->ts_buf[oldwrp] == 0x47) && 69434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin (dev->ts_buf[oldwrp + 188] == 0x47) && 69534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin (dev->ts_buf[oldwrp + 188 * 2] == 0x47))) { 69634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->PacketErrorCount++; 697d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin /* bad packet found */ 69834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if ((dev->PacketErrorCount >= 2) && 69934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin (dev->dmarst == 0)) { 7005eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_RST, 1); 70134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->wrp = 0; 70234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->PacketErrorCount = 0; 70334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->dmarst = 0; 704d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return; 705d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin } 706d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin } 707d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 708d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if (nextwrp < oldwrp) { 70934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin memcpy(dev->ts_buf + dev->buffer_size, dev->ts_buf, nextwrp); 71034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin nbpackets = ((dev->buffer_size - oldwrp) + nextwrp) / 188; 711d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin } else 712d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin nbpackets = (nextwrp - oldwrp) / 188; 713d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 71434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->wrp = nextwrp; 71534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_dmx_swfilter_packets(&dev->demux, &dev->ts_buf[oldwrp], nbpackets); 716d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin} 717d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 71834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic irqreturn_t dm1105_irq(int irq, void *dev_id) 719a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 72034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev = dev_id; 721a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 722a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* Read-Write INSTS Ack's Interrupt for DM1105 chip 16.03.2008 */ 7235eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin unsigned int intsts = dm_readb(DM1105_INTSTS); 7245eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_INTSTS, intsts); 725a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 726a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin switch (intsts) { 727a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin case INTSTS_TSIRQ: 728a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin case (INTSTS_TSIRQ | INTSTS_IR): 7295eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dev->nextwrp = dm_readl(DM1105_WRP) - dm_readl(DM1105_STADR); 73034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin queue_work(dev->wq, &dev->work); 731a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 732a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin case INTSTS_IR: 7335eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dev->ir.ir_command = dm_readl(DM1105_IRCODE); 73434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin schedule_work(&dev->ir.work); 735a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin break; 736a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 737a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 738d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return IRQ_HANDLED; 739a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 740a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 7414c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic int dm1105_ir_init(struct dm1105_dev *dm1105) 742a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 743d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman struct rc_dev *dev; 744b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin int err = -ENOMEM; 745a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 746d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev = rc_allocate_device(); 747d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman if (!dev) 748a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -ENOMEM; 749a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 750a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin snprintf(dm1105->ir.input_phys, sizeof(dm1105->ir.input_phys), 751a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin "pci-%s/ir0", pci_name(dm1105->pdev)); 752a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 753d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->driver_name = MODULE_NAME; 754d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->map_name = RC_MAP_DM1105_NEC; 755d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->driver_type = RC_DRIVER_SCANCODE; 756d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_name = "DVB on-card IR receiver"; 757d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_phys = dm1105->ir.input_phys; 758d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_id.bustype = BUS_PCI; 759d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_id.version = 1; 760a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (dm1105->pdev->subsystem_vendor) { 761d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_id.vendor = dm1105->pdev->subsystem_vendor; 762d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_id.product = dm1105->pdev->subsystem_device; 763a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } else { 764d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_id.vendor = dm1105->pdev->vendor; 765d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->input_id.product = dm1105->pdev->device; 766a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 767d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dev->dev.parent = &dm1105->pdev->dev; 768b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin 769b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin INIT_WORK(&dm1105->ir.work, dm1105_emit_key); 770b72857dd457b96de653b19b3c40394dac6285819Igor M. Liplianin 771d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman err = rc_register_device(dev); 77215100d891a53ffc717cec21d805f8c49db51fb65David Härdeman if (err < 0) { 773d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman rc_free_device(dev); 77415100d891a53ffc717cec21d805f8c49db51fb65David Härdeman return err; 77515100d891a53ffc717cec21d805f8c49db51fb65David Härdeman } 776a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 777d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman dm1105->ir.dev = dev; 77815100d891a53ffc717cec21d805f8c49db51fb65David Härdeman return 0; 779a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 780a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 7814c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic void dm1105_ir_exit(struct dm1105_dev *dm1105) 782a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 783d8b4b5822f51e2142b731b42c81e3f03eec475b2David Härdeman rc_unregister_device(dm1105->ir.dev); 784a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 785a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 7864c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic int dm1105_hw_init(struct dm1105_dev *dev) 787a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 78834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_disable_irqs(dev); 789a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 7905eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_HOST_CTR, 0); 791a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 792a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /*DATALEN 188,*/ 7935eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_DTALENTH, 188); 794a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /*TS_STRT TS_VALP MSBFIRST TS_MODE ALPAS TSPES*/ 7955eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writew(DM1105_TSCTR, 0xc10a); 796a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 797a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* map DMA and set address */ 79834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_dma_map(dev); 79934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_set_dma_addr(dev); 800a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* big buffer */ 8015eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writel(DM1105_RLEN, 5 * DM1105_DMA_BYTES); 8025eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_INTCNT, 47); 803a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 804a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* IR NEC mode enable */ 8055eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_IRCTR, (DM1105_IR_EN | DM1105_SYS_CHK)); 8065eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_IRMODE, 0); 8075eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writew(DM1105_SYSTEMCODE, 0); 808a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 809a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 810a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 811a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 81234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinstatic void dm1105_hw_exit(struct dm1105_dev *dev) 813a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 81434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_disable_irqs(dev); 815a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 816a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* IR disable */ 8175eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_IRCTR, 0); 8185eb3291fe84b30a8e2fda31fd5fa44c40575f283Igor M. Liplianin dm_writeb(DM1105_INTMAK, INTMAK_NONEMASK); 819a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 82034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_dma_unmap(dev); 821a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 822e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin 823d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianinstatic struct stv0299_config sharp_z0194a_config = { 824d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .demod_address = 0x68, 825d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .inittab = sharp_z0194a_inittab, 826d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .mclk = 88000000UL, 827d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .invert = 1, 828d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .skip_reinit = 0, 829d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .lock_output = STV0299_LOCKOUTPUT_1, 830d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .volt13_op0_op1 = STV0299_VOLT13_OP1, 831d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .min_delay_ms = 100, 832d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin .set_symbol_rate = sharp_z0194a_set_symbol_rate, 833d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin}; 834d4305c68cc30b66a71ea05297e6c0663feccad65Igor M. Liplianin 835a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct stv0288_config earda_config = { 836a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .demod_address = 0x68, 837a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .min_delay_ms = 100, 838a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 839a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 840a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct si21xx_config serit_config = { 841a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .demod_address = 0x68, 842a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .min_delay_ms = 100, 843a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 844a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 845a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 846a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct cx24116_config serit_sp2633_config = { 847a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .demod_address = 0x55, 848a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 849a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 850b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianinstatic struct ds3000_config dvbworld_ds3000_config = { 851b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin .demod_address = 0x68, 852b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin}; 853b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin 85473f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrovstatic struct ts2020_config dvbworld_ts2020_config = { 85573f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov .tuner_address = 0x60, 856b858c331cdf402853be2c48c8f4f77173ef04da8Igor M. Liplianin .clk_out_div = 1, 85773f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov}; 85873f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov 8594c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic int frontend_init(struct dm1105_dev *dev) 860a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 861a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin int ret; 862a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 86334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin switch (dev->boardnr) { 8640017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin case DM1105_BOARD_UNBRANDED_I2C_ON_GPIO: 8650017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_enable(dev, GPIO15, 1); 8660017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_clear(dev, GPIO15); 8670017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin msleep(100); 8680017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_gpio_set(dev, GPIO15); 8690017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin msleep(200); 8700017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->fe = dvb_attach( 8710017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin stv0299_attach, &sharp_z0194a_config, 8720017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin &dev->i2c_bb_adap); 8730017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (dev->fe) { 8740017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 8750017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dvb_attach(dvb_pll_attach, dev->fe, 0x60, 8760017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin &dev->i2c_bb_adap, DVB_PLL_OPERA1); 8770017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin break; 8780017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin } 8790017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 8800017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->fe = dvb_attach( 8810017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin stv0288_attach, &earda_config, 8820017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin &dev->i2c_bb_adap); 8830017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (dev->fe) { 8840017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 8850017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dvb_attach(stb6000_attach, dev->fe, 0x61, 8860017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin &dev->i2c_bb_adap); 8870017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin break; 8880017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin } 8890017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 8900017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->fe = dvb_attach( 8910017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin si21xx_attach, &serit_config, 8920017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin &dev->i2c_bb_adap); 8930017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (dev->fe) 8940017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 8950017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin break; 896d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin case DM1105_BOARD_DVBWORLD_2004: 89734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe = dvb_attach( 898519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin cx24116_attach, &serit_sp2633_config, 89934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->i2c_adap); 90034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (dev->fe) { 90134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 902b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin break; 903b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin } 904b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin 90534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe = dvb_attach( 906b4a0e816fbe2af815674c514588b6cb444ec5fd9Igor M. Liplianin ds3000_attach, &dvbworld_ds3000_config, 90734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->i2c_adap); 90873f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov if (dev->fe) { 90973f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov dvb_attach(ts2020_attach, dev->fe, 91073f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov &dvbworld_ts2020_config, &dev->i2c_adap); 91134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 91273f0af44a9137cc2ab18e181f68f59d2ad3fe3f7Konstantin Dimitrov } 913a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 914519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin break; 915d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin case DM1105_BOARD_DVBWORLD_2002: 916d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin case DM1105_BOARD_AXESS_DM05: 917519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin default: 91834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe = dvb_attach( 919519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin stv0299_attach, &sharp_z0194a_config, 92034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->i2c_adap); 92134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (dev->fe) { 92234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 92334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_attach(dvb_pll_attach, dev->fe, 0x60, 92434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->i2c_adap, DVB_PLL_OPERA1); 925519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin break; 926a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 927e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin 92834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe = dvb_attach( 929519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin stv0288_attach, &earda_config, 93034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->i2c_adap); 93134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (dev->fe) { 93234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 93334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_attach(stb6000_attach, dev->fe, 0x61, 93434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->i2c_adap); 935519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin break; 936a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 937e4aab64cb78a42e45e1d387f272712e06cf89a66Igor M. Liplianin 93834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe = dvb_attach( 939519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin si21xx_attach, &serit_config, 94034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin &dev->i2c_adap); 94134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (dev->fe) 94234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe->ops.set_voltage = dm1105_set_voltage; 943519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin 944a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 945a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 94634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (!dev->fe) { 94734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev_err(&dev->pdev->dev, "could not attach frontend\n"); 948a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return -ENODEV; 949a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 950a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 95134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = dvb_register_frontend(&dev->dvb_adapter, dev->fe); 952a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) { 95334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (dev->fe->ops.release) 95434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe->ops.release(dev->fe); 95534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->fe = NULL; 956a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return ret; 957a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 958a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 959a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin return 0; 960a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 961a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 9624c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic void dm1105_read_mac(struct dm1105_dev *dev, u8 *mac) 963a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 964a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin static u8 command[1] = { 0x28 }; 965a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 966a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct i2c_msg msg[] = { 967519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin { 968519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .addr = IIC_24C01_addr >> 1, 969519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .flags = 0, 970519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .buf = command, 971519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .len = 1 972519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin }, { 973519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .addr = IIC_24C01_addr >> 1, 974519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .flags = I2C_M_RD, 975519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .buf = mac, 976519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .len = 6 977519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin }, 978a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin }; 979a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 98034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_i2c_xfer(&dev->i2c_adap, msg , 2); 98134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev_info(&dev->pdev->dev, "MAC %pM\n", mac); 982a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 983a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 9844c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic int dm1105_probe(struct pci_dev *pdev, 985a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin const struct pci_device_id *ent) 986a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 98734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev; 988a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_adapter *dvb_adapter; 989a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dvb_demux *dvbdemux; 990a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_demux *dmx; 991a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin int ret = -ENOMEM; 992d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin int i; 993a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 99434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev = kzalloc(sizeof(struct dm1105_dev), GFP_KERNEL); 99534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (!dev) 996d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return -ENOMEM; 997a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 998d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin /* board config */ 99934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->nr = dm1105_devcount; 100034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->boardnr = UNSET; 100134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (card[dev->nr] < ARRAY_SIZE(dm1105_boards)) 100234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->boardnr = card[dev->nr]; 100334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin for (i = 0; UNSET == dev->boardnr && 1004d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin i < ARRAY_SIZE(dm1105_subids); i++) 1005d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin if (pdev->subsystem_vendor == 1006d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin dm1105_subids[i].subvendor && 1007d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin pdev->subsystem_device == 1008d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin dm1105_subids[i].subdevice) 100934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->boardnr = dm1105_subids[i].card; 1010d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 101134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (UNSET == dev->boardnr) { 101234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->boardnr = DM1105_BOARD_UNKNOWN; 1013d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin dm1105_card_list(pdev); 1014d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin } 1015d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin 1016d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin dm1105_devcount++; 101734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->pdev = pdev; 101834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->buffer_size = 5 * DM1105_DMA_BYTES; 101934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->PacketErrorCount = 0; 102034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->dmarst = 0; 1021a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1022a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = pci_enable_device(pdev); 1023a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1024a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_kfree; 1025a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1026284901a90a9e0b812ca3f5f852cbbfb60d10249dYang Hongyang ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)); 1027a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1028a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_pci_disable_device; 1029a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1030a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_set_master(pdev); 1031a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1032a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = pci_request_regions(pdev, DRIVER_NAME); 1033a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1034a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_pci_disable_device; 1035a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 103634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->io_mem = pci_iomap(pdev, 0, pci_resource_len(pdev, 0)); 103734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (!dev->io_mem) { 1038a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = -EIO; 1039a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_pci_release_regions; 1040a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin } 1041a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 104234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin spin_lock_init(&dev->lock); 104334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin pci_set_drvdata(pdev, dev); 1044a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 104534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = dm1105_hw_init(dev); 1046a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1047d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin goto err_pci_iounmap; 1048a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1049a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* i2c */ 105034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin i2c_set_adapdata(&dev->i2c_adap, dev); 105134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin strcpy(dev->i2c_adap.name, DRIVER_NAME); 105234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->i2c_adap.owner = THIS_MODULE; 105334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->i2c_adap.dev.parent = &pdev->dev; 105434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->i2c_adap.algo = &dm1105_algo; 105534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->i2c_adap.algo_data = dev; 105634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = i2c_add_adapter(&dev->i2c_adap); 1057a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1058a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 105934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin goto err_dm1105_hw_exit; 1060a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 10610017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin i2c_set_adapdata(&dev->i2c_bb_adap, dev); 10620017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin strcpy(dev->i2c_bb_adap.name, DM1105_I2C_GPIO_NAME); 10630017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bb_adap.owner = THIS_MODULE; 10640017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bb_adap.dev.parent = &pdev->dev; 10650017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bb_adap.algo_data = &dev->i2c_bit; 10660017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bit.data = dev; 10670017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bit.setsda = dm1105_setsda; 10680017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bit.setscl = dm1105_setscl; 10690017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bit.getsda = dm1105_getsda; 10700017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bit.getscl = dm1105_getscl; 10710017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bit.udelay = 10; 10720017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dev->i2c_bit.timeout = 10; 10730017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 10740017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin /* Raise SCL and SDA */ 10750017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_setsda(dev, 1); 10760017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin dm1105_setscl(dev, 1); 10770017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 10780017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin ret = i2c_bit_add_bus(&dev->i2c_bb_adap); 10790017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin if (ret < 0) 10800017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin goto err_i2c_del_adapter; 10810017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin 1082a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* dvb */ 108334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = dvb_register_adapter(&dev->dvb_adapter, DRIVER_NAME, 1084a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin THIS_MODULE, &pdev->dev, adapter_nr); 1085a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 10860017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin goto err_i2c_del_adapters; 1087a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 108834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_adapter = &dev->dvb_adapter; 1089a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 109034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_read_mac(dev, dvb_adapter->proposed_mac); 1091a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 109234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvbdemux = &dev->demux; 1093a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->filternum = 256; 1094a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->feednum = 256; 109534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvbdemux->start_feed = dm1105_start_feed; 109634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvbdemux->stop_feed = dm1105_stop_feed; 1097a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | 1098a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin DMX_SECTION_FILTERING | DMX_MEMORY_BASED_FILTERING); 1099a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin ret = dvb_dmx_init(dvbdemux); 1100a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1101a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_dvb_unregister_adapter; 1102a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1103a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx = &dvbdemux->dmx; 110434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->dmxdev.filternum = 256; 110534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->dmxdev.demux = dmx; 110634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->dmxdev.capabilities = 0; 1107a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 110834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = dvb_dmxdev_init(&dev->dmxdev, dvb_adapter); 1109a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1110a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_dvb_dmx_release; 1111a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 111234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->hw_frontend.source = DMX_FRONTEND_0; 1113a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 111434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = dmx->add_frontend(dmx, &dev->hw_frontend); 1115a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1116a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_dvb_dmxdev_release; 1117a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 111834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->mem_frontend.source = DMX_MEMORY_FE; 1119a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 112034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = dmx->add_frontend(dmx, &dev->mem_frontend); 1121a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1122a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_remove_hw_frontend; 1123a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 112434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = dmx->connect_frontend(dmx, &dev->hw_frontend); 1125a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1126a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin goto err_remove_mem_frontend; 1127a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 11285584c641be9e4ff812443511363a72edaa5ceeaaJonathan Nieder ret = dvb_net_init(dvb_adapter, &dev->dvbnet, dmx); 11295584c641be9e4ff812443511363a72edaa5ceeaaJonathan Nieder if (ret < 0) 11305584c641be9e4ff812443511363a72edaa5ceeaaJonathan Nieder goto err_disconnect_frontend; 11315584c641be9e4ff812443511363a72edaa5ceeaaJonathan Nieder 113234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = frontend_init(dev); 1133a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin if (ret < 0) 1134e99663417f626c9bfdc8117b35670a0292b820e6Jonathan Nieder goto err_dvb_net; 1135a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 113634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_ir_init(dev); 1137d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 113834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin INIT_WORK(&dev->work, dm1105_dmx_buffer); 113934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin sprintf(dev->wqn, "%s/%d", dvb_adapter->name, dvb_adapter->num); 114034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dev->wq = create_singlethread_workqueue(dev->wqn); 114195d0812624cf9ce769fd74b64fd40ba10809c5b2Peter Senna Tschudin if (!dev->wq) { 114295d0812624cf9ce769fd74b64fd40ba10809c5b2Peter Senna Tschudin ret = -ENOMEM; 1143519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin goto err_dvb_net; 114495d0812624cf9ce769fd74b64fd40ba10809c5b2Peter Senna Tschudin } 1145d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 114634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin ret = request_irq(pdev->irq, dm1105_irq, IRQF_SHARED, 114734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin DRIVER_NAME, dev); 1148d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin if (ret < 0) 1149519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin goto err_workqueue; 1150d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin 1151d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return 0; 1152a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1153519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianinerr_workqueue: 115434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin destroy_workqueue(dev->wq); 1155519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianinerr_dvb_net: 115634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_net_release(&dev->dvbnet); 1157a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_disconnect_frontend: 1158a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->disconnect_frontend(dmx); 1159a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_remove_mem_frontend: 116034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dmx->remove_frontend(dmx, &dev->mem_frontend); 1161a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_remove_hw_frontend: 116234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dmx->remove_frontend(dmx, &dev->hw_frontend); 1163a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_dvb_dmxdev_release: 116434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_dmxdev_release(&dev->dmxdev); 1165a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_dvb_dmx_release: 1166a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_dmx_release(dvbdemux); 1167a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_dvb_unregister_adapter: 1168a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_unregister_adapter(dvb_adapter); 11690017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianinerr_i2c_del_adapters: 11700017505de0d2888f57a9f84e8eb3963b3cd28bafIgor M. Liplianin i2c_del_adapter(&dev->i2c_bb_adap); 1171a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_i2c_del_adapter: 117234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin i2c_del_adapter(&dev->i2c_adap); 117334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianinerr_dm1105_hw_exit: 117434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_hw_exit(dev); 1175a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_pci_iounmap: 117634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin pci_iounmap(pdev, dev->io_mem); 1177a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_pci_release_regions: 1178a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_release_regions(pdev); 1179a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_pci_disable_device: 1180a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_disable_device(pdev); 1181a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinerr_kfree: 118234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin kfree(dev); 1183d1498ffc474b18574ed2d5e4d9a33fd21eaaf3cfIgor M. Liplianin return ret; 1184a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 1185a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 11864c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic void dm1105_remove(struct pci_dev *pdev) 1187a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin{ 118834d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dm1105_dev *dev = pci_get_drvdata(pdev); 118934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dvb_adapter *dvb_adapter = &dev->dvb_adapter; 119034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin struct dvb_demux *dvbdemux = &dev->demux; 1191a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin struct dmx_demux *dmx = &dvbdemux->dmx; 1192a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 119334d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_ir_exit(dev); 1194a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->close(dmx); 119534d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_net_release(&dev->dvbnet); 119634d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin if (dev->fe) 119734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_unregister_frontend(dev->fe); 1198a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1199a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dmx->disconnect_frontend(dmx); 120034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dmx->remove_frontend(dmx, &dev->mem_frontend); 120134d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dmx->remove_frontend(dmx, &dev->hw_frontend); 120234d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dvb_dmxdev_release(&dev->dmxdev); 1203a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_dmx_release(dvbdemux); 1204a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin dvb_unregister_adapter(dvb_adapter); 12050e48a3e8f616026195416e5d61c6cf24f686c2d8Alexandru Juncu i2c_del_adapter(&dev->i2c_adap); 1206a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 120734d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin dm1105_hw_exit(dev); 1208a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin synchronize_irq(pdev->irq); 120934d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin free_irq(pdev->irq, dev); 121034d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin pci_iounmap(pdev, dev->io_mem); 1211a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_release_regions(pdev); 1212a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin pci_disable_device(pdev); 1213d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin dm1105_devcount--; 121434d2f9bf189c36ef8642cf6b64e80dfb756d888fIgor M. Liplianin kfree(dev); 1215a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin} 1216a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 12174c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartmanstatic struct pci_device_id dm1105_id_table[] = { 1218a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin { 1219a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .vendor = PCI_VENDOR_ID_TRIGEM, 1220a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .device = PCI_DEVICE_ID_DM1105, 1221a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .subvendor = PCI_ANY_ID, 1222d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subdevice = PCI_ANY_ID, 1223a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin }, { 1224519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .vendor = PCI_VENDOR_ID_AXESS, 1225519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin .device = PCI_DEVICE_ID_DM05, 1226d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subvendor = PCI_ANY_ID, 1227d8300df9fb76552ba81bf57d79c3ad3309eda13dIgor M. Liplianin .subdevice = PCI_ANY_ID, 1228519a4bdcf8221c6b2d129b3c720761b7cab7f2c1Igor M. Liplianin }, { 1229a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin /* empty */ 1230a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin }, 1231a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 1232a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1233a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_DEVICE_TABLE(pci, dm1105_id_table); 1234a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1235a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianinstatic struct pci_driver dm1105_driver = { 1236a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .name = DRIVER_NAME, 1237a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .id_table = dm1105_id_table, 1238a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin .probe = dm1105_probe, 12394c62e9764ab403d42f9b8871b1241fe7812f19d4Greg Kroah-Hartman .remove = dm1105_remove, 1240a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin}; 1241a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1242548006ce97e6e6cf63e162d9042ccb78edbd2959Libo Chenmodule_pci_driver(dm1105_driver); 1243a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. Liplianin 1244a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_AUTHOR("Igor M. Liplianin <liplianin@me.by>"); 1245a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_DESCRIPTION("SDMC DM1105 DVB driver"); 1246a611d0ca006fe76d88b8dd5ac44f4468293b6760Igor M. LiplianinMODULE_LICENSE("GPL"); 1247