Lines Matching refs:sensor

93 static u32 cio2_bridge_parse_rotation(struct cio2_sensor *sensor)  in cio2_bridge_parse_rotation()  argument
95 switch (sensor->ssdb.degree) { in cio2_bridge_parse_rotation()
101 dev_warn(&sensor->adev->dev, in cio2_bridge_parse_rotation()
103 sensor->ssdb.degree); in cio2_bridge_parse_rotation()
108 static enum v4l2_fwnode_orientation cio2_bridge_parse_orientation(struct cio2_sensor *sensor) in cio2_bridge_parse_orientation() argument
110 switch (sensor->pld->panel) { in cio2_bridge_parse_orientation()
121 dev_warn(&sensor->adev->dev, "Unknown _PLD panel value %d\n", in cio2_bridge_parse_orientation()
122 sensor->pld->panel); in cio2_bridge_parse_orientation()
128 struct cio2_sensor *sensor, in cio2_bridge_create_fwnode_properties() argument
135 rotation = cio2_bridge_parse_rotation(sensor); in cio2_bridge_create_fwnode_properties()
136 orientation = cio2_bridge_parse_orientation(sensor); in cio2_bridge_create_fwnode_properties()
138 sensor->prop_names = prop_names; in cio2_bridge_create_fwnode_properties()
140 sensor->local_ref[0] = SOFTWARE_NODE_REFERENCE(&sensor->swnodes[SWNODE_CIO2_ENDPOINT]); in cio2_bridge_create_fwnode_properties()
141 sensor->remote_ref[0] = SOFTWARE_NODE_REFERENCE(&sensor->swnodes[SWNODE_SENSOR_ENDPOINT]); in cio2_bridge_create_fwnode_properties()
143 sensor->dev_properties[0] = PROPERTY_ENTRY_U32( in cio2_bridge_create_fwnode_properties()
144 sensor->prop_names.clock_frequency, in cio2_bridge_create_fwnode_properties()
145 sensor->ssdb.mclkspeed); in cio2_bridge_create_fwnode_properties()
146 sensor->dev_properties[1] = PROPERTY_ENTRY_U32( in cio2_bridge_create_fwnode_properties()
147 sensor->prop_names.rotation, in cio2_bridge_create_fwnode_properties()
149 sensor->dev_properties[2] = PROPERTY_ENTRY_U32( in cio2_bridge_create_fwnode_properties()
150 sensor->prop_names.orientation, in cio2_bridge_create_fwnode_properties()
152 if (sensor->ssdb.vcmtype) { in cio2_bridge_create_fwnode_properties()
153 sensor->vcm_ref[0] = in cio2_bridge_create_fwnode_properties()
154 SOFTWARE_NODE_REFERENCE(&sensor->swnodes[SWNODE_VCM]); in cio2_bridge_create_fwnode_properties()
155 sensor->dev_properties[3] = in cio2_bridge_create_fwnode_properties()
156 PROPERTY_ENTRY_REF_ARRAY("lens-focus", sensor->vcm_ref); in cio2_bridge_create_fwnode_properties()
159 sensor->ep_properties[0] = PROPERTY_ENTRY_U32( in cio2_bridge_create_fwnode_properties()
160 sensor->prop_names.bus_type, in cio2_bridge_create_fwnode_properties()
162 sensor->ep_properties[1] = PROPERTY_ENTRY_U32_ARRAY_LEN( in cio2_bridge_create_fwnode_properties()
163 sensor->prop_names.data_lanes, in cio2_bridge_create_fwnode_properties()
165 sensor->ssdb.lanes); in cio2_bridge_create_fwnode_properties()
166 sensor->ep_properties[2] = PROPERTY_ENTRY_REF_ARRAY( in cio2_bridge_create_fwnode_properties()
167 sensor->prop_names.remote_endpoint, in cio2_bridge_create_fwnode_properties()
168 sensor->local_ref); in cio2_bridge_create_fwnode_properties()
171 sensor->ep_properties[3] = PROPERTY_ENTRY_U64_ARRAY_LEN( in cio2_bridge_create_fwnode_properties()
172 sensor->prop_names.link_frequencies, in cio2_bridge_create_fwnode_properties()
176 sensor->cio2_properties[0] = PROPERTY_ENTRY_U32_ARRAY_LEN( in cio2_bridge_create_fwnode_properties()
177 sensor->prop_names.data_lanes, in cio2_bridge_create_fwnode_properties()
179 sensor->ssdb.lanes); in cio2_bridge_create_fwnode_properties()
180 sensor->cio2_properties[1] = PROPERTY_ENTRY_REF_ARRAY( in cio2_bridge_create_fwnode_properties()
181 sensor->prop_names.remote_endpoint, in cio2_bridge_create_fwnode_properties()
182 sensor->remote_ref); in cio2_bridge_create_fwnode_properties()
185 static void cio2_bridge_init_swnode_names(struct cio2_sensor *sensor) in cio2_bridge_init_swnode_names() argument
187 snprintf(sensor->node_names.remote_port, in cio2_bridge_init_swnode_names()
188 sizeof(sensor->node_names.remote_port), in cio2_bridge_init_swnode_names()
189 SWNODE_GRAPH_PORT_NAME_FMT, sensor->ssdb.link); in cio2_bridge_init_swnode_names()
190 snprintf(sensor->node_names.port, in cio2_bridge_init_swnode_names()
191 sizeof(sensor->node_names.port), in cio2_bridge_init_swnode_names()
193 snprintf(sensor->node_names.endpoint, in cio2_bridge_init_swnode_names()
194 sizeof(sensor->node_names.endpoint), in cio2_bridge_init_swnode_names()
198 static void cio2_bridge_init_swnode_group(struct cio2_sensor *sensor) in cio2_bridge_init_swnode_group() argument
200 struct software_node *nodes = sensor->swnodes; in cio2_bridge_init_swnode_group()
202 sensor->group[SWNODE_SENSOR_HID] = &nodes[SWNODE_SENSOR_HID]; in cio2_bridge_init_swnode_group()
203 sensor->group[SWNODE_SENSOR_PORT] = &nodes[SWNODE_SENSOR_PORT]; in cio2_bridge_init_swnode_group()
204 sensor->group[SWNODE_SENSOR_ENDPOINT] = &nodes[SWNODE_SENSOR_ENDPOINT]; in cio2_bridge_init_swnode_group()
205 sensor->group[SWNODE_CIO2_PORT] = &nodes[SWNODE_CIO2_PORT]; in cio2_bridge_init_swnode_group()
206 sensor->group[SWNODE_CIO2_ENDPOINT] = &nodes[SWNODE_CIO2_ENDPOINT]; in cio2_bridge_init_swnode_group()
207 if (sensor->ssdb.vcmtype) in cio2_bridge_init_swnode_group()
208 sensor->group[SWNODE_VCM] = &nodes[SWNODE_VCM]; in cio2_bridge_init_swnode_group()
212 struct cio2_sensor *sensor) in cio2_bridge_create_connection_swnodes() argument
214 struct software_node *nodes = sensor->swnodes; in cio2_bridge_create_connection_swnodes()
216 cio2_bridge_init_swnode_names(sensor); in cio2_bridge_create_connection_swnodes()
218 nodes[SWNODE_SENSOR_HID] = NODE_SENSOR(sensor->name, in cio2_bridge_create_connection_swnodes()
219 sensor->dev_properties); in cio2_bridge_create_connection_swnodes()
220 nodes[SWNODE_SENSOR_PORT] = NODE_PORT(sensor->node_names.port, in cio2_bridge_create_connection_swnodes()
223 sensor->node_names.endpoint, in cio2_bridge_create_connection_swnodes()
225 sensor->ep_properties); in cio2_bridge_create_connection_swnodes()
226 nodes[SWNODE_CIO2_PORT] = NODE_PORT(sensor->node_names.remote_port, in cio2_bridge_create_connection_swnodes()
229 sensor->node_names.endpoint, in cio2_bridge_create_connection_swnodes()
231 sensor->cio2_properties); in cio2_bridge_create_connection_swnodes()
232 if (sensor->ssdb.vcmtype) in cio2_bridge_create_connection_swnodes()
234 NODE_VCM(cio2_vcm_types[sensor->ssdb.vcmtype - 1]); in cio2_bridge_create_connection_swnodes()
236 cio2_bridge_init_swnode_group(sensor); in cio2_bridge_create_connection_swnodes()
239 static void cio2_bridge_instantiate_vcm_i2c_client(struct cio2_sensor *sensor) in cio2_bridge_instantiate_vcm_i2c_client() argument
244 if (!sensor->ssdb.vcmtype) in cio2_bridge_instantiate_vcm_i2c_client()
247 snprintf(name, sizeof(name), "%s-VCM", acpi_dev_name(sensor->adev)); in cio2_bridge_instantiate_vcm_i2c_client()
249 strscpy(board_info.type, cio2_vcm_types[sensor->ssdb.vcmtype - 1], in cio2_bridge_instantiate_vcm_i2c_client()
251 board_info.swnode = &sensor->swnodes[SWNODE_VCM]; in cio2_bridge_instantiate_vcm_i2c_client()
253 sensor->vcm_i2c_client = in cio2_bridge_instantiate_vcm_i2c_client()
254 i2c_acpi_new_device_by_fwnode(acpi_fwnode_handle(sensor->adev), in cio2_bridge_instantiate_vcm_i2c_client()
256 if (IS_ERR(sensor->vcm_i2c_client)) { in cio2_bridge_instantiate_vcm_i2c_client()
257 dev_warn(&sensor->adev->dev, "Error instantiation VCM i2c-client: %ld\n", in cio2_bridge_instantiate_vcm_i2c_client()
258 PTR_ERR(sensor->vcm_i2c_client)); in cio2_bridge_instantiate_vcm_i2c_client()
259 sensor->vcm_i2c_client = NULL; in cio2_bridge_instantiate_vcm_i2c_client()
265 struct cio2_sensor *sensor; in cio2_bridge_unregister_sensors() local
269 sensor = &bridge->sensors[i]; in cio2_bridge_unregister_sensors()
270 software_node_unregister_node_group(sensor->group); in cio2_bridge_unregister_sensors()
271 ACPI_FREE(sensor->pld); in cio2_bridge_unregister_sensors()
272 acpi_dev_put(sensor->adev); in cio2_bridge_unregister_sensors()
273 i2c_unregister_device(sensor->vcm_i2c_client); in cio2_bridge_unregister_sensors()
282 struct cio2_sensor *sensor; in cio2_bridge_connect_sensor() local
297 sensor = &bridge->sensors[bridge->n_sensors]; in cio2_bridge_connect_sensor()
298 strscpy(sensor->name, cfg->hid, sizeof(sensor->name)); in cio2_bridge_connect_sensor()
301 &sensor->ssdb, in cio2_bridge_connect_sensor()
302 sizeof(sensor->ssdb)); in cio2_bridge_connect_sensor()
306 if (sensor->ssdb.vcmtype > ARRAY_SIZE(cio2_vcm_types)) { in cio2_bridge_connect_sensor()
308 sensor->ssdb.vcmtype); in cio2_bridge_connect_sensor()
309 sensor->ssdb.vcmtype = 0; in cio2_bridge_connect_sensor()
312 status = acpi_get_physical_device_location(adev->handle, &sensor->pld); in cio2_bridge_connect_sensor()
318 if (sensor->ssdb.lanes > CIO2_MAX_LANES) { in cio2_bridge_connect_sensor()
325 cio2_bridge_create_fwnode_properties(sensor, bridge, cfg); in cio2_bridge_connect_sensor()
326 cio2_bridge_create_connection_swnodes(bridge, sensor); in cio2_bridge_connect_sensor()
328 ret = software_node_register_node_group(sensor->group); in cio2_bridge_connect_sensor()
332 fwnode = software_node_fwnode(&sensor->swnodes[ in cio2_bridge_connect_sensor()
339 sensor->adev = acpi_dev_get(adev); in cio2_bridge_connect_sensor()
344 cio2_bridge_instantiate_vcm_i2c_client(sensor); in cio2_bridge_connect_sensor()
355 software_node_unregister_node_group(sensor->group); in cio2_bridge_connect_sensor()
357 ACPI_FREE(sensor->pld); in cio2_bridge_connect_sensor()