mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 03:53:37 +02:00
Miscellaneous V4L2 changes
-----BEGIN PGP SIGNATURE----- iJcEABYKAEAWIQTAnvhxs4J7QT+XHKnMPy2AAyfeZAUCZspiayIcbGF1cmVudC5w aW5jaGFydEBpZGVhc29uYm9hcmQuY29tAAoJEMw/LYADJ95k8oAA+IcXEJOJLz3H D20FkRm9MRjmMzo0i1s6jPBTmh3ivIIBAPMrIMY0C8y6DaCVjpA7Nytl9RnE2rUH WLl09USh1iEP =7tSV -----END PGP SIGNATURE----- Merge tag 'tags/next-media-misc-20240825' of git://git.kernel.org/pub/scm/linux/kernel/git/pinchartl/linux.git Miscellaneous changes: mt9p031, starfive and v4l2-mc. Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Link: https://patchwork.linuxtv.org/project/linux-media/patch/20240824233140.GA9543@pendragon.ideasonboard.com/
This commit is contained in:
commit
6b7b4d9a33
|
|
@ -144,7 +144,8 @@ valid values are described at :c:func:`media_create_pad_link()` and
|
|||
Graph traversal
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
The media framework provides APIs to iterate over entities in a graph.
|
||||
The media framework provides APIs to traverse media graphs, locating connected
|
||||
entities and links.
|
||||
|
||||
To iterate over all entities belonging to a media device, drivers can use
|
||||
the media_device_for_each_entity macro, defined in
|
||||
|
|
@ -159,31 +160,6 @@ the media_device_for_each_entity macro, defined in
|
|||
...
|
||||
}
|
||||
|
||||
Drivers might also need to iterate over all entities in a graph that can be
|
||||
reached only through enabled links starting at a given entity. The media
|
||||
framework provides a depth-first graph traversal API for that purpose.
|
||||
|
||||
.. note::
|
||||
|
||||
Graphs with cycles (whether directed or undirected) are **NOT**
|
||||
supported by the graph traversal API. To prevent infinite loops, the graph
|
||||
traversal code limits the maximum depth to ``MEDIA_ENTITY_ENUM_MAX_DEPTH``,
|
||||
currently defined as 16.
|
||||
|
||||
Drivers initiate a graph traversal by calling
|
||||
:c:func:`media_graph_walk_start()`
|
||||
|
||||
The graph structure, provided by the caller, is initialized to start graph
|
||||
traversal at the given entity.
|
||||
|
||||
Drivers can then retrieve the next entity by calling
|
||||
:c:func:`media_graph_walk_next()`
|
||||
|
||||
When the graph traversal is complete the function will return ``NULL``.
|
||||
|
||||
Graph traversal can be interrupted at any moment. No cleanup function call
|
||||
is required and the graph structure can be freed normally.
|
||||
|
||||
Helper functions can be used to find a link between two given pads, or a pad
|
||||
connected to another pad through an enabled link
|
||||
(:c:func:`media_entity_find_link()`, :c:func:`media_pad_remote_pad_first()`,
|
||||
|
|
@ -276,6 +252,45 @@ Subsystems should facilitate link validation by providing subsystem specific
|
|||
helper functions to provide easy access for commonly needed information, and
|
||||
in the end provide a way to use driver-specific callbacks.
|
||||
|
||||
Pipeline traversal
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Once a pipeline has been constructed with :c:func:`media_pipeline_start()`,
|
||||
drivers can iterate over entities or pads in the pipeline with the
|
||||
:c:macro:´media_pipeline_for_each_entity` and
|
||||
:c:macro:´media_pipeline_for_each_pad` macros. Iterating over pads is
|
||||
straightforward:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
media_pipeline_pad_iter iter;
|
||||
struct media_pad *pad;
|
||||
|
||||
media_pipeline_for_each_pad(pipe, &iter, pad) {
|
||||
/* 'pad' will point to each pad in turn */
|
||||
...
|
||||
}
|
||||
|
||||
To iterate over entities, the iterator needs to be initialized and cleaned up
|
||||
as an additional steps:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
media_pipeline_entity_iter iter;
|
||||
struct media_entity *entity;
|
||||
int ret;
|
||||
|
||||
ret = media_pipeline_entity_iter_init(pipe, &iter);
|
||||
if (ret)
|
||||
...;
|
||||
|
||||
media_pipeline_for_each_entity(pipe, &iter, entity) {
|
||||
/* 'entity' will point to each entity in turn */
|
||||
...
|
||||
}
|
||||
|
||||
media_pipeline_entity_iter_cleanup(&iter);
|
||||
|
||||
Media Controller Device Allocator API
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_graph.h>
|
||||
|
|
@ -112,11 +113,6 @@
|
|||
#define MT9P031_TEST_PATTERN_RED 0xa2
|
||||
#define MT9P031_TEST_PATTERN_BLUE 0xa3
|
||||
|
||||
enum mt9p031_model {
|
||||
MT9P031_MODEL_COLOR,
|
||||
MT9P031_MODEL_MONOCHROME,
|
||||
};
|
||||
|
||||
struct mt9p031 {
|
||||
struct v4l2_subdev subdev;
|
||||
struct media_pad pad;
|
||||
|
|
@ -129,7 +125,7 @@ struct mt9p031 {
|
|||
struct clk *clk;
|
||||
struct regulator_bulk_data regulators[3];
|
||||
|
||||
enum mt9p031_model model;
|
||||
u32 code;
|
||||
struct aptina_pll pll;
|
||||
unsigned int clk_div;
|
||||
bool use_pll;
|
||||
|
|
@ -712,12 +708,7 @@ static int mt9p031_init_state(struct v4l2_subdev *subdev,
|
|||
crop->height = MT9P031_WINDOW_HEIGHT_DEF;
|
||||
|
||||
format = __mt9p031_get_pad_format(mt9p031, sd_state, 0, which);
|
||||
|
||||
if (mt9p031->model == MT9P031_MODEL_MONOCHROME)
|
||||
format->code = MEDIA_BUS_FMT_Y12_1X12;
|
||||
else
|
||||
format->code = MEDIA_BUS_FMT_SGRBG12_1X12;
|
||||
|
||||
format->code = mt9p031->code;
|
||||
format->width = MT9P031_WINDOW_WIDTH_DEF;
|
||||
format->height = MT9P031_WINDOW_HEIGHT_DEF;
|
||||
format->field = V4L2_FIELD_NONE;
|
||||
|
|
@ -1102,7 +1093,6 @@ mt9p031_get_pdata(struct i2c_client *client)
|
|||
|
||||
static int mt9p031_probe(struct i2c_client *client)
|
||||
{
|
||||
const struct i2c_device_id *did = i2c_client_get_device_id(client);
|
||||
struct mt9p031_platform_data *pdata = mt9p031_get_pdata(client);
|
||||
struct i2c_adapter *adapter = client->adapter;
|
||||
struct mt9p031 *mt9p031;
|
||||
|
|
@ -1127,7 +1117,7 @@ static int mt9p031_probe(struct i2c_client *client)
|
|||
mt9p031->pdata = pdata;
|
||||
mt9p031->output_control = MT9P031_OUTPUT_CONTROL_DEF;
|
||||
mt9p031->mode2 = MT9P031_READ_MODE_2_ROW_BLC;
|
||||
mt9p031->model = did->driver_data;
|
||||
mt9p031->code = (uintptr_t)i2c_get_match_data(client);
|
||||
|
||||
mt9p031->regulators[0].supply = "vdd";
|
||||
mt9p031->regulators[1].supply = "vdd_io";
|
||||
|
|
@ -1224,26 +1214,24 @@ static void mt9p031_remove(struct i2c_client *client)
|
|||
}
|
||||
|
||||
static const struct i2c_device_id mt9p031_id[] = {
|
||||
{ "mt9p006", MT9P031_MODEL_COLOR },
|
||||
{ "mt9p031", MT9P031_MODEL_COLOR },
|
||||
{ "mt9p031m", MT9P031_MODEL_MONOCHROME },
|
||||
{ }
|
||||
{ "mt9p006", MEDIA_BUS_FMT_SGRBG12_1X12 },
|
||||
{ "mt9p031", MEDIA_BUS_FMT_SGRBG12_1X12 },
|
||||
{ "mt9p031m", MEDIA_BUS_FMT_Y12_1X12 },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, mt9p031_id);
|
||||
|
||||
#if IS_ENABLED(CONFIG_OF)
|
||||
static const struct of_device_id mt9p031_of_match[] = {
|
||||
{ .compatible = "aptina,mt9p006", },
|
||||
{ .compatible = "aptina,mt9p031", },
|
||||
{ .compatible = "aptina,mt9p031m", },
|
||||
{ /* sentinel */ },
|
||||
{ .compatible = "aptina,mt9p006", .data = (void *)MEDIA_BUS_FMT_SGRBG12_1X12 },
|
||||
{ .compatible = "aptina,mt9p031", .data = (void *)MEDIA_BUS_FMT_SGRBG12_1X12 },
|
||||
{ .compatible = "aptina,mt9p031m", .data = (void *)MEDIA_BUS_FMT_Y12_1X12 },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, mt9p031_of_match);
|
||||
#endif
|
||||
|
||||
static struct i2c_driver mt9p031_i2c_driver = {
|
||||
.driver = {
|
||||
.of_match_table = of_match_ptr(mt9p031_of_match),
|
||||
.of_match_table = mt9p031_of_match,
|
||||
.name = "mt9p031",
|
||||
},
|
||||
.probe = mt9p031_probe,
|
||||
|
|
|
|||
|
|
@ -180,6 +180,8 @@ static void stf_channel_set(struct stfcamss_video *video)
|
|||
u32 val;
|
||||
|
||||
if (cap->type == STF_CAPTURE_RAW) {
|
||||
const struct v4l2_pix_format *pix = &video->active_fmt.fmt.pix;
|
||||
|
||||
val = stf_syscon_reg_read(stfcamss, VIN_CHANNEL_SEL_EN);
|
||||
val &= ~U0_VIN_CHANNEL_SEL_MASK;
|
||||
val |= CHANNEL(0);
|
||||
|
|
@ -193,7 +195,7 @@ static void stf_channel_set(struct stfcamss_video *video)
|
|||
val |= PIXEL_HEIGH_BIT_SEL(0);
|
||||
|
||||
val &= ~U0_VIN_PIX_CNT_END_MASK;
|
||||
val |= PIX_CNT_END(IMAGE_MAX_WIDTH / 4 - 1);
|
||||
val |= PIX_CNT_END(pix->width / 4 - 1);
|
||||
|
||||
stf_syscon_reg_write(stfcamss, VIN_INRT_PIX_CFG, val);
|
||||
} else if (cap->type == STF_CAPTURE_YUV) {
|
||||
|
|
|
|||
|
|
@ -178,6 +178,9 @@ void v4l2_pipeline_pm_put(struct media_entity *entity);
|
|||
* @flags: New link flags that will be applied
|
||||
* @notification: The link's state change notification type (MEDIA_DEV_NOTIFY_*)
|
||||
*
|
||||
* THIS FUNCTION IS DEPRECATED. DO NOT USE IN NEW DRIVERS. USE RUNTIME PM
|
||||
* ON SUB-DEVICE DRIVERS INSTEAD.
|
||||
*
|
||||
* React to link management on powered pipelines by updating the use count of
|
||||
* all entities in the source and sink sides of the link. Entities are powered
|
||||
* on or off accordingly. The use of this function should be paired
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user