Merge branch 'v4l_for_linus' of git://linuxtv.org/mchehab/for_linus

* 'v4l_for_linus' of git://linuxtv.org/mchehab/for_linus:
  [media] vp7045: fix buffer setup
  [media] nuvoton-cir: simplify raw IR sample handling
  [media] [Resend] viacam: Don't explode if pci_find_bus() returns NULL
  [media] v4l2: Fix documentation of the codec device controls
  [media] gspca - sonixj: Fix the darkness of sensor om6802 in 320x240
  [media] gspca - sonixj: Fix wrong register mask for sensor om6802
  [media] gspca - ov519: Fix LED inversion of some ov519 webcams
  [media] pwc: precedence bug in pwc_init_controls()
This commit is contained in:
Linus Torvalds 2011-09-11 14:58:47 -07:00
commit 87adf1c66c
8 changed files with 49 additions and 93 deletions

View File

@ -1455,7 +1455,7 @@ Applicable to the H264 encoder.</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-h264-vui-sar-idc">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_video_h264_vui_sar_idc</entry> <entry>enum&nbsp;v4l2_mpeg_video_h264_vui_sar_idc</entry>
</row> </row>
@ -1561,7 +1561,7 @@ Applicable to the H264 encoder.</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-h264-level">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_LEVEL</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_LEVEL</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_video_h264_level</entry> <entry>enum&nbsp;v4l2_mpeg_video_h264_level</entry>
</row> </row>
@ -1641,7 +1641,7 @@ Possible values are:</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-mpeg4-level">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_video_mpeg4_level</entry> <entry>enum&nbsp;v4l2_mpeg_video_mpeg4_level</entry>
</row> </row>
@ -1689,9 +1689,9 @@ Possible values are:</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-h264-profile">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_PROFILE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_PROFILE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_h264_profile</entry> <entry>enum&nbsp;v4l2_mpeg_video_h264_profile</entry>
</row> </row>
<row><entry spanname="descr">The profile information for H264. <row><entry spanname="descr">The profile information for H264.
Applicable to the H264 encoder. Applicable to the H264 encoder.
@ -1774,9 +1774,9 @@ Possible values are:</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-mpeg4-profile">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_mpeg4_profile</entry> <entry>enum&nbsp;v4l2_mpeg_video_mpeg4_profile</entry>
</row> </row>
<row><entry spanname="descr">The profile information for MPEG4. <row><entry spanname="descr">The profile information for MPEG4.
Applicable to the MPEG4 encoder. Applicable to the MPEG4 encoder.
@ -1820,9 +1820,9 @@ Applicable to the encoder.
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-multi-slice-mode">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_multi_slice_mode</entry> <entry>enum&nbsp;v4l2_mpeg_video_multi_slice_mode</entry>
</row> </row>
<row><entry spanname="descr">Determines how the encoder should handle division of frame into slices. <row><entry spanname="descr">Determines how the encoder should handle division of frame into slices.
Applicable to the encoder. Applicable to the encoder.
@ -1868,9 +1868,9 @@ Applicable to the encoder.</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-h264-loop-filter-mode">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_h264_loop_filter_mode</entry> <entry>enum&nbsp;v4l2_mpeg_video_h264_loop_filter_mode</entry>
</row> </row>
<row><entry spanname="descr">Loop filter mode for H264 encoder. <row><entry spanname="descr">Loop filter mode for H264 encoder.
Possible values are:</entry> Possible values are:</entry>
@ -1913,9 +1913,9 @@ Applicable to the H264 encoder.</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-h264-entropy-mode">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_h264_symbol_mode</entry> <entry>enum&nbsp;v4l2_mpeg_video_h264_entropy_mode</entry>
</row> </row>
<row><entry spanname="descr">Entropy coding mode for H264 - CABAC/CAVALC. <row><entry spanname="descr">Entropy coding mode for H264 - CABAC/CAVALC.
Applicable to the H264 encoder. Applicable to the H264 encoder.
@ -2140,9 +2140,9 @@ previous frames. Applicable to the H264 encoder.</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-video-header-mode">
<entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_HEADER_MODE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_VIDEO_HEADER_MODE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_header_mode</entry> <entry>enum&nbsp;v4l2_mpeg_video_header_mode</entry>
</row> </row>
<row><entry spanname="descr">Determines whether the header is returned as the first buffer or is <row><entry spanname="descr">Determines whether the header is returned as the first buffer or is
it returned together with the first frame. Applicable to encoders. it returned together with the first frame. Applicable to encoders.
@ -2320,9 +2320,9 @@ Valid only when H.264 and macroblock level RC is enabled (<constant>V4L2_CID_MPE
Applicable to the H264 encoder.</entry> Applicable to the H264 encoder.</entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-mfc51-video-frame-skip-mode">
<entry spanname="id"><constant>V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_mfc51_frame_skip_mode</entry> <entry>enum&nbsp;v4l2_mpeg_mfc51_video_frame_skip_mode</entry>
</row> </row>
<row><entry spanname="descr"> <row><entry spanname="descr">
Indicates in what conditions the encoder should skip frames. If encoding a frame would cause the encoded stream to be larger then Indicates in what conditions the encoder should skip frames. If encoding a frame would cause the encoded stream to be larger then
@ -2361,9 +2361,9 @@ the stream will meet tight bandwidth contraints. Applicable to encoders.
</entry> </entry>
</row> </row>
<row><entry></entry></row> <row><entry></entry></row>
<row> <row id="v4l2-mpeg-mfc51-video-force-frame-type">
<entry spanname="id"><constant>V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE</constant>&nbsp;</entry> <entry spanname="id"><constant>V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE</constant>&nbsp;</entry>
<entry>enum&nbsp;v4l2_mpeg_mfc51_force_frame_type</entry> <entry>enum&nbsp;v4l2_mpeg_mfc51_video_force_frame_type</entry>
</row> </row>
<row><entry spanname="descr">Force a frame type for the next queued buffer. Applicable to encoders. <row><entry spanname="descr">Force a frame type for the next queued buffer. Applicable to encoders.
Possible values are:</entry> Possible values are:</entry>

View File

@ -224,26 +224,8 @@ static struct dvb_usb_device_properties vp7045_properties;
static int vp7045_usb_probe(struct usb_interface *intf, static int vp7045_usb_probe(struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
struct dvb_usb_device *d; return dvb_usb_device_init(intf, &vp7045_properties,
int ret = dvb_usb_device_init(intf, &vp7045_properties, THIS_MODULE, NULL, adapter_nr);
THIS_MODULE, &d, adapter_nr);
if (ret)
return ret;
d->priv = kmalloc(20, GFP_KERNEL);
if (!d->priv) {
dvb_usb_device_exit(intf);
return -ENOMEM;
}
return ret;
}
static void vp7045_usb_disconnect(struct usb_interface *intf)
{
struct dvb_usb_device *d = usb_get_intfdata(intf);
kfree(d->priv);
dvb_usb_device_exit(intf);
} }
static struct usb_device_id vp7045_usb_table [] = { static struct usb_device_id vp7045_usb_table [] = {
@ -258,7 +240,7 @@ MODULE_DEVICE_TABLE(usb, vp7045_usb_table);
static struct dvb_usb_device_properties vp7045_properties = { static struct dvb_usb_device_properties vp7045_properties = {
.usb_ctrl = CYPRESS_FX2, .usb_ctrl = CYPRESS_FX2,
.firmware = "dvb-usb-vp7045-01.fw", .firmware = "dvb-usb-vp7045-01.fw",
.size_of_priv = sizeof(u8 *), .size_of_priv = 20,
.num_adapters = 1, .num_adapters = 1,
.adapter = { .adapter = {
@ -305,7 +287,7 @@ static struct dvb_usb_device_properties vp7045_properties = {
static struct usb_driver vp7045_usb_driver = { static struct usb_driver vp7045_usb_driver = {
.name = "dvb_usb_vp7045", .name = "dvb_usb_vp7045",
.probe = vp7045_usb_probe, .probe = vp7045_usb_probe,
.disconnect = vp7045_usb_disconnect, .disconnect = dvb_usb_device_exit,
.id_table = vp7045_usb_table, .id_table = vp7045_usb_table,
}; };

View File

@ -618,7 +618,6 @@ static void nvt_dump_rx_buf(struct nvt_dev *nvt)
static void nvt_process_rx_ir_data(struct nvt_dev *nvt) static void nvt_process_rx_ir_data(struct nvt_dev *nvt)
{ {
DEFINE_IR_RAW_EVENT(rawir); DEFINE_IR_RAW_EVENT(rawir);
unsigned int count;
u32 carrier; u32 carrier;
u8 sample; u8 sample;
int i; int i;
@ -631,65 +630,38 @@ static void nvt_process_rx_ir_data(struct nvt_dev *nvt)
if (nvt->carrier_detect_enabled) if (nvt->carrier_detect_enabled)
carrier = nvt_rx_carrier_detect(nvt); carrier = nvt_rx_carrier_detect(nvt);
count = nvt->pkts; nvt_dbg_verbose("Processing buffer of len %d", nvt->pkts);
nvt_dbg_verbose("Processing buffer of len %d", count);
init_ir_raw_event(&rawir); init_ir_raw_event(&rawir);
for (i = 0; i < count; i++) { for (i = 0; i < nvt->pkts; i++) {
nvt->pkts--;
sample = nvt->buf[i]; sample = nvt->buf[i];
rawir.pulse = ((sample & BUF_PULSE_BIT) != 0); rawir.pulse = ((sample & BUF_PULSE_BIT) != 0);
rawir.duration = US_TO_NS((sample & BUF_LEN_MASK) rawir.duration = US_TO_NS((sample & BUF_LEN_MASK)
* SAMPLE_PERIOD); * SAMPLE_PERIOD);
if ((sample & BUF_LEN_MASK) == BUF_LEN_MASK) { nvt_dbg("Storing %s with duration %d",
if (nvt->rawir.pulse == rawir.pulse) rawir.pulse ? "pulse" : "space", rawir.duration);
nvt->rawir.duration += rawir.duration;
else {
nvt->rawir.duration = rawir.duration;
nvt->rawir.pulse = rawir.pulse;
}
continue;
}
rawir.duration += nvt->rawir.duration; ir_raw_event_store_with_filter(nvt->rdev, &rawir);
init_ir_raw_event(&nvt->rawir);
nvt->rawir.duration = 0;
nvt->rawir.pulse = rawir.pulse;
if (sample == BUF_PULSE_BIT)
rawir.pulse = false;
if (rawir.duration) {
nvt_dbg("Storing %s with duration %d",
rawir.pulse ? "pulse" : "space",
rawir.duration);
ir_raw_event_store_with_filter(nvt->rdev, &rawir);
}
/* /*
* BUF_PULSE_BIT indicates end of IR data, BUF_REPEAT_BYTE * BUF_PULSE_BIT indicates end of IR data, BUF_REPEAT_BYTE
* indicates end of IR signal, but new data incoming. In both * indicates end of IR signal, but new data incoming. In both
* cases, it means we're ready to call ir_raw_event_handle * cases, it means we're ready to call ir_raw_event_handle
*/ */
if ((sample == BUF_PULSE_BIT) && nvt->pkts) { if ((sample == BUF_PULSE_BIT) && (i + 1 < nvt->pkts)) {
nvt_dbg("Calling ir_raw_event_handle (signal end)\n"); nvt_dbg("Calling ir_raw_event_handle (signal end)\n");
ir_raw_event_handle(nvt->rdev); ir_raw_event_handle(nvt->rdev);
} }
} }
nvt->pkts = 0;
nvt_dbg("Calling ir_raw_event_handle (buffer empty)\n"); nvt_dbg("Calling ir_raw_event_handle (buffer empty)\n");
ir_raw_event_handle(nvt->rdev); ir_raw_event_handle(nvt->rdev);
if (nvt->pkts) {
nvt_dbg("Odd, pkts should be 0 now... (its %u)", nvt->pkts);
nvt->pkts = 0;
}
nvt_dbg_verbose("%s done", __func__); nvt_dbg_verbose("%s done", __func__);
} }
@ -1048,7 +1020,6 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
spin_lock_init(&nvt->nvt_lock); spin_lock_init(&nvt->nvt_lock);
spin_lock_init(&nvt->tx.lock); spin_lock_init(&nvt->tx.lock);
init_ir_raw_event(&nvt->rawir);
ret = -EBUSY; ret = -EBUSY;
/* now claim resources */ /* now claim resources */

View File

@ -67,7 +67,6 @@ static int debug;
struct nvt_dev { struct nvt_dev {
struct pnp_dev *pdev; struct pnp_dev *pdev;
struct rc_dev *rdev; struct rc_dev *rdev;
struct ir_raw_event rawir;
spinlock_t nvt_lock; spinlock_t nvt_lock;

View File

@ -2858,7 +2858,6 @@ static void ov7xx0_configure(struct sd *sd)
case 0x60: case 0x60:
PDEBUG(D_PROBE, "Sensor is a OV7660"); PDEBUG(D_PROBE, "Sensor is a OV7660");
sd->sensor = SEN_OV7660; sd->sensor = SEN_OV7660;
sd->invert_led = 0;
break; break;
default: default:
PDEBUG(D_PROBE, "Unknown sensor: 0x76%x", low); PDEBUG(D_PROBE, "Unknown sensor: 0x76%x", low);
@ -3337,7 +3336,6 @@ static int sd_config(struct gspca_dev *gspca_dev,
case BRIDGE_OV519: case BRIDGE_OV519:
cam->cam_mode = ov519_vga_mode; cam->cam_mode = ov519_vga_mode;
cam->nmodes = ARRAY_SIZE(ov519_vga_mode); cam->nmodes = ARRAY_SIZE(ov519_vga_mode);
sd->invert_led = !sd->invert_led;
break; break;
case BRIDGE_OVFX2: case BRIDGE_OVFX2:
cam->cam_mode = ov519_vga_mode; cam->cam_mode = ov519_vga_mode;
@ -5005,24 +5003,24 @@ static const struct sd_desc sd_desc = {
/* -- module initialisation -- */ /* -- module initialisation -- */
static const struct usb_device_id device_table[] = { static const struct usb_device_id device_table[] = {
{USB_DEVICE(0x041e, 0x4003), .driver_info = BRIDGE_W9968CF }, {USB_DEVICE(0x041e, 0x4003), .driver_info = BRIDGE_W9968CF },
{USB_DEVICE(0x041e, 0x4052), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x041e, 0x4052),
{USB_DEVICE(0x041e, 0x405f),
.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED }, .driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
{USB_DEVICE(0x041e, 0x405f), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x041e, 0x4060), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x041e, 0x4060), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x041e, 0x4061), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x041e, 0x4061), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x041e, 0x4064), {USB_DEVICE(0x041e, 0x4064), .driver_info = BRIDGE_OV519 },
.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
{USB_DEVICE(0x041e, 0x4067), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x041e, 0x4067), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x041e, 0x4068), {USB_DEVICE(0x041e, 0x4068), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x045e, 0x028c),
.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED }, .driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
{USB_DEVICE(0x045e, 0x028c), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x054c, 0x0154), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x054c, 0x0154), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x054c, 0x0155), {USB_DEVICE(0x054c, 0x0155), .driver_info = BRIDGE_OV519 },
.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
{USB_DEVICE(0x05a9, 0x0511), .driver_info = BRIDGE_OV511 }, {USB_DEVICE(0x05a9, 0x0511), .driver_info = BRIDGE_OV511 },
{USB_DEVICE(0x05a9, 0x0518), .driver_info = BRIDGE_OV518 }, {USB_DEVICE(0x05a9, 0x0518), .driver_info = BRIDGE_OV518 },
{USB_DEVICE(0x05a9, 0x0519), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x05a9, 0x0519),
{USB_DEVICE(0x05a9, 0x0530), .driver_info = BRIDGE_OV519 }, .driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
{USB_DEVICE(0x05a9, 0x0530),
.driver_info = BRIDGE_OV519 | BRIDGE_INVERT_LED },
{USB_DEVICE(0x05a9, 0x2800), .driver_info = BRIDGE_OVFX2 }, {USB_DEVICE(0x05a9, 0x2800), .driver_info = BRIDGE_OVFX2 },
{USB_DEVICE(0x05a9, 0x4519), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x05a9, 0x4519), .driver_info = BRIDGE_OV519 },
{USB_DEVICE(0x05a9, 0x8519), .driver_info = BRIDGE_OV519 }, {USB_DEVICE(0x05a9, 0x8519), .driver_info = BRIDGE_OV519 },

View File

@ -2386,7 +2386,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
reg_w1(gspca_dev, 0x01, 0x22); reg_w1(gspca_dev, 0x01, 0x22);
msleep(100); msleep(100);
reg01 = SCL_SEL_OD | S_PDN_INV; reg01 = SCL_SEL_OD | S_PDN_INV;
reg17 &= MCK_SIZE_MASK; reg17 &= ~MCK_SIZE_MASK;
reg17 |= 0x04; /* clock / 4 */ reg17 |= 0x04; /* clock / 4 */
break; break;
} }
@ -2532,6 +2532,10 @@ static int sd_start(struct gspca_dev *gspca_dev)
if (!mode) { /* if 640x480 */ if (!mode) { /* if 640x480 */
reg17 &= ~MCK_SIZE_MASK; reg17 &= ~MCK_SIZE_MASK;
reg17 |= 0x04; /* clock / 4 */ reg17 |= 0x04; /* clock / 4 */
} else {
reg01 &= ~SYS_SEL_48M; /* clk 24Mz */
reg17 &= ~MCK_SIZE_MASK;
reg17 |= 0x02; /* clock / 2 */
} }
break; break;
case SENSOR_OV7630: case SENSOR_OV7630:

View File

@ -338,7 +338,7 @@ int pwc_init_controls(struct pwc_device *pdev)
if (pdev->restore_factory) if (pdev->restore_factory)
pdev->restore_factory->flags = V4L2_CTRL_FLAG_UPDATE; pdev->restore_factory->flags = V4L2_CTRL_FLAG_UPDATE;
if (!pdev->features & FEATURE_MOTOR_PANTILT) if (!(pdev->features & FEATURE_MOTOR_PANTILT))
return hdl->error; return hdl->error;
/* Motor pan / tilt / reset */ /* Motor pan / tilt / reset */

View File

@ -1332,6 +1332,8 @@ static __devinit bool viacam_serial_is_enabled(void)
struct pci_bus *pbus = pci_find_bus(0, 0); struct pci_bus *pbus = pci_find_bus(0, 0);
u8 cbyte; u8 cbyte;
if (!pbus)
return false;
pci_bus_read_config_byte(pbus, VIACAM_SERIAL_DEVFN, pci_bus_read_config_byte(pbus, VIACAM_SERIAL_DEVFN,
VIACAM_SERIAL_CREG, &cbyte); VIACAM_SERIAL_CREG, &cbyte);
if ((cbyte & VIACAM_SERIAL_BIT) == 0) if ((cbyte & VIACAM_SERIAL_BIT) == 0)