Commit 8b57f144 authored by Martin Blumenstingl's avatar Martin Blumenstingl
Browse files

soc: amlogic: meson-mx-secbus2: Add a driver for SECBUS2 register access - WiP

parent 553dd3b8
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -48,6 +48,14 @@ config MESON_EE_PM_DOMAINS
	  Say yes to expose Amlogic Meson Everything-Else Power Domains as
	  Generic Power Domains.

config MESON_MX_SECBUS2
	tristate "Amlogic Meson6/8/8b/8m2 SECBUS2 driver"
	depends on (ARM && ARCH_MESON) || COMPILE_TEST
	select REGMAP_MMIO
	help
	  Say yes to have support for the SECBUS2 registers on
	  Amlogic Meson6, Meson8, Meson8b and Meson8m2 SoCs.

config MESON_SECURE_PM_DOMAINS
	tristate "Amlogic Meson Secure Power Domains driver"
	depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ obj-$(CONFIG_MESON_CANVAS) += meson-canvas.o
obj-$(CONFIG_MESON_CLK_MEASURE) += meson-clk-measure.o
obj-$(CONFIG_MESON_GX_SOCINFO) += meson-gx-socinfo.o
obj-$(CONFIG_MESON_GX_PM_DOMAINS) += meson-gx-pwrc-vpu.o
obj-$(CONFIG_MESON_MX_SECBUS2) += meson-mx-secbus2.o
obj-$(CONFIG_MESON_MX_SOCINFO) += meson-mx-socinfo.o
obj-$(CONFIG_MESON_EE_PM_DOMAINS) += meson-ee-pwrc.o
obj-$(CONFIG_MESON_SECURE_PM_DOMAINS) += meson-secure-pwrc.o
+60 −0
Original line number Diff line number Diff line
/*
 * Amlogic SECBUS2 register access driver. The registers can be accessed
 * directly when not running in "secure mode". When "secure mode" is enabled
 * then these registers have to be accessed through secure monitor calls.
 * TODO: secure monitor operations are not implemented yet.
 *
 * Copyright (c) 2020 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#include <linux/device.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/resource.h>

static const struct regmap_config meson_mx_secbus2_raw_regmap_conf = {
	.reg_bits = 16,
	.val_bits = 32,
	.reg_stride = 4,
	.max_register = 0x38,
};

static int meson_mx_secbus2_probe(struct platform_device *pdev)
{
	struct regmap *regmap;
	struct resource *res;
	void __iomem *base;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(base))
		return PTR_ERR(base);

	regmap = devm_regmap_init_mmio(&pdev->dev, base,
				       &meson_mx_secbus2_raw_regmap_conf);
	return PTR_ERR_OR_ZERO(regmap);
}

static const struct of_device_id meson_mx_secbus2_match[] = {
	{ .compatible = "amlogic,meson-mx-secbus2" },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, meson_mx_secbus2_match);

static struct platform_driver meson_mx_secbus2_driver = {
	.probe = meson_mx_secbus2_probe,
	.driver = {
		.name = "meson-mx-secbus2",
		.of_match_table = of_match_ptr(meson_mx_secbus2_match),
	},
};
module_platform_driver(meson_mx_secbus2_driver);

MODULE_DESCRIPTION("Amlogic Meson6/8/8b/8m2 SECBUS2 driver");
MODULE_AUTHOR("Martin Blumenstingl <martin.blumenstingl@googlemail.com>");
MODULE_LICENSE("GPL v2");