2021-01-07 14:28:38 +01:00
/* SPDX-License-Identifier: GPL-2.0 */
/* Author: Dan Scally <djrscally@gmail.com> */
2023-05-18 12:05:21 +02:00
# ifndef __IPU_BRIDGE_H
# define __IPU_BRIDGE_H
2021-01-07 14:28:38 +01:00
# include <linux/property.h>
# include <linux/types.h>
2021-12-03 11:28:57 +01:00
struct i2c_client ;
2023-05-18 12:05:21 +02:00
# define IPU_HID "INT343E"
# define IPU_MAX_LANES 4
2023-05-18 12:05:22 +02:00
# define IPU_MAX_PORTS 4
2021-01-07 14:28:38 +01:00
# define MAX_NUM_LINK_FREQS 3
2021-07-12 11:03:26 +02:00
/* Values are educated guesses as we don't have a spec */
2023-05-18 12:05:21 +02:00
# define IPU_SENSOR_ROTATION_NORMAL 0
# define IPU_SENSOR_ROTATION_INVERTED 1
2021-07-12 11:03:26 +02:00
2023-05-18 12:05:21 +02:00
# define IPU_SENSOR_CONFIG(_HID, _NR, ...) \
( const struct ipu_sensor_config ) { \
2021-01-07 14:28:38 +01:00
. 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 , \
}
2021-12-03 11:28:57 +01:00
# define NODE_VCM(_TYPE) \
( const struct software_node ) { \
. name = _TYPE , \
}
2023-05-18 12:05:21 +02:00
enum ipu_sensor_swnodes {
2021-01-07 14:28:38 +01:00
SWNODE_SENSOR_HID ,
SWNODE_SENSOR_PORT ,
SWNODE_SENSOR_ENDPOINT ,
2023-05-18 12:05:21 +02:00
SWNODE_IPU_PORT ,
SWNODE_IPU_ENDPOINT ,
2021-12-03 11:28:57 +01:00
/* Must be last because it is optional / maybe empty */
SWNODE_VCM ,
2021-01-07 14:28:38 +01:00
SWNODE_COUNT
} ;
/* Data representation as it is in ACPI SSDB buffer */
2023-05-18 12:05:21 +02:00
struct ipu_sensor_ssdb {
2021-01-07 14:28:38 +01:00
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 ;
2023-05-18 12:05:21 +02:00
struct ipu_property_names {
2021-01-07 14:28:38 +01:00
char clock_frequency [ 16 ] ;
char rotation [ 9 ] ;
2021-07-12 11:03:26 +02:00
char orientation [ 12 ] ;
2021-01-07 14:28:38 +01:00
char bus_type [ 9 ] ;
char data_lanes [ 11 ] ;
char remote_endpoint [ 16 ] ;
char link_frequencies [ 17 ] ;
} ;
2023-05-18 12:05:21 +02:00
struct ipu_node_names {
2021-01-07 14:28:38 +01:00
char port [ 7 ] ;
char endpoint [ 11 ] ;
char remote_port [ 7 ] ;
2023-07-05 23:29:54 +02:00
char vcm [ 16 ] ;
2021-01-07 14:28:38 +01:00
} ;
2023-05-18 12:05:21 +02:00
struct ipu_sensor_config {
2021-01-07 14:28:38 +01:00
const char * hid ;
const u8 nr_link_freqs ;
const u64 link_freqs [ MAX_NUM_LINK_FREQS ] ;
} ;
2023-05-18 12:05:21 +02:00
struct ipu_sensor {
2023-03-10 23:19:10 +08:00
/* append ssdb.link(u8) in "-%u" format as suffix of HID */
char name [ ACPI_ID_LEN + 4 ] ;
2021-01-07 14:28:38 +01:00
struct acpi_device * adev ;
2021-12-03 11:28:57 +01:00
struct i2c_client * vcm_i2c_client ;
2021-01-07 14:28:38 +01:00
2022-12-28 11:49:20 +02:00
/* SWNODE_COUNT + 1 for terminating NULL */
const struct software_node * group [ SWNODE_COUNT + 1 ] ;
struct software_node swnodes [ SWNODE_COUNT ] ;
2023-05-18 12:05:21 +02:00
struct ipu_node_names node_names ;
2021-01-07 14:28:38 +01:00
2023-05-18 12:05:21 +02:00
struct ipu_sensor_ssdb ssdb ;
2021-07-12 11:03:26 +02:00
struct acpi_pld_info * pld ;
2023-05-18 12:05:21 +02:00
struct ipu_property_names prop_names ;
2021-01-07 14:28:38 +01:00
struct property_entry ep_properties [ 5 ] ;
2021-12-03 11:28:57 +01:00
struct property_entry dev_properties [ 5 ] ;
2023-05-18 12:05:21 +02:00
struct property_entry ipu_properties [ 3 ] ;
2021-01-07 14:28:38 +01:00
struct software_node_ref_args local_ref [ 1 ] ;
struct software_node_ref_args remote_ref [ 1 ] ;
2021-12-03 11:28:57 +01:00
struct software_node_ref_args vcm_ref [ 1 ] ;
2021-01-07 14:28:38 +01:00
} ;
2023-05-18 12:05:21 +02:00
struct ipu_bridge {
char ipu_node_name [ ACPI_ID_LEN ] ;
struct software_node ipu_hid_node ;
2021-01-07 14:28:38 +01:00
u32 data_lanes [ 4 ] ;
unsigned int n_sensors ;
2023-05-18 12:05:22 +02:00
struct ipu_sensor sensors [ IPU_MAX_PORTS ] ;
2021-01-07 14:28:38 +01:00
} ;
2023-05-18 12:05:21 +02:00
# if IS_ENABLED(CONFIG_IPU_BRIDGE)
2023-07-05 23:29:55 +02:00
int ipu_bridge_init ( struct device * dev ) ;
2023-05-18 12:05:21 +02:00
# else
2023-07-05 23:29:55 +02:00
static inline int ipu_bridge_init ( struct device * dev ) { return 0 ; }
2023-05-18 12:05:21 +02:00
# endif
2021-01-07 14:28:38 +01:00
# endif