Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f0e0ada6 authored by Philipp Zabel's avatar Philipp Zabel
Browse files

reset: zx2967: use the reset-simple driver



The reset-simple driver can be used without changes.

Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: default avatarAlexandru Gagniuc <alex.g@adaptrum.com>
parent 0af8a137
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -2124,7 +2124,6 @@ F: drivers/gpio/gpio-zx.c
F:	drivers/i2c/busses/i2c-zx2967.c
F:	drivers/mmc/host/dw_mmc-zx.*
F:	drivers/pinctrl/zte/
F:	drivers/reset/reset-zx2967.c
F:	drivers/soc/zte/
F:	drivers/thermal/zx2967_thermal.c
F:	drivers/watchdog/zx2967_wdt.c
+2 −8
Original line number Diff line number Diff line
@@ -77,14 +77,14 @@ config RESET_PISTACHIO

config RESET_SIMPLE
	bool "Simple Reset Controller Driver" if COMPILE_TEST
	default ARCH_SOCFPGA || ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI
	default ARCH_SOCFPGA || ARCH_STM32 || ARCH_STRATIX10 || ARCH_SUNXI || ARCH_ZX
	help
	  This enables a simple reset controller driver for reset lines that
	  that can be asserted and deasserted by toggling bits in a contiguous,
	  exclusive register space.

	  Currently this driver supports Altera SoCFPGAs, the RCC reset
	  controller in STM32 MCUs, and Allwinner SoCs.
	  controller in STM32 MCUs, Allwinner SoCs, and ZTE's zx2967 family.

config RESET_SUNXI
	bool "Allwinner SoCs Reset Driver" if COMPILE_TEST && !ARCH_SUNXI
@@ -121,12 +121,6 @@ config RESET_UNIPHIER
	  Say Y if you want to control reset signals provided by System Control
	  block, Media I/O block, Peripheral Block.

config RESET_ZX2967
	bool "ZTE ZX2967 Reset Driver"
	depends on ARCH_ZX || COMPILE_TEST
	help
	  This enables the reset controller driver for ZTE's zx2967 family.

config RESET_ZYNQ
	bool "ZYNQ Reset Driver" if COMPILE_TEST
	default ARCH_ZYNQ
+0 −1
Original line number Diff line number Diff line
@@ -17,6 +17,5 @@ obj-$(CONFIG_RESET_SUNXI) += reset-sunxi.o
obj-$(CONFIG_RESET_TI_SCI) += reset-ti-sci.o
obj-$(CONFIG_RESET_TI_SYSCON) += reset-ti-syscon.o
obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o
obj-$(CONFIG_RESET_ZX2967) += reset-zx2967.o
obj-$(CONFIG_RESET_ZYNQ) += reset-zynq.o
+2 −0
Original line number Diff line number Diff line
@@ -123,6 +123,8 @@ static const struct of_device_id reset_simple_dt_ids[] = {
	{ .compatible = "st,stm32-rcc", },
	{ .compatible = "allwinner,sun6i-a31-clock-reset",
		.data = &reset_simple_active_low },
	{ .compatible = "zte,zx296718-reset",
		.data = &reset_simple_active_low },
	{ /* sentinel */ },
};

drivers/reset/reset-zx2967.c

deleted100644 → 0
+0 −99
Original line number Diff line number Diff line
/*
 * ZTE's zx2967 family reset controller driver
 *
 * Copyright (C) 2017 ZTE Ltd.
 *
 * Author: Baoyou Xie <baoyou.xie@linaro.org>
 *
 * License terms: GNU General Public License (GPL) version 2
 */

#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/reset-controller.h>

struct zx2967_reset {
	void __iomem			*reg_base;
	spinlock_t			lock;
	struct reset_controller_dev	rcdev;
};

static int zx2967_reset_act(struct reset_controller_dev *rcdev,
			    unsigned long id, bool assert)
{
	struct zx2967_reset *reset = NULL;
	int bank = id / 32;
	int offset = id % 32;
	u32 reg;
	unsigned long flags;

	reset = container_of(rcdev, struct zx2967_reset, rcdev);

	spin_lock_irqsave(&reset->lock, flags);

	reg = readl_relaxed(reset->reg_base + (bank * 4));
	if (assert)
		reg &= ~BIT(offset);
	else
		reg |= BIT(offset);
	writel_relaxed(reg, reset->reg_base + (bank * 4));

	spin_unlock_irqrestore(&reset->lock, flags);

	return 0;
}

static int zx2967_reset_assert(struct reset_controller_dev *rcdev,
			       unsigned long id)
{
	return zx2967_reset_act(rcdev, id, true);
}

static int zx2967_reset_deassert(struct reset_controller_dev *rcdev,
				 unsigned long id)
{
	return zx2967_reset_act(rcdev, id, false);
}

static const struct reset_control_ops zx2967_reset_ops = {
	.assert		= zx2967_reset_assert,
	.deassert	= zx2967_reset_deassert,
};

static int zx2967_reset_probe(struct platform_device *pdev)
{
	struct zx2967_reset *reset;
	struct resource *res;

	reset = devm_kzalloc(&pdev->dev, sizeof(*reset), GFP_KERNEL);
	if (!reset)
		return -ENOMEM;

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

	spin_lock_init(&reset->lock);

	reset->rcdev.owner = THIS_MODULE;
	reset->rcdev.nr_resets = resource_size(res) * 8;
	reset->rcdev.ops = &zx2967_reset_ops;
	reset->rcdev.of_node = pdev->dev.of_node;

	return devm_reset_controller_register(&pdev->dev, &reset->rcdev);
}

static const struct of_device_id zx2967_reset_dt_ids[] = {
	 { .compatible = "zte,zx296718-reset", },
	 {},
};

static struct platform_driver zx2967_reset_driver = {
	.probe	= zx2967_reset_probe,
	.driver = {
		.name		= "zx2967-reset",
		.of_match_table	= zx2967_reset_dt_ids,
	},
};
builtin_platform_driver(zx2967_reset_driver);