Re: patch: s2255drv high quality mode and video status querying

2009-04-20 Thread Mauro Carvalho Chehab
On Tue, 7 Apr 2009 10:56:36 -0700 (PDT)
Dean A. d...@sensoray.com wrote:

 From: Dean Anderson d...@sensoray.com
 
 This patch adds V4L2 video status capability and V4L2_MODE_HIGHQUALITY
 operation.

Hi Dean,

I have a few comments to add over Trent's one.

 
 Signed-off-by: Dean Anderson d...@sensoray.com
 
 --- v4l-dvb-1e670024659d/linux/drivers/media/video/s2255drv.c.orig
 2009-04-07 10:38:42.0 -0700
 +++ v4l-dvb-1e670024659d/linux/drivers/media/video/s2255drv.c 2009-04-07 
 10:42:51.0 -0700
 @@ -57,7 +57,8 @@
  
  #define FIRMWARE_FILE_NAME f2255usb.bin
  
 -
 +#define S2255_REV_MAJOR 1
 +#define S2255_REV_MINOR 20
  
 +
  #define S2255_MAJOR_VERSION  1
  #define S2255_MINOR_VERSION  13

Hmm... Why you need two different major/minor versions on your driver?


 @@ -1207,8 +1236,8 @@ static int s2255_set_mode(struct s2255_d
 struct s2255_mode *mode)
  {
   int res;
 - u32 *buffer;
 - unsigned long chn_rev;
 + __le32 *buffer;
 + u32 chn_rev;

Also, please don't mix more than one thing at the same patch. Clearly, you did
some endiannes fix at the same patch. Please split it into different patches.

 +static int s2255_cmd_status(struct s2255_dev *dev, unsigned long chn,
 + u32 *pstatus)
 +{
 + int res;
 + __le32 *buffer;
 + u32 chn_rev;
 +
 + mutex_lock(dev-lock);
 + chn_rev = G_chnmap[chn];
 + dprintk(4, s2255_get_status: chan %d\n, chn_rev);
 + buffer = kzalloc(512, GFP_KERNEL);
 + if (buffer == NULL) {
 + dev_err(dev-udev-dev, out of mem\n);
 + mutex_unlock(dev-lock);
 + return -ENOMEM;
 + }
 + /* form the get vid status command */
 + buffer[0] = IN_DATA_TOKEN;
 + buffer[1] = cpu_to_le32(chn_rev);
 + buffer[2] = CMD_STATUS;
 + *pstatus = 0;
 + dev-vidstatus_ready[chn] = 0;
 + res = s2255_write_config(dev-udev, (unsigned char *)buffer, 512);
 + kfree(buffer);
 + wait_event_timeout(dev-wait_vidstatus[chn],
 +(dev-vidstatus_ready[chn] != 0),
 +msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT));
 + if (dev-vidstatus_ready[chn] != 1) {
 + printk(KERN_DEBUG s2255: no vidstatus response\n);
 + res = -EFAULT;
 + }
 + *pstatus = dev-vidstatus[chn];
 + dprintk(4, s2255: vid status %d\n, *pstatus);
 + mutex_unlock(dev-lock);
 + return res;
 +}
 +

Also, please split high quality mode from video status querying. You should
provide one patch per different feature you're adding.


Cheers,
Mauro
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: patch: s2255drv high quality mode and video status querying

2009-04-07 Thread Trent Piepho
On Tue, 7 Apr 2009, Dean A. wrote:
 +static int vidioc_g_parm(struct file *file, void *priv,
 +  struct v4l2_streamparm *sp)
 +{
 + struct s2255_fh *fh = priv;
 + struct s2255_dev *dev = fh-dev;
 + if (sp-type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
 + return -EINVAL;

You do not need to check the buffer type, video_ioctl2 does it already.
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


patch: s2255drv high quality mode and video status querying

2009-04-07 Thread Dean A.
From: Dean Anderson d...@sensoray.com

This patch adds V4L2 video status capability and V4L2_MODE_HIGHQUALITY
operation.

Signed-off-by: Dean Anderson d...@sensoray.com

--- v4l-dvb-1e670024659d/linux/drivers/media/video/s2255drv.c.orig  
2009-04-07 10:38:42.0 -0700
+++ v4l-dvb-1e670024659d/linux/drivers/media/video/s2255drv.c   2009-04-07 
10:42:51.0 -0700
@@ -57,7 +57,8 @@
 
 #define FIRMWARE_FILE_NAME f2255usb.bin
 
-
+#define S2255_REV_MAJOR 1
+#define S2255_REV_MINOR 20
 
 /* default JPEG quality */
 #define S2255_DEF_JPEG_QUAL 50
@@ -75,9 +76,13 @@
 #define S2255_LOAD_TIMEOUT  (5000 + S2255_DSP_BOOTTIME)
 #define S2255_DEF_BUFS  16
 #define S2255_SETMODE_TIMEOUT   500
+#define S2255_VIDSTATUS_TIMEOUT 350
 #define MAX_CHANNELS   4
-#define S2255_MARKER_FRAME 0x2255DA4AL
-#define S2255_MARKER_RESPONSE  0x2255ACACL
+#define S2255_MARKER_FRAME cpu_to_le32(0x2255DA4AL)
+#define S2255_MARKER_RESPONSE  cpu_to_le32(0x2255ACACL)
+#define S2255_RESPONSE_SETMODE  cpu_to_le32(0x01)
+#define S2255_RESPONSE_FW   cpu_to_le32(0x10)
+#define S2255_RESPONSE_STATUS   cpu_to_le32(0x20)
 #define S2255_USB_XFER_SIZE(16 * 1024)
 #define MAX_CHANNELS   4
 #define MAX_PIPE_BUFFERS   1
@@ -100,14 +105,16 @@
 #define LINE_SZ_DEF640
 #define NUM_LINES_DEF  240
 
-
 /* predefined settings */
 #define FORMAT_NTSC1
 #define FORMAT_PAL 2
 
+/* SCALE_4CIFS is the 2 fields merge into one */
 #define SCALE_4CIFS1   /* 640x480(NTSC) or 704x576(PAL) */
 #define SCALE_2CIFS2   /* 640x240(NTSC) or 704x288(PAL) */
 #define SCALE_1CIFS3   /* 320x240(NTSC) or 352x288(PAL) */
+/* SCALE_4CIFSI is the 2 fields interpolated into one */
+#define SCALE_4CIFSI   4   /* 640x480(NTSC) or 704x576(PAL) high quality */
 
 #define COLOR_YUVPL1   /* YUV planar */
 #define COLOR_YUVPK2   /* YUV packed */
@@ -134,12 +141,12 @@
 #define DEF_HUE0
 
 /* usb config commands */
-#define IN_DATA_TOKEN  0x2255c0de
-#define CMD_2255   0xc2255000
-#define CMD_SET_MODE   (CMD_2255 | 0x10)
-#define CMD_START  (CMD_2255 | 0x20)
-#define CMD_STOP   (CMD_2255 | 0x30)
-#define CMD_STATUS (CMD_2255 | 0x40)
+#define IN_DATA_TOKEN  cpu_to_le32(0x2255c0de)
+#define CMD_2255   cpu_to_le32(0xc2255000)
+#define CMD_SET_MODE   cpu_to_le32((CMD_2255 | 0x10))
+#define CMD_START  cpu_to_le32((CMD_2255 | 0x20))
+#define CMD_STOP   cpu_to_le32((CMD_2255 | 0x30))
+#define CMD_STATUS cpu_to_le32((CMD_2255 | 0x40))
 
 struct s2255_mode {
u32 format; /* input video format (NTSC, PAL) */
@@ -181,7 +188,6 @@ struct s2255_dmaqueue {
struct list_headactive;
/* thread for acquisition */
struct task_struct  *kthread;
-   int frame;
struct s2255_dev*dev;
int channel;
 };
@@ -211,16 +217,12 @@ struct s2255_pipeinfo {
u32 max_transfer_size;
u32 cur_transfer_size;
u8 *transfer_buffer;
-   u32 transfer_flags;;
u32 state;
-   u32 prev_state;
u32 urb_size;
void *stream_urb;
void *dev;  /* back pointer to s2255_dev struct*/
u32 err_count;
-   u32 buf_index;
u32 idx;
-   u32 priority_set;
 };
 
 struct s2255_fmt; /*forward declaration */
@@ -239,14 +241,15 @@ struct s2255_dev {
struct video_device *vdev[MAX_CHANNELS];
struct list_heads2255_devlist;
struct timer_list   timer;
-   struct s2255_fw *fw_data;
-   int board_num;
-   int is_open;
+   struct s2255_fw *fw_data;
struct s2255_pipeinfo   pipes[MAX_PIPE_BUFFERS];
struct s2255_bufferibuffer[MAX_CHANNELS];
struct s2255_mode   mode[MAX_CHANNELS];
/* jpeg compression */
struct v4l2_jpegcompression jc[MAX_CHANNELS];
+   /* capture parameters (for high quality mode full size) */
+   struct v4l2_captureparm cap_parm[MAX_CHANNELS];
+
const struct s2255_fmt  *cur_fmt[MAX_CHANNELS];
int cur_frame[MAX_CHANNELS];
int last_frame[MAX_CHANNELS];
@@ -265,9 +268,16 @@ struct s2255_dev {
int chn_configured[MAX_CHANNELS];
wait_queue_head_t   wait_setmode[MAX_CHANNELS];
int setmode_ready[MAX_CHANNELS];
+   /* video status items */
+   int vidstatus[MAX_CHANNELS];
+   wait_queue_head_t   wait_vidstatus[MAX_CHANNELS];
+   int vidstatus_ready[MAX_CHANNELS];
+
int chn_ready;
struct kref kref;
spinlock_t  slock;
+   /* dsp firmware version (f2255usb.bin) */
+   int dsp_fw_ver;
 };
 #define to_s2255_dev(d) container_of(d, struct