2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
*
|
|
|
|
* device driver for Conexant 2388x based TV cards
|
|
|
|
* video4linux video interface
|
|
|
|
*
|
|
|
|
* (c) 2003-04 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
|
|
|
|
*
|
2007-01-21 00:58:17 +08:00
|
|
|
* (c) 2005-2006 Mauro Carvalho Chehab <mchehab@infradead.org>
|
|
|
|
* - Multituner support
|
|
|
|
* - video_ioctl2 conversion
|
|
|
|
* - PAL/M fixes
|
|
|
|
*
|
2005-04-17 06:20:36 +08:00
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
2016-11-13 20:07:38 +08:00
|
|
|
#include "cx88.h"
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/list.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/kmod.h>
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/slab.h>
|
|
|
|
#include <linux/interrupt.h>
|
2007-05-07 05:51:55 +08:00
|
|
|
#include <linux/dma-mapping.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
#include <linux/delay.h>
|
|
|
|
#include <linux/kthread.h>
|
|
|
|
#include <asm/div64.h>
|
|
|
|
|
2006-01-10 01:32:31 +08:00
|
|
|
#include <media/v4l2-common.h>
|
2008-07-20 19:12:02 +08:00
|
|
|
#include <media/v4l2-ioctl.h>
|
2012-05-11 22:25:03 +08:00
|
|
|
#include <media/v4l2-event.h>
|
2015-11-10 22:01:44 +08:00
|
|
|
#include <media/i2c/wm8775.h>
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
MODULE_DESCRIPTION("v4l2 driver module for cx2388x based TV cards");
|
|
|
|
MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
|
|
|
|
MODULE_LICENSE("GPL");
|
[media] Stop using linux/version.h on most video drivers
All the modified drivers didn't have any version increment since
Jan, 1 2011. Several of them didn't have any version increment
for a long time, even having new features and important bug fixes
happening.
As we're now filling the QUERYCAP version with the current Kernel
Release, we don't need to maintain a per-driver version control
anymore. So, let's just use the default.
In order to preserve the Kernel module version history, a
KERNEL_VERSION() macro were added to all modified drivers, and
the extraver number were incremented.
I opted to preserve the per-driver version control to a few
pwc, pvrusb2, s2255, s5p-fimc and sh_vou.
A few drivers are still using the legacy way to handle ioctl's.
So, we can't do such change on them, otherwise, they'll break.
Those are: uvc, et61x251 and sn9c102.
The rationale is that the per-driver version control seems to be
actively maintained on those.
Yet, I think that the better for them would be to just use the
default version numbering, instead of doing that by themselves.
While here, removed a few uneeded include linux/version.h
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2011-06-25 01:45:49 +08:00
|
|
|
MODULE_VERSION(CX88_VERSION);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
|
|
|
static unsigned int video_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
|
|
|
|
static unsigned int vbi_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
|
|
|
|
static unsigned int radio_nr[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
|
|
|
|
|
|
|
|
module_param_array(video_nr, int, NULL, 0444);
|
|
|
|
module_param_array(vbi_nr, int, NULL, 0444);
|
|
|
|
module_param_array(radio_nr, int, NULL, 0444);
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
MODULE_PARM_DESC(video_nr, "video device numbers");
|
|
|
|
MODULE_PARM_DESC(vbi_nr, "vbi device numbers");
|
|
|
|
MODULE_PARM_DESC(radio_nr, "radio device numbers");
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-04-23 01:41:48 +08:00
|
|
|
static unsigned int video_debug;
|
2016-11-16 16:59:49 +08:00
|
|
|
module_param(video_debug, int, 0644);
|
|
|
|
MODULE_PARM_DESC(video_debug, "enable debug messages [video]");
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-04-23 01:41:48 +08:00
|
|
|
static unsigned int irq_debug;
|
2016-11-16 16:59:49 +08:00
|
|
|
module_param(irq_debug, int, 0644);
|
|
|
|
MODULE_PARM_DESC(irq_debug, "enable debug messages [IRQ handler]");
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-13 20:07:38 +08:00
|
|
|
#define dprintk(level, fmt, arg...) do { \
|
|
|
|
if (video_debug >= level) \
|
|
|
|
printk(KERN_DEBUG pr_fmt("%s: video:" fmt), \
|
|
|
|
__func__, ##arg); \
|
|
|
|
} while (0)
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* ------------------------------------------------------------------- */
|
|
|
|
/* static data */
|
|
|
|
|
2010-08-25 20:50:20 +08:00
|
|
|
static const struct cx8800_fmt formats[] = {
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
.name = "8 bpp, gray",
|
|
|
|
.fourcc = V4L2_PIX_FMT_GREY,
|
|
|
|
.cxformat = ColorFormatY8,
|
|
|
|
.depth = 8,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "15 bpp RGB, le",
|
|
|
|
.fourcc = V4L2_PIX_FMT_RGB555,
|
|
|
|
.cxformat = ColorFormatRGB15,
|
|
|
|
.depth = 16,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "15 bpp RGB, be",
|
|
|
|
.fourcc = V4L2_PIX_FMT_RGB555X,
|
|
|
|
.cxformat = ColorFormatRGB15 | ColorFormatBSWAP,
|
|
|
|
.depth = 16,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "16 bpp RGB, le",
|
|
|
|
.fourcc = V4L2_PIX_FMT_RGB565,
|
|
|
|
.cxformat = ColorFormatRGB16,
|
|
|
|
.depth = 16,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "16 bpp RGB, be",
|
|
|
|
.fourcc = V4L2_PIX_FMT_RGB565X,
|
|
|
|
.cxformat = ColorFormatRGB16 | ColorFormatBSWAP,
|
|
|
|
.depth = 16,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "24 bpp RGB, le",
|
|
|
|
.fourcc = V4L2_PIX_FMT_BGR24,
|
|
|
|
.cxformat = ColorFormatRGB24,
|
|
|
|
.depth = 24,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "32 bpp RGB, le",
|
|
|
|
.fourcc = V4L2_PIX_FMT_BGR32,
|
|
|
|
.cxformat = ColorFormatRGB32,
|
|
|
|
.depth = 32,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "32 bpp RGB, be",
|
|
|
|
.fourcc = V4L2_PIX_FMT_RGB32,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
.cxformat = ColorFormatRGB32 | ColorFormatBSWAP |
|
|
|
|
ColorFormatWSWAP,
|
2005-04-17 06:20:36 +08:00
|
|
|
.depth = 32,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "4:2:2, packed, YUYV",
|
|
|
|
.fourcc = V4L2_PIX_FMT_YUYV,
|
|
|
|
.cxformat = ColorFormatYUY2,
|
|
|
|
.depth = 16,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
.name = "4:2:2, packed, UYVY",
|
|
|
|
.fourcc = V4L2_PIX_FMT_UYVY,
|
|
|
|
.cxformat = ColorFormatYUY2 | ColorFormatBSWAP,
|
|
|
|
.depth = 16,
|
|
|
|
.flags = FORMAT_FLAGS_PACKED,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static const struct cx8800_fmt *format_by_fourcc(unsigned int fourcc)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(formats); i++)
|
|
|
|
if (formats[i].fourcc == fourcc)
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
return formats + i;
|
2005-04-17 06:20:36 +08:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------- */
|
|
|
|
|
2012-06-10 18:39:52 +08:00
|
|
|
struct cx88_ctrl {
|
|
|
|
/* control information */
|
|
|
|
u32 id;
|
|
|
|
s32 minimum;
|
|
|
|
s32 maximum;
|
|
|
|
u32 step;
|
|
|
|
s32 default_value;
|
|
|
|
|
|
|
|
/* control register information */
|
|
|
|
u32 off;
|
|
|
|
u32 reg;
|
|
|
|
u32 sreg;
|
|
|
|
u32 mask;
|
|
|
|
u32 shift;
|
|
|
|
};
|
|
|
|
|
2012-05-11 20:07:45 +08:00
|
|
|
static const struct cx88_ctrl cx8800_vid_ctls[] = {
|
2005-04-17 06:20:36 +08:00
|
|
|
/* --- video --- */
|
|
|
|
{
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_BRIGHTNESS,
|
|
|
|
.minimum = 0x00,
|
|
|
|
.maximum = 0xff,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x7f,
|
|
|
|
.off = 128,
|
|
|
|
.reg = MO_CONTR_BRIGHT,
|
|
|
|
.mask = 0x00ff,
|
|
|
|
.shift = 0,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_CONTRAST,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 0xff,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x3f,
|
|
|
|
.off = 0,
|
|
|
|
.reg = MO_CONTR_BRIGHT,
|
|
|
|
.mask = 0xff00,
|
|
|
|
.shift = 8,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_HUE,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 0xff,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x7f,
|
|
|
|
.off = 128,
|
|
|
|
.reg = MO_HUE,
|
|
|
|
.mask = 0x00ff,
|
|
|
|
.shift = 0,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
/* strictly, this only describes only U saturation.
|
|
|
|
* V saturation is handled specially through code.
|
|
|
|
*/
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_SATURATION,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 0xff,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x7f,
|
|
|
|
.off = 0,
|
|
|
|
.reg = MO_UV_SATURATION,
|
|
|
|
.mask = 0x00ff,
|
|
|
|
.shift = 0,
|
2011-07-11 22:02:19 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_SHARPNESS,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 4,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x0,
|
|
|
|
.off = 0,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
/*
|
|
|
|
* NOTE: the value is converted and written to both even
|
|
|
|
* and odd registers in the code
|
|
|
|
*/
|
2012-06-10 18:39:52 +08:00
|
|
|
.reg = MO_FILTER_ODD,
|
|
|
|
.mask = 7 << 7,
|
|
|
|
.shift = 7,
|
2011-07-11 22:02:19 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_CHROMA_AGC,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 1,
|
|
|
|
.default_value = 0x1,
|
|
|
|
.reg = MO_INPUT_FORMAT,
|
|
|
|
.mask = 1 << 10,
|
|
|
|
.shift = 10,
|
2008-03-24 09:43:24 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_COLOR_KILLER,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 1,
|
|
|
|
.default_value = 0x1,
|
|
|
|
.reg = MO_INPUT_FORMAT,
|
|
|
|
.mask = 1 << 9,
|
|
|
|
.shift = 9,
|
2011-07-11 22:07:43 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_BAND_STOP_FILTER,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 1,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x0,
|
|
|
|
.off = 0,
|
|
|
|
.reg = MO_HTOTAL,
|
|
|
|
.mask = 3 << 11,
|
|
|
|
.shift = 11,
|
2012-05-11 20:07:45 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const struct cx88_ctrl cx8800_aud_ctls[] = {
|
|
|
|
{
|
2012-06-10 18:39:52 +08:00
|
|
|
/* --- audio --- */
|
|
|
|
.id = V4L2_CID_AUDIO_MUTE,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 1,
|
|
|
|
.default_value = 1,
|
|
|
|
.reg = AUD_VOL_CTL,
|
|
|
|
.sreg = SHADOW_AUD_VOL_CTL,
|
|
|
|
.mask = (1 << 6),
|
|
|
|
.shift = 6,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_AUDIO_VOLUME,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 0x3f,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x3f,
|
|
|
|
.reg = AUD_VOL_CTL,
|
|
|
|
.sreg = SHADOW_AUD_VOL_CTL,
|
|
|
|
.mask = 0x3f,
|
|
|
|
.shift = 0,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2012-06-10 18:39:52 +08:00
|
|
|
.id = V4L2_CID_AUDIO_BALANCE,
|
|
|
|
.minimum = 0,
|
|
|
|
.maximum = 0x7f,
|
|
|
|
.step = 1,
|
|
|
|
.default_value = 0x40,
|
|
|
|
.reg = AUD_BAL_CTL,
|
|
|
|
.sreg = SHADOW_AUD_BAL_CTL,
|
|
|
|
.mask = 0x7f,
|
|
|
|
.shift = 0,
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2012-05-11 20:07:45 +08:00
|
|
|
enum {
|
|
|
|
CX8800_VID_CTLS = ARRAY_SIZE(cx8800_vid_ctls),
|
|
|
|
CX8800_AUD_CTLS = ARRAY_SIZE(cx8800_aud_ctls),
|
|
|
|
};
|
2006-06-27 10:42:39 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
2007-01-21 00:58:29 +08:00
|
|
|
int cx88_video_mux(struct cx88_core *core, unsigned int input)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2005-09-10 04:03:41 +08:00
|
|
|
/* struct cx88_core *core = dev->core; */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
dprintk(1, "video_mux: %d [vmux=%d,gpio=0x%x,0x%x,0x%x,0x%x]\n",
|
2007-08-16 01:41:57 +08:00
|
|
|
input, INPUT(input).vmux,
|
2016-11-16 16:59:49 +08:00
|
|
|
INPUT(input).gpio0, INPUT(input).gpio1,
|
|
|
|
INPUT(input).gpio2, INPUT(input).gpio3);
|
2005-09-10 04:03:41 +08:00
|
|
|
core->input = input;
|
2007-08-16 01:41:57 +08:00
|
|
|
cx_andor(MO_INPUT_FORMAT, 0x03 << 14, INPUT(input).vmux << 14);
|
|
|
|
cx_write(MO_GP3_IO, INPUT(input).gpio3);
|
|
|
|
cx_write(MO_GP0_IO, INPUT(input).gpio0);
|
|
|
|
cx_write(MO_GP1_IO, INPUT(input).gpio1);
|
|
|
|
cx_write(MO_GP2_IO, INPUT(input).gpio2);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-08-16 01:41:57 +08:00
|
|
|
switch (INPUT(input).type) {
|
2005-04-17 06:20:36 +08:00
|
|
|
case CX88_VMUX_SVIDEO:
|
|
|
|
cx_set(MO_AFECFG_IO, 0x00000001);
|
|
|
|
cx_set(MO_INPUT_FORMAT, 0x00010010);
|
|
|
|
cx_set(MO_FILTER_EVEN, 0x00002020);
|
|
|
|
cx_set(MO_FILTER_ODD, 0x00002020);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
cx_clear(MO_AFECFG_IO, 0x00000001);
|
|
|
|
cx_clear(MO_INPUT_FORMAT, 0x00010010);
|
|
|
|
cx_clear(MO_FILTER_EVEN, 0x00002020);
|
|
|
|
cx_clear(MO_FILTER_ODD, 0x00002020);
|
|
|
|
break;
|
|
|
|
}
|
2006-10-17 03:51:11 +08:00
|
|
|
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
/*
|
|
|
|
* if there are audioroutes defined, we have an external
|
|
|
|
* ADC to deal with audio
|
|
|
|
*/
|
2007-10-17 07:52:08 +08:00
|
|
|
if (INPUT(input).audioroute) {
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
/*
|
|
|
|
* The wm8775 module has the "2" route hardwired into
|
|
|
|
* the initialization. Some boards may use different
|
|
|
|
* routes for different inputs. HVR-1300 surely does
|
|
|
|
*/
|
2013-05-29 21:44:22 +08:00
|
|
|
if (core->sd_wm8775) {
|
2009-04-02 22:26:22 +08:00
|
|
|
call_all(core, audio, s_routing,
|
2010-03-27 20:31:32 +08:00
|
|
|
INPUT(input).audioroute, 0, 0);
|
2007-10-17 07:52:08 +08:00
|
|
|
}
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
/*
|
|
|
|
* cx2388's C-ADC is connected to the tuner only.
|
|
|
|
* When used with S-Video, that ADC is busy dealing with
|
|
|
|
* chroma, so an external must be used for baseband audio
|
|
|
|
*/
|
2010-03-27 20:31:32 +08:00
|
|
|
if (INPUT(input).type != CX88_VMUX_TELEVISION &&
|
|
|
|
INPUT(input).type != CX88_VMUX_CABLE) {
|
2008-10-16 01:18:42 +08:00
|
|
|
/* "I2S ADC mode" */
|
|
|
|
core->tvaudio = WW_I2SADC;
|
|
|
|
cx88_set_tvaudio(core);
|
|
|
|
} else {
|
|
|
|
/* Normal mode */
|
|
|
|
cx_write(AUD_I2SCNTL, 0x0);
|
|
|
|
cx_clear(AUD_CTL, EN_I2SIN_ENABLE);
|
|
|
|
}
|
2006-10-17 03:51:11 +08:00
|
|
|
}
|
2007-10-17 07:52:08 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2007-01-21 00:58:29 +08:00
|
|
|
EXPORT_SYMBOL(cx88_video_mux);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
|
|
|
static int start_video_dma(struct cx8800_dev *dev,
|
|
|
|
struct cx88_dmaqueue *q,
|
|
|
|
struct cx88_buffer *buf)
|
|
|
|
{
|
|
|
|
struct cx88_core *core = dev->core;
|
|
|
|
|
|
|
|
/* setup fifo + format */
|
2005-09-10 04:03:41 +08:00
|
|
|
cx88_sram_channel_setup(core, &cx88_sram_channels[SRAM_CH21],
|
2005-04-17 06:20:36 +08:00
|
|
|
buf->bpl, buf->risc.dma);
|
2014-09-20 20:23:44 +08:00
|
|
|
cx88_set_scale(core, core->width, core->height, core->field);
|
2014-08-29 14:46:05 +08:00
|
|
|
cx_write(MO_COLOR_CTRL, dev->fmt->cxformat | ColorFormatGamma);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* reset counter */
|
2016-11-16 16:59:49 +08:00
|
|
|
cx_write(MO_VIDY_GPCNTRL, GP_COUNT_CONTROL_RESET);
|
2015-04-03 18:22:40 +08:00
|
|
|
q->count = 0;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* enable irqs */
|
2007-08-18 17:57:55 +08:00
|
|
|
cx_set(MO_PCI_INTMSK, core->pci_irqmask | PCI_INT_VIDINT);
|
2005-09-10 04:03:41 +08:00
|
|
|
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
/*
|
|
|
|
* Enables corresponding bits at PCI_INT_STAT:
|
|
|
|
* bits 0 to 4: video, audio, transport stream, VIP, Host
|
|
|
|
* bit 7: timer
|
|
|
|
* bits 8 and 9: DMA complete for: SRC, DST
|
|
|
|
* bits 10 and 11: BERR signal asserted for RISC: RD, WR
|
|
|
|
* bits 12 to 15: BERR signal asserted for: BRDG, SRC, DST, IPB
|
2005-09-10 04:03:41 +08:00
|
|
|
*/
|
2005-04-17 06:20:36 +08:00
|
|
|
cx_set(MO_VID_INTMSK, 0x0f0011);
|
|
|
|
|
|
|
|
/* enable capture */
|
2016-11-16 16:59:49 +08:00
|
|
|
cx_set(VID_CAPTURE_CONTROL, 0x06);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* start dma */
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
cx_set(MO_DEV_CNTRL2, (1 << 5));
|
2005-09-10 04:03:41 +08:00
|
|
|
cx_set(MO_VID_DMACNTRL, 0x11); /* Planar Y and packed FIFO and RISC enable */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2006-08-13 09:01:27 +08:00
|
|
|
#ifdef CONFIG_PM
|
2005-04-17 06:20:36 +08:00
|
|
|
static int stop_video_dma(struct cx8800_dev *dev)
|
|
|
|
{
|
|
|
|
struct cx88_core *core = dev->core;
|
|
|
|
|
|
|
|
/* stop dma */
|
|
|
|
cx_clear(MO_VID_DMACNTRL, 0x11);
|
|
|
|
|
|
|
|
/* disable capture */
|
2016-11-16 16:59:49 +08:00
|
|
|
cx_clear(VID_CAPTURE_CONTROL, 0x06);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* disable irqs */
|
2007-08-18 17:57:55 +08:00
|
|
|
cx_clear(MO_PCI_INTMSK, PCI_INT_VIDINT);
|
2005-04-17 06:20:36 +08:00
|
|
|
cx_clear(MO_VID_INTMSK, 0x0f0011);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int restart_video_queue(struct cx8800_dev *dev,
|
|
|
|
struct cx88_dmaqueue *q)
|
|
|
|
{
|
2014-08-10 22:56:14 +08:00
|
|
|
struct cx88_buffer *buf;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
if (!list_empty(&q->active)) {
|
2014-09-20 20:22:18 +08:00
|
|
|
buf = list_entry(q->active.next, struct cx88_buffer, list);
|
2016-11-16 16:59:49 +08:00
|
|
|
dprintk(2, "restart_queue [%p/%d]: restart dma\n",
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
buf, buf->vb.vb2_buf.index);
|
2005-04-17 06:20:36 +08:00
|
|
|
start_video_dma(dev, q, buf);
|
|
|
|
}
|
2014-08-10 22:56:14 +08:00
|
|
|
return 0;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2015-06-11 00:55:35 +08:00
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
2015-10-28 10:50:37 +08:00
|
|
|
static int queue_setup(struct vb2_queue *q,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
unsigned int *num_buffers, unsigned int *num_planes,
|
|
|
|
unsigned int sizes[], struct device *alloc_devs[])
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = q->drv_priv;
|
2014-09-20 20:23:44 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
2014-09-20 20:22:18 +08:00
|
|
|
|
|
|
|
*num_planes = 1;
|
2014-09-20 20:23:44 +08:00
|
|
|
sizes[0] = (dev->fmt->depth * core->width * core->height) >> 3;
|
2005-04-17 06:20:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
static int buffer_prepare(struct vb2_buffer *vb)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = vb->vb2_queue->drv_priv;
|
2005-09-10 04:03:41 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
struct cx88_buffer *buf = container_of(vbuf, struct cx88_buffer, vb);
|
2014-09-20 20:22:18 +08:00
|
|
|
struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, 0);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:23:44 +08:00
|
|
|
buf->bpl = core->width * dev->fmt->depth >> 3;
|
2014-09-20 20:22:18 +08:00
|
|
|
|
2014-09-20 20:23:44 +08:00
|
|
|
if (vb2_plane_size(vb, 0) < core->height * buf->bpl)
|
2005-04-17 06:20:36 +08:00
|
|
|
return -EINVAL;
|
2014-09-20 20:23:44 +08:00
|
|
|
vb2_set_plane_payload(vb, 0, core->height * buf->bpl);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:23:44 +08:00
|
|
|
switch (core->field) {
|
2014-08-29 14:46:05 +08:00
|
|
|
case V4L2_FIELD_TOP:
|
|
|
|
cx88_risc_buffer(dev->pci, &buf->risc,
|
2014-09-20 20:22:18 +08:00
|
|
|
sgt->sgl, 0, UNSET,
|
2014-09-20 20:23:44 +08:00
|
|
|
buf->bpl, 0, core->height);
|
2014-08-29 14:46:05 +08:00
|
|
|
break;
|
|
|
|
case V4L2_FIELD_BOTTOM:
|
|
|
|
cx88_risc_buffer(dev->pci, &buf->risc,
|
2014-09-20 20:22:18 +08:00
|
|
|
sgt->sgl, UNSET, 0,
|
2014-09-20 20:23:44 +08:00
|
|
|
buf->bpl, 0, core->height);
|
2014-08-29 14:46:05 +08:00
|
|
|
break;
|
|
|
|
case V4L2_FIELD_SEQ_TB:
|
|
|
|
cx88_risc_buffer(dev->pci, &buf->risc,
|
2014-09-20 20:22:18 +08:00
|
|
|
sgt->sgl,
|
2014-09-20 20:23:44 +08:00
|
|
|
0, buf->bpl * (core->height >> 1),
|
2014-08-29 14:46:05 +08:00
|
|
|
buf->bpl, 0,
|
2014-09-20 20:23:44 +08:00
|
|
|
core->height >> 1);
|
2014-08-29 14:46:05 +08:00
|
|
|
break;
|
|
|
|
case V4L2_FIELD_SEQ_BT:
|
|
|
|
cx88_risc_buffer(dev->pci, &buf->risc,
|
2014-09-20 20:22:18 +08:00
|
|
|
sgt->sgl,
|
2014-09-20 20:23:44 +08:00
|
|
|
buf->bpl * (core->height >> 1), 0,
|
2014-08-29 14:46:05 +08:00
|
|
|
buf->bpl, 0,
|
2014-09-20 20:23:44 +08:00
|
|
|
core->height >> 1);
|
2014-08-29 14:46:05 +08:00
|
|
|
break;
|
|
|
|
case V4L2_FIELD_INTERLACED:
|
|
|
|
default:
|
|
|
|
cx88_risc_buffer(dev->pci, &buf->risc,
|
2014-09-20 20:22:18 +08:00
|
|
|
sgt->sgl, 0, buf->bpl,
|
2014-08-29 14:46:05 +08:00
|
|
|
buf->bpl, buf->bpl,
|
2014-09-20 20:23:44 +08:00
|
|
|
core->height >> 1);
|
2014-08-29 14:46:05 +08:00
|
|
|
break;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
dprintk(2,
|
|
|
|
"[%p/%d] buffer_prepare - %dx%d %dbpp \"%s\" - dma=0x%08lx\n",
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
buf, buf->vb.vb2_buf.index,
|
2014-09-20 20:23:44 +08:00
|
|
|
core->width, core->height, dev->fmt->depth, dev->fmt->name,
|
2005-04-17 06:20:36 +08:00
|
|
|
(unsigned long)buf->risc.dma);
|
|
|
|
return 0;
|
2014-09-20 20:22:18 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void buffer_finish(struct vb2_buffer *vb)
|
|
|
|
{
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = vb->vb2_queue->drv_priv;
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
struct cx88_buffer *buf = container_of(vbuf, struct cx88_buffer, vb);
|
2014-08-29 15:11:54 +08:00
|
|
|
struct cx88_riscmem *risc = &buf->risc;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-08-29 15:11:54 +08:00
|
|
|
if (risc->cpu)
|
|
|
|
pci_free_consistent(dev->pci, risc->size, risc->cpu, risc->dma);
|
|
|
|
memset(risc, 0, sizeof(*risc));
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
static void buffer_queue(struct vb2_buffer *vb)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = vb->vb2_queue->drv_priv;
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
struct cx88_buffer *buf = container_of(vbuf, struct cx88_buffer, vb);
|
2005-04-17 06:20:36 +08:00
|
|
|
struct cx88_buffer *prev;
|
|
|
|
struct cx88_dmaqueue *q = &dev->vidq;
|
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
/* add jump to start */
|
|
|
|
buf->risc.cpu[1] = cpu_to_le32(buf->risc.dma + 8);
|
|
|
|
buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP | RISC_CNT_INC);
|
|
|
|
buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma + 8);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-08-10 22:56:14 +08:00
|
|
|
if (list_empty(&q->active)) {
|
2014-09-20 20:22:18 +08:00
|
|
|
list_add_tail(&buf->list, &q->active);
|
2016-11-16 16:59:49 +08:00
|
|
|
dprintk(2, "[%p/%d] buffer_queue - first active\n",
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
buf, buf->vb.vb2_buf.index);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
} else {
|
2014-09-20 20:22:18 +08:00
|
|
|
buf->risc.cpu[0] |= cpu_to_le32(RISC_IRQ1);
|
|
|
|
prev = list_entry(q->active.prev, struct cx88_buffer, list);
|
|
|
|
list_add_tail(&buf->list, &q->active);
|
2014-08-29 14:46:05 +08:00
|
|
|
prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
|
|
|
|
dprintk(2, "[%p/%d] buffer_queue - append to active\n",
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
buf, buf->vb.vb2_buf.index);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
static int start_streaming(struct vb2_queue *q, unsigned int count)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = q->drv_priv;
|
|
|
|
struct cx88_dmaqueue *dmaq = &dev->vidq;
|
|
|
|
struct cx88_buffer *buf = list_entry(dmaq->active.next,
|
|
|
|
struct cx88_buffer, list);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
start_video_dma(dev, dmaq, buf);
|
|
|
|
return 0;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
static void stop_streaming(struct vb2_queue *q)
|
|
|
|
{
|
|
|
|
struct cx8800_dev *dev = q->drv_priv;
|
|
|
|
struct cx88_core *core = dev->core;
|
|
|
|
struct cx88_dmaqueue *dmaq = &dev->vidq;
|
|
|
|
unsigned long flags;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
cx_clear(MO_VID_DMACNTRL, 0x11);
|
|
|
|
cx_clear(VID_CAPTURE_CONTROL, 0x06);
|
|
|
|
spin_lock_irqsave(&dev->slock, flags);
|
|
|
|
while (!list_empty(&dmaq->active)) {
|
|
|
|
struct cx88_buffer *buf = list_entry(dmaq->active.next,
|
|
|
|
struct cx88_buffer, list);
|
2012-05-11 21:33:25 +08:00
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
list_del(&buf->list);
|
[media] media: videobuf2: Restructure vb2_buffer
Remove v4l2 stuff - v4l2_buf, v4l2_plane - from struct vb2_buffer.
Add new member variables - bytesused, length, offset, userptr, fd,
data_offset - to struct vb2_plane in order to cover all information
of v4l2_plane.
struct vb2_plane {
<snip>
unsigned int bytesused;
unsigned int length;
union {
unsigned int offset;
unsigned long userptr;
int fd;
} m;
unsigned int data_offset;
}
Replace v4l2_buf with new member variables - index, type, memory - which
are common fields for buffer management.
struct vb2_buffer {
<snip>
unsigned int index;
unsigned int type;
unsigned int memory;
unsigned int num_planes;
struct vb2_plane planes[VIDEO_MAX_PLANES];
<snip>
};
v4l2 specific fields - flags, field, timestamp, timecode,
sequence - are moved to vb2_v4l2_buffer in videobuf2-v4l2.c
struct vb2_v4l2_buffer {
struct vb2_buffer vb2_buf;
__u32 flags;
__u32 field;
struct timeval timestamp;
struct v4l2_timecode timecode;
__u32 sequence;
};
Signed-off-by: Junghak Sung <jh1009.sung@samsung.com>
Signed-off-by: Geunyoung Kim <nenggun.kim@samsung.com>
Acked-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
2015-09-22 21:30:30 +08:00
|
|
|
vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2014-09-20 20:22:18 +08:00
|
|
|
spin_unlock_irqrestore(&dev->slock, flags);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2016-09-09 07:59:18 +08:00
|
|
|
static const struct vb2_ops cx8800_video_qops = {
|
2014-09-20 20:22:18 +08:00
|
|
|
.queue_setup = queue_setup,
|
|
|
|
.buf_prepare = buffer_prepare,
|
|
|
|
.buf_finish = buffer_finish,
|
|
|
|
.buf_queue = buffer_queue,
|
|
|
|
.wait_prepare = vb2_ops_wait_prepare,
|
|
|
|
.wait_finish = vb2_ops_wait_finish,
|
|
|
|
.start_streaming = start_streaming,
|
|
|
|
.stop_streaming = stop_streaming,
|
|
|
|
};
|
2012-05-11 21:33:25 +08:00
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
/* ------------------------------------------------------------------ */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
static int radio_open(struct file *file)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2009-12-10 21:44:04 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
2010-10-22 03:21:45 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
2014-09-20 20:22:18 +08:00
|
|
|
int ret = v4l2_fh_open(file);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
if (ret)
|
|
|
|
return ret;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
cx_write(MO_GP3_IO, core->board.radio.gpio3);
|
|
|
|
cx_write(MO_GP0_IO, core->board.radio.gpio0);
|
|
|
|
cx_write(MO_GP1_IO, core->board.radio.gpio1);
|
|
|
|
cx_write(MO_GP2_IO, core->board.radio.gpio2);
|
|
|
|
if (core->board.radio.audioroute) {
|
|
|
|
if (core->sd_wm8775) {
|
|
|
|
call_all(core, audio, s_routing,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
core->board.radio.audioroute, 0, 0);
|
2008-10-16 01:18:42 +08:00
|
|
|
}
|
2014-09-20 20:22:18 +08:00
|
|
|
/* "I2S ADC mode" */
|
|
|
|
core->tvaudio = WW_I2SADC;
|
|
|
|
cx88_set_tvaudio(core);
|
2005-04-17 06:20:36 +08:00
|
|
|
} else {
|
2014-09-20 20:22:18 +08:00
|
|
|
/* FM Mode */
|
|
|
|
core->tvaudio = WW_FM;
|
|
|
|
cx88_set_tvaudio(core);
|
|
|
|
cx88_set_stereo(core, V4L2_TUNER_MODE_STEREO, 1);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2014-09-20 20:22:18 +08:00
|
|
|
call_all(core, tuner, s_radio);
|
2005-04-17 06:20:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
2007-01-21 00:58:17 +08:00
|
|
|
/* VIDEO CTRL IOCTLS */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2012-05-11 20:07:45 +08:00
|
|
|
static int cx8800_s_vid_ctrl(struct v4l2_ctrl *ctrl)
|
|
|
|
{
|
|
|
|
struct cx88_core *core =
|
|
|
|
container_of(ctrl->handler, struct cx88_core, video_hdl);
|
|
|
|
const struct cx88_ctrl *cc = ctrl->priv;
|
|
|
|
u32 value, mask;
|
|
|
|
|
|
|
|
mask = cc->mask;
|
|
|
|
switch (ctrl->id) {
|
|
|
|
case V4L2_CID_SATURATION:
|
|
|
|
/* special v_sat handling */
|
|
|
|
|
|
|
|
value = ((ctrl->val - cc->off) << cc->shift) & cc->mask;
|
|
|
|
|
|
|
|
if (core->tvnorm & V4L2_STD_SECAM) {
|
|
|
|
/* For SECAM, both U and V sat should be equal */
|
|
|
|
value = value << 8 | value;
|
|
|
|
} else {
|
|
|
|
/* Keeps U Saturation proportional to V Sat */
|
|
|
|
value = (value * 0x5a) / 0x7f << 8 | value;
|
|
|
|
}
|
|
|
|
mask = 0xffff;
|
|
|
|
break;
|
|
|
|
case V4L2_CID_SHARPNESS:
|
|
|
|
/* 0b000, 0b100, 0b101, 0b110, or 0b111 */
|
|
|
|
value = (ctrl->val < 1 ? 0 : ((ctrl->val + 3) << 7));
|
|
|
|
/* needs to be set for both fields */
|
|
|
|
cx_andor(MO_FILTER_EVEN, mask, value);
|
|
|
|
break;
|
|
|
|
case V4L2_CID_CHROMA_AGC:
|
|
|
|
value = ((ctrl->val - cc->off) << cc->shift) & cc->mask;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
value = ((ctrl->val - cc->off) << cc->shift) & cc->mask;
|
|
|
|
break;
|
|
|
|
}
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
dprintk(1,
|
|
|
|
"set_control id=0x%X(%s) ctrl=0x%02x, reg=0x%02x val=0x%02x (mask 0x%02x)%s\n",
|
|
|
|
ctrl->id, ctrl->name, ctrl->val, cc->reg, value,
|
|
|
|
mask, cc->sreg ? " [shadowed]" : "");
|
2012-05-11 20:07:45 +08:00
|
|
|
if (cc->sreg)
|
|
|
|
cx_sandor(cc->sreg, cc->reg, mask, value);
|
|
|
|
else
|
|
|
|
cx_andor(cc->reg, mask, value);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int cx8800_s_aud_ctrl(struct v4l2_ctrl *ctrl)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2012-06-10 18:39:52 +08:00
|
|
|
struct cx88_core *core =
|
2012-05-11 20:07:45 +08:00
|
|
|
container_of(ctrl->handler, struct cx88_core, audio_hdl);
|
2012-06-10 18:39:52 +08:00
|
|
|
const struct cx88_ctrl *cc = ctrl->priv;
|
2016-11-16 16:59:49 +08:00
|
|
|
u32 value, mask;
|
2011-02-07 04:46:12 +08:00
|
|
|
|
|
|
|
/* Pass changes onto any WM8775 */
|
2013-05-29 21:44:22 +08:00
|
|
|
if (core->sd_wm8775) {
|
2012-06-10 18:39:52 +08:00
|
|
|
switch (ctrl->id) {
|
2011-02-07 04:46:12 +08:00
|
|
|
case V4L2_CID_AUDIO_MUTE:
|
2012-06-10 18:39:52 +08:00
|
|
|
wm8775_s_ctrl(core, ctrl->id, ctrl->val);
|
2011-02-07 04:46:12 +08:00
|
|
|
break;
|
|
|
|
case V4L2_CID_AUDIO_VOLUME:
|
2012-06-10 18:39:52 +08:00
|
|
|
wm8775_s_ctrl(core, ctrl->id, (ctrl->val) ?
|
|
|
|
(0x90 + ctrl->val) << 8 : 0);
|
2011-02-07 04:46:12 +08:00
|
|
|
break;
|
|
|
|
case V4L2_CID_AUDIO_BALANCE:
|
2012-06-10 18:39:52 +08:00
|
|
|
wm8775_s_ctrl(core, ctrl->id, ctrl->val << 9);
|
2011-02-07 04:46:12 +08:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-06-10 18:39:52 +08:00
|
|
|
mask = cc->mask;
|
|
|
|
switch (ctrl->id) {
|
2005-04-17 06:20:36 +08:00
|
|
|
case V4L2_CID_AUDIO_BALANCE:
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
value = (ctrl->val < 0x40) ?
|
|
|
|
(0x7f - ctrl->val) : (ctrl->val - 0x40);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
case V4L2_CID_AUDIO_VOLUME:
|
2012-06-10 18:39:52 +08:00
|
|
|
value = 0x3f - (ctrl->val & 0x3f);
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
default:
|
2012-06-10 18:39:52 +08:00
|
|
|
value = ((ctrl->val - cc->off) << cc->shift) & cc->mask;
|
2005-04-17 06:20:36 +08:00
|
|
|
break;
|
|
|
|
}
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
dprintk(1,
|
|
|
|
"set_control id=0x%X(%s) ctrl=0x%02x, reg=0x%02x val=0x%02x (mask 0x%02x)%s\n",
|
|
|
|
ctrl->id, ctrl->name, ctrl->val, cc->reg, value,
|
|
|
|
mask, cc->sreg ? " [shadowed]" : "");
|
2012-06-10 18:39:52 +08:00
|
|
|
if (cc->sreg)
|
|
|
|
cx_sandor(cc->sreg, cc->reg, mask, value);
|
|
|
|
else
|
|
|
|
cx_andor(cc->reg, mask, value);
|
2005-04-17 06:20:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ------------------------------------------------------------------ */
|
2007-01-21 00:58:17 +08:00
|
|
|
/* VIDEO IOCTLS */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-05-28 23:16:41 +08:00
|
|
|
static int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_format *f)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
2014-09-20 20:23:44 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
2007-01-21 00:58:17 +08:00
|
|
|
|
2014-09-20 20:23:44 +08:00
|
|
|
f->fmt.pix.width = core->width;
|
|
|
|
f->fmt.pix.height = core->height;
|
|
|
|
f->fmt.pix.field = core->field;
|
2012-05-11 21:45:18 +08:00
|
|
|
f->fmt.pix.pixelformat = dev->fmt->fourcc;
|
2007-01-21 00:58:17 +08:00
|
|
|
f->fmt.pix.bytesperline =
|
2012-05-11 21:45:18 +08:00
|
|
|
(f->fmt.pix.width * dev->fmt->depth) >> 3;
|
2007-01-21 00:58:17 +08:00
|
|
|
f->fmt.pix.sizeimage =
|
|
|
|
f->fmt.pix.height * f->fmt.pix.bytesperline;
|
2012-05-11 21:45:18 +08:00
|
|
|
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-05-28 23:16:41 +08:00
|
|
|
static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_format *f)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2010-08-25 20:50:20 +08:00
|
|
|
const struct cx8800_fmt *fmt;
|
2007-01-21 00:58:17 +08:00
|
|
|
enum v4l2_field field;
|
|
|
|
unsigned int maxw, maxh;
|
2005-09-10 04:03:41 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
fmt = format_by_fourcc(f->fmt.pix.pixelformat);
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
if (!fmt)
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:23:44 +08:00
|
|
|
maxw = norm_maxw(core->tvnorm);
|
|
|
|
maxh = norm_maxh(core->tvnorm);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-09-20 20:23:44 +08:00
|
|
|
field = f->fmt.pix.field;
|
2007-01-21 00:58:17 +08:00
|
|
|
|
|
|
|
switch (field) {
|
|
|
|
case V4L2_FIELD_TOP:
|
|
|
|
case V4L2_FIELD_BOTTOM:
|
|
|
|
case V4L2_FIELD_INTERLACED:
|
2014-09-20 20:23:44 +08:00
|
|
|
case V4L2_FIELD_SEQ_BT:
|
|
|
|
case V4L2_FIELD_SEQ_TB:
|
2007-01-21 00:58:17 +08:00
|
|
|
break;
|
2005-04-17 06:20:36 +08:00
|
|
|
default:
|
2014-09-20 20:23:44 +08:00
|
|
|
field = (f->fmt.pix.height > maxh / 2)
|
|
|
|
? V4L2_FIELD_INTERLACED
|
|
|
|
: V4L2_FIELD_BOTTOM;
|
|
|
|
break;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2014-09-20 20:23:44 +08:00
|
|
|
if (V4L2_FIELD_HAS_T_OR_B(field))
|
|
|
|
maxh /= 2;
|
2007-01-21 00:58:17 +08:00
|
|
|
|
2009-05-31 08:45:46 +08:00
|
|
|
v4l_bound_align_image(&f->fmt.pix.width, 48, maxw, 2,
|
|
|
|
&f->fmt.pix.height, 32, maxh, 0, 0);
|
2014-09-20 20:23:44 +08:00
|
|
|
f->fmt.pix.field = field;
|
2007-01-21 00:58:17 +08:00
|
|
|
f->fmt.pix.bytesperline =
|
|
|
|
(f->fmt.pix.width * fmt->depth) >> 3;
|
|
|
|
f->fmt.pix.sizeimage =
|
|
|
|
f->fmt.pix.height * f->fmt.pix.bytesperline;
|
2015-04-03 18:22:40 +08:00
|
|
|
f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M;
|
2007-01-21 00:58:17 +08:00
|
|
|
|
|
|
|
return 0;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-05-28 23:16:41 +08:00
|
|
|
static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_format *f)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
2014-09-20 20:23:44 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
2016-11-16 16:59:49 +08:00
|
|
|
int err = vidioc_try_fmt_vid_cap(file, priv, f);
|
2007-01-21 00:58:17 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
if (err != 0)
|
2007-01-21 00:58:17 +08:00
|
|
|
return err;
|
2014-08-29 17:08:07 +08:00
|
|
|
if (vb2_is_busy(&dev->vb2_vidq) || vb2_is_busy(&dev->vb2_vbiq))
|
|
|
|
return -EBUSY;
|
|
|
|
if (core->dvbdev && vb2_is_busy(&core->dvbdev->vb2_mpegq))
|
|
|
|
return -EBUSY;
|
2014-09-20 20:23:44 +08:00
|
|
|
dev->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
|
|
|
|
core->width = f->fmt.pix.width;
|
|
|
|
core->height = f->fmt.pix.height;
|
|
|
|
core->field = f->fmt.pix.field;
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2012-05-10 03:23:07 +08:00
|
|
|
void cx88_querycap(struct file *file, struct cx88_core *core,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_capability *cap)
|
2012-05-10 03:23:07 +08:00
|
|
|
{
|
|
|
|
struct video_device *vdev = video_devdata(file);
|
|
|
|
|
|
|
|
strlcpy(cap->card, core->board.name, sizeof(cap->card));
|
|
|
|
cap->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
|
2016-11-16 16:59:49 +08:00
|
|
|
if (core->board.tuner_type != UNSET)
|
2012-05-10 03:23:07 +08:00
|
|
|
cap->device_caps |= V4L2_CAP_TUNER;
|
|
|
|
switch (vdev->vfl_type) {
|
|
|
|
case VFL_TYPE_RADIO:
|
|
|
|
cap->device_caps = V4L2_CAP_RADIO | V4L2_CAP_TUNER;
|
|
|
|
break;
|
|
|
|
case VFL_TYPE_GRABBER:
|
|
|
|
cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE;
|
|
|
|
break;
|
|
|
|
case VFL_TYPE_VBI:
|
|
|
|
cap->device_caps |= V4L2_CAP_VBI_CAPTURE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
cap->capabilities = cap->device_caps | V4L2_CAP_VIDEO_CAPTURE |
|
|
|
|
V4L2_CAP_VBI_CAPTURE | V4L2_CAP_DEVICE_CAPS;
|
|
|
|
if (core->board.radio.type == CX88_RADIO)
|
|
|
|
cap->capabilities |= V4L2_CAP_RADIO;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(cx88_querycap);
|
|
|
|
|
|
|
|
static int vidioc_querycap(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_capability *cap)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
strcpy(cap->driver, "cx8800");
|
2012-05-10 03:23:07 +08:00
|
|
|
sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
|
|
|
|
cx88_querycap(file, core, cap);
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2005-09-10 04:03:41 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_fmtdesc *f)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
|
|
|
if (unlikely(f->index >= ARRAY_SIZE(formats)))
|
|
|
|
return -EINVAL;
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
strlcpy(f->description, formats[f->index].name, sizeof(f->description));
|
2007-01-21 00:58:17 +08:00
|
|
|
f->pixelformat = formats[f->index].fourcc;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2012-05-25 23:15:30 +08:00
|
|
|
static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *tvnorm)
|
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2012-05-25 23:15:30 +08:00
|
|
|
|
|
|
|
*tvnorm = core->tvnorm;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-03-15 17:10:40 +08:00
|
|
|
static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id tvnorms)
|
2005-09-10 04:03:41 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2005-09-10 04:03:41 +08:00
|
|
|
|
2014-08-29 17:08:07 +08:00
|
|
|
return cx88_set_tvnorm(core, tvnorms);
|
2007-01-21 00:58:17 +08:00
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
/* only one input in this sample driver */
|
2016-11-16 16:59:49 +08:00
|
|
|
int cx88_enum_input(struct cx88_core *core, struct v4l2_input *i)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2010-08-25 20:50:20 +08:00
|
|
|
static const char * const iname[] = {
|
2016-11-16 16:59:49 +08:00
|
|
|
[CX88_VMUX_COMPOSITE1] = "Composite1",
|
|
|
|
[CX88_VMUX_COMPOSITE2] = "Composite2",
|
|
|
|
[CX88_VMUX_COMPOSITE3] = "Composite3",
|
|
|
|
[CX88_VMUX_COMPOSITE4] = "Composite4",
|
|
|
|
[CX88_VMUX_SVIDEO] = "S-Video",
|
|
|
|
[CX88_VMUX_TELEVISION] = "Television",
|
|
|
|
[CX88_VMUX_CABLE] = "Cable TV",
|
|
|
|
[CX88_VMUX_DVB] = "DVB",
|
|
|
|
[CX88_VMUX_DEBUG] = "for debug only",
|
2007-01-21 00:58:17 +08:00
|
|
|
};
|
2009-03-04 12:21:03 +08:00
|
|
|
unsigned int n = i->index;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
if (n >= 4)
|
|
|
|
return -EINVAL;
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
if (!INPUT(n).type)
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
|
|
|
i->type = V4L2_INPUT_TYPE_CAMERA;
|
2016-11-16 16:59:49 +08:00
|
|
|
strcpy(i->name, iname[INPUT(n).type]);
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
if ((INPUT(n).type == CX88_VMUX_TELEVISION) ||
|
|
|
|
(INPUT(n).type == CX88_VMUX_CABLE))
|
2007-01-21 00:58:17 +08:00
|
|
|
i->type = V4L2_INPUT_TYPE_TUNER;
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
|
2012-05-25 23:04:10 +08:00
|
|
|
i->std = CX88_NORMS;
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2007-01-21 00:58:26 +08:00
|
|
|
EXPORT_SYMBOL(cx88_enum_input);
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_enum_input(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_input *i)
|
2007-01-21 00:58:26 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2016-11-16 16:59:49 +08:00
|
|
|
|
|
|
|
return cx88_enum_input(core, i);
|
2007-01-21 00:58:26 +08:00
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
*i = core->input;
|
|
|
|
return 0;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
if (i >= 4)
|
|
|
|
return -EINVAL;
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
if (!INPUT(i).type)
|
2012-05-25 23:04:10 +08:00
|
|
|
return -EINVAL;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
cx88_newstation(core);
|
2016-11-16 16:59:49 +08:00
|
|
|
cx88_video_mux(core, i);
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_g_tuner(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_tuner *t)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2007-01-21 00:58:17 +08:00
|
|
|
u32 reg;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
if (unlikely(core->board.tuner_type == UNSET))
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
2016-11-16 16:59:49 +08:00
|
|
|
if (t->index != 0)
|
2007-01-21 00:58:36 +08:00
|
|
|
return -EINVAL;
|
2005-07-08 08:58:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
strcpy(t->name, "Television");
|
|
|
|
t->capability = V4L2_TUNER_CAP_NORM;
|
|
|
|
t->rangehigh = 0xffffffffUL;
|
2012-05-25 23:04:10 +08:00
|
|
|
call_all(core, tuner, g_tuner, t);
|
2005-07-08 08:58:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
cx88_get_stereo(core, t);
|
2007-01-21 00:58:17 +08:00
|
|
|
reg = cx_read(MO_DEVICE_STATUS);
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
t->signal = (reg & (1 << 5)) ? 0xffff : 0x0000;
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2005-07-13 04:58:44 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_s_tuner(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
const struct v4l2_tuner *t)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2005-07-13 04:58:44 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
if (core->board.tuner_type == UNSET)
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
2016-11-16 16:59:49 +08:00
|
|
|
if (t->index != 0)
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
2005-07-15 18:56:28 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
cx88_set_stereo(core, t->audmode, 1);
|
|
|
|
return 0;
|
|
|
|
}
|
2006-10-05 07:33:51 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_g_frequency(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_frequency *f)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2006-10-05 07:33:51 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
if (unlikely(core->board.tuner_type == UNSET))
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
2012-05-25 23:04:10 +08:00
|
|
|
if (f->tuner)
|
|
|
|
return -EINVAL;
|
2007-01-21 00:58:17 +08:00
|
|
|
|
|
|
|
f->frequency = core->freq;
|
|
|
|
|
2009-03-29 19:26:01 +08:00
|
|
|
call_all(core, tuner, g_frequency, f);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
int cx88_set_freq(struct cx88_core *core,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
const struct v4l2_frequency *f)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2013-03-19 15:09:26 +08:00
|
|
|
struct v4l2_frequency new_freq = *f;
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
if (unlikely(core->board.tuner_type == UNSET))
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
|
|
|
if (unlikely(f->tuner != 0))
|
|
|
|
return -EINVAL;
|
2007-01-21 00:58:26 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
cx88_newstation(core);
|
2009-03-29 19:26:01 +08:00
|
|
|
call_all(core, tuner, s_frequency, f);
|
2013-03-19 15:09:26 +08:00
|
|
|
call_all(core, tuner, g_frequency, &new_freq);
|
|
|
|
core->freq = new_freq.frequency;
|
2006-03-10 23:29:15 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
/* When changing channels it is required to reset TVAUDIO */
|
2016-11-16 16:59:49 +08:00
|
|
|
usleep_range(10000, 20000);
|
2007-01-21 00:58:17 +08:00
|
|
|
cx88_set_tvaudio(core);
|
2006-03-10 23:29:15 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2007-01-21 00:58:26 +08:00
|
|
|
EXPORT_SYMBOL(cx88_set_freq);
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_s_frequency(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
const struct v4l2_frequency *f)
|
2007-01-21 00:58:26 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2007-01-21 00:58:26 +08:00
|
|
|
|
2012-05-11 21:33:25 +08:00
|
|
|
return cx88_set_freq(core, f);
|
2007-01-21 00:58:26 +08:00
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-23 10:31:53 +08:00
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_g_register(struct file *file, void *fh,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_dbg_register *reg)
|
2007-01-23 10:31:53 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2007-01-23 10:31:53 +08:00
|
|
|
|
|
|
|
/* cx2388x has a 24-bit register space */
|
2013-05-29 17:22:02 +08:00
|
|
|
reg->val = cx_read(reg->reg & 0xfffffc);
|
2008-12-30 18:14:19 +08:00
|
|
|
reg->size = 4;
|
2007-01-23 10:31:53 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int vidioc_s_register(struct file *file, void *fh,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
const struct v4l2_dbg_register *reg)
|
2007-01-23 10:31:53 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2007-01-23 10:31:53 +08:00
|
|
|
|
2013-05-29 17:22:02 +08:00
|
|
|
cx_write(reg->reg & 0xfffffc, reg->val);
|
2007-01-23 10:31:53 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
2007-01-21 00:58:17 +08:00
|
|
|
|
|
|
|
/* ----------------------------------------------------------- */
|
|
|
|
/* RADIO ESPECIFIC IOCTLS */
|
2005-04-17 06:20:36 +08:00
|
|
|
/* ----------------------------------------------------------- */
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int radio_g_tuner(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
struct v4l2_tuner *t)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
if (unlikely(t->index > 0))
|
|
|
|
return -EINVAL;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-01-21 00:58:17 +08:00
|
|
|
strcpy(t->name, "Radio");
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-03-29 19:26:01 +08:00
|
|
|
call_all(core, tuner, g_tuner, t);
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static int radio_s_tuner(struct file *file, void *priv,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
const struct v4l2_tuner *t)
|
2007-01-21 00:58:17 +08:00
|
|
|
{
|
2014-09-20 20:22:18 +08:00
|
|
|
struct cx8800_dev *dev = video_drvdata(file);
|
|
|
|
struct cx88_core *core = dev->core;
|
2005-07-08 08:58:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
if (t->index != 0)
|
2007-01-21 00:58:17 +08:00
|
|
|
return -EINVAL;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2009-03-29 19:26:01 +08:00
|
|
|
call_all(core, tuner, s_tuner, t);
|
2007-01-21 00:58:17 +08:00
|
|
|
return 0;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* ----------------------------------------------------------- */
|
|
|
|
|
2010-08-25 20:50:20 +08:00
|
|
|
static const char *cx88_vid_irqs[32] = {
|
2005-07-13 04:58:44 +08:00
|
|
|
"y_risci1", "u_risci1", "v_risci1", "vbi_risc1",
|
|
|
|
"y_risci2", "u_risci2", "v_risci2", "vbi_risc2",
|
|
|
|
"y_oflow", "u_oflow", "v_oflow", "vbi_oflow",
|
|
|
|
"y_sync", "u_sync", "v_sync", "vbi_sync",
|
|
|
|
"opc_err", "par_err", "rip_err", "pci_abort",
|
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
static void cx8800_vid_irq(struct cx8800_dev *dev)
|
|
|
|
{
|
|
|
|
struct cx88_core *core = dev->core;
|
|
|
|
u32 status, mask, count;
|
|
|
|
|
|
|
|
status = cx_read(MO_VID_INTSTAT);
|
|
|
|
mask = cx_read(MO_VID_INTMSK);
|
|
|
|
if (0 == (status & mask))
|
|
|
|
return;
|
|
|
|
cx_write(MO_VID_INTSTAT, status);
|
|
|
|
if (irq_debug || (status & mask & ~0xff))
|
2016-11-13 20:07:38 +08:00
|
|
|
cx88_print_irqbits("irq vid",
|
2007-03-29 19:47:04 +08:00
|
|
|
cx88_vid_irqs, ARRAY_SIZE(cx88_vid_irqs),
|
|
|
|
status, mask);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* risc op code error */
|
|
|
|
if (status & (1 << 16)) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_warn("video risc op code error\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
cx_clear(MO_VID_DMACNTRL, 0x11);
|
|
|
|
cx_clear(VID_CAPTURE_CONTROL, 0x06);
|
2005-09-10 04:03:41 +08:00
|
|
|
cx88_sram_channel_dump(core, &cx88_sram_channels[SRAM_CH21]);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* risc1 y */
|
|
|
|
if (status & 0x01) {
|
|
|
|
spin_lock(&dev->slock);
|
|
|
|
count = cx_read(MO_VIDY_GPCNT);
|
2005-09-10 04:03:41 +08:00
|
|
|
cx88_wakeup(core, &dev->vidq, count);
|
2005-04-17 06:20:36 +08:00
|
|
|
spin_unlock(&dev->slock);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* risc1 vbi */
|
|
|
|
if (status & 0x08) {
|
|
|
|
spin_lock(&dev->slock);
|
|
|
|
count = cx_read(MO_VBI_GPCNT);
|
2005-09-10 04:03:41 +08:00
|
|
|
cx88_wakeup(core, &dev->vbiq, count);
|
2005-04-17 06:20:36 +08:00
|
|
|
spin_unlock(&dev->slock);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
of passing regs around manually through all ~1800 interrupt handlers in the
Linux kernel.
The regs pointer is used in few places, but it potentially costs both stack
space and code to pass it around. On the FRV arch, removing the regs parameter
from all the genirq function results in a 20% speed up of the IRQ exit path
(ie: from leaving timer_interrupt() to leaving do_IRQ()).
Where appropriate, an arch may override the generic storage facility and do
something different with the variable. On FRV, for instance, the address is
maintained in GR28 at all times inside the kernel as part of general exception
handling.
Having looked over the code, it appears that the parameter may be handed down
through up to twenty or so layers of functions. Consider a USB character
device attached to a USB hub, attached to a USB controller that posts its
interrupts through a cascaded auxiliary interrupt controller. A character
device driver may want to pass regs to the sysrq handler through the input
layer which adds another few layers of parameter passing.
I've build this code with allyesconfig for x86_64 and i386. I've runtested the
main part of the code on FRV and i386, though I can't test most of the drivers.
I've also done partial conversion for powerpc and MIPS - these at least compile
with minimal configurations.
This will affect all archs. Mostly the changes should be relatively easy.
Take do_IRQ(), store the regs pointer at the beginning, saving the old one:
struct pt_regs *old_regs = set_irq_regs(regs);
And put the old one back at the end:
set_irq_regs(old_regs);
Don't pass regs through to generic_handle_irq() or __do_IRQ().
In timer_interrupt(), this sort of change will be necessary:
- update_process_times(user_mode(regs));
- profile_tick(CPU_PROFILING, regs);
+ update_process_times(user_mode(get_irq_regs()));
+ profile_tick(CPU_PROFILING);
I'd like to move update_process_times()'s use of get_irq_regs() into itself,
except that i386, alone of the archs, uses something other than user_mode().
Some notes on the interrupt handling in the drivers:
(*) input_dev() is now gone entirely. The regs pointer is no longer stored in
the input_dev struct.
(*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does
something different depending on whether it's been supplied with a regs
pointer or not.
(*) Various IRQ handler function pointers have been moved to type
irq_handler_t.
Signed-Off-By: David Howells <dhowells@redhat.com>
(cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
2006-10-05 21:55:46 +08:00
|
|
|
static irqreturn_t cx8800_irq(int irq, void *dev_id)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
struct cx8800_dev *dev = dev_id;
|
|
|
|
struct cx88_core *core = dev->core;
|
|
|
|
u32 status;
|
|
|
|
int loop, handled = 0;
|
|
|
|
|
|
|
|
for (loop = 0; loop < 10; loop++) {
|
2007-08-18 17:57:55 +08:00
|
|
|
status = cx_read(MO_PCI_INTSTAT) &
|
|
|
|
(core->pci_irqmask | PCI_INT_VIDINT);
|
2016-11-16 16:59:49 +08:00
|
|
|
if (status == 0)
|
2005-04-17 06:20:36 +08:00
|
|
|
goto out;
|
|
|
|
cx_write(MO_PCI_INTSTAT, status);
|
|
|
|
handled = 1;
|
|
|
|
|
|
|
|
if (status & core->pci_irqmask)
|
2016-11-16 16:59:49 +08:00
|
|
|
cx88_core_irq(core, status);
|
2007-08-18 17:57:55 +08:00
|
|
|
if (status & PCI_INT_VIDINT)
|
2005-04-17 06:20:36 +08:00
|
|
|
cx8800_vid_irq(dev);
|
2012-09-28 16:37:22 +08:00
|
|
|
}
|
2016-11-16 16:59:49 +08:00
|
|
|
if (loop == 10) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_warn("irq loop -- clearing mask\n");
|
2016-11-16 16:59:49 +08:00
|
|
|
cx_write(MO_PCI_INTMSK, 0);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
out:
|
|
|
|
return IRQ_RETVAL(handled);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ----------------------------------------------------------- */
|
|
|
|
/* exported stuff */
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static const struct v4l2_file_operations video_fops = {
|
2005-04-17 06:20:36 +08:00
|
|
|
.owner = THIS_MODULE,
|
2014-09-20 20:22:18 +08:00
|
|
|
.open = v4l2_fh_open,
|
|
|
|
.release = vb2_fop_release,
|
|
|
|
.read = vb2_fop_read,
|
|
|
|
.poll = vb2_fop_poll,
|
|
|
|
.mmap = vb2_fop_mmap,
|
2011-02-14 08:52:02 +08:00
|
|
|
.unlocked_ioctl = video_ioctl2,
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2008-07-21 13:57:38 +08:00
|
|
|
static const struct v4l2_ioctl_ops video_ioctl_ops = {
|
2007-01-21 00:58:17 +08:00
|
|
|
.vidioc_querycap = vidioc_querycap,
|
2008-05-28 23:16:41 +08:00
|
|
|
.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
|
|
|
|
.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
|
|
|
|
.vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
|
|
|
|
.vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
|
2014-09-20 20:22:18 +08:00
|
|
|
.vidioc_reqbufs = vb2_ioctl_reqbufs,
|
|
|
|
.vidioc_querybuf = vb2_ioctl_querybuf,
|
|
|
|
.vidioc_qbuf = vb2_ioctl_qbuf,
|
|
|
|
.vidioc_dqbuf = vb2_ioctl_dqbuf,
|
2012-05-25 23:15:30 +08:00
|
|
|
.vidioc_g_std = vidioc_g_std,
|
2007-01-21 00:58:17 +08:00
|
|
|
.vidioc_s_std = vidioc_s_std,
|
|
|
|
.vidioc_enum_input = vidioc_enum_input,
|
|
|
|
.vidioc_g_input = vidioc_g_input,
|
|
|
|
.vidioc_s_input = vidioc_s_input,
|
2014-09-20 20:22:18 +08:00
|
|
|
.vidioc_streamon = vb2_ioctl_streamon,
|
|
|
|
.vidioc_streamoff = vb2_ioctl_streamoff,
|
2007-01-21 00:58:17 +08:00
|
|
|
.vidioc_g_tuner = vidioc_g_tuner,
|
|
|
|
.vidioc_s_tuner = vidioc_s_tuner,
|
|
|
|
.vidioc_g_frequency = vidioc_g_frequency,
|
|
|
|
.vidioc_s_frequency = vidioc_s_frequency,
|
2012-05-11 22:25:03 +08:00
|
|
|
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
|
|
|
|
.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
|
2007-01-23 10:31:53 +08:00
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
|
.vidioc_g_register = vidioc_g_register,
|
|
|
|
.vidioc_s_register = vidioc_s_register,
|
|
|
|
#endif
|
2008-07-21 13:57:38 +08:00
|
|
|
};
|
|
|
|
|
2010-08-25 20:50:20 +08:00
|
|
|
static const struct video_device cx8800_video_template = {
|
2008-07-21 13:57:38 +08:00
|
|
|
.name = "cx8800-video",
|
|
|
|
.fops = &video_fops,
|
2016-11-16 16:59:49 +08:00
|
|
|
.ioctl_ops = &video_ioctl_ops,
|
2007-01-21 00:58:33 +08:00
|
|
|
.tvnorms = CX88_NORMS,
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2012-05-25 23:04:10 +08:00
|
|
|
static const struct v4l2_ioctl_ops vbi_ioctl_ops = {
|
|
|
|
.vidioc_querycap = vidioc_querycap,
|
|
|
|
.vidioc_g_fmt_vbi_cap = cx8800_vbi_fmt,
|
|
|
|
.vidioc_try_fmt_vbi_cap = cx8800_vbi_fmt,
|
|
|
|
.vidioc_s_fmt_vbi_cap = cx8800_vbi_fmt,
|
2014-09-20 20:22:18 +08:00
|
|
|
.vidioc_reqbufs = vb2_ioctl_reqbufs,
|
|
|
|
.vidioc_querybuf = vb2_ioctl_querybuf,
|
|
|
|
.vidioc_qbuf = vb2_ioctl_qbuf,
|
|
|
|
.vidioc_dqbuf = vb2_ioctl_dqbuf,
|
2012-05-25 23:15:30 +08:00
|
|
|
.vidioc_g_std = vidioc_g_std,
|
2012-05-25 23:04:10 +08:00
|
|
|
.vidioc_s_std = vidioc_s_std,
|
|
|
|
.vidioc_enum_input = vidioc_enum_input,
|
|
|
|
.vidioc_g_input = vidioc_g_input,
|
|
|
|
.vidioc_s_input = vidioc_s_input,
|
2014-09-20 20:22:18 +08:00
|
|
|
.vidioc_streamon = vb2_ioctl_streamon,
|
|
|
|
.vidioc_streamoff = vb2_ioctl_streamoff,
|
2012-05-25 23:04:10 +08:00
|
|
|
.vidioc_g_tuner = vidioc_g_tuner,
|
|
|
|
.vidioc_s_tuner = vidioc_s_tuner,
|
|
|
|
.vidioc_g_frequency = vidioc_g_frequency,
|
|
|
|
.vidioc_s_frequency = vidioc_s_frequency,
|
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
|
.vidioc_g_register = vidioc_g_register,
|
|
|
|
.vidioc_s_register = vidioc_s_register,
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
static const struct video_device cx8800_vbi_template = {
|
|
|
|
.name = "cx8800-vbi",
|
|
|
|
.fops = &video_fops,
|
|
|
|
.ioctl_ops = &vbi_ioctl_ops,
|
|
|
|
.tvnorms = CX88_NORMS,
|
|
|
|
};
|
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
static const struct v4l2_file_operations radio_fops = {
|
2005-04-17 06:20:36 +08:00
|
|
|
.owner = THIS_MODULE,
|
2014-09-20 20:22:18 +08:00
|
|
|
.open = radio_open,
|
2012-05-11 22:25:03 +08:00
|
|
|
.poll = v4l2_ctrl_poll,
|
2014-09-20 20:22:18 +08:00
|
|
|
.release = v4l2_fh_release,
|
2011-02-14 08:52:02 +08:00
|
|
|
.unlocked_ioctl = video_ioctl2,
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2008-07-21 13:57:38 +08:00
|
|
|
static const struct v4l2_ioctl_ops radio_ioctl_ops = {
|
2012-05-10 03:23:07 +08:00
|
|
|
.vidioc_querycap = vidioc_querycap,
|
2007-01-21 00:58:17 +08:00
|
|
|
.vidioc_g_tuner = radio_g_tuner,
|
|
|
|
.vidioc_s_tuner = radio_s_tuner,
|
|
|
|
.vidioc_g_frequency = vidioc_g_frequency,
|
|
|
|
.vidioc_s_frequency = vidioc_s_frequency,
|
2012-05-11 22:25:03 +08:00
|
|
|
.vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
|
|
|
|
.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
|
2007-08-01 11:13:28 +08:00
|
|
|
#ifdef CONFIG_VIDEO_ADV_DEBUG
|
|
|
|
.vidioc_g_register = vidioc_g_register,
|
|
|
|
.vidioc_s_register = vidioc_s_register,
|
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2010-08-25 20:50:20 +08:00
|
|
|
static const struct video_device cx8800_radio_template = {
|
2008-07-21 13:57:38 +08:00
|
|
|
.name = "cx8800-radio",
|
|
|
|
.fops = &radio_fops,
|
2016-11-16 16:59:49 +08:00
|
|
|
.ioctl_ops = &radio_ioctl_ops,
|
2008-07-21 13:57:38 +08:00
|
|
|
};
|
|
|
|
|
2012-05-11 20:07:45 +08:00
|
|
|
static const struct v4l2_ctrl_ops cx8800_ctrl_vid_ops = {
|
|
|
|
.s_ctrl = cx8800_s_vid_ctrl,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const struct v4l2_ctrl_ops cx8800_ctrl_aud_ops = {
|
|
|
|
.s_ctrl = cx8800_s_aud_ctrl,
|
2012-06-10 18:39:52 +08:00
|
|
|
};
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* ----------------------------------------------------------- */
|
|
|
|
|
|
|
|
static void cx8800_unregister_video(struct cx8800_dev *dev)
|
|
|
|
{
|
2015-03-10 00:34:00 +08:00
|
|
|
video_unregister_device(&dev->radio_dev);
|
|
|
|
video_unregister_device(&dev->vbi_dev);
|
|
|
|
video_unregister_device(&dev->video_dev);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2012-12-22 05:17:53 +08:00
|
|
|
static int cx8800_initdev(struct pci_dev *pci_dev,
|
|
|
|
const struct pci_device_id *pci_id)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
struct cx8800_dev *dev;
|
|
|
|
struct cx88_core *core;
|
2014-09-20 20:22:18 +08:00
|
|
|
struct vb2_queue *q;
|
2005-04-17 06:20:36 +08:00
|
|
|
int err;
|
2012-06-10 18:39:52 +08:00
|
|
|
int i;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2016-11-16 16:59:49 +08:00
|
|
|
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
if (!dev)
|
2005-04-17 06:20:36 +08:00
|
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
/* pci init */
|
|
|
|
dev->pci = pci_dev;
|
|
|
|
if (pci_enable_device(pci_dev)) {
|
|
|
|
err = -EIO;
|
|
|
|
goto fail_free;
|
|
|
|
}
|
|
|
|
core = cx88_core_get(dev->pci);
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
if (!core) {
|
2005-04-17 06:20:36 +08:00
|
|
|
err = -EINVAL;
|
|
|
|
goto fail_free;
|
|
|
|
}
|
|
|
|
dev->core = core;
|
|
|
|
|
|
|
|
/* print pci info */
|
2011-03-21 22:35:56 +08:00
|
|
|
dev->pci_rev = pci_dev->revision;
|
2005-11-09 13:37:43 +08:00
|
|
|
pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("found at %s, rev: %d, irq: %d, latency: %d, mmio: 0x%llx\n",
|
|
|
|
pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
|
|
|
|
dev->pci_lat,
|
|
|
|
(unsigned long long)pci_resource_start(pci_dev, 0));
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
pci_set_master(pci_dev);
|
2016-11-16 16:59:49 +08:00
|
|
|
err = pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32));
|
2015-11-21 07:57:07 +08:00
|
|
|
if (err) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("Oops: no 32bit PCI DMA ???\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
goto fail_core;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* initialize driver struct */
|
|
|
|
spin_lock_init(&dev->slock);
|
|
|
|
|
|
|
|
/* init video dma queues */
|
|
|
|
INIT_LIST_HEAD(&dev->vidq.active);
|
|
|
|
|
|
|
|
/* init vbi dma queues */
|
|
|
|
INIT_LIST_HEAD(&dev->vbiq.active);
|
|
|
|
|
|
|
|
/* get irq */
|
|
|
|
err = request_irq(pci_dev->irq, cx8800_irq,
|
2013-10-13 13:49:29 +08:00
|
|
|
IRQF_SHARED, core->name, dev);
|
2005-04-17 06:20:36 +08:00
|
|
|
if (err < 0) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("can't get IRQ %d\n", pci_dev->irq);
|
2005-04-17 06:20:36 +08:00
|
|
|
goto fail_core;
|
|
|
|
}
|
|
|
|
cx_set(MO_PCI_INTMSK, core->pci_irqmask);
|
|
|
|
|
2012-05-11 20:07:45 +08:00
|
|
|
for (i = 0; i < CX8800_AUD_CTLS; i++) {
|
|
|
|
const struct cx88_ctrl *cc = &cx8800_aud_ctls[i];
|
|
|
|
struct v4l2_ctrl *vc;
|
|
|
|
|
|
|
|
vc = v4l2_ctrl_new_std(&core->audio_hdl, &cx8800_ctrl_aud_ops,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
cc->id, cc->minimum, cc->maximum,
|
|
|
|
cc->step, cc->default_value);
|
|
|
|
if (!vc) {
|
2012-05-11 20:07:45 +08:00
|
|
|
err = core->audio_hdl.error;
|
|
|
|
goto fail_core;
|
|
|
|
}
|
|
|
|
vc->priv = (void *)cc;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < CX8800_VID_CTLS; i++) {
|
|
|
|
const struct cx88_ctrl *cc = &cx8800_vid_ctls[i];
|
2012-06-10 18:39:52 +08:00
|
|
|
struct v4l2_ctrl *vc;
|
|
|
|
|
2012-05-11 20:07:45 +08:00
|
|
|
vc = v4l2_ctrl_new_std(&core->video_hdl, &cx8800_ctrl_vid_ops,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
cc->id, cc->minimum, cc->maximum,
|
|
|
|
cc->step, cc->default_value);
|
|
|
|
if (!vc) {
|
2012-05-11 20:07:45 +08:00
|
|
|
err = core->video_hdl.error;
|
2012-06-10 18:39:52 +08:00
|
|
|
goto fail_core;
|
|
|
|
}
|
|
|
|
vc->priv = (void *)cc;
|
2012-05-11 20:07:45 +08:00
|
|
|
if (vc->id == V4L2_CID_CHROMA_AGC)
|
|
|
|
core->chroma_agc = vc;
|
2012-06-10 18:39:52 +08:00
|
|
|
}
|
2012-09-14 18:15:03 +08:00
|
|
|
v4l2_ctrl_add_handler(&core->video_hdl, &core->audio_hdl, NULL);
|
2012-06-10 18:39:52 +08:00
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* load and configure helper modules */
|
2005-09-10 04:03:41 +08:00
|
|
|
|
2013-05-26 18:56:06 +08:00
|
|
|
if (core->board.audio_chip == CX88_AUDIO_WM8775) {
|
2011-02-07 04:46:12 +08:00
|
|
|
struct i2c_board_info wm8775_info = {
|
|
|
|
.type = "wm8775",
|
|
|
|
.addr = 0x36 >> 1,
|
|
|
|
.platform_data = &core->wm8775_data,
|
|
|
|
};
|
|
|
|
struct v4l2_subdev *sd;
|
|
|
|
|
|
|
|
if (core->boardnr == CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1)
|
|
|
|
core->wm8775_data.is_nova_s = true;
|
|
|
|
else
|
|
|
|
core->wm8775_data.is_nova_s = false;
|
|
|
|
|
|
|
|
sd = v4l2_i2c_new_subdev_board(&core->v4l2_dev, &core->i2c_adap,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
&wm8775_info, NULL);
|
|
|
|
if (sd) {
|
2012-06-10 18:39:52 +08:00
|
|
|
core->sd_wm8775 = sd;
|
2011-02-07 04:46:12 +08:00
|
|
|
sd->grp_id = WM8775_GID;
|
2012-06-10 18:39:52 +08:00
|
|
|
}
|
2011-02-07 04:46:12 +08:00
|
|
|
}
|
2009-03-29 19:26:01 +08:00
|
|
|
|
2013-05-26 18:56:06 +08:00
|
|
|
if (core->board.audio_chip == CX88_AUDIO_TVAUDIO) {
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
/*
|
|
|
|
* This probes for a tda9874 as is used on some
|
|
|
|
* Pixelview Ultra boards.
|
|
|
|
*/
|
2010-09-24 21:16:44 +08:00
|
|
|
v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
"tvaudio", 0, I2C_ADDRS(0xb0 >> 1));
|
2009-03-29 19:26:01 +08:00
|
|
|
}
|
2006-09-25 23:43:42 +08:00
|
|
|
|
2007-08-24 12:32:31 +08:00
|
|
|
switch (core->boardnr) {
|
|
|
|
case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
|
2009-03-29 19:26:01 +08:00
|
|
|
case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD: {
|
2010-08-25 20:50:20 +08:00
|
|
|
static const struct i2c_board_info rtc_info = {
|
2009-03-29 19:26:01 +08:00
|
|
|
I2C_BOARD_INFO("isl1208", 0x6f)
|
|
|
|
};
|
|
|
|
|
2007-08-24 12:32:31 +08:00
|
|
|
request_module("rtc-isl1208");
|
2009-03-29 19:26:01 +08:00
|
|
|
core->i2c_rtc = i2c_new_device(&core->i2c_adap, &rtc_info);
|
|
|
|
}
|
2017-05-18 19:13:28 +08:00
|
|
|
/* fall-through */
|
2008-04-23 01:45:14 +08:00
|
|
|
case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
|
|
|
|
request_module("ir-kbd-i2c");
|
2007-08-24 12:32:31 +08:00
|
|
|
}
|
|
|
|
|
2011-02-14 18:01:51 +08:00
|
|
|
/* Sets device info at pci_dev */
|
|
|
|
pci_set_drvdata(pci_dev, dev);
|
|
|
|
|
2014-09-20 20:23:44 +08:00
|
|
|
dev->fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
|
2012-05-11 21:45:18 +08:00
|
|
|
|
2014-08-29 17:08:07 +08:00
|
|
|
/* Maintain a reference so cx88-blackbird can query the 8800 device. */
|
|
|
|
core->v4ldev = dev;
|
|
|
|
|
2011-02-14 18:01:51 +08:00
|
|
|
/* initial device configuration */
|
|
|
|
mutex_lock(&core->lock);
|
2014-09-20 20:23:44 +08:00
|
|
|
cx88_set_tvnorm(core, V4L2_STD_NTSC_M);
|
2012-05-11 20:07:45 +08:00
|
|
|
v4l2_ctrl_handler_setup(&core->video_hdl);
|
|
|
|
v4l2_ctrl_handler_setup(&core->audio_hdl);
|
2011-02-14 18:01:51 +08:00
|
|
|
cx88_video_mux(core, 0);
|
|
|
|
|
2014-09-20 20:22:18 +08:00
|
|
|
q = &dev->vb2_vidq;
|
|
|
|
q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
|
|
|
q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
|
|
|
|
q->gfp_flags = GFP_DMA32;
|
|
|
|
q->min_buffers_needed = 2;
|
|
|
|
q->drv_priv = dev;
|
|
|
|
q->buf_struct_size = sizeof(struct cx88_buffer);
|
|
|
|
q->ops = &cx8800_video_qops;
|
|
|
|
q->mem_ops = &vb2_dma_sg_memops;
|
|
|
|
q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
|
|
|
|
q->lock = &core->lock;
|
2016-02-15 22:37:15 +08:00
|
|
|
q->dev = &dev->pci->dev;
|
2014-09-20 20:22:18 +08:00
|
|
|
|
|
|
|
err = vb2_queue_init(q);
|
|
|
|
if (err < 0)
|
|
|
|
goto fail_unreg;
|
|
|
|
|
|
|
|
q = &dev->vb2_vbiq;
|
|
|
|
q->type = V4L2_BUF_TYPE_VBI_CAPTURE;
|
|
|
|
q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
|
|
|
|
q->gfp_flags = GFP_DMA32;
|
|
|
|
q->min_buffers_needed = 2;
|
|
|
|
q->drv_priv = dev;
|
|
|
|
q->buf_struct_size = sizeof(struct cx88_buffer);
|
|
|
|
q->ops = &cx8800_vbi_qops;
|
|
|
|
q->mem_ops = &vb2_dma_sg_memops;
|
|
|
|
q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
|
|
|
|
q->lock = &core->lock;
|
2016-02-15 22:37:15 +08:00
|
|
|
q->dev = &dev->pci->dev;
|
2014-09-20 20:22:18 +08:00
|
|
|
|
|
|
|
err = vb2_queue_init(q);
|
|
|
|
if (err < 0)
|
|
|
|
goto fail_unreg;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* register v4l devices */
|
2015-03-10 00:34:00 +08:00
|
|
|
cx88_vdev_init(core, dev->pci, &dev->video_dev,
|
|
|
|
&cx8800_video_template, "video");
|
|
|
|
video_set_drvdata(&dev->video_dev, dev);
|
|
|
|
dev->video_dev.ctrl_handler = &core->video_hdl;
|
|
|
|
dev->video_dev.queue = &dev->vb2_vidq;
|
|
|
|
err = video_register_device(&dev->video_dev, VFL_TYPE_GRABBER,
|
2005-04-17 06:20:36 +08:00
|
|
|
video_nr[core->nr]);
|
|
|
|
if (err < 0) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("can't register video device\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
goto fail_unreg;
|
|
|
|
}
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("registered device %s [v4l2]\n",
|
|
|
|
video_device_node_name(&dev->video_dev));
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2015-03-10 00:34:00 +08:00
|
|
|
cx88_vdev_init(core, dev->pci, &dev->vbi_dev,
|
|
|
|
&cx8800_vbi_template, "vbi");
|
|
|
|
video_set_drvdata(&dev->vbi_dev, dev);
|
|
|
|
dev->vbi_dev.queue = &dev->vb2_vbiq;
|
|
|
|
err = video_register_device(&dev->vbi_dev, VFL_TYPE_VBI,
|
2005-04-17 06:20:36 +08:00
|
|
|
vbi_nr[core->nr]);
|
|
|
|
if (err < 0) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("can't register vbi device\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
goto fail_unreg;
|
|
|
|
}
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("registered device %s\n",
|
|
|
|
video_device_node_name(&dev->vbi_dev));
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-08-16 01:41:57 +08:00
|
|
|
if (core->board.radio.type == CX88_RADIO) {
|
2015-03-10 00:34:00 +08:00
|
|
|
cx88_vdev_init(core, dev->pci, &dev->radio_dev,
|
|
|
|
&cx8800_radio_template, "radio");
|
|
|
|
video_set_drvdata(&dev->radio_dev, dev);
|
|
|
|
dev->radio_dev.ctrl_handler = &core->audio_hdl;
|
|
|
|
err = video_register_device(&dev->radio_dev, VFL_TYPE_RADIO,
|
2005-04-17 06:20:36 +08:00
|
|
|
radio_nr[core->nr]);
|
|
|
|
if (err < 0) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("can't register radio device\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
goto fail_unreg;
|
|
|
|
}
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("registered device %s\n",
|
|
|
|
video_device_node_name(&dev->radio_dev));
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/* start tvaudio thread */
|
2014-08-29 18:45:00 +08:00
|
|
|
if (core->board.tuner_type != UNSET) {
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
core->kthread = kthread_run(cx88_audio_thread,
|
|
|
|
core, "cx88 tvaudio");
|
2007-07-19 22:44:11 +08:00
|
|
|
if (IS_ERR(core->kthread)) {
|
|
|
|
err = PTR_ERR(core->kthread);
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("failed to create cx88 audio thread, err=%d\n",
|
|
|
|
err);
|
2007-07-19 22:44:11 +08:00
|
|
|
}
|
|
|
|
}
|
2011-02-14 18:01:51 +08:00
|
|
|
mutex_unlock(&core->lock);
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
fail_unreg:
|
|
|
|
cx8800_unregister_video(dev);
|
|
|
|
free_irq(pci_dev->irq, dev);
|
2011-02-14 18:01:51 +08:00
|
|
|
mutex_unlock(&core->lock);
|
2005-04-17 06:20:36 +08:00
|
|
|
fail_core:
|
2014-08-29 17:08:07 +08:00
|
|
|
core->v4ldev = NULL;
|
2016-11-16 16:59:49 +08:00
|
|
|
cx88_core_put(core, dev->pci);
|
2005-04-17 06:20:36 +08:00
|
|
|
fail_free:
|
|
|
|
kfree(dev);
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2012-12-22 05:17:53 +08:00
|
|
|
static void cx8800_finidev(struct pci_dev *pci_dev)
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
2005-11-09 13:37:43 +08:00
|
|
|
struct cx8800_dev *dev = pci_get_drvdata(pci_dev);
|
2005-09-10 04:03:41 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* stop thread */
|
2005-09-10 04:03:41 +08:00
|
|
|
if (core->kthread) {
|
|
|
|
kthread_stop(core->kthread);
|
|
|
|
core->kthread = NULL;
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
|
2008-03-26 13:07:35 +08:00
|
|
|
if (core->ir)
|
2010-04-01 03:07:49 +08:00
|
|
|
cx88_ir_stop(core);
|
2008-03-26 13:07:35 +08:00
|
|
|
|
2005-09-10 04:03:41 +08:00
|
|
|
cx88_shutdown(core); /* FIXME */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* unregister stuff */
|
|
|
|
|
|
|
|
free_irq(pci_dev->irq, dev);
|
|
|
|
cx8800_unregister_video(dev);
|
2014-09-05 20:37:09 +08:00
|
|
|
pci_disable_device(pci_dev);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2014-08-29 17:08:07 +08:00
|
|
|
core->v4ldev = NULL;
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* free memory */
|
2016-11-16 16:59:49 +08:00
|
|
|
cx88_core_put(core, dev->pci);
|
2005-04-17 06:20:36 +08:00
|
|
|
kfree(dev);
|
|
|
|
}
|
|
|
|
|
2006-08-13 09:01:27 +08:00
|
|
|
#ifdef CONFIG_PM
|
2005-04-17 06:20:36 +08:00
|
|
|
static int cx8800_suspend(struct pci_dev *pci_dev, pm_message_t state)
|
|
|
|
{
|
2005-06-24 13:05:03 +08:00
|
|
|
struct cx8800_dev *dev = pci_get_drvdata(pci_dev);
|
2005-04-17 06:20:36 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
2013-04-14 05:52:04 +08:00
|
|
|
unsigned long flags;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* stop video+vbi capture */
|
2013-04-14 05:52:04 +08:00
|
|
|
spin_lock_irqsave(&dev->slock, flags);
|
2005-04-17 06:20:36 +08:00
|
|
|
if (!list_empty(&dev->vidq.active)) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("suspend video\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
stop_video_dma(dev);
|
|
|
|
}
|
|
|
|
if (!list_empty(&dev->vbiq.active)) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("suspend vbi\n");
|
2005-04-17 06:20:36 +08:00
|
|
|
cx8800_stop_vbi_dma(dev);
|
|
|
|
}
|
2013-04-14 05:52:04 +08:00
|
|
|
spin_unlock_irqrestore(&dev->slock, flags);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-10-01 19:51:39 +08:00
|
|
|
if (core->ir)
|
2010-04-01 03:07:49 +08:00
|
|
|
cx88_ir_stop(core);
|
2005-04-17 06:20:36 +08:00
|
|
|
/* FIXME -- shutdown device */
|
2005-09-10 04:03:41 +08:00
|
|
|
cx88_shutdown(core);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
pci_save_state(pci_dev);
|
[media] cx88: make checkpatch.pl happy
Usually, I don't like fixing coding style issues on non-staging
drivers, as it could be a mess pretty easy, and could become like
a snow ball. That's the case of recent changes on two changesets:
they disalign some statements. Yet, a care a lot with cx88 driver,
as it was the first driver I touched at the Kernel, and I've been
maintaining it since 2005. So, several of the coding style issues
were due to my code.
Per Andrey's suggestion, I ran checkpatch.pl in strict mode, with
fixed several other issues, did some function alinments, but broke
other alinments.
So, I had to manually apply another round of manual fixes to make
sure that everything is ok, and to make checkpatch happy with
this patch.
With this patch, checkpatch.pl is now happy when called with:
./scripts/checkpatch.pl -f --max-line-length=998 --ignore PREFER_PR_LEVEL
Also, the 80-cols violations that made sense were fixed.
Checkpatch would be happier if we convert it to use dev_foo(),
but this is a more complex change.
NOTE: there are some places with msleep(1). As this driver was
written at the time that the default was to sleep at least 10ms
on such calls (e. g. CONFIG_HZ=100), I replaced those calls by
usleep_range(10000, 20000), with should be safe to avoid breakages.
Fixes: 65bc2fe86e66 ("[media] cx88: convert it to use pr_foo() macros")
Fixes: 7b61ba8ff838 ("[media] cx88: make checkpatch happier")
Suggested-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Reviewed-by: Andrey Utkin <andrey_utkin@fastmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-11-20 05:27:30 +08:00
|
|
|
if (pci_set_power_state(pci_dev,
|
|
|
|
pci_choose_state(pci_dev, state)) != 0) {
|
2005-04-17 06:20:36 +08:00
|
|
|
pci_disable_device(pci_dev);
|
|
|
|
dev->state.disabled = 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int cx8800_resume(struct pci_dev *pci_dev)
|
|
|
|
{
|
2005-06-24 13:05:03 +08:00
|
|
|
struct cx8800_dev *dev = pci_get_drvdata(pci_dev);
|
2005-04-17 06:20:36 +08:00
|
|
|
struct cx88_core *core = dev->core;
|
2013-04-14 05:52:04 +08:00
|
|
|
unsigned long flags;
|
2005-09-10 04:03:55 +08:00
|
|
|
int err;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
if (dev->state.disabled) {
|
2016-11-16 16:59:49 +08:00
|
|
|
err = pci_enable_device(pci_dev);
|
2005-09-10 04:03:55 +08:00
|
|
|
if (err) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("can't enable device\n");
|
2005-09-10 04:03:55 +08:00
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
dev->state.disabled = 0;
|
|
|
|
}
|
2016-11-16 16:59:49 +08:00
|
|
|
err = pci_set_power_state(pci_dev, PCI_D0);
|
2005-09-10 04:03:55 +08:00
|
|
|
if (err) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_err("can't set power state\n");
|
2005-09-10 04:03:55 +08:00
|
|
|
pci_disable_device(pci_dev);
|
|
|
|
dev->state.disabled = 1;
|
|
|
|
|
|
|
|
return err;
|
|
|
|
}
|
2005-04-17 06:20:36 +08:00
|
|
|
pci_restore_state(pci_dev);
|
|
|
|
|
|
|
|
/* FIXME: re-initialize hardware */
|
2005-09-10 04:03:41 +08:00
|
|
|
cx88_reset(core);
|
2007-10-01 19:51:39 +08:00
|
|
|
if (core->ir)
|
2010-04-01 03:07:49 +08:00
|
|
|
cx88_ir_start(core);
|
2007-10-01 19:51:39 +08:00
|
|
|
|
|
|
|
cx_set(MO_PCI_INTMSK, core->pci_irqmask);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* restart video+vbi capture */
|
2013-04-14 05:52:04 +08:00
|
|
|
spin_lock_irqsave(&dev->slock, flags);
|
2005-04-17 06:20:36 +08:00
|
|
|
if (!list_empty(&dev->vidq.active)) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("resume video\n");
|
2016-11-16 16:59:49 +08:00
|
|
|
restart_video_queue(dev, &dev->vidq);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
|
|
|
if (!list_empty(&dev->vbiq.active)) {
|
2016-11-13 20:07:38 +08:00
|
|
|
pr_info("resume vbi\n");
|
2016-11-16 16:59:49 +08:00
|
|
|
cx8800_restart_vbi_queue(dev, &dev->vbiq);
|
2005-04-17 06:20:36 +08:00
|
|
|
}
|
2013-04-14 05:52:04 +08:00
|
|
|
spin_unlock_irqrestore(&dev->slock, flags);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2006-08-13 09:01:27 +08:00
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/* ----------------------------------------------------------- */
|
|
|
|
|
2010-08-25 20:50:20 +08:00
|
|
|
static const struct pci_device_id cx8800_pci_tbl[] = {
|
2005-04-17 06:20:36 +08:00
|
|
|
{
|
|
|
|
.vendor = 0x14f1,
|
|
|
|
.device = 0x8800,
|
2005-06-24 13:05:03 +08:00
|
|
|
.subvendor = PCI_ANY_ID,
|
|
|
|
.subdevice = PCI_ANY_ID,
|
2016-11-16 16:59:49 +08:00
|
|
|
}, {
|
2005-04-17 06:20:36 +08:00
|
|
|
/* --- end of list --- */
|
|
|
|
}
|
|
|
|
};
|
|
|
|
MODULE_DEVICE_TABLE(pci, cx8800_pci_tbl);
|
|
|
|
|
|
|
|
static struct pci_driver cx8800_pci_driver = {
|
2005-06-24 13:05:03 +08:00
|
|
|
.name = "cx8800",
|
|
|
|
.id_table = cx8800_pci_tbl,
|
|
|
|
.probe = cx8800_initdev,
|
2012-12-22 05:17:53 +08:00
|
|
|
.remove = cx8800_finidev,
|
2006-08-13 09:01:27 +08:00
|
|
|
#ifdef CONFIG_PM
|
2005-04-17 06:20:36 +08:00
|
|
|
.suspend = cx8800_suspend,
|
|
|
|
.resume = cx8800_resume,
|
2006-08-13 09:01:27 +08:00
|
|
|
#endif
|
2005-04-17 06:20:36 +08:00
|
|
|
};
|
|
|
|
|
2013-09-20 16:32:07 +08:00
|
|
|
module_pci_driver(cx8800_pci_driver);
|