Merge branch 'intelfb-patches' of master.kernel.org:/pub/scm/linux/kernel/git/airlied...
authorLinus Torvalds <torvalds@g5.osdl.org>
Sat, 30 Sep 2006 16:36:56 +0000 (09:36 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sat, 30 Sep 2006 16:36:56 +0000 (09:36 -0700)
* 'intelfb-patches' of master.kernel.org:/pub/scm/linux/kernel/git/airlied/intelfb-2.6:
  intelfbhw.c: intelfbhw_get_p1p2 defined but not used
  intelfb: fix mtrr_reg signedness
  intelfb: update doc and Kconfig (supported devices)
  intelfb: add preliminary i2c support
  intelfb: add preliminary i2c support
  intelfb: add preliminary i2c support
  intelfb: add preliminary i2c support
  intelfb: add preliminary i2c support
  intelfb: add preliminary i2c support
  intelfb: add preliminary i2c support
  intelfb: add preliminary i2c support
  intelfb: add vsync interrupt support
  intelfb: add vsync interrupt support
  intelfb: add vsync interrupt support
  intelfb: add vsync interrupt support
  intelfb: add vsync interrupt support

1  2 
drivers/video/Kconfig
drivers/video/intelfb/intelfbdrv.c
drivers/video/intelfb/intelfbhw.c
include/linux/i2c-id.h

diff --combined drivers/video/Kconfig
@@@ -4,21 -4,6 +4,21 @@@
  
  menu "Graphics support"
  
 +config FIRMWARE_EDID
 +       bool "Enable firmware EDID"
 +       default y
 +       ---help---
 +         This enables access to the EDID transferred from the firmware.
 +       On the i386, this is from the Video BIOS. Enable this if DDC/I2C
 +       transfers do not work for your driver and if you are using
 +       nvidiafb, i810fb or savagefb.
 +
 +       In general, choosing Y for this option is safe.  If you
 +       experience extremely long delays while booting before you get
 +       something on your display, try setting this to N.  Matrox cards in
 +       combination with certain motherboards and monitors are known to
 +       suffer from this problem.
 +
  config FB
        tristate "Support for frame buffer devices"
        ---help---
@@@ -85,12 -70,21 +85,12 @@@ config FB_MACMODE
         depends on FB
         default n
  
 -config FB_FIRMWARE_EDID
 -       bool "Enable firmware EDID"
 -       depends on FB
 -       default y
 -       ---help---
 -         This enables access to the EDID transferred from the firmware.
 -       On the i386, this is from the Video BIOS. Enable this if DDC/I2C
 -       transfers do not work for your driver and if you are using
 -       nvidiafb, i810fb or savagefb.
 -
 -       In general, choosing Y for this option is safe.  If you
 -       experience extremely long delays while booting before you get
 -       something on your display, try setting this to N.  Matrox cards in
 -       combination with certain motherboards and monitors are known to
 -       suffer from this problem.
 +config FB_BACKLIGHT
 +      bool
 +      depends on FB
 +      select BACKLIGHT_LCD_SUPPORT
 +      select BACKLIGHT_CLASS_DEVICE
 +      default n
  
  config FB_MODE_HELPERS
          bool "Enable Video Mode Handling Helpers"
@@@ -422,7 -416,7 +422,7 @@@ config FB_O
  
  config FB_CONTROL
        bool "Apple \"control\" display support"
 -      depends on (FB = y) && PPC_PMAC
 +      depends on (FB = y) && PPC_PMAC && PPC32
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
  
  config FB_PLATINUM
        bool "Apple \"platinum\" display support"
 -      depends on (FB = y) && PPC_PMAC
 +      depends on (FB = y) && PPC_PMAC && PPC32
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
  
  config FB_VALKYRIE
        bool "Apple \"valkyrie\" display support"
 -      depends on (FB = y) && (MAC || PPC_PMAC)
 +      depends on (FB = y) && (MAC || (PPC_PMAC && PPC32))
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
  
  config FB_CT65550
        bool "Chips 65550 display support"
 -      depends on (FB = y) && PPC
 +      depends on (FB = y) && PPC32
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@@ -552,14 -546,10 +552,14 @@@ config FB_VES
          You will get a boot time penguin logo at no additional cost. Please
          read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
  
 -config VIDEO_SELECT
 -      bool
 -      depends on FB_VESA
 -      default y
 +config FB_IMAC
 +      bool "Intel-based Macintosh Framebuffer Support"
 +      depends on (FB = y) && X86 && EFI
 +      select FB_CFB_FILLRECT
 +      select FB_CFB_COPYAREA
 +      select FB_CFB_IMAGEBLIT
 +      help
 +        This is the frame buffer device driver for the Intel-based Macintosh
  
  config FB_HGA
        tristate "Hercules mono graphics support"
@@@ -583,6 -573,12 +583,6 @@@ config FB_HGA_ACCE
        This will compile the Hercules mono graphics with
        acceleration functions.
  
 -
 -config VIDEO_SELECT
 -      bool
 -      depends on (FB = y) && X86
 -      default y
 -
  config FB_SGIVW
        tristate "SGI Visual Workstation framebuffer support"
        depends on FB && X86_VISWS
@@@ -721,14 -717,6 +721,14 @@@ config FB_NVIDIA_I2
          independently validate video mode parameters, you should say Y
          here.
  
 +config FB_NVIDIA_BACKLIGHT
 +      bool "Support for backlight control"
 +      depends on FB_NVIDIA && PMAC_BACKLIGHT
 +      select FB_BACKLIGHT
 +      default y
 +      help
 +        Say Y here if you want to control the backlight of your display.
 +
  config FB_RIVA
        tristate "nVidia Riva support"
        depends on FB && PCI
@@@ -767,14 -755,6 +767,14 @@@ config FB_RIVA_DEBU
          of debugging informations to provide to the maintainer when
          something goes wrong.
  
 +config FB_RIVA_BACKLIGHT
 +      bool "Support for backlight control"
 +      depends on FB_RIVA && PMAC_BACKLIGHT
 +      select FB_BACKLIGHT
 +      default y
 +      help
 +        Say Y here if you want to control the backlight of your display.
 +
  config FB_I810
        tristate "Intel 810/815 support (EXPERIMENTAL)"
        depends on FB && EXPERIMENTAL && PCI && X86_32
@@@ -825,30 -805,48 +825,48 @@@ config FB_I810_I2
        help
  
  config FB_INTEL
-       tristate "Intel 830M/845G/852GM/855GM/865G support (EXPERIMENTAL)"
+       tristate "Intel 830M/845G/852GM/855GM/865G/915G/945G support (EXPERIMENTAL)"
        depends on FB && EXPERIMENTAL && PCI && X86
        select AGP
        select AGP_INTEL
+       select I2C_ALGOBIT if FB_INTEL_I2C
+       select I2C if FB_INTEL_I2C
        select FB_MODE_HELPERS
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
        help
          This driver supports the on-board graphics built in to the Intel
-           830M/845G/852GM/855GM/865G chipsets.
+           830M/845G/852GM/855GM/865G/915G/915GM/945G/945GM chipsets.
            Say Y if you have and plan to use such a board.
  
-           To compile this driver as a module, choose M here: the
+         If you say Y here and want DDC/I2C support you must first say Y to
+         "I2C support" and "I2C bit-banging support" in the character devices
+         section.
+         If you say M here then "I2C support" and "I2C bit-banging support"
+         can be build either as modules or built-in.
+         To compile this driver as a module, choose M here: the
          module will be called intelfb.
  
+         For more information, please read <file:Documentation/fb/intelfb.txt>
  config FB_INTEL_DEBUG
-         bool "Intel driver Debug Messages"
+       bool "Intel driver Debug Messages"
        depends on FB_INTEL
        ---help---
          Say Y here if you want the Intel driver to output all sorts
          of debugging informations to provide to the maintainer when
          something goes wrong.
  
+ config FB_INTEL_I2C
+       bool "DDC/I2C for Intel framebuffer support"
+       depends on FB_INTEL
+       default y
+       help
+         Say Y here if you want DDC/I2C support for your on-board Intel graphics.
  config FB_MATROX
        tristate "Matrox acceleration"
        depends on FB && PCI
@@@ -1013,7 -1011,6 +1031,7 @@@ config FB_RADEO
  
          There is a product page at
          http://apps.ati.com/ATIcompare/
 +
  config FB_RADEON_I2C
        bool "DDC/I2C for ATI Radeon support"
        depends on FB_RADEON
        help
          Say Y here if you want DDC/I2C support for your Radeon board. 
  
 +config FB_RADEON_BACKLIGHT
 +      bool "Support for backlight control"
 +      depends on FB_RADEON && PMAC_BACKLIGHT
 +      select FB_BACKLIGHT
 +      default y
 +      help
 +        Say Y here if you want to control the backlight of your display.
 +
  config FB_RADEON_DEBUG
        bool "Lots of debug output from Radeon driver"
        depends on FB_RADEON
@@@ -1053,14 -1042,6 +1071,14 @@@ config FB_ATY12
          To compile this driver as a module, choose M here: the
          module will be called aty128fb.
  
 +config FB_ATY128_BACKLIGHT
 +      bool "Support for backlight control"
 +      depends on FB_ATY128 && PMAC_BACKLIGHT
 +      select FB_BACKLIGHT
 +      default y
 +      help
 +        Say Y here if you want to control the backlight of your display.
 +
  config FB_ATY
        tristate "ATI Mach64 display support" if PCI || ATARI
        depends on FB && !SPARC32
@@@ -1103,14 -1084,6 +1121,14 @@@ config FB_ATY_G
          is at
          <http://support.ati.com/products/pc/mach64/graphics_xpression.html>.
  
 +config FB_ATY_BACKLIGHT
 +      bool "Support for backlight control"
 +      depends on FB_ATY && PMAC_BACKLIGHT
 +      select FB_BACKLIGHT
 +      default y
 +      help
 +        Say Y here if you want to control the backlight of your display.
 +
  config FB_S3TRIO
        bool "S3 Trio display support"
        depends on (FB = y) && PPC && BROKEN
@@@ -1510,26 -1483,6 +1528,26 @@@ config FB_PXA_PARAMETER
  
          <file:Documentation/fb/pxafb.txt> describes the available parameters.
  
 +config FB_MBX
 +      tristate "2700G LCD framebuffer support"
 +      depends on FB && ARCH_PXA
 +      select FB_CFB_FILLRECT
 +      select FB_CFB_COPYAREA
 +      select FB_CFB_IMAGEBLIT
 +      ---help---
 +        Framebuffer driver for the Intel 2700G (Marathon) Graphics
 +        Accelerator
 +
 +config FB_MBX_DEBUG
 +       bool "Enable debugging info via debugfs"
 +       depends on FB_MBX && DEBUG_FS
 +       default n
 +       ---help---
 +         Enable this if you want debugging information using the debug
 +         filesystem (debugfs)
 +
 +         If unsure, say N.
 +
  config FB_W100
        tristate "W100 frame buffer support"
        depends on FB && PXA_SHARPSL
@@@ -1569,21 -1522,6 +1587,21 @@@ config FB_S3C2410_DEBU
          Turn on debugging messages. Note that you can set/unset at run time
          through sysfs
  
 +config FB_PNX4008_DUM
 +      tristate "Display Update Module support on Philips PNX4008 board"
 +      depends on FB && ARCH_PNX4008
 +      ---help---
 +        Say Y here to enable support for PNX4008 Display Update Module (DUM)
 +
 +config FB_PNX4008_DUM_RGB
 +      tristate "RGB Framebuffer support on Philips PNX4008 board"
 +      depends on FB_PNX4008_DUM
 +      select FB_CFB_FILLRECT
 +      select FB_CFB_COPYAREA
 +      select FB_CFB_IMAGEBLIT
 +      ---help---
 +        Say Y here to enable support for PNX4008 RGB Framebuffer
 +
  config FB_VIRTUAL
        tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)"
        depends on FB
@@@ -1612,7 -1550,7 +1630,7 @@@ if FB || SGI_NEWPORT_CONSOL
        source "drivers/video/logo/Kconfig"
  endif
  
 -if FB && SYSFS
 +if SYSFS
        source "drivers/video/backlight/Kconfig"
  endif
  
   *
   */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/errno.h>
  #include <linux/string.h>
  #include <linux/mm.h>
 -#include <linux/tty.h>
  #include <linux/slab.h>
  #include <linux/delay.h>
  #include <linux/fb.h>
  #include <linux/pci.h>
  #include <linux/vmalloc.h>
  #include <linux/pagemap.h>
 +#include <linux/screen_info.h>
  
  #include <asm/io.h>
  
  static void __devinit get_initial_mode(struct intelfb_info *dinfo);
  static void update_dinfo(struct intelfb_info *dinfo,
                         struct fb_var_screeninfo *var);
+ static int intelfb_open(struct fb_info *info, int user);
+ static int intelfb_release(struct fb_info *info, int user);
  static int intelfb_check_var(struct fb_var_screeninfo *var,
                             struct fb_info *info);
  static int intelfb_set_par(struct fb_info *info);
@@@ -194,6 -197,8 +196,8 @@@ static int num_registered = 0
  /* fb ops */
  static struct fb_ops intel_fb_ops = {
        .owner =                THIS_MODULE,
+       .fb_open =              intelfb_open,
+       .fb_release =           intelfb_release,
        .fb_check_var =         intelfb_check_var,
        .fb_set_par =           intelfb_set_par,
        .fb_setcolreg =         intelfb_setcolreg,
@@@ -446,6 -451,8 +450,8 @@@ cleanup(struct intelfb_info *dinfo
        if (!dinfo)
                return;
  
+       intelfbhw_disable_irq(dinfo);
        fb_dealloc_cmap(&dinfo->info->cmap);
        kfree(dinfo->info->pixmap.addr);
  
                agp_free_memory(dinfo->gtt_ring_mem);
        }
  
+ #ifdef CONFIG_FB_INTEL_I2C
+       /* un-register I2C bus */
+       intelfb_delete_i2c_busses(dinfo);
+ #endif
        if (dinfo->mmio_base)
                iounmap((void __iomem *)dinfo->mmio_base);
        if (dinfo->aperture.virtual)
@@@ -844,6 -856,11 +855,11 @@@ intelfb_pci_register(struct pci_dev *pd
        if (bailearly == 5)
                bailout(dinfo);
  
+ #ifdef CONFIG_FB_INTEL_I2C
+       /* register I2C bus */
+       intelfb_create_i2c_busses(dinfo);
+ #endif
        if (bailearly == 6)
                bailout(dinfo);
  
        }
  
        dinfo->registered = 1;
+       dinfo->open = 0;
+       init_waitqueue_head(&dinfo->vsync.wait);
+       spin_lock_init(&dinfo->int_lock);
+       dinfo->irq_flags = 0;
+       dinfo->vsync.pan_display = 0;
+       dinfo->vsync.pan_offset = 0;
  
        return 0;
  
@@@ -1187,6 -1211,34 +1210,34 @@@ update_dinfo(struct intelfb_info *dinfo
   *                       fbdev interface                       *
   ***************************************************************/
  
+ static int
+ intelfb_open(struct fb_info *info, int user)
+ {
+       struct intelfb_info *dinfo = GET_DINFO(info);
+       if (user) {
+               dinfo->open++;
+       }
+       return 0;
+ }
+ static int
+ intelfb_release(struct fb_info *info, int user)
+ {
+       struct intelfb_info *dinfo = GET_DINFO(info);
+       if (user) {
+               dinfo->open--;
+               msleep(1);
+               if (!dinfo->open) {
+                       intelfbhw_disable_irq(dinfo);
+               }
+       }
+       return 0;
+ }
  static int
  intelfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
  {
@@@ -1433,6 -1485,19 +1484,19 @@@ static in
  intelfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
  {
        int retval = 0;
+       struct intelfb_info *dinfo = GET_DINFO(info);
+       u32 pipe = 0;
+       switch (cmd) {
+               case FBIO_WAITFORVSYNC:
+                       if (get_user(pipe, (__u32 __user *)arg))
+                               return -EFAULT;
+                       retval = intelfbhw_wait_for_vsync(dinfo, pipe);
+                       break;
+               default:
+                       break;
+       }
  
        return retval;
  }
  
  /* $DHD: intelfb/intelfbhw.c,v 1.9 2003/06/27 15:06:25 dawes Exp $ */
  
 -#include <linux/config.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/errno.h>
  #include <linux/string.h>
  #include <linux/mm.h>
 -#include <linux/tty.h>
  #include <linux/slab.h>
  #include <linux/delay.h>
  #include <linux/fb.h>
@@@ -32,6 -34,7 +32,7 @@@
  #include <linux/pci.h>
  #include <linux/vmalloc.h>
  #include <linux/pagemap.h>
+ #include <linux/interrupt.h>
  
  #include <asm/io.h>
  
@@@ -368,7 -371,13 +369,13 @@@ intelfbhw_pan_display(struct fb_var_scr
  
        offset += dinfo->fb.offset << 12;
  
-       OUTREG(DSPABASE, offset);
+       dinfo->vsync.pan_offset = offset;
+       if ((var->activate & FB_ACTIVATE_VBL) && !intelfbhw_enable_irq(dinfo, 0)) {
+               dinfo->vsync.pan_display = 1;
+       } else {
+               dinfo->vsync.pan_display = 0;
+               OUTREG(DSPABASE, offset);
+       }
  
        return 0;
  }
@@@ -585,6 -594,11 +592,11 @@@ intelfbhw_read_hw_state(struct intelfb_
        hw->fw_blc_0 = INREG(FW_BLC_0);
        hw->fw_blc_1 = INREG(FW_BLC_1);
  
+       hw->hwstam = INREG16(HWSTAM);
+       hw->ier = INREG16(IER);
+       hw->iir = INREG16(IIR);
+       hw->imr = INREG16(IMR);
        return 0;
  }
  
@@@ -613,6 -627,7 +625,7 @@@ static int calc_vclock(int index, int m
        return vco / p;
  }
  
+ #if REGDUMP
  static void
  intelfbhw_get_p1p2(struct intelfb_info *dinfo, int dpll, int *o_p1, int *o_p2)
  {
        *o_p1 = p1;
        *o_p2 = p2;
  }
+ #endif
  
  
  void
@@@ -794,6 -810,10 +808,10 @@@ intelfbhw_print_hw_state(struct intelfb
        printk("        FW_BLC_0                0x%08x\n", hw->fw_blc_0);
        printk("        FW_BLC_1                0x%08x\n", hw->fw_blc_1);
  
+       printk("        HWSTAM                  0x%04x\n", hw->hwstam);
+       printk("        IER                     0x%04x\n", hw->ier);
+       printk("        IIR                     0x%04x\n", hw->iir);
+       printk("        IMR                     0x%04x\n", hw->imr);
        printk("hw state dump end\n");
  #endif
  }
@@@ -1932,3 -1952,119 +1950,119 @@@ intelfbhw_cursor_reset(struct intelfb_i
                addr += 16;
        }
  }
+ static irqreturn_t
+ intelfbhw_irq(int irq, void *dev_id, struct pt_regs *fp) {
+       int handled = 0;
+       u16 tmp;
+       struct intelfb_info *dinfo = (struct intelfb_info *)dev_id;
+       spin_lock(&dinfo->int_lock);
+       tmp = INREG16(IIR);
+       tmp &= VSYNC_PIPE_A_INTERRUPT;
+       if (tmp == 0) {
+               spin_unlock(&dinfo->int_lock);
+               return IRQ_RETVAL(handled);
+       }
+       OUTREG16(IIR, tmp);
+       if (tmp & VSYNC_PIPE_A_INTERRUPT) {
+               dinfo->vsync.count++;
+               if (dinfo->vsync.pan_display) {
+                       dinfo->vsync.pan_display = 0;
+                       OUTREG(DSPABASE, dinfo->vsync.pan_offset);
+               }
+               wake_up_interruptible(&dinfo->vsync.wait);
+               handled = 1;
+       }
+       spin_unlock(&dinfo->int_lock);
+       return IRQ_RETVAL(handled);
+ }
+ int
+ intelfbhw_enable_irq(struct intelfb_info *dinfo, int reenable) {
+       if (!test_and_set_bit(0, &dinfo->irq_flags)) {
+               if (request_irq(dinfo->pdev->irq, intelfbhw_irq, SA_SHIRQ, "intelfb", dinfo)) {
+                       clear_bit(0, &dinfo->irq_flags);
+                       return -EINVAL;
+               }
+               spin_lock_irq(&dinfo->int_lock);
+               OUTREG16(HWSTAM, 0xfffe);
+               OUTREG16(IMR, 0x0);
+               OUTREG16(IER, VSYNC_PIPE_A_INTERRUPT);
+               spin_unlock_irq(&dinfo->int_lock);
+       } else if (reenable) {
+               u16 ier;
+               spin_lock_irq(&dinfo->int_lock);
+               ier = INREG16(IER);
+               if ((ier & VSYNC_PIPE_A_INTERRUPT)) {
+                       DBG_MSG("someone disabled the IRQ [%08X]\n", ier);
+                       OUTREG(IER, VSYNC_PIPE_A_INTERRUPT);
+               }
+               spin_unlock_irq(&dinfo->int_lock);
+       }
+       return 0;
+ }
+ void
+ intelfbhw_disable_irq(struct intelfb_info *dinfo) {
+       u16 tmp;
+       if (test_and_clear_bit(0, &dinfo->irq_flags)) {
+               if (dinfo->vsync.pan_display) {
+                       dinfo->vsync.pan_display = 0;
+                       OUTREG(DSPABASE, dinfo->vsync.pan_offset);
+               }
+               spin_lock_irq(&dinfo->int_lock);
+               OUTREG16(HWSTAM, 0xffff);
+               OUTREG16(IMR, 0xffff);
+               OUTREG16(IER, 0x0);
+               tmp = INREG16(IIR);
+               OUTREG16(IIR, tmp);
+               spin_unlock_irq(&dinfo->int_lock);
+               free_irq(dinfo->pdev->irq, dinfo);
+       }
+ }
+ int
+ intelfbhw_wait_for_vsync(struct intelfb_info *dinfo, u32 pipe) {
+       struct intelfb_vsync *vsync;
+       unsigned int count;
+       int ret;
+       switch (pipe) {
+               case 0:
+                       vsync = &dinfo->vsync;
+                       break;
+               default:
+                       return -ENODEV;
+       }
+       ret = intelfbhw_enable_irq(dinfo, 0);
+       if (ret) {
+               return ret;
+       }
+       count = vsync->count;
+       ret = wait_event_interruptible_timeout(vsync->wait, count != vsync->count, HZ/10);
+       if (ret < 0) {
+               return ret;
+       }
+       if (ret == 0) {
+               intelfbhw_enable_irq(dinfo, 1);
+               DBG_MSG("wait_for_vsync timed out!\n");
+               return -ETIMEDOUT;
+       }
+       return 0;
+ }
diff --combined include/linux/i2c-id.h
  #define I2C_DRIVERID_X1205    82      /* Xicor/Intersil X1205 RTC     */
  #define I2C_DRIVERID_PCF8563  83      /* Philips PCF8563 RTC          */
  #define I2C_DRIVERID_RS5C372  84      /* Ricoh RS5C372 RTC            */
 +#define I2C_DRIVERID_BT866    85      /* Conexant bt866 video encoder */
 +#define I2C_DRIVERID_KS0127   86      /* Samsung ks0127 video decoder */
 +#define I2C_DRIVERID_TLV320AIC23B 87  /* TI TLV320AIC23B audio codec  */
 +#define I2C_DRIVERID_ISL1208  88      /* Intersil ISL1208 RTC         */
  
  #define I2C_DRIVERID_I2CDEV   900
  #define I2C_DRIVERID_ARP        902    /* SMBus ARP Client              */
  #define I2C_HW_B_RADEON               0x01001e /* radeon framebuffer driver */
  #define I2C_HW_B_EM28XX               0x01001f /* em28xx video capture cards */
  #define I2C_HW_B_CX2341X      0x010020 /* Conexant CX2341X MPEG encoder cards */
+ #define I2C_HW_B_INTELFB      0x010021 /* intel framebuffer driver */
  
  /* --- PCF 8584 based algorithms                                      */
  #define I2C_HW_P_LP           0x020000 /* Parallel port interface */