static void panthor_device_free_page(struct drm_device *ddev, void *data)
 {
-       free_page((unsigned long)data);
+       __free_page(data);
 }
 
 int panthor_device_init(struct panthor_device *ptdev)
 {
+       u32 *dummy_page_virt;
        struct resource *res;
        struct page *p;
        int ret;
        if (!p)
                return -ENOMEM;
 
-       ptdev->pm.dummy_latest_flush = page_address(p);
+       ptdev->pm.dummy_latest_flush = p;
+       dummy_page_virt = page_address(p);
        ret = drmm_add_action_or_reset(&ptdev->base, panthor_device_free_page,
                                       ptdev->pm.dummy_latest_flush);
        if (ret)
         * happens while the dummy page is mapped. Zero cannot be used because
         * that means 'always flush'.
         */
-       *ptdev->pm.dummy_latest_flush = 1;
+       *dummy_page_virt = 1;
 
        INIT_WORK(&ptdev->reset.work, panthor_device_reset_work);
        ptdev->reset.wq = alloc_ordered_workqueue("panthor-reset-wq", 0);
                if (active)
                        pfn = __phys_to_pfn(ptdev->phys_addr + CSF_GPU_LATEST_FLUSH_ID);
                else
-                       pfn = virt_to_pfn(ptdev->pm.dummy_latest_flush);
+                       pfn = page_to_pfn(ptdev->pm.dummy_latest_flush);
                break;
 
        default: