From patchwork Mon Oct 16 15:26:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 10008845 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8248E601D5 for ; Mon, 16 Oct 2017 15:27:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 720A028600 for ; Mon, 16 Oct 2017 15:27:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 66E2128606; Mon, 16 Oct 2017 15:27:07 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1C5E228600 for ; Mon, 16 Oct 2017 15:27:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=ccg7BhxHsp6ks6LvheuhXyVdYxOhmM+RG+eAFsD9gcY=; b=PFx SD/z4DOQpDLZ2IRmLcCFgwab6poBvhaZCRdZXc4eKug5vwculHpqPwgJRQ+y3nG2HfvP+z7xWxP3g ER8bGAGgGCxIE+lZV8Oxt30IWwrIN/kQFU09FPjseuj2VrpiI4jzhLXnX9GHJBZ1zTOvzJZDC97WQ Uu5+nH/ZWfuzYfigzJnwp/rSNHaH4eBqSlyGgfAMy1dnG+t4ox2Pjvejf25YkRB+f9t+vWUYcRb2l KdAo3KQ98lSziFuMd995/UJBF+SoA6FiaTuVQ4jiLeOTlTI2XZjCTrzO4Hmy4UTb2tC+rkj4bItwx XT7egCb4GOP0LdC+GJ4f/LJ1s0GL5fw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1e47Hw-0007xq-9T; Mon, 16 Oct 2017 15:26:44 +0000 Received: from mail-wm0-x235.google.com ([2a00:1450:400c:c09::235]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1e47Hq-0007ts-F0 for linux-arm-kernel@lists.infradead.org; Mon, 16 Oct 2017 15:26:41 +0000 Received: by mail-wm0-x235.google.com with SMTP id 196so5603946wma.1 for ; Mon, 16 Oct 2017 08:26:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=wNxyTjvlO/fhkYnxTi8cJ7n48+E3Ph3fegGaDqcd8kM=; b=pBIk1fTEvQdm0ndi3f+2q9lTF+4DefRL4d6PwqHA2OMVFr1zt1a3TE4K9xFFqQDxOn D71Ag+mTtWmknkRD2x0ZBaM83VpBuCvMdttTfo05Lf1lKRB9Lc+q8ts/eeq2o8YuqUZ+ 7v7wLWs1N8Cd+LnjIR+dQ/Wus8E6NEqhDrJFbI99KH7YGW39u9+cxvyTY/DBXbcpqNRz aGwbjTYmcrl+b5LEc1MNj4nGYBvRIb0BkQmK5b+9umdE/IzdnqSLVS8jpq1mmXapPAdg 4EtS/XBhTkPajRQWuWqgo3yNkKRFeLDAKiIEX+RqoEyYLKww0DBYTvGAdGz1a8q+Acre 2YMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=wNxyTjvlO/fhkYnxTi8cJ7n48+E3Ph3fegGaDqcd8kM=; b=QOCvOlzke73DlqdV9UxVLWKUVTqj2LOg64b8EBVOUyRCyfeMPGdH71FnLmx9O/tcng vPZJPOzML3EVviF2BvO+g8KkDgHG0SvEBE0kYFQE129RabqHil2Xz8I6Qx18D+yjOtu6 x6zlsyLTc+rePohXw1AFvFl4IEEQYE7ySjywfhtJLbXWbWg0afnMPWUuDqnZW1BujyGi r+FHs2ORcycMWfef9ZGiP4QwOPJF6EeH3FuHX7nf5LbNl7bSxrmonQCkpdTWNbmo924Q BBg2iPGhIN1MNTIBFAbc8A+IXGuMiO6J+xpnZuqyqJido0yWe3Sdib6yj8x67zcSeIgK do7A== X-Gm-Message-State: AMCzsaVf7YQXJV9xk/XwyefnFnVN4Pym4pSARvxm96ARd/IQVr4/seCl yyCgnlHVMGkTWZFdFKZPnkGIOEW/IbI= X-Google-Smtp-Source: ABhQp+TubpyxBVAwYcBjYAfLj5ysFpmIg5Rzmx9Rx8j6kWB+bitlei3x4yvard08uMuivEW+RmYQgw== X-Received: by 10.28.155.18 with SMTP id d18mr1229770wme.107.1508167576197; Mon, 16 Oct 2017 08:26:16 -0700 (PDT) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id 188sm6163047wmg.45.2017.10.16.08.26.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 16 Oct 2017 08:26:15 -0700 (PDT) From: Neil Armstrong To: p.zabel@pengutronix.de Subject: [PATCH] reset: meson: add level reset support for GX SoC family Date: Mon, 16 Oct 2017 17:26:13 +0200 Message-Id: <1508167573-17396-1-git-send-email-narmstrong@baylibre.com> X-Mailer: git-send-email 2.7.4 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20171016_082638_736530_A02C936E X-CRM114-Status: GOOD ( 14.72 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Neil Armstrong MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP The Amlogic GX SoC family embeds alternate registers to drive the reset levels next to the pulse registers. This patch adds support for level reset handling on the GX family only. The Meson8 family has an alternate way to handle level reset. Signed-off-by: Neil Armstrong --- drivers/reset/reset-meson.c | 57 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c index a8b915e..d55e440 100644 --- a/drivers/reset/reset-meson.c +++ b/drivers/reset/reset-meson.c @@ -62,9 +62,11 @@ #include #include #include +#include #define REG_COUNT 8 #define BITS_PER_REG 32 +#define LEVEL_OFFSET 0x7c struct meson_reset { void __iomem *reg_base; @@ -88,18 +90,61 @@ static int meson_reset_reset(struct reset_controller_dev *rcdev, return 0; } -static const struct reset_control_ops meson_reset_ops = { +static int meson_reset_level(struct reset_controller_dev *rcdev, + unsigned long id, bool assert) +{ + struct meson_reset *data = + container_of(rcdev, struct meson_reset, rcdev); + unsigned int bank = id / BITS_PER_REG; + unsigned int offset = id % BITS_PER_REG; + void __iomem *reg_addr = data->reg_base + LEVEL_OFFSET + (bank << 2); + u32 reg; + + if (bank >= REG_COUNT) + return -EINVAL; + + reg = readl(reg_addr); + if (assert) + writel(reg & ~BIT(offset), reg_addr); + else + writel(reg | BIT(offset), reg_addr); + + return 0; +} + +static int meson_reset_assert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return meson_reset_level(rcdev, id, true); +} + +static int meson_reset_deassert(struct reset_controller_dev *rcdev, + unsigned long id) +{ + return meson_reset_level(rcdev, id, false); +} + +static const struct reset_control_ops meson_reset_meson8_ops = { + .reset = meson_reset_reset, +}; + +static const struct reset_control_ops meson_reset_gx_ops = { .reset = meson_reset_reset, + .assert = meson_reset_assert, + .deassert = meson_reset_deassert, }; static const struct of_device_id meson_reset_dt_ids[] = { - { .compatible = "amlogic,meson8b-reset", }, - { .compatible = "amlogic,meson-gxbb-reset", }, + { .compatible = "amlogic,meson8b-reset", + .data = (void *) &meson_reset_meson8_ops, }, + { .compatible = "amlogic,meson-gxbb-reset", + .data = (void *) &meson_reset_gx_ops, }, { /* sentinel */ }, }; static int meson_reset_probe(struct platform_device *pdev) { + const struct reset_control_ops *ops; struct meson_reset *data; struct resource *res; @@ -107,6 +152,10 @@ static int meson_reset_probe(struct platform_device *pdev) if (!data) return -ENOMEM; + ops = of_device_get_match_data(&pdev->dev); + if (!ops) + return -EINVAL; + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); data->reg_base = devm_ioremap_resource(&pdev->dev, res); if (IS_ERR(data->reg_base)) @@ -116,7 +165,7 @@ static int meson_reset_probe(struct platform_device *pdev) data->rcdev.owner = THIS_MODULE; data->rcdev.nr_resets = REG_COUNT * BITS_PER_REG; - data->rcdev.ops = &meson_reset_ops; + data->rcdev.ops = ops; data->rcdev.of_node = pdev->dev.of_node; return devm_reset_controller_register(&pdev->dev, &data->rcdev);