Received: by 10.223.185.116 with SMTP id b49csp8925471wrg; Fri, 2 Mar 2018 10:14:47 -0800 (PST) X-Google-Smtp-Source: AG47ELv5OSeMJliCfXfwvY6r1oD+anYFGhDyKqruqdYsgmbOjlI8c+Y+NFj/DfSdxDZwo/HFh/RZ X-Received: by 2002:a17:902:7e4a:: with SMTP id a10-v6mr5984665pln.207.1520014487116; Fri, 02 Mar 2018 10:14:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520014487; cv=none; d=google.com; s=arc-20160816; b=L2kbbgkcxIjKDvelGTwszF9IGFBZ4L6ltDdlpt2WHwUj5lu/X2DM9utzW7w3VZ1Wee 3uSwmz18gJUqhK+l/xSINaBnkocezAm/3iIQPmC38VzM5AG80u7NPW3QJBIki6/rvgDZ sGEcYRDk5//ndtoj2kRVSSMnyaF0R1Z/t23YZ3mYqOAivc4x3dcAVksOXa3IotxHH3O8 uWtGazErFSD+JtDJVlDpVz1180gOkQVGhWxXoRttz5LB0tPczvOWSmSAeFq1UmvHBCao wB0raoseeVnswoCxxSS7b7fHLYmt+oz4FBj3YLNqM4BogEFCYEvbwCQqD/LASrqQCokV wnsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:cms-type:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature:dkim-filter :arc-authentication-results; bh=g/xqh53iA0N5w+JkgWYz6ujFZRLmxi8OW+U7DIj2PUo=; b=dikRafOS16gT6Rbw8OTuunLyPf12/JVuw3Cxh1c7z4M9QNiDQI38L4BUZ18xOZPXm7 2yETTfAiVqsY3l2yQ2NsU8DHnPWZaKF9DT19NFEKSA/BULdH+YKTaspnw/oDp5hXSt4I MD262CZDkX03HVu0e/BD+YapTU7WDdp+Vulf516qB3aKD8oaYBrkOMmhfDPENrz1i+B5 V7jkiDaMsrjNweEyCc18KwhpLNZR7RuKrwYvM8YHEPpjAkSKNAzsocgFLK6yZ0ck0lQM Zi8RhPQRw5HDBQADs2tJ86IucIFXhkvhH74PLM210hnPFhTjUXc6c5iT+S7GcYE6SCRf YkHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b=UdOJ34cU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f30-v6si5153565plf.654.2018.03.02.10.14.31; Fri, 02 Mar 2018 10:14:47 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b=UdOJ34cU; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1427191AbeCBLYK (ORCPT + 99 others); Fri, 2 Mar 2018 06:24:10 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:37896 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1165055AbeCBIvb (ORCPT ); Fri, 2 Mar 2018 03:51:31 -0500 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20180302085129euoutp025128361346449f43015f683e61abb6b9~YDmJJv_1Y0222702227euoutp02W; Fri, 2 Mar 2018 08:51:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20180302085129euoutp025128361346449f43015f683e61abb6b9~YDmJJv_1Y0222702227euoutp02W DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1519980689; bh=g/xqh53iA0N5w+JkgWYz6ujFZRLmxi8OW+U7DIj2PUo=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=UdOJ34cUJaaKmPwGNbA7HITy8tGzCrUs69oH2mvf+LviVOnWFgsp8g6ypelnw+Crm vW0o5gvUyJUM5fzp4/DnNhKvQarg1IPEb11XVhVF0CBKlAtJOUACz/AJj3C4lbSQwM i5TZwca4qhkvQqfZ3U4/rOOw3zp1WkYYt6YR7pmc= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20180302085128eucas1p1e7811d846a0bc7057b477a2c896cf075~YDmIbJrcj1560515605eucas1p1c; Fri, 2 Mar 2018 08:51:28 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 48.4A.10409.090199A5; Fri, 2 Mar 2018 08:51:28 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20180302085127eucas1p19293e26a9abe8f7df6936912e6999b3f~YDmHlZuoY1382913829eucas1p1W; Fri, 2 Mar 2018 08:51:27 +0000 (GMT) X-AuditID: cbfec7f5-f95739c0000028a9-49-5a991090a726 Received: from eusync1.samsung.com ( [203.254.199.211]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id A7.FD.04178.F80199A5; Fri, 2 Mar 2018 08:51:27 +0000 (GMT) Received: from AMDC2075.DIGITAL.local ([106.120.51.25]) by eusync1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P4Y008BPG7PXE30@eusync1.samsung.com>; Fri, 02 Mar 2018 08:51:27 +0000 (GMT) From: Maciej Purski To: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Cc: Mark Brown , Liam Girdwood , Rob Herring , Mark Rutland , Marek Szyprowski , Doug Anderson , Bartlomiej Zolnierkiewicz , Maciej Purski Subject: [PATCH v5 3/5] regulator: core: Resolve coupled regulators Date: Fri, 02 Mar 2018 09:42:47 +0100 Message-id: <1519980169-8491-4-git-send-email-m.purski@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1519980169-8491-1-git-send-email-m.purski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBIsWRmVeSWpSXmKPExsWy7djP87oTBGZGGRw4IGGxccZ6VoupD5+w Wcw/co7V4uyyg2wW3650MFlc3jWHzWLBy1ssFmuP3GW3WHr9IpNF694j7A5cHmvmrWH0mN1w kcVj56y77B6bVnWyefRtWcXo8XmTXABbFJdNSmpOZllqkb5dAlfGlj+TWQuaFSqub/NtYOyR 6mLk5JAQMJG4tK6JpYuRi0NIYAWjxJH+VmYI5zOjxIfjX1lgqn7O+8QIkVjGKLG09TQrhPOf UWLN4f9AGQ4ONgEtiTXt8SANIgI2Em9vHABrYBY4ziRxfepGJpCEsICzxLV5s1hBbBYBVYmL 14+wgdi8QPFVi3uYIbbJSdw81wlmcwq4SPx8sIoNZJCEwBI2id19txghilwkFr86AmULS7w6 voUdwpaR6Ow4yARhV0tc/LqLDcKukWi8vQGqxlri86QtYAuYBfgkJm2bzgzygIQAr0RHmxBE iYfE/M//ocY4Sizp+Qb1/XRGict72tgmMEotYGRYxSieWlqcm55abJyXWq5XnJhbXJqXrpec n7uJERi/p/8d/7qDcd+fpEOMAhyMSjy8OzlnRAmxJpYVV+YeYpTgYFYS4W35ABTiTUmsrEot yo8vKs1JLT7EKM3BoiTOG6dRFyUkkJ5YkpqdmlqQWgSTZeLglGpglFlqfPy69Vn+Q14pVq+e SBw9pT3x+Bo5c7Wm37//6z65wXMsW/AT85KKDVaMs/ckl3ceOSt+NnVzvPPvN0Yr5ISlLhil ZejbNWkys10qEb7zoZFj2fWd6rPq1q5y2Xxq9vMZqWFrDwbas7Lmvgl5cmu9bXPtFf6DjJb9 fJFiJscNblraXzHcqsRSnJFoqMVcVJwIAA6NpPvbAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprJLMWRmVeSWpSXmKPExsVy+t/xy7r9AjOjDJoW61tsnLGe1WLqwyds FvOPnGO1OLvsIJvFtysdTBaXd81hs1jw8haLxdojd9ktll6/yGTRuvcIuwOXx5p5axg9Zjdc ZPHYOesuu8emVZ1sHn1bVjF6fN4kF8AWxWWTkpqTWZZapG+XwJWx5c9k1oJmhYrr23wbGHuk uhg5OSQETCR+zvvE2MXIxSEksIRRYsXzp+wgCSGBRiaJ53Pzuxg5ONgEtCTWtMeDhEUEbCTe 3jgAVs8scJJJ4s/FdYwgCWEBZ4lr82axgtgsAqoSF68fYQOxeYHiqxb3MEMsk5O4ea4TzOYU cJH4+WAVG8QuZ4nGo+vYJzDyLGBkWMUoklpanJueW2yoV5yYW1yal66XnJ+7iREYYNuO/dy8 g/HSxuBDjAIcjEo8vAc+zogSYk0sK67MPcQowcGsJMLb8gEoxJuSWFmVWpQfX1Sak1p8iFGa g0VJnPe8QWWUkEB6YklqdmpqQWoRTJaJg1OqgdF1y0MXO/ferUfFTxluy35eYLl+4z9pB0ez hAducVPUkk5HzYk93h7S8tb2nvRMl5WPDqrYXXnR9t7n+YPX0Q3v9L57n1Diq9H2vy9wzsVH /O4SVfGd/q6zz2xrENY5F/4vIo3no9qWNRu+/RO/9URNapX63P6qyQ1uj09d+J5dv6PIzdvq Y4QSS3FGoqEWc1FxIgBMqVHYLAIAAA== X-CMS-MailID: 20180302085127eucas1p19293e26a9abe8f7df6936912e6999b3f X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180302085127eucas1p19293e26a9abe8f7df6936912e6999b3f X-RootMTR: 20180302085127eucas1p19293e26a9abe8f7df6936912e6999b3f References: <1519980169-8491-1-git-send-email-m.purski@samsung.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Odroid XU3/4 and other Exynos5422 based boards there is a case, that different devices on the board are supplied by different regulators with non-fixed voltages. If one of these devices temporarily requires higher voltage, there might occur a situation that the spread between two devices' voltages is so high, that there is a risk of changing 'high' and 'low' states on the interconnection between devices powered by those regulators. Fill coupling descriptor with data obtained from DTS using previously defined of_functions. Fail to register a regulator, if some data inconsistency occurs. If some coupled regulators are not yet registered, don't fail to register, but try to resolve them in late init call. Signed-off-by: Maciej Purski --- drivers/regulator/core.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 5494189..f8adfe4 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -4067,6 +4067,88 @@ static int regulator_register_resolve_supply(struct device *dev, void *data) return 0; } +static int regulator_fill_coupling_array(struct regulator_dev *rdev) +{ + struct coupling_desc *c_desc = &rdev->coupling_desc; + int n_coupled = c_desc->n_coupled; + struct regulator_dev *c_rdev; + int i; + + for (i = 1; i < n_coupled; i++) { + /* already resolved */ + if (c_desc->coupled_rdevs[i]) + continue; + + c_rdev = of_parse_coupled_regulator(rdev, i - 1); + + if (c_rdev) { + c_desc->coupled_rdevs[i] = c_rdev; + c_desc->n_resolved++; + } + } + + if (rdev->coupling_desc.n_resolved < n_coupled) + return -1; + else + return 0; +} + +static int regulator_register_fill_coupling_array(struct device *dev, + void *data) +{ + struct regulator_dev *rdev = dev_to_rdev(dev); + + if (regulator_fill_coupling_array(rdev)) + rdev_dbg(rdev, "unable to resolve coupling\n"); + + return 0; +} + +static int regulator_resolve_coupling(struct regulator_dev *rdev) +{ + int n_phandles = of_get_n_coupled(rdev); + + if (n_phandles + 1 > MAX_COUPLED) { + rdev_err(rdev, "too many regulators coupled\n"); + return -EPERM; + } + + /* + * Every regulator should always have coupling descriptor filled with + * at least pointer to itself. + */ + rdev->coupling_desc.coupled_rdevs[0] = rdev; + rdev->coupling_desc.n_coupled = n_phandles + 1; + rdev->coupling_desc.n_resolved++; + + /* regulator isn't coupled */ + if (n_phandles == 0) + return 0; + + /* regulator, which can't change its voltage, can't be coupled */ + if (!regulator_ops_is_valid(rdev, REGULATOR_CHANGE_VOLTAGE)) { + rdev_err(rdev, "voltage operation not allowed\n"); + return -EPERM; + } + + if (rdev->constraints->max_spread <= 0) { + rdev_err(rdev, "wrong max_spread value\n"); + return -EPERM; + } + + if (!of_check_coupling_data(rdev)) + return -EPERM; + + /* + * After everything has been checked, try to fill rdevs array + * with pointers to regulators parsed from device tree. If some + * regulators are not registered yet, retry in late init call + */ + regulator_fill_coupling_array(rdev); + + return 0; +} + /** * regulator_register - register regulator * @regulator_desc: regulator to register @@ -4200,6 +4282,13 @@ regulator_register(const struct regulator_desc *regulator_desc, if (ret < 0) goto wash; + mutex_lock(®ulator_list_mutex); + ret = regulator_resolve_coupling(rdev); + mutex_unlock(®ulator_list_mutex); + + if (ret != 0) + goto wash; + /* add consumers devices */ if (init_data) { mutex_lock(®ulator_list_mutex); @@ -4693,6 +4782,9 @@ static int __init regulator_init_complete(void) class_for_each_device(®ulator_class, NULL, NULL, regulator_late_cleanup); + class_for_each_device(®ulator_class, NULL, NULL, + regulator_register_fill_coupling_array); + return 0; } late_initcall_sync(regulator_init_complete); -- 2.7.4