mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 15:41:40 +00:00
- DWC and i.MX6 fixes
This commit is contained in:
commit
e597e5b6bc
7 changed files with 131 additions and 2 deletions
|
@ -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";
|
||||
};
|
||||
|
|
|
@ -757,3 +757,8 @@ int uclass_pre_remove_device(struct udevice *dev)
|
|||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
UCLASS_DRIVER(nop) = {
|
||||
.id = UCLASS_NOP,
|
||||
.name = "nop",
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
73
test/dm/nop.c
Normal 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);
|
Loading…
Reference in a new issue