lkml.org 
[lkml]   [2014]   [Feb]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13 108/140] ARM: mvebu: Add quirk for i2c for the OpenBlocks AX3-4 board
    Date
    3.13-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Gregory CLEMENT <gregory.clement@free-electrons.com>

    commit 85e618a1be2b2092318178d1d66bdad49cbbeeeb upstream.

    The first variants of Armada XP SoCs (A0 stepping) have issues related
    to the i2c controller which prevent to use the offload mechanism and
    lead to a kernel hang during boot.

    This commit add quirk in the mvebu platform code to check the SoC
    version and then update the compatible string for the i2c controller
    according to the revision of the SoC. Currently only some OpenBlocks
    AX3-4 boards are known to use an A0 revision so the check is done only
    for these boards.

    Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
    Fixes: 930ab3d403ae (i2c: mv64xxx: Add I2C Transaction Generator support)
    Acked-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Jason Cooper <jason@lakedaemon.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/arm/mach-mvebu/armada-370-xp.c | 32 ++++++++++++++++++++++++++++++++
    1 file changed, 32 insertions(+)

    --- a/arch/arm/mach-mvebu/armada-370-xp.c
    +++ b/arch/arm/mach-mvebu/armada-370-xp.c
    @@ -21,6 +21,7 @@
    #include <linux/clocksource.h>
    #include <linux/dma-mapping.h>
    #include <linux/mbus.h>
    +#include <linux/slab.h>
    #include <asm/hardware/cache-l2x0.h>
    #include <asm/mach/arch.h>
    #include <asm/mach/map.h>
    @@ -28,6 +29,7 @@
    #include "armada-370-xp.h"
    #include "common.h"
    #include "coherency.h"
    +#include "mvebu-soc-id.h"

    static void __init armada_370_xp_map_io(void)
    {
    @@ -45,8 +47,38 @@ static void __init armada_370_xp_timer_a
    #endif
    }

    +static void __init i2c_quirk(void)
    +{
    + struct device_node *np;
    + u32 dev, rev;
    +
    + /*
    + * Only revisons more recent than A0 support the offload
    + * mechanism. We can exit only if we are sure that we can
    + * get the SoC revision and it is more recent than A0.
    + */
    + if (mvebu_get_soc_id(&rev, &dev) == 0 && dev > MV78XX0_A0_REV)
    + return;
    +
    + for_each_compatible_node(np, NULL, "marvell,mv78230-i2c") {
    + struct property *new_compat;
    +
    + new_compat = kzalloc(sizeof(*new_compat), GFP_KERNEL);
    +
    + new_compat->name = kstrdup("compatible", GFP_KERNEL);
    + new_compat->length = sizeof("marvell,mv78230-a0-i2c");
    + new_compat->value = kstrdup("marvell,mv78230-a0-i2c",
    + GFP_KERNEL);
    +
    + of_update_property(np, new_compat);
    + }
    + return;
    +}
    +
    static void __init armada_370_xp_dt_init(void)
    {
    + if (of_machine_is_compatible("plathome,openblocks-ax3-4"))
    + i2c_quirk();
    of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
    }




    \
     
     \ /
      Last update: 2014-02-04 23:01    [W:2.585 / U:0.156 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site