]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/amdgpu: Initialize swnode for ISP MFD device
authorPratap Nirujogi <pratap.nirujogi@amd.com>
Tue, 24 Jun 2025 23:15:00 +0000 (19:15 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 16 Jul 2025 20:17:35 +0000 (16:17 -0400)
Create amd_isp_capture MFD device with swnode initialized to
isp specific software_node part of fwnode graph in amd_isp4
x86/platform driver. The isp driver use this swnode handle
to retrieve the critical properties (data-lanes, mipi phyid,
link-frequencies etc.) required for camera to work on AMD ISP4
based targets.

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Pratap Nirujogi <pratap.nirujogi@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
drivers/gpu/drm/amd/amdgpu/isp_v4_1_1.c

index 1f531b5f594d9db1ac97759e60e3c291f714289a..a1737556a77ebe4d7974637b7337f77840602a05 100644 (file)
@@ -1723,7 +1723,7 @@ static inline bool amdgpu_acpi_is_s3_active(struct amdgpu_device *adev) { return
 #endif
 
 #if defined(CONFIG_DRM_AMD_ISP)
-int amdgpu_acpi_get_isp4_dev_hid(u8 (*hid)[ACPI_ID_LEN]);
+int amdgpu_acpi_get_isp4_dev(struct acpi_device **dev);
 #endif
 
 void amdgpu_register_gpu_instance(struct amdgpu_device *adev);
index b047fdf81543a24ffbd3f7585cc0f7c80fb0834f..6c62e27b9800232bb9798e0947b51a5d0631c055 100644 (file)
@@ -1545,7 +1545,7 @@ static int isp_match_acpi_device_ids(struct device *dev, const void *data)
        return acpi_match_device(data, dev) ? 1 : 0;
 }
 
-int amdgpu_acpi_get_isp4_dev_hid(u8 (*hid)[ACPI_ID_LEN])
+int amdgpu_acpi_get_isp4_dev(struct acpi_device **dev)
 {
        struct device *pdev __free(put_device) = NULL;
        struct acpi_device *acpi_pdev;
@@ -1559,7 +1559,7 @@ int amdgpu_acpi_get_isp4_dev_hid(u8 (*hid)[ACPI_ID_LEN])
        if (!acpi_pdev)
                return -ENODEV;
 
-       strscpy(*hid, acpi_device_hid(acpi_pdev));
+       *dev = acpi_pdev;
 
        return 0;
 }
index f857796f0297a19e91014a0825d9162e5a163cac..a887df520414075f060fc226f4e2fd066ec2ce2c 100644 (file)
@@ -183,15 +183,16 @@ exit:
 
 static int isp_v4_1_1_hw_init(struct amdgpu_isp *isp)
 {
+       const struct software_node *amd_camera_node, *isp4_node;
        struct amdgpu_device *adev = isp->adev;
+       struct acpi_device *acpi_dev;
        int idx, int_idx, num_res, r;
-       u8 isp_dev_hid[ACPI_ID_LEN];
        u64 isp_base;
 
        if (adev->rmmio_size == 0 || adev->rmmio_size < 0x5289)
                return -EINVAL;
 
-       r = amdgpu_acpi_get_isp4_dev_hid(&isp_dev_hid);
+       r = amdgpu_acpi_get_isp4_dev(&acpi_dev);
        if (r) {
                drm_dbg(&adev->ddev, "Invalid isp platform detected (%d)", r);
                /* allow GPU init to progress */
@@ -199,7 +200,7 @@ static int isp_v4_1_1_hw_init(struct amdgpu_isp *isp)
        }
 
        /* add GPIO resources required for OMNI5C10 sensor */
-       if (!strcmp("OMNI5C10", isp_dev_hid)) {
+       if (!strcmp("OMNI5C10", acpi_device_hid(acpi_dev))) {
                gpiod_add_lookup_table(&isp_gpio_table);
                gpiod_add_lookup_table(&isp_sensor_gpio_table);
        }
@@ -241,6 +242,9 @@ static int isp_v4_1_1_hw_init(struct amdgpu_isp *isp)
                goto failure;
        }
 
+       amd_camera_node = (const struct software_node *)acpi_dev->driver_data;
+       isp4_node = software_node_find_by_name(amd_camera_node, "isp4");
+
        /* initialize isp platform data */
        isp->isp_pdata->adev = (void *)adev;
        isp->isp_pdata->asic_type = adev->asic_type;
@@ -269,6 +273,7 @@ static int isp_v4_1_1_hw_init(struct amdgpu_isp *isp)
        isp->isp_cell[0].num_resources = num_res;
        isp->isp_cell[0].resources = &isp->isp_res[0];
        isp->isp_cell[0].platform_data = isp->isp_pdata;
+       isp->isp_cell[0].swnode = isp4_node;
        isp->isp_cell[0].pdata_size = sizeof(struct isp_platform_data);
 
        /* initialize isp i2c platform data */