* [PATCH 0/5] Renesas VSP1 driver
@ 2013-07-10 10:19 Laurent Pinchart
2013-07-10 10:19 ` [PATCH 1/5] media: Fix circular graph traversal Laurent Pinchart
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Laurent Pinchart @ 2013-07-10 10:19 UTC (permalink / raw)
To: linux-media; +Cc: linux-sh
Hello,
Here's a driver for the VSP1 (Video Signal Processor) engine found in several
Renesas R-Car SoCs.
The VSP1 is a video processing engine that includes a blender, scalers,
filters and statistics computation. Configurable data path routing logic
allows ordering the internal blocks in a flexible way, making this driver a
prime candidate for the media controller API.
Due to the configurable nature of the pipeline the driver doesn't use the V4L2
mem-to-mem framework, even though the device usually operates in memory to
memory mode.
Only the read pixel formatters, up/down scalers, write pixel formatters and
LCDC interface are supported at this stage.
The patch series starts with a fix for the media controller graph traversal
code, a documentation fix and new pixel format and media bus code definitions.
The last patch finally adds the VSP1 driver.
Laurent Pinchart (5):
media: Fix circular graph traversal
v4l: Fix V4L2_MBUS_FMT_YUV10_1X30 media bus pixel code value
v4l: Add media format codes for ARGB8888 and AYUV8888 on 32-bit busses
v4l: Add V4L2_PIX_FMT_NV16M and V4L2_PIX_FMT_NV61M formats
v4l: Renesas R-Car VSP1 driver
Documentation/DocBook/media/v4l/pixfmt-nv16m.xml | 170 +++
Documentation/DocBook/media/v4l/pixfmt.xml | 1 +
Documentation/DocBook/media/v4l/subdev-formats.xml | 611 +++++------
Documentation/DocBook/media_api.tmpl | 6 +
drivers/media/media-entity.c | 17 +-
drivers/media/platform/Kconfig | 10 +
drivers/media/platform/Makefile | 2 +
drivers/media/platform/vsp1/Makefile | 5 +
drivers/media/platform/vsp1/vsp1.h | 73 ++
drivers/media/platform/vsp1/vsp1_drv.c | 475 ++++++++
drivers/media/platform/vsp1/vsp1_entity.c | 186 ++++
drivers/media/platform/vsp1/vsp1_entity.h | 68 ++
drivers/media/platform/vsp1/vsp1_lif.c | 237 ++++
drivers/media/platform/vsp1/vsp1_lif.h | 38 +
drivers/media/platform/vsp1/vsp1_regs.h | 581 ++++++++++
drivers/media/platform/vsp1/vsp1_rpf.c | 209 ++++
drivers/media/platform/vsp1/vsp1_rwpf.c | 124 +++
drivers/media/platform/vsp1/vsp1_rwpf.h | 56 +
drivers/media/platform/vsp1/vsp1_uds.c | 346 ++++++
drivers/media/platform/vsp1/vsp1_uds.h | 41 +
drivers/media/platform/vsp1/vsp1_video.c | 1154 ++++++++++++++++++++
drivers/media/platform/vsp1/vsp1_video.h | 144 +++
drivers/media/platform/vsp1/vsp1_wpf.c | 233 ++++
include/linux/platform_data/vsp1.h | 25 +
include/uapi/linux/v4l2-mediabus.h | 6 +-
include/uapi/linux/videodev2.h | 2 +
26 files changed, 4447 insertions(+), 373 deletions(-)
create mode 100644 Documentation/DocBook/media/v4l/pixfmt-nv16m.xml
create mode 100644 drivers/media/platform/vsp1/Makefile
create mode 100644 drivers/media/platform/vsp1/vsp1.h
create mode 100644 drivers/media/platform/vsp1/vsp1_drv.c
create mode 100644 drivers/media/platform/vsp1/vsp1_entity.c
create mode 100644 drivers/media/platform/vsp1/vsp1_entity.h
create mode 100644 drivers/media/platform/vsp1/vsp1_lif.c
create mode 100644 drivers/media/platform/vsp1/vsp1_lif.h
create mode 100644 drivers/media/platform/vsp1/vsp1_regs.h
create mode 100644 drivers/media/platform/vsp1/vsp1_rpf.c
create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.c
create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.h
create mode 100644 drivers/media/platform/vsp1/vsp1_uds.c
create mode 100644 drivers/media/platform/vsp1/vsp1_uds.h
create mode 100644 drivers/media/platform/vsp1/vsp1_video.c
create mode 100644 drivers/media/platform/vsp1/vsp1_video.h
create mode 100644 drivers/media/platform/vsp1/vsp1_wpf.c
create mode 100644 include/linux/platform_data/vsp1.h
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH 1/5] media: Fix circular graph traversal 2013-07-10 10:19 [PATCH 0/5] Renesas VSP1 driver Laurent Pinchart @ 2013-07-10 10:19 ` Laurent Pinchart 2013-07-10 10:19 ` [PATCH 2/5] v4l: Fix V4L2_MBUS_FMT_YUV10_1X30 media bus pixel code value Laurent Pinchart ` (3 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: Laurent Pinchart @ 2013-07-10 10:19 UTC (permalink / raw) To: linux-media; +Cc: linux-sh The graph traversal API (media_entity_graph_walk_*) will fail to correctly walk the graph when circular links exist. Fix it by checking whether an entity is already present in the stack before pushing it. Cc: Sakari Ailus <sakari.ailus@iki.fi> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> --- drivers/media/media-entity.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c index e1cd132..9084205 100644 --- a/drivers/media/media-entity.c +++ b/drivers/media/media-entity.c @@ -121,9 +121,9 @@ static struct media_entity *stack_pop(struct media_entity_graph *graph) return entity; } -#define stack_peek(en) ((en)->stack[(en)->top - 1].entity) -#define link_top(en) ((en)->stack[(en)->top].link) -#define stack_top(en) ((en)->stack[(en)->top].entity) +#define stack_peek(en, i) ((en)->stack[i].entity) +#define link_top(en) ((en)->stack[(en)->top].link) +#define stack_top(en) ((en)->stack[(en)->top].entity) /** * media_entity_graph_walk_start - Start walking the media graph at a given entity @@ -159,6 +159,8 @@ EXPORT_SYMBOL_GPL(media_entity_graph_walk_start); struct media_entity * media_entity_graph_walk_next(struct media_entity_graph *graph) { + unsigned int i; + if (stack_top(graph) = NULL) return NULL; @@ -181,8 +183,13 @@ media_entity_graph_walk_next(struct media_entity_graph *graph) /* Get the entity in the other end of the link . */ next = media_entity_other(entity, link); - /* Was it the entity we came here from? */ - if (next = stack_peek(graph)) { + /* Is the entity already in the path? */ + for (i = 1; i < graph->top; ++i) { + if (next = stack_peek(graph, i)) + break; + } + + if (i < graph->top) { link_top(graph)++; continue; } -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/5] v4l: Fix V4L2_MBUS_FMT_YUV10_1X30 media bus pixel code value 2013-07-10 10:19 [PATCH 0/5] Renesas VSP1 driver Laurent Pinchart 2013-07-10 10:19 ` [PATCH 1/5] media: Fix circular graph traversal Laurent Pinchart @ 2013-07-10 10:19 ` Laurent Pinchart 2013-07-10 10:19 ` [PATCH 3/5] v4l: Add media format codes for ARGB8888 and AYUV8888 on 32-bit busses Laurent Pinchart ` (2 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: Laurent Pinchart @ 2013-07-10 10:19 UTC (permalink / raw) To: linux-media; +Cc: linux-sh The V4L2_MBUS_FMT_YUV10_1X30 code is documented as being equal to 0x2014, while the v4l2-mediabus.h header defines it as 0x2016. Fix the documentation. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> --- Documentation/DocBook/media/v4l/subdev-formats.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/DocBook/media/v4l/subdev-formats.xml b/Documentation/DocBook/media/v4l/subdev-formats.xml index adc6198..0c2b1f2 100644 --- a/Documentation/DocBook/media/v4l/subdev-formats.xml +++ b/Documentation/DocBook/media/v4l/subdev-formats.xml @@ -2574,7 +2574,7 @@ </row> <row id="V4L2-MBUS-FMT-YUV10-1X30"> <entry>V4L2_MBUS_FMT_YUV10_1X30</entry> - <entry>0x2014</entry> + <entry>0x2016</entry> <entry></entry> <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/5] v4l: Add media format codes for ARGB8888 and AYUV8888 on 32-bit busses 2013-07-10 10:19 [PATCH 0/5] Renesas VSP1 driver Laurent Pinchart 2013-07-10 10:19 ` [PATCH 1/5] media: Fix circular graph traversal Laurent Pinchart 2013-07-10 10:19 ` [PATCH 2/5] v4l: Fix V4L2_MBUS_FMT_YUV10_1X30 media bus pixel code value Laurent Pinchart @ 2013-07-10 10:19 ` Laurent Pinchart 2013-07-10 10:19 ` [PATCH 4/5] v4l: Add V4L2_PIX_FMT_NV16M and V4L2_PIX_FMT_NV61M formats Laurent Pinchart [not found] ` <1373451572-3892-6-git-send-email-laurent.pinchart+renesas@ideasonboard.com> 4 siblings, 0 replies; 8+ messages in thread From: Laurent Pinchart @ 2013-07-10 10:19 UTC (permalink / raw) To: linux-media; +Cc: linux-sh Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> --- Documentation/DocBook/media/v4l/subdev-formats.xml | 609 +++++++++------------ Documentation/DocBook/media_api.tmpl | 6 + include/uapi/linux/v4l2-mediabus.h | 6 +- 3 files changed, 254 insertions(+), 367 deletions(-) diff --git a/Documentation/DocBook/media/v4l/subdev-formats.xml b/Documentation/DocBook/media/v4l/subdev-formats.xml index 0c2b1f2..9100674 100644 --- a/Documentation/DocBook/media/v4l/subdev-formats.xml +++ b/Documentation/DocBook/media/v4l/subdev-formats.xml @@ -97,31 +97,39 @@ <colspec colname="id" align="left" /> <colspec colname="code" align="center"/> <colspec colname="bit" /> - <colspec colnum="4" colname="b23" align="center" /> - <colspec colnum="5" colname="b22" align="center" /> - <colspec colnum="6" colname="b21" align="center" /> - <colspec colnum="7" colname="b20" align="center" /> - <colspec colnum="8" colname="b19" align="center" /> - <colspec colnum="9" colname="b18" align="center" /> - <colspec colnum="10" colname="b17" align="center" /> - <colspec colnum="11" colname="b16" align="center" /> - <colspec colnum="12" colname="b15" align="center" /> - <colspec colnum="13" colname="b14" align="center" /> - <colspec colnum="14" colname="b13" align="center" /> - <colspec colnum="15" colname="b12" align="center" /> - <colspec colnum="16" colname="b11" align="center" /> - <colspec colnum="17" colname="b10" align="center" /> - <colspec colnum="18" colname="b09" align="center" /> - <colspec colnum="19" colname="b08" align="center" /> - <colspec colnum="20" colname="b07" align="center" /> - <colspec colnum="21" colname="b06" align="center" /> - <colspec colnum="22" colname="b05" align="center" /> - <colspec colnum="23" colname="b04" align="center" /> - <colspec colnum="24" colname="b03" align="center" /> - <colspec colnum="25" colname="b02" align="center" /> - <colspec colnum="26" colname="b01" align="center" /> - <colspec colnum="27" colname="b00" align="center" /> - <spanspec namest="b23" nameend="b00" spanname="b0" /> + <colspec colnum="4" colname="b31" align="center" /> + <colspec colnum="5" colname="b20" align="center" /> + <colspec colnum="6" colname="b29" align="center" /> + <colspec colnum="7" colname="b28" align="center" /> + <colspec colnum="8" colname="b27" align="center" /> + <colspec colnum="9" colname="b26" align="center" /> + <colspec colnum="10" colname="b25" align="center" /> + <colspec colnum="11" colname="b24" align="center" /> + <colspec colnum="12" colname="b23" align="center" /> + <colspec colnum="13" colname="b22" align="center" /> + <colspec colnum="14" colname="b21" align="center" /> + <colspec colnum="15" colname="b20" align="center" /> + <colspec colnum="16" colname="b19" align="center" /> + <colspec colnum="17" colname="b18" align="center" /> + <colspec colnum="18" colname="b17" align="center" /> + <colspec colnum="19" colname="b16" align="center" /> + <colspec colnum="20" colname="b15" align="center" /> + <colspec colnum="21" colname="b14" align="center" /> + <colspec colnum="22" colname="b13" align="center" /> + <colspec colnum="23" colname="b12" align="center" /> + <colspec colnum="24" colname="b11" align="center" /> + <colspec colnum="25" colname="b10" align="center" /> + <colspec colnum="26" colname="b09" align="center" /> + <colspec colnum="27" colname="b08" align="center" /> + <colspec colnum="28" colname="b07" align="center" /> + <colspec colnum="29" colname="b06" align="center" /> + <colspec colnum="30" colname="b05" align="center" /> + <colspec colnum="31" colname="b04" align="center" /> + <colspec colnum="32" colname="b03" align="center" /> + <colspec colnum="33" colname="b02" align="center" /> + <colspec colnum="34" colname="b01" align="center" /> + <colspec colnum="35" colname="b00" align="center" /> + <spanspec namest="b31" nameend="b00" spanname="b0" /> <thead> <row> <entry>Identifier</entry> @@ -133,6 +141,14 @@ <entry></entry> <entry></entry> <entry>Bit</entry> + <entry>31</entry> + <entry>30</entry> + <entry>29</entry> + <entry>28</entry> + <entry>27</entry> + <entry>26</entry> + <entry>25</entry> + <entry>24</entry> <entry>23</entry> <entry>22</entry> <entry>21</entry> @@ -164,7 +180,7 @@ <entry>V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE</entry> <entry>0x1001</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>0</entry> <entry>0</entry> <entry>0</entry> @@ -178,7 +194,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>3</subscript></entry> <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> @@ -192,7 +208,7 @@ <entry>V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE</entry> <entry>0x1002</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>3</subscript></entry> <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> @@ -206,7 +222,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>0</entry> <entry>0</entry> <entry>0</entry> @@ -220,7 +236,7 @@ <entry>V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE</entry> <entry>0x1003</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>0</entry> <entry>r<subscript>4</subscript></entry> <entry>r<subscript>3</subscript></entry> @@ -234,7 +250,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> <entry>g<subscript>0</subscript></entry> @@ -248,7 +264,7 @@ <entry>V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE</entry> <entry>0x1004</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> <entry>g<subscript>0</subscript></entry> @@ -262,7 +278,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>0</entry> <entry>r<subscript>4</subscript></entry> <entry>r<subscript>3</subscript></entry> @@ -276,7 +292,7 @@ <entry>V4L2_MBUS_FMT_BGR565_2X8_BE</entry> <entry>0x1005</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>b<subscript>4</subscript></entry> <entry>b<subscript>3</subscript></entry> <entry>b<subscript>2</subscript></entry> @@ -290,7 +306,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> <entry>g<subscript>0</subscript></entry> @@ -304,7 +320,7 @@ <entry>V4L2_MBUS_FMT_BGR565_2X8_LE</entry> <entry>0x1006</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> <entry>g<subscript>0</subscript></entry> @@ -318,7 +334,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>b<subscript>4</subscript></entry> <entry>b<subscript>3</subscript></entry> <entry>b<subscript>2</subscript></entry> @@ -332,7 +348,7 @@ <entry>V4L2_MBUS_FMT_RGB565_2X8_BE</entry> <entry>0x1007</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>r<subscript>4</subscript></entry> <entry>r<subscript>3</subscript></entry> <entry>r<subscript>2</subscript></entry> @@ -346,7 +362,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> <entry>g<subscript>0</subscript></entry> @@ -360,7 +376,7 @@ <entry>V4L2_MBUS_FMT_RGB565_2X8_LE</entry> <entry>0x1008</entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> <entry>g<subscript>0</subscript></entry> @@ -374,7 +390,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-16; + &dash-ent-24; <entry>r<subscript>4</subscript></entry> <entry>r<subscript>3</subscript></entry> <entry>r<subscript>2</subscript></entry> @@ -388,12 +404,7 @@ <entry>V4L2_MBUS_FMT_RGB666_1X18</entry> <entry>0x1009</entry> <entry></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-14; <entry>r<subscript>5</subscript></entry> <entry>r<subscript>4</subscript></entry> <entry>r<subscript>3</subscript></entry> @@ -417,6 +428,7 @@ <entry>V4L2_MBUS_FMT_RGB888_1X24</entry> <entry>0x100a</entry> <entry></entry> + &dash-ent-8; <entry>r<subscript>7</subscript></entry> <entry>r<subscript>6</subscript></entry> <entry>r<subscript>5</subscript></entry> @@ -446,9 +458,7 @@ <entry>V4L2_MBUS_FMT_RGB888_2X12_BE</entry> <entry>0x100b</entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-20; <entry>r<subscript>7</subscript></entry> <entry>r<subscript>6</subscript></entry> <entry>r<subscript>5</subscript></entry> @@ -466,9 +476,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-20; <entry>g<subscript>3</subscript></entry> <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> @@ -486,9 +494,7 @@ <entry>V4L2_MBUS_FMT_RGB888_2X12_LE</entry> <entry>0x100c</entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-20; <entry>g<subscript>3</subscript></entry> <entry>g<subscript>2</subscript></entry> <entry>g<subscript>1</subscript></entry> @@ -506,9 +512,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-20; <entry>r<subscript>7</subscript></entry> <entry>r<subscript>6</subscript></entry> <entry>r<subscript>5</subscript></entry> @@ -522,6 +526,43 @@ <entry>g<subscript>5</subscript></entry> <entry>g<subscript>4</subscript></entry> </row> + <row id="V4L2-MBUS-FMT-ARGB888-1X24"> + <entry>V4L2_MBUS_FMT_ARGB888_1X24</entry> + <entry>0x100d</entry> + <entry></entry> + <entry>a<subscript>7</subscript></entry> + <entry>a<subscript>6</subscript></entry> + <entry>a<subscript>5</subscript></entry> + <entry>a<subscript>4</subscript></entry> + <entry>a<subscript>3</subscript></entry> + <entry>a<subscript>2</subscript></entry> + <entry>a<subscript>1</subscript></entry> + <entry>a<subscript>0</subscript></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> + <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> + <entry>b<subscript>7</subscript></entry> + <entry>b<subscript>6</subscript></entry> + <entry>b<subscript>5</subscript></entry> + <entry>b<subscript>4</subscript></entry> + <entry>b<subscript>3</subscript></entry> + <entry>b<subscript>2</subscript></entry> + <entry>b<subscript>1</subscript></entry> + <entry>b<subscript>0</subscript></entry> + </row> </tbody> </tgroup> </table> @@ -1149,6 +1190,7 @@ <listitem><para>y<subscript>x</subscript> for luma component bit number x</para></listitem> <listitem><para>u<subscript>x</subscript> for blue chroma component bit number x</para></listitem> <listitem><para>v<subscript>x</subscript> for red chroma component bit number x</para></listitem> + <listitem><para>a<subscript>x</subscript> for alpha component bit number x</para></listitem> <listitem><para>- for non-available bits (for positions higher than the bus width)</para></listitem> <listitem><para>d for dummy bits</para></listitem> </itemizedlist> @@ -1159,37 +1201,39 @@ <colspec colname="id" align="left" /> <colspec colname="code" align="center"/> <colspec colname="bit" /> - <colspec colnum="4" colname="b29" align="center" /> - <colspec colnum="5" colname="b28" align="center" /> - <colspec colnum="6" colname="b27" align="center" /> - <colspec colnum="7" colname="b26" align="center" /> - <colspec colnum="8" colname="b25" align="center" /> - <colspec colnum="9" colname="b24" align="center" /> - <colspec colnum="10" colname="b23" align="center" /> - <colspec colnum="11" colname="b22" align="center" /> - <colspec colnum="12" colname="b21" align="center" /> - <colspec colnum="13" colname="b20" align="center" /> - <colspec colnum="14" colname="b19" align="center" /> - <colspec colnum="15" colname="b18" align="center" /> - <colspec colnum="16" colname="b17" align="center" /> - <colspec colnum="17" colname="b16" align="center" /> - <colspec colnum="18" colname="b15" align="center" /> - <colspec colnum="19" colname="b14" align="center" /> - <colspec colnum="20" colname="b13" align="center" /> - <colspec colnum="21" colname="b12" align="center" /> - <colspec colnum="22" colname="b11" align="center" /> - <colspec colnum="23" colname="b10" align="center" /> - <colspec colnum="24" colname="b09" align="center" /> - <colspec colnum="25" colname="b08" align="center" /> - <colspec colnum="26" colname="b07" align="center" /> - <colspec colnum="27" colname="b06" align="center" /> - <colspec colnum="28" colname="b05" align="center" /> - <colspec colnum="29" colname="b04" align="center" /> - <colspec colnum="30" colname="b03" align="center" /> - <colspec colnum="31" colname="b02" align="center" /> - <colspec colnum="32" colname="b01" align="center" /> - <colspec colnum="33" colname="b00" align="center" /> - <spanspec namest="b29" nameend="b00" spanname="b0" /> + <colspec colnum="4" colname="b31" align="center" /> + <colspec colnum="5" colname="b20" align="center" /> + <colspec colnum="6" colname="b29" align="center" /> + <colspec colnum="7" colname="b28" align="center" /> + <colspec colnum="8" colname="b27" align="center" /> + <colspec colnum="9" colname="b26" align="center" /> + <colspec colnum="10" colname="b25" align="center" /> + <colspec colnum="11" colname="b24" align="center" /> + <colspec colnum="12" colname="b23" align="center" /> + <colspec colnum="13" colname="b22" align="center" /> + <colspec colnum="14" colname="b21" align="center" /> + <colspec colnum="15" colname="b20" align="center" /> + <colspec colnum="16" colname="b19" align="center" /> + <colspec colnum="17" colname="b18" align="center" /> + <colspec colnum="18" colname="b17" align="center" /> + <colspec colnum="19" colname="b16" align="center" /> + <colspec colnum="20" colname="b15" align="center" /> + <colspec colnum="21" colname="b14" align="center" /> + <colspec colnum="22" colname="b13" align="center" /> + <colspec colnum="23" colname="b12" align="center" /> + <colspec colnum="24" colname="b11" align="center" /> + <colspec colnum="25" colname="b10" align="center" /> + <colspec colnum="26" colname="b09" align="center" /> + <colspec colnum="27" colname="b08" align="center" /> + <colspec colnum="28" colname="b07" align="center" /> + <colspec colnum="29" colname="b06" align="center" /> + <colspec colnum="30" colname="b05" align="center" /> + <colspec colnum="31" colname="b04" align="center" /> + <colspec colnum="32" colname="b03" align="center" /> + <colspec colnum="33" colname="b02" align="center" /> + <colspec colnum="34" colname="b01" align="center" /> + <colspec colnum="35" colname="b00" align="center" /> + <spanspec namest="b31" nameend="b00" spanname="b0" /> <thead> <row> <entry>Identifier</entry> @@ -1201,6 +1245,8 @@ <entry></entry> <entry></entry> <entry>Bit</entry> + <entry>31</entry> + <entry>30</entry> <entry>29</entry> <entry>28</entry> <entry>27</entry> @@ -1238,10 +1284,7 @@ <entry>V4L2_MBUS_FMT_Y8_1X8</entry> <entry>0x2001</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1255,18 +1298,7 @@ <entry>V4L2_MBUS_FMT_UV8_1X8</entry> <entry>0x2015</entry> <entry></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1280,18 +1312,7 @@ <entry></entry> <entry></entry> <entry></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1305,10 +1326,7 @@ <entry>V4L2_MBUS_FMT_UYVY8_1_5X8</entry> <entry>0x2002</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1322,10 +1340,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1339,10 +1354,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1356,10 +1368,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1373,10 +1382,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1390,10 +1396,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1407,10 +1410,7 @@ <entry>V4L2_MBUS_FMT_VYUY8_1_5X8</entry> <entry>0x2003</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1424,10 +1424,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1441,10 +1438,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1458,10 +1452,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1475,10 +1466,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1492,10 +1480,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1509,10 +1494,7 @@ <entry>V4L2_MBUS_FMT_YUYV8_1_5X8</entry> <entry>0x2004</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1526,10 +1508,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1543,10 +1522,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1560,10 +1536,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1577,10 +1550,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1594,10 +1564,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1611,10 +1578,7 @@ <entry>V4L2_MBUS_FMT_YVYU8_1_5X8</entry> <entry>0x2005</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1628,10 +1592,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1645,10 +1606,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1662,10 +1620,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1679,10 +1634,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1696,10 +1648,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1713,10 +1662,7 @@ <entry>V4L2_MBUS_FMT_UYVY8_2X8</entry> <entry>0x2006</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1730,10 +1676,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1747,10 +1690,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1764,10 +1704,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1781,10 +1718,7 @@ <entry>V4L2_MBUS_FMT_VYUY8_2X8</entry> <entry>0x2007</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1798,10 +1732,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1815,10 +1746,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1832,10 +1760,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1849,10 +1774,7 @@ <entry>V4L2_MBUS_FMT_YUYV8_2X8</entry> <entry>0x2008</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1866,10 +1788,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1883,10 +1802,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1900,10 +1816,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1917,10 +1830,7 @@ <entry>V4L2_MBUS_FMT_YVYU8_2X8</entry> <entry>0x2009</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1934,10 +1844,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -1951,10 +1858,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -1968,10 +1872,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> + &dash-ent-24; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -1985,8 +1886,7 @@ <entry>V4L2_MBUS_FMT_Y10_1X10</entry> <entry>0x200a</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2002,8 +1902,7 @@ <entry>V4L2_MBUS_FMT_YUYV10_2X10</entry> <entry>0x200b</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2019,8 +1918,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>u<subscript>9</subscript></entry> <entry>u<subscript>8</subscript></entry> <entry>u<subscript>7</subscript></entry> @@ -2036,8 +1934,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2053,8 +1950,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>v<subscript>9</subscript></entry> <entry>v<subscript>8</subscript></entry> <entry>v<subscript>7</subscript></entry> @@ -2070,8 +1966,7 @@ <entry>V4L2_MBUS_FMT_YVYU10_2X10</entry> <entry>0x200c</entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2087,8 +1982,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>v<subscript>9</subscript></entry> <entry>v<subscript>8</subscript></entry> <entry>v<subscript>7</subscript></entry> @@ -2104,8 +1998,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2121,8 +2014,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - &dash-ent-10; + &dash-ent-22; <entry>u<subscript>9</subscript></entry> <entry>u<subscript>8</subscript></entry> <entry>u<subscript>7</subscript></entry> @@ -2138,15 +2030,7 @@ <entry>V4L2_MBUS_FMT_Y12_1X12</entry> <entry>0x2013</entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-20; <entry>y<subscript>11</subscript></entry> <entry>y<subscript>10</subscript></entry> <entry>y<subscript>9</subscript></entry> @@ -2164,11 +2048,7 @@ <entry>V4L2_MBUS_FMT_UYVY8_1X16</entry> <entry>0x200f</entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -2190,11 +2070,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -2216,11 +2092,7 @@ <entry>V4L2_MBUS_FMT_VYUY8_1X16</entry> <entry>0x2010</entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>v<subscript>7</subscript></entry> <entry>v<subscript>6</subscript></entry> <entry>v<subscript>5</subscript></entry> @@ -2242,11 +2114,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>u<subscript>7</subscript></entry> <entry>u<subscript>6</subscript></entry> <entry>u<subscript>5</subscript></entry> @@ -2268,11 +2136,7 @@ <entry>V4L2_MBUS_FMT_YUYV8_1X16</entry> <entry>0x2011</entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2294,11 +2158,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2320,11 +2180,7 @@ <entry>V4L2_MBUS_FMT_YVYU8_1X16</entry> <entry>0x2012</entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2346,11 +2202,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2372,10 +2224,7 @@ <entry>V4L2_MBUS_FMT_YDYUYDYV8_1X16</entry> <entry>0x2014</entry> <entry></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2397,10 +2246,7 @@ <entry></entry> <entry></entry> <entry></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2422,10 +2268,7 @@ <entry></entry> <entry></entry> <entry></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2447,10 +2290,7 @@ <entry></entry> <entry></entry> <entry></entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> - <entry>-</entry> + &dash-ent-16; <entry>y<subscript>7</subscript></entry> <entry>y<subscript>6</subscript></entry> <entry>y<subscript>5</subscript></entry> @@ -2472,7 +2312,7 @@ <entry>V4L2_MBUS_FMT_YUYV10_1X20</entry> <entry>0x200d</entry> <entry></entry> - &dash-ent-10; + &dash-ent-12; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2498,7 +2338,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; + &dash-ent-12; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2524,7 +2364,7 @@ <entry>V4L2_MBUS_FMT_YVYU10_1X20</entry> <entry>0x200e</entry> <entry></entry> - &dash-ent-10; + &dash-ent-12; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2550,7 +2390,7 @@ <entry></entry> <entry></entry> <entry></entry> - &dash-ent-10; + &dash-ent-12; <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2576,6 +2416,8 @@ <entry>V4L2_MBUS_FMT_YUV10_1X30</entry> <entry>0x2016</entry> <entry></entry> + <entry>-</entry> + <entry>-</entry> <entry>y<subscript>9</subscript></entry> <entry>y<subscript>8</subscript></entry> <entry>y<subscript>7</subscript></entry> @@ -2607,6 +2449,43 @@ <entry>v<subscript>1</subscript></entry> <entry>v<subscript>0</subscript></entry> </row> + <row id="V4L2-MBUS-FMT-AYUV8-1X32"> + <entry>V4L2_MBUS_FMT_AYUV8_1X32</entry> + <entry>0x2017</entry> + <entry></entry> + <entry>a<subscript>7</subscript></entry> + <entry>a<subscript>6</subscript></entry> + <entry>a<subscript>5</subscript></entry> + <entry>a<subscript>4</subscript></entry> + <entry>a<subscript>3</subscript></entry> + <entry>a<subscript>2</subscript></entry> + <entry>a<subscript>1</subscript></entry> + <entry>a<subscript>0</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> + <entry>u<subscript>7</subscript></entry> + <entry>u<subscript>6</subscript></entry> + <entry>u<subscript>5</subscript></entry> + <entry>u<subscript>4</subscript></entry> + <entry>u<subscript>3</subscript></entry> + <entry>u<subscript>2</subscript></entry> + <entry>u<subscript>1</subscript></entry> + <entry>u<subscript>0</subscript></entry> + <entry>v<subscript>7</subscript></entry> + <entry>v<subscript>6</subscript></entry> + <entry>v<subscript>5</subscript></entry> + <entry>v<subscript>4</subscript></entry> + <entry>v<subscript>3</subscript></entry> + <entry>v<subscript>2</subscript></entry> + <entry>v<subscript>1</subscript></entry> + <entry>v<subscript>0</subscript></entry> + </row> </tbody> </tgroup> </table> diff --git a/Documentation/DocBook/media_api.tmpl b/Documentation/DocBook/media_api.tmpl index 6a8b715..07e7eea 100644 --- a/Documentation/DocBook/media_api.tmpl +++ b/Documentation/DocBook/media_api.tmpl @@ -22,8 +22,14 @@ <!-- LinuxTV v4l-dvb repository. --> <!ENTITY v4l-dvb "<ulink url='http://linuxtv.org/repo/'>http://linuxtv.org/repo/</ulink>"> +<!ENTITY dash-ent-8 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> <!ENTITY dash-ent-10 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> +<!ENTITY dash-ent-12 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> +<!ENTITY dash-ent-14 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> <!ENTITY dash-ent-16 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> +<!ENTITY dash-ent-20 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> +<!ENTITY dash-ent-22 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> +<!ENTITY dash-ent-24 "<entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry><entry>-</entry>"> ]> <book id="media_api"> diff --git a/include/uapi/linux/v4l2-mediabus.h b/include/uapi/linux/v4l2-mediabus.h index 6ee63d0..a960125 100644 --- a/include/uapi/linux/v4l2-mediabus.h +++ b/include/uapi/linux/v4l2-mediabus.h @@ -37,7 +37,7 @@ enum v4l2_mbus_pixelcode { V4L2_MBUS_FMT_FIXED = 0x0001, - /* RGB - next is 0x100d */ + /* RGB - next is 0x100e */ V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE = 0x1001, V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE = 0x1002, V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE = 0x1003, @@ -50,8 +50,9 @@ enum v4l2_mbus_pixelcode { V4L2_MBUS_FMT_RGB888_1X24 = 0x100a, V4L2_MBUS_FMT_RGB888_2X12_BE = 0x100b, V4L2_MBUS_FMT_RGB888_2X12_LE = 0x100c, + V4L2_MBUS_FMT_ARGB8888_1X32 = 0x100d, - /* YUV (including grey) - next is 0x2017 */ + /* YUV (including grey) - next is 0x2018 */ V4L2_MBUS_FMT_Y8_1X8 = 0x2001, V4L2_MBUS_FMT_UV8_1X8 = 0x2015, V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002, @@ -74,6 +75,7 @@ enum v4l2_mbus_pixelcode { V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d, V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e, V4L2_MBUS_FMT_YUV10_1X30 = 0x2016, + V4L2_MBUS_FMT_AYUV8_1X32 = 0x2017, /* Bayer - next is 0x3019 */ V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001, -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/5] v4l: Add V4L2_PIX_FMT_NV16M and V4L2_PIX_FMT_NV61M formats 2013-07-10 10:19 [PATCH 0/5] Renesas VSP1 driver Laurent Pinchart ` (2 preceding siblings ...) 2013-07-10 10:19 ` [PATCH 3/5] v4l: Add media format codes for ARGB8888 and AYUV8888 on 32-bit busses Laurent Pinchart @ 2013-07-10 10:19 ` Laurent Pinchart [not found] ` <1373451572-3892-6-git-send-email-laurent.pinchart+renesas@ideasonboard.com> 4 siblings, 0 replies; 8+ messages in thread From: Laurent Pinchart @ 2013-07-10 10:19 UTC (permalink / raw) To: linux-media; +Cc: linux-sh NV16M and NV61M are planar YCbCr 4:2:2 and YCrCb 4:2:2 formats with a luma plane followed by an interleaved chroma plane. The planes are not required to be contiguous in memory, and the formats can only be used with the multi-planar formats API. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> --- Documentation/DocBook/media/v4l/pixfmt-nv16m.xml | 170 +++++++++++++++++++++++ Documentation/DocBook/media/v4l/pixfmt.xml | 1 + include/uapi/linux/videodev2.h | 2 + 3 files changed, 173 insertions(+) create mode 100644 Documentation/DocBook/media/v4l/pixfmt-nv16m.xml diff --git a/Documentation/DocBook/media/v4l/pixfmt-nv16m.xml b/Documentation/DocBook/media/v4l/pixfmt-nv16m.xml new file mode 100644 index 0000000..84a8bb3 --- /dev/null +++ b/Documentation/DocBook/media/v4l/pixfmt-nv16m.xml @@ -0,0 +1,170 @@ + <refentry> + <refmeta> + <refentrytitle>V4L2_PIX_FMT_NV16M ('NM16'), V4L2_PIX_FMT_NV61M ('NM61')</refentrytitle> + &manvol; + </refmeta> + <refnamediv> + <refname id="V4L2-PIX-FMT-NV16M"><constant>V4L2_PIX_FMT_NV16M</constant></refname> + <refname id="V4L2-PIX-FMT-NV61M"><constant>V4L2_PIX_FMT_NV61M</constant></refname> + <refpurpose>Variation of <constant>V4L2_PIX_FMT_NV16</constant> and <constant>V4L2_PIX_FMT_NV61</constant> with planes + non contiguous in memory. </refpurpose> + </refnamediv> + <refsect1> + <title>Description</title> + + <para>This is a multi-planar, two-plane version of the YUV 4:2:0 format. +The three components are separated into two sub-images or planes. +<constant>V4L2_PIX_FMT_NV16M</constant> differs from <constant>V4L2_PIX_FMT_NV16 +</constant> in that the two planes are non-contiguous in memory, i.e. the chroma +plane do not necessarily immediately follows the luma plane. +The luminance data occupies the first plane. The Y plane has one byte per pixel. +In the second plane there is a chrominance data with alternating chroma samples. +The CbCr plane is the same width and height, in bytes, as the Y plane. +Each CbCr pair belongs to four pixels. For example, +Cb<subscript>0</subscript>/Cr<subscript>0</subscript> belongs to +Y'<subscript>00</subscript>, Y'<subscript>01</subscript>, +Y'<subscript>10</subscript>, Y'<subscript>11</subscript>. +<constant>V4L2_PIX_FMT_NV61M</constant> is the same as <constant>V4L2_PIX_FMT_NV16M</constant> +except the Cb and Cr bytes are swapped, the CrCb plane starts with a Cr byte.</para> + + <para><constant>V4L2_PIX_FMT_NV16M</constant> is intended to be +used only in drivers and applications that support the multi-planar API, +described in <xref linkend="planar-apis"/>. </para> + + <example> + <title><constant>V4L2_PIX_FMT_NV16M</constant> 4 × 4 pixel image</title> + + <formalpara> + <title>Byte Order.</title> + <para>Each cell is one byte. + <informaltable frame="none"> + <tgroup cols="5" align="center"> + <colspec align="left" colwidth="2*" /> + <tbody valign="top"> + <row> + <entry>start0 + 0:</entry> + <entry>Y'<subscript>00</subscript></entry> + <entry>Y'<subscript>01</subscript></entry> + <entry>Y'<subscript>02</subscript></entry> + <entry>Y'<subscript>03</subscript></entry> + </row> + <row> + <entry>start0 + 4:</entry> + <entry>Y'<subscript>10</subscript></entry> + <entry>Y'<subscript>11</subscript></entry> + <entry>Y'<subscript>12</subscript></entry> + <entry>Y'<subscript>13</subscript></entry> + </row> + <row> + <entry>start0 + 8:</entry> + <entry>Y'<subscript>20</subscript></entry> + <entry>Y'<subscript>21</subscript></entry> + <entry>Y'<subscript>22</subscript></entry> + <entry>Y'<subscript>23</subscript></entry> + </row> + <row> + <entry>start0 + 12:</entry> + <entry>Y'<subscript>30</subscript></entry> + <entry>Y'<subscript>31</subscript></entry> + <entry>Y'<subscript>32</subscript></entry> + <entry>Y'<subscript>33</subscript></entry> + </row> + <row> + <entry></entry> + </row> + <row> + <entry>start1 + 0:</entry> + <entry>Cb<subscript>00</subscript></entry> + <entry>Cr<subscript>00</subscript></entry> + <entry>Cb<subscript>02</subscript></entry> + <entry>Cr<subscript>02</subscript></entry> + </row> + <row> + <entry>start1 + 4:</entry> + <entry>Cb<subscript>10</subscript></entry> + <entry>Cr<subscript>10</subscript></entry> + <entry>Cb<subscript>12</subscript></entry> + <entry>Cr<subscript>12</subscript></entry> + </row> + <row> + <entry>start1 + 8:</entry> + <entry>Cb<subscript>20</subscript></entry> + <entry>Cr<subscript>20</subscript></entry> + <entry>Cb<subscript>22</subscript></entry> + <entry>Cr<subscript>22</subscript></entry> + </row> + <row> + <entry>start1 + 12:</entry> + <entry>Cb<subscript>30</subscript></entry> + <entry>Cr<subscript>30</subscript></entry> + <entry>Cb<subscript>32</subscript></entry> + <entry>Cr<subscript>32</subscript></entry> + </row> + </tbody> + </tgroup> + </informaltable> + </para> + </formalpara> + + <formalpara> + <title>Color Sample Location.</title> + <para> + <informaltable frame="none"> + <tgroup cols="7" align="center"> + <tbody valign="top"> + <row> + <entry></entry> + <entry>0</entry><entry></entry><entry>1</entry><entry></entry> + <entry>2</entry><entry></entry><entry>3</entry> + </row> + <row> + <entry>0</entry> + <entry>Y</entry><entry></entry><entry>Y</entry><entry></entry> + <entry>Y</entry><entry></entry><entry>Y</entry> + </row> + <row> + <entry></entry> + <entry></entry><entry>C</entry><entry></entry><entry></entry> + <entry></entry><entry>C</entry><entry></entry> + </row> + <row> + <entry>1</entry> + <entry>Y</entry><entry></entry><entry>Y</entry><entry></entry> + <entry>Y</entry><entry></entry><entry>Y</entry> + </row> + <row> + <entry></entry> + <entry></entry><entry>C</entry><entry></entry><entry></entry> + <entry></entry><entry>C</entry><entry></entry> + </row> + <row> + <entry></entry> + </row> + <row> + <entry>2</entry> + <entry>Y</entry><entry></entry><entry>Y</entry><entry></entry> + <entry>Y</entry><entry></entry><entry>Y</entry> + </row> + <row> + <entry></entry> + <entry></entry><entry>C</entry><entry></entry><entry></entry> + <entry></entry><entry>C</entry><entry></entry> + </row> + <row> + <entry>3</entry> + <entry>Y</entry><entry></entry><entry>Y</entry><entry></entry> + <entry>Y</entry><entry></entry><entry>Y</entry> + </row> + <row> + <entry></entry> + <entry></entry><entry>C</entry><entry></entry><entry></entry> + <entry></entry><entry>C</entry><entry></entry> + </row> + </tbody> + </tgroup> + </informaltable> + </para> + </formalpara> + </example> + </refsect1> + </refentry> diff --git a/Documentation/DocBook/media/v4l/pixfmt.xml b/Documentation/DocBook/media/v4l/pixfmt.xml index 99b8d2a..16db350 100644 --- a/Documentation/DocBook/media/v4l/pixfmt.xml +++ b/Documentation/DocBook/media/v4l/pixfmt.xml @@ -718,6 +718,7 @@ information.</para> &sub-nv12m; &sub-nv12mt; &sub-nv16; + &sub-nv16m; &sub-nv24; &sub-m420; </section> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index f40b41c..1e3cb4e 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -348,6 +348,8 @@ struct v4l2_pix_format { /* two non contiguous planes - one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2') /* 12 Y/CbCr 4:2:0 */ #define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1') /* 21 Y/CrCb 4:2:0 */ +#define V4L2_PIX_FMT_NV16M v4l2_fourcc('N', 'M', '1', '6') /* 16 Y/CbCr 4:2:2 */ +#define V4L2_PIX_FMT_NV61M v4l2_fourcc('N', 'M', '6', '1') /* 16 Y/CrCb 4:2:2 */ #define V4L2_PIX_FMT_NV12MT v4l2_fourcc('T', 'M', '1', '2') /* 12 Y/CbCr 4:2:0 64x32 macroblocks */ #define V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc('V', 'M', '1', '2') /* 12 Y/CbCr 4:2:0 16x16 macroblocks */ -- 1.8.1.5 ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <1373451572-3892-6-git-send-email-laurent.pinchart+renesas@ideasonboard.com>]
* Re: [PATCH 5/5] v4l: Renesas R-Car VSP1 driver [not found] ` <1373451572-3892-6-git-send-email-laurent.pinchart+renesas@ideasonboard.com> @ 2013-07-10 12:34 ` Hans Verkuil 2013-07-10 14:24 ` Laurent Pinchart 0 siblings, 1 reply; 8+ messages in thread From: Hans Verkuil @ 2013-07-10 12:34 UTC (permalink / raw) To: Laurent Pinchart; +Cc: linux-media, linux-sh On Wed 10 July 2013 12:19:32 Laurent Pinchart wrote: > The VSP1 is a video processing engine that includes a blender, scalers, > filters and statistics computation. Configurable data path routing logic > allows ordering the internal blocks in a flexible way. > > Due to the configurable nature of the pipeline the driver implements the > media controller API and doesn't use the V4L2 mem-to-mem framework, even > though the device usually operates in memory to memory mode. > > Only the read pixel formatters, up/down scalers, write pixel formatters > and LCDC interface are supported at this stage. > > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> > --- > drivers/media/platform/Kconfig | 10 + > drivers/media/platform/Makefile | 2 + > drivers/media/platform/vsp1/Makefile | 5 + > drivers/media/platform/vsp1/vsp1.h | 73 ++ > drivers/media/platform/vsp1/vsp1_drv.c | 475 ++++++++++++ > drivers/media/platform/vsp1/vsp1_entity.c | 186 +++++ > drivers/media/platform/vsp1/vsp1_entity.h | 68 ++ > drivers/media/platform/vsp1/vsp1_lif.c | 237 ++++++ > drivers/media/platform/vsp1/vsp1_lif.h | 38 + > drivers/media/platform/vsp1/vsp1_regs.h | 581 +++++++++++++++ > drivers/media/platform/vsp1/vsp1_rpf.c | 209 ++++++ > drivers/media/platform/vsp1/vsp1_rwpf.c | 124 ++++ > drivers/media/platform/vsp1/vsp1_rwpf.h | 56 ++ > drivers/media/platform/vsp1/vsp1_uds.c | 346 +++++++++ > drivers/media/platform/vsp1/vsp1_uds.h | 41 + > drivers/media/platform/vsp1/vsp1_video.c | 1154 +++++++++++++++++++++++++++++ > drivers/media/platform/vsp1/vsp1_video.h | 144 ++++ > drivers/media/platform/vsp1/vsp1_wpf.c | 233 ++++++ > include/linux/platform_data/vsp1.h | 25 + > 19 files changed, 4007 insertions(+) > create mode 100644 drivers/media/platform/vsp1/Makefile > create mode 100644 drivers/media/platform/vsp1/vsp1.h > create mode 100644 drivers/media/platform/vsp1/vsp1_drv.c > create mode 100644 drivers/media/platform/vsp1/vsp1_entity.c > create mode 100644 drivers/media/platform/vsp1/vsp1_entity.h > create mode 100644 drivers/media/platform/vsp1/vsp1_lif.c > create mode 100644 drivers/media/platform/vsp1/vsp1_lif.h > create mode 100644 drivers/media/platform/vsp1/vsp1_regs.h > create mode 100644 drivers/media/platform/vsp1/vsp1_rpf.c > create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.c > create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.h > create mode 100644 drivers/media/platform/vsp1/vsp1_uds.c > create mode 100644 drivers/media/platform/vsp1/vsp1_uds.h > create mode 100644 drivers/media/platform/vsp1/vsp1_video.c > create mode 100644 drivers/media/platform/vsp1/vsp1_video.h > create mode 100644 drivers/media/platform/vsp1/vsp1_wpf.c > create mode 100644 include/linux/platform_data/vsp1.h > Hi Laurent, It took some effort, but I finally did find some things to complain about :-) > diff --git a/drivers/media/platform/vsp1/vsp1_video.c b/drivers/media/platform/vsp1/vsp1_video.c > new file mode 100644 > index 0000000..47a739a > --- /dev/null > +++ b/drivers/media/platform/vsp1/vsp1_video.c ... > +/* ----------------------------------------------------------------------------- > + * videobuf2 Queue Operations > + */ > + > +static int > +vsp1_video_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt, > + unsigned int *nbuffers, unsigned int *nplanes, > + unsigned int sizes[], void *alloc_ctxs[]) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vq); > + struct v4l2_pix_format_mplane *format = &video->format; > + unsigned int i; > + > + *nplanes = format->num_planes; > + > + for (i = 0; i < format->num_planes; ++i) { > + sizes[i] = format->plane_fmt[i].sizeimage; > + alloc_ctxs[i] = video->alloc_ctx; > + } > + > + return 0; > +} > + > +static int vsp1_video_buffer_prepare(struct vb2_buffer *vb) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vb->vb2_queue); > + struct vsp1_video_buffer *buf = to_vsp1_video_buffer(vb); > + unsigned int i; > + > + buf->video = video; > + > + for (i = 0; i < vb->num_planes; ++i) { > + buf->addr[i] = vb2_dma_contig_plane_dma_addr(vb, i); > + buf->length[i] = vb2_plane_size(vb, i); > + } > + > + return 0; > +} > + > +static void vsp1_video_buffer_queue(struct vb2_buffer *vb) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vb->vb2_queue); > + struct vsp1_pipeline *pipe = to_vsp1_pipeline(&video->video.entity); > + struct vsp1_video_buffer *buf = to_vsp1_video_buffer(vb); > + unsigned long flags; > + bool empty; > + > + spin_lock_irqsave(&video->irqlock, flags); > + empty = list_empty(&video->irqqueue); > + list_add_tail(&buf->queue, &video->irqqueue); > + spin_unlock_irqrestore(&video->irqlock, flags); > + > + if (empty) { > + spin_lock_irqsave(&pipe->irqlock, flags); > + > + video->ops->queue(video, buf); > + pipe->buffers_ready |= 1 << video->pipe_index; > + > + if (vb2_is_streaming(&video->queue) && > + vsp1_pipeline_ready(pipe)) > + vsp1_pipeline_run(pipe); > + > + spin_unlock_irqrestore(&pipe->irqlock, flags); > + } > +} > + > +static void vsp1_video_wait_prepare(struct vb2_queue *vq) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vq); > + > + mutex_unlock(&video->lock); > +} > + > +static void vsp1_video_wait_finish(struct vb2_queue *vq) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vq); > + > + mutex_lock(&video->lock); > +} > + > +static void vsp1_entity_route_setup(struct vsp1_entity *source) > +{ > + struct vsp1_entity *sink; > + > + if (source->route = 0) > + return; > + > + sink = container_of(source->sink, struct vsp1_entity, subdev.entity); > + vsp1_write(source->vsp1, source->route, sink->id); > +} > + > +static int vsp1_video_start_streaming(struct vb2_queue *vq, unsigned int count) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vq); > + struct vsp1_pipeline *pipe = to_vsp1_pipeline(&video->video.entity); > + struct vsp1_entity *entity; > + unsigned long flags; > + int ret; > + > + mutex_lock(&pipe->lock); > + if (pipe->stream_count = pipe->num_video - 1) { > + list_for_each_entry(entity, &pipe->entities, list_pipe) { > + vsp1_entity_route_setup(entity); > + > + ret = v4l2_subdev_call(&entity->subdev, video, > + s_stream, 1); > + if (ret < 0) { > + mutex_unlock(&pipe->lock); > + return ret; > + } > + } > + } > + > + pipe->stream_count++; > + mutex_unlock(&pipe->lock); > + > + spin_lock_irqsave(&pipe->irqlock, flags); > + if (vsp1_pipeline_ready(pipe)) > + vsp1_pipeline_run(pipe); > + spin_unlock_irqrestore(&pipe->irqlock, flags); > + > + return 0; > +} > + > +static int vsp1_video_stop_streaming(struct vb2_queue *vq) > +{ > + struct vsp1_video *video = vb2_get_drv_priv(vq); > + struct vsp1_pipeline *pipe = to_vsp1_pipeline(&video->video.entity); > + unsigned long flags; > + int ret; > + > + mutex_lock(&pipe->lock); > + if (--pipe->stream_count = 0) { > + /* Stop the pipeline. */ > + ret = vsp1_pipeline_stop(pipe); > + if (ret = -ETIMEDOUT) > + dev_err(video->vsp1->dev, "pipeline stop timeout\n"); > + } > + mutex_unlock(&pipe->lock); > + > + vsp1_pipeline_cleanup(pipe); > + media_entity_pipeline_stop(&video->video.entity); > + > + /* Remove all buffers from the IRQ queue. */ > + spin_lock_irqsave(&video->irqlock, flags); > + INIT_LIST_HEAD(&video->irqqueue); > + spin_unlock_irqrestore(&video->irqlock, flags); > + > + return 0; > +} > + > +static struct vb2_ops vsp1_video_queue_qops = { > + .queue_setup = vsp1_video_queue_setup, > + .buf_prepare = vsp1_video_buffer_prepare, > + .buf_queue = vsp1_video_buffer_queue, > + .wait_prepare = vsp1_video_wait_prepare, > + .wait_finish = vsp1_video_wait_finish, > + .start_streaming = vsp1_video_start_streaming, > + .stop_streaming = vsp1_video_stop_streaming, > +}; > + > +/* ----------------------------------------------------------------------------- > + * V4L2 ioctls > + */ > + > +static int > +vsp1_video_querycap(struct file *file, void *fh, struct v4l2_capability *cap) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + > + if (video->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) > + cap->capabilities = V4L2_CAP_VIDEO_CAPTURE_MPLANE > + | V4L2_CAP_STREAMING; > + else > + cap->capabilities = V4L2_CAP_VIDEO_OUTPUT_MPLANE > + | V4L2_CAP_STREAMING; cap->device_caps should be filled in here as well. > + > + strlcpy(cap->driver, "vsp1", sizeof(cap->driver)); > + strlcpy(cap->card, video->video.name, sizeof(cap->card)); > + strlcpy(cap->bus_info, "media", sizeof(cap->bus_info)); The bus_info for platform devices should be prefixed with "platform:" as per the spec. > + > + return 0; > +} > + > +static int > +vsp1_video_get_format(struct file *file, void *fh, struct v4l2_format *format) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + > + if (format->type != video->queue.type) > + return -EINVAL; > + > + mutex_lock(&video->lock); > + format->fmt.pix_mp = video->format; > + mutex_unlock(&video->lock); > + > + return 0; > +} > + > +static int __vsp1_video_try_format(struct vsp1_video *video, > + struct v4l2_pix_format_mplane *pix, > + const struct vsp1_format_info **fmtinfo) > +{ > + const struct vsp1_format_info *info; > + unsigned int width = pix->width; > + unsigned int height = pix->height; > + unsigned int i; > + > + /* Retrieve format information and select the default format if the > + * requested format isn't supported. > + */ > + info = vsp1_get_format_info(pix->pixelformat); > + if (info = NULL) > + info = vsp1_get_format_info(VSP1_VIDEO_DEF_FORMAT); > + > + pix->pixelformat = info->fourcc; > + pix->colorspace = V4L2_COLORSPACE_SRGB; > + pix->field = V4L2_FIELD_NONE; pix->priv should be set to 0. v4l2-compliance catches such errors, BTW. > + > + /* Align the width and height for YUV 4:2:2 and 4:2:0 formats. */ > + width = round_down(width, info->hsub); > + height = round_down(height, info->vsub); > + > + /* Clamp the width and height. */ > + pix->width = clamp(width, VSP1_VIDEO_MIN_WIDTH, VSP1_VIDEO_MAX_WIDTH); > + pix->height = clamp(height, VSP1_VIDEO_MIN_HEIGHT, > + VSP1_VIDEO_MAX_HEIGHT); > + > + /* Compute and clamp the stride and image size. */ > + for (i = 0; i < max(info->planes, 2U); ++i) { > + unsigned int hsub = i > 0 ? info->hsub : 1; > + unsigned int vsub = i > 0 ? info->vsub : 1; > + unsigned int bpl; > + > + bpl = clamp_t(unsigned int, pix->plane_fmt[i].bytesperline, > + pix->width / hsub * info->bpp[i] / 8, > + round_down(65535U, 128)); > + > + pix->plane_fmt[i].bytesperline = round_up(bpl, 128); > + pix->plane_fmt[i].sizeimage = bpl * pix->height / vsub; > + } > + > + if (info->planes = 3) { > + /* The second and third planes must have the same stride. */ > + pix->plane_fmt[2].bytesperline = pix->plane_fmt[1].bytesperline; > + pix->plane_fmt[2].sizeimage = pix->plane_fmt[1].sizeimage; > + } > + > + pix->num_planes = info->planes; > + > + if (fmtinfo) > + *fmtinfo = info; > + > + return 0; > +} > + > +static int > +vsp1_video_try_format(struct file *file, void *fh, struct v4l2_format *format) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + > + if (format->type != video->queue.type) > + return -EINVAL; > + > + return __vsp1_video_try_format(video, &format->fmt.pix_mp, NULL); > +} > + > +static int > +vsp1_video_set_format(struct file *file, void *fh, struct v4l2_format *format) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + const struct vsp1_format_info *info; > + int ret; > + > + if (format->type != video->queue.type) > + return -EINVAL; > + > + ret = __vsp1_video_try_format(video, &format->fmt.pix_mp, &info); > + if (ret < 0) > + return ret; > + > + mutex_lock(&video->lock); > + > + if (vb2_is_streaming(&video->queue)) { That should be vb2_is_busy(): once buffers are allocated you can't change the format anymore. > + ret = -EBUSY; > + goto done; > + } > + > + video->format = format->fmt.pix_mp; > + video->fmtinfo = info; > + > +done: > + mutex_unlock(&video->lock); > + return ret; > +} > + > +static int > +vsp1_video_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *rb) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + int ret; > + > + mutex_lock(&video->lock); > + > + if (video->queue.owner && video->queue.owner != vfh) { > + ret = -EBUSY; > + goto done; > + } > + > + ret = vb2_reqbufs(&video->queue, rb); > + if (ret < 0) > + goto done; > + > + video->queue.owner = vfh; > + > +done: > + mutex_unlock(&video->lock); > + return ret ? ret : rb->count; On success reqbufs should return 0, not the number of allocated buffers. Have you considered using the vb2 helper functions in videobuf2-core.c? They take care of the queue ownership and often simplify drivers considerably. > +} > + > +static int > +vsp1_video_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + int ret; > + > + mutex_lock(&video->lock); > + ret = vb2_querybuf(&video->queue, buf); > + mutex_unlock(&video->lock); > + > + return ret; > +} > + > +static int > +vsp1_video_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + int ret; > + > + mutex_lock(&video->lock); > + > + if (video->queue.owner && video->queue.owner != vfh) { > + ret = -EBUSY; > + goto done; > + } > + > + ret = vb2_qbuf(&video->queue, buf); > + > +done: > + mutex_unlock(&video->lock); > + return ret; > +} > + > +static int > +vsp1_video_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + int ret; > + > + mutex_lock(&video->lock); > + > + if (video->queue.owner && video->queue.owner != vfh) { > + ret = -EBUSY; > + goto done; > + } > + > + ret = vb2_dqbuf(&video->queue, buf, file->f_flags & O_NONBLOCK); > + > +done: > + mutex_unlock(&video->lock); > + return ret; > +} > + > +static int > +vsp1_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + struct vsp1_pipeline *pipe; > + int ret; > + > + mutex_lock(&video->lock); > + > + if (video->queue.owner && video->queue.owner != vfh) { > + ret = -EBUSY; > + goto err_unlock; > + } > + > + video->sequence = 0; > + > + /* Start streaming on the pipeline. No link touching an entity in the > + * pipeline can be activated or deactivated once streaming is started. > + * > + * Use the VSP1 pipeline object embedded in the first video object that > + * starts streaming. > + */ > + pipe = video->video.entity.pipe > + ? to_vsp1_pipeline(&video->video.entity) : &video->pipe; > + > + ret = media_entity_pipeline_start(&video->video.entity, &pipe->pipe); > + if (ret < 0) > + goto err_unlock; > + > + /* Verify that the configured format matches the output of the connected > + * subdev. > + */ > + ret = vsp1_video_verify_format(video); > + if (ret < 0) > + goto err_stop; > + > + ret = vsp1_pipeline_init(pipe, video); > + if (ret < 0) > + goto err_stop; Shouldn't the code above be better placed in the vb2 start_streaming op? > + > + /* Start the queue. */ > + ret = vb2_streamon(&video->queue, type); > + if (ret < 0) > + goto err_cleanup; > + > + mutex_unlock(&video->lock); > + return 0; > + > +err_cleanup: > + vsp1_pipeline_cleanup(pipe); > +err_stop: > + media_entity_pipeline_stop(&video->video.entity); > +err_unlock: > + mutex_unlock(&video->lock); > + return ret; > + > +} > + > +static int > +vsp1_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type type) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + int ret; > + > + mutex_lock(&video->lock); > + > + if (video->queue.owner && video->queue.owner != vfh) { > + ret = -EBUSY; > + goto done; > + } > + > + ret = vb2_streamoff(&video->queue, type); > + > +done: > + mutex_unlock(&video->lock); > + return ret; > +} > + > +static const struct v4l2_ioctl_ops vsp1_video_ioctl_ops = { > + .vidioc_querycap = vsp1_video_querycap, > + .vidioc_g_fmt_vid_cap_mplane = vsp1_video_get_format, > + .vidioc_s_fmt_vid_cap_mplane = vsp1_video_set_format, > + .vidioc_try_fmt_vid_cap_mplane = vsp1_video_try_format, > + .vidioc_g_fmt_vid_out_mplane = vsp1_video_get_format, > + .vidioc_s_fmt_vid_out_mplane = vsp1_video_set_format, > + .vidioc_try_fmt_vid_out_mplane = vsp1_video_try_format, > + .vidioc_reqbufs = vsp1_video_reqbufs, > + .vidioc_querybuf = vsp1_video_querybuf, > + .vidioc_qbuf = vsp1_video_qbuf, > + .vidioc_dqbuf = vsp1_video_dqbuf, > + .vidioc_streamon = vsp1_video_streamon, > + .vidioc_streamoff = vsp1_video_streamoff, > +}; > + > +/* ----------------------------------------------------------------------------- > + * V4L2 File Operations > + */ > + > +static int vsp1_video_open(struct file *file) > +{ > + struct vsp1_video *video = video_drvdata(file); > + struct v4l2_fh *vfh; > + int ret = 0; > + > + vfh = kzalloc(sizeof(*vfh), GFP_KERNEL); > + if (vfh = NULL) > + return -ENOMEM; > + > + v4l2_fh_init(vfh, &video->video); > + v4l2_fh_add(vfh); > + > + file->private_data = vfh; > + > + if (!vsp1_device_get(video->vsp1)) { > + ret = -EBUSY; > + v4l2_fh_del(vfh); > + kfree(vfh); > + } > + > + return ret; > +} > + > +static int vsp1_video_release(struct file *file) > +{ > + struct vsp1_video *video = video_drvdata(file); > + struct v4l2_fh *vfh = file->private_data; > + > + mutex_lock(&video->lock); > + if (video->queue.owner = vfh) { > + vb2_queue_release(&video->queue); > + video->queue.owner = NULL; > + } > + mutex_unlock(&video->lock); > + > + vsp1_device_put(video->vsp1); > + > + v4l2_fh_release(file); > + > + file->private_data = NULL; > + > + return 0; > +} > + > +static unsigned int vsp1_video_poll(struct file *file, poll_table *wait) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + int ret; > + > + mutex_lock(&video->lock); > + ret = vb2_poll(&video->queue, file, wait); > + mutex_unlock(&video->lock); > + > + return ret; > +} > + > +static int vsp1_video_mmap(struct file *file, struct vm_area_struct *vma) > +{ > + struct v4l2_fh *vfh = file->private_data; > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > + int ret; > + > + mutex_lock(&video->lock); > + ret = vb2_mmap(&video->queue, vma); > + mutex_unlock(&video->lock); > + > + return ret; > +} > + > +static struct v4l2_file_operations vsp1_video_fops = { > + .owner = THIS_MODULE, > + .unlocked_ioctl = video_ioctl2, > + .open = vsp1_video_open, > + .release = vsp1_video_release, > + .poll = vsp1_video_poll, > + .mmap = vsp1_video_mmap, > +}; > + > +/* ----------------------------------------------------------------------------- > + * Initialization and Cleanup > + */ > + > +int vsp1_video_init(struct vsp1_video *video, struct vsp1_entity *rwpf) > +{ > + const char *direction; > + int ret; > + > + switch (video->type) { > + case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: > + direction = "output"; > + video->pad.flags = MEDIA_PAD_FL_SINK; > + break; > + > + case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: > + direction = "input"; > + video->pad.flags = MEDIA_PAD_FL_SOURCE; > + video->video.vfl_dir = VFL_DIR_TX; > + break; > + > + default: > + return -EINVAL; > + } > + > + video->rwpf = rwpf; > + > + mutex_init(&video->lock); > + spin_lock_init(&video->irqlock); > + INIT_LIST_HEAD(&video->irqqueue); > + > + mutex_init(&video->pipe.lock); > + spin_lock_init(&video->pipe.irqlock); > + INIT_LIST_HEAD(&video->pipe.entities); > + init_waitqueue_head(&video->pipe.wq); > + video->pipe.state = VSP1_PIPELINE_STOPPED; > + > + /* Initialize the media entity... */ > + ret = media_entity_init(&video->video.entity, 1, &video->pad, 0); > + if (ret < 0) > + return ret; > + > + /* ... and the format ... */ > + video->fmtinfo = vsp1_get_format_info(VSP1_VIDEO_DEF_FORMAT); > + video->format.pixelformat = video->fmtinfo->fourcc; > + video->format.colorspace = V4L2_COLORSPACE_SRGB; > + video->format.field = V4L2_FIELD_NONE; > + video->format.width = VSP1_VIDEO_DEF_WIDTH; > + video->format.height = VSP1_VIDEO_DEF_HEIGHT; > + video->format.num_planes = 1; > + video->format.plane_fmt[0].bytesperline > + video->format.width * video->fmtinfo->bpp[0] / 8; > + video->format.plane_fmt[0].sizeimage > + video->format.plane_fmt[0].bytesperline * video->format.height; > + > + /* ... and the video node... */ > + video->video.v4l2_dev = &video->vsp1->v4l2_dev; > + video->video.fops = &vsp1_video_fops; > + snprintf(video->video.name, sizeof(video->video.name), "%s %s", > + rwpf->subdev.name, direction); > + video->video.vfl_type = VFL_TYPE_GRABBER; > + video->video.release = video_device_release_empty; > + video->video.ioctl_ops = &vsp1_video_ioctl_ops; > + > + video_set_drvdata(&video->video, video); > + > + /* ... and the buffers queue... */ > + video->alloc_ctx = vb2_dma_contig_init_ctx(video->vsp1->dev); > + if (IS_ERR(video->alloc_ctx)) > + goto error; > + > + video->queue.type = video->type; > + video->queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF; > + video->queue.drv_priv = video; > + video->queue.buf_struct_size = sizeof(struct vsp1_video_buffer); > + video->queue.ops = &vsp1_video_queue_qops; > + video->queue.mem_ops = &vb2_dma_contig_memops; > + video->queue.timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_COPY; > + ret = vb2_queue_init(&video->queue); > + if (ret < 0) { > + dev_err(video->vsp1->dev, "failed to initialize vb2 queue\n"); > + goto error; > + } > + > + /* ... and register the video device. */ > + ret = video_register_device(&video->video, VFL_TYPE_GRABBER, -1); > + if (ret < 0) { > + dev_err(video->vsp1->dev, "failed to register video device\n"); > + goto error; > + } > + > + return 0; > + > +error: > + vb2_dma_contig_cleanup_ctx(video->alloc_ctx); > + vsp1_video_cleanup(video); > + return ret; > +} > + > +void vsp1_video_cleanup(struct vsp1_video *video) > +{ > + if (video_is_registered(&video->video)) > + video_unregister_device(&video->video); > + > + vb2_dma_contig_cleanup_ctx(video->alloc_ctx); > + media_entity_cleanup(&video->video.entity); > +} Regards, Hans ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 5/5] v4l: Renesas R-Car VSP1 driver 2013-07-10 12:34 ` [PATCH 5/5] v4l: Renesas R-Car VSP1 driver Hans Verkuil @ 2013-07-10 14:24 ` Laurent Pinchart 2013-07-10 14:47 ` Hans Verkuil 0 siblings, 1 reply; 8+ messages in thread From: Laurent Pinchart @ 2013-07-10 14:24 UTC (permalink / raw) To: Hans Verkuil; +Cc: Laurent Pinchart, linux-media, linux-sh Hi Hans, Thank you for the very quick review. On Wednesday 10 July 2013 14:34:24 Hans Verkuil wrote: > On Wed 10 July 2013 12:19:32 Laurent Pinchart wrote: > > The VSP1 is a video processing engine that includes a blender, scalers, > > filters and statistics computation. Configurable data path routing logic > > allows ordering the internal blocks in a flexible way. > > > > Due to the configurable nature of the pipeline the driver implements the > > media controller API and doesn't use the V4L2 mem-to-mem framework, even > > though the device usually operates in memory to memory mode. > > > > Only the read pixel formatters, up/down scalers, write pixel formatters > > and LCDC interface are supported at this stage. > > > > Signed-off-by: Laurent Pinchart > > <laurent.pinchart+renesas@ideasonboard.com> > > --- > > > > drivers/media/platform/Kconfig | 10 + > > drivers/media/platform/Makefile | 2 + > > drivers/media/platform/vsp1/Makefile | 5 + > > drivers/media/platform/vsp1/vsp1.h | 73 ++ > > drivers/media/platform/vsp1/vsp1_drv.c | 475 ++++++++++++ > > drivers/media/platform/vsp1/vsp1_entity.c | 186 +++++ > > drivers/media/platform/vsp1/vsp1_entity.h | 68 ++ > > drivers/media/platform/vsp1/vsp1_lif.c | 237 ++++++ > > drivers/media/platform/vsp1/vsp1_lif.h | 38 + > > drivers/media/platform/vsp1/vsp1_regs.h | 581 +++++++++++++++ > > drivers/media/platform/vsp1/vsp1_rpf.c | 209 ++++++ > > drivers/media/platform/vsp1/vsp1_rwpf.c | 124 ++++ > > drivers/media/platform/vsp1/vsp1_rwpf.h | 56 ++ > > drivers/media/platform/vsp1/vsp1_uds.c | 346 +++++++++ > > drivers/media/platform/vsp1/vsp1_uds.h | 41 + > > drivers/media/platform/vsp1/vsp1_video.c | 1154 ++++++++++++++++++++++++ > > drivers/media/platform/vsp1/vsp1_video.h | 144 ++++ > > drivers/media/platform/vsp1/vsp1_wpf.c | 233 ++++++ > > include/linux/platform_data/vsp1.h | 25 + > > 19 files changed, 4007 insertions(+) > > create mode 100644 drivers/media/platform/vsp1/Makefile > > create mode 100644 drivers/media/platform/vsp1/vsp1.h > > create mode 100644 drivers/media/platform/vsp1/vsp1_drv.c > > create mode 100644 drivers/media/platform/vsp1/vsp1_entity.c > > create mode 100644 drivers/media/platform/vsp1/vsp1_entity.h > > create mode 100644 drivers/media/platform/vsp1/vsp1_lif.c > > create mode 100644 drivers/media/platform/vsp1/vsp1_lif.h > > create mode 100644 drivers/media/platform/vsp1/vsp1_regs.h > > create mode 100644 drivers/media/platform/vsp1/vsp1_rpf.c > > create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.c > > create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.h > > create mode 100644 drivers/media/platform/vsp1/vsp1_uds.c > > create mode 100644 drivers/media/platform/vsp1/vsp1_uds.h > > create mode 100644 drivers/media/platform/vsp1/vsp1_video.c > > create mode 100644 drivers/media/platform/vsp1/vsp1_video.h > > create mode 100644 drivers/media/platform/vsp1/vsp1_wpf.c > > create mode 100644 include/linux/platform_data/vsp1.h > > Hi Laurent, > > It took some effort, but I finally did find some things to complain about > :-) :-) > > diff --git a/drivers/media/platform/vsp1/vsp1_video.c > > b/drivers/media/platform/vsp1/vsp1_video.c new file mode 100644 > > index 0000000..47a739a > > --- /dev/null > > +++ b/drivers/media/platform/vsp1/vsp1_video.c [snip] > > +static int __vsp1_video_try_format(struct vsp1_video *video, > > + struct v4l2_pix_format_mplane *pix, > > + const struct vsp1_format_info **fmtinfo) > > +{ > > + const struct vsp1_format_info *info; > > + unsigned int width = pix->width; > > + unsigned int height = pix->height; > > + unsigned int i; > > + > > + /* Retrieve format information and select the default format if the > > + * requested format isn't supported. > > + */ > > + info = vsp1_get_format_info(pix->pixelformat); > > + if (info = NULL) > > + info = vsp1_get_format_info(VSP1_VIDEO_DEF_FORMAT); > > + > > + pix->pixelformat = info->fourcc; > > + pix->colorspace = V4L2_COLORSPACE_SRGB; > > + pix->field = V4L2_FIELD_NONE; > > pix->priv should be set to 0. v4l2-compliance catches such errors, BTW. Isn't this handled by the CLEAR_AFTER_FIELD() macros in v4l2-ioctl2.c ? > > + > > + /* Align the width and height for YUV 4:2:2 and 4:2:0 formats. */ > > + width = round_down(width, info->hsub); > > + height = round_down(height, info->vsub); > > + > > + /* Clamp the width and height. */ > > + pix->width = clamp(width, VSP1_VIDEO_MIN_WIDTH, > > VSP1_VIDEO_MAX_WIDTH); > > + pix->height = clamp(height, VSP1_VIDEO_MIN_HEIGHT, > > + VSP1_VIDEO_MAX_HEIGHT); > > + > > + /* Compute and clamp the stride and image size. */ > > + for (i = 0; i < max(info->planes, 2U); ++i) { > > + unsigned int hsub = i > 0 ? info->hsub : 1; > > + unsigned int vsub = i > 0 ? info->vsub : 1; > > + unsigned int bpl; > > + > > + bpl = clamp_t(unsigned int, pix->plane_fmt[i].bytesperline, > > + pix->width / hsub * info->bpp[i] / 8, > > + round_down(65535U, 128)); > > + > > + pix->plane_fmt[i].bytesperline = round_up(bpl, 128); > > + pix->plane_fmt[i].sizeimage = bpl * pix->height / vsub; > > + } > > + > > + if (info->planes = 3) { > > + /* The second and third planes must have the same stride. */ > > + pix->plane_fmt[2].bytesperline = pix->plane_fmt[1].bytesperline; > > + pix->plane_fmt[2].sizeimage = pix->plane_fmt[1].sizeimage; > > + } > > + > > + pix->num_planes = info->planes; > > + > > + if (fmtinfo) > > + *fmtinfo = info; > > + > > + return 0; > > +} [snip] > > +static int > > +vsp1_video_reqbufs(struct file *file, void *fh, struct > > v4l2_requestbuffers *rb) > > +{ > > + struct v4l2_fh *vfh = file->private_data; > > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > > + int ret; > > + > > + mutex_lock(&video->lock); > > + > > + if (video->queue.owner && video->queue.owner != vfh) { > > + ret = -EBUSY; > > + goto done; > > + } > > + > > + ret = vb2_reqbufs(&video->queue, rb); > > + if (ret < 0) > > + goto done; > > + > > + video->queue.owner = vfh; > > + > > +done: > > + mutex_unlock(&video->lock); > > + return ret ? ret : rb->count; > > On success reqbufs should return 0, not the number of allocated buffers. Oops, my bad. > Have you considered using the vb2 helper functions in videobuf2-core.c? They > take care of the queue ownership and often simplify drivers considerably. I have, and mistakenly believed that they relied on using the video device lock. I'll use them. > > +} [snip] > > +static int > > +vsp1_video_streamon(struct file *file, void *fh, enum v4l2_buf_type type) > > +{ > > + struct v4l2_fh *vfh = file->private_data; > > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > > + struct vsp1_pipeline *pipe; > > + int ret; > > + > > + mutex_lock(&video->lock); > > + > > + if (video->queue.owner && video->queue.owner != vfh) { > > + ret = -EBUSY; > > + goto err_unlock; > > + } > > + > > + video->sequence = 0; > > + > > + /* Start streaming on the pipeline. No link touching an entity in the > > + * pipeline can be activated or deactivated once streaming is > > started. > > + * > > + * Use the VSP1 pipeline object embedded in the first video object > > + * that starts streaming. > > + */ > > + pipe = video->video.entity.pipe > > + ? to_vsp1_pipeline(&video->video.entity) : &video->pipe; > > + > > + ret = media_entity_pipeline_start(&video->video.entity, &pipe->pipe); > > + if (ret < 0) > > + goto err_unlock; > > + > > + /* Verify that the configured format matches the output of the > > + * connected subdev. > > + */ > > + ret = vsp1_video_verify_format(video); > > + if (ret < 0) > > + goto err_stop; > > + > > + ret = vsp1_pipeline_init(pipe, video); > > + if (ret < 0) > > + goto err_stop; > > Shouldn't the code above be better placed in the vb2 start_streaming op? The code needs to be run before buffers are enqueued to the driver, that's why I've placed it here. > > + > > + /* Start the queue. */ > > + ret = vb2_streamon(&video->queue, type); > > + if (ret < 0) > > + goto err_cleanup; > > + > > + mutex_unlock(&video->lock); > > + return 0; > > + > > +err_cleanup: > > + vsp1_pipeline_cleanup(pipe); > > +err_stop: > > + media_entity_pipeline_stop(&video->video.entity); > > +err_unlock: > > + mutex_unlock(&video->lock); > > + return ret; > > + > > +} > > + > > +static int > > +vsp1_video_streamoff(struct file *file, void *fh, enum v4l2_buf_type > > type) > > +{ > > + struct v4l2_fh *vfh = file->private_data; > > + struct vsp1_video *video = to_vsp1_video(vfh->vdev); > > + int ret; > > + > > + mutex_lock(&video->lock); > > + > > + if (video->queue.owner && video->queue.owner != vfh) { > > + ret = -EBUSY; > > + goto done; > > + } > > + > > + ret = vb2_streamoff(&video->queue, type); > > + > > +done: > > + mutex_unlock(&video->lock); > > + return ret; > > +} -- Regards, Laurent Pinchart ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 5/5] v4l: Renesas R-Car VSP1 driver 2013-07-10 14:24 ` Laurent Pinchart @ 2013-07-10 14:47 ` Hans Verkuil 0 siblings, 0 replies; 8+ messages in thread From: Hans Verkuil @ 2013-07-10 14:47 UTC (permalink / raw) To: Laurent Pinchart; +Cc: Laurent Pinchart, linux-media, linux-sh On Wed July 10 2013 16:24:58 Laurent Pinchart wrote: > Hi Hans, > > Thank you for the very quick review. > > On Wednesday 10 July 2013 14:34:24 Hans Verkuil wrote: > > On Wed 10 July 2013 12:19:32 Laurent Pinchart wrote: > > > The VSP1 is a video processing engine that includes a blender, scalers, > > > filters and statistics computation. Configurable data path routing logic > > > allows ordering the internal blocks in a flexible way. > > > > > > Due to the configurable nature of the pipeline the driver implements the > > > media controller API and doesn't use the V4L2 mem-to-mem framework, even > > > though the device usually operates in memory to memory mode. > > > > > > Only the read pixel formatters, up/down scalers, write pixel formatters > > > and LCDC interface are supported at this stage. > > > > > > Signed-off-by: Laurent Pinchart > > > <laurent.pinchart+renesas@ideasonboard.com> > > > --- > > > > > > drivers/media/platform/Kconfig | 10 + > > > drivers/media/platform/Makefile | 2 + > > > drivers/media/platform/vsp1/Makefile | 5 + > > > drivers/media/platform/vsp1/vsp1.h | 73 ++ > > > drivers/media/platform/vsp1/vsp1_drv.c | 475 ++++++++++++ > > > drivers/media/platform/vsp1/vsp1_entity.c | 186 +++++ > > > drivers/media/platform/vsp1/vsp1_entity.h | 68 ++ > > > drivers/media/platform/vsp1/vsp1_lif.c | 237 ++++++ > > > drivers/media/platform/vsp1/vsp1_lif.h | 38 + > > > drivers/media/platform/vsp1/vsp1_regs.h | 581 +++++++++++++++ > > > drivers/media/platform/vsp1/vsp1_rpf.c | 209 ++++++ > > > drivers/media/platform/vsp1/vsp1_rwpf.c | 124 ++++ > > > drivers/media/platform/vsp1/vsp1_rwpf.h | 56 ++ > > > drivers/media/platform/vsp1/vsp1_uds.c | 346 +++++++++ > > > drivers/media/platform/vsp1/vsp1_uds.h | 41 + > > > drivers/media/platform/vsp1/vsp1_video.c | 1154 ++++++++++++++++++++++++ > > > drivers/media/platform/vsp1/vsp1_video.h | 144 ++++ > > > drivers/media/platform/vsp1/vsp1_wpf.c | 233 ++++++ > > > include/linux/platform_data/vsp1.h | 25 + > > > 19 files changed, 4007 insertions(+) > > > create mode 100644 drivers/media/platform/vsp1/Makefile > > > create mode 100644 drivers/media/platform/vsp1/vsp1.h > > > create mode 100644 drivers/media/platform/vsp1/vsp1_drv.c > > > create mode 100644 drivers/media/platform/vsp1/vsp1_entity.c > > > create mode 100644 drivers/media/platform/vsp1/vsp1_entity.h > > > create mode 100644 drivers/media/platform/vsp1/vsp1_lif.c > > > create mode 100644 drivers/media/platform/vsp1/vsp1_lif.h > > > create mode 100644 drivers/media/platform/vsp1/vsp1_regs.h > > > create mode 100644 drivers/media/platform/vsp1/vsp1_rpf.c > > > create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.c > > > create mode 100644 drivers/media/platform/vsp1/vsp1_rwpf.h > > > create mode 100644 drivers/media/platform/vsp1/vsp1_uds.c > > > create mode 100644 drivers/media/platform/vsp1/vsp1_uds.h > > > create mode 100644 drivers/media/platform/vsp1/vsp1_video.c > > > create mode 100644 drivers/media/platform/vsp1/vsp1_video.h > > > create mode 100644 drivers/media/platform/vsp1/vsp1_wpf.c > > > create mode 100644 include/linux/platform_data/vsp1.h > > > > Hi Laurent, > > > > It took some effort, but I finally did find some things to complain about > > :-) > > :-) > > > > diff --git a/drivers/media/platform/vsp1/vsp1_video.c > > > b/drivers/media/platform/vsp1/vsp1_video.c new file mode 100644 > > > index 0000000..47a739a > > > --- /dev/null > > > +++ b/drivers/media/platform/vsp1/vsp1_video.c > > [snip] > > > > +static int __vsp1_video_try_format(struct vsp1_video *video, > > > + struct v4l2_pix_format_mplane *pix, > > > + const struct vsp1_format_info **fmtinfo) > > > +{ > > > + const struct vsp1_format_info *info; > > > + unsigned int width = pix->width; > > > + unsigned int height = pix->height; > > > + unsigned int i; > > > + > > > + /* Retrieve format information and select the default format if the > > > + * requested format isn't supported. > > > + */ > > > + info = vsp1_get_format_info(pix->pixelformat); > > > + if (info = NULL) > > > + info = vsp1_get_format_info(VSP1_VIDEO_DEF_FORMAT); > > > + > > > + pix->pixelformat = info->fourcc; > > > + pix->colorspace = V4L2_COLORSPACE_SRGB; > > > + pix->field = V4L2_FIELD_NONE; > > > > pix->priv should be set to 0. v4l2-compliance catches such errors, BTW. > > Isn't this handled by the CLEAR_AFTER_FIELD() macros in v4l2-ioctl2.c ? For G_FMT, yes, but there is no CLEAR_AFTER_FIELD for S/TRY_FMT. So priv needs to be zeroed manually. Regards, Hans ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-07-10 14:47 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-10 10:19 [PATCH 0/5] Renesas VSP1 driver Laurent Pinchart
2013-07-10 10:19 ` [PATCH 1/5] media: Fix circular graph traversal Laurent Pinchart
2013-07-10 10:19 ` [PATCH 2/5] v4l: Fix V4L2_MBUS_FMT_YUV10_1X30 media bus pixel code value Laurent Pinchart
2013-07-10 10:19 ` [PATCH 3/5] v4l: Add media format codes for ARGB8888 and AYUV8888 on 32-bit busses Laurent Pinchart
2013-07-10 10:19 ` [PATCH 4/5] v4l: Add V4L2_PIX_FMT_NV16M and V4L2_PIX_FMT_NV61M formats Laurent Pinchart
[not found] ` <1373451572-3892-6-git-send-email-laurent.pinchart+renesas@ideasonboard.com>
2013-07-10 12:34 ` [PATCH 5/5] v4l: Renesas R-Car VSP1 driver Hans Verkuil
2013-07-10 14:24 ` Laurent Pinchart
2013-07-10 14:47 ` Hans Verkuil
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).