145 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
/* Author: Dan Scally <djrscally@gmail.com> */
 | 
						|
#ifndef __CIO2_BRIDGE_H
 | 
						|
#define __CIO2_BRIDGE_H
 | 
						|
 | 
						|
#include <linux/property.h>
 | 
						|
#include <linux/types.h>
 | 
						|
 | 
						|
#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
 |