[kernel] r15824 - in dists/sid/linux-2.6/debian: . config patches/features/all/mantis patches/series

Ben Hutchings benh at alioth.debian.org
Thu Jun 3 01:02:38 UTC 2010


Author: benh
Date: Thu Jun  3 01:02:13 2010
New Revision: 15824

Log:
Add mantis DVB driver and mb86a16 and tda665x DVB front-ends,
backported by Bjørn Mork (Closes: #577264)

Added:
   dists/sid/linux-2.6/debian/patches/features/all/mantis/
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0001-V4L-DVB-13699-Mantis-MB86A16-Initial-checkin-Mantis-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0002-V4L-DVB-13700-MB86A16-Need-a-bit-of-settling-time.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0003-V4L-DVB-13701-MB86A16-Reduce-Carrier-Recovery-range-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0004-V4L-DVB-13702-MB86A16-need-to-wait-a-bit-more-than-t.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0005-V4L-DVB-13703-MB86A16-Fix-wrong-message-printed-out.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0006-V4L-DVB-13704-MB86A16-FIX-Don-t-loop-again-if-we-hav.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0007-V4L-DVB-13705-Mantis-FIX-Do-not-return-IRQ_HANDLED-i.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0008-V4L-DVB-13706-MB86A16-Overhaul.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0009-V4L-DVB-13707-Mantis-Whitespace-cleanup.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0010-V4L-DVB-13708-Mantis-Remove-some-dead-code.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0011-V4L-DVB-13709-Mantis-VP-1034-Switch-13-18v-for-the-V.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0012-V4L-DVB-13710-Mantis-FIX-Use-swfilter-188-204-accord.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0013-V4L-DVB-13711-Mantis-FIX-Do-nor-toggle-GPIF-status.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0014-V4L-DVB-13712-Mantis-Add-locking-for-concurrent-acce.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0015-V4L-DVB-13713-MB86A16-Fix-Initialize-SNR-STATUS.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0016-V4L-DVB-13714-MB86A16-FIX-Code-simplification-use-hw.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0017-V4L-DVB-13715-Mantis-Kernel-I2C-changes-use-PCI-pare.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0018-V4L-DVB-13716-Mantis-Bug-incorrect-byte-swap.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0019-V4L-DVB-13717-MB86A16-Statistics-Updates.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0020-V4L-DVB-13718-Mantis-Use-gpio_set_bits-to-turn-OFF-t.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0021-V4L-DVB-13719-Mantis-VP-2033-Initial-test-switch-to-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0022-V4L-DVB-13720-Mantis-Terratec-Cinergy-C-Add-support-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0023-V4L-DVB-13721-Mantis-Bug-Before-bailing-out-Unlock.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0024-V4L-DVB-13722-Mantis-Revert-13560.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0025-V4L-DVB-13723-Mantis-VP-2040-Terratec-Cinergy-C-Add-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0026-V4L-DVB-13724-Mantis-VP-1041-Initial-support-for-Man.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0027-V4L-DVB-13725-Mantis-VP-1041-Revert-to-old-register-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0028-V4L-DVB-13726-Mantis-Skystar-HD2-Add-support-for-the.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0029-V4L-DVB-13727-Mantis-VP-1041-Bugfix-Sigh-Don-t-look-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0030-V4L-DVB-13728-Mantis-Add-in-some-Host-Interface-defi.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0031-V4L-DVB-13729-Mantis-Add-in-a-license-header.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0032-V4L-DVB-13730-Mantis-Add-in-some-UART-definitions.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0033-V4L-DVB-13731-Mantis-Add-in-a-license-header.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0034-V4L-DVB-13732-Mantis-Add-in-some-Link-Layer-definiti.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0035-V4L-DVB-13733-Mantis-Start-with-the-PCMCIA-interface.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0036-V4L-DVB-13734-Mantis-Initial-go-at-an-Event-Manager.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0037-V4L-DVB-13735-Mantis-Implement-the-Event-Manager-tas.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0038-V4L-DVB-13736-Mantis-Implement-CAM-Plug-IN-and-Unplu.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0039-V4L-DVB-13737-Mantis-Register-the-CA-device-dummy-fu.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0040-V4L-DVB-13738-Mantis-Enable-IRQ0-events.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0041-V4L-DVB-13739-Mantis-Event-Manager-Handle-Masked-eve.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0042-V4L-DVB-13740-Mantis-Schedule-the-work-instead-of-ha.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0043-V4L-DVB-13741-Mantis-Implement-HIF-Mem-Read-Write-op.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0044-V4L-DVB-13742-Mantis-Implement-PCMCIA-I-O-Rd-Wr-oper.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0045-V4L-DVB-13743-Mantis-CA-Use-DVB_CA-Tuple-parser.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0046-V4L-DVB-13744-Mantis-CA-Use-Module-status-to-signal-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0047-V4L-DVB-13745-Mantis-CA-Add-some-debug-statements.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0048-V4L-DVB-13746-Mantis-CA-Bug-Remove-duplicated-symbol.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0049-V4L-DVB-13747-Mantis-Bug-Fix-Use-Register-Address-ra.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0050-V4L-DVB-13748-Mantis-VP-2040-Add-support-for-VP-2040.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0051-V4L-DVB-13749-Mantis-CA-CA_SLAVE-Do-not-change-Slave.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0052-V4L-DVB-13750-Mantis-GPIO_CONTROL-Cache-a-given-GPIO.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0053-V4L-DVB-13751-Mantis-GPIO_CONTROL-Do-not-toggle-GPIO.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0054-V4L-DVB-13752-Mantis-CA-CAM_CONTROL-All-CAM-control-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0055-V4L-DVB-13753-Mantis-CA-SLOT_CONTROL-Implement-Slot-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0056-V4L-DVB-13754-Mantis-CAM_CONTROL-Implement-TS-contro.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0057-V4L-DVB-13755-Mantis-CA-CAM_CONTROL-Use-appropriate-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0058-V4L-DVB-13756-Mantis-CA-CAM_CONTROL-Use-CAMCHANGE_IR.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0059-V4L-DVB-13757-Mantis-CA-CAM_CONTROL-Use-FRDA_IRQ-Eve.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0060-V4L-DVB-13758-Mantis-CA-CAM_CONTROL-Use-CAMREADY_IRQ.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0061-V4L-DVB-13759-Mantis-HIF-I-O-Use-the-LSB-octet-only.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0062-V4L-DVB-13760-Mantis-CA-CA_MODULE-Look-for-module-st.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0063-V4L-DVB-13761-Mantis-HIF-I-O-Temporary-workaround-us.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0064-V4L-DVB-13762-Mantis-CA-CA_MODULE-Look-for-the-modul.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0065-V4L-DVB-13763-Mantis-HIF-I-O-trim-delays-a-bit-appro.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0066-V4L-DVB-13764-Mantis-CA-SLOT-Add-some-debug-status.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0067-V4L-DVB-13765-Mantis-HIF-I-O-Add-some-debug-statemen.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0068-V4L-DVB-13766-Mantis-Bug-Fix-wrong-exit-condition.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0069-V4L-DVB-13767-Mantis-VP-1041-Bug-Add-in-missing-Mast.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0070-V4L-DVB-13768-Mantis-Enable-WRACK.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0071-V4L-DVB-13769-Mantis-Smart-Buffer-Burst-Read-Ready-c.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0072-V4L-DVB-13770-Mantis-Bug-Do-not-trigger-FR-DA-IRQ-fr.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0073-V4L-DVB-13771-Mantis-Reset-Flags-at-the-earliest-pos.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0074-V4L-DVB-13772-Mantis-Do-not-enable-Common-Memory-Acc.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0075-V4L-DVB-13773-Mantis-Enable-all-interrupts.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0076-V4L-DVB-13774-Mantis-Remove-redundant-wait-for-Burst.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0077-V4L-DVB-13775-Mantis-Remove-unnecessary-job-queues.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0078-V4L-DVB-13776-Mantis-Use-a-simple-timeout-instead-in.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0079-V4L-DVB-13777-Mantis-Use-a-Write-wait-queue-for-Writ.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0080-V4L-DVB-13778-Mantis-Wr-ACK-is-already-handled-in-th.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0081-V4L-DVB-13779-Mantis-Missing-wakeup-for-write-queue.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0082-V4L-DVB-13780-Mantis-HIF-I-O-Enable-Interrupts-for-R.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0083-V4L-DVB-13781-Mantis-CA-Bug-Fix-wrong-usage-of-HIFRD.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0084-V4L-DVB-13782-Mantis-Temporarily-disable-FRDA-irq.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0085-V4L-DVB-13783-Mantis-Technisat-Cablestar-HD2-Add-sup.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0086-V4L-DVB-13784-Mantis-Use-PCI-API-instead-of-hardcode.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0087-V4L-DVB-13785-Mantis-Do-not-disable-IRQ-s-while-bein.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0088-V4L-DVB-13786-Mantis-Bug-HIF-bits-already-shifted.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0089-V4L-DVB-13787-Mantis-Fix-build.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0090-V4L-DVB-13788-Mantis-CA-use-a-lock-for-the-relevant-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0091-V4L-DVB-13789-Mantis-CA-Initialize-the-mutex.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0092-V4L-DVB-13790-Mantis-Relocate-queue-initialization.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0093-V4L-DVB-13792-Mantis-VP-2033-Do-not-claim-TDA10023.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0094-V4L-DVB-13794-Mantis-VP-3028-Initial-go-at-Serial-in.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0095-V4L-DVB-13795-Mantis-Hopper-Code-overhaul-add-Hopper.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0096-V4L-DVB-13796-Mantis-Add-missing-file-in-previous-co.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0097-V4L-DVB-13797-Mantis-Hopper-TDA665x-Large-overhaul.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0098-V4L-DVB-13798-Mantis-Enable-power-for-all-cards-use-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0099-V4L-DVB-13799-Mantis-Unregister-frontend.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0100-V4L-DVB-13800-Mantis-I2C-optimization.-Required-dela.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0101-V4L-DVB-13801-MB86A16-Use-the-search-callback.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0102-V4L-DVB-13802-Mantis-Hopper-Fix-all-build-related-wa.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0103-V4L-DVB-13803-Remove-unused-dependency-on-CU1216.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0104-V4L-DVB-13804-Remove-unused-I2C-Adapter-ID.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0105-V4L-DVB-13805-Fix-Unregister-the-frontend-before-det.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0106-V4L-DVB-13806-Register-and-Initialize-Remote-control.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0107-V4L-DVB-13807-Fix-Free-device-in-the-device-registra.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0108-V4L-DVB-13809-Fix-Checkpatch-violations.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0109-V4L-DVB-13810-MB86A16-Use-DVB_-macros.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0110-V4L-DVB-13811-MB86A16-Update-Copyright-header.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0111-V4L-DVB-13812-Mantis-Hopper-Update-Copyright-header.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0112-V4L-DVB-13808b-mantis-replace-DMA_nnBIT_MASK-to-DMA_.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0113-V4L-DVB-13824a-mantis-Fix-__devexit-bad-annotations.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0114-V4L-DVB-13851-Fix-Input-dependency-for-Mantis.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0115-V4L-DVB-Mantis-remove-duplicated-include.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0116-V4L-DVB-dvb-fix-sparse-warnings.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0117-V4L-DVB-Fix-bad-whitespacing.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0118-V4L-DVB-13791-TDA10021-Do-not-claim-TDA10023.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0119-Mantis-hopper-use-MODULE_DEVICE_TABLE-use-the-macro-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0120-V4L-DVB-13808-Mantis-Hopper-Build-update-for-Mantis-.patch
   dists/sid/linux-2.6/debian/patches/features/all/mantis/0121-V4L-DVB-mantis-Select-correct-frontends.patch
Modified:
   dists/sid/linux-2.6/debian/changelog
   dists/sid/linux-2.6/debian/config/config
   dists/sid/linux-2.6/debian/patches/series/16

Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog	Wed Jun  2 09:10:51 2010	(r15823)
+++ dists/sid/linux-2.6/debian/changelog	Thu Jun  3 01:02:13 2010	(r15824)
@@ -6,6 +6,8 @@
 
   [ Ben Hutchings ]
   * Add stable 2.6.32.15
+  * Add mantis DVB driver and mb86a16 and tda665x DVB front-ends,
+    backported by Bjørn Mork (Closes: #577264)
 
   [ Aurelien Jarno ]
   * [sh4] fix sh_tmu clocksource following recent nohz changes.

Modified: dists/sid/linux-2.6/debian/config/config
==============================================================================
--- dists/sid/linux-2.6/debian/config/config	Wed Jun  2 09:10:51 2010	(r15823)
+++ dists/sid/linux-2.6/debian/config/config	Thu Jun  3 01:02:13 2010	(r15824)
@@ -862,6 +862,13 @@
 CONFIG_DVB_DUMMY_FE=m
 
 ##
+## file: drivers/media/dvb/mantis/Kconfig
+##
+CONFIG_MANTIS_CORE=m
+CONFIG_DVB_MANTIS=m
+CONFIG_DVB_HOPPER=m
+
+##
 ## file: drivers/media/dvb/pluto2/Kconfig
 ##
 CONFIG_DVB_PLUTO2=m

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0001-V4L-DVB-13699-Mantis-MB86A16-Initial-checkin-Mantis-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0001-V4L-DVB-13699-Mantis-MB86A16-Initial-checkin-Mantis-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,3868 @@
+From e7cc9f1635f1d46992cb66e0aac472cbfc89f878 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 21:57:10 -0300
+Subject: [PATCH 001/120] V4L/DVB (13699): [Mantis, MB86A16] Initial checkin: Mantis, MB86A16
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 41e840b13e111ba18b138d055ddd250bd5ad5e39)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c      | 1772 ++++++++++++++++++++++++++++
+ drivers/media/dvb/frontends/mb86a16.h      |   38 +
+ drivers/media/dvb/frontends/mb86a16_priv.h |  151 +++
+ drivers/media/dvb/mantis/Kconfig           |   13 +
+ drivers/media/dvb/mantis/Makefile          |    7 +
+ drivers/media/dvb/mantis/mantis_common.h   |  135 +++
+ drivers/media/dvb/mantis/mantis_core.c     |  215 ++++
+ drivers/media/dvb/mantis/mantis_core.h     |   61 +
+ drivers/media/dvb/mantis/mantis_dma.c      |  238 ++++
+ drivers/media/dvb/mantis/mantis_dvb.c      |  304 +++++
+ drivers/media/dvb/mantis/mantis_i2c.c      |  189 +++
+ drivers/media/dvb/mantis/mantis_reg.h      |  109 ++
+ drivers/media/dvb/mantis/mantis_vp1033.c   |  151 +++
+ drivers/media/dvb/mantis/mantis_vp1033.h   |   35 +
+ drivers/media/dvb/mantis/mantis_vp1034.c   |   52 +
+ drivers/media/dvb/mantis/mantis_vp1034.h   |   30 +
+ drivers/media/dvb/mantis/mantis_vp2033.c   |   73 ++
+ drivers/media/dvb/mantis/mantis_vp2033.h   |   33 +
+ drivers/media/dvb/mantis/mantis_vp3030.c   |   53 +
+ drivers/media/dvb/mantis/mantis_vp3030.h   |   30 +
+ 20 files changed, 3689 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/frontends/mb86a16.c
+ create mode 100644 drivers/media/dvb/frontends/mb86a16.h
+ create mode 100644 drivers/media/dvb/frontends/mb86a16_priv.h
+ create mode 100644 drivers/media/dvb/mantis/Kconfig
+ create mode 100644 drivers/media/dvb/mantis/Makefile
+ create mode 100644 drivers/media/dvb/mantis/mantis_common.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_core.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_core.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_dma.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_dvb.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_i2c.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_reg.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp1033.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp1033.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp1034.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp1034.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp2033.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp2033.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp3030.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp3030.h
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+new file mode 100644
+index 0000000..6a78a0c
+--- /dev/null
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -0,0 +1,1772 @@
++/*
++	Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++
++#include "dvb_frontend.h"
++#include "mb86a16.h"
++#include "mb86a16_priv.h"
++
++unsigned int verbose = 5;
++module_param(verbose, int, 0644);
++
++#define ABS(x)		((x) < 0 ? (-x) : (x))
++
++struct mb86a16_state {
++	struct i2c_adapter		*i2c_adap;
++	const struct mb86a16_config	*config;
++	struct dvb_frontend		frontend;
++	u8				signal;
++
++	// tuning parameters
++	int				frequency;
++	int				srate;
++
++	// Internal stuff
++	int				master_clk;
++	int				deci;
++	int				csel;
++	int				rsel;
++};
++
++#define MB86A16_ERROR		0
++#define MB86A16_NOTICE		1
++#define MB86A16_INFO		2
++#define MB86A16_DEBUG		3
++
++#define dprintk(x, y, z, format, arg...) do {						\
++	if (z) {									\
++		if	((x > MB86A16_ERROR) && (x > y))				\
++			printk(KERN_ERR "%s: " format "\n", __func__, ##arg);		\
++		else if ((x > MB86A16_NOTICE) && (x > y))				\
++			printk(KERN_NOTICE "%s: " format "\n", __func__, ##arg);	\
++		else if ((x > MB86A16_INFO) && (x > y))					\
++			printk(KERN_INFO "%s: " format "\n", __func__, ##arg);		\
++		else if ((x > MB86A16_DEBUG) && (x > y))				\
++			printk(KERN_DEBUG "%s: " format "\n", __func__, ##arg);		\
++	} else {									\
++		if (x > y)								\
++			printk(format, ##arg);						\
++	}										\
++} while (0)
++
++#define TRACE_IN	dprintk(verbose, MB86A16_DEBUG, 1, "-->()")
++#define TRACE_OUT	dprintk(verbose, MB86A16_DEBUG, 1, "()-->")
++
++static int mb86a16_write(struct mb86a16_state *state, u8 reg, u8 val)
++{
++	int ret;
++	u8 buf[] = { reg, val };
++
++	struct i2c_msg msg = {
++		.addr = state->config->demod_address,
++		.flags = 0,
++		.buf = buf,
++		.len = 2
++	};
++
++	dprintk(verbose, MB86A16_DEBUG, 1,
++		"writing to [0x%02x],Reg[0x%02x],Data[0x%02x]",
++		state->config->demod_address, buf[0], buf[1]);
++
++	ret = i2c_transfer(state->i2c_adap, &msg, 1);
++
++	return (ret != 1) ? -EREMOTEIO : 0;
++}
++
++static int mb86a16_read(struct mb86a16_state *state, u8 reg, u8 *val)
++{
++	int ret;
++	u8 b0[] = { reg };
++	u8 b1[] = { 0 };
++
++	struct i2c_msg msg[] = {
++		{
++			.addr = state->config->demod_address,
++			.flags = 0,
++			.buf = b0,
++			.len = 1
++		},{
++			.addr = state->config->demod_address,
++			.flags = I2C_M_RD,
++			.buf = b1,
++			.len = 1
++		}
++	};
++	ret = i2c_transfer(state->i2c_adap, msg, 2);
++	if (ret != 2) {
++		dprintk(verbose, MB86A16_ERROR, 1, "read error(reg=0x%02x, ret=0x%i)",
++			reg, ret);
++
++		return -EREMOTEIO;
++	}
++	*val = b1[0];
++
++	return ret;
++}
++
++static int CNTM_set(struct mb86a16_state *state,
++		    unsigned char timint1,
++		    unsigned char timint2,
++		    unsigned char cnext)
++{
++	unsigned char val;
++
++	val = (timint1 << 4) | (timint2 << 2) | cnext;
++	if (mb86a16_write(state, MB86A16_CNTMR, val) < 0)
++		goto err;
++
++	return 0;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int smrt_set(struct mb86a16_state *state, int rate)
++{
++	int tmp ;
++	int m ;
++	unsigned char STOFS0, STOFS1;
++
++	m = 1 << state->deci;
++	tmp = (8192 * state->master_clk - 2 * m * rate * 8192 + state->master_clk / 2) / state->master_clk;
++
++	STOFS0 = tmp & 0x0ff;
++	STOFS1 = (tmp & 0xf00) >> 8;
++
++	if (mb86a16_write(state, MB86A16_SRATE1, (state->deci << 2) |
++				       (state->csel << 1) |
++					state->rsel) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_SRATE2, STOFS0) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_SRATE3, STOFS1) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -1;
++}
++
++static int srst(struct mb86a16_state *state)
++{
++	if (mb86a16_write(state, MB86A16_RESET, 0x04) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++
++}
++
++static int afcex_data_set(struct mb86a16_state *state,
++			  unsigned char AFCEX_L,
++			  unsigned char AFCEX_H)
++{
++	if (mb86a16_write(state, MB86A16_AFCEXL, AFCEX_L) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_AFCEXH, AFCEX_H) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++
++	return -1;
++}
++
++static int afcofs_data_set(struct mb86a16_state *state,
++			   unsigned char AFCEX_L,
++			   unsigned char AFCEX_H)
++{
++	if (mb86a16_write(state, 0x58, AFCEX_L) < 0)
++		goto err;
++	if (mb86a16_write(state, 0x59, AFCEX_H) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int stlp_set(struct mb86a16_state *state,
++		    unsigned char STRAS,
++		    unsigned char STRBS)
++{
++	if (mb86a16_write(state, MB86A16_STRFILTCOEF1, (STRBS << 3) | (STRAS)) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int Vi_set(struct mb86a16_state *state, unsigned char ETH, unsigned char VIA)
++{
++	if (mb86a16_write(state, MB86A16_VISET2, 0x04) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_VISET3, 0xf5) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int initial_set(struct mb86a16_state *state)
++{
++	if (stlp_set(state, 5, 7))
++		goto err;
++	if (afcex_data_set(state, 0, 0))
++		goto err;
++	if (afcofs_data_set(state, 0, 0))
++		goto err;
++
++	if (mb86a16_write(state, MB86A16_CRLFILTCOEF1, 0x16) < 0)
++		goto err;
++	if (mb86a16_write(state, 0x2f, 0x21) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_VIMAG, 0x38) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_FAGCS1, 0x00) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_FAGCS2, 0x1c) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_FAGCS3, 0x20) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_FAGCS4, 0x1e) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_FAGCS5, 0x23) < 0)
++		goto err;
++	if (mb86a16_write(state, 0x54, 0xff) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_TSOUT, 0x00) < 0)
++		goto err;
++
++	return 0;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int S01T_set(struct mb86a16_state *state,
++		    unsigned char s1t,
++		    unsigned s0t)
++{
++	if (mb86a16_write(state, 0x33, (s1t << 3) | s0t) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++
++static int EN_set(struct mb86a16_state *state,
++		  int cren,
++		  int afcen)
++{
++	unsigned char val;
++
++	val = 0x7a | (cren << 7) | (afcen << 2);
++	if (mb86a16_write(state, 0x49, val) < 0)
++		goto err;
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int AFCEXEN_set(struct mb86a16_state *state,
++		       int afcexen,
++		       int smrt)
++{
++	unsigned char AFCA ;
++
++	if (smrt > 18875)
++		AFCA = 4;
++	else if (smrt > 9375)
++		AFCA = 3;
++	else if (smrt > 2250)
++		AFCA = 2;
++	else
++		AFCA = 1;
++
++	if (mb86a16_write(state, 0x2a, 0x02 | (afcexen << 5) | (AFCA << 2)) < 0)
++		goto err;
++
++	return 0;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int DAGC_data_set(struct mb86a16_state *state,
++			 unsigned char DAGCA,
++			 unsigned char DAGCW)
++{
++	if (mb86a16_write(state, 0x2d, (DAGCA << 3) | DAGCW) < 0)
++		goto err;
++
++	return 0;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static void smrt_info_get(struct mb86a16_state *state, int rate)
++{
++	if (rate >= 37501) {
++		state->deci = 0; state->csel = 0; state->rsel = 0;
++	} else if (rate >= 30001) {
++		state->deci = 0; state->csel = 0; state->rsel = 1;
++	} else if (rate >= 26251) {
++		state->deci = 0; state->csel = 1; state->rsel = 0;
++	} else if (rate >= 22501) {
++		state->deci = 0; state->csel = 1; state->rsel = 1;
++	} else if (rate >= 18751) {
++		state->deci = 1; state->csel = 0; state->rsel = 0;
++	} else if (rate >= 15001) {
++		state->deci = 1; state->csel = 0; state->rsel = 1;
++	} else if (rate >= 13126) {
++		state->deci = 1; state->csel = 1; state->rsel = 0;
++	} else if (rate >= 11251) {
++		state->deci = 1; state->csel = 1; state->rsel = 1;
++	} else if (rate >= 9376) {
++		state->deci = 2; state->csel = 0; state->rsel = 0;
++	} else if (rate >= 7501) {
++		state->deci = 2; state->csel = 0; state->rsel = 1;
++	} else if (rate >= 6563) {
++		state->deci = 2; state->csel = 1; state->rsel = 0;
++	} else if (rate >= 5626) {
++		state->deci = 2; state->csel = 1; state->rsel = 1;
++	} else if (rate >= 4688) {
++		state->deci = 3; state->csel = 0; state->rsel = 0;
++	} else if (rate >= 3751) {
++		state->deci = 3; state->csel = 0; state->rsel = 1;
++	} else if (rate >= 3282) {
++		state->deci = 3; state->csel = 1; state->rsel = 0;
++	} else if (rate >= 2814) {
++		state->deci = 3; state->csel = 1; state->rsel = 1;
++	} else if (rate >= 2344) {
++		state->deci = 4; state->csel = 0; state->rsel = 0;
++	} else if (rate >= 1876) {
++		state->deci = 4; state->csel = 0; state->rsel = 1;
++	} else if (rate >= 1641) {
++		state->deci = 4; state->csel = 1; state->rsel = 0;
++	} else if (rate >= 1407) {
++		state->deci = 4; state->csel = 1; state->rsel = 1;
++	} else if (rate >= 1172) {
++		state->deci = 5; state->csel = 0; state->rsel = 0;
++	} else if (rate >=  939) {
++		state->deci = 5; state->csel = 0; state->rsel = 1;
++	} else if (rate >=  821) {
++		state->deci = 5; state->csel = 1; state->rsel = 0;
++	} else {
++		state->deci = 5; state->csel = 1; state->rsel = 1;
++	}
++
++	if (state->csel == 0)
++		state->master_clk = 92000;
++	else
++		state->master_clk = 61333;
++
++}
++
++static int signal_det(struct mb86a16_state *state,
++		      int smrt,
++		      unsigned char *SIG)
++{
++
++	int ret ;
++	int smrtd ;
++	int wait_sym ;
++	int wait_t ;
++	unsigned char S[3] ;
++	int i ;
++
++	if (*SIG > 45) {
++		if (CNTM_set(state, 2, 1, 2) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
++			return -1;
++		}
++		wait_sym = 40000;
++	} else {
++		if (CNTM_set(state, 3, 1, 2) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
++			return -1;
++		}
++		wait_sym = 80000;
++	}
++	for (i = 0; i < 3; i++) {
++		if (i == 0 )
++			smrtd = smrt * 98 / 100;
++		else if (i == 1)
++			smrtd = smrt;
++		else
++			smrtd = smrt * 102 / 100;
++		smrt_info_get(state, smrtd);
++		smrt_set(state, smrtd);
++		srst(state);
++		wait_t = (wait_sym + 99 * smrtd / 100) / smrtd;
++		if (wait_t == 0)
++			wait_t = 1;
++		msleep_interruptible(10);
++		if (mb86a16_read(state, 0x37, &(S[i])) != 2) {
++			dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++			return -EREMOTEIO;
++		}
++	}
++	if ((S[1] > S[0] * 112 / 100) &&
++	    (S[1] > S[2] * 112 / 100)) {
++
++		ret = 1;
++	} else {
++		ret = 0;
++	}
++	*SIG = S[1];
++
++	if (CNTM_set(state, 0, 1, 2) < 0) {
++		dprintk(verbose, MB86A16_ERROR, 1, "CNTM set Error");
++		return -1;
++	}
++
++	return ret;
++}
++
++static int rf_val_set(struct mb86a16_state *state,
++		      int f,
++		      int smrt,
++		      unsigned char R)
++{
++	unsigned char C, F, B;
++	int M;
++	unsigned char rf_val[5];
++	int ack = -1;
++
++	if (smrt > 37750 )
++		C = 1;
++	else if (smrt > 18875)
++		C = 2;
++	else if (smrt > 5500 )
++		C = 3;
++	else
++		C = 4;
++
++	if (smrt > 30500)
++		F = 3;
++	else if (smrt > 9375)
++		F = 1;
++	else if (smrt > 4625)
++		F = 0;
++	else
++		F = 2;
++
++	if (f < 1060)
++		B = 0;
++	else if (f < 1175)
++		B = 1;
++	else if (f < 1305)
++		B = 2;
++	else if (f < 1435)
++		B = 3;
++	else if (f < 1570)
++		B = 4;
++	else if (f < 1715)
++		B = 5;
++	else if (f < 1845)
++		B = 6;
++	else if (f < 1980)
++		B = 7;
++	else if (f < 2080)
++		B = 8;
++	else
++		B = 9;
++
++	M = f * (1 << R) / 2;
++
++	rf_val[0] = 0x01 | (C << 3) | (F << 1);
++	rf_val[1] = (R << 5) | ((M & 0x1f000) >> 12);
++	rf_val[2] = (M & 0x00ff0) >> 4;
++	rf_val[3] = ((M & 0x0000f) << 4) | B;
++
++	// Frequency Set
++	if (mb86a16_write(state, 0x21, rf_val[0]) < 0)
++		ack = 0;
++	if (mb86a16_write(state, 0x22, rf_val[1]) < 0)
++		ack = 0;
++	if (mb86a16_write(state, 0x23, rf_val[2]) < 0)
++		ack = 0;
++	if (mb86a16_write(state, 0x24, rf_val[3]) < 0)
++		ack = 0;
++	if (mb86a16_write(state, 0x25, 0x01) < 0)
++		ack = 0;
++	if (ack == 0) {
++		dprintk(verbose, MB86A16_ERROR, 1, "RF Setup - I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	return 0;
++}
++
++static int afcerr_chk(struct mb86a16_state *state)
++{
++	unsigned char AFCM_L, AFCM_H ;
++	int AFCM ;
++	int afcm, afcerr ;
++
++	if (mb86a16_read(state, 0x0e, &AFCM_L) != 2)
++		goto err;
++	if (mb86a16_read(state, 0x0f, &AFCM_H) != 2)
++		goto err;
++
++	AFCM = (AFCM_H << 8) + AFCM_L;
++
++	if (AFCM > 2048)
++		afcm = AFCM - 4096;
++	else
++		afcm = AFCM;
++	afcerr = afcm * state->master_clk / 8192;
++
++	return afcerr;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int dagcm_val_get(struct mb86a16_state *state)
++{
++	int DAGCM;
++	unsigned char DAGCM_H, DAGCM_L;
++
++	if (mb86a16_read(state, 0x45, &DAGCM_L) != 2)
++		goto err;
++	if (mb86a16_read(state, 0x46, &DAGCM_H) != 2)
++		goto err;
++
++	DAGCM = (DAGCM_H << 8) + DAGCM_L;
++
++	return DAGCM;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int mb86a16_read_status(struct dvb_frontend *fe, fe_status_t *status)
++{
++	struct mb86a16_state *state = fe->demodulator_priv;
++
++	if (state->signal & 0x02)
++		*status |= FE_HAS_VITERBI;
++	if (state->signal & 0x01)
++		*status |= FE_HAS_SYNC;
++	if (state->signal & 0x03)
++		*status |= FE_HAS_LOCK;
++
++	return 0;
++}
++
++static int sync_chk(struct mb86a16_state *state,
++		    unsigned char *VIRM)
++{
++	unsigned char val;
++	int sync;
++
++	if (mb86a16_read(state, 0x0d, &val) != 2)
++		goto err;
++
++	dprintk(verbose, MB86A16_INFO, 1, "Status = %02x,", val);
++	sync = val & 0x01;
++	*VIRM = (val & 0x1c) >> 2;
++
++	return sync;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++
++}
++
++static int freqerr_chk(struct mb86a16_state *state,
++		       int fTP,
++		       int smrt,
++		       int unit)
++{
++	unsigned char CRM, AFCML, AFCMH;
++	unsigned char temp1, temp2, temp3;
++	int crm, afcm, AFCM;
++	int crrerr, afcerr;		// [kHz]
++	int frqerr;			// [MHz]
++	int afcen, afcexen = 0;
++	int R, M, fOSC, fOSC_OFS;
++
++	if (mb86a16_read(state, 0x43, &CRM) != 2)
++		goto err;
++
++	if (CRM > 127)
++		crm = CRM - 256;
++	else
++		crm = CRM;
++
++	crrerr = smrt * crm / 256;
++	if (mb86a16_read(state, 0x49, &temp1) != 2)
++		goto err;
++
++	afcen = (temp1 & 0x04) >> 2;
++	if (afcen == 0) {
++		if (mb86a16_read(state, 0x2a, &temp1) != 2)
++			goto err;
++		afcexen = (temp1 & 0x20) >> 5;
++	}
++
++	if (afcen == 1) {
++		if (mb86a16_read(state, 0x0e, &AFCML) != 2)
++			goto err;
++		if (mb86a16_read(state, 0x0f, &AFCMH) != 2)
++			goto err;
++	} else if (afcexen == 1) {
++		if (mb86a16_read(state, 0x2b, &AFCML) != 2)
++			goto err;
++		if (mb86a16_read(state, 0x2c, &AFCMH) != 2)
++			goto err;
++	}
++	if ((afcen == 1) || (afcexen == 1)) {
++		smrt_info_get(state, smrt);
++		AFCM = ((AFCMH & 0x01) << 8) + AFCML;
++		if (AFCM > 255)
++			afcm = AFCM - 512;
++		else
++			afcm = AFCM;
++
++		afcerr = afcm * state->master_clk / 8192;
++	} else
++		afcerr = 0;
++
++	if (mb86a16_read(state, 0x22, &temp1) != 2)
++		goto err;
++	if (mb86a16_read(state, 0x23, &temp2) != 2)
++		goto err;
++	if (mb86a16_read(state, 0x24, &temp3) != 2)
++		goto err;
++
++	R = (temp1 & 0xe0) >> 5;
++	M = ((temp1 & 0x1f) << 12) + (temp2 << 4) + (temp3 >> 4);
++	if (R == 0)
++		fOSC = 2 * M;
++	else
++		fOSC = M;
++
++	fOSC_OFS = fOSC - fTP;
++
++	if (unit == 0) {	//[MHz]
++		if (crrerr + afcerr + fOSC_OFS * 1000 >= 0)
++			frqerr = (crrerr + afcerr + fOSC_OFS * 1000 + 500) / 1000;
++		else
++			frqerr = (crrerr + afcerr + fOSC_OFS * 1000 - 500) / 1000;
++	} else {	//[kHz]
++		frqerr = crrerr + afcerr + fOSC_OFS * 1000;
++	}
++
++	return frqerr;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static unsigned char vco_dev_get(struct mb86a16_state *state, int smrt)
++{
++	unsigned char R;
++
++	if (smrt > 9375)
++		R = 0;
++	else
++		R = 1;
++
++	return R;
++}
++
++static void swp_info_get(struct mb86a16_state *state,
++			 int fOSC_start,
++			 int smrt,
++			 int v, int R,
++			 int swp_ofs,
++			 int *fOSC,
++			 int *afcex_freq,
++			 unsigned char *AFCEX_L,
++			 unsigned char *AFCEX_H)
++{
++	int AFCEX ;
++	int crnt_swp_freq ;
++
++	crnt_swp_freq = fOSC_start * 1000 + v * swp_ofs;
++
++	if (R == 0 )
++		*fOSC = (crnt_swp_freq + 1000) / 2000 * 2;
++	else
++		*fOSC = (crnt_swp_freq + 500) / 1000;
++
++	if (*fOSC >= crnt_swp_freq)
++		*afcex_freq = *fOSC *1000 - crnt_swp_freq;
++	else
++		*afcex_freq = crnt_swp_freq - *fOSC * 1000;
++
++	AFCEX = *afcex_freq * 8192 / state->master_clk;
++	*AFCEX_L =  AFCEX & 0x00ff;
++	*AFCEX_H = (AFCEX & 0x0f00) >> 8;
++}
++
++
++static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V,  int vmax, int vmin,
++			       int SIGMIN, int fOSC, int afcex_freq, int swp_ofs, unsigned char *SIG1)
++{
++	int swp_freq ;
++
++	if ((i % 2 == 1) && (v <= vmax)) {
++		// positive v (case 1)
++		if ((v - 1 == vmin)				&&
++		    (*(V + 30 + v) >= 0)			&&
++		    (*(V + 30 + v - 1) >= 0)			&&
++		    (*(V + 30 + v - 1) > *(V + 30 + v))		&&
++		    (*(V + 30 + v - 1) > SIGMIN)) {
++
++			swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
++			*SIG1 = *(V + 30 + v - 1);
++		} else if ((v == vmax)				&&
++			   (*(V + 30 + v) >= 0)			&&
++			   (*(V + 30 + v - 1) >= 0)		&&
++			   (*(V + 30 + v) > *(V + 30 + v - 1))	&&
++			   (*(V + 30 + v) > SIGMIN)) {
++			// (case 2)
++			swp_freq = fOSC * 1000 + afcex_freq;
++			*SIG1 = *(V + 30 + v);
++		} else if ((*(V + 30 + v) > 0)			&&
++			   (*(V + 30 + v - 1) > 0)		&&
++			   (*(V + 30 + v - 2) > 0)		&&
++			   (*(V + 30 + v - 3) > 0)		&&
++			   (*(V + 30 + v - 1) > *(V + 30 + v))	&&
++			   (*(V + 30 + v - 2) > *(V + 30 + v - 3)) &&
++			   ((*(V + 30 + v - 1) > SIGMIN)	||
++			   (*(V + 30 + v - 2) > SIGMIN))) {
++			// (case 3)
++			if (*(V + 30 + v - 1) >= *(V + 30 + v - 2)) {
++				swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
++				*SIG1 = *(V + 30 + v - 1);
++			} else {
++				swp_freq = fOSC * 1000 + afcex_freq - swp_ofs * 2;
++				*SIG1 = *(V + 30 + v - 2);
++			}
++		} else if ((v == vmax)				&&
++			   (*(V + 30 + v) >= 0)			&&
++			   (*(V + 30 + v - 1) >= 0)		&&
++			   (*(V + 30 + v - 2) >= 0)		&&
++			   (*(V + 30 + v) > *(V + 30 + v - 2))	&&
++			   (*(V + 30 + v - 1) > *(V + 30 + v - 2)) &&
++			   ((*(V + 30 + v) > SIGMIN)		||
++			   (*(V + 30 + v - 1) > SIGMIN))) {
++			// (case 4)
++			if (*(V + 30 + v) >= *(V + 30 + v - 1)) {
++				swp_freq = fOSC * 1000 + afcex_freq;
++				*SIG1 = *(V + 30 + v);
++			} else {
++				swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
++				*SIG1 = *(V + 30 + v - 1);
++			}
++		} else  {
++			swp_freq = -1 ;
++		}
++	} else if ((i % 2 == 0) && (v >= vmin)) {
++		// Negative v (case 1)
++		if ((*(V + 30 + v) > 0)				&&
++		    (*(V + 30 + v + 1) > 0)			&&
++		    (*(V + 30 + v + 2) > 0)			&&
++		    (*(V + 30 + v + 1) > *(V + 30 + v))		&&
++		    (*(V + 30 + v + 1) > *(V + 30 + v + 2))	&&
++		    (*(V + 30 + v + 1) > SIGMIN)) {
++
++			swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
++			*SIG1 = *(V + 30 + v + 1);
++		} else if ((v + 1 == vmax)			&&
++			   (*(V + 30 + v) >= 0)			&&
++			   (*(V + 30 + v + 1) >= 0)		&&
++			   (*(V + 30 + v + 1) > *(V + 30 + v))	&&
++			   (*(V + 30 + v + 1) > SIGMIN)) {
++			// (case 2)
++			swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
++			*SIG1 = *(V + 30 + v);
++		} else if ((v == vmin)				&&
++			   (*(V + 30 + v) > 0)			&&
++			   (*(V + 30 + v + 1) > 0)		&&
++			   (*(V + 30 + v + 2) > 0)		&&
++			   (*(V + 30 + v) > *(V + 30 + v + 1))	&&
++			   (*(V + 30 + v) > *(V + 30 + v + 2))	&&
++			   (*(V + 30 + v) > SIGMIN)) {
++			// (case 3)
++			swp_freq = fOSC * 1000 + afcex_freq;
++			*SIG1 = *(V + 30 + v);
++		} else if ((*(V + 30 + v) >= 0)			&&
++			   (*(V + 30 + v + 1) >= 0)		&&
++			   (*(V + 30 + v + 2) >= 0)		&&
++			   (*(V +30 + v + 3) >= 0)		&&
++			   (*(V + 30 + v + 1) > *(V + 30 + v))	&&
++			   (*(V + 30 + v + 2) > *(V + 30 + v + 3)) &&
++			   ((*(V + 30 + v + 1) > SIGMIN)	||
++			    (*(V + 30 + v + 2) > SIGMIN))) {
++			// (case 4)
++			if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
++				swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
++				*SIG1 = *(V + 30 + v + 1);
++			} else {
++				swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2;
++				*SIG1 = *(V + 30 + v + 2);
++			}
++		} else if ((*(V + 30 + v) >= 0)			&&
++			   (*(V + 30 + v + 1) >= 0)		&&
++			   (*(V + 30 + v + 2) >= 0)		&&
++			   (*(V + 30 + v + 3) >= 0)		&&
++			   (*(V + 30 + v) > *(V + 30 + v + 2))	&&
++			   (*(V + 30 + v + 1) > *(V + 30 + v + 2)) &&
++			   (*(V + 30 + v) > *(V + 30 + v + 3))	&&
++			   (*(V + 30 + v + 1) > *(V + 30 + v + 3)) &&
++			   ((*(V + 30 + v) > SIGMIN)		||
++			    (*(V + 30 + v + 1) > SIGMIN))) {
++			// (case 5)
++			if (*(V + 30 + v) >= *(V + 30 + v + 1)) {
++				swp_freq = fOSC * 1000 + afcex_freq;
++				*SIG1 = *(V + 30 + v);
++			} else {
++				swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
++				*SIG1 = *(V + 30 + v + 1);
++			}
++		} else if ((v + 2 == vmin)			&&
++			   (*(V + 30 + v) >= 0)			&&
++			   (*(V + 30 + v + 1) >= 0)		&&
++			   (*(V + 30 + v + 2) >= 0)		&&
++			   (*(V + 30 + v + 1) > *(V + 30 + v))	&&
++			   (*(V + 30 + v + 2) > *(V + 30 + v))	&&
++			   ((*(V + 30 + v + 1) > SIGMIN)	||
++			    (*(V + 30 + v + 2) > SIGMIN))) {
++			// (case 6)
++			if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
++				swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
++				*SIG1 = *(V + 30 + v + 1);
++			} else {
++				swp_freq = fOSC * 1000 + afcex_freq + swp_ofs * 2;
++				*SIG1 = *(V + 30 + v + 2);
++			}
++		} else if ((vmax == 0) && (vmin == 0) && (*(V + 30 + v) > SIGMIN)) {
++			swp_freq = fOSC * 1000;
++			*SIG1 = *(V + 30 + v);
++		} else swp_freq = -1;
++	} else swp_freq = -1;
++
++	return swp_freq;
++}
++
++static void swp_info_get2(struct mb86a16_state *state,
++			  int smrt,
++			  int R,
++			  int swp_freq,
++			  int *afcex_freq,
++			  int *fOSC,
++			  unsigned char *AFCEX_L,
++			  unsigned char *AFCEX_H)
++{
++	int AFCEX ;
++
++	if (R == 0)
++		*fOSC = (swp_freq + 1000) / 2000 * 2;
++	else
++		*fOSC = (swp_freq + 500) / 1000;
++
++	if (*fOSC >= swp_freq)
++		*afcex_freq = *fOSC * 1000 - swp_freq;
++	else
++		*afcex_freq = swp_freq - *fOSC * 1000;
++
++	AFCEX = *afcex_freq * 8192 / state->master_clk;
++	*AFCEX_L =  AFCEX & 0x00ff;
++	*AFCEX_H = (AFCEX & 0x0f00) >> 8;
++}
++
++static void afcex_info_get(struct mb86a16_state *state,
++			   int afcex_freq,
++			   unsigned char *AFCEX_L,
++			   unsigned char *AFCEX_H)
++{
++	int AFCEX ;
++
++	AFCEX = afcex_freq * 8192 / state->master_clk;
++	*AFCEX_L =  AFCEX & 0x00ff;
++	*AFCEX_H = (AFCEX & 0x0f00) >> 8;
++}
++
++static int SEQ_set(struct mb86a16_state *state, unsigned char loop)
++{
++	// SLOCK0 = 0
++	if (mb86a16_write(state, 0x32, 0x02 | (loop << 2)) < 0) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	return 0;
++}
++
++static int iq_vt_set(struct mb86a16_state *state, unsigned char IQINV)
++{
++	// Viterbi Rate, IQ Settings
++	if (mb86a16_write(state, 0x06, 0xdf | (IQINV << 5)) < 0) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	return 0;
++}
++
++static int FEC_srst(struct mb86a16_state *state)
++{
++	if (mb86a16_write(state, MB86A16_RESET, 0x02) < 0) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	return 0;
++}
++
++static int S2T_set(struct mb86a16_state *state, unsigned char S2T)
++{
++	if (mb86a16_write(state, 0x34, 0x70 | S2T) < 0) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	return 0;
++}
++
++static int S45T_set(struct mb86a16_state *state, unsigned char S4T, unsigned char S5T)
++{
++	if (mb86a16_write(state, 0x35, 0x00 | (S5T << 4) | S4T) < 0) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	return 0;
++}
++
++
++static int mb86a16_set_fe(struct mb86a16_state *state)
++{
++	u8 agcval, cnmval;
++
++	int i, j;
++	int fOSC = 0;
++	int fOSC_start = 0;
++	int wait_t;
++	int fcp;
++	int swp_ofs;
++	int V[60];
++	u8 SIG1MIN;
++
++	unsigned char CREN, AFCEN, AFCEXEN;
++	unsigned char SIG1;
++	unsigned char TIMINT1, TIMINT2, TIMEXT;
++	unsigned char S0T, S1T;
++	unsigned char S2T;
++//	unsigned char S2T, S3T;
++	unsigned char S4T, S5T;
++	unsigned char AFCEX_L, AFCEX_H;
++	unsigned char R;
++	unsigned char VIRM;
++	unsigned char ETH, VIA;
++	unsigned char junk;
++
++	int loop;
++	int ftemp;
++	int v, vmax, vmin;
++	int vmax_his, vmin_his;
++	int swp_freq, prev_swp_freq[20];
++	int prev_freq_num;
++	int signal_dupl;
++	int afcex_freq;
++	int signal;
++	int afcerr;
++	int temp_freq, delta_freq;
++	int dagcm[4];
++	int smrt_d;
++//	int freq_err;
++	int n;
++	int ret = -1;
++	int sync;
++
++	dprintk(verbose, MB86A16_INFO, 1, "freq=%d Mhz, symbrt=%d Ksps", state->frequency, state->srate);
++
++	fcp = 5000;	// (carrier recovery [kHz])
++//	fcp = 3000;
++	swp_ofs = state->srate / 4;
++
++	for (i = 0; i < 60; i++)
++		V[i] = -1;
++
++	for (i = 0; i < 20; i++)
++		prev_swp_freq[i] = 0;
++
++	SIG1MIN = 25;
++
++	for (n = 0; ((n < 3) && (ret == -1)); n++) {
++		SEQ_set(state, 0);
++		iq_vt_set(state, 0);
++
++		CREN = 0;
++		AFCEN = 0;
++		AFCEXEN = 1;
++		TIMINT1 = 0;
++		TIMINT2 = 1;
++		TIMEXT = 2;
++		S1T = 0;
++		S0T = 0;
++
++		if (initial_set(state) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "initial set failed");
++			return -1;
++		}
++		if (DAGC_data_set(state, 3, 2) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
++			return -1;
++		}
++		if (EN_set(state, CREN, AFCEN) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
++			return -1; // (0, 0)
++		}
++		if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
++			return -1; // (1, smrt) = (1, symbolrate)
++		}
++		if (CNTM_set(state, TIMINT1, TIMINT2, TIMEXT) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "CNTM set error");
++			return -1; // (0, 1, 2)
++		}
++		if (S01T_set(state, S1T, S0T) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
++			return -1; // (0, 0)
++		}
++		smrt_info_get(state, state->srate);
++		if (smrt_set(state, state->srate) < 0) {
++			dprintk(verbose, MB86A16_ERROR, 1, "smrt info get error");
++			return -1;
++		}
++
++		R = vco_dev_get(state, state->srate);
++		if (R == 1)
++			fOSC_start = state->frequency;
++
++		else if (R == 0) {
++			if (state->frequency % 2 == 0) {
++				fOSC_start = state->frequency;
++			} else {
++				fOSC_start = state->frequency + 1;
++				if (fOSC_start > 2150)
++					fOSC_start = state->frequency - 1;
++			}
++		}
++		loop = 1;
++		ftemp = fOSC_start * 1000;
++		vmax = 0 ;
++		while (loop == 1) {
++			ftemp = ftemp + swp_ofs;
++			vmax++;
++
++			// Upper bound
++			if (ftemp > 2150000) {
++				loop = 0;
++				vmax--;
++			}
++			else if ((ftemp == 2150000) || (ftemp - state->frequency * 1000 >= fcp + state->srate / 4))
++				loop = 0;
++		}
++
++		loop = 1;
++		ftemp = fOSC_start * 1000;
++		vmin = 0 ;
++		while (loop == 1) {
++			ftemp = ftemp - swp_ofs;
++			vmin--;
++
++			// Lower bound
++			if (ftemp < 950000) {
++				loop = 0;
++				vmin++;
++			}
++			else if ((ftemp == 950000) || (state->frequency * 1000 - ftemp >= fcp + state->srate / 4))
++				loop = 0;
++		}
++
++		wait_t = (8000 + state->srate / 2) / state->srate;
++		if (wait_t == 0)
++			wait_t = 1;
++
++		i = 0;
++		j = 0;
++		prev_freq_num = 0;
++		loop = 1;
++		signal = 0;
++		vmax_his = 0;
++		vmin_his = 0;
++		v = 0;
++
++		while (loop == 1) {
++			swp_info_get(state, fOSC_start, state->srate,
++				     v, R, swp_ofs, &fOSC,
++				     &afcex_freq, &AFCEX_L, &AFCEX_H);
++
++			if (rf_val_set(state, fOSC, state->srate, R) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
++				return -1;
++			}
++
++			if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
++				return -1;
++			}
++			if (srst(state) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "srst error");
++				return -1;
++			}
++			msleep_interruptible(wait_t);
++
++			if (mb86a16_read(state, 0x37, &SIG1) != 2) {
++				dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++				return -1;
++			}
++			V[30 + v] = SIG1 ;
++			swp_freq = swp_freq_calcuation(state, i, v, V, vmax, vmin,
++						      SIG1MIN, fOSC, afcex_freq,
++						      swp_ofs, &SIG1);	//changed
++
++			signal_dupl = 0;
++			for (j = 0; j < prev_freq_num; j++) {
++				if ((ABS(prev_swp_freq[j] - swp_freq)) < (swp_ofs * 3 / 2)) {
++					signal_dupl = 1;
++					dprintk(verbose, MB86A16_INFO, 1, "Probably Duplicate Signal, j = %d", j);
++				}
++			}
++			if ((signal_dupl == 0) && (swp_freq > 0) && (ABS(swp_freq - state->frequency * 1000) < fcp + state->srate / 6)) {
++				dprintk(verbose, MB86A16_DEBUG, 1, "------ Signal detect ------ [swp_freq=[%07d, srate=%05d]]", swp_freq, state->srate);
++				prev_swp_freq[prev_freq_num] = swp_freq;
++				prev_freq_num++;
++				swp_info_get2(state, state->srate, R, swp_freq,
++					      &afcex_freq, &fOSC,
++					      &AFCEX_L, &AFCEX_H);
++
++				if (rf_val_set(state, fOSC, state->srate, R) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
++					return -1;
++				}
++				if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
++					return -1;
++				}
++				signal = signal_det(state, state->srate, &SIG1);
++				if (signal == 1) {
++					dprintk(verbose, MB86A16_ERROR, 1, "***** Signal Found *****");
++					loop = 0;
++				} else {
++					dprintk(verbose, MB86A16_ERROR, 1, "!!!!! No signal !!!!!, try again...");
++					smrt_info_get(state, state->srate);
++					if (smrt_set(state, state->srate) < 0) {
++						dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
++						return -1;
++					}
++				}
++			}
++			if (v > vmax)
++				vmax_his = 1 ;
++			if (v < vmin)
++				vmin_his = 1 ;
++			i++;
++
++			if ((i % 2 == 1) && (vmax_his == 1))
++				i++;
++			if ((i % 2 == 0) && (vmin_his == 1))
++				i++;
++
++			if (i % 2 == 1)
++				v = (i + 1) / 2;
++			else
++				v = -i / 2;
++
++			if ((vmax_his == 1) && (vmin_his == 1))
++				loop = 0 ;
++		}
++
++		if (signal == 1) {
++			dprintk(verbose, MB86A16_INFO, 1, " Start Freq Error Check");
++			S1T = 7 ;
++			S0T = 1 ;
++			CREN = 0 ;
++			AFCEN = 1 ;
++			AFCEXEN = 0 ;
++
++			if (S01T_set(state, S1T, S0T) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
++				return -1;
++			}
++			smrt_info_get(state, state->srate);
++			if (smrt_set(state, state->srate) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
++				return -1;
++			}
++			if (EN_set(state, CREN, AFCEN) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
++				return -1;
++			}
++			if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
++				return -1;
++			}
++			afcex_info_get(state, afcex_freq, &AFCEX_L, &AFCEX_H);
++			if (afcofs_data_set(state, AFCEX_L, AFCEX_H) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "AFCOFS data set error");
++				return -1;
++			}
++			if (srst(state) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "srst error");
++				return -1;
++			}
++			// delay 4~200
++			wait_t = 200000 / state->master_clk + 200000 / state->srate;
++			msleep(wait_t);
++			afcerr = afcerr_chk(state);
++			if (afcerr == -1)
++				return -1;
++
++			swp_freq = fOSC * 1000 + afcerr ;
++			AFCEXEN = 1 ;
++			if (state->srate >= 1500)
++				smrt_d = state->srate / 3;
++			else
++				smrt_d = state->srate / 2;
++			smrt_info_get(state, smrt_d);
++			if (smrt_set(state, smrt_d) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
++				return -1;
++			}
++			if (AFCEXEN_set(state, AFCEXEN, smrt_d) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
++				return -1;
++			}
++			R = vco_dev_get(state, smrt_d);
++			if (DAGC_data_set(state, 2, 0) < 0) {
++				dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
++				return -1;
++			}
++			for (i = 0; i < 3; i++) {
++				temp_freq = swp_freq + (i - 1) * state->srate / 8;
++				swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
++				if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
++					return -1;
++				}
++				if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
++					return -1;
++				}
++				wait_t = 200000 / state->master_clk + 40000 / smrt_d;
++				msleep(wait_t);
++				dagcm[i] = dagcm_val_get(state);
++			}
++			if ((dagcm[0] > dagcm[1]) &&
++			    (dagcm[0] > dagcm[2]) &&
++			    (dagcm[0] - dagcm[1] > 2 * (dagcm[2] - dagcm[1]))) {
++
++				temp_freq = swp_freq - 2 * state->srate / 8;
++				swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
++				if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
++					return -1;
++				}
++				if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "afcex data set");
++					return -1;
++				}
++				wait_t = 200000 / state->master_clk + 40000 / smrt_d;
++				msleep(wait_t);
++				dagcm[3] = dagcm_val_get(state);
++				if (dagcm[3] > dagcm[1])
++					delta_freq = (dagcm[2] - dagcm[0] + dagcm[1] - dagcm[3]) * state->srate / 300;
++				else
++					delta_freq = 0;
++			} else if ((dagcm[2] > dagcm[1]) &&
++				   (dagcm[2] > dagcm[0]) &&
++				   (dagcm[2] - dagcm[1] > 2 * (dagcm[0] - dagcm[1]))) {
++
++				temp_freq = swp_freq + 2 * state->srate / 8;
++				swp_info_get2(state, smrt_d, R, temp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
++				if (rf_val_set(state, fOSC, smrt_d, R) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "rf val set");
++					return -1;
++				}
++				if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "afcex data set");
++					return -1;
++				}
++				wait_t = 200000 / state->master_clk + 40000 / smrt_d;
++				msleep(wait_t);
++				dagcm[3] = dagcm_val_get(state);
++				if (dagcm[3] > dagcm[1])
++					delta_freq = (dagcm[2] - dagcm[0] + dagcm[3] - dagcm[1]) * state->srate / 300;
++				else
++					delta_freq = 0 ;
++
++			} else {
++				delta_freq = 0 ;
++			}
++			dprintk(verbose, MB86A16_INFO, 1, "SWEEP Frequency = %d", swp_freq);
++			swp_freq += delta_freq;
++			dprintk(verbose, MB86A16_INFO, 1, "Adjusting .., DELTA Freq = %d, SWEEP Freq=%d", delta_freq, swp_freq);
++			if (ABS(state->frequency * 1000 - swp_freq) > 3800) {
++				dprintk(verbose, MB86A16_INFO, 1, "NO  --  SIGNAL !");
++			} else {
++
++				S1T = 0;
++				S0T = 3;
++				CREN = 1;
++				AFCEN = 0;
++				AFCEXEN = 1;
++
++				if (S01T_set(state, S1T, S0T) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
++					return -1;
++				}
++				if (DAGC_data_set(state, 0, 0) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "DAGC data set error");
++					return -1;
++				}
++				R = vco_dev_get(state, state->srate);
++				smrt_info_get(state, state->srate);
++				if (smrt_set(state, state->srate) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "smrt set error");
++					return -1;
++				}
++				if (EN_set(state, CREN, AFCEN) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
++					return -1;
++				}
++				if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
++					return -1;
++				}
++				swp_info_get2(state, state->srate, R, swp_freq, &afcex_freq, &fOSC, &AFCEX_L, &AFCEX_H);
++				if (rf_val_set(state, fOSC, state->srate, R) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
++					return -1;
++				}
++				if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
++					return -1;
++				}
++				if (srst(state) < 0) {
++					dprintk(verbose, MB86A16_ERROR, 1, "srst error");
++					return -1;
++				}
++				wait_t = 7 + (10000 + state->srate / 2) / state->srate;
++				if (wait_t == 0)
++					wait_t = 1;
++				msleep_interruptible(wait_t);
++				if (mb86a16_read(state, 0x37, &SIG1) != 2) {
++					dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++					return -EREMOTEIO;
++				}
++
++				if (SIG1 > 110) {
++					S2T = 4; S4T = 1; S5T = 6; ETH = 4; VIA = 6;
++					wait_t = 7 + (917504 + state->srate / 2) / state->srate;
++				} else if (SIG1 > 105) {
++					S2T = 4; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
++					wait_t = 7 + (1048576 + state->srate / 2) / state->srate;
++				} else if (SIG1 > 85) {
++					S2T = 5; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
++					wait_t = 7 + (1310720 + state->srate / 2) / state->srate;
++				} else if (SIG1 > 65) {
++					S2T = 6; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
++					wait_t = 7 + (1572864 + state->srate / 2) / state->srate;
++				} else {
++					S2T = 7; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
++					wait_t = 7 + (2097152 + state->srate / 2) / state->srate;
++				}
++				S2T_set(state, S2T);
++				S45T_set(state, S4T, S5T);
++				Vi_set(state, ETH, VIA);
++				srst(state);
++				msleep_interruptible(wait_t);
++				sync = sync_chk(state, &VIRM);
++				dprintk(verbose, MB86A16_INFO, 1, "-------- Viterbi=[%d] SYNC=[%d] ---------", VIRM, sync);
++				if (mb86a16_read(state, 0x0d, &state->signal) != 2) {
++					dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++					return -EREMOTEIO;
++				}
++				if (VIRM) {
++					if (VIRM == 4) { // 5/6
++						if (SIG1 > 110)
++							wait_t = ( 786432 + state->srate / 2) / state->srate;
++						else
++							wait_t = (1572864 + state->srate / 2) / state->srate;
++						if (state->srate < 5000)
++							// FIXME ! , should be a long wait !
++							msleep_interruptible(wait_t);
++						else
++							msleep_interruptible(wait_t);
++
++						if (sync_chk(state, &junk) == 0) {
++							iq_vt_set(state, 1);
++							FEC_srst(state);
++						}
++						if (SIG1 > 110)
++							wait_t = ( 786432 + state->srate / 2) / state->srate;
++						else
++							wait_t = (1572864 + state->srate / 2) / state->srate;
++
++						msleep_interruptible(wait_t);
++						SEQ_set(state, 1);
++					} else { // 1/2, 2/3, 3/4, 7/8
++						if (SIG1 > 110)
++							wait_t = ( 786432 + state->srate / 2) / state->srate;
++						else
++							wait_t = (1572864 + state->srate / 2) / state->srate;
++
++						msleep_interruptible(wait_t);
++						SEQ_set(state, 1);
++					}
++				} else {
++					dprintk(verbose, MB86A16_INFO, 1, "NO  -- SIGNAL");
++					SEQ_set(state, 1);
++				}
++			}
++		} else {
++			dprintk (verbose, MB86A16_INFO, 1, "NO  -- SIGNAL");
++		}
++
++		sync = sync_chk(state, &junk);
++		if (sync) {
++			dprintk(verbose, MB86A16_INFO, 1, "******* SYNC *******");
++			freqerr_chk(state, state->frequency, state->srate, 1);
++		}
++	}
++
++	mb86a16_read(state, 0x15, &agcval);
++	mb86a16_read(state, 0x26, &cnmval);
++	dprintk(verbose, MB86A16_INFO, 1, "AGC = %02x CNM = %02x", agcval, cnmval);
++
++	return ret;
++}
++
++static int mb86a16_send_diseqc_msg(struct dvb_frontend *fe,
++				   struct dvb_diseqc_master_cmd *cmd)
++{
++	struct mb86a16_state *state = fe->demodulator_priv;
++	int i;
++	u8 regs;
++
++	if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0)
++		goto err;
++
++	regs = 0x18;
++
++	if (cmd->msg_len > 5 || cmd->msg_len < 4)
++		return -EINVAL;
++
++	for (i = 0; i < cmd->msg_len; i++) {
++		if (mb86a16_write(state, regs, cmd->msg[i]) < 0)
++			goto err;
++
++		regs++;
++	}
++	i += 0x90;
++
++	msleep_interruptible(10);
++
++	if (mb86a16_write(state, MB86A16_DCC1, i) < 0)
++		goto err;
++	if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
++		goto err;
++
++	return 0;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int mb86a16_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst)
++{
++	struct mb86a16_state *state = fe->demodulator_priv;
++
++	switch (burst) {
++	case SEC_MINI_A:
++		if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
++						       MB86A16_DCC1_TBEN  |
++						       MB86A16_DCC1_TBO) < 0)
++			goto err;
++		if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
++			goto err;
++		break;
++	case SEC_MINI_B:
++		if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
++						       MB86A16_DCC1_TBEN) < 0)
++			goto err;
++		if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
++			goto err;
++		break;
++	}
++
++	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++static int mb86a16_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
++{
++	struct mb86a16_state *state = fe->demodulator_priv;
++
++	switch (tone) {
++	case SEC_TONE_ON:
++		if (mb86a16_write(state, MB86A16_TONEOUT2, 0x00) < 0)
++			goto err;
++		if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA |
++						       MB86A16_DCC1_CTOE) < 0)
++
++			goto err;
++		if (mb86a16_write(state, MB86A16_DCCOUT, MB86A16_DCCOUT_DISEN) < 0)
++			goto err;
++		break;
++	case SEC_TONE_OFF:
++		if (mb86a16_write(state, MB86A16_TONEOUT2, 0x04) < 0)
++			goto err;
++		if (mb86a16_write(state, MB86A16_DCC1, MB86A16_DCC1_DISTA) < 0)
++			goto err;
++		if (mb86a16_write(state, MB86A16_DCCOUT, 0x00) < 0)
++			goto err;
++		break;
++	default:
++		return -EINVAL;
++	}
++	return 0;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
++}
++
++#define MB86A16_FE_ALGO		1
++
++static int mb86a16_frontend_algo(struct dvb_frontend *fe)
++{
++	return MB86A16_FE_ALGO;
++}
++
++static int mb86a16_set_frontend(struct dvb_frontend *fe,
++				struct dvb_frontend_parameters *p,
++				unsigned int mode_flags,
++				int *delay,
++				fe_status_t *status)
++{
++	int ret = 0;
++	struct mb86a16_state *state = fe->demodulator_priv;
++
++	if (p != NULL) {
++		state->frequency = p->frequency / 1000;
++		state->srate = p->u.qpsk.symbol_rate / 1000;
++		ret = mb86a16_set_fe(state);
++	}
++	if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
++		mb86a16_read_status(fe, status);
++
++	*delay = HZ/3000;
++
++	return ret;
++}
++
++static void mb86a16_release(struct dvb_frontend *fe)
++{
++	struct mb86a16_state *state = fe->demodulator_priv;
++	kfree(state);
++}
++
++static int mb86a16_init(struct dvb_frontend *fe)
++{
++	return 0;
++}
++
++static int mb86a16_sleep(struct dvb_frontend *fe)
++{
++	return 0;
++}
++
++static int mb86a16_read_ber(struct dvb_frontend *fe, u32 *ber)
++{
++	return 0;
++}
++
++static int mb86a16_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
++{
++	*strength = 0;
++
++	return 0;
++}
++
++struct cnr {
++	u8 cn_reg;
++	u8 cn_val;
++};
++
++static const struct cnr cnr_tab[] = {
++	{  35,  2 },
++	{  40,  3 },
++	{  50,  4 },
++	{  60,  5 },
++	{  70,  6 },
++	{  80,  7 },
++	{  92,  8 },
++	{ 103,  9 },
++	{ 115, 10 },
++	{ 138, 12 },
++	{ 162, 15 },
++	{ 180, 18 },
++	{ 185, 19 },
++	{ 189, 20 },
++	{ 195, 22 },
++	{ 199, 24 },
++	{ 201, 25 },
++	{ 202, 26 },
++	{ 203, 27 },
++	{ 205, 28 },
++	{ 208, 30 }
++};
++
++static int mb86a16_read_snr(struct dvb_frontend *fe, u16 *snr)
++{
++	struct mb86a16_state *state = fe->demodulator_priv;
++	int i = 0;
++	int low_tide = 2, high_tide = 30, q_level;
++	u8  cn;
++
++	if (mb86a16_read(state, 0x26, &cn) != 2) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	for (i = 0; i < ARRAY_SIZE(cnr_tab); i++) {
++		if (cn < cnr_tab[i].cn_reg) {
++			*snr = cnr_tab[i].cn_val;
++			break;
++		}
++	}
++	q_level = (*snr * 100) / (high_tide - low_tide);
++	dprintk(verbose, MB86A16_ERROR, 1, "SNR (Quality) = [%d dB], Level=%d %%", *snr, q_level);
++
++	return 0;
++}
++
++static int mb86a16_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
++{
++	return 0;
++}
++
++static struct dvb_frontend_ops mb86a16_ops = {
++	.info = {
++		.name			= "Fujitsu MB86A16 DVB-S",
++		.type			= FE_QPSK,
++		.frequency_min		= 950000,
++		.frequency_max		= 2150000,
++		.frequency_stepsize	= 125,
++		.frequency_tolerance	= 0,
++		.symbol_rate_min	= 1000000,
++		.symbol_rate_max	= 45000000,
++		.symbol_rate_tolerance	= 500,
++		.caps			= FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
++					  FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 |
++					  FE_CAN_FEC_7_8 | FE_CAN_QPSK    |
++					  FE_CAN_FEC_AUTO
++	},
++	.release			= mb86a16_release,
++	.tune				= mb86a16_set_frontend,
++	.read_status			= mb86a16_read_status,
++	.get_frontend_algo		= mb86a16_frontend_algo,
++	.init				= mb86a16_init,
++	.sleep				= mb86a16_sleep,
++	.read_status			= mb86a16_read_status,
++
++	.read_ber			= mb86a16_read_ber,
++	.read_signal_strength		= mb86a16_read_signal_strength,
++	.read_snr			= mb86a16_read_snr,
++	.read_ucblocks			= mb86a16_read_ucblocks,
++
++	.diseqc_send_master_cmd		= mb86a16_send_diseqc_msg,
++	.diseqc_send_burst		= mb86a16_send_diseqc_burst,
++	.set_tone			= mb86a16_set_tone,
++};
++
++struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
++				    struct i2c_adapter *i2c_adap)
++{
++	u8 dev_id = 0;
++	struct mb86a16_state *state = NULL;
++
++	state = kmalloc(sizeof (struct mb86a16_state), GFP_KERNEL);
++	if (state == NULL)
++		goto error;
++
++	state->config = config;
++	state->i2c_adap = i2c_adap;
++
++	mb86a16_read(state, 0x7f, &dev_id);
++	if (dev_id != 0xfe)
++		goto error;
++
++	memcpy(&state->frontend.ops, &mb86a16_ops, sizeof (struct dvb_frontend_ops));
++	state->frontend.demodulator_priv = state;
++	state->frontend.ops.set_voltage = state->config->set_voltage;
++
++	return &state->frontend;
++error:
++	kfree(state);
++	return NULL;
++}
++EXPORT_SYMBOL(mb86a16_attach);
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Manu Abraham");
+diff --git a/drivers/media/dvb/frontends/mb86a16.h b/drivers/media/dvb/frontends/mb86a16.h
+new file mode 100644
+index 0000000..b7545d0
+--- /dev/null
++++ b/drivers/media/dvb/frontends/mb86a16.h
+@@ -0,0 +1,38 @@
++/*
++	Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MB86A16_H
++#define __MB86A16_H
++
++#include <linux/dvb/frontend.h>
++#include "dvb_frontend.h"
++
++
++struct mb86a16_config {
++	u8 demod_address;
++
++	int (*set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
++};
++
++extern struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
++					   struct i2c_adapter *i2c_adap);
++
++
++#endif //__MB86A16_H
+diff --git a/drivers/media/dvb/frontends/mb86a16_priv.h b/drivers/media/dvb/frontends/mb86a16_priv.h
+new file mode 100644
+index 0000000..5de5700
+--- /dev/null
++++ b/drivers/media/dvb/frontends/mb86a16_priv.h
+@@ -0,0 +1,151 @@
++/*
++	Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MB86A16_PRIV_H
++#define __MB86A16_PRIV_H
++
++#define MB86A16_TSOUT		0x00
++#define MB86A16_TSOUT_HIZSEL	(0x01 << 5)
++#define MB86A16_TSOUT_HIZCNTI	(0x01 << 4)
++#define MB86A16_TSOUT_MODE	(0x01 << 3)
++#define MB86A16_TSOUT_ORDER	(0x01 << 2)
++#define MB86A16_TSOUT_ERROR	(0x01 << 1)
++#define Mb86A16_TSOUT_EDGE	(0x01 << 0)
++
++#define MB86A16_FEC		0x01
++#define MB86A16_FEC_FSYNC	(0x01 << 5)
++#define MB86A16_FEC_PCKB8	(0x01 << 4)
++#define MB86A16_FEC_DVDS	(0x01 << 3)
++#define MB86A16_FEC_EREN	(0x01 << 2)
++#define Mb86A16_FEC_RSEN	(0x01 << 1)
++#define MB86A16_FEC_DIEN	(0x01 << 0)
++
++#define MB86A16_AGC		0x02
++#define MB86A16_AGC_AGMD	(0x01 << 6)
++#define MB86A16_AGC_AGCW	(0x0f << 2)
++#define MB86A16_AGC_AGCP	(0x01 << 1)
++#define MB86A16_AGC_AGCR	(0x01 << 0)
++
++#define MB86A16_SRATE1		0x03
++#define MB86A16_SRATE1_DECI	(0x07 << 2)
++#define MB86A16_SRATE1_CSEL	(0x01 << 1)
++#define MB86A16_SRATE1_RSEL	(0x01 << 0)
++
++#define MB86A16_SRATE2		0x04
++#define MB86A16_SRATE2_STOFSL	(0xff << 0)
++
++#define MB86A16_SRATE3		0x05
++#define MB86A16_SRATE2_STOFSH	(0xff << 0)
++
++#define MB86A16_VITERBI		0x06
++#define MB86A16_FRAMESYNC	0x07
++#define MB86A16_CRLFILTCOEF1	0x08
++#define MB86A16_CRLFILTCOEF2	0x09
++#define MB86A16_STRFILTCOEF1	0x0a
++#define MB86A16_STRFILTCOEF2	0x0b
++#define MB86A16_RESET		0x0c
++#define MB86A16_STATUS		0x0d
++#define MB86A16_AFCML		0x0e
++#define MB86A16_AFCMH		0x0f
++#define MB86A16_BERMON		0x10
++#define MB86A16_BERTAB		0x11
++#define MB86A16_BERLSB		0x12
++#define MB86A16_BERMID		0x13
++#define MB86A16_BERMSB		0x14
++#define MB86A16_AGCM		0x15
++
++#define MB86A16_DCC1		0x16
++#define MB86A16_DCC1_DISTA	(0x01 << 7)
++#define MB86A16_DCC1_PRTY	(0x01 << 6)
++#define MB86A16_DCC1_CTOE	(0x01 << 5)
++#define MB86A16_DCC1_TBEN	(0x01 << 4)
++#define MB86A16_DCC1_TBO	(0x01 << 3)
++#define MB86A16_DCC1_NUM	(0x07 << 0)
++
++#define MB86A16_DCC2		0x17
++#define MB86A16_DCC2_DCBST	(0x01 << 0)
++
++#define MB86A16_DCC3		0x18
++#define MB86A16_DCC3_CODE0	(0xff << 0)
++
++#define MB86A16_DCC4		0x19
++#define MB86A16_DCC4_CODE1	(0xff << 0)
++
++#define MB86A16_DCC5		0x1a
++#define MB86A16_DCC5_CODE2	(0xff << 0)
++
++#define MB86A16_DCC6		0x1b
++#define MB86A16_DCC6_CODE3	(0xff << 0)
++
++#define MB86A16_DCC7		0x1c
++#define MB86A16_DCC7_CODE4	(0xff << 0)
++
++#define MB86A16_DCC8		0x1d
++#define MB86A16_DCC8_CODE5	(0xff << 0)
++
++#define MB86A16_DCCOUT		0x1e
++#define MB86A16_DCCOUT_DISEN	(0x01 << 0)
++
++#define MB86A16_TONEOUT1	0x1f
++#define MB86A16_TONE_TDIVL	(0xff << 0)
++
++#define MB86A16_TONEOUT2	0x20
++#define MB86A16_TONE_TMD	(0x03 << 2)
++#define MB86A16_TONE_TDIVH	(0x03 << 0)
++
++#define MB86A16_FREQ1		0x21
++#define MB86A16_FREQ2		0x22
++#define MB86A16_FREQ3		0x23
++#define MB86A16_FREQ4		0x24
++#define MB86A16_FREQSET		0x25
++#define MB86A16_CNM		0x26
++#define MB86A16_PORT0		0x27
++#define MB86A16_PORT1		0x28
++#define MB86A16_DRCFILT		0x29
++#define MB86A16_AFC		0x2a
++#define MB86A16_AFCEXL		0x2b
++#define MB86A16_AFCEXH		0x2c
++#define MB86A16_DAGC		0x2d
++#define MB86A16_SEQMODE		0x32
++#define MB86A16_S0S1T		0x33
++#define MB86A16_S2S3T		0x34
++#define MB86A16_S4S5T		0x35
++#define MB86A16_CNTMR		0x36
++#define MB86A16_SIG1		0x37
++#define MB86A16_SIG2		0x38
++#define MB86A16_VIMAG		0x39
++#define MB86A16_VISET1		0x3a
++#define MB86A16_VISET2		0x3b
++#define MB86A16_VISET3		0x3c
++#define MB86A16_FAGCS1		0x3d
++#define MB86A16_FAGCS2		0x3e
++#define MB86A16_FAGCS3		0x3f
++#define MB86A16_FAGCS4		0x40
++#define MB86A16_FAGCS5		0x41
++#define MB86A16_FAGCS6		0x42
++#define MB86A16_CRM		0x43
++#define MB86A16_STRM		0x44
++#define MB86A16_DAGCML		0x45
++#define MB86A16_DAGCMH		0x46
++#define MB86A16_QPSKTST		0x49
++#define MB86A16_DISTMON		0x52
++#define MB86A16_VERSION		0x7f
++
++#endif //__MB86A16_PRIV_H
+diff --git a/drivers/media/dvb/mantis/Kconfig b/drivers/media/dvb/mantis/Kconfig
+new file mode 100644
+index 0000000..4ba16d0
+--- /dev/null
++++ b/drivers/media/dvb/mantis/Kconfig
+@@ -0,0 +1,13 @@
++config DVB_MANTIS
++	tristate "MANTIS based cards"
++	depends on DVB_CORE && PCI && I2C
++	select DVB_MB86A16
++	select DVB_CU1216
++	select DVB_ZL10353
++	select DVB_STV0299
++	select DVB_PLL
++	help
++	  Support for PCI cards based on the Mantis PCI bridge.
++	  Say Y when you have a Mantis based DVB card and want to use it.
++
++	  If unsure say N.
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+new file mode 100644
+index 0000000..a980ff2
+--- /dev/null
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -0,0 +1,7 @@
++mantis-objs = mantis_core.o mantis_dma.o mantis_pci.o mantis_i2c.o	\
++	mantis_dvb.o mantis_vp1033.o mantis_vp1034.o mantis_vp2033.o	\
++	mantis_vp3030.o
++
++obj-$(CONFIG_DVB_MANTIS) += mantis.o
++
++EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+new file mode 100644
+index 0000000..ba360f8
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -0,0 +1,135 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_COMMON_H
++#define __MANTIS_COMMON_H
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/pci.h>
++
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dmxdev.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++#include <linux/i2c.h>
++#include "mantis_reg.h"
++
++#define MANTIS_ERROR		0
++#define MANTIS_NOTICE		1
++#define MANTIS_INFO		2
++#define MANTIS_DEBUG		3
++
++#define dprintk(x, y, z, format, arg...) do {								\
++	if (z) {											\
++		if	((x > MANTIS_ERROR) && (x > y))							\
++			printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
++		else if	((x > MANTIS_NOTICE) && (x > y))						\
++			printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
++		else if ((x > MANTIS_INFO) && (x > y))							\
++			printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
++		else if ((x > MANTIS_DEBUG) && (x > y))							\
++			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
++	} else {											\
++		if (x > y)										\
++			printk(format , ##arg);								\
++	}												\
++} while(0)
++
++#define mwrite(dat, addr)	writel((dat), addr)
++#define mread(addr)		readl(addr)
++
++#define mmwrite(dat, addr)	mwrite((dat), (mantis->mantis_mmio + (addr)))
++#define mmread(addr)		mread(mantis->mantis_mmio + (addr))
++#define mmand(dat, addr)	mmwrite((dat) & mmread(addr), addr)
++#define mmor(dat, addr)		mmwrite((dat) | mmread(addr), addr)
++#define mmaor(dat, addr)	mmwrite((dat) | ((mask) & mmread(addr)), addr)
++
++
++struct mantis_pci {
++	/*	PCI stuff		*/
++	u16			vendor_id;
++	u16			device_id;
++	u8			latency;
++
++	struct			pci_dev *pdev;
++
++	unsigned long		mantis_addr;
++	volatile void __iomem 	*mantis_mmio;
++
++	u8			irq;
++	u8			revision;
++
++	unsigned int		num;
++	u16			ts_size;
++
++	/*	RISC Core		*/
++	u32			finished_block;
++	u32			last_block;
++	u32			line_bytes;
++	u32			line_count;
++	u32			risc_pos;
++	u8			*buf_cpu;
++	dma_addr_t		buf_dma;
++	u32			*risc_cpu;
++	dma_addr_t		risc_dma;
++
++	struct tasklet_struct	tasklet;
++
++	struct i2c_adapter	adapter;
++	int			i2c_rc;
++	wait_queue_head_t	i2c_wq;
++
++	/*	DVB stuff		*/
++	struct dvb_adapter	dvb_adapter;
++	struct dvb_frontend	*fe;
++	struct dvb_demux	demux;
++	struct dmxdev		dmxdev;
++	struct dmx_frontend	fe_hw;
++	struct dmx_frontend	fe_mem;
++	struct dvb_net		dvbnet;
++
++	u8			feeds;
++
++	struct mantis_config	*config;
++
++	u32 			mantis_int_stat;
++	u32 			mantis_int_mask;
++
++	/*	board specific		*/
++	u8			mac_address[8];
++	u32			sub_vendor_id;
++	u32			sub_device_id;
++
++	 /*	A12 A13 A14		*/
++	int			gpio_status;};
++
++extern unsigned int verbose;
++extern unsigned int devs;
++extern unsigned int i2c;
++extern int mantis_dvb_init(struct mantis_pci *mantis);
++extern int mantis_frontend_init(struct mantis_pci *mantis);
++extern int mantis_dvb_exit(struct mantis_pci *mantis);
++extern void mantis_dma_xfer(unsigned long data);
++extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
++
++#endif //__MANTIS_COMMON_H
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+new file mode 100644
+index 0000000..1112277
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -0,0 +1,215 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_core.h"
++
++
++static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
++{
++	int err;
++	struct i2c_msg msg[] = {
++		{
++			.addr = 0x50,
++			.flags = 0,
++			.buf = data,
++			.len = 1
++		},{
++			.addr = 0x50,
++			.flags = I2C_M_RD,
++			.buf = data,
++			.len = length
++		},
++	};
++	if ((err = i2c_transfer(&mantis->adapter, msg, 2)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"ERROR: i2c read: < err=%i d0=0x%02x d1=0x%02x >",
++			err, data[0], data[1]);
++
++		return err;
++	}
++	msleep_interruptible(2);
++
++	return 0;
++}
++
++static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
++{
++	int err;
++
++	struct i2c_msg msg = {
++		.addr = 0x50,
++		.flags = 0,
++		.buf = data,
++		.len = length
++	};
++
++	if ((err = i2c_transfer(&mantis->adapter, &msg, 1)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"ERROR: i2c write: < err=%i length=0x%02x d0=0x%02x, d1=0x%02x >",
++			err, length, data[0], data[1]);
++
++		return err;
++	}
++
++	return 0;
++}
++
++static int get_subdevice_id(struct mantis_pci *mantis)
++{
++	int err;
++	static u8 sub_device_id[2];
++
++	mantis->sub_device_id = 0;
++	sub_device_id[0] = 0xfc;
++	if ((err = read_eeprom_byte(mantis, &sub_device_id[0], 2)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
++		return err;
++	}
++	mantis->sub_device_id = (sub_device_id[0] << 8) | sub_device_id[1];
++	dprintk(verbose, MANTIS_ERROR, 1, "Sub Device ID=[0x%04x]",
++		mantis->sub_device_id);
++
++	return 0;
++}
++
++static int get_subvendor_id(struct mantis_pci *mantis)
++{
++	int err;
++	static u8 sub_vendor_id[2];
++
++	mantis->sub_vendor_id = 0;
++	sub_vendor_id[0] = 0xfe;
++	if ((err = read_eeprom_byte(mantis, &sub_vendor_id[0], 2)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
++		return err;
++	}
++	mantis->sub_vendor_id = (sub_vendor_id[0] << 8) | sub_vendor_id[1];
++	dprintk(verbose, MANTIS_ERROR, 1, "Sub Vendor ID=[0x%04x]",
++		mantis->sub_vendor_id);
++
++	return 0;
++}
++
++static int get_mac_address(struct mantis_pci *mantis)
++{
++	int err;
++
++	mantis->mac_address[0] = 0x08;
++	if ((err = read_eeprom_byte(mantis, &mantis->mac_address[0], 6)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
++
++		return err;
++	}
++	dprintk(verbose, MANTIS_ERROR, 1,
++		"MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]",
++		mantis->mac_address[0], mantis->mac_address[1],
++		mantis->mac_address[2],	mantis->mac_address[3],
++		mantis->mac_address[4], mantis->mac_address[5]);
++
++	return 0;
++}
++
++
++int mantis_core_init(struct mantis_pci *mantis)
++{
++	int err = 0;
++
++	if ((err = mantis_i2c_init(mantis)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis I2C init failed");
++		return err;
++	}
++	if ((err = get_mac_address(mantis)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "get MAC address failed");
++		return err;
++	}
++	if ((err = get_subvendor_id(mantis)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "get Sub vendor ID failed");
++		return err;
++	}
++	if ((err = get_subdevice_id(mantis)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "get Sub device ID failed");
++		return err;
++	}
++	if ((err = mantis_dma_init(mantis)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis DMA init failed");
++		return err;
++	}
++	if ((err = mantis_dvb_init(mantis)) < 0) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB init failed");
++		return err;
++	}
++
++	return 0;
++}
++
++int mantis_core_exit(struct mantis_pci *mantis)
++{
++
++	mantis_dma_stop(mantis);
++	dprintk(verbose, MANTIS_ERROR, 1, "DMA engine stopping");
++	if (mantis_dma_exit(mantis) < 0)
++		dprintk(verbose, MANTIS_ERROR, 1, "DMA exit failed");
++	if (mantis_dvb_exit(mantis) < 0)
++		dprintk(verbose, MANTIS_ERROR, 1, "DVB exit failed");
++	if (mantis_i2c_exit(mantis) < 0)
++		dprintk(verbose, MANTIS_ERROR, 1, "I2C adapter delete.. failed");
++
++	return 0;
++}
++
++void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
++{
++	u32 reg;
++
++	if (value)
++		reg = 0x0000;
++	else
++		reg = 0xffff;
++
++	reg = (value << bitpos);
++
++	mmwrite(mmread(MANTIS_GPIF_ADDR) | reg, MANTIS_GPIF_ADDR);
++	mmwrite(0x00, MANTIS_GPIF_DOUT);
++	udelay(100);
++	mmwrite(mmread(MANTIS_GPIF_ADDR) | reg, MANTIS_GPIF_ADDR);
++	mmwrite(0x00, MANTIS_GPIF_DOUT);
++}
++
++
++//direction = 0 , no CI passthrough ; 1 , CI passthrough
++void mantis_set_direction(struct mantis_pci *mantis, int direction)
++{
++	u32 reg;
++
++	reg = mmread(0x28);
++	dprintk(verbose, MANTIS_DEBUG, 1, "TS direction setup");
++	if (direction == 0x01) { //to CI
++		reg |= 0x04;
++		mmwrite(reg, 0x28);
++		reg &= 0xff - 0x04;
++		mmwrite(reg, 0x28);
++	} else {
++		reg &= 0xff - 0x04;
++		mmwrite(reg, 0x28);
++		reg |= 0x04;
++		mmwrite(reg, 0x28);
++	}
++}
+diff --git a/drivers/media/dvb/mantis/mantis_core.h b/drivers/media/dvb/mantis/mantis_core.h
+new file mode 100644
+index 0000000..31b2a75
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_core.h
+@@ -0,0 +1,61 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_CORE_H
++#define __MANTIS_CORE_H
++
++#include "mantis_common.h"
++
++
++#define FE_TYPE_SAT	0
++#define FE_TYPE_CAB	1
++#define FE_TYPE_TER	2
++
++#define FE_TYPE_TS204	0
++#define FE_TYPE_TS188	1
++
++
++struct vendorname {
++	__u8  *sub_vendor_name;
++	__u32 sub_vendor_id;
++};
++
++struct devicetype {
++	__u8  *sub_device_name;
++	__u32 sub_device_id;
++	__u8  device_type;
++	__u32 type_flags;
++};
++
++
++extern int mantis_dma_init(struct mantis_pci *mantis);
++extern int mantis_dma_exit(struct mantis_pci *mantis);
++extern void mantis_dma_start(struct mantis_pci *mantis);
++extern void mantis_dma_stop(struct mantis_pci *mantis);
++extern int mantis_i2c_init(struct mantis_pci *mantis);
++extern int mantis_i2c_exit(struct mantis_pci *mantis);
++extern int mantis_core_init(struct mantis_pci *mantis);
++extern int mantis_core_exit(struct mantis_pci *mantis);
++//extern void mantis_fe_powerup(struct mantis_pci *mantis);
++//extern void mantis_fe_powerdown(struct mantis_pci *mantis);
++//extern void mantis_fe_reset(struct dvb_frontend *fe);
++extern void mantis_set_direction(struct mantis_pci *mantis, int direction);
++
++#endif //__MANTIS_CORE_H
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+new file mode 100644
+index 0000000..9e3aa5e
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -0,0 +1,238 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <asm/page.h>
++#include <linux/vmalloc.h>
++#include "mantis_common.h"
++
++#define RISC_WRITE		(0x01 << 28)
++#define RISC_JUMP		(0x07 << 28)
++#define RISC_IRQ		(0x01 << 24)
++
++#define RISC_STATUS(status)	((((~status) & 0x0f) << 20) | ((status & 0x0f) << 16))
++#define RISC_FLUSH()		mantis->risc_pos = 0
++#define RISC_INSTR(opcode)	mantis->risc_cpu[mantis->risc_pos++] = cpu_to_le32(opcode)
++
++#define MANTIS_BUF_SIZE		64 * 1024
++#define MANTIS_BLOCK_BYTES	(MANTIS_BUF_SIZE >> 4)
++#define MANTIS_BLOCK_COUNT	(1 << 4)
++#define MANTIS_RISC_SIZE	PAGE_SIZE
++
++int mantis_dma_exit(struct mantis_pci *mantis)
++{
++	if (mantis->buf_cpu) {
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"DMA=0x%lx cpu=0x%p size=%d",
++			(unsigned long) mantis->buf_dma,
++			 mantis->buf_cpu,
++			 MANTIS_BUF_SIZE);
++
++		pci_free_consistent(mantis->pdev, MANTIS_BUF_SIZE,
++				    mantis->buf_cpu, mantis->buf_dma);
++
++		mantis->buf_cpu = NULL;
++	}
++	if (mantis->risc_cpu) {
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"RISC=0x%lx cpu=0x%p size=%lx",
++			(unsigned long) mantis->risc_dma,
++			mantis->risc_cpu,
++			MANTIS_RISC_SIZE);
++
++		pci_free_consistent(mantis->pdev, MANTIS_RISC_SIZE,
++				    mantis->risc_cpu, mantis->risc_dma);
++
++		mantis->risc_cpu = NULL;
++	}
++
++	return 0;
++}
++
++static inline int mantis_alloc_buffers(struct mantis_pci *mantis)
++{
++	if (!mantis->buf_cpu) {
++		mantis->buf_cpu = pci_alloc_consistent(mantis->pdev,
++						       MANTIS_BUF_SIZE,
++						       &mantis->buf_dma);
++		if (!mantis->buf_cpu) {
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"DMA buffer allocation failed");
++
++			goto err;
++		}
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"DMA=0x%lx cpu=0x%p size=%d",
++			(unsigned long) mantis->buf_dma,
++			mantis->buf_cpu, MANTIS_BUF_SIZE);
++	}
++	if (!mantis->risc_cpu) {
++		mantis->risc_cpu = pci_alloc_consistent(mantis->pdev,
++							MANTIS_RISC_SIZE,
++							&mantis->risc_dma);
++
++		if (!mantis->risc_cpu) {
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"RISC program allocation failed");
++
++			mantis_dma_exit(mantis);
++
++			goto err;
++		}
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"RISC=0x%lx cpu=0x%p size=%lx",
++			(unsigned long) mantis->risc_dma,
++			mantis->risc_cpu, MANTIS_RISC_SIZE);
++	}
++
++	return 0;
++err:
++	dprintk(verbose, MANTIS_ERROR, 1, "Out of memory (?) .....");
++	return -ENOMEM;
++}
++
++static inline int mantis_calc_lines(struct mantis_pci *mantis)
++{
++	mantis->line_bytes = MANTIS_BLOCK_BYTES;
++	mantis->line_count = MANTIS_BLOCK_COUNT;
++
++	while (mantis->line_bytes > 4095) {
++		mantis->line_bytes >>= 1;
++		mantis->line_count <<= 1;
++	}
++
++	dprintk(verbose, MANTIS_DEBUG, 1,
++		"Mantis RISC block bytes=[%d], line bytes=[%d], line count=[%d]",
++		MANTIS_BLOCK_BYTES, mantis->line_bytes, mantis->line_count);
++
++	if (mantis->line_count > 255) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Buffer size error");
++		return -EINVAL;
++	}
++
++	return 0;
++}
++
++int mantis_dma_init(struct mantis_pci *mantis)
++{
++	int err = 0;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DMA init");
++	if (mantis_alloc_buffers(mantis) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Error allocating DMA buffer");
++
++		// Stop RISC Engine
++//		mmwrite(mmread(MANTIS_DMA_CTL) & ~MANTIS_RISC_EN, MANTIS_DMA_CTL);
++		mmwrite(0, MANTIS_DMA_CTL);
++
++		goto err;
++	}
++	if ((err = mantis_calc_lines(mantis)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis calc lines failed");
++
++		goto err;
++	}
++
++	return 0;
++err:
++	return err;
++}
++
++
++
++static inline void mantis_risc_program(struct mantis_pci *mantis)
++{
++	u32 buf_pos = 0;
++	u32 line;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis create RISC program");
++	RISC_FLUSH();
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "risc len lines %u, bytes per line %u",
++		mantis->line_count, mantis->line_bytes);
++
++	for (line = 0; line < mantis->line_count; line++) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "RISC PROG line=[%d]", line);
++		if (!(buf_pos % MANTIS_BLOCK_BYTES)) {
++			RISC_INSTR(RISC_WRITE	|
++				   RISC_IRQ	|
++				   RISC_STATUS(((buf_pos / MANTIS_BLOCK_BYTES) +
++				   (MANTIS_BLOCK_COUNT - 1)) %
++				    MANTIS_BLOCK_COUNT) |
++				    mantis->line_bytes);
++		} else {
++			RISC_INSTR(RISC_WRITE	| mantis->line_bytes);
++		}
++		RISC_INSTR(mantis->buf_dma + buf_pos);
++		buf_pos += mantis->line_bytes;
++	}
++	RISC_INSTR(RISC_JUMP);
++	RISC_INSTR(mantis->risc_dma);
++}
++
++void mantis_dma_start(struct mantis_pci *mantis)
++{
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Start DMA engine");
++
++	mantis_risc_program(mantis);
++	mmwrite(cpu_to_le32(mantis->risc_dma), MANTIS_RISC_START);
++	mmwrite(MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
++
++	mmwrite(0, MANTIS_DMA_CTL);
++	mantis->last_block = mantis->finished_block = 0;
++
++	mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_RISCI, MANTIS_INT_MASK);
++
++	mmwrite(MANTIS_FIFO_EN | MANTIS_DCAP_EN
++			       | MANTIS_RISC_EN, MANTIS_DMA_CTL);
++
++}
++
++void mantis_dma_stop(struct mantis_pci *mantis)
++{
++	u32 stat = 0, mask = 0;
++
++	stat = mmread(MANTIS_INT_STAT);
++	mask = mmread(MANTIS_INT_MASK);
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Stop DMA engine");
++
++	mmwrite((mmread(MANTIS_DMA_CTL) & ~(MANTIS_FIFO_EN |
++					    MANTIS_DCAP_EN |
++					    MANTIS_RISC_EN)), MANTIS_DMA_CTL);
++
++	mmwrite(mmread(MANTIS_INT_STAT), MANTIS_INT_STAT);
++
++	mmwrite(mmread(MANTIS_INT_MASK) & ~(MANTIS_INT_RISCI |
++					    MANTIS_INT_RISCEN), MANTIS_INT_MASK);
++}
++
++
++void mantis_dma_xfer(unsigned long data)
++{
++	struct mantis_pci *mantis = (struct mantis_pci *) data;
++
++	while (mantis->last_block != mantis->finished_block) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "last block=[%d] finished block=[%d]",
++			mantis->last_block, mantis->finished_block);
++
++		(mantis->ts_size ? dvb_dmx_swfilter_204: dvb_dmx_swfilter)
++		(&mantis->demux, &mantis->buf_cpu[mantis->last_block * MANTIS_BLOCK_BYTES], MANTIS_BLOCK_BYTES);
++		mantis->last_block = (mantis->last_block + 1) % MANTIS_BLOCK_COUNT;
++	}
++}
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+new file mode 100644
+index 0000000..5830d4a
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -0,0 +1,304 @@
++/*
++	Mantis PCI bridge driver
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <linux/bitops.h>
++#include "mantis_common.h"
++#include "mantis_core.h"
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "mantis_vp1033.h"
++#include "mantis_vp1034.h"
++#include "mantis_vp2033.h"
++#include "mantis_vp3030.h"
++
++/*	Tuner power supply control	*/
++void mantis_fe_powerup(struct mantis_pci *mantis)
++{
++	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Power ON");
++	gpio_set_bits(mantis, 0x0c, 1);
++	msleep_interruptible(100);
++	gpio_set_bits(mantis, 0x0c, 1);
++	msleep_interruptible(100);
++}
++
++void mantis_fe_powerdown(struct mantis_pci *mantis)
++{
++	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Power OFF");
++	gpio_set_bits(mantis, 0x0c, 0);
++}
++
++static int mantis_fe_reset(struct dvb_frontend *fe)
++{
++	struct mantis_pci *mantis = fe->dvb->priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Reset");
++	gpio_set_bits(mantis, 13, 0);
++	msleep_interruptible(100);
++	gpio_set_bits(mantis, 13, 0);
++	msleep_interruptible(100);
++	gpio_set_bits(mantis, 13, 1);
++	msleep_interruptible(100);
++	gpio_set_bits(mantis, 13, 1);
++
++	return 0;
++}
++
++static int mantis_frontend_reset(struct mantis_pci *mantis)
++{
++	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Reset");
++	gpio_set_bits(mantis, 13, 0);
++	msleep_interruptible(100);
++	gpio_set_bits(mantis, 13, 0);
++	msleep_interruptible(100);
++	gpio_set_bits(mantis, 13, 1);
++	msleep_interruptible(100);
++	gpio_set_bits(mantis, 13, 1);
++
++	return 0;
++}
++
++static int mantis_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++	struct mantis_pci *mantis = dvbdmx->priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB Start feed");
++	if (!dvbdmx->dmx.frontend) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "no frontend ?");
++		return -EINVAL;
++	}
++	mantis->feeds++;
++	dprintk(verbose, MANTIS_DEBUG, 1,
++		"mantis start feed, feeds=%d",
++		mantis->feeds);
++
++	if (mantis->feeds == 1)	 {
++		dprintk(verbose, MANTIS_DEBUG, 1, "mantis start feed & dma");
++		printk("mantis start feed & dma\n");
++		mantis_dma_start(mantis);
++	}
++
++	return mantis->feeds;
++}
++
++static int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
++{
++	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
++	struct mantis_pci *mantis = dvbdmx->priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB Stop feed");
++	if (!dvbdmx->dmx.frontend) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "no frontend ?");
++		return -EINVAL;
++	}
++	mantis->feeds--;
++	if (mantis->feeds == 0) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "mantis stop feed and dma");
++		printk("mantis stop feed and dma\n");
++		mantis_dma_stop(mantis);
++	}
++	return 0;
++}
++
++int __devinit mantis_dvb_init(struct mantis_pci *mantis)
++{
++	int result;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_register_adapter");
++	if (dvb_register_adapter(&mantis->dvb_adapter,
++				 "Mantis dvb adapter", THIS_MODULE,
++				 &mantis->pdev->dev) < 0) {
++
++		dprintk(verbose, MANTIS_ERROR, 1, "Error registering adapter");
++		return -ENODEV;
++	}
++	mantis->dvb_adapter.priv = mantis;
++	mantis->demux.dmx.capabilities = DMX_TS_FILTERING	|
++					 DMX_SECTION_FILTERING	|
++					 DMX_MEMORY_BASED_FILTERING;
++
++	mantis->demux.priv = mantis;
++	mantis->demux.filternum = 256;
++	mantis->demux.feednum = 256;
++	mantis->demux.start_feed = mantis_dvb_start_feed;
++	mantis->demux.stop_feed = mantis_dvb_stop_feed;
++	mantis->demux.write_to_decoder = NULL;
++	mantis->ts_size = 1; //188
++	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_dmx_init");
++	if ((result = dvb_dmx_init(&mantis->demux)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"dvb_dmx_init failed, ERROR=%d", result);
++
++		goto err0;
++	}
++	mantis->dmxdev.filternum = 256;
++	mantis->dmxdev.demux = &mantis->demux.dmx;
++	mantis->dmxdev.capabilities = 0;
++	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_dmxdev_init");
++	if ((result = dvb_dmxdev_init(&mantis->dmxdev,
++				      &mantis->dvb_adapter)) < 0) {
++
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"dvb_dmxdev_init failed, ERROR=%d", result);
++		goto err1;
++	}
++	mantis->fe_hw.source = DMX_FRONTEND_0;
++	if ((result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx,
++						     &mantis->fe_hw)) < 0) {
++
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"dvb_dmx_init failed, ERROR=%d", result);
++
++		goto err2;
++	}
++	mantis->fe_mem.source = DMX_MEMORY_FE;
++	if ((result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx,
++						     &mantis->fe_mem)) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"dvb_dmx_init failed, ERROR=%d", result);
++
++		goto err3;
++	}
++	if ((result = mantis->demux.dmx.connect_frontend(&mantis->demux.dmx,
++							 &mantis->fe_hw)) < 0) {
++
++		dprintk(verbose, MANTIS_ERROR, 1,
++			"dvb_dmx_init failed, ERROR=%d", result);
++
++		goto err4;
++	}
++	dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx);
++	tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis);
++	mantis_frontend_init(mantis);
++	return 0;
++
++	/*	Error conditions ..	*/
++err4:
++	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
++err3:
++	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
++err2:
++	dvb_dmxdev_release(&mantis->dmxdev);
++err1:
++	dvb_dmx_release(&mantis->demux);
++err0:
++	dvb_unregister_adapter(&mantis->dvb_adapter);
++
++	return result;
++}
++
++#define MANTIS_VP_1027_DVB_S	0x0013
++#define MANTIS_VP_1033_DVB_S	0x0016
++#define MANTIS_VP_1034_DVB_S	0x0014
++#define MANTIS_VP_1040_DVB_S2
++#define MANTIS_VP_1041_DVB_S2
++#define MANTIS_VP_2033_DVB_C	0x0008
++#define MANTIS_VP_3024_DVB_T	0x0009
++#define MANTIS_VP_3030_DVB_T	0x0024
++
++int __devinit mantis_frontend_init(struct mantis_pci *mantis)
++{
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis frontend Init");
++	mantis_fe_powerup(mantis);
++	mantis_frontend_reset(mantis);
++	dprintk(verbose, MANTIS_DEBUG, 1, "Device ID=%02x", mantis->sub_device_id);
++	switch (mantis->sub_device_id) {
++	case MANTIS_VP_1033_DVB_S:	// VP-1033
++		dprintk(verbose, MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
++		mantis->fe = stv0299_attach(&lgtdqcs001f_config,
++					    &mantis->adapter);
++
++		if (mantis->fe) {
++			mantis->fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set;
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"found STV0299 DVB-S frontend @ 0x%02x",
++				lgtdqcs001f_config.demod_address);
++
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"Mantis DVB-S STV0299 frontend attach success");
++		}
++		break;
++	case MANTIS_VP_1034_DVB_S:	// VP-1034
++		dprintk(verbose, MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
++		mantis->fe = mb86a16_attach(&vp1034_config, &mantis->adapter);
++		if (mantis->fe) {
++			dprintk(verbose, MANTIS_ERROR, 1,
++			"found MB86A16 DVB-S/DSS frontend @0x%02x",
++			vp1034_config.demod_address);
++
++		}
++		break;
++	case MANTIS_VP_2033_DVB_C:	// VP-2033
++		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
++		mantis->fe = cu1216_attach(&philips_cu1216_config, &mantis->adapter);
++		if (mantis->fe) {
++			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"found Philips CU1216 DVB-C frontend @ 0x%02x",
++				philips_cu1216_config.demod_address);
++
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"Mantis DVB-C Philips CU1216 frontend attach success");
++
++		}
++		break;
++	default:
++		dprintk(verbose, MANTIS_DEBUG, 1, "Unknown frontend:[0x%02x]",
++			mantis->sub_device_id);
++
++		return -ENODEV;
++	}
++	if (mantis->fe == NULL) {
++		dprintk(verbose, MANTIS_ERROR, 1, "!!! NO Frontends found !!!");
++		return -ENODEV;
++	} else {
++		if (dvb_register_frontend(&mantis->dvb_adapter, mantis->fe)) {
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"ERROR: Frontend registration failed");
++
++			if (mantis->fe->ops.release)
++				mantis->fe->ops.release(mantis->fe);
++
++			mantis->fe = NULL;
++			return -ENODEV;
++		}
++	}
++
++	return 0;
++}
++
++int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
++{
++	tasklet_kill(&mantis->tasklet);
++	dvb_net_release(&mantis->dvbnet);
++	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
++	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
++	dvb_dmxdev_release(&mantis->dmxdev);
++	dvb_dmx_release(&mantis->demux);
++
++	if (mantis->fe)
++		dvb_unregister_frontend(mantis->fe);
++	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_unregister_adapter");
++	dvb_unregister_adapter(&mantis->dvb_adapter);
++
++	return 0;
++}
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+new file mode 100644
+index 0000000..cfecb34
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -0,0 +1,189 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <asm/io.h>
++#include <linux/ioport.h>
++#include <asm/pgtable.h>
++#include <asm/page.h>
++#include "mantis_common.h"
++
++#define I2C_HW_B_MANTIS		0x1c
++
++static int mantis_ack_wait(struct mantis_pci *mantis)
++{
++	int rc = 0;
++
++	if (wait_event_interruptible_timeout(mantis->i2c_wq,
++					     mantis->mantis_int_stat & MANTIS_INT_I2CRACK,
++					     msecs_to_jiffies(50)) == -ERESTARTSYS)
++
++		rc = -EREMOTEIO;
++/*
++	// Wait till we are done
++	while (mantis->mantis_int_stat & MANTIS_INT_I2CRACK){
++		if (mantis->mantis_int_stat & MANTIS_INT_I2CDONE) {
++			mantis->mantis_int_stat &= ~MANTIS_INT_I2CRACK;
++//			dprintk(verbose, MANTIS_DEBUG, 1, "SLAVE RACK 'ed .. Waiting for I2CDONE");
++			break;
++		}
++	}
++
++	if (mantis->mantis_int_stat & MANTIS_INT_I2CDONE) {
++//		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Int I2CDONE");
++		rc = 1;
++	}
++
++	mantis->mantis_int_stat &= ~MANTIS_INT_I2CDONE;
++*/
++	// ..
++	if (mantis->mantis_int_stat & MANTIS_INT_I2CRACK)
++		msleep_interruptible(10);
++
++	return rc;
++}
++
++static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
++{
++	u32 rxd, i;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Address=[0x%02x]", msg->addr);
++	for (i = 0; i < msg->len; i++) {
++		rxd = (msg->addr << 25) | (1 << 24)
++					| MANTIS_I2C_RATE_3
++					| MANTIS_I2C_STOP
++					| MANTIS_I2C_PGMODE;
++
++		if (i == (msg->len - 1))
++			rxd &= ~MANTIS_I2C_STOP;
++
++		mmwrite(rxd, MANTIS_I2CDATA_CTL);
++		if (mantis_ack_wait(mantis) < 0) {
++			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<R>");
++			return -EIO;
++		}
++		rxd = mmread(MANTIS_I2CDATA_CTL);
++		msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
++		dprintk(verbose, MANTIS_DEBUG, 1,
++			"Data<R[%d]>=[0x%02x]", i, msg->buf[i]);
++
++		msleep_interruptible(2);
++	}
++
++	return 0;
++}
++
++static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg)
++{
++	int i;
++	u32 txd = 0;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Address=[0x%02x]", msg->addr);
++	for (i = 0; i < msg->len; i++) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "Data<W[%d]>=[0x%02x]", i, msg->buf[i]);
++		txd = (msg->addr << 25) | (msg->buf[i] << 8)
++					| MANTIS_I2C_RATE_3
++					| MANTIS_I2C_STOP
++					| MANTIS_I2C_PGMODE;
++
++		if (i == (msg->len - 1))
++			txd &= ~MANTIS_I2C_STOP;
++
++		mmwrite(txd, MANTIS_I2CDATA_CTL);
++		if (mantis_ack_wait(mantis) < 0) {
++			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<W>");
++			return -1;
++		}
++		udelay(500);
++	}
++
++	return 0;
++}
++
++static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
++{
++	int ret = 0, i;
++	struct mantis_pci *mantis;
++
++	mantis = i2c_get_adapdata(adapter);
++	for (i = 0; i < num; i++) {
++		if (msgs[i].flags & I2C_M_RD)
++			ret = mantis_i2c_read(mantis, &msgs[i]);
++		else
++			ret = mantis_i2c_write(mantis, &msgs[i]);
++
++		if (ret < 0)
++			return ret;
++	}
++
++	return num;
++}
++
++static u32 mantis_i2c_func(struct i2c_adapter *adapter)
++{
++	return I2C_FUNC_SMBUS_EMUL;
++}
++
++static struct i2c_algorithm mantis_algo = {
++	.master_xfer		= mantis_i2c_xfer,
++	.functionality		= mantis_i2c_func,
++};
++
++static struct i2c_adapter mantis_i2c_adapter = {
++	.owner			= THIS_MODULE,
++	.name			= "Mantis I2C",
++	.id			= I2C_HW_B_MANTIS,
++	.class			= I2C_CLASS_TV_DIGITAL,
++	.algo			= &mantis_algo,
++};
++
++int __devinit mantis_i2c_init(struct mantis_pci *mantis)
++{
++	u32 intstat;
++
++	memcpy(&mantis->adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
++	i2c_set_adapdata(&mantis->adapter, mantis);
++	mantis->i2c_rc = i2c_add_adapter(&mantis->adapter);
++	if (mantis->i2c_rc < 0)
++		return mantis->i2c_rc;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing I2C ..");
++
++	// Clear all interrupts
++	intstat = mmread(MANTIS_INT_STAT);
++	mmwrite(intstat, MANTIS_INT_STAT);
++
++	mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_I2CDONE,
++					  MANTIS_INT_MASK);
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "[0x%08x/%08x]",
++		mmread(MANTIS_INT_STAT), mmread(MANTIS_INT_MASK));
++
++	return 0;
++}
++
++int __devexit mantis_i2c_exit(struct mantis_pci *mantis)
++{
++	dprintk(verbose, MANTIS_DEBUG, 1, "Removing I2C adapter");
++	return i2c_del_adapter(&mantis->adapter);
++}
+diff --git a/drivers/media/dvb/mantis/mantis_reg.h b/drivers/media/dvb/mantis/mantis_reg.h
+new file mode 100644
+index 0000000..1b54e09
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_reg.h
+@@ -0,0 +1,109 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_REG_H
++#define __MANTIS_REG_H
++
++// Interrupts
++#define MANTIS_INT_STAT			0x00
++#define MANTIS_INT_MASK			0x04
++
++#define MANTIS_INT_RISCSTAT		(0x0f << 28)
++#define MANTIS_INT_RISCEN		(0x01 << 27)
++#define MANTIS_INT_I2CRACK		(0x01 << 26)
++
++//#define MANTIS_INT_GPIF			(0xff << 12)
++
++#define MANTIS_INT_PCMCIA7		(0x01 << 19)
++#define MANTIS_INT_PCMCIA6		(0x01 << 18)
++#define MANTIS_INT_PCMCIA5		(0x01 << 17)
++#define MANTIS_INT_PCMCIA4		(0x01 << 16)
++#define MANTIS_INT_PCMCIA3		(0x01 << 15)
++#define MANTIS_INT_PCMCIA2		(0x01 << 14)
++#define MANTIS_INT_PCMCIA1		(0x01 << 13)
++#define MANTIS_INT_PCMCIA0		(0x01 << 12)
++#define MANTIS_INT_IRQ1			(0x01 << 11)
++#define MANTIS_INT_IRQ0			(0x01 << 10)
++#define MANTIS_INT_OCERR		(0x01 <<  8)
++#define MANTIS_INT_PABORT		(0x01 <<  7)
++#define MANTIS_INT_RIPERR		(0x01 <<  6)
++#define MANTIS_INT_PPERR		(0x01 <<  5)
++#define MANTIS_INT_FTRGT		(0x01 <<  3)
++#define MANTIS_INT_RISCI		(0x01 <<  1)
++#define MANTIS_INT_I2CDONE		(0x01 <<  0)
++
++// DMA
++#define MANTIS_DMA_CTL			0x08
++#define	MANTIS_I2C_RD			(0x01 <<  7)
++#define MANTIS_I2C_WR			(0x01 <<  6)
++#define MANTIS_DCAP_MODE		(0x01 <<  5)
++#define MANTIS_FIFO_TP_4		(0x00 <<  3)
++#define MANTIS_FIFO_TP_8		(0x01 <<  3)
++#define MANTIS_FIFO_TP_16		(0x02 <<  3)
++#define MANTIS_FIFO_EN			(0x01 <<  2)
++#define MANTIS_DCAP_EN			(0x01 <<  1)
++#define MANTIS_RISC_EN			(0x01 <<  0)
++
++#define MANTIS_RISC_START		0x10
++#define MANTIS_RISC_PC			0x14
++
++// I2C
++#define MANTIS_I2CDATA_CTL		0x18
++#define MANTIS_I2C_RATE_1		(0x00 <<  6)
++#define MANTIS_I2C_RATE_2		(0x01 <<  6)
++#define MANTIS_I2C_RATE_3		(0x02 <<  6)
++#define MANTIS_I2C_RATE_4		(0x03 <<  6)
++#define MANTIS_I2C_STOP			(0x01 <<  5)
++#define MANTIS_I2C_PGMODE		(0x01 <<  3)
++
++#define MANTIS_GPIF_IRQCFG		0x98
++#define MANTIS_GPIF_IRQPOL		(0x01 <<  8)
++#define MANTIS_MASK_WRACK		(0x01 <<  7)
++#define MANTIS_MASK_BRRDY		(0x01 <<  6)
++#define MANTIS_MASK_OVFLW		(0x01 <<  5)
++#define MANTIS_MASK_OTHERR		(0x01 <<  4)
++#define MANTIS_MASK_WSTO		(0x01 <<  3)
++#define MANTIS_MASK_EXTIRQ		(0x01 <<  2)
++#define MANTIS_MASK_PLUGIN		(0x01 <<  1)
++#define MANTIS_MASK_PLUGOUT		(0x01 <<  0)
++
++#define MANTIS_GPIF_STATUS		0x9c
++#define MANTIS_SBUF_KILLOP		(0x01 << 15)
++#define MANTIS_SBUF_OPDONE		(0x01 << 14)
++#define MANTIS_SBUF_EMPTY		(0x01 << 13)
++#define MANTIS_GPIF_DETSTAT		(0x01 <<  9)
++#define MANTIS_GPIF_INTSTAT		(0x01 <<  8)
++#define MANTIS_GPIF_WRACK		(0x01 <<  7)
++#define MANTIS_GPIF_BRRDY		(0x01 <<  6)
++#define MANTIS_SBUF_OVFLW		(0x01 <<  5)
++#define MANTIS_GPIF_OTHERR		(0x01 <<  4)
++#define MANTIS_SBUF_WSTO		(0x01 <<  3)
++#define MANTIS_GPIF_EXTIRQ		(0x01 <<  2)
++#define MANTIS_CARD_PLUGIN		(0x01 <<  1)
++#define MANTIS_CARD_PLUGOUT		(0x01 <<  0)
++
++#define MANTIS_GPIF_ADDR		0xb0
++#define MANTIS_GPIF_RDWRN		(0x01 << 31)
++
++#define MANTIS_GPIF_DOUT		0xb4
++#define MANTIS_GPIF_DIN			0xb8
++
++
++#endif //__MANTIS_REG_H
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+new file mode 100644
+index 0000000..720f4fb
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -0,0 +1,151 @@
++/*
++	Mantis VP-1033 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_vp1033.h"
++
++u8 lgtdqcs001f_inittab[] = {
++	0x01, 0x15,
++	0x02, 0x00,
++	0x03, 0x00,
++	0x04, 0x2a,
++	0x05, 0x85,
++	0x06, 0x02,
++	0x07, 0x00,
++	0x08, 0x00,
++	0x0c, 0x01,
++	0x0d, 0x81,
++	0x0e, 0x44,
++	0x0f, 0x94,
++	0x10, 0x3c,
++	0x11, 0x84,
++	0x12, 0xb9,
++	0x13, 0xb5,
++	0x14, 0x4f,
++	0x15, 0xc9,
++	0x16, 0x80,
++	0x17, 0x36,
++	0x18, 0xfb,
++	0x19, 0xcf,
++	0x1a, 0xbc,
++	0x1c, 0x2b,
++	0x1d, 0x27,
++	0x1e, 0x00,
++	0x1f, 0x0b,
++	0x20, 0xa1,
++	0x21, 0x60,
++	0x22, 0x00,
++	0x23, 0x00,
++	0x28, 0x00,
++	0x29, 0x28,
++	0x2a, 0x14,
++	0x2b, 0x0f,
++	0x2c, 0x09,
++	0x2d, 0x05,
++	0x31, 0x1f,
++	0x32, 0x19,
++	0x33, 0xfc,
++	0x34, 0x13,
++	0xff, 0xff,
++};
++
++struct stv0299_config lgtdqcs001f_config = {
++	.demod_address		= 0x68,
++	.inittab		= lgtdqcs001f_inittab,
++	.mclk			= 88000000UL,
++//	.invert = 0,
++	.invert			= 1,
++//	.enhanced_tuning = 0,
++	.skip_reinit		= 0,
++	.lock_output		= STV0229_LOCKOUTPUT_0,
++	.volt13_op0_op1		= STV0299_VOLT13_OP0,
++	.min_delay_ms		= 100,
++	.set_symbol_rate	= lgtdqcs001f_set_symbol_rate,
++//	.pll_set		= lgtdqcs001f_pll_set,
++};
++
++int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
++			  struct dvb_frontend_parameters *params)
++{
++	u8 buf[4];
++	u32 div;
++
++	struct mantis_pci *mantis = fe->dvb->priv;
++
++	struct i2c_msg msg = {
++		.addr = 0x61,
++		.flags = 0,
++		.buf = buf,
++		.len = sizeof (buf)
++	};
++	div = params->frequency / 250;
++
++	buf[0] = (div >> 8) & 0x7f;
++	buf[1] =  div & 0xff;
++	buf[2] =  0x83;
++	buf[3] =  0xc0;
++
++	if (params->frequency < 1531000)
++		buf[3] |= 0x04;
++	else
++		buf[3] &= ~0x04;
++	if (i2c_transfer(&mantis->adapter, &msg, 1) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Write: I2C Transfer failed");
++		return -EIO;
++	}
++	msleep_interruptible(100);
++
++	return 0;
++}
++
++int lgtdqcs001f_set_symbol_rate(struct dvb_frontend *fe,
++				u32 srate, u32 ratio)
++{
++	u8 aclk = 0;
++	u8 bclk = 0;
++
++	if (srate < 1500000) {
++		aclk = 0xb7;
++		bclk = 0x47;
++	} else if (srate < 3000000) {
++		aclk = 0xb7;
++		bclk = 0x4b;
++	} else if (srate < 7000000) {
++		aclk = 0xb7;
++		bclk = 0x4f;
++	} else if (srate < 14000000) {
++		aclk = 0xb7;
++		bclk = 0x53;
++	} else if (srate < 30000000) {
++		aclk = 0xb6;
++		bclk = 0x53;
++	} else if (srate < 45000000) {
++		aclk = 0xb4;
++		bclk = 0x51;
++	}
++	stv0299_writereg (fe, 0x13, aclk);
++	stv0299_writereg (fe, 0x14, bclk);
++
++	stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff);
++	stv0299_writereg (fe, 0x20, (ratio >>  8) & 0xff);
++	stv0299_writereg (fe, 0x21, (ratio      ) & 0xf0);
++
++	return 0;
++}
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.h b/drivers/media/dvb/mantis/mantis_vp1033.h
+new file mode 100644
+index 0000000..d50f092
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp1033.h
+@@ -0,0 +1,35 @@
++/*
++	Mantis VP-1033 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_VP1033_H
++#define __MANTIS_VP1033_H
++
++#include "stv0299.h"
++#include "dvb_frontend.h"
++
++extern struct stv0299_config lgtdqcs001f_config;
++
++extern int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
++				 struct dvb_frontend_parameters *params);
++
++extern int lgtdqcs001f_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio);
++
++
++#endif // __MANTIS_VP1033_H
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+new file mode 100644
+index 0000000..b85ac29
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -0,0 +1,52 @@
++/*
++	Mantis VP-1034 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_vp1034.h"
++
++struct mb86a16_config vp1034_config = {
++	.demod_address	= 0x08,
++	.set_voltage	= vp1034_set_voltage,
++};
++
++int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
++{
++	struct mantis_pci *mantis = fe->dvb->priv;
++
++	switch (voltage) {
++	case SEC_VOLTAGE_13:
++		mmwrite((mmread(MANTIS_GPIF_ADDR)) | voltage, MANTIS_GPIF_ADDR);
++		dprintk(verbose, MANTIS_ERROR, 1, "Polarization=[13V]");
++		break;
++	case SEC_VOLTAGE_18:
++		mmwrite((mmread(MANTIS_GPIF_ADDR)) & voltage, MANTIS_GPIF_ADDR);
++		dprintk(verbose, MANTIS_ERROR, 1, "Polarization=[18V]");
++		break;
++	case SEC_VOLTAGE_OFF:
++		dprintk(verbose, MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
++		break;
++	default:
++		dprintk(verbose, MANTIS_ERROR, 1, "Invalid = (%d)", (u32 ) voltage);
++		return -EINVAL;
++	}
++	mmwrite(0x00, MANTIS_GPIF_DOUT);
++
++	return 0;
++}
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.h b/drivers/media/dvb/mantis/mantis_vp1034.h
+new file mode 100644
+index 0000000..2324dad
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp1034.h
+@@ -0,0 +1,30 @@
++/*
++	Mantis VP-1034 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_VP1034_H
++#define __MANTIS_VP1034_H
++
++#include "mb86a16.h"
++#include "dvb_frontend.h"
++
++extern struct mb86a16_config vp1034_config;
++extern int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
++
++#endif // __MANTIS_VP1034_H
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+new file mode 100644
+index 0000000..bca9eba
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -0,0 +1,73 @@
++/*
++	Mantis VP-2033 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_vp2033.h"
++
++struct tda10021_state {
++	struct i2c_adapter *i2c;
++	struct dvb_frontend_ops ops;
++	/* configuration settings */
++	const struct tda10021_config *config;
++	struct dvb_frontend frontend;
++
++	u8 pwm;
++	u8 reg0;
++};
++
++struct cu1216_config philips_cu1216_config = {
++	.demod_address = 0x18 >> 1,
++	.pll_set = philips_cu1216_tuner_set,
++//	.fe_reset = mantis_fe_reset,
++};
++
++int philips_cu1216_tuner_set(struct dvb_frontend *fe,
++			     struct dvb_frontend_parameters *params)
++{
++//	struct tda10021_state *state = fe->demodulator_priv;
++	struct mantis_pci *mantis = fe->dvb->priv;
++
++	u8 buf[4];
++
++	struct i2c_msg msg = {
++		.addr = 0xc0 >> 1,
++		.flags = 0,
++		.buf = buf,
++		.len = sizeof (buf)
++	};
++
++#define TUNER_MUL 62500
++
++	u32 div = (params->frequency + 36125000 + TUNER_MUL / 2) / TUNER_MUL;
++
++	buf[0] = (div >> 8) & 0x7f;
++	buf[1] = div & 0xff;
++	buf[2] = 0x86;
++	buf[3] = (params->frequency < 150000000 ? 0xA1 :
++		  params->frequency < 445000000 ? 0x92 : 0x34);
++
++//	if (i2c_transfer(state->i2c, &msg, 1) < 0) {
++	if (i2c_transfer(&mantis->adapter, &msg, 1) < 0) {
++		printk("%s tuner not ack!\n", __FUNCTION__);
++		return -EIO;
++	}
++	msleep(100);
++	return 0;
++}
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
+new file mode 100644
+index 0000000..29baba1
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp2033.h
+@@ -0,0 +1,33 @@
++/*
++	Mantis VP-2033 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_VP2033_H
++#define __MANTIS_VP2033_H
++
++#include "cu1216.h"
++#include "dvb_frontend.h"
++
++extern struct cu1216_config philips_cu1216_config;
++
++extern int philips_cu1216_tuner_set(struct dvb_frontend *fe,
++				    struct dvb_frontend_parameters *params);
++
++
++#endif // __MANTIS_VP2033_H
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+new file mode 100644
+index 0000000..f44f226
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -0,0 +1,53 @@
++/*
++	Mantis VP-3030 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_vp3030.h"
++
++struct zl10353_config mantis_vp3030_config = {
++	.demod_address = 0x0f,
++};
++
++int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,
++				   struct dvb_frontend_parameters *params)
++{
++	u8 buf[4];
++	int rc;
++	struct mantis_pci *mantis = fe->dvb->priv;
++
++	struct i2c_msg tuner_msg = {
++		.addr = 0x60,
++		.flags = 0,
++		.buf = buf,
++		.len = sizeof (buf)
++	};
++
++	if ((params->frequency < 950000) || (params->frequency > 2150000))
++		return -EINVAL;
++	rc = i2c_transfer(&mantis->adapter, &tuner_msg, 1);
++	if (rc != 1) {
++		printk("%s: I2C Transfer returned [%d]\n", __func__, rc);
++		return -EIO;
++	}
++	msleep_interruptible(1);
++	printk("%s: Send params to tuner ok!!!\n", __func__);
++
++	return 0;
++}
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.h b/drivers/media/dvb/mantis/mantis_vp3030.h
+new file mode 100644
+index 0000000..f8e72cc
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp3030.h
+@@ -0,0 +1,30 @@
++/*
++	Mantis VP-3030 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_VP3030_H
++#define __MANTIS_VP3030_H
++
++#include "zl10353.h"
++#include "dvb-pll.h"
++#include "dvb_frontend.h"
++
++extern struct zl10353_config mantis_vp3030_config;
++
++#endif // __MANTIS_VP3030_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0002-V4L-DVB-13700-MB86A16-Need-a-bit-of-settling-time.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0002-V4L-DVB-13700-MB86A16-Need-a-bit-of-settling-time.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,55 @@
+From fe35ee5ef79e1cd1342634fa1500a0421988b3b6 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 21:58:38 -0300
+Subject: [PATCH 002/120] V4L/DVB (13700): [MB86A16] Need a bit of settling time
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit a890cce595c86013ca1fba644c25c01b86149b23)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |    8 +++++++-
+ 1 files changed, 7 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index 6a78a0c..e8fa908 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -243,11 +243,16 @@ static int initial_set(struct mb86a16_state *state)
+ {
+ 	if (stlp_set(state, 5, 7))
+ 		goto err;
++
++	udelay(100);
+ 	if (afcex_data_set(state, 0, 0))
+ 		goto err;
++
++	udelay(100);
+ 	if (afcofs_data_set(state, 0, 0))
+ 		goto err;
+ 
++	udelay(100);
+ 	if (mb86a16_write(state, MB86A16_CRLFILTCOEF1, 0x16) < 0)
+ 		goto err;
+ 	if (mb86a16_write(state, 0x2f, 0x21) < 0)
+@@ -1149,11 +1154,12 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 				     v, R, swp_ofs, &fOSC,
+ 				     &afcex_freq, &AFCEX_L, &AFCEX_H);
+ 
++			udelay(100);
+ 			if (rf_val_set(state, fOSC, state->srate, R) < 0) {
+ 				dprintk(verbose, MB86A16_ERROR, 1, "rf val set error");
+ 				return -1;
+ 			}
+-
++			udelay(100);
+ 			if (afcex_data_set(state, AFCEX_L, AFCEX_H) < 0) {
+ 				dprintk(verbose, MB86A16_ERROR, 1, "afcex data set error");
+ 				return -1;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0003-V4L-DVB-13701-MB86A16-Reduce-Carrier-Recovery-range-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0003-V4L-DVB-13701-MB86A16-Reduce-Carrier-Recovery-range-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,34 @@
+From fbf94c261a933ab3acd5497a1159816045c26eef Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 21:59:20 -0300
+Subject: [PATCH 003/120] V4L/DVB (13701): [MB86A16] Reduce Carrier Recovery range to 3Mhz
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b05c90de08b582172b8f63dd751ac0a1aee421e9)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |    3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index e8fa908..47c0d57 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -1036,8 +1036,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 
+ 	dprintk(verbose, MB86A16_INFO, 1, "freq=%d Mhz, symbrt=%d Ksps", state->frequency, state->srate);
+ 
+-	fcp = 5000;	// (carrier recovery [kHz])
+-//	fcp = 3000;
++	fcp = 3000;
+ 	swp_ofs = state->srate / 4;
+ 
+ 	for (i = 0; i < 60; i++)
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0004-V4L-DVB-13702-MB86A16-need-to-wait-a-bit-more-than-t.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0004-V4L-DVB-13702-MB86A16-need-to-wait-a-bit-more-than-t.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,42 @@
+From b35828c55f84e1508afad74323fdb0550e381bd3 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 22:00:50 -0300
+Subject: [PATCH 004/120] V4L/DVB (13702): [MB86A16] need to wait a bit more than the computed time for a Factor of safety
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit e15c7ccd31faa0618478ad78e11423891919a87e)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index 47c0d57..ad03b11 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -417,7 +417,8 @@ static int signal_det(struct mb86a16_state *state,
+ 	int ret ;
+ 	int smrtd ;
+ 	int wait_sym ;
+-	int wait_t ;
++
++	u32 wait_t;
+ 	unsigned char S[3] ;
+ 	int i ;
+ 
+@@ -1429,6 +1430,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 					S2T = 7; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
+ 					wait_t = 7 + (2097152 + state->srate / 2) / state->srate;
+ 				}
++				wait_t *= 2; /*		FOS	*/
+ 				S2T_set(state, S2T);
+ 				S45T_set(state, S4T, S5T);
+ 				Vi_set(state, ETH, VIA);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0005-V4L-DVB-13703-MB86A16-Fix-wrong-message-printed-out.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0005-V4L-DVB-13703-MB86A16-Fix-wrong-message-printed-out.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,33 @@
+From 31aae7389d036427f3b20a84dec73a2118c75304 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 22:01:39 -0300
+Subject: [PATCH 005/120] V4L/DVB (13703): [MB86A16] Fix wrong message printed out
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 776c3ebe9678f86b9b0e72d541208bb39f9551c6)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index ad03b11..82b1271 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -1475,7 +1475,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 						SEQ_set(state, 1);
+ 					}
+ 				} else {
+-					dprintk(verbose, MB86A16_INFO, 1, "NO  -- SIGNAL");
++					dprintk(verbose, MB86A16_INFO, 1, "NO  -- SYNC");
+ 					SEQ_set(state, 1);
+ 				}
+ 			}
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0006-V4L-DVB-13704-MB86A16-FIX-Don-t-loop-again-if-we-hav.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0006-V4L-DVB-13704-MB86A16-FIX-Don-t-loop-again-if-we-hav.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,32 @@
+From 4844107b6f8acb246ce82630bcfb6e92e94b8e7c Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 22:02:19 -0300
+Subject: [PATCH 006/120] V4L/DVB (13704): [MB86A16] FIX: Don't loop again, if we have SYNC
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 071e3060a5f482e5948608d55e28bc7f5dd759cd)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index 82b1271..361e476 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -1487,6 +1487,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 		if (sync) {
+ 			dprintk(verbose, MB86A16_INFO, 1, "******* SYNC *******");
+ 			freqerr_chk(state, state->frequency, state->srate, 1);
++			break;
+ 		}
+ 	}
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0007-V4L-DVB-13705-Mantis-FIX-Do-not-return-IRQ_HANDLED-i.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0007-V4L-DVB-13705-Mantis-FIX-Do-not-return-IRQ_HANDLED-i.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,355 @@
+From 2ac08a99c42cdf87914cfb844e4a7bbdd5a9c40d Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 22:06:15 -0300
+Subject: [PATCH 007/120] V4L/DVB (13705): [Mantis] FIX: Do not return IRQ_HANDLED in the unlikely case
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit bd1fcac0148fb4a44395227edb0ff8ee31e09de1)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pci.c |  328 +++++++++++++++++++++++++++++++++
+ 1 files changed, 328 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_pci.c
+
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+new file mode 100644
+index 0000000..68ff1b2
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -0,0 +1,328 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <asm/io.h>
++#include <asm/pgtable.h>
++#include <asm/page.h>
++#include <linux/kmod.h>
++#include <linux/vmalloc.h>
++#include <linux/init.h>
++#include <linux/device.h>
++#include "mantis_common.h"
++#include "mantis_core.h"
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++unsigned int verbose = 1;
++module_param(verbose, int, 0644);
++MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
++
++unsigned int devs;
++
++#define PCI_VENDOR_ID_MANTIS			0x1822
++#define PCI_DEVICE_ID_MANTIS_R11		0x4e35
++#define DRIVER_NAME				"Mantis"
++
++static struct pci_device_id mantis_pci_table[] = {
++	{ PCI_DEVICE(PCI_VENDOR_ID_MANTIS, PCI_DEVICE_ID_MANTIS_R11) },
++	{ 0 },
++};
++
++MODULE_DEVICE_TABLE(pci, mantis_pci_table);
++
++static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
++{
++	int i = 0, interrupts = 0;
++	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
++	struct mantis_pci *mantis;
++
++	mantis = (struct mantis_pci *) dev_id;
++	if (unlikely(mantis == NULL)) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis == NULL");
++		return IRQ_NONE;
++	}
++	stat = mmread(MANTIS_INT_STAT);
++	mask = mmread(MANTIS_INT_MASK);
++	mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
++
++	if (!(stat & mask)) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "Not ours !");
++		return IRQ_NONE;
++	}
++	mmwrite(lstat, MANTIS_INT_STAT);
++	interrupts = hweight32(stat);
++	dprintk(verbose, MANTIS_DEBUG, 0, "=== Interrupts[%04x/%04x]=%d [", stat, mask, interrupts);
++
++	while (lstat) {
++		if (lstat & MANTIS_INT_RISCEN) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* DMA enabl *");
++			lstat &= ~MANTIS_INT_RISCEN;
++
++		} else if (lstat & MANTIS_INT_I2CRACK) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* I2C R-ACK *");
++			mantis->mantis_int_stat = stat;
++			mantis->mantis_int_mask = mask;
++			wake_up(&mantis->i2c_wq);
++			lstat &= ~MANTIS_INT_I2CRACK;
++
++		} else if (lstat & MANTIS_INT_PCMCIA7) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-07 *");
++			lstat &= ~MANTIS_INT_PCMCIA7;
++
++		} else if (lstat & MANTIS_INT_PCMCIA6) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-06 *");
++			lstat &= ~MANTIS_INT_PCMCIA6;
++
++		} else if (lstat & MANTIS_INT_PCMCIA5) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-05 *");
++			lstat &= ~MANTIS_INT_PCMCIA5;
++
++		} else if (lstat & MANTIS_INT_PCMCIA4) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-04 *");
++			lstat &= ~MANTIS_INT_PCMCIA4;
++
++		} else if (lstat & MANTIS_INT_PCMCIA3) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-03 *");
++			lstat &= ~MANTIS_INT_PCMCIA3;
++
++		} else if (lstat & MANTIS_INT_PCMCIA2) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-02 *");
++			lstat &= ~MANTIS_INT_PCMCIA2;
++
++		} else if (lstat & MANTIS_INT_PCMCIA1) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-01 *");
++			lstat &= ~MANTIS_INT_PCMCIA1;
++
++		} else if (lstat & MANTIS_INT_PCMCIA0) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-00 *");
++			lstat &= ~MANTIS_INT_PCMCIA0;
++
++		} else if (lstat & MANTIS_INT_IRQ0) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
++			lstat &= ~MANTIS_INT_IRQ0;
++
++		} else if (lstat & MANTIS_INT_IRQ1) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
++			lstat &= ~MANTIS_INT_IRQ1;
++
++		} else if (lstat & MANTIS_INT_OCERR) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT OCERR *");
++			lstat &= ~MANTIS_INT_OCERR;
++
++		} else if (lstat & MANTIS_INT_PABORT) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT PABRT *");
++			lstat &= ~MANTIS_INT_PABORT;
++
++		} else if (lstat & MANTIS_INT_RIPERR) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT RIPRR *");
++			lstat &= ~MANTIS_INT_RIPERR;
++
++		} else if (lstat & MANTIS_INT_PPERR) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT PPERR *");
++			lstat &= ~MANTIS_INT_PPERR;
++
++		} else if (lstat & MANTIS_INT_FTRGT) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT FTRGT *");
++			lstat &= ~MANTIS_INT_FTRGT;
++
++		} else if (lstat & MANTIS_INT_RISCI) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* INT RISCI *");
++			mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
++			tasklet_schedule(&mantis->tasklet);
++			lstat &= ~MANTIS_INT_RISCI;
++
++		} else if (lstat & MANTIS_INT_I2CDONE) {
++			dprintk(verbose, MANTIS_DEBUG, 0, "* I2C DONE  *");
++			mantis->mantis_int_stat = stat;
++			mantis->mantis_int_mask = mask;
++			lstat &= ~MANTIS_INT_I2CDONE;
++		} else {
++			dprintk(verbose, MANTIS_DEBUG, 0,
++				"* Unknown [%04x/%04x] *", stat, mask);
++			break;
++		}
++		i++;
++		if (i > interrupts) {
++			dprintk(verbose, MANTIS_ERROR, 1, "going Loopy ! -- BREAK --");
++			break;
++		}
++	}
++	dprintk(verbose, MANTIS_DEBUG, 0, "] ===\n");
++
++	return IRQ_HANDLED;
++}
++
++
++static int __devinit mantis_pci_probe(struct pci_dev *pdev,
++				      const struct pci_device_id *mantis_pci_table)
++{
++	u8 revision, latency;
++	struct mantis_pci *mantis;
++	int ret = 0;
++
++	devs++;
++
++	mantis = kmalloc(sizeof (struct mantis_pci), GFP_KERNEL);
++	if (mantis == NULL) {
++		printk("%s: Out of memory\n", __func__);
++		ret = -ENOMEM;
++		goto err;
++	}
++	memset(mantis, 0, sizeof (struct mantis_pci));
++	mantis->num = devs;
++	if (pci_enable_device(pdev)) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis PCI enable failed");
++		ret = -ENODEV;
++		goto err;
++	}
++	mantis->mantis_addr = pci_resource_start(pdev, 0);
++	if (!request_mem_region(pci_resource_start(pdev, 0),
++			pci_resource_len(pdev, 0), DRIVER_NAME)) {
++		ret = -ENODEV;
++		goto err0;
++	}
++
++	if ((mantis->mantis_mmio = ioremap(mantis->mantis_addr, 0x1000)) == NULL) {
++		dprintk(verbose, MANTIS_ERROR, 1, "IO remap failed");
++		ret = -ENODEV;
++		goto err1;
++	}
++
++	// Clear and disable all interrupts at startup
++	// to avoid lockup situations
++	mmwrite(0x00, MANTIS_INT_MASK);
++	if (request_irq(pdev->irq, mantis_pci_irq, IRQF_SHARED | IRQF_DISABLED,
++						DRIVER_NAME, mantis) < 0) {
++
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis IRQ reg failed");
++		ret = -ENODEV;
++		goto err2;
++	}
++	pci_set_master(pdev);
++	pci_set_drvdata(pdev, mantis);
++	pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency);
++	pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
++	mantis->latency = latency;
++	mantis->revision = revision;
++	mantis->pdev = pdev;
++	init_waitqueue_head(&mantis->i2c_wq);
++
++	// CAM bypass
++	//mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ1, MANTIS_INT_MASK);
++	dprintk(verbose, MANTIS_INFO, 1, "gpif status: %04x  irqcfg: %04x", mmread(0x9c), mmread(0x98));
++	if ((mmread(0x9c) & 0x200) != 0) { //CAM inserted
++		msleep_interruptible(1);
++		if ((mmread(0x9c) & 0x200) != 0)
++			mmwrite(((mmread(0x98) | 0x01) & ~0x02), 0x98);
++		else
++			mmwrite(((mmread(0x98) | 0x02) & ~0x01), 0x98);
++
++	} else {
++		mmwrite(((mmread(0x98) | 0x02) & ~0x01), 0x98);
++	}
++	mantis_set_direction(mantis, 0);
++
++	// default latency if none specified
++	if (!latency)
++		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 32);
++	dprintk(verbose, MANTIS_ERROR, 0, "Mantis Rev %d, ",
++		mantis->revision);
++
++	dprintk(verbose, MANTIS_ERROR, 0,
++		"irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p\n",
++		pdev->irq, mantis->latency,
++		mantis->mantis_addr, mantis->mantis_mmio);
++
++	// No more PCI specific stuff !
++	if (mantis_core_init(mantis) < 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Mantis core init failed");
++		ret = -ENODEV;
++		goto err2;
++	}
++
++	return 0;
++
++	// Error conditions ..
++err2:
++	dprintk(verbose, MANTIS_DEBUG, 1, "Err: IO Unmap");
++	if (mantis->mantis_mmio)
++		iounmap(mantis->mantis_mmio);
++err1:
++	dprintk(verbose, MANTIS_DEBUG, 1, "Err: Release regions");
++	release_mem_region(pci_resource_start(pdev, 0),
++				pci_resource_len(pdev, 0));
++	pci_disable_device(pdev);
++err0:
++	dprintk(verbose, MANTIS_DEBUG, 1, "Err: Free");
++	kfree(mantis);
++err:
++	dprintk(verbose, MANTIS_DEBUG, 1, "Err:");
++	return ret;
++}
++
++static void __devexit mantis_pci_remove(struct pci_dev *pdev)
++{
++	struct mantis_pci *mantis = pci_get_drvdata(pdev);
++
++	if (mantis == NULL) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Aeio, Mantis NULL ptr");
++		return;
++	}
++	mantis_core_exit(mantis);
++	dprintk(verbose, MANTIS_ERROR, 1, "Removing -->Mantis irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p",
++		pdev->irq, mantis->latency, mantis->mantis_addr,
++		mantis->mantis_mmio);
++
++	free_irq(pdev->irq, mantis);
++	pci_release_regions(pdev);
++	if (mantis_dma_exit(mantis) < 0)
++		dprintk(verbose, MANTIS_ERROR, 1, "DMA exit failed");
++
++	pci_set_drvdata(pdev, NULL);
++	pci_disable_device(pdev);
++	kfree(mantis);
++}
++
++static struct pci_driver mantis_pci_driver = {
++	.name = DRIVER_NAME,
++	.id_table = mantis_pci_table,
++	.probe = mantis_pci_probe,
++	.remove = mantis_pci_remove,
++};
++
++static int __devinit mantis_pci_init(void)
++{
++	return pci_register_driver(&mantis_pci_driver);
++}
++
++static void __devexit mantis_pci_exit(void)
++{
++	pci_unregister_driver(&mantis_pci_driver);
++}
++
++module_init(mantis_pci_init);
++module_exit(mantis_pci_exit);
++
++MODULE_DESCRIPTION("Mantis PCI DTV bridge driver");
++MODULE_AUTHOR("Manu Abraham");
++MODULE_LICENSE("GPL");
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0008-V4L-DVB-13706-MB86A16-Overhaul.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0008-V4L-DVB-13706-MB86A16-Overhaul.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,807 @@
+From e3f2c48d4b2eabd87147855967d5dadccda8dc3c Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 22:07:24 -0300
+Subject: [PATCH 008/120] V4L/DVB (13706): [MB86A16] Overhaul
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+ * better ISR handling
+ * I2C fixes
+ * better handling of configurations
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit df0cca174b4d85ea041509a13e5e68b377758bf1)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |   14 ++-
+ drivers/media/dvb/mantis/mantis_core.c   |   95 ++++++++---------
+ drivers/media/dvb/mantis/mantis_dvb.c    |   13 +--
+ drivers/media/dvb/mantis/mantis_i2c.c    |   68 +++++-------
+ drivers/media/dvb/mantis/mantis_pci.c    |  170 +++++++++++-------------------
+ drivers/media/dvb/mantis/mantis_vp1033.c |    8 ++
+ drivers/media/dvb/mantis/mantis_vp1033.h |    6 +-
+ drivers/media/dvb/mantis/mantis_vp1034.c |    8 ++
+ drivers/media/dvb/mantis/mantis_vp1034.h |    7 +-
+ drivers/media/dvb/mantis/mantis_vp2033.c |   20 +++-
+ drivers/media/dvb/mantis/mantis_vp2033.h |    6 +-
+ drivers/media/dvb/mantis/mantis_vp3030.c |   10 ++-
+ drivers/media/dvb/mantis/mantis_vp3030.h |    8 +-
+ 13 files changed, 215 insertions(+), 218 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index ba360f8..60a7457 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -65,10 +65,19 @@
+ #define mmaor(dat, addr)	mmwrite((dat) | ((mask) & mmread(addr)), addr)
+ 
+ 
++struct mantis_hwconfig {
++	char			*model_name;
++	char			*dev_type;
++};
++
++
+ struct mantis_pci {
+ 	/*	PCI stuff		*/
+ 	u16			vendor_id;
+ 	u16			device_id;
++	u16			subsystem_vendor;
++	u16			subsystem_device;
++
+ 	u8			latency;
+ 
+ 	struct			pci_dev *pdev;
+@@ -110,7 +119,7 @@ struct mantis_pci {
+ 
+ 	u8			feeds;
+ 
+-	struct mantis_config	*config;
++	struct mantis_hwconfig	*hwconfig;
+ 
+ 	u32 			mantis_int_stat;
+ 	u32 			mantis_int_mask;
+@@ -121,7 +130,8 @@ struct mantis_pci {
+ 	u32			sub_device_id;
+ 
+ 	 /*	A12 A13 A14		*/
+-	int			gpio_status;};
++	int			gpio_status;
++};
+ 
+ extern unsigned int verbose;
+ extern unsigned int devs;
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 1112277..1012959 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -20,7 +20,10 @@
+ 
+ #include "mantis_common.h"
+ #include "mantis_core.h"
+-
++#include "mantis_vp1033.h"
++#include "mantis_vp1034.h"
++#include "mantis_vp2033.h"
++#include "mantis_vp3030.h"
+ 
+ static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ {
+@@ -45,7 +48,7 @@ static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ 
+ 		return err;
+ 	}
+-	msleep_interruptible(2);
++//	msleep_interruptible(2);
+ 
+ 	return 0;
+ }
+@@ -72,41 +75,6 @@ static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ 	return 0;
+ }
+ 
+-static int get_subdevice_id(struct mantis_pci *mantis)
+-{
+-	int err;
+-	static u8 sub_device_id[2];
+-
+-	mantis->sub_device_id = 0;
+-	sub_device_id[0] = 0xfc;
+-	if ((err = read_eeprom_byte(mantis, &sub_device_id[0], 2)) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
+-		return err;
+-	}
+-	mantis->sub_device_id = (sub_device_id[0] << 8) | sub_device_id[1];
+-	dprintk(verbose, MANTIS_ERROR, 1, "Sub Device ID=[0x%04x]",
+-		mantis->sub_device_id);
+-
+-	return 0;
+-}
+-
+-static int get_subvendor_id(struct mantis_pci *mantis)
+-{
+-	int err;
+-	static u8 sub_vendor_id[2];
+-
+-	mantis->sub_vendor_id = 0;
+-	sub_vendor_id[0] = 0xfe;
+-	if ((err = read_eeprom_byte(mantis, &sub_vendor_id[0], 2)) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
+-		return err;
+-	}
+-	mantis->sub_vendor_id = (sub_vendor_id[0] << 8) | sub_vendor_id[1];
+-	dprintk(verbose, MANTIS_ERROR, 1, "Sub Vendor ID=[0x%04x]",
+-		mantis->sub_vendor_id);
+-
+-	return 0;
+-}
+ 
+ static int get_mac_address(struct mantis_pci *mantis)
+ {
+@@ -118,8 +86,8 @@ static int get_mac_address(struct mantis_pci *mantis)
+ 
+ 		return err;
+ 	}
+-	dprintk(verbose, MANTIS_ERROR, 1,
+-		"MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]",
++	dprintk(verbose, MANTIS_ERROR, 0,
++		"    MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]\n",
+ 		mantis->mac_address[0], mantis->mac_address[1],
+ 		mantis->mac_address[2],	mantis->mac_address[3],
+ 		mantis->mac_address[4], mantis->mac_address[5]);
+@@ -127,11 +95,51 @@ static int get_mac_address(struct mantis_pci *mantis)
+ 	return 0;
+ }
+ 
++#define MANTIS_MODEL_UNKNOWN	"UNKNOWN"
++#define MANTIS_DEV_UNKNOWN	"UNKNOWN"
++
++struct mantis_hwconfig unknown_device = {
++	.model_name	= MANTIS_MODEL_UNKNOWN,
++	.dev_type	= MANTIS_DEV_UNKNOWN,
++};
++
++static void mantis_load_config(struct mantis_pci *mantis)
++{
++	switch (mantis->subsystem_device) {
++	case MANTIS_VP_1033_DVB_S:	// VP-1033
++		mantis->hwconfig = &vp1033_mantis_config;
++		break;
++	case MANTIS_VP_1034_DVB_S:	// VP-1034
++		mantis->hwconfig = &vp1034_mantis_config;
++		break;
++	case MANTIS_VP_2033_DVB_C:	// VP-2033
++		mantis->hwconfig = &vp2033_mantis_config;
++		break;
++	case MANTIS_VP_3030_DVB_T:	// VP-3030
++		mantis->hwconfig = &vp3030_mantis_config;
++		break;
++	default:
++		mantis->hwconfig = &unknown_device;
++		break;
++	}
++}
+ 
+ int mantis_core_init(struct mantis_pci *mantis)
+ {
+ 	int err = 0;
+ 
++	mantis_load_config(mantis);
++	dprintk(verbose, MANTIS_ERROR, 0, "found a %s PCI %s device on (%02x:%02x.%x),\n",
++		mantis->hwconfig->model_name, mantis->hwconfig->dev_type,
++		mantis->pdev->bus->number, PCI_SLOT(mantis->pdev->devfn), PCI_FUNC(mantis->pdev->devfn));
++	dprintk(verbose, MANTIS_ERROR, 0, "    Mantis Rev %d [%04x:%04x], ",
++		mantis->revision,
++		mantis->subsystem_vendor, mantis->subsystem_device);
++	dprintk(verbose, MANTIS_ERROR, 0,
++		"irq: %d, latency: %d\n    memory: 0x%lx, mmio: 0x%p\n",
++		mantis->pdev->irq, mantis->latency,
++		mantis->mantis_addr, mantis->mantis_mmio);
++
+ 	if ((err = mantis_i2c_init(mantis)) < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis I2C init failed");
+ 		return err;
+@@ -140,14 +148,6 @@ int mantis_core_init(struct mantis_pci *mantis)
+ 		dprintk(verbose, MANTIS_ERROR, 1, "get MAC address failed");
+ 		return err;
+ 	}
+-	if ((err = get_subvendor_id(mantis)) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "get Sub vendor ID failed");
+-		return err;
+-	}
+-	if ((err = get_subdevice_id(mantis)) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "get Sub device ID failed");
+-		return err;
+-	}
+ 	if ((err = mantis_dma_init(mantis)) < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis DMA init failed");
+ 		return err;
+@@ -162,7 +162,6 @@ int mantis_core_init(struct mantis_pci *mantis)
+ 
+ int mantis_core_exit(struct mantis_pci *mantis)
+ {
+-
+ 	mantis_dma_stop(mantis);
+ 	dprintk(verbose, MANTIS_ERROR, 1, "DMA engine stopping");
+ 	if (mantis_dma_exit(mantis) < 0)
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 5830d4a..319bb8b 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -206,22 +206,13 @@ err0:
+ 	return result;
+ }
+ 
+-#define MANTIS_VP_1027_DVB_S	0x0013
+-#define MANTIS_VP_1033_DVB_S	0x0016
+-#define MANTIS_VP_1034_DVB_S	0x0014
+-#define MANTIS_VP_1040_DVB_S2
+-#define MANTIS_VP_1041_DVB_S2
+-#define MANTIS_VP_2033_DVB_C	0x0008
+-#define MANTIS_VP_3024_DVB_T	0x0009
+-#define MANTIS_VP_3030_DVB_T	0x0024
+-
+ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ {
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis frontend Init");
+ 	mantis_fe_powerup(mantis);
+ 	mantis_frontend_reset(mantis);
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Device ID=%02x", mantis->sub_device_id);
+-	switch (mantis->sub_device_id) {
++	dprintk(verbose, MANTIS_DEBUG, 1, "Device ID=%02x", mantis->subsystem_device);
++	switch (mantis->subsystem_device) {
+ 	case MANTIS_VP_1033_DVB_S:	// VP-1033
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
+ 		mantis->fe = stv0299_attach(&lgtdqcs001f_config,
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index cfecb34..8b90a2a 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -33,32 +33,27 @@
+ static int mantis_ack_wait(struct mantis_pci *mantis)
+ {
+ 	int rc = 0;
++	u32 timeout = 0;
+ 
+ 	if (wait_event_interruptible_timeout(mantis->i2c_wq,
+-					     mantis->mantis_int_stat & MANTIS_INT_I2CRACK,
+-					     msecs_to_jiffies(50)) == -ERESTARTSYS)
++					     mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
++					     msecs_to_jiffies(50)) == -ERESTARTSYS) {
+ 
++		dprintk(verbose, MANTIS_DEBUG, 1, "I2C Transfer failed, Master !I2CDONE");
+ 		rc = -EREMOTEIO;
+-/*
+-	// Wait till we are done
+-	while (mantis->mantis_int_stat & MANTIS_INT_I2CRACK){
+-		if (mantis->mantis_int_stat & MANTIS_INT_I2CDONE) {
+-			mantis->mantis_int_stat &= ~MANTIS_INT_I2CRACK;
+-//			dprintk(verbose, MANTIS_DEBUG, 1, "SLAVE RACK 'ed .. Waiting for I2CDONE");
++	}
++	while (!(mantis->mantis_int_stat & MANTIS_INT_I2CRACK)) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "Waiting for Slave RACK");
++		mantis->mantis_int_stat = mmread(MANTIS_INT_STAT);
++		msleep(5);
++		timeout++;
++		if (timeout > 500) {
++			dprintk(verbose, MANTIS_ERROR, 1, "Slave RACK Fail !");
++			rc = -EREMOTEIO;
+ 			break;
+ 		}
+ 	}
+-
+-	if (mantis->mantis_int_stat & MANTIS_INT_I2CDONE) {
+-//		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Int I2CDONE");
+-		rc = 1;
+-	}
+-
+-	mantis->mantis_int_stat &= ~MANTIS_INT_I2CDONE;
+-*/
+-	// ..
+-	if (mantis->mantis_int_stat & MANTIS_INT_I2CRACK)
+-		msleep_interruptible(10);
++	udelay(350);
+ 
+ 	return rc;
+ }
+@@ -67,7 +62,7 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ {
+ 	u32 rxd, i;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Address=[0x%02x]", msg->addr);
++	dprintk(verbose, MANTIS_INFO, 0, "        %s:  Address=[0x%02x] <R>[ ", __func__, msg->addr);
+ 	for (i = 0; i < msg->len; i++) {
+ 		rxd = (msg->addr << 25) | (1 << 24)
+ 					| MANTIS_I2C_RATE_3
+@@ -77,18 +72,17 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ 		if (i == (msg->len - 1))
+ 			rxd &= ~MANTIS_I2C_STOP;
+ 
++		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
+ 		mmwrite(rxd, MANTIS_I2CDATA_CTL);
+-		if (mantis_ack_wait(mantis) < 0) {
++		if (mantis_ack_wait(mantis) != 0) {
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<R>");
+-			return -EIO;
++			return -EREMOTEIO;
+ 		}
+ 		rxd = mmread(MANTIS_I2CDATA_CTL);
+ 		msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
+-		dprintk(verbose, MANTIS_DEBUG, 1,
+-			"Data<R[%d]>=[0x%02x]", i, msg->buf[i]);
+-
+-		msleep_interruptible(2);
++		dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+ 	}
++	dprintk(verbose, MANTIS_INFO, 0, "]\n");
+ 
+ 	return 0;
+ }
+@@ -98,9 +92,9 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 	int i;
+ 	u32 txd = 0;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Address=[0x%02x]", msg->addr);
++	dprintk(verbose, MANTIS_INFO, 0, "        %s: Address=[0x%02x] <W>[ ", __func__, msg->addr);
+ 	for (i = 0; i < msg->len; i++) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Data<W[%d]>=[0x%02x]", i, msg->buf[i]);
++		dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+ 		txd = (msg->addr << 25) | (msg->buf[i] << 8)
+ 					| MANTIS_I2C_RATE_3
+ 					| MANTIS_I2C_STOP
+@@ -109,13 +103,14 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 		if (i == (msg->len - 1))
+ 			txd &= ~MANTIS_I2C_STOP;
+ 
++		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
+ 		mmwrite(txd, MANTIS_I2CDATA_CTL);
+-		if (mantis_ack_wait(mantis) < 0) {
++		if (mantis_ack_wait(mantis) != 0) {
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<W>");
+-			return -1;
++			return -EREMOTEIO;
+ 		}
+-		udelay(500);
+ 	}
++	dprintk(verbose, MANTIS_INFO, 0, "]\n");
+ 
+ 	return 0;
+ }
+@@ -159,7 +154,7 @@ static struct i2c_adapter mantis_i2c_adapter = {
+ 
+ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ {
+-	u32 intstat;
++	u32 intstat, intmask;
+ 
+ 	memcpy(&mantis->adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
+ 	i2c_set_adapdata(&mantis->adapter, mantis);
+@@ -169,15 +164,12 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing I2C ..");
+ 
+-	// Clear all interrupts
+ 	intstat = mmread(MANTIS_INT_STAT);
++	intmask = mmread(MANTIS_INT_MASK);
+ 	mmwrite(intstat, MANTIS_INT_STAT);
++	mmwrite(intmask | MANTIS_INT_I2CDONE, MANTIS_INT_MASK);
+ 
+-	mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_I2CDONE,
+-					  MANTIS_INT_MASK);
+-
+-	dprintk(verbose, MANTIS_DEBUG, 1, "[0x%08x/%08x]",
+-		mmread(MANTIS_INT_STAT), mmread(MANTIS_INT_MASK));
++	dprintk(verbose, MANTIS_DEBUG, 1, "[0x%08x/%08x]", intstat, intmask);
+ 
+ 	return 0;
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 68ff1b2..0bc25d2 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -52,7 +52,6 @@ MODULE_DEVICE_TABLE(pci, mantis_pci_table);
+ 
+ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ {
+-	int i = 0, interrupts = 0;
+ 	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
+ 	struct mantis_pci *mantis;
+ 
+@@ -64,109 +63,67 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	stat = mmread(MANTIS_INT_STAT);
+ 	mask = mmread(MANTIS_INT_MASK);
+ 	mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
+-
+-	if (!(stat & mask)) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Not ours !");
++	if (!(stat & mask))
+ 		return IRQ_NONE;
++
++	mantis->mantis_int_stat = stat;
++	mantis->mantis_int_mask = mask;
++	dprintk(verbose, MANTIS_DEBUG, 0, "=== Interrupts[%04x/%04x]= [", stat, mask);
++	if (stat & MANTIS_INT_RISCEN) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* DMA enabl *");
++	}
++	if (stat & MANTIS_INT_I2CRACK) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* I2C R-ACK *");
++//		wake_up(&mantis->i2c_wq);
++	}
++	if (stat & MANTIS_INT_PCMCIA7) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-07 *");
++	}
++	if (stat & MANTIS_INT_IRQ0) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
++	}
++	if (stat & MANTIS_INT_IRQ1) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
++	}
++	if (stat & MANTIS_INT_OCERR) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT OCERR *");
++	}
++	if (stat & MANTIS_INT_PABORT) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT PABRT *");
++	}
++	if (stat & MANTIS_INT_RIPERR) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT RIPRR *");
+ 	}
+-	mmwrite(lstat, MANTIS_INT_STAT);
+-	interrupts = hweight32(stat);
+-	dprintk(verbose, MANTIS_DEBUG, 0, "=== Interrupts[%04x/%04x]=%d [", stat, mask, interrupts);
+-
+-	while (lstat) {
+-		if (lstat & MANTIS_INT_RISCEN) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* DMA enabl *");
+-			lstat &= ~MANTIS_INT_RISCEN;
+-
+-		} else if (lstat & MANTIS_INT_I2CRACK) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* I2C R-ACK *");
+-			mantis->mantis_int_stat = stat;
+-			mantis->mantis_int_mask = mask;
+-			wake_up(&mantis->i2c_wq);
+-			lstat &= ~MANTIS_INT_I2CRACK;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA7) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-07 *");
+-			lstat &= ~MANTIS_INT_PCMCIA7;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA6) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-06 *");
+-			lstat &= ~MANTIS_INT_PCMCIA6;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA5) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-05 *");
+-			lstat &= ~MANTIS_INT_PCMCIA5;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA4) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-04 *");
+-			lstat &= ~MANTIS_INT_PCMCIA4;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA3) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-03 *");
+-			lstat &= ~MANTIS_INT_PCMCIA3;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA2) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-02 *");
+-			lstat &= ~MANTIS_INT_PCMCIA2;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA1) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-01 *");
+-			lstat &= ~MANTIS_INT_PCMCIA1;
+-
+-		} else if (lstat & MANTIS_INT_PCMCIA0) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-00 *");
+-			lstat &= ~MANTIS_INT_PCMCIA0;
+-
+-		} else if (lstat & MANTIS_INT_IRQ0) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
+-			lstat &= ~MANTIS_INT_IRQ0;
+-
+-		} else if (lstat & MANTIS_INT_IRQ1) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
+-			lstat &= ~MANTIS_INT_IRQ1;
+-
+-		} else if (lstat & MANTIS_INT_OCERR) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT OCERR *");
+-			lstat &= ~MANTIS_INT_OCERR;
+-
+-		} else if (lstat & MANTIS_INT_PABORT) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT PABRT *");
+-			lstat &= ~MANTIS_INT_PABORT;
+-
+-		} else if (lstat & MANTIS_INT_RIPERR) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT RIPRR *");
+-			lstat &= ~MANTIS_INT_RIPERR;
+-
+-		} else if (lstat & MANTIS_INT_PPERR) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT PPERR *");
+-			lstat &= ~MANTIS_INT_PPERR;
+-
+-		} else if (lstat & MANTIS_INT_FTRGT) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT FTRGT *");
+-			lstat &= ~MANTIS_INT_FTRGT;
+-
+-		} else if (lstat & MANTIS_INT_RISCI) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* INT RISCI *");
+-			mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
+-			tasklet_schedule(&mantis->tasklet);
+-			lstat &= ~MANTIS_INT_RISCI;
+-
+-		} else if (lstat & MANTIS_INT_I2CDONE) {
+-			dprintk(verbose, MANTIS_DEBUG, 0, "* I2C DONE  *");
+-			mantis->mantis_int_stat = stat;
+-			mantis->mantis_int_mask = mask;
+-			lstat &= ~MANTIS_INT_I2CDONE;
+-		} else {
+-			dprintk(verbose, MANTIS_DEBUG, 0,
+-				"* Unknown [%04x/%04x] *", stat, mask);
+-			break;
+-		}
+-		i++;
+-		if (i > interrupts) {
+-			dprintk(verbose, MANTIS_ERROR, 1, "going Loopy ! -- BREAK --");
+-			break;
+-		}
++	if (stat & MANTIS_INT_PPERR) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT PPERR *");
+ 	}
++	if (stat & MANTIS_INT_FTRGT) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT FTRGT *");
++	}
++	if (stat & MANTIS_INT_RISCI) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* INT RISCI *");
++		mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
++		tasklet_schedule(&mantis->tasklet);
++	}
++	if (stat & MANTIS_INT_I2CDONE) {
++		dprintk(verbose, MANTIS_DEBUG, 0, "* I2C DONE  *");
++		wake_up(&mantis->i2c_wq);
++	}
++	mmwrite(stat, MANTIS_INT_STAT);
++	stat &= ~(MANTIS_INT_RISCEN   | MANTIS_INT_I2CDONE |
++		  MANTIS_INT_I2CRACK  | MANTIS_INT_PCMCIA7 |
++		  MANTIS_INT_PCMCIA6  | MANTIS_INT_PCMCIA5 |
++		  MANTIS_INT_PCMCIA4  | MANTIS_INT_PCMCIA3 |
++		  MANTIS_INT_PCMCIA2  | MANTIS_INT_PCMCIA1 |
++		  MANTIS_INT_PCMCIA0  | MANTIS_INT_IRQ1	   |
++		  MANTIS_INT_IRQ0     | MANTIS_INT_OCERR   |
++		  MANTIS_INT_PABORT   | MANTIS_INT_RIPERR  |
++		  MANTIS_INT_PPERR    | MANTIS_INT_FTRGT   |
++		  MANTIS_INT_RISCI);
++
++	if (stat)
++		dprintk(verbose, MANTIS_DEBUG, 0, "* Unknown [%04x] *", stat);
++
+ 	dprintk(verbose, MANTIS_DEBUG, 0, "] ===\n");
+ 
+ 	return IRQ_HANDLED;
+@@ -180,8 +137,6 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+ 	struct mantis_pci *mantis;
+ 	int ret = 0;
+ 
+-	devs++;
+-
+ 	mantis = kmalloc(sizeof (struct mantis_pci), GFP_KERNEL);
+ 	if (mantis == NULL) {
+ 		printk("%s: Out of memory\n", __func__);
+@@ -190,6 +145,8 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+ 	}
+ 	memset(mantis, 0, sizeof (struct mantis_pci));
+ 	mantis->num = devs;
++	devs++;
++
+ 	if (pci_enable_device(pdev)) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis PCI enable failed");
+ 		ret = -ENODEV;
+@@ -225,11 +182,13 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+ 	mantis->latency = latency;
+ 	mantis->revision = revision;
+ 	mantis->pdev = pdev;
++	mantis->subsystem_vendor = pdev->subsystem_vendor;
++	mantis->subsystem_device = pdev->subsystem_device;
+ 	init_waitqueue_head(&mantis->i2c_wq);
+ 
+ 	// CAM bypass
+ 	//mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ1, MANTIS_INT_MASK);
+-	dprintk(verbose, MANTIS_INFO, 1, "gpif status: %04x  irqcfg: %04x", mmread(0x9c), mmread(0x98));
++	dprintk(verbose, MANTIS_INFO, 0, "\ngpif status: %04x  irqcfg: %04x\n", mmread(0x9c), mmread(0x98));
+ 	if ((mmread(0x9c) & 0x200) != 0) { //CAM inserted
+ 		msleep_interruptible(1);
+ 		if ((mmread(0x9c) & 0x200) != 0)
+@@ -242,11 +201,8 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+ 	}
+ 	mantis_set_direction(mantis, 0);
+ 
+-	// default latency if none specified
+ 	if (!latency)
+ 		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 32);
+-	dprintk(verbose, MANTIS_ERROR, 0, "Mantis Rev %d, ",
+-		mantis->revision);
+ 
+ 	dprintk(verbose, MANTIS_ERROR, 0,
+ 		"irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p\n",
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index 720f4fb..07fcc45 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -81,6 +81,14 @@ struct stv0299_config lgtdqcs001f_config = {
+ //	.pll_set		= lgtdqcs001f_pll_set,
+ };
+ 
++#define MANTIS_MODEL_NAME	"VP-1033"
++#define MANTIS_DEV_TYPE		"DVB-S/DSS"
++
++struct mantis_hwconfig vp1033_mantis_config = {
++	.model_name		= MANTIS_MODEL_NAME,
++	.dev_type		= MANTIS_DEV_TYPE,
++};
++
+ int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+ 			  struct dvb_frontend_parameters *params)
+ {
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.h b/drivers/media/dvb/mantis/mantis_vp1033.h
+index d50f092..e245706 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.h
++++ b/drivers/media/dvb/mantis/mantis_vp1033.h
+@@ -21,10 +21,14 @@
+ #ifndef __MANTIS_VP1033_H
+ #define __MANTIS_VP1033_H
+ 
+-#include "stv0299.h"
+ #include "dvb_frontend.h"
++#include "mantis_common.h"
++#include "stv0299.h"
++
++#define MANTIS_VP_1033_DVB_S	0x0016
+ 
+ extern struct stv0299_config lgtdqcs001f_config;
++extern struct mantis_hwconfig vp1033_mantis_config;
+ 
+ extern int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+ 				 struct dvb_frontend_parameters *params);
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index b85ac29..c9c9479 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -26,6 +26,14 @@ struct mb86a16_config vp1034_config = {
+ 	.set_voltage	= vp1034_set_voltage,
+ };
+ 
++#define MANTIS_MODEL_NAME	"VP-1034"
++#define MANTIS_DEV_TYPE		"DVB-S/DSS"
++
++struct mantis_hwconfig vp1034_mantis_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++};
++
+ int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+ {
+ 	struct mantis_pci *mantis = fe->dvb->priv;
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.h b/drivers/media/dvb/mantis/mantis_vp1034.h
+index 2324dad..2194857 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.h
++++ b/drivers/media/dvb/mantis/mantis_vp1034.h
+@@ -21,9 +21,14 @@
+ #ifndef __MANTIS_VP1034_H
+ #define __MANTIS_VP1034_H
+ 
+-#include "mb86a16.h"
+ #include "dvb_frontend.h"
++#include "mantis_common.h"
++#include "mb86a16.h"
++
++
++#define MANTIS_VP_1034_DVB_S	0x0014
+ 
++extern struct mantis_hwconfig vp1034_mantis_config;
+ extern struct mb86a16_config vp1034_config;
+ extern int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index bca9eba..e989597 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -32,9 +32,17 @@ struct tda10021_state {
+ 	u8 reg0;
+ };
+ 
++#define MANTIS_MODEL_NAME	"VP-2033"
++#define MANTIS_DEV_TYPE		"DVB-C"
++
++struct mantis_hwconfig vp2033_mantis_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++};
++
+ struct cu1216_config philips_cu1216_config = {
+-	.demod_address = 0x18 >> 1,
+-	.pll_set = philips_cu1216_tuner_set,
++	.demod_address	= 0x18 >> 1,
++	.pll_set	= philips_cu1216_tuner_set,
+ //	.fe_reset = mantis_fe_reset,
+ };
+ 
+@@ -47,10 +55,10 @@ int philips_cu1216_tuner_set(struct dvb_frontend *fe,
+ 	u8 buf[4];
+ 
+ 	struct i2c_msg msg = {
+-		.addr = 0xc0 >> 1,
+-		.flags = 0,
+-		.buf = buf,
+-		.len = sizeof (buf)
++		.addr	= 0xc0 >> 1,
++		.flags	= 0,
++		.buf	= buf,
++		.len	= sizeof (buf)
+ 	};
+ 
+ #define TUNER_MUL 62500
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
+index 29baba1..513c491 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.h
++++ b/drivers/media/dvb/mantis/mantis_vp2033.h
+@@ -21,10 +21,14 @@
+ #ifndef __MANTIS_VP2033_H
+ #define __MANTIS_VP2033_H
+ 
+-#include "cu1216.h"
+ #include "dvb_frontend.h"
++#include "mantis_common.h"
++#include "cu1216.h"
++
++#define MANTIS_VP_2033_DVB_C	0x0008
+ 
+ extern struct cu1216_config philips_cu1216_config;
++extern struct mantis_hwconfig vp2033_mantis_config;
+ 
+ extern int philips_cu1216_tuner_set(struct dvb_frontend *fe,
+ 				    struct dvb_frontend_parameters *params);
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index f44f226..8043e5d 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -22,7 +22,15 @@
+ #include "mantis_vp3030.h"
+ 
+ struct zl10353_config mantis_vp3030_config = {
+-	.demod_address = 0x0f,
++	.demod_address	= 0x0f,
++};
++
++#define MANTIS_MODEL_NAME	"VP-3030"
++#define MANTIS_DEV_TYPE		"DVB-T"
++
++struct mantis_hwconfig vp3030_mantis_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
+ };
+ 
+ int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.h b/drivers/media/dvb/mantis/mantis_vp3030.h
+index f8e72cc..acc50a4 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.h
++++ b/drivers/media/dvb/mantis/mantis_vp3030.h
+@@ -21,10 +21,14 @@
+ #ifndef __MANTIS_VP3030_H
+ #define __MANTIS_VP3030_H
+ 
+-#include "zl10353.h"
+-#include "dvb-pll.h"
+ #include "dvb_frontend.h"
++#include "mantis_common.h"
++#include "dvb-pll.h"
++#include "zl10353.h"
++
++#define MANTIS_VP_3030_DVB_T	0x0024
+ 
+ extern struct zl10353_config mantis_vp3030_config;
++extern struct mantis_hwconfig vp3030_mantis_config;
+ 
+ #endif // __MANTIS_VP3030_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0009-V4L-DVB-13707-Mantis-Whitespace-cleanup.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0009-V4L-DVB-13707-Mantis-Whitespace-cleanup.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,44 @@
+From e550152089a3e43bcfd98b77e3277fe9011818aa Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 22:09:53 -0300
+Subject: [PATCH 009/120] V4L/DVB (13707): [Mantis] Whitespace cleanup
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 55172773c57221c7c81e445d04f811f2f0478c3e)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 60a7457..d39cbe0 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -83,7 +83,7 @@ struct mantis_pci {
+ 	struct			pci_dev *pdev;
+ 
+ 	unsigned long		mantis_addr;
+-	volatile void __iomem 	*mantis_mmio;
++	volatile void __iomem	*mantis_mmio;
+ 
+ 	u8			irq;
+ 	u8			revision;
+@@ -121,8 +121,8 @@ struct mantis_pci {
+ 
+ 	struct mantis_hwconfig	*hwconfig;
+ 
+-	u32 			mantis_int_stat;
+-	u32 			mantis_int_mask;
++	u32			mantis_int_stat;
++	u32			mantis_int_mask;
+ 
+ 	/*	board specific		*/
+ 	u8			mac_address[8];
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0010-V4L-DVB-13708-Mantis-Remove-some-dead-code.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0010-V4L-DVB-13708-Mantis-Remove-some-dead-code.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,97 @@
+From 1642e6b7ccf673805e3d7eb09c4f91f7e3b5563e Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 2 Dec 2009 22:11:00 -0300
+Subject: [PATCH 010/120] V4L/DVB (13708): [Mantis] Remove some dead code
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit da7365f46607207c8166167ba497e3cb3e02270d)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_core.c   |    2 --
+ drivers/media/dvb/mantis/mantis_pci.c    |    1 -
+ drivers/media/dvb/mantis/mantis_vp2033.c |   14 +-------------
+ 3 files changed, 1 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 1012959..d159ad6 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -48,7 +48,6 @@ static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ 
+ 		return err;
+ 	}
+-//	msleep_interruptible(2);
+ 
+ 	return 0;
+ }
+@@ -75,7 +74,6 @@ static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ 	return 0;
+ }
+ 
+-
+ static int get_mac_address(struct mantis_pci *mantis)
+ {
+ 	int err;
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 0bc25d2..402f866 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -74,7 +74,6 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	}
+ 	if (stat & MANTIS_INT_I2CRACK) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* I2C R-ACK *");
+-//		wake_up(&mantis->i2c_wq);
+ 	}
+ 	if (stat & MANTIS_INT_PCMCIA7) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-07 *");
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index e989597..853b558 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -21,17 +21,6 @@
+ #include "mantis_common.h"
+ #include "mantis_vp2033.h"
+ 
+-struct tda10021_state {
+-	struct i2c_adapter *i2c;
+-	struct dvb_frontend_ops ops;
+-	/* configuration settings */
+-	const struct tda10021_config *config;
+-	struct dvb_frontend frontend;
+-
+-	u8 pwm;
+-	u8 reg0;
+-};
+-
+ #define MANTIS_MODEL_NAME	"VP-2033"
+ #define MANTIS_DEV_TYPE		"DVB-C"
+ 
+@@ -49,7 +38,6 @@ struct cu1216_config philips_cu1216_config = {
+ int philips_cu1216_tuner_set(struct dvb_frontend *fe,
+ 			     struct dvb_frontend_parameters *params)
+ {
+-//	struct tda10021_state *state = fe->demodulator_priv;
+ 	struct mantis_pci *mantis = fe->dvb->priv;
+ 
+ 	u8 buf[4];
+@@ -71,11 +59,11 @@ int philips_cu1216_tuner_set(struct dvb_frontend *fe,
+ 	buf[3] = (params->frequency < 150000000 ? 0xA1 :
+ 		  params->frequency < 445000000 ? 0x92 : 0x34);
+ 
+-//	if (i2c_transfer(state->i2c, &msg, 1) < 0) {
+ 	if (i2c_transfer(&mantis->adapter, &msg, 1) < 0) {
+ 		printk("%s tuner not ack!\n", __FUNCTION__);
+ 		return -EIO;
+ 	}
+ 	msleep(100);
++
+ 	return 0;
+ }
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0011-V4L-DVB-13709-Mantis-VP-1034-Switch-13-18v-for-the-V.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0011-V4L-DVB-13709-Mantis-VP-1034-Switch-13-18v-for-the-V.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,77 @@
+From 1ba7c3f04e2d1804a7ccb3874e68459fc50a8865 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Thu, 3 Dec 2009 05:37:51 -0300
+Subject: [PATCH 011/120] V4L/DVB (13709): [Mantis/VP-1034] Switch 13/18v for the VP-1034 properly
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 715d341c59d2563940ae07b12f949555ccbe3efb)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_i2c.c    |   10 +++++++---
+ drivers/media/dvb/mantis/mantis_vp1034.c |    6 ++++--
+ 2 files changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 8b90a2a..53c5f88 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -39,7 +39,7 @@ static int mantis_ack_wait(struct mantis_pci *mantis)
+ 					     mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
+ 					     msecs_to_jiffies(50)) == -ERESTARTSYS) {
+ 
+-		dprintk(verbose, MANTIS_DEBUG, 1, "I2C Transfer failed, Master !I2CDONE");
++		dprintk(verbose, MANTIS_DEBUG, 1, "Master !I2CDONE");
+ 		rc = -EREMOTEIO;
+ 	}
+ 	while (!(mantis->mantis_int_stat & MANTIS_INT_I2CRACK)) {
+@@ -62,7 +62,9 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ {
+ 	u32 rxd, i;
+ 
+-	dprintk(verbose, MANTIS_INFO, 0, "        %s:  Address=[0x%02x] <R>[ ", __func__, msg->addr);
++	dprintk(verbose, MANTIS_INFO, 0, "        %s:  Address=[0x%02x] <R>[ ",
++		__func__, msg->addr);
++
+ 	for (i = 0; i < msg->len; i++) {
+ 		rxd = (msg->addr << 25) | (1 << 24)
+ 					| MANTIS_I2C_RATE_3
+@@ -92,7 +94,9 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 	int i;
+ 	u32 txd = 0;
+ 
+-	dprintk(verbose, MANTIS_INFO, 0, "        %s: Address=[0x%02x] <W>[ ", __func__, msg->addr);
++	dprintk(verbose, MANTIS_INFO, 0, "        %s: Address=[0x%02x] <W>[ ",
++		__func__, msg->addr);
++
+ 	for (i = 0; i < msg->len; i++) {
+ 		dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+ 		txd = (msg->addr << 25) | (msg->buf[i] << 8)
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index c9c9479..f6766d0 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -40,12 +40,14 @@ int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+ 
+ 	switch (voltage) {
+ 	case SEC_VOLTAGE_13:
+-		mmwrite((mmread(MANTIS_GPIF_ADDR)) | voltage, MANTIS_GPIF_ADDR);
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Polarization=[13V]");
++		gpio_set_bits(mantis, 13, 1);
++		gpio_set_bits(mantis, 14, 0);
+ 		break;
+ 	case SEC_VOLTAGE_18:
+-		mmwrite((mmread(MANTIS_GPIF_ADDR)) & voltage, MANTIS_GPIF_ADDR);
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Polarization=[18V]");
++		gpio_set_bits(mantis, 13, 1);
++		gpio_set_bits(mantis, 14, 1);
+ 		break;
+ 	case SEC_VOLTAGE_OFF:
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0012-V4L-DVB-13710-Mantis-FIX-Use-swfilter-188-204-accord.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0012-V4L-DVB-13710-Mantis-FIX-Use-swfilter-188-204-accord.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,107 @@
+From 8a21c066cd6ca5cbbfc16ac463889ba0b291ef7f Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Thu, 3 Dec 2009 05:38:33 -0300
+Subject: [PATCH 012/120] V4L/DVB (13710): [Mantis] FIX: Use swfilter (188/204) accordingly
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 01a8c3eebb3c83df337f88332756f16154cecc0f)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    4 +++-
+ drivers/media/dvb/mantis/mantis_dma.c    |    2 --
+ drivers/media/dvb/mantis/mantis_vp1033.c |    1 +
+ drivers/media/dvb/mantis/mantis_vp1034.c |    1 +
+ drivers/media/dvb/mantis/mantis_vp2033.c |    1 +
+ drivers/media/dvb/mantis/mantis_vp3030.c |    1 +
+ 6 files changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index d39cbe0..197393e 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -64,13 +64,15 @@
+ #define mmor(dat, addr)		mmwrite((dat) | mmread(addr), addr)
+ #define mmaor(dat, addr)	mmwrite((dat) | ((mask) & mmread(addr)), addr)
+ 
++#define MANTIS_TS_188		0
++#define MANTIS_TS_204		1
+ 
+ struct mantis_hwconfig {
+ 	char			*model_name;
+ 	char			*dev_type;
++	u32			ts_size;
+ };
+ 
+-
+ struct mantis_pci {
+ 	/*	PCI stuff		*/
+ 	u16			vendor_id;
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index 9e3aa5e..b8fd1c7 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -154,8 +154,6 @@ err:
+ 	return err;
+ }
+ 
+-
+-
+ static inline void mantis_risc_program(struct mantis_pci *mantis)
+ {
+ 	u32 buf_pos = 0;
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index 07fcc45..daf02c1 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -87,6 +87,7 @@ struct stv0299_config lgtdqcs001f_config = {
+ struct mantis_hwconfig vp1033_mantis_config = {
+ 	.model_name		= MANTIS_MODEL_NAME,
+ 	.dev_type		= MANTIS_DEV_TYPE,
++	.ts_size		= MANTIS_TS_204,
+ };
+ 
+ int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index f6766d0..a2fe9d4 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -32,6 +32,7 @@ struct mb86a16_config vp1034_config = {
+ struct mantis_hwconfig vp1034_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_204,
+ };
+ 
+ int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index 853b558..15772fe 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -27,6 +27,7 @@
+ struct mantis_hwconfig vp2033_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_188,
+ };
+ 
+ struct cu1216_config philips_cu1216_config = {
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index 8043e5d..cab092c 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -31,6 +31,7 @@ struct zl10353_config mantis_vp3030_config = {
+ struct mantis_hwconfig vp3030_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_188,
+ };
+ 
+ int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0013-V4L-DVB-13711-Mantis-FIX-Do-nor-toggle-GPIF-status.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0013-V4L-DVB-13711-Mantis-FIX-Do-nor-toggle-GPIF-status.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,44 @@
+From 891a939f0043167db8a735c2a5d0b90734b22147 Mon Sep 17 00:00:00 2001
+From: Marko Ristola <marko.ristola at kolumbus.fi>
+Date: Thu, 3 Dec 2009 05:39:22 -0300
+Subject: [PATCH 013/120] V4L/DVB (13711): [Mantis] FIX: Do nor toggle GPIF status
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Marko Ristola <marko.ristola at kolumbus.fi>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit e4deee04ffda9b44f367a40dbad8306ab88cb321)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dma.c |    5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index b8fd1c7..e207870 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -190,7 +190,8 @@ void mantis_dma_start(struct mantis_pci *mantis)
+ 
+ 	mantis_risc_program(mantis);
+ 	mmwrite(cpu_to_le32(mantis->risc_dma), MANTIS_RISC_START);
+-	mmwrite(MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
++//	mmwrite(MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
++	mmwrite(mmread(MANTIS_GPIF_ADDR) | MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
+ 
+ 	mmwrite(0, MANTIS_DMA_CTL);
+ 	mantis->last_block = mantis->finished_block = 0;
+@@ -210,6 +211,8 @@ void mantis_dma_stop(struct mantis_pci *mantis)
+ 	mask = mmread(MANTIS_INT_MASK);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Stop DMA engine");
+ 
++	mmwrite((mmread(MANTIS_GPIF_ADDR) & (~(MANTIS_GPIF_RDWRN))), MANTIS_GPIF_ADDR);
++
+ 	mmwrite((mmread(MANTIS_DMA_CTL) & ~(MANTIS_FIFO_EN |
+ 					    MANTIS_DCAP_EN |
+ 					    MANTIS_RISC_EN)), MANTIS_DMA_CTL);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0014-V4L-DVB-13712-Mantis-Add-locking-for-concurrent-acce.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0014-V4L-DVB-13712-Mantis-Add-locking-for-concurrent-acce.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,69 @@
+From 18bf84a35a0b9ea89c4262125457c2938b37f149 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Thu, 3 Dec 2009 05:42:10 -0300
+Subject: [PATCH 014/120] V4L/DVB (13712): [Mantis] Add locking for concurrent access
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit e2f67e4fb931b975058b3bd48eaac43780c92c88)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    2 ++
+ drivers/media/dvb/mantis/mantis_i2c.c    |    3 +++
+ 2 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 197393e..e354e76 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -25,6 +25,7 @@
+ #include <linux/moduleparam.h>
+ #include <linux/kernel.h>
+ #include <linux/pci.h>
++#include <linux/mutex.h>
+ 
+ #include "dvbdev.h"
+ #include "dvb_demux.h"
+@@ -109,6 +110,7 @@ struct mantis_pci {
+ 	struct i2c_adapter	adapter;
+ 	int			i2c_rc;
+ 	wait_queue_head_t	i2c_wq;
++	struct mutex		i2c_lock;
+ 
+ 	/*	DVB stuff		*/
+ 	struct dvb_adapter	dvb_adapter;
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 53c5f88..39fabe5 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -125,6 +125,7 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
+ 	struct mantis_pci *mantis;
+ 
+ 	mantis = i2c_get_adapdata(adapter);
++	mutex_lock(&mantis->i2c_lock);
+ 	for (i = 0; i < num; i++) {
+ 		if (msgs[i].flags & I2C_M_RD)
+ 			ret = mantis_i2c_read(mantis, &msgs[i]);
+@@ -134,6 +135,7 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
+ 		if (ret < 0)
+ 			return ret;
+ 	}
++	mutex_unlock(&mantis->i2c_lock);
+ 
+ 	return num;
+ }
+@@ -160,6 +162,7 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ {
+ 	u32 intstat, intmask;
+ 
++	mutex_init(&mantis->i2c_lock);
+ 	memcpy(&mantis->adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
+ 	i2c_set_adapdata(&mantis->adapter, mantis);
+ 	mantis->i2c_rc = i2c_add_adapter(&mantis->adapter);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0015-V4L-DVB-13713-MB86A16-Fix-Initialize-SNR-STATUS.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0015-V4L-DVB-13713-MB86A16-Fix-Initialize-SNR-STATUS.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,41 @@
+From 7966bbe3618b2095cd5534ac88d80e7a189b0ccf Mon Sep 17 00:00:00 2001
+From: Sigmund Augdal <sigmund at snap.tv>
+Date: Thu, 3 Dec 2009 05:44:00 -0300
+Subject: [PATCH 015/120] V4L/DVB (13713): [MB86A16] Fix: Initialize SNR/STATUS
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Sigmund Augdal <sigmund at snap.tv>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 1fa1f107852484157c5453cc6c4a60c792f06c35)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index 361e476..4f8ef2e 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -595,6 +595,7 @@ static int mb86a16_read_status(struct dvb_frontend *fe, fe_status_t *status)
+ {
+ 	struct mb86a16_state *state = fe->demodulator_priv;
+ 
++	*status = 0;
+ 	if (state->signal & 0x02)
+ 		*status |= FE_HAS_VITERBI;
+ 	if (state->signal & 0x01)
+@@ -1693,6 +1694,7 @@ static int mb86a16_read_snr(struct dvb_frontend *fe, u16 *snr)
+ 	int low_tide = 2, high_tide = 30, q_level;
+ 	u8  cn;
+ 
++	*snr = 0;
+ 	if (mb86a16_read(state, 0x26, &cn) != 2) {
+ 		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
+ 		return -EREMOTEIO;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0016-V4L-DVB-13714-MB86A16-FIX-Code-simplification-use-hw.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0016-V4L-DVB-13714-MB86A16-FIX-Code-simplification-use-hw.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,75 @@
+From fb7e4ac1badaa9f12f3825caeb391dcb95b3bd9b Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Thu, 3 Dec 2009 05:44:38 -0300
+Subject: [PATCH 016/120] V4L/DVB (13714): [MB86A16] FIX/Code simplification: use hwconfig->ts_size instead of ts_size
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+thanks to Marko Ristola for pointing it out
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 33c79630dd9fb7658dbb885a22e3a8127b16a38a)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    1 -
+ drivers/media/dvb/mantis/mantis_dma.c    |    4 ++--
+ drivers/media/dvb/mantis/mantis_dvb.c    |    1 -
+ 3 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index e354e76..d4865e4 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -92,7 +92,6 @@ struct mantis_pci {
+ 	u8			revision;
+ 
+ 	unsigned int		num;
+-	u16			ts_size;
+ 
+ 	/*	RISC Core		*/
+ 	u32			finished_block;
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index e207870..ea23a89 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -190,7 +190,6 @@ void mantis_dma_start(struct mantis_pci *mantis)
+ 
+ 	mantis_risc_program(mantis);
+ 	mmwrite(cpu_to_le32(mantis->risc_dma), MANTIS_RISC_START);
+-//	mmwrite(MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
+ 	mmwrite(mmread(MANTIS_GPIF_ADDR) | MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
+ 
+ 	mmwrite(0, MANTIS_DMA_CTL);
+@@ -227,12 +226,13 @@ void mantis_dma_stop(struct mantis_pci *mantis)
+ void mantis_dma_xfer(unsigned long data)
+ {
+ 	struct mantis_pci *mantis = (struct mantis_pci *) data;
++	struct mantis_hwconfig *config = mantis->hwconfig;
+ 
+ 	while (mantis->last_block != mantis->finished_block) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "last block=[%d] finished block=[%d]",
+ 			mantis->last_block, mantis->finished_block);
+ 
+-		(mantis->ts_size ? dvb_dmx_swfilter_204: dvb_dmx_swfilter)
++		(config->ts_size ? dvb_dmx_swfilter_204: dvb_dmx_swfilter)
+ 		(&mantis->demux, &mantis->buf_cpu[mantis->last_block * MANTIS_BLOCK_BYTES], MANTIS_BLOCK_BYTES);
+ 		mantis->last_block = (mantis->last_block + 1) % MANTIS_BLOCK_COUNT;
+ 	}
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 319bb8b..7fe8541 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -142,7 +142,6 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ 	mantis->demux.start_feed = mantis_dvb_start_feed;
+ 	mantis->demux.stop_feed = mantis_dvb_stop_feed;
+ 	mantis->demux.write_to_decoder = NULL;
+-	mantis->ts_size = 1; //188
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_dmx_init");
+ 	if ((result = dvb_dmx_init(&mantis->demux)) < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1,
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0017-V4L-DVB-13715-Mantis-Kernel-I2C-changes-use-PCI-pare.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0017-V4L-DVB-13715-Mantis-Kernel-I2C-changes-use-PCI-pare.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,57 @@
+From 229bcc82455f75e57609caab078bba2b94c4db4e Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Thu, 3 Dec 2009 05:46:06 -0300
+Subject: [PATCH 017/120] V4L/DVB (13715): [Mantis] Kernel I2C changes: use PCI parent device
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 8154bad4c488c1a23fb504a6e751d71a39733b76)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    2 +-
+ drivers/media/dvb/mantis/mantis_i2c.c    |   10 +++++++---
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index d4865e4..34d2389 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -83,7 +83,7 @@ struct mantis_pci {
+ 
+ 	u8			latency;
+ 
+-	struct			pci_dev *pdev;
++	struct pci_dev		*pdev;
+ 
+ 	unsigned long		mantis_addr;
+ 	volatile void __iomem	*mantis_mmio;
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 39fabe5..005df1e 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -161,11 +161,15 @@ static struct i2c_adapter mantis_i2c_adapter = {
+ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ {
+ 	u32 intstat, intmask;
++	struct i2c_adapter *i2c_adapter = &mantis->adapter;
++	struct pci_dev *pdev		= mantis->pdev;
+ 
+ 	mutex_init(&mantis->i2c_lock);
+-	memcpy(&mantis->adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
+-	i2c_set_adapdata(&mantis->adapter, mantis);
+-	mantis->i2c_rc = i2c_add_adapter(&mantis->adapter);
++	memcpy(i2c_adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
++	i2c_set_adapdata(i2c_adapter, mantis);
++
++	i2c_adapter->dev.parent = &pdev->dev;
++	mantis->i2c_rc		= i2c_add_adapter(i2c_adapter);
+ 	if (mantis->i2c_rc < 0)
+ 		return mantis->i2c_rc;
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0018-V4L-DVB-13716-Mantis-Bug-incorrect-byte-swap.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0018-V4L-DVB-13716-Mantis-Bug-incorrect-byte-swap.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,39 @@
+From f0fb46cca3273252efbb9671e781f6d0b31f05fb Mon Sep 17 00:00:00 2001
+From: David Woodhouse <dwmw2 at infradead.org>
+Date: Thu, 3 Dec 2009 05:47:11 -0300
+Subject: [PATCH 018/120] V4L/DVB (13716): [Mantis] Bug: incorrect byte swap
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+You know, the worst endianness errors are not the cases where
+people forget to byte-swap, but the cases where they either byte-swap
+with the wrong size, or byte-swap when they shouldn't have done so at
+all. Those ones defeat the casual reader of the code.
+
+Signed-off-by: David Woodhouse <dwmw2 at infradead.org>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 417036844823313901d7f7d7b963f215cc3b0641)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dma.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index ea23a89..f685992 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -189,7 +189,7 @@ void mantis_dma_start(struct mantis_pci *mantis)
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Start DMA engine");
+ 
+ 	mantis_risc_program(mantis);
+-	mmwrite(cpu_to_le32(mantis->risc_dma), MANTIS_RISC_START);
++	mmwrite(mantis->risc_dma, MANTIS_RISC_START);
+ 	mmwrite(mmread(MANTIS_GPIF_ADDR) | MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
+ 
+ 	mmwrite(0, MANTIS_DMA_CTL);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0019-V4L-DVB-13717-MB86A16-Statistics-Updates.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0019-V4L-DVB-13717-MB86A16-Statistics-Updates.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,243 @@
+From 084ae03964c65b3c484533ca43c6c2cadab7795c Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Thu, 3 Dec 2009 05:48:13 -0300
+Subject: [PATCH 019/120] V4L/DVB (13717): [MB86A16] Statistics Updates
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* Demodulator status check made reliable
+* Code simplification for Viterbi Sync check, makes
+  acquisition more reliable
+
+* Implement a BER monitor
+* Implement a Signal strength monitor
+* Implement a "simple" UCB monitor, no real UCB monitor
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 77557abef0de3f1f1e8f563db6df8710a9e930fe)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |  142 +++++++++++++++++++++++++++------
+ 1 files changed, 117 insertions(+), 25 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index 4f8ef2e..eddb35b 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -36,7 +36,6 @@ struct mb86a16_state {
+ 	struct i2c_adapter		*i2c_adap;
+ 	const struct mb86a16_config	*config;
+ 	struct dvb_frontend		frontend;
+-	u8				signal;
+ 
+ 	// tuning parameters
+ 	int				frequency;
+@@ -593,17 +592,39 @@ err:
+ 
+ static int mb86a16_read_status(struct dvb_frontend *fe, fe_status_t *status)
+ {
++	u8 stat, stat2;
+ 	struct mb86a16_state *state = fe->demodulator_priv;
+ 
+ 	*status = 0;
+-	if (state->signal & 0x02)
+-		*status |= FE_HAS_VITERBI;
+-	if (state->signal & 0x01)
++
++	if (mb86a16_read(state, MB86A16_SIG1, &stat) != 2)
++		goto err;
++	if (mb86a16_read(state, MB86A16_SIG2, &stat2) != 2)
++		goto err;
++	if ((stat > 25) && (stat2 > 25))
++		*status |= FE_HAS_SIGNAL;
++	if ((stat > 45) && (stat2 > 45))
++		*status |= FE_HAS_CARRIER;
++
++	if (mb86a16_read(state, MB86A16_STATUS, &stat) != 2)
++		goto err;
++
++	if (stat & 0x01)
+ 		*status |= FE_HAS_SYNC;
+-	if (state->signal & 0x03)
++	if (stat & 0x01)
++		*status |= FE_HAS_VITERBI;
++
++	if (mb86a16_read(state, MB86A16_FRAMESYNC, &stat) != 2)
++		goto err;
++
++	if ((stat & 0x0f) && (*status & FE_HAS_VITERBI))
+ 		*status |= FE_HAS_LOCK;
+ 
+ 	return 0;
++
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
+ }
+ 
+ static int sync_chk(struct mb86a16_state *state,
+@@ -1439,10 +1460,6 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 				msleep_interruptible(wait_t);
+ 				sync = sync_chk(state, &VIRM);
+ 				dprintk(verbose, MB86A16_INFO, 1, "-------- Viterbi=[%d] SYNC=[%d] ---------", VIRM, sync);
+-				if (mb86a16_read(state, 0x0d, &state->signal) != 2) {
+-					dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
+-					return -EREMOTEIO;
+-				}
+ 				if (VIRM) {
+ 					if (VIRM == 4) { // 5/6
+ 						if (SIG1 > 110)
+@@ -1459,22 +1476,14 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 							iq_vt_set(state, 1);
+ 							FEC_srst(state);
+ 						}
+-						if (SIG1 > 110)
+-							wait_t = ( 786432 + state->srate / 2) / state->srate;
+-						else
+-							wait_t = (1572864 + state->srate / 2) / state->srate;
+-
+-						msleep_interruptible(wait_t);
+-						SEQ_set(state, 1);
+-					} else { // 1/2, 2/3, 3/4, 7/8
+-						if (SIG1 > 110)
+-							wait_t = ( 786432 + state->srate / 2) / state->srate;
+-						else
+-							wait_t = (1572864 + state->srate / 2) / state->srate;
+-
+-						msleep_interruptible(wait_t);
+-						SEQ_set(state, 1);
+ 					}
++					// 1/2, 2/3, 3/4, 7/8
++					if (SIG1 > 110)
++						wait_t = ( 786432 + state->srate / 2) / state->srate;
++					else
++						wait_t = (1572864 + state->srate / 2) / state->srate;
++					msleep_interruptible(wait_t);
++					SEQ_set(state, 1);
+ 				} else {
+ 					dprintk(verbose, MB86A16_INFO, 1, "NO  -- SYNC");
+ 					SEQ_set(state, 1);
+@@ -1648,12 +1657,85 @@ static int mb86a16_sleep(struct dvb_frontend *fe)
+ 
+ static int mb86a16_read_ber(struct dvb_frontend *fe, u32 *ber)
+ {
++	u8 ber_mon, ber_tab, ber_lsb, ber_mid, ber_msb, ber_tim, ber_rst;
++	u32 timer;
++
++	struct mb86a16_state *state = fe->demodulator_priv;
++
++	*ber = 0;
++	if (mb86a16_read(state, MB86A16_BERMON, &ber_mon) != 2)
++		goto err;
++	if (mb86a16_read(state, MB86A16_BERTAB, &ber_tab) != 2)
++		goto err;
++	if (mb86a16_read(state, MB86A16_BERLSB, &ber_lsb) != 2)
++		goto err;
++	if (mb86a16_read(state, MB86A16_BERMID, &ber_mid) != 2)
++		goto err;
++	if (mb86a16_read(state, MB86A16_BERMSB, &ber_msb) != 2)
++		goto err;
++	/* BER monitor invalid when BER_EN = 0	*/
++	if (ber_mon & 0x04) {
++		/* coarse, fast calculation	*/
++		*ber = ber_tab & 0x1f;
++		dprintk(verbose, MB86A16_DEBUG, 1, "BER coarse=[0x%02x]", *ber);
++		if (ber_mon & 0x01) {
++			/*
++			 * BER_SEL = 1, The monitored BER is the estimated
++			 * value with a Reed-Solomon decoder error amount at
++			 * the deinterleaver output.
++			 * monitored BER is expressed as a 20 bit output in total
++			 */
++			ber_rst = ber_mon >> 3;
++			*ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb;
++			if (ber_rst == 0)
++				timer =  12500000;
++			if (ber_rst == 1)
++				timer =  25000000;
++			if (ber_rst == 2)
++				timer =  50000000;
++			if (ber_rst == 3)
++				timer = 100000000;
++
++			*ber /= timer;
++			dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber);
++		} else {
++			/*
++			 * BER_SEL = 0, The monitored BER is the estimated
++			 * value with a Viterbi decoder error amount at the
++			 * QPSK demodulator output.
++			 * monitored BER is expressed as a 24 bit output in total
++			 */
++			ber_tim = ber_mon >> 1;
++			*ber = (((ber_msb << 8) | ber_mid) << 8) | ber_lsb;
++			if (ber_tim == 0)
++				timer = 16;
++			if (ber_tim == 1)
++				timer = 24;
++
++			*ber /= 2 ^ timer;
++			dprintk(verbose, MB86A16_DEBUG, 1, "BER fine=[0x%02x]", *ber);
++		}
++	}
+ 	return 0;
++err:
++	dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++	return -EREMOTEIO;
+ }
+ 
+ static int mb86a16_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
+ {
++	u8 agcm = 0;
++	struct mb86a16_state *state = fe->demodulator_priv;
++
+ 	*strength = 0;
++	if (mb86a16_read(state, MB86A16_AGCM, &agcm) != 2) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++
++	*strength = ((0xff - agcm) * 100) / 256;
++	dprintk(verbose, MB86A16_DEBUG, 1, "Signal strength=[%d %%]", (u8) *strength);
++	*strength = (0xffff - 0xff) + agcm;
+ 
+ 	return 0;
+ }
+@@ -1708,12 +1790,22 @@ static int mb86a16_read_snr(struct dvb_frontend *fe, u16 *snr)
+ 	}
+ 	q_level = (*snr * 100) / (high_tide - low_tide);
+ 	dprintk(verbose, MB86A16_ERROR, 1, "SNR (Quality) = [%d dB], Level=%d %%", *snr, q_level);
++	*snr = (0xffff - 0xff) + *snr;
+ 
+ 	return 0;
+ }
+ 
+ static int mb86a16_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+ {
++	u8 dist;
++	struct mb86a16_state *state = fe->demodulator_priv;
++
++	if (mb86a16_read(state, MB86A16_DISTMON, &dist) != 2) {
++		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
++		return -EREMOTEIO;
++	}
++	*ucblocks = dist;
++
+ 	return 0;
+ }
+ 
+@@ -1723,7 +1815,7 @@ static struct dvb_frontend_ops mb86a16_ops = {
+ 		.type			= FE_QPSK,
+ 		.frequency_min		= 950000,
+ 		.frequency_max		= 2150000,
+-		.frequency_stepsize	= 125,
++		.frequency_stepsize	= 3000,
+ 		.frequency_tolerance	= 0,
+ 		.symbol_rate_min	= 1000000,
+ 		.symbol_rate_max	= 45000000,
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0020-V4L-DVB-13718-Mantis-Use-gpio_set_bits-to-turn-OFF-t.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0020-V4L-DVB-13718-Mantis-Use-gpio_set_bits-to-turn-OFF-t.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,58 @@
+From 4f0ee023bddd9630a8ed5ba19c249bbea3a21682 Mon Sep 17 00:00:00 2001
+From: Marko Ristola <marko.ristola at kolumbus.fi>
+Date: Fri, 4 Dec 2009 04:35:35 -0300
+Subject: [PATCH 020/120] V4L/DVB (13718): [Mantis] Use gpio_set_bits to turn OFF the bits as well
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Marko Ristola <marko.ristola at kolumbus.fi>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit f8e26cdec5ac25ae8d73e278e21033292de5430b)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_core.c |   16 +++++++---------
+ 1 files changed, 7 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index d159ad6..16d693e 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -172,25 +172,23 @@ int mantis_core_exit(struct mantis_pci *mantis)
+ 	return 0;
+ }
+ 
++// Turn the given bit on or off.
+ void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
+ {
+-	u32 reg;
++	u32 currVal, newVal;
++
++	currVal = mmread(MANTIS_GPIF_ADDR);
+ 
+ 	if (value)
+-		reg = 0x0000;
++		newVal = currVal | (1 << bitpos);
+ 	else
+-		reg = 0xffff;
+-
+-	reg = (value << bitpos);
++		newVal = currVal & (~(1 << bitpos));
+ 
+-	mmwrite(mmread(MANTIS_GPIF_ADDR) | reg, MANTIS_GPIF_ADDR);
++	mmwrite(newVal, MANTIS_GPIF_ADDR);
+ 	mmwrite(0x00, MANTIS_GPIF_DOUT);
+ 	udelay(100);
+-	mmwrite(mmread(MANTIS_GPIF_ADDR) | reg, MANTIS_GPIF_ADDR);
+-	mmwrite(0x00, MANTIS_GPIF_DOUT);
+ }
+ 
+-
+ //direction = 0 , no CI passthrough ; 1 , CI passthrough
+ void mantis_set_direction(struct mantis_pci *mantis, int direction)
+ {
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0021-V4L-DVB-13719-Mantis-VP-2033-Initial-test-switch-to-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0021-V4L-DVB-13719-Mantis-VP-2033-Initial-test-switch-to-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,166 @@
+From 9c53a416608b8ad355793252d21146cb656f3d83 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:39:14 -0300
+Subject: [PATCH 021/120] V4L/DVB (13719): [Mantis/VP-2033] Initial test switch to the tda10021, from the cu1216
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 2687d832fe0141015e2391f3755d9499e6efb83e)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dvb.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_vp2033.c |   80 +++++++++++++++++++++--------
+ drivers/media/dvb/mantis/mantis_vp2033.h |    8 ++--
+ 3 files changed, 63 insertions(+), 27 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 7fe8541..f255695 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -239,7 +239,7 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 		break;
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+-		mantis->fe = cu1216_attach(&philips_cu1216_config, &mantis->adapter);
++		mantis->fe = tda10021_attach(&philips_cu1216_config, &mantis->adapter, read_pwm(mantis));
+ 		if (mantis->fe) {
+ 			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
+ 			dprintk(verbose, MANTIS_ERROR, 1,
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index 15772fe..4664d29 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -27,44 +27,80 @@
+ struct mantis_hwconfig vp2033_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
+-	.ts_size	= MANTIS_TS_188,
++	.ts_size	= MANTIS_TS_204,
+ };
+ 
+-struct cu1216_config philips_cu1216_config = {
+-	.demod_address	= 0x18 >> 1,
+-	.pll_set	= philips_cu1216_tuner_set,
+-//	.fe_reset = mantis_fe_reset,
++struct tda1002x_config philips_cu1216_config = {
++	.demod_address = 0x18 >> 1,
++	.invert = 1,
+ };
+ 
+-int philips_cu1216_tuner_set(struct dvb_frontend *fe,
+-			     struct dvb_frontend_parameters *params)
++u8 read_pwm(struct mantis_pci *mantis)
+ {
+-	struct mantis_pci *mantis = fe->dvb->priv;
++	u8 b = 0xff;
++	u8 pwm;
++	struct i2c_msg msg[] = {
++		{.addr = 0x50,.flags = 0,.buf = &b,.len = 1},
++		{.addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1}
++	};
+ 
+-	u8 buf[4];
++	if ((i2c_transfer(&mantis->adapter, msg, 2) != 2)
++	    || (pwm == 0xff))
++		pwm = 0x48;
+ 
+-	struct i2c_msg msg = {
+-		.addr	= 0xc0 >> 1,
+-		.flags	= 0,
+-		.buf	= buf,
+-		.len	= sizeof (buf)
+-	};
++	return pwm;
++}
++
++int philips_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
++{
++	struct mantis_pci *mantis = fe->dvb->priv;
++
++	u8 buf[6];
++	struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = buf,.len = sizeof(buf) };
++	int i;
+ 
++#define CU1216_IF 36125000
+ #define TUNER_MUL 62500
+ 
+-	u32 div = (params->frequency + 36125000 + TUNER_MUL / 2) / TUNER_MUL;
++	u32 div = (params->frequency + CU1216_IF + TUNER_MUL / 2) / TUNER_MUL;
+ 
+ 	buf[0] = (div >> 8) & 0x7f;
+ 	buf[1] = div & 0xff;
+-	buf[2] = 0x86;
+-	buf[3] = (params->frequency < 150000000 ? 0xA1 :
+-		  params->frequency < 445000000 ? 0x92 : 0x34);
++	buf[2] = 0xce;
++	buf[3] = (params->frequency < 150000000 ? 0x01 :
++		  params->frequency < 445000000 ? 0x02 : 0x04);
++	buf[4] = 0xde;
++	buf[5] = 0x20;
+ 
+-	if (i2c_transfer(&mantis->adapter, &msg, 1) < 0) {
+-		printk("%s tuner not ack!\n", __FUNCTION__);
++	if (fe->ops.i2c_gate_ctrl)
++		fe->ops.i2c_gate_ctrl(fe, 1);
++
++	if (i2c_transfer(&mantis->adapter, &msg, 1) != 1)
+ 		return -EIO;
++
++	/* wait for the pll lock */
++	msg.flags = I2C_M_RD;
++	msg.len = 1;
++	for (i = 0; i < 20; i++) {
++		if (fe->ops.i2c_gate_ctrl)
++			fe->ops.i2c_gate_ctrl(fe, 1);
++
++		if (i2c_transfer(&mantis->adapter, &msg, 1) == 1 && (buf[0] & 0x40))
++			break;
++
++		msleep(10);
+ 	}
+-	msleep(100);
++
++	/* switch the charge pump to the lower current */
++	msg.flags = 0;
++	msg.len = 2;
++	msg.buf = &buf[2];
++	buf[2] &= ~0x40;
++	if (fe->ops.i2c_gate_ctrl)
++		fe->ops.i2c_gate_ctrl(fe, 1);
++
++	if (i2c_transfer(&mantis->adapter, &msg, 1) != 1)
++		return -EIO;
+ 
+ 	return 0;
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
+index 513c491..fcf8b85 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.h
++++ b/drivers/media/dvb/mantis/mantis_vp2033.h
+@@ -23,15 +23,15 @@
+ 
+ #include "dvb_frontend.h"
+ #include "mantis_common.h"
+-#include "cu1216.h"
++#include "tda1002x.h"
+ 
+ #define MANTIS_VP_2033_DVB_C	0x0008
+ 
+-extern struct cu1216_config philips_cu1216_config;
++extern struct tda1002x_config philips_cu1216_config;
+ extern struct mantis_hwconfig vp2033_mantis_config;
+ 
+-extern int philips_cu1216_tuner_set(struct dvb_frontend *fe,
+-				    struct dvb_frontend_parameters *params);
++extern int philips_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params);
+ 
++extern u8 read_pwm(struct mantis_pci *mantis);
+ 
+ #endif // __MANTIS_VP2033_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0022-V4L-DVB-13720-Mantis-Terratec-Cinergy-C-Add-support-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0022-V4L-DVB-13720-Mantis-Terratec-Cinergy-C-Add-support-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,70 @@
+From 0183b53c0988827e62d106f984f36752ec0ac2fd Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:39:48 -0300
+Subject: [PATCH 022/120] V4L/DVB (13720): [Mantis/Terratec Cinergy C] Add support for the Terratec Cinergy C PCI
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 51d20db8bb9c5a14ac2320664289f13bd52625c6)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_core.c   |    1 +
+ drivers/media/dvb/mantis/mantis_dvb.c    |   13 +++++++++++++
+ drivers/media/dvb/mantis/mantis_vp2033.h |    1 +
+ 3 files changed, 15 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 16d693e..3b5fea7 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -111,6 +111,7 @@ static void mantis_load_config(struct mantis_pci *mantis)
+ 		mantis->hwconfig = &vp1034_mantis_config;
+ 		break;
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
++	case TERRATEC_CINERGY_C_PCI:	// Terratec Cinergy C PCI
+ 		mantis->hwconfig = &vp2033_mantis_config;
+ 		break;
+ 	case MANTIS_VP_3030_DVB_T:	// VP-3030
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index f255695..e2aec0c 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -251,6 +251,19 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 
+ 		}
+ 		break;
++	case TERRATEC_CINERGY_C_PCI:
++		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
++		mantis->fe = tda10023_attach(&philips_cu1216_config, &mantis->adapter, read_pwm(mantis));
++		if (mantis->fe) {
++			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"found Philips CU1216 DVB-C frontend 0x%02x",
++				philips_cu1216_config.demod_address);
++
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"Mantis DVB-C Philips CU1216 frontend attach success");
++		}
++		break;
+ 	default:
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Unknown frontend:[0x%02x]",
+ 			mantis->sub_device_id);
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
+index fcf8b85..0a753f7 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.h
++++ b/drivers/media/dvb/mantis/mantis_vp2033.h
+@@ -26,6 +26,7 @@
+ #include "tda1002x.h"
+ 
+ #define MANTIS_VP_2033_DVB_C	0x0008
++#define TERRATEC_CINERGY_C_PCI	0x1178
+ 
+ extern struct tda1002x_config philips_cu1216_config;
+ extern struct mantis_hwconfig vp2033_mantis_config;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0023-V4L-DVB-13721-Mantis-Bug-Before-bailing-out-Unlock.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0023-V4L-DVB-13721-Mantis-Bug-Before-bailing-out-Unlock.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,43 @@
+From f8100ec2b738717d465ffefe3f5f0a65703c4a49 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:40:16 -0300
+Subject: [PATCH 023/120] V4L/DVB (13721): [Mantis] Bug! Before bailing out, Unlock
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to hotwings <user.vdr at gmail.com> for pointing out the bug
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 99d96e4e9202aa046e3e2be1813ff59c84e67608)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_i2c.c |    6 +++++-
+ 1 files changed, 5 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 005df1e..45d9e6b 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -133,11 +133,15 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
+ 			ret = mantis_i2c_write(mantis, &msgs[i]);
+ 
+ 		if (ret < 0)
+-			return ret;
++			goto bail_out;
+ 	}
+ 	mutex_unlock(&mantis->i2c_lock);
+ 
+ 	return num;
++
++bail_out:
++	mutex_unlock(&mantis->i2c_lock);
++	return ret;
+ }
+ 
+ static u32 mantis_i2c_func(struct i2c_adapter *adapter)
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0024-V4L-DVB-13722-Mantis-Revert-13560.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0024-V4L-DVB-13722-Mantis-Revert-13560.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,70 @@
+From f828198b4e3907591098362a2896925f84ba7c55 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:40:50 -0300
+Subject: [PATCH 024/120] V4L/DVB (13722): [Mantis] Revert 13560
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 5e68b0aedaa34447d86ae5cc6d071251c62bef37)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_core.c   |    1 -
+ drivers/media/dvb/mantis/mantis_dvb.c    |   13 -------------
+ drivers/media/dvb/mantis/mantis_vp2033.h |    1 -
+ 3 files changed, 0 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 3b5fea7..16d693e 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -111,7 +111,6 @@ static void mantis_load_config(struct mantis_pci *mantis)
+ 		mantis->hwconfig = &vp1034_mantis_config;
+ 		break;
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
+-	case TERRATEC_CINERGY_C_PCI:	// Terratec Cinergy C PCI
+ 		mantis->hwconfig = &vp2033_mantis_config;
+ 		break;
+ 	case MANTIS_VP_3030_DVB_T:	// VP-3030
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index e2aec0c..f255695 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -251,19 +251,6 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 
+ 		}
+ 		break;
+-	case TERRATEC_CINERGY_C_PCI:
+-		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+-		mantis->fe = tda10023_attach(&philips_cu1216_config, &mantis->adapter, read_pwm(mantis));
+-		if (mantis->fe) {
+-			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"found Philips CU1216 DVB-C frontend 0x%02x",
+-				philips_cu1216_config.demod_address);
+-
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"Mantis DVB-C Philips CU1216 frontend attach success");
+-		}
+-		break;
+ 	default:
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Unknown frontend:[0x%02x]",
+ 			mantis->sub_device_id);
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
+index 0a753f7..fcf8b85 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.h
++++ b/drivers/media/dvb/mantis/mantis_vp2033.h
+@@ -26,7 +26,6 @@
+ #include "tda1002x.h"
+ 
+ #define MANTIS_VP_2033_DVB_C	0x0008
+-#define TERRATEC_CINERGY_C_PCI	0x1178
+ 
+ extern struct tda1002x_config philips_cu1216_config;
+ extern struct mantis_hwconfig vp2033_mantis_config;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0025-V4L-DVB-13723-Mantis-VP-2040-Terratec-Cinergy-C-Add-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0025-V4L-DVB-13723-Mantis-VP-2040-Terratec-Cinergy-C-Add-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,191 @@
+From 4cd0ecb27fcee453c4b435d6bb5fd4e5994f5d2a Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:42:22 -0300
+Subject: [PATCH 025/120] V4L/DVB (13723): [Mantis/VP-2040, Terratec Cinergy C] Add support for the Cinergy C, VP-2040 clone
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b2eb1312faa26703e71b7b3945c8773213e9ee49)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile        |   13 ++++++++--
+ drivers/media/dvb/mantis/mantis_core.c   |    4 +++
+ drivers/media/dvb/mantis/mantis_dvb.c    |   16 ++++++++++++-
+ drivers/media/dvb/mantis/mantis_vp2040.c |   36 ++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_vp2040.h |   33 +++++++++++++++++++++++++++
+ 5 files changed, 98 insertions(+), 4 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp2040.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp2040.h
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index a980ff2..2be21bf 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -1,6 +1,13 @@
+-mantis-objs = mantis_core.o mantis_dma.o mantis_pci.o mantis_i2c.o	\
+-	mantis_dvb.o mantis_vp1033.o mantis_vp1034.o mantis_vp2033.o	\
+-	mantis_vp3030.o
++mantis-objs = 	mantis_core.o \
++		mantis_dma.o \
++		mantis_pci.o \
++		mantis_i2c.o \
++		mantis_dvb.o \
++		mantis_vp1033.o \
++		mantis_vp1034.o \
++		mantis_vp2033.o	\
++		mantis_vp2040.o	\
++		mantis_vp3030.o
+ 
+ obj-$(CONFIG_DVB_MANTIS) += mantis.o
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 16d693e..96b9392 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -23,6 +23,7 @@
+ #include "mantis_vp1033.h"
+ #include "mantis_vp1034.h"
+ #include "mantis_vp2033.h"
++#include "mantis_vp2040.h"
+ #include "mantis_vp3030.h"
+ 
+ static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+@@ -113,6 +114,9 @@ static void mantis_load_config(struct mantis_pci *mantis)
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
+ 		mantis->hwconfig = &vp2033_mantis_config;
+ 		break;
++	case TERRATEC_CINERGY_C_PCI:	// VP-2040 clone
++		mantis->hwconfig = &vp2040_mantis_config;
++		break;
+ 	case MANTIS_VP_3030_DVB_T:	// VP-3030
+ 		mantis->hwconfig = &vp3030_mantis_config;
+ 		break;
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index f255695..15012ea 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -28,6 +28,7 @@
+ #include "mantis_vp1033.h"
+ #include "mantis_vp1034.h"
+ #include "mantis_vp2033.h"
++#include "mantis_vp2040.h"
+ #include "mantis_vp3030.h"
+ 
+ /*	Tuner power supply control	*/
+@@ -243,7 +244,7 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 		if (mantis->fe) {
+ 			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
+ 			dprintk(verbose, MANTIS_ERROR, 1,
+-				"found Philips CU1216 DVB-C frontend @ 0x%02x",
++				"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
+ 				philips_cu1216_config.demod_address);
+ 
+ 			dprintk(verbose, MANTIS_ERROR, 1,
+@@ -251,6 +252,19 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 
+ 		}
+ 		break;
++	case TERRATEC_CINERGY_C_PCI:
++		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
++		mantis->fe = tda10023_attach(&tda10023_cu1216_config, &mantis->adapter, read_pwm(mantis));
++		if (mantis->fe) {
++			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++				philips_cu1216_config.demod_address);
++
++			dprintk(verbose, MANTIS_ERROR, 1,
++				"Mantis DVB-C Philips CU1216 frontend attach success");
++		}
++		break;
+ 	default:
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Unknown frontend:[0x%02x]",
+ 			mantis->sub_device_id);
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
+new file mode 100644
+index 0000000..07da738
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp2040.c
+@@ -0,0 +1,36 @@
++/*
++	Mantis VP-2040 driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_vp2040.h"
++
++#define MANTIS_MODEL_NAME	"VP-2040"
++#define MANTIS_DEV_TYPE		"DVB-C"
++
++struct mantis_hwconfig vp2040_mantis_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_204,
++};
++
++struct tda1002x_config tda10023_cu1216_config = {
++	.demod_address = 0x18 >> 1,
++	.invert = 1,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.h b/drivers/media/dvb/mantis/mantis_vp2040.h
+new file mode 100644
+index 0000000..825ccbb
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp2040.h
+@@ -0,0 +1,33 @@
++/*
++	Mantis VP-2040 driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_VP2040_H
++#define __MANTIS_VP2040_H
++
++#include "dvb_frontend.h"
++#include "mantis_common.h"
++#include "tda1002x.h"
++
++#define TERRATEC_CINERGY_C_PCI	0x1178
++
++extern struct tda1002x_config tda10023_cu1216_config;
++extern struct mantis_hwconfig vp2040_mantis_config;
++
++#endif //__MANTIS_VP2040_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0026-V4L-DVB-13724-Mantis-VP-1041-Initial-support-for-Man.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0026-V4L-DVB-13724-Mantis-VP-1041-Initial-support-for-Man.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,439 @@
+From 420fe00706948d2e6ce0f71d253a17b1023f263f Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:43:04 -0300
+Subject: [PATCH 026/120] V4L/DVB (13724): [Mantis/VP-1041] Initial support for Mantis VP-1041
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 873c8c25ebca50bd60e21784c4d442c4fecb8658)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile        |    1 +
+ drivers/media/dvb/mantis/mantis_core.c   |    4 +
+ drivers/media/dvb/mantis/mantis_dvb.c    |   18 ++
+ drivers/media/dvb/mantis/mantis_vp1041.c |  295 ++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_vp1041.h |   36 ++++
+ 5 files changed, 354 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp1041.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp1041.h
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index 2be21bf..bdf3e36 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -5,6 +5,7 @@ mantis-objs = 	mantis_core.o \
+ 		mantis_dvb.o \
+ 		mantis_vp1033.o \
+ 		mantis_vp1034.o \
++		mantis_vp1041.o \
+ 		mantis_vp2033.o	\
+ 		mantis_vp2040.o	\
+ 		mantis_vp3030.o
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 96b9392..47cfb75 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -22,6 +22,7 @@
+ #include "mantis_core.h"
+ #include "mantis_vp1033.h"
+ #include "mantis_vp1034.h"
++#include "mantis_vp1041.h"
+ #include "mantis_vp2033.h"
+ #include "mantis_vp2040.h"
+ #include "mantis_vp3030.h"
+@@ -111,6 +112,9 @@ static void mantis_load_config(struct mantis_pci *mantis)
+ 	case MANTIS_VP_1034_DVB_S:	// VP-1034
+ 		mantis->hwconfig = &vp1034_mantis_config;
+ 		break;
++	case MANTIS_VP_1041_DVB_S2:	// VP-1041
++		mantis->hwconfig = &vp1041_mantis_config;
++		break;
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
+ 		mantis->hwconfig = &vp2033_mantis_config;
+ 		break;
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 15012ea..a4750bb 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -27,6 +27,7 @@
+ #include "dvb_frontend.h"
+ #include "mantis_vp1033.h"
+ #include "mantis_vp1034.h"
++#include "mantis_vp1041.h"
+ #include "mantis_vp2033.h"
+ #include "mantis_vp2040.h"
+ #include "mantis_vp3030.h"
+@@ -238,6 +239,23 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 
+ 		}
+ 		break;
++	case MANTIS_VP_1041_DVB_S2:
++		mantis->fe = stb0899_attach(&vp1041_config, &mantis->adapter);
++		if (mantis->fe) {
++			dprintk(verbose, MANTIS_ERROR, 1,
++			"found STB0899 DVB-S/DVB-S2 frontend @0x%02x",
++			vp1041_config.demod_address);
++
++			if (stb6100_attach(mantis->fe, &vp1041_stb6100_config, &mantis->adapter)) {
++				if (!lnbp21_attach(mantis->fe, &mantis->adapter, 0, 0)) {
++					printk("%s: No LNBP21 found!\n", __FUNCTION__);
++					mantis->fe = NULL;
++				}
++			} else {
++				mantis->fe = NULL;
++			}
++		}
++		break;
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+ 		mantis->fe = tda10021_attach(&philips_cu1216_config, &mantis->adapter, read_pwm(mantis));
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+new file mode 100644
+index 0000000..a3279f0
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -0,0 +1,295 @@
++/*
++	Mantis VP-1041 driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_vp1041.h"
++#include "stb0899_reg.h"
++#include "stb0899_cfg.h"
++#include "stb6100_cfg.h"
++
++#define MANTIS_MODEL_NAME	"VP-1041"
++#define MANTIS_DEV_TYPE		"DSS/DVB-S/DVB-S2"
++
++struct mantis_hwconfig vp1041_mantis_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_188,
++};
++
++static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
++
++//	 0x0000000b ,	/* SYSREG */
++	{ STB0899_DEV_ID		, 0x30 },
++	{ STB0899_DISCNTRL1		, 0x32 },
++	{ STB0899_DISCNTRL2     	, 0x80 },
++	{ STB0899_DISRX_ST0     	, 0x04 },
++	{ STB0899_DISRX_ST1     	, 0x00 },
++	{ STB0899_DISPARITY     	, 0x00 },
++	{ STB0899_DISFIFO       	, 0x00 },
++	{ STB0899_DISSTATUS		, 0x20 },
++	{ STB0899_DISF22        	, 0x99 },
++	{ STB0899_DISF22RX      	, 0xa8 },
++	//SYSREG ?
++	{ STB0899_ACRPRESC      	, 0x11 },
++	{ STB0899_ACRDIV1       	, 0x0a },
++	{ STB0899_ACRDIV2       	, 0x05 },
++	{ STB0899_DACR1         	, 0x00 },
++	{ STB0899_DACR2         	, 0x00 },
++	{ STB0899_OUTCFG        	, 0x00 },
++	{ STB0899_MODECFG       	, 0x00 },
++	{ STB0899_IRQSTATUS_3		, 0xfe },
++	{ STB0899_IRQSTATUS_2		, 0x03 },
++	{ STB0899_IRQSTATUS_1		, 0x7c },
++	{ STB0899_IRQSTATUS_0		, 0xf4 },
++	{ STB0899_IRQMSK_3      	, 0xf3 },
++	{ STB0899_IRQMSK_2      	, 0xfc },
++	{ STB0899_IRQMSK_1      	, 0xff },
++	{ STB0899_IRQMSK_0		, 0xff },
++	{ STB0899_IRQCFG		, 0x00 },
++	{ STB0899_I2CCFG        	, 0x88 },
++	{ STB0899_I2CRPT        	, 0x5c },
++	{ STB0899_IOPVALUE5		, 0x00 },
++	{ STB0899_IOPVALUE4		, 0x33 },
++	{ STB0899_IOPVALUE3		, 0x6d },
++	{ STB0899_IOPVALUE2		, 0x90 },
++	{ STB0899_IOPVALUE1		, 0x60 },
++	{ STB0899_IOPVALUE0		, 0x00 },
++	{ STB0899_GPIO00CFG     	, 0x82 },
++	{ STB0899_GPIO01CFG     	, 0x82 },
++	{ STB0899_GPIO02CFG     	, 0x82 },
++	{ STB0899_GPIO03CFG     	, 0x82 },
++	{ STB0899_GPIO04CFG     	, 0x82 },
++	{ STB0899_GPIO05CFG     	, 0x82 },
++	{ STB0899_GPIO06CFG     	, 0x82 },
++	{ STB0899_GPIO07CFG     	, 0x82 },
++	{ STB0899_GPIO08CFG     	, 0x82 },
++	{ STB0899_GPIO09CFG     	, 0x82 },
++	{ STB0899_GPIO10CFG     	, 0x82 },
++	{ STB0899_GPIO11CFG     	, 0x82 },
++	{ STB0899_GPIO12CFG     	, 0x82 },
++	{ STB0899_GPIO13CFG     	, 0x82 },
++	{ STB0899_GPIO14CFG     	, 0x82 },
++	{ STB0899_GPIO15CFG     	, 0x82 },
++	{ STB0899_GPIO16CFG     	, 0x82 },
++	{ STB0899_GPIO17CFG     	, 0x82 },
++	{ STB0899_GPIO18CFG     	, 0x82 },
++	{ STB0899_GPIO19CFG     	, 0x82 },
++	{ STB0899_GPIO20CFG     	, 0x82 },
++	{ STB0899_SDATCFG       	, 0xb8 },
++	{ STB0899_SCLTCFG       	, 0xba },
++	{ STB0899_AGCRFCFG      	, 0x1c }, /* 0x11 */
++	{ STB0899_GPIO22        	, 0x82 }, /* AGCBB2CFG */
++	{ STB0899_GPIO21        	, 0x91 }, /* AGCBB1CFG */
++	{ STB0899_DIRCLKCFG     	, 0x82 },
++	{ STB0899_CLKOUT27CFG   	, 0x7e },
++	{ STB0899_STDBYCFG      	, 0x82 },
++	{ STB0899_CS0CFG        	, 0x82 },
++	{ STB0899_CS1CFG        	, 0x82 },
++	{ STB0899_DISEQCOCFG    	, 0x20 },
++	{ STB0899_GPIO32CFG		, 0x82 },
++	{ STB0899_GPIO33CFG		, 0x82 },
++	{ STB0899_GPIO34CFG		, 0x82 },
++	{ STB0899_GPIO35CFG		, 0x82 },
++	{ STB0899_GPIO36CFG		, 0x82 },
++	{ STB0899_GPIO37CFG		, 0x82 },
++	{ STB0899_GPIO38CFG		, 0x82 },
++	{ STB0899_GPIO39CFG		, 0x82 },
++	{ STB0899_NCOARSE       	, 0x17 }, /* 0x15 = 27 Mhz Clock, F/3 = 198MHz, F/6 = 99MHz */
++	{ STB0899_SYNTCTRL      	, 0x02 }, /* 0x00 = CLK from CLKI, 0x02 = CLK from XTALI */
++	{ STB0899_FILTCTRL      	, 0x00 },
++	{ STB0899_SYSCTRL       	, 0x01 },
++	{ STB0899_STOPCLK1      	, 0x20 },
++	{ STB0899_STOPCLK2      	, 0x00 },
++	{ STB0899_INTBUFSTATUS		, 0x00 },
++	{ STB0899_INTBUFCTRL    	, 0x0a },
++	{ 0xffff			, 0xff },
++};
++
++static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
++	{ STB0899_DEMOD         	, 0x00 },
++	{ STB0899_RCOMPC        	, 0xc9 },
++	{ STB0899_AGC1CN        	, 0x41 },
++	{ STB0899_AGC1REF       	, 0x10 },
++	{ STB0899_RTC	        	, 0x7a },
++	{ STB0899_TMGCFG        	, 0x4e },
++	{ STB0899_AGC2REF       	, 0x34 },
++	{ STB0899_TLSR          	, 0x84 },
++	{ STB0899_CFD           	, 0xc7 },
++	{ STB0899_ACLC	        	, 0x87 },
++	{ STB0899_BCLC          	, 0x94 },
++	{ STB0899_EQON          	, 0x41 },
++	{ STB0899_LDT           	, 0xdd },
++	{ STB0899_LDT2          	, 0xc9 },
++	{ STB0899_EQUALREF      	, 0xb4 },
++	{ STB0899_TMGRAMP       	, 0x10 },
++	{ STB0899_TMGTHD        	, 0x30 },
++	{ STB0899_IDCCOMP		, 0xfb },
++	{ STB0899_QDCCOMP		, 0x03 },
++	{ STB0899_POWERI		, 0x3b },
++	{ STB0899_POWERQ		, 0x3d },
++	{ STB0899_RCOMP			, 0x81 },
++	{ STB0899_AGCIQIN		, 0x80 },
++	{ STB0899_AGC2I1		, 0x04 },
++	{ STB0899_AGC2I2		, 0xf5 },
++	{ STB0899_TLIR			, 0x25 },
++	{ STB0899_RTF			, 0x80 },
++	{ STB0899_DSTATUS		, 0x00 },
++	{ STB0899_LDI			, 0xca },
++	{ STB0899_CFRM			, 0xf1 },
++	{ STB0899_CFRL			, 0xf3 },
++	{ STB0899_NIRM			, 0x2a },
++	{ STB0899_NIRL			, 0x05 },
++	{ STB0899_ISYMB			, 0x17 },
++	{ STB0899_QSYMB			, 0xfa },
++	{ STB0899_SFRH          	, 0x2f },
++	{ STB0899_SFRM          	, 0x68 },
++	{ STB0899_SFRL          	, 0x40 },
++	{ STB0899_SFRUPH        	, 0x2f },
++	{ STB0899_SFRUPM        	, 0x68 },
++	{ STB0899_SFRUPL        	, 0x40 },
++	{ STB0899_EQUAI1		, 0xfd },
++	{ STB0899_EQUAQ1		, 0x04 },
++	{ STB0899_EQUAI2		, 0x0f },
++	{ STB0899_EQUAQ2		, 0xff },
++	{ STB0899_EQUAI3		, 0xdf },
++	{ STB0899_EQUAQ3		, 0xfa },
++	{ STB0899_EQUAI4		, 0x37 },
++	{ STB0899_EQUAQ4		, 0x0d },
++	{ STB0899_EQUAI5		, 0xbd },
++	{ STB0899_EQUAQ5		, 0xf7 },
++	{ STB0899_DSTATUS2		, 0x00 },
++	{ STB0899_VSTATUS       	, 0x00 },
++	{ STB0899_VERROR		, 0xff },
++	{ STB0899_IQSWAP		, 0x2a },
++	{ STB0899_ECNT1M		, 0x00 },
++	{ STB0899_ECNT1L		, 0x00 },
++	{ STB0899_ECNT2M		, 0x00 },
++	{ STB0899_ECNT2L		, 0x00 },
++	{ STB0899_ECNT3M		, 0x00 },
++	{ STB0899_ECNT3L		, 0x00 },
++	{ STB0899_FECAUTO1      	, 0x06 },
++	{ STB0899_FECM	        	, 0x01 },
++	{ STB0899_VTH12         	, 0xf0 },
++	{ STB0899_VTH23         	, 0xa0 },
++	{ STB0899_VTH34	        	, 0x78 },
++	{ STB0899_VTH56         	, 0x4e },
++	{ STB0899_VTH67         	, 0x48 },
++	{ STB0899_VTH78         	, 0x38 },
++	{ STB0899_PRVIT         	, 0xff },
++	{ STB0899_VITSYNC       	, 0x19 },
++	{ STB0899_RSULC         	, 0xb1 }, /* DVB = 0xb1, DSS = 0xa1 */
++	{ STB0899_TSULC         	, 0x42 },
++	{ STB0899_RSLLC         	, 0x40 },
++	{ STB0899_TSLPL	        	, 0x12 },
++	{ STB0899_TSCFGH        	, 0x0c },
++	{ STB0899_TSCFGM        	, 0x00 },
++	{ STB0899_TSCFGL        	, 0x0c },
++	{ STB0899_TSOUT			, 0x0d }, /* 0x0d for CAM */
++	{ STB0899_RSSYNCDEL     	, 0x00 },
++	{ STB0899_TSINHDELH     	, 0x02 },
++	{ STB0899_TSINHDELM		, 0x00 },
++	{ STB0899_TSINHDELL		, 0x00 },
++	{ STB0899_TSLLSTKM		, 0x00 },
++	{ STB0899_TSLLSTKL		, 0x00 },
++	{ STB0899_TSULSTKM		, 0x00 },
++	{ STB0899_TSULSTKL		, 0xab },
++	{ STB0899_PCKLENUL		, 0x00 },
++	{ STB0899_PCKLENLL		, 0xcc },
++	{ STB0899_RSPCKLEN		, 0xcc },
++	{ STB0899_TSSTATUS		, 0x80 },
++	{ STB0899_ERRCTRL1      	, 0xb6 },
++	{ STB0899_ERRCTRL2      	, 0x96 },
++	{ STB0899_ERRCTRL3      	, 0x89 },
++	{ STB0899_DMONMSK1		, 0x27 },
++	{ STB0899_DMONMSK0		, 0x03 },
++	{ STB0899_DEMAPVIT      	, 0x5c },
++	{ STB0899_PLPARM		, 0x1f },
++	{ STB0899_PDELCTRL      	, 0x48 },
++	{ STB0899_PDELCTRL2     	, 0x00 },
++	{ STB0899_BBHCTRL1      	, 0x00 },
++	{ STB0899_BBHCTRL2      	, 0x00 },
++	{ STB0899_HYSTTHRESH    	, 0x77 },
++	{ STB0899_MATCSTM		, 0x00 },
++	{ STB0899_MATCSTL		, 0x00 },
++	{ STB0899_UPLCSTM		, 0x00 },
++	{ STB0899_UPLCSTL		, 0x00 },
++	{ STB0899_DFLCSTM		, 0x00 },
++	{ STB0899_DFLCSTL		, 0x00 },
++	{ STB0899_SYNCCST		, 0x00 },
++	{ STB0899_SYNCDCSTM		, 0x00 },
++	{ STB0899_SYNCDCSTL		, 0x00 },
++	{ STB0899_ISI_ENTRY		, 0x00 },
++	{ STB0899_ISI_BIT_EN		, 0x00 },
++	{ STB0899_MATSTRM		, 0x00 },
++	{ STB0899_MATSTRL		, 0x00 },
++	{ STB0899_UPLSTRM		, 0x00 },
++	{ STB0899_UPLSTRL		, 0x00 },
++	{ STB0899_DFLSTRM		, 0x00 },
++	{ STB0899_DFLSTRL		, 0x00 },
++	{ STB0899_SYNCSTR		, 0x00 },
++	{ STB0899_SYNCDSTRM		, 0x00 },
++	{ STB0899_SYNCDSTRL		, 0x00 },
++	{ STB0899_CFGPDELSTATUS1	, 0x10 },
++	{ STB0899_CFGPDELSTATUS2	, 0x00 },
++	{ STB0899_BBFERRORM		, 0x00 },
++	{ STB0899_BBFERRORL		, 0x00 },
++	{ STB0899_UPKTERRORM		, 0x00 },
++	{ STB0899_UPKTERRORL		, 0x00 },
++	{ 0xffff			, 0xff },
++};
++
++struct stb0899_config vp1041_config = {
++	.init_dev		= vp1041_stb0899_s1_init_1,
++	.init_s2_demod		= stb0899_s2_init_2,
++	.init_s1_demod		= vp1041_stb0899_s1_init_3,
++	.init_s2_fec		= stb0899_s2_init_4,
++	.init_tst		= stb0899_s1_init_5,
++
++	.demod_address 		= 0x68, /*  0xd0 >> 1 */
++
++	.xtal_freq		= 27000000,
++	.inversion		= IQ_SWAP_ON, /* 1 */
++
++	.esno_ave		= STB0899_DVBS2_ESNO_AVE,
++	.esno_quant		= STB0899_DVBS2_ESNO_QUANT,
++	.avframes_coarse	= STB0899_DVBS2_AVFRAMES_COARSE,
++	.avframes_fine		= STB0899_DVBS2_AVFRAMES_FINE,
++	.miss_threshold		= STB0899_DVBS2_MISS_THRESHOLD,
++	.uwp_threshold_acq	= STB0899_DVBS2_UWP_THRESHOLD_ACQ,
++	.uwp_threshold_track	= STB0899_DVBS2_UWP_THRESHOLD_TRACK,
++	.uwp_threshold_sof	= STB0899_DVBS2_UWP_THRESHOLD_SOF,
++	.sof_search_timeout	= STB0899_DVBS2_SOF_SEARCH_TIMEOUT,
++
++	.btr_nco_bits		= STB0899_DVBS2_BTR_NCO_BITS,
++	.btr_gain_shift_offset	= STB0899_DVBS2_BTR_GAIN_SHIFT_OFFSET,
++	.crl_nco_bits		= STB0899_DVBS2_CRL_NCO_BITS,
++	.ldpc_max_iter		= STB0899_DVBS2_LDPC_MAX_ITER,
++
++	.tuner_get_frequency	= stb6100_get_frequency,
++	.tuner_set_frequency	= stb6100_set_frequency,
++	.tuner_set_bandwidth	= stb6100_set_bandwidth,
++	.tuner_get_bandwidth	= stb6100_get_bandwidth,
++	.tuner_set_rfsiggain	= NULL,
++};
++
++struct stb6100_config vp1041_stb6100_config = {
++	.tuner_address	= 0x60,
++	.refclock	= 27000000,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.h b/drivers/media/dvb/mantis/mantis_vp1041.h
+new file mode 100644
+index 0000000..53f4cb1
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp1041.h
+@@ -0,0 +1,36 @@
++/*
++	Mantis VP-1041 driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_VP1041_H
++#define __MANTIS_VP1041_H
++
++#include "dvb_frontend.h"
++#include "mantis_common.h"
++#include "stb0899_drv.h"
++#include "stb6100.h"
++#include "lnbp21.h"
++
++#define MANTIS_VP_1041_DVB_S2	0x0031
++
++extern struct mantis_hwconfig vp1041_mantis_config;
++extern struct stb0899_config vp1041_config;
++extern struct stb6100_config vp1041_stb6100_config;
++
++#endif // __MANTIS_VP1041_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0027-V4L-DVB-13725-Mantis-VP-1041-Revert-to-old-register-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0027-V4L-DVB-13725-Mantis-VP-1041-Revert-to-old-register-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,212 @@
+From 10b2d83487ca10de1738257dbe3277dffe572776 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:44:55 -0300
+Subject: [PATCH 027/120] V4L/DVB (13725): [Mantis/VP-1041] Revert to old register initialization parameters, for now.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to eso46 for pointing it out
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 0131258ba7a5f776627da953b4cef775568026ea)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_vp1041.c |  126 +++++++++++++++---------------
+ 1 files changed, 63 insertions(+), 63 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index a3279f0..8854ef3 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -125,102 +125,102 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
+ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
+ 	{ STB0899_DEMOD         	, 0x00 },
+ 	{ STB0899_RCOMPC        	, 0xc9 },
+-	{ STB0899_AGC1CN        	, 0x41 },
++	{ STB0899_AGC1CN        	, 0x01 },
+ 	{ STB0899_AGC1REF       	, 0x10 },
+-	{ STB0899_RTC	        	, 0x7a },
++	{ STB0899_RTC	        	, 0x23 },
+ 	{ STB0899_TMGCFG        	, 0x4e },
+ 	{ STB0899_AGC2REF       	, 0x34 },
+ 	{ STB0899_TLSR          	, 0x84 },
+-	{ STB0899_CFD           	, 0xc7 },
++	{ STB0899_CFD           	, 0xf7 },
+ 	{ STB0899_ACLC	        	, 0x87 },
+ 	{ STB0899_BCLC          	, 0x94 },
+ 	{ STB0899_EQON          	, 0x41 },
+-	{ STB0899_LDT           	, 0xdd },
+-	{ STB0899_LDT2          	, 0xc9 },
++	{ STB0899_LDT           	, 0xf1 },
++	{ STB0899_LDT2          	, 0xe3 },
+ 	{ STB0899_EQUALREF      	, 0xb4 },
+ 	{ STB0899_TMGRAMP       	, 0x10 },
+ 	{ STB0899_TMGTHD        	, 0x30 },
+-	{ STB0899_IDCCOMP		, 0xfb },
+-	{ STB0899_QDCCOMP		, 0x03 },
+-	{ STB0899_POWERI		, 0x3b },
+-	{ STB0899_POWERQ		, 0x3d },
+-	{ STB0899_RCOMP			, 0x81 },
++	{ STB0899_IDCCOMP		, 0xfd },
++	{ STB0899_QDCCOMP		, 0xff },
++	{ STB0899_POWERI		, 0x0c },
++	{ STB0899_POWERQ		, 0x0f },
++	{ STB0899_RCOMP			, 0x6c },
+ 	{ STB0899_AGCIQIN		, 0x80 },
+-	{ STB0899_AGC2I1		, 0x04 },
+-	{ STB0899_AGC2I2		, 0xf5 },
+-	{ STB0899_TLIR			, 0x25 },
+-	{ STB0899_RTF			, 0x80 },
++	{ STB0899_AGC2I1		, 0x06 },
++	{ STB0899_AGC2I2		, 0x00 },
++	{ STB0899_TLIR			, 0x30 },
++	{ STB0899_RTF			, 0x7f },
+ 	{ STB0899_DSTATUS		, 0x00 },
+-	{ STB0899_LDI			, 0xca },
+-	{ STB0899_CFRM			, 0xf1 },
+-	{ STB0899_CFRL			, 0xf3 },
+-	{ STB0899_NIRM			, 0x2a },
+-	{ STB0899_NIRL			, 0x05 },
+-	{ STB0899_ISYMB			, 0x17 },
+-	{ STB0899_QSYMB			, 0xfa },
++	{ STB0899_LDI			, 0xbc },
++	{ STB0899_CFRM			, 0xea },
++	{ STB0899_CFRL			, 0x31 },
++	{ STB0899_NIRM			, 0x2b },
++	{ STB0899_NIRL			, 0x80 },
++	{ STB0899_ISYMB			, 0x1d },
++	{ STB0899_QSYMB			, 0xa6 },
+ 	{ STB0899_SFRH          	, 0x2f },
+ 	{ STB0899_SFRM          	, 0x68 },
+ 	{ STB0899_SFRL          	, 0x40 },
+ 	{ STB0899_SFRUPH        	, 0x2f },
+ 	{ STB0899_SFRUPM        	, 0x68 },
+ 	{ STB0899_SFRUPL        	, 0x40 },
+-	{ STB0899_EQUAI1		, 0xfd },
+-	{ STB0899_EQUAQ1		, 0x04 },
+-	{ STB0899_EQUAI2		, 0x0f },
+-	{ STB0899_EQUAQ2		, 0xff },
+-	{ STB0899_EQUAI3		, 0xdf },
+-	{ STB0899_EQUAQ3		, 0xfa },
+-	{ STB0899_EQUAI4		, 0x37 },
+-	{ STB0899_EQUAQ4		, 0x0d },
+-	{ STB0899_EQUAI5		, 0xbd },
+-	{ STB0899_EQUAQ5		, 0xf7 },
++	{ STB0899_EQUAI1		, 0x02 },
++	{ STB0899_EQUAQ1		, 0xff },
++	{ STB0899_EQUAI2		, 0x04 },
++	{ STB0899_EQUAQ2		, 0x05 },
++	{ STB0899_EQUAI3		, 0x02 },
++	{ STB0899_EQUAQ3		, 0xfd },
++	{ STB0899_EQUAI4		, 0x03 },
++	{ STB0899_EQUAQ4		, 0x07 },
++	{ STB0899_EQUAI5		, 0x08 },
++	{ STB0899_EQUAQ5		, 0xf5 },
+ 	{ STB0899_DSTATUS2		, 0x00 },
+ 	{ STB0899_VSTATUS       	, 0x00 },
+-	{ STB0899_VERROR		, 0xff },
++	{ STB0899_VERROR		, 0x86 },
+ 	{ STB0899_IQSWAP		, 0x2a },
+ 	{ STB0899_ECNT1M		, 0x00 },
+ 	{ STB0899_ECNT1L		, 0x00 },
+ 	{ STB0899_ECNT2M		, 0x00 },
+ 	{ STB0899_ECNT2L		, 0x00 },
+-	{ STB0899_ECNT3M		, 0x00 },
+-	{ STB0899_ECNT3L		, 0x00 },
++	{ STB0899_ECNT3M		, 0x0a },
++	{ STB0899_ECNT3L		, 0xad },
+ 	{ STB0899_FECAUTO1      	, 0x06 },
+ 	{ STB0899_FECM	        	, 0x01 },
+-	{ STB0899_VTH12         	, 0xf0 },
+-	{ STB0899_VTH23         	, 0xa0 },
+-	{ STB0899_VTH34	        	, 0x78 },
+-	{ STB0899_VTH56         	, 0x4e },
+-	{ STB0899_VTH67         	, 0x48 },
+-	{ STB0899_VTH78         	, 0x38 },
++	{ STB0899_VTH12         	, 0xb0 },
++	{ STB0899_VTH23         	, 0x7a },
++	{ STB0899_VTH34	        	, 0x58 },
++	{ STB0899_VTH56         	, 0x38 },
++	{ STB0899_VTH67         	, 0x34 },
++	{ STB0899_VTH78         	, 0x24 },
+ 	{ STB0899_PRVIT         	, 0xff },
+ 	{ STB0899_VITSYNC       	, 0x19 },
+ 	{ STB0899_RSULC         	, 0xb1 }, /* DVB = 0xb1, DSS = 0xa1 */
+ 	{ STB0899_TSULC         	, 0x42 },
+-	{ STB0899_RSLLC         	, 0x40 },
++	{ STB0899_RSLLC         	, 0x41 },
+ 	{ STB0899_TSLPL	        	, 0x12 },
+ 	{ STB0899_TSCFGH        	, 0x0c },
+ 	{ STB0899_TSCFGM        	, 0x00 },
+-	{ STB0899_TSCFGL        	, 0x0c },
+-	{ STB0899_TSOUT			, 0x0d }, /* 0x0d for CAM */
++	{ STB0899_TSCFGL        	, 0x00 },
++	{ STB0899_TSOUT			, 0x69 }, /* 0x0d for CAM */
+ 	{ STB0899_RSSYNCDEL     	, 0x00 },
+ 	{ STB0899_TSINHDELH     	, 0x02 },
+ 	{ STB0899_TSINHDELM		, 0x00 },
+ 	{ STB0899_TSINHDELL		, 0x00 },
+-	{ STB0899_TSLLSTKM		, 0x00 },
+-	{ STB0899_TSLLSTKL		, 0x00 },
++	{ STB0899_TSLLSTKM		, 0x1b },
++	{ STB0899_TSLLSTKL		, 0xb3 },
+ 	{ STB0899_TSULSTKM		, 0x00 },
+-	{ STB0899_TSULSTKL		, 0xab },
+-	{ STB0899_PCKLENUL		, 0x00 },
++	{ STB0899_TSULSTKL		, 0x00 },
++	{ STB0899_PCKLENUL		, 0xbc },
+ 	{ STB0899_PCKLENLL		, 0xcc },
+-	{ STB0899_RSPCKLEN		, 0xcc },
+-	{ STB0899_TSSTATUS		, 0x80 },
++	{ STB0899_RSPCKLEN		, 0xbd },
++	{ STB0899_TSSTATUS		, 0x90 },
+ 	{ STB0899_ERRCTRL1      	, 0xb6 },
+-	{ STB0899_ERRCTRL2      	, 0x96 },
+-	{ STB0899_ERRCTRL3      	, 0x89 },
++	{ STB0899_ERRCTRL2      	, 0x95 },
++	{ STB0899_ERRCTRL3      	, 0x8d },
+ 	{ STB0899_DMONMSK1		, 0x27 },
+ 	{ STB0899_DMONMSK0		, 0x03 },
+ 	{ STB0899_DEMAPVIT      	, 0x5c },
+-	{ STB0899_PLPARM		, 0x1f },
++	{ STB0899_PLPARM		, 0x19 },
+ 	{ STB0899_PDELCTRL      	, 0x48 },
+ 	{ STB0899_PDELCTRL2     	, 0x00 },
+ 	{ STB0899_BBHCTRL1      	, 0x00 },
+@@ -237,19 +237,19 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
+ 	{ STB0899_SYNCDCSTL		, 0x00 },
+ 	{ STB0899_ISI_ENTRY		, 0x00 },
+ 	{ STB0899_ISI_BIT_EN		, 0x00 },
+-	{ STB0899_MATSTRM		, 0x00 },
+-	{ STB0899_MATSTRL		, 0x00 },
+-	{ STB0899_UPLSTRM		, 0x00 },
+-	{ STB0899_UPLSTRL		, 0x00 },
+-	{ STB0899_DFLSTRM		, 0x00 },
++	{ STB0899_MATSTRM		, 0xf0 },
++	{ STB0899_MATSTRL		, 0x02 },
++	{ STB0899_UPLSTRM		, 0x45 },
++	{ STB0899_UPLSTRL		, 0x60 },
++	{ STB0899_DFLSTRM		, 0xe3 },
+ 	{ STB0899_DFLSTRL		, 0x00 },
+-	{ STB0899_SYNCSTR		, 0x00 },
+-	{ STB0899_SYNCDSTRM		, 0x00 },
+-	{ STB0899_SYNCDSTRL		, 0x00 },
+-	{ STB0899_CFGPDELSTATUS1	, 0x10 },
+-	{ STB0899_CFGPDELSTATUS2	, 0x00 },
++	{ STB0899_SYNCSTR		, 0x47 },
++	{ STB0899_SYNCDSTRM		, 0x05 },
++	{ STB0899_SYNCDSTRL		, 0x18 },
++	{ STB0899_CFGPDELSTATUS1	, 0x19 },
++	{ STB0899_CFGPDELSTATUS2	, 0x2b },
+ 	{ STB0899_BBFERRORM		, 0x00 },
+-	{ STB0899_BBFERRORL		, 0x00 },
++	{ STB0899_BBFERRORL		, 0x01 },
+ 	{ STB0899_UPKTERRORM		, 0x00 },
+ 	{ STB0899_UPKTERRORL		, 0x00 },
+ 	{ 0xffff			, 0xff },
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0028-V4L-DVB-13726-Mantis-Skystar-HD2-Add-support-for-the.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0028-V4L-DVB-13726-Mantis-Skystar-HD2-Add-support-for-the.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,58 @@
+From 4a9230dd5b0b24c1ee13959924a240835c58f132 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:47:30 -0300
+Subject: [PATCH 028/120] V4L/DVB (13726): [Mantis/Skystar HD2] Add support for the Technisat Skystar HD2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 35afca912ffb8ea5a060ff53a59266ccaa769c98)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_core.c   |    1 +
+ drivers/media/dvb/mantis/mantis_dvb.c    |    1 +
+ drivers/media/dvb/mantis/mantis_vp1041.h |    1 +
+ 3 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 47cfb75..a164bb1 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -113,6 +113,7 @@ static void mantis_load_config(struct mantis_pci *mantis)
+ 		mantis->hwconfig = &vp1034_mantis_config;
+ 		break;
+ 	case MANTIS_VP_1041_DVB_S2:	// VP-1041
++	case TECHNISAT_SKYSTAR_HD2:
+ 		mantis->hwconfig = &vp1041_mantis_config;
+ 		break;
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index a4750bb..9634b97 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -240,6 +240,7 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 		}
+ 		break;
+ 	case MANTIS_VP_1041_DVB_S2:
++	case TECHNISAT_SKYSTAR_HD2:
+ 		mantis->fe = stb0899_attach(&vp1041_config, &mantis->adapter);
+ 		if (mantis->fe) {
+ 			dprintk(verbose, MANTIS_ERROR, 1,
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.h b/drivers/media/dvb/mantis/mantis_vp1041.h
+index 53f4cb1..2cc83a6 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.h
++++ b/drivers/media/dvb/mantis/mantis_vp1041.h
+@@ -28,6 +28,7 @@
+ #include "lnbp21.h"
+ 
+ #define MANTIS_VP_1041_DVB_S2	0x0031
++#define TECHNISAT_SKYSTAR_HD2	0x0001
+ 
+ extern struct mantis_hwconfig vp1041_mantis_config;
+ extern struct stb0899_config vp1041_config;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0029-V4L-DVB-13727-Mantis-VP-1041-Bugfix-Sigh-Don-t-look-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0029-V4L-DVB-13727-Mantis-VP-1041-Bugfix-Sigh-Don-t-look-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,33 @@
+From ffabdfc2881ac07aa8ce7b27869f4372e887e7e7 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:48:03 -0300
+Subject: [PATCH 029/120] V4L/DVB (13727): [Mantis/VP-1041] Bugfix: Sigh! Don't look for the STOP bit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 1159531a93f04346d94f72fdb4719c3f7e7d0a8c)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_vp1041.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index 8854ef3..7dee1af 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -64,7 +64,7 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
+ 	{ STB0899_IRQMSK_0		, 0xff },
+ 	{ STB0899_IRQCFG		, 0x00 },
+ 	{ STB0899_I2CCFG        	, 0x88 },
+-	{ STB0899_I2CRPT        	, 0x5c },
++	{ STB0899_I2CRPT        	, 0x58 },
+ 	{ STB0899_IOPVALUE5		, 0x00 },
+ 	{ STB0899_IOPVALUE4		, 0x33 },
+ 	{ STB0899_IOPVALUE3		, 0x6d },
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0030-V4L-DVB-13728-Mantis-Add-in-some-Host-Interface-defi.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0030-V4L-DVB-13728-Mantis-Add-in-some-Host-Interface-defi.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From 76360bfbbbd52a857a5aabc8430801025593f2df Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:52:23 -0300
+Subject: [PATCH 030/120] V4L/DVB (13728): [Mantis] Add in some Host Interface definitions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 9ce39460837202920fb9bad88eeec13fc75e7a13)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.h |    9 +++++++++
+ 1 files changed, 9 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_hif.h
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.h b/drivers/media/dvb/mantis/mantis_hif.h
+new file mode 100644
+index 0000000..33b4f2b
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_hif.h
+@@ -0,0 +1,9 @@
++#ifndef __MANTIS_HIF_H
++#define __MANTIS_HIF_H
++
++#define MANTIS_HIF_MEMRD		1
++#define MANTIS_HIF_MEMWR		2
++#define MANTIS_HIF_IOMRD		3
++#define MANTIS_HIF_IOMWR		4
++
++#endif // __MANTIS_HIF_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0031-V4L-DVB-13729-Mantis-Add-in-a-license-header.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0031-V4L-DVB-13729-Mantis-Add-in-a-license-header.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,48 @@
+From 4bb6decd82cafbf52b671ca1c12f71b579b9814c Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:53:07 -0300
+Subject: [PATCH 031/120] V4L/DVB (13729): [Mantis] Add in a license header
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 23fc1b2b00e849f6ec8628da77e2f282aedbebf3)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.h |   20 ++++++++++++++++++++
+ 1 files changed, 20 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.h b/drivers/media/dvb/mantis/mantis_hif.h
+index 33b4f2b..7ef45ce 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.h
++++ b/drivers/media/dvb/mantis/mantis_hif.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_HIF_H
+ #define __MANTIS_HIF_H
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0032-V4L-DVB-13730-Mantis-Add-in-some-UART-definitions.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0032-V4L-DVB-13730-Mantis-Add-in-some-UART-definitions.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,45 @@
+From a2b6bd1a3794cb067d95f8e0af7d02b3f9ab2e69 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:59:05 -0300
+Subject: [PATCH 032/120] V4L/DVB (13730): [Mantis] Add in some UART definitions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit cb428c3fe9667eb7521769f25f65b9dbf52a33ca)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_uart.h |   18 ++++++++++++++++++
+ 1 files changed, 18 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_uart.h
+
+diff --git a/drivers/media/dvb/mantis/mantis_uart.h b/drivers/media/dvb/mantis/mantis_uart.h
+new file mode 100644
+index 0000000..6c9a17c
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_uart.h
+@@ -0,0 +1,18 @@
++#ifndef __MANTIS_UART_H
++#define __MANTIS_UART_H
++
++enum mantis_baud {
++	MANTIS_BAUD_9600	= 0,
++	MANTIS_BAUD_19200,
++	MANTIS_BAUD_38400,
++	MANTIS_BAUD_57600,
++	MANTIS_BAUD_115200
++};
++
++enum mantis_parity {
++	MANTIS_PARITY_NONE	= 0,
++	MANTIS_PARITY_EVEN,
++	MANTIS_PARITY_ODD
++};
++
++#endif // __MANTIS_UART_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0033-V4L-DVB-13731-Mantis-Add-in-a-license-header.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0033-V4L-DVB-13731-Mantis-Add-in-a-license-header.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,48 @@
+From 6f11d90b8e18eec1587f9b3d7ca3e500114c26a3 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 04:59:44 -0300
+Subject: [PATCH 033/120] V4L/DVB (13731): [Mantis] Add in a license header
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit d4f4ae046d2a9cd6b7ddb39e336a73ed92b63fe8)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_uart.h |   20 ++++++++++++++++++++
+ 1 files changed, 20 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_uart.h b/drivers/media/dvb/mantis/mantis_uart.h
+index 6c9a17c..6113863 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.h
++++ b/drivers/media/dvb/mantis/mantis_uart.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_UART_H
+ #define __MANTIS_UART_H
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0034-V4L-DVB-13732-Mantis-Add-in-some-Link-Layer-definiti.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0034-V4L-DVB-13732-Mantis-Add-in-some-Link-Layer-definiti.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,78 @@
+From 30987d95eb9450a448f71c575e0bd031cc657378 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:00:30 -0300
+Subject: [PATCH 034/120] V4L/DVB (13732): [Mantis] Add in some Link Layer definitions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit dd827da1e7d6ecf81883af68731cf0f1c2393c6d)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_link.h |   51 ++++++++++++++++++++++++++++++++
+ 1 files changed, 51 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_link.h
+
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+new file mode 100644
+index 0000000..2849457
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -0,0 +1,51 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __MANTIS_LINK_H
++#define __MANTIS_LINK_H
++
++enum mantis_sbuf_status {
++	MANTIS_SBUF_DATA_AVAIL		= 1,
++	MANTIS_SBUF_DATA_EMPTY		= 2,
++	MANTIS_SBUF_DATA_OVFLW		= 3
++};
++
++struct mantis_slot {
++	u32				timeout;
++};
++
++struct mantis_ca {
++	struct mantis_slot		slot;
++
++	struct tasklet_struct		hif_evm_tasklet;
++
++	u32				hif_event;
++	wait_queue_head_t		hif_opdone_wq;
++	wait_queue_head_t		hif_brrdyw_wq;
++	wait_queue_head_t		hif_data_wq;
++	u32				hif_job_queue
++
++	enum mantis_sbuf_status		sbuf_status;
++
++	struct dvb_device		*ca_dev;
++	void				*ca_priv;
++};
++
++#endif // __MANTIS_LINK_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0035-V4L-DVB-13733-Mantis-Start-with-the-PCMCIA-interface.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0035-V4L-DVB-13733-Mantis-Start-with-the-PCMCIA-interface.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,124 @@
+From 5a523189c824cae44f9cbac72014a5604511bbea Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:03:35 -0300
+Subject: [PATCH 035/120] V4L/DVB (13733): [Mantis] Start with the PCMCIA interface
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit bc4ed42fdf762a2049b255de92626ad1cfd86d8e)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile        |   17 ++++++++-------
+ drivers/media/dvb/mantis/mantis_common.h |    4 +++
+ drivers/media/dvb/mantis/mantis_link.h   |    2 +-
+ drivers/media/dvb/mantis/mantis_pcmcia.c |   34 ++++++++++++++++++++++++++++++
+ 4 files changed, 48 insertions(+), 9 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_pcmcia.c
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index bdf3e36..fa9e806 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -1,11 +1,12 @@
+-mantis-objs = 	mantis_core.o \
+-		mantis_dma.o \
+-		mantis_pci.o \
+-		mantis_i2c.o \
+-		mantis_dvb.o \
+-		mantis_vp1033.o \
+-		mantis_vp1034.o \
+-		mantis_vp1041.o \
++mantis-objs = 	mantis_core.o	\
++		mantis_dma.o	\
++		mantis_pci.o	\
++		mantis_i2c.o	\
++		mantis_dvb.o	\
++		mantis_pcmcia.o	\
++		mantis_vp1033.o	\
++		mantis_vp1034.o	\
++		mantis_vp1041.o	\
+ 		mantis_vp2033.o	\
+ 		mantis_vp2040.o	\
+ 		mantis_vp3030.o
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 34d2389..24fc6da 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -35,6 +35,8 @@
+ #include <linux/i2c.h>
+ #include "mantis_reg.h"
+ 
++#include "mantis_link.h"
++
+ #define MANTIS_ERROR		0
+ #define MANTIS_NOTICE		1
+ #define MANTIS_INFO		2
+@@ -134,6 +136,8 @@ struct mantis_pci {
+ 
+ 	 /*	A12 A13 A14		*/
+ 	int			gpio_status;
++
++	struct mantis_ca	*mantis_ca;
+ };
+ 
+ extern unsigned int verbose;
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index 2849457..2d9b64f 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -40,7 +40,7 @@ struct mantis_ca {
+ 	wait_queue_head_t		hif_opdone_wq;
+ 	wait_queue_head_t		hif_brrdyw_wq;
+ 	wait_queue_head_t		hif_data_wq;
+-	u32				hif_job_queue
++	u32				hif_job_queue;
+ 
+ 	enum mantis_sbuf_status		sbuf_status;
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+new file mode 100644
+index 0000000..63f9621
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -0,0 +1,34 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++
++int mantis_pcmcia_init(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	return 0;
++}
++
++void mantis_pcmcia_exit(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++
++}
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0036-V4L-DVB-13734-Mantis-Initial-go-at-an-Event-Manager.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0036-V4L-DVB-13734-Mantis-Initial-go-at-an-Event-Manager.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,91 @@
+From d507f514ba5dd6b3ce52467628ddb7ffc7335219 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:04:18 -0300
+Subject: [PATCH 036/120] V4L/DVB (13734): [Mantis] Initial go at an Event Manager
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit d575571e8eda92c2cfd727ef050d17e30878fee6)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile        |    1 +
+ drivers/media/dvb/mantis/mantis_common.h |    2 +
+ drivers/media/dvb/mantis/mantis_evm.c    |   37 ++++++++++++++++++++++++++++++
+ 3 files changed, 40 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_evm.c
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index fa9e806..38d0e6d 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -3,6 +3,7 @@ mantis-objs = 	mantis_core.o	\
+ 		mantis_pci.o	\
+ 		mantis_i2c.o	\
+ 		mantis_dvb.o	\
++		mantis_evm.o	\
+ 		mantis_pcmcia.o	\
+ 		mantis_vp1033.o	\
+ 		mantis_vp1034.o	\
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 24fc6da..f9891eb 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -77,6 +77,8 @@ struct mantis_hwconfig {
+ };
+ 
+ struct mantis_pci {
++	unsigned int		verbose;
++
+ 	/*	PCI stuff		*/
+ 	u16			vendor_id;
+ 	u16			device_id;
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+new file mode 100644
+index 0000000..c9359d6
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -0,0 +1,37 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_link.h"
++
++int mantis_evmgr_init(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
++	return 0;
++}
++
++void mantis_evmgr_exit(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
++}
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0037-V4L-DVB-13735-Mantis-Implement-the-Event-Manager-tas.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0037-V4L-DVB-13735-Mantis-Implement-the-Event-Manager-tas.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,188 @@
+From cbfb85e388ffddbeaffde6b3a1d86f602ceb45b0 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:05:19 -0300
+Subject: [PATCH 037/120] V4L/DVB (13735): [Mantis] Implement the Event Manager tasklet
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit fadfa070d30434dd228362c933827eb6ce137f2d)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |   65 +++++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_reg.h |   58 +++++++++++++++++++++++++++++-
+ 2 files changed, 122 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index c9359d6..9f1740e 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -20,12 +20,76 @@
+ 
+ #include "mantis_common.h"
+ #include "mantis_link.h"
++#include "mantis_hif.h"
++
++void mantis_hifevm_tasklet(unsigned long data)
++{
++	struct mantis_ca *ca = (struct mantis_ca *) data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	u32 gpif_stat;
++
++	gpif_stat = mmread(MANTIS_GPIF_STATUS);
++
++	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
++		if (gpif_stat & MANTIS_CARD_PLUGIN) {
++			dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
++			mmwrite(0xdada0000, MANTIS_CARD_RESET);
++			// Plugin call here
++			gpif_stat = 0; // crude !
++		}
++	} else {
++		if (gpif_stat & MANTIS_CARD_PLUGOUT) {
++			dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
++			mmwrite(0xdada0000, MANTIS_CARD_RESET);
++			// Unplug call here
++			gpif_stat = 0; // crude !
++		}
++	}
++
++	if (gpif_stat & MANTIS_GPIF_EXTIRQ)
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
++
++	if (gpif_stat & MANTIS_SBUF_WSTO)
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
++
++	if (gpif_stat & MANTIS_GPIF_OTHERR)
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
++
++	if (gpif_stat & MANTIS_SBUF_OVFLW)
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
++
++	if (gpif_stat & MANTIS_GPIF_BRRDY) {
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
++		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
++		if (ca->hif_job_queue & MANTIS_HIF_MEMRD)
++			wake_up(&ca->hif_brrdyw_wq);
++	}
++	if (gpif_stat & MANTIS_GPIF_WRACK)
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
++
++	if (gpif_stat & MANTIS_GPIF_INTSTAT)
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
++
++	if (gpif_stat & MANTIS_SBUF_EMPTY)
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num);
++
++	if (gpif_stat & MANTIS_SBUF_OPDONE) {
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
++		if (ca->hif_job_queue) {
++			wake_up(&ca->hif_opdone_wq);
++			ca->hif_event = MANTIS_SBUF_OPDONE;
++		}
++	}
++}
+ 
+ int mantis_evmgr_init(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
++	tasklet_init(&ca->hif_evm_tasklet, mantis_hifevm_tasklet, (unsigned long) ca);
++
+ 	return 0;
+ }
+ 
+@@ -34,4 +98,5 @@ void mantis_evmgr_exit(struct mantis_ca *ca)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
++	tasklet_kill(&ca->hif_evm_tasklet);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_reg.h b/drivers/media/dvb/mantis/mantis_reg.h
+index 1b54e09..d9862b7 100644
+--- a/drivers/media/dvb/mantis/mantis_reg.h
++++ b/drivers/media/dvb/mantis/mantis_reg.h
+@@ -73,6 +73,40 @@
+ #define MANTIS_I2C_STOP			(0x01 <<  5)
+ #define MANTIS_I2C_PGMODE		(0x01 <<  3)
+ 
++#define MANTIS_GPIF_CFGSLA		0x84
++#define MANTIS_GPIF_WAITSMPL		(0x07 << 28)
++#define MANTIS_GPIF_BYTEADDRSUB		(0x01 << 25)
++#define MANTIS_GPIF_WAITPOL		(0x01 << 24)
++#define MANTIS_GPIF_NCDELAY		(0x07 << 20)
++#define MANTIS_GPIF_RW2CSDELAY		(0x07 << 16)
++#define MANTIS_GPIF_SLFTIMEDMODE	(0x01 << 15)
++#define MANTIS_GPIF_SLFTIMEDDELY	(0x7f <<  8)
++#define MANTIS_GPIF_DEVTYPE		(0x07 <<  4)
++#define MANTIS_GPIF_BIGENDIAN		(0x01 <<  3)
++#define MANTIS_GPIF_FETCHCMD		(0x03 <<  1)
++#define MANTIS_GPIF_HWORDDEV		(0x01 <<  0)
++
++#define MANTIS_GPIF_WSTOPER		0x90
++#define MANTIS_GPIF_WSTOPERWREN3	(0x01 << 31)
++#define MANTIS_GPIF_PARBOOTN		(0x01 << 29)
++#define MANTIS_GPIF_WSTOPERSLID3	(0x1f << 24)
++#define MANTIS_GPIF_WSTOPERWREN2	(0x01 << 23)
++#define MANTIS_GPIF_WSTOPERSLID2	(0x1f << 16)
++#define MANTIS_GPIF_WSTOPERWREN1	(0x01 << 15)
++#define MANTIS_GPIF_WSTOPERSLID1	(0x1f <<  8)
++#define MANTIS_GPIF_WSTOPERWREN0	(0x01 <<  7)
++#define MANTIS_GPIF_WSTOPERSLID0	(0x1f <<  0)
++
++#define MANTIS_GPIF_CS2RW		0x94
++#define MANTIS_GPIF_CS2RWWREN3		(0x01 << 31)
++#define MANTIS_GPIF_CS2RWDELY3		(0x3f << 24)
++#define MANTIS_GPIF_CS2RWWREN2		(0x01 << 23)
++#define MANTIS_GPIF_CS2RWDELY2		(0x3f << 16)
++#define MANTIS_GPIF_CS2RWWREN1		(0x01 << 15)
++#define MANTIS_GPIF_CS2RWDELY1		(0x3f <<  8)
++#define MANTIS_GPIF_CS2RWWREN0		(0x01 <<  7)
++#define MANTIS_GPIF_CS2RWDELY0		(0x3f <<  0)
++
+ #define MANTIS_GPIF_IRQCFG		0x98
+ #define MANTIS_GPIF_IRQPOL		(0x01 <<  8)
+ #define MANTIS_MASK_WRACK		(0x01 <<  7)
+@@ -99,11 +133,33 @@
+ #define MANTIS_CARD_PLUGIN		(0x01 <<  1)
+ #define MANTIS_CARD_PLUGOUT		(0x01 <<  0)
+ 
++#define MANTIS_GPIF_BRADDR		0xa0
++#define MANTIS_GPIF_PCMCIAREG		(0x01 		<< 27)
++#define MANTIS_GPIF_PCMCIAIOM		(0x01 		<< 26)
++#define MANTIS_GPIF_BR_ADDR		(0xfffffff	<<  0)
++
++#define MANTIS_GPIF_BRBYTES		0xa4
++#define MANTIS_GPIF_BRCNT		(0xfff 		<<  0)
++
++#define MANTIS_PCMCIA_RESET		0xa8
++#define MANTIS_PCMCIA_RSTVAL		(0xff << 0)
++
++#define MANTIS_CARD_RESET		0xac
++
+ #define MANTIS_GPIF_ADDR		0xb0
+-#define MANTIS_GPIF_RDWRN		(0x01 << 31)
++#define MANTIS_GPIF_RDWRN		(0x01		<< 31)
++#define MANTIS_GPIF_PCMCIAREG		(0x01		<< 27)
++#define MANTIS_GPIF_PCMCIAIOM		(0x01		<< 26)
++#define MANTIS_GPIF_HIF_ADDR		(0xfffffff	<<  0)
+ 
+ #define MANTIS_GPIF_DOUT		0xb4
++#define MANTIS_GPIF_HIF_DOUT		(0xfffffff	<<  0)
++
+ #define MANTIS_GPIF_DIN			0xb8
++#define MANTIS_GPIF_HIF_DIN		(0xfffffff	<<  0)
+ 
++#define MANTIS_GPIF_SPARE		0xbc
++#define MANTIS_GPIF_LOGICRD		(0xffff		<< 16)
++#define MANTIS_GPIF_LOGICRW		(0xffff		<<  0)
+ 
+ #endif //__MANTIS_REG_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0038-V4L-DVB-13736-Mantis-Implement-CAM-Plug-IN-and-Unplu.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0038-V4L-DVB-13736-Mantis-Implement-CAM-Plug-IN-and-Unplu.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,136 @@
+From a82939e5aec354205b103cfe30ddb7d892e8fa73 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:06:00 -0300
+Subject: [PATCH 038/120] V4L/DVB (13736): [Mantis] Implement CAM Plug IN and Unplug events
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Sigh! how i wish things were simpler ...
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 8ce571f5e7eb7186f676af3b60af7980c2fc7929)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_link.h   |    8 ++++
+ drivers/media/dvb/mantis/mantis_pcmcia.c |   66 ++++++++++++++++++++++++++++++
+ 2 files changed, 74 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index 2d9b64f..c6b3222 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -31,6 +31,12 @@ struct mantis_slot {
+ 	u32				timeout;
+ };
+ 
++/* Physical layer */
++enum mantis_slot_state {
++	MODULE_INSERTED			= 3,
++	MODULE_XTRACTED			= 4
++};
++
+ struct mantis_ca {
+ 	struct mantis_slot		slot;
+ 
+@@ -44,6 +50,8 @@ struct mantis_ca {
+ 
+ 	enum mantis_sbuf_status		sbuf_status;
+ 
++	enum mantis_slot_state		slot_state;
++
+ 	struct dvb_device		*ca_dev;
+ 	void				*ca_priv;
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+index 63f9621..960123f 100644
+--- a/drivers/media/dvb/mantis/mantis_pcmcia.c
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -19,11 +19,75 @@
+ */
+ 
+ #include "mantis_common.h"
++#include "mantis_link.h" /* temporary due to physical layer stuff */
++
++/*
++ * If Slot state is already PLUG_IN event and we are called
++ * again, definitely it is jitter alone
++ */
++void mantis_event_cam_plugin(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	u32 gpif_irqcfg;
++
++	if (ca->slot_state == MODULE_XTRACTED) {
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
++		udelay(50);
++		mmwrite(0xda000000, MANTIS_CARD_RESET);
++		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
++		gpif_irqcfg |= MANTIS_MASK_PLUGOUT;
++		gpif_irqcfg &= ~MANTIS_MASK_PLUGIN;
++		mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
++		udelay(500);
++		ca->slot_state = MODULE_INSERTED;
++	}
++	udelay(100);
++}
++
++/*
++ * If Slot state is already UN_PLUG event and we are called
++ * again, definitely it is jitter alone
++ */
++void mantis_event_cam_unplug(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	u32 gpif_irqcfg;
++
++	if (ca->slot_state == MODULE_INSERTED) {
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
++		udelay(50);
++		mmwrite(0x00da0000, MANTIS_CARD_RESET);
++		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
++		gpif_irqcfg |= MANTIS_MASK_PLUGIN;
++		gpif_irqcfg &= ~MANTIS_MASK_PLUGOUT;
++		mmwrite(gpif_irqcfg, MANTIS_GPIF_IRQCFG);
++		udelay(500);
++		ca->slot_state = MODULE_XTRACTED;
++	}
++	udelay(100);
++}
+ 
+ int mantis_pcmcia_init(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
++	u32 gpif_stat, card_stat;
++
++	gpif_stat = mmread(MANTIS_GPIF_STATUS);
++	card_stat = mmread(MANTIS_GPIF_IRQCFG);
++
++	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
++		mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG);
++		ca->slot_state = MODULE_INSERTED;
++	} else {
++		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
++		mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
++		ca->slot_state = MODULE_XTRACTED;
++	}
++
+ 	return 0;
+ }
+ 
+@@ -31,4 +95,6 @@ void mantis_pcmcia_exit(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
++	mmwrite(mmread(MANTIS_GPIF_STATUS) & (~MANTIS_CARD_PLUGOUT | ~MANTIS_CARD_PLUGIN), MANTIS_GPIF_STATUS);
++	mmwrite(mmread(MANTIS_INT_MASK) & ~MANTIS_INT_IRQ0, MANTIS_INT_MASK);
+ }
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0039-V4L-DVB-13737-Mantis-Register-the-CA-device-dummy-fu.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0039-V4L-DVB-13737-Mantis-Register-the-CA-device-dummy-fu.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,206 @@
+From 2bce8cd841e4d14bd67ece014de12f5c0ccea046 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:06:38 -0300
+Subject: [PATCH 039/120] V4L/DVB (13737): [Mantis] Register the CA device, dummy functions for now
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 50d82602760c99d2c954c33360990c00146532cd)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile      |    1 +
+ drivers/media/dvb/mantis/mantis_ca.c   |  127 ++++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_evm.c  |    4 +
+ drivers/media/dvb/mantis/mantis_link.h |    8 ++
+ 4 files changed, 140 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_ca.c
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index 38d0e6d..c4da0d8 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -4,6 +4,7 @@ mantis-objs = 	mantis_core.o	\
+ 		mantis_i2c.o	\
+ 		mantis_dvb.o	\
+ 		mantis_evm.o	\
++		mantis_ca.o	\
+ 		mantis_pcmcia.o	\
+ 		mantis_vp1033.o	\
+ 		mantis_vp1034.o	\
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+new file mode 100644
+index 0000000..6e440d3
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -0,0 +1,127 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_link.h"
++#include "mantis_hif.h"
++
++
++static int mantis_ca_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long parg)
++{
++	return 0;
++}
++
++static int mantis_ca_open(struct inode *inode, struct file *file)
++{
++	return 0;
++}
++
++static int mantis_ca_release(struct inode *inode, struct file *file)
++{
++	return 0;
++}
++
++static ssize_t mantis_ca_read(struct file *file, char __user *buffer, size_t count, loff_t *ofset)
++{
++	struct dvb_device *dvbdev	= file->private_data;
++	struct mantis_ca *ca		= dvbdev->priv;
++
++	int status;
++
++	return 0;
++error:
++	return status;
++}
++
++static ssize_t mantis_ca_write(struct file *file, const char __user *buffer, size_t count, loff_t *offset)
++{
++	struct dvb_device *dvbdev	= file->private_data;
++	struct mantis_ca *ca		= dvbdev->priv;
++
++	int status;
++
++	return 0;
++error:
++	return status;
++}
++
++static struct file_operations mantis_fops = {
++	.owner		= THIS_MODULE,
++	.ioctl		= mantis_ca_ioctl,
++	.open		= mantis_ca_open,
++	.release	= mantis_ca_release,
++	.read		= mantis_ca_read,
++	.write		= mantis_ca_write,
++};
++
++static struct dvb_device mantis_ca = {
++	.priv		= NULL,
++	.users		= 1,
++	.readers	= 1,
++	.writers	= 1,
++	.fops		= &mantis_fops,
++};
++
++struct dvb_device *mantis_ca_init(struct mantis_pci *mantis)
++{
++	int ret;
++
++	struct dvb_device *dvbdev;
++	struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
++	struct mantis_ca *ca;
++
++	if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
++		return NULL;
++	}
++
++	ca->ca_priv = mantis;
++	mantis->mantis_ca = ca;
++	mantis_evmgr_init(ca);
++
++	dprintk(verbose, MANTIS_ERROR, 0, "CA: Registering Mantis Adapter(%d) Slot(0)\n", mantis->num);
++	if (dvb_register_device(dvb_adapter, &dvbdev, &mantis_ca, ca, DVB_DEVICE_CA) == 0) {
++		ca->ca_dev = dvbdev;
++		return ca->ca_dev;
++	}
++	return 0;
++
++error:
++	if (ca != NULL) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Error ..");
++		if (ca->ca_dev != NULL)
++			dvb_unregister_device(ca->ca_dev);
++
++		kfree(ca);
++	}
++	return NULL;
++}
++
++void mantis_ca_exit(struct mantis_pci *mantis)
++{
++	struct mantis_ca *ca = mantis->mantis_ca;
++
++	mantis_evmgr_exit(ca);
++	dprintk(verbose, MANTIS_ERROR, 0, "CA: Unregister Mantis Adapter(%d) Slot(0)\n", mantis->num);
++	if (ca->ca_dev)
++		dvb_unregister_device(ca->ca_dev);
++
++	kfree(ca);
++}
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 9f1740e..c4a1c89 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -90,6 +90,8 @@ int mantis_evmgr_init(struct mantis_ca *ca)
+ 	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
+ 	tasklet_init(&ca->hif_evm_tasklet, mantis_hifevm_tasklet, (unsigned long) ca);
+ 
++	mantis_pcmcia_init(ca);
++
+ 	return 0;
+ }
+ 
+@@ -99,4 +101,6 @@ void mantis_evmgr_exit(struct mantis_ca *ca)
+ 
+ 	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
+ 	tasklet_kill(&ca->hif_evm_tasklet);
++
++	mantis_pcmcia_exit(ca);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index c6b3222..a45dd71 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -56,4 +56,12 @@ struct mantis_ca {
+ 	void				*ca_priv;
+ };
+ 
++/* CA */
++extern void mantis_event_cam_plugin(struct mantis_ca *ca);
++extern void mantis_event_cam_unplug(struct mantis_ca *ca);
++extern int mantis_pcmcia_init(struct mantis_ca *ca);
++extern void mantis_pcmcia_exit(struct mantis_ca *ca);
++extern int mantis_evmgr_init(struct mantis_ca *ca);
++extern void mantis_evmgr_exit(struct mantis_ca *ca);
++
+ #endif // __MANTIS_LINK_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0040-V4L-DVB-13738-Mantis-Enable-IRQ0-events.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0040-V4L-DVB-13738-Mantis-Enable-IRQ0-events.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,216 @@
+From 3333df30c7b63f37c47d31829ace399caaf9cedd Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:07:41 -0300
+Subject: [PATCH 040/120] V4L/DVB (13738): [Mantis] Enable IRQ0 events
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit d9dd5f7168d6a61491996fc02e4deb9d96308178)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c     |    4 ++--
+ drivers/media/dvb/mantis/mantis_dvb.c    |    2 ++
+ drivers/media/dvb/mantis/mantis_evm.c    |   26 +++++++++++++-------------
+ drivers/media/dvb/mantis/mantis_pci.c    |   10 ++++------
+ drivers/media/dvb/mantis/mantis_pcmcia.c |    9 +++++----
+ 5 files changed, 26 insertions(+), 25 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 6e440d3..e6de3c9 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -93,12 +93,12 @@ struct dvb_device *mantis_ca_init(struct mantis_pci *mantis)
+ 	}
+ 
+ 	ca->ca_priv = mantis;
+-	mantis->mantis_ca = ca;
+-	mantis_evmgr_init(ca);
+ 
+ 	dprintk(verbose, MANTIS_ERROR, 0, "CA: Registering Mantis Adapter(%d) Slot(0)\n", mantis->num);
+ 	if (dvb_register_device(dvb_adapter, &dvbdev, &mantis_ca, ca, DVB_DEVICE_CA) == 0) {
+ 		ca->ca_dev = dvbdev;
++		mantis->mantis_ca = ca;
++		mantis_evmgr_init(ca);
+ 		return ca->ca_dev;
+ 	}
+ 	return 0;
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 9634b97..3325b59 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -190,6 +190,8 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ 	dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx);
+ 	tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis);
+ 	mantis_frontend_init(mantis);
++	mantis_ca_init(mantis);
++
+ 	return 0;
+ 
+ 	/*	Error conditions ..	*/
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index c4a1c89..d81068d 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -33,14 +33,14 @@ void mantis_hifevm_tasklet(unsigned long data)
+ 
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+ 		if (gpif_stat & MANTIS_CARD_PLUGIN) {
+-			dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
++			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+ 			// Plugin call here
+ 			gpif_stat = 0; // crude !
+ 		}
+ 	} else {
+ 		if (gpif_stat & MANTIS_CARD_PLUGOUT) {
+-			dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
++			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+ 			// Unplug call here
+ 			gpif_stat = 0; // crude !
+@@ -48,34 +48,34 @@ void mantis_hifevm_tasklet(unsigned long data)
+ 	}
+ 
+ 	if (gpif_stat & MANTIS_GPIF_EXTIRQ)
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_WSTO)
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_OTHERR)
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_OVFLW)
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_BRRDY) {
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
+ 		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
+ 		if (ca->hif_job_queue & MANTIS_HIF_MEMRD)
+ 			wake_up(&ca->hif_brrdyw_wq);
+ 	}
+ 	if (gpif_stat & MANTIS_GPIF_WRACK)
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_INTSTAT)
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_EMPTY)
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_OPDONE) {
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
+ 		if (ca->hif_job_queue) {
+ 			wake_up(&ca->hif_opdone_wq);
+ 			ca->hif_event = MANTIS_SBUF_OPDONE;
+@@ -87,7 +87,7 @@ int mantis_evmgr_init(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
++	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
+ 	tasklet_init(&ca->hif_evm_tasklet, mantis_hifevm_tasklet, (unsigned long) ca);
+ 
+ 	mantis_pcmcia_init(ca);
+@@ -99,7 +99,7 @@ void mantis_evmgr_exit(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
+ 	tasklet_kill(&ca->hif_evm_tasklet);
+ 
+ 	mantis_pcmcia_exit(ca);
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 402f866..814c6ac 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -54,12 +54,15 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ {
+ 	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
+ 	struct mantis_pci *mantis;
++	struct mantis_ca *ca;
+ 
+ 	mantis = (struct mantis_pci *) dev_id;
+ 	if (unlikely(mantis == NULL)) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis == NULL");
+ 		return IRQ_NONE;
+ 	}
++	ca = mantis->mantis_ca;
++
+ 	stat = mmread(MANTIS_INT_STAT);
+ 	mask = mmread(MANTIS_INT_MASK);
+ 	mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
+@@ -72,14 +75,9 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	if (stat & MANTIS_INT_RISCEN) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* DMA enabl *");
+ 	}
+-	if (stat & MANTIS_INT_I2CRACK) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* I2C R-ACK *");
+-	}
+-	if (stat & MANTIS_INT_PCMCIA7) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* PCMCIA-07 *");
+-	}
+ 	if (stat & MANTIS_INT_IRQ0) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
++		tasklet_schedule(&ca->hif_evm_tasklet);
+ 	}
+ 	if (stat & MANTIS_INT_IRQ1) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+index 960123f..47cc720 100644
+--- a/drivers/media/dvb/mantis/mantis_pcmcia.c
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -32,7 +32,7 @@ void mantis_event_cam_plugin(struct mantis_ca *ca)
+ 	u32 gpif_irqcfg;
+ 
+ 	if (ca->slot_state == MODULE_XTRACTED) {
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
+ 		udelay(50);
+ 		mmwrite(0xda000000, MANTIS_CARD_RESET);
+ 		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
+@@ -56,7 +56,7 @@ void mantis_event_cam_unplug(struct mantis_ca *ca)
+ 	u32 gpif_irqcfg;
+ 
+ 	if (ca->slot_state == MODULE_INSERTED) {
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
+ 		udelay(50);
+ 		mmwrite(0x00da0000, MANTIS_CARD_RESET);
+ 		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
+@@ -75,15 +75,16 @@ int mantis_pcmcia_init(struct mantis_ca *ca)
+ 
+ 	u32 gpif_stat, card_stat;
+ 
++	mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ0, MANTIS_INT_MASK);
+ 	gpif_stat = mmread(MANTIS_GPIF_STATUS);
+ 	card_stat = mmread(MANTIS_GPIF_IRQCFG);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
+ 		mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG);
+ 		ca->slot_state = MODULE_INSERTED;
+ 	} else {
+-		dprintk(mantis->verbose, MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
++		dprintk(verbose, MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
+ 		mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
+ 		ca->slot_state = MODULE_XTRACTED;
+ 	}
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0041-V4L-DVB-13739-Mantis-Event-Manager-Handle-Masked-eve.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0041-V4L-DVB-13739-Mantis-Event-Manager-Handle-Masked-eve.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,51 @@
+From 8d27616d891a20191696372dc90d55405926bfdf Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:08:25 -0300
+Subject: [PATCH 041/120] V4L/DVB (13739): [Mantis] Event Manager: Handle Masked events only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 3062b1571a1d3520c4d3160ebbfca8002b1d6963)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dvb.c |    1 +
+ drivers/media/dvb/mantis/mantis_evm.c |    5 ++++-
+ 2 files changed, 5 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 3325b59..ade4449 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -313,6 +313,7 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 
+ int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+ {
++	mantis_ca_exit(mantis);
+ 	tasklet_kill(&mantis->tasklet);
+ 	dvb_net_release(&mantis->dvbnet);
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index d81068d..c35ddd8 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -27,9 +27,12 @@ void mantis_hifevm_tasklet(unsigned long data)
+ 	struct mantis_ca *ca = (struct mantis_ca *) data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	u32 gpif_stat;
++	u32 gpif_stat, gpif_mask;
+ 
+ 	gpif_stat = mmread(MANTIS_GPIF_STATUS);
++	gpif_mask = mmread(MANTIS_GPIF_IRQCFG);
++	if (!((gpif_stat & 0xff) & (gpif_mask & 0xff)))
++		return;
+ 
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+ 		if (gpif_stat & MANTIS_CARD_PLUGIN) {
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0042-V4L-DVB-13740-Mantis-Schedule-the-work-instead-of-ha.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0042-V4L-DVB-13740-Mantis-Schedule-the-work-instead-of-ha.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,126 @@
+From 287e7877d3f49afcee6587b36e0c854ef50319b1 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:09:04 -0300
+Subject: [PATCH 042/120] V4L/DVB (13740): [Mantis] Schedule the work instead of handling the task directly
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 12855cac87218d0c92ffdebb7270cec040cf5a6a)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    4 ++++
+ drivers/media/dvb/mantis/mantis_evm.c    |   17 +++++++----------
+ drivers/media/dvb/mantis/mantis_link.h   |    4 +++-
+ drivers/media/dvb/mantis/mantis_pci.c    |    2 +-
+ 4 files changed, 15 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index f9891eb..7f1cfad 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -151,4 +151,8 @@ extern int mantis_dvb_exit(struct mantis_pci *mantis);
+ extern void mantis_dma_xfer(unsigned long data);
+ extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
+ 
++extern struct dvb_device *mantis_ca_init(struct mantis_pci *mantis);
++extern void mantis_ca_exit(struct mantis_pci *mantis);
++
++
+ #endif //__MANTIS_COMMON_H
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index c35ddd8..7451483 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -22,9 +22,9 @@
+ #include "mantis_link.h"
+ #include "mantis_hif.h"
+ 
+-void mantis_hifevm_tasklet(unsigned long data)
++static void mantis_hifevm_work(struct work_struct *work)
+ {
+-	struct mantis_ca *ca = (struct mantis_ca *) data;
++	struct mantis_ca *ca = container_of(work, struct mantis_ca, hif_evm_work);
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	u32 gpif_stat, gpif_mask;
+@@ -38,15 +38,13 @@ void mantis_hifevm_tasklet(unsigned long data)
+ 		if (gpif_stat & MANTIS_CARD_PLUGIN) {
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+-			// Plugin call here
+-			gpif_stat = 0; // crude !
++			mantis_event_cam_plugin(ca);
+ 		}
+ 	} else {
+ 		if (gpif_stat & MANTIS_CARD_PLUGOUT) {
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+-			// Unplug call here
+-			gpif_stat = 0; // crude !
++			mantis_event_cam_unplug(ca);
+ 		}
+ 	}
+ 
+@@ -91,9 +89,9 @@ int mantis_evmgr_init(struct mantis_ca *ca)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
+-	tasklet_init(&ca->hif_evm_tasklet, mantis_hifevm_tasklet, (unsigned long) ca);
+-
++	INIT_WORK(&ca->hif_evm_work, mantis_hifevm_work);
+ 	mantis_pcmcia_init(ca);
++	schedule_work(&ca->hif_evm_work);
+ 
+ 	return 0;
+ }
+@@ -103,7 +101,6 @@ void mantis_evmgr_exit(struct mantis_ca *ca)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
+-	tasklet_kill(&ca->hif_evm_tasklet);
+-
++	flush_scheduled_work();
+ 	mantis_pcmcia_exit(ca);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index a45dd71..33b39b7 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -21,6 +21,8 @@
+ #ifndef __MANTIS_LINK_H
+ #define __MANTIS_LINK_H
+ 
++#include <linux/workqueue.h>
++
+ enum mantis_sbuf_status {
+ 	MANTIS_SBUF_DATA_AVAIL		= 1,
+ 	MANTIS_SBUF_DATA_EMPTY		= 2,
+@@ -40,7 +42,7 @@ enum mantis_slot_state {
+ struct mantis_ca {
+ 	struct mantis_slot		slot;
+ 
+-	struct tasklet_struct		hif_evm_tasklet;
++	struct work_struct		hif_evm_work;
+ 
+ 	u32				hif_event;
+ 	wait_queue_head_t		hif_opdone_wq;
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 814c6ac..6eecd54 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -77,7 +77,7 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	}
+ 	if (stat & MANTIS_INT_IRQ0) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
+-		tasklet_schedule(&ca->hif_evm_tasklet);
++		schedule_work(&ca->hif_evm_work);
+ 	}
+ 	if (stat & MANTIS_INT_IRQ1) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0043-V4L-DVB-13741-Mantis-Implement-HIF-Mem-Read-Write-op.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0043-V4L-DVB-13741-Mantis-Implement-HIF-Mem-Read-Write-op.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,283 @@
+From 158ceffb222e98f0547309d0722fd69e2a5ed4a8 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:09:47 -0300
+Subject: [PATCH 043/120] V4L/DVB (13741): [Mantis] Implement HIF Mem Read/Write operations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit d8b14f8a76d71c84622a211f57baf15f61cc9703)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile      |    1 +
+ drivers/media/dvb/mantis/mantis_dma.c  |    4 +-
+ drivers/media/dvb/mantis/mantis_evm.c  |    3 +-
+ drivers/media/dvb/mantis/mantis_hif.c  |  139 ++++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_link.h |   10 ++-
+ drivers/media/dvb/mantis/mantis_reg.h  |    8 +-
+ 6 files changed, 157 insertions(+), 8 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_hif.c
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index c4da0d8..d002ef9 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -4,6 +4,7 @@ mantis-objs = 	mantis_core.o	\
+ 		mantis_i2c.o	\
+ 		mantis_dvb.o	\
+ 		mantis_evm.o	\
++		mantis_hif.o	\
+ 		mantis_ca.o	\
+ 		mantis_pcmcia.o	\
+ 		mantis_vp1033.o	\
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index f685992..250f49a 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -190,7 +190,7 @@ void mantis_dma_start(struct mantis_pci *mantis)
+ 
+ 	mantis_risc_program(mantis);
+ 	mmwrite(mantis->risc_dma, MANTIS_RISC_START);
+-	mmwrite(mmread(MANTIS_GPIF_ADDR) | MANTIS_GPIF_RDWRN, MANTIS_GPIF_ADDR);
++	mmwrite(mmread(MANTIS_GPIF_HIFADDR) | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_HIFADDR);
+ 
+ 	mmwrite(0, MANTIS_DMA_CTL);
+ 	mantis->last_block = mantis->finished_block = 0;
+@@ -210,7 +210,7 @@ void mantis_dma_stop(struct mantis_pci *mantis)
+ 	mask = mmread(MANTIS_INT_MASK);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Stop DMA engine");
+ 
+-	mmwrite((mmread(MANTIS_GPIF_ADDR) & (~(MANTIS_GPIF_RDWRN))), MANTIS_GPIF_ADDR);
++	mmwrite((mmread(MANTIS_GPIF_HIFADDR) & (~(MANTIS_GPIF_HIFRDWRN))), MANTIS_GPIF_HIFADDR);
+ 
+ 	mmwrite((mmread(MANTIS_DMA_CTL) & ~(MANTIS_FIFO_EN |
+ 					    MANTIS_DCAP_EN |
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 7451483..dbcdca3 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -92,7 +92,7 @@ int mantis_evmgr_init(struct mantis_ca *ca)
+ 	INIT_WORK(&ca->hif_evm_work, mantis_hifevm_work);
+ 	mantis_pcmcia_init(ca);
+ 	schedule_work(&ca->hif_evm_work);
+-
++	mantis_hif_init(ca);
+ 	return 0;
+ }
+ 
+@@ -102,5 +102,6 @@ void mantis_evmgr_exit(struct mantis_ca *ca)
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
+ 	flush_scheduled_work();
++	mantis_hif_exit(ca);
+ 	mantis_pcmcia_exit(ca);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+new file mode 100644
+index 0000000..1472008
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -0,0 +1,139 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_hif.h"
++#include "mantis_link.h" /* temporary due to physical layer stuff */
++
++static int mantis_hif_data_available(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	int rc = 0;
++
++	if (wait_event_interruptible_timeout(ca->hif_data_wq,
++					     ca->sbuf_status & MANTIS_SBUF_DATA_AVAIL,
++					     msecs_to_jiffies(500)) == -ERESTARTSYS) {
++
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Read wait event timeout !", mantis->num);
++		rc = -EREMOTEIO;
++	}
++	ca->sbuf_status &= ~MANTIS_SBUF_DATA_AVAIL;
++	udelay(2);
++	return rc;
++}
++
++static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	int rc = 0;
++
++	if (wait_event_interruptible_timeout(ca->hif_opdone_wq,
++					     ca->hif_event & MANTIS_SBUF_OPDONE,
++					     msecs_to_jiffies(500)) == -ERESTARTSYS) {
++
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Smart buffer operation timeout !", mantis->num);
++		rc = -EREMOTEIO;
++	}
++	ca->hif_event &= ~MANTIS_SBUF_OPDONE;
++	udelay(5);
++	return rc;
++}
++
++int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	u32 hif_addr = 0, data, count = 4;
++
++	hif_addr |=  MANTIS_GPIF_HIFRDWRN;
++	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
++	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
++	hif_addr |=  addr;
++
++	mmwrite(hif_addr, MANTIS_GPIF_BRADDR);
++	mmwrite(count, MANTIS_GPIF_BRBYTES);
++
++	udelay(20);
++
++	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	if (mantis_hif_data_available(ca) != 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer burst read failed", mantis->num);
++		return -EREMOTEIO;
++	}
++	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
++		return -EREMOTEIO;
++	}
++	data = mmread(MANTIS_GPIF_HIFDIN);
++
++	return (data >> 24) & 0xff;
++}
++
++int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
++{
++	struct mantis_slot *slot = ca->slot;
++	struct mantis_pci *mantis = ca->ca_priv;
++	u32 hif_addr = 0;
++
++	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
++	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
++	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
++	hif_addr |= addr;
++
++	mmwrite(slot->slave_cfg, MANTIS_GPIF_CFGSLA); /* Slot0 alone for now */
++
++	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	mmwrite(data, MANTIS_GPIF_HIFDOUT);
++	ca->hif_job_queue = MANTIS_HIF_MEMWR;
++
++	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
++		ca->hif_job_queue &= ~MANTIS_HIF_MEMWR;
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		return -EREMOTEIO;
++	}
++	ca->hif_job_queue &= ~MANTIS_HIF_MEMWR;
++	return 0;
++}
++
++int mantis_hif_init(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	u32 irqcfg;
++
++	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Initializing Mantis Host Interface", mantis->num);
++	init_waitqueue_head(&ca->hif_data_wq);
++	init_waitqueue_head(&ca->hif_opdone_wq);
++
++	irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
++	irqcfg |= MANTIS_MASK_BRRDY;
++	mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
++
++	return 0;
++}
++
++void mantis_hif_exit(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	u32 irqcfg;
++
++	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Exiting Mantis Host Interface", mantis->num);
++	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
++	irqcfg &= ~MANTIS_MASK_BRRDY;
++	mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
++}
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index 33b39b7..8862502 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -31,6 +31,8 @@ enum mantis_sbuf_status {
+ 
+ struct mantis_slot {
+ 	u32				timeout;
++	u32				slave_cfg;
++	u32				bar;
+ };
+ 
+ /* Physical layer */
+@@ -40,7 +42,7 @@ enum mantis_slot_state {
+ };
+ 
+ struct mantis_ca {
+-	struct mantis_slot		slot;
++	struct mantis_slot		slot[4];
+ 
+ 	struct work_struct		hif_evm_work;
+ 
+@@ -66,4 +68,10 @@ extern void mantis_pcmcia_exit(struct mantis_ca *ca);
+ extern int mantis_evmgr_init(struct mantis_ca *ca);
+ extern void mantis_evmgr_exit(struct mantis_ca *ca);
+ 
++/* HIF */
++extern int mantis_hif_init(struct mantis_ca *ca);
++extern void mantis_hif_exit(struct mantis_ca *ca);
++extern int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr);
++extern int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data);
++
+ #endif // __MANTIS_LINK_H
+diff --git a/drivers/media/dvb/mantis/mantis_reg.h b/drivers/media/dvb/mantis/mantis_reg.h
+index d9862b7..6f5cd49 100644
+--- a/drivers/media/dvb/mantis/mantis_reg.h
++++ b/drivers/media/dvb/mantis/mantis_reg.h
+@@ -147,16 +147,16 @@
+ #define MANTIS_CARD_RESET		0xac
+ 
+ #define MANTIS_GPIF_ADDR		0xb0
+-#define MANTIS_GPIF_RDWRN		(0x01		<< 31)
++#define MANTIS_GPIF_HIFRDWRN		(0x01		<< 31)
+ #define MANTIS_GPIF_PCMCIAREG		(0x01		<< 27)
+ #define MANTIS_GPIF_PCMCIAIOM		(0x01		<< 26)
+-#define MANTIS_GPIF_HIF_ADDR		(0xfffffff	<<  0)
++#define MANTIS_GPIF_HIFADDR		(0xfffffff	<<  0)
+ 
+ #define MANTIS_GPIF_DOUT		0xb4
+-#define MANTIS_GPIF_HIF_DOUT		(0xfffffff	<<  0)
++#define MANTIS_GPIF_HIFDOUT		(0xfffffff	<<  0)
+ 
+ #define MANTIS_GPIF_DIN			0xb8
+-#define MANTIS_GPIF_HIF_DIN		(0xfffffff	<<  0)
++#define MANTIS_GPIF_HIFDIN		(0xfffffff	<<  0)
+ 
+ #define MANTIS_GPIF_SPARE		0xbc
+ #define MANTIS_GPIF_LOGICRD		(0xffff		<< 16)
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0044-V4L-DVB-13742-Mantis-Implement-PCMCIA-I-O-Rd-Wr-oper.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0044-V4L-DVB-13742-Mantis-Implement-PCMCIA-I-O-Rd-Wr-oper.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,98 @@
+From 478797be24c766baff385b4fa05a278fc9b29624 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:10:25 -0300
+Subject: [PATCH 044/120] V4L/DVB (13742): [Mantis] Implement PCMCIA I/O Rd/Wr operations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit c9a750c909cbde15ecd0f8545f48e051bfee6271)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c  |   54 ++++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_link.h |    2 +
+ 2 files changed, 56 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 1472008..42aedf7 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -111,6 +111,60 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	return 0;
+ }
+ 
++int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr, u32 count, u32 *data)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	u32 hif_addr = 0;
++
++	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
++	hif_addr |=  MANTIS_GPIF_HIFRDWRN;
++	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
++	hif_addr |=  addr;
++
++	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	ca->hif_job_queue = MANTIS_HIF_IOMRD;
++
++	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
++		ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		return -EREMOTEIO;
++	}
++	udelay(50);
++	ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
++	*data = mmread(MANTIS_GPIF_HIFDIN);
++	hif_addr |= MANTIS_GPIF_PCMCIAREG;
++	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++
++	return 0;
++}
++
++int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u32 data)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	u32 hif_addr = 0;
++
++	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
++	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
++	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
++	hif_addr |=  addr;
++
++	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	mmwrite(data, MANTIS_GPIF_HIFDOUT);
++
++	ca->hif_job_queue = MANTIS_HIF_IOMWR;
++	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
++		ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		return -EREMOTEIO;
++	}
++	udelay(50);
++	ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
++	hif_addr |= MANTIS_GPIF_PCMCIAREG;
++	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++
++	return 0;
++}
++
+ int mantis_hif_init(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index 8862502..478900e 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -73,5 +73,7 @@ extern int mantis_hif_init(struct mantis_ca *ca);
+ extern void mantis_hif_exit(struct mantis_ca *ca);
+ extern int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr);
+ extern int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data);
++extern int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr, u32 count, u32 *data);
++extern int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u32 data);
+ 
+ #endif // __MANTIS_LINK_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0045-V4L-DVB-13743-Mantis-CA-Use-DVB_CA-Tuple-parser.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0045-V4L-DVB-13743-Mantis-CA-Use-DVB_CA-Tuple-parser.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,284 @@
+From 441648289a943154181cdb4324d9220ef78e8dde Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:11:14 -0300
+Subject: [PATCH 045/120] V4L/DVB (13743): [Mantis CA] Use DVB_CA Tuple parser
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 6053240f5cc914d40ac9c7afe15008bf3e46359c)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c     |  129 ++++++++++++++++--------------
+ drivers/media/dvb/mantis/mantis_common.h |    2 +-
+ drivers/media/dvb/mantis/mantis_hif.c    |   10 +-
+ drivers/media/dvb/mantis/mantis_link.h   |    9 ++-
+ 4 files changed, 80 insertions(+), 70 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index e6de3c9..4be61ca 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -22,96 +22,104 @@
+ #include "mantis_link.h"
+ #include "mantis_hif.h"
+ 
+-
+-static int mantis_ca_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long parg)
++static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr)
+ {
+-	return 0;
++	struct mantis_ca *ca = en50221->data;
++
++	if (slot != 0)
++		return -EINVAL;
++
++	return mantis_hif_read_mem(ca, addr);
+ }
+ 
+-static int mantis_ca_open(struct inode *inode, struct file *file)
++static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr, u8 data)
+ {
+-	return 0;
++	struct mantis_ca *ca = en50221->data;
++
++	if (slot != 0)
++		return -EINVAL;
++
++	return mantis_hif_write_mem(ca, addr, data);
+ }
+ 
+-static int mantis_ca_release(struct inode *inode, struct file *file)
++static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr)
+ {
+-	return 0;
++	struct mantis_ca *ca = en50221->data;
++
++	if (slot != 0)
++		return -EINVAL;
++
++	return mantis_hif_read_iom(ca, addr);
+ }
+ 
+-static ssize_t mantis_ca_read(struct file *file, char __user *buffer, size_t count, loff_t *ofset)
++static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr, u8 data)
+ {
+-	struct dvb_device *dvbdev	= file->private_data;
+-	struct mantis_ca *ca		= dvbdev->priv;
++	struct mantis_ca *ca = en50221->data;
+ 
+-	int status;
++	if (slot != 0)
++		return -EINVAL;
+ 
+-	return 0;
+-error:
+-	return status;
++	return mantis_hif_write_iom(ca, addr, data);
+ }
+ 
+-static ssize_t mantis_ca_write(struct file *file, const char __user *buffer, size_t count, loff_t *offset)
++static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
+ {
+-	struct dvb_device *dvbdev	= file->private_data;
+-	struct mantis_ca *ca		= dvbdev->priv;
++	return 0;
++}
+ 
+-	int status;
++static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
++{
++	return 0;
++}
+ 
++static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
++{
+ 	return 0;
+-error:
+-	return status;
+ }
+ 
+-static struct file_operations mantis_fops = {
+-	.owner		= THIS_MODULE,
+-	.ioctl		= mantis_ca_ioctl,
+-	.open		= mantis_ca_open,
+-	.release	= mantis_ca_release,
+-	.read		= mantis_ca_read,
+-	.write		= mantis_ca_write,
+-};
+-
+-static struct dvb_device mantis_ca = {
+-	.priv		= NULL,
+-	.users		= 1,
+-	.readers	= 1,
+-	.writers	= 1,
+-	.fops		= &mantis_fops,
+-};
+-
+-struct dvb_device *mantis_ca_init(struct mantis_pci *mantis)
++static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
+ {
+-	int ret;
++	return 0;
++}
+ 
+-	struct dvb_device *dvbdev;
++int mantis_ca_init(struct mantis_pci *mantis)
++{
+ 	struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
+ 	struct mantis_ca *ca;
++	int ca_flags = 0, result;
+ 
+ 	if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
+-		return NULL;
++		result = -ENOMEM;
++		goto err;
+ 	}
+ 
+ 	ca->ca_priv = mantis;
+-
+-	dprintk(verbose, MANTIS_ERROR, 0, "CA: Registering Mantis Adapter(%d) Slot(0)\n", mantis->num);
+-	if (dvb_register_device(dvb_adapter, &dvbdev, &mantis_ca, ca, DVB_DEVICE_CA) == 0) {
+-		ca->ca_dev = dvbdev;
+-		mantis->mantis_ca = ca;
+-		mantis_evmgr_init(ca);
+-		return ca->ca_dev;
++	mantis->mantis_ca = ca;
++
++	/* register CA interface */
++	ca->en50221.owner		= THIS_MODULE;
++	ca->en50221.read_attribute_mem	= mantis_ca_read_attr_mem;
++	ca->en50221.write_attribute_mem	= mantis_ca_write_attr_mem;
++	ca->en50221.read_cam_control	= mantis_ca_read_cam_ctl;
++	ca->en50221.write_cam_control	= mantis_ca_write_cam_ctl;
++	ca->en50221.slot_reset		= mantis_ca_slot_reset;
++	ca->en50221.slot_shutdown	= mantis_ca_slot_shutdown;
++	ca->en50221.slot_ts_enable	= mantis_ts_control;
++	ca->en50221.poll_slot_status	= mantis_slot_status;
++	ca->en50221.data		= ca;
++
++	dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
++	if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
++		dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
++		goto err;
+ 	}
++	dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
++	mantis_evmgr_init(ca);
+ 	return 0;
+-
+-error:
+-	if (ca != NULL) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Error ..");
+-		if (ca->ca_dev != NULL)
+-			dvb_unregister_device(ca->ca_dev);
+-
+-		kfree(ca);
+-	}
+-	return NULL;
++err:
++	kfree(ca);
++	return result;
+ }
+ 
+ void mantis_ca_exit(struct mantis_pci *mantis)
+@@ -119,9 +127,8 @@ void mantis_ca_exit(struct mantis_pci *mantis)
+ 	struct mantis_ca *ca = mantis->mantis_ca;
+ 
+ 	mantis_evmgr_exit(ca);
+-	dprintk(verbose, MANTIS_ERROR, 0, "CA: Unregister Mantis Adapter(%d) Slot(0)\n", mantis->num);
+-	if (ca->ca_dev)
+-		dvb_unregister_device(ca->ca_dev);
++	dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
++	dvb_ca_en50221_release(&ca->en50221);
+ 
+ 	kfree(ca);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 7f1cfad..0aa4001 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -151,7 +151,7 @@ extern int mantis_dvb_exit(struct mantis_pci *mantis);
+ extern void mantis_dma_xfer(unsigned long data);
+ extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
+ 
+-extern struct dvb_device *mantis_ca_init(struct mantis_pci *mantis);
++extern int mantis_ca_init(struct mantis_pci *mantis);
+ extern void mantis_ca_exit(struct mantis_pci *mantis);
+ 
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 42aedf7..6a1ea96 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -111,10 +111,10 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	return 0;
+ }
+ 
+-int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr, u32 count, u32 *data)
++int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+-	u32 hif_addr = 0;
++	u32 data, hif_addr = 0;
+ 
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr |=  MANTIS_GPIF_HIFRDWRN;
+@@ -131,14 +131,14 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr, u32 count, u32 *data)
+ 	}
+ 	udelay(50);
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
+-	*data = mmread(MANTIS_GPIF_HIFDIN);
++	data = mmread(MANTIS_GPIF_HIFDIN);
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+ 	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
+ 
+-	return 0;
++	return data;
+ }
+ 
+-int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u32 data)
++int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 hif_addr = 0;
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index 478900e..23ff2d6 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -22,6 +22,7 @@
+ #define __MANTIS_LINK_H
+ 
+ #include <linux/workqueue.h>
++#include "dvb_ca_en50221.h"
+ 
+ enum mantis_sbuf_status {
+ 	MANTIS_SBUF_DATA_AVAIL		= 1,
+@@ -56,8 +57,10 @@ struct mantis_ca {
+ 
+ 	enum mantis_slot_state		slot_state;
+ 
+-	struct dvb_device		*ca_dev;
++//	struct dvb_device		*ca_dev;
+ 	void				*ca_priv;
++
++	struct dvb_ca_en50221		en50221;
+ };
+ 
+ /* CA */
+@@ -73,7 +76,7 @@ extern int mantis_hif_init(struct mantis_ca *ca);
+ extern void mantis_hif_exit(struct mantis_ca *ca);
+ extern int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr);
+ extern int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data);
+-extern int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr, u32 count, u32 *data);
+-extern int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u32 data);
++extern int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr);
++extern int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data);
+ 
+ #endif // __MANTIS_LINK_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0046-V4L-DVB-13744-Mantis-CA-Use-Module-status-to-signal-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0046-V4L-DVB-13744-Mantis-CA-Use-Module-status-to-signal-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From d91b92d5da6dcd0c23d9f2721a8d4e93768104f8 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:11:41 -0300
+Subject: [PATCH 046/120] V4L/DVB (13744): [Mantis CA] Use Module status to signal Slot events
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 4e9fbeeedc22d287b5d05e32bbc647cd2dc8c663)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c |    5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 4be61ca..cd6bed7 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -79,6 +79,11 @@ static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
+ 
+ static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
+ {
++	struct mantis_ca *ca = en50221->data;
++
++	if (ca->slot_state == MODULE_INSERTED)
++		return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
++
+ 	return 0;
+ }
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0047-V4L-DVB-13745-Mantis-CA-Add-some-debug-statements.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0047-V4L-DVB-13745-Mantis-CA-Add-some-debug-statements.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,160 @@
+From b46a35d800073ece545324778801b37461676b2a Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:12:16 -0300
+Subject: [PATCH 047/120] V4L/DVB (13745): [Mantis CA] Add some debug statements
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 2133ffbf08e7fca0614ea73cb5c43cc6435b4414)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c  |   34 +++++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_hif.c |    4 +++
+ 2 files changed, 38 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index cd6bed7..a8b8c88 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -25,6 +25,9 @@
+ static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr)
+ {
+ 	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Read", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -35,6 +38,9 @@ static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int
+ static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr, u8 data)
+ {
+ 	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Write", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -45,6 +51,9 @@ static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, in
+ static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr)
+ {
+ 	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Read", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -55,6 +64,9 @@ static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 a
+ static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 addr, u8 data)
+ {
+ 	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Write", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -64,22 +76,40 @@ static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8
+ 
+ static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
+ {
++	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot RESET", slot);
++
+ 	return 0;
+ }
+ 
+ static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
+ {
++	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot shutdown", slot);
++
+ 	return 0;
+ }
+ 
+ static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
+ {
++	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
++
+ 	return 0;
+ }
+ 
+ static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open)
+ {
+ 	struct mantis_ca *ca = en50221->data;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
+ 
+ 	if (ca->slot_state == MODULE_INSERTED)
+ 		return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
+@@ -93,6 +123,7 @@ int mantis_ca_init(struct mantis_pci *mantis)
+ 	struct mantis_ca *ca;
+ 	int ca_flags = 0, result;
+ 
++	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis CA");
+ 	if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
+ 		result = -ENOMEM;
+@@ -130,6 +161,9 @@ err:
+ void mantis_ca_exit(struct mantis_pci *mantis)
+ {
+ 	struct mantis_ca *ca = mantis->mantis_ca;
++	struct mantis_pci *mantis = ca->ca_priv;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis CA exit");
+ 
+ 	mantis_evmgr_exit(ca);
+ 	dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 6a1ea96..42e0360 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -61,6 +61,7 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 hif_addr = 0, data, count = 4;
+ 
++	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Read", mantis->num);
+ 	hif_addr |=  MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
+@@ -91,6 +92,7 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 hif_addr = 0;
+ 
++	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Write", mantis->num);
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
+@@ -116,6 +118,7 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 data, hif_addr = 0;
+ 
++	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Read", mantis->num);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr |=  MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+@@ -143,6 +146,7 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 hif_addr = 0;
+ 
++	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Write", mantis->num);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0048-V4L-DVB-13746-Mantis-CA-Bug-Remove-duplicated-symbol.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0048-V4L-DVB-13746-Mantis-CA-Bug-Remove-duplicated-symbol.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,32 @@
+From c48439992c53ba8752b68fa1504c435d841c259b Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:12:51 -0300
+Subject: [PATCH 048/120] V4L/DVB (13746): [Mantis CA] Bug: Remove duplicated symbol
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit fbe1e43abc6ada6bcd3e9866b01e41f093f12c62)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c |    1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index a8b8c88..f6d70cb 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -161,7 +161,6 @@ err:
+ void mantis_ca_exit(struct mantis_pci *mantis)
+ {
+ 	struct mantis_ca *ca = mantis->mantis_ca;
+-	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis CA exit");
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0049-V4L-DVB-13747-Mantis-Bug-Fix-Use-Register-Address-ra.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0049-V4L-DVB-13747-Mantis-Bug-Fix-Use-Register-Address-ra.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,118 @@
+From 8e9b8bbb3f9bd6573fc55306be2b87a369342ed1 Mon Sep 17 00:00:00 2001
+From: Sigmund Augdal <sigmund at snap.tv>
+Date: Fri, 4 Dec 2009 05:13:21 -0300
+Subject: [PATCH 049/120] V4L/DVB (13747): [Mantis] Bug Fix!: Use Register Address rather than register field
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Sigmund Augdal <sigmund at snap.tv>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit a0c59063a7fe92524ab8fa6e31997b177a8f3029)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dma.c |    4 ++--
+ drivers/media/dvb/mantis/mantis_hif.c |   20 ++++++++++----------
+ 2 files changed, 12 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index 250f49a..d15a1eb 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -190,7 +190,7 @@ void mantis_dma_start(struct mantis_pci *mantis)
+ 
+ 	mantis_risc_program(mantis);
+ 	mmwrite(mantis->risc_dma, MANTIS_RISC_START);
+-	mmwrite(mmread(MANTIS_GPIF_HIFADDR) | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_HIFADDR);
++	mmwrite(mmread(MANTIS_GPIF_ADDR) | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
+ 
+ 	mmwrite(0, MANTIS_DMA_CTL);
+ 	mantis->last_block = mantis->finished_block = 0;
+@@ -210,7 +210,7 @@ void mantis_dma_stop(struct mantis_pci *mantis)
+ 	mask = mmread(MANTIS_INT_MASK);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Stop DMA engine");
+ 
+-	mmwrite((mmread(MANTIS_GPIF_HIFADDR) & (~(MANTIS_GPIF_HIFRDWRN))), MANTIS_GPIF_HIFADDR);
++	mmwrite((mmread(MANTIS_GPIF_ADDR) & (~(MANTIS_GPIF_HIFRDWRN))), MANTIS_GPIF_ADDR);
+ 
+ 	mmwrite((mmread(MANTIS_DMA_CTL) & ~(MANTIS_FIFO_EN |
+ 					    MANTIS_DCAP_EN |
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 42e0360..9e058be 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -72,7 +72,7 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 
+ 	udelay(20);
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 	if (mantis_hif_data_available(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer burst read failed", mantis->num);
+ 		return -EREMOTEIO;
+@@ -81,7 +81,7 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+-	data = mmread(MANTIS_GPIF_HIFDIN);
++	data = mmread(MANTIS_GPIF_DIN);
+ 
+ 	return (data >> 24) & 0xff;
+ }
+@@ -100,8 +100,8 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 
+ 	mmwrite(slot->slave_cfg, MANTIS_GPIF_CFGSLA); /* Slot0 alone for now */
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
+-	mmwrite(data, MANTIS_GPIF_HIFDOUT);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	mmwrite(data, MANTIS_GPIF_DOUT);
+ 	ca->hif_job_queue = MANTIS_HIF_MEMWR;
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+@@ -124,7 +124,7 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 	ca->hif_job_queue = MANTIS_HIF_IOMRD;
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+@@ -134,9 +134,9 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	}
+ 	udelay(50);
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
+-	data = mmread(MANTIS_GPIF_HIFDIN);
++	data = mmread(MANTIS_GPIF_DIN);
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+-	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 
+ 	return data;
+ }
+@@ -152,8 +152,8 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
+-	mmwrite(data, MANTIS_GPIF_HIFDOUT);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+ 	ca->hif_job_queue = MANTIS_HIF_IOMWR;
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+@@ -164,7 +164,7 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	udelay(50);
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+-	mmwrite(hif_addr, MANTIS_GPIF_HIFADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 
+ 	return 0;
+ }
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0050-V4L-DVB-13748-Mantis-VP-2040-Add-support-for-VP-2040.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0050-V4L-DVB-13748-Mantis-VP-2040-Add-support-for-VP-2040.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,59 @@
+From 247814436649330068a2f8ef83f2641b347a9d84 Mon Sep 17 00:00:00 2001
+From: Magnus Horlin <magnus at alefors.se>
+Date: Fri, 4 Dec 2009 05:14:34 -0300
+Subject: [PATCH 050/120] V4L/DVB (13748): [Mantis/VP-2040] Add support for VP-2040 (TDA10023 frontend based)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Magnus Horlin <magnus at alefors.se>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit ea30d81a9634cb4c13bbef46877f0d7730c57552)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_core.c   |    1 +
+ drivers/media/dvb/mantis/mantis_dvb.c    |    1 +
+ drivers/media/dvb/mantis/mantis_vp2040.h |    1 +
+ 3 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index a164bb1..b94d051 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -119,6 +119,7 @@ static void mantis_load_config(struct mantis_pci *mantis)
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
+ 		mantis->hwconfig = &vp2033_mantis_config;
+ 		break;
++	case MANTIS_VP_2040_DVB_C:	// VP-2040
+ 	case TERRATEC_CINERGY_C_PCI:	// VP-2040 clone
+ 		mantis->hwconfig = &vp2040_mantis_config;
+ 		break;
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index ade4449..3940aed 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -273,6 +273,7 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 
+ 		}
+ 		break;
++	case MANTIS_VP_2040_DVB_C:	// VP-2040
+ 	case TERRATEC_CINERGY_C_PCI:
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+ 		mantis->fe = tda10023_attach(&tda10023_cu1216_config, &mantis->adapter, read_pwm(mantis));
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.h b/drivers/media/dvb/mantis/mantis_vp2040.h
+index 825ccbb..69463cc 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.h
++++ b/drivers/media/dvb/mantis/mantis_vp2040.h
+@@ -25,6 +25,7 @@
+ #include "mantis_common.h"
+ #include "tda1002x.h"
+ 
++#define MANTIS_VP_2040_DVB_C	0x0043
+ #define TERRATEC_CINERGY_C_PCI	0x1178
+ 
+ extern struct tda1002x_config tda10023_cu1216_config;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0051-V4L-DVB-13749-Mantis-CA-CA_SLAVE-Do-not-change-Slave.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0051-V4L-DVB-13749-Mantis-CA-CA_SLAVE-Do-not-change-Slave.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,38 @@
+From e6afe15c76aabc6d84c5503c38b0f963fefb9fef Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:15:10 -0300
+Subject: [PATCH 051/120] V4L/DVB (13749): [Mantis CA] CA_SLAVE: Do not change Slave Configuration setup
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+(Need to sanitize this cleanly for different Slaves)
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit ac23f4c86c3c901f95d72fc2262b22e6230d4feb)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 9e058be..d18fe41 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -171,9 +171,11 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 
+ int mantis_hif_init(struct mantis_ca *ca)
+ {
++	struct mantis_slot *slot = ca->slot;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 irqcfg;
+ 
++	slot[0].slave_cfg = 0x70773028;
+ 	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Initializing Mantis Host Interface", mantis->num);
+ 	init_waitqueue_head(&ca->hif_data_wq);
+ 	init_waitqueue_head(&ca->hif_opdone_wq);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0052-V4L-DVB-13750-Mantis-GPIO_CONTROL-Cache-a-given-GPIO.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0052-V4L-DVB-13750-Mantis-GPIO_CONTROL-Cache-a-given-GPIO.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,60 @@
+From f37097db4c2acf80ca104250d60535bba9da4dbd Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:15:38 -0300
+Subject: [PATCH 052/120] V4L/DVB (13750): [Mantis] GPIO_CONTROL: Cache a given GPIO Bit Setup for a given event
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 4d5a28efda3ce12529e4b90832184f62c7a50848)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    2 +-
+ drivers/media/dvb/mantis/mantis_core.c   |   11 +++++------
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 0aa4001..75f0773 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -137,7 +137,7 @@ struct mantis_pci {
+ 	u32			sub_device_id;
+ 
+ 	 /*	A12 A13 A14		*/
+-	int			gpio_status;
++	u32			gpio_status;
+ 
+ 	struct mantis_ca	*mantis_ca;
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index b94d051..3fd3b08 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -185,16 +185,15 @@ int mantis_core_exit(struct mantis_pci *mantis)
+ // Turn the given bit on or off.
+ void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
+ {
+-	u32 currVal, newVal;
+-
+-	currVal = mmread(MANTIS_GPIF_ADDR);
++	u32 cur;
+ 
++	cur = mmread(MANTIS_GPIF_ADDR);
+ 	if (value)
+-		newVal = currVal | (1 << bitpos);
++		mantis->gpio_status = cur | (1 << bitpos);
+ 	else
+-		newVal = currVal & (~(1 << bitpos));
++		mantis->gpio_status = cur & (~(1 << bitpos));
+ 
+-	mmwrite(newVal, MANTIS_GPIF_ADDR);
++	mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR);
+ 	mmwrite(0x00, MANTIS_GPIF_DOUT);
+ 	udelay(100);
+ }
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0053-V4L-DVB-13751-Mantis-GPIO_CONTROL-Do-not-toggle-GPIO.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0053-V4L-DVB-13751-Mantis-GPIO_CONTROL-Do-not-toggle-GPIO.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,82 @@
+From d7b96790304cbd2a5cb6024310ec90ff9f2f3b5b Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:16:24 -0300
+Subject: [PATCH 053/120] V4L/DVB (13751): [Mantis] GPIO_CONTROL: Do not toggle GPIO CW's on HIF operations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b2d8f5eafd31cd7bc722dc93057d8c5fd5b688ab)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    2 ++
+ drivers/media/dvb/mantis/mantis_hif.c    |    9 +++++----
+ 2 files changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 75f0773..49f2f11 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -142,6 +142,8 @@ struct mantis_pci {
+ 	struct mantis_ca	*mantis_ca;
+ };
+ 
++#define MANTIS_HIF_STATUS	(mantis->gpio_status << 12)
++
+ extern unsigned int verbose;
+ extern unsigned int devs;
+ extern unsigned int i2c;
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index d18fe41..96611b6 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -56,6 +56,7 @@ static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
+ 	return rc;
+ }
+ 
++
+ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+@@ -67,7 +68,7 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_BRADDR);
++	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_BRADDR);
+ 	mmwrite(count, MANTIS_GPIF_BRBYTES);
+ 
+ 	udelay(20);
+@@ -100,7 +101,7 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 
+ 	mmwrite(slot->slave_cfg, MANTIS_GPIF_CFGSLA); /* Slot0 alone for now */
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 	ca->hif_job_queue = MANTIS_HIF_MEMWR;
+ 
+@@ -124,7 +125,7 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 	ca->hif_job_queue = MANTIS_HIF_IOMRD;
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+@@ -152,7 +153,7 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+ 	ca->hif_job_queue = MANTIS_HIF_IOMWR;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0054-V4L-DVB-13752-Mantis-CA-CAM_CONTROL-All-CAM-control-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0054-V4L-DVB-13752-Mantis-CA-CAM_CONTROL-All-CAM-control-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,46 @@
+From 7353f94022a6db6679736088921deb74c1f5c9cd Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:17:14 -0300
+Subject: [PATCH 054/120] V4L/DVB (13752): [Mantis CA] CAM_CONTROL: All CAM control operations now handled by the worker thread
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b619f9f8a111be3f6ec8ec2671eb93c66a673b90)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pci.c |   15 +--------------
+ 1 files changed, 1 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 6eecd54..4873fa9 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -183,20 +183,7 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+ 	mantis->subsystem_device = pdev->subsystem_device;
+ 	init_waitqueue_head(&mantis->i2c_wq);
+ 
+-	// CAM bypass
+-	//mmwrite(mmread(MANTIS_INT_MASK) | MANTIS_INT_IRQ1, MANTIS_INT_MASK);
+-	dprintk(verbose, MANTIS_INFO, 0, "\ngpif status: %04x  irqcfg: %04x\n", mmread(0x9c), mmread(0x98));
+-	if ((mmread(0x9c) & 0x200) != 0) { //CAM inserted
+-		msleep_interruptible(1);
+-		if ((mmread(0x9c) & 0x200) != 0)
+-			mmwrite(((mmread(0x98) | 0x01) & ~0x02), 0x98);
+-		else
+-			mmwrite(((mmread(0x98) | 0x02) & ~0x01), 0x98);
+-
+-	} else {
+-		mmwrite(((mmread(0x98) | 0x02) & ~0x01), 0x98);
+-	}
+-	mantis_set_direction(mantis, 0);
++	mantis_set_direction(mantis, 0); /* CAM bypass */
+ 
+ 	if (!latency)
+ 		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 32);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0055-V4L-DVB-13753-Mantis-CA-SLOT_CONTROL-Implement-Slot-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0055-V4L-DVB-13753-Mantis-CA-SLOT_CONTROL-Implement-Slot-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From 0f6112987a8789ba97f6cdf2c0f538b8730e8f7c Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:17:46 -0300
+Subject: [PATCH 055/120] V4L/DVB (13753): [Mantis CA] SLOT_CONTROL: Implement Slot RESET
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit fb6de9c5fe13fd5cd866c49204e6bd91d73f83b0)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c |    5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index f6d70cb..a30eb84 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -80,6 +80,11 @@ static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot RESET", slot);
++	udelay(500); /* Wait.. */
++	mmwrite(0xda, MANTIS_PCMCIA_RESET); /* Leading edge assert */
++	udelay(500);
++	mmwrite(0x00, MANTIS_PCMCIA_RESET); /* Trailing edge deassert */
++	msleep(1000);
+ 
+ 	return 0;
+ }
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0056-V4L-DVB-13754-Mantis-CAM_CONTROL-Implement-TS-contro.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0056-V4L-DVB-13754-Mantis-CAM_CONTROL-Implement-TS-contro.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,61 @@
+From 13c3b8254171a89f941116d15e7312a2ccc1c800 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:18:27 -0300
+Subject: [PATCH 056/120] V4L/DVB (13754): [Mantis] CAM_CONTROL: Implement TS control
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 990f8d1e161429ee1a0e9708f7989543e4648f73)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c     |    1 +
+ drivers/media/dvb/mantis/mantis_common.h |    2 ++
+ drivers/media/dvb/mantis/mantis_core.h   |    4 ----
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index a30eb84..b9d808b 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -105,6 +105,7 @@ static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
++	mantis_set_direction(mantis, 1); /* Enable TS through CAM */
+ 
+ 	return 0;
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 49f2f11..ac3eefe 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -153,6 +153,8 @@ extern int mantis_dvb_exit(struct mantis_pci *mantis);
+ extern void mantis_dma_xfer(unsigned long data);
+ extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
+ 
++extern void mantis_set_direction(struct mantis_pci *mantis, int direction);
++
+ extern int mantis_ca_init(struct mantis_pci *mantis);
+ extern void mantis_ca_exit(struct mantis_pci *mantis);
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_core.h b/drivers/media/dvb/mantis/mantis_core.h
+index 31b2a75..a809394 100644
+--- a/drivers/media/dvb/mantis/mantis_core.h
++++ b/drivers/media/dvb/mantis/mantis_core.h
+@@ -53,9 +53,5 @@ extern int mantis_i2c_init(struct mantis_pci *mantis);
+ extern int mantis_i2c_exit(struct mantis_pci *mantis);
+ extern int mantis_core_init(struct mantis_pci *mantis);
+ extern int mantis_core_exit(struct mantis_pci *mantis);
+-//extern void mantis_fe_powerup(struct mantis_pci *mantis);
+-//extern void mantis_fe_powerdown(struct mantis_pci *mantis);
+-//extern void mantis_fe_reset(struct dvb_frontend *fe);
+-extern void mantis_set_direction(struct mantis_pci *mantis, int direction);
+ 
+ #endif //__MANTIS_CORE_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0057-V4L-DVB-13755-Mantis-CA-CAM_CONTROL-Use-appropriate-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0057-V4L-DVB-13755-Mantis-CA-CAM_CONTROL-Use-appropriate-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,34 @@
+From 6b927ab4cd36fc85e465f3d2c50ebe64010eea40 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:18:53 -0300
+Subject: [PATCH 057/120] V4L/DVB (13755): [Mantis CA] CAM_CONTROL: Use appropriate flags
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit f9ce1c3f32aa472c667c4d43d01c42922fb356ca)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index b9d808b..2c49f6b 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -138,6 +138,9 @@ int mantis_ca_init(struct mantis_pci *mantis)
+ 
+ 	ca->ca_priv = mantis;
+ 	mantis->mantis_ca = ca;
++	ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE	|
++		   DVB_CA_EN50221_FLAG_IRQ_FR		|
++		   DVB_CA_EN50221_FLAG_IRQ_DA;
+ 
+ 	/* register CA interface */
+ 	ca->en50221.owner		= THIS_MODULE;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0058-V4L-DVB-13756-Mantis-CA-CAM_CONTROL-Use-CAMCHANGE_IR.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0058-V4L-DVB-13756-Mantis-CA-CAM_CONTROL-Use-CAMCHANGE_IR.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,43 @@
+From cd299782e9a680134268093555ab3afa14dc5d2b Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:19:26 -0300
+Subject: [PATCH 058/120] V4L/DVB (13756): [Mantis CA] CAM_CONTROL: Use CAMCHANGE_IRQ events
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 05691cdbf479282e3d3c2e3386cb865cbf611e3a)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    6 ++++++
+ 1 files changed, 6 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index dbcdca3..79c3c62 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -39,12 +39,18 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+ 			mantis_event_cam_plugin(ca);
++			dvb_ca_en50221_camchange_irq(&ca->en50221,
++						     0,
++						     DVB_CA_EN50221_CAMCHANGE_INSERTED);
+ 		}
+ 	} else {
+ 		if (gpif_stat & MANTIS_CARD_PLUGOUT) {
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+ 			mantis_event_cam_unplug(ca);
++			dvb_ca_en50221_camchange_irq(&ca->en50221,
++						     0,
++						     DVB_CA_EN50221_CAMCHANGE_REMOVED);
+ 		}
+ 	}
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0059-V4L-DVB-13757-Mantis-CA-CAM_CONTROL-Use-FRDA_IRQ-Eve.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0059-V4L-DVB-13757-Mantis-CA-CAM_CONTROL-Use-FRDA_IRQ-Eve.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,34 @@
+From df6c3197692071a03bb5dd3e69025246f297daca Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:20:14 -0300
+Subject: [PATCH 059/120] V4L/DVB (13757): [Mantis CA] CAM_CONTROL: Use FRDA_IRQ Events
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit bb928a7a21273f67455912f0935ff943ddb35d0c)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    3 +--
+ 1 files changed, 1 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 79c3c62..ee04955 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -69,8 +69,7 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	if (gpif_stat & MANTIS_GPIF_BRRDY) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
+ 		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
+-		if (ca->hif_job_queue & MANTIS_HIF_MEMRD)
+-			wake_up(&ca->hif_brrdyw_wq);
++		dvb_ca_en50221_frda_irq(&ca->en50221, 0);
+ 	}
+ 	if (gpif_stat & MANTIS_GPIF_WRACK)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0060-V4L-DVB-13758-Mantis-CA-CAM_CONTROL-Use-CAMREADY_IRQ.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0060-V4L-DVB-13758-Mantis-CA-CAM_CONTROL-Use-CAMREADY_IRQ.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,49 @@
+From f51c7ca2ec38e36ed014dccf9df62d0432c35544 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:20:44 -0300
+Subject: [PATCH 060/120] V4L/DVB (13758): [Mantis CA] CAM_CONTROL: Use CAMREADY_IRQ event
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 2ec9b00bd0386b71c8a84a3990a13ea9656fe8dd)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c  |    1 +
+ drivers/media/dvb/mantis/mantis_evm.c |    5 +----
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 2c49f6b..abd8855 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -85,6 +85,7 @@ static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
+ 	udelay(500);
+ 	mmwrite(0x00, MANTIS_PCMCIA_RESET); /* Trailing edge deassert */
+ 	msleep(1000);
++	dvb_ca_en50221_camready_irq(&ca->en50221, 0);
+ 
+ 	return 0;
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index ee04955..4695715 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -82,10 +82,7 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 
+ 	if (gpif_stat & MANTIS_SBUF_OPDONE) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
+-		if (ca->hif_job_queue) {
+-			wake_up(&ca->hif_opdone_wq);
+-			ca->hif_event = MANTIS_SBUF_OPDONE;
+-		}
++
+ 	}
+ }
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0061-V4L-DVB-13759-Mantis-HIF-I-O-Use-the-LSB-octet-only.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0061-V4L-DVB-13759-Mantis-HIF-I-O-Use-the-LSB-octet-only.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,35 @@
+From db4106b3bfa9aad451695c41278d66e47953c0b6 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:21:05 -0300
+Subject: [PATCH 061/120] V4L/DVB (13759): [Mantis] HIF I/O: Use the LSB octet only
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to Abylai Ospan for pointing this out.
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 9c8679554db8cf39ccec5a90cfaa12b164585556)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 96611b6..1ccd869 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -139,7 +139,7 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+ 	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 
+-	return data;
++	return (u8) data;
+ }
+ 
+ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0062-V4L-DVB-13760-Mantis-CA-CA_MODULE-Look-for-module-st.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0062-V4L-DVB-13760-Mantis-CA-CA_MODULE-Look-for-module-st.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,35 @@
+From bba61c53a60cd9b46494dd84eda68bb53a0a69de Mon Sep 17 00:00:00 2001
+From: Sigmund Augdal <sigmund at snap.tv>
+Date: Fri, 4 Dec 2009 05:21:27 -0300
+Subject: [PATCH 062/120] V4L/DVB (13760): [Mantis CA] CA_MODULE: Look for module status on driver load
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Sigmund Augdal <sigmund at snap.tv>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 86c75c5c2b9318f4b3218615ada18badabd3f166)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pcmcia.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+index 47cc720..59f1a06 100644
+--- a/drivers/media/dvb/mantis/mantis_pcmcia.c
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -83,6 +83,9 @@ int mantis_pcmcia_init(struct mantis_ca *ca)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
+ 		mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG);
+ 		ca->slot_state = MODULE_INSERTED;
++		dvb_ca_en50221_camchange_irq(&ca->en50221,
++					     0,
++					     DVB_CA_EN50221_CAMCHANGE_INSERTED);
+ 	} else {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
+ 		mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0063-V4L-DVB-13761-Mantis-HIF-I-O-Temporary-workaround-us.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0063-V4L-DVB-13761-Mantis-HIF-I-O-Temporary-workaround-us.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,46 @@
+From c08c027326170324bdbe68ba172a075fd318951a Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:21:51 -0300
+Subject: [PATCH 063/120] V4L/DVB (13761): [Mantis] HIF I/O: Temporary workaround, use SBUF_OPDONE flag instead
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Dnumgis got hit with this bug, using a temporary workaround
+for the time being rather than digging deep at this point.
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit cc0e4aacaf4c3660fa759ce1299377baaf9efd8b)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    5 ++---
+ 1 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 4695715..532bcff 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -68,8 +68,6 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 
+ 	if (gpif_stat & MANTIS_GPIF_BRRDY) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
+-		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
+-		dvb_ca_en50221_frda_irq(&ca->en50221, 0);
+ 	}
+ 	if (gpif_stat & MANTIS_GPIF_WRACK)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
+@@ -82,7 +80,8 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 
+ 	if (gpif_stat & MANTIS_SBUF_OPDONE) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
+-
++		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
++		dvb_ca_en50221_frda_irq(&ca->en50221, 0);
+ 	}
+ }
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0064-V4L-DVB-13762-Mantis-CA-CA_MODULE-Look-for-the-modul.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0064-V4L-DVB-13762-Mantis-CA-CA_MODULE-Look-for-the-modul.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,34 @@
+From 296c3247f8ffccad5cd54f6cd1dcd1d6d5d67e29 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:22:33 -0300
+Subject: [PATCH 064/120] V4L/DVB (13762): [Mantis CA] CA_MODULE: Look for the module status on driver unload as well
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 88a6fa9dfec0a585409acbb49a7f86a933b35d2b)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pcmcia.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+index 59f1a06..4156a08 100644
+--- a/drivers/media/dvb/mantis/mantis_pcmcia.c
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -90,6 +90,9 @@ int mantis_pcmcia_init(struct mantis_ca *ca)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
+ 		mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
+ 		ca->slot_state = MODULE_XTRACTED;
++		dvb_ca_en50221_camchange_irq(&ca->en50221,
++					     0,
++					     DVB_CA_EN50221_CAMCHANGE_REMOVED);
+ 	}
+ 
+ 	return 0;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0065-V4L-DVB-13763-Mantis-HIF-I-O-trim-delays-a-bit-appro.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0065-V4L-DVB-13763-Mantis-HIF-I-O-trim-delays-a-bit-appro.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,49 @@
+From 03f4f0b232a65b033edc0ffbfa907ca7f25a68a8 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:22:57 -0300
+Subject: [PATCH 065/120] V4L/DVB (13763): [Mantis] HIF I/O: trim delays a bit appropriately
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 8e0d58ecee2abc12f298862b7f9a90d1593e8006)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 1ccd869..880b996 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -133,11 +133,11 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+-	udelay(50);
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
+ 	data = mmread(MANTIS_GPIF_DIN);
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+ 	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	udelay(50);
+ 
+ 	return (u8) data;
+ }
+@@ -162,10 +162,10 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+-	udelay(50);
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+ 	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	udelay(50);
+ 
+ 	return 0;
+ }
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0066-V4L-DVB-13764-Mantis-CA-SLOT-Add-some-debug-status.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0066-V4L-DVB-13764-Mantis-CA-SLOT-Add-some-debug-status.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,38 @@
+From 98d02f326cfc11b8fac8e031391dc9ddd092bc52 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:23:17 -0300
+Subject: [PATCH 066/120] V4L/DVB (13764): [Mantis CA] SLOT: Add some debug status
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 5e2a0c99019bbc78d6fb00caf7a79f03df020b3c)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c |    6 +++++-
+ 1 files changed, 5 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index abd8855..b79a892 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -118,8 +118,12 @@ static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
+ 
+-	if (ca->slot_state == MODULE_INSERTED)
++	if (ca->slot_state == MODULE_INSERTED) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "CA Module present and ready");
+ 		return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
++	} else {
++		dprintk(verbose, MANTIS_DEBUG, 1, "CA Module not present or not ready");
++	}
+ 
+ 	return 0;
+ }
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0067-V4L-DVB-13765-Mantis-HIF-I-O-Add-some-debug-statemen.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0067-V4L-DVB-13765-Mantis-HIF-I-O-Add-some-debug-statemen.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,66 @@
+From b56e3266dc0a8ab03381e11ab8582693bd17a4ef Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:23:38 -0300
+Subject: [PATCH 067/120] V4L/DVB (13765): [Mantis] HIF I/O: Add some debug statements
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 8b9c385f765bcc7fc5ae802830ffcb4b6ca6bc9c)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    7 ++++++-
+ 1 files changed, 6 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 880b996..c2cecc3 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -51,6 +51,7 @@ static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Smart buffer operation timeout !", mantis->num);
+ 		rc = -EREMOTEIO;
+ 	}
++	dprintk(verbose, MANTIS_DEBUG, 1, "Smart Buffer Operation complete");
+ 	ca->hif_event &= ~MANTIS_SBUF_OPDONE;
+ 	udelay(5);
+ 	return rc;
+@@ -83,7 +84,7 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 		return -EREMOTEIO;
+ 	}
+ 	data = mmread(MANTIS_GPIF_DIN);
+-
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mem Read: 0x%02x", data);
+ 	return (data >> 24) & 0xff;
+ }
+ 
+@@ -111,6 +112,8 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 		return -EREMOTEIO;
+ 	}
+ 	ca->hif_job_queue &= ~MANTIS_HIF_MEMWR;
++	dprintk(verbose, MANTIS_DEBUG, 1, "Mem Write: (0x%02x to 0x%02x)", data, addr);
++
+ 	return 0;
+ }
+ 
+@@ -137,6 +140,7 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	data = mmread(MANTIS_GPIF_DIN);
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+ 	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Read: 0x%02x", data);
+ 	udelay(50);
+ 
+ 	return (u8) data;
+@@ -165,6 +169,7 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
+ 	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+ 	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
++	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Write: (0x%02x to 0x%02x)", data, addr);
+ 	udelay(50);
+ 
+ 	return 0;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0068-V4L-DVB-13766-Mantis-Bug-Fix-wrong-exit-condition.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0068-V4L-DVB-13766-Mantis-Bug-Fix-wrong-exit-condition.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,34 @@
+From 1278188295bed9ed92291c3d8b751573e3756ae0 Mon Sep 17 00:00:00 2001
+From: Sigmund Augdal <sigmund at snap.tv>
+Date: Fri, 4 Dec 2009 05:24:01 -0300
+Subject: [PATCH 068/120] V4L/DVB (13766): [Mantis] Bug: Fix wrong exit condition
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Sigmund Augdal <sigmund at snap.tv>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b29453aca0eeecba52a76c3d67b1a52c3ca6e656)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    2 --
+ 1 files changed, 0 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 532bcff..214ae5e 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -31,8 +31,6 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 
+ 	gpif_stat = mmread(MANTIS_GPIF_STATUS);
+ 	gpif_mask = mmread(MANTIS_GPIF_IRQCFG);
+-	if (!((gpif_stat & 0xff) & (gpif_mask & 0xff)))
+-		return;
+ 
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+ 		if (gpif_stat & MANTIS_CARD_PLUGIN) {
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0069-V4L-DVB-13767-Mantis-VP-1041-Bug-Add-in-missing-Mast.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0069-V4L-DVB-13767-Mantis-VP-1041-Bug-Add-in-missing-Mast.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From 5d6d71e9bc1b015d2233cc54eff468675ca21ef2 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:24:47 -0300
+Subject: [PATCH 069/120] V4L/DVB (13767): [Mantis/VP-1041] Bug: Add in missing Master clock settings
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to Ershov and Igor for pointing it out.
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 18b6de42d77e7762be929a4a858c359de352e1e2)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_vp1041.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index 7dee1af..8eb1afd 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -267,6 +267,9 @@ struct stb0899_config vp1041_config = {
+ 	.xtal_freq		= 27000000,
+ 	.inversion		= IQ_SWAP_ON, /* 1 */
+ 
++	.lo_clk			= 76500000,
++	.hi_clk			= 99000000,
++
+ 	.esno_ave		= STB0899_DVBS2_ESNO_AVE,
+ 	.esno_quant		= STB0899_DVBS2_ESNO_QUANT,
+ 	.avframes_coarse	= STB0899_DVBS2_AVFRAMES_COARSE,
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0070-V4L-DVB-13768-Mantis-Enable-WRACK.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0070-V4L-DVB-13768-Mantis-Enable-WRACK.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,58 @@
+From 3233c1c265a9216a4ac171d000f32ebc8921885e Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:25:18 -0300
+Subject: [PATCH 070/120] V4L/DVB (13768): [Mantis] Enable WRACK
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit adcc9dd57e814d5ac3928f92f431fbe4808e936f)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |   10 +++++++++-
+ drivers/media/dvb/mantis/mantis_hif.c |    1 +
+ 2 files changed, 10 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 214ae5e..000cf39 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -27,11 +27,19 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	struct mantis_ca *ca = container_of(work, struct mantis_ca, hif_evm_work);
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	u32 gpif_stat, gpif_mask;
++	u32 gpif_stat, gpif_mask, rst_mask, rst_stat;
++
++	rst_mask  = MANTIS_GPIF_WRACK  |
++		    MANTIS_GPIF_OTHERR |
++		    MANTIS_SBUF_WSTO   |
++		    MANTIS_GPIF_EXTIRQ;
+ 
+ 	gpif_stat = mmread(MANTIS_GPIF_STATUS);
+ 	gpif_mask = mmread(MANTIS_GPIF_IRQCFG);
+ 
++	rst_stat = gpif_stat & rst_mask;
++	mmwrite(rst_stat, MANTIS_GPIF_STATUS);
++
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+ 		if (gpif_stat & MANTIS_CARD_PLUGIN) {
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index c2cecc3..2f1a6cb 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -188,6 +188,7 @@ int mantis_hif_init(struct mantis_ca *ca)
+ 
+ 	irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
+ 	irqcfg |= MANTIS_MASK_BRRDY;
++	irqcfg |= MANTIS_MASK_WRACK;
+ 	mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
+ 
+ 	return 0;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0071-V4L-DVB-13769-Mantis-Smart-Buffer-Burst-Read-Ready-c.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0071-V4L-DVB-13769-Mantis-Smart-Buffer-Burst-Read-Ready-c.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From c06d22ea77fc3584534c556b738895c79f523065 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:25:45 -0300
+Subject: [PATCH 071/120] V4L/DVB (13769): [Mantis] Smart Buffer Burst Read Ready cannot flag FR/DA Irq
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 9e49e8d913209e7221f761193f18a91d130b9e2d)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 000cf39..1594bb8 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -72,9 +72,9 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	if (gpif_stat & MANTIS_SBUF_OVFLW)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
+ 
+-	if (gpif_stat & MANTIS_GPIF_BRRDY) {
++	if (gpif_stat & MANTIS_GPIF_BRRDY)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
+-	}
++
+ 	if (gpif_stat & MANTIS_GPIF_WRACK)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0072-V4L-DVB-13770-Mantis-Bug-Do-not-trigger-FR-DA-IRQ-fr.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0072-V4L-DVB-13770-Mantis-Bug-Do-not-trigger-FR-DA-IRQ-fr.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,32 @@
+From 25933d9a587b31a403afcf97ee51aeaacf0006fa Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:26:18 -0300
+Subject: [PATCH 072/120] V4L/DVB (13770): [Mantis] Bug Do not trigger FR/DA IRQ from SBUF OPDONE
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit f668c7292bda7f64400eaa8d45c3a785eecab990)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 1594bb8..d603601 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -87,7 +87,6 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	if (gpif_stat & MANTIS_SBUF_OPDONE) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
+ 		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
+-		dvb_ca_en50221_frda_irq(&ca->en50221, 0);
+ 	}
+ }
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0073-V4L-DVB-13771-Mantis-Reset-Flags-at-the-earliest-pos.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0073-V4L-DVB-13771-Mantis-Reset-Flags-at-the-earliest-pos.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,123 @@
+From 968a9a10f909e19de0dd828d251d4513bc7f0ba7 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:26:46 -0300
+Subject: [PATCH 073/120] V4L/DVB (13771): [Mantis] Reset Flags at the earliest possible
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 17b77fc2d404910ca691661038ceb4c02d912d16)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    2 ++
+ drivers/media/dvb/mantis/mantis_evm.c    |   18 +++++-------------
+ drivers/media/dvb/mantis/mantis_pci.c    |   12 ++++++++++++
+ 3 files changed, 19 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index ac3eefe..27ecfdb 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -139,6 +139,8 @@ struct mantis_pci {
+ 	 /*	A12 A13 A14		*/
+ 	u32			gpio_status;
+ 
++	u32			gpif_status;
++
+ 	struct mantis_ca	*mantis_ca;
+ };
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index d603601..4c4c144 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -27,19 +27,11 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	struct mantis_ca *ca = container_of(work, struct mantis_ca, hif_evm_work);
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	u32 gpif_stat, gpif_mask, rst_mask, rst_stat;
+-
+-	rst_mask  = MANTIS_GPIF_WRACK  |
+-		    MANTIS_GPIF_OTHERR |
+-		    MANTIS_SBUF_WSTO   |
+-		    MANTIS_GPIF_EXTIRQ;
++	u32 gpif_stat, gpif_mask;
+ 
+ 	gpif_stat = mmread(MANTIS_GPIF_STATUS);
+ 	gpif_mask = mmread(MANTIS_GPIF_IRQCFG);
+ 
+-	rst_stat = gpif_stat & rst_mask;
+-	mmwrite(rst_stat, MANTIS_GPIF_STATUS);
+-
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+ 		if (gpif_stat & MANTIS_CARD_PLUGIN) {
+ 			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
+@@ -60,13 +52,13 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 		}
+ 	}
+ 
+-	if (gpif_stat & MANTIS_GPIF_EXTIRQ)
++	if (mantis->gpif_status & MANTIS_GPIF_EXTIRQ)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
+ 
+-	if (gpif_stat & MANTIS_SBUF_WSTO)
++	if (mantis->gpif_status & MANTIS_SBUF_WSTO)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
+ 
+-	if (gpif_stat & MANTIS_GPIF_OTHERR)
++	if (mantis->gpif_status & MANTIS_GPIF_OTHERR)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_OVFLW)
+@@ -75,7 +67,7 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	if (gpif_stat & MANTIS_GPIF_BRRDY)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
+ 
+-	if (gpif_stat & MANTIS_GPIF_WRACK)
++	if (mantis->gpif_status & MANTIS_GPIF_WRACK)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_INTSTAT)
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 4873fa9..f57e2a4 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -53,6 +53,8 @@ MODULE_DEVICE_TABLE(pci, mantis_pci_table);
+ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ {
+ 	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
++	u32 rst_stat = 0, rst_mask = 0;
++
+ 	struct mantis_pci *mantis;
+ 	struct mantis_ca *ca;
+ 
+@@ -69,6 +71,15 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	if (!(stat & mask))
+ 		return IRQ_NONE;
+ 
++	rst_mask  = MANTIS_GPIF_WRACK  |
++		    MANTIS_GPIF_OTHERR |
++		    MANTIS_SBUF_WSTO   |
++		    MANTIS_GPIF_EXTIRQ;
++
++	rst_stat  = mmread(MANTIS_GPIF_STATUS);
++	rst_stat &= rst_mask;
++	mmwrite(rst_stat, MANTIS_GPIF_STATUS);
++
+ 	mantis->mantis_int_stat = stat;
+ 	mantis->mantis_int_mask = mask;
+ 	dprintk(verbose, MANTIS_DEBUG, 0, "=== Interrupts[%04x/%04x]= [", stat, mask);
+@@ -77,6 +88,7 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	}
+ 	if (stat & MANTIS_INT_IRQ0) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
++		mantis->gpif_status = rst_stat;
+ 		schedule_work(&ca->hif_evm_work);
+ 	}
+ 	if (stat & MANTIS_INT_IRQ1) {
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0074-V4L-DVB-13772-Mantis-Do-not-enable-Common-Memory-Acc.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0074-V4L-DVB-13772-Mantis-Do-not-enable-Common-Memory-Acc.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,42 @@
+From bca78435121081f27d817455c44e7420fbc6bc37 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:27:26 -0300
+Subject: [PATCH 074/120] V4L/DVB (13772): [Mantis] Do not enable Common Memory Access
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 578413228ae72a09b29bf29e879e5b919ded0ac4)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    4 ----
+ 1 files changed, 0 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 2f1a6cb..151de2d 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -138,8 +138,6 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	}
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
+ 	data = mmread(MANTIS_GPIF_DIN);
+-	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+-	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Read: 0x%02x", data);
+ 	udelay(50);
+ 
+@@ -167,8 +165,6 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 		return -EREMOTEIO;
+ 	}
+ 	ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
+-	hif_addr |= MANTIS_GPIF_PCMCIAREG;
+-	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Write: (0x%02x to 0x%02x)", data, addr);
+ 	udelay(50);
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0075-V4L-DVB-13773-Mantis-Enable-all-interrupts.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0075-V4L-DVB-13773-Mantis-Enable-all-interrupts.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,42 @@
+From f885a5c0c7bd350ad4f082370f9a5b34acd47fce Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:27:53 -0300
+Subject: [PATCH 075/120] V4L/DVB (13773): [Mantis] Enable all interrupts
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit c90d345fd7d66899d743611a47163f9904df90bc)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |   11 ++++++++---
+ 1 files changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 151de2d..fa4bb6d 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -182,9 +182,14 @@ int mantis_hif_init(struct mantis_ca *ca)
+ 	init_waitqueue_head(&ca->hif_data_wq);
+ 	init_waitqueue_head(&ca->hif_opdone_wq);
+ 
+-	irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
+-	irqcfg |= MANTIS_MASK_BRRDY;
+-	irqcfg |= MANTIS_MASK_WRACK;
++	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
++	irqcfg = MANTIS_MASK_BRRDY	|
++		 MANTIS_MASK_WRACK	|
++		 MANTIS_MASK_EXTIRQ	|
++		 MANTIS_MASK_WSTO	|
++		 MANTIS_MASK_OTHERR	|
++		 MANTIS_MASK_OVFLW;
++
+ 	mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
+ 
+ 	return 0;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0076-V4L-DVB-13774-Mantis-Remove-redundant-wait-for-Burst.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0076-V4L-DVB-13774-Mantis-Remove-redundant-wait-for-Burst.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,50 @@
+From 6c879c97e12ca27a73026c73069babe5fee648c5 Mon Sep 17 00:00:00 2001
+From: Sigmund Augdal <sigmund at snap.tv>
+Date: Fri, 4 Dec 2009 05:28:24 -0300
+Subject: [PATCH 076/120] V4L/DVB (13774): [Mantis] Remove redundant wait for Burst Reads, wakeup the HIF event
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Sigmund Augdal <sigmund at snap.tv>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit c02e15150c85619f22a98675124503ed93bf1914)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    2 ++
+ drivers/media/dvb/mantis/mantis_hif.c |    4 ----
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 4c4c144..008e2c2 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -79,6 +79,8 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	if (gpif_stat & MANTIS_SBUF_OPDONE) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
+ 		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
++		ca->hif_event = MANTIS_SBUF_OPDONE;
++		wake_up(&ca->hif_opdone_wq);
+ 	}
+ }
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index fa4bb6d..6c51d17 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -75,10 +75,6 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 	udelay(20);
+ 
+ 	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+-	if (mantis_hif_data_available(ca) != 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer burst read failed", mantis->num);
+-		return -EREMOTEIO;
+-	}
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0077-V4L-DVB-13775-Mantis-Remove-unnecessary-job-queues.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0077-V4L-DVB-13775-Mantis-Remove-unnecessary-job-queues.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,84 @@
+From 5a8397a8434636fb2921245563fb8511148bee08 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:29:03 -0300
+Subject: [PATCH 077/120] V4L/DVB (13775): [Mantis] Remove unnecessary job queues
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b9fd5877463605b91743552b4989666792bf4fbc)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c  |   10 ----------
+ drivers/media/dvb/mantis/mantis_link.h |    1 -
+ 2 files changed, 0 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 6c51d17..621dce3 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -97,17 +97,13 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	hif_addr |= addr;
+ 
+ 	mmwrite(slot->slave_cfg, MANTIS_GPIF_CFGSLA); /* Slot0 alone for now */
+-
+ 	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+-	ca->hif_job_queue = MANTIS_HIF_MEMWR;
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+-		ca->hif_job_queue &= ~MANTIS_HIF_MEMWR;
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+-	ca->hif_job_queue &= ~MANTIS_HIF_MEMWR;
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mem Write: (0x%02x to 0x%02x)", data, addr);
+ 
+ 	return 0;
+@@ -125,14 +121,11 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	hif_addr |=  addr;
+ 
+ 	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+-	ca->hif_job_queue = MANTIS_HIF_IOMRD;
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+-		ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+-	ca->hif_job_queue &= ~MANTIS_HIF_IOMRD;
+ 	data = mmread(MANTIS_GPIF_DIN);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Read: 0x%02x", data);
+ 	udelay(50);
+@@ -154,13 +147,10 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+-	ca->hif_job_queue = MANTIS_HIF_IOMWR;
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+-		ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+-	ca->hif_job_queue &= ~MANTIS_HIF_IOMWR;
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Write: (0x%02x to 0x%02x)", data, addr);
+ 	udelay(50);
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index 23ff2d6..a85f502 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -51,7 +51,6 @@ struct mantis_ca {
+ 	wait_queue_head_t		hif_opdone_wq;
+ 	wait_queue_head_t		hif_brrdyw_wq;
+ 	wait_queue_head_t		hif_data_wq;
+-	u32				hif_job_queue;
+ 
+ 	enum mantis_sbuf_status		sbuf_status;
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0078-V4L-DVB-13776-Mantis-Use-a-simple-timeout-instead-in.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0078-V4L-DVB-13776-Mantis-Use-a-simple-timeout-instead-in.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,39 @@
+From 20cef9cdc3581a9023fd09a0f202c7f53149a75f Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:29:25 -0300
+Subject: [PATCH 078/120] V4L/DVB (13776): [Mantis] Use a simple timeout instead, interruptible
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+timeouts sleep unnecessarily too long
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit ac8f04d2723b3de7c36430d67401ce89c858e117)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    6 +++---
+ 1 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 621dce3..a2359f7 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -44,9 +44,9 @@ static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	int rc = 0;
+ 
+-	if (wait_event_interruptible_timeout(ca->hif_opdone_wq,
+-					     ca->hif_event & MANTIS_SBUF_OPDONE,
+-					     msecs_to_jiffies(500)) == -ERESTARTSYS) {
++	if (wait_event_timeout(ca->hif_opdone_wq,
++			       ca->hif_event & MANTIS_SBUF_OPDONE,
++			       msecs_to_jiffies(500)) == -ERESTARTSYS) {
+ 
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Smart buffer operation timeout !", mantis->num);
+ 		rc = -EREMOTEIO;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0079-V4L-DVB-13777-Mantis-Use-a-Write-wait-queue-for-Writ.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0079-V4L-DVB-13777-Mantis-Use-a-Write-wait-queue-for-Writ.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,99 @@
+From 836746e92296047dfc0fa5b66ef32d67893f48e4 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:29:48 -0300
+Subject: [PATCH 079/120] V4L/DVB (13777): [Mantis] Use a Write wait queue for Write events
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit e0e099a708043a2341d8987014ce4ba98a4dbd30)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c  |   34 ++++++++++++++++++++++++++++++-
+ drivers/media/dvb/mantis/mantis_link.h |    1 +
+ 2 files changed, 33 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index a2359f7..dc50fac 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -57,6 +57,35 @@ static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
+ 	return rc;
+ }
+ 
++static int mantis_hif_write_wait(struct mantis_ca *ca)
++{
++	struct mantis_pci *mantis = ca->ca_priv;
++	u32 opdone = 0, timeout = 0;
++	int rc = 0;
++
++	if (wait_event_timeout(ca->hif_write_wq,
++			       mantis->gpif_status & MANTIS_GPIF_WRACK,
++			       msecs_to_jiffies(500)) == -ERESTARTSYS) {
++
++		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Write ACK timed out !", mantis->num);
++		rc = -EREMOTEIO;
++	}
++	dprintk(verbose, MANTIS_DEBUG, 1, "Write Acknowledged");
++	mantis->gpif_status &= ~MANTIS_GPIF_WRACK;
++	while (!opdone) {
++		opdone = (mmread(MANTIS_GPIF_STATUS) & MANTIS_SBUF_OPDONE);
++		udelay(500);
++		timeout++;
++		if (timeout > 100) {
++			dprintk(verbose, MANTIS_ERROR, 1, "Adater(%d) Slot(0): Write operation timed out!", mantis->num);
++			rc = -ETIMEDOUT;
++			break;
++		}
++	}
++	dprintk(verbose, MANTIS_DEBUG, 1, "HIF Write success");
++	return rc;
++}
++
+ 
+ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ {
+@@ -100,7 +129,7 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+-	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
++	if (mantis_hif_write_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+@@ -147,7 +176,7 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+-	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
++	if (mantis_hif_write_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+ 	}
+@@ -167,6 +196,7 @@ int mantis_hif_init(struct mantis_ca *ca)
+ 	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Initializing Mantis Host Interface", mantis->num);
+ 	init_waitqueue_head(&ca->hif_data_wq);
+ 	init_waitqueue_head(&ca->hif_opdone_wq);
++	init_waitqueue_head(&ca->hif_write_wq);
+ 
+ 	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
+ 	irqcfg = MANTIS_MASK_BRRDY	|
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index a85f502..599ff1b 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -51,6 +51,7 @@ struct mantis_ca {
+ 	wait_queue_head_t		hif_opdone_wq;
+ 	wait_queue_head_t		hif_brrdyw_wq;
+ 	wait_queue_head_t		hif_data_wq;
++	wait_queue_head_t		hif_write_wq; /* HIF Write op */
+ 
+ 	enum mantis_sbuf_status		sbuf_status;
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0080-V4L-DVB-13778-Mantis-Wr-ACK-is-already-handled-in-th.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0080-V4L-DVB-13778-Mantis-Wr-ACK-is-already-handled-in-th.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From b985d00f6cc8780a4bb59651f685aec65c3f6470 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:30:11 -0300
+Subject: [PATCH 080/120] V4L/DVB (13778): [Mantis] Wr ACK is already handled in the fast path,
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+do not use the event manager to handle the fast events
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 4d019faf48ff03b6ff3463d8e5da54d61f153623)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_evm.c |    3 ---
+ 1 files changed, 0 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 008e2c2..9be55f7 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -67,9 +67,6 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	if (gpif_stat & MANTIS_GPIF_BRRDY)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
+ 
+-	if (mantis->gpif_status & MANTIS_GPIF_WRACK)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Slave Write ACK", mantis->num);
+-
+ 	if (gpif_stat & MANTIS_GPIF_INTSTAT)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0081-V4L-DVB-13779-Mantis-Missing-wakeup-for-write-queue.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0081-V4L-DVB-13779-Mantis-Missing-wakeup-for-write-queue.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,34 @@
+From a2b40d936b9dc0a2adf4eb204fea8b2660e958ba Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:30:33 -0300
+Subject: [PATCH 081/120] V4L/DVB (13779): [Mantis] Missing wakeup for write queue
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to Sigmund for pointing it out
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 25e9eba42ce11a05933068cf6a42dd8d4ed5edb8)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pci.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index f57e2a4..a068ffb 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -89,6 +89,7 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	if (stat & MANTIS_INT_IRQ0) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
+ 		mantis->gpif_status = rst_stat;
++		wake_up(&ca->hif_write_wq);
+ 		schedule_work(&ca->hif_evm_work);
+ 	}
+ 	if (stat & MANTIS_INT_IRQ1) {
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0082-V4L-DVB-13780-Mantis-HIF-I-O-Enable-Interrupts-for-R.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0082-V4L-DVB-13780-Mantis-HIF-I-O-Enable-Interrupts-for-R.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,37 @@
+From da671ce16df2bbc12053996f0308bc6414c355e4 Mon Sep 17 00:00:00 2001
+From: Sigmund Augdal <sigmund at snap.tv>
+Date: Fri, 4 Dec 2009 05:30:59 -0300
+Subject: [PATCH 082/120] V4L/DVB (13780): [Mantis] HIF I/O: Enable Interrupts for Read
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Sigmund Augdal <sigmund at snap.tv>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit c63e507346c042af7fe26d49bbbdce9898ea3eea)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    5 +++++
+ 1 files changed, 5 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index dc50fac..323d1fb 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -149,6 +149,11 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  addr;
+ 
++	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_BRADDR);
++	mmwrite(1, MANTIS_GPIF_BRBYTES);
++
++	udelay(20);
++
+ 	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0083-V4L-DVB-13781-Mantis-CA-Bug-Fix-wrong-usage-of-HIFRD.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0083-V4L-DVB-13781-Mantis-CA-Bug-Fix-wrong-usage-of-HIFRD.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,99 @@
+From 708cce89d29f05833e37b720b2258cd397c18a0d Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:31:21 -0300
+Subject: [PATCH 083/120] V4L/DVB (13781): [Mantis CA] Bug: Fix wrong usage of HIFRDWRN
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b29f6ac248e49d8425aa91afb1b53d1f6d47ebe3)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |   24 +++++++++++-------------
+ 1 files changed, 11 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 323d1fb..3368253 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -53,7 +53,6 @@ static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
+ 	}
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Smart Buffer Operation complete");
+ 	ca->hif_event &= ~MANTIS_SBUF_OPDONE;
+-	udelay(5);
+ 	return rc;
+ }
+ 
+@@ -93,17 +92,16 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 	u32 hif_addr = 0, data, count = 4;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Read", mantis->num);
+-	hif_addr |=  MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
++	hif_addr |=  MANTIS_HIF_STATUS;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_BRADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_BRADDR);
+ 	mmwrite(count, MANTIS_GPIF_BRBYTES);
+-
+ 	udelay(20);
++	mmwrite(hif_addr | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
+ 
+-	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
+ 		return -EREMOTEIO;
+@@ -123,10 +121,11 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
+-	hif_addr |= addr;
++	hif_addr |=  MANTIS_HIF_STATUS;
++	hif_addr |=  addr;
+ 
+ 	mmwrite(slot->slave_cfg, MANTIS_GPIF_CFGSLA); /* Slot0 alone for now */
+-	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+ 	if (mantis_hif_write_wait(ca) != 0) {
+@@ -145,16 +144,14 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Read", mantis->num);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+-	hif_addr |=  MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
++	hif_addr |=  MANTIS_HIF_STATUS;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_BRADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_BRADDR);
+ 	mmwrite(1, MANTIS_GPIF_BRBYTES);
+-
+ 	udelay(20);
+-
+-	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
++	mmwrite(hif_addr | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+@@ -176,9 +173,10 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
++	hif_addr |=  MANTIS_HIF_STATUS;
+ 	hif_addr |=  addr;
+ 
+-	mmwrite(hif_addr | MANTIS_HIF_STATUS, MANTIS_GPIF_ADDR);
++	mmwrite(hif_addr, MANTIS_GPIF_ADDR);
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+ 	if (mantis_hif_write_wait(ca) != 0) {
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0084-V4L-DVB-13782-Mantis-Temporarily-disable-FRDA-irq.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0084-V4L-DVB-13782-Mantis-Temporarily-disable-FRDA-irq.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From 69ffe7b35779fd6b84735ae4011e314cc649734f Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:31:45 -0300
+Subject: [PATCH 084/120] V4L/DVB (13782): [Mantis] Temporarily disable FRDA irq
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit e26c2b46201e5ae38111391c293cec08870b7f6d)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c |    5 +----
+ 1 files changed, 1 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index b79a892..177b048 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -143,10 +143,7 @@ int mantis_ca_init(struct mantis_pci *mantis)
+ 
+ 	ca->ca_priv = mantis;
+ 	mantis->mantis_ca = ca;
+-	ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE	|
+-		   DVB_CA_EN50221_FLAG_IRQ_FR		|
+-		   DVB_CA_EN50221_FLAG_IRQ_DA;
+-
++	ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE;
+ 	/* register CA interface */
+ 	ca->en50221.owner		= THIS_MODULE;
+ 	ca->en50221.read_attribute_mem	= mantis_ca_read_attr_mem;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0085-V4L-DVB-13783-Mantis-Technisat-Cablestar-HD2-Add-sup.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0085-V4L-DVB-13783-Mantis-Technisat-Cablestar-HD2-Add-sup.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,59 @@
+From 1afd0c9e1ec56c4692e6d74c449009774edc61c7 Mon Sep 17 00:00:00 2001
+From: Marko Viitamaki <mau2 at suomi24.fi>
+Date: Fri, 4 Dec 2009 05:32:30 -0300
+Subject: [PATCH 085/120] V4L/DVB (13783): [Mantis/Technisat Cablestar HD2] Add support for the Technisat Cablestar HD2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Marko Viitamaki <mau2 at suomi24.fi>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit f5701b67767c6b81a035c9e2b539025f91d1e84d)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_core.c   |    1 +
+ drivers/media/dvb/mantis/mantis_dvb.c    |    1 +
+ drivers/media/dvb/mantis/mantis_vp2040.h |    1 +
+ 3 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 3fd3b08..c3d0d53 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -121,6 +121,7 @@ static void mantis_load_config(struct mantis_pci *mantis)
+ 		break;
+ 	case MANTIS_VP_2040_DVB_C:	// VP-2040
+ 	case TERRATEC_CINERGY_C_PCI:	// VP-2040 clone
++	case TECHNISAT_CABLESTAR_HD2:
+ 		mantis->hwconfig = &vp2040_mantis_config;
+ 		break;
+ 	case MANTIS_VP_3030_DVB_T:	// VP-3030
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 3940aed..c3a35be 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -275,6 +275,7 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 		break;
+ 	case MANTIS_VP_2040_DVB_C:	// VP-2040
+ 	case TERRATEC_CINERGY_C_PCI:
++	case TECHNISAT_CABLESTAR_HD2:
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+ 		mantis->fe = tda10023_attach(&tda10023_cu1216_config, &mantis->adapter, read_pwm(mantis));
+ 		if (mantis->fe) {
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.h b/drivers/media/dvb/mantis/mantis_vp2040.h
+index 69463cc..645dade 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.h
++++ b/drivers/media/dvb/mantis/mantis_vp2040.h
+@@ -27,6 +27,7 @@
+ 
+ #define MANTIS_VP_2040_DVB_C	0x0043
+ #define TERRATEC_CINERGY_C_PCI	0x1178
++#define TECHNISAT_CABLESTAR_HD2	0x0002
+ 
+ extern struct tda1002x_config tda10023_cu1216_config;
+ extern struct mantis_hwconfig vp2040_mantis_config;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0086-V4L-DVB-13784-Mantis-Use-PCI-API-instead-of-hardcode.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0086-V4L-DVB-13784-Mantis-Use-PCI-API-instead-of-hardcode.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From 1aba53af9711a20d7ec3ac40652b49a0da5bece9 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:32:51 -0300
+Subject: [PATCH 086/120] V4L/DVB (13784): [Mantis] Use PCI API instead of hardcoded length
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit ff63ac56705539e162d2f020a0c2a607eae37d7b)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pci.c |    5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index a068ffb..d3a62b1 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -169,7 +169,10 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+ 		goto err0;
+ 	}
+ 
+-	if ((mantis->mantis_mmio = ioremap(mantis->mantis_addr, 0x1000)) == NULL) {
++	mantis->mantis_mmio = ioremap(pci_resource_start(pdev, 0),
++				      pci_resource_len(pdev, 0));
++
++	if (!mantis->mantis_mmio) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "IO remap failed");
+ 		ret = -ENODEV;
+ 		goto err1;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0087-V4L-DVB-13785-Mantis-Do-not-disable-IRQ-s-while-bein.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0087-V4L-DVB-13785-Mantis-Do-not-disable-IRQ-s-while-bein.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,38 @@
+From 4ac6de6b8db05b596deaec2273e359f4cdef1a34 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:33:10 -0300
+Subject: [PATCH 087/120] V4L/DVB (13785): [Mantis] Do not disable IRQ's while being invoked
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 13d5036ea0636e6204e1b17bd12ea25061a686be)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pci.c |    7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index d3a62b1..94abcee 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -181,8 +181,11 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+ 	// Clear and disable all interrupts at startup
+ 	// to avoid lockup situations
+ 	mmwrite(0x00, MANTIS_INT_MASK);
+-	if (request_irq(pdev->irq, mantis_pci_irq, IRQF_SHARED | IRQF_DISABLED,
+-						DRIVER_NAME, mantis) < 0) {
++	if (request_irq(pdev->irq,
++			mantis_pci_irq,
++			IRQF_SHARED,
++			DRIVER_NAME,
++			mantis) < 0) {
+ 
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis IRQ reg failed");
+ 		ret = -ENODEV;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0088-V4L-DVB-13786-Mantis-Bug-HIF-bits-already-shifted.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0088-V4L-DVB-13786-Mantis-Bug-HIF-bits-already-shifted.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,33 @@
+From 14fef7b5eac3d398487efe43a4b939df5e8fcf72 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:33:31 -0300
+Subject: [PATCH 088/120] V4L/DVB (13786): [Mantis] Bug: HIF bits already shifted ..
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 263645de70175d8b5a5e392a1856e99e2e1b7209)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_common.h |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 27ecfdb..6b9f92b 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -144,7 +144,7 @@ struct mantis_pci {
+ 	struct mantis_ca	*mantis_ca;
+ };
+ 
+-#define MANTIS_HIF_STATUS	(mantis->gpio_status << 12)
++#define MANTIS_HIF_STATUS	(mantis->gpio_status)
+ 
+ extern unsigned int verbose;
+ extern unsigned int devs;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0089-V4L-DVB-13787-Mantis-Fix-build.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0089-V4L-DVB-13787-Mantis-Fix-build.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,85 @@
+From a9c5af3e2ab2bd90a3beae38d26f6be86b2d6bdd Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:33:56 -0300
+Subject: [PATCH 089/120] V4L/DVB (13787): [Mantis] Fix build
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 616f75e1979f5bd1f3241581c720349c2c31f6e7)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dvb.c    |    5 ++++-
+ drivers/media/dvb/mantis/mantis_vp1033.c |    2 +-
+ drivers/media/dvb/mantis/mantis_vp2040.c |    2 +-
+ drivers/media/dvb/mantis/mantis_vp2040.h |    2 +-
+ 4 files changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index c3a35be..5172e85 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -32,6 +32,8 @@
+ #include "mantis_vp2040.h"
+ #include "mantis_vp3030.h"
+ 
++DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
++
+ /*	Tuner power supply control	*/
+ void mantis_fe_powerup(struct mantis_pci *mantis)
+ {
+@@ -128,7 +130,8 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_register_adapter");
+ 	if (dvb_register_adapter(&mantis->dvb_adapter,
+ 				 "Mantis dvb adapter", THIS_MODULE,
+-				 &mantis->pdev->dev) < 0) {
++				 &mantis->pdev->dev,
++				 adapter_nr) < 0) {
+ 
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Error registering adapter");
+ 		return -ENODEV;
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index daf02c1..797c4e0 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -74,7 +74,7 @@ struct stv0299_config lgtdqcs001f_config = {
+ 	.invert			= 1,
+ //	.enhanced_tuning = 0,
+ 	.skip_reinit		= 0,
+-	.lock_output		= STV0229_LOCKOUTPUT_0,
++//	.lock_output		= STV0229_LOCKOUTPUT_0,
+ 	.volt13_op0_op1		= STV0299_VOLT13_OP0,
+ 	.min_delay_ms		= 100,
+ 	.set_symbol_rate	= lgtdqcs001f_set_symbol_rate,
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
+index 07da738..f77be7b 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.c
++++ b/drivers/media/dvb/mantis/mantis_vp2040.c
+@@ -30,7 +30,7 @@ struct mantis_hwconfig vp2040_mantis_config = {
+ 	.ts_size	= MANTIS_TS_204,
+ };
+ 
+-struct tda1002x_config tda10023_cu1216_config = {
++struct tda10023_config tda10023_cu1216_config = {
+ 	.demod_address = 0x18 >> 1,
+ 	.invert = 1,
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.h b/drivers/media/dvb/mantis/mantis_vp2040.h
+index 645dade..c745754 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.h
++++ b/drivers/media/dvb/mantis/mantis_vp2040.h
+@@ -29,7 +29,7 @@
+ #define TERRATEC_CINERGY_C_PCI	0x1178
+ #define TECHNISAT_CABLESTAR_HD2	0x0002
+ 
+-extern struct tda1002x_config tda10023_cu1216_config;
++extern struct tda10023_config tda10023_cu1216_config;
+ extern struct mantis_hwconfig vp2040_mantis_config;
+ 
+ #endif //__MANTIS_VP2040_H
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0090-V4L-DVB-13788-Mantis-CA-use-a-lock-for-the-relevant-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0090-V4L-DVB-13788-Mantis-CA-use-a-lock-for-the-relevant-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,153 @@
+From 4107aa8cfe04d3f56fbcfd38480286a8a1327c32 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:34:19 -0300
+Subject: [PATCH 090/120] V4L/DVB (13788): [Mantis CA] use a lock for the relevant CI Read/Write operations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit f684336bba673b6656cb98144130ab52dafc3240)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c  |   16 ++++++++++++++++
+ drivers/media/dvb/mantis/mantis_link.h |    2 ++
+ 2 files changed, 18 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 3368253..b1e1aa0 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -92,6 +92,7 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 	u32 hif_addr = 0, data, count = 4;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Read", mantis->num);
++	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  MANTIS_HIF_STATUS;
+@@ -104,9 +105,11 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
++		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+ 	data = mmread(MANTIS_GPIF_DIN);
++	mutex_unlock(&ca->ca_lock);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mem Read: 0x%02x", data);
+ 	return (data >> 24) & 0xff;
+ }
+@@ -118,6 +121,7 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	u32 hif_addr = 0;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Write", mantis->num);
++	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
+@@ -130,9 +134,11 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 
+ 	if (mantis_hif_write_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Mem Write: (0x%02x to 0x%02x)", data, addr);
++	mutex_unlock(&ca->ca_lock);
+ 
+ 	return 0;
+ }
+@@ -143,6 +149,7 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	u32 data, hif_addr = 0;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Read", mantis->num);
++	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+ 	hif_addr |=  MANTIS_HIF_STATUS;
+@@ -155,11 +162,13 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+ 	data = mmread(MANTIS_GPIF_DIN);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Read: 0x%02x", data);
+ 	udelay(50);
++	mutex_unlock(&ca->ca_lock);
+ 
+ 	return (u8) data;
+ }
+@@ -170,6 +179,7 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	u32 hif_addr = 0;
+ 
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Write", mantis->num);
++	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+@@ -181,9 +191,11 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 
+ 	if (mantis_hif_write_wait(ca) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Write: (0x%02x to 0x%02x)", data, addr);
++	mutex_unlock(&ca->ca_lock);
+ 	udelay(50);
+ 
+ 	return 0;
+@@ -201,6 +213,7 @@ int mantis_hif_init(struct mantis_ca *ca)
+ 	init_waitqueue_head(&ca->hif_opdone_wq);
+ 	init_waitqueue_head(&ca->hif_write_wq);
+ 
++	mutex_lock(&ca->ca_lock);
+ 	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
+ 	irqcfg = MANTIS_MASK_BRRDY	|
+ 		 MANTIS_MASK_WRACK	|
+@@ -210,6 +223,7 @@ int mantis_hif_init(struct mantis_ca *ca)
+ 		 MANTIS_MASK_OVFLW;
+ 
+ 	mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
++	mutex_unlock(&ca->ca_lock);
+ 
+ 	return 0;
+ }
+@@ -220,7 +234,9 @@ void mantis_hif_exit(struct mantis_ca *ca)
+ 	u32 irqcfg;
+ 
+ 	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Exiting Mantis Host Interface", mantis->num);
++	mutex_lock(&ca->ca_lock);
+ 	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
+ 	irqcfg &= ~MANTIS_MASK_BRRDY;
+ 	mmwrite(irqcfg, MANTIS_GPIF_IRQCFG);
++	mutex_unlock(&ca->ca_lock);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index 599ff1b..f9aaaa5 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -21,6 +21,7 @@
+ #ifndef __MANTIS_LINK_H
+ #define __MANTIS_LINK_H
+ 
++#include <linux/mutex.h>
+ #include <linux/workqueue.h>
+ #include "dvb_ca_en50221.h"
+ 
+@@ -61,6 +62,7 @@ struct mantis_ca {
+ 	void				*ca_priv;
+ 
+ 	struct dvb_ca_en50221		en50221;
++	struct mutex			ca_lock;
+ };
+ 
+ /* CA */
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0091-V4L-DVB-13789-Mantis-CA-Initialize-the-mutex.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0091-V4L-DVB-13789-Mantis-CA-Initialize-the-mutex.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,33 @@
+From 4e784e4246afe710385c324556011f844546fa72 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:34:44 -0300
+Subject: [PATCH 091/120] V4L/DVB (13789): [Mantis CA] Initialize the mutex
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 99b55b2c4478e6370aaa85173f5090a070c50a08)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 177b048..53c01b3 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -156,6 +156,8 @@ int mantis_ca_init(struct mantis_pci *mantis)
+ 	ca->en50221.poll_slot_status	= mantis_slot_status;
+ 	ca->en50221.data		= ca;
+ 
++	mutex_init(&ca->ca_lock);
++
+ 	dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
+ 	if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0092-V4L-DVB-13790-Mantis-Relocate-queue-initialization.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0092-V4L-DVB-13790-Mantis-Relocate-queue-initialization.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,50 @@
+From 5de34a19be663f0499a7c5e2246cb8d55122a983 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:35:07 -0300
+Subject: [PATCH 092/120] V4L/DVB (13790): [Mantis] Relocate queue initialization
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 42f541bfd1a9bad84a288d59a98fdb284df61a45)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ca.c  |    4 ++++
+ drivers/media/dvb/mantis/mantis_hif.c |    3 ---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 53c01b3..7aa27e0 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -158,6 +158,10 @@ int mantis_ca_init(struct mantis_pci *mantis)
+ 
+ 	mutex_init(&ca->ca_lock);
+ 
++	init_waitqueue_head(&ca->hif_data_wq);
++	init_waitqueue_head(&ca->hif_opdone_wq);
++	init_waitqueue_head(&ca->hif_write_wq);
++
+ 	dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
+ 	if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index b1e1aa0..99a9724 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -209,9 +209,6 @@ int mantis_hif_init(struct mantis_ca *ca)
+ 
+ 	slot[0].slave_cfg = 0x70773028;
+ 	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Initializing Mantis Host Interface", mantis->num);
+-	init_waitqueue_head(&ca->hif_data_wq);
+-	init_waitqueue_head(&ca->hif_opdone_wq);
+-	init_waitqueue_head(&ca->hif_write_wq);
+ 
+ 	mutex_lock(&ca->ca_lock);
+ 	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0093-V4L-DVB-13792-Mantis-VP-2033-Do-not-claim-TDA10023.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0093-V4L-DVB-13792-Mantis-VP-2033-Do-not-claim-TDA10023.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,76 @@
+From 06342162d084a1660160e453a6a8a62440364f83 Mon Sep 17 00:00:00 2001
+From: Niklas Edmundsson <nikke at acc.umu.se>
+Date: Fri, 4 Dec 2009 05:38:52 -0300
+Subject: [PATCH 093/120] V4L/DVB (13792): [Mantis/VP-2033] Do not claim TDA10023
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Do not rely on the PCI ID alone
+
+Signed-off-by: Niklas Edmundsson <nikke at acc.umu.se>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit ec1b6ff1cce9d406a9a5f84a1d1205328f2c515a)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dvb.c |   33 +++++++++++++++++----------------
+ 1 files changed, 17 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 5172e85..de18bb9 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -263,31 +263,32 @@ int __devinit mantis_frontend_init(struct mantis_pci *mantis)
+ 		}
+ 		break;
+ 	case MANTIS_VP_2033_DVB_C:	// VP-2033
++	case MANTIS_VP_2040_DVB_C:	// VP-2040
++	case TERRATEC_CINERGY_C_PCI:
++	case TECHNISAT_CABLESTAR_HD2:
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+-		mantis->fe = tda10021_attach(&philips_cu1216_config, &mantis->adapter, read_pwm(mantis));
++		mantis->fe = tda10021_attach(&philips_cu1216_config,
++					     &mantis->adapter,
++					     read_pwm(mantis));
++
+ 		if (mantis->fe) {
+-			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
+ 			dprintk(verbose, MANTIS_ERROR, 1,
+ 				"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
+ 				philips_cu1216_config.demod_address);
+-
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"Mantis DVB-C Philips CU1216 frontend attach success");
+-
++		} else {
++			mantis->fe = tda10023_attach(&tda10023_cu1216_config,
++						     &mantis->adapter,
++						     read_pwm(mantis));
++
++			if (mantis->fe) {
++				dprintk(verbose, MANTIS_ERROR, 1,
++					"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++					philips_cu1216_config.demod_address);
++			}
+ 		}
+-		break;
+-	case MANTIS_VP_2040_DVB_C:	// VP-2040
+-	case TERRATEC_CINERGY_C_PCI:
+-	case TECHNISAT_CABLESTAR_HD2:
+-		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+-		mantis->fe = tda10023_attach(&tda10023_cu1216_config, &mantis->adapter, read_pwm(mantis));
+ 		if (mantis->fe) {
+ 			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
+ 			dprintk(verbose, MANTIS_ERROR, 1,
+-				"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
+-				philips_cu1216_config.demod_address);
+-
+-			dprintk(verbose, MANTIS_ERROR, 1,
+ 				"Mantis DVB-C Philips CU1216 frontend attach success");
+ 		}
+ 		break;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0094-V4L-DVB-13794-Mantis-VP-3028-Initial-go-at-Serial-in.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0094-V4L-DVB-13794-Mantis-VP-3028-Initial-go-at-Serial-in.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,478 @@
+From 3b3b57c4823e90f07e6fb6cf4df7e7c670aafdbc Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:39:57 -0300
+Subject: [PATCH 094/120] V4L/DVB (13794): [Mantis/VP-3028] Initial go at Serial interface implementation, add support for VP-3028
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit add206368462434ba97e8fe4de98e5d47ffdb0a0)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile        |    2 +
+ drivers/media/dvb/mantis/mantis_common.h |   10 ++
+ drivers/media/dvb/mantis/mantis_core.c   |    8 ++
+ drivers/media/dvb/mantis/mantis_pci.c    |    2 +
+ drivers/media/dvb/mantis/mantis_uart.c   |  139 ++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_uart.h   |   25 +++++-
+ drivers/media/dvb/mantis/mantis_vp1033.c |    3 +
+ drivers/media/dvb/mantis/mantis_vp1034.c |    3 +
+ drivers/media/dvb/mantis/mantis_vp1041.c |    3 +
+ drivers/media/dvb/mantis/mantis_vp2033.c |    3 +
+ drivers/media/dvb/mantis/mantis_vp2040.c |    3 +
+ drivers/media/dvb/mantis/mantis_vp3028.c |   38 ++++++++
+ drivers/media/dvb/mantis/mantis_vp3028.h |   13 +++
+ drivers/media/dvb/mantis/mantis_vp3030.c |    3 +
+ 14 files changed, 253 insertions(+), 2 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_uart.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp3028.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_vp3028.h
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index d002ef9..bb88cdc 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -1,4 +1,5 @@
+ mantis-objs = 	mantis_core.o	\
++		mantis_uart.o	\
+ 		mantis_dma.o	\
+ 		mantis_pci.o	\
+ 		mantis_i2c.o	\
+@@ -12,6 +13,7 @@ mantis-objs = 	mantis_core.o	\
+ 		mantis_vp1041.o	\
+ 		mantis_vp2033.o	\
+ 		mantis_vp2040.o	\
++		mantis_vp3028.o	\
+ 		mantis_vp3030.o
+ 
+ obj-$(CONFIG_DVB_MANTIS) += mantis.o
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 6b9f92b..6a02adf 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -26,6 +26,7 @@
+ #include <linux/kernel.h>
+ #include <linux/pci.h>
+ #include <linux/mutex.h>
++#include <linux/workqueue.h>
+ 
+ #include "dvbdev.h"
+ #include "dvb_demux.h"
+@@ -34,6 +35,7 @@
+ #include "dvb_net.h"
+ #include <linux/i2c.h>
+ #include "mantis_reg.h"
++#include "mantis_uart.h"
+ 
+ #include "mantis_link.h"
+ 
+@@ -74,6 +76,10 @@ struct mantis_hwconfig {
+ 	char			*model_name;
+ 	char			*dev_type;
+ 	u32			ts_size;
++
++	enum mantis_baud	baud_rate;
++	enum mantis_parity	parity;
++	u32			bytes;
+ };
+ 
+ struct mantis_pci {
+@@ -142,6 +148,10 @@ struct mantis_pci {
+ 	u32			gpif_status;
+ 
+ 	struct mantis_ca	*mantis_ca;
++
++	wait_queue_head_t	uart_wq;
++	struct work_struct	uart_work;
++	spinlock_t		uart_lock;
+ };
+ 
+ #define MANTIS_HIF_STATUS	(mantis->gpio_status)
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index c3d0d53..52b3e9e 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -165,6 +165,10 @@ int mantis_core_init(struct mantis_pci *mantis)
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB init failed");
+ 		return err;
+ 	}
++	if ((err = mantis_uart_init(mantis)) < 0) {
++		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis UART init failed");
++		return err;
++	}
+ 
+ 	return 0;
+ }
+@@ -173,6 +177,10 @@ int mantis_core_exit(struct mantis_pci *mantis)
+ {
+ 	mantis_dma_stop(mantis);
+ 	dprintk(verbose, MANTIS_ERROR, 1, "DMA engine stopping");
++
++	mantis_uart_exit(mantis);
++	dprintk(verbose, MANTIS_ERROR, 1, "UART exit failed");
++
+ 	if (mantis_dma_exit(mantis) < 0)
+ 		dprintk(verbose, MANTIS_ERROR, 1, "DMA exit failed");
+ 	if (mantis_dvb_exit(mantis) < 0)
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 94abcee..d1eac40 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -27,6 +27,7 @@
+ #include <linux/device.h>
+ #include "mantis_common.h"
+ #include "mantis_core.h"
++#include "mantis_uart.h"
+ 
+ #include <asm/irq.h>
+ #include <linux/signal.h>
+@@ -94,6 +95,7 @@ static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+ 	}
+ 	if (stat & MANTIS_INT_IRQ1) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
++		schedule_work(&mantis->uart_work);
+ 	}
+ 	if (stat & MANTIS_INT_OCERR) {
+ 		dprintk(verbose, MANTIS_DEBUG, 0, "* INT OCERR *");
+diff --git a/drivers/media/dvb/mantis/mantis_uart.c b/drivers/media/dvb/mantis/mantis_uart.c
+new file mode 100644
+index 0000000..786fcc3
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_uart.c
+@@ -0,0 +1,139 @@
++#include <linux/spinlock.h>
++#include "mantis_common.h"
++
++struct mantis_uart_params {
++	enum mantis_baud	baud_rate;
++	enum mantis_parity	parity;
++};
++
++#define UART_MAX_BUF			16
++
++int mantis_uart_read(struct mantis_pci *mantis, u8 *data)
++{
++	struct mantis_hwconfig *config = mantis->hwconfig;
++	u32 stat, i;
++	unsigned long flags;
++
++	/* get data */
++	for (i = 0; i < (config->bytes + 1); i++) {
++
++		if (stat & MANTIS_UART_RXFIFO_FULL) {
++			dprintk(verbose, MANTIS_ERROR, 1, "RX Fifo FULL");
++		}
++		data[i] = mmread(MANTIS_UART_RXD) & 0x3f;
++
++		stat = mmread(MANTIS_UART_STAT);
++
++		dprintk(verbose, MANTIS_DEBUG, 1, "Reading ... <%02x>", data[i] & 0x3f);
++
++		if (data[i] & (1 << 7)) {
++			dprintk(verbose, MANTIS_ERROR, 1, "UART framing error");
++			return -EINVAL;
++		}
++		if (data[i] & (1 << 6)) {
++			dprintk(verbose, MANTIS_ERROR, 1, "UART parity error");
++			return -EINVAL;
++		}
++	}
++
++	return 0;
++}
++
++static void mantis_uart_work(struct work_struct *work)
++{
++	struct mantis_pci *mantis = container_of(work, struct mantis_pci, uart_work);
++	struct mantis_hwconfig *config = mantis->hwconfig;
++	u8 buf[16];
++	int i;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "UART read");
++	mantis_uart_read(mantis, buf);
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "UART: ");
++	for (i = 0; i < (config->bytes + 1); i++)
++		dprintk(verbose, MANTIS_DEBUG, 0, "<%02x> ", buf[i]);
++
++	dprintk(verbose, MANTIS_DEBUG, 0, "\n");
++}
++
++static int mantis_uart_setup(struct mantis_pci *mantis,
++			     struct mantis_uart_params *params)
++{
++	char* rates[] = { "B_9600", "B_19200", "B_38400", "B_57600", "B_115200" };
++	char* parity[] = { "NONE", "ODD", "EVEN" };
++
++	u32 reg;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Set Parity <%s> Baud Rate <%s>",
++		parity[params->parity],
++		rates[params->baud_rate]);
++
++	mmwrite((mmread(MANTIS_UART_CTL) | (params->parity & 0x3)), MANTIS_UART_CTL);
++
++	reg = mmread(MANTIS_UART_BAUD);
++
++	switch (params->baud_rate) {
++	case MANTIS_BAUD_9600:
++		reg |= 0xd8;
++		break;
++	case MANTIS_BAUD_19200:
++		reg |= 0x6c;
++		break;
++	case MANTIS_BAUD_38400:
++		reg |= 0x36;
++		break;
++	case MANTIS_BAUD_57600:
++		reg |= 0x23;
++		break;
++	case MANTIS_BAUD_115200:
++		reg |= 0x11;
++		break;
++	default:
++		return -EINVAL;
++	}
++
++	mmwrite(reg, MANTIS_UART_BAUD);
++
++	return 0;
++}
++
++int mantis_uart_init(struct mantis_pci *mantis)
++{
++	struct mantis_hwconfig *config = mantis->hwconfig;
++	struct mantis_uart_params params;
++
++	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing UART ..");
++	/* default parity: */
++	params.baud_rate = config->baud_rate;
++	params.parity = config->parity;
++
++	init_waitqueue_head(&mantis->uart_wq);
++	spin_lock_init(&mantis->uart_lock);
++
++	INIT_WORK(&mantis->uart_work, mantis_uart_work);
++
++	/* disable interrupt */
++	mmwrite(mmread(MANTIS_UART_CTL) & 0xffef, MANTIS_UART_CTL);
++
++	mantis_uart_setup(mantis, &params);
++
++	/* default 1 byte */
++	mmwrite((mmread(MANTIS_UART_BAUD) | (config->bytes << 8)), MANTIS_UART_BAUD);
++
++	/* flush buffer */
++	mmwrite((mmread(MANTIS_UART_CTL) | MANTIS_UART_RXFLUSH), MANTIS_UART_CTL);
++
++	/* enable interrupt */
++	mmwrite(mmread(MANTIS_INT_MASK) | 0x800, MANTIS_INT_MASK);
++	mmwrite(mmread(MANTIS_UART_CTL) | MANTIS_UART_RXINT, MANTIS_UART_CTL);
++
++	schedule_work(&mantis->uart_work);
++
++	return 0;
++}
++
++void mantis_uart_exit(struct mantis_pci *mantis)
++{
++	/* disable interrupt */
++	mmwrite(mmread(MANTIS_UART_CTL) & 0xffef, MANTIS_UART_CTL);
++}
+diff --git a/drivers/media/dvb/mantis/mantis_uart.h b/drivers/media/dvb/mantis/mantis_uart.h
+index 6113863..e9f938d 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.h
++++ b/drivers/media/dvb/mantis/mantis_uart.h
+@@ -21,6 +21,21 @@
+ #ifndef __MANTIS_UART_H
+ #define __MANTIS_UART_H
+ 
++#define MANTIS_UART_CTL			0xe0
++#define MANTIS_UART_RXINT		(1 << 4)
++#define MANTIS_UART_RXFLUSH		(1 << 2)
++
++#define MANTIS_UART_RXD			0xe8
++#define MANTIS_UART_BAUD		0xec
++
++#define MANTIS_UART_STAT		0xf0
++#define MANTIS_UART_RXFIFO_DATA		(1 << 7)
++#define MANTIS_UART_RXFIFO_EMPTY	(1 << 6)
++#define MANTIS_UART_RXFIFO_FULL		(1 << 3)
++#define MANTIS_UART_FRAME_ERR		(1 << 2)
++#define MANTIS_UART_PARITY_ERR		(1 << 1)
++#define MANTIS_UART_RXTHRESH_INT	(1 << 0)
++
+ enum mantis_baud {
+ 	MANTIS_BAUD_9600	= 0,
+ 	MANTIS_BAUD_19200,
+@@ -30,9 +45,15 @@ enum mantis_baud {
+ };
+ 
+ enum mantis_parity {
+-	MANTIS_PARITY_NONE	= 0,
++	MANTIS_PARITY_UNDEFINED	= 0,
+ 	MANTIS_PARITY_EVEN,
+-	MANTIS_PARITY_ODD
++	MANTIS_PARITY_ODD,
++	MANTIS_PARITY_NONE
+ };
+ 
++struct mantis_pci;
++
++extern int mantis_uart_init(struct mantis_pci *mantis);
++extern void mantis_uart_exit(struct mantis_pci *mantis);
++
+ #endif // __MANTIS_UART_H
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index 797c4e0..64cdfb8 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -88,6 +88,9 @@ struct mantis_hwconfig vp1033_mantis_config = {
+ 	.model_name		= MANTIS_MODEL_NAME,
+ 	.dev_type		= MANTIS_DEV_TYPE,
+ 	.ts_size		= MANTIS_TS_204,
++	.baud_rate		= MANTIS_BAUD_9600,
++	.parity			= MANTIS_PARITY_NONE,
++	.bytes			= 0,
+ };
+ 
+ int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index a2fe9d4..28f3420 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -33,6 +33,9 @@ struct mantis_hwconfig vp1034_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
+ 	.ts_size	= MANTIS_TS_204,
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
+ };
+ 
+ int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index 8eb1afd..90df80b 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -31,6 +31,9 @@ struct mantis_hwconfig vp1041_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
+ 	.ts_size	= MANTIS_TS_188,
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
+ };
+ 
+ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index 4664d29..1171e69 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -28,6 +28,9 @@ struct mantis_hwconfig vp2033_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
+ 	.ts_size	= MANTIS_TS_204,
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
+ };
+ 
+ struct tda1002x_config philips_cu1216_config = {
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
+index f77be7b..ce73d6b 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.c
++++ b/drivers/media/dvb/mantis/mantis_vp2040.c
+@@ -28,6 +28,9 @@ struct mantis_hwconfig vp2040_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
+ 	.ts_size	= MANTIS_TS_204,
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
+ };
+ 
+ struct tda10023_config tda10023_cu1216_config = {
+diff --git a/drivers/media/dvb/mantis/mantis_vp3028.c b/drivers/media/dvb/mantis/mantis_vp3028.c
+new file mode 100644
+index 0000000..7f8918c
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp3028.c
+@@ -0,0 +1,38 @@
++/*
++	Mantis VP-3028 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include "mantis_common.h"
++#include "mantis_vp3028.h"
++
++struct zl10353_config mantis_vp3028_config = {
++	.demod_address	= 0x0f,
++};
++
++#define MANTIS_MODEL_NAME	"VP-3028"
++#define MANTIS_DEV_TYPE		"DVB-T"
++
++struct mantis_hwconfig vp3028_mantis_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_188,
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp3028.h b/drivers/media/dvb/mantis/mantis_vp3028.h
+new file mode 100644
+index 0000000..c51628d
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_vp3028.h
+@@ -0,0 +1,13 @@
++#ifndef __MANTIS_VP3028_H
++#define __MANTIS_VP3028_H
++
++#include "dvb_frontend.h"
++#include "mantis_common.h"
++#include "zl10353.h"
++
++#define MANTIS_VP_3028_DVB_T	0x0028
++
++extern struct zl10353_config mantis_vp3028_config;
++extern struct mantis_hwconfig vp3028_mantis_config;
++
++#endif /* __MANTIS_VP3028_H */
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index cab092c..9ca8040 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -32,6 +32,9 @@ struct mantis_hwconfig vp3030_mantis_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
+ 	.ts_size	= MANTIS_TS_188,
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
+ };
+ 
+ int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0095-V4L-DVB-13795-Mantis-Hopper-Code-overhaul-add-Hopper.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0095-V4L-DVB-13795-Mantis-Hopper-Code-overhaul-add-Hopper.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,3999 @@
+From b58bb2ada8e7d16c2929fe05f40511269b0c9656 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:41:11 -0300
+Subject: [PATCH 095/120] V4L/DVB (13795): [Mantis/Hopper] Code overhaul, add Hopper devices into the PCI ID list
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit b3b961448f702339444036f94252ff2ba7a99feb)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Kconfig         |   22 ++-
+ drivers/media/dvb/mantis/Makefile        |   42 ++--
+ drivers/media/dvb/mantis/hopper_cards.c  |  260 +++++++++++++++++++++
+ drivers/media/dvb/mantis/hopper_vp3028.c |   76 ++++++
+ drivers/media/dvb/mantis/hopper_vp3028.h |   10 +
+ drivers/media/dvb/mantis/mantis_ca.c     |   69 ++++--
+ drivers/media/dvb/mantis/mantis_ca.h     |    7 +
+ drivers/media/dvb/mantis/mantis_cards.c  |  279 +++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_common.h |   68 +++---
+ drivers/media/dvb/mantis/mantis_dma.c    |   55 +++--
+ drivers/media/dvb/mantis/mantis_dma.h    |   10 +
+ drivers/media/dvb/mantis/mantis_dvb.c    |  364 +++++++++++++-----------------
+ drivers/media/dvb/mantis/mantis_dvb.h    |   15 ++
+ drivers/media/dvb/mantis/mantis_evm.c    |   38 ++-
+ drivers/media/dvb/mantis/mantis_hif.c    |   60 ++++--
+ drivers/media/dvb/mantis/mantis_hif.h    |    2 +-
+ drivers/media/dvb/mantis/mantis_i2c.c    |   75 ++++---
+ drivers/media/dvb/mantis/mantis_i2c.h    |    7 +
+ drivers/media/dvb/mantis/mantis_ioc.c    |  145 ++++++++++++
+ drivers/media/dvb/mantis/mantis_link.h   |    3 +-
+ drivers/media/dvb/mantis/mantis_pci.c    |  310 ++++++++-----------------
+ drivers/media/dvb/mantis/mantis_pci.h    |    7 +
+ drivers/media/dvb/mantis/mantis_pcmcia.c |   22 ++-
+ drivers/media/dvb/mantis/mantis_reg.h    |   40 +++-
+ drivers/media/dvb/mantis/mantis_uart.c   |   37 +++-
+ drivers/media/dvb/mantis/mantis_uart.h   |    2 +-
+ drivers/media/dvb/mantis/mantis_vp1033.c |   98 ++++++---
+ drivers/media/dvb/mantis/mantis_vp1033.h |   13 +-
+ drivers/media/dvb/mantis/mantis_vp1034.c |   66 +++++--
+ drivers/media/dvb/mantis/mantis_vp1034.h |    6 +-
+ drivers/media/dvb/mantis/mantis_vp1041.c |   79 ++++++-
+ drivers/media/dvb/mantis/mantis_vp1041.h |   14 +-
+ drivers/media/dvb/mantis/mantis_vp2033.c |   95 +++++++--
+ drivers/media/dvb/mantis/mantis_vp2033.h |   11 +-
+ drivers/media/dvb/mantis/mantis_vp2040.c |  141 +++++++++++-
+ drivers/media/dvb/mantis/mantis_vp2040.h |   11 +-
+ drivers/media/dvb/mantis/mantis_vp3030.c |   49 ++++-
+ drivers/media/dvb/mantis/mantis_vp3030.h |    8 +-
+ 38 files changed, 1881 insertions(+), 735 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/hopper_cards.c
+ create mode 100644 drivers/media/dvb/mantis/hopper_vp3028.c
+ create mode 100644 drivers/media/dvb/mantis/hopper_vp3028.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_ca.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_cards.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_dma.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_dvb.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_i2c.h
+ create mode 100644 drivers/media/dvb/mantis/mantis_ioc.c
+ create mode 100644 drivers/media/dvb/mantis/mantis_pci.h
+
+diff --git a/drivers/media/dvb/mantis/Kconfig b/drivers/media/dvb/mantis/Kconfig
+index 4ba16d0..aaf0250 100644
+--- a/drivers/media/dvb/mantis/Kconfig
++++ b/drivers/media/dvb/mantis/Kconfig
+@@ -1,6 +1,15 @@
++config MANTIS_CORE
++	tristate "Mantis/Hopper PCI bridge based devices"
++	depends on PCI && I2C
++
++	help
++	  Support for PCI cards based on the Mantis and Hopper PCi bridge.
++
++	  Say Y if you own such a device and want to use it.
++
+ config DVB_MANTIS
+ 	tristate "MANTIS based cards"
+-	depends on DVB_CORE && PCI && I2C
++	depends on MANTIS_CORE && DVB_CORE && PCI && I2C
+ 	select DVB_MB86A16
+ 	select DVB_CU1216
+ 	select DVB_ZL10353
+@@ -11,3 +20,14 @@ config DVB_MANTIS
+ 	  Say Y when you have a Mantis based DVB card and want to use it.
+ 
+ 	  If unsure say N.
++
++config DVB_HOPPER
++	tristate "HOPPER based cards"
++	depends on MANTIS_CORE && DVB_CORE && PCI && I2C
++	select DVB_ZL10353
++	select DVB_PLL
++	help
++	  Support for PCI cards based on the Hopper  PCI bridge.
++	  Say Y when you have a Hopper based DVB card and want to use it.
++
++	  If unsure say N
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index bb88cdc..399c901 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -1,21 +1,27 @@
+-mantis-objs = 	mantis_core.o	\
+-		mantis_uart.o	\
+-		mantis_dma.o	\
+-		mantis_pci.o	\
+-		mantis_i2c.o	\
+-		mantis_dvb.o	\
+-		mantis_evm.o	\
+-		mantis_hif.o	\
+-		mantis_ca.o	\
+-		mantis_pcmcia.o	\
+-		mantis_vp1033.o	\
+-		mantis_vp1034.o	\
+-		mantis_vp1041.o	\
+-		mantis_vp2033.o	\
+-		mantis_vp2040.o	\
+-		mantis_vp3028.o	\
+-		mantis_vp3030.o
++mantis_core-objs :=	mantis_ioc.o	\
++			mantis_uart.o	\
++			mantis_dma.o	\
++			mantis_pci.o	\
++			mantis_i2c.o	\
++			mantis_dvb.o	\
++			mantis_evm.o	\
++			mantis_hif.o	\
++			mantis_ca.o	\
++			mantis_pcmcia.o
+ 
+-obj-$(CONFIG_DVB_MANTIS) += mantis.o
++mantis-objs	:=	mantis_cards.o	\
++			mantis_vp1033.o	\
++			mantis_vp1034.o	\
++			mantis_vp1041.o	\
++			mantis_vp2033.o	\
++			mantis_vp2040.o	\
++			mantis_vp3030.o
++
++hopper-objs	:=	hopper_cards.o	\
++			hopper_vp3028.o
++
++obj-$(CONFIG_MANTIS_CORE)	+= mantis_core.o
++obj-$(CONFIG_DVB_MANTIS)	+= mantis.o
++obj-$(CONFIG_DVB_HOPPER)	+= hopper.o
+ 
+ EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
+diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
+new file mode 100644
+index 0000000..749e3f3
+--- /dev/null
++++ b/drivers/media/dvb/mantis/hopper_cards.c
+@@ -0,0 +1,260 @@
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/pci.h>
++#include <asm/irq.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "mantis_common.h"
++#include "hopper_vp3028.h"
++#include "mantis_dma.h"
++#include "mantis_dvb.h"
++#include "mantis_uart.h"
++#include "mantis_ioc.h"
++#include "mantis_pci.h"
++#include "mantis_i2c.h"
++#include "mantis_reg.h"
++
++static unsigned int verbose;
++module_param(verbose, int, 0644);
++MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
++
++#define DRIVER_NAME	"Hopper"
++
++static char *label[10] = {
++	"DMA",
++	"IRQ-0",
++	"IRQ-1",
++	"OCERR",
++	"PABRT",
++	"RIPRR",
++	"PPERR",
++	"FTRGT",
++	"RISCI",
++	"RACK"
++};
++
++static int devs;
++
++static irqreturn_t hopper_irq_handler(int irq, void *dev_id)
++{
++	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
++	u32 rst_stat = 0, rst_mask = 0;
++
++	struct mantis_pci *mantis;
++	struct mantis_ca *ca;
++
++	mantis = (struct mantis_pci *) dev_id;
++	if (unlikely(mantis == NULL)) {
++		dprintk(MANTIS_ERROR, 1, "Mantis == NULL");
++		return IRQ_NONE;
++	}
++	ca = mantis->mantis_ca;
++
++	stat = mmread(MANTIS_INT_STAT);
++	mask = mmread(MANTIS_INT_MASK);
++	mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
++	if (!(stat & mask))
++		return IRQ_NONE;
++
++	rst_mask  = MANTIS_GPIF_WRACK  |
++		    MANTIS_GPIF_OTHERR |
++		    MANTIS_SBUF_WSTO   |
++		    MANTIS_GPIF_EXTIRQ;
++
++	rst_stat  = mmread(MANTIS_GPIF_STATUS);
++	rst_stat &= rst_mask;
++	mmwrite(rst_stat, MANTIS_GPIF_STATUS);
++
++	mantis->mantis_int_stat = stat;
++	mantis->mantis_int_mask = mask;
++	dprintk(MANTIS_DEBUG, 0, "\n-- Stat=<%02x> Mask=<%02x> --", stat, mask);
++	if (stat & MANTIS_INT_RISCEN) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[0]);
++	}
++	if (stat & MANTIS_INT_IRQ0) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[1]);
++		mantis->gpif_status = rst_stat;
++		wake_up(&ca->hif_write_wq);
++		schedule_work(&ca->hif_evm_work);
++	}
++	if (stat & MANTIS_INT_IRQ1) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[2]);
++		schedule_work(&mantis->uart_work);
++	}
++	if (stat & MANTIS_INT_OCERR) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[3]);
++	}
++	if (stat & MANTIS_INT_PABORT) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[4]);
++	}
++	if (stat & MANTIS_INT_RIPERR) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[5]);
++	}
++	if (stat & MANTIS_INT_PPERR) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[6]);
++	}
++	if (stat & MANTIS_INT_FTRGT) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[7]);
++	}
++	if (stat & MANTIS_INT_RISCI) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]);
++		mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
++		tasklet_schedule(&mantis->tasklet);
++	}
++	if (stat & MANTIS_INT_I2CDONE) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]);
++		wake_up(&mantis->i2c_wq);
++	}
++	mmwrite(stat, MANTIS_INT_STAT);
++	stat &= ~(MANTIS_INT_RISCEN   | MANTIS_INT_I2CDONE |
++		  MANTIS_INT_I2CRACK  | MANTIS_INT_PCMCIA7 |
++		  MANTIS_INT_PCMCIA6  | MANTIS_INT_PCMCIA5 |
++		  MANTIS_INT_PCMCIA4  | MANTIS_INT_PCMCIA3 |
++		  MANTIS_INT_PCMCIA2  | MANTIS_INT_PCMCIA1 |
++		  MANTIS_INT_PCMCIA0  | MANTIS_INT_IRQ1	   |
++		  MANTIS_INT_IRQ0     | MANTIS_INT_OCERR   |
++		  MANTIS_INT_PABORT   | MANTIS_INT_RIPERR  |
++		  MANTIS_INT_PPERR    | MANTIS_INT_FTRGT   |
++		  MANTIS_INT_RISCI);
++
++	if (stat)
++		dprintk(MANTIS_DEBUG, 0, "<Unknown> Stat=<%02x> Mask=<%02x>", stat, mask);
++
++	dprintk(MANTIS_DEBUG, 0, "\n");
++	return IRQ_HANDLED;
++}
++
++static int __devinit hopper_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
++{
++	struct mantis_pci *mantis;
++	struct mantis_hwconfig *config;
++	int err = 0;
++
++	mantis = kzalloc(sizeof (struct mantis_pci), GFP_KERNEL);
++	if (mantis == NULL) {
++		printk(KERN_ERR "%s ERROR: Out of memory\n", __func__);
++		err = -ENOMEM;
++		goto fail0;
++	}
++
++	mantis->num		= devs;
++	mantis->verbose		= verbose;
++	mantis->pdev		= pdev;
++	config			= (struct mantis_hwconfig *) pci_id->driver_data;
++	config->irq_handler	= &hopper_irq_handler;
++	mantis->hwconfig	= config;
++
++	err = mantis_pci_init(mantis);
++	if (err) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI initialization failed <%d>", err);
++		goto fail1;
++	}
++
++	err = mantis_stream_control(mantis, STREAM_TO_HIF);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis stream control failed <%d>", err);
++		goto fail1;
++	}
++
++	err = mantis_i2c_init(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C initialization failed <%d>", err);
++		goto fail2;
++	}
++
++	err = mantis_get_mac(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis MAC address read failed <%d>", err);
++		goto fail2;
++	}
++
++	err = mantis_dma_init(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA initialization failed <%d>", err);
++		goto fail3;
++	}
++
++	err = mantis_dvb_init(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB initialization failed <%d>", err);
++		goto fail4;
++	}
++	devs++;
++
++	return err;
++
++fail5:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB exit! <%d>", err);
++	mantis_dvb_exit(mantis);
++
++fail4:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA exit! <%d>", err);
++	mantis_dma_exit(mantis);
++
++fail3:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C exit! <%d>", err);
++	mantis_i2c_exit(mantis);
++
++fail2:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI exit! <%d>", err);
++	mantis_pci_exit(mantis);
++
++fail1:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis free! <%d>", err);
++	kfree(mantis);
++
++fail0:
++	return err;
++}
++
++static void __devexit hopper_pci_remove(struct pci_dev *pdev)
++{
++	struct mantis_pci *mantis = pci_get_drvdata(pdev);
++
++	if (mantis) {
++//		mantis_uart_exit(mantis);
++		mantis_dvb_exit(mantis);
++		mantis_dma_exit(mantis);
++		mantis_i2c_exit(mantis);
++		mantis_pci_exit(mantis);
++		kfree(mantis);
++	}
++	return;
++
++}
++
++static struct pci_device_id hopper_pci_table[] = {
++	MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_3028_DVB_T, &vp3028_config),
++	{ }
++};
++
++static struct pci_driver hopper_pci_driver = {
++	.name		= DRIVER_NAME,
++	.id_table	= hopper_pci_table,
++	.probe		= hopper_pci_probe,
++	.remove		= hopper_pci_remove,
++};
++
++static int __devinit hopper_init(void)
++{
++	return pci_register_driver(&hopper_pci_driver);
++}
++
++static void __devexit hopper_exit(void)
++{
++	return pci_unregister_driver(&hopper_pci_driver);
++}
++
++module_init(hopper_init);
++module_exit(hopper_exit);
++
++MODULE_DESCRIPTION("HOPPER driver");
++MODULE_AUTHOR("Manu Abraham");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/media/dvb/mantis/hopper_vp3028.c b/drivers/media/dvb/mantis/hopper_vp3028.c
+new file mode 100644
+index 0000000..ba0c7e5
+--- /dev/null
++++ b/drivers/media/dvb/mantis/hopper_vp3028.c
+@@ -0,0 +1,76 @@
++/*
++	Mantis VP-3028 driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "zl10353.h"
++#include "mantis_common.h"
++#include "mantis_ioc.h"
++#include "mantis_dvb.h"
++#include "hopper_vp3028.h"
++
++struct zl10353_config hopper_vp3028_config = {
++	.demod_address	= 0x0f,
++};
++
++#define MANTIS_MODEL_NAME	"VP-3028"
++#define MANTIS_DEV_TYPE		"DVB-T"
++
++static int vp3028_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
++{
++	struct i2c_adapter *adapter	= &mantis->adapter;
++	int err = 0;
++
++	err = mantis_frontend_power(mantis, POWER_ON);
++	mantis_frontend_soft_reset(mantis);
++
++	dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
++	fe = zl10353_attach(&hopper_vp3028_config, adapter);
++
++	if (!fe)
++		return -1;
++
++	dprintk(MANTIS_ERROR, 1, "Done!");
++
++	return 0;
++}
++
++struct mantis_hwconfig vp3028_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_188,
++
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
++
++	.frontend_init	= vp3028_frontend_init,
++	.power		= GPIF_A00,
++	.reset		= GPIF_A03,
++};
+diff --git a/drivers/media/dvb/mantis/hopper_vp3028.h b/drivers/media/dvb/mantis/hopper_vp3028.h
+new file mode 100644
+index 0000000..e8a3c22
+--- /dev/null
++++ b/drivers/media/dvb/mantis/hopper_vp3028.h
+@@ -0,0 +1,10 @@
++#ifndef __MANTIS_VP3028_H
++#define __MANTIS_VP3028_H
++
++#include "mantis_common.h"
++
++#define MANTIS_VP_3028_DVB_T	0x0028
++
++extern struct mantis_hwconfig vp3028_config;
++
++#endif /* __MANTIS_VP3028_H */
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 7aa27e0..4151cba 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -18,16 +18,30 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
+ #include "mantis_link.h"
+ #include "mantis_hif.h"
++#include "mantis_reg.h"
++
++#include "mantis_ca.h"
+ 
+ static int mantis_ca_read_attr_mem(struct dvb_ca_en50221 *en50221, int slot, int addr)
+ {
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Read", slot);
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Read", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -40,7 +54,7 @@ static int mantis_ca_write_attr_mem(struct dvb_ca_en50221 *en50221, int slot, in
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Write", slot);
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request Attribute Mem Write", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -53,7 +67,7 @@ static int mantis_ca_read_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8 a
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Read", slot);
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Read", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -66,7 +80,7 @@ static int mantis_ca_write_cam_ctl(struct dvb_ca_en50221 *en50221, int slot, u8
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Write", slot);
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): Request CAM control Write", slot);
+ 
+ 	if (slot != 0)
+ 		return -EINVAL;
+@@ -79,7 +93,7 @@ static int mantis_ca_slot_reset(struct dvb_ca_en50221 *en50221, int slot)
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot RESET", slot);
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): Slot RESET", slot);
+ 	udelay(500); /* Wait.. */
+ 	mmwrite(0xda, MANTIS_PCMCIA_RESET); /* Leading edge assert */
+ 	udelay(500);
+@@ -95,7 +109,7 @@ static int mantis_ca_slot_shutdown(struct dvb_ca_en50221 *en50221, int slot)
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Slot shutdown", slot);
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): Slot shutdown", slot);
+ 
+ 	return 0;
+ }
+@@ -105,8 +119,8 @@ static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
+-	mantis_set_direction(mantis, 1); /* Enable TS through CAM */
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
++//	mantis_set_direction(mantis, 1); /* Enable TS through CAM */
+ 
+ 	return 0;
+ }
+@@ -116,13 +130,13 @@ static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open
+ 	struct mantis_ca *ca = en50221->data;
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
++	dprintk(MANTIS_DEBUG, 1, "Slot(%d): Poll Slot status", slot);
+ 
+ 	if (ca->slot_state == MODULE_INSERTED) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "CA Module present and ready");
++		dprintk(MANTIS_DEBUG, 1, "CA Module present and ready");
+ 		return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
+ 	} else {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "CA Module not present or not ready");
++		dprintk(MANTIS_DEBUG, 1, "CA Module not present or not ready");
+ 	}
+ 
+ 	return 0;
+@@ -130,20 +144,21 @@ static int mantis_slot_status(struct dvb_ca_en50221 *en50221, int slot, int open
+ 
+ int mantis_ca_init(struct mantis_pci *mantis)
+ {
+-	struct dvb_adapter *dvb_adapter = &mantis->dvb_adapter;
++	struct dvb_adapter *dvb_adapter	= &mantis->dvb_adapter;
+ 	struct mantis_ca *ca;
+ 	int ca_flags = 0, result;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis CA");
+-	if (!(ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL))) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Out of memory!, exiting ..");
++	dprintk(MANTIS_DEBUG, 1, "Initializing Mantis CA");
++	ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL);
++	if (!ca) {
++		dprintk(MANTIS_ERROR, 1, "Out of memory!, exiting ..");
+ 		result = -ENOMEM;
+ 		goto err;
+ 	}
+ 
+-	ca->ca_priv = mantis;
+-	mantis->mantis_ca = ca;
+-	ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE;
++	ca->ca_priv		= mantis;
++	mantis->mantis_ca	= ca;
++	ca_flags		= DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE;
+ 	/* register CA interface */
+ 	ca->en50221.owner		= THIS_MODULE;
+ 	ca->en50221.read_attribute_mem	= mantis_ca_read_attr_mem;
+@@ -162,28 +177,32 @@ int mantis_ca_init(struct mantis_pci *mantis)
+ 	init_waitqueue_head(&ca->hif_opdone_wq);
+ 	init_waitqueue_head(&ca->hif_write_wq);
+ 
+-	dprintk(verbose, MANTIS_ERROR, 1, "Registering EN50221 device");
+-	if ((result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1)) != 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "EN50221: Initialization failed");
++	dprintk(MANTIS_ERROR, 1, "Registering EN50221 device");
++	result = dvb_ca_en50221_init(dvb_adapter, &ca->en50221, ca_flags, 1);
++	if (result != 0) {
++		dprintk(MANTIS_ERROR, 1, "EN50221: Initialization failed <%d>", result);
+ 		goto err;
+ 	}
+-	dprintk(verbose, MANTIS_ERROR, 1, "Registered EN50221 device");
++	dprintk(MANTIS_ERROR, 1, "Registered EN50221 device");
+ 	mantis_evmgr_init(ca);
+ 	return 0;
+ err:
+ 	kfree(ca);
+ 	return result;
+ }
++EXPORT_SYMBOL_GPL(mantis_ca_init);
+ 
+ void mantis_ca_exit(struct mantis_pci *mantis)
+ {
+ 	struct mantis_ca *ca = mantis->mantis_ca;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis CA exit");
++	dprintk(MANTIS_DEBUG, 1, "Mantis CA exit");
+ 
+ 	mantis_evmgr_exit(ca);
+-	dprintk(verbose, MANTIS_ERROR, 1, "Unregistering EN50221 device");
+-	dvb_ca_en50221_release(&ca->en50221);
++	dprintk(MANTIS_ERROR, 1, "Unregistering EN50221 device");
++	if (ca)
++		dvb_ca_en50221_release(&ca->en50221);
+ 
+ 	kfree(ca);
+ }
++EXPORT_SYMBOL_GPL(mantis_ca_exit);
+diff --git a/drivers/media/dvb/mantis/mantis_ca.h b/drivers/media/dvb/mantis/mantis_ca.h
+new file mode 100644
+index 0000000..b7e48ee
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_ca.h
+@@ -0,0 +1,7 @@
++#ifndef __MANTIS_CA_H
++#define __MANTIS_CA_H
++
++extern int mantis_ca_init(struct mantis_pci *mantis);
++extern void mantis_ca_exit(struct mantis_pci *mantis);
++
++#endif /* __MANTIS_CA_H */
+diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
+new file mode 100644
+index 0000000..d486c7f
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_cards.c
+@@ -0,0 +1,279 @@
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/pci.h>
++#include <asm/irq.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "mantis_common.h"
++
++#include "mantis_vp1033.h"
++#include "mantis_vp1034.h"
++#include "mantis_vp1041.h"
++#include "mantis_vp2033.h"
++#include "mantis_vp2040.h"
++#include "mantis_vp3030.h"
++
++#include "mantis_dma.h"
++#include "mantis_ca.h"
++#include "mantis_dvb.h"
++#include "mantis_uart.h"
++#include "mantis_ioc.h"
++#include "mantis_pci.h"
++#include "mantis_i2c.h"
++#include "mantis_reg.h"
++
++static unsigned int verbose;
++module_param(verbose, int, 0644);
++MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
++
++static int devs;
++
++#define DRIVER_NAME	"Mantis"
++
++static char *label[10] = {
++	"DMA",
++	"IRQ-0",
++	"IRQ-1",
++	"OCERR",
++	"PABRT",
++	"RIPRR",
++	"PPERR",
++	"FTRGT",
++	"RISCI",
++	"RACK"
++};
++
++
++static irqreturn_t mantis_irq_handler(int irq, void *dev_id)
++{
++	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
++	u32 rst_stat = 0, rst_mask = 0;
++
++	struct mantis_pci *mantis;
++	struct mantis_ca *ca;
++
++	mantis = (struct mantis_pci *) dev_id;
++	if (unlikely(mantis == NULL)) {
++		dprintk(MANTIS_ERROR, 1, "Mantis == NULL");
++		return IRQ_NONE;
++	}
++	ca = mantis->mantis_ca;
++
++	stat = mmread(MANTIS_INT_STAT);
++	mask = mmread(MANTIS_INT_MASK);
++	mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
++	if (!(stat & mask))
++		return IRQ_NONE;
++
++	rst_mask  = MANTIS_GPIF_WRACK  |
++		    MANTIS_GPIF_OTHERR |
++		    MANTIS_SBUF_WSTO   |
++		    MANTIS_GPIF_EXTIRQ;
++
++	rst_stat  = mmread(MANTIS_GPIF_STATUS);
++	rst_stat &= rst_mask;
++	mmwrite(rst_stat, MANTIS_GPIF_STATUS);
++
++	mantis->mantis_int_stat = stat;
++	mantis->mantis_int_mask = mask;
++	dprintk(MANTIS_DEBUG, 0, "\n-- Stat=<%02x> Mask=<%02x> --", stat, mask);
++	if (stat & MANTIS_INT_RISCEN) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[0]);
++	}
++	if (stat & MANTIS_INT_IRQ0) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[1]);
++		mantis->gpif_status = rst_stat;
++		wake_up(&ca->hif_write_wq);
++		schedule_work(&ca->hif_evm_work);
++	}
++	if (stat & MANTIS_INT_IRQ1) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[2]);
++		schedule_work(&mantis->uart_work);
++	}
++	if (stat & MANTIS_INT_OCERR) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[3]);
++	}
++	if (stat & MANTIS_INT_PABORT) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[4]);
++	}
++	if (stat & MANTIS_INT_RIPERR) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[5]);
++	}
++	if (stat & MANTIS_INT_PPERR) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[6]);
++	}
++	if (stat & MANTIS_INT_FTRGT) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[7]);
++	}
++	if (stat & MANTIS_INT_RISCI) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[8]);
++		mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
++		tasklet_schedule(&mantis->tasklet);
++	}
++	if (stat & MANTIS_INT_I2CDONE) {
++		dprintk(MANTIS_DEBUG, 0, "<%s>", label[9]);
++		wake_up(&mantis->i2c_wq);
++	}
++	mmwrite(stat, MANTIS_INT_STAT);
++	stat &= ~(MANTIS_INT_RISCEN   | MANTIS_INT_I2CDONE |
++		  MANTIS_INT_I2CRACK  | MANTIS_INT_PCMCIA7 |
++		  MANTIS_INT_PCMCIA6  | MANTIS_INT_PCMCIA5 |
++		  MANTIS_INT_PCMCIA4  | MANTIS_INT_PCMCIA3 |
++		  MANTIS_INT_PCMCIA2  | MANTIS_INT_PCMCIA1 |
++		  MANTIS_INT_PCMCIA0  | MANTIS_INT_IRQ1	   |
++		  MANTIS_INT_IRQ0     | MANTIS_INT_OCERR   |
++		  MANTIS_INT_PABORT   | MANTIS_INT_RIPERR  |
++		  MANTIS_INT_PPERR    | MANTIS_INT_FTRGT   |
++		  MANTIS_INT_RISCI);
++
++	if (stat)
++		dprintk(MANTIS_DEBUG, 0, "<Unknown> Stat=<%02x> Mask=<%02x>", stat, mask);
++
++	dprintk(MANTIS_DEBUG, 0, "\n");
++	return IRQ_HANDLED;
++}
++
++static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
++{
++	struct mantis_pci *mantis;
++	struct mantis_hwconfig *config;
++	int err = 0;
++
++	mantis = kzalloc(sizeof (struct mantis_pci), GFP_KERNEL);
++	if (mantis == NULL) {
++		printk(KERN_ERR "%s ERROR: Out of memory\n", __func__);
++		err = -ENOMEM;
++		goto fail0;
++	}
++
++	mantis->num		= devs;
++	mantis->verbose		= verbose;
++	mantis->pdev		= pdev;
++	config			= (struct mantis_hwconfig *) pci_id->driver_data;
++	config->irq_handler	= &mantis_irq_handler;
++	mantis->hwconfig	= config;
++
++	err = mantis_pci_init(mantis);
++	if (err) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI initialization failed <%d>", err);
++		goto fail1;
++	}
++
++	err = mantis_stream_control(mantis, STREAM_TO_HIF);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis stream control failed <%d>", err);
++		goto fail1;
++	}
++
++	err = mantis_i2c_init(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C initialization failed <%d>", err);
++		goto fail2;
++	}
++
++	err = mantis_get_mac(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis MAC address read failed <%d>", err);
++		goto fail2;
++	}
++
++	err = mantis_dma_init(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA initialization failed <%d>", err);
++		goto fail3;
++	}
++
++	err = mantis_dvb_init(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB initialization failed <%d>", err);
++		goto fail4;
++	}
++	devs++;
++
++	return err;
++
++fail5:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB exit! <%d>", err);
++	mantis_dvb_exit(mantis);
++
++fail4:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA exit! <%d>", err);
++	mantis_dma_exit(mantis);
++
++fail3:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis I2C exit! <%d>", err);
++	mantis_i2c_exit(mantis);
++
++fail2:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis PCI exit! <%d>", err);
++	mantis_pci_exit(mantis);
++
++fail1:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis free! <%d>", err);
++	kfree(mantis);
++
++fail0:
++	return err;
++}
++
++static void __devexit mantis_pci_remove(struct pci_dev *pdev)
++{
++	struct mantis_pci *mantis = pci_get_drvdata(pdev);
++
++	if (mantis) {
++		mantis_uart_exit(mantis);
++//		mantis_ca_exit(mantis);
++		mantis_dvb_exit(mantis);
++		mantis_dma_exit(mantis);
++		mantis_i2c_exit(mantis);
++		mantis_pci_exit(mantis);
++		kfree(mantis);
++	}
++	return;
++}
++
++static struct pci_device_id mantis_pci_table[] = {
++	MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_1033_DVB_S, &vp1033_config),
++	MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_1034_DVB_S, &vp1034_config),
++	MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_1041_DVB_S2, &vp1041_config),
++	MAKE_ENTRY(TECHNISAT, SKYSTAR_HD2_10, &vp1041_config),
++	MAKE_ENTRY(TECHNISAT, SKYSTAR_HD2_20, &vp1041_config),
++	MAKE_ENTRY(TERRATEC, CINERGY_S2_PCI_HD, &vp1041_config),
++	MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_2033_DVB_C, &vp2033_config),
++	MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_2040_DVB_C, &vp2040_config),
++	MAKE_ENTRY(TECHNISAT, CABLESTAR_HD2, &vp2040_config),
++	MAKE_ENTRY(TERRATEC, CINERGY_C, &vp2033_config),
++	MAKE_ENTRY(TWINHAN_TECHNOLOGIES, MANTIS_VP_3030_DVB_T, &vp3030_config),
++	{ }
++};
++
++static struct pci_driver mantis_pci_driver = {
++	.name		= DRIVER_NAME,
++	.id_table	= mantis_pci_table,
++	.probe		= mantis_pci_probe,
++	.remove		= mantis_pci_remove,
++};
++
++static int __devinit mantis_init(void)
++{
++	return pci_register_driver(&mantis_pci_driver);
++}
++
++static void __devexit mantis_exit(void)
++{
++	return pci_unregister_driver(&mantis_pci_driver);
++}
++
++module_init(mantis_init);
++module_exit(mantis_exit);
++
++MODULE_DESCRIPTION("MANTIS driver");
++MODULE_AUTHOR("Manu Abraham");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 6a02adf..e912c59 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -21,20 +21,9 @@
+ #ifndef __MANTIS_COMMON_H
+ #define __MANTIS_COMMON_H
+ 
+-#include <linux/module.h>
+-#include <linux/moduleparam.h>
+-#include <linux/kernel.h>
+-#include <linux/pci.h>
+ #include <linux/mutex.h>
+ #include <linux/workqueue.h>
+ 
+-#include "dvbdev.h"
+-#include "dvb_demux.h"
+-#include "dmxdev.h"
+-#include "dvb_frontend.h"
+-#include "dvb_net.h"
+-#include <linux/i2c.h>
+-#include "mantis_reg.h"
+ #include "mantis_uart.h"
+ 
+ #include "mantis_link.h"
+@@ -44,18 +33,18 @@
+ #define MANTIS_INFO		2
+ #define MANTIS_DEBUG		3
+ 
+-#define dprintk(x, y, z, format, arg...) do {								\
++#define dprintk(y, z, format, arg...) do {								\
+ 	if (z) {											\
+-		if	((x > MANTIS_ERROR) && (x > y))							\
++		if	((mantis->verbose > MANTIS_ERROR) && (mantis->verbose > y))			\
+ 			printk(KERN_ERR "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
+-		else if	((x > MANTIS_NOTICE) && (x > y))						\
++		else if	((mantis->verbose > MANTIS_NOTICE) && (mantis->verbose > y))			\
+ 			printk(KERN_NOTICE "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
+-		else if ((x > MANTIS_INFO) && (x > y))							\
++		else if ((mantis->verbose > MANTIS_INFO) && (mantis->verbose > y))			\
+ 			printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
+-		else if ((x > MANTIS_DEBUG) && (x > y))							\
++		else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y))			\
+ 			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
+ 	} else {											\
+-		if (x > y)										\
++		if (mantis->verbose > y)								\
+ 			printk(format , ##arg);								\
+ 	}												\
+ } while(0)
+@@ -63,8 +52,8 @@
+ #define mwrite(dat, addr)	writel((dat), addr)
+ #define mread(addr)		readl(addr)
+ 
+-#define mmwrite(dat, addr)	mwrite((dat), (mantis->mantis_mmio + (addr)))
+-#define mmread(addr)		mread(mantis->mantis_mmio + (addr))
++#define mmwrite(dat, addr)	mwrite((dat), (mantis->mmio + (addr)))
++#define mmread(addr)		mread(mantis->mmio + (addr))
+ #define mmand(dat, addr)	mmwrite((dat) & mmread(addr), addr)
+ #define mmor(dat, addr)		mmwrite((dat) | mmread(addr), addr)
+ #define mmaor(dat, addr)	mmwrite((dat) | ((mask) & mmread(addr)), addr)
+@@ -72,6 +61,22 @@
+ #define MANTIS_TS_188		0
+ #define MANTIS_TS_204		1
+ 
++#define TWINHAN_TECHNOLOGIES	0x1822
++#define MANTIS			0x4e35
++
++#define TECHNISAT		0x1ae4
++#define TERRATEC		0x153b
++
++#define MAKE_ENTRY(__subven, __subdev, __configptr) {			\
++		.vendor		= TWINHAN_TECHNOLOGIES,			\
++		.device		= MANTIS,				\
++		.subvendor	= (__subven),				\
++		.subdevice	= (__subdev),				\
++		.driver_data	= (unsigned long) (__configptr)		\
++}
++
++struct mantis_pci;
++
+ struct mantis_hwconfig {
+ 	char			*model_name;
+ 	char			*dev_type;
+@@ -80,6 +85,12 @@ struct mantis_hwconfig {
+ 	enum mantis_baud	baud_rate;
+ 	enum mantis_parity	parity;
+ 	u32			bytes;
++
++	irqreturn_t (*irq_handler)(int irq, void *dev_id);
++	int (*frontend_init)(struct mantis_pci *mantis, struct dvb_frontend *fe);
++
++	u8			power;
++	u8			reset;
+ };
+ 
+ struct mantis_pci {
+@@ -96,7 +107,7 @@ struct mantis_pci {
+ 	struct pci_dev		*pdev;
+ 
+ 	unsigned long		mantis_addr;
+-	volatile void __iomem	*mantis_mmio;
++	void __iomem		*mmio;
+ 
+ 	u8			irq;
+ 	u8			revision;
+@@ -156,19 +167,4 @@ struct mantis_pci {
+ 
+ #define MANTIS_HIF_STATUS	(mantis->gpio_status)
+ 
+-extern unsigned int verbose;
+-extern unsigned int devs;
+-extern unsigned int i2c;
+-extern int mantis_dvb_init(struct mantis_pci *mantis);
+-extern int mantis_frontend_init(struct mantis_pci *mantis);
+-extern int mantis_dvb_exit(struct mantis_pci *mantis);
+-extern void mantis_dma_xfer(unsigned long data);
+-extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
+-
+-extern void mantis_set_direction(struct mantis_pci *mantis, int direction);
+-
+-extern int mantis_ca_init(struct mantis_pci *mantis);
+-extern void mantis_ca_exit(struct mantis_pci *mantis);
+-
+-
+-#endif //__MANTIS_COMMON_H
++#endif /* __MANTIS_COMMON_H */
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index d15a1eb..8ebcd96 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -18,9 +18,25 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <linux/kernel.h>
+ #include <asm/page.h>
+ #include <linux/vmalloc.h>
++#include <linux/pci.h>
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
++#include "mantis_reg.h"
++#include "mantis_dma.h"
+ 
+ #define RISC_WRITE		(0x01 << 28)
+ #define RISC_JUMP		(0x07 << 28)
+@@ -38,7 +54,7 @@
+ int mantis_dma_exit(struct mantis_pci *mantis)
+ {
+ 	if (mantis->buf_cpu) {
+-		dprintk(verbose, MANTIS_ERROR, 1,
++		dprintk(MANTIS_ERROR, 1,
+ 			"DMA=0x%lx cpu=0x%p size=%d",
+ 			(unsigned long) mantis->buf_dma,
+ 			 mantis->buf_cpu,
+@@ -50,7 +66,7 @@ int mantis_dma_exit(struct mantis_pci *mantis)
+ 		mantis->buf_cpu = NULL;
+ 	}
+ 	if (mantis->risc_cpu) {
+-		dprintk(verbose, MANTIS_ERROR, 1,
++		dprintk(MANTIS_ERROR, 1,
+ 			"RISC=0x%lx cpu=0x%p size=%lx",
+ 			(unsigned long) mantis->risc_dma,
+ 			mantis->risc_cpu,
+@@ -64,6 +80,7 @@ int mantis_dma_exit(struct mantis_pci *mantis)
+ 
+ 	return 0;
+ }
++EXPORT_SYMBOL_GPL(mantis_dma_exit);
+ 
+ static inline int mantis_alloc_buffers(struct mantis_pci *mantis)
+ {
+@@ -72,12 +89,12 @@ static inline int mantis_alloc_buffers(struct mantis_pci *mantis)
+ 						       MANTIS_BUF_SIZE,
+ 						       &mantis->buf_dma);
+ 		if (!mantis->buf_cpu) {
+-			dprintk(verbose, MANTIS_ERROR, 1,
++			dprintk(MANTIS_ERROR, 1,
+ 				"DMA buffer allocation failed");
+ 
+ 			goto err;
+ 		}
+-		dprintk(verbose, MANTIS_ERROR, 1,
++		dprintk(MANTIS_ERROR, 1,
+ 			"DMA=0x%lx cpu=0x%p size=%d",
+ 			(unsigned long) mantis->buf_dma,
+ 			mantis->buf_cpu, MANTIS_BUF_SIZE);
+@@ -88,14 +105,14 @@ static inline int mantis_alloc_buffers(struct mantis_pci *mantis)
+ 							&mantis->risc_dma);
+ 
+ 		if (!mantis->risc_cpu) {
+-			dprintk(verbose, MANTIS_ERROR, 1,
++			dprintk(MANTIS_ERROR, 1,
+ 				"RISC program allocation failed");
+ 
+ 			mantis_dma_exit(mantis);
+ 
+ 			goto err;
+ 		}
+-		dprintk(verbose, MANTIS_ERROR, 1,
++		dprintk(MANTIS_ERROR, 1,
+ 			"RISC=0x%lx cpu=0x%p size=%lx",
+ 			(unsigned long) mantis->risc_dma,
+ 			mantis->risc_cpu, MANTIS_RISC_SIZE);
+@@ -103,7 +120,7 @@ static inline int mantis_alloc_buffers(struct mantis_pci *mantis)
+ 
+ 	return 0;
+ err:
+-	dprintk(verbose, MANTIS_ERROR, 1, "Out of memory (?) .....");
++	dprintk(MANTIS_ERROR, 1, "Out of memory (?) .....");
+ 	return -ENOMEM;
+ }
+ 
+@@ -117,12 +134,11 @@ static inline int mantis_calc_lines(struct mantis_pci *mantis)
+ 		mantis->line_count <<= 1;
+ 	}
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1,
+-		"Mantis RISC block bytes=[%d], line bytes=[%d], line count=[%d]",
++	dprintk(MANTIS_DEBUG, 1, "Mantis RISC block bytes=[%d], line bytes=[%d], line count=[%d]",
+ 		MANTIS_BLOCK_BYTES, mantis->line_bytes, mantis->line_count);
+ 
+ 	if (mantis->line_count > 255) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Buffer size error");
++		dprintk(MANTIS_ERROR, 1, "Buffer size error");
+ 		return -EINVAL;
+ 	}
+ 
+@@ -133,9 +149,9 @@ int mantis_dma_init(struct mantis_pci *mantis)
+ {
+ 	int err = 0;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DMA init");
++	dprintk(MANTIS_DEBUG, 1, "Mantis DMA init");
+ 	if (mantis_alloc_buffers(mantis) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Error allocating DMA buffer");
++		dprintk(MANTIS_ERROR, 1, "Error allocating DMA buffer");
+ 
+ 		// Stop RISC Engine
+ //		mmwrite(mmread(MANTIS_DMA_CTL) & ~MANTIS_RISC_EN, MANTIS_DMA_CTL);
+@@ -144,7 +160,7 @@ int mantis_dma_init(struct mantis_pci *mantis)
+ 		goto err;
+ 	}
+ 	if ((err = mantis_calc_lines(mantis)) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis calc lines failed");
++		dprintk(MANTIS_ERROR, 1, "Mantis calc lines failed");
+ 
+ 		goto err;
+ 	}
+@@ -153,20 +169,21 @@ int mantis_dma_init(struct mantis_pci *mantis)
+ err:
+ 	return err;
+ }
++EXPORT_SYMBOL_GPL(mantis_dma_init);
+ 
+ static inline void mantis_risc_program(struct mantis_pci *mantis)
+ {
+ 	u32 buf_pos = 0;
+ 	u32 line;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis create RISC program");
++	dprintk(MANTIS_DEBUG, 1, "Mantis create RISC program");
+ 	RISC_FLUSH();
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "risc len lines %u, bytes per line %u",
++	dprintk(MANTIS_DEBUG, 1, "risc len lines %u, bytes per line %u",
+ 		mantis->line_count, mantis->line_bytes);
+ 
+ 	for (line = 0; line < mantis->line_count; line++) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "RISC PROG line=[%d]", line);
++		dprintk(MANTIS_DEBUG, 1, "RISC PROG line=[%d]", line);
+ 		if (!(buf_pos % MANTIS_BLOCK_BYTES)) {
+ 			RISC_INSTR(RISC_WRITE	|
+ 				   RISC_IRQ	|
+@@ -186,7 +203,7 @@ static inline void mantis_risc_program(struct mantis_pci *mantis)
+ 
+ void mantis_dma_start(struct mantis_pci *mantis)
+ {
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Start DMA engine");
++	dprintk(MANTIS_DEBUG, 1, "Mantis Start DMA engine");
+ 
+ 	mantis_risc_program(mantis);
+ 	mmwrite(mantis->risc_dma, MANTIS_RISC_START);
+@@ -208,7 +225,7 @@ void mantis_dma_stop(struct mantis_pci *mantis)
+ 
+ 	stat = mmread(MANTIS_INT_STAT);
+ 	mask = mmread(MANTIS_INT_MASK);
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Stop DMA engine");
++	dprintk(MANTIS_DEBUG, 1, "Mantis Stop DMA engine");
+ 
+ 	mmwrite((mmread(MANTIS_GPIF_ADDR) & (~(MANTIS_GPIF_HIFRDWRN))), MANTIS_GPIF_ADDR);
+ 
+@@ -229,7 +246,7 @@ void mantis_dma_xfer(unsigned long data)
+ 	struct mantis_hwconfig *config = mantis->hwconfig;
+ 
+ 	while (mantis->last_block != mantis->finished_block) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "last block=[%d] finished block=[%d]",
++		dprintk(MANTIS_DEBUG, 1, "last block=[%d] finished block=[%d]",
+ 			mantis->last_block, mantis->finished_block);
+ 
+ 		(config->ts_size ? dvb_dmx_swfilter_204: dvb_dmx_swfilter)
+diff --git a/drivers/media/dvb/mantis/mantis_dma.h b/drivers/media/dvb/mantis/mantis_dma.h
+new file mode 100644
+index 0000000..4cba876
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_dma.h
+@@ -0,0 +1,10 @@
++#ifndef __MANTIS_DMA_H
++#define __MANTIS_DMA_H
++
++extern int mantis_dma_init(struct mantis_pci *mantis);
++extern int mantis_dma_exit(struct mantis_pci *mantis);
++extern void mantis_dma_start(struct mantis_pci *mantis);
++extern void mantis_dma_stop(struct mantis_pci *mantis);
++extern void mantis_dma_xfer(unsigned long data);
++
++#endif /* __MANTIS_DMA_H */
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index de18bb9..be911d7 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -17,65 +17,86 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <linux/kernel.h>
+ #include <linux/bitops.h>
+-#include "mantis_common.h"
+-#include "mantis_core.h"
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++#include <linux/pci.h>
++#include <linux/i2c.h>
+ 
+ #include "dmxdev.h"
+ #include "dvbdev.h"
+ #include "dvb_demux.h"
+ #include "dvb_frontend.h"
+-#include "mantis_vp1033.h"
+-#include "mantis_vp1034.h"
+-#include "mantis_vp1041.h"
+-#include "mantis_vp2033.h"
+-#include "mantis_vp2040.h"
+-#include "mantis_vp3030.h"
++#include "dvb_net.h"
+ 
+-DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
++#include "mantis_common.h"
++#include "mantis_dma.h"
++#include "mantis_ca.h"
++#include "mantis_ioc.h"
++#include "mantis_dvb.h"
+ 
+-/*	Tuner power supply control	*/
+-void mantis_fe_powerup(struct mantis_pci *mantis)
+-{
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Power ON");
+-	gpio_set_bits(mantis, 0x0c, 1);
+-	msleep_interruptible(100);
+-	gpio_set_bits(mantis, 0x0c, 1);
+-	msleep_interruptible(100);
+-}
++DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
+ 
+-void mantis_fe_powerdown(struct mantis_pci *mantis)
++int mantis_frontend_power(struct mantis_pci *mantis, enum mantis_power power)
+ {
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Power OFF");
+-	gpio_set_bits(mantis, 0x0c, 0);
+-}
++	struct mantis_hwconfig *config = mantis->hwconfig;
++
++	switch (power) {
++	case POWER_ON:
++		dprintk(MANTIS_DEBUG, 1, "Power ON");
++		gpio_set_bits(mantis, config->power, POWER_ON);
++		msleep(100);
++		gpio_set_bits(mantis, config->power, POWER_ON);
++		msleep(100);
++		break;
+ 
+-static int mantis_fe_reset(struct dvb_frontend *fe)
+-{
+-	struct mantis_pci *mantis = fe->dvb->priv;
++	case POWER_OFF:
++		dprintk(MANTIS_DEBUG, 1, "Power OFF");
++		gpio_set_bits(mantis, config->power, POWER_OFF);
++		msleep(100);
++		break;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Reset");
+-	gpio_set_bits(mantis, 13, 0);
+-	msleep_interruptible(100);
+-	gpio_set_bits(mantis, 13, 0);
+-	msleep_interruptible(100);
+-	gpio_set_bits(mantis, 13, 1);
+-	msleep_interruptible(100);
+-	gpio_set_bits(mantis, 13, 1);
++	default:
++		dprintk(MANTIS_DEBUG, 1, "Unknown state <%02x>", power);
++		return -1;
++	}
+ 
+ 	return 0;
+ }
++EXPORT_SYMBOL_GPL(mantis_frontend_power);
+ 
+-static int mantis_frontend_reset(struct mantis_pci *mantis)
++void mantis_frontend_soft_reset(struct mantis_pci *mantis)
+ {
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Frontend Reset");
+-	gpio_set_bits(mantis, 13, 0);
+-	msleep_interruptible(100);
+-	gpio_set_bits(mantis, 13, 0);
+-	msleep_interruptible(100);
+-	gpio_set_bits(mantis, 13, 1);
+-	msleep_interruptible(100);
+-	gpio_set_bits(mantis, 13, 1);
++	struct mantis_hwconfig *config = mantis->hwconfig;
++
++	dprintk(MANTIS_DEBUG, 1, "Frontend RESET");
++	gpio_set_bits(mantis, config->reset, 0);
++	msleep(100);
++	gpio_set_bits(mantis, config->reset, 0);
++	msleep(100);
++	gpio_set_bits(mantis, config->reset, 1);
++	msleep(100);
++	gpio_set_bits(mantis, config->reset, 1);
++	msleep(100);
++
++	return;
++}
++EXPORT_SYMBOL_GPL(mantis_frontend_soft_reset);
++
++static int mantis_frontend_shutdown(struct mantis_pci *mantis)
++{
++	int err;
++
++	mantis_frontend_soft_reset(mantis);
++	err = mantis_frontend_power(mantis, POWER_OFF);
++	if (err != 0) {
++		dprintk(MANTIS_ERROR, 1, "Frontend POWER OFF failed! <%d>", err);
++		return 1;
++	}
+ 
+ 	return 0;
+ }
+@@ -85,18 +106,17 @@ static int mantis_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+ 	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+ 	struct mantis_pci *mantis = dvbdmx->priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB Start feed");
++	dprintk(MANTIS_DEBUG, 1, "Mantis DVB Start feed");
+ 	if (!dvbdmx->dmx.frontend) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "no frontend ?");
++		dprintk(MANTIS_DEBUG, 1, "no frontend ?");
+ 		return -EINVAL;
+ 	}
++
+ 	mantis->feeds++;
+-	dprintk(verbose, MANTIS_DEBUG, 1,
+-		"mantis start feed, feeds=%d",
+-		mantis->feeds);
++	dprintk(MANTIS_DEBUG, 1, "mantis start feed, feeds=%d",	mantis->feeds);
+ 
+ 	if (mantis->feeds == 1)	 {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "mantis start feed & dma");
++		dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma");
+ 		printk("mantis start feed & dma\n");
+ 		mantis_dma_start(mantis);
+ 	}
+@@ -109,95 +129,129 @@ static int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+ 	struct dvb_demux *dvbdmx = dvbdmxfeed->demux;
+ 	struct mantis_pci *mantis = dvbdmx->priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB Stop feed");
++	dprintk(MANTIS_DEBUG, 1, "Mantis DVB Stop feed");
+ 	if (!dvbdmx->dmx.frontend) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "no frontend ?");
++		dprintk(MANTIS_DEBUG, 1, "no frontend ?");
+ 		return -EINVAL;
+ 	}
++
+ 	mantis->feeds--;
+ 	if (mantis->feeds == 0) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "mantis stop feed and dma");
++		dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma");
+ 		printk("mantis stop feed and dma\n");
+ 		mantis_dma_stop(mantis);
+ 	}
++
+ 	return 0;
+ }
+ 
+ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ {
+-	int result;
++	struct mantis_hwconfig *config = mantis->hwconfig;
++	int result = -1;
++
++	dprintk(MANTIS_DEBUG, 1, "dvb_register_adapter");
++
++	result = dvb_register_adapter(&mantis->dvb_adapter,
++				      "Mantis DVB adapter",
++				      THIS_MODULE,
++				      &mantis->pdev->dev,
++				      adapter_nr);
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_register_adapter");
+-	if (dvb_register_adapter(&mantis->dvb_adapter,
+-				 "Mantis dvb adapter", THIS_MODULE,
+-				 &mantis->pdev->dev,
+-				 adapter_nr) < 0) {
++	if (result < 0) {
+ 
+-		dprintk(verbose, MANTIS_ERROR, 1, "Error registering adapter");
++		dprintk(MANTIS_ERROR, 1, "Error registering adapter");
+ 		return -ENODEV;
+ 	}
+-	mantis->dvb_adapter.priv = mantis;
+-	mantis->demux.dmx.capabilities = DMX_TS_FILTERING	|
++
++	mantis->dvb_adapter.priv	= mantis;
++	mantis->demux.dmx.capabilities	= DMX_TS_FILTERING	|
+ 					 DMX_SECTION_FILTERING	|
+ 					 DMX_MEMORY_BASED_FILTERING;
+ 
+-	mantis->demux.priv = mantis;
+-	mantis->demux.filternum = 256;
+-	mantis->demux.feednum = 256;
+-	mantis->demux.start_feed = mantis_dvb_start_feed;
+-	mantis->demux.stop_feed = mantis_dvb_stop_feed;
+-	mantis->demux.write_to_decoder = NULL;
+-	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_dmx_init");
+-	if ((result = dvb_dmx_init(&mantis->demux)) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1,
+-			"dvb_dmx_init failed, ERROR=%d", result);
++	mantis->demux.priv		= mantis;
++	mantis->demux.filternum		= 256;
++	mantis->demux.feednum		= 256;
++	mantis->demux.start_feed	= mantis_dvb_start_feed;
++	mantis->demux.stop_feed		= mantis_dvb_stop_feed;
++	mantis->demux.write_to_decoder	= NULL;
++
++	dprintk(MANTIS_DEBUG, 1, "dvb_dmx_init");
++	result = dvb_dmx_init(&mantis->demux);
++	if (result < 0) {
++		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
+ 
+ 		goto err0;
+ 	}
+-	mantis->dmxdev.filternum = 256;
+-	mantis->dmxdev.demux = &mantis->demux.dmx;
+-	mantis->dmxdev.capabilities = 0;
+-	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_dmxdev_init");
+-	if ((result = dvb_dmxdev_init(&mantis->dmxdev,
+-				      &mantis->dvb_adapter)) < 0) {
+-
+-		dprintk(verbose, MANTIS_ERROR, 1,
+-			"dvb_dmxdev_init failed, ERROR=%d", result);
++
++	mantis->dmxdev.filternum	= 256;
++	mantis->dmxdev.demux		= &mantis->demux.dmx;
++	mantis->dmxdev.capabilities	= 0;
++	dprintk(MANTIS_DEBUG, 1, "dvb_dmxdev_init");
++
++	result = dvb_dmxdev_init(&mantis->dmxdev, &mantis->dvb_adapter);
++	if (result < 0) {
++
++		dprintk(MANTIS_ERROR, 1, "dvb_dmxdev_init failed, ERROR=%d", result);
+ 		goto err1;
+ 	}
+-	mantis->fe_hw.source = DMX_FRONTEND_0;
+-	if ((result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx,
+-						     &mantis->fe_hw)) < 0) {
+ 
+-		dprintk(verbose, MANTIS_ERROR, 1,
+-			"dvb_dmx_init failed, ERROR=%d", result);
++	mantis->fe_hw.source		= DMX_FRONTEND_0;
++	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_hw);
++	if (result < 0) {
+ 
++		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
+ 		goto err2;
+ 	}
+-	mantis->fe_mem.source = DMX_MEMORY_FE;
+-	if ((result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx,
+-						     &mantis->fe_mem)) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1,
+-			"dvb_dmx_init failed, ERROR=%d", result);
+ 
++	mantis->fe_mem.source		= DMX_MEMORY_FE;
++	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx,&mantis->fe_mem);
++	if (result < 0) {
++		dprintk(MANTIS_ERROR, 1,"dvb_dmx_init failed, ERROR=%d", result);
+ 		goto err3;
+ 	}
+-	if ((result = mantis->demux.dmx.connect_frontend(&mantis->demux.dmx,
+-							 &mantis->fe_hw)) < 0) {
+-
+-		dprintk(verbose, MANTIS_ERROR, 1,
+-			"dvb_dmx_init failed, ERROR=%d", result);
+ 
++	result = mantis->demux.dmx.connect_frontend(&mantis->demux.dmx, &mantis->fe_hw);
++	if (result < 0) {
++		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
+ 		goto err4;
+ 	}
++
+ 	dvb_net_init(&mantis->dvb_adapter, &mantis->dvbnet, &mantis->demux.dmx);
+ 	tasklet_init(&mantis->tasklet, mantis_dma_xfer, (unsigned long) mantis);
+-	mantis_frontend_init(mantis);
+-	mantis_ca_init(mantis);
++	if (mantis->hwconfig) {
++		result = config->frontend_init(mantis, mantis->fe);
++		if (result < 0) {
++			dprintk(MANTIS_ERROR, 1, "!!! NO Frontends found !!!");
++			goto err5;
++		} else {
++//			if (mantis->dvb_adapter == NULL) {
++//				dprintk(MANTIS_ERROR, 1, "DVB adapter <NULL>");
++//				goto err5;
++//			}
++			if (mantis->fe == NULL) {
++				dprintk(MANTIS_ERROR, 1, "FE <NULL>");
++				goto err5;
++			}
++
++			if (dvb_register_frontend(&mantis->dvb_adapter, mantis->fe)) {
++				dprintk(MANTIS_ERROR, 1, "ERROR: Frontend registration failed");
++
++				if (mantis->fe->ops.release)
++					mantis->fe->ops.release(mantis->fe);
++
++				mantis->fe = NULL;
++				goto err5;
++			}
++		}
++	}
+ 
+ 	return 0;
+ 
+-	/*	Error conditions ..	*/
++	/* Error conditions ..	*/
++err5:
++	tasklet_kill(&mantis->tasklet);
++	dvb_net_release(&mantis->dvbnet);
+ err4:
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
+ err3:
+@@ -211,115 +265,17 @@ err0:
+ 
+ 	return result;
+ }
++EXPORT_SYMBOL_GPL(mantis_dvb_init);
+ 
+-int __devinit mantis_frontend_init(struct mantis_pci *mantis)
++int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+ {
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis frontend Init");
+-	mantis_fe_powerup(mantis);
+-	mantis_frontend_reset(mantis);
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Device ID=%02x", mantis->subsystem_device);
+-	switch (mantis->subsystem_device) {
+-	case MANTIS_VP_1033_DVB_S:	// VP-1033
+-		dprintk(verbose, MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
+-		mantis->fe = stv0299_attach(&lgtdqcs001f_config,
+-					    &mantis->adapter);
+-
+-		if (mantis->fe) {
+-			mantis->fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set;
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"found STV0299 DVB-S frontend @ 0x%02x",
+-				lgtdqcs001f_config.demod_address);
+-
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"Mantis DVB-S STV0299 frontend attach success");
+-		}
+-		break;
+-	case MANTIS_VP_1034_DVB_S:	// VP-1034
+-		dprintk(verbose, MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
+-		mantis->fe = mb86a16_attach(&vp1034_config, &mantis->adapter);
+-		if (mantis->fe) {
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-			"found MB86A16 DVB-S/DSS frontend @0x%02x",
+-			vp1034_config.demod_address);
++	int err;
+ 
+-		}
+-		break;
+-	case MANTIS_VP_1041_DVB_S2:
+-	case TECHNISAT_SKYSTAR_HD2:
+-		mantis->fe = stb0899_attach(&vp1041_config, &mantis->adapter);
+-		if (mantis->fe) {
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-			"found STB0899 DVB-S/DVB-S2 frontend @0x%02x",
+-			vp1041_config.demod_address);
+-
+-			if (stb6100_attach(mantis->fe, &vp1041_stb6100_config, &mantis->adapter)) {
+-				if (!lnbp21_attach(mantis->fe, &mantis->adapter, 0, 0)) {
+-					printk("%s: No LNBP21 found!\n", __FUNCTION__);
+-					mantis->fe = NULL;
+-				}
+-			} else {
+-				mantis->fe = NULL;
+-			}
+-		}
+-		break;
+-	case MANTIS_VP_2033_DVB_C:	// VP-2033
+-	case MANTIS_VP_2040_DVB_C:	// VP-2040
+-	case TERRATEC_CINERGY_C_PCI:
+-	case TECHNISAT_CABLESTAR_HD2:
+-		dprintk(verbose, MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+-		mantis->fe = tda10021_attach(&philips_cu1216_config,
+-					     &mantis->adapter,
+-					     read_pwm(mantis));
+-
+-		if (mantis->fe) {
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
+-				philips_cu1216_config.demod_address);
+-		} else {
+-			mantis->fe = tda10023_attach(&tda10023_cu1216_config,
+-						     &mantis->adapter,
+-						     read_pwm(mantis));
+-
+-			if (mantis->fe) {
+-				dprintk(verbose, MANTIS_ERROR, 1,
+-					"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
+-					philips_cu1216_config.demod_address);
+-			}
+-		}
+-		if (mantis->fe) {
+-			mantis->fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set;
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"Mantis DVB-C Philips CU1216 frontend attach success");
+-		}
+-		break;
+-	default:
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Unknown frontend:[0x%02x]",
+-			mantis->sub_device_id);
++	err = mantis_frontend_shutdown(mantis);
++	if (err != 0)
++		dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
+ 
+-		return -ENODEV;
+-	}
+-	if (mantis->fe == NULL) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "!!! NO Frontends found !!!");
+-		return -ENODEV;
+-	} else {
+-		if (dvb_register_frontend(&mantis->dvb_adapter, mantis->fe)) {
+-			dprintk(verbose, MANTIS_ERROR, 1,
+-				"ERROR: Frontend registration failed");
+-
+-			if (mantis->fe->ops.release)
+-				mantis->fe->ops.release(mantis->fe);
+-
+-			mantis->fe = NULL;
+-			return -ENODEV;
+-		}
+-	}
+-
+-	return 0;
+-}
+-
+-int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+-{
+-	mantis_ca_exit(mantis);
++//	mantis_ca_exit(mantis);
+ 	tasklet_kill(&mantis->tasklet);
+ 	dvb_net_release(&mantis->dvbnet);
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
+@@ -329,8 +285,10 @@ int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+ 
+ 	if (mantis->fe)
+ 		dvb_unregister_frontend(mantis->fe);
+-	dprintk(verbose, MANTIS_DEBUG, 1, "dvb_unregister_adapter");
++
++	dprintk(MANTIS_DEBUG, 1, "dvb_unregister_adapter");
+ 	dvb_unregister_adapter(&mantis->dvb_adapter);
+ 
+ 	return 0;
+ }
++EXPORT_SYMBOL_GPL(mantis_dvb_exit);
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.h b/drivers/media/dvb/mantis/mantis_dvb.h
+new file mode 100644
+index 0000000..31ebbb4
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_dvb.h
+@@ -0,0 +1,15 @@
++#ifndef __MANTIS_DVB_H
++#define __MANTIS_DVB_H
++
++enum mantis_power {
++	POWER_OFF	= 0,
++	POWER_ON	= 1
++};
++
++extern int mantis_frontend_power(struct mantis_pci *mantis, enum mantis_power power);
++extern void mantis_frontend_soft_reset(struct mantis_pci *mantis);
++
++extern int mantis_dvb_init(struct mantis_pci *mantis);
++extern int mantis_dvb_exit(struct mantis_pci *mantis);
++
++#endif /* __MANTIS_DVB_H */
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 9be55f7..2005b24 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -18,9 +18,23 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <linux/kernel.h>
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
+ #include "mantis_link.h"
+ #include "mantis_hif.h"
++#include "mantis_reg.h"
+ 
+ static void mantis_hifevm_work(struct work_struct *work)
+ {
+@@ -34,7 +48,7 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+ 		if (gpif_stat & MANTIS_CARD_PLUGIN) {
+-			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
++			dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Plugin", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+ 			mantis_event_cam_plugin(ca);
+ 			dvb_ca_en50221_camchange_irq(&ca->en50221,
+@@ -43,7 +57,7 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 		}
+ 	} else {
+ 		if (gpif_stat & MANTIS_CARD_PLUGOUT) {
+-			dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
++			dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): CAM Unplug", mantis->num);
+ 			mmwrite(0xdada0000, MANTIS_CARD_RESET);
+ 			mantis_event_cam_unplug(ca);
+ 			dvb_ca_en50221_camchange_irq(&ca->en50221,
+@@ -53,28 +67,28 @@ static void mantis_hifevm_work(struct work_struct *work)
+ 	}
+ 
+ 	if (mantis->gpif_status & MANTIS_GPIF_EXTIRQ)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Ext IRQ", mantis->num);
+ 
+ 	if (mantis->gpif_status & MANTIS_SBUF_WSTO)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Timeout", mantis->num);
+ 
+ 	if (mantis->gpif_status & MANTIS_GPIF_OTHERR)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Alignment Error", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_OVFLW)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Overflow", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_BRRDY)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Read Ready", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_INTSTAT)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): GPIF IRQ", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_EMPTY)
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer Empty", mantis->num);
+ 
+ 	if (gpif_stat & MANTIS_SBUF_OPDONE) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event Mgr: Adapter(%d) Slot(0): Smart Buffer operation complete", mantis->num);
+ 		ca->sbuf_status = MANTIS_SBUF_DATA_AVAIL;
+ 		ca->hif_event = MANTIS_SBUF_OPDONE;
+ 		wake_up(&ca->hif_opdone_wq);
+@@ -85,7 +99,7 @@ int mantis_evmgr_init(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
++	dprintk(MANTIS_DEBUG, 1, "Initializing Mantis Host I/F Event manager");
+ 	INIT_WORK(&ca->hif_evm_work, mantis_hifevm_work);
+ 	mantis_pcmcia_init(ca);
+ 	schedule_work(&ca->hif_evm_work);
+@@ -97,7 +111,7 @@ void mantis_evmgr_exit(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
++	dprintk(MANTIS_DEBUG, 1, "Mantis Host I/F Event manager exiting");
+ 	flush_scheduled_work();
+ 	mantis_hif_exit(ca);
+ 	mantis_pcmcia_exit(ca);
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 99a9724..bb05427 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -18,10 +18,28 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <linux/kernel.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
++
+ #include "mantis_hif.h"
+ #include "mantis_link.h" /* temporary due to physical layer stuff */
+ 
++#include "mantis_reg.h"
++
+ static int mantis_hif_data_available(struct mantis_ca *ca)
+ {
+ 	struct mantis_pci *mantis = ca->ca_priv;
+@@ -31,7 +49,7 @@ static int mantis_hif_data_available(struct mantis_ca *ca)
+ 					     ca->sbuf_status & MANTIS_SBUF_DATA_AVAIL,
+ 					     msecs_to_jiffies(500)) == -ERESTARTSYS) {
+ 
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Read wait event timeout !", mantis->num);
++		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Read wait event timeout !", mantis->num);
+ 		rc = -EREMOTEIO;
+ 	}
+ 	ca->sbuf_status &= ~MANTIS_SBUF_DATA_AVAIL;
+@@ -48,10 +66,10 @@ static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
+ 			       ca->hif_event & MANTIS_SBUF_OPDONE,
+ 			       msecs_to_jiffies(500)) == -ERESTARTSYS) {
+ 
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Smart buffer operation timeout !", mantis->num);
++		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Smart buffer operation timeout !", mantis->num);
+ 		rc = -EREMOTEIO;
+ 	}
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Smart Buffer Operation complete");
++	dprintk(MANTIS_DEBUG, 1, "Smart Buffer Operation complete");
+ 	ca->hif_event &= ~MANTIS_SBUF_OPDONE;
+ 	return rc;
+ }
+@@ -66,22 +84,22 @@ static int mantis_hif_write_wait(struct mantis_ca *ca)
+ 			       mantis->gpif_status & MANTIS_GPIF_WRACK,
+ 			       msecs_to_jiffies(500)) == -ERESTARTSYS) {
+ 
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Write ACK timed out !", mantis->num);
++		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): Write ACK timed out !", mantis->num);
+ 		rc = -EREMOTEIO;
+ 	}
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Write Acknowledged");
++	dprintk(MANTIS_DEBUG, 1, "Write Acknowledged");
+ 	mantis->gpif_status &= ~MANTIS_GPIF_WRACK;
+ 	while (!opdone) {
+ 		opdone = (mmread(MANTIS_GPIF_STATUS) & MANTIS_SBUF_OPDONE);
+ 		udelay(500);
+ 		timeout++;
+ 		if (timeout > 100) {
+-			dprintk(verbose, MANTIS_ERROR, 1, "Adater(%d) Slot(0): Write operation timed out!", mantis->num);
++			dprintk(MANTIS_ERROR, 1, "Adater(%d) Slot(0): Write operation timed out!", mantis->num);
+ 			rc = -ETIMEDOUT;
+ 			break;
+ 		}
+ 	}
+-	dprintk(verbose, MANTIS_DEBUG, 1, "HIF Write success");
++	dprintk(MANTIS_DEBUG, 1, "HIF Write success");
+ 	return rc;
+ }
+ 
+@@ -91,7 +109,7 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 hif_addr = 0, data, count = 4;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Read", mantis->num);
++	dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Read", mantis->num);
+ 	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAIOM;
+@@ -104,13 +122,13 @@ int mantis_hif_read_mem(struct mantis_ca *ca, u32 addr)
+ 	mmwrite(hif_addr | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
++		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): GPIF Smart Buffer operation failed", mantis->num);
+ 		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+ 	data = mmread(MANTIS_GPIF_DIN);
+ 	mutex_unlock(&ca->ca_lock);
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mem Read: 0x%02x", data);
++	dprintk(MANTIS_DEBUG, 1, "Mem Read: 0x%02x", data);
+ 	return (data >> 24) & 0xff;
+ }
+ 
+@@ -120,7 +138,7 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 hif_addr = 0;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Write", mantis->num);
++	dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF Mem Write", mantis->num);
+ 	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+@@ -133,11 +151,11 @@ int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data)
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+ 	if (mantis_hif_write_wait(ca) != 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Mem Write: (0x%02x to 0x%02x)", data, addr);
++	dprintk(MANTIS_DEBUG, 1, "Mem Write: (0x%02x to 0x%02x)", data, addr);
+ 	mutex_unlock(&ca->ca_lock);
+ 
+ 	return 0;
+@@ -148,7 +166,7 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 data, hif_addr = 0;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Read", mantis->num);
++	dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Read", mantis->num);
+ 	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr |=  MANTIS_GPIF_PCMCIAIOM;
+@@ -161,12 +179,12 @@ int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr)
+ 	mmwrite(hif_addr | MANTIS_GPIF_HIFRDWRN, MANTIS_GPIF_ADDR);
+ 
+ 	if (mantis_hif_sbuf_opdone_wait(ca) != 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+ 	data = mmread(MANTIS_GPIF_DIN);
+-	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Read: 0x%02x", data);
++	dprintk(MANTIS_DEBUG, 1, "I/O Read: 0x%02x", data);
+ 	udelay(50);
+ 	mutex_unlock(&ca->ca_lock);
+ 
+@@ -178,7 +196,7 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 hif_addr = 0;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Write", mantis->num);
++	dprintk(MANTIS_DEBUG, 1, "Adapter(%d) Slot(0): Request HIF I/O Write", mantis->num);
+ 	mutex_lock(&ca->ca_lock);
+ 	hif_addr &= ~MANTIS_GPIF_PCMCIAREG;
+ 	hif_addr &= ~MANTIS_GPIF_HIFRDWRN;
+@@ -190,11 +208,11 @@ int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data)
+ 	mmwrite(data, MANTIS_GPIF_DOUT);
+ 
+ 	if (mantis_hif_write_wait(ca) != 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
++		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Smart Buffer operation failed", mantis->num);
+ 		mutex_unlock(&ca->ca_lock);
+ 		return -EREMOTEIO;
+ 	}
+-	dprintk(verbose, MANTIS_DEBUG, 1, "I/O Write: (0x%02x to 0x%02x)", data, addr);
++	dprintk(MANTIS_DEBUG, 1, "I/O Write: (0x%02x to 0x%02x)", data, addr);
+ 	mutex_unlock(&ca->ca_lock);
+ 	udelay(50);
+ 
+@@ -208,7 +226,7 @@ int mantis_hif_init(struct mantis_ca *ca)
+ 	u32 irqcfg;
+ 
+ 	slot[0].slave_cfg = 0x70773028;
+-	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Initializing Mantis Host Interface", mantis->num);
++	dprintk(MANTIS_ERROR, 1, "Adapter(%d) Initializing Mantis Host Interface", mantis->num);
+ 
+ 	mutex_lock(&ca->ca_lock);
+ 	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
+@@ -230,7 +248,7 @@ void mantis_hif_exit(struct mantis_ca *ca)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 	u32 irqcfg;
+ 
+-	dprintk(verbose, MANTIS_ERROR, 1, "Adapter(%d) Exiting Mantis Host Interface", mantis->num);
++	dprintk(MANTIS_ERROR, 1, "Adapter(%d) Exiting Mantis Host Interface", mantis->num);
+ 	mutex_lock(&ca->ca_lock);
+ 	irqcfg = mmread(MANTIS_GPIF_IRQCFG);
+ 	irqcfg &= ~MANTIS_MASK_BRRDY;
+diff --git a/drivers/media/dvb/mantis/mantis_hif.h b/drivers/media/dvb/mantis/mantis_hif.h
+index 7ef45ce..f960c0a 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.h
++++ b/drivers/media/dvb/mantis/mantis_hif.h
+@@ -26,4 +26,4 @@
+ #define MANTIS_HIF_IOMRD		3
+ #define MANTIS_HIF_IOMWR		4
+ 
+-#endif // __MANTIS_HIF_H
++#endif /* __MANTIS_HIF_H */
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 45d9e6b..ba55f0a 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -18,15 +18,20 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <linux/module.h>
+-#include <linux/moduleparam.h>
+-#include <linux/init.h>
+-#include <linux/delay.h>
+ #include <asm/io.h>
+ #include <linux/ioport.h>
+-#include <asm/pgtable.h>
+-#include <asm/page.h>
++#include <linux/pci.h>
++#include <linux/i2c.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
++#include "mantis_reg.h"
++#include "mantis_i2c.h"
+ 
+ #define I2C_HW_B_MANTIS		0x1c
+ 
+@@ -35,20 +40,21 @@ static int mantis_ack_wait(struct mantis_pci *mantis)
+ 	int rc = 0;
+ 	u32 timeout = 0;
+ 
+-	if (wait_event_interruptible_timeout(mantis->i2c_wq,
+-					     mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
+-					     msecs_to_jiffies(50)) == -ERESTARTSYS) {
++	if (wait_event_timeout(mantis->i2c_wq,
++			       mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
++			       msecs_to_jiffies(50)) == -ERESTARTSYS) {
+ 
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Master !I2CDONE");
++		dprintk(MANTIS_DEBUG, 1, "Master !I2CDONE");
+ 		rc = -EREMOTEIO;
+ 	}
++
+ 	while (!(mantis->mantis_int_stat & MANTIS_INT_I2CRACK)) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Waiting for Slave RACK");
++		dprintk(MANTIS_DEBUG, 1, "Waiting for Slave RACK");
+ 		mantis->mantis_int_stat = mmread(MANTIS_INT_STAT);
+ 		msleep(5);
+ 		timeout++;
+ 		if (timeout > 500) {
+-			dprintk(verbose, MANTIS_ERROR, 1, "Slave RACK Fail !");
++			dprintk(MANTIS_ERROR, 1, "Slave RACK Fail !");
+ 			rc = -EREMOTEIO;
+ 			break;
+ 		}
+@@ -62,7 +68,7 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ {
+ 	u32 rxd, i;
+ 
+-	dprintk(verbose, MANTIS_INFO, 0, "        %s:  Address=[0x%02x] <R>[ ",
++	dprintk(MANTIS_INFO, 0, "        %s:  Address=[0x%02x] <R>[ ",
+ 		__func__, msg->addr);
+ 
+ 	for (i = 0; i < msg->len; i++) {
+@@ -77,14 +83,14 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ 		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
+ 		mmwrite(rxd, MANTIS_I2CDATA_CTL);
+ 		if (mantis_ack_wait(mantis) != 0) {
+-			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<R>");
++			dprintk(MANTIS_DEBUG, 1, "ACK failed<R>");
+ 			return -EREMOTEIO;
+ 		}
+ 		rxd = mmread(MANTIS_I2CDATA_CTL);
+ 		msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
+-		dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
++		dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+ 	}
+-	dprintk(verbose, MANTIS_INFO, 0, "]\n");
++	dprintk(MANTIS_INFO, 0, "]\n");
+ 
+ 	return 0;
+ }
+@@ -94,11 +100,11 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 	int i;
+ 	u32 txd = 0;
+ 
+-	dprintk(verbose, MANTIS_INFO, 0, "        %s: Address=[0x%02x] <W>[ ",
++	dprintk(MANTIS_INFO, 0, "        %s: Address=[0x%02x] <W>[ ",
+ 		__func__, msg->addr);
+ 
+ 	for (i = 0; i < msg->len; i++) {
+-		dprintk(verbose, MANTIS_INFO, 0, "%02x ", msg->buf[i]);
++		dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+ 		txd = (msg->addr << 25) | (msg->buf[i] << 8)
+ 					| MANTIS_I2C_RATE_3
+ 					| MANTIS_I2C_STOP
+@@ -110,11 +116,11 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
+ 		mmwrite(txd, MANTIS_I2CDATA_CTL);
+ 		if (mantis_ack_wait(mantis) != 0) {
+-			dprintk(verbose, MANTIS_DEBUG, 1, "ACK failed<W>");
++			dprintk(MANTIS_DEBUG, 1, "ACK failed<W>");
+ 			return -EREMOTEIO;
+ 		}
+ 	}
+-	dprintk(verbose, MANTIS_INFO, 0, "]\n");
++	dprintk(MANTIS_INFO, 0, "]\n");
+ 
+ 	return 0;
+ }
+@@ -154,43 +160,46 @@ static struct i2c_algorithm mantis_algo = {
+ 	.functionality		= mantis_i2c_func,
+ };
+ 
+-static struct i2c_adapter mantis_i2c_adapter = {
+-	.owner			= THIS_MODULE,
+-	.name			= "Mantis I2C",
+-	.id			= I2C_HW_B_MANTIS,
+-	.class			= I2C_CLASS_TV_DIGITAL,
+-	.algo			= &mantis_algo,
+-};
+-
+ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ {
+ 	u32 intstat, intmask;
+ 	struct i2c_adapter *i2c_adapter = &mantis->adapter;
+ 	struct pci_dev *pdev		= mantis->pdev;
+ 
++	init_waitqueue_head(&mantis->i2c_wq);
+ 	mutex_init(&mantis->i2c_lock);
+-	memcpy(i2c_adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
++	strncpy(i2c_adapter->name, "Mantis I2C", sizeof (i2c_adapter->name));
+ 	i2c_set_adapdata(i2c_adapter, mantis);
+ 
+-	i2c_adapter->dev.parent = &pdev->dev;
++	i2c_adapter->owner	= THIS_MODULE;
++	i2c_adapter->class	= I2C_CLASS_TV_DIGITAL;
++	i2c_adapter->algo	= &mantis_algo;
++	i2c_adapter->algo_data	= NULL;
++	i2c_adapter->id		= I2C_HW_B_MANTIS;
++	i2c_adapter->timeout	= 500;
++	i2c_adapter->retries	= 3;
++	i2c_adapter->dev.parent	= &pdev->dev;
++
+ 	mantis->i2c_rc		= i2c_add_adapter(i2c_adapter);
+ 	if (mantis->i2c_rc < 0)
+ 		return mantis->i2c_rc;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing I2C ..");
++	dprintk(MANTIS_DEBUG, 1, "Initializing I2C ..");
+ 
+ 	intstat = mmread(MANTIS_INT_STAT);
+ 	intmask = mmread(MANTIS_INT_MASK);
+ 	mmwrite(intstat, MANTIS_INT_STAT);
+ 	mmwrite(intmask | MANTIS_INT_I2CDONE, MANTIS_INT_MASK);
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "[0x%08x/%08x]", intstat, intmask);
++	dprintk(MANTIS_DEBUG, 1, "Status=<%02x> Mask=<%02x>", intstat, intmask);
+ 
+ 	return 0;
+ }
++EXPORT_SYMBOL_GPL(mantis_i2c_init);
+ 
+ int __devexit mantis_i2c_exit(struct mantis_pci *mantis)
+ {
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Removing I2C adapter");
++	dprintk(MANTIS_DEBUG, 1, "Removing I2C adapter");
+ 	return i2c_del_adapter(&mantis->adapter);
+ }
++EXPORT_SYMBOL_GPL(mantis_i2c_exit);
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.h b/drivers/media/dvb/mantis/mantis_i2c.h
+new file mode 100644
+index 0000000..1e49ecf
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_i2c.h
+@@ -0,0 +1,7 @@
++#ifndef __MANTIS_I2C_H
++#define __MANTIS_I2C_H
++
++extern int mantis_i2c_init(struct mantis_pci *mantis);
++extern int mantis_i2c_exit(struct mantis_pci *mantis);
++
++#endif /* __MANTIS_I2C_H */
+diff --git a/drivers/media/dvb/mantis/mantis_ioc.c b/drivers/media/dvb/mantis/mantis_ioc.c
+new file mode 100644
+index 0000000..4700088
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_ioc.c
+@@ -0,0 +1,145 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <linux/kernel.h>
++#include <linux/i2c.h>
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "mantis_common.h"
++#include "mantis_reg.h"
++#include "mantis_ioc.h"
++
++static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
++{
++	struct i2c_adapter *adapter = &mantis->adapter;
++
++	int err;
++	struct i2c_msg msg[] = {
++		{ .addr = 0x50, .flags = 0, .buf = data, .len = 1 },
++		{ .addr = 0x50, .flags = I2C_M_RD, .buf = data, .len = length },
++	};
++
++	err = i2c_transfer(adapter, msg, 2);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: i2c read: < err=%i d0=0x%02x d1=0x%02x >",
++			err, data[0], data[1]);
++
++		return err;
++	}
++
++	return 0;
++}
++
++static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
++{
++	struct i2c_adapter *adapter = &mantis->adapter;
++	int err;
++
++	struct i2c_msg msg = { .addr = 0x50, .flags = 0, .buf = data, .len = length };
++
++	err = i2c_transfer(adapter, &msg, 1);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: i2c write: < err=%i length=0x%02x d0=0x%02x, d1=0x%02x >",
++			err, length, data[0], data[1]);
++
++		return err;
++	}
++
++	return 0;
++}
++
++int mantis_get_mac(struct mantis_pci *mantis)
++{
++	int err;
++
++	mantis->mac_address[0] = 0x08;
++
++	err = read_eeprom_byte(mantis, &mantis->mac_address[0], 6);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis EEPROM read error <%d>", err);
++
++		return err;
++	}
++
++	dprintk(MANTIS_ERROR, 0,
++		"    MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]\n",
++		mantis->mac_address[0], mantis->mac_address[1],
++		mantis->mac_address[2],	mantis->mac_address[3],
++		mantis->mac_address[4], mantis->mac_address[5]);
++
++	return 0;
++}
++EXPORT_SYMBOL_GPL(mantis_get_mac);
++
++/* Turn the given bit on or off. */
++void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
++{
++	u32 cur;
++
++	cur = mmread(MANTIS_GPIF_ADDR);
++	if (value)
++		mantis->gpio_status = cur | (1 << bitpos);
++	else
++		mantis->gpio_status = cur & (~(1 << bitpos));
++
++	mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR);
++	mmwrite(0x00, MANTIS_GPIF_DOUT);
++}
++EXPORT_SYMBOL_GPL(gpio_set_bits);
++
++int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl)
++{
++	u32 reg;
++
++	reg = mmread(MANTIS_CONTROL);
++	switch (stream_ctl) {
++	case STREAM_TO_HIF:
++		dprintk(MANTIS_DEBUG, 1, "Set stream to HIF");
++		reg &= 0xff - MANTIS_BYPASS;
++		mmwrite(reg, MANTIS_CONTROL);
++		reg |= MANTIS_BYPASS;
++		mmwrite(reg, MANTIS_CONTROL);
++		break;
++
++	case STREAM_TO_CAM:
++		dprintk(MANTIS_DEBUG, 1, "Set stream to CAM");
++		reg |= MANTIS_BYPASS;
++		mmwrite(reg, MANTIS_CONTROL);
++		reg &= 0xff - MANTIS_BYPASS;
++		mmwrite(reg, MANTIS_CONTROL);
++		break;
++	default:
++		dprintk(MANTIS_ERROR, 1, "Unknown MODE <%02x>", stream_ctl);
++		return -1;
++	}
++
++	return 0;
++}
++EXPORT_SYMBOL_GPL(mantis_stream_control);
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index f9aaaa5..f6030c9 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -58,7 +58,6 @@ struct mantis_ca {
+ 
+ 	enum mantis_slot_state		slot_state;
+ 
+-//	struct dvb_device		*ca_dev;
+ 	void				*ca_priv;
+ 
+ 	struct dvb_ca_en50221		en50221;
+@@ -81,4 +80,4 @@ extern int mantis_hif_write_mem(struct mantis_ca *ca, u32 addr, u8 data);
+ extern int mantis_hif_read_iom(struct mantis_ca *ca, u32 addr);
+ extern int mantis_hif_write_iom(struct mantis_ca *ca, u32 addr, u8 data);
+ 
+-#endif // __MANTIS_LINK_H
++#endif /* __MANTIS_LINK_H */
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index d1eac40..5165a39 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -18,6 +18,9 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
+ #include <asm/io.h>
+ #include <asm/pgtable.h>
+ #include <asm/page.h>
+@@ -25,264 +28,149 @@
+ #include <linux/vmalloc.h>
+ #include <linux/init.h>
+ #include <linux/device.h>
+-#include "mantis_common.h"
+-#include "mantis_core.h"
+-#include "mantis_uart.h"
++#include <linux/pci.h>
+ 
+ #include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+ 
+-unsigned int verbose = 1;
+-module_param(verbose, int, 0644);
+-MODULE_PARM_DESC(verbose, "verbose startup messages, default is 1 (yes)");
+-
+-unsigned int devs;
+-
+-#define PCI_VENDOR_ID_MANTIS			0x1822
+-#define PCI_DEVICE_ID_MANTIS_R11		0x4e35
+-#define DRIVER_NAME				"Mantis"
+-
+-static struct pci_device_id mantis_pci_table[] = {
+-	{ PCI_DEVICE(PCI_VENDOR_ID_MANTIS, PCI_DEVICE_ID_MANTIS_R11) },
+-	{ 0 },
+-};
+-
+-MODULE_DEVICE_TABLE(pci, mantis_pci_table);
+-
+-static irqreturn_t mantis_pci_irq(int irq, void *dev_id)
+-{
+-	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
+-	u32 rst_stat = 0, rst_mask = 0;
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
+ 
+-	struct mantis_pci *mantis;
+-	struct mantis_ca *ca;
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
+ 
+-	mantis = (struct mantis_pci *) dev_id;
+-	if (unlikely(mantis == NULL)) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis == NULL");
+-		return IRQ_NONE;
+-	}
+-	ca = mantis->mantis_ca;
+-
+-	stat = mmread(MANTIS_INT_STAT);
+-	mask = mmread(MANTIS_INT_MASK);
+-	mstat = lstat = stat & ~MANTIS_INT_RISCSTAT;
+-	if (!(stat & mask))
+-		return IRQ_NONE;
+-
+-	rst_mask  = MANTIS_GPIF_WRACK  |
+-		    MANTIS_GPIF_OTHERR |
+-		    MANTIS_SBUF_WSTO   |
+-		    MANTIS_GPIF_EXTIRQ;
+-
+-	rst_stat  = mmread(MANTIS_GPIF_STATUS);
+-	rst_stat &= rst_mask;
+-	mmwrite(rst_stat, MANTIS_GPIF_STATUS);
+-
+-	mantis->mantis_int_stat = stat;
+-	mantis->mantis_int_mask = mask;
+-	dprintk(verbose, MANTIS_DEBUG, 0, "=== Interrupts[%04x/%04x]= [", stat, mask);
+-	if (stat & MANTIS_INT_RISCEN) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* DMA enabl *");
+-	}
+-	if (stat & MANTIS_INT_IRQ0) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-0 *");
+-		mantis->gpif_status = rst_stat;
+-		wake_up(&ca->hif_write_wq);
+-		schedule_work(&ca->hif_evm_work);
+-	}
+-	if (stat & MANTIS_INT_IRQ1) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT IRQ-1 *");
+-		schedule_work(&mantis->uart_work);
+-	}
+-	if (stat & MANTIS_INT_OCERR) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT OCERR *");
+-	}
+-	if (stat & MANTIS_INT_PABORT) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT PABRT *");
+-	}
+-	if (stat & MANTIS_INT_RIPERR) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT RIPRR *");
+-	}
+-	if (stat & MANTIS_INT_PPERR) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT PPERR *");
+-	}
+-	if (stat & MANTIS_INT_FTRGT) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT FTRGT *");
+-	}
+-	if (stat & MANTIS_INT_RISCI) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* INT RISCI *");
+-		mantis->finished_block = (stat & MANTIS_INT_RISCSTAT) >> 28;
+-		tasklet_schedule(&mantis->tasklet);
+-	}
+-	if (stat & MANTIS_INT_I2CDONE) {
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* I2C DONE  *");
+-		wake_up(&mantis->i2c_wq);
+-	}
+-	mmwrite(stat, MANTIS_INT_STAT);
+-	stat &= ~(MANTIS_INT_RISCEN   | MANTIS_INT_I2CDONE |
+-		  MANTIS_INT_I2CRACK  | MANTIS_INT_PCMCIA7 |
+-		  MANTIS_INT_PCMCIA6  | MANTIS_INT_PCMCIA5 |
+-		  MANTIS_INT_PCMCIA4  | MANTIS_INT_PCMCIA3 |
+-		  MANTIS_INT_PCMCIA2  | MANTIS_INT_PCMCIA1 |
+-		  MANTIS_INT_PCMCIA0  | MANTIS_INT_IRQ1	   |
+-		  MANTIS_INT_IRQ0     | MANTIS_INT_OCERR   |
+-		  MANTIS_INT_PABORT   | MANTIS_INT_RIPERR  |
+-		  MANTIS_INT_PPERR    | MANTIS_INT_FTRGT   |
+-		  MANTIS_INT_RISCI);
+-
+-	if (stat)
+-		dprintk(verbose, MANTIS_DEBUG, 0, "* Unknown [%04x] *", stat);
+-
+-	dprintk(verbose, MANTIS_DEBUG, 0, "] ===\n");
+-
+-	return IRQ_HANDLED;
+-}
++#include "mantis_common.h"
++#include "mantis_reg.h"
++#include "mantis_pci.h"
+ 
++#define DRIVER_NAME		"Mantis Core"
+ 
+-static int __devinit mantis_pci_probe(struct pci_dev *pdev,
+-				      const struct pci_device_id *mantis_pci_table)
++int __devinit mantis_pci_init(struct mantis_pci *mantis)
+ {
+ 	u8 revision, latency;
+-	struct mantis_pci *mantis;
+-	int ret = 0;
++	struct mantis_hwconfig *config	= mantis->hwconfig;
++	struct pci_dev *pdev		= mantis->pdev;
++	int err, ret = 0;
++
++	dprintk(MANTIS_ERROR, 0, "found a %s PCI %s device on (%02x:%02x.%x),\n",
++		config->model_name,
++		config->dev_type,
++		mantis->pdev->bus->number,
++		PCI_SLOT(mantis->pdev->devfn),
++		PCI_FUNC(mantis->pdev->devfn));
++
++	err = pci_enable_device(pdev);
++	if (err != 0) {
++		ret = -ENODEV;
++		dprintk(MANTIS_ERROR, 1, "ERROR: PCI enable failed <%i>", err);
++		goto fail0;
++	}
+ 
+-	mantis = kmalloc(sizeof (struct mantis_pci), GFP_KERNEL);
+-	if (mantis == NULL) {
+-		printk("%s: Out of memory\n", __func__);
++	err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
++	if (err != 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Unable to obtain 32 bit DMA <%i>", err);
+ 		ret = -ENOMEM;
+-		goto err;
++		goto fail1;
+ 	}
+-	memset(mantis, 0, sizeof (struct mantis_pci));
+-	mantis->num = devs;
+-	devs++;
+ 
+-	if (pci_enable_device(pdev)) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis PCI enable failed");
+-		ret = -ENODEV;
+-		goto err;
+-	}
+-	mantis->mantis_addr = pci_resource_start(pdev, 0);
+-	if (!request_mem_region(pci_resource_start(pdev, 0),
+-			pci_resource_len(pdev, 0), DRIVER_NAME)) {
+-		ret = -ENODEV;
+-		goto err0;
+-	}
++	pci_set_master(pdev);
+ 
+-	mantis->mantis_mmio = ioremap(pci_resource_start(pdev, 0),
+-				      pci_resource_len(pdev, 0));
++	if (!request_mem_region(pci_resource_start(pdev, 0),
++				pci_resource_len(pdev, 0),
++				DRIVER_NAME)) {
+ 
+-	if (!mantis->mantis_mmio) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "IO remap failed");
++		dprintk(MANTIS_ERROR, 1, "ERROR: BAR0 Request failed !");
+ 		ret = -ENODEV;
+-		goto err1;
++		goto fail1;
+ 	}
+ 
+-	// Clear and disable all interrupts at startup
+-	// to avoid lockup situations
+-	mmwrite(0x00, MANTIS_INT_MASK);
+-	if (request_irq(pdev->irq,
+-			mantis_pci_irq,
+-			IRQF_SHARED,
+-			DRIVER_NAME,
+-			mantis) < 0) {
++	mantis->mmio = ioremap(pci_resource_start(pdev, 0),
++			       pci_resource_len(pdev, 0));
+ 
+-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis IRQ reg failed");
++	if (!mantis->mmio) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: BAR0 remap failed !");
+ 		ret = -ENODEV;
+-		goto err2;
++		goto fail2;
+ 	}
+-	pci_set_master(pdev);
+-	pci_set_drvdata(pdev, mantis);
++
+ 	pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency);
+ 	pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
+ 	mantis->latency = latency;
+ 	mantis->revision = revision;
+-	mantis->pdev = pdev;
+-	mantis->subsystem_vendor = pdev->subsystem_vendor;
+-	mantis->subsystem_device = pdev->subsystem_device;
+-	init_waitqueue_head(&mantis->i2c_wq);
+ 
+-	mantis_set_direction(mantis, 0); /* CAM bypass */
++	dprintk(MANTIS_ERROR, 0, "    Mantis Rev %d [%04x:%04x], ",
++		mantis->revision,
++		mantis->pdev->subsystem_vendor,
++		mantis->pdev->subsystem_device);
++
++	dprintk(MANTIS_ERROR, 0,
++		"irq: %d, latency: %d\n    memory: 0x%lx, mmio: 0x%p\n",
++		mantis->pdev->irq,
++		mantis->latency,
++		mantis->mantis_addr,
++		mantis->mmio);
+ 
+-	if (!latency)
+-		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 32);
++	err = request_irq(pdev->irq,
++			  config->irq_handler,
++			  IRQF_SHARED,
++			  DRIVER_NAME,
++			  mantis);
+ 
+-	dprintk(verbose, MANTIS_ERROR, 0,
+-		"irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p\n",
+-		pdev->irq, mantis->latency,
+-		mantis->mantis_addr, mantis->mantis_mmio);
++	if (err != 0) {
+ 
+-	// No more PCI specific stuff !
+-	if (mantis_core_init(mantis) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Mantis core init failed");
++		dprintk(MANTIS_ERROR, 1, "ERROR: IRQ registration failed ! <%d>", err);
+ 		ret = -ENODEV;
+-		goto err2;
++		goto fail3;
+ 	}
+ 
+-	return 0;
++	pci_set_drvdata(pdev, mantis);
++	return ret;
+ 
+-	// Error conditions ..
+-err2:
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Err: IO Unmap");
+-	if (mantis->mantis_mmio)
+-		iounmap(mantis->mantis_mmio);
+-err1:
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Err: Release regions");
++	/* Error conditions */
++fail3:
++	dprintk(MANTIS_ERROR, 1, "ERROR: <%d> I/O unmap", ret);
++	if (mantis->mmio)
++		iounmap(mantis->mmio);
++
++fail2:
++	dprintk(MANTIS_ERROR, 1, "ERROR: <%d> releasing regions", ret);
+ 	release_mem_region(pci_resource_start(pdev, 0),
+-				pci_resource_len(pdev, 0));
++			   pci_resource_len(pdev, 0));
++
++fail1:
++	dprintk(MANTIS_ERROR, 1, "ERROR: <%d> disabling device", ret);
+ 	pci_disable_device(pdev);
+-err0:
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Err: Free");
+-	kfree(mantis);
+-err:
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Err:");
++
++fail0:
++	dprintk(MANTIS_ERROR, 1, "ERROR: <%d> exiting", ret);
++	pci_set_drvdata(pdev, NULL);
+ 	return ret;
+ }
++EXPORT_SYMBOL_GPL(mantis_pci_init);
+ 
+-static void __devexit mantis_pci_remove(struct pci_dev *pdev)
++void __devexit mantis_pci_exit(struct mantis_pci *mantis)
+ {
+-	struct mantis_pci *mantis = pci_get_drvdata(pdev);
+-
+-	if (mantis == NULL) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Aeio, Mantis NULL ptr");
+-		return;
+-	}
+-	mantis_core_exit(mantis);
+-	dprintk(verbose, MANTIS_ERROR, 1, "Removing -->Mantis irq: %d, latency: %d\n memory: 0x%lx, mmio: 0x%p",
+-		pdev->irq, mantis->latency, mantis->mantis_addr,
+-		mantis->mantis_mmio);
++	struct pci_dev *pdev = mantis->pdev;
+ 
++	dprintk(MANTIS_NOTICE, 1, " mem: 0x%p", mantis->mmio);
+ 	free_irq(pdev->irq, mantis);
+-	pci_release_regions(pdev);
+-	if (mantis_dma_exit(mantis) < 0)
+-		dprintk(verbose, MANTIS_ERROR, 1, "DMA exit failed");
++	if (mantis->mmio) {
++		iounmap(mantis->mmio);
++		release_mem_region(pci_resource_start(pdev, 0),
++				   pci_resource_len(pdev, 0));
++	}
+ 
+-	pci_set_drvdata(pdev, NULL);
+ 	pci_disable_device(pdev);
+-	kfree(mantis);
+-}
+-
+-static struct pci_driver mantis_pci_driver = {
+-	.name = DRIVER_NAME,
+-	.id_table = mantis_pci_table,
+-	.probe = mantis_pci_probe,
+-	.remove = mantis_pci_remove,
+-};
+-
+-static int __devinit mantis_pci_init(void)
+-{
+-	return pci_register_driver(&mantis_pci_driver);
+-}
+-
+-static void __devexit mantis_pci_exit(void)
+-{
+-	pci_unregister_driver(&mantis_pci_driver);
++	pci_set_drvdata(pdev, NULL);
+ }
+-
+-module_init(mantis_pci_init);
+-module_exit(mantis_pci_exit);
++EXPORT_SYMBOL_GPL(mantis_pci_exit);
+ 
+ MODULE_DESCRIPTION("Mantis PCI DTV bridge driver");
+ MODULE_AUTHOR("Manu Abraham");
+diff --git a/drivers/media/dvb/mantis/mantis_pci.h b/drivers/media/dvb/mantis/mantis_pci.h
+new file mode 100644
+index 0000000..5ce776f
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_pci.h
+@@ -0,0 +1,7 @@
++#ifndef __MANTIS_PCI_H
++#define __MANTIS_PCI_H
++
++extern int mantis_pci_init(struct mantis_pci *mantis);
++extern void mantis_pci_exit(struct mantis_pci *mantis);
++
++#endif /* __MANTIS_PCI_H */
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+index 4156a08..90ca356 100644
+--- a/drivers/media/dvb/mantis/mantis_pcmcia.c
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -18,8 +18,22 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <linux/kernel.h>
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
+ #include "mantis_link.h" /* temporary due to physical layer stuff */
++#include "mantis_reg.h"
+ 
+ /*
+  * If Slot state is already PLUG_IN event and we are called
+@@ -32,7 +46,7 @@ void mantis_event_cam_plugin(struct mantis_ca *ca)
+ 	u32 gpif_irqcfg;
+ 
+ 	if (ca->slot_state == MODULE_XTRACTED) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event: CAM Plugged IN: Adapter(%d) Slot(0)", mantis->num);
+ 		udelay(50);
+ 		mmwrite(0xda000000, MANTIS_CARD_RESET);
+ 		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
+@@ -56,7 +70,7 @@ void mantis_event_cam_unplug(struct mantis_ca *ca)
+ 	u32 gpif_irqcfg;
+ 
+ 	if (ca->slot_state == MODULE_INSERTED) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Event: CAM Unplugged: Adapter(%d) Slot(0)", mantis->num);
+ 		udelay(50);
+ 		mmwrite(0x00da0000, MANTIS_CARD_RESET);
+ 		gpif_irqcfg  = mmread(MANTIS_GPIF_IRQCFG);
+@@ -80,14 +94,14 @@ int mantis_pcmcia_init(struct mantis_ca *ca)
+ 	card_stat = mmread(MANTIS_GPIF_IRQCFG);
+ 
+ 	if (gpif_stat & MANTIS_GPIF_DETSTAT) {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "CAM found on Adapter(%d) Slot(0)", mantis->num);
+ 		mmwrite(card_stat | MANTIS_MASK_PLUGOUT, MANTIS_GPIF_IRQCFG);
+ 		ca->slot_state = MODULE_INSERTED;
+ 		dvb_ca_en50221_camchange_irq(&ca->en50221,
+ 					     0,
+ 					     DVB_CA_EN50221_CAMCHANGE_INSERTED);
+ 	} else {
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
++		dprintk(MANTIS_DEBUG, 1, "Empty Slot on Adapter(%d) Slot(0)", mantis->num);
+ 		mmwrite(card_stat | MANTIS_MASK_PLUGIN, MANTIS_GPIF_IRQCFG);
+ 		ca->slot_state = MODULE_XTRACTED;
+ 		dvb_ca_en50221_camchange_irq(&ca->en50221,
+diff --git a/drivers/media/dvb/mantis/mantis_reg.h b/drivers/media/dvb/mantis/mantis_reg.h
+index 6f5cd49..0072e14 100644
+--- a/drivers/media/dvb/mantis/mantis_reg.h
++++ b/drivers/media/dvb/mantis/mantis_reg.h
+@@ -21,7 +21,7 @@
+ #ifndef __MANTIS_REG_H
+ #define __MANTIS_REG_H
+ 
+-// Interrupts
++/* Interrupts */
+ #define MANTIS_INT_STAT			0x00
+ #define MANTIS_INT_MASK			0x04
+ 
+@@ -49,8 +49,12 @@
+ #define MANTIS_INT_RISCI		(0x01 <<  1)
+ #define MANTIS_INT_I2CDONE		(0x01 <<  0)
+ 
+-// DMA
++/* DMA */
+ #define MANTIS_DMA_CTL			0x08
++#define MANTIS_GPIF_RD			(0xff << 24)
++#define MANTIS_GPIF_WR			(0xff << 16)
++#define MANTIS_CPU_DO			(0x01 << 10)
++#define MANTIS_DRV_DO			(0x01 <<  9)
+ #define	MANTIS_I2C_RD			(0x01 <<  7)
+ #define MANTIS_I2C_WR			(0x01 <<  6)
+ #define MANTIS_DCAP_MODE		(0x01 <<  5)
+@@ -61,10 +65,16 @@
+ #define MANTIS_DCAP_EN			(0x01 <<  1)
+ #define MANTIS_RISC_EN			(0x01 <<  0)
+ 
++/* DEBUG */
++#define MANTIS_DEBUGREG			0x0c
++#define MANTIS_DATINV			(0x0e <<  7)
++#define MANTIS_TOP_DEBUGSEL		(0x07 <<  4)
++#define MANTIS_PCMCIA_DEBUGSEL		(0x0f <<  0)
++
+ #define MANTIS_RISC_START		0x10
+ #define MANTIS_RISC_PC			0x14
+ 
+-// I2C
++/* I2C */
+ #define MANTIS_I2CDATA_CTL		0x18
+ #define MANTIS_I2C_RATE_1		(0x00 <<  6)
+ #define MANTIS_I2C_RATE_2		(0x01 <<  6)
+@@ -73,6 +83,28 @@
+ #define MANTIS_I2C_STOP			(0x01 <<  5)
+ #define MANTIS_I2C_PGMODE		(0x01 <<  3)
+ 
++/* DATA */
++#define MANTIS_CMD_DATA_R1		0x20
++#define MANTIS_CMD_DATA_3		(0xff << 24)
++#define MANTIS_CMD_DATA_2		(0xff << 16)
++#define MANTIS_CMD_DATA_1		(0xff <<  8)
++#define MANTIS_CMD_DATA_0		(0xff <<  0)
++
++#define MANTIS_CMD_DATA_R2		0x24
++#define MANTIS_CMD_DATA_7		(0xff << 24)
++#define MANTIS_CMD_DATA_6		(0xff << 16)
++#define MANTIS_CMD_DATA_5		(0xff <<  8)
++#define MANTIS_CMD_DATA_4		(0xff <<  0)
++
++#define MANTIS_CONTROL			0x28
++#define MANTIS_DET			(0x01 <<  7)
++#define MANTIS_DAT_CF_EN		(0x01 <<  6)
++#define MANTIS_ACS			(0x03 <<  4)
++#define MANTIS_VCCEN			(0x01 <<  3)
++#define MANTIS_BYPASS			(0x01 <<  2)
++#define MANTIS_MRST			(0x01 <<  1)
++#define MANTIS_CRST_INT			(0x01 <<  0)
++
+ #define MANTIS_GPIF_CFGSLA		0x84
+ #define MANTIS_GPIF_WAITSMPL		(0x07 << 28)
+ #define MANTIS_GPIF_BYTEADDRSUB		(0x01 << 25)
+@@ -162,4 +194,4 @@
+ #define MANTIS_GPIF_LOGICRD		(0xffff		<< 16)
+ #define MANTIS_GPIF_LOGICRW		(0xffff		<<  0)
+ 
+-#endif //__MANTIS_REG_H
++#endif /* __MANTIS_REG_H */
+diff --git a/drivers/media/dvb/mantis/mantis_uart.c b/drivers/media/dvb/mantis/mantis_uart.c
+index 786fcc3..fb423b0 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.c
++++ b/drivers/media/dvb/mantis/mantis_uart.c
+@@ -1,5 +1,20 @@
++#include <linux/kernel.h>
+ #include <linux/spinlock.h>
++
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
++#include "mantis_reg.h"
++#include "mantis_uart.h"
+ 
+ struct mantis_uart_params {
+ 	enum mantis_baud	baud_rate;
+@@ -18,20 +33,20 @@ int mantis_uart_read(struct mantis_pci *mantis, u8 *data)
+ 	for (i = 0; i < (config->bytes + 1); i++) {
+ 
+ 		if (stat & MANTIS_UART_RXFIFO_FULL) {
+-			dprintk(verbose, MANTIS_ERROR, 1, "RX Fifo FULL");
++			dprintk(MANTIS_ERROR, 1, "RX Fifo FULL");
+ 		}
+ 		data[i] = mmread(MANTIS_UART_RXD) & 0x3f;
+ 
+ 		stat = mmread(MANTIS_UART_STAT);
+ 
+-		dprintk(verbose, MANTIS_DEBUG, 1, "Reading ... <%02x>", data[i] & 0x3f);
++		dprintk(MANTIS_DEBUG, 1, "Reading ... <%02x>", data[i] & 0x3f);
+ 
+ 		if (data[i] & (1 << 7)) {
+-			dprintk(verbose, MANTIS_ERROR, 1, "UART framing error");
++			dprintk(MANTIS_ERROR, 1, "UART framing error");
+ 			return -EINVAL;
+ 		}
+ 		if (data[i] & (1 << 6)) {
+-			dprintk(verbose, MANTIS_ERROR, 1, "UART parity error");
++			dprintk(MANTIS_ERROR, 1, "UART parity error");
+ 			return -EINVAL;
+ 		}
+ 	}
+@@ -46,14 +61,14 @@ static void mantis_uart_work(struct work_struct *work)
+ 	u8 buf[16];
+ 	int i;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "UART read");
++	dprintk(MANTIS_DEBUG, 1, "UART read");
+ 	mantis_uart_read(mantis, buf);
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "UART: ");
++	dprintk(MANTIS_DEBUG, 1, "UART: ");
+ 	for (i = 0; i < (config->bytes + 1); i++)
+-		dprintk(verbose, MANTIS_DEBUG, 0, "<%02x> ", buf[i]);
++		dprintk(MANTIS_DEBUG, 0, "<%02x> ", buf[i]);
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 0, "\n");
++	dprintk(MANTIS_DEBUG, 0, "\n");
+ }
+ 
+ static int mantis_uart_setup(struct mantis_pci *mantis,
+@@ -64,7 +79,7 @@ static int mantis_uart_setup(struct mantis_pci *mantis,
+ 
+ 	u32 reg;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Set Parity <%s> Baud Rate <%s>",
++	dprintk(MANTIS_DEBUG, 1, "Set Parity <%s> Baud Rate <%s>",
+ 		parity[params->parity],
+ 		rates[params->baud_rate]);
+ 
+@@ -102,7 +117,7 @@ int mantis_uart_init(struct mantis_pci *mantis)
+ 	struct mantis_hwconfig *config = mantis->hwconfig;
+ 	struct mantis_uart_params params;
+ 
+-	dprintk(verbose, MANTIS_DEBUG, 1, "Initializing UART ..");
++	dprintk(MANTIS_DEBUG, 1, "Initializing UART ..");
+ 	/* default parity: */
+ 	params.baud_rate = config->baud_rate;
+ 	params.parity = config->parity;
+@@ -131,9 +146,11 @@ int mantis_uart_init(struct mantis_pci *mantis)
+ 
+ 	return 0;
+ }
++EXPORT_SYMBOL_GPL(mantis_uart_init);
+ 
+ void mantis_uart_exit(struct mantis_pci *mantis)
+ {
+ 	/* disable interrupt */
+ 	mmwrite(mmread(MANTIS_UART_CTL) & 0xffef, MANTIS_UART_CTL);
+ }
++EXPORT_SYMBOL_GPL(mantis_uart_exit);
+diff --git a/drivers/media/dvb/mantis/mantis_uart.h b/drivers/media/dvb/mantis/mantis_uart.h
+index e9f938d..0a42cd0 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.h
++++ b/drivers/media/dvb/mantis/mantis_uart.h
+@@ -56,4 +56,4 @@ struct mantis_pci;
+ extern int mantis_uart_init(struct mantis_pci *mantis);
+ extern void mantis_uart_exit(struct mantis_pci *mantis);
+ 
+-#endif // __MANTIS_UART_H
++#endif /* __MANTIS_UART_H */
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index 64cdfb8..f2092ce 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -18,6 +18,18 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "stv0299.h"
+ #include "mantis_common.h"
+ #include "mantis_vp1033.h"
+ 
+@@ -66,47 +78,21 @@ u8 lgtdqcs001f_inittab[] = {
+ 	0xff, 0xff,
+ };
+ 
+-struct stv0299_config lgtdqcs001f_config = {
+-	.demod_address		= 0x68,
+-	.inittab		= lgtdqcs001f_inittab,
+-	.mclk			= 88000000UL,
+-//	.invert = 0,
+-	.invert			= 1,
+-//	.enhanced_tuning = 0,
+-	.skip_reinit		= 0,
+-//	.lock_output		= STV0229_LOCKOUTPUT_0,
+-	.volt13_op0_op1		= STV0299_VOLT13_OP0,
+-	.min_delay_ms		= 100,
+-	.set_symbol_rate	= lgtdqcs001f_set_symbol_rate,
+-//	.pll_set		= lgtdqcs001f_pll_set,
+-};
+-
+ #define MANTIS_MODEL_NAME	"VP-1033"
+ #define MANTIS_DEV_TYPE		"DVB-S/DSS"
+ 
+-struct mantis_hwconfig vp1033_mantis_config = {
+-	.model_name		= MANTIS_MODEL_NAME,
+-	.dev_type		= MANTIS_DEV_TYPE,
+-	.ts_size		= MANTIS_TS_204,
+-	.baud_rate		= MANTIS_BAUD_9600,
+-	.parity			= MANTIS_PARITY_NONE,
+-	.bytes			= 0,
+-};
+-
+ int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+ 			  struct dvb_frontend_parameters *params)
+ {
++	struct mantis_pci *mantis	= fe->dvb->priv;
++	struct i2c_adapter *adapter	= &mantis->adapter;
++
+ 	u8 buf[4];
+ 	u32 div;
+ 
+-	struct mantis_pci *mantis = fe->dvb->priv;
+ 
+-	struct i2c_msg msg = {
+-		.addr = 0x61,
+-		.flags = 0,
+-		.buf = buf,
+-		.len = sizeof (buf)
+-	};
++	struct i2c_msg msg = {.addr = 0x61, .flags = 0, .buf = buf, .len = sizeof (buf) };
++
+ 	div = params->frequency / 250;
+ 
+ 	buf[0] = (div >> 8) & 0x7f;
+@@ -118,8 +104,8 @@ int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+ 		buf[3] |= 0x04;
+ 	else
+ 		buf[3] &= ~0x04;
+-	if (i2c_transfer(&mantis->adapter, &msg, 1) < 0) {
+-		dprintk(verbose, MANTIS_ERROR, 1, "Write: I2C Transfer failed");
++	if (i2c_transfer(adapter, &msg, 1) < 0) {
++		dprintk(MANTIS_ERROR, 1, "Write: I2C Transfer failed");
+ 		return -EIO;
+ 	}
+ 	msleep_interruptible(100);
+@@ -161,3 +147,49 @@ int lgtdqcs001f_set_symbol_rate(struct dvb_frontend *fe,
+ 
+ 	return 0;
+ }
++
++struct stv0299_config lgtdqcs001f_config = {
++	.demod_address		= 0x68,
++	.inittab		= lgtdqcs001f_inittab,
++	.mclk			= 88000000UL,
++	.invert			= 0,
++	.skip_reinit		= 0,
++	.volt13_op0_op1		= STV0299_VOLT13_OP0,
++	.min_delay_ms		= 100,
++	.set_symbol_rate	= lgtdqcs001f_set_symbol_rate,
++};
++
++static int vp1033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
++{
++	struct i2c_adapter *adapter	= &mantis->adapter;
++
++	dprintk(MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
++	fe = stv0299_attach(&lgtdqcs001f_config, adapter);
++
++	if (fe) {
++		fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set;
++		dprintk(MANTIS_ERROR, 1, "found STV0299 DVB-S frontend @ 0x%02x",
++			lgtdqcs001f_config.demod_address);
++
++		dprintk(MANTIS_ERROR, 1, "Mantis DVB-S STV0299 frontend attach success");
++	} else {
++		return -1;
++	}
++
++	mantis->fe = fe;
++	dprintk(MANTIS_ERROR, 1, "Done!");
++
++	return 0;
++}
++
++struct mantis_hwconfig vp1033_config = {
++	.model_name		= MANTIS_MODEL_NAME,
++	.dev_type		= MANTIS_DEV_TYPE,
++	.ts_size		= MANTIS_TS_204,
++
++	.baud_rate		= MANTIS_BAUD_9600,
++	.parity			= MANTIS_PARITY_NONE,
++	.bytes			= 0,
++
++	.frontend_init		= vp1033_frontend_init,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.h b/drivers/media/dvb/mantis/mantis_vp1033.h
+index e245706..2c18d21 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.h
++++ b/drivers/media/dvb/mantis/mantis_vp1033.h
+@@ -21,19 +21,10 @@
+ #ifndef __MANTIS_VP1033_H
+ #define __MANTIS_VP1033_H
+ 
+-#include "dvb_frontend.h"
+ #include "mantis_common.h"
+-#include "stv0299.h"
+ 
+ #define MANTIS_VP_1033_DVB_S	0x0016
+ 
+-extern struct stv0299_config lgtdqcs001f_config;
+-extern struct mantis_hwconfig vp1033_mantis_config;
++extern struct mantis_hwconfig vp1033_config;
+ 
+-extern int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+-				 struct dvb_frontend_parameters *params);
+-
+-extern int lgtdqcs001f_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio);
+-
+-
+-#endif // __MANTIS_VP1033_H
++#endif /* __MANTIS_VP1033_H */
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index 28f3420..40778ec 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -18,10 +18,24 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "mb86a16.h"
+ #include "mantis_common.h"
++#include "mantis_ioc.h"
+ #include "mantis_vp1034.h"
++#include "mantis_reg.h"
+ 
+-struct mb86a16_config vp1034_config = {
++struct mb86a16_config vp1034_mb86a16_config = {
+ 	.demod_address	= 0x08,
+ 	.set_voltage	= vp1034_set_voltage,
+ };
+@@ -29,38 +43,62 @@ struct mb86a16_config vp1034_config = {
+ #define MANTIS_MODEL_NAME	"VP-1034"
+ #define MANTIS_DEV_TYPE		"DVB-S/DSS"
+ 
+-struct mantis_hwconfig vp1034_mantis_config = {
+-	.model_name	= MANTIS_MODEL_NAME,
+-	.dev_type	= MANTIS_DEV_TYPE,
+-	.ts_size	= MANTIS_TS_204,
+-	.baud_rate	= MANTIS_BAUD_9600,
+-	.parity		= MANTIS_PARITY_NONE,
+-	.bytes		= 0,
+-};
+-
+ int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+ {
+ 	struct mantis_pci *mantis = fe->dvb->priv;
+ 
+ 	switch (voltage) {
+ 	case SEC_VOLTAGE_13:
+-		dprintk(verbose, MANTIS_ERROR, 1, "Polarization=[13V]");
++		dprintk(MANTIS_ERROR, 1, "Polarization=[13V]");
+ 		gpio_set_bits(mantis, 13, 1);
+ 		gpio_set_bits(mantis, 14, 0);
+ 		break;
+ 	case SEC_VOLTAGE_18:
+-		dprintk(verbose, MANTIS_ERROR, 1, "Polarization=[18V]");
++		dprintk(MANTIS_ERROR, 1, "Polarization=[18V]");
+ 		gpio_set_bits(mantis, 13, 1);
+ 		gpio_set_bits(mantis, 14, 1);
+ 		break;
+ 	case SEC_VOLTAGE_OFF:
+-		dprintk(verbose, MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
++		dprintk(MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
+ 		break;
+ 	default:
+-		dprintk(verbose, MANTIS_ERROR, 1, "Invalid = (%d)", (u32 ) voltage);
++		dprintk(MANTIS_ERROR, 1, "Invalid = (%d)", (u32 ) voltage);
+ 		return -EINVAL;
+ 	}
+ 	mmwrite(0x00, MANTIS_GPIF_DOUT);
+ 
+ 	return 0;
+ }
++
++static int vp1034_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
++{
++	struct i2c_adapter *adapter	= &mantis->adapter;
++
++	dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
++	fe = mb86a16_attach(&vp1034_mb86a16_config, adapter);
++	if (fe) {
++		dprintk(MANTIS_ERROR, 1,
++		"found MB86A16 DVB-S/DSS frontend @0x%02x",
++		vp1034_mb86a16_config.demod_address);
++
++	} else {
++		return -1;
++	}
++
++	mantis->fe = fe;
++	dprintk(MANTIS_ERROR, 1, "Done!");
++
++	return 0;
++}
++
++struct mantis_hwconfig vp1034_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_204,
++
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
++
++	.frontend_init	= vp1034_frontend_init,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.h b/drivers/media/dvb/mantis/mantis_vp1034.h
+index 2194857..3026912 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.h
++++ b/drivers/media/dvb/mantis/mantis_vp1034.h
+@@ -23,13 +23,11 @@
+ 
+ #include "dvb_frontend.h"
+ #include "mantis_common.h"
+-#include "mb86a16.h"
+ 
+ 
+ #define MANTIS_VP_1034_DVB_S	0x0014
+ 
+-extern struct mantis_hwconfig vp1034_mantis_config;
+-extern struct mb86a16_config vp1034_config;
++extern struct mantis_hwconfig vp1034_config;
+ extern int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
+ 
+-#endif // __MANTIS_VP1034_H
++#endif /* __MANTIS_VP1034_H */
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index 90df80b..1181fad 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -18,24 +18,31 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
+ #include "mantis_common.h"
++#include "mantis_ioc.h"
++#include "mantis_dvb.h"
+ #include "mantis_vp1041.h"
+ #include "stb0899_reg.h"
++#include "stb0899_drv.h"
+ #include "stb0899_cfg.h"
+ #include "stb6100_cfg.h"
++#include "stb6100.h"
++#include "lnbp21.h"
+ 
+ #define MANTIS_MODEL_NAME	"VP-1041"
+ #define MANTIS_DEV_TYPE		"DSS/DVB-S/DVB-S2"
+ 
+-struct mantis_hwconfig vp1041_mantis_config = {
+-	.model_name	= MANTIS_MODEL_NAME,
+-	.dev_type	= MANTIS_DEV_TYPE,
+-	.ts_size	= MANTIS_TS_188,
+-	.baud_rate	= MANTIS_BAUD_9600,
+-	.parity		= MANTIS_PARITY_NONE,
+-	.bytes		= 0,
+-};
+-
+ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
+ 
+ //	 0x0000000b ,	/* SYSREG */
+@@ -258,7 +265,7 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
+ 	{ 0xffff			, 0xff },
+ };
+ 
+-struct stb0899_config vp1041_config = {
++struct stb0899_config vp1041_stb0899_config = {
+ 	.init_dev		= vp1041_stb0899_s1_init_1,
+ 	.init_s2_demod		= stb0899_s2_init_2,
+ 	.init_s1_demod		= vp1041_stb0899_s1_init_3,
+@@ -299,3 +306,55 @@ struct stb6100_config vp1041_stb6100_config = {
+ 	.tuner_address	= 0x60,
+ 	.refclock	= 27000000,
+ };
++
++static int vp1041_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
++{
++	struct i2c_adapter *adapter	= &mantis->adapter;
++
++	int err = 0;
++
++	err = mantis_frontend_power(mantis, POWER_ON);
++	if (err == 0) {
++		mantis_frontend_soft_reset(mantis);
++		msleep(250);
++		mantis->fe = stb0899_attach(&vp1041_stb0899_config, adapter);
++		if (mantis->fe) {
++			dprintk(MANTIS_ERROR, 1,
++				"found STB0899 DVB-S/DVB-S2 frontend @0x%02x",
++				vp1041_stb0899_config.demod_address);
++
++			if (stb6100_attach(mantis->fe, &vp1041_stb6100_config, adapter)) {
++				if (!lnbp21_attach(mantis->fe, adapter, 0, 0)) {
++					printk("%s: No LNBP21 found!\n", __func__);
++				}
++			}
++		} else {
++			return -EREMOTEIO;
++		}
++	} else {
++		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
++			adapter->name,
++			err);
++
++		return -EIO;
++	}
++
++
++	dprintk(MANTIS_ERROR, 1, "Done!");
++
++	return 0;
++}
++
++struct mantis_hwconfig vp1041_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_188,
++
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
++
++	.frontend_init	= vp1041_frontend_init,
++	.power		= GPIF_A12,
++	.reset		= GPIF_A13,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.h b/drivers/media/dvb/mantis/mantis_vp1041.h
+index 2cc83a6..1ae5b3d 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.h
++++ b/drivers/media/dvb/mantis/mantis_vp1041.h
+@@ -21,17 +21,13 @@
+ #ifndef __MANTIS_VP1041_H
+ #define __MANTIS_VP1041_H
+ 
+-#include "dvb_frontend.h"
+ #include "mantis_common.h"
+-#include "stb0899_drv.h"
+-#include "stb6100.h"
+-#include "lnbp21.h"
+ 
+ #define MANTIS_VP_1041_DVB_S2	0x0031
+-#define TECHNISAT_SKYSTAR_HD2	0x0001
++#define SKYSTAR_HD2_10		0x0001
++#define SKYSTAR_HD2_20		0x0003
++#define CINERGY_S2_PCI_HD	0x1179
+ 
+-extern struct mantis_hwconfig vp1041_mantis_config;
+-extern struct stb0899_config vp1041_config;
+-extern struct stb6100_config vp1041_stb6100_config;
++extern struct mantis_hwconfig vp1041_config;
+ 
+-#endif // __MANTIS_VP1041_H
++#endif /* __MANTIS_VP1041_H */
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index 1171e69..8773291 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -18,48 +18,59 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "tda1002x.h"
+ #include "mantis_common.h"
+ #include "mantis_vp2033.h"
+ 
+ #define MANTIS_MODEL_NAME	"VP-2033"
+ #define MANTIS_DEV_TYPE		"DVB-C"
+ 
+-struct mantis_hwconfig vp2033_mantis_config = {
+-	.model_name	= MANTIS_MODEL_NAME,
+-	.dev_type	= MANTIS_DEV_TYPE,
+-	.ts_size	= MANTIS_TS_204,
+-	.baud_rate	= MANTIS_BAUD_9600,
+-	.parity		= MANTIS_PARITY_NONE,
+-	.bytes		= 0,
++struct tda1002x_config vp2033_tda1002x_cu1216_config = {
++	.demod_address = 0x18 >> 1,
++	.invert = 1,
+ };
+ 
+-struct tda1002x_config philips_cu1216_config = {
++struct tda10023_config vp2033_tda10023_cu1216_config = {
+ 	.demod_address = 0x18 >> 1,
+ 	.invert = 1,
+ };
+ 
+-u8 read_pwm(struct mantis_pci *mantis)
++static u8 read_pwm(struct mantis_pci *mantis)
+ {
++	struct i2c_adapter *adapter = &mantis->adapter;
++
+ 	u8 b = 0xff;
+ 	u8 pwm;
+ 	struct i2c_msg msg[] = {
+-		{.addr = 0x50,.flags = 0,.buf = &b,.len = 1},
+-		{.addr = 0x50,.flags = I2C_M_RD,.buf = &pwm,.len = 1}
++		{.addr = 0x50, .flags = 0, .buf = &b, .len = 1},
++		{.addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1}
+ 	};
+ 
+-	if ((i2c_transfer(&mantis->adapter, msg, 2) != 2)
++	if ((i2c_transfer(adapter, msg, 2) != 2)
+ 	    || (pwm == 0xff))
+ 		pwm = 0x48;
+ 
+ 	return pwm;
+ }
+ 
+-int philips_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
++static int tda1002x_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
+ {
+ 	struct mantis_pci *mantis = fe->dvb->priv;
++	struct i2c_adapter *adapter = &mantis->adapter;
+ 
+ 	u8 buf[6];
+-	struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = buf,.len = sizeof(buf) };
++	struct i2c_msg msg = {.addr = 0x60, .flags = 0, .buf = buf, .len = sizeof (buf) };
+ 	int i;
+ 
+ #define CU1216_IF 36125000
+@@ -78,7 +89,7 @@ int philips_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parame
+ 	if (fe->ops.i2c_gate_ctrl)
+ 		fe->ops.i2c_gate_ctrl(fe, 1);
+ 
+-	if (i2c_transfer(&mantis->adapter, &msg, 1) != 1)
++	if (i2c_transfer(adapter, &msg, 1) != 1)
+ 		return -EIO;
+ 
+ 	/* wait for the pll lock */
+@@ -88,7 +99,7 @@ int philips_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parame
+ 		if (fe->ops.i2c_gate_ctrl)
+ 			fe->ops.i2c_gate_ctrl(fe, 1);
+ 
+-		if (i2c_transfer(&mantis->adapter, &msg, 1) == 1 && (buf[0] & 0x40))
++		if (i2c_transfer(adapter, &msg, 1) == 1 && (buf[0] & 0x40))
+ 			break;
+ 
+ 		msleep(10);
+@@ -102,8 +113,58 @@ int philips_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parame
+ 	if (fe->ops.i2c_gate_ctrl)
+ 		fe->ops.i2c_gate_ctrl(fe, 1);
+ 
+-	if (i2c_transfer(&mantis->adapter, &msg, 1) != 1)
++	if (i2c_transfer(adapter, &msg, 1) != 1)
+ 		return -EIO;
+ 
+ 	return 0;
+ }
++
++static int vp2033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
++{
++	struct i2c_adapter *adapter = &mantis->adapter;
++
++	dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
++	fe = tda10021_attach(&vp2033_tda1002x_cu1216_config,
++			     adapter,
++			     read_pwm(mantis));
++
++	if (fe) {
++		dprintk(MANTIS_ERROR, 1,
++			"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
++			vp2033_tda1002x_cu1216_config.demod_address);
++	} else {
++		fe = tda10023_attach(&vp2033_tda10023_cu1216_config,
++				     adapter,
++				     read_pwm(mantis));
++
++		if (fe) {
++			dprintk(MANTIS_ERROR, 1,
++				"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++				vp2033_tda1002x_cu1216_config.demod_address);
++		}
++	}
++
++	if (fe) {
++		fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
++		dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
++	} else {
++		return -1;
++	}
++
++	mantis->fe = fe;
++	dprintk(MANTIS_DEBUG, 1, "Done!");
++
++	return 0;
++}
++
++struct mantis_hwconfig vp2033_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_204,
++
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
++
++	.frontend_init	= vp2033_frontend_init,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
+index fcf8b85..e6c5fe8 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.h
++++ b/drivers/media/dvb/mantis/mantis_vp2033.h
+@@ -21,17 +21,10 @@
+ #ifndef __MANTIS_VP2033_H
+ #define __MANTIS_VP2033_H
+ 
+-#include "dvb_frontend.h"
+ #include "mantis_common.h"
+-#include "tda1002x.h"
+ 
+ #define MANTIS_VP_2033_DVB_C	0x0008
+ 
+-extern struct tda1002x_config philips_cu1216_config;
+-extern struct mantis_hwconfig vp2033_mantis_config;
++extern struct mantis_hwconfig vp2033_config;
+ 
+-extern int philips_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params);
+-
+-extern u8 read_pwm(struct mantis_pci *mantis);
+-
+-#endif // __MANTIS_VP2033_H
++#endif /* __MANTIS_VP2033_H */
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
+index ce73d6b..51b082f 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.c
++++ b/drivers/media/dvb/mantis/mantis_vp2040.c
+@@ -18,22 +18,153 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "tda1002x.h"
+ #include "mantis_common.h"
+ #include "mantis_vp2040.h"
+ 
+ #define MANTIS_MODEL_NAME	"VP-2040"
+ #define MANTIS_DEV_TYPE		"DVB-C"
+ 
+-struct mantis_hwconfig vp2040_mantis_config = {
++struct tda1002x_config vp2040_tda1002x_cu1216_config = {
++	.demod_address	= 0x18 >> 1,
++	.invert		= 1,
++};
++
++struct tda10023_config vp2040_tda10023_cu1216_config = {
++	.demod_address	= 0x18 >> 1,
++	.invert		= 1,
++};
++
++static int tda1002x_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
++{
++	struct mantis_pci *mantis	= fe->dvb->priv;
++	struct i2c_adapter *adapter	= &mantis->adapter;
++
++	u8 buf[6];
++	struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = buf,.len = sizeof (buf) };
++	int i;
++
++#define CU1216_IF 36125000
++#define TUNER_MUL 62500
++
++	u32 div = (params->frequency + CU1216_IF + TUNER_MUL / 2) / TUNER_MUL;
++
++	buf[0] = (div >> 8) & 0x7f;
++	buf[1] = div & 0xff;
++	buf[2] = 0xce;
++	buf[3] = (params->frequency < 150000000 ? 0x01 :
++		  params->frequency < 445000000 ? 0x02 : 0x04);
++	buf[4] = 0xde;
++	buf[5] = 0x20;
++
++	if (fe->ops.i2c_gate_ctrl)
++		fe->ops.i2c_gate_ctrl(fe, 1);
++
++	if (i2c_transfer(adapter, &msg, 1) != 1)
++		return -EIO;
++
++	/* wait for the pll lock */
++	msg.flags = I2C_M_RD;
++	msg.len = 1;
++	for (i = 0; i < 20; i++) {
++		if (fe->ops.i2c_gate_ctrl)
++			fe->ops.i2c_gate_ctrl(fe, 1);
++
++		if (i2c_transfer(adapter, &msg, 1) == 1 && (buf[0] & 0x40))
++			break;
++
++		msleep(10);
++	}
++
++	/* switch the charge pump to the lower current */
++	msg.flags = 0;
++	msg.len = 2;
++	msg.buf = &buf[2];
++	buf[2] &= ~0x40;
++	if (fe->ops.i2c_gate_ctrl)
++		fe->ops.i2c_gate_ctrl(fe, 1);
++
++	if (i2c_transfer(adapter, &msg, 1) != 1)
++		return -EIO;
++
++	return 0;
++}
++
++static u8 read_pwm(struct mantis_pci *mantis)
++{
++	struct i2c_adapter *adapter = &mantis->adapter;
++
++	u8 b = 0xff;
++	u8 pwm;
++	struct i2c_msg msg[] = {
++		{.addr = 0x50, .flags = 0, .buf = &b, .len = 1},
++		{.addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1}
++	};
++
++	if ((i2c_transfer(adapter, msg, 2) != 2)
++	    || (pwm == 0xff))
++		pwm = 0x48;
++
++	return pwm;
++}
++
++static int vp2040_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
++{
++	struct i2c_adapter *adapter = &mantis->adapter;
++
++	dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
++	fe = tda10021_attach(&vp2040_tda1002x_cu1216_config,
++			     adapter,
++			     read_pwm(mantis));
++
++	if (fe) {
++		dprintk(MANTIS_ERROR, 1,
++			"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
++			vp2040_tda1002x_cu1216_config.demod_address);
++	} else {
++		fe = tda10023_attach(&vp2040_tda10023_cu1216_config,
++				     adapter,
++				     read_pwm(mantis));
++
++		if (fe) {
++			dprintk(MANTIS_ERROR, 1,
++				"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++				vp2040_tda1002x_cu1216_config.demod_address);
++		}
++	}
++
++	if (fe) {
++		fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
++		dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
++	} else {
++		return -1;
++	}
++
++	mantis->fe = fe;
++	dprintk(MANTIS_DEBUG, 1, "Done!");
++
++	return 0;
++}
++
++struct mantis_hwconfig vp2040_config = {
+ 	.model_name	= MANTIS_MODEL_NAME,
+ 	.dev_type	= MANTIS_DEV_TYPE,
+ 	.ts_size	= MANTIS_TS_204,
++
+ 	.baud_rate	= MANTIS_BAUD_9600,
+ 	.parity		= MANTIS_PARITY_NONE,
+ 	.bytes		= 0,
+-};
+ 
+-struct tda10023_config tda10023_cu1216_config = {
+-	.demod_address = 0x18 >> 1,
+-	.invert = 1,
++	.frontend_init	= vp2040_frontend_init,
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.h b/drivers/media/dvb/mantis/mantis_vp2040.h
+index c745754..d125e21 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.h
++++ b/drivers/media/dvb/mantis/mantis_vp2040.h
+@@ -21,15 +21,12 @@
+ #ifndef __MANTIS_VP2040_H
+ #define __MANTIS_VP2040_H
+ 
+-#include "dvb_frontend.h"
+ #include "mantis_common.h"
+-#include "tda1002x.h"
+ 
+ #define MANTIS_VP_2040_DVB_C	0x0043
+-#define TERRATEC_CINERGY_C_PCI	0x1178
+-#define TECHNISAT_CABLESTAR_HD2	0x0002
++#define CINERGY_C		0x1178
++#define CABLESTAR_HD2		0x0002
+ 
+-extern struct tda10023_config tda10023_cu1216_config;
+-extern struct mantis_hwconfig vp2040_mantis_config;
++extern struct mantis_hwconfig vp2040_config;
+ 
+-#endif //__MANTIS_VP2040_H
++#endif /* __MANTIS_VP2040_H */
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index 9ca8040..4b974ee 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -18,6 +18,18 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
++#include <asm/irq.h>
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "zl10353.h"
+ #include "mantis_common.h"
+ #include "mantis_vp3030.h"
+ 
+@@ -28,15 +40,6 @@ struct zl10353_config mantis_vp3030_config = {
+ #define MANTIS_MODEL_NAME	"VP-3030"
+ #define MANTIS_DEV_TYPE		"DVB-T"
+ 
+-struct mantis_hwconfig vp3030_mantis_config = {
+-	.model_name	= MANTIS_MODEL_NAME,
+-	.dev_type	= MANTIS_DEV_TYPE,
+-	.ts_size	= MANTIS_TS_188,
+-	.baud_rate	= MANTIS_BAUD_9600,
+-	.parity		= MANTIS_PARITY_NONE,
+-	.bytes		= 0,
+-};
+-
+ int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,
+ 				   struct dvb_frontend_parameters *params)
+ {
+@@ -63,3 +66,31 @@ int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,
+ 
+ 	return 0;
+ }
++
++static int vp3030_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
++{
++	struct i2c_adapter *adapter	= &mantis->adapter;
++
++	dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
++	fe = zl10353_attach(&mantis_vp3030_config, adapter);
++
++	if (!fe)
++		return -1;
++
++	mantis->fe = fe;
++	dprintk(MANTIS_ERROR, 1, "Done!");
++
++	return 0;
++}
++
++struct mantis_hwconfig vp3030_config = {
++	.model_name	= MANTIS_MODEL_NAME,
++	.dev_type	= MANTIS_DEV_TYPE,
++	.ts_size	= MANTIS_TS_188,
++
++	.baud_rate	= MANTIS_BAUD_9600,
++	.parity		= MANTIS_PARITY_NONE,
++	.bytes		= 0,
++
++	.frontend_init	= vp3030_frontend_init,
++};
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.h b/drivers/media/dvb/mantis/mantis_vp3030.h
+index acc50a4..0a110ba 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.h
++++ b/drivers/media/dvb/mantis/mantis_vp3030.h
+@@ -21,14 +21,10 @@
+ #ifndef __MANTIS_VP3030_H
+ #define __MANTIS_VP3030_H
+ 
+-#include "dvb_frontend.h"
+ #include "mantis_common.h"
+-#include "dvb-pll.h"
+-#include "zl10353.h"
+ 
+ #define MANTIS_VP_3030_DVB_T	0x0024
+ 
+-extern struct zl10353_config mantis_vp3030_config;
+-extern struct mantis_hwconfig vp3030_mantis_config;
++extern struct mantis_hwconfig vp3030_config;
+ 
+-#endif // __MANTIS_VP3030_H
++#endif /* __MANTIS_VP3030_H */
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0096-V4L-DVB-13796-Mantis-Add-missing-file-in-previous-co.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0096-V4L-DVB-13796-Mantis-Add-missing-file-in-previous-co.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,58 @@
+From b25634d125f19cc7836dd9a7ec202feb7ea54c37 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:41:52 -0300
+Subject: [PATCH 096/120] V4L/DVB (13796): [Mantis] Add missing file in previous commit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit ad0ac434cb3b34640a4e81d7e80a1512c6e40253)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_ioc.h |   31 +++++++++++++++++++++++++++++++
+ 1 files changed, 31 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_ioc.h
+
+diff --git a/drivers/media/dvb/mantis/mantis_ioc.h b/drivers/media/dvb/mantis/mantis_ioc.h
+new file mode 100644
+index 0000000..2052640
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_ioc.h
+@@ -0,0 +1,31 @@
++#ifndef __MANTIS_IOC_H
++#define __MANTIS_IOC_H
++
++#define GPIF_A00		0x00
++#define GPIF_A01		0x01
++#define GPIF_A02		0x02
++#define GPIF_A03		0x03
++#define GPIF_A04		0x04
++#define GPIF_A05		0x05
++#define GPIF_A06		0x06
++#define GPIF_A07		0x07
++#define GPIF_A08		0x08
++#define GPIF_A09		0x09
++#define GPIF_A10		0x0a
++#define GPIF_A11		0x0b
++
++#define GPIF_A12		0x0c
++#define GPIF_A13		0x0d
++#define GPIF_A14		0x0e
++
++enum mantis_stream_control {
++	STREAM_TO_HIF = 0,
++	STREAM_TO_CAM
++};
++
++extern int mantis_get_mac(struct mantis_pci *mantis);
++extern void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value);
++
++extern int mantis_stream_control(struct mantis_pci *mantis, enum mantis_stream_control stream_ctl);
++
++#endif /* __MANTIS_IOC_H */
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0097-V4L-DVB-13797-Mantis-Hopper-TDA665x-Large-overhaul.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0097-V4L-DVB-13797-Mantis-Hopper-TDA665x-Large-overhaul.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,902 @@
+From 5cda8f1fd8c3f76a70ce98448e17fa738e15a63c Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:56:35 -0300
+Subject: [PATCH 097/120] V4L/DVB (13797): [Mantis/Hopper/TDA665x] Large overhaul,
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* Initial go at VP-3028, VP-3030 devices.
+* I2C communication improvements,
+* Add TDA665x support
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked with minor conflict from commit 3e978a8284080d801d20cda377d9cf7c12fe68b9)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/Kconfig      |   11 ++
+ drivers/media/dvb/frontends/Makefile     |    1 +
+ drivers/media/dvb/frontends/tda665x.c    |  257 ++++++++++++++++++++++++++++++
+ drivers/media/dvb/frontends/tda665x.h    |   52 ++++++
+ drivers/media/dvb/mantis/hopper_cards.c  |    1 -
+ drivers/media/dvb/mantis/mantis_cards.c  |   11 +-
+ drivers/media/dvb/mantis/mantis_dma.c    |    3 +-
+ drivers/media/dvb/mantis/mantis_dvb.c    |   22 ++-
+ drivers/media/dvb/mantis/mantis_i2c.c    |  141 +++++++++++------
+ drivers/media/dvb/mantis/mantis_i2c.h    |    3 +
+ drivers/media/dvb/mantis/mantis_ioc.c    |   42 ++----
+ drivers/media/dvb/mantis/mantis_vp3030.c |   52 +++---
+ 12 files changed, 479 insertions(+), 117 deletions(-)
+ create mode 100644 drivers/media/dvb/frontends/tda665x.c
+ create mode 100644 drivers/media/dvb/frontends/tda665x.h
+
+diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
+index d7c4837..5a1d66c 100644
+--- a/drivers/media/dvb/frontends/Kconfig
++++ b/drivers/media/dvb/frontends/Kconfig
+@@ -557,6 +557,17 @@ config DVB_LGS8GXX
+ 	help
+ 	  A DMB-TH tuner module. Say Y when you want to support this frontend.
+ 
++config DVB_TDA665x
++	tristate "TDA665x tuner"
++	depends on DVB_CORE && I2C
++	default m if DVB_FE_CUSTOMISE
++	help
++	  Support for tuner modules based on Philips TDA6650/TDA6651 chips.
++	  Say Y when you want to support this chip.
++
++	  Currently supported tuners:
++	  * Panasonic ENV57H12D5 (ET-50DT)
++
+ comment "Tools to develop new frontends"
+ 
+ config DVB_DUMMY_FE
+diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
+index 3523767..af944a8 100644
+--- a/drivers/media/dvb/frontends/Makefile
++++ b/drivers/media/dvb/frontends/Makefile
+@@ -63,6 +63,7 @@ obj-$(CONFIG_DVB_TDA10048) += tda10048.o
+ obj-$(CONFIG_DVB_TUNER_CX24113) += cx24113.o
+ obj-$(CONFIG_DVB_S5H1411) += s5h1411.o
+ obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o
++obj-$(CONFIG_DVB_TDA665x) += tda665x.o
+ obj-$(CONFIG_DVB_LGS8GXX) += lgs8gxx.o
+ obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o
+ obj-$(CONFIG_DVB_AF9013) += af9013.o
+diff --git a/drivers/media/dvb/frontends/tda665x.c b/drivers/media/dvb/frontends/tda665x.c
+new file mode 100644
+index 0000000..0732a2d
+--- /dev/null
++++ b/drivers/media/dvb/frontends/tda665x.c
+@@ -0,0 +1,257 @@
++/*
++	TDA665x tuner driver
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++
++#include "dvb_frontend.h"
++#include "tda665x.h"
++
++struct tda665x_state {
++	struct dvb_frontend		*fe;
++	struct i2c_adapter		*i2c;
++	const struct tda665x_config	*config;
++
++	u32 frequency;
++	u32 bandwidth;
++};
++
++static int tda665x_read(struct tda665x_state *state, u8 *buf)
++{
++	const struct tda665x_config *config = state->config;
++	int err = 0;
++	struct i2c_msg msg = { .addr = config->addr, .flags = I2C_M_RD, .buf = buf, .len = 2 };
++
++	err = i2c_transfer(state->i2c, &msg, 1);
++	if (err != 1)
++		goto exit;
++
++	return err;
++exit:
++	printk("%s: I/O Error err=<%d>\n", __func__, err);
++	return err;
++}
++
++static int tda665x_write(struct tda665x_state *state, u8 *buf, u8 length)
++{
++	const struct tda665x_config *config = state->config;
++	int err = 0;
++	struct i2c_msg msg = { .addr = config->addr, .flags = 0, .buf = buf, .len = length };
++
++	err = i2c_transfer(state->i2c, &msg, 1);
++	if (err != 1)
++		goto exit;
++
++	return err;
++exit:
++	printk("%s: I/O Error err=<%d>\n", __func__, err);
++	return err;
++}
++
++static int tda665x_get_state(struct dvb_frontend *fe,
++			     enum tuner_param param,
++			     struct tuner_state *tstate)
++{
++	struct tda665x_state *state = fe->tuner_priv;
++	int err = 0;
++
++	switch (param) {
++	case DVBFE_TUNER_FREQUENCY:
++		tstate->frequency = state->frequency;
++		break;
++	case DVBFE_TUNER_BANDWIDTH:
++		break;
++	default:
++		printk("%s: Unknown parameter (param=%d)\n", __func__, param);
++		err = -EINVAL;
++		break;
++	}
++
++	return err;
++}
++
++static int tda665x_get_status(struct dvb_frontend *fe, u32 *status)
++{
++	struct tda665x_state *state = fe->tuner_priv;
++	u8 result = 0;
++	int err = 0;
++
++	*status = 0;
++
++	err = tda665x_read(state, &result);
++	if (err < 0)
++		goto exit;
++
++	if ((result >> 6) & 0x01) {
++		printk("%s: Tuner Phase Locked\n", __func__);
++		*status = 1;
++	}
++
++	return err;
++exit:
++	printk("%s: I/O Error\n", __func__);
++	return err;
++}
++
++static int tda665x_set_state(struct dvb_frontend *fe,
++			     enum tuner_param param,
++			     struct tuner_state *tstate)
++{
++	struct tda665x_state *state = fe->tuner_priv;
++	const struct tda665x_config *config = state->config;
++	u32 frequency, status = 0;
++	u8 buf[4];
++	int err = 0;
++
++	if (param & DVBFE_TUNER_FREQUENCY) {
++
++		frequency = tstate->frequency;
++		if ((frequency < config->frequency_max) || (frequency > config->frequency_min)) {
++			printk("%s: Frequency beyond limits, frequency=%d\n", __func__, frequency);
++			return -EINVAL;
++		}
++
++		frequency += config->frequency_offst;
++		frequency *= config->ref_multiplier;
++		frequency += config->ref_divider >> 1;
++		frequency /= config->ref_divider;
++
++		buf[0] = (u8 ) (frequency & 0x7f00) >> 8;
++		buf[1] = (u8 ) (frequency & 0x00ff) >> 0;
++		buf[2] = 0x80 | 0x40 | 0x02;
++		buf[3] = 0x00;
++
++		/* restore frequency */
++		frequency = tstate->frequency;
++
++		if (frequency < 153000000) {
++			/* VHF-L */
++			buf[3] |= 0x01; /* fc, Low Band, 47 - 153 MHz */
++			if (frequency < 68000000)
++				buf[3] |= 0x40; /* 83uA */
++			if (frequency < 1040000000)
++				buf[3] |= 0x60; /* 122uA */
++			if (frequency < 1250000000)
++				buf[3] |= 0x80; /* 163uA */
++			else
++				buf[3] |= 0xa0; /* 254uA */
++		} else if (frequency < 438000000) {
++			/* VHF-H */
++			buf[3] |= 0x02; /* fc, Mid Band, 153 - 438 MHz */
++			if (frequency < 230000000)
++				buf[3] |= 0x40;
++			if (frequency < 300000000)
++				buf[3] |= 0x60;
++			else
++				buf[3] |= 0x80;
++		} else {
++			/* UHF */
++			buf[3] |= 0x04; /* fc, High Band, 438 - 862 MHz */
++			if (frequency < 470000000)
++				buf[3] |= 0x60;
++			if (frequency < 526000000)
++				buf[3] |= 0x80;
++			else
++				buf[3] |= 0xa0;
++		}
++
++		/* Set params */
++		err = tda665x_write(state, buf, 5);
++		if (err < 0)
++			goto exit;
++
++		/* sleep for some time */
++		printk("%s: Waiting to Phase LOCK\n", __func__);
++		msleep(20);
++		/* check status */
++		err = tda665x_get_status(fe, &status);
++		if (err < 0)
++			goto exit;
++
++		if (status == 1) {
++			printk("%s: Tuner Phase locked: status=%d\n", __func__, status);
++			state->frequency = frequency; /* cache successful state */
++		} else {
++			printk("%s: No Phase lock: status=%d\n", __func__, status);
++		}
++	} else {
++		printk("%s: Unknown parameter (param=%d)\n", __func__, param);
++		return -EINVAL;
++	}
++
++	return 0;
++exit:
++	printk("%s: I/O Error\n", __func__);
++	return err;
++}
++
++static int tda665x_release(struct dvb_frontend *fe)
++{
++	struct tda665x_state *state = fe->tuner_priv;
++
++	fe->tuner_priv = NULL;
++	kfree(state);
++	return 0;
++}
++
++static struct dvb_tuner_ops tda665x_ops = {
++
++	.set_state	= tda665x_set_state,
++	.get_state	= tda665x_get_state,
++	.get_status	= tda665x_get_status,
++	.release	= tda665x_release
++};
++
++struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
++				    const struct tda665x_config *config,
++				    struct i2c_adapter *i2c)
++{
++	struct tda665x_state *state = NULL;
++	struct dvb_tuner_info *info;
++
++	state = kzalloc(sizeof (struct tda665x_state), GFP_KERNEL);
++	if (state == NULL)
++		goto exit;
++
++	state->config		= config;
++	state->i2c		= i2c;
++	state->fe		= fe;
++	fe->tuner_priv		= state;
++	fe->ops.tuner_ops	= tda665x_ops;
++	info			 = &fe->ops.tuner_ops.info;
++
++	memcpy(info->name, config->name, sizeof (config->name));
++	info->frequency_min	= config->frequency_min;
++	info->frequency_max	= config->frequency_max;
++	info->frequency_step	= config->frequency_offst;
++
++	printk("%s: Attaching TDA665x (%s) tuner\n", __func__, info->name);
++
++	return fe;
++
++exit:
++	kfree(state);
++	return NULL;
++}
++EXPORT_SYMBOL(tda665x_attach);
++
++MODULE_DESCRIPTION("TDA665x driver");
++MODULE_AUTHOR("Manu Abraham");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/media/dvb/frontends/tda665x.h b/drivers/media/dvb/frontends/tda665x.h
+new file mode 100644
+index 0000000..c0b544d
+--- /dev/null
++++ b/drivers/media/dvb/frontends/tda665x.h
+@@ -0,0 +1,52 @@
++/*
++	TDA665x tuner driver
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#ifndef __TDA665x_H
++#define __TDA665x_H
++
++struct tda665x_config {
++	char name[128];
++
++	u8	addr;
++	u32	frequency_min;
++	u32	frequency_max;
++	u32	frequency_offst;
++	u32	ref_multiplier;
++	u32	ref_divider;
++};
++
++#if defined(CONFIG_DVB_TDA665x) || (defined(CONFIG_DVB_TDA665x_MODULE) && defined(MODULE))
++
++extern struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
++					   const struct tda665x_config *config,
++					   struct i2c_adapter *i2c);
++
++#else
++
++static inline struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
++					   	  const struct tda665x_config *config,
++						  struct i2c_adapter *i2c)
++{
++	printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__);
++	return NULL;
++}
++
++#endif /* CONFIG_DVB_TDA665x */
++
++#endif /* __TDA665x_H */
+diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
+index 749e3f3..01a9ff0 100644
+--- a/drivers/media/dvb/mantis/hopper_cards.c
++++ b/drivers/media/dvb/mantis/hopper_cards.c
+@@ -219,7 +219,6 @@ static void __devexit hopper_pci_remove(struct pci_dev *pdev)
+ 	struct mantis_pci *mantis = pci_get_drvdata(pdev);
+ 
+ 	if (mantis) {
+-//		mantis_uart_exit(mantis);
+ 		mantis_dvb_exit(mantis);
+ 		mantis_dma_exit(mantis);
+ 		mantis_i2c_exit(mantis);
+diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
+index d486c7f..638177c 100644
+--- a/drivers/media/dvb/mantis/mantis_cards.c
++++ b/drivers/media/dvb/mantis/mantis_cards.c
+@@ -50,7 +50,6 @@ static char *label[10] = {
+ 	"RACK"
+ };
+ 
+-
+ static irqreturn_t mantis_irq_handler(int irq, void *dev_id)
+ {
+ 	u32 stat = 0, mask = 0, lstat = 0, mstat = 0;
+@@ -199,6 +198,14 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_dev
+ 
+ 	return err;
+ 
++fail7:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis UART exit! <%d>", err);
++	mantis_uart_exit(mantis);
++
++fail6:
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis CA exit! <%d>", err);
++	mantis_ca_exit(mantis);
++
+ fail5:
+ 	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB exit! <%d>", err);
+ 	mantis_dvb_exit(mantis);
+@@ -228,8 +235,6 @@ static void __devexit mantis_pci_remove(struct pci_dev *pdev)
+ 	struct mantis_pci *mantis = pci_get_drvdata(pdev);
+ 
+ 	if (mantis) {
+-		mantis_uart_exit(mantis);
+-//		mantis_ca_exit(mantis);
+ 		mantis_dvb_exit(mantis);
+ 		mantis_dma_exit(mantis);
+ 		mantis_i2c_exit(mantis);
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index 8ebcd96..eab3645 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -153,8 +153,7 @@ int mantis_dma_init(struct mantis_pci *mantis)
+ 	if (mantis_alloc_buffers(mantis) < 0) {
+ 		dprintk(MANTIS_ERROR, 1, "Error allocating DMA buffer");
+ 
+-		// Stop RISC Engine
+-//		mmwrite(mmread(MANTIS_DMA_CTL) & ~MANTIS_RISC_EN, MANTIS_DMA_CTL);
++		/* Stop RISC Engine */
+ 		mmwrite(0, MANTIS_DMA_CTL);
+ 
+ 		goto err;
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index be911d7..42f658b 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -252,14 +252,19 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ err5:
+ 	tasklet_kill(&mantis->tasklet);
+ 	dvb_net_release(&mantis->dvbnet);
++
+ err4:
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
++
+ err3:
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
++
+ err2:
+ 	dvb_dmxdev_release(&mantis->dmxdev);
++
+ err1:
+ 	dvb_dmx_release(&mantis->demux);
++
+ err0:
+ 	dvb_unregister_adapter(&mantis->dvb_adapter);
+ 
+@@ -271,21 +276,24 @@ int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+ {
+ 	int err;
+ 
+-	err = mantis_frontend_shutdown(mantis);
+-	if (err != 0)
+-		dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
++	if (mantis->fe) {
++//		mantis_ca_exit(mantis);
++		err = mantis_frontend_shutdown(mantis);
++		if (err != 0)
++			dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
++
++		dvb_unregister_frontend(mantis->fe);
++	}
+ 
+-//	mantis_ca_exit(mantis);
+ 	tasklet_kill(&mantis->tasklet);
+ 	dvb_net_release(&mantis->dvbnet);
++
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_hw);
++
+ 	dvb_dmxdev_release(&mantis->dmxdev);
+ 	dvb_dmx_release(&mantis->demux);
+ 
+-	if (mantis->fe)
+-		dvb_unregister_frontend(mantis->fe);
+-
+ 	dprintk(MANTIS_DEBUG, 1, "dvb_unregister_adapter");
+ 	dvb_unregister_adapter(&mantis->dvb_adapter);
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index ba55f0a..16b9e7e 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -35,38 +35,9 @@
+ 
+ #define I2C_HW_B_MANTIS		0x1c
+ 
+-static int mantis_ack_wait(struct mantis_pci *mantis)
+-{
+-	int rc = 0;
+-	u32 timeout = 0;
+-
+-	if (wait_event_timeout(mantis->i2c_wq,
+-			       mantis->mantis_int_stat & MANTIS_INT_I2CDONE,
+-			       msecs_to_jiffies(50)) == -ERESTARTSYS) {
+-
+-		dprintk(MANTIS_DEBUG, 1, "Master !I2CDONE");
+-		rc = -EREMOTEIO;
+-	}
+-
+-	while (!(mantis->mantis_int_stat & MANTIS_INT_I2CRACK)) {
+-		dprintk(MANTIS_DEBUG, 1, "Waiting for Slave RACK");
+-		mantis->mantis_int_stat = mmread(MANTIS_INT_STAT);
+-		msleep(5);
+-		timeout++;
+-		if (timeout > 500) {
+-			dprintk(MANTIS_ERROR, 1, "Slave RACK Fail !");
+-			rc = -EREMOTEIO;
+-			break;
+-		}
+-	}
+-	udelay(350);
+-
+-	return rc;
+-}
+-
+ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ {
+-	u32 rxd, i;
++	u32 rxd, i, stat, trials;
+ 
+ 	dprintk(MANTIS_INFO, 0, "        %s:  Address=[0x%02x] <R>[ ",
+ 		__func__, msg->addr);
+@@ -82,10 +53,15 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ 
+ 		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
+ 		mmwrite(rxd, MANTIS_I2CDATA_CTL);
+-		if (mantis_ack_wait(mantis) != 0) {
+-			dprintk(MANTIS_DEBUG, 1, "ACK failed<R>");
+-			return -EREMOTEIO;
++
++		/* wait for xfer completion */
++		for (trials = 0; trials < 100; trials++) {
++			udelay(500);
++			stat = mmread(MANTIS_INT_STAT);
++			if (stat & MANTIS_INT_I2CDONE)
++				break;
+ 		}
++
+ 		rxd = mmread(MANTIS_I2CDATA_CTL);
+ 		msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
+ 		dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+@@ -98,7 +74,7 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ {
+ 	int i;
+-	u32 txd = 0;
++	u32 txd = 0, stat, trials;
+ 
+ 	dprintk(MANTIS_INFO, 0, "        %s: Address=[0x%02x] <W>[ ",
+ 		__func__, msg->addr);
+@@ -115,9 +91,13 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 
+ 		mmwrite(MANTIS_INT_I2CDONE, MANTIS_INT_STAT);
+ 		mmwrite(txd, MANTIS_I2CDATA_CTL);
+-		if (mantis_ack_wait(mantis) != 0) {
+-			dprintk(MANTIS_DEBUG, 1, "ACK failed<W>");
+-			return -EREMOTEIO;
++
++		/* wait for xfer completion */
++		for (trials = 0; trials < 100; trials++) {
++			udelay(500);
++			stat = mmread(MANTIS_INT_STAT);
++			if (stat & MANTIS_INT_I2CDONE)
++				break;
+ 		}
+ 	}
+ 	dprintk(MANTIS_INFO, 0, "]\n");
+@@ -127,20 +107,77 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 
+ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
+ {
+-	int ret = 0, i;
++	int ret = 0, i = 0, trials;
++	u32 stat, data, txd;
+ 	struct mantis_pci *mantis;
++	struct mantis_hwconfig *config;
+ 
+ 	mantis = i2c_get_adapdata(adapter);
++	BUG_ON(!mantis);
++	config = mantis->hwconfig;
++	BUG_ON(!config);
++
++	dprintk(MANTIS_DEBUG, 1, "Messages:%d", num);
+ 	mutex_lock(&mantis->i2c_lock);
+-	for (i = 0; i < num; i++) {
+-		if (msgs[i].flags & I2C_M_RD)
+-			ret = mantis_i2c_read(mantis, &msgs[i]);
+-		else
+-			ret = mantis_i2c_write(mantis, &msgs[i]);
+-
+-		if (ret < 0)
+-			goto bail_out;
++
++	while (i < num) {
++		/* Byte MODE */
++		if (((i + 1) < num)		&&
++			(msgs[i].len < 2)	&&
++			(msgs[i + 1].len < 2)	&&
++			(msgs[i + 1].flags & I2C_M_RD)) {
++
++			dprintk(MANTIS_DEBUG, 0, "        Byte MODE:\n");
++
++			/* Read operation */
++			txd = msgs[i].addr << 25 | (0x1 << 24)
++						 | (msgs[i].buf[0] << 16)
++						 | MANTIS_I2C_RATE_3;
++
++			mmwrite(txd, MANTIS_I2CDATA_CTL);
++			/* wait for xfer completion */
++			for (trials = 0; trials < 100; trials++) {
++				udelay(500);
++				stat = mmread(MANTIS_INT_STAT);
++				if (stat & MANTIS_INT_I2CDONE)
++					break;
++			}
++
++			/* check for xfer completion */
++			if (stat & MANTIS_INT_I2CDONE) {
++				/* check xfer was acknowledged */
++				if (stat & MANTIS_INT_I2CRACK) {
++					data = mmread(MANTIS_I2CDATA_CTL);
++					msgs[i + 1].buf[0] = (data >> 8) & 0xff;
++					dprintk(MANTIS_DEBUG, 0, "        Byte <%d> RXD=0x%02x  [%02x]\n", 0x0, data, msgs[i + 1].buf[0]);
++				} else {
++					/* I/O error */
++					dprintk(MANTIS_ERROR, 1, "        I/O error, LINE:%d", __LINE__);
++					ret = -EIO;
++					break;
++				}
++			} else {
++				/* I/O error */
++				dprintk(MANTIS_ERROR, 1, "        I/O error, LINE:%d", __LINE__);
++				ret = -EIO;
++				break;
++			}
++			i += 2; /* Write/Read operation in one go */
++		}
++
++		if (i < num) {
++			if (msgs[i].flags & I2C_M_RD)
++				ret = mantis_i2c_read(mantis, &msgs[i]);
++			else
++				ret = mantis_i2c_write(mantis, &msgs[i]);
++
++			i++;
++			if (ret < 0)
++				goto bail_out;
++		}
++
+ 	}
++
+ 	mutex_unlock(&mantis->i2c_lock);
+ 
+ 	return num;
+@@ -189,9 +226,9 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ 	intstat = mmread(MANTIS_INT_STAT);
+ 	intmask = mmread(MANTIS_INT_MASK);
+ 	mmwrite(intstat, MANTIS_INT_STAT);
+-	mmwrite(intmask | MANTIS_INT_I2CDONE, MANTIS_INT_MASK);
+-
+-	dprintk(MANTIS_DEBUG, 1, "Status=<%02x> Mask=<%02x>", intstat, intmask);
++	dprintk(MANTIS_DEBUG, 1, "Disabling I2C interrupt");
++	intmask = mmread(MANTIS_INT_MASK);
++	mmwrite((intmask & ~MANTIS_INT_I2CDONE), MANTIS_INT_MASK);
+ 
+ 	return 0;
+ }
+@@ -199,6 +236,12 @@ EXPORT_SYMBOL_GPL(mantis_i2c_init);
+ 
+ int __devexit mantis_i2c_exit(struct mantis_pci *mantis)
+ {
++	u32 intmask;
++
++	dprintk(MANTIS_DEBUG, 1, "Disabling I2C interrupt");
++	intmask = mmread(MANTIS_INT_MASK);
++	mmwrite((intmask & ~MANTIS_INT_I2CDONE), MANTIS_INT_MASK);
++
+ 	dprintk(MANTIS_DEBUG, 1, "Removing I2C adapter");
+ 	return i2c_del_adapter(&mantis->adapter);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.h b/drivers/media/dvb/mantis/mantis_i2c.h
+index 1e49ecf..d40da4f 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.h
++++ b/drivers/media/dvb/mantis/mantis_i2c.h
+@@ -1,6 +1,9 @@
+ #ifndef __MANTIS_I2C_H
+ #define __MANTIS_I2C_H
+ 
++#define I2C_STOP		(1 <<  0)
++#define I2C_READ		(1 <<  1)
++
+ extern int mantis_i2c_init(struct mantis_pci *mantis);
+ extern int mantis_i2c_exit(struct mantis_pci *mantis);
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_ioc.c b/drivers/media/dvb/mantis/mantis_ioc.c
+index 4700088..448e2c3 100644
+--- a/drivers/media/dvb/mantis/mantis_ioc.c
++++ b/drivers/media/dvb/mantis/mantis_ioc.c
+@@ -36,13 +36,14 @@
+ #include "mantis_reg.h"
+ #include "mantis_ioc.h"
+ 
+-static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
++static int read_eeprom_bytes(struct mantis_pci *mantis, u8 reg, u8 *data, u8 length)
+ {
+ 	struct i2c_adapter *adapter = &mantis->adapter;
+-
+ 	int err;
++	u8 buf = reg;
++
+ 	struct i2c_msg msg[] = {
+-		{ .addr = 0x50, .flags = 0, .buf = data, .len = 1 },
++		{ .addr = 0x50, .flags = 0, .buf = &buf, .len = 1 },
+ 		{ .addr = 0x50, .flags = I2C_M_RD, .buf = data, .len = length },
+ 	};
+ 
+@@ -56,32 +57,12 @@ static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ 
+ 	return 0;
+ }
+-
+-static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+-{
+-	struct i2c_adapter *adapter = &mantis->adapter;
+-	int err;
+-
+-	struct i2c_msg msg = { .addr = 0x50, .flags = 0, .buf = data, .len = length };
+-
+-	err = i2c_transfer(adapter, &msg, 1);
+-	if (err < 0) {
+-		dprintk(MANTIS_ERROR, 1, "ERROR: i2c write: < err=%i length=0x%02x d0=0x%02x, d1=0x%02x >",
+-			err, length, data[0], data[1]);
+-
+-		return err;
+-	}
+-
+-	return 0;
+-}
+-
+ int mantis_get_mac(struct mantis_pci *mantis)
+ {
+ 	int err;
++	u8 mac_addr[6] = {0};
+ 
+-	mantis->mac_address[0] = 0x08;
+-
+-	err = read_eeprom_byte(mantis, &mantis->mac_address[0], 6);
++	err = read_eeprom_bytes(mantis, 0x08, mac_addr, 6);
+ 	if (err < 0) {
+ 		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis EEPROM read error <%d>", err);
+ 
+@@ -90,9 +71,12 @@ int mantis_get_mac(struct mantis_pci *mantis)
+ 
+ 	dprintk(MANTIS_ERROR, 0,
+ 		"    MAC Address=[%02x:%02x:%02x:%02x:%02x:%02x]\n",
+-		mantis->mac_address[0], mantis->mac_address[1],
+-		mantis->mac_address[2],	mantis->mac_address[3],
+-		mantis->mac_address[4], mantis->mac_address[5]);
++		mac_addr[0],
++		mac_addr[1],
++		mac_addr[2],
++		mac_addr[3],
++		mac_addr[4],
++		mac_addr[5]);
+ 
+ 	return 0;
+ }
+@@ -103,12 +87,14 @@ void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
+ {
+ 	u32 cur;
+ 
++	dprintk(MANTIS_DEBUG, 1, "Set Bit <%d> to <%d>", bitpos, value);
+ 	cur = mmread(MANTIS_GPIF_ADDR);
+ 	if (value)
+ 		mantis->gpio_status = cur | (1 << bitpos);
+ 	else
+ 		mantis->gpio_status = cur & (~(1 << bitpos));
+ 
++	dprintk(MANTIS_DEBUG, 1, "GPIO Value <%02x>", mantis->gpio_status);
+ 	mmwrite(mantis->gpio_status, MANTIS_GPIF_ADDR);
+ 	mmwrite(0x00, MANTIS_GPIF_DOUT);
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index 4b974ee..9efcfa7 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -30,46 +30,41 @@
+ #include "dvb_net.h"
+ 
+ #include "zl10353.h"
++#include "tda665x.h"
+ #include "mantis_common.h"
++#include "mantis_ioc.h"
++#include "mantis_dvb.h"
+ #include "mantis_vp3030.h"
+ 
+ struct zl10353_config mantis_vp3030_config = {
+-	.demod_address	= 0x0f,
++	.demod_address		= 0x0f,
++};
++
++struct tda665x_config env57h12d5_config = {
++	.name			= "ENV57H12D5 (ET-50DT)",
++	.addr			= 0x60,
++	.frequency_min		=  47000000,
++	.frequency_max		= 862000000,
++	.frequency_offst	=   3616667,
++	.ref_multiplier		= 6, /* 1/6 MHz */
++	.ref_divider		= 100000, /* 1/6 MHz */
+ };
+ 
+ #define MANTIS_MODEL_NAME	"VP-3030"
+ #define MANTIS_DEV_TYPE		"DVB-T"
+ 
+-int panasonic_en57h12d5_set_params(struct dvb_frontend *fe,
+-				   struct dvb_frontend_parameters *params)
+-{
+-	u8 buf[4];
+-	int rc;
+-	struct mantis_pci *mantis = fe->dvb->priv;
+-
+-	struct i2c_msg tuner_msg = {
+-		.addr = 0x60,
+-		.flags = 0,
+-		.buf = buf,
+-		.len = sizeof (buf)
+-	};
+-
+-	if ((params->frequency < 950000) || (params->frequency > 2150000))
+-		return -EINVAL;
+-	rc = i2c_transfer(&mantis->adapter, &tuner_msg, 1);
+-	if (rc != 1) {
+-		printk("%s: I2C Transfer returned [%d]\n", __func__, rc);
+-		return -EIO;
+-	}
+-	msleep_interruptible(1);
+-	printk("%s: Send params to tuner ok!!!\n", __func__);
+-
+-	return 0;
+-}
+ 
+ static int vp3030_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
+ {
+ 	struct i2c_adapter *adapter	= &mantis->adapter;
++	struct mantis_hwconfig *config	= mantis->hwconfig;
++	int err = 0;
++
++	gpio_set_bits(mantis, config->reset, 0);
++	msleep(100);
++	err = mantis_frontend_power(mantis, POWER_ON);
++	msleep(100);
++	gpio_set_bits(mantis, config->reset, 1);
+ 
+ 	dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
+ 	fe = zl10353_attach(&mantis_vp3030_config, adapter);
+@@ -77,6 +72,7 @@ static int vp3030_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
+ 	if (!fe)
+ 		return -1;
+ 
++	tda665x_attach(fe, &env57h12d5_config, adapter);
+ 	mantis->fe = fe;
+ 	dprintk(MANTIS_ERROR, 1, "Done!");
+ 
+@@ -93,4 +89,6 @@ struct mantis_hwconfig vp3030_config = {
+ 	.bytes		= 0,
+ 
+ 	.frontend_init	= vp3030_frontend_init,
++	.power		= GPIF_A12,
++	.reset		= GPIF_A13,
+ };
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0098-V4L-DVB-13798-Mantis-Enable-power-for-all-cards-use-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0098-V4L-DVB-13798-Mantis-Enable-power-for-all-cards-use-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,546 @@
+From bed5750526eb93a1e12733dd2c4d6baba0299cc5 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 05:57:28 -0300
+Subject: [PATCH 098/120] V4L/DVB (13798): [Mantis] Enable power for all cards, use byte mode only on relevant devices
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit bc832fa2c0310c25ed60204616ccef4f8db088f3)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/hopper_vp3028.c |   27 ++++++++++++----
+ drivers/media/dvb/mantis/mantis_common.h |   13 ++++++--
+ drivers/media/dvb/mantis/mantis_i2c.c    |   47 +++++++++++++++++++++------
+ drivers/media/dvb/mantis/mantis_vp1033.c |   36 ++++++++++++++++-----
+ drivers/media/dvb/mantis/mantis_vp1034.c |   32 ++++++++++++++-----
+ drivers/media/dvb/mantis/mantis_vp2033.c |   50 ++++++++++++++++++++---------
+ drivers/media/dvb/mantis/mantis_vp2040.c |   51 ++++++++++++++++++++----------
+ drivers/media/dvb/mantis/mantis_vp3030.c |   22 ++++++++++---
+ 8 files changed, 203 insertions(+), 75 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/hopper_vp3028.c b/drivers/media/dvb/mantis/hopper_vp3028.c
+index ba0c7e5..16b39d3 100644
+--- a/drivers/media/dvb/mantis/hopper_vp3028.c
++++ b/drivers/media/dvb/mantis/hopper_vp3028.c
+@@ -45,17 +45,30 @@ struct zl10353_config hopper_vp3028_config = {
+ static int vp3028_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *fe)
+ {
+ 	struct i2c_adapter *adapter	= &mantis->adapter;
++	struct mantis_hwconfig *config	= mantis->hwconfig;
+ 	int err = 0;
+ 
++	gpio_set_bits(mantis, config->reset, 0);
++	msleep(100);
+ 	err = mantis_frontend_power(mantis, POWER_ON);
+-	mantis_frontend_soft_reset(mantis);
+-
+-	dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
+-	fe = zl10353_attach(&hopper_vp3028_config, adapter);
+-
+-	if (!fe)
+-		return -1;
++	msleep(100);
++	gpio_set_bits(mantis, config->reset, 1);
+ 
++	err = mantis_frontend_power(mantis, POWER_ON);
++	if (err == 0) {
++		msleep(250);
++		dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
++		fe = zl10353_attach(&hopper_vp3028_config, adapter);
++
++		if (!fe)
++			return -1;
++	} else {
++		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
++			adapter->name,
++			err);
++
++		return -EIO;
++	}
+ 	dprintk(MANTIS_ERROR, 1, "Done!");
+ 
+ 	return 0;
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index e912c59..6ae3aab 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -32,6 +32,7 @@
+ #define MANTIS_NOTICE		1
+ #define MANTIS_INFO		2
+ #define MANTIS_DEBUG		3
++#define MANTIS_TMG		9
+ 
+ #define dprintk(y, z, format, arg...) do {								\
+ 	if (z) {											\
+@@ -43,6 +44,8 @@
+ 			printk(KERN_INFO "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
+ 		else if ((mantis->verbose > MANTIS_DEBUG) && (mantis->verbose > y))			\
+ 			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
++		else if ((mantis->verbose > MANTIS_TMG) && (mantis->verbose > y))			\
++			printk(KERN_DEBUG "%s (%d): " format "\n" , __func__ , mantis->num , ##arg);	\
+ 	} else {											\
+ 		if (mantis->verbose > y)								\
+ 			printk(format , ##arg);								\
+@@ -54,9 +57,6 @@
+ 
+ #define mmwrite(dat, addr)	mwrite((dat), (mantis->mmio + (addr)))
+ #define mmread(addr)		mread(mantis->mmio + (addr))
+-#define mmand(dat, addr)	mmwrite((dat) & mmread(addr), addr)
+-#define mmor(dat, addr)		mmwrite((dat) | mmread(addr), addr)
+-#define mmaor(dat, addr)	mmwrite((dat) | ((mask) & mmread(addr)), addr)
+ 
+ #define MANTIS_TS_188		0
+ #define MANTIS_TS_204		1
+@@ -75,6 +75,11 @@
+ 		.driver_data	= (unsigned long) (__configptr)		\
+ }
+ 
++enum mantis_i2c_mode {
++	MANTIS_PAGE_MODE = 0,
++	MANTIS_BYTE_MODE,
++};
++
+ struct mantis_pci;
+ 
+ struct mantis_hwconfig {
+@@ -91,6 +96,8 @@ struct mantis_hwconfig {
+ 
+ 	u8			power;
+ 	u8			reset;
++
++	enum mantis_i2c_mode	i2c_mode;
+ };
+ 
+ struct mantis_pci {
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 16b9e7e..758f32a 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -35,6 +35,8 @@
+ 
+ #define I2C_HW_B_MANTIS		0x1c
+ 
++#define TRIALS			10000
++
+ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ {
+ 	u32 rxd, i, stat, trials;
+@@ -55,13 +57,25 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ 		mmwrite(rxd, MANTIS_I2CDATA_CTL);
+ 
+ 		/* wait for xfer completion */
+-		for (trials = 0; trials < 100; trials++) {
+-			udelay(500);
++		for (trials = 0; trials < TRIALS; trials++) {
++			msleep(1);
+ 			stat = mmread(MANTIS_INT_STAT);
+ 			if (stat & MANTIS_INT_I2CDONE)
+ 				break;
+ 		}
+ 
++		dprintk(MANTIS_TMG, 0, "I2CDONE: trials=%d\n", trials);
++
++		/* wait for xfer completion */
++		for (trials = 0; trials < TRIALS; trials++) {
++			stat = mmread(MANTIS_INT_STAT);
++			if (stat & MANTIS_INT_I2CRACK)
++				break;
++			msleep(1);
++		}
++
++		dprintk(MANTIS_TMG, 0, "I2CRACK: trials=%d\n", trials);
++
+ 		rxd = mmread(MANTIS_I2CDATA_CTL);
+ 		msg->buf[i] = (u8)((rxd >> 8) & 0xFF);
+ 		dprintk(MANTIS_INFO, 0, "%02x ", msg->buf[i]);
+@@ -93,12 +107,24 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 		mmwrite(txd, MANTIS_I2CDATA_CTL);
+ 
+ 		/* wait for xfer completion */
+-		for (trials = 0; trials < 100; trials++) {
+-			udelay(500);
++		for (trials = 0; trials < TRIALS; trials++) {
++			msleep(1);
+ 			stat = mmread(MANTIS_INT_STAT);
+ 			if (stat & MANTIS_INT_I2CDONE)
+ 				break;
+ 		}
++
++		dprintk(MANTIS_TMG, 0, "I2CDONE: trials=%d\n", trials);
++
++		/* wait for xfer completion */
++		for (trials = 0; trials < TRIALS; trials++) {
++			stat = mmread(MANTIS_INT_STAT);
++			if (stat & MANTIS_INT_I2CRACK)
++				break;
++			msleep(1);
++		}
++
++		dprintk(MANTIS_TMG, 0, "I2CRACK: trials=%d\n", trials);
+ 	}
+ 	dprintk(MANTIS_INFO, 0, "]\n");
+ 
+@@ -122,10 +148,11 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
+ 
+ 	while (i < num) {
+ 		/* Byte MODE */
+-		if (((i + 1) < num)		&&
+-			(msgs[i].len < 2)	&&
+-			(msgs[i + 1].len < 2)	&&
+-			(msgs[i + 1].flags & I2C_M_RD)) {
++		if ((config->i2c_mode & MANTIS_BYTE_MODE) &&
++		    ((i + 1) < num)			&&
++		    (msgs[i].len < 2)			&&
++		    (msgs[i + 1].len < 2)		&&
++		    (msgs[i + 1].flags & I2C_M_RD)) {
+ 
+ 			dprintk(MANTIS_DEBUG, 0, "        Byte MODE:\n");
+ 
+@@ -136,8 +163,8 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
+ 
+ 			mmwrite(txd, MANTIS_I2CDATA_CTL);
+ 			/* wait for xfer completion */
+-			for (trials = 0; trials < 100; trials++) {
+-				udelay(500);
++			for (trials = 0; trials < TRIALS; trials++) {
++				msleep(1);
+ 				stat = mmread(MANTIS_INT_STAT);
+ 				if (stat & MANTIS_INT_I2CDONE)
+ 					break;
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index f2092ce..0bea6e8 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -31,7 +31,10 @@
+ 
+ #include "stv0299.h"
+ #include "mantis_common.h"
++#include "mantis_ioc.h"
++#include "mantis_dvb.h"
+ #include "mantis_vp1033.h"
++#include "mantis_reg.h"
+ 
+ u8 lgtdqcs001f_inittab[] = {
+ 	0x01, 0x15,
+@@ -163,19 +166,32 @@ static int vp1033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
+ {
+ 	struct i2c_adapter *adapter	= &mantis->adapter;
+ 
+-	dprintk(MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
+-	fe = stv0299_attach(&lgtdqcs001f_config, adapter);
++	int err = 0;
+ 
+-	if (fe) {
+-		fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set;
+-		dprintk(MANTIS_ERROR, 1, "found STV0299 DVB-S frontend @ 0x%02x",
+-			lgtdqcs001f_config.demod_address);
++	err = mantis_frontend_power(mantis, POWER_ON);
++	if (err == 0) {
++		mantis_frontend_soft_reset(mantis);
++		msleep(250);
+ 
+-		dprintk(MANTIS_ERROR, 1, "Mantis DVB-S STV0299 frontend attach success");
++		dprintk(MANTIS_ERROR, 1, "Probing for STV0299 (DVB-S)");
++		fe = stv0299_attach(&lgtdqcs001f_config, adapter);
++
++		if (fe) {
++			fe->ops.tuner_ops.set_params = lgtdqcs001f_tuner_set;
++			dprintk(MANTIS_ERROR, 1, "found STV0299 DVB-S frontend @ 0x%02x",
++				lgtdqcs001f_config.demod_address);
++
++			dprintk(MANTIS_ERROR, 1, "Mantis DVB-S STV0299 frontend attach success");
++		} else {
++			return -1;
++		}
+ 	} else {
+-		return -1;
+-	}
++		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
++			adapter->name,
++			err);
+ 
++		return -EIO;
++	}
+ 	mantis->fe = fe;
+ 	dprintk(MANTIS_ERROR, 1, "Done!");
+ 
+@@ -192,4 +208,6 @@ struct mantis_hwconfig vp1033_config = {
+ 	.bytes			= 0,
+ 
+ 	.frontend_init		= vp1033_frontend_init,
++	.power			= GPIF_A12,
++	.reset			= GPIF_A13,
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index 40778ec..98a4ec8 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -32,6 +32,7 @@
+ #include "mb86a16.h"
+ #include "mantis_common.h"
+ #include "mantis_ioc.h"
++#include "mantis_dvb.h"
+ #include "mantis_vp1034.h"
+ #include "mantis_reg.h"
+ 
+@@ -74,17 +75,30 @@ static int vp1034_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
+ {
+ 	struct i2c_adapter *adapter	= &mantis->adapter;
+ 
+-	dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
+-	fe = mb86a16_attach(&vp1034_mb86a16_config, adapter);
+-	if (fe) {
+-		dprintk(MANTIS_ERROR, 1,
+-		"found MB86A16 DVB-S/DSS frontend @0x%02x",
+-		vp1034_mb86a16_config.demod_address);
++	int err = 0;
+ 
++	err = mantis_frontend_power(mantis, POWER_ON);
++	if (err == 0) {
++		mantis_frontend_soft_reset(mantis);
++		msleep(250);
++
++		dprintk(MANTIS_ERROR, 1, "Probing for MB86A16 (DVB-S/DSS)");
++		fe = mb86a16_attach(&vp1034_mb86a16_config, adapter);
++		if (fe) {
++			dprintk(MANTIS_ERROR, 1,
++			"found MB86A16 DVB-S/DSS frontend @0x%02x",
++			vp1034_mb86a16_config.demod_address);
++
++		} else {
++			return -1;
++		}
+ 	} else {
+-		return -1;
+-	}
++		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
++			adapter->name,
++			err);
+ 
++		return -EIO;
++	}
+ 	mantis->fe = fe;
+ 	dprintk(MANTIS_ERROR, 1, "Done!");
+ 
+@@ -101,4 +115,6 @@ struct mantis_hwconfig vp1034_config = {
+ 	.bytes		= 0,
+ 
+ 	.frontend_init	= vp1034_frontend_init,
++	.power		= GPIF_A12,
++	.reset		= GPIF_A13,
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index 8773291..cef108c 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -31,6 +31,8 @@
+ 
+ #include "tda1002x.h"
+ #include "mantis_common.h"
++#include "mantis_ioc.h"
++#include "mantis_dvb.h"
+ #include "mantis_vp2033.h"
+ 
+ #define MANTIS_MODEL_NAME	"VP-2033"
+@@ -123,32 +125,46 @@ static int vp2033_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
+ {
+ 	struct i2c_adapter *adapter = &mantis->adapter;
+ 
+-	dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+-	fe = tda10021_attach(&vp2033_tda1002x_cu1216_config,
+-			     adapter,
+-			     read_pwm(mantis));
++	int err = 0;
+ 
+-	if (fe) {
+-		dprintk(MANTIS_ERROR, 1,
+-			"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
+-			vp2033_tda1002x_cu1216_config.demod_address);
+-	} else {
+-		fe = tda10023_attach(&vp2033_tda10023_cu1216_config,
++	err = mantis_frontend_power(mantis, POWER_ON);
++	if (err == 0) {
++		mantis_frontend_soft_reset(mantis);
++		msleep(250);
++
++		dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
++		fe = tda10021_attach(&vp2033_tda1002x_cu1216_config,
+ 				     adapter,
+ 				     read_pwm(mantis));
+ 
+ 		if (fe) {
+ 			dprintk(MANTIS_ERROR, 1,
+-				"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++				"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
+ 				vp2033_tda1002x_cu1216_config.demod_address);
++		} else {
++			fe = tda10023_attach(&vp2033_tda10023_cu1216_config,
++					     adapter,
++					     read_pwm(mantis));
++
++			if (fe) {
++				dprintk(MANTIS_ERROR, 1,
++					"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++					vp2033_tda1002x_cu1216_config.demod_address);
++			}
+ 		}
+-	}
+ 
+-	if (fe) {
+-		fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
+-		dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
++		if (fe) {
++			fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
++			dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
++		} else {
++			return -1;
++		}
+ 	} else {
+-		return -1;
++		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
++			adapter->name,
++			err);
++
++		return -EIO;
+ 	}
+ 
+ 	mantis->fe = fe;
+@@ -167,4 +183,6 @@ struct mantis_hwconfig vp2033_config = {
+ 	.bytes		= 0,
+ 
+ 	.frontend_init	= vp2033_frontend_init,
++	.power		= GPIF_A12,
++	.reset		= GPIF_A13,
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
+index 51b082f..e201988 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.c
++++ b/drivers/media/dvb/mantis/mantis_vp2040.c
+@@ -31,6 +31,8 @@
+ 
+ #include "tda1002x.h"
+ #include "mantis_common.h"
++#include "mantis_ioc.h"
++#include "mantis_dvb.h"
+ #include "mantis_vp2040.h"
+ 
+ #define MANTIS_MODEL_NAME	"VP-2040"
+@@ -123,34 +125,47 @@ static int vp2040_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
+ {
+ 	struct i2c_adapter *adapter = &mantis->adapter;
+ 
+-	dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
+-	fe = tda10021_attach(&vp2040_tda1002x_cu1216_config,
+-			     adapter,
+-			     read_pwm(mantis));
++	int err = 0;
+ 
+-	if (fe) {
+-		dprintk(MANTIS_ERROR, 1,
+-			"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
+-			vp2040_tda1002x_cu1216_config.demod_address);
+-	} else {
+-		fe = tda10023_attach(&vp2040_tda10023_cu1216_config,
++	err = mantis_frontend_power(mantis, POWER_ON);
++	if (err == 0) {
++		mantis_frontend_soft_reset(mantis);
++		msleep(250);
++
++		dprintk(MANTIS_ERROR, 1, "Probing for CU1216 (DVB-C)");
++		fe = tda10021_attach(&vp2040_tda1002x_cu1216_config,
+ 				     adapter,
+ 				     read_pwm(mantis));
+ 
+ 		if (fe) {
+ 			dprintk(MANTIS_ERROR, 1,
+-				"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++				"found Philips CU1216 DVB-C frontend (TDA10021) @ 0x%02x",
+ 				vp2040_tda1002x_cu1216_config.demod_address);
++		} else {
++			fe = tda10023_attach(&vp2040_tda10023_cu1216_config,
++					     adapter,
++					     read_pwm(mantis));
++
++			if (fe) {
++				dprintk(MANTIS_ERROR, 1,
++					"found Philips CU1216 DVB-C frontend (TDA10023) @ 0x%02x",
++					vp2040_tda1002x_cu1216_config.demod_address);
++			}
+ 		}
+-	}
+ 
+-	if (fe) {
+-		fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
+-		dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
++		if (fe) {
++			fe->ops.tuner_ops.set_params = tda1002x_cu1216_tuner_set;
++			dprintk(MANTIS_ERROR, 1, "Mantis DVB-C Philips CU1216 frontend attach success");
++		} else {
++			return -1;
++		}
+ 	} else {
+-		return -1;
+-	}
++		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
++			adapter->name,
++			err);
+ 
++		return -EIO;
++	}
+ 	mantis->fe = fe;
+ 	dprintk(MANTIS_DEBUG, 1, "Done!");
+ 
+@@ -167,4 +182,6 @@ struct mantis_hwconfig vp2040_config = {
+ 	.bytes		= 0,
+ 
+ 	.frontend_init	= vp2040_frontend_init,
++	.power		= GPIF_A12,
++	.reset		= GPIF_A13,
+ };
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index 9efcfa7..a44fac3 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -66,13 +66,23 @@ static int vp3030_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
+ 	msleep(100);
+ 	gpio_set_bits(mantis, config->reset, 1);
+ 
+-	dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
+-	fe = zl10353_attach(&mantis_vp3030_config, adapter);
++	if (err == 0) {
++		msleep(250);
++		dprintk(MANTIS_ERROR, 1, "Probing for 10353 (DVB-T)");
++		fe = zl10353_attach(&mantis_vp3030_config, adapter);
+ 
+-	if (!fe)
+-		return -1;
++		if (!fe)
++			return -1;
+ 
+-	tda665x_attach(fe, &env57h12d5_config, adapter);
++		tda665x_attach(fe, &env57h12d5_config, adapter);
++	} else {
++		dprintk(MANTIS_ERROR, 1, "Frontend on <%s> POWER ON failed! <%d>",
++			adapter->name,
++			err);
++
++		return -EIO;
++
++	}
+ 	mantis->fe = fe;
+ 	dprintk(MANTIS_ERROR, 1, "Done!");
+ 
+@@ -91,4 +101,6 @@ struct mantis_hwconfig vp3030_config = {
+ 	.frontend_init	= vp3030_frontend_init,
+ 	.power		= GPIF_A12,
+ 	.reset		= GPIF_A13,
++
++	.i2c_mode	= MANTIS_BYTE_MODE
+ };
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0099-V4L-DVB-13799-Mantis-Unregister-frontend.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0099-V4L-DVB-13799-Mantis-Unregister-frontend.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,43 @@
+From 9d6c22360a60be59a4c7d9d3d102944892f7cd2a Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 09:01:35 -0300
+Subject: [PATCH 099/120] V4L/DVB (13799): [Mantis] Unregister frontend
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 68fe255cd15cf1fe04877fbbb0eafe80c43eff5d)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dvb.c |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 42f658b..9d9c558 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -252,7 +252,8 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ err5:
+ 	tasklet_kill(&mantis->tasklet);
+ 	dvb_net_release(&mantis->dvbnet);
+-
++	dvb_unregister_frontend(mantis->fe);
++	dvb_frontend_detach(mantis->fe);
+ err4:
+ 	mantis->demux.dmx.remove_frontend(&mantis->demux.dmx, &mantis->fe_mem);
+ 
+@@ -281,7 +282,7 @@ int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+ 		err = mantis_frontend_shutdown(mantis);
+ 		if (err != 0)
+ 			dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
+-
++		dvb_frontend_detach(mantis->fe);
+ 		dvb_unregister_frontend(mantis->fe);
+ 	}
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0100-V4L-DVB-13800-Mantis-I2C-optimization.-Required-dela.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0100-V4L-DVB-13800-Mantis-I2C-optimization.-Required-dela.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,66 @@
+From da09e1f2f9a261045f6ebef4f42ad4b6db324846 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 4 Dec 2009 09:02:00 -0300
+Subject: [PATCH 100/120] V4L/DVB (13800): [Mantis] I2C optimization. Required delay is much lesser than 1mS.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Do not wait, keep looping instead.
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 281859179f731b28aae78d13b2e8720219492000)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_i2c.c |    5 -----
+ 1 files changed, 0 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 758f32a..9d2b51d 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -58,7 +58,6 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ 
+ 		/* wait for xfer completion */
+ 		for (trials = 0; trials < TRIALS; trials++) {
+-			msleep(1);
+ 			stat = mmread(MANTIS_INT_STAT);
+ 			if (stat & MANTIS_INT_I2CDONE)
+ 				break;
+@@ -71,7 +70,6 @@ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+ 			stat = mmread(MANTIS_INT_STAT);
+ 			if (stat & MANTIS_INT_I2CRACK)
+ 				break;
+-			msleep(1);
+ 		}
+ 
+ 		dprintk(MANTIS_TMG, 0, "I2CRACK: trials=%d\n", trials);
+@@ -108,7 +106,6 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 
+ 		/* wait for xfer completion */
+ 		for (trials = 0; trials < TRIALS; trials++) {
+-			msleep(1);
+ 			stat = mmread(MANTIS_INT_STAT);
+ 			if (stat & MANTIS_INT_I2CDONE)
+ 				break;
+@@ -121,7 +118,6 @@ static int mantis_i2c_write(struct mantis_pci *mantis, const struct i2c_msg *msg
+ 			stat = mmread(MANTIS_INT_STAT);
+ 			if (stat & MANTIS_INT_I2CRACK)
+ 				break;
+-			msleep(1);
+ 		}
+ 
+ 		dprintk(MANTIS_TMG, 0, "I2CRACK: trials=%d\n", trials);
+@@ -164,7 +160,6 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
+ 			mmwrite(txd, MANTIS_I2CDATA_CTL);
+ 			/* wait for xfer completion */
+ 			for (trials = 0; trials < TRIALS; trials++) {
+-				msleep(1);
+ 				stat = mmread(MANTIS_INT_STAT);
+ 				if (stat & MANTIS_INT_I2CDONE)
+ 					break;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0101-V4L-DVB-13801-MB86A16-Use-the-search-callback.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0101-V4L-DVB-13801-MB86A16-Use-the-search-callback.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,113 @@
+From 15527b2e2f2c129525e130e271ab20f040302ac4 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Tue, 15 Dec 2009 06:15:27 -0300
+Subject: [PATCH 101/120] V4L/DVB (13801): [MB86A16] Use the search callback
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 5dd83a35bea908ebb8243d67d8c251eed2bb5cc8)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c |   45 +++++++++++++++-----------------
+ 1 files changed, 21 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index eddb35b..33387b7 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -1487,16 +1487,19 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 				} else {
+ 					dprintk(verbose, MB86A16_INFO, 1, "NO  -- SYNC");
+ 					SEQ_set(state, 1);
++					ret = -1;
+ 				}
+ 			}
+ 		} else {
+ 			dprintk (verbose, MB86A16_INFO, 1, "NO  -- SIGNAL");
++			ret = -1;
+ 		}
+ 
+ 		sync = sync_chk(state, &junk);
+ 		if (sync) {
+ 			dprintk(verbose, MB86A16_INFO, 1, "******* SYNC *******");
+ 			freqerr_chk(state, state->frequency, state->srate, 1);
++			ret = 0;
+ 			break;
+ 		}
+ 	}
+@@ -1610,33 +1613,21 @@ err:
+ 	return -EREMOTEIO;
+ }
+ 
+-#define MB86A16_FE_ALGO		1
+-
+-static int mb86a16_frontend_algo(struct dvb_frontend *fe)
+-{
+-	return MB86A16_FE_ALGO;
+-}
+-
+-static int mb86a16_set_frontend(struct dvb_frontend *fe,
+-				struct dvb_frontend_parameters *p,
+-				unsigned int mode_flags,
+-				int *delay,
+-				fe_status_t *status)
++static enum dvbfe_search mb86a16_search(struct dvb_frontend *fe,
++					struct dvb_frontend_parameters *p)
+ {
+-	int ret = 0;
+ 	struct mb86a16_state *state = fe->demodulator_priv;
+ 
+-	if (p != NULL) {
+-		state->frequency = p->frequency / 1000;
+-		state->srate = p->u.qpsk.symbol_rate / 1000;
+-		ret = mb86a16_set_fe(state);
+-	}
+-	if (!(mode_flags & FE_TUNE_MODE_ONESHOT))
+-		mb86a16_read_status(fe, status);
++	state->frequency = p->frequency / 1000;
++	state->srate = p->u.qpsk.symbol_rate / 1000;
+ 
+-	*delay = HZ/3000;
++	if (!mb86a16_set_fe(state)) {
++		dprintk(verbose, MB86A16_ERROR, 1, "Succesfully acquired LOCK");
++		return DVBFE_ALGO_SEARCH_SUCCESS;
++	}
+ 
+-	return ret;
++	dprintk(verbose, MB86A16_ERROR, 1, "Lock acquisition failed!");
++	return DVBFE_ALGO_SEARCH_FAILED;
+ }
+ 
+ static void mb86a16_release(struct dvb_frontend *fe)
+@@ -1809,6 +1800,11 @@ static int mb86a16_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
+ 	return 0;
+ }
+ 
++static enum dvbfe_algo mb86a16_frontend_algo(struct dvb_frontend *fe)
++{
++	return DVBFE_ALGO_CUSTOM;
++}
++
+ static struct dvb_frontend_ops mb86a16_ops = {
+ 	.info = {
+ 		.name			= "Fujitsu MB86A16 DVB-S",
+@@ -1826,9 +1822,10 @@ static struct dvb_frontend_ops mb86a16_ops = {
+ 					  FE_CAN_FEC_AUTO
+ 	},
+ 	.release			= mb86a16_release,
+-	.tune				= mb86a16_set_frontend,
+-	.read_status			= mb86a16_read_status,
++
+ 	.get_frontend_algo		= mb86a16_frontend_algo,
++	.search				= mb86a16_search,
++	.read_status			= mb86a16_read_status,
+ 	.init				= mb86a16_init,
+ 	.sleep				= mb86a16_sleep,
+ 	.read_status			= mb86a16_read_status,
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0102-V4L-DVB-13802-Mantis-Hopper-Fix-all-build-related-wa.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0102-V4L-DVB-13802-Mantis-Hopper-Fix-all-build-related-wa.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,280 @@
+From f324c94a03ee7aab57ba08fc496354bed5e25568 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Tue, 15 Dec 2009 06:17:54 -0300
+Subject: [PATCH 102/120] V4L/DVB (13802): [Mantis/Hopper] Fix all build related warnings
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 0bdc799b8b82cf61c86604291c53998febc96403)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/hopper_cards.c  |    4 ----
+ drivers/media/dvb/mantis/hopper_vp3028.c |    1 -
+ drivers/media/dvb/mantis/mantis_ca.c     |    1 -
+ drivers/media/dvb/mantis/mantis_cards.c  |   13 -------------
+ drivers/media/dvb/mantis/mantis_dvb.c    |    1 -
+ drivers/media/dvb/mantis/mantis_evm.c    |    1 -
+ drivers/media/dvb/mantis/mantis_hif.c    |   17 -----------------
+ drivers/media/dvb/mantis/mantis_ioc.c    |    1 -
+ drivers/media/dvb/mantis/mantis_pcmcia.c |    1 -
+ drivers/media/dvb/mantis/mantis_uart.c   |    7 +++----
+ drivers/media/dvb/mantis/mantis_vp1033.c |    1 -
+ drivers/media/dvb/mantis/mantis_vp1034.c |    1 -
+ drivers/media/dvb/mantis/mantis_vp1041.c |    1 -
+ drivers/media/dvb/mantis/mantis_vp2033.c |    1 -
+ drivers/media/dvb/mantis/mantis_vp2040.c |    1 -
+ drivers/media/dvb/mantis/mantis_vp3030.c |    1 -
+ 16 files changed, 3 insertions(+), 50 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
+index 01a9ff0..6d5d101 100644
+--- a/drivers/media/dvb/mantis/hopper_cards.c
++++ b/drivers/media/dvb/mantis/hopper_cards.c
+@@ -190,10 +190,6 @@ static int __devinit hopper_pci_probe(struct pci_dev *pdev, const struct pci_dev
+ 
+ 	return err;
+ 
+-fail5:
+-	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB exit! <%d>", err);
+-	mantis_dvb_exit(mantis);
+-
+ fail4:
+ 	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA exit! <%d>", err);
+ 	mantis_dma_exit(mantis);
+diff --git a/drivers/media/dvb/mantis/hopper_vp3028.c b/drivers/media/dvb/mantis/hopper_vp3028.c
+index 16b39d3..76cad87 100644
+--- a/drivers/media/dvb/mantis/hopper_vp3028.c
++++ b/drivers/media/dvb/mantis/hopper_vp3028.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 4151cba..88899ac 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
+index 638177c..0b52f99 100644
+--- a/drivers/media/dvb/mantis/mantis_cards.c
++++ b/drivers/media/dvb/mantis/mantis_cards.c
+@@ -197,19 +197,6 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_dev
+ 	devs++;
+ 
+ 	return err;
+-
+-fail7:
+-	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis UART exit! <%d>", err);
+-	mantis_uart_exit(mantis);
+-
+-fail6:
+-	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis CA exit! <%d>", err);
+-	mantis_ca_exit(mantis);
+-
+-fail5:
+-	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB exit! <%d>", err);
+-	mantis_dvb_exit(mantis);
+-
+ fail4:
+ 	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA exit! <%d>", err);
+ 	mantis_dma_exit(mantis);
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 9d9c558..1e08e31 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -20,7 +20,6 @@
+ #include <linux/kernel.h>
+ #include <linux/bitops.h>
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 2005b24..9304b0e 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -20,7 +20,6 @@
+ 
+ #include <linux/kernel.h>
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index bb05427..73e5ca0 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -22,7 +22,6 @@
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+@@ -40,22 +39,6 @@
+ 
+ #include "mantis_reg.h"
+ 
+-static int mantis_hif_data_available(struct mantis_ca *ca)
+-{
+-	struct mantis_pci *mantis = ca->ca_priv;
+-	int rc = 0;
+-
+-	if (wait_event_interruptible_timeout(ca->hif_data_wq,
+-					     ca->sbuf_status & MANTIS_SBUF_DATA_AVAIL,
+-					     msecs_to_jiffies(500)) == -ERESTARTSYS) {
+-
+-		dprintk(MANTIS_ERROR, 1, "Adapter(%d) Slot(0): HIF Read wait event timeout !", mantis->num);
+-		rc = -EREMOTEIO;
+-	}
+-	ca->sbuf_status &= ~MANTIS_SBUF_DATA_AVAIL;
+-	udelay(2);
+-	return rc;
+-}
+ 
+ static int mantis_hif_sbuf_opdone_wait(struct mantis_ca *ca)
+ {
+diff --git a/drivers/media/dvb/mantis/mantis_ioc.c b/drivers/media/dvb/mantis/mantis_ioc.c
+index 448e2c3..dd66369 100644
+--- a/drivers/media/dvb/mantis/mantis_ioc.c
++++ b/drivers/media/dvb/mantis/mantis_ioc.c
+@@ -21,7 +21,6 @@
+ #include <linux/kernel.h>
+ #include <linux/i2c.h>
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+index 90ca356..d6bca3e 100644
+--- a/drivers/media/dvb/mantis/mantis_pcmcia.c
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -20,7 +20,6 @@
+ 
+ #include <linux/kernel.h>
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_uart.c b/drivers/media/dvb/mantis/mantis_uart.c
+index fb423b0..03b47cf 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.c
++++ b/drivers/media/dvb/mantis/mantis_uart.c
+@@ -26,19 +26,18 @@ struct mantis_uart_params {
+ int mantis_uart_read(struct mantis_pci *mantis, u8 *data)
+ {
+ 	struct mantis_hwconfig *config = mantis->hwconfig;
+-	u32 stat, i;
+-	unsigned long flags;
++	u32 stat = 0, i;
+ 
+ 	/* get data */
+ 	for (i = 0; i < (config->bytes + 1); i++) {
+ 
++		stat = mmread(MANTIS_UART_STAT);
++
+ 		if (stat & MANTIS_UART_RXFIFO_FULL) {
+ 			dprintk(MANTIS_ERROR, 1, "RX Fifo FULL");
+ 		}
+ 		data[i] = mmread(MANTIS_UART_RXD) & 0x3f;
+ 
+-		stat = mmread(MANTIS_UART_STAT);
+-
+ 		dprintk(MANTIS_DEBUG, 1, "Reading ... <%02x>", data[i] & 0x3f);
+ 
+ 		if (data[i] & (1 << 7)) {
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index 0bea6e8..c9760b0 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index 98a4ec8..7ddd149 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index 1181fad..368fc81 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index cef108c..45f7174 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
+index e201988..8471bff 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.c
++++ b/drivers/media/dvb/mantis/mantis_vp2040.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index a44fac3..1895e95 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -18,7 +18,6 @@
+ 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0103-V4L-DVB-13803-Remove-unused-dependency-on-CU1216.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0103-V4L-DVB-13803-Remove-unused-dependency-on-CU1216.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,35 @@
+From c1a744100db3fb31154003bbb220c960312a2db1 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 9 Dec 2009 19:00:33 -0300
+Subject: [PATCH 103/120] V4L/DVB (13803): Remove unused dependency on CU1216
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to Matthias Wachter <mathias at waechter.wiz.at>
+for pointing it out.
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 83dbe82bd7766e5045e6561bd44e22b801e7ad76)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Kconfig |    1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/Kconfig b/drivers/media/dvb/mantis/Kconfig
+index aaf0250..f9219cd 100644
+--- a/drivers/media/dvb/mantis/Kconfig
++++ b/drivers/media/dvb/mantis/Kconfig
+@@ -11,7 +11,6 @@ config DVB_MANTIS
+ 	tristate "MANTIS based cards"
+ 	depends on MANTIS_CORE && DVB_CORE && PCI && I2C
+ 	select DVB_MB86A16
+-	select DVB_CU1216
+ 	select DVB_ZL10353
+ 	select DVB_STV0299
+ 	select DVB_PLL
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0104-V4L-DVB-13804-Remove-unused-I2C-Adapter-ID.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0104-V4L-DVB-13804-Remove-unused-I2C-Adapter-ID.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,41 @@
+From 216a7c10f02f68b1244c635de46c62db57d97841 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 9 Dec 2009 19:27:17 -0300
+Subject: [PATCH 104/120] V4L/DVB (13804): Remove unused I2C Adapter ID
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 0ac6e141eb105f5845eb7066b5279709393b1c78)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_i2c.c |    3 ---
+ 1 files changed, 0 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 9d2b51d..7bb4e78 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -33,8 +33,6 @@
+ #include "mantis_reg.h"
+ #include "mantis_i2c.h"
+ 
+-#define I2C_HW_B_MANTIS		0x1c
+-
+ #define TRIALS			10000
+ 
+ static int mantis_i2c_read(struct mantis_pci *mantis, const struct i2c_msg *msg)
+@@ -234,7 +232,6 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ 	i2c_adapter->class	= I2C_CLASS_TV_DIGITAL;
+ 	i2c_adapter->algo	= &mantis_algo;
+ 	i2c_adapter->algo_data	= NULL;
+-	i2c_adapter->id		= I2C_HW_B_MANTIS;
+ 	i2c_adapter->timeout	= 500;
+ 	i2c_adapter->retries	= 3;
+ 	i2c_adapter->dev.parent	= &pdev->dev;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0105-V4L-DVB-13805-Fix-Unregister-the-frontend-before-det.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0105-V4L-DVB-13805-Fix-Unregister-the-frontend-before-det.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,34 @@
+From 3616fb28fc495609da45b8bc07a51dfe6a144ef6 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Wed, 9 Dec 2009 19:59:26 -0300
+Subject: [PATCH 105/120] V4L/DVB (13805): Fix: Unregister the frontend before detaching
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit c5e598a6f89ca7335db9f327e24e3abd13d137cf)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_dvb.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 1e08e31..54bf4ea 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -281,8 +281,8 @@ int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+ 		err = mantis_frontend_shutdown(mantis);
+ 		if (err != 0)
+ 			dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
+-		dvb_frontend_detach(mantis->fe);
+ 		dvb_unregister_frontend(mantis->fe);
++		dvb_frontend_detach(mantis->fe);
+ 	}
+ 
+ 	tasklet_kill(&mantis->tasklet);
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0106-V4L-DVB-13806-Register-and-Initialize-Remote-control.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0106-V4L-DVB-13806-Register-and-Initialize-Remote-control.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,366 @@
+From d39695d4641b444297e375989ffb2e07f0b810bb Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Fri, 11 Dec 2009 20:41:07 -0300
+Subject: [PATCH 106/120] V4L/DVB (13806): Register and Initialize Remote control
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit a1497357dce240880d984f4b657b54245f739dbc)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Makefile        |    3 +-
+ drivers/media/dvb/mantis/mantis_cards.c  |   14 +++
+ drivers/media/dvb/mantis/mantis_common.h |    2 +
+ drivers/media/dvb/mantis/mantis_input.c  |  147 ++++++++++++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_uart.c   |   55 +++++++++---
+ drivers/media/dvb/mantis/mantis_uart.h   |    3 +-
+ 6 files changed, 209 insertions(+), 15 deletions(-)
+ create mode 100644 drivers/media/dvb/mantis/mantis_input.c
+
+diff --git a/drivers/media/dvb/mantis/Makefile b/drivers/media/dvb/mantis/Makefile
+index 399c901..98dc5cd 100644
+--- a/drivers/media/dvb/mantis/Makefile
++++ b/drivers/media/dvb/mantis/Makefile
+@@ -7,7 +7,8 @@ mantis_core-objs :=	mantis_ioc.o	\
+ 			mantis_evm.o	\
+ 			mantis_hif.o	\
+ 			mantis_ca.o	\
+-			mantis_pcmcia.o
++			mantis_pcmcia.o	\
++			mantis_input.o
+ 
+ mantis-objs	:=	mantis_cards.o	\
+ 			mantis_vp1033.o	\
+diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
+index 0b52f99..f3fefbb 100644
+--- a/drivers/media/dvb/mantis/mantis_cards.c
++++ b/drivers/media/dvb/mantis/mantis_cards.c
+@@ -194,9 +194,21 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_dev
+ 		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DVB initialization failed <%d>", err);
+ 		goto fail4;
+ 	}
++	err = mantis_uart_init(mantis);
++	if (err < 0) {
++		dprintk(MANTIS_ERROR, 1, "ERROR: Mantis UART initialization failed <%d>", err);
++		goto fail6;
++	}
++
+ 	devs++;
+ 
+ 	return err;
++
++
++	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis UART exit! <%d>", err);
++	mantis_uart_exit(mantis);
++
++fail6:
+ fail4:
+ 	dprintk(MANTIS_ERROR, 1, "ERROR: Mantis DMA exit! <%d>", err);
+ 	mantis_dma_exit(mantis);
+@@ -222,6 +234,8 @@ static void __devexit mantis_pci_remove(struct pci_dev *pdev)
+ 	struct mantis_pci *mantis = pci_get_drvdata(pdev);
+ 
+ 	if (mantis) {
++
++		mantis_uart_exit(mantis);
+ 		mantis_dvb_exit(mantis);
+ 		mantis_dma_exit(mantis);
+ 		mantis_i2c_exit(mantis);
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index 6ae3aab..c2d0854 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -170,6 +170,8 @@ struct mantis_pci {
+ 	wait_queue_head_t	uart_wq;
+ 	struct work_struct	uart_work;
+ 	spinlock_t		uart_lock;
++
++	struct input_dev	*rc;
+ };
+ 
+ #define MANTIS_HIF_STATUS	(mantis->gpio_status)
+diff --git a/drivers/media/dvb/mantis/mantis_input.c b/drivers/media/dvb/mantis/mantis_input.c
+new file mode 100644
+index 0000000..9395fcf
+--- /dev/null
++++ b/drivers/media/dvb/mantis/mantis_input.c
+@@ -0,0 +1,147 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
++#include <linux/input.h>
++#include <media/ir-common.h>
++#include <linux/pci.h>
++
++#include "dmxdev.h"
++#include "dvbdev.h"
++#include "dvb_demux.h"
++#include "dvb_frontend.h"
++#include "dvb_net.h"
++
++#include "mantis_common.h"
++#include "mantis_reg.h"
++#include "mantis_uart.h"
++
++static struct ir_scancode mantis_ir_table[] = {
++	{ 0x29, KEY_POWER	},
++	{ 0x28, KEY_FAVORITES	},
++	{ 0x30, KEY_TEXT	},
++	{ 0x17, KEY_INFO	}, // Preview
++	{ 0x23, KEY_EPG		},
++	{ 0x3b, KEY_F22		},// Record List
++	{ 0x3c, KEY_1		},
++	{ 0x3e, KEY_2		},
++	{ 0x39, KEY_3		},
++	{ 0x36, KEY_4		},
++	{ 0x22, KEY_5		},
++	{ 0x20, KEY_6		},
++	{ 0x32, KEY_7		},
++	{ 0x26, KEY_8		},
++	{ 0x24, KEY_9		},
++	{ 0x2a, KEY_0		},
++
++	{ 0x33, KEY_CANCEL	},
++	{ 0x2c, KEY_BACK	},
++	{ 0x15, KEY_CLEAR	},
++	{ 0x3f, KEY_TAB		},
++	{ 0x10, KEY_ENTER	},
++	{ 0x14, KEY_UP		},
++	{ 0x0d, KEY_RIGHT	},
++	{ 0x0e, KEY_DOWN	},
++	{ 0x11, KEY_LEFT	},
++
++	{ 0x21, KEY_VOLUMEUP	},
++	{ 0x35, KEY_VOLUMEDOWN	},
++	{ 0x3d, KEY_CHANNELDOWN	},
++	{ 0x3a, KEY_CHANNELUP	},
++	{ 0x2e, KEY_RECORD	},
++	{ 0x2b, KEY_PLAY	},
++	{ 0x13, KEY_PAUSE	},
++	{ 0x25, KEY_STOP	},
++
++	{ 0x1f, KEY_REWIND	},
++	{ 0x2d, KEY_FASTFORWARD	},
++	{ 0x1e, KEY_PREVIOUS	}, // Replay |<
++	{ 0x1d, KEY_NEXT	}, // Skip   >|
++
++	{ 0x0b, KEY_CAMERA	}, // Capture
++	{ 0x0f, KEY_LANGUAGE	}, // SAP
++	{ 0x18, KEY_MODE	}, // PIP
++	{ 0x12, KEY_ZOOM	}, // Full screen,
++	{ 0x1c, KEY_SUBTITLE	},
++	{ 0x2f, KEY_MUTE	},
++	{ 0x16, KEY_F20		}, // L/R,
++	{ 0x38, KEY_F21		}, // Hibernate,
++
++	{ 0x37, KEY_SWITCHVIDEOMODE }, // A/V
++	{ 0x31, KEY_AGAIN	}, // Recall,
++	{ 0x1a, KEY_KPPLUS	}, // Zoom+,
++	{ 0x19, KEY_KPMINUS	}, // Zoom-,
++	{ 0x27, KEY_RED		},
++	{ 0x0C, KEY_GREEN	},
++	{ 0x01, KEY_YELLOW	},
++	{ 0x00, KEY_BLUE	},
++};
++
++struct ir_scancode_table ir_mantis = {
++	.scan = mantis_ir_table,
++	.size = ARRAY_SIZE(mantis_ir_table),
++};
++EXPORT_SYMBOL_GPL(ir_mantis);
++
++int mantis_input_init(struct mantis_pci *mantis)
++{
++	struct input_dev *rc;
++	struct ir_input_state rc_state;
++	char name[80], dev[80];
++	int err;
++
++	rc = input_allocate_device();
++	if (!rc) {
++		dprintk(MANTIS_ERROR, 1, "Input device allocate failed");
++		return -ENOMEM;
++	}
++
++	sprintf(name, "Mantis %s IR receiver", mantis->hwconfig->model_name);
++	sprintf(dev, "pci-%s/ir0", pci_name(mantis->pdev));
++
++	rc->name = name;
++	rc->phys = dev;
++
++	ir_input_init(rc, &rc_state, IR_TYPE_OTHER, &ir_mantis);
++
++	rc->id.bustype	= BUS_PCI;
++	rc->id.vendor	= mantis->vendor_id;
++	rc->id.product	= mantis->device_id;
++	rc->id.version	= 1;
++	rc->dev		= mantis->pdev->dev;
++
++	err = input_register_device(rc);
++	if (err) {
++		dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err);
++		return -ENODEV;
++	}
++
++	mantis->rc = rc;
++
++	return 0;
++}
++
++int mantis_exit(struct mantis_pci *mantis)
++{
++	struct input_dev *rc = mantis->rc;
++
++	input_unregister_device(rc);
++
++	return 0;
++}
+diff --git a/drivers/media/dvb/mantis/mantis_uart.c b/drivers/media/dvb/mantis/mantis_uart.c
+index 03b47cf..7d2f239 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.c
++++ b/drivers/media/dvb/mantis/mantis_uart.c
+@@ -1,7 +1,26 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #include <linux/kernel.h>
+ #include <linux/spinlock.h>
+ 
+-#include <asm/irq.h>
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ #include <linux/interrupt.h>
+@@ -21,6 +40,24 @@ struct mantis_uart_params {
+ 	enum mantis_parity	parity;
+ };
+ 
++static struct {
++	char string[7];
++} rates[5] = {
++	{ "9600" },
++	{ "19200" },
++	{ "38400" },
++	{ "57600" },
++	{ "115200" }
++};
++
++static struct {
++	char string[5];
++} parity[3] = {
++	{ "NONE" },
++	{ "ODD" },
++	{ "EVEN" }
++};
++
+ #define UART_MAX_BUF			16
+ 
+ int mantis_uart_read(struct mantis_pci *mantis, u8 *data)
+@@ -60,12 +97,10 @@ static void mantis_uart_work(struct work_struct *work)
+ 	u8 buf[16];
+ 	int i;
+ 
+-	dprintk(MANTIS_DEBUG, 1, "UART read");
+ 	mantis_uart_read(mantis, buf);
+ 
+-	dprintk(MANTIS_DEBUG, 1, "UART: ");
+ 	for (i = 0; i < (config->bytes + 1); i++)
+-		dprintk(MANTIS_DEBUG, 0, "<%02x> ", buf[i]);
++		dprintk(MANTIS_INFO, 1, "UART BUF:%d <%02x> ", i, buf[i]);
+ 
+ 	dprintk(MANTIS_DEBUG, 0, "\n");
+ }
+@@ -73,15 +108,8 @@ static void mantis_uart_work(struct work_struct *work)
+ static int mantis_uart_setup(struct mantis_pci *mantis,
+ 			     struct mantis_uart_params *params)
+ {
+-	char* rates[] = { "B_9600", "B_19200", "B_38400", "B_57600", "B_115200" };
+-	char* parity[] = { "NONE", "ODD", "EVEN" };
+-
+ 	u32 reg;
+ 
+-	dprintk(MANTIS_DEBUG, 1, "Set Parity <%s> Baud Rate <%s>",
+-		parity[params->parity],
+-		rates[params->baud_rate]);
+-
+ 	mmwrite((mmread(MANTIS_UART_CTL) | (params->parity & 0x3)), MANTIS_UART_CTL);
+ 
+ 	reg = mmread(MANTIS_UART_BAUD);
+@@ -116,10 +144,12 @@ int mantis_uart_init(struct mantis_pci *mantis)
+ 	struct mantis_hwconfig *config = mantis->hwconfig;
+ 	struct mantis_uart_params params;
+ 
+-	dprintk(MANTIS_DEBUG, 1, "Initializing UART ..");
+ 	/* default parity: */
+ 	params.baud_rate = config->baud_rate;
+ 	params.parity = config->parity;
++	dprintk(MANTIS_INFO, 1, "Initializing UART @ %sbps parity:%s",
++		rates[params.baud_rate].string,
++		parity[params.parity].string);
+ 
+ 	init_waitqueue_head(&mantis->uart_wq);
+ 	spin_lock_init(&mantis->uart_lock);
+@@ -142,6 +172,7 @@ int mantis_uart_init(struct mantis_pci *mantis)
+ 	mmwrite(mmread(MANTIS_UART_CTL) | MANTIS_UART_RXINT, MANTIS_UART_CTL);
+ 
+ 	schedule_work(&mantis->uart_work);
++	dprintk(MANTIS_DEBUG, 1, "UART succesfully initialized");
+ 
+ 	return 0;
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_uart.h b/drivers/media/dvb/mantis/mantis_uart.h
+index 0a42cd0..62ab66e 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.h
++++ b/drivers/media/dvb/mantis/mantis_uart.h
+@@ -45,10 +45,9 @@ enum mantis_baud {
+ };
+ 
+ enum mantis_parity {
+-	MANTIS_PARITY_UNDEFINED	= 0,
++	MANTIS_PARITY_NONE	= 0,
+ 	MANTIS_PARITY_EVEN,
+ 	MANTIS_PARITY_ODD,
+-	MANTIS_PARITY_NONE
+ };
+ 
+ struct mantis_pci;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0107-V4L-DVB-13807-Fix-Free-device-in-the-device-registra.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0107-V4L-DVB-13807-Fix-Free-device-in-the-device-registra.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,32 @@
+From 4196e6642ec1628011591b27d7a098b4c0e77fbb Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Sat, 12 Dec 2009 03:14:25 -0300
+Subject: [PATCH 107/120] V4L/DVB (13807): Fix: Free device in the device registration failure case
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 1e42dc78900e9d0ce89d77f3ba6aca00abd5f1b5)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_input.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_input.c b/drivers/media/dvb/mantis/mantis_input.c
+index 9395fcf..b27d775 100644
+--- a/drivers/media/dvb/mantis/mantis_input.c
++++ b/drivers/media/dvb/mantis/mantis_input.c
+@@ -129,6 +129,7 @@ int mantis_input_init(struct mantis_pci *mantis)
+ 	err = input_register_device(rc);
+ 	if (err) {
+ 		dprintk(MANTIS_ERROR, 1, "IR device registration failed, ret = %d", err);
++		input_free_device(rc);
+ 		return -ENODEV;
+ 	}
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0108-V4L-DVB-13809-Fix-Checkpatch-violations.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0108-V4L-DVB-13809-Fix-Checkpatch-violations.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,1073 @@
+From f776c0aa9bf28b3ba46d7663f3dfc48c7dfea2f6 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Tue, 15 Dec 2009 08:47:21 -0300
+Subject: [PATCH 108/120] V4L/DVB (13809): Fix Checkpatch violations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit f5ae4f6f482191c531ea9e50ac91d9bd2ffca171)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c      |  109 +++++++++++++++-------------
+ drivers/media/dvb/frontends/mb86a16.h      |    2 +-
+ drivers/media/dvb/frontends/mb86a16_priv.h |    2 +-
+ drivers/media/dvb/frontends/tda665x.c      |   32 ++++----
+ drivers/media/dvb/frontends/tda665x.h      |    2 +-
+ drivers/media/dvb/mantis/hopper_cards.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_ca.c       |    4 +-
+ drivers/media/dvb/mantis/mantis_cards.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_core.c     |   48 ++++++++-----
+ drivers/media/dvb/mantis/mantis_core.h     |   14 ++--
+ drivers/media/dvb/mantis/mantis_dma.c      |   11 ++--
+ drivers/media/dvb/mantis/mantis_dvb.c      |   12 +---
+ drivers/media/dvb/mantis/mantis_i2c.c      |    2 +-
+ drivers/media/dvb/mantis/mantis_input.c    |   28 ++++----
+ drivers/media/dvb/mantis/mantis_reg.h      |    2 +-
+ drivers/media/dvb/mantis/mantis_vp1033.c   |   12 ++--
+ drivers/media/dvb/mantis/mantis_vp1034.c   |    2 +-
+ drivers/media/dvb/mantis/mantis_vp1041.c   |    9 +--
+ drivers/media/dvb/mantis/mantis_vp2033.c   |    2 +-
+ drivers/media/dvb/mantis/mantis_vp2040.c   |    2 +-
+ 20 files changed, 155 insertions(+), 144 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index 33387b7..32f20c6 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -37,11 +37,11 @@ struct mb86a16_state {
+ 	const struct mb86a16_config	*config;
+ 	struct dvb_frontend		frontend;
+ 
+-	// tuning parameters
++	/* tuning parameters */
+ 	int				frequency;
+ 	int				srate;
+ 
+-	// Internal stuff
++	/* Internal stuff */
+ 	int				master_clk;
+ 	int				deci;
+ 	int				csel;
+@@ -105,7 +105,7 @@ static int mb86a16_read(struct mb86a16_state *state, u8 reg, u8 *val)
+ 			.flags = 0,
+ 			.buf = b0,
+ 			.len = 1
+-		},{
++		}, {
+ 			.addr = state->config->demod_address,
+ 			.flags = I2C_M_RD,
+ 			.buf = b1,
+@@ -435,7 +435,7 @@ static int signal_det(struct mb86a16_state *state,
+ 		wait_sym = 80000;
+ 	}
+ 	for (i = 0; i < 3; i++) {
+-		if (i == 0 )
++		if (i == 0)
+ 			smrtd = smrt * 98 / 100;
+ 		else if (i == 1)
+ 			smrtd = smrt;
+@@ -480,11 +480,11 @@ static int rf_val_set(struct mb86a16_state *state,
+ 	unsigned char rf_val[5];
+ 	int ack = -1;
+ 
+-	if (smrt > 37750 )
++	if (smrt > 37750)
+ 		C = 1;
+ 	else if (smrt > 18875)
+ 		C = 2;
+-	else if (smrt > 5500 )
++	else if (smrt > 5500)
+ 		C = 3;
+ 	else
+ 		C = 4;
+@@ -526,7 +526,7 @@ static int rf_val_set(struct mb86a16_state *state,
+ 	rf_val[2] = (M & 0x00ff0) >> 4;
+ 	rf_val[3] = ((M & 0x0000f) << 4) | B;
+ 
+-	// Frequency Set
++	/* Frequency Set */
+ 	if (mb86a16_write(state, 0x21, rf_val[0]) < 0)
+ 		ack = 0;
+ 	if (mb86a16_write(state, 0x22, rf_val[1]) < 0)
+@@ -655,8 +655,8 @@ static int freqerr_chk(struct mb86a16_state *state,
+ 	unsigned char CRM, AFCML, AFCMH;
+ 	unsigned char temp1, temp2, temp3;
+ 	int crm, afcm, AFCM;
+-	int crrerr, afcerr;		// [kHz]
+-	int frqerr;			// [MHz]
++	int crrerr, afcerr;		/* kHz */
++	int frqerr;			/* MHz */
+ 	int afcen, afcexen = 0;
+ 	int R, M, fOSC, fOSC_OFS;
+ 
+@@ -718,12 +718,12 @@ static int freqerr_chk(struct mb86a16_state *state,
+ 
+ 	fOSC_OFS = fOSC - fTP;
+ 
+-	if (unit == 0) {	//[MHz]
++	if (unit == 0) {	/* MHz */
+ 		if (crrerr + afcerr + fOSC_OFS * 1000 >= 0)
+ 			frqerr = (crrerr + afcerr + fOSC_OFS * 1000 + 500) / 1000;
+ 		else
+ 			frqerr = (crrerr + afcerr + fOSC_OFS * 1000 - 500) / 1000;
+-	} else {	//[kHz]
++	} else {	/* kHz */
+ 		frqerr = crrerr + afcerr + fOSC_OFS * 1000;
+ 	}
+ 
+@@ -760,13 +760,13 @@ static void swp_info_get(struct mb86a16_state *state,
+ 
+ 	crnt_swp_freq = fOSC_start * 1000 + v * swp_ofs;
+ 
+-	if (R == 0 )
++	if (R == 0)
+ 		*fOSC = (crnt_swp_freq + 1000) / 2000 * 2;
+ 	else
+ 		*fOSC = (crnt_swp_freq + 500) / 1000;
+ 
+ 	if (*fOSC >= crnt_swp_freq)
+-		*afcex_freq = *fOSC *1000 - crnt_swp_freq;
++		*afcex_freq = *fOSC * 1000 - crnt_swp_freq;
+ 	else
+ 		*afcex_freq = crnt_swp_freq - *fOSC * 1000;
+ 
+@@ -782,7 +782,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 	int swp_freq ;
+ 
+ 	if ((i % 2 == 1) && (v <= vmax)) {
+-		// positive v (case 1)
++		/* positive v (case 1) */
+ 		if ((v - 1 == vmin)				&&
+ 		    (*(V + 30 + v) >= 0)			&&
+ 		    (*(V + 30 + v - 1) >= 0)			&&
+@@ -796,7 +796,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			   (*(V + 30 + v - 1) >= 0)		&&
+ 			   (*(V + 30 + v) > *(V + 30 + v - 1))	&&
+ 			   (*(V + 30 + v) > SIGMIN)) {
+-			// (case 2)
++			/* (case 2) */
+ 			swp_freq = fOSC * 1000 + afcex_freq;
+ 			*SIG1 = *(V + 30 + v);
+ 		} else if ((*(V + 30 + v) > 0)			&&
+@@ -807,7 +807,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			   (*(V + 30 + v - 2) > *(V + 30 + v - 3)) &&
+ 			   ((*(V + 30 + v - 1) > SIGMIN)	||
+ 			   (*(V + 30 + v - 2) > SIGMIN))) {
+-			// (case 3)
++			/* (case 3) */
+ 			if (*(V + 30 + v - 1) >= *(V + 30 + v - 2)) {
+ 				swp_freq = fOSC * 1000 + afcex_freq - swp_ofs;
+ 				*SIG1 = *(V + 30 + v - 1);
+@@ -823,7 +823,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			   (*(V + 30 + v - 1) > *(V + 30 + v - 2)) &&
+ 			   ((*(V + 30 + v) > SIGMIN)		||
+ 			   (*(V + 30 + v - 1) > SIGMIN))) {
+-			// (case 4)
++			/* (case 4) */
+ 			if (*(V + 30 + v) >= *(V + 30 + v - 1)) {
+ 				swp_freq = fOSC * 1000 + afcex_freq;
+ 				*SIG1 = *(V + 30 + v);
+@@ -835,7 +835,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			swp_freq = -1 ;
+ 		}
+ 	} else if ((i % 2 == 0) && (v >= vmin)) {
+-		// Negative v (case 1)
++		/* Negative v (case 1) */
+ 		if ((*(V + 30 + v) > 0)				&&
+ 		    (*(V + 30 + v + 1) > 0)			&&
+ 		    (*(V + 30 + v + 2) > 0)			&&
+@@ -850,7 +850,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			   (*(V + 30 + v + 1) >= 0)		&&
+ 			   (*(V + 30 + v + 1) > *(V + 30 + v))	&&
+ 			   (*(V + 30 + v + 1) > SIGMIN)) {
+-			// (case 2)
++			/* (case 2) */
+ 			swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
+ 			*SIG1 = *(V + 30 + v);
+ 		} else if ((v == vmin)				&&
+@@ -860,18 +860,18 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			   (*(V + 30 + v) > *(V + 30 + v + 1))	&&
+ 			   (*(V + 30 + v) > *(V + 30 + v + 2))	&&
+ 			   (*(V + 30 + v) > SIGMIN)) {
+-			// (case 3)
++			/* (case 3) */
+ 			swp_freq = fOSC * 1000 + afcex_freq;
+ 			*SIG1 = *(V + 30 + v);
+ 		} else if ((*(V + 30 + v) >= 0)			&&
+ 			   (*(V + 30 + v + 1) >= 0)		&&
+ 			   (*(V + 30 + v + 2) >= 0)		&&
+-			   (*(V +30 + v + 3) >= 0)		&&
++			   (*(V + 30 + v + 3) >= 0)		&&
+ 			   (*(V + 30 + v + 1) > *(V + 30 + v))	&&
+ 			   (*(V + 30 + v + 2) > *(V + 30 + v + 3)) &&
+ 			   ((*(V + 30 + v + 1) > SIGMIN)	||
+ 			    (*(V + 30 + v + 2) > SIGMIN))) {
+-			// (case 4)
++			/* (case 4) */
+ 			if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
+ 				swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
+ 				*SIG1 = *(V + 30 + v + 1);
+@@ -889,7 +889,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			   (*(V + 30 + v + 1) > *(V + 30 + v + 3)) &&
+ 			   ((*(V + 30 + v) > SIGMIN)		||
+ 			    (*(V + 30 + v + 1) > SIGMIN))) {
+-			// (case 5)
++			/* (case 5) */
+ 			if (*(V + 30 + v) >= *(V + 30 + v + 1)) {
+ 				swp_freq = fOSC * 1000 + afcex_freq;
+ 				*SIG1 = *(V + 30 + v);
+@@ -905,7 +905,7 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 			   (*(V + 30 + v + 2) > *(V + 30 + v))	&&
+ 			   ((*(V + 30 + v + 1) > SIGMIN)	||
+ 			    (*(V + 30 + v + 2) > SIGMIN))) {
+-			// (case 6)
++			/* (case 6) */
+ 			if (*(V + 30 + v + 1) >= *(V + 30 + v + 2)) {
+ 				swp_freq = fOSC * 1000 + afcex_freq + swp_ofs;
+ 				*SIG1 = *(V + 30 + v + 1);
+@@ -916,8 +916,10 @@ static int swp_freq_calcuation(struct mb86a16_state *state, int i, int v, int *V
+ 		} else if ((vmax == 0) && (vmin == 0) && (*(V + 30 + v) > SIGMIN)) {
+ 			swp_freq = fOSC * 1000;
+ 			*SIG1 = *(V + 30 + v);
+-		} else swp_freq = -1;
+-	} else swp_freq = -1;
++		} else
++			swp_freq = -1;
++	} else
++		swp_freq = -1;
+ 
+ 	return swp_freq;
+ }
+@@ -962,7 +964,7 @@ static void afcex_info_get(struct mb86a16_state *state,
+ 
+ static int SEQ_set(struct mb86a16_state *state, unsigned char loop)
+ {
+-	// SLOCK0 = 0
++	/* SLOCK0 = 0 */
+ 	if (mb86a16_write(state, 0x32, 0x02 | (loop << 2)) < 0) {
+ 		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
+ 		return -EREMOTEIO;
+@@ -973,7 +975,7 @@ static int SEQ_set(struct mb86a16_state *state, unsigned char loop)
+ 
+ static int iq_vt_set(struct mb86a16_state *state, unsigned char IQINV)
+ {
+-	// Viterbi Rate, IQ Settings
++	/* Viterbi Rate, IQ Settings */
+ 	if (mb86a16_write(state, 0x06, 0xdf | (IQINV << 5)) < 0) {
+ 		dprintk(verbose, MB86A16_ERROR, 1, "I2C transfer error");
+ 		return -EREMOTEIO;
+@@ -1031,7 +1033,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 	unsigned char TIMINT1, TIMINT2, TIMEXT;
+ 	unsigned char S0T, S1T;
+ 	unsigned char S2T;
+-//	unsigned char S2T, S3T;
++/*	unsigned char S2T, S3T; */
+ 	unsigned char S4T, S5T;
+ 	unsigned char AFCEX_L, AFCEX_H;
+ 	unsigned char R;
+@@ -1052,7 +1054,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 	int temp_freq, delta_freq;
+ 	int dagcm[4];
+ 	int smrt_d;
+-//	int freq_err;
++/*	int freq_err; */
+ 	int n;
+ 	int ret = -1;
+ 	int sync;
+@@ -1093,19 +1095,19 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 		}
+ 		if (EN_set(state, CREN, AFCEN) < 0) {
+ 			dprintk(verbose, MB86A16_ERROR, 1, "EN set error");
+-			return -1; // (0, 0)
++			return -1; /* (0, 0) */
+ 		}
+ 		if (AFCEXEN_set(state, AFCEXEN, state->srate) < 0) {
+ 			dprintk(verbose, MB86A16_ERROR, 1, "AFCEXEN set error");
+-			return -1; // (1, smrt) = (1, symbolrate)
++			return -1; /* (1, smrt) = (1, symbolrate) */
+ 		}
+ 		if (CNTM_set(state, TIMINT1, TIMINT2, TIMEXT) < 0) {
+ 			dprintk(verbose, MB86A16_ERROR, 1, "CNTM set error");
+-			return -1; // (0, 1, 2)
++			return -1; /* (0, 1, 2) */
+ 		}
+ 		if (S01T_set(state, S1T, S0T) < 0) {
+ 			dprintk(verbose, MB86A16_ERROR, 1, "S01T set error");
+-			return -1; // (0, 0)
++			return -1; /* (0, 0) */
+ 		}
+ 		smrt_info_get(state, state->srate);
+ 		if (smrt_set(state, state->srate) < 0) {
+@@ -1133,13 +1135,15 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 			ftemp = ftemp + swp_ofs;
+ 			vmax++;
+ 
+-			// Upper bound
++			/* Upper bound */
+ 			if (ftemp > 2150000) {
+ 				loop = 0;
+ 				vmax--;
++			} else {
++				if ((ftemp == 2150000) ||
++				    (ftemp - state->frequency * 1000 >= fcp + state->srate / 4))
++					loop = 0;
+ 			}
+-			else if ((ftemp == 2150000) || (ftemp - state->frequency * 1000 >= fcp + state->srate / 4))
+-				loop = 0;
+ 		}
+ 
+ 		loop = 1;
+@@ -1149,13 +1153,15 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 			ftemp = ftemp - swp_ofs;
+ 			vmin--;
+ 
+-			// Lower bound
++			/* Lower bound */
+ 			if (ftemp < 950000) {
+ 				loop = 0;
+ 				vmin++;
++			} else {
++				if ((ftemp == 950000) ||
++				    (state->frequency * 1000 - ftemp >= fcp + state->srate / 4))
++					loop = 0;
+ 			}
+-			else if ((ftemp == 950000) || (state->frequency * 1000 - ftemp >= fcp + state->srate / 4))
+-				loop = 0;
+ 		}
+ 
+ 		wait_t = (8000 + state->srate / 2) / state->srate;
+@@ -1199,7 +1205,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 			V[30 + v] = SIG1 ;
+ 			swp_freq = swp_freq_calcuation(state, i, v, V, vmax, vmin,
+ 						      SIG1MIN, fOSC, afcex_freq,
+-						      swp_ofs, &SIG1);	//changed
++						      swp_ofs, &SIG1);	/* changed */
+ 
+ 			signal_dupl = 0;
+ 			for (j = 0; j < prev_freq_num; j++) {
+@@ -1291,7 +1297,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 				dprintk(verbose, MB86A16_ERROR, 1, "srst error");
+ 				return -1;
+ 			}
+-			// delay 4~200
++			/* delay 4~200 */
+ 			wait_t = 200000 / state->master_clk + 200000 / state->srate;
+ 			msleep(wait_t);
+ 			afcerr = afcerr_chk(state);
+@@ -1452,7 +1458,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 					S2T = 7; S4T = 2; S5T = 8; ETH = 7; VIA = 2;
+ 					wait_t = 7 + (2097152 + state->srate / 2) / state->srate;
+ 				}
+-				wait_t *= 2; /*		FOS	*/
++				wait_t *= 2; /* FOS */
+ 				S2T_set(state, S2T);
+ 				S45T_set(state, S4T, S5T);
+ 				Vi_set(state, ETH, VIA);
+@@ -1461,13 +1467,14 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 				sync = sync_chk(state, &VIRM);
+ 				dprintk(verbose, MB86A16_INFO, 1, "-------- Viterbi=[%d] SYNC=[%d] ---------", VIRM, sync);
+ 				if (VIRM) {
+-					if (VIRM == 4) { // 5/6
++					if (VIRM == 4) {
++						/* 5/6 */
+ 						if (SIG1 > 110)
+-							wait_t = ( 786432 + state->srate / 2) / state->srate;
++							wait_t = (786432 + state->srate / 2) / state->srate;
+ 						else
+ 							wait_t = (1572864 + state->srate / 2) / state->srate;
+ 						if (state->srate < 5000)
+-							// FIXME ! , should be a long wait !
++							/* FIXME ! , should be a long wait ! */
+ 							msleep_interruptible(wait_t);
+ 						else
+ 							msleep_interruptible(wait_t);
+@@ -1477,9 +1484,9 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 							FEC_srst(state);
+ 						}
+ 					}
+-					// 1/2, 2/3, 3/4, 7/8
++					/* 1/2, 2/3, 3/4, 7/8 */
+ 					if (SIG1 > 110)
+-						wait_t = ( 786432 + state->srate / 2) / state->srate;
++						wait_t = (786432 + state->srate / 2) / state->srate;
+ 					else
+ 						wait_t = (1572864 + state->srate / 2) / state->srate;
+ 					msleep_interruptible(wait_t);
+@@ -1491,7 +1498,7 @@ static int mb86a16_set_fe(struct mb86a16_state *state)
+ 				}
+ 			}
+ 		} else {
+-			dprintk (verbose, MB86A16_INFO, 1, "NO  -- SIGNAL");
++			dprintk(verbose, MB86A16_INFO, 1, "NO  -- SIGNAL");
+ 			ret = -1;
+ 		}
+ 
+@@ -1846,7 +1853,7 @@ struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
+ 	u8 dev_id = 0;
+ 	struct mb86a16_state *state = NULL;
+ 
+-	state = kmalloc(sizeof (struct mb86a16_state), GFP_KERNEL);
++	state = kmalloc(sizeof(struct mb86a16_state), GFP_KERNEL);
+ 	if (state == NULL)
+ 		goto error;
+ 
+@@ -1857,7 +1864,7 @@ struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
+ 	if (dev_id != 0xfe)
+ 		goto error;
+ 
+-	memcpy(&state->frontend.ops, &mb86a16_ops, sizeof (struct dvb_frontend_ops));
++	memcpy(&state->frontend.ops, &mb86a16_ops, sizeof(struct dvb_frontend_ops));
+ 	state->frontend.demodulator_priv = state;
+ 	state->frontend.ops.set_voltage = state->config->set_voltage;
+ 
+diff --git a/drivers/media/dvb/frontends/mb86a16.h b/drivers/media/dvb/frontends/mb86a16.h
+index b7545d0..68f25a6 100644
+--- a/drivers/media/dvb/frontends/mb86a16.h
++++ b/drivers/media/dvb/frontends/mb86a16.h
+@@ -35,4 +35,4 @@ extern struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
+ 					   struct i2c_adapter *i2c_adap);
+ 
+ 
+-#endif //__MB86A16_H
++#endif /* __MB86A16_H */
+diff --git a/drivers/media/dvb/frontends/mb86a16_priv.h b/drivers/media/dvb/frontends/mb86a16_priv.h
+index 5de5700..d8757fa 100644
+--- a/drivers/media/dvb/frontends/mb86a16_priv.h
++++ b/drivers/media/dvb/frontends/mb86a16_priv.h
+@@ -148,4 +148,4 @@
+ #define MB86A16_DISTMON		0x52
+ #define MB86A16_VERSION		0x7f
+ 
+-#endif //__MB86A16_PRIV_H
++#endif /* __MB86A16_PRIV_H */
+diff --git a/drivers/media/dvb/frontends/tda665x.c b/drivers/media/dvb/frontends/tda665x.c
+index 0732a2d..87d5273 100644
+--- a/drivers/media/dvb/frontends/tda665x.c
++++ b/drivers/media/dvb/frontends/tda665x.c
+@@ -45,7 +45,7 @@ static int tda665x_read(struct tda665x_state *state, u8 *buf)
+ 
+ 	return err;
+ exit:
+-	printk("%s: I/O Error err=<%d>\n", __func__, err);
++	printk(KERN_ERR "%s: I/O Error err=<%d>\n", __func__, err);
+ 	return err;
+ }
+ 
+@@ -61,7 +61,7 @@ static int tda665x_write(struct tda665x_state *state, u8 *buf, u8 length)
+ 
+ 	return err;
+ exit:
+-	printk("%s: I/O Error err=<%d>\n", __func__, err);
++	printk(KERN_ERR "%s: I/O Error err=<%d>\n", __func__, err);
+ 	return err;
+ }
+ 
+@@ -79,7 +79,7 @@ static int tda665x_get_state(struct dvb_frontend *fe,
+ 	case DVBFE_TUNER_BANDWIDTH:
+ 		break;
+ 	default:
+-		printk("%s: Unknown parameter (param=%d)\n", __func__, param);
++		printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param);
+ 		err = -EINVAL;
+ 		break;
+ 	}
+@@ -100,13 +100,13 @@ static int tda665x_get_status(struct dvb_frontend *fe, u32 *status)
+ 		goto exit;
+ 
+ 	if ((result >> 6) & 0x01) {
+-		printk("%s: Tuner Phase Locked\n", __func__);
++		printk(KERN_DEBUG "%s: Tuner Phase Locked\n", __func__);
+ 		*status = 1;
+ 	}
+ 
+ 	return err;
+ exit:
+-	printk("%s: I/O Error\n", __func__);
++	printk(KERN_ERR "%s: I/O Error\n", __func__);
+ 	return err;
+ }
+ 
+@@ -124,7 +124,7 @@ static int tda665x_set_state(struct dvb_frontend *fe,
+ 
+ 		frequency = tstate->frequency;
+ 		if ((frequency < config->frequency_max) || (frequency > config->frequency_min)) {
+-			printk("%s: Frequency beyond limits, frequency=%d\n", __func__, frequency);
++			printk(KERN_ERR "%s: Frequency beyond limits, frequency=%d\n", __func__, frequency);
+ 			return -EINVAL;
+ 		}
+ 
+@@ -133,8 +133,8 @@ static int tda665x_set_state(struct dvb_frontend *fe,
+ 		frequency += config->ref_divider >> 1;
+ 		frequency /= config->ref_divider;
+ 
+-		buf[0] = (u8 ) (frequency & 0x7f00) >> 8;
+-		buf[1] = (u8 ) (frequency & 0x00ff) >> 0;
++		buf[0] = (u8) (frequency & 0x7f00) >> 8;
++		buf[1] = (u8) (frequency & 0x00ff) >> 0;
+ 		buf[2] = 0x80 | 0x40 | 0x02;
+ 		buf[3] = 0x00;
+ 
+@@ -178,7 +178,7 @@ static int tda665x_set_state(struct dvb_frontend *fe,
+ 			goto exit;
+ 
+ 		/* sleep for some time */
+-		printk("%s: Waiting to Phase LOCK\n", __func__);
++		printk(KERN_DEBUG "%s: Waiting to Phase LOCK\n", __func__);
+ 		msleep(20);
+ 		/* check status */
+ 		err = tda665x_get_status(fe, &status);
+@@ -186,19 +186,19 @@ static int tda665x_set_state(struct dvb_frontend *fe,
+ 			goto exit;
+ 
+ 		if (status == 1) {
+-			printk("%s: Tuner Phase locked: status=%d\n", __func__, status);
++			printk(KERN_DEBUG "%s: Tuner Phase locked: status=%d\n", __func__, status);
+ 			state->frequency = frequency; /* cache successful state */
+ 		} else {
+-			printk("%s: No Phase lock: status=%d\n", __func__, status);
++			printk(KERN_ERR "%s: No Phase lock: status=%d\n", __func__, status);
+ 		}
+ 	} else {
+-		printk("%s: Unknown parameter (param=%d)\n", __func__, param);
++		printk(KERN_ERR "%s: Unknown parameter (param=%d)\n", __func__, param);
+ 		return -EINVAL;
+ 	}
+ 
+ 	return 0;
+ exit:
+-	printk("%s: I/O Error\n", __func__);
++	printk(KERN_ERR "%s: I/O Error\n", __func__);
+ 	return err;
+ }
+ 
+@@ -226,7 +226,7 @@ struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
+ 	struct tda665x_state *state = NULL;
+ 	struct dvb_tuner_info *info;
+ 
+-	state = kzalloc(sizeof (struct tda665x_state), GFP_KERNEL);
++	state = kzalloc(sizeof(struct tda665x_state), GFP_KERNEL);
+ 	if (state == NULL)
+ 		goto exit;
+ 
+@@ -237,12 +237,12 @@ struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
+ 	fe->ops.tuner_ops	= tda665x_ops;
+ 	info			 = &fe->ops.tuner_ops.info;
+ 
+-	memcpy(info->name, config->name, sizeof (config->name));
++	memcpy(info->name, config->name, sizeof(config->name));
+ 	info->frequency_min	= config->frequency_min;
+ 	info->frequency_max	= config->frequency_max;
+ 	info->frequency_step	= config->frequency_offst;
+ 
+-	printk("%s: Attaching TDA665x (%s) tuner\n", __func__, info->name);
++	printk(KERN_DEBUG "%s: Attaching TDA665x (%s) tuner\n", __func__, info->name);
+ 
+ 	return fe;
+ 
+diff --git a/drivers/media/dvb/frontends/tda665x.h b/drivers/media/dvb/frontends/tda665x.h
+index c0b544d..ec7927a 100644
+--- a/drivers/media/dvb/frontends/tda665x.h
++++ b/drivers/media/dvb/frontends/tda665x.h
+@@ -40,7 +40,7 @@ extern struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
+ #else
+ 
+ static inline struct dvb_frontend *tda665x_attach(struct dvb_frontend *fe,
+-					   	  const struct tda665x_config *config,
++						  const struct tda665x_config *config,
+ 						  struct i2c_adapter *i2c)
+ {
+ 	printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__);
+diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
+index 6d5d101..ca70149 100644
+--- a/drivers/media/dvb/mantis/hopper_cards.c
++++ b/drivers/media/dvb/mantis/hopper_cards.c
+@@ -137,7 +137,7 @@ static int __devinit hopper_pci_probe(struct pci_dev *pdev, const struct pci_dev
+ 	struct mantis_hwconfig *config;
+ 	int err = 0;
+ 
+-	mantis = kzalloc(sizeof (struct mantis_pci), GFP_KERNEL);
++	mantis = kzalloc(sizeof(struct mantis_pci), GFP_KERNEL);
+ 	if (mantis == NULL) {
+ 		printk(KERN_ERR "%s ERROR: Out of memory\n", __func__);
+ 		err = -ENOMEM;
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 88899ac..2f3ba81 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -119,7 +119,7 @@ static int mantis_ts_control(struct dvb_ca_en50221 *en50221, int slot)
+ 	struct mantis_pci *mantis = ca->ca_priv;
+ 
+ 	dprintk(MANTIS_DEBUG, 1, "Slot(%d): TS control", slot);
+-//	mantis_set_direction(mantis, 1); /* Enable TS through CAM */
++/*	mantis_set_direction(mantis, 1); */ /* Enable TS through CAM */
+ 
+ 	return 0;
+ }
+@@ -148,7 +148,7 @@ int mantis_ca_init(struct mantis_pci *mantis)
+ 	int ca_flags = 0, result;
+ 
+ 	dprintk(MANTIS_DEBUG, 1, "Initializing Mantis CA");
+-	ca = kzalloc(sizeof (struct mantis_ca), GFP_KERNEL);
++	ca = kzalloc(sizeof(struct mantis_ca), GFP_KERNEL);
+ 	if (!ca) {
+ 		dprintk(MANTIS_ERROR, 1, "Out of memory!, exiting ..");
+ 		result = -ENOMEM;
+diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
+index f3fefbb..a4250fa 100644
+--- a/drivers/media/dvb/mantis/mantis_cards.c
++++ b/drivers/media/dvb/mantis/mantis_cards.c
+@@ -145,7 +145,7 @@ static int __devinit mantis_pci_probe(struct pci_dev *pdev, const struct pci_dev
+ 	struct mantis_hwconfig *config;
+ 	int err = 0;
+ 
+-	mantis = kzalloc(sizeof (struct mantis_pci), GFP_KERNEL);
++	mantis = kzalloc(sizeof(struct mantis_pci), GFP_KERNEL);
+ 	if (mantis == NULL) {
+ 		printk(KERN_ERR "%s ERROR: Out of memory\n", __func__);
+ 		err = -ENOMEM;
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 52b3e9e..3ddc9ba 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -36,14 +36,16 @@ static int read_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ 			.flags = 0,
+ 			.buf = data,
+ 			.len = 1
+-		},{
++		}, {
+ 			.addr = 0x50,
+ 			.flags = I2C_M_RD,
+ 			.buf = data,
+ 			.len = length
+ 		},
+ 	};
+-	if ((err = i2c_transfer(&mantis->adapter, msg, 2)) < 0) {
++
++	err = i2c_transfer(&mantis->adapter, msg, 2);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1,
+ 			"ERROR: i2c read: < err=%i d0=0x%02x d1=0x%02x >",
+ 			err, data[0], data[1]);
+@@ -65,7 +67,8 @@ static int write_eeprom_byte(struct mantis_pci *mantis, u8 *data, u8 length)
+ 		.len = length
+ 	};
+ 
+-	if ((err = i2c_transfer(&mantis->adapter, &msg, 1)) < 0) {
++	err = i2c_transfer(&mantis->adapter, &msg, 1);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1,
+ 			"ERROR: i2c write: < err=%i length=0x%02x d0=0x%02x, d1=0x%02x >",
+ 			err, length, data[0], data[1]);
+@@ -81,7 +84,8 @@ static int get_mac_address(struct mantis_pci *mantis)
+ 	int err;
+ 
+ 	mantis->mac_address[0] = 0x08;
+-	if ((err = read_eeprom_byte(mantis, &mantis->mac_address[0], 6)) < 0) {
++	err = read_eeprom_byte(mantis, &mantis->mac_address[0], 6);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis EEPROM read error");
+ 
+ 		return err;
+@@ -106,25 +110,25 @@ struct mantis_hwconfig unknown_device = {
+ static void mantis_load_config(struct mantis_pci *mantis)
+ {
+ 	switch (mantis->subsystem_device) {
+-	case MANTIS_VP_1033_DVB_S:	// VP-1033
++	case MANTIS_VP_1033_DVB_S:	/* VP-1033 */
+ 		mantis->hwconfig = &vp1033_mantis_config;
+ 		break;
+-	case MANTIS_VP_1034_DVB_S:	// VP-1034
++	case MANTIS_VP_1034_DVB_S:	/* VP-1034 */
+ 		mantis->hwconfig = &vp1034_mantis_config;
+ 		break;
+-	case MANTIS_VP_1041_DVB_S2:	// VP-1041
++	case MANTIS_VP_1041_DVB_S2:	/* VP-1041 */
+ 	case TECHNISAT_SKYSTAR_HD2:
+ 		mantis->hwconfig = &vp1041_mantis_config;
+ 		break;
+-	case MANTIS_VP_2033_DVB_C:	// VP-2033
++	case MANTIS_VP_2033_DVB_C:	/* VP-2033 */
+ 		mantis->hwconfig = &vp2033_mantis_config;
+ 		break;
+-	case MANTIS_VP_2040_DVB_C:	// VP-2040
+-	case TERRATEC_CINERGY_C_PCI:	// VP-2040 clone
++	case MANTIS_VP_2040_DVB_C:	/* VP-2040 */
++	case TERRATEC_CINERGY_C_PCI:	/* VP-2040 clone */
+ 	case TECHNISAT_CABLESTAR_HD2:
+ 		mantis->hwconfig = &vp2040_mantis_config;
+ 		break;
+-	case MANTIS_VP_3030_DVB_T:	// VP-3030
++	case MANTIS_VP_3030_DVB_T:	/* VP-3030 */
+ 		mantis->hwconfig = &vp3030_mantis_config;
+ 		break;
+ 	default:
+@@ -149,23 +153,28 @@ int mantis_core_init(struct mantis_pci *mantis)
+ 		mantis->pdev->irq, mantis->latency,
+ 		mantis->mantis_addr, mantis->mantis_mmio);
+ 
+-	if ((err = mantis_i2c_init(mantis)) < 0) {
++	err = mantis_i2c_init(mantis);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis I2C init failed");
+ 		return err;
+ 	}
+-	if ((err = get_mac_address(mantis)) < 0) {
++	err = get_mac_address(mantis);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "get MAC address failed");
+ 		return err;
+ 	}
+-	if ((err = mantis_dma_init(mantis)) < 0) {
++	err = mantis_dma_init(mantis);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_ERROR, 1, "Mantis DMA init failed");
+ 		return err;
+ 	}
+-	if ((err = mantis_dvb_init(mantis)) < 0) {
++	err = mantis_dvb_init(mantis);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis DVB init failed");
+ 		return err;
+ 	}
+-	if ((err = mantis_uart_init(mantis)) < 0) {
++	err = mantis_uart_init(mantis);
++	if (err < 0) {
+ 		dprintk(verbose, MANTIS_DEBUG, 1, "Mantis UART init failed");
+ 		return err;
+ 	}
+@@ -191,7 +200,7 @@ int mantis_core_exit(struct mantis_pci *mantis)
+ 	return 0;
+ }
+ 
+-// Turn the given bit on or off.
++/* Turn the given bit on or off. */
+ void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
+ {
+ 	u32 cur;
+@@ -207,14 +216,15 @@ void gpio_set_bits(struct mantis_pci *mantis, u32 bitpos, u8 value)
+ 	udelay(100);
+ }
+ 
+-//direction = 0 , no CI passthrough ; 1 , CI passthrough
++/* direction = 0 , no CI passthrough ; 1 , CI passthrough */
+ void mantis_set_direction(struct mantis_pci *mantis, int direction)
+ {
+ 	u32 reg;
+ 
+ 	reg = mmread(0x28);
+ 	dprintk(verbose, MANTIS_DEBUG, 1, "TS direction setup");
+-	if (direction == 0x01) { //to CI
++	if (direction == 0x01) {
++		/* to CI */
+ 		reg |= 0x04;
+ 		mmwrite(reg, 0x28);
+ 		reg &= 0xff - 0x04;
+diff --git a/drivers/media/dvb/mantis/mantis_core.h b/drivers/media/dvb/mantis/mantis_core.h
+index a809394..8511b0c 100644
+--- a/drivers/media/dvb/mantis/mantis_core.h
++++ b/drivers/media/dvb/mantis/mantis_core.h
+@@ -33,15 +33,15 @@
+ 
+ 
+ struct vendorname {
+-	__u8  *sub_vendor_name;
+-	__u32 sub_vendor_id;
++	u8  *sub_vendor_name;
++	u32 sub_vendor_id;
+ };
+ 
+ struct devicetype {
+-	__u8  *sub_device_name;
+-	__u32 sub_device_id;
+-	__u8  device_type;
+-	__u32 type_flags;
++	u8  *sub_device_name;
++	u32 sub_device_id;
++	u8  device_type;
++	u32 type_flags;
+ };
+ 
+ 
+@@ -54,4 +54,4 @@ extern int mantis_i2c_exit(struct mantis_pci *mantis);
+ extern int mantis_core_init(struct mantis_pci *mantis);
+ extern int mantis_core_exit(struct mantis_pci *mantis);
+ 
+-#endif //__MANTIS_CORE_H
++#endif /* __MANTIS_CORE_H */
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index eab3645..adad1f3 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -43,10 +43,10 @@
+ #define RISC_IRQ		(0x01 << 24)
+ 
+ #define RISC_STATUS(status)	((((~status) & 0x0f) << 20) | ((status & 0x0f) << 16))
+-#define RISC_FLUSH()		mantis->risc_pos = 0
+-#define RISC_INSTR(opcode)	mantis->risc_cpu[mantis->risc_pos++] = cpu_to_le32(opcode)
++#define RISC_FLUSH()		(mantis->risc_pos = 0)
++#define RISC_INSTR(opcode)	(mantis->risc_cpu[mantis->risc_pos++] = cpu_to_le32(opcode))
+ 
+-#define MANTIS_BUF_SIZE		64 * 1024
++#define MANTIS_BUF_SIZE		(64 * 1024)
+ #define MANTIS_BLOCK_BYTES	(MANTIS_BUF_SIZE >> 4)
+ #define MANTIS_BLOCK_COUNT	(1 << 4)
+ #define MANTIS_RISC_SIZE	PAGE_SIZE
+@@ -158,7 +158,8 @@ int mantis_dma_init(struct mantis_pci *mantis)
+ 
+ 		goto err;
+ 	}
+-	if ((err = mantis_calc_lines(mantis)) < 0) {
++	err = mantis_calc_lines(mantis);
++	if (err < 0) {
+ 		dprintk(MANTIS_ERROR, 1, "Mantis calc lines failed");
+ 
+ 		goto err;
+@@ -248,7 +249,7 @@ void mantis_dma_xfer(unsigned long data)
+ 		dprintk(MANTIS_DEBUG, 1, "last block=[%d] finished block=[%d]",
+ 			mantis->last_block, mantis->finished_block);
+ 
+-		(config->ts_size ? dvb_dmx_swfilter_204: dvb_dmx_swfilter)
++		(config->ts_size ? dvb_dmx_swfilter_204 : dvb_dmx_swfilter)
+ 		(&mantis->demux, &mantis->buf_cpu[mantis->last_block * MANTIS_BLOCK_BYTES], MANTIS_BLOCK_BYTES);
+ 		mantis->last_block = (mantis->last_block + 1) % MANTIS_BLOCK_COUNT;
+ 	}
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 54bf4ea..8982d6f 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -116,7 +116,6 @@ static int mantis_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
+ 
+ 	if (mantis->feeds == 1)	 {
+ 		dprintk(MANTIS_DEBUG, 1, "mantis start feed & dma");
+-		printk("mantis start feed & dma\n");
+ 		mantis_dma_start(mantis);
+ 	}
+ 
+@@ -137,7 +136,6 @@ static int mantis_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
+ 	mantis->feeds--;
+ 	if (mantis->feeds == 0) {
+ 		dprintk(MANTIS_DEBUG, 1, "mantis stop feed and dma");
+-		printk("mantis stop feed and dma\n");
+ 		mantis_dma_stop(mantis);
+ 	}
+ 
+@@ -204,9 +202,9 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ 	}
+ 
+ 	mantis->fe_mem.source		= DMX_MEMORY_FE;
+-	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx,&mantis->fe_mem);
++	result = mantis->demux.dmx.add_frontend(&mantis->demux.dmx, &mantis->fe_mem);
+ 	if (result < 0) {
+-		dprintk(MANTIS_ERROR, 1,"dvb_dmx_init failed, ERROR=%d", result);
++		dprintk(MANTIS_ERROR, 1, "dvb_dmx_init failed, ERROR=%d", result);
+ 		goto err3;
+ 	}
+ 
+@@ -224,10 +222,6 @@ int __devinit mantis_dvb_init(struct mantis_pci *mantis)
+ 			dprintk(MANTIS_ERROR, 1, "!!! NO Frontends found !!!");
+ 			goto err5;
+ 		} else {
+-//			if (mantis->dvb_adapter == NULL) {
+-//				dprintk(MANTIS_ERROR, 1, "DVB adapter <NULL>");
+-//				goto err5;
+-//			}
+ 			if (mantis->fe == NULL) {
+ 				dprintk(MANTIS_ERROR, 1, "FE <NULL>");
+ 				goto err5;
+@@ -277,7 +271,7 @@ int __devexit mantis_dvb_exit(struct mantis_pci *mantis)
+ 	int err;
+ 
+ 	if (mantis->fe) {
+-//		mantis_ca_exit(mantis);
++		/* mantis_ca_exit(mantis); */
+ 		err = mantis_frontend_shutdown(mantis);
+ 		if (err != 0)
+ 			dprintk(MANTIS_ERROR, 1, "Frontend exit while POWER ON! <%d>", err);
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index 7bb4e78..dd38b93 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -225,7 +225,7 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ 
+ 	init_waitqueue_head(&mantis->i2c_wq);
+ 	mutex_init(&mantis->i2c_lock);
+-	strncpy(i2c_adapter->name, "Mantis I2C", sizeof (i2c_adapter->name));
++	strncpy(i2c_adapter->name, "Mantis I2C", sizeof(i2c_adapter->name));
+ 	i2c_set_adapdata(i2c_adapter, mantis);
+ 
+ 	i2c_adapter->owner	= THIS_MODULE;
+diff --git a/drivers/media/dvb/mantis/mantis_input.c b/drivers/media/dvb/mantis/mantis_input.c
+index b27d775..487d149 100644
+--- a/drivers/media/dvb/mantis/mantis_input.c
++++ b/drivers/media/dvb/mantis/mantis_input.c
+@@ -36,9 +36,9 @@ static struct ir_scancode mantis_ir_table[] = {
+ 	{ 0x29, KEY_POWER	},
+ 	{ 0x28, KEY_FAVORITES	},
+ 	{ 0x30, KEY_TEXT	},
+-	{ 0x17, KEY_INFO	}, // Preview
++	{ 0x17, KEY_INFO	}, /* Preview */
+ 	{ 0x23, KEY_EPG		},
+-	{ 0x3b, KEY_F22		},// Record List
++	{ 0x3b, KEY_F22		}, /* Record List */
+ 	{ 0x3c, KEY_1		},
+ 	{ 0x3e, KEY_2		},
+ 	{ 0x39, KEY_3		},
+@@ -71,22 +71,22 @@ static struct ir_scancode mantis_ir_table[] = {
+ 
+ 	{ 0x1f, KEY_REWIND	},
+ 	{ 0x2d, KEY_FASTFORWARD	},
+-	{ 0x1e, KEY_PREVIOUS	}, // Replay |<
+-	{ 0x1d, KEY_NEXT	}, // Skip   >|
++	{ 0x1e, KEY_PREVIOUS	}, /* Replay |< */
++	{ 0x1d, KEY_NEXT	}, /* Skip   >| */
+ 
+-	{ 0x0b, KEY_CAMERA	}, // Capture
+-	{ 0x0f, KEY_LANGUAGE	}, // SAP
+-	{ 0x18, KEY_MODE	}, // PIP
+-	{ 0x12, KEY_ZOOM	}, // Full screen,
++	{ 0x0b, KEY_CAMERA	}, /* Capture */
++	{ 0x0f, KEY_LANGUAGE	}, /* SAP */
++	{ 0x18, KEY_MODE	}, /* PIP */
++	{ 0x12, KEY_ZOOM	}, /* Full screen */
+ 	{ 0x1c, KEY_SUBTITLE	},
+ 	{ 0x2f, KEY_MUTE	},
+-	{ 0x16, KEY_F20		}, // L/R,
+-	{ 0x38, KEY_F21		}, // Hibernate,
++	{ 0x16, KEY_F20		}, /* L/R */
++	{ 0x38, KEY_F21		}, /* Hibernate */
+ 
+-	{ 0x37, KEY_SWITCHVIDEOMODE }, // A/V
+-	{ 0x31, KEY_AGAIN	}, // Recall,
+-	{ 0x1a, KEY_KPPLUS	}, // Zoom+,
+-	{ 0x19, KEY_KPMINUS	}, // Zoom-,
++	{ 0x37, KEY_SWITCHVIDEOMODE }, /* A/V */
++	{ 0x31, KEY_AGAIN	}, /* Recall */
++	{ 0x1a, KEY_KPPLUS	}, /* Zoom+ */
++	{ 0x19, KEY_KPMINUS	}, /* Zoom- */
+ 	{ 0x27, KEY_RED		},
+ 	{ 0x0C, KEY_GREEN	},
+ 	{ 0x01, KEY_YELLOW	},
+diff --git a/drivers/media/dvb/mantis/mantis_reg.h b/drivers/media/dvb/mantis/mantis_reg.h
+index 0072e14..c2f572b 100644
+--- a/drivers/media/dvb/mantis/mantis_reg.h
++++ b/drivers/media/dvb/mantis/mantis_reg.h
+@@ -29,7 +29,7 @@
+ #define MANTIS_INT_RISCEN		(0x01 << 27)
+ #define MANTIS_INT_I2CRACK		(0x01 << 26)
+ 
+-//#define MANTIS_INT_GPIF			(0xff << 12)
++/* #define MANTIS_INT_GPIF			(0xff << 12) */
+ 
+ #define MANTIS_INT_PCMCIA7		(0x01 << 19)
+ #define MANTIS_INT_PCMCIA6		(0x01 << 18)
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index c9760b0..3c62be3 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -93,7 +93,7 @@ int lgtdqcs001f_tuner_set(struct dvb_frontend *fe,
+ 	u32 div;
+ 
+ 
+-	struct i2c_msg msg = {.addr = 0x61, .flags = 0, .buf = buf, .len = sizeof (buf) };
++	struct i2c_msg msg = {.addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf)};
+ 
+ 	div = params->frequency / 250;
+ 
+@@ -140,12 +140,12 @@ int lgtdqcs001f_set_symbol_rate(struct dvb_frontend *fe,
+ 		aclk = 0xb4;
+ 		bclk = 0x51;
+ 	}
+-	stv0299_writereg (fe, 0x13, aclk);
+-	stv0299_writereg (fe, 0x14, bclk);
++	stv0299_writereg(fe, 0x13, aclk);
++	stv0299_writereg(fe, 0x14, bclk);
+ 
+-	stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff);
+-	stv0299_writereg (fe, 0x20, (ratio >>  8) & 0xff);
+-	stv0299_writereg (fe, 0x21, (ratio      ) & 0xf0);
++	stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
++	stv0299_writereg(fe, 0x20, (ratio >>  8) & 0xff);
++	stv0299_writereg(fe, 0x21,  ratio & 0xf0);
+ 
+ 	return 0;
+ }
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index 7ddd149..36486b5 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -62,7 +62,7 @@ int vp1034_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
+ 		dprintk(MANTIS_ERROR, 1, "Frontend (dummy) POWERDOWN");
+ 		break;
+ 	default:
+-		dprintk(MANTIS_ERROR, 1, "Invalid = (%d)", (u32 ) voltage);
++		dprintk(MANTIS_ERROR, 1, "Invalid = (%d)", (u32) voltage);
+ 		return -EINVAL;
+ 	}
+ 	mmwrite(0x00, MANTIS_GPIF_DOUT);
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index 368fc81..515346d 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -44,7 +44,7 @@
+ 
+ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
+ 
+-//	 0x0000000b ,	/* SYSREG */
++	/* 0x0000000b, *//* SYSREG */
+ 	{ STB0899_DEV_ID		, 0x30 },
+ 	{ STB0899_DISCNTRL1		, 0x32 },
+ 	{ STB0899_DISCNTRL2     	, 0x80 },
+@@ -55,7 +55,7 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_1[] = {
+ 	{ STB0899_DISSTATUS		, 0x20 },
+ 	{ STB0899_DISF22        	, 0x99 },
+ 	{ STB0899_DISF22RX      	, 0xa8 },
+-	//SYSREG ?
++	/* SYSREG ? */
+ 	{ STB0899_ACRPRESC      	, 0x11 },
+ 	{ STB0899_ACRDIV1       	, 0x0a },
+ 	{ STB0899_ACRDIV2       	, 0x05 },
+@@ -323,9 +323,8 @@ static int vp1041_frontend_init(struct mantis_pci *mantis, struct dvb_frontend *
+ 				vp1041_stb0899_config.demod_address);
+ 
+ 			if (stb6100_attach(mantis->fe, &vp1041_stb6100_config, adapter)) {
+-				if (!lnbp21_attach(mantis->fe, adapter, 0, 0)) {
+-					printk("%s: No LNBP21 found!\n", __func__);
+-				}
++				if (!lnbp21_attach(mantis->fe, adapter, 0, 0))
++					dprintk(MANTIS_ERROR, 1, "No LNBP21 found!");
+ 			}
+ 		} else {
+ 			return -EREMOTEIO;
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index 45f7174..07d468f 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -71,7 +71,7 @@ static int tda1002x_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_fronten
+ 	struct i2c_adapter *adapter = &mantis->adapter;
+ 
+ 	u8 buf[6];
+-	struct i2c_msg msg = {.addr = 0x60, .flags = 0, .buf = buf, .len = sizeof (buf) };
++	struct i2c_msg msg = {.addr = 0x60, .flags = 0, .buf = buf, .len = sizeof(buf)};
+ 	int i;
+ 
+ #define CU1216_IF 36125000
+diff --git a/drivers/media/dvb/mantis/mantis_vp2040.c b/drivers/media/dvb/mantis/mantis_vp2040.c
+index 8471bff..a7ca233 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2040.c
++++ b/drivers/media/dvb/mantis/mantis_vp2040.c
+@@ -53,7 +53,7 @@ static int tda1002x_cu1216_tuner_set(struct dvb_frontend *fe, struct dvb_fronten
+ 	struct i2c_adapter *adapter	= &mantis->adapter;
+ 
+ 	u8 buf[6];
+-	struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = buf,.len = sizeof (buf) };
++	struct i2c_msg msg = {.addr = 0x60, .flags = 0, .buf = buf, .len = sizeof(buf)};
+ 	int i;
+ 
+ #define CU1216_IF 36125000
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0109-V4L-DVB-13810-MB86A16-Use-DVB_-macros.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0109-V4L-DVB-13810-MB86A16-Use-DVB_-macros.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,47 @@
+From 0f39ef5618242df3310ab40bc62edb8dd6cf930e Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Tue, 15 Dec 2009 09:01:27 -0300
+Subject: [PATCH 109/120] V4L/DVB (13810): [MB86A16] Use DVB_* macros
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 28fddb7cd5b7a12b81c8ec1a358749e60760e741)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.h |   14 ++++++++++++++
+ 1 files changed, 14 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.h b/drivers/media/dvb/frontends/mb86a16.h
+index 68f25a6..a88a6a1 100644
+--- a/drivers/media/dvb/frontends/mb86a16.h
++++ b/drivers/media/dvb/frontends/mb86a16.h
+@@ -31,8 +31,22 @@ struct mb86a16_config {
+ 	int (*set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
+ };
+ 
++
++
++#if defined(CONFIG_DVB_MB86A16) || (defined(CONFIG_DVB_MB86A16_MODULE) && defined(MODULE))
++
+ extern struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
+ 					   struct i2c_adapter *i2c_adap);
+ 
++#else
++
++static inline struct dvb_frontend *mb86a16_attach(const struct mb86a16_config *config,
++					   struct i2c_adapter *i2c_adap)
++{
++	printk(KERN_WARNING "%s: Driver disabled by Kconfig\n", __func__);
++	return NULL;
++}
++
++#endif /* CONFIG_DVB_MB86A16 */
+ 
+ #endif /* __MB86A16_H */
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0110-V4L-DVB-13811-MB86A16-Update-Copyright-header.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0110-V4L-DVB-13811-MB86A16-Update-Copyright-header.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,61 @@
+From d3c5e48cc0d8cbbfdc624fe6d1af1e03a23ef76f Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Tue, 15 Dec 2009 09:04:59 -0300
+Subject: [PATCH 110/120] V4L/DVB (13811): [MB86A16] Update Copyright header
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 4cd191fba45ee3cf3035d7e4d3a942979cd9c5e4)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/mb86a16.c      |    2 +-
+ drivers/media/dvb/frontends/mb86a16.h      |    2 +-
+ drivers/media/dvb/frontends/mb86a16_priv.h |    2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/mb86a16.c b/drivers/media/dvb/frontends/mb86a16.c
+index 32f20c6..d05f750 100644
+--- a/drivers/media/dvb/frontends/mb86a16.c
++++ b/drivers/media/dvb/frontends/mb86a16.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/frontends/mb86a16.h b/drivers/media/dvb/frontends/mb86a16.h
+index a88a6a1..6ea8c37 100644
+--- a/drivers/media/dvb/frontends/mb86a16.h
++++ b/drivers/media/dvb/frontends/mb86a16.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/frontends/mb86a16_priv.h b/drivers/media/dvb/frontends/mb86a16_priv.h
+index d8757fa..360a35a 100644
+--- a/drivers/media/dvb/frontends/mb86a16_priv.h
++++ b/drivers/media/dvb/frontends/mb86a16_priv.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Fujitsu MB86A16 DVB-S/DSS DC Receiver driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0111-V4L-DVB-13812-Mantis-Hopper-Update-Copyright-header.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0111-V4L-DVB-13812-Mantis-Hopper-Update-Copyright-header.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,673 @@
+From 757a9fab2ec0671cc0aff0777f096725eabb5ab0 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Tue, 15 Dec 2009 09:13:49 -0300
+Subject: [PATCH 111/120] V4L/DVB (13812): [Mantis/Hopper] Update Copyright header
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 8825a0970cef408fb2f1a44e3cb05d6ba41a18db)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/hopper_cards.c  |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/hopper_vp3028.c |    4 ++--
+ drivers/media/dvb/mantis/hopper_vp3028.h |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_ca.c     |    2 +-
+ drivers/media/dvb/mantis/mantis_ca.h     |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_cards.c  |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_common.h |    2 +-
+ drivers/media/dvb/mantis/mantis_core.c   |    2 +-
+ drivers/media/dvb/mantis/mantis_core.h   |    2 +-
+ drivers/media/dvb/mantis/mantis_dma.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_dma.h    |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_dvb.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_dvb.h    |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_evm.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_hif.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_hif.h    |    2 +-
+ drivers/media/dvb/mantis/mantis_i2c.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_i2c.h    |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_ioc.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_ioc.h    |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_link.h   |    2 +-
+ drivers/media/dvb/mantis/mantis_pci.c    |    2 +-
+ drivers/media/dvb/mantis/mantis_pci.h    |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_pcmcia.c |    2 +-
+ drivers/media/dvb/mantis/mantis_reg.h    |    2 +-
+ drivers/media/dvb/mantis/mantis_uart.h   |    2 +-
+ drivers/media/dvb/mantis/mantis_vp1033.c |    2 +-
+ drivers/media/dvb/mantis/mantis_vp1033.h |    2 +-
+ drivers/media/dvb/mantis/mantis_vp1034.c |    2 +-
+ drivers/media/dvb/mantis/mantis_vp1034.h |    2 +-
+ drivers/media/dvb/mantis/mantis_vp2033.c |    2 +-
+ drivers/media/dvb/mantis/mantis_vp2033.h |    2 +-
+ drivers/media/dvb/mantis/mantis_vp3028.c |    2 +-
+ drivers/media/dvb/mantis/mantis_vp3028.h |   20 ++++++++++++++++++++
+ drivers/media/dvb/mantis/mantis_vp3030.c |    2 +-
+ drivers/media/dvb/mantis/mantis_vp3030.h |    2 +-
+ 36 files changed, 227 insertions(+), 27 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
+index ca70149..d073c61 100644
+--- a/drivers/media/dvb/mantis/hopper_cards.c
++++ b/drivers/media/dvb/mantis/hopper_cards.c
+@@ -1,3 +1,23 @@
++/*
++	Hopper PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #include <linux/module.h>
+ #include <linux/moduleparam.h>
+ #include <linux/kernel.h>
+diff --git a/drivers/media/dvb/mantis/hopper_vp3028.c b/drivers/media/dvb/mantis/hopper_vp3028.c
+index 76cad87..96674c7 100644
+--- a/drivers/media/dvb/mantis/hopper_vp3028.c
++++ b/drivers/media/dvb/mantis/hopper_vp3028.c
+@@ -1,7 +1,7 @@
+ /*
+-	Mantis VP-3028 driver
++	Hopper VP-3028 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/hopper_vp3028.h b/drivers/media/dvb/mantis/hopper_vp3028.h
+index e8a3c22..5723949 100644
+--- a/drivers/media/dvb/mantis/hopper_vp3028.h
++++ b/drivers/media/dvb/mantis/hopper_vp3028.h
+@@ -1,3 +1,23 @@
++/*
++	Hopper VP-3028 driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_VP3028_H
+ #define __MANTIS_VP3028_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_ca.c b/drivers/media/dvb/mantis/mantis_ca.c
+index 2f3ba81..403ce04 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.c
++++ b/drivers/media/dvb/mantis/mantis_ca.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_ca.h b/drivers/media/dvb/mantis/mantis_ca.h
+index b7e48ee..dc63e55 100644
+--- a/drivers/media/dvb/mantis/mantis_ca.h
++++ b/drivers/media/dvb/mantis/mantis_ca.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_CA_H
+ #define __MANTIS_CA_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
+index a4250fa..16f1708 100644
+--- a/drivers/media/dvb/mantis/mantis_cards.c
++++ b/drivers/media/dvb/mantis/mantis_cards.c
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #include <linux/module.h>
+ #include <linux/moduleparam.h>
+ #include <linux/kernel.h>
+diff --git a/drivers/media/dvb/mantis/mantis_common.h b/drivers/media/dvb/mantis/mantis_common.h
+index c2d0854..d0b645a 100644
+--- a/drivers/media/dvb/mantis/mantis_common.h
++++ b/drivers/media/dvb/mantis/mantis_common.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_core.c b/drivers/media/dvb/mantis/mantis_core.c
+index 3ddc9ba..8113b23 100644
+--- a/drivers/media/dvb/mantis/mantis_core.c
++++ b/drivers/media/dvb/mantis/mantis_core.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_core.h b/drivers/media/dvb/mantis/mantis_core.h
+index 8511b0c..833ee42 100644
+--- a/drivers/media/dvb/mantis/mantis_core.h
++++ b/drivers/media/dvb/mantis/mantis_core.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_dma.c b/drivers/media/dvb/mantis/mantis_dma.c
+index adad1f3..46202a4 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.c
++++ b/drivers/media/dvb/mantis/mantis_dma.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_dma.h b/drivers/media/dvb/mantis/mantis_dma.h
+index 4cba876..6be00fa 100644
+--- a/drivers/media/dvb/mantis/mantis_dma.h
++++ b/drivers/media/dvb/mantis/mantis_dma.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_DMA_H
+ #define __MANTIS_DMA_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.c b/drivers/media/dvb/mantis/mantis_dvb.c
+index 8982d6f..99d82ee 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.c
++++ b/drivers/media/dvb/mantis/mantis_dvb.c
+@@ -1,6 +1,6 @@
+ /*
+ 	Mantis PCI bridge driver
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_dvb.h b/drivers/media/dvb/mantis/mantis_dvb.h
+index 31ebbb4..464199d 100644
+--- a/drivers/media/dvb/mantis/mantis_dvb.h
++++ b/drivers/media/dvb/mantis/mantis_dvb.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_DVB_H
+ #define __MANTIS_DVB_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_evm.c b/drivers/media/dvb/mantis/mantis_evm.c
+index 9304b0e..a7b369a 100644
+--- a/drivers/media/dvb/mantis/mantis_evm.c
++++ b/drivers/media/dvb/mantis/mantis_evm.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 73e5ca0..7477dac 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_hif.h b/drivers/media/dvb/mantis/mantis_hif.h
+index f960c0a..9094f9e 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.h
++++ b/drivers/media/dvb/mantis/mantis_hif.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index dd38b93..b7df345 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.h b/drivers/media/dvb/mantis/mantis_i2c.h
+index d40da4f..1342df2 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.h
++++ b/drivers/media/dvb/mantis/mantis_i2c.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_I2C_H
+ #define __MANTIS_I2C_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_ioc.c b/drivers/media/dvb/mantis/mantis_ioc.c
+index dd66369..de148de 100644
+--- a/drivers/media/dvb/mantis/mantis_ioc.c
++++ b/drivers/media/dvb/mantis/mantis_ioc.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_ioc.h b/drivers/media/dvb/mantis/mantis_ioc.h
+index 2052640..188fe5a 100644
+--- a/drivers/media/dvb/mantis/mantis_ioc.h
++++ b/drivers/media/dvb/mantis/mantis_ioc.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_IOC_H
+ #define __MANTIS_IOC_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_link.h b/drivers/media/dvb/mantis/mantis_link.h
+index f6030c9..2a81477 100644
+--- a/drivers/media/dvb/mantis/mantis_link.h
++++ b/drivers/media/dvb/mantis/mantis_link.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 5165a39..5e4f576 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_pci.h b/drivers/media/dvb/mantis/mantis_pci.h
+index 5ce776f..65f0045 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.h
++++ b/drivers/media/dvb/mantis/mantis_pci.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis PCI bridge driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_PCI_H
+ #define __MANTIS_PCI_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_pcmcia.c b/drivers/media/dvb/mantis/mantis_pcmcia.c
+index d6bca3e..5cb545b 100644
+--- a/drivers/media/dvb/mantis/mantis_pcmcia.c
++++ b/drivers/media/dvb/mantis/mantis_pcmcia.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_reg.h b/drivers/media/dvb/mantis/mantis_reg.h
+index c2f572b..7761f9d 100644
+--- a/drivers/media/dvb/mantis/mantis_reg.h
++++ b/drivers/media/dvb/mantis/mantis_reg.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_uart.h b/drivers/media/dvb/mantis/mantis_uart.h
+index 62ab66e..ffb62a0 100644
+--- a/drivers/media/dvb/mantis/mantis_uart.h
++++ b/drivers/media/dvb/mantis/mantis_uart.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis PCI bridge driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.c b/drivers/media/dvb/mantis/mantis_vp1033.c
+index 3c62be3..4a723bd 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.c
++++ b/drivers/media/dvb/mantis/mantis_vp1033.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-1033 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp1033.h b/drivers/media/dvb/mantis/mantis_vp1033.h
+index 2c18d21..7daaa1b 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1033.h
++++ b/drivers/media/dvb/mantis/mantis_vp1033.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-1033 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.c b/drivers/media/dvb/mantis/mantis_vp1034.c
+index 36486b5..8e6ae55 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.c
++++ b/drivers/media/dvb/mantis/mantis_vp1034.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-1034 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp1034.h b/drivers/media/dvb/mantis/mantis_vp1034.h
+index 3026912..323f38e 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1034.h
++++ b/drivers/media/dvb/mantis/mantis_vp1034.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-1034 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.c b/drivers/media/dvb/mantis/mantis_vp2033.c
+index 07d468f..10ce817 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.c
++++ b/drivers/media/dvb/mantis/mantis_vp2033.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-2033 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp2033.h b/drivers/media/dvb/mantis/mantis_vp2033.h
+index e6c5fe8..c55242b 100644
+--- a/drivers/media/dvb/mantis/mantis_vp2033.h
++++ b/drivers/media/dvb/mantis/mantis_vp2033.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-2033 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp3028.c b/drivers/media/dvb/mantis/mantis_vp3028.c
+index 7f8918c..4155c83 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3028.c
++++ b/drivers/media/dvb/mantis/mantis_vp3028.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-3028 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp3028.h b/drivers/media/dvb/mantis/mantis_vp3028.h
+index c51628d..b07be6a 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3028.h
++++ b/drivers/media/dvb/mantis/mantis_vp3028.h
+@@ -1,3 +1,23 @@
++/*
++	Mantis VP-3028 driver
++
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
++
++	This program is free software; you can redistribute it and/or modify
++	it under the terms of the GNU General Public License as published by
++	the Free Software Foundation; either version 2 of the License, or
++	(at your option) any later version.
++
++	This program is distributed in the hope that it will be useful,
++	but WITHOUT ANY WARRANTY; without even the implied warranty of
++	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++	GNU General Public License for more details.
++
++	You should have received a copy of the GNU General Public License
++	along with this program; if not, write to the Free Software
++	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++*/
++
+ #ifndef __MANTIS_VP3028_H
+ #define __MANTIS_VP3028_H
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.c b/drivers/media/dvb/mantis/mantis_vp3030.c
+index 1895e95..1f43342 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.c
++++ b/drivers/media/dvb/mantis/mantis_vp3030.c
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-3030 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+diff --git a/drivers/media/dvb/mantis/mantis_vp3030.h b/drivers/media/dvb/mantis/mantis_vp3030.h
+index 0a110ba..5f12c42 100644
+--- a/drivers/media/dvb/mantis/mantis_vp3030.h
++++ b/drivers/media/dvb/mantis/mantis_vp3030.h
+@@ -1,7 +1,7 @@
+ /*
+ 	Mantis VP-3030 driver
+ 
+-	Copyright (C) 2005, 2006 Manu Abraham (abraham.manu at gmail.com)
++	Copyright (C) Manu Abraham (abraham.manu at gmail.com)
+ 
+ 	This program is free software; you can redistribute it and/or modify
+ 	it under the terms of the GNU General Public License as published by
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0112-V4L-DVB-13808b-mantis-replace-DMA_nnBIT_MASK-to-DMA_.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0112-V4L-DVB-13808b-mantis-replace-DMA_nnBIT_MASK-to-DMA_.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,35 @@
+From 02a15cfbd0f3999572dffde165154b6e8c480ea8 Mon Sep 17 00:00:00 2001
+From: Mauro Carvalho Chehab <mchehab at redhat.com>
+Date: Thu, 17 Dec 2009 00:06:04 -0200
+Subject: [PATCH 112/120] V4L/DVB (13808b): mantis: replace DMA_nnBIT_MASK to DMA_BIT_MASK(32)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+drivers/media/dvb/mantis/mantis_pci.c: In function ‘mantis_pci_init’:
+drivers/media/dvb/mantis/mantis_pci.c:76: warning: ‘DMA_nnBIT_MASK’ is deprecated
+
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 184ac7535ee078a4572b668a348134d67c3977d2)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_pci.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 5e4f576..e7cd8aa 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -73,7 +73,7 @@ int __devinit mantis_pci_init(struct mantis_pci *mantis)
+ 		goto fail0;
+ 	}
+ 
+-	err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
++	err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
+ 	if (err != 0) {
+ 		dprintk(MANTIS_ERROR, 1, "ERROR: Unable to obtain 32 bit DMA <%i>", err);
+ 		ret = -ENOMEM;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0113-V4L-DVB-13824a-mantis-Fix-__devexit-bad-annotations.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0113-V4L-DVB-13824a-mantis-Fix-__devexit-bad-annotations.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,144 @@
+From 2d3215f80199496fa1db84ad0ee1fbac8453c573 Mon Sep 17 00:00:00 2001
+From: Mauro Carvalho Chehab <mchehab at redhat.com>
+Date: Fri, 18 Dec 2009 09:58:46 -0200
+Subject: [PATCH 113/120] V4L/DVB(13824a): mantis: Fix __devexit bad annotations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+WARNING: drivers/media/dvb/mantis/built-in.o(.devinit.text+0x13d7): Section mismatch in reference from the function mantis_pci_probe() to the function .devexit.text:mantis_i2c_exit()
+The function __devinit mantis_pci_probe() references
+a function __devexit mantis_i2c_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_i2c_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/dvb/mantis/built-in.o(.devinit.text+0x1433): Section mismatch in reference from the function mantis_pci_probe() to the function .devexit.text:mantis_pci_exit()
+The function __devinit mantis_pci_probe() references
+a function __devexit mantis_pci_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_pci_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/dvb/mantis/built-in.o(.devinit.text+0x185e): Section mismatch in reference from the function hopper_pci_probe() to the function
+.devexit.text:mantis_i2c_exit()
+The function __devinit hopper_pci_probe() references
+a function __devexit mantis_i2c_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_i2c_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/dvb/mantis/built-in.o(.devinit.text+0x18ba): Section mismatch in reference from the function hopper_pci_probe() to the function .devexit.text:mantis_pci_exit()
+The function __devinit hopper_pci_probe() references
+a function __devexit mantis_pci_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_pci_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/dvb/built-in.o(.devinit.text+0x68b8): Section mismatch in reference from the function mantis_pci_probe() to the function .devexit.text:mantis_i2c_exit()
+The function __devinit mantis_pci_probe() references
+a function __devexit mantis_i2c_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_i2c_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/dvb/built-in.o(.devinit.text+0x6914): Section mismatch in reference from the function mantis_pci_probe() to the function .devexit.text:mantis_pci_exit()
+The function __devinit mantis_pci_probe() references
+a function __devexit mantis_pci_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_pci_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/dvb/built-in.o(.devinit.text+0x6d3f): Section mismatch in reference from the function hopper_pci_probe() to the function .devexit.text:mantis_i2c_exit()
+The function __devinit hopper_pci_probe() references
+a function __devexit mantis_i2c_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_i2c_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/dvb/built-in.o(.devinit.text+0x6d9b): Section mismatch in reference from the function hopper_pci_probe() to the function .devexit.text:mantis_pci_exit()
+The function __devinit hopper_pci_probe() references
+a function __devexit mantis_pci_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_pci_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/built-in.o(.devinit.text+0x14634): Section mismatch in reference from the function mantis_pci_probe() to the function .devexit.text:mantis_i2c_exit()
+The function __devinit mantis_pci_probe() references
+a function __devexit mantis_i2c_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_i2c_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/built-in.o(.devinit.text+0x14690): Section mismatch in reference from the function mantis_pci_probe() to the function .devexit.text:mantis_pci_exit()
+The function __devinit mantis_pci_probe() references
+a function __devexit mantis_pci_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_pci_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/built-in.o(.devinit.text+0x14abb): Section mismatch in reference from the function hopper_pci_probe() to the function .devexit.text:mantis_i2c_exit()
+The function __devinit hopper_pci_probe() references
+a function __devexit mantis_i2c_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_i2c_exit() so it may be used outside an exit section.
+
+WARNING: drivers/media/built-in.o(.devinit.text+0x14b17): Section mismatch in reference from the function hopper_pci_probe() to the function .devexit.text:mantis_pci_exit()
+The function __devinit hopper_pci_probe() references
+a function __devexit mantis_pci_exit().
+This is often seen when error handling in the init function
+uses functionality in the exit path.
+The fix is often to remove the __devexit annotation of
+mantis_pci_exit() so it may be used outside an exit section.
+
+Acked-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 4cf0b3f130a4fe573077e4d0237fd3dd0f67d3f6)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_i2c.c |    2 +-
+ drivers/media/dvb/mantis/mantis_pci.c |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_i2c.c b/drivers/media/dvb/mantis/mantis_i2c.c
+index b7df345..7870bcf 100644
+--- a/drivers/media/dvb/mantis/mantis_i2c.c
++++ b/drivers/media/dvb/mantis/mantis_i2c.c
+@@ -253,7 +253,7 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
+ }
+ EXPORT_SYMBOL_GPL(mantis_i2c_init);
+ 
+-int __devexit mantis_i2c_exit(struct mantis_pci *mantis)
++int mantis_i2c_exit(struct mantis_pci *mantis)
+ {
+ 	u32 intmask;
+ 
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index e7cd8aa..6c7534a 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -155,7 +155,7 @@ fail0:
+ }
+ EXPORT_SYMBOL_GPL(mantis_pci_init);
+ 
+-void __devexit mantis_pci_exit(struct mantis_pci *mantis)
++void mantis_pci_exit(struct mantis_pci *mantis)
+ {
+ 	struct pci_dev *pdev = mantis->pdev;
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0114-V4L-DVB-13851-Fix-Input-dependency-for-Mantis.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0114-V4L-DVB-13851-Fix-Input-dependency-for-Mantis.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,45 @@
+From 67a3a1b7aee8c0ca9ab5fade6074d7aa4b90ebed Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Sat, 19 Dec 2009 14:11:50 -0300
+Subject: [PATCH 114/120] V4L/DVB (13851): Fix Input dependency for Mantis
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+>
+>
+>
+> CONFIG_INPUT=n
+
+As reported by Randy Dunlap <randy.dunlap at oracle.com>:
+> ERROR: "ir_input_register" [drivers/media/dvb/mantis/mantis_core.ko] undefined!
+> ERROR: "ir_input_unregister" [drivers/media/dvb/mantis/mantis_core.ko] undefined!
+> ERROR: "ir_input_init" [drivers/media/dvb/mantis/mantis_core.ko] undefined!
+> ERROR: "input_free_device" [drivers/media/dvb/mantis/mantis_core.ko] undefined!
+> ERROR: "input_allocate_device" [drivers/media/dvb/mantis/mantis_core.ko] undefined!
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Acked-by: Randy Dunlap <randy.dunlap at oracle.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit fcd89de3bd1c8735f9b7c759dc4848ab6e525bb9)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/Kconfig |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/Kconfig b/drivers/media/dvb/mantis/Kconfig
+index f9219cd..f7b72a3 100644
+--- a/drivers/media/dvb/mantis/Kconfig
++++ b/drivers/media/dvb/mantis/Kconfig
+@@ -1,6 +1,6 @@
+ config MANTIS_CORE
+ 	tristate "Mantis/Hopper PCI bridge based devices"
+-	depends on PCI && I2C
++	depends on PCI && I2C && INPUT
+ 
+ 	help
+ 	  Support for PCI cards based on the Mantis and Hopper PCi bridge.
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0115-V4L-DVB-Mantis-remove-duplicated-include.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0115-V4L-DVB-Mantis-remove-duplicated-include.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,54 @@
+From 6d041ae6aac8101e571a8dbbeb032a8f47f99645 Mon Sep 17 00:00:00 2001
+From: Huang Weiyi <weiyi.huang at gmail.com>
+Date: Tue, 19 Jan 2010 19:43:44 -0300
+Subject: [PATCH 115/120] V4L/DVB: [Mantis] remove duplicated #include
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Remove duplicated #include('s) in
+  drivers/media/dvb/mantis/mantis_hif.c
+  drivers/media/dvb/mantis/mantis_pci.c
+
+Signed-off-by: Huang Weiyi <weiyi.huang at gmail.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 2c1fee024d86b718b3198f664747c9028776c751)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_hif.c |    2 --
+ drivers/media/dvb/mantis/mantis_pci.c |    5 -----
+ 2 files changed, 0 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_hif.c b/drivers/media/dvb/mantis/mantis_hif.c
+index 7477dac..5772ebb 100644
+--- a/drivers/media/dvb/mantis/mantis_hif.c
++++ b/drivers/media/dvb/mantis/mantis_hif.c
+@@ -22,8 +22,6 @@
+ #include <linux/signal.h>
+ #include <linux/sched.h>
+ 
+-#include <linux/signal.h>
+-#include <linux/sched.h>
+ #include <linux/interrupt.h>
+ 
+ #include "dmxdev.h"
+diff --git a/drivers/media/dvb/mantis/mantis_pci.c b/drivers/media/dvb/mantis/mantis_pci.c
+index 6c7534a..59feeb8 100644
+--- a/drivers/media/dvb/mantis/mantis_pci.c
++++ b/drivers/media/dvb/mantis/mantis_pci.c
+@@ -41,11 +41,6 @@
+ #include "dvb_frontend.h"
+ #include "dvb_net.h"
+ 
+-#include <asm/irq.h>
+-#include <linux/signal.h>
+-#include <linux/sched.h>
+-#include <linux/interrupt.h>
+-
+ #include "mantis_common.h"
+ #include "mantis_reg.h"
+ #include "mantis_pci.h"
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0116-V4L-DVB-dvb-fix-sparse-warnings.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0116-V4L-DVB-dvb-fix-sparse-warnings.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,39 @@
+From 8fe80a7c261f00bccee19c840855e192572da86a Mon Sep 17 00:00:00 2001
+From: Randy Dunlap <randy.dunlap at oracle.com>
+Date: Sun, 14 Feb 2010 23:39:32 -0300
+Subject: [PATCH 116/120] V4L/DVB: dvb: fix sparse warnings
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Fix sparse warnings in media/dvb/frontends:
+
+drivers/media/dvb/frontends/dibx000_common.c:177:13: warning: non-ANSI function declaration of function 'systime'
+drivers/media/dvb/frontends/tda665x.c:136:55: warning: right shift by bigger than source value
+
+[mchehab at redhat.com: removed the change at dib0090 since it got fixed by a previous patch]
+Signed-off-by: Randy Dunlap <randy.dunlap at oracle.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked with conflict from commit 7ccf1eea972177064b4df9d5ba68958604781db6)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/tda665x.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/tda665x.c b/drivers/media/dvb/frontends/tda665x.c
+index 87d5273..c44fefe 100644
+--- a/drivers/media/dvb/frontends/tda665x.c
++++ b/drivers/media/dvb/frontends/tda665x.c
+@@ -133,7 +133,7 @@ static int tda665x_set_state(struct dvb_frontend *fe,
+ 		frequency += config->ref_divider >> 1;
+ 		frequency /= config->ref_divider;
+ 
+-		buf[0] = (u8) (frequency & 0x7f00) >> 8;
++		buf[0] = (u8) ((frequency & 0x7f00) >> 8);
+ 		buf[1] = (u8) (frequency & 0x00ff) >> 0;
+ 		buf[2] = 0x80 | 0x40 | 0x02;
+ 		buf[3] = 0x00;
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0117-V4L-DVB-Fix-bad-whitespacing.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0117-V4L-DVB-Fix-bad-whitespacing.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,60 @@
+From e25bf2cce8c176e73da9b637f444fefa1f5e6fed Mon Sep 17 00:00:00 2001
+From: Mauro Carvalho Chehab <mchehab at redhat.com>
+Date: Thu, 11 Mar 2010 01:58:12 -0300
+Subject: [PATCH 117/120] V4L/DVB: Fix bad whitespacing
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(mantis changes cherry picked from commit 000f64efc7fe6693261a78a0164c0e805553631b)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/mantis_vp1041.c |   10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/mantis_vp1041.c b/drivers/media/dvb/mantis/mantis_vp1041.c
+index 515346d..d1aa2bc 100644
+--- a/drivers/media/dvb/mantis/mantis_vp1041.c
++++ b/drivers/media/dvb/mantis/mantis_vp1041.c
+@@ -136,12 +136,12 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
+ 	{ STB0899_RCOMPC        	, 0xc9 },
+ 	{ STB0899_AGC1CN        	, 0x01 },
+ 	{ STB0899_AGC1REF       	, 0x10 },
+-	{ STB0899_RTC	        	, 0x23 },
++	{ STB0899_RTC			, 0x23 },
+ 	{ STB0899_TMGCFG        	, 0x4e },
+ 	{ STB0899_AGC2REF       	, 0x34 },
+ 	{ STB0899_TLSR          	, 0x84 },
+ 	{ STB0899_CFD           	, 0xf7 },
+-	{ STB0899_ACLC	        	, 0x87 },
++	{ STB0899_ACLC			, 0x87 },
+ 	{ STB0899_BCLC          	, 0x94 },
+ 	{ STB0899_EQON          	, 0x41 },
+ 	{ STB0899_LDT           	, 0xf1 },
+@@ -194,10 +194,10 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
+ 	{ STB0899_ECNT3M		, 0x0a },
+ 	{ STB0899_ECNT3L		, 0xad },
+ 	{ STB0899_FECAUTO1      	, 0x06 },
+-	{ STB0899_FECM	        	, 0x01 },
++	{ STB0899_FECM			, 0x01 },
+ 	{ STB0899_VTH12         	, 0xb0 },
+ 	{ STB0899_VTH23         	, 0x7a },
+-	{ STB0899_VTH34	        	, 0x58 },
++	{ STB0899_VTH34			, 0x58 },
+ 	{ STB0899_VTH56         	, 0x38 },
+ 	{ STB0899_VTH67         	, 0x34 },
+ 	{ STB0899_VTH78         	, 0x24 },
+@@ -206,7 +206,7 @@ static const struct stb0899_s1_reg vp1041_stb0899_s1_init_3[] = {
+ 	{ STB0899_RSULC         	, 0xb1 }, /* DVB = 0xb1, DSS = 0xa1 */
+ 	{ STB0899_TSULC         	, 0x42 },
+ 	{ STB0899_RSLLC         	, 0x41 },
+-	{ STB0899_TSLPL	        	, 0x12 },
++	{ STB0899_TSLPL			, 0x12 },
+ 	{ STB0899_TSCFGH        	, 0x0c },
+ 	{ STB0899_TSCFGM        	, 0x00 },
+ 	{ STB0899_TSCFGL        	, 0x00 },
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0118-V4L-DVB-13791-TDA10021-Do-not-claim-TDA10023.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0118-V4L-DVB-13791-TDA10021-Do-not-claim-TDA10023.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,36 @@
+From e53d66f416e45eba2e964de9d3d32af1087945aa Mon Sep 17 00:00:00 2001
+From: Niklas Edmundsson <nikke at acc.umu.se>
+Date: Fri, 4 Dec 2009 05:38:21 -0300
+Subject: [PATCH 118/120] V4L/DVB (13791): [TDA10021] Do not claim TDA10023
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Niklas Edmundsson <nikke at acc.umu.se>
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked from commit 4af699c13a5fb7332255de5fa56442d065f547a3)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/frontends/tda10021.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/frontends/tda10021.c b/drivers/media/dvb/frontends/tda10021.c
+index 6c1dbf9..6ca533e 100644
+--- a/drivers/media/dvb/frontends/tda10021.c
++++ b/drivers/media/dvb/frontends/tda10021.c
+@@ -426,6 +426,10 @@ struct dvb_frontend* tda10021_attach(const struct tda1002x_config* config,
+ 	id = tda10021_readreg(state, 0x1a);
+ 	if ((id & 0xf0) != 0x70) goto error;
+ 
++	/* Don't claim TDA10023 */
++	if (id == 0x7d)
++		goto error;
++
+ 	printk("TDA10021: i2c-addr = 0x%02x, id = 0x%02x\n",
+ 	       state->config->demod_address, id);
+ 
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0119-Mantis-hopper-use-MODULE_DEVICE_TABLE-use-the-macro-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0119-Mantis-hopper-use-MODULE_DEVICE_TABLE-use-the-macro-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,49 @@
+From d3536036a37e4808eeed99e783e4d2b181fdde50 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Thu, 11 Feb 2010 11:11:05 +0400
+Subject: [PATCH 119/120] Mantis, hopper: use MODULE_DEVICE_TABLE use the macro to make modules auto-loadable
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Thanks to Ozan ?a?layan <ozan at pardus.org.tr> for pointing it out
+
+From: Manu Abraham <abraham.manu at gmail.com>
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+(imported from http://jusst.de/hg/mantis-v4l-dvb/raw-rev/3731f71ed6bf)
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/mantis/hopper_cards.c |    2 ++
+ drivers/media/dvb/mantis/mantis_cards.c |    2 ++
+ 2 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/hopper_cards.c b/drivers/media/dvb/mantis/hopper_cards.c
+index d073c61..1bf03ac 100644
+--- a/drivers/media/dvb/mantis/hopper_cards.c
++++ b/drivers/media/dvb/mantis/hopper_cards.c
+@@ -250,6 +250,8 @@ static struct pci_device_id hopper_pci_table[] = {
+ 	{ }
+ };
+ 
++MODULE_DEVICE_TABLE(pci, hopper_pci_table);
++
+ static struct pci_driver hopper_pci_driver = {
+ 	.name		= DRIVER_NAME,
+ 	.id_table	= hopper_pci_table,
+diff --git a/drivers/media/dvb/mantis/mantis_cards.c b/drivers/media/dvb/mantis/mantis_cards.c
+index 16f1708..64970cf 100644
+--- a/drivers/media/dvb/mantis/mantis_cards.c
++++ b/drivers/media/dvb/mantis/mantis_cards.c
+@@ -280,6 +280,8 @@ static struct pci_device_id mantis_pci_table[] = {
+ 	{ }
+ };
+ 
++MODULE_DEVICE_TABLE(pci, mantis_pci_table);
++
+ static struct pci_driver mantis_pci_driver = {
+ 	.name		= DRIVER_NAME,
+ 	.id_table	= mantis_pci_table,
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0120-V4L-DVB-13808-Mantis-Hopper-Build-update-for-Mantis-.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0120-V4L-DVB-13808-Mantis-Hopper-Build-update-for-Mantis-.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,90 @@
+From 74001e9c32a6e55f0eba8a5b21fc434fa49b4222 Mon Sep 17 00:00:00 2001
+From: Manu Abraham <abraham.manu at gmail.com>
+Date: Sat, 5 Dec 2009 01:24:08 -0300
+Subject: [PATCH 120/120] V4L/DVB (13808): [Mantis/Hopper] Build update for Mantis/Hopper based cards
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Manu Abraham <manu at linuxtv.org>
+Signed-off-by: Mauro Carvalho Chehab <mchehab at redhat.com>
+(cherry picked with conflict from commit 8873c61f1fe849bc8719839ddfa3300266f8bc39)
+
+Signed-off-by: Bjørn Mork <bjorn at mork.no>
+---
+ drivers/media/dvb/Kconfig            |    4 ++++
+ drivers/media/dvb/Makefile           |   14 +++++++++++++-
+ drivers/media/dvb/frontends/Kconfig  |    8 ++++++++
+ drivers/media/dvb/frontends/Makefile |    1 +
+ 4 files changed, 26 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig
+index 35d0817..cf8f65f 100644
+--- a/drivers/media/dvb/Kconfig
++++ b/drivers/media/dvb/Kconfig
+@@ -72,6 +72,10 @@ comment "Supported Earthsoft PT1 Adapters"
+ 	depends on DVB_CORE && PCI && I2C
+ source "drivers/media/dvb/pt1/Kconfig"
+ 
++comment "Supported Mantis Adapters"
++	depends on DVB_CORE && PCI && I2C
++	source "drivers/media/dvb/mantis/Kconfig"
++
+ comment "Supported DVB Frontends"
+ 	depends on DVB_CORE
+ source "drivers/media/dvb/frontends/Kconfig"
+diff --git a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile
+index 16d262d..c12922c 100644
+--- a/drivers/media/dvb/Makefile
++++ b/drivers/media/dvb/Makefile
+@@ -2,6 +2,18 @@
+ # Makefile for the kernel multimedia device drivers.
+ #
+ 
+-obj-y        := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/ pt1/
++obj-y        := dvb-core/	\
++		frontends/	\
++		ttpci/		\
++		ttusb-dec/	\
++		ttusb-budget/	\
++		b2c2/		\
++		bt8xx/		\
++		dvb-usb/	\
++		pluto2/		\
++		siano/		\
++		dm1105/		\
++		pt1/		\
++		mantis/
+ 
+ obj-$(CONFIG_DVB_FIREDTV)	+= firewire/
+diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
+index 5a1d66c..683b2e3 100644
+--- a/drivers/media/dvb/frontends/Kconfig
++++ b/drivers/media/dvb/frontends/Kconfig
+@@ -201,6 +201,14 @@ config DVB_SI21XX
+ 	help
+ 	  A DVB-S tuner module. Say Y when you want to support this frontend.
+ 
++config DVB_MB86A16
++	tristate "Fujitsu MB86A16 based"
++	depends on DVB_CORE && I2C
++	default m if DVB_FE_CUSTOMISE
++	help
++	  A DVB-S/DSS Direct Conversion reveiver.
++	  Say Y when you want to support this frontend.
++
+ comment "DVB-T (terrestrial) frontends"
+ 	depends on DVB_CORE
+ 
+diff --git a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
+index af944a8..2e11e5c 100644
+--- a/drivers/media/dvb/frontends/Makefile
++++ b/drivers/media/dvb/frontends/Makefile
+@@ -77,3 +77,4 @@ obj-$(CONFIG_DVB_STV0900) += stv0900.o
+ obj-$(CONFIG_DVB_STV090x) += stv090x.o
+ obj-$(CONFIG_DVB_STV6110x) += stv6110x.o
+ obj-$(CONFIG_DVB_ISL6423) += isl6423.o
++obj-$(CONFIG_DVB_MB86A16) += mb86a16.o
+-- 
+1.7.1
+

Added: dists/sid/linux-2.6/debian/patches/features/all/mantis/0121-V4L-DVB-mantis-Select-correct-frontends.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/features/all/mantis/0121-V4L-DVB-mantis-Select-correct-frontends.patch	Thu Jun  3 01:02:13 2010	(r15824)
@@ -0,0 +1,48 @@
+From 95387e011a365a5309f6a6d621a215ab776b087a Mon Sep 17 00:00:00 2001
+From: Ben Hutchings <ben at decadent.org.uk>
+Date: Thu, 3 Jun 2010 01:42:13 +0100
+Subject: [PATCH] V4L/DVB: mantis: Select correct frontends
+
+Update the Kconfig selections to match the code.
+Add the usual condition of !DVB_FE_CUSTOMISE.
+
+Signed-off-by: Ben Hutchings <ben at decadent.org.uk>
+---
+ drivers/media/dvb/mantis/Kconfig |   14 ++++++++++----
+ 1 files changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/dvb/mantis/Kconfig b/drivers/media/dvb/mantis/Kconfig
+index f7b72a3..decdeda 100644
+--- a/drivers/media/dvb/mantis/Kconfig
++++ b/drivers/media/dvb/mantis/Kconfig
+@@ -10,9 +10,15 @@ config MANTIS_CORE
+ config DVB_MANTIS
+ 	tristate "MANTIS based cards"
+ 	depends on MANTIS_CORE && DVB_CORE && PCI && I2C
+-	select DVB_MB86A16
+-	select DVB_ZL10353
+-	select DVB_STV0299
++	select DVB_MB86A16 if !DVB_FE_CUSTOMISE
++	select DVB_ZL10353 if !DVB_FE_CUSTOMISE
++	select DVB_STV0299 if !DVB_FE_CUSTOMISE
++	select DVB_LNBP21 if !DVB_FE_CUSTOMISE
++	select DVB_STB0899 if !DVB_FE_CUSTOMISE
++	select DVB_STB6100 if !DVB_FE_CUSTOMISE
++	select DVB_TDA665x if !DVB_FE_CUSTOMISE
++	select DVB_TDA10021 if !DVB_FE_CUSTOMISE
++	select DVB_TDA10023 if !DVB_FE_CUSTOMISE
+ 	select DVB_PLL
+ 	help
+ 	  Support for PCI cards based on the Mantis PCI bridge.
+@@ -23,7 +29,7 @@ config DVB_MANTIS
+ config DVB_HOPPER
+ 	tristate "HOPPER based cards"
+ 	depends on MANTIS_CORE && DVB_CORE && PCI && I2C
+-	select DVB_ZL10353
++	select DVB_ZL10353 if !DVB_FE_CUSTOMISE
+ 	select DVB_PLL
+ 	help
+ 	  Support for PCI cards based on the Hopper  PCI bridge.
+-- 
+1.7.1
+

Modified: dists/sid/linux-2.6/debian/patches/series/16
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/16	Wed Jun  2 09:10:51 2010	(r15823)
+++ dists/sid/linux-2.6/debian/patches/series/16	Thu Jun  3 01:02:13 2010	(r15824)
@@ -2,3 +2,124 @@
 - bugfix/all/revert-percpu-stable-changes-2.patch 
 + bugfix/all/stable/2.6.32.15.patch
 + bugfix/sh4/fix-sh_tmu.patch
++ features/all/mantis/0001-V4L-DVB-13699-Mantis-MB86A16-Initial-checkin-Mantis-.patch
++ features/all/mantis/0002-V4L-DVB-13700-MB86A16-Need-a-bit-of-settling-time.patch
++ features/all/mantis/0003-V4L-DVB-13701-MB86A16-Reduce-Carrier-Recovery-range-.patch
++ features/all/mantis/0004-V4L-DVB-13702-MB86A16-need-to-wait-a-bit-more-than-t.patch
++ features/all/mantis/0005-V4L-DVB-13703-MB86A16-Fix-wrong-message-printed-out.patch
++ features/all/mantis/0006-V4L-DVB-13704-MB86A16-FIX-Don-t-loop-again-if-we-hav.patch
++ features/all/mantis/0007-V4L-DVB-13705-Mantis-FIX-Do-not-return-IRQ_HANDLED-i.patch
++ features/all/mantis/0008-V4L-DVB-13706-MB86A16-Overhaul.patch
++ features/all/mantis/0009-V4L-DVB-13707-Mantis-Whitespace-cleanup.patch
++ features/all/mantis/0010-V4L-DVB-13708-Mantis-Remove-some-dead-code.patch
++ features/all/mantis/0011-V4L-DVB-13709-Mantis-VP-1034-Switch-13-18v-for-the-V.patch
++ features/all/mantis/0012-V4L-DVB-13710-Mantis-FIX-Use-swfilter-188-204-accord.patch
++ features/all/mantis/0013-V4L-DVB-13711-Mantis-FIX-Do-nor-toggle-GPIF-status.patch
++ features/all/mantis/0014-V4L-DVB-13712-Mantis-Add-locking-for-concurrent-acce.patch
++ features/all/mantis/0015-V4L-DVB-13713-MB86A16-Fix-Initialize-SNR-STATUS.patch
++ features/all/mantis/0016-V4L-DVB-13714-MB86A16-FIX-Code-simplification-use-hw.patch
++ features/all/mantis/0017-V4L-DVB-13715-Mantis-Kernel-I2C-changes-use-PCI-pare.patch
++ features/all/mantis/0018-V4L-DVB-13716-Mantis-Bug-incorrect-byte-swap.patch
++ features/all/mantis/0019-V4L-DVB-13717-MB86A16-Statistics-Updates.patch
++ features/all/mantis/0020-V4L-DVB-13718-Mantis-Use-gpio_set_bits-to-turn-OFF-t.patch
++ features/all/mantis/0021-V4L-DVB-13719-Mantis-VP-2033-Initial-test-switch-to-.patch
++ features/all/mantis/0022-V4L-DVB-13720-Mantis-Terratec-Cinergy-C-Add-support-.patch
++ features/all/mantis/0023-V4L-DVB-13721-Mantis-Bug-Before-bailing-out-Unlock.patch
++ features/all/mantis/0024-V4L-DVB-13722-Mantis-Revert-13560.patch
++ features/all/mantis/0025-V4L-DVB-13723-Mantis-VP-2040-Terratec-Cinergy-C-Add-.patch
++ features/all/mantis/0026-V4L-DVB-13724-Mantis-VP-1041-Initial-support-for-Man.patch
++ features/all/mantis/0027-V4L-DVB-13725-Mantis-VP-1041-Revert-to-old-register-.patch
++ features/all/mantis/0028-V4L-DVB-13726-Mantis-Skystar-HD2-Add-support-for-the.patch
++ features/all/mantis/0029-V4L-DVB-13727-Mantis-VP-1041-Bugfix-Sigh-Don-t-look-.patch
++ features/all/mantis/0030-V4L-DVB-13728-Mantis-Add-in-some-Host-Interface-defi.patch
++ features/all/mantis/0031-V4L-DVB-13729-Mantis-Add-in-a-license-header.patch
++ features/all/mantis/0032-V4L-DVB-13730-Mantis-Add-in-some-UART-definitions.patch
++ features/all/mantis/0033-V4L-DVB-13731-Mantis-Add-in-a-license-header.patch
++ features/all/mantis/0034-V4L-DVB-13732-Mantis-Add-in-some-Link-Layer-definiti.patch
++ features/all/mantis/0035-V4L-DVB-13733-Mantis-Start-with-the-PCMCIA-interface.patch
++ features/all/mantis/0036-V4L-DVB-13734-Mantis-Initial-go-at-an-Event-Manager.patch
++ features/all/mantis/0037-V4L-DVB-13735-Mantis-Implement-the-Event-Manager-tas.patch
++ features/all/mantis/0038-V4L-DVB-13736-Mantis-Implement-CAM-Plug-IN-and-Unplu.patch
++ features/all/mantis/0039-V4L-DVB-13737-Mantis-Register-the-CA-device-dummy-fu.patch
++ features/all/mantis/0040-V4L-DVB-13738-Mantis-Enable-IRQ0-events.patch
++ features/all/mantis/0041-V4L-DVB-13739-Mantis-Event-Manager-Handle-Masked-eve.patch
++ features/all/mantis/0042-V4L-DVB-13740-Mantis-Schedule-the-work-instead-of-ha.patch
++ features/all/mantis/0043-V4L-DVB-13741-Mantis-Implement-HIF-Mem-Read-Write-op.patch
++ features/all/mantis/0044-V4L-DVB-13742-Mantis-Implement-PCMCIA-I-O-Rd-Wr-oper.patch
++ features/all/mantis/0045-V4L-DVB-13743-Mantis-CA-Use-DVB_CA-Tuple-parser.patch
++ features/all/mantis/0046-V4L-DVB-13744-Mantis-CA-Use-Module-status-to-signal-.patch
++ features/all/mantis/0047-V4L-DVB-13745-Mantis-CA-Add-some-debug-statements.patch
++ features/all/mantis/0048-V4L-DVB-13746-Mantis-CA-Bug-Remove-duplicated-symbol.patch
++ features/all/mantis/0049-V4L-DVB-13747-Mantis-Bug-Fix-Use-Register-Address-ra.patch
++ features/all/mantis/0050-V4L-DVB-13748-Mantis-VP-2040-Add-support-for-VP-2040.patch
++ features/all/mantis/0051-V4L-DVB-13749-Mantis-CA-CA_SLAVE-Do-not-change-Slave.patch
++ features/all/mantis/0052-V4L-DVB-13750-Mantis-GPIO_CONTROL-Cache-a-given-GPIO.patch
++ features/all/mantis/0053-V4L-DVB-13751-Mantis-GPIO_CONTROL-Do-not-toggle-GPIO.patch
++ features/all/mantis/0054-V4L-DVB-13752-Mantis-CA-CAM_CONTROL-All-CAM-control-.patch
++ features/all/mantis/0055-V4L-DVB-13753-Mantis-CA-SLOT_CONTROL-Implement-Slot-.patch
++ features/all/mantis/0056-V4L-DVB-13754-Mantis-CAM_CONTROL-Implement-TS-contro.patch
++ features/all/mantis/0057-V4L-DVB-13755-Mantis-CA-CAM_CONTROL-Use-appropriate-.patch
++ features/all/mantis/0058-V4L-DVB-13756-Mantis-CA-CAM_CONTROL-Use-CAMCHANGE_IR.patch
++ features/all/mantis/0059-V4L-DVB-13757-Mantis-CA-CAM_CONTROL-Use-FRDA_IRQ-Eve.patch
++ features/all/mantis/0060-V4L-DVB-13758-Mantis-CA-CAM_CONTROL-Use-CAMREADY_IRQ.patch
++ features/all/mantis/0061-V4L-DVB-13759-Mantis-HIF-I-O-Use-the-LSB-octet-only.patch
++ features/all/mantis/0062-V4L-DVB-13760-Mantis-CA-CA_MODULE-Look-for-module-st.patch
++ features/all/mantis/0063-V4L-DVB-13761-Mantis-HIF-I-O-Temporary-workaround-us.patch
++ features/all/mantis/0064-V4L-DVB-13762-Mantis-CA-CA_MODULE-Look-for-the-modul.patch
++ features/all/mantis/0065-V4L-DVB-13763-Mantis-HIF-I-O-trim-delays-a-bit-appro.patch
++ features/all/mantis/0066-V4L-DVB-13764-Mantis-CA-SLOT-Add-some-debug-status.patch
++ features/all/mantis/0067-V4L-DVB-13765-Mantis-HIF-I-O-Add-some-debug-statemen.patch
++ features/all/mantis/0068-V4L-DVB-13766-Mantis-Bug-Fix-wrong-exit-condition.patch
++ features/all/mantis/0069-V4L-DVB-13767-Mantis-VP-1041-Bug-Add-in-missing-Mast.patch
++ features/all/mantis/0070-V4L-DVB-13768-Mantis-Enable-WRACK.patch
++ features/all/mantis/0071-V4L-DVB-13769-Mantis-Smart-Buffer-Burst-Read-Ready-c.patch
++ features/all/mantis/0072-V4L-DVB-13770-Mantis-Bug-Do-not-trigger-FR-DA-IRQ-fr.patch
++ features/all/mantis/0073-V4L-DVB-13771-Mantis-Reset-Flags-at-the-earliest-pos.patch
++ features/all/mantis/0074-V4L-DVB-13772-Mantis-Do-not-enable-Common-Memory-Acc.patch
++ features/all/mantis/0075-V4L-DVB-13773-Mantis-Enable-all-interrupts.patch
++ features/all/mantis/0076-V4L-DVB-13774-Mantis-Remove-redundant-wait-for-Burst.patch
++ features/all/mantis/0077-V4L-DVB-13775-Mantis-Remove-unnecessary-job-queues.patch
++ features/all/mantis/0078-V4L-DVB-13776-Mantis-Use-a-simple-timeout-instead-in.patch
++ features/all/mantis/0079-V4L-DVB-13777-Mantis-Use-a-Write-wait-queue-for-Writ.patch
++ features/all/mantis/0080-V4L-DVB-13778-Mantis-Wr-ACK-is-already-handled-in-th.patch
++ features/all/mantis/0081-V4L-DVB-13779-Mantis-Missing-wakeup-for-write-queue.patch
++ features/all/mantis/0082-V4L-DVB-13780-Mantis-HIF-I-O-Enable-Interrupts-for-R.patch
++ features/all/mantis/0083-V4L-DVB-13781-Mantis-CA-Bug-Fix-wrong-usage-of-HIFRD.patch
++ features/all/mantis/0084-V4L-DVB-13782-Mantis-Temporarily-disable-FRDA-irq.patch
++ features/all/mantis/0085-V4L-DVB-13783-Mantis-Technisat-Cablestar-HD2-Add-sup.patch
++ features/all/mantis/0086-V4L-DVB-13784-Mantis-Use-PCI-API-instead-of-hardcode.patch
++ features/all/mantis/0087-V4L-DVB-13785-Mantis-Do-not-disable-IRQ-s-while-bein.patch
++ features/all/mantis/0088-V4L-DVB-13786-Mantis-Bug-HIF-bits-already-shifted.patch
++ features/all/mantis/0089-V4L-DVB-13787-Mantis-Fix-build.patch
++ features/all/mantis/0090-V4L-DVB-13788-Mantis-CA-use-a-lock-for-the-relevant-.patch
++ features/all/mantis/0091-V4L-DVB-13789-Mantis-CA-Initialize-the-mutex.patch
++ features/all/mantis/0092-V4L-DVB-13790-Mantis-Relocate-queue-initialization.patch
++ features/all/mantis/0093-V4L-DVB-13792-Mantis-VP-2033-Do-not-claim-TDA10023.patch
++ features/all/mantis/0094-V4L-DVB-13794-Mantis-VP-3028-Initial-go-at-Serial-in.patch
++ features/all/mantis/0095-V4L-DVB-13795-Mantis-Hopper-Code-overhaul-add-Hopper.patch
++ features/all/mantis/0096-V4L-DVB-13796-Mantis-Add-missing-file-in-previous-co.patch
++ features/all/mantis/0097-V4L-DVB-13797-Mantis-Hopper-TDA665x-Large-overhaul.patch
++ features/all/mantis/0098-V4L-DVB-13798-Mantis-Enable-power-for-all-cards-use-.patch
++ features/all/mantis/0099-V4L-DVB-13799-Mantis-Unregister-frontend.patch
++ features/all/mantis/0100-V4L-DVB-13800-Mantis-I2C-optimization.-Required-dela.patch
++ features/all/mantis/0101-V4L-DVB-13801-MB86A16-Use-the-search-callback.patch
++ features/all/mantis/0102-V4L-DVB-13802-Mantis-Hopper-Fix-all-build-related-wa.patch
++ features/all/mantis/0103-V4L-DVB-13803-Remove-unused-dependency-on-CU1216.patch
++ features/all/mantis/0104-V4L-DVB-13804-Remove-unused-I2C-Adapter-ID.patch
++ features/all/mantis/0105-V4L-DVB-13805-Fix-Unregister-the-frontend-before-det.patch
++ features/all/mantis/0106-V4L-DVB-13806-Register-and-Initialize-Remote-control.patch
++ features/all/mantis/0107-V4L-DVB-13807-Fix-Free-device-in-the-device-registra.patch
++ features/all/mantis/0108-V4L-DVB-13809-Fix-Checkpatch-violations.patch
++ features/all/mantis/0109-V4L-DVB-13810-MB86A16-Use-DVB_-macros.patch
++ features/all/mantis/0110-V4L-DVB-13811-MB86A16-Update-Copyright-header.patch
++ features/all/mantis/0111-V4L-DVB-13812-Mantis-Hopper-Update-Copyright-header.patch
++ features/all/mantis/0112-V4L-DVB-13808b-mantis-replace-DMA_nnBIT_MASK-to-DMA_.patch
++ features/all/mantis/0113-V4L-DVB-13824a-mantis-Fix-__devexit-bad-annotations.patch
++ features/all/mantis/0114-V4L-DVB-13851-Fix-Input-dependency-for-Mantis.patch
++ features/all/mantis/0115-V4L-DVB-Mantis-remove-duplicated-include.patch
++ features/all/mantis/0116-V4L-DVB-dvb-fix-sparse-warnings.patch
++ features/all/mantis/0117-V4L-DVB-Fix-bad-whitespacing.patch
++ features/all/mantis/0118-V4L-DVB-13791-TDA10021-Do-not-claim-TDA10023.patch
++ features/all/mantis/0119-Mantis-hopper-use-MODULE_DEVICE_TABLE-use-the-macro-.patch
++ features/all/mantis/0120-V4L-DVB-13808-Mantis-Hopper-Build-update-for-Mantis-.patch
++ features/all/mantis/0121-V4L-DVB-mantis-Select-correct-frontends.patch



More information about the Kernel-svn-changes mailing list