forked from Minki/linux
d4d24c1b4f
This patch prepare the transition to common clk for sama5 dt boards by replacing the timer init callback. Clocks registration cannot be done in early init callback (as formerly done by the old clk implementation) because it requires dynamic allocation which is not ready yet during early init. In the other hand, at91 clocks must be registered before at91sam926x_pit_init is called because PIT (Periodic Interval Timer) driver request the master clk (mck). A new function (at91sama5_dt_timer_init) is created to fullfil these needs. This function registers all at91 clks using the dt definition before calling the PIT init function. The device tree clock registration is enabled only if common clk is selected. Else the old clk registration is been done during at91_dt_initialize call. Signed-off-by: Boris BREZILLON <b.brezillon@overkiz.com> Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>
91 lines
2.1 KiB
C
91 lines
2.1 KiB
C
/*
|
|
* Setup code for SAMA5 Evaluation Kits with Device Tree support
|
|
*
|
|
* Copyright (C) 2013 Atmel,
|
|
* 2013 Ludovic Desroches <ludovic.desroches@atmel.com>
|
|
*
|
|
* Licensed under GPLv2 or later.
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/init.h>
|
|
#include <linux/module.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/micrel_phy.h>
|
|
#include <linux/of.h>
|
|
#include <linux/of_irq.h>
|
|
#include <linux/of_platform.h>
|
|
#include <linux/phy.h>
|
|
#include <linux/clk-provider.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 "at91_aic.h"
|
|
#include "generic.h"
|
|
|
|
static void __init sama5_dt_timer_init(void)
|
|
{
|
|
#if defined(CONFIG_COMMON_CLK)
|
|
of_clk_init(NULL);
|
|
#endif
|
|
at91sam926x_pit_init();
|
|
}
|
|
|
|
static const struct of_device_id irq_of_match[] __initconst = {
|
|
|
|
{ .compatible = "atmel,sama5d3-aic", .data = at91_aic5_of_init },
|
|
{ /*sentinel*/ }
|
|
};
|
|
|
|
static void __init at91_dt_init_irq(void)
|
|
{
|
|
of_irq_init(irq_of_match);
|
|
}
|
|
|
|
static int ksz9021rn_phy_fixup(struct phy_device *phy)
|
|
{
|
|
int value;
|
|
|
|
/* Set delay values */
|
|
value = MICREL_KSZ9021_RGMII_CLK_CTRL_PAD_SCEW | 0x8000;
|
|
phy_write(phy, MICREL_KSZ9021_EXTREG_CTRL, value);
|
|
value = 0xF2F4;
|
|
phy_write(phy, MICREL_KSZ9021_EXTREG_DATA_WRITE, value);
|
|
value = MICREL_KSZ9021_RGMII_RX_DATA_PAD_SCEW | 0x8000;
|
|
phy_write(phy, MICREL_KSZ9021_EXTREG_CTRL, value);
|
|
value = 0x2222;
|
|
phy_write(phy, MICREL_KSZ9021_EXTREG_DATA_WRITE, value);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void __init sama5_dt_device_init(void)
|
|
{
|
|
if (of_machine_is_compatible("atmel,sama5d3xcm") &&
|
|
IS_ENABLED(CONFIG_PHYLIB))
|
|
phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK,
|
|
ksz9021rn_phy_fixup);
|
|
|
|
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
|
}
|
|
|
|
static const char *sama5_dt_board_compat[] __initdata = {
|
|
"atmel,sama5",
|
|
NULL
|
|
};
|
|
|
|
DT_MACHINE_START(sama5_dt, "Atmel SAMA5 (Device Tree)")
|
|
/* Maintainer: Atmel */
|
|
.init_time = sama5_dt_timer_init,
|
|
.map_io = at91_map_io,
|
|
.handle_irq = at91_aic5_handle_irq,
|
|
.init_early = at91_dt_initialize,
|
|
.init_irq = at91_dt_init_irq,
|
|
.init_machine = sama5_dt_device_init,
|
|
.dt_compat = sama5_dt_board_compat,
|
|
MACHINE_END
|