blob: e30c1af58c0f087be4230653ffa440e882c2c37b [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* Fake platform device API for unit testing platform drivers.
*
* Copyright (C) 2018, Google LLC.
* Author: Brendan Higgins <brendanhiggins@google.com>
*/
#include <linux/klist.h>
#include <linux/platform_device_mock.h>
#include <linux/of_platform.h>
#include "base.h"
struct device_node *of_fake_node(struct test *test, const char *name)
{
struct device_node *node;
node = test_kzalloc(test, sizeof(*node), GFP_KERNEL);
if (!node)
return NULL;
of_node_init(node);
return node;
}
struct platform_device *
of_fake_probe_platform(struct test *test,
struct platform_driver *driver,
const char *node_name)
{
struct platform_device *pdev;
struct device_node *of_node;
int ret;
of_node = of_fake_node(test, node_name);
if (!of_node)
return ERR_PTR(-ENOMEM);
test_info(test, "Creating device");
pdev = of_platform_device_create(of_node, node_name, NULL);
if (!pdev)
return ERR_PTR(-ENODEV);
test_info(test, "Probing");
ret = driver->probe(pdev);
if (ret)
return ERR_PTR(ret);
pdev->dev.driver = &driver->driver;
klist_add_tail(&pdev->dev.p->knode_driver,
&pdev->dev.driver->p->klist_devices);
if (ret)
return ERR_PTR(ret);
return pdev;
}
struct platform_device *of_fake_probe_platform_by_name(struct test *test,
const char *driver_name,
const char *node_name)
{
const struct device_driver *driver;
test_info(test, "Locating driver by name");
driver = driver_find(driver_name, &platform_bus_type);
if (!driver)
return ERR_PTR(-ENODEV);
return of_fake_probe_platform(test,
to_platform_driver(driver),
node_name);
}