From patchwork Thu Mar 29 12:55:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 892783 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=baylibre-com.20150623.gappssmtp.com header.i=@baylibre-com.20150623.gappssmtp.com header.b="l1dlEl5m"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 40Bl9F0YyFz9ry1 for ; Thu, 29 Mar 2018 23:55:43 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 48D72C21F05; Thu, 29 Mar 2018 12:55:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 57BB6C21D74; Thu, 29 Mar 2018 12:55:34 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id B9DF1C21E2F; Thu, 29 Mar 2018 12:55:32 +0000 (UTC) Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by lists.denx.de (Postfix) with ESMTPS id C1E5FC21C27 for ; Thu, 29 Mar 2018 12:55:30 +0000 (UTC) Received: by mail-wr0-f193.google.com with SMTP id l49so5322517wrl.4 for ; Thu, 29 Mar 2018 05:55:30 -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=0dkxTpSPgYegPzbhvVTl9Y+8Icl3hoVicLertEkP3HY=; b=l1dlEl5mV8Ra23lKzqNDbujz1Bb28Xg7vr7uJvigr//wldOhXGu0iYn0FkTtIJ8B93 VtLWicJ1D5Y34a68qHuZJVJLdAw1ZHurgyXJteKv6BHaSjSsF/FjDZ/+XYikmvRwAnLQ EVWLmdLGMiyRTsQHvKjrnq8kX0sdckSSrXTgEzs0LbS/Kt19At6s8ayfqh6ck4JwdheL /d2tqfuhiqGxUCcp7otfhdW6bVgRzPg0xIUdzONagv9hdFDya0BougnuvX87KlYOmJEm f/1mZlFPwHSAR/NYWZEUhsVvx7ECsgpEn7dgEK4mBgkftUFlPcug56qoDzoAK3TjZPoR MxtQ== 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=0dkxTpSPgYegPzbhvVTl9Y+8Icl3hoVicLertEkP3HY=; b=cQqRM/B1CqFa0nEEpwp9N36WvZdXigoyuMclzKb4p5m9gTyUkX5aXTCNB0U1/CXVSn e5CfzIfKx0z0++QTe03oBOTu0blPOXcXXObkzB+10YKRBOA/+EG5M/HGDOBElR3LZdK6 TtI6BMA9cA1SJUmNgcV7AN8qCCGFTofcwMLtxjNxGgodNK/V6EpSa5BrB6IuYKgqcF/m xsTVzTbhw3cMw1fJz4YHFQoMbleGdpE5xVDBmf+ii3cZajt7ATd3v1LKG885NNQLHhzo J3bUsB/k1LAp67QgruXlE1crSiUwSg2a5ECYzwDxj+6hDs27O5qBn44G4akmhem77lkk vkwg== X-Gm-Message-State: AElRT7EdQ97xmOHpokrWFFpZhS0Qgoq4j4Wzlbuk8oB9JuMS4H1T0UTY W8EzKuxAiHpZUzES3YHqcWnwlvhvryQ= X-Google-Smtp-Source: AIpwx49ZZvCp13EJj3+srjr5Trc9lmQsdR+gcIUKNJ8+R47CZEtbY2jO/xoHYyLU+A5rJr4nd2FJgA== X-Received: by 10.223.138.138 with SMTP id y10mr5957107wry.44.1522328129644; Thu, 29 Mar 2018 05:55:29 -0700 (PDT) Received: from bender.home ([2a01:cb1d:4ce:ea00:35c7:f264:355a:6031]) by smtp.gmail.com with ESMTPSA id k14sm8443659wrc.62.2018.03.29.05.55.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 29 Mar 2018 05:55:28 -0700 (PDT) From: Neil Armstrong To: u-boot@lists.denx.de Date: Thu, 29 Mar 2018 14:55:25 +0200 Message-Id: <1522328125-13670-1-git-send-email-narmstrong@baylibre.com> X-Mailer: git-send-email 2.7.4 Cc: trini@konsulko.com, linux-amlogic@lists.infradead.org Subject: [U-Boot] [PATCH u-boot] reset: Add Amlogic Meson Reset Controller X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" The Amlogic Meson SoCs embeds up to 256 reset lines, add the corresponding driver. Signed-off-by: Neil Armstrong --- drivers/reset/Kconfig | 8 ++++ drivers/reset/Makefile | 1 + drivers/reset/reset-meson.c | 90 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 drivers/reset/reset-meson.c diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index 3964b9e..fffa41e 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig @@ -83,4 +83,12 @@ config RESET_ROCKCHIP though is that some reset signals, like I2C or MISC reset multiple devices. +config RESET_MESON + bool "Reset controller driver for Amlogic Meson SoCs" + depends on DM_RESET && ARCH_MESON + imply REGMAP + default y + help + Support for reset controller on Amlogic Meson SoC. + endmenu diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index 7d7e080..d1d5146 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile @@ -13,3 +13,4 @@ obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o obj-$(CONFIG_RESET_UNIPHIER) += reset-uniphier.o obj-$(CONFIG_AST2500_RESET) += ast2500-reset.o obj-$(CONFIG_RESET_ROCKCHIP) += reset-rockchip.o +obj-$(CONFIG_RESET_MESON) += reset-meson.o diff --git a/drivers/reset/reset-meson.c b/drivers/reset/reset-meson.c new file mode 100644 index 0000000..5324f86 --- /dev/null +++ b/drivers/reset/reset-meson.c @@ -0,0 +1,90 @@ +/* + * Amlogic Meson Reset Controller driver + * + * Copyright (c) 2018 BayLibre, SAS. + * Author: Neil Armstrong + * + * SPDX-License-Identifier: GPL-2.0 + */ + +#include +#include +#include +#include + +#define REG_COUNT 8 +#define BITS_PER_REG 32 +#define LEVEL_OFFSET 0x7c + +struct meson_reset_priv { + struct regmap *regmap; +}; + +static int meson_reset_request(struct reset_ctl *reset_ctl) +{ + if (reset_ctl->id > (REG_COUNT * BITS_PER_REG)) + return -EINVAL; + + return 0; +} + +static int meson_reset_free(struct reset_ctl *reset_ctl) +{ + return 0; +} + +static int meson_reset_level(struct reset_ctl *reset_ctl, bool assert) +{ + struct meson_reset_priv *priv = dev_get_priv(reset_ctl->dev); + uint bank = reset_ctl->id / BITS_PER_REG; + uint offset = reset_ctl->id % BITS_PER_REG; + uint reg_offset = LEVEL_OFFSET + (bank << 2); + uint val; + + regmap_read(priv->regmap, reg_offset, &val); + if (assert) + val &= ~BIT(offset); + else + val |= BIT(offset); + regmap_write(priv->regmap, reg_offset, val); + + return 0; +} + +static int meson_reset_assert(struct reset_ctl *reset_ctl) +{ + return meson_reset_level(reset_ctl, true); +} + +static int meson_reset_deassert(struct reset_ctl *reset_ctl) +{ + return meson_reset_level(reset_ctl, false); +} + +struct reset_ops meson_reset_ops = { + .request = meson_reset_request, + .free = meson_reset_free, + .rst_assert = meson_reset_assert, + .rst_deassert = meson_reset_deassert, +}; + +static const struct udevice_id meson_reset_ids[] = { + { .compatible = "amlogic,meson-gxbb-reset" }, + { } +}; + +static int meson_reset_probe(struct udevice *dev) +{ + struct meson_reset_priv *priv = dev_get_priv(dev); + + return regmap_init_mem(dev, &priv->regmap); +} + +U_BOOT_DRIVER(meson_reset) = { + .name = "meson_reset", + .id = UCLASS_RESET, + .of_match = meson_reset_ids, + .probe = meson_reset_probe, + .ops = &meson_reset_ops, + .priv_auto_alloc_size = sizeof(struct meson_reset_priv), +};