forked from Minki/linux
c9b75d51c9
rk3288 SoCs have a function to automatically switch between jtag/sdmmc pinmux settings depending on the card state. This collides with a lot of assumptions. It only works when using the internal card-detect mechanism and breaks horribly when using either the normal card-detect via the slot-gpio function or via any other pin. Also there is of course no link between the mmc and jtag on the software-side, so the jtag clocks may very well be disabled when the card is ejected and the soc switches back to the jtag pinmux. Leaving the switching function enabled did result in mmc timeouts and rcu stalls thus hanging the system on 3.19-rc1. Therefore disable it in all cases, as we expect the devicetree to explicitly select either mmc or jtag pinmuxes anyway. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Olof Johansson <olof@lixom.net>
75 lines
2.0 KiB
C
75 lines
2.0 KiB
C
/*
|
|
* Device Tree support for Rockchip SoCs
|
|
*
|
|
* Copyright (c) 2013 MundoReader S.L.
|
|
* Author: Heiko Stuebner <heiko@sntech.de>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/of_platform.h>
|
|
#include <linux/irqchip.h>
|
|
#include <linux/clk-provider.h>
|
|
#include <linux/clocksource.h>
|
|
#include <linux/mfd/syscon.h>
|
|
#include <linux/regmap.h>
|
|
#include <asm/mach/arch.h>
|
|
#include <asm/mach/map.h>
|
|
#include <asm/hardware/cache-l2x0.h>
|
|
#include "core.h"
|
|
|
|
#define RK3288_GRF_SOC_CON0 0x244
|
|
|
|
static void __init rockchip_timer_init(void)
|
|
{
|
|
if (of_machine_is_compatible("rockchip,rk3288")) {
|
|
struct regmap *grf;
|
|
|
|
/*
|
|
* Disable auto jtag/sdmmc switching that causes issues
|
|
* with the mmc controllers making them unreliable
|
|
*/
|
|
grf = syscon_regmap_lookup_by_compatible("rockchip,rk3288-grf");
|
|
if (!IS_ERR(grf))
|
|
regmap_write(grf, RK3288_GRF_SOC_CON0, 0x10000000);
|
|
else
|
|
pr_err("rockchip: could not get grf syscon\n");
|
|
}
|
|
|
|
of_clk_init(NULL);
|
|
clocksource_of_init();
|
|
}
|
|
|
|
static void __init rockchip_dt_init(void)
|
|
{
|
|
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
|
platform_device_register_simple("cpufreq-dt", 0, NULL, 0);
|
|
}
|
|
|
|
static const char * const rockchip_board_dt_compat[] = {
|
|
"rockchip,rk2928",
|
|
"rockchip,rk3066a",
|
|
"rockchip,rk3066b",
|
|
"rockchip,rk3188",
|
|
"rockchip,rk3288",
|
|
NULL,
|
|
};
|
|
|
|
DT_MACHINE_START(ROCKCHIP_DT, "Rockchip Cortex-A9 (Device Tree)")
|
|
.l2c_aux_val = 0,
|
|
.l2c_aux_mask = ~0,
|
|
.init_time = rockchip_timer_init,
|
|
.dt_compat = rockchip_board_dt_compat,
|
|
.init_machine = rockchip_dt_init,
|
|
MACHINE_END
|