Thread (5 messages) 5 messages, 2 authors, 2010-08-01

Re: [PATCH 3/3 v2] cyber2000fb: add I2C support

flat view

From: Russell King - ARM Linux <hidden>
Date: 2010-08-01 08:44:35
Also in: lkml

On Sun, Aug 01, 2010 at 12:13:37AM +0200, Ondrej Zary wrote:
quoted hunk ↗ jump to hunk
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 <redacted>
---
This is v2 with added locking and ddc things properly named.

diff -urp linux-2.6.35-rc3-/drivers/video/cyber2000fb.c linux-2.6.35-rc3/drivers/video/cyber2000fb.c
--- linux-2.6.35-rc3-/drivers/video/cyber2000fb.c	2010-07-31 21:58:35.000000000 +0200
+++ linux-2.6.35-rc3/drivers/video/cyber2000fb.c	2010-08-01 00:02:59.000000000 +0200
@@ -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
CONFIG_FB_CYBER2000_DDC please.
quoted hunk ↗ jump to hunk
+	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 hunk ↗ jump to hunk
+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)
cyber2000fb_ddc_setscl
quoted hunk ↗ jump to hunk
+{
+	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)
cyber2000fb_ddc_setsda
quoted hunk ↗ jump to hunk
+{
+	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)
cyber2000fb_ddc_getscl
quoted hunk ↗ jump to hunk
+{
+	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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help