cyber2000fb: add I2C support
PATCH 3/3 cyber2000fb: add I2C support
Add I2C support for the DDC bus to cyber2000fb driver. This is only bus support, driver does not use EDID.
Tested on two different CyberPro 2000 cards with i2cdetect and decode-edid.
drivers/video/cyber2000fb.c +111 -0
@@ -48,6 +48,10 @@#include <linux/init.h> #include <linux/io.h> +#include <linux/i2c.h> +#include <linux/i2c-id.h> +#include <linux/i2c-algo-bit.h> +#include <asm/pgtable.h> #include <asm/system.h>
@@ -88,6 +92,11 @@ struct cfb_info {u_char ramdac_powerdown;u32 pseudo_palette[16 ]; +#ifdef CONFIG_FB_CYBER2000_I2C +bool i2c_registered; +struct i2c_adapter i2c_adapter; +struct i2c_algo_bit_data i2c_algo; +#endif };static char *default_font ="Acorn8x8" ;
@@ -1145,6 +1154,95 @@ void cyber2000fb_detach(int idx) }EXPORT_SYMBOL (cyber2000fb_detach); +#ifdef CONFIG_FB_CYBER2000_I2C + +#define DDC_REG 0xb0 +#define DDC_SCL_OUT (1 << 0) +#define DDC_SDA_OUT (1 << 4) +#define DDC_SCL_IN (1 << 2) +#define DDC_SDA_IN (1 << 6) + +static void cyber2000fb_enable_ddc (char enable,struct cfb_info *cfb) +{ +cyber2000fb_writew (((enable &0x01 ) <<8 ) |0xbf ,0x3ce , cfb); +} + +static void cyber2000fb_setscl (void *data,int val) +{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (1 , cfb); + reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SCL_OUT ; +else + reg &= ~DDC_SCL_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_enable_ddc (0 , cfb); +} + +static void cyber2000fb_setsda (void *data,int val) +{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (1 , cfb); + reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SDA_OUT ; +else + reg &= ~DDC_SDA_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_enable_ddc (0 , cfb); +} + +static int cyber2000fb_getscl (void *data) +{ +struct cfb_info *cfb = data; +int retval; + +cyber2000fb_enable_ddc (1 , cfb); + retval = !!(cyber2000_grphr (DDC_REG , cfb) &DDC_SCL_IN ); +cyber2000fb_enable_ddc (0 , cfb); + +return retval; +} + +static int cyber2000fb_getsda (void *data) +{ +struct cfb_info *cfb = data; +int retval; + +cyber2000fb_enable_ddc (1 , cfb); + retval = !!(cyber2000_grphr (DDC_REG , cfb) &DDC_SDA_IN ); +cyber2000fb_enable_ddc (0 , cfb); + +return retval; +} + +static int __devinit cyber2000fb_setup_ddc_bus (struct cfb_info *cfb) +{ +strlcpy (cfb->i2c_adapter.name, cfb->fb.fix.id, +sizeof (cfb->i2c_adapter.name)); + cfb->i2c_adapter.owner =THIS_MODULE ; + cfb->i2c_adapter.class =I2C_CLASS_DDC ; + cfb->i2c_adapter.algo_data = &cfb->i2c_algo; + cfb->i2c_adapter.dev.parent = &cfb->dev->dev; + cfb->i2c_algo.setsda = cyber2000fb_setsda; + cfb->i2c_algo.setscl = cyber2000fb_setscl; + cfb->i2c_algo.getsda = cyber2000fb_getsda; + cfb->i2c_algo.getscl = cyber2000fb_getscl; + cfb->i2c_algo.udelay =10 ; + cfb->i2c_algo.timeout =20 ; + cfb->i2c_algo.data = cfb; + +i2c_set_adapdata (&cfb->i2c_adapter, cfb); + +return i2c_bit_add_bus (&cfb->i2c_adapter); +} +#endif /* CONFIG_FB_CYBER2000_I2C */ +/* * These parameters give * 640x480, hsync 31.5kHz, vsync 60Hz
@@ -1373,6 +1471,11 @@ static int __devinit cyberpro_common_pro cfb->fb.fix.mmio_len =MMIO_SIZE ; cfb->fb.screen_base = cfb->region; +#ifdef CONFIG_FB_CYBER2000_I2C +if (cyber2000fb_setup_ddc_bus (cfb) =0 ) + cfb->i2c_registered = true; +#endif + err = -EINVAL ;if (!fb_find_mode (&cfb->fb.var, &cfb->fb, mode_option,NULL ,0 , &cyber2000fb_default_mode,8 )) {
@@ -1410,6 +1513,10 @@ static int __devinit cyberpro_common_pro err =register_framebuffer (&cfb->fb); failed: +#ifdef CONFIG_FB_CYBER2000_I2C +if (err && cfb->i2c_registered) +i2c_del_adapter (&cfb->i2c_adapter); +#endif return err; }
@@ -1661,6 +1768,10 @@ static void __devexit cyberpro_pci_removprintk (KERN_WARNING "%s: danger Will Robinson, " "danger danger! Oopsen imminent!\n" , cfb->fb.fix.id); +#ifdef CONFIG_FB_CYBER2000_I2C +if (cfb->i2c_registered) +i2c_del_adapter (&cfb->i2c_adapter); +#endif iounmap (cfb->region);cyberpro_free_fb_info (cfb);
drivers/video/Kconfig +9 -0
@@ -422,6 +422,15 @@ config FB_CYBER2000 Say Y if you have a NetWinder or a graphics card containing this device, otherwise say N. +config FB_CYBER2000_I2C + bool "DDC/I2C for CyberPro support" + depends on FB_CYBER2000 + select FB_DDC + default y + help + Say Y here if you want DDC support for your CyberPro graphics + card. This is only I2C bus support, driver does not use EDID. + config FB_APOLLO bool depends on (FB = y) && APOLLO
Signature · 1 line
Ondrej Zary
Quoted 3 lines · Ondrej Zary
Add I2C support for the DDC bus to cyber2000fb driver. This is only bus support, driver does not use EDID.
Tested on two different CyberPro 2000 cards with i2cdetect and decode-edid.
I'm debating a bit about this.
One thing I'm concerned about is switching the DCLK registers to DCC mode without any protection against mode changes co-inciding with I2C activity. On a SMP machine, it's possible for both to happen simultaneously.
Secondly, please name these I2C bits with 'ddc' in the name - the CyberPro appear to have more than one I2C bus on them (or can have) such as for driving SAA7111 video decoders.
PATCH v2 3/3 cyber2000fb: add I2C support
Add I2C support for the DDC bus to cyber2000fb driver. This is only bus support, driver does not use EDID.
Tested on two different CyberPro 2000 cards with i2cdetect and decode-edid.
---
This is v2 with added locking and ddc things properly named.
drivers/video/cyber2000fb.c +128 -0
@@ -48,6 +48,10 @@#include <linux/init.h> #include <linux/io.h> +#include <linux/i2c.h> +#include <linux/i2c-id.h> +#include <linux/i2c-algo-bit.h> +#include <asm/pgtable.h> #include <asm/system.h>
@@ -88,6 +92,12 @@ struct cfb_info {u_char ramdac_powerdown;u32 pseudo_palette[16 ]; +#ifdef CONFIG_FB_CYBER2000_I2C +bool ddc_registered; +struct i2c_adapter ddc_adapter; +struct i2c_algo_bit_data ddc_algo; +struct mutex reg_b0_lock; +#endif };static char *default_font ="Acorn8x8" ;
@@ -498,6 +508,9 @@ static void cyber2000fb_set_timing(struccyber2000_attrw (0x14 ,0x00 , cfb);/* PLL registers */ +#ifdef CONFIG_FB_CYBER2000_I2C +mutex_lock (&cfb->reg_b0_lock); +#endif cyber2000_grphw (EXT_DCLK_MULT , hw->clock_mult, cfb);cyber2000_grphw (EXT_DCLK_DIV , hw->clock_div, cfb);cyber2000_grphw (EXT_MCLK_MULT , cfb->mclk_mult, cfb);
@@ -505,6 +518,9 @@ static void cyber2000fb_set_timing(struccyber2000_grphw (0x90 ,0x01 , cfb);cyber2000_grphw (0xb9 ,0x80 , cfb);cyber2000_grphw (0xb9 ,0x00 , cfb); +#ifdef CONFIG_FB_CYBER2000_I2C +mutex_unlock (&cfb->reg_b0_lock); +#endif cfb->ramdac_ctrl = hw->ramdac;cyber2000fb_write_ramdac_ctrl (cfb);
@@ -1145,6 +1161,105 @@ void cyber2000fb_detach(int idx) }EXPORT_SYMBOL (cyber2000fb_detach); +#ifdef CONFIG_FB_CYBER2000_I2C + +#define DDC_REG 0xb0 +#define DDC_SCL_OUT (1 << 0) +#define DDC_SDA_OUT (1 << 4) +#define DDC_SCL_IN (1 << 2) +#define DDC_SDA_IN (1 << 6) + +static void cyber2000fb_enable_ddc (struct cfb_info *cfb) +{ +mutex_lock (&cfb->reg_b0_lock); +cyber2000fb_writew (0x1bf ,0x3ce , cfb); +} + +static void cyber2000fb_disable_ddc (struct cfb_info *cfb) +{ +cyber2000fb_writew (0x0bf ,0x3ce , cfb); +mutex_unlock (&cfb->reg_b0_lock); +} + + +static void cyber2000fb_setscl (void *data,int val) +{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (cfb); + reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SCL_OUT ; +else + reg &= ~DDC_SCL_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_disable_ddc (cfb); +} + +static void cyber2000fb_setsda (void *data,int val) +{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (cfb); + reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SDA_OUT ; +else + reg &= ~DDC_SDA_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_disable_ddc (cfb); +} + +static int cyber2000fb_getscl (void *data) +{ +struct cfb_info *cfb = data; +int retval; + +cyber2000fb_enable_ddc (cfb); + retval = !!(cyber2000_grphr (DDC_REG , cfb) &DDC_SCL_IN ); +cyber2000fb_disable_ddc (cfb); + +return retval; +} + +static int cyber2000fb_getsda (void *data) +{ +struct cfb_info *cfb = data; +int retval; + +cyber2000fb_enable_ddc (cfb); + retval = !!(cyber2000_grphr (DDC_REG , cfb) &DDC_SDA_IN ); +cyber2000fb_disable_ddc (cfb); + +return retval; +} + +static int __devinit cyber2000fb_setup_ddc_bus (struct cfb_info *cfb) +{ +mutex_init (&cfb->reg_b0_lock); + +strlcpy (cfb->ddc_adapter.name, cfb->fb.fix.id, +sizeof (cfb->ddc_adapter.name)); + cfb->ddc_adapter.owner =THIS_MODULE ; + cfb->ddc_adapter.class =I2C_CLASS_DDC ; + cfb->ddc_adapter.algo_data = &cfb->ddc_algo; + cfb->ddc_adapter.dev.parent = &cfb->dev->dev; + cfb->ddc_algo.setsda = cyber2000fb_setsda; + cfb->ddc_algo.setscl = cyber2000fb_setscl; + cfb->ddc_algo.getsda = cyber2000fb_getsda; + cfb->ddc_algo.getscl = cyber2000fb_getscl; + cfb->ddc_algo.udelay =10 ; + cfb->ddc_algo.timeout =20 ; + cfb->ddc_algo.data = cfb; + +i2c_set_adapdata (&cfb->ddc_adapter, cfb); + +return i2c_bit_add_bus (&cfb->ddc_adapter); +} +#endif /* CONFIG_FB_CYBER2000_I2C */ +/* * These parameters give * 640x480, hsync 31.5kHz, vsync 60Hz
@@ -1373,6 +1488,11 @@ static int __devinit cyberpro_common_pro cfb->fb.fix.mmio_len =MMIO_SIZE ; cfb->fb.screen_base = cfb->region; +#ifdef CONFIG_FB_CYBER2000_I2C +if (cyber2000fb_setup_ddc_bus (cfb) =0 ) + cfb->ddc_registered = true; +#endif + err = -EINVAL ;if (!fb_find_mode (&cfb->fb.var, &cfb->fb, mode_option,NULL ,0 , &cyber2000fb_default_mode,8 )) {
@@ -1410,6 +1530,10 @@ static int __devinit cyberpro_common_pro err =register_framebuffer (&cfb->fb); failed: +#ifdef CONFIG_FB_CYBER2000_I2C +if (err && cfb->ddc_registered) +i2c_del_adapter (&cfb->ddc_adapter); +#endif return err; }
@@ -1661,6 +1785,10 @@ static void __devexit cyberpro_pci_removprintk (KERN_WARNING "%s: danger Will Robinson, " "danger danger! Oopsen imminent!\n" , cfb->fb.fix.id); +#ifdef CONFIG_FB_CYBER2000_I2C +if (cfb->ddc_registered) +i2c_del_adapter (&cfb->ddc_adapter); +#endif iounmap (cfb->region);cyberpro_free_fb_info (cfb);
drivers/video/Kconfig +9 -0
@@ -422,6 +422,15 @@ config FB_CYBER2000 Say Y if you have a NetWinder or a graphics card containing this device, otherwise say N. +config FB_CYBER2000_I2C + bool "DDC/I2C for CyberPro support" + depends on FB_CYBER2000 + select FB_DDC + default y + help + Say Y here if you want DDC support for your CyberPro graphics + card. This is only I2C bus support, driver does not use EDID. + config FB_APOLLO bool depends on (FB = y) && APOLLO
Signature · 1 line
Ondrej Zary
Quoted 23 lines · Ondrej Zary
Add I2C support for the DDC bus to cyber2000fb driver. This is only bus support, driver does not use EDID.
Tested on two different CyberPro 2000 cards with i2cdetect and decode-edid.Signed-off-by Ondrej Zary <[email protected]>---
This is v2 with added locking and ddc things properly named.diff -urp
linux-2.6.35-rc3-/drivers/video/cyber2000fb.clinux-2.6.35-rc3/drivers/video/cyber2000fb.cdrivers/video/cyber2000fb.c +4
-0@@ -48,6 +48,10 @@#include <linux/init.h> #include <linux/io.h> +#include <linux/i2c.h> +#include <linux/i2c-id.h> +#include <linux/i2c-algo-bit.h> +#include <asm/pgtable.h> #include <asm/system.h>
drivers/video/cyber2000fb.c struct cfb_info { · line 95
Quoted 4 lines
drivers/video/cyber2000fb.c +1
-0@@ -88,6 +92,12 @@ struct cfb_info {u_char ramdac_powerdown;u32 pseudo_palette[16 ]; +#ifdef CONFIG_FB_CYBER2000_I2C
CONFIG_FB_CYBER2000_DDC please.
drivers/video/cyber2000fb.c struct cfb_info { · line 99
Quoted 4 lines
drivers/video/cyber2000fb.c +4
-0+bool ddc_registered; +struct i2c_adapter ddc_adapter; +struct i2c_algo_bit_data ddc_algo; +struct mutex reg_b0_lock;
Does the weight of a mutex really matter here, or would a spinlock be lighter weight?
Quoted 4 lines
drivers/video/cyber2000fb.c +4
-0+static void cyber2000fb_enable_ddc (struct cfb_info *cfb) +{ +mutex_lock (&cfb->reg_b0_lock); +cyber2000fb_writew (0x1bf ,0x3ce , cfb);
drivers/video/cyber2000fb.c void cyber2000fb_detach(int idx) · line 1185
Quoted 10 lines
drivers/video/cyber2000fb.c +10
-0+} + +static void cyber2000fb_disable_ddc (struct cfb_info *cfb) +{ +cyber2000fb_writew (0x0bf ,0x3ce , cfb); +mutex_unlock (&cfb->reg_b0_lock); +} + + +static void cyber2000fb_setscl (void *data,int val)
cyber2000fb_ddc_setscl
Quoted 5 lines
drivers/video/cyber2000fb.c +5
-0+{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (cfb);
drivers/video/cyber2000fb.c void cyber2000fb_detach(int idx) · line 1200
Quoted 10 lines
drivers/video/cyber2000fb.c +10
-0+ reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SCL_OUT ; +else + reg &= ~DDC_SCL_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_disable_ddc (cfb); +} + +static void cyber2000fb_setsda (void *data,int val)
cyber2000fb_ddc_setsda
Quoted 5 lines
drivers/video/cyber2000fb.c +5
-0+{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (cfb);
drivers/video/cyber2000fb.c void cyber2000fb_detach(int idx) · line 1215
Quoted 10 lines
drivers/video/cyber2000fb.c +10
-0+ reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SDA_OUT ; +else + reg &= ~DDC_SDA_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_disable_ddc (cfb); +} + +static int cyber2000fb_getscl (void *data)
cyber2000fb_ddc_getscl
drivers/video/cyber2000fb.c void cyber2000fb_detach(int idx) · line 1227
Quoted 12 lines
drivers/video/cyber2000fb.c +12
-0+{ +struct cfb_info *cfb = data; +int retval; + +cyber2000fb_enable_ddc (cfb); + retval = !!(cyber2000_grphr (DDC_REG , cfb) &DDC_SCL_IN ); +cyber2000fb_disable_ddc (cfb); + +return retval; +} + +static int cyber2000fb_getsda (void *data)
cyber2000fb_ddc_getsda
PATCH v3 3/3 cyber2000fb: add I2C support
Add I2C support for the DDC bus to cyber2000fb driver. This is only bus support, driver does not use EDID.
Tested on two different CyberPro 2000 cards with i2cdetect and decode-edid.
---
This is v3 with spinlock instead of mutex (I don't know what's better here - but both mode switch and DDC are not performance critical so it probably does not matter) and all new things properly named ddc.
drivers/video/cyber2000fb.c +128 -0
@@ -48,6 +48,10 @@#include <linux/init.h> #include <linux/io.h> +#include <linux/i2c.h> +#include <linux/i2c-id.h> +#include <linux/i2c-algo-bit.h> +#include <asm/pgtable.h> #include <asm/system.h>
@@ -88,6 +92,12 @@ struct cfb_info {u_char ramdac_powerdown;u32 pseudo_palette[16 ]; +#ifdef CONFIG_FB_CYBER2000_DDC +bool ddc_registered; +struct i2c_adapter ddc_adapter; +struct i2c_algo_bit_data ddc_algo; +spinlock_t reg_b0_lock; +#endif };static char *default_font ="Acorn8x8" ;
@@ -498,6 +508,9 @@ static void cyber2000fb_set_timing(struccyber2000_attrw (0x14 ,0x00 , cfb);/* PLL registers */ +#ifdef CONFIG_FB_CYBER2000_DDC +spin_lock (&cfb->reg_b0_lock); +#endif cyber2000_grphw (EXT_DCLK_MULT , hw->clock_mult, cfb);cyber2000_grphw (EXT_DCLK_DIV , hw->clock_div, cfb);cyber2000_grphw (EXT_MCLK_MULT , cfb->mclk_mult, cfb);
@@ -505,6 +518,9 @@ static void cyber2000fb_set_timing(struccyber2000_grphw (0x90 ,0x01 , cfb);cyber2000_grphw (0xb9 ,0x80 , cfb);cyber2000_grphw (0xb9 ,0x00 , cfb); +#ifdef CONFIG_FB_CYBER2000_DDC +spin_unlock (&cfb->reg_b0_lock); +#endif cfb->ramdac_ctrl = hw->ramdac;cyber2000fb_write_ramdac_ctrl (cfb);
@@ -1145,6 +1161,105 @@ void cyber2000fb_detach(int idx) }EXPORT_SYMBOL (cyber2000fb_detach); +#ifdef CONFIG_FB_CYBER2000_DDC + +#define DDC_REG 0xb0 +#define DDC_SCL_OUT (1 << 0) +#define DDC_SDA_OUT (1 << 4) +#define DDC_SCL_IN (1 << 2) +#define DDC_SDA_IN (1 << 6) + +static void cyber2000fb_enable_ddc (struct cfb_info *cfb) +{ +spin_lock (&cfb->reg_b0_lock); +cyber2000fb_writew (0x1bf ,0x3ce , cfb); +} + +static void cyber2000fb_disable_ddc (struct cfb_info *cfb) +{ +cyber2000fb_writew (0x0bf ,0x3ce , cfb); +spin_unlock (&cfb->reg_b0_lock); +} + + +static void cyber2000fb_ddc_setscl (void *data,int val) +{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (cfb); + reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SCL_OUT ; +else + reg &= ~DDC_SCL_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_disable_ddc (cfb); +} + +static void cyber2000fb_ddc_setsda (void *data,int val) +{ +struct cfb_info *cfb = data; +unsigned char reg; + +cyber2000fb_enable_ddc (cfb); + reg =cyber2000_grphr (DDC_REG , cfb); +if (!val)/* bit is inverted */ + reg |=DDC_SDA_OUT ; +else + reg &= ~DDC_SDA_OUT ; +cyber2000_grphw (DDC_REG , reg, cfb); +cyber2000fb_disable_ddc (cfb); +} + +static int cyber2000fb_ddc_getscl (void *data) +{ +struct cfb_info *cfb = data; +int retval; + +cyber2000fb_enable_ddc (cfb); + retval = !!(cyber2000_grphr (DDC_REG , cfb) &DDC_SCL_IN ); +cyber2000fb_disable_ddc (cfb); + +return retval; +} + +static int cyber2000fb_ddc_getsda (void *data) +{ +struct cfb_info *cfb = data; +int retval; + +cyber2000fb_enable_ddc (cfb); + retval = !!(cyber2000_grphr (DDC_REG , cfb) &DDC_SDA_IN ); +cyber2000fb_disable_ddc (cfb); + +return retval; +} + +static int __devinit cyber2000fb_setup_ddc_bus (struct cfb_info *cfb) +{ +spin_lock_init (&cfb->reg_b0_lock); + +strlcpy (cfb->ddc_adapter.name, cfb->fb.fix.id, +sizeof (cfb->ddc_adapter.name)); + cfb->ddc_adapter.owner =THIS_MODULE ; + cfb->ddc_adapter.class =I2C_CLASS_DDC ; + cfb->ddc_adapter.algo_data = &cfb->ddc_algo; + cfb->ddc_adapter.dev.parent = &cfb->dev->dev; + cfb->ddc_algo.setsda = cyber2000fb_ddc_setsda; + cfb->ddc_algo.setscl = cyber2000fb_ddc_setscl; + cfb->ddc_algo.getsda = cyber2000fb_ddc_getsda; + cfb->ddc_algo.getscl = cyber2000fb_ddc_getscl; + cfb->ddc_algo.udelay =10 ; + cfb->ddc_algo.timeout =20 ; + cfb->ddc_algo.data = cfb; + +i2c_set_adapdata (&cfb->ddc_adapter, cfb); + +return i2c_bit_add_bus (&cfb->ddc_adapter); +} +#endif /* CONFIG_FB_CYBER2000_DDC */ +/* * These parameters give * 640x480, hsync 31.5kHz, vsync 60Hz
@@ -1373,6 +1488,11 @@ static int __devinit cyberpro_common_pro cfb->fb.fix.mmio_len =MMIO_SIZE ; cfb->fb.screen_base = cfb->region; +#ifdef CONFIG_FB_CYBER2000_DDC +if (cyber2000fb_setup_ddc_bus (cfb) =0 ) + cfb->ddc_registered = true; +#endif + err = -EINVAL ;if (!fb_find_mode (&cfb->fb.var, &cfb->fb, mode_option,NULL ,0 , &cyber2000fb_default_mode,8 )) {
@@ -1410,6 +1530,10 @@ static int __devinit cyberpro_common_pro err =register_framebuffer (&cfb->fb); failed: +#ifdef CONFIG_FB_CYBER2000_DDC +if (err && cfb->ddc_registered) +i2c_del_adapter (&cfb->ddc_adapter); +#endif return err; }
@@ -1661,6 +1785,10 @@ static void __devexit cyberpro_pci_removprintk (KERN_WARNING "%s: danger Will Robinson, " "danger danger! Oopsen imminent!\n" , cfb->fb.fix.id); +#ifdef CONFIG_FB_CYBER2000_DDC +if (cfb->ddc_registered) +i2c_del_adapter (&cfb->ddc_adapter); +#endif iounmap (cfb->region);cyberpro_free_fb_info (cfb);
drivers/video/Kconfig +9 -0
@@ -422,6 +422,15 @@ config FB_CYBER2000 Say Y if you have a NetWinder or a graphics card containing this device, otherwise say N. +config FB_CYBER2000_DDC + bool "DDC for CyberPro support" + depends on FB_CYBER2000 + select FB_DDC + default y + help + Say Y here if you want DDC support for your CyberPro graphics + card. This is only I2C bus support, driver does not use EDID. + config FB_APOLLO bool depends on (FB = y) && APOLLO
Signature · 1 line
Ondrej Zary