All of lore.kernel.org
 help / color / mirror / Atom feed
* [Patch 18/20] V4L(920) Fixed autodetection of max size by if alternate setting
@ 2005-11-07  2:58 mchehab
  0 siblings, 0 replies; only message in thread
From: mchehab @ 2005-11-07  2:58 UTC (permalink / raw)
  To: linux-kernel; +Cc: akpm, video4linux-list, Mauro Carvalho Chehab

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 5722 bytes --]

From: Mauro Carvalho Chehab <mchehab@brturbo.com.br>

- Fixed autodetection of max size by if alternate setting
- Fixed some debug messages

Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>

-----------------

diff -upNr oldtree/drivers/media/video/em28xx/em28xx-core.c linux/drivers/media/video/em28xx/em28xx-core.c
--- oldtree/drivers/media/video/em28xx/em28xx-core.c	2005-11-06 16:13:28.000000000 -0200
+++ linux/drivers/media/video/em28xx/em28xx-core.c	2005-11-06 16:13:29.000000000 -0200
@@ -797,20 +797,19 @@ int em28xx_set_alternate(struct em28xx *
 	dev->alt = alt;
 	if (dev->alt == 0) {
 		int i;
-		for(i=0;i< EM28XX_MAX_ALT; i++)
+		for(i=0;i< dev->num_alt; i++)
 			if(dev->alt_max_pkt_size[i]>dev->alt_max_pkt_size[dev->alt])
 				dev->alt=i;
 	}
 
 	if (dev->alt != prev_alt) {
 		dev->max_pkt_size = dev->alt_max_pkt_size[dev->alt];
-		em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u", dev->alt,
+		em28xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n", dev->alt,
 		       dev->max_pkt_size);
 		errCode = usb_set_interface(dev->udev, 0, dev->alt);
 		if (errCode < 0) {
-			em28xx_errdev
-					("cannot change alternate number to %d (error=%i)\n",
-					 dev->alt, errCode);
+			em28xx_errdev ("cannot change alternate number to %d (error=%i)\n",
+							dev->alt, errCode);
 			return errCode;
 		}
 	}
diff -upNr oldtree/drivers/media/video/em28xx/em28xx.h linux/drivers/media/video/em28xx/em28xx.h
--- oldtree/drivers/media/video/em28xx/em28xx.h	2005-11-06 16:13:28.000000000 -0200
+++ linux/drivers/media/video/em28xx/em28xx.h	2005-11-06 16:13:29.000000000 -0200
@@ -63,7 +63,6 @@
 
 /* default alternate; 0 means choose the best */
 #define EM28XX_PINOUT 0
-#define EM28XX_MAX_ALT 7
 
 #define EM28XX_INTERLACED_DEFAULT 1
 
@@ -267,7 +266,8 @@ struct em28xx {
 	struct usb_device *udev;	/* the usb device */
 	int alt;		/* alternate */
 	int max_pkt_size;	/* max packet size of isoc transaction */
-	unsigned int alt_max_pkt_size[EM28XX_MAX_ALT + 1];	/* array of wMaxPacketSize */
+	int num_alt;		/* Number of alternative settings */
+	unsigned int *alt_max_pkt_size;	/* array of wMaxPacketSize */
 	struct urb *urb[EM28XX_NUM_BUFS];	/* urb for isoc transfers */
 	char *transfer_buffer[EM28XX_NUM_BUFS];	/* transfer buffers for isoc transfer */
 	/* helper funcs that call usb_control_msg */
diff -upNr oldtree/drivers/media/video/em28xx/em28xx-video.c linux/drivers/media/video/em28xx/em28xx-video.c
--- oldtree/drivers/media/video/em28xx/em28xx-video.c	2005-11-06 16:13:28.000000000 -0200
+++ linux/drivers/media/video/em28xx/em28xx-video.c	2005-11-06 16:13:29.000000000 -0200
@@ -52,8 +52,7 @@ MODULE_LICENSE("GPL");
 
 static LIST_HEAD(em28xx_devlist);
 
-static unsigned int card[]  = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
-
+static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
 module_param_array(card,  int, NULL, 0444);
 MODULE_PARM_DESC(card,"card type");
 
@@ -1590,7 +1589,6 @@ static int em28xx_init_dev(struct em28xx
 	int retval = -ENOMEM;
 	int errCode, i;
 	unsigned int maxh, maxw;
-	struct usb_interface *uif;
 
 	dev->udev = udev;
 	dev->model = model;
@@ -1650,17 +1648,6 @@ static int em28xx_init_dev(struct em28xx
 	dev->vpic.depth = 16;
 	dev->vpic.palette = VIDEO_PALETTE_YUV422;
 
-	/* compute alternate max packet sizes */
-	uif = dev->udev->actconfig->interface[0];
-	dev->alt_max_pkt_size[0] = 0;
-	for (i = 1; i <= EM28XX_MAX_ALT && i < uif->num_altsetting ; i++) {
-		u16 tmp =
-		    le16_to_cpu(uif->altsetting[i].endpoint[1].desc.
-				wMaxPacketSize);
-		dev->alt_max_pkt_size[i] =
-		    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
-	}
-
 #ifdef CONFIG_MODULES
 	/* request some modules */
 	if (dev->decoder == EM28XX_SAA7113 || dev->decoder == EM28XX_SAA7114)
@@ -1755,6 +1742,7 @@ static int em28xx_usb_probe(struct usb_i
 {
 	const struct usb_endpoint_descriptor *endpoint;
 	struct usb_device *udev;
+	struct usb_interface *uif;
 	struct em28xx *dev = NULL;
 	int retval = -ENODEV;
 	int model,i,nr,ifnum;
@@ -1794,7 +1782,7 @@ static int em28xx_usb_probe(struct usb_i
 	nr=interface->minor;
 
 	if (nr>EM28XX_MAXBOARDS) {
-		printk ("em28xx: Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
+		printk (DRIVER_NAME ": Supports only %i em28xx boards.\n",EM28XX_MAXBOARDS);
 		return -ENOMEM;
 	}
 
@@ -1806,6 +1794,28 @@ static int em28xx_usb_probe(struct usb_i
 	}
 	memset(dev, 0, sizeof(*dev));
 
+	/* compute alternate max packet sizes */
+	uif = udev->actconfig->interface[0];
+
+	dev->num_alt=uif->num_altsetting;
+	printk(DRIVER_NAME ": Alternate settings: %i\n",dev->num_alt);
+//	dev->alt_max_pkt_size = kmalloc(sizeof(*dev->alt_max_pkt_size)*
+	dev->alt_max_pkt_size = kmalloc(32*
+						dev->num_alt,GFP_KERNEL);
+	if (dev->alt_max_pkt_size == NULL) {
+		em28xx_err(DRIVER_NAME ": out of memory!\n");
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < dev->num_alt ; i++) {
+		u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[1].desc.
+							wMaxPacketSize);
+		dev->alt_max_pkt_size[i] =
+		    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
+		printk(DRIVER_NAME ": Alternate setting %i, max size= %i\n",i,
+							dev->alt_max_pkt_size[i]);
+	}
+
 	snprintf(dev->name, 29, "em28xx #%d", nr);
 
 	if ((card[nr]>=0)&&(card[nr]<em28xx_bcount))
@@ -1875,11 +1885,12 @@ static void em28xx_usb_disconnect(struct
 
 	up(&dev->lock);
 
-	if (!dev->users)
+	if (!dev->users) {
+		kfree(dev->alt_max_pkt_size);
 		kfree(dev);
+	}
 
 	up_write(&em28xx_disconnect);
-
 }
 
 static struct usb_driver em28xx_usb_driver = {


	

	
		
_______________________________________________________ 
Yahoo! Acesso Grátis: Internet rápida e grátis. 
Instale o discador agora!
http://br.acesso.yahoo.com/


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2005-11-07  3:22 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-11-07  2:58 [Patch 18/20] V4L(920) Fixed autodetection of max size by if alternate setting mchehab

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.