@@ -236,37 +236,41 @@ static int ipu_bridge_read_acpi_buffer(struct acpi_device *adev, char *id,
}
static u32 ipu_bridge_parse_rotation(struct acpi_device *adev,
- struct ipu_sensor_ssdb *ssdb)
+ struct ipu_sensor_ssdb *ssdb,
+ struct v4l2_fwnode_device_properties *props)
{
switch (ssdb->degree) {
case IPU_SENSOR_ROTATION_NORMAL:
return 0;
case IPU_SENSOR_ROTATION_INVERTED:
return 180;
- default:
+ }
+
+ if (props->rotation == V4L2_FWNODE_PROPERTY_UNSET) {
dev_warn(ADEV_DEV(adev),
"Unknown rotation %d. Assume 0 degree rotation\n",
ssdb->degree);
return 0;
}
+
+ return props->rotation;
}
-static enum v4l2_fwnode_orientation ipu_bridge_parse_orientation(struct acpi_device *adev)
+static enum v4l2_fwnode_orientation
+ipu_bridge_parse_orientation(struct acpi_device *adev,
+ struct v4l2_fwnode_device_properties *props)
{
- struct v4l2_fwnode_device_properties props;
- int ret;
-
- ret = v4l2_fwnode_device_parse(ADEV_DEV(adev), &props);
- if (!ret || props.rotation == V4L2_FWNODE_PROPERTY_UNSET) {
+ if (props->orientation == V4L2_FWNODE_PROPERTY_UNSET) {
dev_warn(ADEV_DEV(adev), "Using default orientation\n");
return V4L2_FWNODE_ORIENTATION_EXTERNAL;
}
- return props.orientation;
+ return props->orientation;
}
int ipu_bridge_parse_ssdb(struct acpi_device *adev, struct ipu_sensor *sensor)
{
+ struct v4l2_fwnode_device_properties props;
struct ipu_sensor_ssdb ssdb = {};
int ret;
@@ -274,6 +278,10 @@ int ipu_bridge_parse_ssdb(struct acpi_device *adev, struct ipu_sensor *sensor)
if (ret)
return ret;
+ ret = v4l2_fwnode_device_parse(ADEV_DEV(adev), &props);
+ if (ret)
+ return ret;
+
if (ssdb.vcmtype > ARRAY_SIZE(ipu_vcm_types)) {
dev_warn(ADEV_DEV(adev), "Unknown VCM type %d\n", ssdb.vcmtype);
ssdb.vcmtype = 0;
@@ -287,8 +295,8 @@ int ipu_bridge_parse_ssdb(struct acpi_device *adev, struct ipu_sensor *sensor)
sensor->link = ssdb.link;
sensor->lanes = ssdb.lanes;
sensor->mclkspeed = ssdb.mclkspeed;
- sensor->rotation = ipu_bridge_parse_rotation(adev, &ssdb);
- sensor->orientation = ipu_bridge_parse_orientation(adev);
+ sensor->rotation = ipu_bridge_parse_rotation(adev, &ssdb, &props);
+ sensor->orientation = ipu_bridge_parse_orientation(adev, &props);
if (ssdb.vcmtype)
sensor->vcm_type = ipu_vcm_types[ssdb.vcmtype - 1];
The v4l2_fwnode_device_properties contains information about the rotation. Use it if the ssdb data is inconclusive. Signed-off-by: Ricardo Ribalda <ribalda@chromium.org> --- drivers/media/pci/intel/ipu-bridge.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-)