Skip to content
  • Masahiro Yamada's avatar
    syscon: add Linux-compatible syscon API · e151a1c2
    Masahiro Yamada authored and Tom Rini's avatar Tom Rini committed
    The syscon implementation in U-Boot is different from that in Linux.
    Thus, DT files imported from Linux do not work for U-Boot.
    
    In U-Boot driver model, each node is bound to a dedicated driver
    that is the most compatible to it.  This design gets along with the
    concept of DT, and the syscon in Linux originally worked like that.
    
    However, Linux commit bdb0066df96e ("mfd: syscon: Decouple syscon
    interface from platform devices") changed the behavior because it is
    useful to let a device bind to another driver, but still work as a
    syscon provider.
    
    That change had happened before U-Boot initially supported the syscon
    driver by commit 6f98b750
    
     ("dm: Add support for generic system
    controllers (syscon)").  So, the U-Boot's syscon works differently
    from the beginning.  I'd say this is mis-implementation given that
    DT is not oriented to a particular project, but Linux is the canon
    of DT in practice.
    
    The problem typically arises in the combination of "syscon" and
    "simple-mfd" compatibles.
    
    In Linux, they are orthogonal, i.e., the order between "syscon" and
    "simple-mfd" does not matter at all.
    
    Assume the following compatible.
    
       compatible = "foo,bar-syscon", "syscon", "simple-mfd";
    
    In U-Boot, this device node is bound to the syscon driver
    (driver/core/syscon-uclass.c) since the "syscon" is found to be the
    most compatible.  Then, syscon_get_regmap() succeeds.
    
    However,
    
       compatible = "foo,bar-syscon", "simple-mfd", "syscon";
    
    does not work because this node is bound to the simple-bus driver
    (drivers/core/simple-bus.c) in favor of "simple-mfd" compatible.
    The compatible string "syscon" is just dismissed.
    
    Moreover,
    
       compatible = "foo,bar-syscon", "syscon";
    
    works like the first case because the syscon driver populates the
    child devices.  This is wrong because populating children is the job
    of "simple-mfd" (or "simple-bus").
    
    This commit ports syscon_node_to_regmap() from Linux.  This API
    does not require the given node to be bound to a driver in any way.
    
    Reported-by: default avatarKunihiko Hayashi <hayashi.kunihiko@socionext.com>
    Signed-off-by: Masahiro Yamada's avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    e151a1c2