cregit-Linux how code gets into the kernel

Release 4.11 drivers/soc/rockchip/grf.c

/*
 * Rockchip Generic Register Files setup
 *
 * Copyright (c) 2016 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 version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/err.h>
#include <linux/mfd/syscon.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>


#define HIWORD_UPDATE(val, mask, shift) \
		((val) << (shift) | (mask) << ((shift) + 16))


struct rockchip_grf_value {
	
const char *desc;
	
u32 reg;
	
u32 val;
};


struct rockchip_grf_info {
	
const struct rockchip_grf_value *values;
	
int num_values;
};


#define RK3036_GRF_SOC_CON0		0x140


static const struct rockchip_grf_value rk3036_defaults[] __initconst = {
	/*
         * Disable auto jtag/sdmmc switching that causes issues with the
         * clock-framework and the mmc controllers making them unreliable.
         */
	{ "jtag switching", RK3036_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 11) },
};


static const struct rockchip_grf_info rk3036_grf __initconst = {
	.values = rk3036_defaults,
	.num_values = ARRAY_SIZE(rk3036_defaults),
};


#define RK3288_GRF_SOC_CON0		0x244


static const struct rockchip_grf_value rk3288_defaults[] __initconst = {
	{ "jtag switching", RK3288_GRF_SOC_CON0, HIWORD_UPDATE(0, 1, 12) },
};


static const struct rockchip_grf_info rk3288_grf __initconst = {
	.values = rk3288_defaults,
	.num_values = ARRAY_SIZE(rk3288_defaults),
};


#define RK3368_GRF_SOC_CON15		0x43c


static const struct rockchip_grf_value rk3368_defaults[] __initconst = {
	{ "jtag switching", RK3368_GRF_SOC_CON15, HIWORD_UPDATE(0, 1, 13) },
};


static const struct rockchip_grf_info rk3368_grf __initconst = {
	.values = rk3368_defaults,
	.num_values = ARRAY_SIZE(rk3368_defaults),
};


#define RK3399_GRF_SOC_CON7		0xe21c


static const struct rockchip_grf_value rk3399_defaults[] __initconst = {
	{ "jtag switching", RK3399_GRF_SOC_CON7, HIWORD_UPDATE(0, 1, 12) },
};


static const struct rockchip_grf_info rk3399_grf __initconst = {
	.values = rk3399_defaults,
	.num_values = ARRAY_SIZE(rk3399_defaults),
};


static const struct of_device_id rockchip_grf_dt_match[] __initconst = {
	{
		.compatible = "rockchip,rk3036-grf",
		.data = (void *)&rk3036_grf,
        }, {
		.compatible = "rockchip,rk3288-grf",
		.data = (void *)&rk3288_grf,
        }, {
		.compatible = "rockchip,rk3368-grf",
		.data = (void *)&rk3368_grf,
        }, {
		.compatible = "rockchip,rk3399-grf",
		.data = (void *)&rk3399_grf,
        },
	{ /* sentinel */ },
};


static int __init rockchip_grf_init(void) { const struct rockchip_grf_info *grf_info; const struct of_device_id *match; struct device_node *np; struct regmap *grf; int ret, i; np = of_find_matching_node_and_match(NULL, rockchip_grf_dt_match, &match); if (!np) return -ENODEV; if (!match || !match->data) { pr_err("%s: missing grf data\n", __func__); return -EINVAL; } grf_info = match->data; grf = syscon_node_to_regmap(np); if (IS_ERR(grf)) { pr_err("%s: could not get grf syscon\n", __func__); return PTR_ERR(grf); } for (i = 0; i < grf_info->num_values; i++) { const struct rockchip_grf_value *val = &grf_info->values[i]; pr_debug("%s: adjusting %s in %#6x to %#10x\n", __func__, val->desc, val->reg, val->val); ret = regmap_write(grf, val->reg, val->val); if (ret < 0) pr_err("%s: write to %#6x failed with %d\n", __func__, val->reg, ret); } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Heiko Stübner202100.00%1100.00%
Total202100.00%1100.00%

postcore_initcall(rockchip_grf_init);

Overall Contributors

PersonTokensPropCommitsCommitProp
Heiko Stübner552100.00%1100.00%
Total552100.00%1100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.