lkml.org 
[lkml]   [2015]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/9] ARM: at91: at91sam9: use SoC detection infrastructure
    Date
    Use the soc detection infrastructure for at91sam9 initialization.

    Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
    ---
    arch/arm/mach-at91/at91sam9.c | 94 +++++++++++++++++++++++++++++++++----------
    arch/arm/mach-at91/soc.h | 30 ++++++++++++++
    2 files changed, 102 insertions(+), 22 deletions(-)

    diff --git a/arch/arm/mach-at91/at91sam9.c b/arch/arm/mach-at91/at91sam9.c
    index 56e3ba73ec40..964a8aaebe62 100644
    --- a/arch/arm/mach-at91/at91sam9.c
    +++ b/arch/arm/mach-at91/at91sam9.c
    @@ -7,29 +7,86 @@
    * Licensed under GPLv2 or later.
    */

    -#include <linux/types.h>
    -#include <linux/init.h>
    -#include <linux/module.h>
    -#include <linux/gpio.h>
    #include <linux/of.h>
    -#include <linux/of_irq.h>
    #include <linux/of_platform.h>
    -#include <linux/clk-provider.h>

    -#include <asm/system_misc.h>
    -#include <asm/setup.h>
    -#include <asm/irq.h>
    #include <asm/mach/arch.h>
    -#include <asm/mach/map.h>
    -#include <asm/mach/irq.h>
    +#include <asm/system_misc.h>

    #include "generic.h"
    +#include "soc.h"

    -static void __init at91sam9_dt_device_init(void)
    +static const struct at91_soc sam9_socs[] = {
    + AT91_SOC(AT91SAM9260_CIDR_MATCH, 0,
    + "AT91SAM9260", "atmel,at91sam9260"),
    + AT91_SOC(AT91SAM9261_CIDR_MATCH, 0,
    + "AT91SAM9261", "atmel,at91sam9261"),
    + AT91_SOC(AT91SAM9263_CIDR_MATCH, 0,
    + "AT91SAM9263", "atmel,at91sam9263"),
    + AT91_SOC(AT91SAM9G20_CIDR_MATCH, 0,
    + "AT91SAM9G20", "atmel,at91sam9g20"),
    + AT91_SOC(AT91SAM9RL64_CIDR_MATCH, 0,
    + "AT91SAM9RL64", "atmel,at91sam9rl"),
    + AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9M11_EXID_MATCH,
    + "AT91SAM9M11", "atmel,at91sam9g45"),
    + AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9M10_EXID_MATCH,
    + "AT91SAM9M10", "atmel,at91sam9g45"),
    + AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9G46_EXID_MATCH,
    + "AT91SAM9G46", "atmel,at91sam9g45"),
    + AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91SAM9G45_EXID_MATCH,
    + "AT91SAM9G45", "atmel,at91sam9g45"),
    + AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9G15_EXID_MATCH,
    + "AT91SAM9G15", "atmel,at91sam9x5"),
    + AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9G35_EXID_MATCH,
    + "AT91SAM9G35", "atmel,at91sam9x5"),
    + AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9X35_EXID_MATCH,
    + "AT91SAM9X35", "atmel,at91sam9x5"),
    + AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9G25_EXID_MATCH,
    + "AT91SAM9G25", "atmel,at91sam9x5"),
    + AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91SAM9X25_EXID_MATCH,
    + "AT91SAM9X25", "atmel,at91sam9x5"),
    + AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91SAM9CN12_EXID_MATCH,
    + "AT91SAM9CN12", "atmel,at91sam9n12"),
    + AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91SAM9N12_EXID_MATCH,
    + "AT91SAM9N12", "atmel,at91sam9n12"),
    + AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91SAM9CN11_EXID_MATCH,
    + "AT91SAM9CN11", "atmel,at91sam9n12"),
    + { /* sentinel */ },
    +};
    +
    +static const struct at91_soc sam9xe_socs[] = {
    + AT91_SOC(AT91SAM9XE128_EXID_MATCH, 0,
    + "AT91SAM9XE128", "atmel,at91sam9xe"),
    + AT91_SOC(AT91SAM9XE256_EXID_MATCH, 0,
    + "AT91SAM9XE256", "atmel,at91sam9xe"),
    + AT91_SOC(AT91SAM9XE512_EXID_MATCH, 0,
    + "AT91SAM9XE512", "atmel,at91sam9xe"),
    + { /* sentinel */ },
    +};
    +
    +static const struct at91_soc_family sam9_families[] = {
    + AT91_SOC_FAMILY(ARCH_ID_SAM9, "SAM9", sam9_socs),
    + AT91_SOC_FAMILY(ARCH_ID_SAM9, "SAM9XE", sam9xe_socs),
    + { /* sentinel */ },
    +};
    +
    +static void __init at91sam9_common_init(void)
    {
    - of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
    + struct soc_device *soc;
    + struct device *soc_dev = NULL;
    +
    + soc = at91_soc_init(sam9_families);
    + if (soc != NULL)
    + soc_dev = soc_device_to_device(soc);
    +
    + of_platform_populate(NULL, of_default_bus_match_table, NULL, soc_dev);

    arm_pm_idle = at91sam9_idle;
    +}
    +
    +static void __init at91sam9_dt_device_init(void)
    +{
    + at91sam9_common_init();
    at91sam9260_pm_init();
    }

    @@ -40,16 +97,13 @@ static const char *at91_dt_board_compat[] __initconst = {

    DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM9")
    /* Maintainer: Atmel */
    - .map_io = at91_map_io,
    .init_machine = at91sam9_dt_device_init,
    .dt_compat = at91_dt_board_compat,
    MACHINE_END

    static void __init at91sam9g45_dt_device_init(void)
    {
    - of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
    -
    - arm_pm_idle = at91sam9_idle;
    + at91sam9_common_init();
    at91sam9g45_pm_init();
    }

    @@ -60,16 +114,13 @@ static const char *at91sam9g45_board_compat[] __initconst = {

    DT_MACHINE_START(at91sam9g45_dt, "Atmel AT91SAM9G45")
    /* Maintainer: Atmel */
    - .map_io = at91_map_io,
    .init_machine = at91sam9g45_dt_device_init,
    .dt_compat = at91sam9g45_board_compat,
    MACHINE_END

    static void __init at91sam9x5_dt_device_init(void)
    {
    - of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
    -
    - arm_pm_idle = at91sam9_idle;
    + at91sam9_common_init();
    at91sam9x5_pm_init();
    }

    @@ -81,7 +132,6 @@ static const char *at91sam9x5_board_compat[] __initconst = {

    DT_MACHINE_START(at91sam9x5_dt, "Atmel AT91SAM9")
    /* Maintainer: Atmel */
    - .map_io = at91_map_io,
    .init_machine = at91sam9x5_dt_device_init,
    .dt_compat = at91sam9x5_board_compat,
    MACHINE_END
    diff --git a/arch/arm/mach-at91/soc.h b/arch/arm/mach-at91/soc.h
    index d32fc81b85b5..e74f75a25750 100644
    --- a/arch/arm/mach-at91/soc.h
    +++ b/arch/arm/mach-at91/soc.h
    @@ -48,4 +48,34 @@ at91_soc_init(const struct at91_soc_family *families);
    #define ARCH_ID_AT91RM9200 0x92
    #define AT91RM9200_CIDR_MATCH 0x09290780

    +#define ARCH_ID_SAM9 0x19
    +#define AT91SAM9260_CIDR_MATCH 0x019803a0
    +#define AT91SAM9261_CIDR_MATCH 0x019703a0
    +#define AT91SAM9263_CIDR_MATCH 0x019607a0
    +#define AT91SAM9G20_CIDR_MATCH 0x019905a0
    +#define AT91SAM9RL64_CIDR_MATCH 0x019b03a0
    +#define AT91SAM9G45_CIDR_MATCH 0x019b05a0
    +#define AT91SAM9X5_CIDR_MATCH 0x019a05a0
    +#define AT91SAM9N12_CIDR_MATCH 0x019a07a0
    +
    +#define AT91SAM9M11_EXID_MATCH 0x00000001
    +#define AT91SAM9M10_EXID_MATCH 0x00000002
    +#define AT91SAM9G46_EXID_MATCH 0x00000003
    +#define AT91SAM9G45_EXID_MATCH 0x00000004
    +
    +#define AT91SAM9G15_EXID_MATCH 0x00000000
    +#define AT91SAM9G35_EXID_MATCH 0x00000001
    +#define AT91SAM9X35_EXID_MATCH 0x00000002
    +#define AT91SAM9G25_EXID_MATCH 0x00000003
    +#define AT91SAM9X25_EXID_MATCH 0x00000004
    +
    +#define AT91SAM9CN12_EXID_MATCH 0x00000005
    +#define AT91SAM9N12_EXID_MATCH 0x00000006
    +#define AT91SAM9CN11_EXID_MATCH 0x00000009
    +
    +#define ARCH_ID_SAM9XE 0x29
    +#define AT91SAM9XE128_EXID_MATCH 0x329973a0
    +#define AT91SAM9XE256_EXID_MATCH 0x329a93a0
    +#define AT91SAM9XE512_EXID_MATCH 0x329aa3a0
    +
    #endif /* __AT91_SOC_H */
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-03-02 22:41    [W:3.913 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site