From patchwork Tue Oct 17 10:19:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 10011681 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 26AB2600CC for ; Tue, 17 Oct 2017 11:07:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 18BB328856 for ; Tue, 17 Oct 2017 11:07:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0D2C728857; Tue, 17 Oct 2017 11:07:36 +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 731A928858 for ; Tue, 17 Oct 2017 11:07:32 +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=obVvQJh8NuBHFj/zCVjnq+oEMbFJOhBfB73AYuQ1RaY=; b=kog qwPRZ8rcgyqlnVw7EA1FrRTpPFH7A0XkoOW2s5Re8/irV1x5m+ywndgumH4zEHhZXhiV6vgWhyfR4 1qmfuNkJiuu8UlvWM4lJyUvU8ZAkCBXbTVELZ+S5T1+UPdsrmAS+qFDz3yI1jiuKDWMeATpf0JN4S 2P8IB5pdqVcdwJUgx4TS2E0onZ0whv1BIdjHNbehrX017Jp31W55UT8t5hozfsHdWoBuf8E7LTxlU eMghioyyGWSn4LmVlCrDBd0I9gXSy1L3gEx8enrMYAuIhQjQ8odd8rYG/7C35ldkEPDDxfTLWrJh8 RZV9pSr9/w8MsnE1vKCm+pT0ydiqvlg==; 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 1e4Pic-0000Qy-UQ; Tue, 17 Oct 2017 11:07:30 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1e4PR2-00043O-De for linux-arm-kernel@bombadil.infradead.org; Tue, 17 Oct 2017 10:49:20 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=quhiOK3npaszFsaEjaUJZ/eVVZM+UPUQtX0L+baGjW8=; b=xKp6hGSdnTTBMPJN3mk0rgml7 Vur5xB2yXslbHkc4DrZTbwiWy6uH5cA8Inyo1roe9ScgUffTlq2zaqqf77dJlTgMyDjds1KFWJeQe t8kbR8tokf4MEkcw+ru3bVo+fF+tb6XPrWHbLLEAdbETJ/mR5QBiRNO0UpTorh+R9+72OTcnai9BZ 8bc/gZcPPoprGz3g++YcxrNs2VBpAZ2dzWJZZIkljWr0xtX4smHjQwdkhoDC6+pjYfeg6angsS5lS L1/2Fl8s92/KRJ+XnvB/otJ47tLc7JTniYqeUujZhbzG36Z+ZiwybuymUWN03rDtVTeoQoa30KyDn XEsMzRVmQ==; Received: from mail-wm0-x236.google.com ([2a00:1450:400c:c09::236]) by merlin.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1e4OyO-0007NJ-Vv for linux-arm-kernel@lists.infradead.org; Tue, 17 Oct 2017 10:19:46 +0000 Received: by mail-wm0-x236.google.com with SMTP id k4so2893464wmc.1 for ; Tue, 17 Oct 2017 03:19:24 -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=quhiOK3npaszFsaEjaUJZ/eVVZM+UPUQtX0L+baGjW8=; b=Iv3Aj5Fg+dyGVlqRXeH7UzSu0e6dUHGAwC7VpmY+1o46HRZJDKUHwGZk80kO7Fsg26 lc5Nm1+s03JGYfTzLCJuAldjtdrOIzr6+aQXAnWmFjYIDdxhjlrP9SlkB8qWZ12dHnio +mttq/CpvLc+dWHzFNMIJ+XB/c4LnrMvsrL4dPHe1/9Yk0dTDi4YbiNZL8cFFaBeGicI VeeXfj0p+tPYWRPvvwThMs6sc9Lq6U8d0WzczNuGAo6us8hCVBWhdo+8vkvTqqudJbsG y4QAwstYMBP8Y2nEcCGmI8C08fZAD9k1GtSLoFYAvXNHIYRA6XhysQB0djyfsmwbkb3d YQ/w== 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=quhiOK3npaszFsaEjaUJZ/eVVZM+UPUQtX0L+baGjW8=; b=iR5CY0E/uwB6TySDIoJDznCOC450oRGo+j27zFiL+bZzK9+3qgBXB7oaXZlDjYFFlk NhuVFZlRA7R2uYZHMROPHYCc3yr5NoARuZpLEFVZB7z4bpfNHpqzu1xPBrQy8N6ZoPuL 9CyyCP1dFNKkWnapTKXKKFQHOqtV3P2jutY060SMxBxlwj7+YZCaKyjKmjkv6jsTcnSs SlQcDZKYPVw04HoM5VVGTCgYqY2FcxWEadTsu+5/S6+pQMq7JlqcQ8hKwo9Z93V6lBp/ f3thQrL2W3jxvyZS0q896lZS5Fzo9Ugv2i9mhmH4tjFGHjrJVr0CKYyBINAQoH/uQyp3 Fkvg== X-Gm-Message-State: AMCzsaVp7has3JZumMyD2H5g8l+pMnVb38lE+lFwyhO1ixCnntllMNcy eQRuJw2c1x5Bict0wrkENx4z4A== X-Google-Smtp-Source: ABhQp+TV8h2N9Z4YdMQZHpac4IXTKf0SRnkYheQ1N7/fuhqmoYayhNB5tQcW7Ldhqu3rospmShYFSw== X-Received: by 10.28.210.72 with SMTP id j69mr3332376wmg.75.1508235563047; Tue, 17 Oct 2017 03:19:23 -0700 (PDT) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id 17sm20147199wru.32.2017.10.17.03.19.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 17 Oct 2017 03:19:22 -0700 (PDT) From: Neil Armstrong To: p.zabel@pengutronix.de Subject: [PATCH v2] reset: meson: add level reset support for GX SoC family Date: Tue, 17 Oct 2017 12:19:18 +0200 Message-Id: <1508235558-24860-1-git-send-email-narmstrong@baylibre.com> X-Mailer: git-send-email 2.7.4 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 | 62 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) Changes since v1: - protected read/change/modify with a spinlock - removed unnedded check - remove useless type conversion diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c index a8b915e..f3b9d69 100644 --- a/drivers/reset/reset-meson.c +++ b/drivers/reset/reset-meson.c @@ -62,13 +62,16 @@ #include #include #include +#include #define REG_COUNT 8 #define BITS_PER_REG 32 +#define LEVEL_OFFSET 0x7c struct meson_reset { void __iomem *reg_base; struct reset_controller_dev rcdev; + spinlock_t lock; }; static int meson_reset_reset(struct reset_controller_dev *rcdev, @@ -88,18 +91,63 @@ 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); + unsigned long flags; + u32 reg; + + spin_lock_irqsave(&data->lock, flags); + + reg = readl(reg_addr); + if (assert) + writel(reg & ~BIT(offset), reg_addr); + else + writel(reg | BIT(offset), reg_addr); + + spin_unlock_irqrestore(&data->lock, flags); + + 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 = &meson_reset_meson8_ops, }, + { .compatible = "amlogic,meson-gxbb-reset", + .data = &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 +155,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)) @@ -114,9 +166,11 @@ static int meson_reset_probe(struct platform_device *pdev) platform_set_drvdata(pdev, data); + spin_lock_init(&data->lock); + 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);