diff -rduN linux-source-2.6.35-orig/drivers/media/video/gspca/gspca.c linux-source-2.6.35/drivers/media/video/gspca/gspca.c
--- linux-source-2.6.35-orig/drivers/media/video/gspca/gspca.c	2011-01-21 18:40:16.000000000 +0100
+++ linux-source-2.6.35/drivers/media/video/gspca/gspca.c	2011-02-11 09:29:27.335050995 +0100
@@ -2332,6 +2332,9 @@
 	}
 
 	usb_set_intfdata(intf, gspca_dev);
+	if(sd_desc->register_sysfs)
+		sd_desc->register_sysfs(gspca_dev);
+
 	PDEBUG(D_PROBE, "%s created", video_device_node_name(&gspca_dev->vdev));
 
 	gspca_input_create_urb(gspca_dev);
@@ -2379,6 +2382,10 @@
 		input_unregister_device(input_dev);
 	}
 #endif
+	
+	if(gspca_dev->sd_desc->unregister_sysfs) {
+		gspca_dev->sd_desc->unregister_sysfs(gspca_dev);
+	}
 
 	/* the device is freed at exit of this function */
 	gspca_dev->dev = NULL;
diff -rduN linux-source-2.6.35-orig/drivers/media/video/gspca/gspca.h linux-source-2.6.35/drivers/media/video/gspca/gspca.h
--- linux-source-2.6.35-orig/drivers/media/video/gspca/gspca.h	2010-08-02 00:11:14.000000000 +0200
+++ linux-source-2.6.35/drivers/media/video/gspca/gspca.h	2011-02-11 07:55:18.633718195 +0100
@@ -96,6 +96,9 @@
 				u8 *data,
 				int len);
 
+typedef int (*cam_register_sysfs) (struct gspca_dev *gspca_dev);
+typedef int (*cam_unregister_sysfs) (struct gspca_dev *gspca_dev);
+
 struct ctrl {
 	struct v4l2_queryctrl qctrl;
 	int (*set)(struct gspca_dev *, __s32);
@@ -136,6 +139,8 @@
 	   int_pkt_scan is NULL, for cams with non interrupt driven buttons */
 	u8 other_input;
 #endif
+	cam_register_sysfs register_sysfs;
+	cam_unregister_sysfs unregister_sysfs;
 };
 
 /* packet types when moving from iso buf to frame buf */
diff -rduN linux-source-2.6.35-orig/drivers/media/video/gspca/ov534.c linux-source-2.6.35/drivers/media/video/gspca/ov534.c
--- linux-source-2.6.35-orig/drivers/media/video/gspca/ov534.c	2010-08-02 00:11:14.000000000 +0200
+++ linux-source-2.6.35/drivers/media/video/gspca/ov534.c	2011-02-11 09:30:08.475050997 +0100
@@ -67,6 +67,9 @@
 	u8 hflip;
 	u8 vflip;
 	u8 freqfltr;
+
+	u8 guid[16];
+	char hwversion[11];
 };
 
 /* V4L2 controls supported by the driver */
@@ -479,7 +482,7 @@
 	struct usb_device *udev = gspca_dev->dev;
 	int ret;
 
-	PDEBUG(D_USBO, "reg=0x%04x, val=0%02x", reg, val);
+	PDEBUG(D_USBO, "reg=0x%04x, val=0x%02x", reg, val);
 	gspca_dev->usb_buf[0] = val;
 	ret = usb_control_msg(udev,
 			      usb_sndctrlpipe(udev, 0),
@@ -851,6 +854,82 @@
 	return 0;
 }
 
+static ssize_t show_hwversion(struct device *cd,
+                           struct device_attribute *attr, char *buf)
+{
+	struct sd *sd = (struct sd *)to_video_device(cd);
+        return sprintf(buf, "%s\n", sd->hwversion);
+}
+static DEVICE_ATTR(hwversion, S_IRUGO, show_hwversion, NULL);
+
+static void setHWVersion(struct gspca_dev *gspca_dev) {
+	unsigned int i;
+	struct sd *sd = (struct sd *) gspca_dev;
+
+	sd->hwversion[10] = 0;
+	ov534_reg_write(gspca_dev, 0xf9, 0x80);
+
+	for(i = 0; i < 10; i++) {
+        	ov534_reg_write(gspca_dev, 0xfb, 0x03);
+        	ov534_reg_write(gspca_dev, 0xfa, 0x7e + (i * 0x2));
+		sd->hwversion[i] =  (char)ov534_reg_read(gspca_dev, 0xfc);
+	}
+	PDEBUG(D_PROBE, "HW Version: %s", sd->hwversion);
+}
+
+
+static ssize_t show_guid(struct device *cd,
+                           struct device_attribute *attr, char *buf)
+{
+	struct sd *sd = (struct sd*)to_video_device(cd);
+	
+        return sprintf(buf, "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X\n", 
+		sd->guid[3], sd->guid[2], sd->guid[1], sd->guid[0], 
+		sd->guid[5], sd->guid[4],
+		sd->guid[7], sd->guid[6],
+		sd->guid[8], sd->guid[9],
+		sd->guid[10], sd->guid[11], sd->guid[12], sd->guid[13], sd->guid[14], sd->guid[15]
+	);
+}
+static DEVICE_ATTR(guid, S_IRUGO, show_guid, NULL);
+
+
+static void setGUID(struct gspca_dev *gspca_dev) {
+	unsigned int i;
+	struct sd *sd = (struct sd *) gspca_dev;
+ 
+	ov534_reg_write(gspca_dev, 0xf1, 0xac);
+	ov534_reg_write(gspca_dev, 0xf2, 0x1f);
+	ov534_reg_write(gspca_dev, 0xf3, 0xc0);
+	ov534_reg_write(gspca_dev, 0xf5, 0x37);
+	ov534_reg_read(gspca_dev, 0xf6);
+
+	for(i = 0; i < 16; i++) {
+		ov534_reg_write(gspca_dev, 0xf5, 0xf9);
+		ov534_reg_read(gspca_dev, 0xf6);
+		sd->guid[i] = ov534_reg_read(gspca_dev, 0xf4);
+	}
+	
+	PDEBUG(D_PROBE, "GUID: %02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", 
+		sd->guid[3], sd->guid[2], sd->guid[1], sd->guid[0], 
+		sd->guid[5], sd->guid[4],
+		sd->guid[7], sd->guid[6],
+		sd->guid[8], sd->guid[9],
+		sd->guid[10], sd->guid[11], sd->guid[12], sd->guid[13], sd->guid[14], sd->guid[15]
+	);
+}
+
+static int sd_register_sysfs(struct gspca_dev *gspca_dev) {
+	device_create_file(&gspca_dev->vdev.dev, &dev_attr_guid);
+	device_create_file(&gspca_dev->vdev.dev, &dev_attr_hwversion);
+	return 0;
+}
+static int sd_unregister_sysfs(struct gspca_dev *gspca_dev) {
+	device_remove_file(&gspca_dev->vdev.dev, &dev_attr_guid);
+	device_remove_file(&gspca_dev->vdev.dev, &dev_attr_hwversion);
+	return 0;
+}
+
 /* this function is called at probe and resume time */
 static int sd_init(struct gspca_dev *gspca_dev)
 {
@@ -885,6 +964,9 @@
 	ov534_set_led(gspca_dev, 0);
 	set_frame_rate(gspca_dev);
 
+	setHWVersion(gspca_dev);
+	setGUID(gspca_dev);
+
 	return 0;
 }
 
@@ -1301,6 +1384,8 @@
 	.querymenu = sd_querymenu,
 	.get_streamparm = sd_get_streamparm,
 	.set_streamparm = sd_set_streamparm,
+	.register_sysfs = sd_register_sysfs,
+	.unregister_sysfs = sd_unregister_sysfs,
 };
 
 /* -- module initialisation -- */

