- DWC and i.MX6 fixes
This commit is contained in:
Tom Rini 2019-07-07 07:06:03 -04:00
commit e597e5b6bc
7 changed files with 131 additions and 2 deletions

View file

@ -400,6 +400,18 @@
sandbox,silent; /* Don't emit sounds while testing */
};
nop-test_0 {
compatible = "sandbox,nop_sandbox1";
nop-test_1 {
compatible = "sandbox,nop_sandbox2";
bind = "True";
};
nop-test_2 {
compatible = "sandbox,nop_sandbox2";
bind = "False";
};
};
misc-test {
compatible = "sandbox,misc_sandbox";
};

View file

@ -757,3 +757,8 @@ int uclass_pre_remove_device(struct udevice *dev)
return 0;
}
#endif
UCLASS_DRIVER(nop) = {
.id = UCLASS_NOP,
.name = "nop",
};

View file

@ -337,7 +337,7 @@ static int dwc3_glue_remove(struct udevice *dev)
clk_release_bulk(&glue->clks);
return dm_scan_fdt_dev(dev);
return 0;
}
static const struct udevice_id dwc3_glue_ids[] = {
@ -350,7 +350,7 @@ static const struct udevice_id dwc3_glue_ids[] = {
U_BOOT_DRIVER(dwc3_generic_wrapper) = {
.name = "dwc3-generic-wrapper",
.id = UCLASS_MISC,
.id = UCLASS_NOP,
.of_match = dwc3_glue_ids,
.bind = dwc3_glue_bind,
.probe = dwc3_glue_probe,

View file

@ -503,6 +503,42 @@ static int ehci_usb_ofdata_to_platdata(struct udevice *dev)
return 0;
}
static int ehci_usb_bind(struct udevice *dev)
{
/*
* TODO:
* This driver is only partly converted to DT probing and still uses
* a tremendous amount of hard-coded addresses. To make things worse,
* the driver depends on specific sequential indexing of controllers,
* from which it derives offsets in the PHY and ANATOP register sets.
*
* Here we attempt to calculate these indexes from DT information as
* well as we can. The USB controllers on all existing iMX6/iMX7 SoCs
* are placed next to each other, at addresses incremented by 0x200.
* Thus, the index is derived from the multiple of 0x200 offset from
* the first controller address.
*
* However, to complete conversion of this driver to DT probing, the
* following has to be done:
* - DM clock framework support for iMX must be implemented
* - usb_power_config() has to be converted to clock framework
* -> Thus, the ad-hoc "index" variable goes away.
* - USB PHY handling has to be factored out into separate driver
* -> Thus, the ad-hoc "index" variable goes away from the PHY
* code, the PHY driver must parse it's address from DT. This
* USB driver must find the PHY driver via DT phandle.
* -> usb_power_config() shall be moved to PHY driver
* With these changes in place, the ad-hoc indexing goes away and
* the driver is fully converted to DT probing.
*/
fdt_size_t size;
fdt_addr_t addr = devfdt_get_addr_size_index(dev, 0, &size);
dev->req_seq = (addr - USB_BASE_ADDR) / size;
return 0;
}
static int ehci_usb_probe(struct udevice *dev)
{
struct usb_platdata *plat = dev_get_platdata(dev);
@ -564,6 +600,7 @@ U_BOOT_DRIVER(usb_mx6) = {
.id = UCLASS_USB,
.of_match = mx6_usb_ids,
.ofdata_to_platdata = ehci_usb_ofdata_to_platdata,
.bind = ehci_usb_bind,
.probe = ehci_usb_probe,
.remove = ehci_deregister,
.ops = &ehci_usb_ops,

View file

@ -62,6 +62,7 @@ enum uclass_id {
UCLASS_MMC, /* SD / MMC card or chip */
UCLASS_MOD_EXP, /* RSA Mod Exp device */
UCLASS_MTD, /* Memory Technology Device (MTD) device */
UCLASS_NOP, /* No-op devices */
UCLASS_NORTHBRIDGE, /* Intel Northbridge / SDRAM controller */
UCLASS_NVME, /* NVM Express device */
UCLASS_PANEL, /* Display panel, such as an LCD */

View file

@ -3,6 +3,7 @@
# Copyright (c) 2013 Google, Inc
obj-$(CONFIG_UT_DM) += bus.o
obj-$(CONFIG_UT_DM) += nop.o
obj-$(CONFIG_UT_DM) += test-driver.o
obj-$(CONFIG_UT_DM) += test-fdt.o
obj-$(CONFIG_UT_DM) += test-main.o

73
test/dm/nop.c Normal file
View file

@ -0,0 +1,73 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Test for the NOP uclass
*
* (C) Copyright 2019 - Texas Instruments Incorporated - http://www.ti.com/
* Jean-Jacques Hiblot <jjhiblot@ti.com>
*/
#include <common.h>
#include <dm.h>
#include <dm/ofnode.h>
#include <dm/lists.h>
#include <dm/device.h>
#include <dm/test.h>
#include <misc.h>
#include <test/ut.h>
static int noptest_bind(struct udevice *parent)
{
ofnode ofnode = dev_read_first_subnode(parent);
while (ofnode_valid(ofnode)) {
struct udevice *dev;
const char *bind_flag = ofnode_read_string(ofnode, "bind");
if (bind_flag && (strcmp(bind_flag, "True") == 0))
lists_bind_fdt(parent, ofnode, &dev, false);
ofnode = dev_read_next_subnode(ofnode);
}
return 0;
}
static const struct udevice_id noptest1_ids[] = {
{
.compatible = "sandbox,nop_sandbox1",
},
{ }
};
U_BOOT_DRIVER(noptest_drv1) = {
.name = "noptest1_drv",
.of_match = noptest1_ids,
.id = UCLASS_NOP,
.bind = noptest_bind,
};
static const struct udevice_id noptest2_ids[] = {
{
.compatible = "sandbox,nop_sandbox2",
},
{ }
};
U_BOOT_DRIVER(noptest_drv2) = {
.name = "noptest2_drv",
.of_match = noptest2_ids,
.id = UCLASS_NOP,
};
static int dm_test_nop(struct unit_test_state *uts)
{
struct udevice *dev;
ut_assertok(uclass_get_device_by_name(UCLASS_NOP, "nop-test_0", &dev));
ut_assertok(uclass_get_device_by_name(UCLASS_NOP, "nop-test_1", &dev));
ut_asserteq(-ENODEV,
uclass_get_device_by_name(UCLASS_NOP, "nop-test_2", &dev));
return 0;
}
DM_TEST(dm_test_nop, DM_TESTF_FLAT_TREE | DM_TESTF_SCAN_FDT);