The v4l2_fwnode_device_properties contains information about the rotation. Use it if the ssdb data is inconclusive. Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> --- drivers/media/pci/intel/ipu-bridge.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/media/pci/intel/ipu-bridge.c b/drivers/media/pci/intel/ipu-bridge.c index 020aa52f590d66b6d333adc56ebfb9ab0561db51..6f436a8b4d23373af8a6668530333a827eca467a 100644 --- a/drivers/media/pci/intel/ipu-bridge.c +++ b/drivers/media/pci/intel/ipu-bridge.c @@ -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]; -- 2.50.0.rc0.642.g800a2b2222-goog