Lines Matching full:sensor

21  * Do not add an entry for a sensor that is not actually supported.
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()
199 struct cio2_sensor *sensor) in cio2_bridge_create_connection_swnodes() argument
201 struct software_node *nodes = sensor->swnodes; in cio2_bridge_create_connection_swnodes()
203 cio2_bridge_init_swnode_names(sensor); in cio2_bridge_create_connection_swnodes()
205 nodes[SWNODE_SENSOR_HID] = NODE_SENSOR(sensor->name, in cio2_bridge_create_connection_swnodes()
206 sensor->dev_properties); in cio2_bridge_create_connection_swnodes()
207 nodes[SWNODE_SENSOR_PORT] = NODE_PORT(sensor->node_names.port, in cio2_bridge_create_connection_swnodes()
210 sensor->node_names.endpoint, in cio2_bridge_create_connection_swnodes()
212 sensor->ep_properties); in cio2_bridge_create_connection_swnodes()
213 nodes[SWNODE_CIO2_PORT] = NODE_PORT(sensor->node_names.remote_port, in cio2_bridge_create_connection_swnodes()
216 sensor->node_names.endpoint, in cio2_bridge_create_connection_swnodes()
218 sensor->cio2_properties); in cio2_bridge_create_connection_swnodes()
219 if (sensor->ssdb.vcmtype) in cio2_bridge_create_connection_swnodes()
221 NODE_VCM(cio2_vcm_types[sensor->ssdb.vcmtype - 1]); in cio2_bridge_create_connection_swnodes()
224 static void cio2_bridge_instantiate_vcm_i2c_client(struct cio2_sensor *sensor) in cio2_bridge_instantiate_vcm_i2c_client() argument
229 if (!sensor->ssdb.vcmtype) in cio2_bridge_instantiate_vcm_i2c_client()
232 snprintf(name, sizeof(name), "%s-VCM", acpi_dev_name(sensor->adev)); in cio2_bridge_instantiate_vcm_i2c_client()
234 strscpy(board_info.type, cio2_vcm_types[sensor->ssdb.vcmtype - 1], in cio2_bridge_instantiate_vcm_i2c_client()
236 board_info.swnode = &sensor->swnodes[SWNODE_VCM]; in cio2_bridge_instantiate_vcm_i2c_client()
238 sensor->vcm_i2c_client = in cio2_bridge_instantiate_vcm_i2c_client()
239 i2c_acpi_new_device_by_fwnode(acpi_fwnode_handle(sensor->adev), in cio2_bridge_instantiate_vcm_i2c_client()
241 if (IS_ERR(sensor->vcm_i2c_client)) { in cio2_bridge_instantiate_vcm_i2c_client()
242 dev_warn(&sensor->adev->dev, "Error instantiation VCM i2c-client: %ld\n", in cio2_bridge_instantiate_vcm_i2c_client()
243 PTR_ERR(sensor->vcm_i2c_client)); in cio2_bridge_instantiate_vcm_i2c_client()
244 sensor->vcm_i2c_client = NULL; in cio2_bridge_instantiate_vcm_i2c_client()
250 struct cio2_sensor *sensor; in cio2_bridge_unregister_sensors() local
254 sensor = &bridge->sensors[i]; in cio2_bridge_unregister_sensors()
255 software_node_unregister_nodes(sensor->swnodes); in cio2_bridge_unregister_sensors()
256 ACPI_FREE(sensor->pld); in cio2_bridge_unregister_sensors()
257 acpi_dev_put(sensor->adev); in cio2_bridge_unregister_sensors()
258 i2c_unregister_device(sensor->vcm_i2c_client); in cio2_bridge_unregister_sensors()
267 struct cio2_sensor *sensor; in cio2_bridge_connect_sensor() local
282 sensor = &bridge->sensors[bridge->n_sensors]; in cio2_bridge_connect_sensor()
283 strscpy(sensor->name, cfg->hid, sizeof(sensor->name)); in cio2_bridge_connect_sensor()
286 &sensor->ssdb, in cio2_bridge_connect_sensor()
287 sizeof(sensor->ssdb)); in cio2_bridge_connect_sensor()
291 if (sensor->ssdb.vcmtype > ARRAY_SIZE(cio2_vcm_types)) { in cio2_bridge_connect_sensor()
293 sensor->ssdb.vcmtype); in cio2_bridge_connect_sensor()
294 sensor->ssdb.vcmtype = 0; in cio2_bridge_connect_sensor()
297 status = acpi_get_physical_device_location(adev->handle, &sensor->pld); in cio2_bridge_connect_sensor()
303 if (sensor->ssdb.lanes > CIO2_MAX_LANES) { in cio2_bridge_connect_sensor()
310 cio2_bridge_create_fwnode_properties(sensor, bridge, cfg); in cio2_bridge_connect_sensor()
311 cio2_bridge_create_connection_swnodes(bridge, sensor); in cio2_bridge_connect_sensor()
313 ret = software_node_register_nodes(sensor->swnodes); in cio2_bridge_connect_sensor()
317 fwnode = software_node_fwnode(&sensor->swnodes[ in cio2_bridge_connect_sensor()
324 sensor->adev = acpi_dev_get(adev); in cio2_bridge_connect_sensor()
327 cio2_bridge_instantiate_vcm_i2c_client(sensor); in cio2_bridge_connect_sensor()
329 dev_info(&cio2->dev, "Found supported sensor %s\n", in cio2_bridge_connect_sensor()
338 software_node_unregister_nodes(sensor->swnodes); in cio2_bridge_connect_sensor()
340 ACPI_FREE(sensor->pld); in cio2_bridge_connect_sensor()
376 * The sensor/VCM ACPI device has an ACPI _DEP on the PMIC, check this using the
429 * only need one, rather than one per sensor). We include it as a in cio2_bridge_init()