Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 226226
b: refs/heads/master
c: c0b33bd
h: refs/heads/master
v: v3
  • Loading branch information
Hans de Goede authored and Mauro Carvalho Chehab committed Dec 29, 2010
1 parent 30a0d35 commit 8ead02b
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: bc25068495b110fcdf35a22f43d32637e99fd018
refs/heads/master: c0b33bdc5b8d9c1120dece660480d4dd86b817ee
55 changes: 54 additions & 1 deletion trunk/drivers/media/video/gspca/stv06xx/stv06xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,21 @@ static int stv06xx_init(struct gspca_dev *gspca_dev)
static int stv06xx_start(struct gspca_dev *gspca_dev)
{
struct sd *sd = (struct sd *) gspca_dev;
int err;
struct usb_host_interface *alt;
struct usb_interface *intf;
int err, packet_size;

intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
if (!alt) {
PDEBUG(D_ERR, "Couldn't get altsetting");
return -EIO;
}

packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
err = stv06xx_write_bridge(sd, STV_ISO_SIZE_L, packet_size);
if (err < 0)
return err;

/* Prepare the sensor for start */
err = sd->sensor->start(sd);
Expand All @@ -282,6 +296,43 @@ static int stv06xx_start(struct gspca_dev *gspca_dev)
return (err < 0) ? err : 0;
}

static int stv06xx_isoc_init(struct gspca_dev *gspca_dev)
{
struct usb_host_interface *alt;
struct sd *sd = (struct sd *) gspca_dev;

/* Start isoc bandwidth "negotiation" at max isoc bandwidth */
alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1];
alt->endpoint[0].desc.wMaxPacketSize =
cpu_to_le16(sd->sensor->max_packet_size[gspca_dev->curr_mode]);

return 0;
}

static int stv06xx_isoc_nego(struct gspca_dev *gspca_dev)
{
int ret, packet_size, min_packet_size;
struct usb_host_interface *alt;
struct sd *sd = (struct sd *) gspca_dev;

alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1];
packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
min_packet_size = sd->sensor->min_packet_size[gspca_dev->curr_mode];
if (packet_size <= min_packet_size)
return -EIO;

packet_size -= 100;
if (packet_size < min_packet_size)
packet_size = min_packet_size;
alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(packet_size);

ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1);
if (ret < 0)
PDEBUG(D_ERR|D_STREAM, "set alt 1 err %d", ret);

return ret;
}

static void stv06xx_stopN(struct gspca_dev *gspca_dev)
{
int err;
Expand Down Expand Up @@ -462,6 +513,8 @@ static const struct sd_desc sd_desc = {
.start = stv06xx_start,
.stopN = stv06xx_stopN,
.pkt_scan = stv06xx_pkt_scan,
.isoc_init = stv06xx_isoc_init,
.isoc_nego = stv06xx_isoc_nego,
#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
.int_pkt_scan = sd_int_pkt_scan,
#endif
Expand Down
11 changes: 10 additions & 1 deletion trunk/drivers/media/video/gspca/stv06xx/stv06xx_hdcs.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,11 @@ const struct stv06xx_sensor stv06xx_sensor_hdcs1x00 = {
.i2c_addr = (0x55 << 1),
.i2c_len = 1,

/* FIXME (see if we can lower min_packet_size, needs testing, and also
adjusting framerate when the bandwidth gets lower) */
.min_packet_size = { 847 },
.max_packet_size = { 847 },

.init = hdcs_init,
.probe = hdcs_probe_1x00,
.start = hdcs_start,
Expand All @@ -160,6 +165,11 @@ const struct stv06xx_sensor stv06xx_sensor_hdcs1020 = {
.i2c_addr = (0x55 << 1),
.i2c_len = 1,

/* FIXME (see if we can lower min_packet_size, needs testing, and also
adjusting framerate when the bandwidthm gets lower) */
.min_packet_size = { 847 },
.max_packet_size = { 847 },

.init = hdcs_init,
.probe = hdcs_probe_1020,
.start = hdcs_start,
Expand All @@ -177,7 +187,6 @@ static const u16 stv_bridge_init[][2] = {
{STV_REG04, 0x07},

{STV_SCAN_RATE, 0x20},
{STV_ISO_SIZE_L, 847},
{STV_Y_CTRL, 0x01},
{STV_X_CTRL, 0x0a}
};
Expand Down
18 changes: 14 additions & 4 deletions trunk/drivers/media/video/gspca/stv06xx/stv06xx_pb0100.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,11 +208,24 @@ static int pb0100_probe(struct sd *sd)

static int pb0100_start(struct sd *sd)
{
int err;
int err, packet_size, max_packet_size;
struct usb_host_interface *alt;
struct usb_interface *intf;
struct cam *cam = &sd->gspca_dev.cam;
s32 *sensor_settings = sd->sensor_priv;
u32 mode = cam->cam_mode[sd->gspca_dev.curr_mode].priv;

intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);

/* If we don't have enough bandwidth use a lower framerate */
max_packet_size = sd->sensor->max_packet_size[sd->gspca_dev.curr_mode];
if (packet_size < max_packet_size)
stv06xx_write_sensor(sd, PB_ROWSPEED, BIT(4)|BIT(3)|BIT(1));
else
stv06xx_write_sensor(sd, PB_ROWSPEED, BIT(5)|BIT(3)|BIT(1));

/* Setup sensor window */
if (mode & PB0100_CROP_TO_VGA) {
stv06xx_write_sensor(sd, PB_RSTART, 30);
Expand Down Expand Up @@ -328,9 +341,6 @@ static int pb0100_init(struct sd *sd)
stv06xx_write_bridge(sd, STV_REG03, 0x45);
stv06xx_write_bridge(sd, STV_REG04, 0x07);

/* ISO-Size (0x27b: 635... why? - HDCS uses 847) */
stv06xx_write_bridge(sd, STV_ISO_SIZE_L, 847);

/* Scan/timing for the sensor */
stv06xx_write_sensor(sd, PB_ROWSPEED, BIT(4)|BIT(3)|BIT(1));
stv06xx_write_sensor(sd, PB_CFILLIN, 14);
Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/media/video/gspca/stv06xx/stv06xx_pb0100.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ const struct stv06xx_sensor stv06xx_sensor_pb0100 = {
.i2c_addr = 0xba,
.i2c_len = 2,

.min_packet_size = { 635, 847 },
.max_packet_size = { 847, 923 },

.init = pb0100_init,
.probe = pb0100_probe,
.start = pb0100_start,
Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/media/video/gspca/stv06xx/stv06xx_sensor.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,10 @@ struct stv06xx_sensor {
/* length of an i2c word */
u8 i2c_len;

/* Isoc packet size (per mode) */
int min_packet_size[4];
int max_packet_size[4];

/* Probes if the sensor is connected */
int (*probe)(struct sd *sd);

Expand Down
17 changes: 1 addition & 16 deletions trunk/drivers/media/video/gspca/stv06xx/stv06xx_st6422.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,6 @@ static int st6422_init(struct sd *sd)
{ 0x150e, 0x8e },
{ 0x150f, 0x37 },
{ 0x15c0, 0x00 },
{ 0x15c1, 1023 }, /* 160x120, ISOC_PACKET_SIZE */
{ 0x15c3, 0x08 }, /* 0x04/0x14 ... test pictures ??? */


Expand All @@ -237,23 +236,9 @@ static void st6422_disconnect(struct sd *sd)

static int st6422_start(struct sd *sd)
{
int err, packet_size;
int err;
struct cam *cam = &sd->gspca_dev.cam;
s32 *sensor_settings = sd->sensor_priv;
struct usb_host_interface *alt;
struct usb_interface *intf;

intf = usb_ifnum_to_if(sd->gspca_dev.dev, sd->gspca_dev.iface);
alt = usb_altnum_to_altsetting(intf, sd->gspca_dev.alt);
if (!alt) {
err("Couldn't get altsetting");
return -EIO;
}

packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
err = stv06xx_write_bridge(sd, 0x15c1, packet_size);
if (err < 0)
return err;

if (cam->cam_mode[sd->gspca_dev.curr_mode].priv)
err = stv06xx_write_bridge(sd, 0x1505, 0x0f);
Expand Down
3 changes: 3 additions & 0 deletions trunk/drivers/media/video/gspca/stv06xx/stv06xx_st6422.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ static int st6422_set_exposure(struct gspca_dev *gspca_dev, __s32 val);

const struct stv06xx_sensor stv06xx_sensor_st6422 = {
.name = "ST6422",
/* No known way to lower framerate in case of less bandwidth */
.min_packet_size = { 300, 847 },
.max_packet_size = { 300, 847 },
.init = st6422_init,
.probe = st6422_probe,
.start = st6422_start,
Expand Down
9 changes: 4 additions & 5 deletions trunk/drivers/media/video/gspca/stv06xx/stv06xx_vv6410.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@ const struct stv06xx_sensor stv06xx_sensor_vv6410 = {
.i2c_flush = 5,
.i2c_addr = 0x20,
.i2c_len = 1,
/* FIXME (see if we can lower packet_size-s, needs testing, and also
adjusting framerate when the bandwidth gets lower) */
.min_packet_size = { 1023 },
.max_packet_size = { 1023 },
.init = vv6410_init,
.probe = vv6410_probe,
.start = vv6410_start,
Expand All @@ -220,10 +224,6 @@ static const u8 x1536[] = { /* 0x1536 - 0x153b */
0x02, 0x00, 0x60, 0x01, 0x20, 0x01
};

static const u8 x15c1[] = { /* 0x15c1 - 0x15c2 */
0xff, 0x03 /* Output word 0x03ff = 1023 (ISO size) */
};

static const struct stv_init stv_bridge_init[] = {
/* This reg is written twice. Some kind of reset? */
{NULL, 0x1620, 0x80},
Expand All @@ -232,7 +232,6 @@ static const struct stv_init stv_bridge_init[] = {
{NULL, 0x1423, 0x04},
{x1500, 0x1500, ARRAY_SIZE(x1500)},
{x1536, 0x1536, ARRAY_SIZE(x1536)},
{x15c1, 0x15c1, ARRAY_SIZE(x15c1)}
};

static const u8 vv6410_sensor_init[][2] = {
Expand Down

0 comments on commit 8ead02b

Please sign in to comment.