Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 15 Sep 2009 16:22:18 +0000 (09:22 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 15 Sep 2009 16:22:18 +0000 (09:22 -0700)
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (213 commits)
  V4L/DVB (12720): em28xx-cards: Add vendor/product id for Kworld DVD Maker 2
  V4L/DVB (12713): em28xx: Cleanups at ir_i2c handler
  V4L/DVB (12712): em28xx: properly load ir-kbd-i2c when needed
  V4L/DVB (12701): saa7134: ir-kbd-i2c init data needs a persistent object
  V4L/DVB (12699): cx18: ir-kbd-i2c initialization data should point to a persistent object
  V4L/DVB (12698): em28xx: ir-kbd-i2c init data needs a persistent object
  V4L/DVB (12707): gspca - sn9c20x: Add SXGA support to MT9M111
  V4L/DVB (12706): gspca - sn9c20x: disable exposure/gain controls for MT9M111 sensors.
  V4L/DVB (12705): gspca - sn9c20x: Add SXGA support to SOI968
  V4L/DVB (12703): gspca - sn9c20x: Reduces size of object
  V4L/DVB (12704): gspca - sn9c20x: Fix exposure on SOI968 sensors
  V4L/DVB (12696): gspca - sonixj / sn9c102: Two drivers for 0c45:60fc and 0c45:613e.
  V4L/DVB (12695): gspca - vc032x: Do the LED work with the sensor hv7131r.
  V4L/DVB (12694): gspca - vc032x: Change the start exchanges of the sensor hv7131r.
  V4L/DVB (12693): gspca - sunplus: The brightness is signed.
  V4L/DVB (12692): gspca - sunplus: Optimize code.
  V4L/DVB (12691): gspca - sonixj: Don't use mdelay().
  V4L/DVB (12690): gspca - pac7311: Webcam 06f8:3009 added.
  V4L/DVB (12686): dvb-core: check supported QAM modulations
  V4L/DVB (12685): dvb-core: check fe->ops.set_frontend return value
  ...

201 files changed:
Documentation/video4linux/CARDLIST.cx23885
Documentation/video4linux/CARDLIST.cx88
Documentation/video4linux/CARDLIST.em28xx
Documentation/video4linux/CARDLIST.saa7134
Documentation/video4linux/CARDLIST.tuner
Documentation/video4linux/CQcam.txt
Documentation/video4linux/gspca.txt
Documentation/video4linux/si4713.txt [new file with mode: 0644]
drivers/media/common/ir-functions.c
drivers/media/common/ir-keymaps.c
drivers/media/common/tuners/tda18271-fe.c
drivers/media/common/tuners/tda18271-priv.h
drivers/media/common/tuners/tda18271.h
drivers/media/common/tuners/tuner-simple.c
drivers/media/common/tuners/tuner-types.c
drivers/media/dvb/Kconfig
drivers/media/dvb/b2c2/flexcop-fe-tuner.c
drivers/media/dvb/bt8xx/dst.c
drivers/media/dvb/dm1105/dm1105.c
drivers/media/dvb/dvb-core/dmxdev.c
drivers/media/dvb/dvb-core/dmxdev.h
drivers/media/dvb/dvb-core/dvb_demux.c
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvbdev.h
drivers/media/dvb/dvb-usb/Kconfig
drivers/media/dvb/dvb-usb/a800.c
drivers/media/dvb/dvb-usb/af9005-remote.c
drivers/media/dvb/dvb-usb/af9015.c
drivers/media/dvb/dvb-usb/af9015.h
drivers/media/dvb/dvb-usb/anysee.c
drivers/media/dvb/dvb-usb/cinergyT2-core.c
drivers/media/dvb/dvb-usb/cinergyT2-fe.c
drivers/media/dvb/dvb-usb/cxusb.c
drivers/media/dvb/dvb-usb/dib0700_devices.c
drivers/media/dvb/dvb-usb/dibusb-common.c
drivers/media/dvb/dvb-usb/dibusb-mc.c
drivers/media/dvb/dvb-usb/digitv.c
drivers/media/dvb/dvb-usb/dtt200u.c
drivers/media/dvb/dvb-usb/dvb-usb-i2c.c
drivers/media/dvb/dvb-usb/dvb-usb-ids.h
drivers/media/dvb/dvb-usb/dvb-usb-remote.c
drivers/media/dvb/dvb-usb/dvb-usb.h
drivers/media/dvb/dvb-usb/dw2102.c
drivers/media/dvb/dvb-usb/m920x.c
drivers/media/dvb/dvb-usb/nova-t-usb2.c
drivers/media/dvb/dvb-usb/opera1.c
drivers/media/dvb/dvb-usb/vp702x.c
drivers/media/dvb/dvb-usb/vp7045.c
drivers/media/dvb/firewire/firedtv-avc.c
drivers/media/dvb/frontends/Kconfig
drivers/media/dvb/frontends/Makefile
drivers/media/dvb/frontends/cx22700.c
drivers/media/dvb/frontends/cx24113.c
drivers/media/dvb/frontends/cx24123.c
drivers/media/dvb/frontends/dib0070.c
drivers/media/dvb/frontends/dib7000p.c
drivers/media/dvb/frontends/dvb-pll.c
drivers/media/dvb/frontends/dvb-pll.h
drivers/media/dvb/frontends/lgs8gxx.c
drivers/media/dvb/frontends/lgs8gxx.h
drivers/media/dvb/frontends/lgs8gxx_priv.h
drivers/media/dvb/frontends/mt312.c
drivers/media/dvb/frontends/stb6100.c
drivers/media/dvb/frontends/stv0900_core.c
drivers/media/dvb/frontends/stv0900_sw.c
drivers/media/dvb/frontends/stv6110.c
drivers/media/dvb/frontends/stv6110.h
drivers/media/dvb/frontends/tda10021.c
drivers/media/dvb/frontends/tda8261.c
drivers/media/dvb/frontends/ves1820.c
drivers/media/dvb/frontends/zl10036.c
drivers/media/dvb/frontends/zl10039.c [new file with mode: 0644]
drivers/media/dvb/frontends/zl10039.h [new file with mode: 0644]
drivers/media/dvb/frontends/zl10353.c
drivers/media/dvb/pluto2/pluto2.c
drivers/media/dvb/ttpci/av7110_v4l.c
drivers/media/dvb/ttpci/budget-ci.c
drivers/media/radio/Kconfig
drivers/media/radio/Makefile
drivers/media/radio/radio-cadet.c
drivers/media/radio/radio-si470x.c [deleted file]
drivers/media/radio/radio-si4713.c [new file with mode: 0644]
drivers/media/radio/si470x/Kconfig [new file with mode: 0644]
drivers/media/radio/si470x/Makefile [new file with mode: 0644]
drivers/media/radio/si470x/radio-si470x-common.c [new file with mode: 0644]
drivers/media/radio/si470x/radio-si470x-i2c.c [new file with mode: 0644]
drivers/media/radio/si470x/radio-si470x-usb.c [new file with mode: 0644]
drivers/media/radio/si470x/radio-si470x.h [new file with mode: 0644]
drivers/media/radio/si4713-i2c.c [new file with mode: 0644]
drivers/media/radio/si4713-i2c.h [new file with mode: 0644]
drivers/media/video/Kconfig
drivers/media/video/au0828/au0828-dvb.c
drivers/media/video/au0828/au0828-i2c.c
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/bt8xx/bttv-i2c.c
drivers/media/video/bt8xx/bttv-input.c
drivers/media/video/cafe_ccic.c
drivers/media/video/cx18/cx18-cards.c
drivers/media/video/cx18/cx18-cards.h
drivers/media/video/cx18/cx18-driver.c
drivers/media/video/cx18/cx18-fileops.c
drivers/media/video/cx18/cx18-i2c.c
drivers/media/video/cx18/cx18-ioctl.c
drivers/media/video/cx231xx/cx231xx-conf-reg.h
drivers/media/video/cx231xx/cx231xx-i2c.c
drivers/media/video/cx231xx/cx231xx-video.c
drivers/media/video/cx231xx/cx231xx.h
drivers/media/video/cx23885/cimax2.c
drivers/media/video/cx23885/cx23885-417.c
drivers/media/video/cx23885/cx23885-cards.c
drivers/media/video/cx23885/cx23885-core.c
drivers/media/video/cx23885/cx23885-dvb.c
drivers/media/video/cx23885/cx23885-i2c.c
drivers/media/video/cx23885/cx23885.h
drivers/media/video/cx25840/cx25840-core.c
drivers/media/video/cx25840/cx25840-firmware.c
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-dvb.c
drivers/media/video/cx88/cx88-input.c
drivers/media/video/cx88/cx88.h
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-i2c.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/em28xx/em28xx.h
drivers/media/video/gspca/Kconfig
drivers/media/video/gspca/Makefile
drivers/media/video/gspca/conex.c
drivers/media/video/gspca/etoms.c
drivers/media/video/gspca/gspca.c
drivers/media/video/gspca/gspca.h
drivers/media/video/gspca/jeilinj.c [new file with mode: 0644]
drivers/media/video/gspca/m5602/m5602_s5k83a.c
drivers/media/video/gspca/mr97310a.c
drivers/media/video/gspca/pac207.c
drivers/media/video/gspca/pac7311.c
drivers/media/video/gspca/sn9c20x.c
drivers/media/video/gspca/sonixj.c
drivers/media/video/gspca/spca501.c
drivers/media/video/gspca/spca506.c
drivers/media/video/gspca/spca508.c
drivers/media/video/gspca/stv06xx/stv06xx.c
drivers/media/video/gspca/sunplus.c
drivers/media/video/gspca/t613.c
drivers/media/video/gspca/tv8532.c
drivers/media/video/gspca/vc032x.c
drivers/media/video/gspca/zc3xx.c
drivers/media/video/hdpvr/hdpvr-control.c
drivers/media/video/hdpvr/hdpvr-core.c
drivers/media/video/hdpvr/hdpvr-i2c.c
drivers/media/video/hdpvr/hdpvr-video.c
drivers/media/video/ir-kbd-i2c.c
drivers/media/video/ivtv/ivtv-cards.c
drivers/media/video/ivtv/ivtv-cards.h
drivers/media/video/ivtv/ivtv-driver.c
drivers/media/video/ivtv/ivtv-gpio.c
drivers/media/video/ivtv/ivtv-i2c.c
drivers/media/video/meye.c
drivers/media/video/pvrusb2/pvrusb2-audio.c
drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
drivers/media/video/pwc/pwc-if.c
drivers/media/video/pwc/pwc-v4l.c
drivers/media/video/pwc/pwc.h
drivers/media/video/saa6588.c
drivers/media/video/saa7134/Kconfig
drivers/media/video/saa7134/saa6752hs.c
drivers/media/video/saa7134/saa7134-alsa.c
drivers/media/video/saa7134/saa7134-cards.c
drivers/media/video/saa7134/saa7134-core.c
drivers/media/video/saa7134/saa7134-dvb.c
drivers/media/video/saa7134/saa7134-input.c
drivers/media/video/saa7134/saa7134-video.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/sn9c102/sn9c102_devtable.h
drivers/media/video/stk-webcam.c
drivers/media/video/stv680.c
drivers/media/video/tuner-core.c
drivers/media/video/tveeprom.c
drivers/media/video/uvc/uvc_ctrl.c
drivers/media/video/uvc/uvc_driver.c
drivers/media/video/uvc/uvc_isight.c
drivers/media/video/uvc/uvc_v4l2.c
drivers/media/video/uvc/uvc_video.c
drivers/media/video/uvc/uvcvideo.h
drivers/media/video/v4l1-compat.c
drivers/media/video/v4l2-common.c
drivers/media/video/v4l2-compat-ioctl32.c
drivers/media/video/v4l2-ioctl.c
drivers/media/video/vino.c
drivers/media/video/w9968cf.c
drivers/media/video/zoran/zoran_card.c
drivers/media/video/zr364xx.c
include/linux/dvb/dmx.h
include/linux/usb/video.h [new file with mode: 0644]
include/linux/videodev2.h
include/media/ir-common.h
include/media/ir-kbd-i2c.h
include/media/radio-si4713.h [new file with mode: 0644]
include/media/si4713.h [new file with mode: 0644]
include/media/tuner.h
include/media/v4l2-subdev.h

index 450b8f8c389bcb5eba41cc21515795429f0c2b5c..525edb37c758859d59dfb0e2c95bcef8039ce07d 100644 (file)
@@ -21,3 +21,5 @@
  20 -> Hauppauge WinTV-HVR1255                             [0070:2251]
  21 -> Hauppauge WinTV-HVR1210                             [0070:2291,0070:2295]
  22 -> Mygica X8506 DMB-TH                                 [14f1:8651]
+ 23 -> Magic-Pro ProHDTV Extreme 2                         [14f1:8657]
+ 24 -> Hauppauge WinTV-HVR1850                             [0070:8541]
index 0736518b2f8814114ecbf89d031b7d57ab757d7e..3385f8b094a5ef5a702c8b662e61b4052c846cc7 100644 (file)
@@ -80,3 +80,4 @@
  79 -> Terratec Cinergy HT PCI MKII                        [153b:1177]
  80 -> Hauppauge WinTV-IR Only                             [0070:9290]
  81 -> Leadtek WinFast DTV1800 Hybrid                      [107d:6654]
+ 82 -> WinFast DTV2000 H rev. J                            [107d:6f2b]
index e352d754875cae415b0c27d766336c00942cd241..b13fcbd5d94b198a176eecb11a72621c76df09eb 100644 (file)
@@ -7,7 +7,7 @@
   6 -> Terratec Cinergy 200 USB                 (em2800)
   7 -> Leadtek Winfast USB II                   (em2800)        [0413:6023]
   8 -> Kworld USB2800                           (em2800)
-  9 -> Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker (em2820/em2840) [1b80:e302,2304:0207,2304:021a]
+  9 -> Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker  (em2820/em2840) [1b80:e302,1b80:e304,2304:0207,2304:021a]
  10 -> Hauppauge WinTV HVR 900                  (em2880)        [2040:6500]
  11 -> Terratec Hybrid XS                       (em2880)        [0ccd:0042]
  12 -> Kworld PVR TV 2800 RF                    (em2820/em2840)
@@ -33,7 +33,7 @@
  34 -> Terratec Cinergy A Hybrid XS             (em2860)        [0ccd:004f]
  35 -> Typhoon DVD Maker                        (em2860)
  36 -> NetGMBH Cam                              (em2860)
- 37 -> Gadmei UTV330                            (em2860)
+ 37 -> Gadmei UTV330                            (em2860)        [eb1a:50a6]
  38 -> Yakumo MovieMixer                        (em2861)
  39 -> KWorld PVRTV 300U                        (em2861)        [eb1a:e300]
  40 -> Plextor ConvertX PX-TV100U               (em2861)        [093b:a005]
@@ -67,3 +67,4 @@
  69 -> KWorld ATSC 315U HDTV TV Box             (em2882)        [eb1a:a313]
  70 -> Evga inDtube                             (em2882)
  71 -> Silvercrest Webcam 1.3mpix               (em2820/em2840)
+ 72 -> Gadmei UTV330+                           (em2861)
index c913e5614195a9a359411ee163f8c2e081d24a2a..0ac4d2544778e250a70b14260c5e505bdf3c9221 100644 (file)
 166 -> Beholder BeholdTV 607 RDS                [5ace:6073]
 167 -> Beholder BeholdTV 609 RDS                [5ace:6092]
 168 -> Beholder BeholdTV 609 RDS                [5ace:6093]
+169 -> Compro VideoMate S350/S300               [185b:c900]
+170 -> AverMedia AverTV Studio 505              [1461:a115]
+171 -> Beholder BeholdTV X7                     [5ace:7595]
+172 -> RoverMedia TV Link Pro FM                [19d1:0138]
index be67844074dd1f3c31430dc75a70ccc9a53be24a..ba9fa679e2d362e66e998672a3029c7d350402c8 100644 (file)
@@ -78,3 +78,4 @@ tuner=77 - TCL tuner MF02GIP-5N-E
 tuner=78 - Philips FMD1216MEX MK3 Hybrid Tuner
 tuner=79 - Philips PAL/SECAM multi (FM1216 MK5)
 tuner=80 - Philips FQ1216LME MK3 PAL/SECAM w/active loopthrough
+tuner=81 - Partsnic (Daewoo) PTI-5NF05
index 04986efb731c443fcd16457d8e3638c8c15e9f81..d230878e473e3b230e9bc65a2d06cdfa73e9e0d7 100644 (file)
@@ -18,8 +18,8 @@ Table of Contents
 
 1.0 Introduction
 
-  The file ../drivers/char/c-qcam.c is a device driver for the
-Logitech (nee Connectix) parallel port interface color CCD camera.
+  The file ../../drivers/media/video/c-qcam.c is a device driver for
+the Logitech (nee Connectix) parallel port interface color CCD camera.
 This is a fairly inexpensive device for capturing images.  Logitech
 does not currently provide information for developers, but many people
 have engineered several solutions for non-Microsoft use of the Color
index 573f95b588079b6ae1ede70f479cf539e397e2eb..4686e84dd800e0b635d3bae7845542616bcf03f1 100644 (file)
@@ -140,6 +140,7 @@ spca500             04fc:7333       PalmPixDC85
 sunplus                04fc:ffff       Pure DigitalDakota
 spca501                0506:00df       3Com HomeConnect Lite
 sunplus                052b:1513       Megapix V4
+sunplus                052b:1803       MegaImage VI
 tv8532         0545:808b       Veo Stingray
 tv8532         0545:8333       Veo Stingray
 sunplus                0546:3155       Polaroid PDC3070
@@ -182,6 +183,7 @@ ov534               06f8:3002       Hercules Blog Webcam
 ov534          06f8:3003       Hercules Dualpix HD Weblog
 sonixj         06f8:3004       Hercules Classic Silver
 sonixj         06f8:3008       Hercules Deluxe Optical Glass
+pac7311                06f8:3009       Hercules Classic Link
 spca508                0733:0110       ViewQuest VQ110
 spca508                0130:0130       Clone Digital Webcam 11043
 spca501                0733:0401       Intel Create and Share
@@ -235,8 +237,10 @@ pac7311            093a:2621       PAC731x
 pac7311                093a:2622       Genius Eye 312
 pac7311                093a:2624       PAC7302
 pac7311                093a:2626       Labtec 2200
+pac7311                093a:2629       Genious iSlim 300
 pac7311                093a:262a       Webcam 300k
 pac7311                093a:262c       Philips SPC 230 NC
+jeilinj                0979:0280       Sakar 57379
 zc3xx          0ac8:0302       Z-star Vimicro zc0302
 vc032x         0ac8:0321       Vimicro generic vc0321
 vc032x         0ac8:0323       Vimicro Vc0323
@@ -247,6 +251,7 @@ zc3xx               0ac8:305b       Z-star Vimicro zc0305b
 zc3xx          0ac8:307b       Ldlc VC302+Ov7620
 vc032x         0ac8:c001       Sony embedded vimicro
 vc032x         0ac8:c002       Sony embedded vimicro
+vc032x         0ac8:c301       Samsung Q1 Ultra Premium
 spca508                0af9:0010       Hama USB Sightcam 100
 spca508                0af9:0011       Hama USB Sightcam 100
 sonixb         0c45:6001       Genius VideoCAM NB
@@ -284,6 +289,7 @@ sonixj              0c45:613a       Microdia Sonix PC Camera
 sonixj         0c45:613b       Surfer SN-206
 sonixj         0c45:613c       Sonix Pccam168
 sonixj         0c45:6143       Sonix Pccam168
+sonixj         0c45:6148       Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia
 sn9c20x                0c45:6240       PC Camera (SN9C201 + MT9M001)
 sn9c20x                0c45:6242       PC Camera (SN9C201 + MT9M111)
 sn9c20x                0c45:6248       PC Camera (SN9C201 + OV9655)
diff --git a/Documentation/video4linux/si4713.txt b/Documentation/video4linux/si4713.txt
new file mode 100644 (file)
index 0000000..25abdb7
--- /dev/null
@@ -0,0 +1,176 @@
+Driver for I2C radios for the Silicon Labs Si4713 FM Radio Transmitters
+
+Copyright (c) 2009 Nokia Corporation
+Contact: Eduardo Valentin <eduardo.valentin@nokia.com>
+
+
+Information about the Device
+============================
+This chip is a Silicon Labs product. It is a I2C device, currently on 0x63 address.
+Basically, it has transmission and signal noise level measurement features.
+
+The Si4713 integrates transmit functions for FM broadcast stereo transmission.
+The chip also allows integrated receive power scanning to identify low signal
+power FM channels.
+
+The chip is programmed using commands and responses. There are also several
+properties which can change the behavior of this chip.
+
+Users must comply with local regulations on radio frequency (RF) transmission.
+
+Device driver description
+=========================
+There are two modules to handle this device. One is a I2C device driver
+and the other is a platform driver.
+
+The I2C device driver exports a v4l2-subdev interface to the kernel.
+All properties can also be accessed by v4l2 extended controls interface, by
+using the v4l2-subdev calls (g_ext_ctrls, s_ext_ctrls).
+
+The platform device driver exports a v4l2 radio device interface to user land.
+So, it uses the I2C device driver as a sub device in order to send the user
+commands to the actual device. Basically it is a wrapper to the I2C device driver.
+
+Applications can use v4l2 radio API to specify frequency of operation, mute state,
+etc. But mostly of its properties will be present in the extended controls.
+
+When the v4l2 mute property is set to 1 (true), the driver will turn the chip off.
+
+Properties description
+======================
+
+The properties can be accessed using v4l2 extended controls.
+Here is an output from v4l2-ctl util:
+/ # v4l2-ctl -d /dev/radio0 --all -L
+Driver Info:
+       Driver name   : radio-si4713
+       Card type     : Silicon Labs Si4713 Modulator
+       Bus info      :
+       Driver version: 0
+       Capabilities  : 0x00080800
+               RDS Output
+               Modulator
+Audio output: 0 (FM Modulator Audio Out)
+Frequency: 1408000 (88.000000 MHz)
+Video Standard = 0x00000000
+Modulator:
+       Name                 : FM Modulator
+       Capabilities         : 62.5 Hz stereo rds
+       Frequency range      : 76.0 MHz - 108.0 MHz
+       Subchannel modulation: stereo+rds
+
+User Controls
+
+                          mute (bool) : default=1 value=0
+
+FM Radio Modulator Controls
+
+          rds_signal_deviation (int)  : min=0 max=90000 step=10 default=200 value=200 flags=slider
+                rds_program_id (int)  : min=0 max=65535 step=1 default=0 value=0
+              rds_program_type (int)  : min=0 max=31 step=1 default=0 value=0
+                   rds_ps_name (str)  : min=0 max=96 step=8 value='si4713  '
+                rds_radio_text (str)  : min=0 max=384 step=32 value=''
+  audio_limiter_feature_enabled (bool) : default=1 value=1
+     audio_limiter_release_time (int)  : min=250 max=102390 step=50 default=5010 value=5010 flags=slider
+       audio_limiter_deviation (int)  : min=0 max=90000 step=10 default=66250 value=66250 flags=slider
+audio_compression_feature_enabl (bool) : default=1 value=1
+        audio_compression_gain (int)  : min=0 max=20 step=1 default=15 value=15 flags=slider
+    audio_compression_threshold (int)  : min=-40 max=0 step=1 default=-40 value=-40 flags=slider
+  audio_compression_attack_time (int)  : min=0 max=5000 step=500 default=0 value=0 flags=slider
+ audio_compression_release_time (int)  : min=100000 max=1000000 step=100000 default=1000000 value=1000000 flags=slider
+     pilot_tone_feature_enabled (bool) : default=1 value=1
+          pilot_tone_deviation (int)  : min=0 max=90000 step=10 default=6750 value=6750 flags=slider
+          pilot_tone_frequency (int)  : min=0 max=19000 step=1 default=19000 value=19000 flags=slider
+         pre_emphasis_settings (menu) : min=0 max=2 default=1 value=1
+              tune_power_level (int)  : min=0 max=120 step=1 default=88 value=88 flags=slider
+        tune_antenna_capacitor (int)  : min=0 max=191 step=1 default=0 value=110 flags=slider
+/ #
+
+Here is a summary of them:
+
+* Pilot is an audible tone sent by the device.
+
+pilot_frequency - Configures the frequency of the stereo pilot tone.
+pilot_deviation - Configures pilot tone frequency deviation level.
+pilot_enabled - Enables or disables the pilot tone feature.
+
+* The si4713 device is capable of applying audio compression to the transmitted signal.
+
+acomp_enabled - Enables or disables the audio dynamic range control feature.
+acomp_gain - Sets the gain for audio dynamic range control.
+acomp_threshold - Sets the threshold level for audio dynamic range control.
+acomp_attack_time - Sets the attack time for audio dynamic range control.
+acomp_release_time - Sets the release time for audio dynamic range control.
+
+* Limiter setups audio deviation limiter feature. Once a over deviation occurs,
+it is possible to adjust the front-end gain of the audio input and always
+prevent over deviation.
+
+limiter_enabled - Enables or disables the limiter feature.
+limiter_deviation - Configures audio frequency deviation level.
+limiter_release_time - Sets the limiter release time.
+
+* Tuning power
+
+power_level - Sets the output power level for signal transmission.
+antenna_capacitor - This selects the value of antenna tuning capacitor manually
+or automatically if set to zero.
+
+* RDS related
+
+rds_ps_name - Sets the RDS ps name field for transmission.
+rds_radio_text - Sets the RDS radio text for transmission.
+rds_pi - Sets the RDS PI field for transmission.
+rds_pty - Sets the RDS PTY field for transmission.
+
+* Region related
+
+preemphasis - sets the preemphasis to be applied for transmission.
+
+RNL
+===
+
+This device also has an interface to measure received noise level. To do that, you should
+ioctl the device node. Here is an code of example:
+
+int main (int argc, char *argv[])
+{
+       struct si4713_rnl rnl;
+       int fd = open("/dev/radio0", O_RDWR);
+       int rval;
+
+       if (argc < 2)
+               return -EINVAL;
+
+       if (fd < 0)
+               return fd;
+
+       sscanf(argv[1], "%d", &rnl.frequency);
+
+       rval = ioctl(fd, SI4713_IOC_MEASURE_RNL, &rnl);
+       if (rval < 0)
+               return rval;
+
+       printf("received noise level: %d\n", rnl.rnl);
+
+       close(fd);
+}
+
+The struct si4713_rnl and SI4713_IOC_MEASURE_RNL are defined under
+include/media/si4713.h.
+
+Stereo/Mono and RDS subchannels
+===============================
+
+The device can also be configured using the available sub channels for
+transmission. To do that use S/G_MODULATOR ioctl and configure txsubchans properly.
+Refer to v4l2-spec for proper use of this ioctl.
+
+Testing
+=======
+Testing is usually done with v4l2-ctl utility for managing FM tuner cards.
+The tool can be found in v4l-dvb repository under v4l2-apps/util directory.
+
+Example for setting rds ps name:
+# v4l2-ctl -d /dev/radio0 --set-ctrl=rds_ps_name="Dummy"
+
index 16792a68a44951e1bc1c2cbb1c9da27a2b6b2722..655474b29e21ca23347cf15d7dc707a644a0011e 100644 (file)
@@ -58,13 +58,24 @@ static void ir_input_key_event(struct input_dev *dev, struct ir_input_state *ir)
 /* -------------------------------------------------------------------------- */
 
 void ir_input_init(struct input_dev *dev, struct ir_input_state *ir,
-                  int ir_type, IR_KEYTAB_TYPE *ir_codes)
+                  int ir_type, struct ir_scancode_table *ir_codes)
 {
        int i;
 
        ir->ir_type = ir_type;
+
+       memset(ir->ir_codes, sizeof(ir->ir_codes), 0);
+
+       /*
+        * FIXME: This is a temporary workaround to use the new IR tables
+        * with the old approach. Later patches will replace this to a
+        * proper method
+        */
+
        if (ir_codes)
-               memcpy(ir->ir_codes, ir_codes, sizeof(ir->ir_codes));
+               for (i = 0; i < ir_codes->size; i++)
+                       if (ir_codes->scan[i].scancode < IR_KEYTAB_SIZE)
+                               ir->ir_codes[ir_codes->scan[i].scancode] = ir_codes->scan[i].keycode;
 
        dev->keycode     = ir->ir_codes;
        dev->keycodesize = sizeof(IR_KEYTAB_TYPE);
index 4216328552f6edad952ca870bf57beabef5b1227..f6790172736a07482eb8ccc4a08a9e32032ae2d3 100644 (file)
@@ -1,8 +1,6 @@
 /*
-
-
-    Keytables for supported remote controls. This file is part of
-    video4linux.
+    Keytables for supported remote controls, used on drivers/media
+    devices.
 
     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
     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.
+*/
 
+/*
+ * NOTICE FOR DEVELOPERS:
+ *   The IR mappings should be as close as possible to what's
+ *   specified at:
+ *      http://linuxtv.org/wiki/index.php/Remote_Controllers
  */
 #include <linux/module.h>
 
 #include <media/ir-common.h>
 
 /* empty keytable, can be used as placeholder for not-yet created keytables */
-IR_KEYTAB_TYPE ir_codes_empty[IR_KEYTAB_SIZE] = {
-       [ 0x2a ] = KEY_COFFEE,
+static struct ir_scancode ir_codes_empty[] = {
+       { 0x2a, KEY_COFFEE },
 };
 
-EXPORT_SYMBOL_GPL(ir_codes_empty);
+struct ir_scancode_table ir_codes_empty_table = {
+       .scan = ir_codes_empty,
+       .size = ARRAY_SIZE(ir_codes_empty),
+};
+EXPORT_SYMBOL_GPL(ir_codes_empty_table);
 
 /* Michal Majchrowicz <mmajchrowicz@gmail.com> */
-IR_KEYTAB_TYPE ir_codes_proteus_2309[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_proteus_2309[] = {
        /* numeric */
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x5c ] = KEY_POWER,     /* power       */
-       [ 0x20 ] = KEY_F,         /* full screen */
-       [ 0x0f ] = KEY_BACKSPACE, /* recall      */
-       [ 0x1b ] = KEY_ENTER,     /* mute        */
-       [ 0x41 ] = KEY_RECORD,    /* record      */
-       [ 0x43 ] = KEY_STOP,      /* stop        */
-       [ 0x16 ] = KEY_S,
-       [ 0x1a ] = KEY_Q,         /* off         */
-       [ 0x2e ] = KEY_RED,
-       [ 0x1f ] = KEY_DOWN,      /* channel -   */
-       [ 0x1c ] = KEY_UP,        /* channel +   */
-       [ 0x10 ] = KEY_LEFT,      /* volume -    */
-       [ 0x1e ] = KEY_RIGHT,     /* volume +    */
-       [ 0x14 ] = KEY_F1,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_proteus_2309);
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x5c, KEY_POWER },            /* power       */
+       { 0x20, KEY_ZOOM },             /* full screen */
+       { 0x0f, KEY_BACKSPACE },        /* recall      */
+       { 0x1b, KEY_ENTER },            /* mute        */
+       { 0x41, KEY_RECORD },           /* record      */
+       { 0x43, KEY_STOP },             /* stop        */
+       { 0x16, KEY_S },
+       { 0x1a, KEY_POWER2 },           /* off         */
+       { 0x2e, KEY_RED },
+       { 0x1f, KEY_CHANNELDOWN },      /* channel -   */
+       { 0x1c, KEY_CHANNELUP },        /* channel +   */
+       { 0x10, KEY_VOLUMEDOWN },       /* volume -    */
+       { 0x1e, KEY_VOLUMEUP },         /* volume +    */
+       { 0x14, KEY_F1 },
+};
+
+struct ir_scancode_table ir_codes_proteus_2309_table = {
+       .scan = ir_codes_proteus_2309,
+       .size = ARRAY_SIZE(ir_codes_proteus_2309),
+};
+EXPORT_SYMBOL_GPL(ir_codes_proteus_2309_table);
+
 /* Matt Jesson <dvb@jesson.eclipse.co.uk */
-IR_KEYTAB_TYPE ir_codes_avermedia_dvbt[IR_KEYTAB_SIZE] = {
-       [ 0x28 ] = KEY_0,         //'0' / 'enter'
-       [ 0x22 ] = KEY_1,         //'1'
-       [ 0x12 ] = KEY_2,         //'2' / 'up arrow'
-       [ 0x32 ] = KEY_3,         //'3'
-       [ 0x24 ] = KEY_4,         //'4' / 'left arrow'
-       [ 0x14 ] = KEY_5,         //'5'
-       [ 0x34 ] = KEY_6,         //'6' / 'right arrow'
-       [ 0x26 ] = KEY_7,         //'7'
-       [ 0x16 ] = KEY_8,         //'8' / 'down arrow'
-       [ 0x36 ] = KEY_9,         //'9'
-
-       [ 0x20 ] = KEY_LIST,        // 'source'
-       [ 0x10 ] = KEY_TEXT,        // 'teletext'
-       [ 0x00 ] = KEY_POWER,       // 'power'
-       [ 0x04 ] = KEY_AUDIO,       // 'audio'
-       [ 0x06 ] = KEY_ZOOM,        // 'full screen'
-       [ 0x18 ] = KEY_VIDEO,       // 'display'
-       [ 0x38 ] = KEY_SEARCH,      // 'loop'
-       [ 0x08 ] = KEY_INFO,        // 'preview'
-       [ 0x2a ] = KEY_REWIND,      // 'backward <<'
-       [ 0x1a ] = KEY_FASTFORWARD, // 'forward >>'
-       [ 0x3a ] = KEY_RECORD,      // 'capture'
-       [ 0x0a ] = KEY_MUTE,        // 'mute'
-       [ 0x2c ] = KEY_RECORD,      // 'record'
-       [ 0x1c ] = KEY_PAUSE,       // 'pause'
-       [ 0x3c ] = KEY_STOP,        // 'stop'
-       [ 0x0c ] = KEY_PLAY,        // 'play'
-       [ 0x2e ] = KEY_RED,         // 'red'
-       [ 0x01 ] = KEY_BLUE,        // 'blue' / 'cancel'
-       [ 0x0e ] = KEY_YELLOW,      // 'yellow' / 'ok'
-       [ 0x21 ] = KEY_GREEN,       // 'green'
-       [ 0x11 ] = KEY_CHANNELDOWN, // 'channel -'
-       [ 0x31 ] = KEY_CHANNELUP,   // 'channel +'
-       [ 0x1e ] = KEY_VOLUMEDOWN,  // 'volume -'
-       [ 0x3e ] = KEY_VOLUMEUP,    // 'volume +'
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt);
+static struct ir_scancode ir_codes_avermedia_dvbt[] = {
+       { 0x28, KEY_0 },                /* '0' / 'enter' */
+       { 0x22, KEY_1 },                /* '1' */
+       { 0x12, KEY_2 },                /* '2' / 'up arrow' */
+       { 0x32, KEY_3 },                /* '3' */
+       { 0x24, KEY_4 },                /* '4' / 'left arrow' */
+       { 0x14, KEY_5 },                /* '5' */
+       { 0x34, KEY_6 },                /* '6' / 'right arrow' */
+       { 0x26, KEY_7 },                /* '7' */
+       { 0x16, KEY_8 },                /* '8' / 'down arrow' */
+       { 0x36, KEY_9 },                /* '9' */
+
+       { 0x20, KEY_LIST },             /* 'source' */
+       { 0x10, KEY_TEXT },             /* 'teletext' */
+       { 0x00, KEY_POWER },            /* 'power' */
+       { 0x04, KEY_AUDIO },            /* 'audio' */
+       { 0x06, KEY_ZOOM },             /* 'full screen' */
+       { 0x18, KEY_VIDEO },            /* 'display' */
+       { 0x38, KEY_SEARCH },           /* 'loop' */
+       { 0x08, KEY_INFO },             /* 'preview' */
+       { 0x2a, KEY_REWIND },           /* 'backward <<' */
+       { 0x1a, KEY_FASTFORWARD },      /* 'forward >>' */
+       { 0x3a, KEY_RECORD },           /* 'capture' */
+       { 0x0a, KEY_MUTE },             /* 'mute' */
+       { 0x2c, KEY_RECORD },           /* 'record' */
+       { 0x1c, KEY_PAUSE },            /* 'pause' */
+       { 0x3c, KEY_STOP },             /* 'stop' */
+       { 0x0c, KEY_PLAY },             /* 'play' */
+       { 0x2e, KEY_RED },              /* 'red' */
+       { 0x01, KEY_BLUE },             /* 'blue' / 'cancel' */
+       { 0x0e, KEY_YELLOW },           /* 'yellow' / 'ok' */
+       { 0x21, KEY_GREEN },            /* 'green' */
+       { 0x11, KEY_CHANNELDOWN },      /* 'channel -' */
+       { 0x31, KEY_CHANNELUP },        /* 'channel +' */
+       { 0x1e, KEY_VOLUMEDOWN },       /* 'volume -' */
+       { 0x3e, KEY_VOLUMEUP },         /* 'volume +' */
+};
+
+struct ir_scancode_table ir_codes_avermedia_dvbt_table = {
+       .scan = ir_codes_avermedia_dvbt,
+       .size = ARRAY_SIZE(ir_codes_avermedia_dvbt),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt_table);
 
 /* Mauro Carvalho Chehab <mchehab@infradead.org> */
-IR_KEYTAB_TYPE ir_codes_avermedia_m135a[IR_KEYTAB_SIZE] = {
-       [0x00] = KEY_POWER2,
-       [0x2e] = KEY_DOT,               /* '.' */
-       [0x01] = KEY_MODE,              /* TV/FM */
-
-       [0x05] = KEY_1,
-       [0x06] = KEY_2,
-       [0x07] = KEY_3,
-       [0x09] = KEY_4,
-       [0x0a] = KEY_5,
-       [0x0b] = KEY_6,
-       [0x0d] = KEY_7,
-       [0x0e] = KEY_8,
-       [0x0f] = KEY_9,
-       [0x11] = KEY_0,
-
-       [0x13] = KEY_RIGHT,             /* -> */
-       [0x12] = KEY_LEFT,              /* <- */
-
-       [0x17] = KEY_SLEEP,             /* Capturar Imagem */
-       [0x10] = KEY_SHUFFLE,           /* Amostra */
+static struct ir_scancode ir_codes_avermedia_m135a[] = {
+       { 0x00, KEY_POWER2 },
+       { 0x2e, KEY_DOT },              /* '.' */
+       { 0x01, KEY_MODE },             /* TV/FM */
+
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+       { 0x11, KEY_0 },
+
+       { 0x13, KEY_RIGHT },            /* -> */
+       { 0x12, KEY_LEFT },             /* <- */
+
+       { 0x17, KEY_SLEEP },            /* Capturar Imagem */
+       { 0x10, KEY_SHUFFLE },          /* Amostra */
 
        /* FIXME: The keys bellow aren't ok */
 
-       [0x43] = KEY_CHANNELUP,
-       [0x42] = KEY_CHANNELDOWN,
-       [0x1f] = KEY_VOLUMEUP,
-       [0x1e] = KEY_VOLUMEDOWN,
-       [0x0c] = KEY_ENTER,
+       { 0x43, KEY_CHANNELUP },
+       { 0x42, KEY_CHANNELDOWN },
+       { 0x1f, KEY_VOLUMEUP },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x0c, KEY_ENTER },
 
-       [0x14] = KEY_MUTE,
-       [0x08] = KEY_AUDIO,
+       { 0x14, KEY_MUTE },
+       { 0x08, KEY_AUDIO },
 
-       [0x03] = KEY_TEXT,
-       [0x04] = KEY_EPG,
-       [0x2b] = KEY_TV2,               /* TV2 */
+       { 0x03, KEY_TEXT },
+       { 0x04, KEY_EPG },
+       { 0x2b, KEY_TV2 },              /* TV2 */
 
-       [0x1d] = KEY_RED,
-       [0x1c] = KEY_YELLOW,
-       [0x41] = KEY_GREEN,
-       [0x40] = KEY_BLUE,
+       { 0x1d, KEY_RED },
+       { 0x1c, KEY_YELLOW },
+       { 0x41, KEY_GREEN },
+       { 0x40, KEY_BLUE },
 
-       [0x1a] = KEY_PLAYPAUSE,
-       [0x19] = KEY_RECORD,
-       [0x18] = KEY_PLAY,
-       [0x1b] = KEY_STOP,
+       { 0x1a, KEY_PLAYPAUSE },
+       { 0x19, KEY_RECORD },
+       { 0x18, KEY_PLAY },
+       { 0x1b, KEY_STOP },
 };
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a);
+
+struct ir_scancode_table ir_codes_avermedia_m135a_table = {
+       .scan = ir_codes_avermedia_m135a,
+       .size = ARRAY_SIZE(ir_codes_avermedia_m135a),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a_table);
 
 /* Oldrich Jedlicka <oldium.pro@seznam.cz> */
-IR_KEYTAB_TYPE ir_codes_avermedia_cardbus[IR_KEYTAB_SIZE] = {
-       [0x00] = KEY_POWER,
-       [0x01] = KEY_TUNER,             /* TV/FM */
-       [0x03] = KEY_TEXT,              /* Teletext */
-       [0x04] = KEY_EPG,
-       [0x05] = KEY_1,
-       [0x06] = KEY_2,
-       [0x07] = KEY_3,
-       [0x08] = KEY_AUDIO,
-       [0x09] = KEY_4,
-       [0x0a] = KEY_5,
-       [0x0b] = KEY_6,
-       [0x0c] = KEY_ZOOM,              /* Full screen */
-       [0x0d] = KEY_7,
-       [0x0e] = KEY_8,
-       [0x0f] = KEY_9,
-       [0x10] = KEY_PAGEUP,            /* 16-CH PREV */
-       [0x11] = KEY_0,
-       [0x12] = KEY_INFO,
-       [0x13] = KEY_AGAIN,             /* CH RTN - channel return */
-       [0x14] = KEY_MUTE,
-       [0x15] = KEY_EDIT,              /* Autoscan */
-       [0x17] = KEY_SAVE,              /* Screenshot */
-       [0x18] = KEY_PLAYPAUSE,
-       [0x19] = KEY_RECORD,
-       [0x1a] = KEY_PLAY,
-       [0x1b] = KEY_STOP,
-       [0x1c] = KEY_FASTFORWARD,
-       [0x1d] = KEY_REWIND,
-       [0x1e] = KEY_VOLUMEDOWN,
-       [0x1f] = KEY_VOLUMEUP,
-       [0x22] = KEY_SLEEP,             /* Sleep */
-       [0x23] = KEY_ZOOM,              /* Aspect */
-       [0x26] = KEY_SCREEN,            /* Pos */
-       [0x27] = KEY_ANGLE,             /* Size */
-       [0x28] = KEY_SELECT,            /* Select */
-       [0x29] = KEY_BLUE,              /* Blue/Picture */
-       [0x2a] = KEY_BACKSPACE, /* Back */
-       [0x2b] = KEY_MEDIA,             /* PIP (Picture-in-picture) */
-       [0x2c] = KEY_DOWN,
-       [0x2e] = KEY_DOT,
-       [0x2f] = KEY_TV,                /* Live TV */
-       [0x32] = KEY_LEFT,
-       [0x33] = KEY_CLEAR,             /* Clear */
-       [0x35] = KEY_RED,               /* Red/TV */
-       [0x36] = KEY_UP,
-       [0x37] = KEY_HOME,              /* Home */
-       [0x39] = KEY_GREEN,             /* Green/Video */
-       [0x3d] = KEY_YELLOW,            /* Yellow/Music */
-       [0x3e] = KEY_OK,                /* Ok */
-       [0x3f] = KEY_RIGHT,
-       [0x40] = KEY_NEXT,              /* Next */
-       [0x41] = KEY_PREVIOUS,  /* Previous */
-       [0x42] = KEY_CHANNELDOWN,       /* Channel down */
-       [0x43] = KEY_CHANNELUP  /* Channel up */
-};
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_cardbus);
+static struct ir_scancode ir_codes_avermedia_cardbus[] = {
+       { 0x00, KEY_POWER },
+       { 0x01, KEY_TUNER },            /* TV/FM */
+       { 0x03, KEY_TEXT },             /* Teletext */
+       { 0x04, KEY_EPG },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x08, KEY_AUDIO },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0c, KEY_ZOOM },             /* Full screen */
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+       { 0x10, KEY_PAGEUP },           /* 16-CH PREV */
+       { 0x11, KEY_0 },
+       { 0x12, KEY_INFO },
+       { 0x13, KEY_AGAIN },            /* CH RTN - channel return */
+       { 0x14, KEY_MUTE },
+       { 0x15, KEY_EDIT },             /* Autoscan */
+       { 0x17, KEY_SAVE },             /* Screenshot */
+       { 0x18, KEY_PLAYPAUSE },
+       { 0x19, KEY_RECORD },
+       { 0x1a, KEY_PLAY },
+       { 0x1b, KEY_STOP },
+       { 0x1c, KEY_FASTFORWARD },
+       { 0x1d, KEY_REWIND },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x1f, KEY_VOLUMEUP },
+       { 0x22, KEY_SLEEP },            /* Sleep */
+       { 0x23, KEY_ZOOM },             /* Aspect */
+       { 0x26, KEY_SCREEN },           /* Pos */
+       { 0x27, KEY_ANGLE },            /* Size */
+       { 0x28, KEY_SELECT },           /* Select */
+       { 0x29, KEY_BLUE },             /* Blue/Picture */
+       { 0x2a, KEY_BACKSPACE },        /* Back */
+       { 0x2b, KEY_MEDIA },            /* PIP (Picture-in-picture) */
+       { 0x2c, KEY_DOWN },
+       { 0x2e, KEY_DOT },
+       { 0x2f, KEY_TV },               /* Live TV */
+       { 0x32, KEY_LEFT },
+       { 0x33, KEY_CLEAR },            /* Clear */
+       { 0x35, KEY_RED },              /* Red/TV */
+       { 0x36, KEY_UP },
+       { 0x37, KEY_HOME },             /* Home */
+       { 0x39, KEY_GREEN },            /* Green/Video */
+       { 0x3d, KEY_YELLOW },           /* Yellow/Music */
+       { 0x3e, KEY_OK },               /* Ok */
+       { 0x3f, KEY_RIGHT },
+       { 0x40, KEY_NEXT },             /* Next */
+       { 0x41, KEY_PREVIOUS },         /* Previous */
+       { 0x42, KEY_CHANNELDOWN },      /* Channel down */
+       { 0x43, KEY_CHANNELUP },        /* Channel up */
+};
+
+struct ir_scancode_table ir_codes_avermedia_cardbus_table = {
+       .scan = ir_codes_avermedia_cardbus,
+       .size = ARRAY_SIZE(ir_codes_avermedia_cardbus),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_cardbus_table);
 
 /* Attila Kondoros <attila.kondoros@chello.hu> */
-IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE] = {
-
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-       [ 0x00 ] = KEY_0,
-       [ 0x17 ] = KEY_LAST,        // +100
-       [ 0x0a ] = KEY_LIST,        // recall
-
-
-       [ 0x1c ] = KEY_TUNER,       // TV/FM
-       [ 0x15 ] = KEY_SEARCH,      // scan
-       [ 0x12 ] = KEY_POWER,       // power
-       [ 0x1f ] = KEY_VOLUMEDOWN,  // vol up
-       [ 0x1b ] = KEY_VOLUMEUP,    // vol down
-       [ 0x1e ] = KEY_CHANNELDOWN, // chn up
-       [ 0x1a ] = KEY_CHANNELUP,   // chn down
-
-       [ 0x11 ] = KEY_VIDEO,       // video
-       [ 0x0f ] = KEY_ZOOM,        // full screen
-       [ 0x13 ] = KEY_MUTE,        // mute/unmute
-       [ 0x10 ] = KEY_TEXT,        // min
-
-       [ 0x0d ] = KEY_STOP,        // freeze
-       [ 0x0e ] = KEY_RECORD,      // record
-       [ 0x1d ] = KEY_PLAYPAUSE,   // stop
-       [ 0x19 ] = KEY_PLAY,        // play
-
-       [ 0x16 ] = KEY_GOTO,        // osd
-       [ 0x14 ] = KEY_REFRESH,     // default
-       [ 0x0c ] = KEY_KPPLUS,      // fine tune >>>>
-       [ 0x18 ] = KEY_KPMINUS      // fine tune <<<<
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_apac_viewcomp);
+static struct ir_scancode ir_codes_apac_viewcomp[] = {
+
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x00, KEY_0 },
+       { 0x17, KEY_LAST },             /* +100 */
+       { 0x0a, KEY_LIST },             /* recall */
+
+
+       { 0x1c, KEY_TUNER },            /* TV/FM */
+       { 0x15, KEY_SEARCH },           /* scan */
+       { 0x12, KEY_POWER },            /* power */
+       { 0x1f, KEY_VOLUMEDOWN },       /* vol up */
+       { 0x1b, KEY_VOLUMEUP },         /* vol down */
+       { 0x1e, KEY_CHANNELDOWN },      /* chn up */
+       { 0x1a, KEY_CHANNELUP },        /* chn down */
+
+       { 0x11, KEY_VIDEO },            /* video */
+       { 0x0f, KEY_ZOOM },             /* full screen */
+       { 0x13, KEY_MUTE },             /* mute/unmute */
+       { 0x10, KEY_TEXT },             /* min */
+
+       { 0x0d, KEY_STOP },             /* freeze */
+       { 0x0e, KEY_RECORD },           /* record */
+       { 0x1d, KEY_PLAYPAUSE },        /* stop */
+       { 0x19, KEY_PLAY },             /* play */
+
+       { 0x16, KEY_GOTO },             /* osd */
+       { 0x14, KEY_REFRESH },          /* default */
+       { 0x0c, KEY_KPPLUS },           /* fine tune >>>> */
+       { 0x18, KEY_KPMINUS },          /* fine tune <<<< */
+};
+
+struct ir_scancode_table ir_codes_apac_viewcomp_table = {
+       .scan = ir_codes_apac_viewcomp,
+       .size = ARRAY_SIZE(ir_codes_apac_viewcomp),
+};
+EXPORT_SYMBOL_GPL(ir_codes_apac_viewcomp_table);
 
 /* ---------------------------------------------------------------------- */
 
-IR_KEYTAB_TYPE ir_codes_pixelview[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_pixelview[] = {
 
-       [ 0x1e ] = KEY_POWER,       // power
-       [ 0x07 ] = KEY_MEDIA,       // source
-       [ 0x1c ] = KEY_SEARCH,      // scan
+       { 0x1e, KEY_POWER },    /* power */
+       { 0x07, KEY_MEDIA },    /* source */
+       { 0x1c, KEY_SEARCH },   /* scan */
 
-/* FIXME: duplicate keycodes?
- *
- * These four keys seem to share the same GPIO as CH+, CH-, <<< and >>>
- * The GPIO values are
- * 6397fb for both "Scan <" and "CH -",
- * 639ffb for "Scan >" and "CH+",
- * 6384fb for "Tune <" and "<<<",
- * 638cfb for "Tune >" and ">>>", regardless of the mask.
- *
- *     [ 0x17 ] = KEY_BACK,        // fm scan <<
- *     [ 0x1f ] = KEY_FORWARD,     // fm scan >>
- *
- *     [ 0x04 ] = KEY_LEFT,        // fm tuning <
- *     [ 0x0c ] = KEY_RIGHT,       // fm tuning >
- *
- * For now, these four keys are disabled. Pressing them will generate
- * the CH+/CH-/<<</>>> events
- */
 
-       [ 0x03 ] = KEY_TUNER,       // TV/FM
+       { 0x03, KEY_TUNER },            /* TV/FM */
 
-       [ 0x00 ] = KEY_RECORD,
-       [ 0x08 ] = KEY_STOP,
-       [ 0x11 ] = KEY_PLAY,
+       { 0x00, KEY_RECORD },
+       { 0x08, KEY_STOP },
+       { 0x11, KEY_PLAY },
 
-       [ 0x1a ] = KEY_PLAYPAUSE,   // freeze
-       [ 0x19 ] = KEY_ZOOM,        // zoom
-       [ 0x0f ] = KEY_TEXT,        // min
+       { 0x1a, KEY_PLAYPAUSE },        /* freeze */
+       { 0x19, KEY_ZOOM },             /* zoom */
+       { 0x0f, KEY_TEXT },             /* min */
 
-       [ 0x01 ] = KEY_1,
-       [ 0x0b ] = KEY_2,
-       [ 0x1b ] = KEY_3,
-       [ 0x05 ] = KEY_4,
-       [ 0x09 ] = KEY_5,
-       [ 0x15 ] = KEY_6,
-       [ 0x06 ] = KEY_7,
-       [ 0x0a ] = KEY_8,
-       [ 0x12 ] = KEY_9,
-       [ 0x02 ] = KEY_0,
-       [ 0x10 ] = KEY_LAST,        // +100
-       [ 0x13 ] = KEY_LIST,        // recall
+       { 0x01, KEY_1 },
+       { 0x0b, KEY_2 },
+       { 0x1b, KEY_3 },
+       { 0x05, KEY_4 },
+       { 0x09, KEY_5 },
+       { 0x15, KEY_6 },
+       { 0x06, KEY_7 },
+       { 0x0a, KEY_8 },
+       { 0x12, KEY_9 },
+       { 0x02, KEY_0 },
+       { 0x10, KEY_LAST },             /* +100 */
+       { 0x13, KEY_LIST },             /* recall */
 
-       [ 0x1f ] = KEY_CHANNELUP,   // chn down
-       [ 0x17 ] = KEY_CHANNELDOWN, // chn up
-       [ 0x16 ] = KEY_VOLUMEUP,    // vol down
-       [ 0x14 ] = KEY_VOLUMEDOWN,  // vol up
+       { 0x1f, KEY_CHANNELUP },        /* chn down */
+       { 0x17, KEY_CHANNELDOWN },      /* chn up */
+       { 0x16, KEY_VOLUMEUP },         /* vol down */
+       { 0x14, KEY_VOLUMEDOWN },       /* vol up */
 
-       [ 0x04 ] = KEY_KPMINUS,     // <<<
-       [ 0x0e ] = KEY_SETUP,       // function
-       [ 0x0c ] = KEY_KPPLUS,      // >>>
+       { 0x04, KEY_KPMINUS },          /* <<< */
+       { 0x0e, KEY_SETUP },            /* function */
+       { 0x0c, KEY_KPPLUS },           /* >>> */
 
-       [ 0x0d ] = KEY_GOTO,        // mts
-       [ 0x1d ] = KEY_REFRESH,     // reset
-       [ 0x18 ] = KEY_MUTE         // mute/unmute
+       { 0x0d, KEY_GOTO },             /* mts */
+       { 0x1d, KEY_REFRESH },          /* reset */
+       { 0x18, KEY_MUTE },             /* mute/unmute */
 };
 
-EXPORT_SYMBOL_GPL(ir_codes_pixelview);
+struct ir_scancode_table ir_codes_pixelview_table = {
+       .scan = ir_codes_pixelview,
+       .size = ARRAY_SIZE(ir_codes_pixelview),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pixelview_table);
 
 /*
    Mauro Carvalho Chehab <mchehab@infradead.org>
    present on PV MPEG 8000GT
  */
-IR_KEYTAB_TYPE ir_codes_pixelview_new[IR_KEYTAB_SIZE] = {
-       [0x3c] = KEY_PAUSE,             /* Timeshift */
-       [0x12] = KEY_POWER,
-
-       [0x3d] = KEY_1,
-       [0x38] = KEY_2,
-       [0x18] = KEY_3,
-       [0x35] = KEY_4,
-       [0x39] = KEY_5,
-       [0x15] = KEY_6,
-       [0x36] = KEY_7,
-       [0x3a] = KEY_8,
-       [0x1e] = KEY_9,
-       [0x3e] = KEY_0,
-
-       [0x1c] = KEY_AGAIN,             /* LOOP */
-       [0x3f] = KEY_MEDIA,             /* Source */
-       [0x1f] = KEY_LAST,              /* +100 */
-       [0x1b] = KEY_MUTE,
-
-       [0x17] = KEY_CHANNELDOWN,
-       [0x16] = KEY_CHANNELUP,
-       [0x10] = KEY_VOLUMEUP,
-       [0x14] = KEY_VOLUMEDOWN,
-       [0x13] = KEY_ZOOM,
-
-       [0x19] = KEY_SHUFFLE,           /* SNAPSHOT */
-       [0x1a] = KEY_SEARCH,            /* scan */
-
-       [0x37] = KEY_REWIND,            /* << */
-       [0x32] = KEY_RECORD,            /* o (red) */
-       [0x33] = KEY_FORWARD,           /* >> */
-       [0x11] = KEY_STOP,              /* square */
-       [0x3b] = KEY_PLAY,              /* > */
-       [0x30] = KEY_PLAYPAUSE,         /* || */
-
-       [0x31] = KEY_TV,
-       [0x34] = KEY_RADIO,
-};
-EXPORT_SYMBOL_GPL(ir_codes_pixelview_new);
-
-IR_KEYTAB_TYPE ir_codes_nebula[IR_KEYTAB_SIZE] = {
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-       [ 0x0a ] = KEY_TV,
-       [ 0x0b ] = KEY_AUX,
-       [ 0x0c ] = KEY_DVD,
-       [ 0x0d ] = KEY_POWER,
-       [ 0x0e ] = KEY_MHP,     /* labelled 'Picture' */
-       [ 0x0f ] = KEY_AUDIO,
-       [ 0x10 ] = KEY_INFO,
-       [ 0x11 ] = KEY_F13,     /* 16:9 */
-       [ 0x12 ] = KEY_F14,     /* 14:9 */
-       [ 0x13 ] = KEY_EPG,
-       [ 0x14 ] = KEY_EXIT,
-       [ 0x15 ] = KEY_MENU,
-       [ 0x16 ] = KEY_UP,
-       [ 0x17 ] = KEY_DOWN,
-       [ 0x18 ] = KEY_LEFT,
-       [ 0x19 ] = KEY_RIGHT,
-       [ 0x1a ] = KEY_ENTER,
-       [ 0x1b ] = KEY_CHANNELUP,
-       [ 0x1c ] = KEY_CHANNELDOWN,
-       [ 0x1d ] = KEY_VOLUMEUP,
-       [ 0x1e ] = KEY_VOLUMEDOWN,
-       [ 0x1f ] = KEY_RED,
-       [ 0x20 ] = KEY_GREEN,
-       [ 0x21 ] = KEY_YELLOW,
-       [ 0x22 ] = KEY_BLUE,
-       [ 0x23 ] = KEY_SUBTITLE,
-       [ 0x24 ] = KEY_F15,     /* AD */
-       [ 0x25 ] = KEY_TEXT,
-       [ 0x26 ] = KEY_MUTE,
-       [ 0x27 ] = KEY_REWIND,
-       [ 0x28 ] = KEY_STOP,
-       [ 0x29 ] = KEY_PLAY,
-       [ 0x2a ] = KEY_FASTFORWARD,
-       [ 0x2b ] = KEY_F16,     /* chapter */
-       [ 0x2c ] = KEY_PAUSE,
-       [ 0x2d ] = KEY_PLAY,
-       [ 0x2e ] = KEY_RECORD,
-       [ 0x2f ] = KEY_F17,     /* picture in picture */
-       [ 0x30 ] = KEY_KPPLUS,  /* zoom in */
-       [ 0x31 ] = KEY_KPMINUS, /* zoom out */
-       [ 0x32 ] = KEY_F18,     /* capture */
-       [ 0x33 ] = KEY_F19,     /* web */
-       [ 0x34 ] = KEY_EMAIL,
-       [ 0x35 ] = KEY_PHONE,
-       [ 0x36 ] = KEY_PC
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_nebula);
+static struct ir_scancode ir_codes_pixelview_new[] = {
+       { 0x3c, KEY_TIME },             /* Timeshift */
+       { 0x12, KEY_POWER },
+
+       { 0x3d, KEY_1 },
+       { 0x38, KEY_2 },
+       { 0x18, KEY_3 },
+       { 0x35, KEY_4 },
+       { 0x39, KEY_5 },
+       { 0x15, KEY_6 },
+       { 0x36, KEY_7 },
+       { 0x3a, KEY_8 },
+       { 0x1e, KEY_9 },
+       { 0x3e, KEY_0 },
+
+       { 0x1c, KEY_AGAIN },            /* LOOP */
+       { 0x3f, KEY_MEDIA },            /* Source */
+       { 0x1f, KEY_LAST },             /* +100 */
+       { 0x1b, KEY_MUTE },
+
+       { 0x17, KEY_CHANNELDOWN },
+       { 0x16, KEY_CHANNELUP },
+       { 0x10, KEY_VOLUMEUP },
+       { 0x14, KEY_VOLUMEDOWN },
+       { 0x13, KEY_ZOOM },
+
+       { 0x19, KEY_CAMERA },           /* SNAPSHOT */
+       { 0x1a, KEY_SEARCH },           /* scan */
+
+       { 0x37, KEY_REWIND },           /* << */
+       { 0x32, KEY_RECORD },           /* o (red) */
+       { 0x33, KEY_FORWARD },          /* >> */
+       { 0x11, KEY_STOP },             /* square */
+       { 0x3b, KEY_PLAY },             /* > */
+       { 0x30, KEY_PLAYPAUSE },        /* || */
+
+       { 0x31, KEY_TV },
+       { 0x34, KEY_RADIO },
+};
+
+struct ir_scancode_table ir_codes_pixelview_new_table = {
+       .scan = ir_codes_pixelview_new,
+       .size = ARRAY_SIZE(ir_codes_pixelview_new),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pixelview_new_table);
+
+static struct ir_scancode ir_codes_nebula[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x0a, KEY_TV },
+       { 0x0b, KEY_AUX },
+       { 0x0c, KEY_DVD },
+       { 0x0d, KEY_POWER },
+       { 0x0e, KEY_MHP },      /* labelled 'Picture' */
+       { 0x0f, KEY_AUDIO },
+       { 0x10, KEY_INFO },
+       { 0x11, KEY_F13 },      /* 16:9 */
+       { 0x12, KEY_F14 },      /* 14:9 */
+       { 0x13, KEY_EPG },
+       { 0x14, KEY_EXIT },
+       { 0x15, KEY_MENU },
+       { 0x16, KEY_UP },
+       { 0x17, KEY_DOWN },
+       { 0x18, KEY_LEFT },
+       { 0x19, KEY_RIGHT },
+       { 0x1a, KEY_ENTER },
+       { 0x1b, KEY_CHANNELUP },
+       { 0x1c, KEY_CHANNELDOWN },
+       { 0x1d, KEY_VOLUMEUP },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x1f, KEY_RED },
+       { 0x20, KEY_GREEN },
+       { 0x21, KEY_YELLOW },
+       { 0x22, KEY_BLUE },
+       { 0x23, KEY_SUBTITLE },
+       { 0x24, KEY_F15 },      /* AD */
+       { 0x25, KEY_TEXT },
+       { 0x26, KEY_MUTE },
+       { 0x27, KEY_REWIND },
+       { 0x28, KEY_STOP },
+       { 0x29, KEY_PLAY },
+       { 0x2a, KEY_FASTFORWARD },
+       { 0x2b, KEY_F16 },      /* chapter */
+       { 0x2c, KEY_PAUSE },
+       { 0x2d, KEY_PLAY },
+       { 0x2e, KEY_RECORD },
+       { 0x2f, KEY_F17 },      /* picture in picture */
+       { 0x30, KEY_KPPLUS },   /* zoom in */
+       { 0x31, KEY_KPMINUS },  /* zoom out */
+       { 0x32, KEY_F18 },      /* capture */
+       { 0x33, KEY_F19 },      /* web */
+       { 0x34, KEY_EMAIL },
+       { 0x35, KEY_PHONE },
+       { 0x36, KEY_PC },
+};
+
+struct ir_scancode_table ir_codes_nebula_table = {
+       .scan = ir_codes_nebula,
+       .size = ARRAY_SIZE(ir_codes_nebula),
+};
+EXPORT_SYMBOL_GPL(ir_codes_nebula_table);
 
 /* DigitalNow DNTV Live DVB-T Remote */
-IR_KEYTAB_TYPE ir_codes_dntv_live_dvb_t[IR_KEYTAB_SIZE] = {
-       [ 0x00 ] = KEY_ESC,             /* 'go up a level?' */
+static struct ir_scancode ir_codes_dntv_live_dvb_t[] = {
+       { 0x00, KEY_ESC },              /* 'go up a level?' */
        /* Keys 0 to 9 */
-       [ 0x0a ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x0b ] = KEY_TUNER,           /* tv/fm */
-       [ 0x0c ] = KEY_SEARCH,          /* scan */
-       [ 0x0d ] = KEY_STOP,
-       [ 0x0e ] = KEY_PAUSE,
-       [ 0x0f ] = KEY_LIST,            /* source */
-
-       [ 0x10 ] = KEY_MUTE,
-       [ 0x11 ] = KEY_REWIND,          /* backward << */
-       [ 0x12 ] = KEY_POWER,
-       [ 0x13 ] = KEY_S,                       /* snap */
-       [ 0x14 ] = KEY_AUDIO,           /* stereo */
-       [ 0x15 ] = KEY_CLEAR,           /* reset */
-       [ 0x16 ] = KEY_PLAY,
-       [ 0x17 ] = KEY_ENTER,
-       [ 0x18 ] = KEY_ZOOM,            /* full screen */
-       [ 0x19 ] = KEY_FASTFORWARD,     /* forward >> */
-       [ 0x1a ] = KEY_CHANNELUP,
-       [ 0x1b ] = KEY_VOLUMEUP,
-       [ 0x1c ] = KEY_INFO,            /* preview */
-       [ 0x1d ] = KEY_RECORD,          /* record */
-       [ 0x1e ] = KEY_CHANNELDOWN,
-       [ 0x1f ] = KEY_VOLUMEDOWN,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvb_t);
+       { 0x0a, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0b, KEY_TUNER },            /* tv/fm */
+       { 0x0c, KEY_SEARCH },           /* scan */
+       { 0x0d, KEY_STOP },
+       { 0x0e, KEY_PAUSE },
+       { 0x0f, KEY_LIST },             /* source */
+
+       { 0x10, KEY_MUTE },
+       { 0x11, KEY_REWIND },           /* backward << */
+       { 0x12, KEY_POWER },
+       { 0x13, KEY_CAMERA },           /* snap */
+       { 0x14, KEY_AUDIO },            /* stereo */
+       { 0x15, KEY_CLEAR },            /* reset */
+       { 0x16, KEY_PLAY },
+       { 0x17, KEY_ENTER },
+       { 0x18, KEY_ZOOM },             /* full screen */
+       { 0x19, KEY_FASTFORWARD },      /* forward >> */
+       { 0x1a, KEY_CHANNELUP },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1c, KEY_INFO },             /* preview */
+       { 0x1d, KEY_RECORD },           /* record */
+       { 0x1e, KEY_CHANNELDOWN },
+       { 0x1f, KEY_VOLUMEDOWN },
+};
+
+struct ir_scancode_table ir_codes_dntv_live_dvb_t_table = {
+       .scan = ir_codes_dntv_live_dvb_t,
+       .size = ARRAY_SIZE(ir_codes_dntv_live_dvb_t),
+};
+EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvb_t_table);
 
 /* ---------------------------------------------------------------------- */
 
 /* IO-DATA BCTV7E Remote */
-IR_KEYTAB_TYPE ir_codes_iodata_bctv7e[IR_KEYTAB_SIZE] = {
-       [ 0x40 ] = KEY_TV,
-       [ 0x20 ] = KEY_RADIO,           /* FM */
-       [ 0x60 ] = KEY_EPG,
-       [ 0x00 ] = KEY_POWER,
+static struct ir_scancode ir_codes_iodata_bctv7e[] = {
+       { 0x40, KEY_TV },
+       { 0x20, KEY_RADIO },            /* FM */
+       { 0x60, KEY_EPG },
+       { 0x00, KEY_POWER },
 
        /* Keys 0 to 9 */
-       [ 0x44 ] = KEY_0,               /* 10 */
-       [ 0x50 ] = KEY_1,
-       [ 0x30 ] = KEY_2,
-       [ 0x70 ] = KEY_3,
-       [ 0x48 ] = KEY_4,
-       [ 0x28 ] = KEY_5,
-       [ 0x68 ] = KEY_6,
-       [ 0x58 ] = KEY_7,
-       [ 0x38 ] = KEY_8,
-       [ 0x78 ] = KEY_9,
-
-       [ 0x10 ] = KEY_L,                       /* Live */
-       [ 0x08 ] = KEY_T,                       /* Time Shift */
-
-       [ 0x18 ] = KEY_PLAYPAUSE,               /* Play */
-
-       [ 0x24 ] = KEY_ENTER,           /* 11 */
-       [ 0x64 ] = KEY_ESC,             /* 12 */
-       [ 0x04 ] = KEY_M,                       /* Multi */
-
-       [ 0x54 ] = KEY_VIDEO,
-       [ 0x34 ] = KEY_CHANNELUP,
-       [ 0x74 ] = KEY_VOLUMEUP,
-       [ 0x14 ] = KEY_MUTE,
-
-       [ 0x4c ] = KEY_S,                       /* SVIDEO */
-       [ 0x2c ] = KEY_CHANNELDOWN,
-       [ 0x6c ] = KEY_VOLUMEDOWN,
-       [ 0x0c ] = KEY_ZOOM,
-
-       [ 0x5c ] = KEY_PAUSE,
-       [ 0x3c ] = KEY_C,                       /* || (red) */
-       [ 0x7c ] = KEY_RECORD,          /* recording */
-       [ 0x1c ] = KEY_STOP,
-
-       [ 0x41 ] = KEY_REWIND,          /* backward << */
-       [ 0x21 ] = KEY_PLAY,
-       [ 0x61 ] = KEY_FASTFORWARD,     /* forward >> */
-       [ 0x01 ] = KEY_NEXT,            /* skip >| */
+       { 0x44, KEY_0 },                /* 10 */
+       { 0x50, KEY_1 },
+       { 0x30, KEY_2 },
+       { 0x70, KEY_3 },
+       { 0x48, KEY_4 },
+       { 0x28, KEY_5 },
+       { 0x68, KEY_6 },
+       { 0x58, KEY_7 },
+       { 0x38, KEY_8 },
+       { 0x78, KEY_9 },
+
+       { 0x10, KEY_L },                /* Live */
+       { 0x08, KEY_TIME },             /* Time Shift */
+
+       { 0x18, KEY_PLAYPAUSE },        /* Play */
+
+       { 0x24, KEY_ENTER },            /* 11 */
+       { 0x64, KEY_ESC },              /* 12 */
+       { 0x04, KEY_M },                /* Multi */
+
+       { 0x54, KEY_VIDEO },
+       { 0x34, KEY_CHANNELUP },
+       { 0x74, KEY_VOLUMEUP },
+       { 0x14, KEY_MUTE },
+
+       { 0x4c, KEY_VCR },              /* SVIDEO */
+       { 0x2c, KEY_CHANNELDOWN },
+       { 0x6c, KEY_VOLUMEDOWN },
+       { 0x0c, KEY_ZOOM },
+
+       { 0x5c, KEY_PAUSE },
+       { 0x3c, KEY_RED },              /* || (red) */
+       { 0x7c, KEY_RECORD },           /* recording */
+       { 0x1c, KEY_STOP },
+
+       { 0x41, KEY_REWIND },           /* backward << */
+       { 0x21, KEY_PLAY },
+       { 0x61, KEY_FASTFORWARD },      /* forward >> */
+       { 0x01, KEY_NEXT },             /* skip >| */
 };
 
-EXPORT_SYMBOL_GPL(ir_codes_iodata_bctv7e);
+struct ir_scancode_table ir_codes_iodata_bctv7e_table = {
+       .scan = ir_codes_iodata_bctv7e,
+       .size = ARRAY_SIZE(ir_codes_iodata_bctv7e),
+};
+EXPORT_SYMBOL_GPL(ir_codes_iodata_bctv7e_table);
 
 /* ---------------------------------------------------------------------- */
 
 /* ADS Tech Instant TV DVB-T PCI Remote */
-IR_KEYTAB_TYPE ir_codes_adstech_dvb_t_pci[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_adstech_dvb_t_pci[] = {
        /* Keys 0 to 9 */
-       [ 0x4d ] = KEY_0,
-       [ 0x57 ] = KEY_1,
-       [ 0x4f ] = KEY_2,
-       [ 0x53 ] = KEY_3,
-       [ 0x56 ] = KEY_4,
-       [ 0x4e ] = KEY_5,
-       [ 0x5e ] = KEY_6,
-       [ 0x54 ] = KEY_7,
-       [ 0x4c ] = KEY_8,
-       [ 0x5c ] = KEY_9,
-
-       [ 0x5b ] = KEY_POWER,
-       [ 0x5f ] = KEY_MUTE,
-       [ 0x55 ] = KEY_GOTO,
-       [ 0x5d ] = KEY_SEARCH,
-       [ 0x17 ] = KEY_EPG,             /* Guide */
-       [ 0x1f ] = KEY_MENU,
-       [ 0x0f ] = KEY_UP,
-       [ 0x46 ] = KEY_DOWN,
-       [ 0x16 ] = KEY_LEFT,
-       [ 0x1e ] = KEY_RIGHT,
-       [ 0x0e ] = KEY_SELECT,          /* Enter */
-       [ 0x5a ] = KEY_INFO,
-       [ 0x52 ] = KEY_EXIT,
-       [ 0x59 ] = KEY_PREVIOUS,
-       [ 0x51 ] = KEY_NEXT,
-       [ 0x58 ] = KEY_REWIND,
-       [ 0x50 ] = KEY_FORWARD,
-       [ 0x44 ] = KEY_PLAYPAUSE,
-       [ 0x07 ] = KEY_STOP,
-       [ 0x1b ] = KEY_RECORD,
-       [ 0x13 ] = KEY_TUNER,           /* Live */
-       [ 0x0a ] = KEY_A,
-       [ 0x12 ] = KEY_B,
-       [ 0x03 ] = KEY_PROG1,           /* 1 */
-       [ 0x01 ] = KEY_PROG2,           /* 2 */
-       [ 0x00 ] = KEY_PROG3,           /* 3 */
-       [ 0x06 ] = KEY_DVD,
-       [ 0x48 ] = KEY_AUX,             /* Photo */
-       [ 0x40 ] = KEY_VIDEO,
-       [ 0x19 ] = KEY_AUDIO,           /* Music */
-       [ 0x0b ] = KEY_CHANNELUP,
-       [ 0x08 ] = KEY_CHANNELDOWN,
-       [ 0x15 ] = KEY_VOLUMEUP,
-       [ 0x1c ] = KEY_VOLUMEDOWN,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci);
+       { 0x4d, KEY_0 },
+       { 0x57, KEY_1 },
+       { 0x4f, KEY_2 },
+       { 0x53, KEY_3 },
+       { 0x56, KEY_4 },
+       { 0x4e, KEY_5 },
+       { 0x5e, KEY_6 },
+       { 0x54, KEY_7 },
+       { 0x4c, KEY_8 },
+       { 0x5c, KEY_9 },
+
+       { 0x5b, KEY_POWER },
+       { 0x5f, KEY_MUTE },
+       { 0x55, KEY_GOTO },
+       { 0x5d, KEY_SEARCH },
+       { 0x17, KEY_EPG },              /* Guide */
+       { 0x1f, KEY_MENU },
+       { 0x0f, KEY_UP },
+       { 0x46, KEY_DOWN },
+       { 0x16, KEY_LEFT },
+       { 0x1e, KEY_RIGHT },
+       { 0x0e, KEY_SELECT },           /* Enter */
+       { 0x5a, KEY_INFO },
+       { 0x52, KEY_EXIT },
+       { 0x59, KEY_PREVIOUS },
+       { 0x51, KEY_NEXT },
+       { 0x58, KEY_REWIND },
+       { 0x50, KEY_FORWARD },
+       { 0x44, KEY_PLAYPAUSE },
+       { 0x07, KEY_STOP },
+       { 0x1b, KEY_RECORD },
+       { 0x13, KEY_TUNER },            /* Live */
+       { 0x0a, KEY_A },
+       { 0x12, KEY_B },
+       { 0x03, KEY_PROG1 },            /* 1 */
+       { 0x01, KEY_PROG2 },            /* 2 */
+       { 0x00, KEY_PROG3 },            /* 3 */
+       { 0x06, KEY_DVD },
+       { 0x48, KEY_AUX },              /* Photo */
+       { 0x40, KEY_VIDEO },
+       { 0x19, KEY_AUDIO },            /* Music */
+       { 0x0b, KEY_CHANNELUP },
+       { 0x08, KEY_CHANNELDOWN },
+       { 0x15, KEY_VOLUMEUP },
+       { 0x1c, KEY_VOLUMEDOWN },
+};
+
+struct ir_scancode_table ir_codes_adstech_dvb_t_pci_table = {
+       .scan = ir_codes_adstech_dvb_t_pci,
+       .size = ARRAY_SIZE(ir_codes_adstech_dvb_t_pci),
+};
+EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci_table);
 
 /* ---------------------------------------------------------------------- */
 
 /* MSI TV@nywhere MASTER remote */
 
-IR_KEYTAB_TYPE ir_codes_msi_tvanywhere[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_msi_tvanywhere[] = {
        /* Keys 0 to 9 */
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x0c ] = KEY_MUTE,
-       [ 0x0f ] = KEY_SCREEN,          /* Full Screen */
-       [ 0x10 ] = KEY_F,                       /* Funtion */
-       [ 0x11 ] = KEY_T,                       /* Time shift */
-       [ 0x12 ] = KEY_POWER,
-       [ 0x13 ] = KEY_MEDIA,           /* MTS */
-       [ 0x14 ] = KEY_SLOW,
-       [ 0x16 ] = KEY_REWIND,          /* backward << */
-       [ 0x17 ] = KEY_ENTER,           /* Return */
-       [ 0x18 ] = KEY_FASTFORWARD,     /* forward >> */
-       [ 0x1a ] = KEY_CHANNELUP,
-       [ 0x1b ] = KEY_VOLUMEUP,
-       [ 0x1e ] = KEY_CHANNELDOWN,
-       [ 0x1f ] = KEY_VOLUMEDOWN,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere);
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0c, KEY_MUTE },
+       { 0x0f, KEY_SCREEN },           /* Full Screen */
+       { 0x10, KEY_FN },               /* Funtion */
+       { 0x11, KEY_TIME },             /* Time shift */
+       { 0x12, KEY_POWER },
+       { 0x13, KEY_MEDIA },            /* MTS */
+       { 0x14, KEY_SLOW },
+       { 0x16, KEY_REWIND },           /* backward << */
+       { 0x17, KEY_ENTER },            /* Return */
+       { 0x18, KEY_FASTFORWARD },      /* forward >> */
+       { 0x1a, KEY_CHANNELUP },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1e, KEY_CHANNELDOWN },
+       { 0x1f, KEY_VOLUMEDOWN },
+};
+
+struct ir_scancode_table ir_codes_msi_tvanywhere_table = {
+       .scan = ir_codes_msi_tvanywhere,
+       .size = ARRAY_SIZE(ir_codes_msi_tvanywhere),
+};
+EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_table);
 
 /* ---------------------------------------------------------------------- */
 
@@ -626,7 +668,7 @@ EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere);
 
 */
 
-IR_KEYTAB_TYPE ir_codes_msi_tvanywhere_plus[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_msi_tvanywhere_plus[] = {
 
 /*  ---- Remote Button Layout ----
 
@@ -648,596 +690,645 @@ IR_KEYTAB_TYPE ir_codes_msi_tvanywhere_plus[IR_KEYTAB_SIZE] = {
      <<      FUNC    >>     RESET
 */
 
-       [0x01] = KEY_KP1,             /* 1 */
-       [0x0b] = KEY_KP2,             /* 2 */
-       [0x1b] = KEY_KP3,             /* 3 */
-       [0x05] = KEY_KP4,             /* 4 */
-       [0x09] = KEY_KP5,             /* 5 */
-       [0x15] = KEY_KP6,             /* 6 */
-       [0x06] = KEY_KP7,             /* 7 */
-       [0x0a] = KEY_KP8,             /* 8 */
-       [0x12] = KEY_KP9,             /* 9 */
-       [0x02] = KEY_KP0,             /* 0 */
-       [0x10] = KEY_KPPLUS,          /* + */
-       [0x13] = KEY_AGAIN,           /* Recall */
-
-       [0x1e] = KEY_POWER,           /* Power */
-       [0x07] = KEY_TUNER,           /* Source */
-       [0x1c] = KEY_SEARCH,          /* Scan */
-       [0x18] = KEY_MUTE,            /* Mute */
-
-       [0x03] = KEY_RADIO,           /* TV/FM */
+       { 0x01, KEY_1 },                /* 1 */
+       { 0x0b, KEY_2 },                /* 2 */
+       { 0x1b, KEY_3 },                /* 3 */
+       { 0x05, KEY_4 },                /* 4 */
+       { 0x09, KEY_5 },                /* 5 */
+       { 0x15, KEY_6 },                /* 6 */
+       { 0x06, KEY_7 },                /* 7 */
+       { 0x0a, KEY_8 },                /* 8 */
+       { 0x12, KEY_9 },                /* 9 */
+       { 0x02, KEY_0 },                /* 0 */
+       { 0x10, KEY_KPPLUS },           /* + */
+       { 0x13, KEY_AGAIN },            /* Recall */
+
+       { 0x1e, KEY_POWER },            /* Power */
+       { 0x07, KEY_TUNER },            /* Source */
+       { 0x1c, KEY_SEARCH },           /* Scan */
+       { 0x18, KEY_MUTE },             /* Mute */
+
+       { 0x03, KEY_RADIO },            /* TV/FM */
        /* The next four keys are duplicates that appear to send the
           same IR code as Ch+, Ch-, >>, and << .  The raw code assigned
           to them is the actual code + 0x20 - they will never be
           detected as such unless some way is discovered to distinguish
           these buttons from those that have the same code. */
-       [0x3f] = KEY_RIGHT,           /* |> and Ch+ */
-       [0x37] = KEY_LEFT,            /* <| and Ch- */
-       [0x2c] = KEY_UP,              /* ^^Up and >> */
-       [0x24] = KEY_DOWN,            /* vvDn and << */
-
-       [0x00] = KEY_RECORD,          /* Record */
-       [0x08] = KEY_STOP,            /* Stop */
-       [0x11] = KEY_PLAY,            /* Play */
-
-       [0x0f] = KEY_CLOSE,           /* Minimize */
-       [0x19] = KEY_ZOOM,            /* Zoom */
-       [0x1a] = KEY_SHUFFLE,         /* Snapshot */
-       [0x0d] = KEY_LANGUAGE,        /* MTS */
-
-       [0x14] = KEY_VOLUMEDOWN,      /* Vol- */
-       [0x16] = KEY_VOLUMEUP,        /* Vol+ */
-       [0x17] = KEY_CHANNELDOWN,     /* Ch- */
-       [0x1f] = KEY_CHANNELUP,       /* Ch+ */
+       { 0x3f, KEY_RIGHT },            /* |> and Ch+ */
+       { 0x37, KEY_LEFT },             /* <| and Ch- */
+       { 0x2c, KEY_UP },               /* ^^Up and >> */
+       { 0x24, KEY_DOWN },             /* vvDn and << */
+
+       { 0x00, KEY_RECORD },           /* Record */
+       { 0x08, KEY_STOP },             /* Stop */
+       { 0x11, KEY_PLAY },             /* Play */
+
+       { 0x0f, KEY_CLOSE },            /* Minimize */
+       { 0x19, KEY_ZOOM },             /* Zoom */
+       { 0x1a, KEY_CAMERA },           /* Snapshot */
+       { 0x0d, KEY_LANGUAGE },         /* MTS */
+
+       { 0x14, KEY_VOLUMEDOWN },       /* Vol- */
+       { 0x16, KEY_VOLUMEUP },         /* Vol+ */
+       { 0x17, KEY_CHANNELDOWN },      /* Ch- */
+       { 0x1f, KEY_CHANNELUP },        /* Ch+ */
+
+       { 0x04, KEY_REWIND },           /* << */
+       { 0x0e, KEY_MENU },             /* Function */
+       { 0x0c, KEY_FASTFORWARD },      /* >> */
+       { 0x1d, KEY_RESTART },          /* Reset */
+};
 
-       [0x04] = KEY_REWIND,          /* << */
-       [0x0e] = KEY_MENU,            /* Function */
-       [0x0c] = KEY_FASTFORWARD,     /* >> */
-       [0x1d] = KEY_RESTART,         /* Reset */
+struct ir_scancode_table ir_codes_msi_tvanywhere_plus_table = {
+       .scan = ir_codes_msi_tvanywhere_plus,
+       .size = ARRAY_SIZE(ir_codes_msi_tvanywhere_plus),
 };
-EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_plus);
+EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_plus_table);
 
 /* ---------------------------------------------------------------------- */
 
 /* Cinergy 1400 DVB-T */
-IR_KEYTAB_TYPE ir_codes_cinergy_1400[IR_KEYTAB_SIZE] = {
-       [ 0x01 ] = KEY_POWER,
-       [ 0x02 ] = KEY_1,
-       [ 0x03 ] = KEY_2,
-       [ 0x04 ] = KEY_3,
-       [ 0x05 ] = KEY_4,
-       [ 0x06 ] = KEY_5,
-       [ 0x07 ] = KEY_6,
-       [ 0x08 ] = KEY_7,
-       [ 0x09 ] = KEY_8,
-       [ 0x0a ] = KEY_9,
-       [ 0x0c ] = KEY_0,
-
-       [ 0x0b ] = KEY_VIDEO,
-       [ 0x0d ] = KEY_REFRESH,
-       [ 0x0e ] = KEY_SELECT,
-       [ 0x0f ] = KEY_EPG,
-       [ 0x10 ] = KEY_UP,
-       [ 0x11 ] = KEY_LEFT,
-       [ 0x12 ] = KEY_OK,
-       [ 0x13 ] = KEY_RIGHT,
-       [ 0x14 ] = KEY_DOWN,
-       [ 0x15 ] = KEY_TEXT,
-       [ 0x16 ] = KEY_INFO,
-
-       [ 0x17 ] = KEY_RED,
-       [ 0x18 ] = KEY_GREEN,
-       [ 0x19 ] = KEY_YELLOW,
-       [ 0x1a ] = KEY_BLUE,
-
-       [ 0x1b ] = KEY_CHANNELUP,
-       [ 0x1c ] = KEY_VOLUMEUP,
-       [ 0x1d ] = KEY_MUTE,
-       [ 0x1e ] = KEY_VOLUMEDOWN,
-       [ 0x1f ] = KEY_CHANNELDOWN,
-
-       [ 0x40 ] = KEY_PAUSE,
-       [ 0x4c ] = KEY_PLAY,
-       [ 0x58 ] = KEY_RECORD,
-       [ 0x54 ] = KEY_PREVIOUS,
-       [ 0x48 ] = KEY_STOP,
-       [ 0x5c ] = KEY_NEXT,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_cinergy_1400);
+static struct ir_scancode ir_codes_cinergy_1400[] = {
+       { 0x01, KEY_POWER },
+       { 0x02, KEY_1 },
+       { 0x03, KEY_2 },
+       { 0x04, KEY_3 },
+       { 0x05, KEY_4 },
+       { 0x06, KEY_5 },
+       { 0x07, KEY_6 },
+       { 0x08, KEY_7 },
+       { 0x09, KEY_8 },
+       { 0x0a, KEY_9 },
+       { 0x0c, KEY_0 },
+
+       { 0x0b, KEY_VIDEO },
+       { 0x0d, KEY_REFRESH },
+       { 0x0e, KEY_SELECT },
+       { 0x0f, KEY_EPG },
+       { 0x10, KEY_UP },
+       { 0x11, KEY_LEFT },
+       { 0x12, KEY_OK },
+       { 0x13, KEY_RIGHT },
+       { 0x14, KEY_DOWN },
+       { 0x15, KEY_TEXT },
+       { 0x16, KEY_INFO },
+
+       { 0x17, KEY_RED },
+       { 0x18, KEY_GREEN },
+       { 0x19, KEY_YELLOW },
+       { 0x1a, KEY_BLUE },
+
+       { 0x1b, KEY_CHANNELUP },
+       { 0x1c, KEY_VOLUMEUP },
+       { 0x1d, KEY_MUTE },
+       { 0x1e, KEY_VOLUMEDOWN },
+       { 0x1f, KEY_CHANNELDOWN },
+
+       { 0x40, KEY_PAUSE },
+       { 0x4c, KEY_PLAY },
+       { 0x58, KEY_RECORD },
+       { 0x54, KEY_PREVIOUS },
+       { 0x48, KEY_STOP },
+       { 0x5c, KEY_NEXT },
+};
+
+struct ir_scancode_table ir_codes_cinergy_1400_table = {
+       .scan = ir_codes_cinergy_1400,
+       .size = ARRAY_SIZE(ir_codes_cinergy_1400),
+};
+EXPORT_SYMBOL_GPL(ir_codes_cinergy_1400_table);
 
 /* ---------------------------------------------------------------------- */
 
 /* AVERTV STUDIO 303 Remote */
-IR_KEYTAB_TYPE ir_codes_avertv_303[IR_KEYTAB_SIZE] = {
-       [ 0x2a ] = KEY_1,
-       [ 0x32 ] = KEY_2,
-       [ 0x3a ] = KEY_3,
-       [ 0x4a ] = KEY_4,
-       [ 0x52 ] = KEY_5,
-       [ 0x5a ] = KEY_6,
-       [ 0x6a ] = KEY_7,
-       [ 0x72 ] = KEY_8,
-       [ 0x7a ] = KEY_9,
-       [ 0x0e ] = KEY_0,
-
-       [ 0x02 ] = KEY_POWER,
-       [ 0x22 ] = KEY_VIDEO,
-       [ 0x42 ] = KEY_AUDIO,
-       [ 0x62 ] = KEY_ZOOM,
-       [ 0x0a ] = KEY_TV,
-       [ 0x12 ] = KEY_CD,
-       [ 0x1a ] = KEY_TEXT,
-
-       [ 0x16 ] = KEY_SUBTITLE,
-       [ 0x1e ] = KEY_REWIND,
-       [ 0x06 ] = KEY_PRINT,
-
-       [ 0x2e ] = KEY_SEARCH,
-       [ 0x36 ] = KEY_SLEEP,
-       [ 0x3e ] = KEY_SHUFFLE,
-       [ 0x26 ] = KEY_MUTE,
-
-       [ 0x4e ] = KEY_RECORD,
-       [ 0x56 ] = KEY_PAUSE,
-       [ 0x5e ] = KEY_STOP,
-       [ 0x46 ] = KEY_PLAY,
-
-       [ 0x6e ] = KEY_RED,
-       [ 0x0b ] = KEY_GREEN,
-       [ 0x66 ] = KEY_YELLOW,
-       [ 0x03 ] = KEY_BLUE,
-
-       [ 0x76 ] = KEY_LEFT,
-       [ 0x7e ] = KEY_RIGHT,
-       [ 0x13 ] = KEY_DOWN,
-       [ 0x1b ] = KEY_UP,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_avertv_303);
+static struct ir_scancode ir_codes_avertv_303[] = {
+       { 0x2a, KEY_1 },
+       { 0x32, KEY_2 },
+       { 0x3a, KEY_3 },
+       { 0x4a, KEY_4 },
+       { 0x52, KEY_5 },
+       { 0x5a, KEY_6 },
+       { 0x6a, KEY_7 },
+       { 0x72, KEY_8 },
+       { 0x7a, KEY_9 },
+       { 0x0e, KEY_0 },
+
+       { 0x02, KEY_POWER },
+       { 0x22, KEY_VIDEO },
+       { 0x42, KEY_AUDIO },
+       { 0x62, KEY_ZOOM },
+       { 0x0a, KEY_TV },
+       { 0x12, KEY_CD },
+       { 0x1a, KEY_TEXT },
+
+       { 0x16, KEY_SUBTITLE },
+       { 0x1e, KEY_REWIND },
+       { 0x06, KEY_PRINT },
+
+       { 0x2e, KEY_SEARCH },
+       { 0x36, KEY_SLEEP },
+       { 0x3e, KEY_SHUFFLE },
+       { 0x26, KEY_MUTE },
+
+       { 0x4e, KEY_RECORD },
+       { 0x56, KEY_PAUSE },
+       { 0x5e, KEY_STOP },
+       { 0x46, KEY_PLAY },
+
+       { 0x6e, KEY_RED },
+       { 0x0b, KEY_GREEN },
+       { 0x66, KEY_YELLOW },
+       { 0x03, KEY_BLUE },
+
+       { 0x76, KEY_LEFT },
+       { 0x7e, KEY_RIGHT },
+       { 0x13, KEY_DOWN },
+       { 0x1b, KEY_UP },
+};
+
+struct ir_scancode_table ir_codes_avertv_303_table = {
+       .scan = ir_codes_avertv_303,
+       .size = ARRAY_SIZE(ir_codes_avertv_303),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avertv_303_table);
 
 /* ---------------------------------------------------------------------- */
 
 /* DigitalNow DNTV Live! DVB-T Pro Remote */
-IR_KEYTAB_TYPE ir_codes_dntv_live_dvbt_pro[IR_KEYTAB_SIZE] = {
-       [ 0x16 ] = KEY_POWER,
-       [ 0x5b ] = KEY_HOME,
-
-       [ 0x55 ] = KEY_TV,              /* live tv */
-       [ 0x58 ] = KEY_TUNER,           /* digital Radio */
-       [ 0x5a ] = KEY_RADIO,           /* FM radio */
-       [ 0x59 ] = KEY_DVD,             /* dvd menu */
-       [ 0x03 ] = KEY_1,
-       [ 0x01 ] = KEY_2,
-       [ 0x06 ] = KEY_3,
-       [ 0x09 ] = KEY_4,
-       [ 0x1d ] = KEY_5,
-       [ 0x1f ] = KEY_6,
-       [ 0x0d ] = KEY_7,
-       [ 0x19 ] = KEY_8,
-       [ 0x1b ] = KEY_9,
-       [ 0x0c ] = KEY_CANCEL,
-       [ 0x15 ] = KEY_0,
-       [ 0x4a ] = KEY_CLEAR,
-       [ 0x13 ] = KEY_BACK,
-       [ 0x00 ] = KEY_TAB,
-       [ 0x4b ] = KEY_UP,
-       [ 0x4e ] = KEY_LEFT,
-       [ 0x4f ] = KEY_OK,
-       [ 0x52 ] = KEY_RIGHT,
-       [ 0x51 ] = KEY_DOWN,
-       [ 0x1e ] = KEY_VOLUMEUP,
-       [ 0x0a ] = KEY_VOLUMEDOWN,
-       [ 0x02 ] = KEY_CHANNELDOWN,
-       [ 0x05 ] = KEY_CHANNELUP,
-       [ 0x11 ] = KEY_RECORD,
-       [ 0x14 ] = KEY_PLAY,
-       [ 0x4c ] = KEY_PAUSE,
-       [ 0x1a ] = KEY_STOP,
-       [ 0x40 ] = KEY_REWIND,
-       [ 0x12 ] = KEY_FASTFORWARD,
-       [ 0x41 ] = KEY_PREVIOUSSONG,    /* replay |< */
-       [ 0x42 ] = KEY_NEXTSONG,        /* skip >| */
-       [ 0x54 ] = KEY_CAMERA,          /* capture */
-       [ 0x50 ] = KEY_LANGUAGE,        /* sap */
-       [ 0x47 ] = KEY_TV2,             /* pip */
-       [ 0x4d ] = KEY_SCREEN,
-       [ 0x43 ] = KEY_SUBTITLE,
-       [ 0x10 ] = KEY_MUTE,
-       [ 0x49 ] = KEY_AUDIO,           /* l/r */
-       [ 0x07 ] = KEY_SLEEP,
-       [ 0x08 ] = KEY_VIDEO,           /* a/v */
-       [ 0x0e ] = KEY_PREVIOUS,        /* recall */
-       [ 0x45 ] = KEY_ZOOM,            /* zoom + */
-       [ 0x46 ] = KEY_ANGLE,           /* zoom - */
-       [ 0x56 ] = KEY_RED,
-       [ 0x57 ] = KEY_GREEN,
-       [ 0x5c ] = KEY_YELLOW,
-       [ 0x5d ] = KEY_BLUE,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvbt_pro);
-
-IR_KEYTAB_TYPE ir_codes_em_terratec[IR_KEYTAB_SIZE] = {
-       [ 0x01 ] = KEY_CHANNEL,
-       [ 0x02 ] = KEY_SELECT,
-       [ 0x03 ] = KEY_MUTE,
-       [ 0x04 ] = KEY_POWER,
-       [ 0x05 ] = KEY_1,
-       [ 0x06 ] = KEY_2,
-       [ 0x07 ] = KEY_3,
-       [ 0x08 ] = KEY_CHANNELUP,
-       [ 0x09 ] = KEY_4,
-       [ 0x0a ] = KEY_5,
-       [ 0x0b ] = KEY_6,
-       [ 0x0c ] = KEY_CHANNELDOWN,
-       [ 0x0d ] = KEY_7,
-       [ 0x0e ] = KEY_8,
-       [ 0x0f ] = KEY_9,
-       [ 0x10 ] = KEY_VOLUMEUP,
-       [ 0x11 ] = KEY_0,
-       [ 0x12 ] = KEY_MENU,
-       [ 0x13 ] = KEY_PRINT,
-       [ 0x14 ] = KEY_VOLUMEDOWN,
-       [ 0x16 ] = KEY_PAUSE,
-       [ 0x18 ] = KEY_RECORD,
-       [ 0x19 ] = KEY_REWIND,
-       [ 0x1a ] = KEY_PLAY,
-       [ 0x1b ] = KEY_FORWARD,
-       [ 0x1c ] = KEY_BACKSPACE,
-       [ 0x1e ] = KEY_STOP,
-       [ 0x40 ] = KEY_ZOOM,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_em_terratec);
-
-IR_KEYTAB_TYPE ir_codes_pinnacle_grey[IR_KEYTAB_SIZE] = {
-       [ 0x3a ] = KEY_0,
-       [ 0x31 ] = KEY_1,
-       [ 0x32 ] = KEY_2,
-       [ 0x33 ] = KEY_3,
-       [ 0x34 ] = KEY_4,
-       [ 0x35 ] = KEY_5,
-       [ 0x36 ] = KEY_6,
-       [ 0x37 ] = KEY_7,
-       [ 0x38 ] = KEY_8,
-       [ 0x39 ] = KEY_9,
-
-       [ 0x2f ] = KEY_POWER,
-
-       [ 0x2e ] = KEY_P,
-       [ 0x1f ] = KEY_L,
-       [ 0x2b ] = KEY_I,
-
-       [ 0x2d ] = KEY_SCREEN,
-       [ 0x1e ] = KEY_ZOOM,
-       [ 0x1b ] = KEY_VOLUMEUP,
-       [ 0x0f ] = KEY_VOLUMEDOWN,
-       [ 0x17 ] = KEY_CHANNELUP,
-       [ 0x1c ] = KEY_CHANNELDOWN,
-       [ 0x25 ] = KEY_INFO,
-
-       [ 0x3c ] = KEY_MUTE,
-
-       [ 0x3d ] = KEY_LEFT,
-       [ 0x3b ] = KEY_RIGHT,
-
-       [ 0x3f ] = KEY_UP,
-       [ 0x3e ] = KEY_DOWN,
-       [ 0x1a ] = KEY_ENTER,
-
-       [ 0x1d ] = KEY_MENU,
-       [ 0x19 ] = KEY_AGAIN,
-       [ 0x16 ] = KEY_PREVIOUSSONG,
-       [ 0x13 ] = KEY_NEXTSONG,
-       [ 0x15 ] = KEY_PAUSE,
-       [ 0x0e ] = KEY_REWIND,
-       [ 0x0d ] = KEY_PLAY,
-       [ 0x0b ] = KEY_STOP,
-       [ 0x07 ] = KEY_FORWARD,
-       [ 0x27 ] = KEY_RECORD,
-       [ 0x26 ] = KEY_TUNER,
-       [ 0x29 ] = KEY_TEXT,
-       [ 0x2a ] = KEY_MEDIA,
-       [ 0x18 ] = KEY_EPG,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_pinnacle_grey);
-
-IR_KEYTAB_TYPE ir_codes_flyvideo[IR_KEYTAB_SIZE] = {
-       [ 0x0f ] = KEY_0,
-       [ 0x03 ] = KEY_1,
-       [ 0x04 ] = KEY_2,
-       [ 0x05 ] = KEY_3,
-       [ 0x07 ] = KEY_4,
-       [ 0x08 ] = KEY_5,
-       [ 0x09 ] = KEY_6,
-       [ 0x0b ] = KEY_7,
-       [ 0x0c ] = KEY_8,
-       [ 0x0d ] = KEY_9,
-
-       [ 0x0e ] = KEY_MODE,         // Air/Cable
-       [ 0x11 ] = KEY_VIDEO,        // Video
-       [ 0x15 ] = KEY_AUDIO,        // Audio
-       [ 0x00 ] = KEY_POWER,        // Power
-       [ 0x18 ] = KEY_TUNER,        // AV Source
-       [ 0x02 ] = KEY_ZOOM,         // Fullscreen
-       [ 0x1a ] = KEY_LANGUAGE,     // Stereo
-       [ 0x1b ] = KEY_MUTE,         // Mute
-       [ 0x14 ] = KEY_VOLUMEUP,     // Volume +
-       [ 0x17 ] = KEY_VOLUMEDOWN,   // Volume -
-       [ 0x12 ] = KEY_CHANNELUP,    // Channel +
-       [ 0x13 ] = KEY_CHANNELDOWN,  // Channel -
-       [ 0x06 ] = KEY_AGAIN,        // Recall
-       [ 0x10 ] = KEY_ENTER,        // Enter
-
-       [ 0x19 ] = KEY_BACK,         // Rewind  ( <<< )
-       [ 0x1f ] = KEY_FORWARD,      // Forward ( >>> )
-       [ 0x0a ] = KEY_ANGLE,        // (no label, may be used as the PAUSE button)
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_flyvideo);
-
-IR_KEYTAB_TYPE ir_codes_flydvb[IR_KEYTAB_SIZE] = {
-       [ 0x01 ] = KEY_ZOOM,            // Full Screen
-       [ 0x00 ] = KEY_POWER,           // Power
-
-       [ 0x03 ] = KEY_1,
-       [ 0x04 ] = KEY_2,
-       [ 0x05 ] = KEY_3,
-       [ 0x07 ] = KEY_4,
-       [ 0x08 ] = KEY_5,
-       [ 0x09 ] = KEY_6,
-       [ 0x0b ] = KEY_7,
-       [ 0x0c ] = KEY_8,
-       [ 0x0d ] = KEY_9,
-       [ 0x06 ] = KEY_AGAIN,           // Recall
-       [ 0x0f ] = KEY_0,
-       [ 0x10 ] = KEY_MUTE,            // Mute
-       [ 0x02 ] = KEY_RADIO,           // TV/Radio
-       [ 0x1b ] = KEY_LANGUAGE,                // SAP (Second Audio Program)
-
-       [ 0x14 ] = KEY_VOLUMEUP,                // VOL+
-       [ 0x17 ] = KEY_VOLUMEDOWN,      // VOL-
-       [ 0x12 ] = KEY_CHANNELUP,               // CH+
-       [ 0x13 ] = KEY_CHANNELDOWN,     // CH-
-       [ 0x1d ] = KEY_ENTER,           // Enter
-
-       [ 0x1a ] = KEY_MODE,            // PIP
-       [ 0x18 ] = KEY_TUNER,           // Source
-
-       [ 0x1e ] = KEY_RECORD,          // Record/Pause
-       [ 0x15 ] = KEY_ANGLE,           // Swap (no label on key)
-       [ 0x1c ] = KEY_PAUSE,           // Timeshift/Pause
-       [ 0x19 ] = KEY_BACK,            // Rewind <<
-       [ 0x0a ] = KEY_PLAYPAUSE,               // Play/Pause
-       [ 0x1f ] = KEY_FORWARD,         // Forward >>
-       [ 0x16 ] = KEY_PREVIOUS,                // Back |<<
-       [ 0x11 ] = KEY_STOP,            // Stop
-       [ 0x0e ] = KEY_NEXT,            // End >>|
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_flydvb);
-
-IR_KEYTAB_TYPE ir_codes_cinergy[IR_KEYTAB_SIZE] = {
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x0a ] = KEY_POWER,
-       [ 0x0b ] = KEY_PROG1,           // app
-       [ 0x0c ] = KEY_ZOOM,            // zoom/fullscreen
-       [ 0x0d ] = KEY_CHANNELUP,       // channel
-       [ 0x0e ] = KEY_CHANNELDOWN,     // channel-
-       [ 0x0f ] = KEY_VOLUMEUP,
-       [ 0x10 ] = KEY_VOLUMEDOWN,
-       [ 0x11 ] = KEY_TUNER,           // AV
-       [ 0x12 ] = KEY_NUMLOCK,         // -/--
-       [ 0x13 ] = KEY_AUDIO,           // audio
-       [ 0x14 ] = KEY_MUTE,
-       [ 0x15 ] = KEY_UP,
-       [ 0x16 ] = KEY_DOWN,
-       [ 0x17 ] = KEY_LEFT,
-       [ 0x18 ] = KEY_RIGHT,
-       [ 0x19 ] = BTN_LEFT,
-       [ 0x1a ] = BTN_RIGHT,
-       [ 0x1b ] = KEY_WWW,             // text
-       [ 0x1c ] = KEY_REWIND,
-       [ 0x1d ] = KEY_FORWARD,
-       [ 0x1e ] = KEY_RECORD,
-       [ 0x1f ] = KEY_PLAY,
-       [ 0x20 ] = KEY_PREVIOUSSONG,
-       [ 0x21 ] = KEY_NEXTSONG,
-       [ 0x22 ] = KEY_PAUSE,
-       [ 0x23 ] = KEY_STOP,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_cinergy);
+static struct ir_scancode ir_codes_dntv_live_dvbt_pro[] = {
+       { 0x16, KEY_POWER },
+       { 0x5b, KEY_HOME },
+
+       { 0x55, KEY_TV },               /* live tv */
+       { 0x58, KEY_TUNER },            /* digital Radio */
+       { 0x5a, KEY_RADIO },            /* FM radio */
+       { 0x59, KEY_DVD },              /* dvd menu */
+       { 0x03, KEY_1 },
+       { 0x01, KEY_2 },
+       { 0x06, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x1d, KEY_5 },
+       { 0x1f, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x19, KEY_8 },
+       { 0x1b, KEY_9 },
+       { 0x0c, KEY_CANCEL },
+       { 0x15, KEY_0 },
+       { 0x4a, KEY_CLEAR },
+       { 0x13, KEY_BACK },
+       { 0x00, KEY_TAB },
+       { 0x4b, KEY_UP },
+       { 0x4e, KEY_LEFT },
+       { 0x4f, KEY_OK },
+       { 0x52, KEY_RIGHT },
+       { 0x51, KEY_DOWN },
+       { 0x1e, KEY_VOLUMEUP },
+       { 0x0a, KEY_VOLUMEDOWN },
+       { 0x02, KEY_CHANNELDOWN },
+       { 0x05, KEY_CHANNELUP },
+       { 0x11, KEY_RECORD },
+       { 0x14, KEY_PLAY },
+       { 0x4c, KEY_PAUSE },
+       { 0x1a, KEY_STOP },
+       { 0x40, KEY_REWIND },
+       { 0x12, KEY_FASTFORWARD },
+       { 0x41, KEY_PREVIOUSSONG },     /* replay |< */
+       { 0x42, KEY_NEXTSONG },         /* skip >| */
+       { 0x54, KEY_CAMERA },           /* capture */
+       { 0x50, KEY_LANGUAGE },         /* sap */
+       { 0x47, KEY_TV2 },              /* pip */
+       { 0x4d, KEY_SCREEN },
+       { 0x43, KEY_SUBTITLE },
+       { 0x10, KEY_MUTE },
+       { 0x49, KEY_AUDIO },            /* l/r */
+       { 0x07, KEY_SLEEP },
+       { 0x08, KEY_VIDEO },            /* a/v */
+       { 0x0e, KEY_PREVIOUS },         /* recall */
+       { 0x45, KEY_ZOOM },             /* zoom + */
+       { 0x46, KEY_ANGLE },            /* zoom - */
+       { 0x56, KEY_RED },
+       { 0x57, KEY_GREEN },
+       { 0x5c, KEY_YELLOW },
+       { 0x5d, KEY_BLUE },
+};
+
+struct ir_scancode_table ir_codes_dntv_live_dvbt_pro_table = {
+       .scan = ir_codes_dntv_live_dvbt_pro,
+       .size = ARRAY_SIZE(ir_codes_dntv_live_dvbt_pro),
+};
+EXPORT_SYMBOL_GPL(ir_codes_dntv_live_dvbt_pro_table);
+
+static struct ir_scancode ir_codes_em_terratec[] = {
+       { 0x01, KEY_CHANNEL },
+       { 0x02, KEY_SELECT },
+       { 0x03, KEY_MUTE },
+       { 0x04, KEY_POWER },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x08, KEY_CHANNELUP },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0c, KEY_CHANNELDOWN },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_0 },
+       { 0x12, KEY_MENU },
+       { 0x13, KEY_PRINT },
+       { 0x14, KEY_VOLUMEDOWN },
+       { 0x16, KEY_PAUSE },
+       { 0x18, KEY_RECORD },
+       { 0x19, KEY_REWIND },
+       { 0x1a, KEY_PLAY },
+       { 0x1b, KEY_FORWARD },
+       { 0x1c, KEY_BACKSPACE },
+       { 0x1e, KEY_STOP },
+       { 0x40, KEY_ZOOM },
+};
+
+struct ir_scancode_table ir_codes_em_terratec_table = {
+       .scan = ir_codes_em_terratec,
+       .size = ARRAY_SIZE(ir_codes_em_terratec),
+};
+EXPORT_SYMBOL_GPL(ir_codes_em_terratec_table);
+
+static struct ir_scancode ir_codes_pinnacle_grey[] = {
+       { 0x3a, KEY_0 },
+       { 0x31, KEY_1 },
+       { 0x32, KEY_2 },
+       { 0x33, KEY_3 },
+       { 0x34, KEY_4 },
+       { 0x35, KEY_5 },
+       { 0x36, KEY_6 },
+       { 0x37, KEY_7 },
+       { 0x38, KEY_8 },
+       { 0x39, KEY_9 },
+
+       { 0x2f, KEY_POWER },
+
+       { 0x2e, KEY_P },
+       { 0x1f, KEY_L },
+       { 0x2b, KEY_I },
+
+       { 0x2d, KEY_SCREEN },
+       { 0x1e, KEY_ZOOM },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x0f, KEY_VOLUMEDOWN },
+       { 0x17, KEY_CHANNELUP },
+       { 0x1c, KEY_CHANNELDOWN },
+       { 0x25, KEY_INFO },
+
+       { 0x3c, KEY_MUTE },
+
+       { 0x3d, KEY_LEFT },
+       { 0x3b, KEY_RIGHT },
+
+       { 0x3f, KEY_UP },
+       { 0x3e, KEY_DOWN },
+       { 0x1a, KEY_ENTER },
+
+       { 0x1d, KEY_MENU },
+       { 0x19, KEY_AGAIN },
+       { 0x16, KEY_PREVIOUSSONG },
+       { 0x13, KEY_NEXTSONG },
+       { 0x15, KEY_PAUSE },
+       { 0x0e, KEY_REWIND },
+       { 0x0d, KEY_PLAY },
+       { 0x0b, KEY_STOP },
+       { 0x07, KEY_FORWARD },
+       { 0x27, KEY_RECORD },
+       { 0x26, KEY_TUNER },
+       { 0x29, KEY_TEXT },
+       { 0x2a, KEY_MEDIA },
+       { 0x18, KEY_EPG },
+};
+
+struct ir_scancode_table ir_codes_pinnacle_grey_table = {
+       .scan = ir_codes_pinnacle_grey,
+       .size = ARRAY_SIZE(ir_codes_pinnacle_grey),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle_grey_table);
+
+static struct ir_scancode ir_codes_flyvideo[] = {
+       { 0x0f, KEY_0 },
+       { 0x03, KEY_1 },
+       { 0x04, KEY_2 },
+       { 0x05, KEY_3 },
+       { 0x07, KEY_4 },
+       { 0x08, KEY_5 },
+       { 0x09, KEY_6 },
+       { 0x0b, KEY_7 },
+       { 0x0c, KEY_8 },
+       { 0x0d, KEY_9 },
+
+       { 0x0e, KEY_MODE },     /* Air/Cable */
+       { 0x11, KEY_VIDEO },    /* Video */
+       { 0x15, KEY_AUDIO },    /* Audio */
+       { 0x00, KEY_POWER },    /* Power */
+       { 0x18, KEY_TUNER },    /* AV Source */
+       { 0x02, KEY_ZOOM },     /* Fullscreen */
+       { 0x1a, KEY_LANGUAGE }, /* Stereo */
+       { 0x1b, KEY_MUTE },     /* Mute */
+       { 0x14, KEY_VOLUMEUP }, /* Volume + */
+       { 0x17, KEY_VOLUMEDOWN },/* Volume - */
+       { 0x12, KEY_CHANNELUP },/* Channel + */
+       { 0x13, KEY_CHANNELDOWN },/* Channel - */
+       { 0x06, KEY_AGAIN },    /* Recall */
+       { 0x10, KEY_ENTER },    /* Enter */
+
+       { 0x19, KEY_BACK },     /* Rewind  ( <<< ) */
+       { 0x1f, KEY_FORWARD },  /* Forward ( >>> ) */
+       { 0x0a, KEY_ANGLE },    /* no label, may be used as the PAUSE button */
+};
+
+struct ir_scancode_table ir_codes_flyvideo_table = {
+       .scan = ir_codes_flyvideo,
+       .size = ARRAY_SIZE(ir_codes_flyvideo),
+};
+EXPORT_SYMBOL_GPL(ir_codes_flyvideo_table);
+
+static struct ir_scancode ir_codes_flydvb[] = {
+       { 0x01, KEY_ZOOM },             /* Full Screen */
+       { 0x00, KEY_POWER },            /* Power */
+
+       { 0x03, KEY_1 },
+       { 0x04, KEY_2 },
+       { 0x05, KEY_3 },
+       { 0x07, KEY_4 },
+       { 0x08, KEY_5 },
+       { 0x09, KEY_6 },
+       { 0x0b, KEY_7 },
+       { 0x0c, KEY_8 },
+       { 0x0d, KEY_9 },
+       { 0x06, KEY_AGAIN },            /* Recall */
+       { 0x0f, KEY_0 },
+       { 0x10, KEY_MUTE },             /* Mute */
+       { 0x02, KEY_RADIO },            /* TV/Radio */
+       { 0x1b, KEY_LANGUAGE },         /* SAP (Second Audio Program) */
+
+       { 0x14, KEY_VOLUMEUP },         /* VOL+ */
+       { 0x17, KEY_VOLUMEDOWN },       /* VOL- */
+       { 0x12, KEY_CHANNELUP },        /* CH+ */
+       { 0x13, KEY_CHANNELDOWN },      /* CH- */
+       { 0x1d, KEY_ENTER },            /* Enter */
+
+       { 0x1a, KEY_MODE },             /* PIP */
+       { 0x18, KEY_TUNER },            /* Source */
+
+       { 0x1e, KEY_RECORD },           /* Record/Pause */
+       { 0x15, KEY_ANGLE },            /* Swap (no label on key) */
+       { 0x1c, KEY_PAUSE },            /* Timeshift/Pause */
+       { 0x19, KEY_BACK },             /* Rewind << */
+       { 0x0a, KEY_PLAYPAUSE },        /* Play/Pause */
+       { 0x1f, KEY_FORWARD },          /* Forward >> */
+       { 0x16, KEY_PREVIOUS },         /* Back |<< */
+       { 0x11, KEY_STOP },             /* Stop */
+       { 0x0e, KEY_NEXT },             /* End >>| */
+};
+
+struct ir_scancode_table ir_codes_flydvb_table = {
+       .scan = ir_codes_flydvb,
+       .size = ARRAY_SIZE(ir_codes_flydvb),
+};
+EXPORT_SYMBOL_GPL(ir_codes_flydvb_table);
+
+static struct ir_scancode ir_codes_cinergy[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0a, KEY_POWER },
+       { 0x0b, KEY_PROG1 },            /* app */
+       { 0x0c, KEY_ZOOM },             /* zoom/fullscreen */
+       { 0x0d, KEY_CHANNELUP },        /* channel */
+       { 0x0e, KEY_CHANNELDOWN },      /* channel- */
+       { 0x0f, KEY_VOLUMEUP },
+       { 0x10, KEY_VOLUMEDOWN },
+       { 0x11, KEY_TUNER },            /* AV */
+       { 0x12, KEY_NUMLOCK },          /* -/-- */
+       { 0x13, KEY_AUDIO },            /* audio */
+       { 0x14, KEY_MUTE },
+       { 0x15, KEY_UP },
+       { 0x16, KEY_DOWN },
+       { 0x17, KEY_LEFT },
+       { 0x18, KEY_RIGHT },
+       { 0x19, BTN_LEFT, },
+       { 0x1a, BTN_RIGHT, },
+       { 0x1b, KEY_WWW },              /* text */
+       { 0x1c, KEY_REWIND },
+       { 0x1d, KEY_FORWARD },
+       { 0x1e, KEY_RECORD },
+       { 0x1f, KEY_PLAY },
+       { 0x20, KEY_PREVIOUSSONG },
+       { 0x21, KEY_NEXTSONG },
+       { 0x22, KEY_PAUSE },
+       { 0x23, KEY_STOP },
+};
+
+struct ir_scancode_table ir_codes_cinergy_table = {
+       .scan = ir_codes_cinergy,
+       .size = ARRAY_SIZE(ir_codes_cinergy),
+};
+EXPORT_SYMBOL_GPL(ir_codes_cinergy_table);
 
 /* Alfons Geser <a.geser@cox.net>
  * updates from Job D. R. Borges <jobdrb@ig.com.br> */
-IR_KEYTAB_TYPE ir_codes_eztv[IR_KEYTAB_SIZE] = {
-       [ 0x12 ] = KEY_POWER,
-       [ 0x01 ] = KEY_TV,             // DVR
-       [ 0x15 ] = KEY_DVD,            // DVD
-       [ 0x17 ] = KEY_AUDIO,          // music
-                                    // DVR mode / DVD mode / music mode
-
-       [ 0x1b ] = KEY_MUTE,           // mute
-       [ 0x02 ] = KEY_LANGUAGE,       // MTS/SAP / audio / autoseek
-       [ 0x1e ] = KEY_SUBTITLE,       // closed captioning / subtitle / seek
-       [ 0x16 ] = KEY_ZOOM,           // full screen
-       [ 0x1c ] = KEY_VIDEO,          // video source / eject / delall
-       [ 0x1d ] = KEY_RESTART,        // playback / angle / del
-       [ 0x2f ] = KEY_SEARCH,         // scan / menu / playlist
-       [ 0x30 ] = KEY_CHANNEL,        // CH surfing / bookmark / memo
-
-       [ 0x31 ] = KEY_HELP,           // help
-       [ 0x32 ] = KEY_MODE,           // num/memo
-       [ 0x33 ] = KEY_ESC,            // cancel
-
-       [ 0x0c ] = KEY_UP,             // up
-       [ 0x10 ] = KEY_DOWN,           // down
-       [ 0x08 ] = KEY_LEFT,           // left
-       [ 0x04 ] = KEY_RIGHT,          // right
-       [ 0x03 ] = KEY_SELECT,         // select
-
-       [ 0x1f ] = KEY_REWIND,         // rewind
-       [ 0x20 ] = KEY_PLAYPAUSE,      // play/pause
-       [ 0x29 ] = KEY_FORWARD,        // forward
-       [ 0x14 ] = KEY_AGAIN,          // repeat
-       [ 0x2b ] = KEY_RECORD,         // recording
-       [ 0x2c ] = KEY_STOP,           // stop
-       [ 0x2d ] = KEY_PLAY,           // play
-       [ 0x2e ] = KEY_SHUFFLE,        // snapshot / shuffle
-
-       [ 0x00 ] = KEY_0,
-       [ 0x05 ] = KEY_1,
-       [ 0x06 ] = KEY_2,
-       [ 0x07 ] = KEY_3,
-       [ 0x09 ] = KEY_4,
-       [ 0x0a ] = KEY_5,
-       [ 0x0b ] = KEY_6,
-       [ 0x0d ] = KEY_7,
-       [ 0x0e ] = KEY_8,
-       [ 0x0f ] = KEY_9,
-
-       [ 0x2a ] = KEY_VOLUMEUP,
-       [ 0x11 ] = KEY_VOLUMEDOWN,
-       [ 0x18 ] = KEY_CHANNELUP,      // CH.tracking up
-       [ 0x19 ] = KEY_CHANNELDOWN,    // CH.tracking down
-
-       [ 0x13 ] = KEY_ENTER,        // enter
-       [ 0x21 ] = KEY_DOT,          // . (decimal dot)
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_eztv);
+static struct ir_scancode ir_codes_eztv[] = {
+       { 0x12, KEY_POWER },
+       { 0x01, KEY_TV },       /* DVR */
+       { 0x15, KEY_DVD },      /* DVD */
+       { 0x17, KEY_AUDIO },    /* music */
+                               /* DVR mode / DVD mode / music mode */
+
+       { 0x1b, KEY_MUTE },     /* mute */
+       { 0x02, KEY_LANGUAGE }, /* MTS/SAP / audio / autoseek */
+       { 0x1e, KEY_SUBTITLE }, /* closed captioning / subtitle / seek */
+       { 0x16, KEY_ZOOM },     /* full screen */
+       { 0x1c, KEY_VIDEO },    /* video source / eject / delall */
+       { 0x1d, KEY_RESTART },  /* playback / angle / del */
+       { 0x2f, KEY_SEARCH },   /* scan / menu / playlist */
+       { 0x30, KEY_CHANNEL },  /* CH surfing / bookmark / memo */
+
+       { 0x31, KEY_HELP },     /* help */
+       { 0x32, KEY_MODE },     /* num/memo */
+       { 0x33, KEY_ESC },      /* cancel */
+
+       { 0x0c, KEY_UP },       /* up */
+       { 0x10, KEY_DOWN },     /* down */
+       { 0x08, KEY_LEFT },     /* left */
+       { 0x04, KEY_RIGHT },    /* right */
+       { 0x03, KEY_SELECT },   /* select */
+
+       { 0x1f, KEY_REWIND },   /* rewind */
+       { 0x20, KEY_PLAYPAUSE },/* play/pause */
+       { 0x29, KEY_FORWARD },  /* forward */
+       { 0x14, KEY_AGAIN },    /* repeat */
+       { 0x2b, KEY_RECORD },   /* recording */
+       { 0x2c, KEY_STOP },     /* stop */
+       { 0x2d, KEY_PLAY },     /* play */
+       { 0x2e, KEY_CAMERA },   /* snapshot / shuffle */
+
+       { 0x00, KEY_0 },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+
+       { 0x2a, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x18, KEY_CHANNELUP },/* CH.tracking up */
+       { 0x19, KEY_CHANNELDOWN },/* CH.tracking down */
+
+       { 0x13, KEY_ENTER },    /* enter */
+       { 0x21, KEY_DOT },      /* . (decimal dot) */
+};
+
+struct ir_scancode_table ir_codes_eztv_table = {
+       .scan = ir_codes_eztv,
+       .size = ARRAY_SIZE(ir_codes_eztv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_eztv_table);
 
 /* Alex Hermann <gaaf@gmx.net> */
-IR_KEYTAB_TYPE ir_codes_avermedia[IR_KEYTAB_SIZE] = {
-       [ 0x28 ] = KEY_1,
-       [ 0x18 ] = KEY_2,
-       [ 0x38 ] = KEY_3,
-       [ 0x24 ] = KEY_4,
-       [ 0x14 ] = KEY_5,
-       [ 0x34 ] = KEY_6,
-       [ 0x2c ] = KEY_7,
-       [ 0x1c ] = KEY_8,
-       [ 0x3c ] = KEY_9,
-       [ 0x22 ] = KEY_0,
-
-       [ 0x20 ] = KEY_TV,              /* TV/FM */
-       [ 0x10 ] = KEY_CD,              /* CD */
-       [ 0x30 ] = KEY_TEXT,            /* TELETEXT */
-       [ 0x00 ] = KEY_POWER,           /* POWER */
-
-       [ 0x08 ] = KEY_VIDEO,           /* VIDEO */
-       [ 0x04 ] = KEY_AUDIO,           /* AUDIO */
-       [ 0x0c ] = KEY_ZOOM,            /* FULL SCREEN */
-
-       [ 0x12 ] = KEY_SUBTITLE,        /* DISPLAY */
-       [ 0x32 ] = KEY_REWIND,          /* LOOP */
-       [ 0x02 ] = KEY_PRINT,           /* PREVIEW */
-
-       [ 0x2a ] = KEY_SEARCH,          /* AUTOSCAN */
-       [ 0x1a ] = KEY_SLEEP,           /* FREEZE */
-       [ 0x3a ] = KEY_SHUFFLE,         /* SNAPSHOT */
-       [ 0x0a ] = KEY_MUTE,            /* MUTE */
-
-       [ 0x26 ] = KEY_RECORD,          /* RECORD */
-       [ 0x16 ] = KEY_PAUSE,           /* PAUSE */
-       [ 0x36 ] = KEY_STOP,            /* STOP */
-       [ 0x06 ] = KEY_PLAY,            /* PLAY */
-
-       [ 0x2e ] = KEY_RED,             /* RED */
-       [ 0x21 ] = KEY_GREEN,           /* GREEN */
-       [ 0x0e ] = KEY_YELLOW,          /* YELLOW */
-       [ 0x01 ] = KEY_BLUE,            /* BLUE */
-
-       [ 0x1e ] = KEY_VOLUMEDOWN,      /* VOLUME- */
-       [ 0x3e ] = KEY_VOLUMEUP,        /* VOLUME+ */
-       [ 0x11 ] = KEY_CHANNELDOWN,     /* CHANNEL/PAGE- */
-       [ 0x31 ] = KEY_CHANNELUP        /* CHANNEL/PAGE+ */
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_avermedia);
-
-IR_KEYTAB_TYPE ir_codes_videomate_tv_pvr[IR_KEYTAB_SIZE] = {
-       [ 0x14 ] = KEY_MUTE,
-       [ 0x24 ] = KEY_ZOOM,
-
-       [ 0x01 ] = KEY_DVD,
-       [ 0x23 ] = KEY_RADIO,
-       [ 0x00 ] = KEY_TV,
-
-       [ 0x0a ] = KEY_REWIND,
-       [ 0x08 ] = KEY_PLAYPAUSE,
-       [ 0x0f ] = KEY_FORWARD,
-
-       [ 0x02 ] = KEY_PREVIOUS,
-       [ 0x07 ] = KEY_STOP,
-       [ 0x06 ] = KEY_NEXT,
-
-       [ 0x0c ] = KEY_UP,
-       [ 0x0e ] = KEY_DOWN,
-       [ 0x0b ] = KEY_LEFT,
-       [ 0x0d ] = KEY_RIGHT,
-       [ 0x11 ] = KEY_OK,
-
-       [ 0x03 ] = KEY_MENU,
-       [ 0x09 ] = KEY_SETUP,
-       [ 0x05 ] = KEY_VIDEO,
-       [ 0x22 ] = KEY_CHANNEL,
-
-       [ 0x12 ] = KEY_VOLUMEUP,
-       [ 0x15 ] = KEY_VOLUMEDOWN,
-       [ 0x10 ] = KEY_CHANNELUP,
-       [ 0x13 ] = KEY_CHANNELDOWN,
-
-       [ 0x04 ] = KEY_RECORD,
-
-       [ 0x16 ] = KEY_1,
-       [ 0x17 ] = KEY_2,
-       [ 0x18 ] = KEY_3,
-       [ 0x19 ] = KEY_4,
-       [ 0x1a ] = KEY_5,
-       [ 0x1b ] = KEY_6,
-       [ 0x1c ] = KEY_7,
-       [ 0x1d ] = KEY_8,
-       [ 0x1e ] = KEY_9,
-       [ 0x1f ] = KEY_0,
-
-       [ 0x20 ] = KEY_LANGUAGE,
-       [ 0x21 ] = KEY_SLEEP,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_videomate_tv_pvr);
+static struct ir_scancode ir_codes_avermedia[] = {
+       { 0x28, KEY_1 },
+       { 0x18, KEY_2 },
+       { 0x38, KEY_3 },
+       { 0x24, KEY_4 },
+       { 0x14, KEY_5 },
+       { 0x34, KEY_6 },
+       { 0x2c, KEY_7 },
+       { 0x1c, KEY_8 },
+       { 0x3c, KEY_9 },
+       { 0x22, KEY_0 },
+
+       { 0x20, KEY_TV },               /* TV/FM */
+       { 0x10, KEY_CD },               /* CD */
+       { 0x30, KEY_TEXT },             /* TELETEXT */
+       { 0x00, KEY_POWER },            /* POWER */
+
+       { 0x08, KEY_VIDEO },            /* VIDEO */
+       { 0x04, KEY_AUDIO },            /* AUDIO */
+       { 0x0c, KEY_ZOOM },             /* FULL SCREEN */
+
+       { 0x12, KEY_SUBTITLE },         /* DISPLAY */
+       { 0x32, KEY_REWIND },           /* LOOP */
+       { 0x02, KEY_PRINT },            /* PREVIEW */
+
+       { 0x2a, KEY_SEARCH },           /* AUTOSCAN */
+       { 0x1a, KEY_SLEEP },            /* FREEZE */
+       { 0x3a, KEY_CAMERA },           /* SNAPSHOT */
+       { 0x0a, KEY_MUTE },             /* MUTE */
+
+       { 0x26, KEY_RECORD },           /* RECORD */
+       { 0x16, KEY_PAUSE },            /* PAUSE */
+       { 0x36, KEY_STOP },             /* STOP */
+       { 0x06, KEY_PLAY },             /* PLAY */
+
+       { 0x2e, KEY_RED },              /* RED */
+       { 0x21, KEY_GREEN },            /* GREEN */
+       { 0x0e, KEY_YELLOW },           /* YELLOW */
+       { 0x01, KEY_BLUE },             /* BLUE */
+
+       { 0x1e, KEY_VOLUMEDOWN },       /* VOLUME- */
+       { 0x3e, KEY_VOLUMEUP },         /* VOLUME+ */
+       { 0x11, KEY_CHANNELDOWN },      /* CHANNEL/PAGE- */
+       { 0x31, KEY_CHANNELUP }         /* CHANNEL/PAGE+ */
+};
+
+struct ir_scancode_table ir_codes_avermedia_table = {
+       .scan = ir_codes_avermedia,
+       .size = ARRAY_SIZE(ir_codes_avermedia),
+};
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_table);
+
+static struct ir_scancode ir_codes_videomate_tv_pvr[] = {
+       { 0x14, KEY_MUTE },
+       { 0x24, KEY_ZOOM },
+
+       { 0x01, KEY_DVD },
+       { 0x23, KEY_RADIO },
+       { 0x00, KEY_TV },
+
+       { 0x0a, KEY_REWIND },
+       { 0x08, KEY_PLAYPAUSE },
+       { 0x0f, KEY_FORWARD },
+
+       { 0x02, KEY_PREVIOUS },
+       { 0x07, KEY_STOP },
+       { 0x06, KEY_NEXT },
+
+       { 0x0c, KEY_UP },
+       { 0x0e, KEY_DOWN },
+       { 0x0b, KEY_LEFT },
+       { 0x0d, KEY_RIGHT },
+       { 0x11, KEY_OK },
+
+       { 0x03, KEY_MENU },
+       { 0x09, KEY_SETUP },
+       { 0x05, KEY_VIDEO },
+       { 0x22, KEY_CHANNEL },
+
+       { 0x12, KEY_VOLUMEUP },
+       { 0x15, KEY_VOLUMEDOWN },
+       { 0x10, KEY_CHANNELUP },
+       { 0x13, KEY_CHANNELDOWN },
+
+       { 0x04, KEY_RECORD },
+
+       { 0x16, KEY_1 },
+       { 0x17, KEY_2 },
+       { 0x18, KEY_3 },
+       { 0x19, KEY_4 },
+       { 0x1a, KEY_5 },
+       { 0x1b, KEY_6 },
+       { 0x1c, KEY_7 },
+       { 0x1d, KEY_8 },
+       { 0x1e, KEY_9 },
+       { 0x1f, KEY_0 },
+
+       { 0x20, KEY_LANGUAGE },
+       { 0x21, KEY_SLEEP },
+};
+
+struct ir_scancode_table ir_codes_videomate_tv_pvr_table = {
+       .scan = ir_codes_videomate_tv_pvr,
+       .size = ARRAY_SIZE(ir_codes_videomate_tv_pvr),
+};
+EXPORT_SYMBOL_GPL(ir_codes_videomate_tv_pvr_table);
 
 /* Michael Tokarev <mjt@tls.msk.ru>
    http://www.corpit.ru/mjt/beholdTV/remote_control.jpg
-   keytable is used by MANLI MTV00[ 0x0c ] and BeholdTV 40[13] at
+   keytable is used by MANLI MTV00[0x0c] and BeholdTV 40[13] at
    least, and probably other cards too.
    The "ascii-art picture" below (in comments, first row
    is the keycode in hex, and subsequent row(s) shows
    the button labels (several variants when appropriate)
    helps to descide which keycodes to assign to the buttons.
  */
-IR_KEYTAB_TYPE ir_codes_manli[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_manli[] = {
 
        /*  0x1c            0x12  *
         * FUNCTION         POWER *
         *   FM              (|)  *
         *                        */
-       [ 0x1c ] = KEY_RADIO,   /*XXX*/
-       [ 0x12 ] = KEY_POWER,
+       { 0x1c, KEY_RADIO },    /*XXX*/
+       { 0x12, KEY_POWER },
 
        /*  0x01    0x02    0x03  *
         *   1       2       3    *
@@ -1248,29 +1339,29 @@ IR_KEYTAB_TYPE ir_codes_manli[IR_KEYTAB_SIZE] = {
         *  0x07    0x08    0x09  *
         *   7       8       9    *
         *                        */
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
 
        /*  0x0a    0x00    0x17  *
         * RECALL    0      +100  *
         *                  PLUS  *
         *                        */
-       [ 0x0a ] = KEY_AGAIN,   /*XXX KEY_REWIND? */
-       [ 0x00 ] = KEY_0,
-       [ 0x17 ] = KEY_DIGITS,  /*XXX*/
+       { 0x0a, KEY_AGAIN },    /*XXX KEY_REWIND? */
+       { 0x00, KEY_0 },
+       { 0x17, KEY_DIGITS },   /*XXX*/
 
        /*  0x14            0x10  *
         *  MENU            INFO  *
         *  OSD                   */
-       [ 0x14 ] = KEY_MENU,
-       [ 0x10 ] = KEY_INFO,
+       { 0x14, KEY_MENU },
+       { 0x10, KEY_INFO },
 
        /*          0x0b          *
         *           Up           *
@@ -1281,18 +1372,18 @@ IR_KEYTAB_TYPE ir_codes_manli[IR_KEYTAB_SIZE] = {
         *         0x015          *
         *         Down           *
         *                        */
-       [ 0x0b ] = KEY_UP,      /*XXX KEY_SCROLLUP? */
-       [ 0x18 ] = KEY_LEFT,    /*XXX KEY_BACK? */
-       [ 0x16 ] = KEY_OK,      /*XXX KEY_SELECT? KEY_ENTER? */
-       [ 0x0c ] = KEY_RIGHT,   /*XXX KEY_FORWARD? */
-       [ 0x15 ] = KEY_DOWN,    /*XXX KEY_SCROLLDOWN? */
+       { 0x0b, KEY_UP },
+       { 0x18, KEY_LEFT },
+       { 0x16, KEY_OK },       /*XXX KEY_SELECT? KEY_ENTER? */
+       { 0x0c, KEY_RIGHT },
+       { 0x15, KEY_DOWN },
 
        /*  0x11            0x0d  *
         *  TV/AV           MODE  *
         *  SOURCE         STEREO *
         *                        */
-       [ 0x11 ] = KEY_TV,      /*XXX*/
-       [ 0x0d ] = KEY_MODE,    /*XXX there's no KEY_STEREO */
+       { 0x11, KEY_TV },       /*XXX*/
+       { 0x0d, KEY_MODE },     /*XXX there's no KEY_STEREO     */
 
        /*  0x0f    0x1b    0x1a  *
         *  AUDIO   Vol+    Chan+ *
@@ -1301,891 +1392,967 @@ IR_KEYTAB_TYPE ir_codes_manli[IR_KEYTAB_SIZE] = {
         *  0x0e    0x1f    0x1e  *
         *  SLEEP   Vol-    Chan- *
         *                        */
-       [ 0x0f ] = KEY_AUDIO,
-       [ 0x1b ] = KEY_VOLUMEUP,
-       [ 0x1a ] = KEY_CHANNELUP,
-       [ 0x0e ] = KEY_SLEEP,   /*XXX maybe KEY_PAUSE */
-       [ 0x1f ] = KEY_VOLUMEDOWN,
-       [ 0x1e ] = KEY_CHANNELDOWN,
+       { 0x0f, KEY_AUDIO },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1a, KEY_CHANNELUP },
+       { 0x0e, KEY_TIME },
+       { 0x1f, KEY_VOLUMEDOWN },
+       { 0x1e, KEY_CHANNELDOWN },
 
        /*         0x13     0x19  *
         *         MUTE   SNAPSHOT*
         *                        */
-       [ 0x13 ] = KEY_MUTE,
-       [ 0x19 ] = KEY_RECORD,  /*XXX*/
+       { 0x13, KEY_MUTE },
+       { 0x19, KEY_CAMERA },
 
-       // 0x1d unused ?
+       /* 0x1d unused ? */
 };
 
-EXPORT_SYMBOL_GPL(ir_codes_manli);
+struct ir_scancode_table ir_codes_manli_table = {
+       .scan = ir_codes_manli,
+       .size = ARRAY_SIZE(ir_codes_manli),
+};
+EXPORT_SYMBOL_GPL(ir_codes_manli_table);
 
 /* Mike Baikov <mike@baikov.com> */
-IR_KEYTAB_TYPE ir_codes_gotview7135[IR_KEYTAB_SIZE] = {
-
-       [ 0x11 ] = KEY_POWER,
-       [ 0x35 ] = KEY_TV,
-       [ 0x1b ] = KEY_0,
-       [ 0x29 ] = KEY_1,
-       [ 0x19 ] = KEY_2,
-       [ 0x39 ] = KEY_3,
-       [ 0x1f ] = KEY_4,
-       [ 0x2c ] = KEY_5,
-       [ 0x21 ] = KEY_6,
-       [ 0x24 ] = KEY_7,
-       [ 0x18 ] = KEY_8,
-       [ 0x2b ] = KEY_9,
-       [ 0x3b ] = KEY_AGAIN, /* LOOP */
-       [ 0x06 ] = KEY_AUDIO,
-       [ 0x31 ] = KEY_PRINT, /* PREVIEW */
-       [ 0x3e ] = KEY_VIDEO,
-       [ 0x10 ] = KEY_CHANNELUP,
-       [ 0x20 ] = KEY_CHANNELDOWN,
-       [ 0x0c ] = KEY_VOLUMEDOWN,
-       [ 0x28 ] = KEY_VOLUMEUP,
-       [ 0x08 ] = KEY_MUTE,
-       [ 0x26 ] = KEY_SEARCH, /*SCAN*/
-       [ 0x3f ] = KEY_SHUFFLE, /* SNAPSHOT */
-       [ 0x12 ] = KEY_RECORD,
-       [ 0x32 ] = KEY_STOP,
-       [ 0x3c ] = KEY_PLAY,
-       [ 0x1d ] = KEY_REWIND,
-       [ 0x2d ] = KEY_PAUSE,
-       [ 0x0d ] = KEY_FORWARD,
-       [ 0x05 ] = KEY_ZOOM,  /*FULL*/
-
-       [ 0x2a ] = KEY_F21, /* LIVE TIMESHIFT */
-       [ 0x0e ] = KEY_F22, /* MIN TIMESHIFT */
-       [ 0x1e ] = KEY_F23, /* TIMESHIFT */
-       [ 0x38 ] = KEY_F24, /* NORMAL TIMESHIFT */
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_gotview7135);
-
-IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
-       [ 0x03 ] = KEY_POWER,
-       [ 0x6f ] = KEY_MUTE,
-       [ 0x10 ] = KEY_BACKSPACE,       /* Recall */
-
-       [ 0x11 ] = KEY_0,
-       [ 0x04 ] = KEY_1,
-       [ 0x05 ] = KEY_2,
-       [ 0x06 ] = KEY_3,
-       [ 0x08 ] = KEY_4,
-       [ 0x09 ] = KEY_5,
-       [ 0x0a ] = KEY_6,
-       [ 0x0c ] = KEY_7,
-       [ 0x0d ] = KEY_8,
-       [ 0x0e ] = KEY_9,
-       [ 0x12 ] = KEY_DOT,           /* 100+ */
-
-       [ 0x07 ] = KEY_VOLUMEUP,
-       [ 0x0b ] = KEY_VOLUMEDOWN,
-       [ 0x1a ] = KEY_KPPLUS,
-       [ 0x18 ] = KEY_KPMINUS,
-       [ 0x15 ] = KEY_UP,
-       [ 0x1d ] = KEY_DOWN,
-       [ 0x0f ] = KEY_CHANNELUP,
-       [ 0x13 ] = KEY_CHANNELDOWN,
-       [ 0x48 ] = KEY_ZOOM,
-
-       [ 0x1b ] = KEY_VIDEO,           /* Video source */
-       [ 0x49 ] = KEY_LANGUAGE,        /* MTS Select */
-       [ 0x19 ] = KEY_SEARCH,          /* Auto Scan */
-
-       [ 0x4b ] = KEY_RECORD,
-       [ 0x46 ] = KEY_PLAY,
-       [ 0x45 ] = KEY_PAUSE,           /* Pause */
-       [ 0x44 ] = KEY_STOP,
-       [ 0x40 ] = KEY_FORWARD,         /* Forward ? */
-       [ 0x42 ] = KEY_REWIND,          /* Backward ? */
-
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_purpletv);
+static struct ir_scancode ir_codes_gotview7135[] = {
+
+       { 0x11, KEY_POWER },
+       { 0x35, KEY_TV },
+       { 0x1b, KEY_0 },
+       { 0x29, KEY_1 },
+       { 0x19, KEY_2 },
+       { 0x39, KEY_3 },
+       { 0x1f, KEY_4 },
+       { 0x2c, KEY_5 },
+       { 0x21, KEY_6 },
+       { 0x24, KEY_7 },
+       { 0x18, KEY_8 },
+       { 0x2b, KEY_9 },
+       { 0x3b, KEY_AGAIN },    /* LOOP */
+       { 0x06, KEY_AUDIO },
+       { 0x31, KEY_PRINT },    /* PREVIEW */
+       { 0x3e, KEY_VIDEO },
+       { 0x10, KEY_CHANNELUP },
+       { 0x20, KEY_CHANNELDOWN },
+       { 0x0c, KEY_VOLUMEDOWN },
+       { 0x28, KEY_VOLUMEUP },
+       { 0x08, KEY_MUTE },
+       { 0x26, KEY_SEARCH },   /* SCAN */
+       { 0x3f, KEY_CAMERA },   /* SNAPSHOT */
+       { 0x12, KEY_RECORD },
+       { 0x32, KEY_STOP },
+       { 0x3c, KEY_PLAY },
+       { 0x1d, KEY_REWIND },
+       { 0x2d, KEY_PAUSE },
+       { 0x0d, KEY_FORWARD },
+       { 0x05, KEY_ZOOM },     /*FULL*/
+
+       { 0x2a, KEY_F21 },      /* LIVE TIMESHIFT */
+       { 0x0e, KEY_F22 },      /* MIN TIMESHIFT */
+       { 0x1e, KEY_TIME },     /* TIMESHIFT */
+       { 0x38, KEY_F24 },      /* NORMAL TIMESHIFT */
+};
+
+struct ir_scancode_table ir_codes_gotview7135_table = {
+       .scan = ir_codes_gotview7135,
+       .size = ARRAY_SIZE(ir_codes_gotview7135),
+};
+EXPORT_SYMBOL_GPL(ir_codes_gotview7135_table);
+
+static struct ir_scancode ir_codes_purpletv[] = {
+       { 0x03, KEY_POWER },
+       { 0x6f, KEY_MUTE },
+       { 0x10, KEY_BACKSPACE },        /* Recall */
+
+       { 0x11, KEY_0 },
+       { 0x04, KEY_1 },
+       { 0x05, KEY_2 },
+       { 0x06, KEY_3 },
+       { 0x08, KEY_4 },
+       { 0x09, KEY_5 },
+       { 0x0a, KEY_6 },
+       { 0x0c, KEY_7 },
+       { 0x0d, KEY_8 },
+       { 0x0e, KEY_9 },
+       { 0x12, KEY_DOT },      /* 100+ */
+
+       { 0x07, KEY_VOLUMEUP },
+       { 0x0b, KEY_VOLUMEDOWN },
+       { 0x1a, KEY_KPPLUS },
+       { 0x18, KEY_KPMINUS },
+       { 0x15, KEY_UP },
+       { 0x1d, KEY_DOWN },
+       { 0x0f, KEY_CHANNELUP },
+       { 0x13, KEY_CHANNELDOWN },
+       { 0x48, KEY_ZOOM },
+
+       { 0x1b, KEY_VIDEO },    /* Video source */
+       { 0x1f, KEY_CAMERA },   /* Snapshot */
+       { 0x49, KEY_LANGUAGE }, /* MTS Select */
+       { 0x19, KEY_SEARCH },   /* Auto Scan */
+
+       { 0x4b, KEY_RECORD },
+       { 0x46, KEY_PLAY },
+       { 0x45, KEY_PAUSE },    /* Pause */
+       { 0x44, KEY_STOP },
+       { 0x43, KEY_TIME },     /* Time Shift */
+       { 0x17, KEY_CHANNEL },  /* SURF CH */
+       { 0x40, KEY_FORWARD },  /* Forward ? */
+       { 0x42, KEY_REWIND },   /* Backward ? */
+
+};
+
+struct ir_scancode_table ir_codes_purpletv_table = {
+       .scan = ir_codes_purpletv,
+       .size = ARRAY_SIZE(ir_codes_purpletv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_purpletv_table);
 
 /* Mapping for the 28 key remote control as seen at
    http://www.sednacomputer.com/photo/cardbus-tv.jpg
    Pavel Mihaylov <bin@bash.info>
    Also for the remote bundled with Kozumi KTV-01C card */
-IR_KEYTAB_TYPE ir_codes_pctv_sedna[IR_KEYTAB_SIZE] = {
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x0a ] = KEY_AGAIN,          /* Recall */
-       [ 0x0b ] = KEY_CHANNELUP,
-       [ 0x0c ] = KEY_VOLUMEUP,
-       [ 0x0d ] = KEY_MODE,           /* Stereo */
-       [ 0x0e ] = KEY_STOP,
-       [ 0x0f ] = KEY_PREVIOUSSONG,
-       [ 0x10 ] = KEY_ZOOM,
-       [ 0x11 ] = KEY_TUNER,          /* Source */
-       [ 0x12 ] = KEY_POWER,
-       [ 0x13 ] = KEY_MUTE,
-       [ 0x15 ] = KEY_CHANNELDOWN,
-       [ 0x18 ] = KEY_VOLUMEDOWN,
-       [ 0x19 ] = KEY_SHUFFLE,        /* Snapshot */
-       [ 0x1a ] = KEY_NEXTSONG,
-       [ 0x1b ] = KEY_TEXT,           /* Time Shift */
-       [ 0x1c ] = KEY_RADIO,          /* FM Radio */
-       [ 0x1d ] = KEY_RECORD,
-       [ 0x1e ] = KEY_PAUSE,
+static struct ir_scancode ir_codes_pctv_sedna[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0a, KEY_AGAIN },    /* Recall */
+       { 0x0b, KEY_CHANNELUP },
+       { 0x0c, KEY_VOLUMEUP },
+       { 0x0d, KEY_MODE },     /* Stereo */
+       { 0x0e, KEY_STOP },
+       { 0x0f, KEY_PREVIOUSSONG },
+       { 0x10, KEY_ZOOM },
+       { 0x11, KEY_TUNER },    /* Source */
+       { 0x12, KEY_POWER },
+       { 0x13, KEY_MUTE },
+       { 0x15, KEY_CHANNELDOWN },
+       { 0x18, KEY_VOLUMEDOWN },
+       { 0x19, KEY_CAMERA },   /* Snapshot */
+       { 0x1a, KEY_NEXTSONG },
+       { 0x1b, KEY_TIME },     /* Time Shift */
+       { 0x1c, KEY_RADIO },    /* FM Radio */
+       { 0x1d, KEY_RECORD },
+       { 0x1e, KEY_PAUSE },
        /* additional codes for Kozumi's remote */
-       [0x14] = KEY_INFO,        /* OSD */
-       [0x16] = KEY_OK,          /* OK */
-       [0x17] = KEY_DIGITS,      /* Plus */
-       [0x1f] = KEY_PLAY,        /* Play */
+       { 0x14, KEY_INFO },     /* OSD */
+       { 0x16, KEY_OK },       /* OK */
+       { 0x17, KEY_DIGITS },   /* Plus */
+       { 0x1f, KEY_PLAY },     /* Play */
 };
 
-EXPORT_SYMBOL_GPL(ir_codes_pctv_sedna);
+struct ir_scancode_table ir_codes_pctv_sedna_table = {
+       .scan = ir_codes_pctv_sedna,
+       .size = ARRAY_SIZE(ir_codes_pctv_sedna),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pctv_sedna_table);
 
 /* Mark Phalan <phalanm@o2.ie> */
-IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x12 ] = KEY_POWER,
-       [ 0x10 ] = KEY_MUTE,
-       [ 0x1f ] = KEY_VOLUMEDOWN,
-       [ 0x1b ] = KEY_VOLUMEUP,
-       [ 0x1a ] = KEY_CHANNELUP,
-       [ 0x1e ] = KEY_CHANNELDOWN,
-       [ 0x0e ] = KEY_PAGEUP,
-       [ 0x1d ] = KEY_PAGEDOWN,
-       [ 0x13 ] = KEY_SOUND,
-
-       [ 0x18 ] = KEY_KPPLUSMINUS,     /* CH +/- */
-       [ 0x16 ] = KEY_SUBTITLE,                /* CC */
-       [ 0x0d ] = KEY_TEXT,            /* TTX */
-       [ 0x0b ] = KEY_TV,              /* AIR/CBL */
-       [ 0x11 ] = KEY_PC,              /* PC/TV */
-       [ 0x17 ] = KEY_OK,              /* CH RTN */
-       [ 0x19 ] = KEY_MODE,            /* FUNC */
-       [ 0x0c ] = KEY_SEARCH,          /* AUTOSCAN */
+static struct ir_scancode ir_codes_pv951[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x12, KEY_POWER },
+       { 0x10, KEY_MUTE },
+       { 0x1f, KEY_VOLUMEDOWN },
+       { 0x1b, KEY_VOLUMEUP },
+       { 0x1a, KEY_CHANNELUP },
+       { 0x1e, KEY_CHANNELDOWN },
+       { 0x0e, KEY_PAGEUP },
+       { 0x1d, KEY_PAGEDOWN },
+       { 0x13, KEY_SOUND },
+
+       { 0x18, KEY_KPPLUSMINUS },      /* CH +/- */
+       { 0x16, KEY_SUBTITLE },         /* CC */
+       { 0x0d, KEY_TEXT },             /* TTX */
+       { 0x0b, KEY_TV },               /* AIR/CBL */
+       { 0x11, KEY_PC },               /* PC/TV */
+       { 0x17, KEY_OK },               /* CH RTN */
+       { 0x19, KEY_MODE },             /* FUNC */
+       { 0x0c, KEY_SEARCH },           /* AUTOSCAN */
 
        /* Not sure what to do with these ones! */
-       [ 0x0f ] = KEY_SELECT,          /* SOURCE */
-       [ 0x0a ] = KEY_KPPLUS,          /* +100 */
-       [ 0x14 ] = KEY_EQUAL,           /* SYNC */
-       [ 0x1c ] = KEY_MEDIA,             /* PC/TV */
+       { 0x0f, KEY_SELECT },           /* SOURCE */
+       { 0x0a, KEY_KPPLUS },           /* +100 */
+       { 0x14, KEY_EQUAL },            /* SYNC */
+       { 0x1c, KEY_MEDIA },            /* PC/TV */
 };
 
-EXPORT_SYMBOL_GPL(ir_codes_pv951);
+struct ir_scancode_table ir_codes_pv951_table = {
+       .scan = ir_codes_pv951,
+       .size = ARRAY_SIZE(ir_codes_pv951),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pv951_table);
 
 /* generic RC5 keytable                                          */
 /* see http://users.pandora.be/nenya/electronics/rc5/codes00.htm */
 /* used by old (black) Hauppauge remotes                         */
-IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_rc5_tv[] = {
        /* Keys 0 to 9 */
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x0b ] = KEY_CHANNEL,         /* channel / program (japan: 11) */
-       [ 0x0c ] = KEY_POWER,           /* standby */
-       [ 0x0d ] = KEY_MUTE,            /* mute / demute */
-       [ 0x0f ] = KEY_TV,              /* display */
-       [ 0x10 ] = KEY_VOLUMEUP,
-       [ 0x11 ] = KEY_VOLUMEDOWN,
-       [ 0x12 ] = KEY_BRIGHTNESSUP,
-       [ 0x13 ] = KEY_BRIGHTNESSDOWN,
-       [ 0x1e ] = KEY_SEARCH,          /* search + */
-       [ 0x20 ] = KEY_CHANNELUP,       /* channel / program + */
-       [ 0x21 ] = KEY_CHANNELDOWN,     /* channel / program - */
-       [ 0x22 ] = KEY_CHANNEL,         /* alt / channel */
-       [ 0x23 ] = KEY_LANGUAGE,        /* 1st / 2nd language */
-       [ 0x26 ] = KEY_SLEEP,           /* sleeptimer */
-       [ 0x2e ] = KEY_MENU,            /* 2nd controls (USA: menu) */
-       [ 0x30 ] = KEY_PAUSE,
-       [ 0x32 ] = KEY_REWIND,
-       [ 0x33 ] = KEY_GOTO,
-       [ 0x35 ] = KEY_PLAY,
-       [ 0x36 ] = KEY_STOP,
-       [ 0x37 ] = KEY_RECORD,          /* recording */
-       [ 0x3c ] = KEY_TEXT,            /* teletext submode (Japan: 12) */
-       [ 0x3d ] = KEY_SUSPEND,         /* system standby */
-
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_rc5_tv);
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0b, KEY_CHANNEL },          /* channel / program (japan: 11) */
+       { 0x0c, KEY_POWER },            /* standby */
+       { 0x0d, KEY_MUTE },             /* mute / demute */
+       { 0x0f, KEY_TV },               /* display */
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x12, KEY_BRIGHTNESSUP },
+       { 0x13, KEY_BRIGHTNESSDOWN },
+       { 0x1e, KEY_SEARCH },           /* search + */
+       { 0x20, KEY_CHANNELUP },        /* channel / program + */
+       { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x22, KEY_CHANNEL },          /* alt / channel */
+       { 0x23, KEY_LANGUAGE },         /* 1st / 2nd language */
+       { 0x26, KEY_SLEEP },            /* sleeptimer */
+       { 0x2e, KEY_MENU },             /* 2nd controls (USA: menu) */
+       { 0x30, KEY_PAUSE },
+       { 0x32, KEY_REWIND },
+       { 0x33, KEY_GOTO },
+       { 0x35, KEY_PLAY },
+       { 0x36, KEY_STOP },
+       { 0x37, KEY_RECORD },           /* recording */
+       { 0x3c, KEY_TEXT },             /* teletext submode (Japan: 12) */
+       { 0x3d, KEY_SUSPEND },          /* system standby */
+
+};
+
+struct ir_scancode_table ir_codes_rc5_tv_table = {
+       .scan = ir_codes_rc5_tv,
+       .size = ARRAY_SIZE(ir_codes_rc5_tv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_rc5_tv_table);
 
 /* Table for Leadtek Winfast Remote Controls - used by both bttv and cx88 */
-IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_winfast[] = {
        /* Keys 0 to 9 */
-       [ 0x12 ] = KEY_0,
-       [ 0x05 ] = KEY_1,
-       [ 0x06 ] = KEY_2,
-       [ 0x07 ] = KEY_3,
-       [ 0x09 ] = KEY_4,
-       [ 0x0a ] = KEY_5,
-       [ 0x0b ] = KEY_6,
-       [ 0x0d ] = KEY_7,
-       [ 0x0e ] = KEY_8,
-       [ 0x0f ] = KEY_9,
-
-       [ 0x00 ] = KEY_POWER,
-       [ 0x1b ] = KEY_AUDIO,           /* Audio Source */
-       [ 0x02 ] = KEY_TUNER,           /* TV/FM, not on Y0400052 */
-       [ 0x1e ] = KEY_VIDEO,           /* Video Source */
-       [ 0x16 ] = KEY_INFO,            /* Display information */
-       [ 0x04 ] = KEY_VOLUMEUP,
-       [ 0x08 ] = KEY_VOLUMEDOWN,
-       [ 0x0c ] = KEY_CHANNELUP,
-       [ 0x10 ] = KEY_CHANNELDOWN,
-       [ 0x03 ] = KEY_ZOOM,            /* fullscreen */
-       [ 0x1f ] = KEY_TEXT,            /* closed caption/teletext */
-       [ 0x20 ] = KEY_SLEEP,
-       [ 0x29 ] = KEY_CLEAR,           /* boss key */
-       [ 0x14 ] = KEY_MUTE,
-       [ 0x2b ] = KEY_RED,
-       [ 0x2c ] = KEY_GREEN,
-       [ 0x2d ] = KEY_YELLOW,
-       [ 0x2e ] = KEY_BLUE,
-       [ 0x18 ] = KEY_KPPLUS,          /* fine tune + , not on Y040052 */
-       [ 0x19 ] = KEY_KPMINUS,         /* fine tune - , not on Y040052 */
-       [ 0x2a ] = KEY_MEDIA,           /* PIP (Picture in picture */
-       [ 0x21 ] = KEY_DOT,
-       [ 0x13 ] = KEY_ENTER,
-       [ 0x11 ] = KEY_LAST,            /* Recall (last channel */
-       [ 0x22 ] = KEY_PREVIOUS,
-       [ 0x23 ] = KEY_PLAYPAUSE,
-       [ 0x24 ] = KEY_NEXT,
-       [ 0x25 ] = KEY_ARCHIVE,       /* Time Shifting */
-       [ 0x26 ] = KEY_STOP,
-       [ 0x27 ] = KEY_RECORD,
-       [ 0x28 ] = KEY_SAVE,          /* Screenshot */
-       [ 0x2f ] = KEY_MENU,
-       [ 0x30 ] = KEY_CANCEL,
-       [ 0x31 ] = KEY_CHANNEL,       /* Channel Surf */
-       [ 0x32 ] = KEY_SUBTITLE,
-       [ 0x33 ] = KEY_LANGUAGE,
-       [ 0x34 ] = KEY_REWIND,
-       [ 0x35 ] = KEY_FASTFORWARD,
-       [ 0x36 ] = KEY_TV,
-       [ 0x37 ] = KEY_RADIO,         /* FM */
-       [ 0x38 ] = KEY_DVD,
-
-       [ 0x3e ] = KEY_F21,           /* MCE +VOL, on Y04G0033 */
-       [ 0x3a ] = KEY_F22,           /* MCE -VOL, on Y04G0033 */
-       [ 0x3b ] = KEY_F23,           /* MCE +CH,  on Y04G0033 */
-       [ 0x3f ] = KEY_F24            /* MCE -CH,  on Y04G0033 */
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_winfast);
-
-IR_KEYTAB_TYPE ir_codes_pinnacle_color[IR_KEYTAB_SIZE] = {
-       [ 0x59 ] = KEY_MUTE,
-       [ 0x4a ] = KEY_POWER,
-
-       [ 0x18 ] = KEY_TEXT,
-       [ 0x26 ] = KEY_TV,
-       [ 0x3d ] = KEY_PRINT,
-
-       [ 0x48 ] = KEY_RED,
-       [ 0x04 ] = KEY_GREEN,
-       [ 0x11 ] = KEY_YELLOW,
-       [ 0x00 ] = KEY_BLUE,
-
-       [ 0x2d ] = KEY_VOLUMEUP,
-       [ 0x1e ] = KEY_VOLUMEDOWN,
-
-       [ 0x49 ] = KEY_MENU,
-
-       [ 0x16 ] = KEY_CHANNELUP,
-       [ 0x17 ] = KEY_CHANNELDOWN,
-
-       [ 0x20 ] = KEY_UP,
-       [ 0x21 ] = KEY_DOWN,
-       [ 0x22 ] = KEY_LEFT,
-       [ 0x23 ] = KEY_RIGHT,
-       [ 0x0d ] = KEY_SELECT,
-
-
-
-       [ 0x08 ] = KEY_BACK,
-       [ 0x07 ] = KEY_REFRESH,
-
-       [ 0x2f ] = KEY_ZOOM,
-       [ 0x29 ] = KEY_RECORD,
-
-       [ 0x4b ] = KEY_PAUSE,
-       [ 0x4d ] = KEY_REWIND,
-       [ 0x2e ] = KEY_PLAY,
-       [ 0x4e ] = KEY_FORWARD,
-       [ 0x53 ] = KEY_PREVIOUS,
-       [ 0x4c ] = KEY_STOP,
-       [ 0x54 ] = KEY_NEXT,
-
-       [ 0x69 ] = KEY_0,
-       [ 0x6a ] = KEY_1,
-       [ 0x6b ] = KEY_2,
-       [ 0x6c ] = KEY_3,
-       [ 0x6d ] = KEY_4,
-       [ 0x6e ] = KEY_5,
-       [ 0x6f ] = KEY_6,
-       [ 0x70 ] = KEY_7,
-       [ 0x71 ] = KEY_8,
-       [ 0x72 ] = KEY_9,
-
-       [ 0x74 ] = KEY_CHANNEL,
-       [ 0x0a ] = KEY_BACKSPACE,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_pinnacle_color);
+       { 0x12, KEY_0 },
+       { 0x05, KEY_1 },
+       { 0x06, KEY_2 },
+       { 0x07, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0a, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x0d, KEY_7 },
+       { 0x0e, KEY_8 },
+       { 0x0f, KEY_9 },
+
+       { 0x00, KEY_POWER },
+       { 0x1b, KEY_AUDIO },            /* Audio Source */
+       { 0x02, KEY_TUNER },            /* TV/FM, not on Y0400052 */
+       { 0x1e, KEY_VIDEO },            /* Video Source */
+       { 0x16, KEY_INFO },             /* Display information */
+       { 0x04, KEY_VOLUMEUP },
+       { 0x08, KEY_VOLUMEDOWN },
+       { 0x0c, KEY_CHANNELUP },
+       { 0x10, KEY_CHANNELDOWN },
+       { 0x03, KEY_ZOOM },             /* fullscreen */
+       { 0x1f, KEY_TEXT },             /* closed caption/teletext */
+       { 0x20, KEY_SLEEP },
+       { 0x29, KEY_CLEAR },            /* boss key */
+       { 0x14, KEY_MUTE },
+       { 0x2b, KEY_RED },
+       { 0x2c, KEY_GREEN },
+       { 0x2d, KEY_YELLOW },
+       { 0x2e, KEY_BLUE },
+       { 0x18, KEY_KPPLUS },           /* fine tune + , not on Y040052 */
+       { 0x19, KEY_KPMINUS },          /* fine tune - , not on Y040052 */
+       { 0x2a, KEY_MEDIA },            /* PIP (Picture in picture */
+       { 0x21, KEY_DOT },
+       { 0x13, KEY_ENTER },
+       { 0x11, KEY_LAST },             /* Recall (last channel */
+       { 0x22, KEY_PREVIOUS },
+       { 0x23, KEY_PLAYPAUSE },
+       { 0x24, KEY_NEXT },
+       { 0x25, KEY_TIME },             /* Time Shifting */
+       { 0x26, KEY_STOP },
+       { 0x27, KEY_RECORD },
+       { 0x28, KEY_SAVE },             /* Screenshot */
+       { 0x2f, KEY_MENU },
+       { 0x30, KEY_CANCEL },
+       { 0x31, KEY_CHANNEL },          /* Channel Surf */
+       { 0x32, KEY_SUBTITLE },
+       { 0x33, KEY_LANGUAGE },
+       { 0x34, KEY_REWIND },
+       { 0x35, KEY_FASTFORWARD },
+       { 0x36, KEY_TV },
+       { 0x37, KEY_RADIO },            /* FM */
+       { 0x38, KEY_DVD },
+
+       { 0x3e, KEY_F21 },              /* MCE +VOL, on Y04G0033 */
+       { 0x3a, KEY_F22 },              /* MCE -VOL, on Y04G0033 */
+       { 0x3b, KEY_F23 },              /* MCE +CH,  on Y04G0033 */
+       { 0x3f, KEY_F24 }               /* MCE -CH,  on Y04G0033 */
+};
+
+struct ir_scancode_table ir_codes_winfast_table = {
+       .scan = ir_codes_winfast,
+       .size = ARRAY_SIZE(ir_codes_winfast),
+};
+EXPORT_SYMBOL_GPL(ir_codes_winfast_table);
+
+static struct ir_scancode ir_codes_pinnacle_color[] = {
+       { 0x59, KEY_MUTE },
+       { 0x4a, KEY_POWER },
+
+       { 0x18, KEY_TEXT },
+       { 0x26, KEY_TV },
+       { 0x3d, KEY_PRINT },
+
+       { 0x48, KEY_RED },
+       { 0x04, KEY_GREEN },
+       { 0x11, KEY_YELLOW },
+       { 0x00, KEY_BLUE },
+
+       { 0x2d, KEY_VOLUMEUP },
+       { 0x1e, KEY_VOLUMEDOWN },
+
+       { 0x49, KEY_MENU },
+
+       { 0x16, KEY_CHANNELUP },
+       { 0x17, KEY_CHANNELDOWN },
+
+       { 0x20, KEY_UP },
+       { 0x21, KEY_DOWN },
+       { 0x22, KEY_LEFT },
+       { 0x23, KEY_RIGHT },
+       { 0x0d, KEY_SELECT },
+
+       { 0x08, KEY_BACK },
+       { 0x07, KEY_REFRESH },
+
+       { 0x2f, KEY_ZOOM },
+       { 0x29, KEY_RECORD },
+
+       { 0x4b, KEY_PAUSE },
+       { 0x4d, KEY_REWIND },
+       { 0x2e, KEY_PLAY },
+       { 0x4e, KEY_FORWARD },
+       { 0x53, KEY_PREVIOUS },
+       { 0x4c, KEY_STOP },
+       { 0x54, KEY_NEXT },
+
+       { 0x69, KEY_0 },
+       { 0x6a, KEY_1 },
+       { 0x6b, KEY_2 },
+       { 0x6c, KEY_3 },
+       { 0x6d, KEY_4 },
+       { 0x6e, KEY_5 },
+       { 0x6f, KEY_6 },
+       { 0x70, KEY_7 },
+       { 0x71, KEY_8 },
+       { 0x72, KEY_9 },
+
+       { 0x74, KEY_CHANNEL },
+       { 0x0a, KEY_BACKSPACE },
+};
+
+struct ir_scancode_table ir_codes_pinnacle_color_table = {
+       .scan = ir_codes_pinnacle_color,
+       .size = ARRAY_SIZE(ir_codes_pinnacle_color),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle_color_table);
 
 /* Hauppauge: the newer, gray remotes (seems there are multiple
  * slightly different versions), shipped with cx88+ivtv cards.
  * almost rc5 coding, but some non-standard keys */
-IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_hauppauge_new[] = {
        /* Keys 0 to 9 */
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-
-       [ 0x0a ] = KEY_TEXT,            /* keypad asterisk as well */
-       [ 0x0b ] = KEY_RED,             /* red button */
-       [ 0x0c ] = KEY_RADIO,
-       [ 0x0d ] = KEY_MENU,
-       [ 0x0e ] = KEY_SUBTITLE,        /* also the # key */
-       [ 0x0f ] = KEY_MUTE,
-       [ 0x10 ] = KEY_VOLUMEUP,
-       [ 0x11 ] = KEY_VOLUMEDOWN,
-       [ 0x12 ] = KEY_PREVIOUS,        /* previous channel */
-       [ 0x14 ] = KEY_UP,
-       [ 0x15 ] = KEY_DOWN,
-       [ 0x16 ] = KEY_LEFT,
-       [ 0x17 ] = KEY_RIGHT,
-       [ 0x18 ] = KEY_VIDEO,           /* Videos */
-       [ 0x19 ] = KEY_AUDIO,           /* Music */
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+
+       { 0x0a, KEY_TEXT },             /* keypad asterisk as well */
+       { 0x0b, KEY_RED },              /* red button */
+       { 0x0c, KEY_RADIO },
+       { 0x0d, KEY_MENU },
+       { 0x0e, KEY_SUBTITLE },         /* also the # key */
+       { 0x0f, KEY_MUTE },
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x12, KEY_PREVIOUS },         /* previous channel */
+       { 0x14, KEY_UP },
+       { 0x15, KEY_DOWN },
+       { 0x16, KEY_LEFT },
+       { 0x17, KEY_RIGHT },
+       { 0x18, KEY_VIDEO },            /* Videos */
+       { 0x19, KEY_AUDIO },            /* Music */
        /* 0x1a: Pictures - presume this means
           "Multimedia Home Platform" -
           no "PICTURES" key in input.h
         */
-       [ 0x1a ] = KEY_MHP,
-
-       [ 0x1b ] = KEY_EPG,             /* Guide */
-       [ 0x1c ] = KEY_TV,
-       [ 0x1e ] = KEY_NEXTSONG,        /* skip >| */
-       [ 0x1f ] = KEY_EXIT,            /* back/exit */
-       [ 0x20 ] = KEY_CHANNELUP,       /* channel / program + */
-       [ 0x21 ] = KEY_CHANNELDOWN,     /* channel / program - */
-       [ 0x22 ] = KEY_CHANNEL,         /* source (old black remote) */
-       [ 0x24 ] = KEY_PREVIOUSSONG,    /* replay |< */
-       [ 0x25 ] = KEY_ENTER,           /* OK */
-       [ 0x26 ] = KEY_SLEEP,           /* minimize (old black remote) */
-       [ 0x29 ] = KEY_BLUE,            /* blue key */
-       [ 0x2e ] = KEY_GREEN,           /* green button */
-       [ 0x30 ] = KEY_PAUSE,           /* pause */
-       [ 0x32 ] = KEY_REWIND,          /* backward << */
-       [ 0x34 ] = KEY_FASTFORWARD,     /* forward >> */
-       [ 0x35 ] = KEY_PLAY,
-       [ 0x36 ] = KEY_STOP,
-       [ 0x37 ] = KEY_RECORD,          /* recording */
-       [ 0x38 ] = KEY_YELLOW,          /* yellow key */
-       [ 0x3b ] = KEY_SELECT,          /* top right button */
-       [ 0x3c ] = KEY_ZOOM,            /* full */
-       [ 0x3d ] = KEY_POWER,           /* system power (green button) */
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_hauppauge_new);
-
-IR_KEYTAB_TYPE ir_codes_npgtech[IR_KEYTAB_SIZE] = {
-       [ 0x1d ] = KEY_SWITCHVIDEOMODE, /* switch inputs */
-       [ 0x2a ] = KEY_FRONT,
-
-       [ 0x3e ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x06 ] = KEY_3,
-       [ 0x0a ] = KEY_4,
-       [ 0x0e ] = KEY_5,
-       [ 0x12 ] = KEY_6,
-       [ 0x16 ] = KEY_7,
-       [ 0x1a ] = KEY_8,
-       [ 0x1e ] = KEY_9,
-       [ 0x3a ] = KEY_0,
-       [ 0x22 ] = KEY_NUMLOCK,         /* -/-- */
-       [ 0x20 ] = KEY_REFRESH,
-
-       [ 0x03 ] = KEY_BRIGHTNESSDOWN,
-       [ 0x28 ] = KEY_AUDIO,
-       [ 0x3c ] = KEY_UP,
-       [ 0x3f ] = KEY_LEFT,
-       [ 0x2e ] = KEY_MUTE,
-       [ 0x3b ] = KEY_RIGHT,
-       [ 0x00 ] = KEY_DOWN,
-       [ 0x07 ] = KEY_BRIGHTNESSUP,
-       [ 0x2c ] = KEY_TEXT,
-
-       [ 0x37 ] = KEY_RECORD,
-       [ 0x17 ] = KEY_PLAY,
-       [ 0x13 ] = KEY_PAUSE,
-       [ 0x26 ] = KEY_STOP,
-       [ 0x18 ] = KEY_FASTFORWARD,
-       [ 0x14 ] = KEY_REWIND,
-       [ 0x33 ] = KEY_ZOOM,
-       [ 0x32 ] = KEY_KEYBOARD,
-       [ 0x30 ] = KEY_GOTO,            /* Pointing arrow */
-       [ 0x36 ] = KEY_MACRO,           /* Maximize/Minimize (yellow) */
-       [ 0x0b ] = KEY_RADIO,
-       [ 0x10 ] = KEY_POWER,
-
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_npgtech);
+       { 0x1a, KEY_MHP },
+
+       { 0x1b, KEY_EPG },              /* Guide */
+       { 0x1c, KEY_TV },
+       { 0x1e, KEY_NEXTSONG },         /* skip >| */
+       { 0x1f, KEY_EXIT },             /* back/exit */
+       { 0x20, KEY_CHANNELUP },        /* channel / program + */
+       { 0x21, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x22, KEY_CHANNEL },          /* source (old black remote) */
+       { 0x24, KEY_PREVIOUSSONG },     /* replay |< */
+       { 0x25, KEY_ENTER },            /* OK */
+       { 0x26, KEY_SLEEP },            /* minimize (old black remote) */
+       { 0x29, KEY_BLUE },             /* blue key */
+       { 0x2e, KEY_GREEN },            /* green button */
+       { 0x30, KEY_PAUSE },            /* pause */
+       { 0x32, KEY_REWIND },           /* backward << */
+       { 0x34, KEY_FASTFORWARD },      /* forward >> */
+       { 0x35, KEY_PLAY },
+       { 0x36, KEY_STOP },
+       { 0x37, KEY_RECORD },           /* recording */
+       { 0x38, KEY_YELLOW },           /* yellow key */
+       { 0x3b, KEY_SELECT },           /* top right button */
+       { 0x3c, KEY_ZOOM },             /* full */
+       { 0x3d, KEY_POWER },            /* system power (green button) */
+};
+
+struct ir_scancode_table ir_codes_hauppauge_new_table = {
+       .scan = ir_codes_hauppauge_new,
+       .size = ARRAY_SIZE(ir_codes_hauppauge_new),
+};
+EXPORT_SYMBOL_GPL(ir_codes_hauppauge_new_table);
+
+static struct ir_scancode ir_codes_npgtech[] = {
+       { 0x1d, KEY_SWITCHVIDEOMODE },  /* switch inputs */
+       { 0x2a, KEY_FRONT },
+
+       { 0x3e, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x06, KEY_3 },
+       { 0x0a, KEY_4 },
+       { 0x0e, KEY_5 },
+       { 0x12, KEY_6 },
+       { 0x16, KEY_7 },
+       { 0x1a, KEY_8 },
+       { 0x1e, KEY_9 },
+       { 0x3a, KEY_0 },
+       { 0x22, KEY_NUMLOCK },          /* -/-- */
+       { 0x20, KEY_REFRESH },
+
+       { 0x03, KEY_BRIGHTNESSDOWN },
+       { 0x28, KEY_AUDIO },
+       { 0x3c, KEY_CHANNELUP },
+       { 0x3f, KEY_VOLUMEDOWN },
+       { 0x2e, KEY_MUTE },
+       { 0x3b, KEY_VOLUMEUP },
+       { 0x00, KEY_CHANNELDOWN },
+       { 0x07, KEY_BRIGHTNESSUP },
+       { 0x2c, KEY_TEXT },
+
+       { 0x37, KEY_RECORD },
+       { 0x17, KEY_PLAY },
+       { 0x13, KEY_PAUSE },
+       { 0x26, KEY_STOP },
+       { 0x18, KEY_FASTFORWARD },
+       { 0x14, KEY_REWIND },
+       { 0x33, KEY_ZOOM },
+       { 0x32, KEY_KEYBOARD },
+       { 0x30, KEY_GOTO },             /* Pointing arrow */
+       { 0x36, KEY_MACRO },            /* Maximize/Minimize (yellow) */
+       { 0x0b, KEY_RADIO },
+       { 0x10, KEY_POWER },
+
+};
+
+struct ir_scancode_table ir_codes_npgtech_table = {
+       .scan = ir_codes_npgtech,
+       .size = ARRAY_SIZE(ir_codes_npgtech),
+};
+EXPORT_SYMBOL_GPL(ir_codes_npgtech_table);
 
 /* Norwood Micro (non-Pro) TV Tuner
    By Peter Naulls <peter@chocky.org>
    Key comments are the functions given in the manual */
-IR_KEYTAB_TYPE ir_codes_norwood[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_norwood[] = {
        /* Keys 0 to 9 */
-       [ 0x20 ] = KEY_0,
-       [ 0x21 ] = KEY_1,
-       [ 0x22 ] = KEY_2,
-       [ 0x23 ] = KEY_3,
-       [ 0x24 ] = KEY_4,
-       [ 0x25 ] = KEY_5,
-       [ 0x26 ] = KEY_6,
-       [ 0x27 ] = KEY_7,
-       [ 0x28 ] = KEY_8,
-       [ 0x29 ] = KEY_9,
-
-       [ 0x78 ] = KEY_TUNER,             /* Video Source        */
-       [ 0x2c ] = KEY_EXIT,              /* Open/Close software */
-       [ 0x2a ] = KEY_SELECT,            /* 2 Digit Select      */
-       [ 0x69 ] = KEY_AGAIN,             /* Recall              */
-
-       [ 0x32 ] = KEY_BRIGHTNESSUP,      /* Brightness increase */
-       [ 0x33 ] = KEY_BRIGHTNESSDOWN,    /* Brightness decrease */
-       [ 0x6b ] = KEY_KPPLUS,            /* (not named >>>>>)   */
-       [ 0x6c ] = KEY_KPMINUS,           /* (not named <<<<<)   */
-
-       [ 0x2d ] = KEY_MUTE,              /* Mute                */
-       [ 0x30 ] = KEY_VOLUMEUP,          /* Volume up           */
-       [ 0x31 ] = KEY_VOLUMEDOWN,        /* Volume down         */
-       [ 0x60 ] = KEY_CHANNELUP,         /* Channel up          */
-       [ 0x61 ] = KEY_CHANNELDOWN,       /* Channel down        */
-
-       [ 0x3f ] = KEY_RECORD,            /* Record              */
-       [ 0x37 ] = KEY_PLAY,              /* Play                */
-       [ 0x36 ] = KEY_PAUSE,             /* Pause               */
-       [ 0x2b ] = KEY_STOP,              /* Stop                */
-       [ 0x67 ] = KEY_FASTFORWARD,       /* Foward              */
-       [ 0x66 ] = KEY_REWIND,            /* Rewind              */
-       [ 0x3e ] = KEY_SEARCH,            /* Auto Scan           */
-       [ 0x2e ] = KEY_CAMERA,            /* Capture Video       */
-       [ 0x6d ] = KEY_MENU,              /* Show/Hide Control   */
-       [ 0x2f ] = KEY_ZOOM,              /* Full Screen         */
-       [ 0x34 ] = KEY_RADIO,             /* FM                  */
-       [ 0x65 ] = KEY_POWER,             /* Computer power      */
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_norwood);
+       { 0x20, KEY_0 },
+       { 0x21, KEY_1 },
+       { 0x22, KEY_2 },
+       { 0x23, KEY_3 },
+       { 0x24, KEY_4 },
+       { 0x25, KEY_5 },
+       { 0x26, KEY_6 },
+       { 0x27, KEY_7 },
+       { 0x28, KEY_8 },
+       { 0x29, KEY_9 },
+
+       { 0x78, KEY_TUNER },            /* Video Source        */
+       { 0x2c, KEY_EXIT },             /* Open/Close software */
+       { 0x2a, KEY_SELECT },           /* 2 Digit Select      */
+       { 0x69, KEY_AGAIN },            /* Recall              */
+
+       { 0x32, KEY_BRIGHTNESSUP },     /* Brightness increase */
+       { 0x33, KEY_BRIGHTNESSDOWN },   /* Brightness decrease */
+       { 0x6b, KEY_KPPLUS },           /* (not named >>>>>)   */
+       { 0x6c, KEY_KPMINUS },          /* (not named <<<<<)   */
+
+       { 0x2d, KEY_MUTE },             /* Mute                */
+       { 0x30, KEY_VOLUMEUP },         /* Volume up           */
+       { 0x31, KEY_VOLUMEDOWN },       /* Volume down         */
+       { 0x60, KEY_CHANNELUP },        /* Channel up          */
+       { 0x61, KEY_CHANNELDOWN },      /* Channel down        */
+
+       { 0x3f, KEY_RECORD },           /* Record              */
+       { 0x37, KEY_PLAY },             /* Play                */
+       { 0x36, KEY_PAUSE },            /* Pause               */
+       { 0x2b, KEY_STOP },             /* Stop                */
+       { 0x67, KEY_FASTFORWARD },      /* Foward              */
+       { 0x66, KEY_REWIND },           /* Rewind              */
+       { 0x3e, KEY_SEARCH },           /* Auto Scan           */
+       { 0x2e, KEY_CAMERA },           /* Capture Video       */
+       { 0x6d, KEY_MENU },             /* Show/Hide Control   */
+       { 0x2f, KEY_ZOOM },             /* Full Screen         */
+       { 0x34, KEY_RADIO },            /* FM                  */
+       { 0x65, KEY_POWER },            /* Computer power      */
+};
+
+struct ir_scancode_table ir_codes_norwood_table = {
+       .scan = ir_codes_norwood,
+       .size = ARRAY_SIZE(ir_codes_norwood),
+};
+EXPORT_SYMBOL_GPL(ir_codes_norwood_table);
 
 /* From reading the following remotes:
  * Zenith Universal 7 / TV Mode 807 / VCR Mode 837
  * Hauppauge (from NOVA-CI-s box product)
  * This is a "middle of the road" approach, differences are noted
  */
-IR_KEYTAB_TYPE ir_codes_budget_ci_old[IR_KEYTAB_SIZE] = {
-       [ 0x00 ] = KEY_0,
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
-       [ 0x0a ] = KEY_ENTER,
-       [ 0x0b ] = KEY_RED,
-       [ 0x0c ] = KEY_POWER,             /* RADIO on Hauppauge */
-       [ 0x0d ] = KEY_MUTE,
-       [ 0x0f ] = KEY_A,                 /* TV on Hauppauge */
-       [ 0x10 ] = KEY_VOLUMEUP,
-       [ 0x11 ] = KEY_VOLUMEDOWN,
-       [ 0x14 ] = KEY_B,
-       [ 0x1c ] = KEY_UP,
-       [ 0x1d ] = KEY_DOWN,
-       [ 0x1e ] = KEY_OPTION,            /* RESERVED on Hauppauge */
-       [ 0x1f ] = KEY_BREAK,
-       [ 0x20 ] = KEY_CHANNELUP,
-       [ 0x21 ] = KEY_CHANNELDOWN,
-       [ 0x22 ] = KEY_PREVIOUS,          /* Prev. Ch on Zenith, SOURCE on Hauppauge */
-       [ 0x24 ] = KEY_RESTART,
-       [ 0x25 ] = KEY_OK,
-       [ 0x26 ] = KEY_CYCLEWINDOWS,      /* MINIMIZE on Hauppauge */
-       [ 0x28 ] = KEY_ENTER,             /* VCR mode on Zenith */
-       [ 0x29 ] = KEY_PAUSE,
-       [ 0x2b ] = KEY_RIGHT,
-       [ 0x2c ] = KEY_LEFT,
-       [ 0x2e ] = KEY_MENU,              /* FULL SCREEN on Hauppauge */
-       [ 0x30 ] = KEY_SLOW,
-       [ 0x31 ] = KEY_PREVIOUS,          /* VCR mode on Zenith */
-       [ 0x32 ] = KEY_REWIND,
-       [ 0x34 ] = KEY_FASTFORWARD,
-       [ 0x35 ] = KEY_PLAY,
-       [ 0x36 ] = KEY_STOP,
-       [ 0x37 ] = KEY_RECORD,
-       [ 0x38 ] = KEY_TUNER,             /* TV/VCR on Zenith */
-       [ 0x3a ] = KEY_C,
-       [ 0x3c ] = KEY_EXIT,
-       [ 0x3d ] = KEY_POWER2,
-       [ 0x3e ] = KEY_TUNER,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_budget_ci_old);
+static struct ir_scancode ir_codes_budget_ci_old[] = {
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x0a, KEY_ENTER },
+       { 0x0b, KEY_RED },
+       { 0x0c, KEY_POWER },            /* RADIO on Hauppauge */
+       { 0x0d, KEY_MUTE },
+       { 0x0f, KEY_A },                /* TV on Hauppauge */
+       { 0x10, KEY_VOLUMEUP },
+       { 0x11, KEY_VOLUMEDOWN },
+       { 0x14, KEY_B },
+       { 0x1c, KEY_UP },
+       { 0x1d, KEY_DOWN },
+       { 0x1e, KEY_OPTION },           /* RESERVED on Hauppauge */
+       { 0x1f, KEY_BREAK },
+       { 0x20, KEY_CHANNELUP },
+       { 0x21, KEY_CHANNELDOWN },
+       { 0x22, KEY_PREVIOUS },         /* Prev Ch on Zenith, SOURCE on Hauppauge */
+       { 0x24, KEY_RESTART },
+       { 0x25, KEY_OK },
+       { 0x26, KEY_CYCLEWINDOWS },     /* MINIMIZE on Hauppauge */
+       { 0x28, KEY_ENTER },            /* VCR mode on Zenith */
+       { 0x29, KEY_PAUSE },
+       { 0x2b, KEY_RIGHT },
+       { 0x2c, KEY_LEFT },
+       { 0x2e, KEY_MENU },             /* FULL SCREEN on Hauppauge */
+       { 0x30, KEY_SLOW },
+       { 0x31, KEY_PREVIOUS },         /* VCR mode on Zenith */
+       { 0x32, KEY_REWIND },
+       { 0x34, KEY_FASTFORWARD },
+       { 0x35, KEY_PLAY },
+       { 0x36, KEY_STOP },
+       { 0x37, KEY_RECORD },
+       { 0x38, KEY_TUNER },            /* TV/VCR on Zenith */
+       { 0x3a, KEY_C },
+       { 0x3c, KEY_EXIT },
+       { 0x3d, KEY_POWER2 },
+       { 0x3e, KEY_TUNER },
+};
+
+struct ir_scancode_table ir_codes_budget_ci_old_table = {
+       .scan = ir_codes_budget_ci_old,
+       .size = ARRAY_SIZE(ir_codes_budget_ci_old),
+};
+EXPORT_SYMBOL_GPL(ir_codes_budget_ci_old_table);
 
 /*
  * Marc Fargas <telenieko@telenieko.com>
  * this is the remote control that comes with the asus p7131
  * which has a label saying is "Model PC-39"
  */
-IR_KEYTAB_TYPE ir_codes_asus_pc39[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_asus_pc39[] = {
        /* Keys 0 to 9 */
-       [ 0x15 ] = KEY_0,
-       [ 0x29 ] = KEY_1,
-       [ 0x2d ] = KEY_2,
-       [ 0x2b ] = KEY_3,
-       [ 0x09 ] = KEY_4,
-       [ 0x0d ] = KEY_5,
-       [ 0x0b ] = KEY_6,
-       [ 0x31 ] = KEY_7,
-       [ 0x35 ] = KEY_8,
-       [ 0x33 ] = KEY_9,
-
-       [ 0x3e ] = KEY_RADIO,           /* radio */
-       [ 0x03 ] = KEY_MENU,            /* dvd/menu */
-       [ 0x2a ] = KEY_VOLUMEUP,
-       [ 0x19 ] = KEY_VOLUMEDOWN,
-       [ 0x37 ] = KEY_UP,
-       [ 0x3b ] = KEY_DOWN,
-       [ 0x27 ] = KEY_LEFT,
-       [ 0x2f ] = KEY_RIGHT,
-       [ 0x25 ] = KEY_VIDEO,           /* video */
-       [ 0x39 ] = KEY_AUDIO,           /* music */
-
-       [ 0x21 ] = KEY_TV,              /* tv */
-       [ 0x1d ] = KEY_EXIT,            /* back */
-       [ 0x0a ] = KEY_CHANNELUP,       /* channel / program + */
-       [ 0x1b ] = KEY_CHANNELDOWN,     /* channel / program - */
-       [ 0x1a ] = KEY_ENTER,           /* enter */
-
-       [ 0x06 ] = KEY_PAUSE,           /* play/pause */
-       [ 0x1e ] = KEY_PREVIOUS,        /* rew */
-       [ 0x26 ] = KEY_NEXT,            /* forward */
-       [ 0x0e ] = KEY_REWIND,          /* backward << */
-       [ 0x3a ] = KEY_FASTFORWARD,     /* forward >> */
-       [ 0x36 ] = KEY_STOP,
-       [ 0x2e ] = KEY_RECORD,          /* recording */
-       [ 0x16 ] = KEY_POWER,           /* the button that reads "close" */
-
-       [ 0x11 ] = KEY_ZOOM,            /* full screen */
-       [ 0x13 ] = KEY_MACRO,           /* recall */
-       [ 0x23 ] = KEY_HOME,            /* home */
-       [ 0x05 ] = KEY_PVR,             /* picture */
-       [ 0x3d ] = KEY_MUTE,            /* mute */
-       [ 0x01 ] = KEY_DVD,             /* dvd */
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_asus_pc39);
+       { 0x15, KEY_0 },
+       { 0x29, KEY_1 },
+       { 0x2d, KEY_2 },
+       { 0x2b, KEY_3 },
+       { 0x09, KEY_4 },
+       { 0x0d, KEY_5 },
+       { 0x0b, KEY_6 },
+       { 0x31, KEY_7 },
+       { 0x35, KEY_8 },
+       { 0x33, KEY_9 },
+
+       { 0x3e, KEY_RADIO },            /* radio */
+       { 0x03, KEY_MENU },             /* dvd/menu */
+       { 0x2a, KEY_VOLUMEUP },
+       { 0x19, KEY_VOLUMEDOWN },
+       { 0x37, KEY_UP },
+       { 0x3b, KEY_DOWN },
+       { 0x27, KEY_LEFT },
+       { 0x2f, KEY_RIGHT },
+       { 0x25, KEY_VIDEO },            /* video */
+       { 0x39, KEY_AUDIO },            /* music */
+
+       { 0x21, KEY_TV },               /* tv */
+       { 0x1d, KEY_EXIT },             /* back */
+       { 0x0a, KEY_CHANNELUP },        /* channel / program + */
+       { 0x1b, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x1a, KEY_ENTER },            /* enter */
+
+       { 0x06, KEY_PAUSE },            /* play/pause */
+       { 0x1e, KEY_PREVIOUS },         /* rew */
+       { 0x26, KEY_NEXT },             /* forward */
+       { 0x0e, KEY_REWIND },           /* backward << */
+       { 0x3a, KEY_FASTFORWARD },      /* forward >> */
+       { 0x36, KEY_STOP },
+       { 0x2e, KEY_RECORD },           /* recording */
+       { 0x16, KEY_POWER },            /* the button that reads "close" */
+
+       { 0x11, KEY_ZOOM },             /* full screen */
+       { 0x13, KEY_MACRO },            /* recall */
+       { 0x23, KEY_HOME },             /* home */
+       { 0x05, KEY_PVR },              /* picture */
+       { 0x3d, KEY_MUTE },             /* mute */
+       { 0x01, KEY_DVD },              /* dvd */
+};
+
+struct ir_scancode_table ir_codes_asus_pc39_table = {
+       .scan = ir_codes_asus_pc39,
+       .size = ARRAY_SIZE(ir_codes_asus_pc39),
+};
+EXPORT_SYMBOL_GPL(ir_codes_asus_pc39_table);
 
 
 /* Encore ENLTV-FM  - black plastic, white front cover with white glowing buttons
     Juan Pablo Sormani <sorman@gmail.com> */
-IR_KEYTAB_TYPE ir_codes_encore_enltv[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_encore_enltv[] = {
 
        /* Power button does nothing, neither in Windows app,
         although it sends data (used for BIOS wakeup?) */
-       [ 0x0d ] = KEY_MUTE,
-
-       [ 0x1e ] = KEY_TV,
-       [ 0x00 ] = KEY_VIDEO,
-       [ 0x01 ] = KEY_AUDIO,           /* music */
-       [ 0x02 ] = KEY_MHP,             /* picture */
-
-       [ 0x1f ] = KEY_1,
-       [ 0x03 ] = KEY_2,
-       [ 0x04 ] = KEY_3,
-       [ 0x05 ] = KEY_4,
-       [ 0x1c ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x1d ] = KEY_9,
-       [ 0x0a ] = KEY_0,
-
-       [ 0x09 ] = KEY_LIST,        /* -/-- */
-       [ 0x0b ] = KEY_LAST,        /* recall */
-
-       [ 0x14 ] = KEY_HOME,            /* win start menu */
-       [ 0x15 ] = KEY_EXIT,            /* exit */
-       [ 0x16 ] = KEY_UP,
-       [ 0x12 ] = KEY_DOWN,
-       [ 0x0c ] = KEY_RIGHT,
-       [ 0x17 ] = KEY_LEFT,
-
-       [ 0x18 ] = KEY_ENTER,           /* OK */
-
-       [ 0x0e ] = KEY_ESC,
-       [ 0x13 ] = KEY_D,               /* desktop */
-       [ 0x11 ] = KEY_TAB,
-       [ 0x19 ] = KEY_SWITCHVIDEOMODE, /* switch */
-
-       [ 0x1a ] = KEY_MENU,
-       [ 0x1b ] = KEY_ZOOM,            /* fullscreen */
-       [ 0x44 ] = KEY_TIME,            /* time shift */
-       [ 0x40 ] = KEY_MODE,            /* source */
-
-       [ 0x5a ] = KEY_RECORD,
-       [ 0x42 ] = KEY_PLAY,            /* play/pause */
-       [ 0x45 ] = KEY_STOP,
-       [ 0x43 ] = KEY_CAMERA,          /* camera icon */
-
-       [ 0x48 ] = KEY_REWIND,
-       [ 0x4a ] = KEY_FASTFORWARD,
-       [ 0x49 ] = KEY_PREVIOUS,
-       [ 0x4b ] = KEY_NEXT,
-
-       [ 0x4c ] = KEY_FAVORITES,       /* tv wall */
-       [ 0x4d ] = KEY_SOUND,           /* DVD sound */
-       [ 0x4e ] = KEY_LANGUAGE,        /* DVD lang */
-       [ 0x4f ] = KEY_TEXT,            /* DVD text */
-
-       [ 0x50 ] = KEY_SLEEP,           /* shutdown */
-       [ 0x51 ] = KEY_MODE,            /* stereo > main */
-       [ 0x52 ] = KEY_SELECT,          /* stereo > sap */
-       [ 0x53 ] = KEY_PROG1,           /* teletext */
-
-
-       [ 0x59 ] = KEY_RED,             /* AP1 */
-       [ 0x41 ] = KEY_GREEN,           /* AP2 */
-       [ 0x47 ] = KEY_YELLOW,          /* AP3 */
-       [ 0x57 ] = KEY_BLUE,            /* AP4 */
-};
-EXPORT_SYMBOL_GPL(ir_codes_encore_enltv);
+       { 0x0d, KEY_MUTE },
+
+       { 0x1e, KEY_TV },
+       { 0x00, KEY_VIDEO },
+       { 0x01, KEY_AUDIO },            /* music */
+       { 0x02, KEY_MHP },              /* picture */
+
+       { 0x1f, KEY_1 },
+       { 0x03, KEY_2 },
+       { 0x04, KEY_3 },
+       { 0x05, KEY_4 },
+       { 0x1c, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x1d, KEY_9 },
+       { 0x0a, KEY_0 },
+
+       { 0x09, KEY_LIST },             /* -/-- */
+       { 0x0b, KEY_LAST },             /* recall */
+
+       { 0x14, KEY_HOME },             /* win start menu */
+       { 0x15, KEY_EXIT },             /* exit */
+       { 0x16, KEY_CHANNELUP },        /* UP */
+       { 0x12, KEY_CHANNELDOWN },      /* DOWN */
+       { 0x0c, KEY_VOLUMEUP },         /* RIGHT */
+       { 0x17, KEY_VOLUMEDOWN },       /* LEFT */
+
+       { 0x18, KEY_ENTER },            /* OK */
+
+       { 0x0e, KEY_ESC },
+       { 0x13, KEY_CYCLEWINDOWS },     /* desktop */
+       { 0x11, KEY_TAB },
+       { 0x19, KEY_SWITCHVIDEOMODE },  /* switch */
+
+       { 0x1a, KEY_MENU },
+       { 0x1b, KEY_ZOOM },             /* fullscreen */
+       { 0x44, KEY_TIME },             /* time shift */
+       { 0x40, KEY_MODE },             /* source */
+
+       { 0x5a, KEY_RECORD },
+       { 0x42, KEY_PLAY },             /* play/pause */
+       { 0x45, KEY_STOP },
+       { 0x43, KEY_CAMERA },           /* camera icon */
+
+       { 0x48, KEY_REWIND },
+       { 0x4a, KEY_FASTFORWARD },
+       { 0x49, KEY_PREVIOUS },
+       { 0x4b, KEY_NEXT },
+
+       { 0x4c, KEY_FAVORITES },        /* tv wall */
+       { 0x4d, KEY_SOUND },            /* DVD sound */
+       { 0x4e, KEY_LANGUAGE },         /* DVD lang */
+       { 0x4f, KEY_TEXT },             /* DVD text */
+
+       { 0x50, KEY_SLEEP },            /* shutdown */
+       { 0x51, KEY_MODE },             /* stereo > main */
+       { 0x52, KEY_SELECT },           /* stereo > sap */
+       { 0x53, KEY_PROG1 },            /* teletext */
+
+
+       { 0x59, KEY_RED },              /* AP1 */
+       { 0x41, KEY_GREEN },            /* AP2 */
+       { 0x47, KEY_YELLOW },           /* AP3 */
+       { 0x57, KEY_BLUE },             /* AP4 */
+};
+
+struct ir_scancode_table ir_codes_encore_enltv_table = {
+       .scan = ir_codes_encore_enltv,
+       .size = ARRAY_SIZE(ir_codes_encore_enltv),
+};
+EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_table);
 
 /* Encore ENLTV2-FM  - silver plastic - "Wand Media" written at the botton
     Mauro Carvalho Chehab <mchehab@infradead.org> */
-IR_KEYTAB_TYPE ir_codes_encore_enltv2[IR_KEYTAB_SIZE] = {
-       [0x4c] = KEY_POWER2,
-       [0x4a] = KEY_TUNER,
-       [0x40] = KEY_1,
-       [0x60] = KEY_2,
-       [0x50] = KEY_3,
-       [0x70] = KEY_4,
-       [0x48] = KEY_5,
-       [0x68] = KEY_6,
-       [0x58] = KEY_7,
-       [0x78] = KEY_8,
-       [0x44] = KEY_9,
-       [0x54] = KEY_0,
-
-       [0x64] = KEY_LAST,              /* +100 */
-       [0x4e] = KEY_AGAIN,             /* Recall */
-
-       [0x6c] = KEY_SWITCHVIDEOMODE,   /* Video Source */
-       [0x5e] = KEY_MENU,
-       [0x56] = KEY_SCREEN,
-       [0x7a] = KEY_SETUP,
-
-       [0x46] = KEY_MUTE,
-       [0x5c] = KEY_MODE,              /* Stereo */
-       [0x74] = KEY_INFO,
-       [0x7c] = KEY_CLEAR,
-
-       [0x55] = KEY_UP,
-       [0x49] = KEY_DOWN,
-       [0x7e] = KEY_LEFT,
-       [0x59] = KEY_RIGHT,
-       [0x6a] = KEY_ENTER,
-
-       [0x42] = KEY_VOLUMEUP,
-       [0x62] = KEY_VOLUMEDOWN,
-       [0x52] = KEY_CHANNELUP,
-       [0x72] = KEY_CHANNELDOWN,
-
-       [0x41] = KEY_RECORD,
-       [0x51] = KEY_SHUFFLE,   /* Snapshot */
-       [0x75] = KEY_TIME,      /* Timeshift */
-       [0x71] = KEY_TV2,       /* PIP */
-
-       [0x45] = KEY_REWIND,
-       [0x6f] = KEY_PAUSE,
-       [0x7d] = KEY_FORWARD,
-       [0x79] = KEY_STOP,
-};
-EXPORT_SYMBOL_GPL(ir_codes_encore_enltv2);
+static struct ir_scancode ir_codes_encore_enltv2[] = {
+       { 0x4c, KEY_POWER2 },
+       { 0x4a, KEY_TUNER },
+       { 0x40, KEY_1 },
+       { 0x60, KEY_2 },
+       { 0x50, KEY_3 },
+       { 0x70, KEY_4 },
+       { 0x48, KEY_5 },
+       { 0x68, KEY_6 },
+       { 0x58, KEY_7 },
+       { 0x78, KEY_8 },
+       { 0x44, KEY_9 },
+       { 0x54, KEY_0 },
+
+       { 0x64, KEY_LAST },             /* +100 */
+       { 0x4e, KEY_AGAIN },            /* Recall */
+
+       { 0x6c, KEY_SWITCHVIDEOMODE },  /* Video Source */
+       { 0x5e, KEY_MENU },
+       { 0x56, KEY_SCREEN },
+       { 0x7a, KEY_SETUP },
+
+       { 0x46, KEY_MUTE },
+       { 0x5c, KEY_MODE },             /* Stereo */
+       { 0x74, KEY_INFO },
+       { 0x7c, KEY_CLEAR },
+
+       { 0x55, KEY_UP },
+       { 0x49, KEY_DOWN },
+       { 0x7e, KEY_LEFT },
+       { 0x59, KEY_RIGHT },
+       { 0x6a, KEY_ENTER },
+
+       { 0x42, KEY_VOLUMEUP },
+       { 0x62, KEY_VOLUMEDOWN },
+       { 0x52, KEY_CHANNELUP },
+       { 0x72, KEY_CHANNELDOWN },
+
+       { 0x41, KEY_RECORD },
+       { 0x51, KEY_CAMERA },           /* Snapshot */
+       { 0x75, KEY_TIME },             /* Timeshift */
+       { 0x71, KEY_TV2 },              /* PIP */
+
+       { 0x45, KEY_REWIND },
+       { 0x6f, KEY_PAUSE },
+       { 0x7d, KEY_FORWARD },
+       { 0x79, KEY_STOP },
+};
+
+struct ir_scancode_table ir_codes_encore_enltv2_table = {
+       .scan = ir_codes_encore_enltv2,
+       .size = ARRAY_SIZE(ir_codes_encore_enltv2),
+};
+EXPORT_SYMBOL_GPL(ir_codes_encore_enltv2_table);
 
 /* for the Technotrend 1500 bundled remotes (grey and black): */
-IR_KEYTAB_TYPE ir_codes_tt_1500[IR_KEYTAB_SIZE] = {
-       [ 0x01 ] = KEY_POWER,
-       [ 0x02 ] = KEY_SHUFFLE, /* ? double-arrow key */
-       [ 0x03 ] = KEY_1,
-       [ 0x04 ] = KEY_2,
-       [ 0x05 ] = KEY_3,
-       [ 0x06 ] = KEY_4,
-       [ 0x07 ] = KEY_5,
-       [ 0x08 ] = KEY_6,
-       [ 0x09 ] = KEY_7,
-       [ 0x0a ] = KEY_8,
-       [ 0x0b ] = KEY_9,
-       [ 0x0c ] = KEY_0,
-       [ 0x0d ] = KEY_UP,
-       [ 0x0e ] = KEY_LEFT,
-       [ 0x0f ] = KEY_OK,
-       [ 0x10 ] = KEY_RIGHT,
-       [ 0x11 ] = KEY_DOWN,
-       [ 0x12 ] = KEY_INFO,
-       [ 0x13 ] = KEY_EXIT,
-       [ 0x14 ] = KEY_RED,
-       [ 0x15 ] = KEY_GREEN,
-       [ 0x16 ] = KEY_YELLOW,
-       [ 0x17 ] = KEY_BLUE,
-       [ 0x18 ] = KEY_MUTE,
-       [ 0x19 ] = KEY_TEXT,
-       [ 0x1a ] = KEY_MODE,    /* ? TV/Radio */
-       [ 0x21 ] = KEY_OPTION,
-       [ 0x22 ] = KEY_EPG,
-       [ 0x23 ] = KEY_CHANNELUP,
-       [ 0x24 ] = KEY_CHANNELDOWN,
-       [ 0x25 ] = KEY_VOLUMEUP,
-       [ 0x26 ] = KEY_VOLUMEDOWN,
-       [ 0x27 ] = KEY_SETUP,
-       [ 0x3a ] = KEY_RECORD, /* these keys are only in the black remote */
-       [ 0x3b ] = KEY_PLAY,
-       [ 0x3c ] = KEY_STOP,
-       [ 0x3d ] = KEY_REWIND,
-       [ 0x3e ] = KEY_PAUSE,
-       [ 0x3f ] = KEY_FORWARD,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_tt_1500);
+static struct ir_scancode ir_codes_tt_1500[] = {
+       { 0x01, KEY_POWER },
+       { 0x02, KEY_SHUFFLE },          /* ? double-arrow key */
+       { 0x03, KEY_1 },
+       { 0x04, KEY_2 },
+       { 0x05, KEY_3 },
+       { 0x06, KEY_4 },
+       { 0x07, KEY_5 },
+       { 0x08, KEY_6 },
+       { 0x09, KEY_7 },
+       { 0x0a, KEY_8 },
+       { 0x0b, KEY_9 },
+       { 0x0c, KEY_0 },
+       { 0x0d, KEY_UP },
+       { 0x0e, KEY_LEFT },
+       { 0x0f, KEY_OK },
+       { 0x10, KEY_RIGHT },
+       { 0x11, KEY_DOWN },
+       { 0x12, KEY_INFO },
+       { 0x13, KEY_EXIT },
+       { 0x14, KEY_RED },
+       { 0x15, KEY_GREEN },
+       { 0x16, KEY_YELLOW },
+       { 0x17, KEY_BLUE },
+       { 0x18, KEY_MUTE },
+       { 0x19, KEY_TEXT },
+       { 0x1a, KEY_MODE },             /* ? TV/Radio */
+       { 0x21, KEY_OPTION },
+       { 0x22, KEY_EPG },
+       { 0x23, KEY_CHANNELUP },
+       { 0x24, KEY_CHANNELDOWN },
+       { 0x25, KEY_VOLUMEUP },
+       { 0x26, KEY_VOLUMEDOWN },
+       { 0x27, KEY_SETUP },
+       { 0x3a, KEY_RECORD },           /* these keys are only in the black remote */
+       { 0x3b, KEY_PLAY },
+       { 0x3c, KEY_STOP },
+       { 0x3d, KEY_REWIND },
+       { 0x3e, KEY_PAUSE },
+       { 0x3f, KEY_FORWARD },
+};
+
+struct ir_scancode_table ir_codes_tt_1500_table = {
+       .scan = ir_codes_tt_1500,
+       .size = ARRAY_SIZE(ir_codes_tt_1500),
+};
+EXPORT_SYMBOL_GPL(ir_codes_tt_1500_table);
 
 /* DViCO FUSION HDTV MCE remote */
-IR_KEYTAB_TYPE ir_codes_fusionhdtv_mce[IR_KEYTAB_SIZE] = {
-
-       [ 0x0b ] = KEY_1,
-       [ 0x17 ] = KEY_2,
-       [ 0x1b ] = KEY_3,
-       [ 0x07 ] = KEY_4,
-       [ 0x50 ] = KEY_5,
-       [ 0x54 ] = KEY_6,
-       [ 0x48 ] = KEY_7,
-       [ 0x4c ] = KEY_8,
-       [ 0x58 ] = KEY_9,
-       [ 0x03 ] = KEY_0,
-
-       [ 0x5e ] = KEY_OK,
-       [ 0x51 ] = KEY_UP,
-       [ 0x53 ] = KEY_DOWN,
-       [ 0x5b ] = KEY_LEFT,
-       [ 0x5f ] = KEY_RIGHT,
-
-       [ 0x02 ] = KEY_TV,              /* Labeled DTV on remote */
-       [ 0x0e ] = KEY_MP3,
-       [ 0x1a ] = KEY_DVD,
-       [ 0x1e ] = KEY_FAVORITES,       /* Labeled CPF on remote */
-       [ 0x16 ] = KEY_SETUP,
-       [ 0x46 ] = KEY_POWER2,          /* TV On/Off button on remote */
-       [ 0x0a ] = KEY_EPG,             /* Labeled Guide on remote */
-
-       [ 0x49 ] = KEY_BACK,
-       [ 0x59 ] = KEY_INFO,            /* Labeled MORE on remote */
-       [ 0x4d ] = KEY_MENU,            /* Labeled DVDMENU on remote */
-       [ 0x55 ] = KEY_CYCLEWINDOWS,    /* Labeled ALT-TAB on remote */
-
-       [ 0x0f ] = KEY_PREVIOUSSONG,    /* Labeled |<< REPLAY on remote */
-       [ 0x12 ] = KEY_NEXTSONG,        /* Labeled >>| SKIP on remote */
-       [ 0x42 ] = KEY_ENTER,           /* Labeled START with a green
-                                        * MS windows logo on remote */
-
-       [ 0x15 ] = KEY_VOLUMEUP,
-       [ 0x05 ] = KEY_VOLUMEDOWN,
-       [ 0x11 ] = KEY_CHANNELUP,
-       [ 0x09 ] = KEY_CHANNELDOWN,
-
-       [ 0x52 ] = KEY_CAMERA,
-       [ 0x5a ] = KEY_TUNER,
-       [ 0x19 ] = KEY_OPEN,
-
-       [ 0x13 ] = KEY_MODE,            /* 4:3 16:9 select */
-       [ 0x1f ] = KEY_ZOOM,
-
-       [ 0x43 ] = KEY_REWIND,
-       [ 0x47 ] = KEY_PLAYPAUSE,
-       [ 0x4f ] = KEY_FASTFORWARD,
-       [ 0x57 ] = KEY_MUTE,
-       [ 0x0d ] = KEY_STOP,
-       [ 0x01 ] = KEY_RECORD,
-       [ 0x4e ] = KEY_POWER,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_fusionhdtv_mce);
+static struct ir_scancode ir_codes_fusionhdtv_mce[] = {
+
+       { 0x0b, KEY_1 },
+       { 0x17, KEY_2 },
+       { 0x1b, KEY_3 },
+       { 0x07, KEY_4 },
+       { 0x50, KEY_5 },
+       { 0x54, KEY_6 },
+       { 0x48, KEY_7 },
+       { 0x4c, KEY_8 },
+       { 0x58, KEY_9 },
+       { 0x03, KEY_0 },
+
+       { 0x5e, KEY_OK },
+       { 0x51, KEY_UP },
+       { 0x53, KEY_DOWN },
+       { 0x5b, KEY_LEFT },
+       { 0x5f, KEY_RIGHT },
+
+       { 0x02, KEY_TV },               /* Labeled DTV on remote */
+       { 0x0e, KEY_MP3 },
+       { 0x1a, KEY_DVD },
+       { 0x1e, KEY_FAVORITES },        /* Labeled CPF on remote */
+       { 0x16, KEY_SETUP },
+       { 0x46, KEY_POWER2 },           /* TV On/Off button on remote */
+       { 0x0a, KEY_EPG },              /* Labeled Guide on remote */
+
+       { 0x49, KEY_BACK },
+       { 0x59, KEY_INFO },             /* Labeled MORE on remote */
+       { 0x4d, KEY_MENU },             /* Labeled DVDMENU on remote */
+       { 0x55, KEY_CYCLEWINDOWS },     /* Labeled ALT-TAB on remote */
+
+       { 0x0f, KEY_PREVIOUSSONG },     /* Labeled |<< REPLAY on remote */
+       { 0x12, KEY_NEXTSONG },         /* Labeled >>| SKIP on remote */
+       { 0x42, KEY_ENTER },            /* Labeled START with a green
+                                          MS windows logo on remote */
+
+       { 0x15, KEY_VOLUMEUP },
+       { 0x05, KEY_VOLUMEDOWN },
+       { 0x11, KEY_CHANNELUP },
+       { 0x09, KEY_CHANNELDOWN },
+
+       { 0x52, KEY_CAMERA },
+       { 0x5a, KEY_TUNER },
+       { 0x19, KEY_OPEN },
+
+       { 0x13, KEY_MODE },             /* 4:3 16:9 select */
+       { 0x1f, KEY_ZOOM },
+
+       { 0x43, KEY_REWIND },
+       { 0x47, KEY_PLAYPAUSE },
+       { 0x4f, KEY_FASTFORWARD },
+       { 0x57, KEY_MUTE },
+       { 0x0d, KEY_STOP },
+       { 0x01, KEY_RECORD },
+       { 0x4e, KEY_POWER },
+};
+
+struct ir_scancode_table ir_codes_fusionhdtv_mce_table = {
+       .scan = ir_codes_fusionhdtv_mce,
+       .size = ARRAY_SIZE(ir_codes_fusionhdtv_mce),
+};
+EXPORT_SYMBOL_GPL(ir_codes_fusionhdtv_mce_table);
 
 /* Pinnacle PCTV HD 800i mini remote */
-IR_KEYTAB_TYPE ir_codes_pinnacle_pctv_hd[IR_KEYTAB_SIZE] = {
-
-       [0x0f] = KEY_1,
-       [0x15] = KEY_2,
-       [0x10] = KEY_3,
-       [0x18] = KEY_4,
-       [0x1b] = KEY_5,
-       [0x1e] = KEY_6,
-       [0x11] = KEY_7,
-       [0x21] = KEY_8,
-       [0x12] = KEY_9,
-       [0x27] = KEY_0,
-
-       [0x24] = KEY_ZOOM,
-       [0x2a] = KEY_SUBTITLE,
-
-       [0x00] = KEY_MUTE,
-       [0x01] = KEY_ENTER,     /* Pinnacle Logo */
-       [0x39] = KEY_POWER,
-
-       [0x03] = KEY_VOLUMEUP,
-       [0x09] = KEY_VOLUMEDOWN,
-       [0x06] = KEY_CHANNELUP,
-       [0x0c] = KEY_CHANNELDOWN,
-
-       [0x2d] = KEY_REWIND,
-       [0x30] = KEY_PLAYPAUSE,
-       [0x33] = KEY_FASTFORWARD,
-       [0x3c] = KEY_STOP,
-       [0x36] = KEY_RECORD,
-       [0x3f] = KEY_EPG,       /* Labeled "?" */
-};
-EXPORT_SYMBOL_GPL(ir_codes_pinnacle_pctv_hd);
+static struct ir_scancode ir_codes_pinnacle_pctv_hd[] = {
+
+       { 0x0f, KEY_1 },
+       { 0x15, KEY_2 },
+       { 0x10, KEY_3 },
+       { 0x18, KEY_4 },
+       { 0x1b, KEY_5 },
+       { 0x1e, KEY_6 },
+       { 0x11, KEY_7 },
+       { 0x21, KEY_8 },
+       { 0x12, KEY_9 },
+       { 0x27, KEY_0 },
+
+       { 0x24, KEY_ZOOM },
+       { 0x2a, KEY_SUBTITLE },
+
+       { 0x00, KEY_MUTE },
+       { 0x01, KEY_ENTER },    /* Pinnacle Logo */
+       { 0x39, KEY_POWER },
+
+       { 0x03, KEY_VOLUMEUP },
+       { 0x09, KEY_VOLUMEDOWN },
+       { 0x06, KEY_CHANNELUP },
+       { 0x0c, KEY_CHANNELDOWN },
+
+       { 0x2d, KEY_REWIND },
+       { 0x30, KEY_PLAYPAUSE },
+       { 0x33, KEY_FASTFORWARD },
+       { 0x3c, KEY_STOP },
+       { 0x36, KEY_RECORD },
+       { 0x3f, KEY_EPG },      /* Labeled "?" */
+};
+
+struct ir_scancode_table ir_codes_pinnacle_pctv_hd_table = {
+       .scan = ir_codes_pinnacle_pctv_hd,
+       .size = ARRAY_SIZE(ir_codes_pinnacle_pctv_hd),
+};
+EXPORT_SYMBOL_GPL(ir_codes_pinnacle_pctv_hd_table);
 
 /*
  * Igor Kuznetsov <igk72@ya.ru>
@@ -2198,13 +2365,13 @@ EXPORT_SYMBOL_GPL(ir_codes_pinnacle_pctv_hd);
  * the button labels (several variants when appropriate)
  * helps to descide which keycodes to assign to the buttons.
  */
-IR_KEYTAB_TYPE ir_codes_behold[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_behold[] = {
 
        /*  0x1c            0x12  *
         *  TV/FM          POWER  *
         *                        */
-       [ 0x1c ] = KEY_TUNER,   /*XXX KEY_TV KEY_RADIO */
-       [ 0x12 ] = KEY_POWER,
+       { 0x1c, KEY_TUNER },    /* XXX KEY_TV / KEY_RADIO */
+       { 0x12, KEY_POWER },
 
        /*  0x01    0x02    0x03  *
         *   1       2       3    *
@@ -2215,28 +2382,28 @@ IR_KEYTAB_TYPE ir_codes_behold[IR_KEYTAB_SIZE] = {
         *  0x07    0x08    0x09  *
         *   7       8       9    *
         *                        */
-       [ 0x01 ] = KEY_1,
-       [ 0x02 ] = KEY_2,
-       [ 0x03 ] = KEY_3,
-       [ 0x04 ] = KEY_4,
-       [ 0x05 ] = KEY_5,
-       [ 0x06 ] = KEY_6,
-       [ 0x07 ] = KEY_7,
-       [ 0x08 ] = KEY_8,
-       [ 0x09 ] = KEY_9,
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
 
        /*  0x0a    0x00    0x17  *
         * RECALL    0      MODE  *
         *                        */
-       [ 0x0a ] = KEY_AGAIN,
-       [ 0x00 ] = KEY_0,
-       [ 0x17 ] = KEY_MODE,
+       { 0x0a, KEY_AGAIN },
+       { 0x00, KEY_0 },
+       { 0x17, KEY_MODE },
 
        /*  0x14          0x10    *
         * ASPECT      FULLSCREEN *
         *                        */
-       [ 0x14 ] = KEY_SCREEN,
-       [ 0x10 ] = KEY_ZOOM,
+       { 0x14, KEY_SCREEN },
+       { 0x10, KEY_ZOOM },
 
        /*          0x0b          *
         *           Up           *
@@ -2247,17 +2414,17 @@ IR_KEYTAB_TYPE ir_codes_behold[IR_KEYTAB_SIZE] = {
         *         0x015          *
         *         Down           *
         *                        */
-       [ 0x0b ] = KEY_CHANNELUP,       /*XXX KEY_UP */
-       [ 0x18 ] = KEY_VOLUMEDOWN,      /*XXX KEY_LEFT */
-       [ 0x16 ] = KEY_OK,              /*XXX KEY_ENTER */
-       [ 0x0c ] = KEY_VOLUMEUP,        /*XXX KEY_RIGHT */
-       [ 0x15 ] = KEY_CHANNELDOWN,     /*XXX KEY_DOWN */
+       { 0x0b, KEY_CHANNELUP },
+       { 0x18, KEY_VOLUMEDOWN },
+       { 0x16, KEY_OK },               /* XXX KEY_ENTER */
+       { 0x0c, KEY_VOLUMEUP },
+       { 0x15, KEY_CHANNELDOWN },
 
        /*  0x11            0x0d  *
         *  MUTE            INFO  *
         *                        */
-       [ 0x11 ] = KEY_MUTE,
-       [ 0x0d ] = KEY_INFO,
+       { 0x11, KEY_MUTE },
+       { 0x0d, KEY_INFO },
 
        /*  0x0f    0x1b    0x1a  *
         * RECORD PLAY/PAUSE STOP *
@@ -2266,30 +2433,34 @@ IR_KEYTAB_TYPE ir_codes_behold[IR_KEYTAB_SIZE] = {
         *TELETEXT  AUDIO  SOURCE *
         *           RED   YELLOW *
         *                        */
-       [ 0x0f ] = KEY_RECORD,
-       [ 0x1b ] = KEY_PLAYPAUSE,
-       [ 0x1a ] = KEY_STOP,
-       [ 0x0e ] = KEY_TEXT,
-       [ 0x1f ] = KEY_RED,     /*XXX KEY_AUDIO */
-       [ 0x1e ] = KEY_YELLOW,  /*XXX KEY_SOURCE */
+       { 0x0f, KEY_RECORD },
+       { 0x1b, KEY_PLAYPAUSE },
+       { 0x1a, KEY_STOP },
+       { 0x0e, KEY_TEXT },
+       { 0x1f, KEY_RED },      /*XXX KEY_AUDIO */
+       { 0x1e, KEY_YELLOW },   /*XXX KEY_SOURCE        */
 
        /*  0x1d   0x13     0x19  *
         * SLEEP  PREVIEW   DVB   *
         *         GREEN    BLUE  *
         *                        */
-       [ 0x1d ] = KEY_SLEEP,
-       [ 0x13 ] = KEY_GREEN,
-       [ 0x19 ] = KEY_BLUE,    /*XXX KEY_SAT */
+       { 0x1d, KEY_SLEEP },
+       { 0x13, KEY_GREEN },
+       { 0x19, KEY_BLUE },     /* XXX KEY_SAT  */
 
        /*  0x58           0x5c   *
         * FREEZE        SNAPSHOT *
         *                        */
-       [ 0x58 ] = KEY_SLOW,
-       [ 0x5c ] = KEY_SAVE,
+       { 0x58, KEY_SLOW },
+       { 0x5c, KEY_CAMERA },
 
 };
 
-EXPORT_SYMBOL_GPL(ir_codes_behold);
+struct ir_scancode_table ir_codes_behold_table = {
+       .scan = ir_codes_behold,
+       .size = ARRAY_SIZE(ir_codes_behold),
+};
+EXPORT_SYMBOL_GPL(ir_codes_behold_table);
 
 /* Beholder Intl. Ltd. 2008
  * Dmitry Belimov d.belimov@google.com
@@ -2299,16 +2470,16 @@ EXPORT_SYMBOL_GPL(ir_codes_behold);
  * the button labels (several variants when appropriate)
  * helps to descide which keycodes to assign to the buttons.
  */
-IR_KEYTAB_TYPE ir_codes_behold_columbus[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_behold_columbus[] = {
 
        /*  0x13   0x11   0x1C   0x12  *
         *  Mute  Source  TV/FM  Power *
         *                             */
 
-       [0x13] = KEY_MUTE,
-       [0x11] = KEY_PROPS,
-       [0x1C] = KEY_TUNER,     /* KEY_TV/KEY_RADIO */
-       [0x12] = KEY_POWER,
+       { 0x13, KEY_MUTE },
+       { 0x11, KEY_PROPS },
+       { 0x1C, KEY_TUNER },    /* KEY_TV/KEY_RADIO     */
+       { 0x12, KEY_POWER },
 
        /*  0x01    0x02    0x03  0x0D    *
         *   1       2       3   Stereo   *
@@ -2319,173 +2490,188 @@ IR_KEYTAB_TYPE ir_codes_behold_columbus[IR_KEYTAB_SIZE] = {
         *  0x07    0x08    0x09  0x10    *
         *   7       8       9    Zoom    *
         *                                */
-       [0x01] = KEY_1,
-       [0x02] = KEY_2,
-       [0x03] = KEY_3,
-       [0x0D] = KEY_SETUP,       /* Setup key */
-       [0x04] = KEY_4,
-       [0x05] = KEY_5,
-       [0x06] = KEY_6,
-       [0x19] = KEY_BOOKMARKS, /* Snapshot key */
-       [0x07] = KEY_7,
-       [0x08] = KEY_8,
-       [0x09] = KEY_9,
-       [0x10] = KEY_ZOOM,
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x0D, KEY_SETUP },      /* Setup key */
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x19, KEY_CAMERA },   /* Snapshot key */
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x10, KEY_ZOOM },
 
        /*  0x0A    0x00    0x0B       0x0C   *
         * RECALL    0    ChannelUp  VolumeUp *
         *                                    */
-       [0x0A] = KEY_AGAIN,
-       [0x00] = KEY_0,
-       [0x0B] = KEY_CHANNELUP,
-       [0x0C] = KEY_VOLUMEUP,
+       { 0x0A, KEY_AGAIN },
+       { 0x00, KEY_0 },
+       { 0x0B, KEY_CHANNELUP },
+       { 0x0C, KEY_VOLUMEUP },
 
        /*   0x1B      0x1D      0x15        0x18     *
         * Timeshift  Record  ChannelDown  VolumeDown *
         *                                            */
 
-       [0x1B] = KEY_REWIND,
-       [0x1D] = KEY_RECORD,
-       [0x15] = KEY_CHANNELDOWN,
-       [0x18] = KEY_VOLUMEDOWN,
+       { 0x1B, KEY_TIME },
+       { 0x1D, KEY_RECORD },
+       { 0x15, KEY_CHANNELDOWN },
+       { 0x18, KEY_VOLUMEDOWN },
 
        /*   0x0E   0x1E     0x0F     0x1A  *
         *   Stop   Pause  Previouse  Next  *
         *                                  */
 
-       [0x0E] = KEY_STOP,
-       [0x1E] = KEY_PAUSE,
-       [0x0F] = KEY_PREVIOUS,
-       [0x1A] = KEY_NEXT,
+       { 0x0E, KEY_STOP },
+       { 0x1E, KEY_PAUSE },
+       { 0x0F, KEY_PREVIOUS },
+       { 0x1A, KEY_NEXT },
+
+};
 
+struct ir_scancode_table ir_codes_behold_columbus_table = {
+       .scan = ir_codes_behold_columbus,
+       .size = ARRAY_SIZE(ir_codes_behold_columbus),
 };
-EXPORT_SYMBOL_GPL(ir_codes_behold_columbus);
+EXPORT_SYMBOL_GPL(ir_codes_behold_columbus_table);
 
 /*
  * Remote control for the Genius TVGO A11MCE
  * Adrian Pardini <pardo.bsso@gmail.com>
  */
-IR_KEYTAB_TYPE ir_codes_genius_tvgo_a11mce[IR_KEYTAB_SIZE] = {
+static struct ir_scancode ir_codes_genius_tvgo_a11mce[] = {
        /* Keys 0 to 9 */
-       [0x48] = KEY_0,
-       [0x09] = KEY_1,
-       [0x1d] = KEY_2,
-       [0x1f] = KEY_3,
-       [0x19] = KEY_4,
-       [0x1b] = KEY_5,
-       [0x11] = KEY_6,
-       [0x17] = KEY_7,
-       [0x12] = KEY_8,
-       [0x16] = KEY_9,
-
-       [0x54] = KEY_RECORD,            /* recording */
-       [0x06] = KEY_MUTE,              /* mute */
-       [0x10] = KEY_POWER,
-       [0x40] = KEY_LAST,              /* recall */
-       [0x4c] = KEY_CHANNELUP,         /* channel / program + */
-       [0x00] = KEY_CHANNELDOWN,       /* channel / program - */
-       [0x0d] = KEY_VOLUMEUP,
-       [0x15] = KEY_VOLUMEDOWN,
-       [0x4d] = KEY_OK,                /* also labeled as Pause */
-       [0x1c] = KEY_ZOOM,              /* full screen and Stop*/
-       [0x02] = KEY_MODE,              /* AV Source or Rewind*/
-       [0x04] = KEY_LIST,              /* -/-- */
+       { 0x48, KEY_0 },
+       { 0x09, KEY_1 },
+       { 0x1d, KEY_2 },
+       { 0x1f, KEY_3 },
+       { 0x19, KEY_4 },
+       { 0x1b, KEY_5 },
+       { 0x11, KEY_6 },
+       { 0x17, KEY_7 },
+       { 0x12, KEY_8 },
+       { 0x16, KEY_9 },
+
+       { 0x54, KEY_RECORD },           /* recording */
+       { 0x06, KEY_MUTE },             /* mute */
+       { 0x10, KEY_POWER },
+       { 0x40, KEY_LAST },             /* recall */
+       { 0x4c, KEY_CHANNELUP },        /* channel / program + */
+       { 0x00, KEY_CHANNELDOWN },      /* channel / program - */
+       { 0x0d, KEY_VOLUMEUP },
+       { 0x15, KEY_VOLUMEDOWN },
+       { 0x4d, KEY_OK },               /* also labeled as Pause */
+       { 0x1c, KEY_ZOOM },             /* full screen and Stop*/
+       { 0x02, KEY_MODE },             /* AV Source or Rewind*/
+       { 0x04, KEY_LIST },             /* -/-- */
        /* small arrows above numbers */
-       [0x1a] = KEY_NEXT,              /* also Fast Forward */
-       [0x0e] = KEY_PREVIOUS,  /* also Rewind */
+       { 0x1a, KEY_NEXT },             /* also Fast Forward */
+       { 0x0e, KEY_PREVIOUS },         /* also Rewind */
        /* these are in a rather non standard layout and have
        an alternate name written */
-       [0x1e] = KEY_UP,                /* Video Setting */
-       [0x0a] = KEY_DOWN,              /* Video Default */
-       [0x05] = KEY_LEFT,              /* Snapshot */
-       [0x0c] = KEY_RIGHT,             /* Hide Panel */
+       { 0x1e, KEY_UP },               /* Video Setting */
+       { 0x0a, KEY_DOWN },             /* Video Default */
+       { 0x05, KEY_CAMERA },           /* Snapshot */
+       { 0x0c, KEY_RIGHT },            /* Hide Panel */
        /* Four buttons without label */
-       [0x49] = KEY_RED,
-       [0x0b] = KEY_GREEN,
-       [0x13] = KEY_YELLOW,
-       [0x50] = KEY_BLUE,
+       { 0x49, KEY_RED },
+       { 0x0b, KEY_GREEN },
+       { 0x13, KEY_YELLOW },
+       { 0x50, KEY_BLUE },
+};
+
+struct ir_scancode_table ir_codes_genius_tvgo_a11mce_table = {
+       .scan = ir_codes_genius_tvgo_a11mce,
+       .size = ARRAY_SIZE(ir_codes_genius_tvgo_a11mce),
 };
-EXPORT_SYMBOL_GPL(ir_codes_genius_tvgo_a11mce);
+EXPORT_SYMBOL_GPL(ir_codes_genius_tvgo_a11mce_table);
 
 /*
  * Remote control for Powercolor Real Angel 330
  * Daniel Fraga <fragabr@gmail.com>
  */
-IR_KEYTAB_TYPE ir_codes_powercolor_real_angel[IR_KEYTAB_SIZE] = {
-       [0x38] = KEY_SWITCHVIDEOMODE,   /* switch inputs */
-       [0x0c] = KEY_MEDIA,             /* Turn ON/OFF App */
-       [0x00] = KEY_0,
-       [0x01] = KEY_1,
-       [0x02] = KEY_2,
-       [0x03] = KEY_3,
-       [0x04] = KEY_4,
-       [0x05] = KEY_5,
-       [0x06] = KEY_6,
-       [0x07] = KEY_7,
-       [0x08] = KEY_8,
-       [0x09] = KEY_9,
-       [0x0a] = KEY_DIGITS,            /* single, double, tripple digit */
-       [0x29] = KEY_PREVIOUS,          /* previous channel */
-       [0x12] = KEY_BRIGHTNESSUP,
-       [0x13] = KEY_BRIGHTNESSDOWN,
-       [0x2b] = KEY_MODE,              /* stereo/mono */
-       [0x2c] = KEY_TEXT,              /* teletext */
-       [0x20] = KEY_UP,                /* channel up */
-       [0x21] = KEY_DOWN,              /* channel down */
-       [0x10] = KEY_RIGHT,             /* volume up */
-       [0x11] = KEY_LEFT,              /* volume down */
-       [0x0d] = KEY_MUTE,
-       [0x1f] = KEY_RECORD,
-       [0x17] = KEY_PLAY,
-       [0x16] = KEY_PAUSE,
-       [0x0b] = KEY_STOP,
-       [0x27] = KEY_FASTFORWARD,
-       [0x26] = KEY_REWIND,
-       [0x1e] = KEY_SEARCH,            /* autoscan */
-       [0x0e] = KEY_SHUFFLE,           /* snapshot */
-       [0x2d] = KEY_SETUP,
-       [0x0f] = KEY_SCREEN,            /* full screen */
-       [0x14] = KEY_RADIO,             /* FM radio */
-       [0x25] = KEY_POWER,             /* power */
-};
-EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel);
+static struct ir_scancode ir_codes_powercolor_real_angel[] = {
+       { 0x38, KEY_SWITCHVIDEOMODE },  /* switch inputs */
+       { 0x0c, KEY_MEDIA },            /* Turn ON/OFF App */
+       { 0x00, KEY_0 },
+       { 0x01, KEY_1 },
+       { 0x02, KEY_2 },
+       { 0x03, KEY_3 },
+       { 0x04, KEY_4 },
+       { 0x05, KEY_5 },
+       { 0x06, KEY_6 },
+       { 0x07, KEY_7 },
+       { 0x08, KEY_8 },
+       { 0x09, KEY_9 },
+       { 0x0a, KEY_DIGITS },           /* single, double, tripple digit */
+       { 0x29, KEY_PREVIOUS },         /* previous channel */
+       { 0x12, KEY_BRIGHTNESSUP },
+       { 0x13, KEY_BRIGHTNESSDOWN },
+       { 0x2b, KEY_MODE },             /* stereo/mono */
+       { 0x2c, KEY_TEXT },             /* teletext */
+       { 0x20, KEY_CHANNELUP },        /* channel up */
+       { 0x21, KEY_CHANNELDOWN },      /* channel down */
+       { 0x10, KEY_VOLUMEUP },         /* volume up */
+       { 0x11, KEY_VOLUMEDOWN },       /* volume down */
+       { 0x0d, KEY_MUTE },
+       { 0x1f, KEY_RECORD },
+       { 0x17, KEY_PLAY },
+       { 0x16, KEY_PAUSE },
+       { 0x0b, KEY_STOP },
+       { 0x27, KEY_FASTFORWARD },
+       { 0x26, KEY_REWIND },
+       { 0x1e, KEY_SEARCH },           /* autoscan */
+       { 0x0e, KEY_CAMERA },           /* snapshot */
+       { 0x2d, KEY_SETUP },
+       { 0x0f, KEY_SCREEN },           /* full screen */
+       { 0x14, KEY_RADIO },            /* FM radio */
+       { 0x25, KEY_POWER },            /* power */
+};
+
+struct ir_scancode_table ir_codes_powercolor_real_angel_table = {
+       .scan = ir_codes_powercolor_real_angel,
+       .size = ARRAY_SIZE(ir_codes_powercolor_real_angel),
+};
+EXPORT_SYMBOL_GPL(ir_codes_powercolor_real_angel_table);
 
 /* Kworld Plus TV Analog Lite PCI IR
    Mauro Carvalho Chehab <mchehab@infradead.org>
  */
-IR_KEYTAB_TYPE ir_codes_kworld_plus_tv_analog[IR_KEYTAB_SIZE] = {
-       [0x0c] = KEY_PROG1,             /* Kworld key */
-       [0x16] = KEY_CLOSECD,           /* -> ) */
-       [0x1d] = KEY_POWER2,
-
-       [0x00] = KEY_1,
-       [0x01] = KEY_2,
-       [0x02] = KEY_3,                 /* Two keys have the same code: 3 and left */
-       [0x03] = KEY_4,                 /* Two keys have the same code: 3 and right */
-       [0x04] = KEY_5,
-       [0x05] = KEY_6,
-       [0x06] = KEY_7,
-       [0x07] = KEY_8,
-       [0x08] = KEY_9,
-       [0x0a] = KEY_0,
-
-       [0x09] = KEY_AGAIN,
-       [0x14] = KEY_MUTE,
-
-       [0x20] = KEY_UP,
-       [0x21] = KEY_DOWN,
-       [0x0b] = KEY_ENTER,
-
-       [0x10] = KEY_CHANNELUP,
-       [0x11] = KEY_CHANNELDOWN,
+static struct ir_scancode ir_codes_kworld_plus_tv_analog[] = {
+       { 0x0c, KEY_PROG1 },            /* Kworld key */
+       { 0x16, KEY_CLOSECD },          /* -> ) */
+       { 0x1d, KEY_POWER2 },
+
+       { 0x00, KEY_1 },
+       { 0x01, KEY_2 },
+       { 0x02, KEY_3 },                /* Two keys have the same code: 3 and left */
+       { 0x03, KEY_4 },                /* Two keys have the same code: 3 and right */
+       { 0x04, KEY_5 },
+       { 0x05, KEY_6 },
+       { 0x06, KEY_7 },
+       { 0x07, KEY_8 },
+       { 0x08, KEY_9 },
+       { 0x0a, KEY_0 },
+
+       { 0x09, KEY_AGAIN },
+       { 0x14, KEY_MUTE },
+
+       { 0x20, KEY_UP },
+       { 0x21, KEY_DOWN },
+       { 0x0b, KEY_ENTER },
+
+       { 0x10, KEY_CHANNELUP },
+       { 0x11, KEY_CHANNELDOWN },
 
        /* Couldn't map key left/key right since those
           conflict with '3' and '4' scancodes
           I dunno what the original driver does
         */
 
-       [0x13] = KEY_VOLUMEUP,
-       [0x12] = KEY_VOLUMEDOWN,
+       { 0x13, KEY_VOLUMEUP },
+       { 0x12, KEY_VOLUMEDOWN },
 
        /* The lower part of the IR
           There are several duplicated keycodes there.
@@ -2496,280 +2682,468 @@ IR_KEYTAB_TYPE ir_codes_kworld_plus_tv_analog[IR_KEYTAB_SIZE] = {
           Also, it is not related to the time between keyup
           and keydown.
         */
-       [0x19] = KEY_PAUSE,             /* Timeshift */
-       [0x1a] = KEY_STOP,
-       [0x1b] = KEY_RECORD,
+       { 0x19, KEY_TIME},              /* Timeshift */
+       { 0x1a, KEY_STOP},
+       { 0x1b, KEY_RECORD},
 
-       [0x22] = KEY_TEXT,
+       { 0x22, KEY_TEXT},
 
-       [0x15] = KEY_AUDIO,             /* ((*)) */
-       [0x0f] = KEY_ZOOM,
-       [0x1c] = KEY_SHUFFLE,           /* snapshot */
+       { 0x15, KEY_AUDIO},             /* ((*)) */
+       { 0x0f, KEY_ZOOM},
+       { 0x1c, KEY_CAMERA},            /* snapshot */
 
-       [0x18] = KEY_RED,               /* B */
-       [0x23] = KEY_GREEN,             /* C */
+       { 0x18, KEY_RED},               /* B */
+       { 0x23, KEY_GREEN},             /* C */
 };
-EXPORT_SYMBOL_GPL(ir_codes_kworld_plus_tv_analog);
+struct ir_scancode_table ir_codes_kworld_plus_tv_analog_table = {
+       .scan = ir_codes_kworld_plus_tv_analog,
+       .size = ARRAY_SIZE(ir_codes_kworld_plus_tv_analog),
+};
+EXPORT_SYMBOL_GPL(ir_codes_kworld_plus_tv_analog_table);
 
 /* Kaiomy TVnPC U2
    Mauro Carvalho Chehab <mchehab@infradead.org>
  */
-IR_KEYTAB_TYPE ir_codes_kaiomy[IR_KEYTAB_SIZE] = {
-       [0x43] = KEY_POWER2,
-       [0x01] = KEY_LIST,
-       [0x0b] = KEY_ZOOM,
-       [0x03] = KEY_POWER,
-
-       [0x04] = KEY_1,
-       [0x08] = KEY_2,
-       [0x02] = KEY_3,
-
-       [0x0f] = KEY_4,
-       [0x05] = KEY_5,
-       [0x06] = KEY_6,
-
-       [0x0c] = KEY_7,
-       [0x0d] = KEY_8,
-       [0x0a] = KEY_9,
-
-       [0x11] = KEY_0,
-
-       [0x09] = KEY_CHANNELUP,
-       [0x07] = KEY_CHANNELDOWN,
-
-       [0x0e] = KEY_VOLUMEUP,
-       [0x13] = KEY_VOLUMEDOWN,
-
-       [0x10] = KEY_HOME,
-       [0x12] = KEY_ENTER,
-
-       [0x14] = KEY_RECORD,
-       [0x15] = KEY_STOP,
-       [0x16] = KEY_PLAY,
-       [0x17] = KEY_MUTE,
-
-       [0x18] = KEY_UP,
-       [0x19] = KEY_DOWN,
-       [0x1a] = KEY_LEFT,
-       [0x1b] = KEY_RIGHT,
-
-       [0x1c] = KEY_RED,
-       [0x1d] = KEY_GREEN,
-       [0x1e] = KEY_YELLOW,
-       [0x1f] = KEY_BLUE,
-};
-EXPORT_SYMBOL_GPL(ir_codes_kaiomy);
-
-IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE] = {
-       [0x20] = KEY_LIST,
-       [0x00] = KEY_POWER,
-       [0x28] = KEY_1,
-       [0x18] = KEY_2,
-       [0x38] = KEY_3,
-       [0x24] = KEY_4,
-       [0x14] = KEY_5,
-       [0x34] = KEY_6,
-       [0x2c] = KEY_7,
-       [0x1c] = KEY_8,
-       [0x3c] = KEY_9,
-       [0x12] = KEY_SUBTITLE,
-       [0x22] = KEY_0,
-       [0x32] = KEY_REWIND,
-       [0x3a] = KEY_SHUFFLE,
-       [0x02] = KEY_PRINT,
-       [0x11] = KEY_CHANNELDOWN,
-       [0x31] = KEY_CHANNELUP,
-       [0x0c] = KEY_ZOOM,
-       [0x1e] = KEY_VOLUMEDOWN,
-       [0x3e] = KEY_VOLUMEUP,
-       [0x0a] = KEY_MUTE,
-       [0x04] = KEY_AUDIO,
-       [0x26] = KEY_RECORD,
-       [0x06] = KEY_PLAY,
-       [0x36] = KEY_STOP,
-       [0x16] = KEY_PAUSE,
-       [0x2e] = KEY_REWIND,
-       [0x0e] = KEY_FASTFORWARD,
-       [0x30] = KEY_TEXT,
-       [0x21] = KEY_GREEN,
-       [0x01] = KEY_BLUE,
-       [0x08] = KEY_EPG,
-       [0x2a] = KEY_MENU,
-};
-EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d);
+static struct ir_scancode ir_codes_kaiomy[] = {
+       { 0x43, KEY_POWER2},
+       { 0x01, KEY_LIST},
+       { 0x0b, KEY_ZOOM},
+       { 0x03, KEY_POWER},
 
-/* Encore ENLTV-FM v5.3
-   Mauro Carvalho Chehab <mchehab@infradead.org>
- */
-IR_KEYTAB_TYPE ir_codes_encore_enltv_fm53[IR_KEYTAB_SIZE] = {
-       [0x10] = KEY_POWER2,
-       [0x06] = KEY_MUTE,
-
-       [0x09] = KEY_1,
-       [0x1d] = KEY_2,
-       [0x1f] = KEY_3,
-       [0x19] = KEY_4,
-       [0x1b] = KEY_5,
-       [0x11] = KEY_6,
-       [0x17] = KEY_7,
-       [0x12] = KEY_8,
-       [0x16] = KEY_9,
-       [0x48] = KEY_0,
-
-       [0x04] = KEY_LIST,              /* -/-- */
-       [0x40] = KEY_LAST,              /* recall */
-
-       [0x02] = KEY_MODE,              /* TV/AV */
-       [0x05] = KEY_SHUFFLE,           /* SNAPSHOT */
-
-       [0x4c] = KEY_CHANNELUP,         /* UP */
-       [0x00] = KEY_CHANNELDOWN,       /* DOWN */
-       [0x0d] = KEY_VOLUMEUP,          /* RIGHT */
-       [0x15] = KEY_VOLUMEDOWN,        /* LEFT */
-       [0x49] = KEY_ENTER,             /* OK */
-
-       [0x54] = KEY_RECORD,
-       [0x4d] = KEY_PLAY,              /* pause */
-
-       [0x1e] = KEY_UP,                /* video setting */
-       [0x0e] = KEY_RIGHT,             /* <- */
-       [0x1a] = KEY_LEFT,              /* -> */
-
-       [0x0a] = KEY_DOWN,              /* video default */
-       [0x0c] = KEY_ZOOM,              /* hide pannel */
-       [0x47] = KEY_SLEEP,             /* shutdown */
-};
-EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_fm53);
+       { 0x04, KEY_1},
+       { 0x08, KEY_2},
+       { 0x02, KEY_3},
 
-/* Zogis Real Audio 220 - 32 keys IR */
-IR_KEYTAB_TYPE ir_codes_real_audio_220_32_keys[IR_KEYTAB_SIZE] = {
-       [0x1c] = KEY_RADIO,
-       [0x12] = KEY_POWER2,
+       { 0x0f, KEY_4},
+       { 0x05, KEY_5},
+       { 0x06, KEY_6},
+
+       { 0x0c, KEY_7},
+       { 0x0d, KEY_8},
+       { 0x0a, KEY_9},
 
-       [0x01] = KEY_1,
-       [0x02] = KEY_2,
-       [0x03] = KEY_3,
-       [0x04] = KEY_4,
-       [0x05] = KEY_5,
-       [0x06] = KEY_6,
-       [0x07] = KEY_7,
-       [0x08] = KEY_8,
-       [0x09] = KEY_9,
-       [0x00] = KEY_0,
+       { 0x11, KEY_0},
 
-       [0x0c] = KEY_VOLUMEUP,
-       [0x18] = KEY_VOLUMEDOWN,
-       [0x0b] = KEY_CHANNELUP,
-       [0x15] = KEY_CHANNELDOWN,
-       [0x16] = KEY_ENTER,
+       { 0x09, KEY_CHANNELUP},
+       { 0x07, KEY_CHANNELDOWN},
 
-       [0x11] = KEY_LIST,              /* Source */
-       [0x0d] = KEY_AUDIO,             /* stereo */
+       { 0x0e, KEY_VOLUMEUP},
+       { 0x13, KEY_VOLUMEDOWN},
 
-       [0x0f] = KEY_PREVIOUS,          /* Prev */
-       [0x1b] = KEY_PAUSE,             /* Timeshift */
-       [0x1a] = KEY_NEXT,              /* Next */
+       { 0x10, KEY_HOME},
+       { 0x12, KEY_ENTER},
 
-       [0x0e] = KEY_STOP,
-       [0x1f] = KEY_PLAY,
-       [0x1e] = KEY_PLAYPAUSE,         /* Pause */
+       { 0x14, KEY_RECORD},
+       { 0x15, KEY_STOP},
+       { 0x16, KEY_PLAY},
+       { 0x17, KEY_MUTE},
 
-       [0x1d] = KEY_RECORD,
-       [0x13] = KEY_MUTE,
-       [0x19] = KEY_SHUFFLE,           /* Snapshot */
+       { 0x18, KEY_UP},
+       { 0x19, KEY_DOWN},
+       { 0x1a, KEY_LEFT},
+       { 0x1b, KEY_RIGHT},
 
+       { 0x1c, KEY_RED},
+       { 0x1d, KEY_GREEN},
+       { 0x1e, KEY_YELLOW},
+       { 0x1f, KEY_BLUE},
+};
+struct ir_scancode_table ir_codes_kaiomy_table = {
+       .scan = ir_codes_kaiomy,
+       .size = ARRAY_SIZE(ir_codes_kaiomy),
+};
+EXPORT_SYMBOL_GPL(ir_codes_kaiomy_table);
+
+static struct ir_scancode ir_codes_avermedia_a16d[] = {
+       { 0x20, KEY_LIST},
+       { 0x00, KEY_POWER},
+       { 0x28, KEY_1},
+       { 0x18, KEY_2},
+       { 0x38, KEY_3},
+       { 0x24, KEY_4},
+       { 0x14, KEY_5},
+       { 0x34, KEY_6},
+       { 0x2c, KEY_7},
+       { 0x1c, KEY_8},
+       { 0x3c, KEY_9},
+       { 0x12, KEY_SUBTITLE},
+       { 0x22, KEY_0},
+       { 0x32, KEY_REWIND},
+       { 0x3a, KEY_SHUFFLE},
+       { 0x02, KEY_PRINT},
+       { 0x11, KEY_CHANNELDOWN},
+       { 0x31, KEY_CHANNELUP},
+       { 0x0c, KEY_ZOOM},
+       { 0x1e, KEY_VOLUMEDOWN},
+       { 0x3e, KEY_VOLUMEUP},
+       { 0x0a, KEY_MUTE},
+       { 0x04, KEY_AUDIO},
+       { 0x26, KEY_RECORD},
+       { 0x06, KEY_PLAY},
+       { 0x36, KEY_STOP},
+       { 0x16, KEY_PAUSE},
+       { 0x2e, KEY_REWIND},
+       { 0x0e, KEY_FASTFORWARD},
+       { 0x30, KEY_TEXT},
+       { 0x21, KEY_GREEN},
+       { 0x01, KEY_BLUE},
+       { 0x08, KEY_EPG},
+       { 0x2a, KEY_MENU},
+};
+struct ir_scancode_table ir_codes_avermedia_a16d_table = {
+       .scan = ir_codes_avermedia_a16d,
+       .size = ARRAY_SIZE(ir_codes_avermedia_a16d),
 };
-EXPORT_SYMBOL_GPL(ir_codes_real_audio_220_32_keys);
+EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d_table);
+
+/* Encore ENLTV-FM v5.3
+   Mauro Carvalho Chehab <mchehab@infradead.org>
+ */
+static struct ir_scancode ir_codes_encore_enltv_fm53[] = {
+       { 0x10, KEY_POWER2},
+       { 0x06, KEY_MUTE},
+
+       { 0x09, KEY_1},
+       { 0x1d, KEY_2},
+       { 0x1f, KEY_3},
+       { 0x19, KEY_4},
+       { 0x1b, KEY_5},
+       { 0x11, KEY_6},
+       { 0x17, KEY_7},
+       { 0x12, KEY_8},
+       { 0x16, KEY_9},
+       { 0x48, KEY_0},
+
+       { 0x04, KEY_LIST},              /* -/-- */
+       { 0x40, KEY_LAST},              /* recall */
+
+       { 0x02, KEY_MODE},              /* TV/AV */
+       { 0x05, KEY_CAMERA},            /* SNAPSHOT */
+
+       { 0x4c, KEY_CHANNELUP},         /* UP */
+       { 0x00, KEY_CHANNELDOWN},       /* DOWN */
+       { 0x0d, KEY_VOLUMEUP},          /* RIGHT */
+       { 0x15, KEY_VOLUMEDOWN},        /* LEFT */
+       { 0x49, KEY_ENTER},             /* OK */
+
+       { 0x54, KEY_RECORD},
+       { 0x4d, KEY_PLAY},              /* pause */
+
+       { 0x1e, KEY_MENU},              /* video setting */
+       { 0x0e, KEY_RIGHT},             /* <- */
+       { 0x1a, KEY_LEFT},              /* -> */
+
+       { 0x0a, KEY_CLEAR},             /* video default */
+       { 0x0c, KEY_ZOOM},              /* hide pannel */
+       { 0x47, KEY_SLEEP},             /* shutdown */
+};
+struct ir_scancode_table ir_codes_encore_enltv_fm53_table = {
+       .scan = ir_codes_encore_enltv_fm53,
+       .size = ARRAY_SIZE(ir_codes_encore_enltv_fm53),
+};
+EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_fm53_table);
+
+/* Zogis Real Audio 220 - 32 keys IR */
+static struct ir_scancode ir_codes_real_audio_220_32_keys[] = {
+       { 0x1c, KEY_RADIO},
+       { 0x12, KEY_POWER2},
+
+       { 0x01, KEY_1},
+       { 0x02, KEY_2},
+       { 0x03, KEY_3},
+       { 0x04, KEY_4},
+       { 0x05, KEY_5},
+       { 0x06, KEY_6},
+       { 0x07, KEY_7},
+       { 0x08, KEY_8},
+       { 0x09, KEY_9},
+       { 0x00, KEY_0},
+
+       { 0x0c, KEY_VOLUMEUP},
+       { 0x18, KEY_VOLUMEDOWN},
+       { 0x0b, KEY_CHANNELUP},
+       { 0x15, KEY_CHANNELDOWN},
+       { 0x16, KEY_ENTER},
+
+       { 0x11, KEY_LIST},              /* Source */
+       { 0x0d, KEY_AUDIO},             /* stereo */
+
+       { 0x0f, KEY_PREVIOUS},          /* Prev */
+       { 0x1b, KEY_TIME},              /* Timeshift */
+       { 0x1a, KEY_NEXT},              /* Next */
+
+       { 0x0e, KEY_STOP},
+       { 0x1f, KEY_PLAY},
+       { 0x1e, KEY_PLAYPAUSE},         /* Pause */
+
+       { 0x1d, KEY_RECORD},
+       { 0x13, KEY_MUTE},
+       { 0x19, KEY_CAMERA},            /* Snapshot */
+
+};
+struct ir_scancode_table ir_codes_real_audio_220_32_keys_table = {
+       .scan = ir_codes_real_audio_220_32_keys,
+       .size = ARRAY_SIZE(ir_codes_real_audio_220_32_keys),
+};
+EXPORT_SYMBOL_GPL(ir_codes_real_audio_220_32_keys_table);
 
 /* ATI TV Wonder HD 600 USB
    Devin Heitmueller <devin.heitmueller@gmail.com>
  */
-IR_KEYTAB_TYPE ir_codes_ati_tv_wonder_hd_600[IR_KEYTAB_SIZE] = {
-       [0x00] = KEY_RECORD,            /* Row 1 */
-       [0x01] = KEY_PLAYPAUSE,
-       [0x02] = KEY_STOP,
-       [0x03] = KEY_POWER,
-       [0x04] = KEY_PREVIOUS,  /* Row 2 */
-       [0x05] = KEY_REWIND,
-       [0x06] = KEY_FORWARD,
-       [0x07] = KEY_NEXT,
-       [0x08] = KEY_EPG,               /* Row 3 */
-       [0x09] = KEY_HOME,
-       [0x0a] = KEY_MENU,
-       [0x0b] = KEY_CHANNELUP,
-       [0x0c] = KEY_BACK,              /* Row 4 */
-       [0x0d] = KEY_UP,
-       [0x0e] = KEY_INFO,
-       [0x0f] = KEY_CHANNELDOWN,
-       [0x10] = KEY_LEFT,              /* Row 5 */
-       [0x11] = KEY_SELECT,
-       [0x12] = KEY_RIGHT,
-       [0x13] = KEY_VOLUMEUP,
-       [0x14] = KEY_LAST,              /* Row 6 */
-       [0x15] = KEY_DOWN,
-       [0x16] = KEY_MUTE,
-       [0x17] = KEY_VOLUMEDOWN,
-};
-
-EXPORT_SYMBOL_GPL(ir_codes_ati_tv_wonder_hd_600);
+static struct ir_scancode ir_codes_ati_tv_wonder_hd_600[] = {
+       { 0x00, KEY_RECORD},            /* Row 1 */
+       { 0x01, KEY_PLAYPAUSE},
+       { 0x02, KEY_STOP},
+       { 0x03, KEY_POWER},
+       { 0x04, KEY_PREVIOUS},  /* Row 2 */
+       { 0x05, KEY_REWIND},
+       { 0x06, KEY_FORWARD},
+       { 0x07, KEY_NEXT},
+       { 0x08, KEY_EPG},               /* Row 3 */
+       { 0x09, KEY_HOME},
+       { 0x0a, KEY_MENU},
+       { 0x0b, KEY_CHANNELUP},
+       { 0x0c, KEY_BACK},              /* Row 4 */
+       { 0x0d, KEY_UP},
+       { 0x0e, KEY_INFO},
+       { 0x0f, KEY_CHANNELDOWN},
+       { 0x10, KEY_LEFT},              /* Row 5 */
+       { 0x11, KEY_SELECT},
+       { 0x12, KEY_RIGHT},
+       { 0x13, KEY_VOLUMEUP},
+       { 0x14, KEY_LAST},              /* Row 6 */
+       { 0x15, KEY_DOWN},
+       { 0x16, KEY_MUTE},
+       { 0x17, KEY_VOLUMEDOWN},
+};
+struct ir_scancode_table ir_codes_ati_tv_wonder_hd_600_table = {
+       .scan = ir_codes_ati_tv_wonder_hd_600,
+       .size = ARRAY_SIZE(ir_codes_ati_tv_wonder_hd_600),
+};
+EXPORT_SYMBOL_GPL(ir_codes_ati_tv_wonder_hd_600_table);
 
 /* DVBWorld remotes
    Igor M. Liplianin <liplianin@me.by>
  */
-IR_KEYTAB_TYPE ir_codes_dm1105_nec[IR_KEYTAB_SIZE] = {
-       [0x0a] = KEY_Q,         /*power*/
-       [0x0c] = KEY_M,         /*mute*/
-       [0x11] = KEY_1,
-       [0x12] = KEY_2,
-       [0x13] = KEY_3,
-       [0x14] = KEY_4,
-       [0x15] = KEY_5,
-       [0x16] = KEY_6,
-       [0x17] = KEY_7,
-       [0x18] = KEY_8,
-       [0x19] = KEY_9,
-       [0x10] = KEY_0,
-       [0x1c] = KEY_PAGEUP,    /*ch+*/
-       [0x0f] = KEY_PAGEDOWN,  /*ch-*/
-       [0x1a] = KEY_O,         /*vol+*/
-       [0x0e] = KEY_Z,         /*vol-*/
-       [0x04] = KEY_R,         /*rec*/
-       [0x09] = KEY_D,         /*fav*/
-       [0x08] = KEY_BACKSPACE, /*rewind*/
-       [0x07] = KEY_A,         /*fast*/
-       [0x0b] = KEY_P,         /*pause*/
-       [0x02] = KEY_ESC,       /*cancel*/
-       [0x03] = KEY_G,         /*tab*/
-       [0x00] = KEY_UP,        /*up*/
-       [0x1f] = KEY_ENTER,     /*ok*/
-       [0x01] = KEY_DOWN,      /*down*/
-       [0x05] = KEY_C,         /*cap*/
-       [0x06] = KEY_S,         /*stop*/
-       [0x40] = KEY_F,         /*full*/
-       [0x1e] = KEY_W,         /*tvmode*/
-       [0x1b] = KEY_B,         /*recall*/
-};
-EXPORT_SYMBOL_GPL(ir_codes_dm1105_nec);
+static struct ir_scancode ir_codes_dm1105_nec[] = {
+       { 0x0a, KEY_POWER2},            /* power */
+       { 0x0c, KEY_MUTE},              /* mute */
+       { 0x11, KEY_1},
+       { 0x12, KEY_2},
+       { 0x13, KEY_3},
+       { 0x14, KEY_4},
+       { 0x15, KEY_5},
+       { 0x16, KEY_6},
+       { 0x17, KEY_7},
+       { 0x18, KEY_8},
+       { 0x19, KEY_9},
+       { 0x10, KEY_0},
+       { 0x1c, KEY_CHANNELUP},         /* ch+ */
+       { 0x0f, KEY_CHANNELDOWN},       /* ch- */
+       { 0x1a, KEY_VOLUMEUP},          /* vol+ */
+       { 0x0e, KEY_VOLUMEDOWN},        /* vol- */
+       { 0x04, KEY_RECORD},            /* rec */
+       { 0x09, KEY_CHANNEL},           /* fav */
+       { 0x08, KEY_BACKSPACE},         /* rewind */
+       { 0x07, KEY_FASTFORWARD},       /* fast */
+       { 0x0b, KEY_PAUSE},             /* pause */
+       { 0x02, KEY_ESC},               /* cancel */
+       { 0x03, KEY_TAB},               /* tab */
+       { 0x00, KEY_UP},                /* up */
+       { 0x1f, KEY_ENTER},             /* ok */
+       { 0x01, KEY_DOWN},              /* down */
+       { 0x05, KEY_RECORD},            /* cap */
+       { 0x06, KEY_STOP},              /* stop */
+       { 0x40, KEY_ZOOM},              /* full */
+       { 0x1e, KEY_TV},                /* tvmode */
+       { 0x1b, KEY_B},                 /* recall */
+};
+struct ir_scancode_table ir_codes_dm1105_nec_table = {
+       .scan = ir_codes_dm1105_nec,
+       .size = ARRAY_SIZE(ir_codes_dm1105_nec),
+};
+EXPORT_SYMBOL_GPL(ir_codes_dm1105_nec_table);
+
+/* Terratec Cinergy Hybrid T USB XS
+   Devin Heitmueller <dheitmueller@linuxtv.org>
+ */
+static struct ir_scancode ir_codes_terratec_cinergy_xs[] = {
+       { 0x41, KEY_HOME},
+       { 0x01, KEY_POWER},
+       { 0x42, KEY_MENU},
+       { 0x02, KEY_1},
+       { 0x03, KEY_2},
+       { 0x04, KEY_3},
+       { 0x43, KEY_SUBTITLE},
+       { 0x05, KEY_4},
+       { 0x06, KEY_5},
+       { 0x07, KEY_6},
+       { 0x44, KEY_TEXT},
+       { 0x08, KEY_7},
+       { 0x09, KEY_8},
+       { 0x0a, KEY_9},
+       { 0x45, KEY_DELETE},
+       { 0x0b, KEY_TUNER},
+       { 0x0c, KEY_0},
+       { 0x0d, KEY_MODE},
+       { 0x46, KEY_TV},
+       { 0x47, KEY_DVD},
+       { 0x49, KEY_VIDEO},
+       { 0x4b, KEY_AUX},
+       { 0x10, KEY_UP},
+       { 0x11, KEY_LEFT},
+       { 0x12, KEY_OK},
+       { 0x13, KEY_RIGHT},
+       { 0x14, KEY_DOWN},
+       { 0x0f, KEY_EPG},
+       { 0x16, KEY_INFO},
+       { 0x4d, KEY_BACKSPACE},
+       { 0x1c, KEY_VOLUMEUP},
+       { 0x4c, KEY_PLAY},
+       { 0x1b, KEY_CHANNELUP},
+       { 0x1e, KEY_VOLUMEDOWN},
+       { 0x1d, KEY_MUTE},
+       { 0x1f, KEY_CHANNELDOWN},
+       { 0x17, KEY_RED},
+       { 0x18, KEY_GREEN},
+       { 0x19, KEY_YELLOW},
+       { 0x1a, KEY_BLUE},
+       { 0x58, KEY_RECORD},
+       { 0x48, KEY_STOP},
+       { 0x40, KEY_PAUSE},
+       { 0x54, KEY_LAST},
+       { 0x4e, KEY_REWIND},
+       { 0x4f, KEY_FASTFORWARD},
+       { 0x5c, KEY_NEXT},
+};
+struct ir_scancode_table ir_codes_terratec_cinergy_xs_table = {
+       .scan = ir_codes_terratec_cinergy_xs,
+       .size = ARRAY_SIZE(ir_codes_terratec_cinergy_xs),
+};
+EXPORT_SYMBOL_GPL(ir_codes_terratec_cinergy_xs_table);
 
 /* EVGA inDtube
    Devin Heitmueller <devin.heitmueller@gmail.com>
  */
-IR_KEYTAB_TYPE ir_codes_evga_indtube[IR_KEYTAB_SIZE] = {
-       [0x12] = KEY_POWER,
-       [0x02] = KEY_MODE,      /* TV */
-       [0x14] = KEY_MUTE,
-       [0x1a] = KEY_CHANNELUP,
-       [0x16] = KEY_TV2,       /* PIP */
-       [0x1d] = KEY_VOLUMEUP,
-       [0x05] = KEY_CHANNELDOWN,
-       [0x0f] = KEY_PLAYPAUSE,
-       [0x19] = KEY_VOLUMEDOWN,
-       [0x1c] = KEY_REWIND,
-       [0x0d] = KEY_RECORD,
-       [0x18] = KEY_FORWARD,
-       [0x1e] = KEY_PREVIOUS,
-       [0x1b] = KEY_STOP,
-       [0x1f] = KEY_NEXT,
-       [0x13] = KEY_CAMERA,
-};
-EXPORT_SYMBOL_GPL(ir_codes_evga_indtube);
+static struct ir_scancode ir_codes_evga_indtube[] = {
+       { 0x12, KEY_POWER},
+       { 0x02, KEY_MODE},      /* TV */
+       { 0x14, KEY_MUTE},
+       { 0x1a, KEY_CHANNELUP},
+       { 0x16, KEY_TV2},       /* PIP */
+       { 0x1d, KEY_VOLUMEUP},
+       { 0x05, KEY_CHANNELDOWN},
+       { 0x0f, KEY_PLAYPAUSE},
+       { 0x19, KEY_VOLUMEDOWN},
+       { 0x1c, KEY_REWIND},
+       { 0x0d, KEY_RECORD},
+       { 0x18, KEY_FORWARD},
+       { 0x1e, KEY_PREVIOUS},
+       { 0x1b, KEY_STOP},
+       { 0x1f, KEY_NEXT},
+       { 0x13, KEY_CAMERA},
+};
+struct ir_scancode_table ir_codes_evga_indtube_table = {
+       .scan = ir_codes_evga_indtube,
+       .size = ARRAY_SIZE(ir_codes_evga_indtube),
+};
+EXPORT_SYMBOL_GPL(ir_codes_evga_indtube_table);
+
+static struct ir_scancode ir_codes_videomate_s350[] = {
+       { 0x00, KEY_TV},
+       { 0x01, KEY_DVD},
+       { 0x04, KEY_RECORD},
+       { 0x05, KEY_VIDEO},     /* TV/Video */
+       { 0x07, KEY_STOP},
+       { 0x08, KEY_PLAYPAUSE},
+       { 0x0a, KEY_REWIND},
+       { 0x0f, KEY_FASTFORWARD},
+       { 0x10, KEY_CHANNELUP},
+       { 0x12, KEY_VOLUMEUP},
+       { 0x13, KEY_CHANNELDOWN},
+       { 0x14, KEY_MUTE},
+       { 0x15, KEY_VOLUMEDOWN},
+       { 0x16, KEY_1},
+       { 0x17, KEY_2},
+       { 0x18, KEY_3},
+       { 0x19, KEY_4},
+       { 0x1a, KEY_5},
+       { 0x1b, KEY_6},
+       { 0x1c, KEY_7},
+       { 0x1d, KEY_8},
+       { 0x1e, KEY_9},
+       { 0x1f, KEY_0},
+       { 0x21, KEY_SLEEP},
+       { 0x24, KEY_ZOOM},
+       { 0x25, KEY_LAST},      /* Recall */
+       { 0x26, KEY_SUBTITLE},  /* CC */
+       { 0x27, KEY_LANGUAGE},  /* MTS */
+       { 0x29, KEY_CHANNEL},   /* SURF */
+       { 0x2b, KEY_A},
+       { 0x2c, KEY_B},
+       { 0x2f, KEY_CAMERA},    /* Snapshot */
+       { 0x23, KEY_RADIO},
+       { 0x02, KEY_PREVIOUSSONG},
+       { 0x06, KEY_NEXTSONG},
+       { 0x03, KEY_EPG},
+       { 0x09, KEY_SETUP},
+       { 0x22, KEY_BACKSPACE},
+       { 0x0c, KEY_UP},
+       { 0x0e, KEY_DOWN},
+       { 0x0b, KEY_LEFT},
+       { 0x0d, KEY_RIGHT},
+       { 0x11, KEY_ENTER},
+       { 0x20, KEY_TEXT},
+};
+struct ir_scancode_table ir_codes_videomate_s350_table = {
+       .scan = ir_codes_videomate_s350,
+       .size = ARRAY_SIZE(ir_codes_videomate_s350),
+};
+EXPORT_SYMBOL_GPL(ir_codes_videomate_s350_table);
+
+/* GADMEI UTV330+ RM008Z remote
+   Shine Liu <shinel@foxmail.com>
+ */
+static struct ir_scancode ir_codes_gadmei_rm008z[] = {
+       { 0x14, KEY_POWER2},            /* POWER OFF */
+       { 0x0c, KEY_MUTE},              /* MUTE */
+
+       { 0x18, KEY_TV},                /* TV */
+       { 0x0e, KEY_VIDEO},             /* AV */
+       { 0x0b, KEY_AUDIO},             /* SV */
+       { 0x0f, KEY_RADIO},             /* FM */
+
+       { 0x00, KEY_1},
+       { 0x01, KEY_2},
+       { 0x02, KEY_3},
+       { 0x03, KEY_4},
+       { 0x04, KEY_5},
+       { 0x05, KEY_6},
+       { 0x06, KEY_7},
+       { 0x07, KEY_8},
+       { 0x08, KEY_9},
+       { 0x09, KEY_0},
+       { 0x0a, KEY_INFO},              /* OSD */
+       { 0x1c, KEY_BACKSPACE},         /* LAST */
+
+       { 0x0d, KEY_PLAY},              /* PLAY */
+       { 0x1e, KEY_CAMERA},            /* SNAPSHOT */
+       { 0x1a, KEY_RECORD},            /* RECORD */
+       { 0x17, KEY_STOP},              /* STOP */
+
+       { 0x1f, KEY_UP},                /* UP */
+       { 0x44, KEY_DOWN},              /* DOWN */
+       { 0x46, KEY_TAB},               /* BACK */
+       { 0x4a, KEY_ZOOM},              /* FULLSECREEN */
+
+       { 0x10, KEY_VOLUMEUP},          /* VOLUMEUP */
+       { 0x11, KEY_VOLUMEDOWN},        /* VOLUMEDOWN */
+       { 0x12, KEY_CHANNELUP},         /* CHANNELUP */
+       { 0x13, KEY_CHANNELDOWN},       /* CHANNELDOWN */
+       { 0x15, KEY_ENTER},             /* OK */
+};
+struct ir_scancode_table ir_codes_gadmei_rm008z_table = {
+       .scan = ir_codes_gadmei_rm008z,
+       .size = ARRAY_SIZE(ir_codes_gadmei_rm008z),
+};
+EXPORT_SYMBOL_GPL(ir_codes_gadmei_rm008z_table);
index b10935630154f94b4845c15f4abf314cdf9eb4ee..bc4b004ba7dbed45f3a07ff0ef4d4411fa159737 100644 (file)
@@ -27,7 +27,7 @@ module_param_named(debug, tda18271_debug, int, 0644);
 MODULE_PARM_DESC(debug, "set debug level "
                 "(info=1, map=2, reg=4, adv=8, cal=16 (or-able))");
 
-static int tda18271_cal_on_startup;
+static int tda18271_cal_on_startup = -1;
 module_param_named(cal, tda18271_cal_on_startup, int, 0644);
 MODULE_PARM_DESC(cal, "perform RF tracking filter calibration on startup");
 
@@ -1192,10 +1192,25 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
        case 0:
                goto fail;
        case 1:
+       {
                /* new tuner instance */
+               int rf_cal_on_startup;
+
                priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
                priv->role = (cfg) ? cfg->role : TDA18271_MASTER;
                priv->config = (cfg) ? cfg->config : 0;
+
+               /* tda18271_cal_on_startup == -1 when cal
+                * module option is unset */
+               if (tda18271_cal_on_startup == -1) {
+                       /* honor attach-time configuration */
+                       rf_cal_on_startup =
+                               ((cfg) && (cfg->rf_cal_on_startup)) ? 1 : 0;
+               } else {
+                       /* module option overrides attach configuration */
+                       rf_cal_on_startup = tda18271_cal_on_startup;
+               }
+
                priv->cal_initialized = false;
                mutex_init(&priv->lock);
 
@@ -1213,11 +1228,12 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
                mutex_lock(&priv->lock);
                tda18271_init_regs(fe);
 
-               if ((tda18271_cal_on_startup) && (priv->id == TDA18271HDC2))
+               if ((rf_cal_on_startup) && (priv->id == TDA18271HDC2))
                        tda18271c2_rf_cal_init(fe);
 
                mutex_unlock(&priv->lock);
                break;
+       }
        default:
                /* existing tuner instance */
                fe->tuner_priv = priv;
index 74beb28806f85bef0cb7ad13cf06bcb0804b1547..e6a80ad0935688a1ddae48a4e1c4655114fe357b 100644 (file)
@@ -137,17 +137,17 @@ extern int tda18271_debug;
 #define tda_printk(kern, fmt, arg...) \
        printk(kern "%s: " fmt, __func__, ##arg)
 
-#define dprintk(kern, lvl, fmt, arg...) do {\
+#define tda_dprintk(lvl, fmt, arg...) do {\
        if (tda18271_debug & lvl) \
-               tda_printk(kern, fmt, ##arg); } while (0)
-
-#define tda_info(fmt, arg...) printk(KERN_INFO              fmt, ##arg)
-#define tda_warn(fmt, arg...) tda_printk(KERN_WARNING,      fmt, ##arg)
-#define tda_err(fmt, arg...)  tda_printk(KERN_ERR,          fmt, ##arg)
-#define tda_dbg(fmt, arg...)  dprintk(KERN_DEBUG, DBG_INFO, fmt, ##arg)
-#define tda_map(fmt, arg...)  dprintk(KERN_DEBUG, DBG_MAP,  fmt, ##arg)
-#define tda_reg(fmt, arg...)  dprintk(KERN_DEBUG, DBG_REG,  fmt, ##arg)
-#define tda_cal(fmt, arg...)  dprintk(KERN_DEBUG, DBG_CAL,  fmt, ##arg)
+               tda_printk(KERN_DEBUG, fmt, ##arg); } while (0)
+
+#define tda_info(fmt, arg...)     printk(KERN_INFO     fmt, ##arg)
+#define tda_warn(fmt, arg...) tda_printk(KERN_WARNING, fmt, ##arg)
+#define tda_err(fmt, arg...)  tda_printk(KERN_ERR,     fmt, ##arg)
+#define tda_dbg(fmt, arg...)  tda_dprintk(DBG_INFO,    fmt, ##arg)
+#define tda_map(fmt, arg...)  tda_dprintk(DBG_MAP,     fmt, ##arg)
+#define tda_reg(fmt, arg...)  tda_dprintk(DBG_REG,     fmt, ##arg)
+#define tda_cal(fmt, arg...)  tda_dprintk(DBG_CAL,     fmt, ##arg)
 
 #define tda_fail(ret)                                                       \
 ({                                                                          \
index 53a9892a18d0fd6ca7c19bf0b1979a7a26155d4e..71bac9593f1ea9246b64a3eb178fca0342fe3d83 100644 (file)
@@ -77,6 +77,9 @@ struct tda18271_config {
        /* use i2c gate provided by analog or digital demod */
        enum tda18271_i2c_gate gate;
 
+       /* force rf tracking filter calibration on startup */
+       unsigned int rf_cal_on_startup:1;
+
        /* some i2c providers cant write all 39 registers at once */
        unsigned int small_i2c:1;
 
index 149d54cdf7b97a4ff92107e3afffbb1c773a1ddc..8abbcc5fcf9542f5787e7dae940441f3dc3a38df 100644 (file)
@@ -144,6 +144,8 @@ static inline int tuner_stereo(const int type, const int status)
        case TUNER_LG_NTSC_TAPE:
        case TUNER_TCL_MF02GIP_5N:
                return ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
+       case TUNER_PHILIPS_FM1216MK5:
+               return status | TUNER_STEREO;
        default:
                return status & TUNER_STEREO;
        }
@@ -508,6 +510,10 @@ static int simple_radio_bandswitch(struct dvb_frontend *fe, u8 *buffer)
        case TUNER_TCL_MF02GIP_5N:
                buffer[3] = 0x19;
                break;
+       case TUNER_PHILIPS_FM1216MK5:
+               buffer[2] = 0x88;
+               buffer[3] = 0x09;
+               break;
        case TUNER_TNF_5335MF:
                buffer[3] = 0x11;
                break;
index 6a7f1a417c278eff34d835029b4894fde8cedd48..5c6ef1e23c94367d4cde56f3370fb12ac35671f2 100644 (file)
@@ -1301,6 +1301,25 @@ static struct tuner_params tuner_fq1216lme_mk3_params[] = {
        },
 };
 
+/* ----- TUNER_PARTSNIC_PTI_5NF05 - Partsnic (Daewoo) PTI-5NF05 NTSC ----- */
+
+static struct tuner_range tuner_partsnic_pti_5nf05_ranges[] = {
+       /* The datasheet specified channel ranges and the bandswitch byte */
+       /* The control byte value of 0x8e is just a guess */
+       { 16 * 133.25 /*MHz*/, 0x8e, 0x01, }, /* Channels    2 -    B */
+       { 16 * 367.25 /*MHz*/, 0x8e, 0x02, }, /* Channels    C - W+11 */
+       { 16 * 999.99        , 0x8e, 0x08, }, /* Channels W+12 -   69 */
+};
+
+static struct tuner_params tuner_partsnic_pti_5nf05_params[] = {
+       {
+               .type   = TUNER_PARAM_TYPE_NTSC,
+               .ranges = tuner_partsnic_pti_5nf05_ranges,
+               .count  = ARRAY_SIZE(tuner_partsnic_pti_5nf05_ranges),
+               .cb_first_if_lower_freq = 1, /* not specified but safe to do */
+       },
+};
+
 /* --------------------------------------------------------------------- */
 
 struct tunertype tuners[] = {
@@ -1753,6 +1772,12 @@ struct tunertype tuners[] = {
                .params = tuner_fq1216lme_mk3_params,
                .count  = ARRAY_SIZE(tuner_fq1216lme_mk3_params),
        },
+
+       [TUNER_PARTSNIC_PTI_5NF05] = {
+               .name = "Partsnic (Daewoo) PTI-5NF05",
+               .params = tuner_partsnic_pti_5nf05_params,
+               .count  = ARRAY_SIZE(tuner_partsnic_pti_5nf05_params),
+       },
 };
 EXPORT_SYMBOL(tuners);
 
index b0198691892a4a4ecab85d7febccf554c5dfe381..1d0e4b1ef10c924faeab91e060862454ccde7776 100644 (file)
@@ -2,6 +2,19 @@
 # DVB device configuration
 #
 
+config DVB_MAX_ADAPTERS
+       int "maximum number of DVB/ATSC adapters"
+       depends on DVB_CORE
+       default 8
+       range 1 255
+       help
+         Maximum number of DVB/ATSC adapters. Increasing this number
+         increases the memory consumption of the DVB subsystem even
+         if a much lower number of DVB/ATSC adapters is present.
+         Only values in the range 4-32 are tested.
+
+         If you are unsure about this, use the default value 8
+
 config DVB_DYNAMIC_MINORS
        bool "Dynamic DVB minor allocation"
        depends on DVB_CORE
index 9a6307a347b21e7169a41f4f4a9d1ecbce15dd3f..850a6c606750240f502f82bdf25ca1ce3b675dc0 100644 (file)
@@ -66,7 +66,7 @@ static int flexcop_sleep(struct dvb_frontend* fe)
 #endif
 
 /* SkyStar2 DVB-S rev 2.3 */
-#if FE_SUPPORTED(MT312)
+#if FE_SUPPORTED(MT312) && FE_SUPPORTED(PLL)
 static int flexcop_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
 {
 /* u16 wz_half_period_for_45_mhz[] = { 0x01ff, 0x0154, 0x00ff, 0x00cc }; */
@@ -155,55 +155,34 @@ static struct mt312_config skystar23_samsung_tbdu18132_config = {
        .demod_address = 0x0e,
 };
 
-static int skystar23_samsung_tbdu18132_tuner_set_params(struct dvb_frontend *fe,
-       struct dvb_frontend_parameters *params)
-{
-       u8 buf[4];
-       u32 div;
-       struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = buf,
-       .len = sizeof(buf) };
-       struct flexcop_device *fc = fe->dvb->priv;
-       div = (params->frequency + (125/2)) / 125;
-
-       buf[0] = (div >> 8) & 0x7f;
-       buf[1] = (div >> 0) & 0xff;
-       buf[2] = 0x84 | ((div >> 10) & 0x60);
-       buf[3] = 0x80;
-
-       if (params->frequency < 1550000)
-               buf[3] |= 0x02;
-
-       if (fe->ops.i2c_gate_ctrl)
-               fe->ops.i2c_gate_ctrl(fe, 1);
-       if (i2c_transfer(&fc->fc_i2c_adap[0].i2c_adap, &msg, 1) != 1)
-               return -EIO;
-       return 0;
-}
-
 static int skystar2_rev23_attach(struct flexcop_device *fc,
        struct i2c_adapter *i2c)
 {
+       struct dvb_frontend_ops *ops;
+
        fc->fe = dvb_attach(mt312_attach, &skystar23_samsung_tbdu18132_config, i2c);
-       if (fc->fe != NULL) {
-               struct dvb_frontend_ops *ops = &fc->fe->ops;
-               ops->tuner_ops.set_params   =
-                       skystar23_samsung_tbdu18132_tuner_set_params;
-               ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd;
-               ops->diseqc_send_burst      = flexcop_diseqc_send_burst;
-               ops->set_tone               = flexcop_set_tone;
-               ops->set_voltage            = flexcop_set_voltage;
-               fc->fe_sleep                = ops->sleep;
-               ops->sleep                  = flexcop_sleep;
-               return 1;
-       }
-       return 0;
+       if (!fc->fe)
+               return 0;
+
+       if (!dvb_attach(dvb_pll_attach, fc->fe, 0x61, i2c,
+                       DVB_PLL_SAMSUNG_TBDU18132))
+               return 0;
+
+       ops = &fc->fe->ops;
+       ops->diseqc_send_master_cmd = flexcop_diseqc_send_master_cmd;
+       ops->diseqc_send_burst      = flexcop_diseqc_send_burst;
+       ops->set_tone               = flexcop_set_tone;
+       ops->set_voltage            = flexcop_set_voltage;
+       fc->fe_sleep                = ops->sleep;
+       ops->sleep                  = flexcop_sleep;
+       return 1;
 }
 #else
 #define skystar2_rev23_attach NULL
 #endif
 
 /* SkyStar2 DVB-S rev 2.6 */
-#if FE_SUPPORTED(STV0299)
+#if FE_SUPPORTED(STV0299) && FE_SUPPORTED(PLL)
 static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend *fe,
        u32 srate, u32 ratio)
 {
@@ -232,31 +211,6 @@ static int samsung_tbmu24112_set_symbol_rate(struct dvb_frontend *fe,
        return 0;
 }
 
-static int samsung_tbmu24112_tuner_set_params(struct dvb_frontend *fe,
-       struct dvb_frontend_parameters *params)
-{
-       u8 buf[4];
-       u32 div;
-       struct i2c_msg msg = {
-       .addr = 0x61, .flags = 0, .buf = buf, .len = sizeof(buf) };
-       struct flexcop_device *fc = fe->dvb->priv;
-       div = params->frequency / 125;
-
-       buf[0] = (div >> 8) & 0x7f;
-       buf[1] = div & 0xff;
-       buf[2] = 0x84; /* 0xC4 */
-       buf[3] = 0x08;
-
-       if (params->frequency < 1500000)
-               buf[3] |= 0x10;
-
-       if (fe->ops.i2c_gate_ctrl)
-               fe->ops.i2c_gate_ctrl(fe, 1);
-       if (i2c_transfer(&fc->fc_i2c_adap[0].i2c_adap, &msg, 1) != 1)
-               return -EIO;
-       return 0;
-}
-
 static u8 samsung_tbmu24112_inittab[] = {
        0x01, 0x15,
        0x02, 0x30,
@@ -318,15 +272,18 @@ static int skystar2_rev26_attach(struct flexcop_device *fc,
        struct i2c_adapter *i2c)
 {
        fc->fe = dvb_attach(stv0299_attach, &samsung_tbmu24112_config, i2c);
-       if (fc->fe != NULL) {
-               struct dvb_frontend_ops *ops  = &fc->fe->ops;
-               ops->tuner_ops.set_params = samsung_tbmu24112_tuner_set_params;
-               ops->set_voltage = flexcop_set_voltage;
-               fc->fe_sleep = ops->sleep;
-               ops->sleep = flexcop_sleep;
-               return 1;
-       }
-       return 0;
+       if (!fc->fe)
+               return 0;
+
+       if (!dvb_attach(dvb_pll_attach, fc->fe, 0x61, i2c,
+                       DVB_PLL_SAMSUNG_TBMU24112))
+               return 0;
+
+       fc->fe->ops.set_voltage = flexcop_set_voltage;
+       fc->fe_sleep = fc->fe->ops.sleep;
+       fc->fe->ops.sleep = flexcop_sleep;
+       return 1;
+
 }
 #else
 #define skystar2_rev26_attach NULL
@@ -421,7 +378,7 @@ static int skystar2_rev28_attach(struct flexcop_device *fc,
        if (!fc->fe)
                return 0;
 
-       i2c_tuner = cx24123_get_tuner_i2c_adapter(fc->fe);;
+       i2c_tuner = cx24123_get_tuner_i2c_adapter(fc->fe);
        if (!i2c_tuner)
                return 0;
 
@@ -449,7 +406,7 @@ static int skystar2_rev28_attach(struct flexcop_device *fc,
 #endif
 
 /* AirStar DVB-T */
-#if FE_SUPPORTED(MT352)
+#if FE_SUPPORTED(MT352) && FE_SUPPORTED(PLL)
 static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend *fe)
 {
        static u8 mt352_clock_config[] = { 0x89, 0x18, 0x2d };
@@ -467,32 +424,6 @@ static int samsung_tdtc9251dh0_demod_init(struct dvb_frontend *fe)
        return 0;
 }
 
-static int samsung_tdtc9251dh0_calc_regs(struct dvb_frontend *fe,
-       struct dvb_frontend_parameters *params, u8* pllbuf, int buf_len)
-{
-       u32 div;
-       unsigned char bs = 0;
-
-       if (buf_len < 5)
-               return -EINVAL;
-
-#define IF_FREQUENCYx6 217    /* 6 * 36.16666666667MHz */
-       div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;
-       if (params->frequency >= 48000000 && params->frequency <= 154000000) \
-               bs = 0x09;
-       if (params->frequency >= 161000000 && params->frequency <= 439000000) \
-               bs = 0x0a;
-       if (params->frequency >= 447000000 && params->frequency <= 863000000) \
-               bs = 0x08;
-
-       pllbuf[0] = 0x61;
-       pllbuf[1] = div >> 8;
-       pllbuf[2] = div & 0xff;
-       pllbuf[3] = 0xcc;
-       pllbuf[4] = bs;
-       return 5;
-}
-
 static struct mt352_config samsung_tdtc9251dh0_config = {
        .demod_address = 0x0f,
        .demod_init    = samsung_tdtc9251dh0_demod_init,
@@ -502,11 +433,11 @@ static int airstar_dvbt_attach(struct flexcop_device *fc,
        struct i2c_adapter *i2c)
 {
        fc->fe = dvb_attach(mt352_attach, &samsung_tdtc9251dh0_config, i2c);
-       if (fc->fe != NULL) {
-               fc->fe->ops.tuner_ops.calc_regs = samsung_tdtc9251dh0_calc_regs;
-               return 1;
-       }
-       return 0;
+       if (!fc->fe)
+               return 0;
+
+       return !!dvb_attach(dvb_pll_attach, fc->fe, 0x61, NULL,
+                           DVB_PLL_SAMSUNG_TDTC9251DH0);
 }
 #else
 #define airstar_dvbt_attach NULL
@@ -580,54 +511,7 @@ static int airstar_atsc3_attach(struct flexcop_device *fc,
 #endif
 
 /* CableStar2 DVB-C */
-#if FE_SUPPORTED(STV0297)
-static int alps_tdee4_stv0297_tuner_set_params(struct dvb_frontend* fe,
-               struct dvb_frontend_parameters *fep)
-{
-       struct flexcop_device *fc = fe->dvb->priv;
-       u8 buf[4];
-       u16 div;
-       int ret;
-
-/* 62.5 kHz * 10 */
-#define REF_FREQ    625
-#define FREQ_OFFSET 36125
-
-       div = ((fep->frequency/1000 + FREQ_OFFSET) * 10) / REF_FREQ;
-/* 4 MHz = 4000 KHz */
-
-       buf[0] = (u8)( div >> 8) & 0x7f;
-       buf[1] = (u8)        div & 0xff;
-
-/* F(osc) = N * Reference Freq. (62.5 kHz)
- * byte 2 :  0 N14 N13 N12 N11 N10 N9  N8
- * byte 3 : N7 N6  N5  N4  N3  N2  N1  N0
- * byte 4 : 1  *   *   AGD R3  R2  R1  R0
- * byte 5 : C1 *   RE  RTS BS4 BS3 BS2 BS1
- * AGD = 1, R3 R2 R1 R0 = 0 1 0 1 => byte 4 = 1**10101 = 0x95 */
-       buf[2] = 0x95;
-
-/* Range(MHz)  C1 *  RE RTS BS4 BS3 BS2 BS1  Byte 5
- *  47 - 153   0  *  0   0   0   0   0   1   0x01
- * 153 - 430   0  *  0   0   0   0   1   0   0x02
- * 430 - 822   0  *  0   0   1   0   0   0   0x08
- * 822 - 862   1  *  0   0   1   0   0   0   0x88 */
-
-            if (fep->frequency <= 153000000) buf[3] = 0x01;
-       else if (fep->frequency <= 430000000) buf[3] = 0x02;
-       else if (fep->frequency <= 822000000) buf[3] = 0x08;
-       else buf[3] = 0x88;
-
-       if (fe->ops.i2c_gate_ctrl)
-               fe->ops.i2c_gate_ctrl(fe, 0);
-       deb_tuner("tuner buffer for %d Hz: %x %x %x %x\n", fep->frequency,
-       buf[0], buf[1], buf[2], buf[3]);
-       ret = fc->i2c_request(&fc->fc_i2c_adap[2],
-                       FC_WRITE, 0x61, buf[0], &buf[1], 3);
-       deb_tuner("tuner write returned: %d\n",ret);
-       return ret;
-}
-
+#if FE_SUPPORTED(STV0297) && FE_SUPPORTED(PLL)
 static u8 alps_tdee4_stv0297_inittab[] = {
        0x80, 0x01,
        0x80, 0x00,
@@ -711,13 +595,25 @@ static int cablestar2_attach(struct flexcop_device *fc,
 {
        fc->fc_i2c_adap[0].no_base_addr = 1;
        fc->fe = dvb_attach(stv0297_attach, &alps_tdee4_stv0297_config, i2c);
-       if (!fc->fe) {
-               /* Reset for next frontend to try */
-               fc->fc_i2c_adap[0].no_base_addr = 0;
-               return 0;
-       }
-       fc->fe->ops.tuner_ops.set_params = alps_tdee4_stv0297_tuner_set_params;
+       if (!fc->fe)
+               goto fail;
+
+       /* This tuner doesn't use the stv0297's I2C gate, but instead the
+        * tuner is connected to a different flexcop I2C adapter.  */
+       if (fc->fe->ops.i2c_gate_ctrl)
+               fc->fe->ops.i2c_gate_ctrl(fc->fe, 0);
+       fc->fe->ops.i2c_gate_ctrl = NULL;
+
+       if (!dvb_attach(dvb_pll_attach, fc->fe, 0x61,
+                       &fc->fc_i2c_adap[2].i2c_adap, DVB_PLL_TDEE4))
+               goto fail;
+
        return 1;
+
+fail:
+       /* Reset for next frontend to try */
+       fc->fc_i2c_adap[0].no_base_addr = 0;
+       return 0;
 }
 #else
 #define cablestar2_attach NULL
index fec1d77fa8555a4ca0c2262443a7bef6f2769a2b..91353a6faf1d253d5cbd13c9fdba5e01b49481d6 100644 (file)
@@ -1059,7 +1059,7 @@ static int dst_get_tuner_info(struct dst_state *state)
                dprintk(verbose, DST_ERROR, 1, "DST type has TS=188");
        }
        if (state->board_info[0] == 0xbc) {
-               if (state->type_flags != DST_TYPE_IS_ATSC)
+               if (state->dst_type != DST_TYPE_IS_ATSC)
                        state->type_flags |= DST_TYPE_HAS_TS188;
                else
                        state->type_flags |= DST_TYPE_HAS_NEWTUNE_2;
index 4dbd7d4185af2dba90dd610c62e49f1738cdda1d..2d099e27175199db5bc6af91cf6d47a5861cddef 100644 (file)
 #include "cx24116.h"
 #include "z0194a.h"
 
+#define UNSET (-1U)
+
+#define DM1105_BOARD_NOAUTO            UNSET
+#define DM1105_BOARD_UNKNOWN           0
+#define DM1105_BOARD_DVBWORLD_2002     1
+#define DM1105_BOARD_DVBWORLD_2004     2
+#define DM1105_BOARD_AXESS_DM05                3
+
 /* ----------------------------------------------- */
 /*
  * PCI ID's
 
 /* GPIO's for LNB power control */
 #define DM1105_LNB_MASK                                0x00000000
+#define DM1105_LNB_OFF                         0x00020000
 #define DM1105_LNB_13V                         0x00010100
 #define DM1105_LNB_18V                         0x00000100
 
 /* GPIO's for LNB power control for Axess DM05 */
 #define DM05_LNB_MASK                          0x00000000
+#define DM05_LNB_OFF                           0x00020000/* actually 13v */
 #define DM05_LNB_13V                           0x00020000
 #define DM05_LNB_18V                           0x00030000
 
+static unsigned int card[]  = {[0 ... 3] = UNSET };
+module_param_array(card,  int, NULL, 0444);
+MODULE_PARM_DESC(card, "card type");
+
 static int ir_debug;
 module_param(ir_debug, int, 0644);
 MODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding");
 
+static unsigned int dm1105_devcount;
+
 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
 
+struct dm1105_board {
+       char                    *name;
+};
+
+struct dm1105_subid {
+       u16     subvendor;
+       u16     subdevice;
+       u32     card;
+};
+
+static const struct dm1105_board dm1105_boards[] = {
+       [DM1105_BOARD_UNKNOWN] = {
+               .name           = "UNKNOWN/GENERIC",
+       },
+       [DM1105_BOARD_DVBWORLD_2002] = {
+               .name           = "DVBWorld PCI 2002",
+       },
+       [DM1105_BOARD_DVBWORLD_2004] = {
+               .name           = "DVBWorld PCI 2004",
+       },
+       [DM1105_BOARD_AXESS_DM05] = {
+               .name           = "Axess/EasyTv DM05",
+       },
+};
+
+static const struct dm1105_subid dm1105_subids[] = {
+       {
+               .subvendor = 0x0000,
+               .subdevice = 0x2002,
+               .card      = DM1105_BOARD_DVBWORLD_2002,
+       }, {
+               .subvendor = 0x0001,
+               .subdevice = 0x2002,
+               .card      = DM1105_BOARD_DVBWORLD_2002,
+       }, {
+               .subvendor = 0x0000,
+               .subdevice = 0x2004,
+               .card      = DM1105_BOARD_DVBWORLD_2004,
+       }, {
+               .subvendor = 0x0001,
+               .subdevice = 0x2004,
+               .card      = DM1105_BOARD_DVBWORLD_2004,
+       }, {
+               .subvendor = 0x195d,
+               .subdevice = 0x1105,
+               .card      = DM1105_BOARD_AXESS_DM05,
+       },
+};
+
+static void dm1105_card_list(struct pci_dev *pci)
+{
+       int i;
+
+       if (0 == pci->subsystem_vendor &&
+                       0 == pci->subsystem_device) {
+               printk(KERN_ERR
+                       "dm1105: Your board has no valid PCI Subsystem ID\n"
+                       "dm1105: and thus can't be autodetected\n"
+                       "dm1105: Please pass card=<n> insmod option to\n"
+                       "dm1105: workaround that.  Redirect complaints to\n"
+                       "dm1105: the vendor of the TV card.  Best regards,\n"
+                       "dm1105: -- tux\n");
+       } else {
+               printk(KERN_ERR
+                       "dm1105: Your board isn't known (yet) to the driver.\n"
+                       "dm1105: You can try to pick one of the existing\n"
+                       "dm1105: card configs via card=<n> insmod option.\n"
+                       "dm1105: Updating to the latest version might help\n"
+                       "dm1105: as well.\n");
+       }
+       printk(KERN_ERR "Here is a list of valid choices for the card=<n> "
+                  "insmod option:\n");
+       for (i = 0; i < ARRAY_SIZE(dm1105_boards); i++)
+               printk(KERN_ERR "dm1105:    card=%d -> %s\n",
+                               i, dm1105_boards[i].name);
+}
+
 /* infrared remote control */
 struct infrared {
        struct input_dev        *input_dev;
@@ -193,6 +286,8 @@ struct dm1105dvb {
        struct dvb_frontend *fe;
        struct dvb_net dvbnet;
        unsigned int full_ts_users;
+       unsigned int boardnr;
+       int nr;
 
        /* i2c */
        struct i2c_adapter i2c_adap;
@@ -211,7 +306,6 @@ struct dm1105dvb {
        unsigned int    PacketErrorCount;
        unsigned int dmarst;
        spinlock_t lock;
-
 };
 
 #define dm_io_mem(reg) ((unsigned long)(&dm1105dvb->io_mem[reg]))
@@ -326,16 +420,20 @@ static inline struct dm1105dvb *frontend_to_dm1105dvb(struct dvb_frontend *fe)
 static int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
 {
        struct dm1105dvb *dm1105dvb = frontend_to_dm1105dvb(fe);
-       u32 lnb_mask, lnb_13v, lnb_18v;
+       u32 lnb_mask, lnb_13v, lnb_18v, lnb_off;
 
-       switch (dm1105dvb->pdev->subsystem_device) {
-       case PCI_DEVICE_ID_DM05:
+       switch (dm1105dvb->boardnr) {
+       case DM1105_BOARD_AXESS_DM05:
                lnb_mask = DM05_LNB_MASK;
+               lnb_off = DM05_LNB_OFF;
                lnb_13v = DM05_LNB_13V;
                lnb_18v = DM05_LNB_18V;
                break;
+       case DM1105_BOARD_DVBWORLD_2002:
+       case DM1105_BOARD_DVBWORLD_2004:
        default:
                lnb_mask = DM1105_LNB_MASK;
+               lnb_off = DM1105_LNB_OFF;
                lnb_13v = DM1105_LNB_13V;
                lnb_18v = DM1105_LNB_18V;
        }
@@ -343,8 +441,10 @@ static int dm1105dvb_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t volta
        outl(lnb_mask, dm_io_mem(DM1105_GPIOCTR));
        if (voltage == SEC_VOLTAGE_18)
                outl(lnb_18v , dm_io_mem(DM1105_GPIOVAL));
-       else
+       else if (voltage == SEC_VOLTAGE_13)
                outl(lnb_13v, dm_io_mem(DM1105_GPIOVAL));
+       else
+               outl(lnb_off, dm_io_mem(DM1105_GPIOVAL));
 
        return 0;
 }
@@ -477,7 +577,7 @@ static irqreturn_t dm1105dvb_irq(int irq, void *dev_id)
 int __devinit dm1105_ir_init(struct dm1105dvb *dm1105)
 {
        struct input_dev *input_dev;
-       IR_KEYTAB_TYPE *ir_codes = ir_codes_dm1105_nec;
+       struct ir_scancode_table *ir_codes = &ir_codes_dm1105_nec_table;
        int ir_type = IR_TYPE_OTHER;
        int err = -ENOMEM;
 
@@ -589,8 +689,8 @@ static int __devinit frontend_init(struct dm1105dvb *dm1105dvb)
 {
        int ret;
 
-       switch (dm1105dvb->pdev->subsystem_device) {
-       case PCI_DEVICE_ID_DW2004:
+       switch (dm1105dvb->boardnr) {
+       case DM1105_BOARD_DVBWORLD_2004:
                dm1105dvb->fe = dvb_attach(
                        cx24116_attach, &serit_sp2633_config,
                        &dm1105dvb->i2c_adap);
@@ -598,6 +698,8 @@ static int __devinit frontend_init(struct dm1105dvb *dm1105dvb)
                        dm1105dvb->fe->ops.set_voltage = dm1105dvb_set_voltage;
 
                break;
+       case DM1105_BOARD_DVBWORLD_2002:
+       case DM1105_BOARD_AXESS_DM05:
        default:
                dm1105dvb->fe = dvb_attach(
                        stv0299_attach, &sharp_z0194a_config,
@@ -676,11 +778,31 @@ static int __devinit dm1105_probe(struct pci_dev *pdev,
        struct dvb_demux *dvbdemux;
        struct dmx_demux *dmx;
        int ret = -ENOMEM;
+       int i;
 
        dm1105dvb = kzalloc(sizeof(struct dm1105dvb), GFP_KERNEL);
        if (!dm1105dvb)
                return -ENOMEM;
 
+       /* board config */
+       dm1105dvb->nr = dm1105_devcount;
+       dm1105dvb->boardnr = UNSET;
+       if (card[dm1105dvb->nr] < ARRAY_SIZE(dm1105_boards))
+               dm1105dvb->boardnr = card[dm1105dvb->nr];
+       for (i = 0; UNSET == dm1105dvb->boardnr &&
+                               i < ARRAY_SIZE(dm1105_subids); i++)
+               if (pdev->subsystem_vendor ==
+                       dm1105_subids[i].subvendor &&
+                               pdev->subsystem_device ==
+                                       dm1105_subids[i].subdevice)
+                       dm1105dvb->boardnr = dm1105_subids[i].card;
+
+       if (UNSET == dm1105dvb->boardnr) {
+               dm1105dvb->boardnr = DM1105_BOARD_UNKNOWN;
+               dm1105_card_list(pdev);
+       }
+
+       dm1105_devcount++;
        dm1105dvb->pdev = pdev;
        dm1105dvb->buffer_size = 5 * DM1105_DMA_BYTES;
        dm1105dvb->PacketErrorCount = 0;
@@ -853,6 +975,7 @@ static void __devexit dm1105_remove(struct pci_dev *pdev)
        pci_release_regions(pdev);
        pci_disable_device(pdev);
        pci_set_drvdata(pdev, NULL);
+       dm1105_devcount--;
        kfree(dm1105dvb);
 }
 
@@ -861,17 +984,12 @@ static struct pci_device_id dm1105_id_table[] __devinitdata = {
                .vendor = PCI_VENDOR_ID_TRIGEM,
                .device = PCI_DEVICE_ID_DM1105,
                .subvendor = PCI_ANY_ID,
-               .subdevice = PCI_DEVICE_ID_DW2002,
-       }, {
-               .vendor = PCI_VENDOR_ID_TRIGEM,
-               .device = PCI_DEVICE_ID_DM1105,
-               .subvendor = PCI_ANY_ID,
-               .subdevice = PCI_DEVICE_ID_DW2004,
+               .subdevice = PCI_ANY_ID,
        }, {
                .vendor = PCI_VENDOR_ID_AXESS,
                .device = PCI_DEVICE_ID_DM05,
-               .subvendor = PCI_VENDOR_ID_AXESS,
-               .subdevice = PCI_DEVICE_ID_DM05,
+               .subvendor = PCI_ANY_ID,
+               .subdevice = PCI_ANY_ID,
        }, {
                /* empty */
        },
index 6d6121eb5d592ea9157f0a8610069abc8ab4d8c9..3750ff48cba1e75097c99daf4697931b2f9b0a3f 100644 (file)
@@ -430,6 +430,8 @@ static int dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
 /* stop feed but only mark the specified filter as stopped (state set) */
 static int dvb_dmxdev_feed_stop(struct dmxdev_filter *dmxdevfilter)
 {
+       struct dmxdev_feed *feed;
+
        dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
 
        switch (dmxdevfilter->type) {
@@ -438,7 +440,8 @@ static int dvb_dmxdev_feed_stop(struct dmxdev_filter *dmxdevfilter)
                dmxdevfilter->feed.sec->stop_filtering(dmxdevfilter->feed.sec);
                break;
        case DMXDEV_TYPE_PES:
-               dmxdevfilter->feed.ts->stop_filtering(dmxdevfilter->feed.ts);
+               list_for_each_entry(feed, &dmxdevfilter->feed.ts, next)
+                       feed->ts->stop_filtering(feed->ts);
                break;
        default:
                return -EINVAL;
@@ -449,13 +452,23 @@ static int dvb_dmxdev_feed_stop(struct dmxdev_filter *dmxdevfilter)
 /* start feed associated with the specified filter */
 static int dvb_dmxdev_feed_start(struct dmxdev_filter *filter)
 {
+       struct dmxdev_feed *feed;
+       int ret;
+
        dvb_dmxdev_filter_state_set(filter, DMXDEV_STATE_GO);
 
        switch (filter->type) {
        case DMXDEV_TYPE_SEC:
                return filter->feed.sec->start_filtering(filter->feed.sec);
        case DMXDEV_TYPE_PES:
-               return filter->feed.ts->start_filtering(filter->feed.ts);
+               list_for_each_entry(feed, &filter->feed.ts, next) {
+                       ret = feed->ts->start_filtering(feed->ts);
+                       if (ret < 0) {
+                               dvb_dmxdev_feed_stop(filter);
+                               return ret;
+                       }
+               }
+               break;
        default:
                return -EINVAL;
        }
@@ -487,6 +500,9 @@ static int dvb_dmxdev_feed_restart(struct dmxdev_filter *filter)
 
 static int dvb_dmxdev_filter_stop(struct dmxdev_filter *dmxdevfilter)
 {
+       struct dmxdev_feed *feed;
+       struct dmx_demux *demux;
+
        if (dmxdevfilter->state < DMXDEV_STATE_GO)
                return 0;
 
@@ -503,13 +519,12 @@ static int dvb_dmxdev_filter_stop(struct dmxdev_filter *dmxdevfilter)
                dmxdevfilter->feed.sec = NULL;
                break;
        case DMXDEV_TYPE_PES:
-               if (!dmxdevfilter->feed.ts)
-                       break;
                dvb_dmxdev_feed_stop(dmxdevfilter);
-               dmxdevfilter->dev->demux->
-                   release_ts_feed(dmxdevfilter->dev->demux,
-                                   dmxdevfilter->feed.ts);
-               dmxdevfilter->feed.ts = NULL;
+               demux = dmxdevfilter->dev->demux;
+               list_for_each_entry(feed, &dmxdevfilter->feed.ts, next) {
+                       demux->release_ts_feed(demux, feed->ts);
+                       feed->ts = NULL;
+               }
                break;
        default:
                if (dmxdevfilter->state == DMXDEV_STATE_ALLOCATED)
@@ -521,19 +536,88 @@ static int dvb_dmxdev_filter_stop(struct dmxdev_filter *dmxdevfilter)
        return 0;
 }
 
+static void dvb_dmxdev_delete_pids(struct dmxdev_filter *dmxdevfilter)
+{
+       struct dmxdev_feed *feed, *tmp;
+
+       /* delete all PIDs */
+       list_for_each_entry_safe(feed, tmp, &dmxdevfilter->feed.ts, next) {
+               list_del(&feed->next);
+               kfree(feed);
+       }
+
+       BUG_ON(!list_empty(&dmxdevfilter->feed.ts));
+}
+
 static inline int dvb_dmxdev_filter_reset(struct dmxdev_filter *dmxdevfilter)
 {
        if (dmxdevfilter->state < DMXDEV_STATE_SET)
                return 0;
 
+       if (dmxdevfilter->type == DMXDEV_TYPE_PES)
+               dvb_dmxdev_delete_pids(dmxdevfilter);
+
        dmxdevfilter->type = DMXDEV_TYPE_NONE;
        dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
        return 0;
 }
 
+static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev,
+                                struct dmxdev_filter *filter,
+                                struct dmxdev_feed *feed)
+{
+       struct timespec timeout = { 0 };
+       struct dmx_pes_filter_params *para = &filter->params.pes;
+       dmx_output_t otype;
+       int ret;
+       int ts_type;
+       enum dmx_ts_pes ts_pes;
+       struct dmx_ts_feed *tsfeed;
+
+       feed->ts = NULL;
+       otype = para->output;
+
+       ts_pes = (enum dmx_ts_pes)para->pes_type;
+
+       if (ts_pes < DMX_PES_OTHER)
+               ts_type = TS_DECODER;
+       else
+               ts_type = 0;
+
+       if (otype == DMX_OUT_TS_TAP)
+               ts_type |= TS_PACKET;
+       else if (otype == DMX_OUT_TSDEMUX_TAP)
+               ts_type |= TS_PACKET | TS_DEMUX;
+       else if (otype == DMX_OUT_TAP)
+               ts_type |= TS_PACKET | TS_DEMUX | TS_PAYLOAD_ONLY;
+
+       ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux, &feed->ts,
+                                             dvb_dmxdev_ts_callback);
+       if (ret < 0)
+               return ret;
+
+       tsfeed = feed->ts;
+       tsfeed->priv = filter;
+
+       ret = tsfeed->set(tsfeed, feed->pid, ts_type, ts_pes, 32768, timeout);
+       if (ret < 0) {
+               dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
+               return ret;
+       }
+
+       ret = tsfeed->start_filtering(tsfeed);
+       if (ret < 0) {
+               dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed);
+               return ret;
+       }
+
+       return 0;
+}
+
 static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter)
 {
        struct dmxdev *dmxdev = filter->dev;
+       struct dmxdev_feed *feed;
        void *mem;
        int ret, i;
 
@@ -631,56 +715,14 @@ static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter)
                break;
        }
        case DMXDEV_TYPE_PES:
-       {
-               struct timespec timeout = { 0 };
-               struct dmx_pes_filter_params *para = &filter->params.pes;
-               dmx_output_t otype;
-               int ts_type;
-               enum dmx_ts_pes ts_pes;
-               struct dmx_ts_feed **tsfeed = &filter->feed.ts;
-
-               filter->feed.ts = NULL;
-               otype = para->output;
-
-               ts_pes = (enum dmx_ts_pes)para->pes_type;
-
-               if (ts_pes < DMX_PES_OTHER)
-                       ts_type = TS_DECODER;
-               else
-                       ts_type = 0;
-
-               if (otype == DMX_OUT_TS_TAP)
-                       ts_type |= TS_PACKET;
-               else if (otype == DMX_OUT_TSDEMUX_TAP)
-                       ts_type |= TS_PACKET | TS_DEMUX;
-               else if (otype == DMX_OUT_TAP)
-                       ts_type |= TS_PACKET | TS_DEMUX | TS_PAYLOAD_ONLY;
-
-               ret = dmxdev->demux->allocate_ts_feed(dmxdev->demux,
-                                                     tsfeed,
-                                                     dvb_dmxdev_ts_callback);
-               if (ret < 0)
-                       return ret;
-
-               (*tsfeed)->priv = filter;
-
-               ret = (*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes,
-                                    32768, timeout);
-               if (ret < 0) {
-                       dmxdev->demux->release_ts_feed(dmxdev->demux,
-                                                      *tsfeed);
-                       return ret;
-               }
-
-               ret = filter->feed.ts->start_filtering(filter->feed.ts);
-               if (ret < 0) {
-                       dmxdev->demux->release_ts_feed(dmxdev->demux,
-                                                      *tsfeed);
-                       return ret;
+               list_for_each_entry(feed, &filter->feed.ts, next) {
+                       ret = dvb_dmxdev_start_feed(dmxdev, filter, feed);
+                       if (ret < 0) {
+                               dvb_dmxdev_filter_stop(filter);
+                               return ret;
+                       }
                }
-
                break;
-       }
        default:
                return -EINVAL;
        }
@@ -718,7 +760,7 @@ static int dvb_demux_open(struct inode *inode, struct file *file)