/* SPDX-License-Identifier: GPL-2.0 */ /* Author: Dan Scally */ #ifndef __CIO2_BRIDGE_H #define __CIO2_BRIDGE_H #include #include #include "ipu3-cio2.h" struct i2c_client; #define CIO2_HID "INT343E" #define CIO2_MAX_LANES 4 #define MAX_NUM_LINK_FREQS 3 /* Values are educated guesses as we don't have a spec */ #define CIO2_SENSOR_ROTATION_NORMAL 0 #define CIO2_SENSOR_ROTATION_INVERTED 1 #define CIO2_SENSOR_CONFIG(_HID, _NR, ...) \ (const struct cio2_sensor_config) { \ .hid = _HID, \ .nr_link_freqs = _NR, \ .link_freqs = { __VA_ARGS__ } \ } #define NODE_SENSOR(_HID, _PROPS) \ (const struct software_node) { \ .name = _HID, \ .properties = _PROPS, \ } #define NODE_PORT(_PORT, _SENSOR_NODE) \ (const struct software_node) { \ .name = _PORT, \ .parent = _SENSOR_NODE, \ } #define NODE_ENDPOINT(_EP, _PORT, _PROPS) \ (const struct software_node) { \ .name = _EP, \ .parent = _PORT, \ .properties = _PROPS, \ } #define NODE_VCM(_TYPE) \ (const struct software_node) { \ .name = _TYPE, \ } enum cio2_sensor_swnodes { SWNODE_SENSOR_HID, SWNODE_SENSOR_PORT, SWNODE_SENSOR_ENDPOINT, SWNODE_CIO2_PORT, SWNODE_CIO2_ENDPOINT, /* Must be last because it is optional / maybe empty */ SWNODE_VCM, SWNODE_COUNT }; /* Data representation as it is in ACPI SSDB buffer */ struct cio2_sensor_ssdb { u8 version; u8 sku; u8 guid_csi2[16]; u8 devfunction; u8 bus; u32 dphylinkenfuses; u32 clockdiv; u8 link; u8 lanes; u32 csiparams[10]; u32 maxlanespeed; u8 sensorcalibfileidx; u8 sensorcalibfileidxInMBZ[3]; u8 romtype; u8 vcmtype; u8 platforminfo; u8 platformsubinfo; u8 flash; u8 privacyled; u8 degree; u8 mipilinkdefined; u32 mclkspeed; u8 controllogicid; u8 reserved1[3]; u8 mclkport; u8 reserved2[13]; } __packed; struct cio2_property_names { char clock_frequency[16]; char rotation[9]; char orientation[12]; char bus_type[9]; char data_lanes[11]; char remote_endpoint[16]; char link_frequencies[17]; }; struct cio2_node_names { char port[7]; char endpoint[11]; char remote_port[7]; }; struct cio2_sensor_config { const char *hid; const u8 nr_link_freqs; const u64 link_freqs[MAX_NUM_LINK_FREQS]; }; struct cio2_sensor { char name[ACPI_ID_LEN]; struct acpi_device *adev; struct i2c_client *vcm_i2c_client; /* SWNODE_COUNT + 1 for terminating empty node */ struct software_node swnodes[SWNODE_COUNT + 1]; struct cio2_node_names node_names; struct cio2_sensor_ssdb ssdb; struct acpi_pld_info *pld; struct cio2_property_names prop_names; struct property_entry ep_properties[5]; struct property_entry dev_properties[5]; struct property_entry cio2_properties[3]; struct software_node_ref_args local_ref[1]; struct software_node_ref_args remote_ref[1]; struct software_node_ref_args vcm_ref[1]; }; struct cio2_bridge { char cio2_node_name[ACPI_ID_LEN]; struct software_node cio2_hid_node; u32 data_lanes[4]; unsigned int n_sensors; struct cio2_sensor sensors[CIO2_NUM_PORTS]; }; #endif