You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (42 commits) [media] media: vb2: correct queue initialization order [media] media: vb2: fix incorrect v4l2_buffer->flags handling [media] s5p-fimc: Add support for the buffer timestamps and sequence [media] s5p-fimc: Fix bytesperline and plane payload setup [media] s5p-fimc: Do not allow changing format after REQBUFS [media] s5p-fimc: Fix FIMC3 pixel limits on Exynos4 [media] tda18271: update tda18271c2_rf_cal as per NXP's rev.04 datasheet [media] tda18271: update tda18271_rf_band as per NXP's rev.04 datasheet [media] tda18271: fix bad calculation of main post divider byte [media] tda18271: prog_cal and prog_tab variables should be s32, not u8 [media] tda18271: fix calculation bug in tda18271_rf_tracking_filters_init [media] omap3isp: queue: Don't corrupt buf->npages when get_user_pages() fails [media] v4l: Don't register media entities for subdev device nodes [media] omap3isp: Don't increment node entity use count when poweron fails [media] omap3isp: lane shifter support [media] omap3isp: ccdc: support Y10/12, 8-bit bayer fmts [media] media: add missing 8-bit bayer formats and Y12 [media] v4l: add V4L2_PIX_FMT_Y12 format cx23885: Fix stv0367 Kconfig dependency [media] omap3isp: Use isp xclk defines ... Fix up trivial conflict (spelink errurs) in drivers/media/video/omap3isp/isp.c
This commit is contained in:
@@ -294,6 +294,7 @@
|
||||
<!ENTITY sub-srggb10 SYSTEM "v4l/pixfmt-srggb10.xml">
|
||||
<!ENTITY sub-srggb8 SYSTEM "v4l/pixfmt-srggb8.xml">
|
||||
<!ENTITY sub-y10 SYSTEM "v4l/pixfmt-y10.xml">
|
||||
<!ENTITY sub-y12 SYSTEM "v4l/pixfmt-y12.xml">
|
||||
<!ENTITY sub-pixfmt SYSTEM "v4l/pixfmt.xml">
|
||||
<!ENTITY sub-cropcap SYSTEM "v4l/vidioc-cropcap.xml">
|
||||
<!ENTITY sub-dbg-g-register SYSTEM "v4l/vidioc-dbg-g-register.xml">
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<varlistentry>
|
||||
<term><parameter>request</parameter></term>
|
||||
<listitem>
|
||||
<para>MEDIA_IOC_ENUM_LINKS</para>
|
||||
<para>MEDIA_IOC_SETUP_LINK</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
<refentry id="V4L2-PIX-FMT-Y12">
|
||||
<refmeta>
|
||||
<refentrytitle>V4L2_PIX_FMT_Y12 ('Y12 ')</refentrytitle>
|
||||
&manvol;
|
||||
</refmeta>
|
||||
<refnamediv>
|
||||
<refname><constant>V4L2_PIX_FMT_Y12</constant></refname>
|
||||
<refpurpose>Grey-scale image</refpurpose>
|
||||
</refnamediv>
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
|
||||
<para>This is a grey-scale image with a depth of 12 bits per pixel. Pixels
|
||||
are stored in 16-bit words with unused high bits padded with 0. The least
|
||||
significant byte is stored at lower memory addresses (little-endian).</para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_Y12</constant> 4 × 4
|
||||
pixel image</title>
|
||||
|
||||
<formalpara>
|
||||
<title>Byte Order.</title>
|
||||
<para>Each cell is one byte.
|
||||
<informaltable frame="none">
|
||||
<tgroup cols="9" align="center">
|
||||
<colspec align="left" colwidth="2*" />
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry>start + 0:</entry>
|
||||
<entry>Y'<subscript>00low</subscript></entry>
|
||||
<entry>Y'<subscript>00high</subscript></entry>
|
||||
<entry>Y'<subscript>01low</subscript></entry>
|
||||
<entry>Y'<subscript>01high</subscript></entry>
|
||||
<entry>Y'<subscript>02low</subscript></entry>
|
||||
<entry>Y'<subscript>02high</subscript></entry>
|
||||
<entry>Y'<subscript>03low</subscript></entry>
|
||||
<entry>Y'<subscript>03high</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 8:</entry>
|
||||
<entry>Y'<subscript>10low</subscript></entry>
|
||||
<entry>Y'<subscript>10high</subscript></entry>
|
||||
<entry>Y'<subscript>11low</subscript></entry>
|
||||
<entry>Y'<subscript>11high</subscript></entry>
|
||||
<entry>Y'<subscript>12low</subscript></entry>
|
||||
<entry>Y'<subscript>12high</subscript></entry>
|
||||
<entry>Y'<subscript>13low</subscript></entry>
|
||||
<entry>Y'<subscript>13high</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 16:</entry>
|
||||
<entry>Y'<subscript>20low</subscript></entry>
|
||||
<entry>Y'<subscript>20high</subscript></entry>
|
||||
<entry>Y'<subscript>21low</subscript></entry>
|
||||
<entry>Y'<subscript>21high</subscript></entry>
|
||||
<entry>Y'<subscript>22low</subscript></entry>
|
||||
<entry>Y'<subscript>22high</subscript></entry>
|
||||
<entry>Y'<subscript>23low</subscript></entry>
|
||||
<entry>Y'<subscript>23high</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 24:</entry>
|
||||
<entry>Y'<subscript>30low</subscript></entry>
|
||||
<entry>Y'<subscript>30high</subscript></entry>
|
||||
<entry>Y'<subscript>31low</subscript></entry>
|
||||
<entry>Y'<subscript>31high</subscript></entry>
|
||||
<entry>Y'<subscript>32low</subscript></entry>
|
||||
<entry>Y'<subscript>32high</subscript></entry>
|
||||
<entry>Y'<subscript>33low</subscript></entry>
|
||||
<entry>Y'<subscript>33high</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</para>
|
||||
</formalpara>
|
||||
</example>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
@@ -696,6 +696,7 @@ information.</para>
|
||||
&sub-packed-yuv;
|
||||
&sub-grey;
|
||||
&sub-y10;
|
||||
&sub-y12;
|
||||
&sub-y16;
|
||||
&sub-yuyv;
|
||||
&sub-uyvy;
|
||||
|
||||
@@ -456,6 +456,23 @@
|
||||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGBRG8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGBRG8_1X8</entry>
|
||||
<entry>0x3013</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>g<subscript>7</subscript></entry>
|
||||
<entry>g<subscript>6</subscript></entry>
|
||||
<entry>g<subscript>5</subscript></entry>
|
||||
<entry>g<subscript>4</subscript></entry>
|
||||
<entry>g<subscript>3</subscript></entry>
|
||||
<entry>g<subscript>2</subscript></entry>
|
||||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SGRBG8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SGRBG8_1X8</entry>
|
||||
<entry>0x3002</entry>
|
||||
@@ -473,6 +490,23 @@
|
||||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SRGGB8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SRGGB8_1X8</entry>
|
||||
<entry>0x3014</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>r<subscript>7</subscript></entry>
|
||||
<entry>r<subscript>6</subscript></entry>
|
||||
<entry>r<subscript>5</subscript></entry>
|
||||
<entry>r<subscript>4</subscript></entry>
|
||||
<entry>r<subscript>3</subscript></entry>
|
||||
<entry>r<subscript>2</subscript></entry>
|
||||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-SBGGR10-DPCM8-1X8">
|
||||
<entry>V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8</entry>
|
||||
<entry>0x300b</entry>
|
||||
@@ -2159,6 +2193,31 @@
|
||||
<entry>u<subscript>1</subscript></entry>
|
||||
<entry>u<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-Y12-1X12">
|
||||
<entry>V4L2_MBUS_FMT_Y12_1X12</entry>
|
||||
<entry>0x2013</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>y<subscript>11</subscript></entry>
|
||||
<entry>y<subscript>10</subscript></entry>
|
||||
<entry>y<subscript>9</subscript></entry>
|
||||
<entry>y<subscript>8</subscript></entry>
|
||||
<entry>y<subscript>7</subscript></entry>
|
||||
<entry>y<subscript>6</subscript></entry>
|
||||
<entry>y<subscript>5</subscript></entry>
|
||||
<entry>y<subscript>4</subscript></entry>
|
||||
<entry>y<subscript>3</subscript></entry>
|
||||
<entry>y<subscript>2</subscript></entry>
|
||||
<entry>y<subscript>1</subscript></entry>
|
||||
<entry>y<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-MBUS-FMT-UYVY8-1X16">
|
||||
<entry>V4L2_MBUS_FMT_UYVY8_1X16</entry>
|
||||
<entry>0x200f</entry>
|
||||
|
||||
@@ -37,7 +37,7 @@ Generic scaling / cropping scheme
|
||||
-1'-
|
||||
|
||||
In the above chart minuses and slashes represent "real" data amounts, points and
|
||||
accents represent "useful" data, basically, CEU scaled amd cropped output,
|
||||
accents represent "useful" data, basically, CEU scaled and cropped output,
|
||||
mapped back onto the client's source plane.
|
||||
|
||||
Such a configuration can be produced by user requests:
|
||||
@@ -65,7 +65,7 @@ Do not touch input rectangle - it is already optimal.
|
||||
|
||||
1. Calculate current sensor scales:
|
||||
|
||||
scale_s = ((3') - (3)) / ((2') - (2))
|
||||
scale_s = ((2') - (2)) / ((3') - (3))
|
||||
|
||||
2. Calculate "effective" input crop (sensor subwindow) - CEU crop scaled back at
|
||||
current sensor scales onto input window - this is user S_CROP:
|
||||
@@ -80,7 +80,7 @@ window:
|
||||
4. Calculate sensor output window by applying combined scales to real input
|
||||
window:
|
||||
|
||||
width_s_out = ((2') - (2)) / scale_comb
|
||||
width_s_out = ((7') - (7)) = ((2') - (2)) / scale_comb
|
||||
|
||||
5. Apply iterative sensor S_FMT for sensor output window.
|
||||
|
||||
|
||||
@@ -533,16 +533,7 @@ int tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq)
|
||||
if (tda_fail(ret))
|
||||
goto fail;
|
||||
|
||||
regs[R_MPD] = (0x77 & pd);
|
||||
|
||||
switch (priv->mode) {
|
||||
case TDA18271_ANALOG:
|
||||
regs[R_MPD] &= ~0x08;
|
||||
break;
|
||||
case TDA18271_DIGITAL:
|
||||
regs[R_MPD] |= 0x08;
|
||||
break;
|
||||
}
|
||||
regs[R_MPD] = (0x7f & pd);
|
||||
|
||||
div = ((d * (freq / 1000)) << 7) / 125;
|
||||
|
||||
|
||||
@@ -579,8 +579,8 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
|
||||
#define RF3 2
|
||||
u32 rf_default[3];
|
||||
u32 rf_freq[3];
|
||||
u8 prog_cal[3];
|
||||
u8 prog_tab[3];
|
||||
s32 prog_cal[3];
|
||||
s32 prog_tab[3];
|
||||
|
||||
i = tda18271_lookup_rf_band(fe, &freq, NULL);
|
||||
|
||||
@@ -602,32 +602,33 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
|
||||
return bcal;
|
||||
|
||||
tda18271_calc_rf_cal(fe, &rf_freq[rf]);
|
||||
prog_tab[rf] = regs[R_EB14];
|
||||
prog_tab[rf] = (s32)regs[R_EB14];
|
||||
|
||||
if (1 == bcal)
|
||||
prog_cal[rf] = tda18271_calibrate_rf(fe, rf_freq[rf]);
|
||||
prog_cal[rf] =
|
||||
(s32)tda18271_calibrate_rf(fe, rf_freq[rf]);
|
||||
else
|
||||
prog_cal[rf] = prog_tab[rf];
|
||||
|
||||
switch (rf) {
|
||||
case RF1:
|
||||
map[i].rf_a1 = 0;
|
||||
map[i].rf_b1 = (s32)(prog_cal[RF1] - prog_tab[RF1]);
|
||||
map[i].rf_b1 = (prog_cal[RF1] - prog_tab[RF1]);
|
||||
map[i].rf1 = rf_freq[RF1] / 1000;
|
||||
break;
|
||||
case RF2:
|
||||
dividend = (s32)(prog_cal[RF2] - prog_tab[RF2]) -
|
||||
(s32)(prog_cal[RF1] + prog_tab[RF1]);
|
||||
dividend = (prog_cal[RF2] - prog_tab[RF2] -
|
||||
prog_cal[RF1] + prog_tab[RF1]);
|
||||
divisor = (s32)(rf_freq[RF2] - rf_freq[RF1]) / 1000;
|
||||
map[i].rf_a1 = (dividend / divisor);
|
||||
map[i].rf2 = rf_freq[RF2] / 1000;
|
||||
break;
|
||||
case RF3:
|
||||
dividend = (s32)(prog_cal[RF3] - prog_tab[RF3]) -
|
||||
(s32)(prog_cal[RF2] + prog_tab[RF2]);
|
||||
dividend = (prog_cal[RF3] - prog_tab[RF3] -
|
||||
prog_cal[RF2] + prog_tab[RF2]);
|
||||
divisor = (s32)(rf_freq[RF3] - rf_freq[RF2]) / 1000;
|
||||
map[i].rf_a2 = (dividend / divisor);
|
||||
map[i].rf_b2 = (s32)(prog_cal[RF2] - prog_tab[RF2]);
|
||||
map[i].rf_b2 = (prog_cal[RF2] - prog_tab[RF2]);
|
||||
map[i].rf3 = rf_freq[RF3] / 1000;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -229,8 +229,7 @@ static struct tda18271_map tda18271c2_km[] = {
|
||||
static struct tda18271_map tda18271_rf_band[] = {
|
||||
{ .rfmax = 47900, .val = 0x00 },
|
||||
{ .rfmax = 61100, .val = 0x01 },
|
||||
/* { .rfmax = 152600, .val = 0x02 }, */
|
||||
{ .rfmax = 121200, .val = 0x02 },
|
||||
{ .rfmax = 152600, .val = 0x02 },
|
||||
{ .rfmax = 164700, .val = 0x03 },
|
||||
{ .rfmax = 203500, .val = 0x04 },
|
||||
{ .rfmax = 457800, .val = 0x05 },
|
||||
@@ -448,7 +447,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
|
||||
{ .rfmax = 150000, .val = 0xb0 },
|
||||
{ .rfmax = 151000, .val = 0xb1 },
|
||||
{ .rfmax = 152000, .val = 0xb7 },
|
||||
{ .rfmax = 153000, .val = 0xbd },
|
||||
{ .rfmax = 152600, .val = 0xbd },
|
||||
{ .rfmax = 154000, .val = 0x20 },
|
||||
{ .rfmax = 155000, .val = 0x22 },
|
||||
{ .rfmax = 156000, .val = 0x24 },
|
||||
@@ -459,7 +458,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
|
||||
{ .rfmax = 161000, .val = 0x2d },
|
||||
{ .rfmax = 163000, .val = 0x2e },
|
||||
{ .rfmax = 164000, .val = 0x2f },
|
||||
{ .rfmax = 165000, .val = 0x30 },
|
||||
{ .rfmax = 164700, .val = 0x30 },
|
||||
{ .rfmax = 166000, .val = 0x11 },
|
||||
{ .rfmax = 167000, .val = 0x12 },
|
||||
{ .rfmax = 168000, .val = 0x13 },
|
||||
@@ -510,7 +509,8 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
|
||||
{ .rfmax = 236000, .val = 0x1b },
|
||||
{ .rfmax = 237000, .val = 0x1c },
|
||||
{ .rfmax = 240000, .val = 0x1d },
|
||||
{ .rfmax = 242000, .val = 0x1f },
|
||||
{ .rfmax = 242000, .val = 0x1e },
|
||||
{ .rfmax = 244000, .val = 0x1f },
|
||||
{ .rfmax = 247000, .val = 0x20 },
|
||||
{ .rfmax = 249000, .val = 0x21 },
|
||||
{ .rfmax = 252000, .val = 0x22 },
|
||||
@@ -624,7 +624,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = {
|
||||
{ .rfmax = 453000, .val = 0x93 },
|
||||
{ .rfmax = 454000, .val = 0x94 },
|
||||
{ .rfmax = 456000, .val = 0x96 },
|
||||
{ .rfmax = 457000, .val = 0x98 },
|
||||
{ .rfmax = 457800, .val = 0x98 },
|
||||
{ .rfmax = 461000, .val = 0x11 },
|
||||
{ .rfmax = 468000, .val = 0x12 },
|
||||
{ .rfmax = 472000, .val = 0x13 },
|
||||
|
||||
@@ -38,7 +38,7 @@ MODULE_PARM_DESC(debug,
|
||||
DEBSTATUS);
|
||||
|
||||
#define DRIVER_VERSION "0.1"
|
||||
#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver"
|
||||
#define DRIVER_NAME "flexcop-pci"
|
||||
#define DRIVER_AUTHOR "Patrick Boettcher <patrick.boettcher@desy.de>"
|
||||
|
||||
struct flexcop_pci {
|
||||
|
||||
@@ -362,7 +362,7 @@ config DVB_USB_LME2510
|
||||
config DVB_USB_TECHNISAT_USB2
|
||||
tristate "Technisat DVB-S/S2 USB2.0 support"
|
||||
depends on DVB_USB
|
||||
select DVB_STB0899 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STB6100 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV090x if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV6110x if !DVB_FE_CUSTOMISE
|
||||
help
|
||||
Say Y here to support the Technisat USB2 DVB-S/S2 device
|
||||
|
||||
@@ -2162,7 +2162,7 @@ struct dibx000_agc_config dib7090_agc_config[2] = {
|
||||
.agc1_pt3 = 98,
|
||||
.agc1_slope1 = 0,
|
||||
.agc1_slope2 = 167,
|
||||
.agc1_pt1 = 98,
|
||||
.agc2_pt1 = 98,
|
||||
.agc2_pt2 = 255,
|
||||
.agc2_slope1 = 104,
|
||||
.agc2_slope2 = 0,
|
||||
@@ -2440,11 +2440,11 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
|
||||
dib0700_set_i2c_speed(adap->dev, 340);
|
||||
adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]);
|
||||
|
||||
dib7090_slave_reset(adap->fe);
|
||||
|
||||
if (adap->fe == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
dib7090_slave_reset(adap->fe);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -378,7 +378,6 @@ EXPORT_SYMBOL_GPL(media_entity_create_link);
|
||||
|
||||
static int __media_entity_setup_link_notify(struct media_link *link, u32 flags)
|
||||
{
|
||||
const u32 mask = MEDIA_LNK_FL_ENABLED;
|
||||
int ret;
|
||||
|
||||
/* Notify both entities. */
|
||||
@@ -395,7 +394,7 @@ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags)
|
||||
return ret;
|
||||
}
|
||||
|
||||
link->flags = (link->flags & ~mask) | (flags & mask);
|
||||
link->flags = flags;
|
||||
link->reverse->flags = link->flags;
|
||||
|
||||
return 0;
|
||||
@@ -417,6 +416,7 @@ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags)
|
||||
*/
|
||||
int __media_entity_setup_link(struct media_link *link, u32 flags)
|
||||
{
|
||||
const u32 mask = MEDIA_LNK_FL_ENABLED;
|
||||
struct media_device *mdev;
|
||||
struct media_entity *source, *sink;
|
||||
int ret = -EBUSY;
|
||||
@@ -424,6 +424,10 @@ int __media_entity_setup_link(struct media_link *link, u32 flags)
|
||||
if (link == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* The non-modifiable link flags must not be modified. */
|
||||
if ((link->flags & ~mask) != (flags & ~mask))
|
||||
return -EINVAL;
|
||||
|
||||
if (link->flags & MEDIA_LNK_FL_IMMUTABLE)
|
||||
return link->flags == flags ? 0 : -EINVAL;
|
||||
|
||||
|
||||
@@ -875,7 +875,7 @@ config MX3_VIDEO
|
||||
config VIDEO_MX3
|
||||
tristate "i.MX3x Camera Sensor Interface driver"
|
||||
depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA
|
||||
select VIDEOBUF_DMA_CONTIG
|
||||
select VIDEOBUF2_DMA_CONTIG
|
||||
select MX3_VIDEO
|
||||
---help---
|
||||
This is a v4l2 driver for the i.MX3x Camera Sensor Interface
|
||||
|
||||
@@ -350,9 +350,17 @@ void cx18_streams_cleanup(struct cx18 *cx, int unregister)
|
||||
|
||||
/* No struct video_device, but can have buffers allocated */
|
||||
if (type == CX18_ENC_STREAM_TYPE_IDX) {
|
||||
/* If the module params didn't inhibit IDX ... */
|
||||
if (cx->stream_buffers[type] != 0) {
|
||||
cx->stream_buffers[type] = 0;
|
||||
cx18_stream_free(&cx->streams[type]);
|
||||
/*
|
||||
* Before calling cx18_stream_free(),
|
||||
* check if the IDX stream was actually set up.
|
||||
* Needed, since the cx18_probe() error path
|
||||
* exits through here as well as normal clean up
|
||||
*/
|
||||
if (cx->streams[type].buffers != 0)
|
||||
cx18_stream_free(&cx->streams[type]);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ config VIDEO_CX23885
|
||||
select DVB_CX24116 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0900 if !DVB_FE_CUSTOMISE
|
||||
select DVB_DS3000 if !DVB_FE_CUSTOMISE
|
||||
select DVB_STV0367 if !DVB_FE_CUSTOMISE
|
||||
select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMISE
|
||||
select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE
|
||||
select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE
|
||||
|
||||
@@ -298,7 +298,7 @@ static unsigned long imx074_query_bus_param(struct soc_camera_device *icd)
|
||||
static int imx074_set_bus_param(struct soc_camera_device *icd,
|
||||
unsigned long flags)
|
||||
{
|
||||
return -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static struct soc_camera_ops imx074_ops = {
|
||||
|
||||
@@ -215,20 +215,21 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
|
||||
}
|
||||
|
||||
switch (xclksel) {
|
||||
case 0:
|
||||
case ISP_XCLK_A:
|
||||
isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
|
||||
ISPTCTRL_CTRL_DIVA_MASK,
|
||||
divisor << ISPTCTRL_CTRL_DIVA_SHIFT);
|
||||
dev_dbg(isp->dev, "isp_set_xclk(): cam_xclka set to %d Hz\n",
|
||||
currentxclk);
|
||||
break;
|
||||
case 1:
|
||||
case ISP_XCLK_B:
|
||||
isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
|
||||
ISPTCTRL_CTRL_DIVB_MASK,
|
||||
divisor << ISPTCTRL_CTRL_DIVB_SHIFT);
|
||||
dev_dbg(isp->dev, "isp_set_xclk(): cam_xclkb set to %d Hz\n",
|
||||
currentxclk);
|
||||
break;
|
||||
case ISP_XCLK_NONE:
|
||||
default:
|
||||
omap3isp_put(isp);
|
||||
dev_dbg(isp->dev, "ISP_ERR: isp_set_xclk(): Invalid requested "
|
||||
@@ -237,13 +238,13 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
|
||||
}
|
||||
|
||||
/* Do we go from stable whatever to clock? */
|
||||
if (divisor >= 2 && isp->xclk_divisor[xclksel] < 2)
|
||||
if (divisor >= 2 && isp->xclk_divisor[xclksel - 1] < 2)
|
||||
omap3isp_get(isp);
|
||||
/* Stopping the clock. */
|
||||
else if (divisor < 2 && isp->xclk_divisor[xclksel] >= 2)
|
||||
else if (divisor < 2 && isp->xclk_divisor[xclksel - 1] >= 2)
|
||||
omap3isp_put(isp);
|
||||
|
||||
isp->xclk_divisor[xclksel] = divisor;
|
||||
isp->xclk_divisor[xclksel - 1] = divisor;
|
||||
|
||||
omap3isp_put(isp);
|
||||
|
||||
@@ -285,7 +286,8 @@ static void isp_power_settings(struct isp_device *isp, int idle)
|
||||
*/
|
||||
void omap3isp_configure_bridge(struct isp_device *isp,
|
||||
enum ccdc_input_entity input,
|
||||
const struct isp_parallel_platform_data *pdata)
|
||||
const struct isp_parallel_platform_data *pdata,
|
||||
unsigned int shift)
|
||||
{
|
||||
u32 ispctrl_val;
|
||||
|
||||
@@ -298,9 +300,9 @@ void omap3isp_configure_bridge(struct isp_device *isp,
|
||||
switch (input) {
|
||||
case CCDC_INPUT_PARALLEL:
|
||||
ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_PARALLEL;
|
||||
ispctrl_val |= pdata->data_lane_shift << ISPCTRL_SHIFT_SHIFT;
|
||||
ispctrl_val |= pdata->clk_pol << ISPCTRL_PAR_CLK_POL_SHIFT;
|
||||
ispctrl_val |= pdata->bridge << ISPCTRL_PAR_BRIDGE_SHIFT;
|
||||
shift += pdata->data_lane_shift * 2;
|
||||
break;
|
||||
|
||||
case CCDC_INPUT_CSI2A:
|
||||
@@ -319,6 +321,8 @@ void omap3isp_configure_bridge(struct isp_device *isp,
|
||||
return;
|
||||
}
|
||||
|
||||
ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK;
|
||||
|
||||
ispctrl_val &= ~ISPCTRL_SYNC_DETECT_MASK;
|
||||
ispctrl_val |= ISPCTRL_SYNC_DETECT_VSRISE;
|
||||
|
||||
@@ -658,6 +662,8 @@ int omap3isp_pipeline_pm_use(struct media_entity *entity, int use)
|
||||
|
||||
/* Apply power change to connected non-nodes. */
|
||||
ret = isp_pipeline_pm_power(entity, change);
|
||||
if (ret < 0)
|
||||
entity->use_count -= change;
|
||||
|
||||
mutex_unlock(&entity->parent->graph_mutex);
|
||||
|
||||
@@ -872,6 +878,9 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe)
|
||||
}
|
||||
}
|
||||
|
||||
if (failure < 0)
|
||||
isp->needs_reset = true;
|
||||
|
||||
return failure;
|
||||
}
|
||||
|
||||
@@ -884,7 +893,8 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe)
|
||||
* single-shot or continuous mode.
|
||||
*
|
||||
* Return 0 if successful, or the return value of the failed video::s_stream
|
||||
* operation otherwise.
|
||||
* operation otherwise. The pipeline state is not updated when the operation
|
||||
* fails, except when stopping the pipeline.
|
||||
*/
|
||||
int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
|
||||
enum isp_pipeline_stream_state state)
|
||||
@@ -895,7 +905,9 @@ int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
|
||||
ret = isp_pipeline_disable(pipe);
|
||||
else
|
||||
ret = isp_pipeline_enable(pipe, state);
|
||||
pipe->stream_state = state;
|
||||
|
||||
if (ret == 0 || state == ISP_PIPELINE_STREAM_STOPPED)
|
||||
pipe->stream_state = state;
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1481,6 +1493,10 @@ void omap3isp_put(struct isp_device *isp)
|
||||
if (--isp->ref_count == 0) {
|
||||
isp_disable_interrupts(isp);
|
||||
isp_save_ctx(isp);
|
||||
if (isp->needs_reset) {
|
||||
isp_reset(isp);
|
||||
isp->needs_reset = false;
|
||||
}
|
||||
isp_disable_clocks(isp);
|
||||
}
|
||||
mutex_unlock(&isp->isp_mutex);
|
||||
|
||||
@@ -132,7 +132,6 @@ struct isp_reg {
|
||||
|
||||
/**
|
||||
* struct isp_parallel_platform_data - Parallel interface platform data
|
||||
* @width: Parallel bus width in bits (8, 10, 11 or 12)
|
||||
* @data_lane_shift: Data lane shifter
|
||||
* 0 - CAMEXT[13:0] -> CAM[13:0]
|
||||
* 1 - CAMEXT[13:2] -> CAM[11:0]
|
||||
@@ -146,7 +145,6 @@ struct isp_reg {
|
||||
* ISPCTRL_PAR_BRIDGE_BENDIAN - Big endian
|
||||
*/
|
||||
struct isp_parallel_platform_data {
|
||||
unsigned int width;
|
||||
unsigned int data_lane_shift:2;
|
||||
unsigned int clk_pol:1;
|
||||
unsigned int bridge:4;
|
||||
@@ -262,6 +260,7 @@ struct isp_device {
|
||||
/* ISP Obj */
|
||||
spinlock_t stat_lock; /* common lock for statistic drivers */
|
||||
struct mutex isp_mutex; /* For handling ref_count field */
|
||||
bool needs_reset;
|
||||
int has_context;
|
||||
int ref_count;
|
||||
unsigned int autoidle;
|
||||
@@ -311,11 +310,12 @@ int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe,
|
||||
enum isp_pipeline_stream_state state);
|
||||
void omap3isp_configure_bridge(struct isp_device *isp,
|
||||
enum ccdc_input_entity input,
|
||||
const struct isp_parallel_platform_data *pdata);
|
||||
const struct isp_parallel_platform_data *pdata,
|
||||
unsigned int shift);
|
||||
|
||||
#define ISP_XCLK_NONE -1
|
||||
#define ISP_XCLK_A 0
|
||||
#define ISP_XCLK_B 1
|
||||
#define ISP_XCLK_NONE 0
|
||||
#define ISP_XCLK_A 1
|
||||
#define ISP_XCLK_B 2
|
||||
|
||||
struct isp_device *omap3isp_get(struct isp_device *isp);
|
||||
void omap3isp_put(struct isp_device *isp);
|
||||
|
||||
@@ -43,6 +43,12 @@ __ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,
|
||||
|
||||
static const unsigned int ccdc_fmts[] = {
|
||||
V4L2_MBUS_FMT_Y8_1X8,
|
||||
V4L2_MBUS_FMT_Y10_1X10,
|
||||
V4L2_MBUS_FMT_Y12_1X12,
|
||||
V4L2_MBUS_FMT_SGRBG8_1X8,
|
||||
V4L2_MBUS_FMT_SRGGB8_1X8,
|
||||
V4L2_MBUS_FMT_SBGGR8_1X8,
|
||||
V4L2_MBUS_FMT_SGBRG8_1X8,
|
||||
V4L2_MBUS_FMT_SGRBG10_1X10,
|
||||
V4L2_MBUS_FMT_SRGGB10_1X10,
|
||||
V4L2_MBUS_FMT_SBGGR10_1X10,
|
||||
@@ -1110,21 +1116,38 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
|
||||
struct isp_parallel_platform_data *pdata = NULL;
|
||||
struct v4l2_subdev *sensor;
|
||||
struct v4l2_mbus_framefmt *format;
|
||||
const struct isp_format_info *fmt_info;
|
||||
struct v4l2_subdev_format fmt_src;
|
||||
unsigned int depth_out;
|
||||
unsigned int depth_in = 0;
|
||||
struct media_pad *pad;
|
||||
unsigned long flags;
|
||||
unsigned int shift;
|
||||
u32 syn_mode;
|
||||
u32 ccdc_pattern;
|
||||
|
||||
if (ccdc->input == CCDC_INPUT_PARALLEL) {
|
||||
pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]);
|
||||
sensor = media_entity_to_v4l2_subdev(pad->entity);
|
||||
pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]);
|
||||
sensor = media_entity_to_v4l2_subdev(pad->entity);
|
||||
if (ccdc->input == CCDC_INPUT_PARALLEL)
|
||||
pdata = &((struct isp_v4l2_subdevs_group *)sensor->host_priv)
|
||||
->bus.parallel;
|
||||
|
||||
/* Compute shift value for lane shifter to configure the bridge. */
|
||||
fmt_src.pad = pad->index;
|
||||
fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE;
|
||||
if (!v4l2_subdev_call(sensor, pad, get_fmt, NULL, &fmt_src)) {
|
||||
fmt_info = omap3isp_video_format_info(fmt_src.format.code);
|
||||
depth_in = fmt_info->bpp;
|
||||
}
|
||||
|
||||
omap3isp_configure_bridge(isp, ccdc->input, pdata);
|
||||
fmt_info = omap3isp_video_format_info
|
||||
(isp->isp_ccdc.formats[CCDC_PAD_SINK].code);
|
||||
depth_out = fmt_info->bpp;
|
||||
|
||||
ccdc->syncif.datsz = pdata ? pdata->width : 10;
|
||||
shift = depth_in - depth_out;
|
||||
omap3isp_configure_bridge(isp, ccdc->input, pdata, shift);
|
||||
|
||||
ccdc->syncif.datsz = depth_out;
|
||||
ccdc_config_sync_if(ccdc, &ccdc->syncif);
|
||||
|
||||
/* CCDC_PAD_SINK */
|
||||
@@ -1338,7 +1361,7 @@ static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc,
|
||||
* @ccdc: Pointer to ISP CCDC device.
|
||||
* @event: Pointing which event trigger handler
|
||||
*
|
||||
* Return 1 when the event and stopping request combination is satisfyied,
|
||||
* Return 1 when the event and stopping request combination is satisfied,
|
||||
* zero otherwise.
|
||||
*/
|
||||
static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event)
|
||||
@@ -1618,7 +1641,7 @@ static int ccdc_video_queue(struct isp_video *video, struct isp_buffer *buffer)
|
||||
|
||||
ccdc_set_outaddr(ccdc, buffer->isp_addr);
|
||||
|
||||
/* We now have a buffer queued on the output, restart the pipeline in
|
||||
/* We now have a buffer queued on the output, restart the pipeline
|
||||
* on the next CCDC interrupt if running in continuous mode (or when
|
||||
* starting the stream).
|
||||
*/
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user