Lines Matching +full:link +full:- +full:frequencies

1 // SPDX-License-Identifier: GPL-2.0
8 #include <media/v4l2-fwnode.h>
10 #include "cio2-bridge.h"
14 * plus the number of link-frequencies expected by their drivers, along with
30 .clock_frequency = "clock-frequency",
32 .bus_type = "bus-type",
33 .data_lanes = "data-lanes",
34 .remote_endpoint = "remote-endpoint",
35 .link_frequencies = "link-frequencies",
46 status = acpi_evaluate_object(adev->handle, id, NULL, &buffer); in cio2_bridge_read_acpi_buffer()
48 return -ENODEV; in cio2_bridge_read_acpi_buffer()
52 dev_err(&adev->dev, "Couldn't locate ACPI buffer\n"); in cio2_bridge_read_acpi_buffer()
53 return -ENODEV; in cio2_bridge_read_acpi_buffer()
56 if (obj->type != ACPI_TYPE_BUFFER) { in cio2_bridge_read_acpi_buffer()
57 dev_err(&adev->dev, "Not an ACPI buffer\n"); in cio2_bridge_read_acpi_buffer()
58 ret = -ENODEV; in cio2_bridge_read_acpi_buffer()
62 if (obj->buffer.length > size) { in cio2_bridge_read_acpi_buffer()
63 dev_err(&adev->dev, "Given buffer is too small\n"); in cio2_bridge_read_acpi_buffer()
64 ret = -EINVAL; in cio2_bridge_read_acpi_buffer()
68 memcpy(data, obj->buffer.pointer, obj->buffer.length); in cio2_bridge_read_acpi_buffer()
80 sensor->prop_names = prop_names; in cio2_bridge_create_fwnode_properties()
82 sensor->local_ref[0] = SOFTWARE_NODE_REFERENCE(&sensor->swnodes[SWNODE_CIO2_ENDPOINT]); in cio2_bridge_create_fwnode_properties()
83 sensor->remote_ref[0] = SOFTWARE_NODE_REFERENCE(&sensor->swnodes[SWNODE_SENSOR_ENDPOINT]); in cio2_bridge_create_fwnode_properties()
85 sensor->dev_properties[0] = PROPERTY_ENTRY_U32( in cio2_bridge_create_fwnode_properties()
86 sensor->prop_names.clock_frequency, in cio2_bridge_create_fwnode_properties()
87 sensor->ssdb.mclkspeed); in cio2_bridge_create_fwnode_properties()
88 sensor->dev_properties[1] = PROPERTY_ENTRY_U8( in cio2_bridge_create_fwnode_properties()
89 sensor->prop_names.rotation, in cio2_bridge_create_fwnode_properties()
90 sensor->ssdb.degree); in cio2_bridge_create_fwnode_properties()
92 sensor->ep_properties[0] = PROPERTY_ENTRY_U32( in cio2_bridge_create_fwnode_properties()
93 sensor->prop_names.bus_type, in cio2_bridge_create_fwnode_properties()
95 sensor->ep_properties[1] = PROPERTY_ENTRY_U32_ARRAY_LEN( in cio2_bridge_create_fwnode_properties()
96 sensor->prop_names.data_lanes, in cio2_bridge_create_fwnode_properties()
97 bridge->data_lanes, in cio2_bridge_create_fwnode_properties()
98 sensor->ssdb.lanes); in cio2_bridge_create_fwnode_properties()
99 sensor->ep_properties[2] = PROPERTY_ENTRY_REF_ARRAY( in cio2_bridge_create_fwnode_properties()
100 sensor->prop_names.remote_endpoint, in cio2_bridge_create_fwnode_properties()
101 sensor->local_ref); in cio2_bridge_create_fwnode_properties()
103 if (cfg->nr_link_freqs > 0) in cio2_bridge_create_fwnode_properties()
104 sensor->ep_properties[3] = PROPERTY_ENTRY_U64_ARRAY_LEN( in cio2_bridge_create_fwnode_properties()
105 sensor->prop_names.link_frequencies, in cio2_bridge_create_fwnode_properties()
106 cfg->link_freqs, in cio2_bridge_create_fwnode_properties()
107 cfg->nr_link_freqs); in cio2_bridge_create_fwnode_properties()
109 sensor->cio2_properties[0] = PROPERTY_ENTRY_U32_ARRAY_LEN( in cio2_bridge_create_fwnode_properties()
110 sensor->prop_names.data_lanes, in cio2_bridge_create_fwnode_properties()
111 bridge->data_lanes, in cio2_bridge_create_fwnode_properties()
112 sensor->ssdb.lanes); in cio2_bridge_create_fwnode_properties()
113 sensor->cio2_properties[1] = PROPERTY_ENTRY_REF_ARRAY( in cio2_bridge_create_fwnode_properties()
114 sensor->prop_names.remote_endpoint, in cio2_bridge_create_fwnode_properties()
115 sensor->remote_ref); in cio2_bridge_create_fwnode_properties()
120 snprintf(sensor->node_names.remote_port, in cio2_bridge_init_swnode_names()
121 sizeof(sensor->node_names.remote_port), in cio2_bridge_init_swnode_names()
122 SWNODE_GRAPH_PORT_NAME_FMT, sensor->ssdb.link); in cio2_bridge_init_swnode_names()
123 snprintf(sensor->node_names.port, in cio2_bridge_init_swnode_names()
124 sizeof(sensor->node_names.port), in cio2_bridge_init_swnode_names()
126 snprintf(sensor->node_names.endpoint, in cio2_bridge_init_swnode_names()
127 sizeof(sensor->node_names.endpoint), in cio2_bridge_init_swnode_names()
134 struct software_node *nodes = sensor->swnodes; in cio2_bridge_create_connection_swnodes()
138 nodes[SWNODE_SENSOR_HID] = NODE_SENSOR(sensor->name, in cio2_bridge_create_connection_swnodes()
139 sensor->dev_properties); in cio2_bridge_create_connection_swnodes()
140 nodes[SWNODE_SENSOR_PORT] = NODE_PORT(sensor->node_names.port, in cio2_bridge_create_connection_swnodes()
143 sensor->node_names.endpoint, in cio2_bridge_create_connection_swnodes()
145 sensor->ep_properties); in cio2_bridge_create_connection_swnodes()
146 nodes[SWNODE_CIO2_PORT] = NODE_PORT(sensor->node_names.remote_port, in cio2_bridge_create_connection_swnodes()
147 &bridge->cio2_hid_node); in cio2_bridge_create_connection_swnodes()
149 sensor->node_names.endpoint, in cio2_bridge_create_connection_swnodes()
151 sensor->cio2_properties); in cio2_bridge_create_connection_swnodes()
159 for (i = 0; i < bridge->n_sensors; i++) { in cio2_bridge_unregister_sensors()
160 sensor = &bridge->sensors[i]; in cio2_bridge_unregister_sensors()
161 software_node_unregister_nodes(sensor->swnodes); in cio2_bridge_unregister_sensors()
162 acpi_dev_put(sensor->adev); in cio2_bridge_unregister_sensors()
175 for_each_acpi_dev_match(adev, cfg->hid, NULL, -1) { in cio2_bridge_connect_sensor()
176 if (!adev->status.enabled) in cio2_bridge_connect_sensor()
179 if (bridge->n_sensors >= CIO2_NUM_PORTS) { in cio2_bridge_connect_sensor()
181 dev_err(&cio2->dev, "Exceeded available CIO2 ports\n"); in cio2_bridge_connect_sensor()
182 return -EINVAL; in cio2_bridge_connect_sensor()
185 sensor = &bridge->sensors[bridge->n_sensors]; in cio2_bridge_connect_sensor()
186 strscpy(sensor->name, cfg->hid, sizeof(sensor->name)); in cio2_bridge_connect_sensor()
189 &sensor->ssdb, in cio2_bridge_connect_sensor()
190 sizeof(sensor->ssdb)); in cio2_bridge_connect_sensor()
194 if (sensor->ssdb.lanes > CIO2_MAX_LANES) { in cio2_bridge_connect_sensor()
195 dev_err(&adev->dev, in cio2_bridge_connect_sensor()
197 ret = -EINVAL; in cio2_bridge_connect_sensor()
204 ret = software_node_register_nodes(sensor->swnodes); in cio2_bridge_connect_sensor()
208 fwnode = software_node_fwnode(&sensor->swnodes[ in cio2_bridge_connect_sensor()
211 ret = -ENODEV; in cio2_bridge_connect_sensor()
215 sensor->adev = acpi_dev_get(adev); in cio2_bridge_connect_sensor()
216 adev->fwnode.secondary = fwnode; in cio2_bridge_connect_sensor()
218 dev_info(&cio2->dev, "Found supported sensor %s\n", in cio2_bridge_connect_sensor()
221 bridge->n_sensors++; in cio2_bridge_connect_sensor()
227 software_node_unregister_nodes(sensor->swnodes); in cio2_bridge_connect_sensor()
257 struct device *dev = &cio2->dev; in cio2_bridge_init()
265 return -ENOMEM; in cio2_bridge_init()
267 strscpy(bridge->cio2_node_name, CIO2_HID, in cio2_bridge_init()
268 sizeof(bridge->cio2_node_name)); in cio2_bridge_init()
269 bridge->cio2_hid_node.name = bridge->cio2_node_name; in cio2_bridge_init()
271 ret = software_node_register(&bridge->cio2_hid_node); in cio2_bridge_init()
285 bridge->data_lanes[i] = i + 1; in cio2_bridge_init()
288 if (ret || bridge->n_sensors == 0) in cio2_bridge_init()
291 dev_info(dev, "Connected %d cameras\n", bridge->n_sensors); in cio2_bridge_init()
293 fwnode = software_node_fwnode(&bridge->cio2_hid_node); in cio2_bridge_init()
296 ret = -ENODEV; in cio2_bridge_init()
307 software_node_unregister(&bridge->cio2_hid_node); in cio2_bridge_init()