Lines Matching +full:clock +full:- +full:noncontinuous

1 // SPDX-License-Identifier: GPL-2.0-only
6 * formerly was located in v4l2-of.c.
11 * Copyright (C) 2012 - 2013 Samsung Electronics Co., Ltd.
27 #include <media/v4l2-async.h>
28 #include <media/v4l2-fwnode.h>
29 #include <media/v4l2-subdev.h>
43 "MIPI CSI-2 C-PHY",
47 "MIPI CSI-1",
55 "MIPI CSI-2 D-PHY",
85 return conv ? conv->mbus_type : V4L2_MBUS_INVALID; in v4l2_fwnode_bus_type_to_mbus()
94 return conv ? conv->name : "not found"; in v4l2_fwnode_bus_type_to_string()
115 return conv ? conv->name : "not found"; in v4l2_fwnode_mbus_type_to_string()
122 struct v4l2_fwnode_bus_mipi_csi2 *bus = &vep->bus.mipi_csi2; in v4l2_fwnode_endpoint_parse_csi2_bus()
138 num_data_lanes = min_t(u32, bus->num_data_lanes, in v4l2_fwnode_endpoint_parse_csi2_bus()
141 clock_lane = bus->clock_lane; in v4l2_fwnode_endpoint_parse_csi2_bus()
146 array[i] = bus->data_lanes[i]; in v4l2_fwnode_endpoint_parse_csi2_bus()
155 rval = fwnode_property_count_u32(fwnode, "data-lanes"); in v4l2_fwnode_endpoint_parse_csi2_bus()
160 fwnode_property_read_u32_array(fwnode, "data-lanes", array, in v4l2_fwnode_endpoint_parse_csi2_bus()
165 pr_debug("data-lanes property exists; disabling default mapping\n"); in v4l2_fwnode_endpoint_parse_csi2_bus()
173 pr_warn("duplicated lane %u in data-lanes, using defaults\n", in v4l2_fwnode_endpoint_parse_csi2_bus()
183 rval = fwnode_property_count_u32(fwnode, "lane-polarities"); in v4l2_fwnode_endpoint_parse_csi2_bus()
185 if (rval != 1 + num_data_lanes /* clock+data */) { in v4l2_fwnode_endpoint_parse_csi2_bus()
186 pr_warn("invalid number of lane-polarities entries (need %u, got %u)\n", in v4l2_fwnode_endpoint_parse_csi2_bus()
188 return -EINVAL; in v4l2_fwnode_endpoint_parse_csi2_bus()
194 if (!fwnode_property_read_u32(fwnode, "clock-lanes", &v)) { in v4l2_fwnode_endpoint_parse_csi2_bus()
196 pr_debug("clock lane position %u\n", v); in v4l2_fwnode_endpoint_parse_csi2_bus()
202 pr_warn("duplicated lane %u in clock-lanes, using defaults\n", in v4l2_fwnode_endpoint_parse_csi2_bus()
207 if (fwnode_property_present(fwnode, "clock-noncontinuous")) { in v4l2_fwnode_endpoint_parse_csi2_bus()
209 pr_debug("non-continuous clock\n"); in v4l2_fwnode_endpoint_parse_csi2_bus()
217 /* Only D-PHY has a clock lane. */ in v4l2_fwnode_endpoint_parse_csi2_bus()
221 bus->flags = flags; in v4l2_fwnode_endpoint_parse_csi2_bus()
223 vep->bus_type = V4L2_MBUS_CSI2_DPHY; in v4l2_fwnode_endpoint_parse_csi2_bus()
224 bus->num_data_lanes = num_data_lanes; in v4l2_fwnode_endpoint_parse_csi2_bus()
227 bus->clock_lane = 0; in v4l2_fwnode_endpoint_parse_csi2_bus()
229 bus->data_lanes[i] = dfl_data_lane_index + i; in v4l2_fwnode_endpoint_parse_csi2_bus()
231 bus->clock_lane = clock_lane; in v4l2_fwnode_endpoint_parse_csi2_bus()
233 bus->data_lanes[i] = array[i]; in v4l2_fwnode_endpoint_parse_csi2_bus()
238 "lane-polarities", array, in v4l2_fwnode_endpoint_parse_csi2_bus()
242 bus->lane_polarities[i] = array[i]; in v4l2_fwnode_endpoint_parse_csi2_bus()
266 struct v4l2_fwnode_bus_parallel *bus = &vep->bus.parallel; in v4l2_fwnode_endpoint_parse_parallel_bus()
271 flags = bus->flags; in v4l2_fwnode_endpoint_parse_parallel_bus()
273 if (!fwnode_property_read_u32(fwnode, "hsync-active", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
278 pr_debug("hsync-active %s\n", v ? "high" : "low"); in v4l2_fwnode_endpoint_parse_parallel_bus()
281 if (!fwnode_property_read_u32(fwnode, "vsync-active", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
286 pr_debug("vsync-active %s\n", v ? "high" : "low"); in v4l2_fwnode_endpoint_parse_parallel_bus()
289 if (!fwnode_property_read_u32(fwnode, "field-even-active", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
294 pr_debug("field-even-active %s\n", v ? "high" : "low"); in v4l2_fwnode_endpoint_parse_parallel_bus()
297 if (!fwnode_property_read_u32(fwnode, "pclk-sample", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
302 pr_debug("pclk-sample %s\n", v ? "high" : "low"); in v4l2_fwnode_endpoint_parse_parallel_bus()
305 if (!fwnode_property_read_u32(fwnode, "data-active", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
310 pr_debug("data-active %s\n", v ? "high" : "low"); in v4l2_fwnode_endpoint_parse_parallel_bus()
313 if (fwnode_property_present(fwnode, "slave-mode")) { in v4l2_fwnode_endpoint_parse_parallel_bus()
322 if (!fwnode_property_read_u32(fwnode, "bus-width", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
323 bus->bus_width = v; in v4l2_fwnode_endpoint_parse_parallel_bus()
324 pr_debug("bus-width %u\n", v); in v4l2_fwnode_endpoint_parse_parallel_bus()
327 if (!fwnode_property_read_u32(fwnode, "data-shift", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
328 bus->data_shift = v; in v4l2_fwnode_endpoint_parse_parallel_bus()
329 pr_debug("data-shift %u\n", v); in v4l2_fwnode_endpoint_parse_parallel_bus()
332 if (!fwnode_property_read_u32(fwnode, "sync-on-green-active", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
337 pr_debug("sync-on-green-active %s\n", v ? "high" : "low"); in v4l2_fwnode_endpoint_parse_parallel_bus()
340 if (!fwnode_property_read_u32(fwnode, "data-enable-active", &v)) { in v4l2_fwnode_endpoint_parse_parallel_bus()
345 pr_debug("data-enable-active %s\n", v ? "high" : "low"); in v4l2_fwnode_endpoint_parse_parallel_bus()
350 bus->flags = flags; in v4l2_fwnode_endpoint_parse_parallel_bus()
352 vep->bus_type = V4L2_MBUS_PARALLEL; in v4l2_fwnode_endpoint_parse_parallel_bus()
354 vep->bus_type = V4L2_MBUS_BT656; in v4l2_fwnode_endpoint_parse_parallel_bus()
357 vep->bus_type = V4L2_MBUS_PARALLEL; in v4l2_fwnode_endpoint_parse_parallel_bus()
358 bus->flags = flags; in v4l2_fwnode_endpoint_parse_parallel_bus()
361 vep->bus_type = V4L2_MBUS_BT656; in v4l2_fwnode_endpoint_parse_parallel_bus()
362 bus->flags = flags & ~PARALLEL_MBUS_FLAGS; in v4l2_fwnode_endpoint_parse_parallel_bus()
372 struct v4l2_fwnode_bus_mipi_csi1 *bus = &vep->bus.mipi_csi1; in v4l2_fwnode_endpoint_parse_csi1_bus()
375 if (!fwnode_property_read_u32(fwnode, "clock-inv", &v)) { in v4l2_fwnode_endpoint_parse_csi1_bus()
376 bus->clock_inv = v; in v4l2_fwnode_endpoint_parse_csi1_bus()
377 pr_debug("clock-inv %u\n", v); in v4l2_fwnode_endpoint_parse_csi1_bus()
381 bus->strobe = v; in v4l2_fwnode_endpoint_parse_csi1_bus()
385 if (!fwnode_property_read_u32(fwnode, "data-lanes", &v)) { in v4l2_fwnode_endpoint_parse_csi1_bus()
386 bus->data_lane = v; in v4l2_fwnode_endpoint_parse_csi1_bus()
387 pr_debug("data-lanes %u\n", v); in v4l2_fwnode_endpoint_parse_csi1_bus()
390 if (!fwnode_property_read_u32(fwnode, "clock-lanes", &v)) { in v4l2_fwnode_endpoint_parse_csi1_bus()
391 bus->clock_lane = v; in v4l2_fwnode_endpoint_parse_csi1_bus()
392 pr_debug("clock-lanes %u\n", v); in v4l2_fwnode_endpoint_parse_csi1_bus()
396 vep->bus_type = V4L2_MBUS_CCP2; in v4l2_fwnode_endpoint_parse_csi1_bus()
398 vep->bus_type = V4L2_MBUS_CSI1; in v4l2_fwnode_endpoint_parse_csi1_bus()
410 fwnode_property_read_u32(fwnode, "bus-type", &bus_type); in __v4l2_fwnode_endpoint_parse()
413 v4l2_fwnode_mbus_type_to_string(vep->bus_type), in __v4l2_fwnode_endpoint_parse()
414 vep->bus_type); in __v4l2_fwnode_endpoint_parse()
418 return -EINVAL; in __v4l2_fwnode_endpoint_parse()
421 if (vep->bus_type != V4L2_MBUS_UNKNOWN) { in __v4l2_fwnode_endpoint_parse()
423 vep->bus_type != mbus_type) { in __v4l2_fwnode_endpoint_parse()
425 v4l2_fwnode_mbus_type_to_string(vep->bus_type)); in __v4l2_fwnode_endpoint_parse()
426 return -ENXIO; in __v4l2_fwnode_endpoint_parse()
429 vep->bus_type = mbus_type; in __v4l2_fwnode_endpoint_parse()
432 switch (vep->bus_type) { in __v4l2_fwnode_endpoint_parse()
439 if (vep->bus_type == V4L2_MBUS_UNKNOWN) in __v4l2_fwnode_endpoint_parse()
444 v4l2_fwnode_mbus_type_to_string(vep->bus_type), in __v4l2_fwnode_endpoint_parse()
445 vep->bus_type); in __v4l2_fwnode_endpoint_parse()
450 v4l2_fwnode_endpoint_parse_csi1_bus(fwnode, vep, vep->bus_type); in __v4l2_fwnode_endpoint_parse()
456 vep->bus_type); in __v4l2_fwnode_endpoint_parse()
464 vep->bus_type); in __v4l2_fwnode_endpoint_parse()
469 return -EINVAL; in __v4l2_fwnode_endpoint_parse()
472 fwnode_graph_parse_endpoint(fwnode, &vep->base); in __v4l2_fwnode_endpoint_parse()
495 kfree(vep->link_frequencies); in v4l2_fwnode_endpoint_free()
496 vep->link_frequencies = NULL; in v4l2_fwnode_endpoint_free()
509 rval = fwnode_property_count_u64(fwnode, "link-frequencies"); in v4l2_fwnode_endpoint_alloc_parse()
513 vep->link_frequencies = in v4l2_fwnode_endpoint_alloc_parse()
514 kmalloc_array(rval, sizeof(*vep->link_frequencies), in v4l2_fwnode_endpoint_alloc_parse()
516 if (!vep->link_frequencies) in v4l2_fwnode_endpoint_alloc_parse()
517 return -ENOMEM; in v4l2_fwnode_endpoint_alloc_parse()
519 vep->nr_of_link_frequencies = rval; in v4l2_fwnode_endpoint_alloc_parse()
522 "link-frequencies", in v4l2_fwnode_endpoint_alloc_parse()
523 vep->link_frequencies, in v4l2_fwnode_endpoint_alloc_parse()
524 vep->nr_of_link_frequencies); in v4l2_fwnode_endpoint_alloc_parse()
530 for (i = 0; i < vep->nr_of_link_frequencies; i++) in v4l2_fwnode_endpoint_alloc_parse()
531 pr_debug("link-frequencies %u value %llu\n", i, in v4l2_fwnode_endpoint_alloc_parse()
532 vep->link_frequencies[i]); in v4l2_fwnode_endpoint_alloc_parse()
549 link->local_id = fwep.id; in v4l2_fwnode_parse_link()
550 link->local_port = fwep.port; in v4l2_fwnode_parse_link()
551 link->local_node = fwnode_graph_get_port_parent(fwnode); in v4l2_fwnode_parse_link()
556 return -ENOLINK; in v4l2_fwnode_parse_link()
560 link->remote_id = fwep.id; in v4l2_fwnode_parse_link()
561 link->remote_port = fwep.port; in v4l2_fwnode_parse_link()
562 link->remote_node = fwnode_graph_get_port_parent(fwnode); in v4l2_fwnode_parse_link()
570 fwnode_handle_put(link->local_node); in v4l2_fwnode_put_link()
571 fwnode_handle_put(link->remote_node); in v4l2_fwnode_put_link()
581 .compatible = "composite-video-connector",
584 .compatible = "svideo-connector",
607 ret = fwnode_property_read_u32(fwnode, "sdtv-standards", &stds); in v4l2_fwnode_connector_parse_analog()
610 vc->connector.analog.sdtv_stds = ret ? V4L2_STD_ALL : stds; in v4l2_fwnode_connector_parse_analog()
617 if (IS_ERR_OR_NULL(connector) || connector->type == V4L2_CONN_UNKNOWN) in v4l2_fwnode_connector_free()
620 list_for_each_entry_safe(link, tmp, &connector->links, head) { in v4l2_fwnode_connector_free()
621 v4l2_fwnode_put_link(&link->fwnode_link); in v4l2_fwnode_connector_free()
622 list_del(&link->head); in v4l2_fwnode_connector_free()
626 kfree(connector->label); in v4l2_fwnode_connector_free()
627 connector->label = NULL; in v4l2_fwnode_connector_free()
628 connector->type = V4L2_CONN_UNKNOWN; in v4l2_fwnode_connector_free()
641 /* The connector-type is stored within the compatible string. */ in v4l2_fwnode_get_connector_type()
658 return -EINVAL; in v4l2_fwnode_connector_parse()
662 INIT_LIST_HEAD(&connector->links); in v4l2_fwnode_connector_parse()
674 err = -ENOTCONN; in v4l2_fwnode_connector_parse()
678 connector->type = connector_type; in v4l2_fwnode_connector_parse()
679 connector->name = fwnode_get_name(connector_node); in v4l2_fwnode_connector_parse()
681 connector->label = err ? NULL : kstrdup_const(label, GFP_KERNEL); in v4l2_fwnode_connector_parse()
684 switch (connector->type) { in v4l2_fwnode_connector_parse()
708 if (!fwnode || !connector || connector->type == V4L2_CONN_UNKNOWN) in v4l2_fwnode_connector_add_link()
709 return -EINVAL; in v4l2_fwnode_connector_add_link()
713 return -ENOTCONN; in v4l2_fwnode_connector_add_link()
717 err = -ENOMEM; in v4l2_fwnode_connector_add_link()
721 err = v4l2_fwnode_parse_link(connector_ep, &link->fwnode_link); in v4l2_fwnode_connector_add_link()
727 list_add(&link->head, &connector->links); in v4l2_fwnode_connector_add_link()
728 connector->nr_of_links++; in v4l2_fwnode_connector_add_link()
749 props->orientation = V4L2_FWNODE_PROPERTY_UNSET; in v4l2_fwnode_device_parse()
759 return -EINVAL; in v4l2_fwnode_device_parse()
762 props->orientation = val; in v4l2_fwnode_device_parse()
766 props->rotation = V4L2_FWNODE_PROPERTY_UNSET; in v4l2_fwnode_device_parse()
771 return -EINVAL; in v4l2_fwnode_device_parse()
774 props->rotation = val; in v4l2_fwnode_device_parse()
795 return -ENOMEM; in v4l2_async_notifier_fwnode_parse_endpoint()
797 asd->match_type = V4L2_ASYNC_MATCH_FWNODE; in v4l2_async_notifier_fwnode_parse_endpoint()
798 asd->match.fwnode = in v4l2_async_notifier_fwnode_parse_endpoint()
800 if (!asd->match.fwnode) { in v4l2_async_notifier_fwnode_parse_endpoint()
802 ret = -ENOTCONN; in v4l2_async_notifier_fwnode_parse_endpoint()
814 if (ret == -ENOTCONN) in v4l2_async_notifier_fwnode_parse_endpoint()
828 if (ret == -EEXIST) in v4l2_async_notifier_fwnode_parse_endpoint()
836 fwnode_handle_put(asd->match.fwnode); in v4l2_async_notifier_fwnode_parse_endpoint()
839 return ret == -ENOTCONN ? 0 : ret; in v4l2_async_notifier_fwnode_parse_endpoint()
854 return -EINVAL; in __v4l2_async_notifier_parse_fwnode_ep()
904 * v4l2_fwnode_reference_parse - parse references for async sub-devices
910 * -ENOENT if no entries were found
911 * -ENOMEM if memory allocation failed
912 * -EINVAL if property parsing failed
930 return -ENOENT; in v4l2_fwnode_reference_parse()
933 * Note that right now both -ENODATA and -ENOENT may signal in v4l2_fwnode_reference_parse()
934 * out-of-bounds access. Return the error in cases other than that. in v4l2_fwnode_reference_parse()
936 if (ret != -ENOENT && ret != -ENODATA) in v4l2_fwnode_reference_parse()
951 if (PTR_ERR(asd) == -EEXIST) in v4l2_fwnode_reference_parse()
962 * v4l2_fwnode_reference_get_int_prop - parse a reference with integer
992 * Documentation/firmware-guide/acpi/dsd/ instead and especially graph.txt,
993 * data-node-references.txt and leds.txt .
1000 * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
1007 * ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
1013 * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
1017 * ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
1023 * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
1027 * "remote-endpoint",
1042 * ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
1049 * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
1053 * ToUUID("dbb8e3e6-5886-4ba6-8795-1319f52a966b"),
1060 * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
1064 * "remote-endpoint",
1079 * @prop: "remote-endpoint"
1098 * remote-endpoint = <&isp 4 0>;
1109 * remote-endpoint = <&cam 0 0>;
1116 * -ENOENT if no entries (or the property itself) were found
1117 * -EINVAL if property parsing otherwise failed
1118 * -ENOMEM if memory allocation failed
1135 * Note that right now both -ENODATA and -ENOENT may signal in v4l2_fwnode_reference_get_int_prop()
1136 * out-of-bounds access. Return -ENOENT in that case. in v4l2_fwnode_reference_get_int_prop()
1141 return ERR_PTR(ret == -ENODATA ? -ENOENT : ret); in v4l2_fwnode_reference_get_int_prop()
1148 while (nprops--) { in v4l2_fwnode_reference_get_int_prop()
1165 fwnode = ERR_PTR(-ENOENT); in v4l2_fwnode_reference_get_int_prop()
1184 * v4l2_fwnode_reference_parse_int_props - parse references for async
1185 * sub-devices
1194 * @props. Then, set up V4L2 async sub-devices for those fwnodes in the notifier
1202 * -ENOENT if no entries (or the property itself) were found
1203 * -EINVAL if property parsing otherwisefailed
1204 * -ENOMEM if memory allocation failed
1214 const char *prop = p->name; in v4l2_fwnode_reference_parse_int_props()
1215 const char * const *props = p->props; in v4l2_fwnode_reference_parse_int_props()
1216 unsigned int nprops = p->nprops; in v4l2_fwnode_reference_parse_int_props()
1225 * Note that right now both -ENODATA and -ENOENT may in v4l2_fwnode_reference_parse_int_props()
1226 * signal out-of-bounds access. Return the error in in v4l2_fwnode_reference_parse_int_props()
1229 if (PTR_ERR(fwnode) != -ENOENT && in v4l2_fwnode_reference_parse_int_props()
1230 PTR_ERR(fwnode) != -ENODATA) in v4l2_fwnode_reference_parse_int_props()
1252 if (ret == -EEXIST) in v4l2_fwnode_reference_parse_int_props()
1259 return !fwnode || PTR_ERR(fwnode) == -ENOENT ? 0 : PTR_ERR(fwnode); in v4l2_fwnode_reference_parse_int_props()
1263 * v4l2_async_notifier_parse_fwnode_sensor - parse common references on
1264 * sensors for async sub-devices
1269 * sensor and set up async sub-devices for them.
1273 * sub-devices are no longer in use, even in the case the function returned an
1277 * -ENOMEM if memory allocation failed
1278 * -EINVAL if property parsing failed
1286 { "flash-leds", led_props, ARRAY_SIZE(led_props) }, in v4l2_async_notifier_parse_fwnode_sensor()
1287 { "lens-focus", NULL, 0 }, in v4l2_async_notifier_parse_fwnode_sensor()
1301 if (ret && ret != -ENOENT) { in v4l2_async_notifier_parse_fwnode_sensor()
1316 if (WARN_ON(!sd->dev)) in v4l2_async_register_subdev_sensor()
1317 return -ENODEV; in v4l2_async_register_subdev_sensor()
1321 return -ENOMEM; in v4l2_async_register_subdev_sensor()
1325 ret = v4l2_async_notifier_parse_fwnode_sensor(sd->dev, notifier); in v4l2_async_register_subdev_sensor()
1337 sd->subdev_notifier = notifier; in v4l2_async_register_subdev_sensor()