Lines Matching full:sensor
46 * Do not add an entry for a sensor that is not actually supported.
132 /* camera sensor depends on IVSC in DSDT if exist */ in ipu_bridge_get_ivsc_acpi_dev()
176 static int ipu_bridge_check_ivsc_dev(struct ipu_sensor *sensor, in ipu_bridge_check_ivsc_dev() argument
191 sensor->csi_dev = csi_dev; in ipu_bridge_check_ivsc_dev()
192 sensor->ivsc_adev = adev; in ipu_bridge_check_ivsc_dev()
286 int ipu_bridge_parse_ssdb(struct acpi_device *adev, struct ipu_sensor *sensor) in ipu_bridge_parse_ssdb() argument
305 sensor->link = ssdb.link; in ipu_bridge_parse_ssdb()
306 sensor->lanes = ssdb.lanes; in ipu_bridge_parse_ssdb()
307 sensor->mclkspeed = ssdb.mclkspeed; in ipu_bridge_parse_ssdb()
308 sensor->rotation = ipu_bridge_parse_rotation(adev, &ssdb); in ipu_bridge_parse_ssdb()
309 sensor->orientation = ipu_bridge_parse_orientation(adev); in ipu_bridge_parse_ssdb()
312 sensor->vcm_type = ipu_vcm_types[ssdb.vcmtype - 1]; in ipu_bridge_parse_ssdb()
319 struct ipu_sensor *sensor, in ipu_bridge_create_fwnode_properties() argument
323 struct ipu_property_names *names = &sensor->prop_names; in ipu_bridge_create_fwnode_properties()
324 struct software_node *nodes = sensor->swnodes; in ipu_bridge_create_fwnode_properties()
326 sensor->prop_names = prop_names; in ipu_bridge_create_fwnode_properties()
328 if (sensor->csi_dev) { in ipu_bridge_create_fwnode_properties()
329 sensor->local_ref[0] = in ipu_bridge_create_fwnode_properties()
331 sensor->remote_ref[0] = in ipu_bridge_create_fwnode_properties()
333 sensor->ivsc_sensor_ref[0] = in ipu_bridge_create_fwnode_properties()
335 sensor->ivsc_ipu_ref[0] = in ipu_bridge_create_fwnode_properties()
338 sensor->ivsc_sensor_ep_properties[0] = in ipu_bridge_create_fwnode_properties()
341 sensor->ivsc_sensor_ep_properties[1] = in ipu_bridge_create_fwnode_properties()
344 sensor->lanes); in ipu_bridge_create_fwnode_properties()
345 sensor->ivsc_sensor_ep_properties[2] = in ipu_bridge_create_fwnode_properties()
347 sensor->ivsc_sensor_ref); in ipu_bridge_create_fwnode_properties()
349 sensor->ivsc_ipu_ep_properties[0] = in ipu_bridge_create_fwnode_properties()
352 sensor->ivsc_ipu_ep_properties[1] = in ipu_bridge_create_fwnode_properties()
355 sensor->lanes); in ipu_bridge_create_fwnode_properties()
356 sensor->ivsc_ipu_ep_properties[2] = in ipu_bridge_create_fwnode_properties()
358 sensor->ivsc_ipu_ref); in ipu_bridge_create_fwnode_properties()
360 sensor->local_ref[0] = in ipu_bridge_create_fwnode_properties()
362 sensor->remote_ref[0] = in ipu_bridge_create_fwnode_properties()
366 sensor->dev_properties[0] = PROPERTY_ENTRY_U32( in ipu_bridge_create_fwnode_properties()
367 sensor->prop_names.clock_frequency, in ipu_bridge_create_fwnode_properties()
368 sensor->mclkspeed); in ipu_bridge_create_fwnode_properties()
369 sensor->dev_properties[1] = PROPERTY_ENTRY_U32( in ipu_bridge_create_fwnode_properties()
370 sensor->prop_names.rotation, in ipu_bridge_create_fwnode_properties()
371 sensor->rotation); in ipu_bridge_create_fwnode_properties()
372 sensor->dev_properties[2] = PROPERTY_ENTRY_U32( in ipu_bridge_create_fwnode_properties()
373 sensor->prop_names.orientation, in ipu_bridge_create_fwnode_properties()
374 sensor->orientation); in ipu_bridge_create_fwnode_properties()
375 if (sensor->vcm_type) { in ipu_bridge_create_fwnode_properties()
376 sensor->vcm_ref[0] = in ipu_bridge_create_fwnode_properties()
377 SOFTWARE_NODE_REFERENCE(&sensor->swnodes[SWNODE_VCM]); in ipu_bridge_create_fwnode_properties()
378 sensor->dev_properties[3] = in ipu_bridge_create_fwnode_properties()
379 PROPERTY_ENTRY_REF_ARRAY("lens-focus", sensor->vcm_ref); in ipu_bridge_create_fwnode_properties()
382 sensor->ep_properties[0] = PROPERTY_ENTRY_U32( in ipu_bridge_create_fwnode_properties()
383 sensor->prop_names.bus_type, in ipu_bridge_create_fwnode_properties()
385 sensor->ep_properties[1] = PROPERTY_ENTRY_U32_ARRAY_LEN( in ipu_bridge_create_fwnode_properties()
386 sensor->prop_names.data_lanes, in ipu_bridge_create_fwnode_properties()
387 bridge->data_lanes, sensor->lanes); in ipu_bridge_create_fwnode_properties()
388 sensor->ep_properties[2] = PROPERTY_ENTRY_REF_ARRAY( in ipu_bridge_create_fwnode_properties()
389 sensor->prop_names.remote_endpoint, in ipu_bridge_create_fwnode_properties()
390 sensor->local_ref); in ipu_bridge_create_fwnode_properties()
393 sensor->ep_properties[3] = PROPERTY_ENTRY_U64_ARRAY_LEN( in ipu_bridge_create_fwnode_properties()
394 sensor->prop_names.link_frequencies, in ipu_bridge_create_fwnode_properties()
398 sensor->ipu_properties[0] = PROPERTY_ENTRY_U32_ARRAY_LEN( in ipu_bridge_create_fwnode_properties()
399 sensor->prop_names.data_lanes, in ipu_bridge_create_fwnode_properties()
400 bridge->data_lanes, sensor->lanes); in ipu_bridge_create_fwnode_properties()
401 sensor->ipu_properties[1] = PROPERTY_ENTRY_REF_ARRAY( in ipu_bridge_create_fwnode_properties()
402 sensor->prop_names.remote_endpoint, in ipu_bridge_create_fwnode_properties()
403 sensor->remote_ref); in ipu_bridge_create_fwnode_properties()
406 static void ipu_bridge_init_swnode_names(struct ipu_sensor *sensor) in ipu_bridge_init_swnode_names() argument
408 snprintf(sensor->node_names.remote_port, in ipu_bridge_init_swnode_names()
409 sizeof(sensor->node_names.remote_port), in ipu_bridge_init_swnode_names()
410 SWNODE_GRAPH_PORT_NAME_FMT, sensor->link); in ipu_bridge_init_swnode_names()
411 snprintf(sensor->node_names.port, in ipu_bridge_init_swnode_names()
412 sizeof(sensor->node_names.port), in ipu_bridge_init_swnode_names()
414 snprintf(sensor->node_names.endpoint, in ipu_bridge_init_swnode_names()
415 sizeof(sensor->node_names.endpoint), in ipu_bridge_init_swnode_names()
417 if (sensor->vcm_type) { in ipu_bridge_init_swnode_names()
419 snprintf(sensor->node_names.vcm, sizeof(sensor->node_names.vcm), in ipu_bridge_init_swnode_names()
420 "%s-%u", sensor->vcm_type, sensor->link); in ipu_bridge_init_swnode_names()
423 if (sensor->csi_dev) { in ipu_bridge_init_swnode_names()
424 snprintf(sensor->node_names.ivsc_sensor_port, in ipu_bridge_init_swnode_names()
425 sizeof(sensor->node_names.ivsc_sensor_port), in ipu_bridge_init_swnode_names()
427 snprintf(sensor->node_names.ivsc_ipu_port, in ipu_bridge_init_swnode_names()
428 sizeof(sensor->node_names.ivsc_ipu_port), in ipu_bridge_init_swnode_names()
433 static void ipu_bridge_init_swnode_group(struct ipu_sensor *sensor) in ipu_bridge_init_swnode_group() argument
435 struct software_node *nodes = sensor->swnodes; in ipu_bridge_init_swnode_group()
437 sensor->group[SWNODE_SENSOR_HID] = &nodes[SWNODE_SENSOR_HID]; in ipu_bridge_init_swnode_group()
438 sensor->group[SWNODE_SENSOR_PORT] = &nodes[SWNODE_SENSOR_PORT]; in ipu_bridge_init_swnode_group()
439 sensor->group[SWNODE_SENSOR_ENDPOINT] = &nodes[SWNODE_SENSOR_ENDPOINT]; in ipu_bridge_init_swnode_group()
440 sensor->group[SWNODE_IPU_PORT] = &nodes[SWNODE_IPU_PORT]; in ipu_bridge_init_swnode_group()
441 sensor->group[SWNODE_IPU_ENDPOINT] = &nodes[SWNODE_IPU_ENDPOINT]; in ipu_bridge_init_swnode_group()
442 if (sensor->vcm_type) in ipu_bridge_init_swnode_group()
443 sensor->group[SWNODE_VCM] = &nodes[SWNODE_VCM]; in ipu_bridge_init_swnode_group()
445 if (sensor->csi_dev) { in ipu_bridge_init_swnode_group()
446 sensor->group[SWNODE_IVSC_HID] = in ipu_bridge_init_swnode_group()
448 sensor->group[SWNODE_IVSC_SENSOR_PORT] = in ipu_bridge_init_swnode_group()
450 sensor->group[SWNODE_IVSC_SENSOR_ENDPOINT] = in ipu_bridge_init_swnode_group()
452 sensor->group[SWNODE_IVSC_IPU_PORT] = in ipu_bridge_init_swnode_group()
454 sensor->group[SWNODE_IVSC_IPU_ENDPOINT] = in ipu_bridge_init_swnode_group()
457 if (sensor->vcm_type) in ipu_bridge_init_swnode_group()
458 sensor->group[SWNODE_VCM] = &nodes[SWNODE_VCM]; in ipu_bridge_init_swnode_group()
460 if (sensor->vcm_type) in ipu_bridge_init_swnode_group()
461 sensor->group[SWNODE_IVSC_HID] = &nodes[SWNODE_VCM]; in ipu_bridge_init_swnode_group()
466 struct ipu_sensor *sensor) in ipu_bridge_create_connection_swnodes() argument
468 struct ipu_node_names *names = &sensor->node_names; in ipu_bridge_create_connection_swnodes()
469 struct software_node *nodes = sensor->swnodes; in ipu_bridge_create_connection_swnodes()
471 ipu_bridge_init_swnode_names(sensor); in ipu_bridge_create_connection_swnodes()
473 nodes[SWNODE_SENSOR_HID] = NODE_SENSOR(sensor->name, in ipu_bridge_create_connection_swnodes()
474 sensor->dev_properties); in ipu_bridge_create_connection_swnodes()
475 nodes[SWNODE_SENSOR_PORT] = NODE_PORT(sensor->node_names.port, in ipu_bridge_create_connection_swnodes()
478 sensor->node_names.endpoint, in ipu_bridge_create_connection_swnodes()
480 sensor->ep_properties); in ipu_bridge_create_connection_swnodes()
481 nodes[SWNODE_IPU_PORT] = NODE_PORT(sensor->node_names.remote_port, in ipu_bridge_create_connection_swnodes()
484 sensor->node_names.endpoint, in ipu_bridge_create_connection_swnodes()
486 sensor->ipu_properties); in ipu_bridge_create_connection_swnodes()
488 if (sensor->csi_dev) { in ipu_bridge_create_connection_swnodes()
491 device_hid = acpi_device_hid(sensor->ivsc_adev); in ipu_bridge_create_connection_swnodes()
493 snprintf(sensor->ivsc_name, sizeof(sensor->ivsc_name), "%s-%u", in ipu_bridge_create_connection_swnodes()
494 device_hid, sensor->link); in ipu_bridge_create_connection_swnodes()
496 nodes[SWNODE_IVSC_HID] = NODE_SENSOR(sensor->ivsc_name, in ipu_bridge_create_connection_swnodes()
497 sensor->ivsc_properties); in ipu_bridge_create_connection_swnodes()
504 sensor->ivsc_sensor_ep_properties); in ipu_bridge_create_connection_swnodes()
511 sensor->ivsc_ipu_ep_properties); in ipu_bridge_create_connection_swnodes()
514 nodes[SWNODE_VCM] = NODE_VCM(sensor->node_names.vcm); in ipu_bridge_create_connection_swnodes()
516 ipu_bridge_init_swnode_group(sensor); in ipu_bridge_create_connection_swnodes()
525 struct device *sensor; member
535 struct acpi_device *adev = ACPI_COMPANION(data->sensor); in ipu_bridge_instantiate_vcm_work()
542 * make sure the sensor is powered-up during probe. in ipu_bridge_instantiate_vcm_work()
544 ret = pm_runtime_get_sync(data->sensor); in ipu_bridge_instantiate_vcm_work()
546 dev_err(data->sensor, "Error %d runtime-resuming sensor, cannot instantiate VCM\n", in ipu_bridge_instantiate_vcm_work()
558 dev_err(data->sensor, "Error instantiating VCM client: %ld\n", in ipu_bridge_instantiate_vcm_work()
563 device_link_add(&vcm_client->dev, data->sensor, DL_FLAG_PM_RUNTIME); in ipu_bridge_instantiate_vcm_work()
565 dev_info(data->sensor, "Instantiated %s VCM\n", data->board_info.type); in ipu_bridge_instantiate_vcm_work()
569 pm_runtime_put(data->sensor); in ipu_bridge_instantiate_vcm_work()
570 put_device(data->sensor); in ipu_bridge_instantiate_vcm_work()
576 int ipu_bridge_instantiate_vcm(struct device *sensor) in ipu_bridge_instantiate_vcm() argument
584 adev = ACPI_COMPANION(sensor); in ipu_bridge_instantiate_vcm()
588 vcm_fwnode = fwnode_find_reference(dev_fwnode(sensor), "lens-focus", 0); in ipu_bridge_instantiate_vcm()
607 data->sensor = get_device(sensor); in ipu_bridge_instantiate_vcm()
624 static int ipu_bridge_instantiate_ivsc(struct ipu_sensor *sensor) in ipu_bridge_instantiate_ivsc() argument
628 if (!sensor->csi_dev) in ipu_bridge_instantiate_ivsc()
631 fwnode = software_node_fwnode(&sensor->swnodes[SWNODE_IVSC_HID]); in ipu_bridge_instantiate_ivsc()
635 set_secondary_fwnode(sensor->csi_dev, fwnode); in ipu_bridge_instantiate_ivsc()
642 struct ipu_sensor *sensor; in ipu_bridge_unregister_sensors() local
646 sensor = &bridge->sensors[i]; in ipu_bridge_unregister_sensors()
647 software_node_unregister_node_group(sensor->group); in ipu_bridge_unregister_sensors()
648 acpi_dev_put(sensor->adev); in ipu_bridge_unregister_sensors()
649 put_device(sensor->csi_dev); in ipu_bridge_unregister_sensors()
650 acpi_dev_put(sensor->ivsc_adev); in ipu_bridge_unregister_sensors()
658 struct ipu_sensor *sensor; in ipu_bridge_connect_sensor() local
672 sensor = &bridge->sensors[bridge->n_sensors]; in ipu_bridge_connect_sensor()
674 ret = bridge->parse_sensor_fwnode(adev, sensor); in ipu_bridge_connect_sensor()
678 snprintf(sensor->name, sizeof(sensor->name), "%s-%u", in ipu_bridge_connect_sensor()
679 cfg->hid, sensor->link); in ipu_bridge_connect_sensor()
681 ret = ipu_bridge_check_ivsc_dev(sensor, adev); in ipu_bridge_connect_sensor()
685 ipu_bridge_create_fwnode_properties(sensor, bridge, cfg); in ipu_bridge_connect_sensor()
686 ipu_bridge_create_connection_swnodes(bridge, sensor); in ipu_bridge_connect_sensor()
688 ret = software_node_register_node_group(sensor->group); in ipu_bridge_connect_sensor()
692 fwnode = software_node_fwnode(&sensor->swnodes[ in ipu_bridge_connect_sensor()
699 sensor->adev = ACPI_PTR(acpi_dev_get(adev)); in ipu_bridge_connect_sensor()
704 ret = ipu_bridge_instantiate_ivsc(sensor); in ipu_bridge_connect_sensor()
708 dev_info(bridge->dev, "Found supported sensor %s\n", in ipu_bridge_connect_sensor()
717 software_node_unregister_node_group(sensor->group); in ipu_bridge_connect_sensor()
719 put_device(sensor->csi_dev); in ipu_bridge_connect_sensor()
720 acpi_dev_put(sensor->ivsc_adev); in ipu_bridge_connect_sensor()
830 * only need one, rather than one per sensor). We include it as a in ipu_bridge_init()