From patchwork Wed Feb 27 18:56:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jagan Teki X-Patchwork-Id: 1049106 X-Patchwork-Delegate: jagannadh.teki@gmail.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=amarulasolutions.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="aGEh2QqN"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 448lQT2Vxnz9s1b for ; Thu, 28 Feb 2019 06:01:21 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 01C0BC21C29; Wed, 27 Feb 2019 18:59:02 +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_H3, RCVD_IN_MSPIKE_WL, 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 9F0F1C21DB5; Wed, 27 Feb 2019 18:58:53 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id D7C78C21C29; Wed, 27 Feb 2019 18:57:53 +0000 (UTC) Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by lists.denx.de (Postfix) with ESMTPS id 5339DC21DB3 for ; Wed, 27 Feb 2019 18:57:49 +0000 (UTC) Received: by mail-pg1-f194.google.com with SMTP id r124so8396738pgr.3 for ; Wed, 27 Feb 2019 10:57:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=JNbFua916z7EXzXGnaag0ywM8QHSTnOQBROB7NWLatQ=; b=aGEh2QqNe9AgTByAZm8YlpamdFD3OLG0NmxEeu/Z2ugBEAX7vJmo5+wsqOy9VcpJtX JC0XjllZUlFHy89wX6bAArDYVZPjJhhG2K3dWjckX7aKFJvg14LmKoz79M8siWLt2TLO MfO1O5c5QeCPqy7UiJT+giPB7gbLxJqMd4BV4= 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=JNbFua916z7EXzXGnaag0ywM8QHSTnOQBROB7NWLatQ=; b=mP9G9dqkcUapqjxpfBpin0FS3Rc8PJWJpBf+GSTvyJ+AiIUxy5XH/vjpSyVtWvYxMw e5jwY6nHnLq79lJ4ibXfsdDa+ZhZ5PJ71JdtrnpciMRS8q0KPULGGHfXZ06VpEQPmAmk lHyul9SYOm9mf0oJfMF3CfFRjrlFPX/0/Mbe50Geirbu6NFxz3O/ZeOkT6cS8yia7ZP+ Ecs3n5MJrEe8Xse+kc0F65l4SZ8EiuzXHKDIP1r3obkGnsy3+hqQnFdPLNRu6rjwogYv RzBlSSErl03AnVcHRoMDf6Ew1nCydCWHnClkIFWKHin6+Xtb3BgvM6j3nHEeBq5tJH7F KHlA== X-Gm-Message-State: AHQUAuaF/8u4V/+ZJdTfPR5/VWecFbMFiF7mn7scVukThMXJTGA5+s87 rFhX07HDLTGuZqviIyGdqFX99A== X-Google-Smtp-Source: AHgI3IbtH8uLhJwm8wXH9mtEu/0j8s8HmJ2F5LTc4GwWvT9K2qnohdWSSMoSq7N1v3H41srfSzAHaQ== X-Received: by 2002:a62:57d7:: with SMTP id i84mr3178195pfj.125.1551293867824; Wed, 27 Feb 2019 10:57:47 -0800 (PST) Received: from localhost.localdomain ([115.97.184.151]) by smtp.gmail.com with ESMTPSA id z6sm22020802pgo.31.2019.02.27.10.57.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Feb 2019 10:57:46 -0800 (PST) From: Jagan Teki To: =?utf-8?q?Andr=C3=A9_Przywara?= , Maxime Ripard , Chen-Yu Tsai Date: Thu, 28 Feb 2019 00:26:55 +0530 Message-Id: <20190227185701.15545-8-jagan@amarulasolutions.com> X-Mailer: git-send-email 2.18.0.321.gffc6fa0e3 In-Reply-To: <20190227185701.15545-1-jagan@amarulasolutions.com> References: <20190227185701.15545-1-jagan@amarulasolutions.com> MIME-Version: 1.0 Cc: u-boot@lists.denx.de, linux-sunxi@googlegroups.com, Stephen Warren Subject: [U-Boot] [PATCH v3 07/13] reset: Get the RESET by index without device 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: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Getting a RESET by index with device is not straight forward for some use-cases like handling clock operations for child node in parent driver. So we need to process the child node in parent probe via ofnode and process RESET operation for child without udevice but with ofnode. So add reset_get_by_index_nodev() and move the common code in reset_get_by_index_tail() to use for reset_get_by_index() Cc: Stephen Warren Signed-off-by: Jagan Teki Reviewed-by: Simon Glass --- drivers/reset/reset-uclass.c | 53 ++++++++++++++++++++++++------------ include/reset.h | 16 +++++++++++ 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/drivers/reset/reset-uclass.c b/drivers/reset/reset-uclass.c index 89e39c6b5a..ee1a423ffb 100644 --- a/drivers/reset/reset-uclass.c +++ b/drivers/reset/reset-uclass.c @@ -29,41 +29,34 @@ static int reset_of_xlate_default(struct reset_ctl *reset_ctl, return 0; } -int reset_get_by_index(struct udevice *dev, int index, - struct reset_ctl *reset_ctl) +static int reset_get_by_index_tail(int ret, ofnode node, + struct ofnode_phandle_args *args, + const char *list_name, int index, + struct reset_ctl *reset_ctl) { - struct ofnode_phandle_args args; - int ret; struct udevice *dev_reset; struct reset_ops *ops; - debug("%s(dev=%p, index=%d, reset_ctl=%p)\n", __func__, dev, index, - reset_ctl); + assert(reset_ctl); reset_ctl->dev = NULL; - - ret = dev_read_phandle_with_args(dev, "resets", "#reset-cells", 0, - index, &args); - if (ret) { - debug("%s: fdtdec_parse_phandle_with_args() failed: %d\n", - __func__, ret); + if (ret) return ret; - } - ret = uclass_get_device_by_ofnode(UCLASS_RESET, args.node, + ret = uclass_get_device_by_ofnode(UCLASS_RESET, args->node, &dev_reset); if (ret) { debug("%s: uclass_get_device_by_ofnode() failed: %d\n", __func__, ret); - debug("%s %d\n", ofnode_get_name(args.node), args.args[0]); + debug("%s %d\n", ofnode_get_name(args->node), args->args[0]); return ret; } ops = reset_dev_ops(dev_reset); reset_ctl->dev = dev_reset; if (ops->of_xlate) - ret = ops->of_xlate(reset_ctl, &args); + ret = ops->of_xlate(reset_ctl, args); else - ret = reset_of_xlate_default(reset_ctl, &args); + ret = reset_of_xlate_default(reset_ctl, args); if (ret) { debug("of_xlate() failed: %d\n", ret); return ret; @@ -78,6 +71,32 @@ int reset_get_by_index(struct udevice *dev, int index, return 0; } +int reset_get_by_index(struct udevice *dev, int index, + struct reset_ctl *reset_ctl) +{ + struct ofnode_phandle_args args; + int ret; + + ret = dev_read_phandle_with_args(dev, "resets", "#reset-cells", 0, + index, &args); + + return reset_get_by_index_tail(ret, dev_ofnode(dev), &args, "resets", + index > 0, reset_ctl); +} + +int reset_get_by_index_nodev(ofnode node, int index, + struct reset_ctl *reset_ctl) +{ + struct ofnode_phandle_args args; + int ret; + + ret = ofnode_parse_phandle_with_args(node, "resets", "#reset-cells", 0, + index > 0, &args); + + return reset_get_by_index_tail(ret, node, &args, "resets", + index > 0, reset_ctl); +} + int reset_get_bulk(struct udevice *dev, struct reset_ctl_bulk *bulk) { int i, ret, err, count; diff --git a/include/reset.h b/include/reset.h index 65aa7a4ce5..57bbc0b49d 100644 --- a/include/reset.h +++ b/include/reset.h @@ -6,6 +6,7 @@ #ifndef _RESET_H #define _RESET_H +#include #include /** @@ -99,6 +100,21 @@ struct reset_ctl_bulk { int reset_get_by_index(struct udevice *dev, int index, struct reset_ctl *reset_ctl); +/** + * reset_get_by_index_nodev - Get/request a reset signal by integer index + * without a device. + * + * This is a version of reset_get_by_index() that does not use a device. + * + * @node: The client ofnode. + * @index: The index of the reset signal to request, within the client's + * list of reset signals. + * @reset_ctl A pointer to a reset control struct to initialize. + * @return 0 if OK, or a negative error code. + */ +int reset_get_by_index_nodev(ofnode node, int index, + struct reset_ctl *reset_ctl); + /** * reset_get_bulk - Get/request all reset signals of a device. *