// Copyright (C) 2024 Cirrus Logic, Inc. and
 //                    Cirrus Logic International Semiconductor Ltd.
 
+#include <kunit/resource.h>
 #include <kunit/test.h>
 #include <kunit/static_stub.h>
+#include <linux/device/faux.h>
 #include <linux/firmware/cirrus/cs_dsp.h>
 #include <linux/firmware/cirrus/wmfw.h>
 #include <linux/gpio/driver.h>
 #include <linux/random.h>
 #include <sound/cs-amp-lib.h>
 
+KUNIT_DEFINE_ACTION_WRAPPER(faux_device_destroy_wrapper, faux_device_destroy,
+                           struct faux_device *)
+
 struct cs_amp_lib_test_priv {
-       struct platform_device amp_pdev;
+       struct faux_device *amp_dev;
 
        struct cirrus_amp_efi_data *cal_blob;
        struct list_head ctl_write_list;
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable_nohead);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, 0, 0, &result_data);
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, 0, 0, &result_data);
        KUNIT_EXPECT_EQ(test, ret, -EOVERFLOW);
 
        kunit_deactivate_static_stub(test, cs_amp_test_hooks->get_efi_variable);
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable_bad_count);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, 0, 0, &result_data);
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, 0, 0, &result_data);
        KUNIT_EXPECT_EQ(test, ret, -EOVERFLOW);
 
        kunit_deactivate_static_stub(test, cs_amp_test_hooks->get_efi_variable);
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable_none);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, 0, 0, &result_data);
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, 0, 0, &result_data);
        KUNIT_EXPECT_EQ(test, ret, -ENOENT);
 
        kunit_deactivate_static_stub(test, cs_amp_test_hooks->get_efi_variable);
                                   cs_amp_lib_test_get_efi_variable);
 
        target_uid = cs_amp_lib_test_get_target_uid(test);
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, target_uid, -1, &result_data);
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, target_uid, -1, &result_data);
        KUNIT_EXPECT_EQ(test, ret, 0);
 
        kunit_deactivate_static_stub(test, cs_amp_test_hooks->get_efi_variable);
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, 0,
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, 0,
                                              param->amp_index, &result_data);
        KUNIT_EXPECT_EQ(test, ret, 0);
 
                                   cs_amp_lib_test_get_efi_variable);
 
        target_uid = cs_amp_lib_test_get_target_uid(test);
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, target_uid,
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, target_uid,
                                              param->amp_index, &result_data);
        KUNIT_EXPECT_EQ(test, ret, 0);
 
 
        /* Get a target UID that won't match the entry */
        target_uid = ~cs_amp_lib_test_get_target_uid(test);
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, target_uid,
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, target_uid,
                                              param->amp_index, &result_data);
        KUNIT_EXPECT_EQ(test, ret, -ENOENT);
 
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, bad_target_uid,
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, bad_target_uid,
                                              param->amp_index, &result_data);
        KUNIT_EXPECT_EQ(test, ret, 0);
 
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, bad_target_uid, -1,
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, bad_target_uid, -1,
                                              &result_data);
        KUNIT_EXPECT_EQ(test, ret, -ENOENT);
 
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, bad_target_uid, 99,
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, bad_target_uid, 99,
                                              &result_data);
        KUNIT_EXPECT_EQ(test, ret, -ENOENT);
 
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, 0, 99, &result_data);
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, 0, 99, &result_data);
        KUNIT_EXPECT_EQ(test, ret, -ENOENT);
 
        kunit_deactivate_static_stub(test, cs_amp_test_hooks->get_efi_variable);
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, 0, -1, &result_data);
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, 0, -1, &result_data);
        KUNIT_EXPECT_EQ(test, ret, -ENOENT);
 
        kunit_deactivate_static_stub(test, cs_amp_test_hooks->get_efi_variable);
                                   cs_amp_test_hooks->get_efi_variable,
                                   cs_amp_lib_test_get_efi_variable);
 
-       ret = cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev, 0, -1, &result_data);
+       ret = cs_amp_get_efi_calibration_data(&priv->amp_dev->dev, 0, -1, &result_data);
        KUNIT_EXPECT_EQ(test, ret, -ENOENT);
 
        kunit_deactivate_static_stub(test, cs_amp_test_hooks->get_efi_variable);
 
        /* Lookup by UID should not find it */
        KUNIT_EXPECT_EQ(test,
-                       cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev,
+                       cs_amp_get_efi_calibration_data(&priv->amp_dev->dev,
                                                        uid, -1,
                                                        &result_data),
                        -ENOENT);
 
        /* Get by index should ignore it */
        KUNIT_EXPECT_EQ(test,
-                       cs_amp_get_efi_calibration_data(&priv->amp_pdev.dev,
+                       cs_amp_get_efi_calibration_data(&priv->amp_dev->dev,
                                                        0, 2,
                                                        &result_data),
                        -ENOENT);
 
        dsp = kunit_kzalloc(test, sizeof(*dsp), GFP_KERNEL);
        KUNIT_ASSERT_NOT_ERR_OR_NULL(test, dsp);
-       dsp->dev = &priv->amp_pdev.dev;
+       dsp->dev = &priv->amp_dev->dev;
 
        get_random_bytes(&data, sizeof(data));
 
        KUNIT_EXPECT_EQ(test, entry->value, data.calStatus);
 }
 
-static void cs_amp_lib_test_dev_release(struct device *dev)
-{
-}
-
 static int cs_amp_lib_test_case_init(struct kunit *test)
 {
        struct cs_amp_lib_test_priv *priv;
-       int ret;
 
        KUNIT_ASSERT_NOT_NULL(test, cs_amp_test_hooks);
 
        INIT_LIST_HEAD(&priv->ctl_write_list);
 
        /* Create dummy amp driver dev */
-       priv->amp_pdev.name = "cs_amp_lib_test_drv";
-       priv->amp_pdev.id = -1;
-       priv->amp_pdev.dev.release = cs_amp_lib_test_dev_release;
-       ret = platform_device_register(&priv->amp_pdev);
-       KUNIT_ASSERT_GE_MSG(test, ret, 0, "Failed to register amp platform device\n");
+       priv->amp_dev = faux_device_create("cs_amp_lib_test_drv", NULL, NULL);
+       KUNIT_ASSERT_NOT_NULL(test, priv->amp_dev);
+       KUNIT_ASSERT_EQ(test, 0,
+                       kunit_add_action_or_reset(test,
+                                                 faux_device_destroy_wrapper,
+                                                 priv->amp_dev));
 
        return 0;
 }
 
-static void cs_amp_lib_test_case_exit(struct kunit *test)
-{
-       struct cs_amp_lib_test_priv *priv = test->priv;
-
-       if (priv->amp_pdev.name)
-               platform_device_unregister(&priv->amp_pdev);
-}
-
 static const struct cs_amp_lib_test_param cs_amp_lib_test_get_cal_param_cases[] = {
        { .num_amps = 2, .amp_index = 0 },
        { .num_amps = 2, .amp_index = 1 },
 static struct kunit_suite cs_amp_lib_test_suite = {
        .name = "snd-soc-cs-amp-lib-test",
        .init = cs_amp_lib_test_case_init,
-       .exit = cs_amp_lib_test_case_exit,
        .test_cases = cs_amp_lib_test_cases,
 };