Received: by 10.223.176.46 with SMTP id f43csp2976376wra; Mon, 22 Jan 2018 06:33:53 -0800 (PST) X-Google-Smtp-Source: AH8x226zCaDSA6MSE2mf0T2pASQgSj/7cSJe5LtVq5lWR3gjTsZuq4Xyfo+q1egrLvZa6BpKWzUE X-Received: by 10.99.103.69 with SMTP id b66mr7294196pgc.233.1516631633528; Mon, 22 Jan 2018 06:33:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516631633; cv=none; d=google.com; s=arc-20160816; b=IZfxBT5YkLOWTJaNZ113KkgoYuSDq3wWG6xCAMLhXKUZxesXH3HGXdkiQWHySIpumm ywf2KSS4ywBl1KRD2Wk40Tyzf/2t8UJnbOOZ8SN8o14HuN3V/gu2+F0U2P478okENH+t 5tcq/DjVQKeT4jsx9IPljcZRMpnmIcobgZBrznUdIB9U+3fLThmh3ompeC18u4ojrT5y Q2qpFKOAd17VQbdCpZTOc19uh6TJFlfgqQfFV4vyzWgECMdZy05/mJdqkuBY/eLYBcTm VXPXH/fAYlEZJvGhAQyVLxb7vB/3Sfra/nKne0mVUfDUyW3aRfDn53WKXZeBUPO46b/h fzEA== 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=eV36jU+2FVK8J9aCNeEUkr7KA/SMJWay5HOgBz/v9Uk=; b=tBJrM6wf3jQHTdO6ccH0jGlJGmc1RpbVynqvQgQ+ARe61oh7bWpGA9EsgJmBMHFnw7 fmKmciXIzJhKxXqnnLhUHTTrwpNPy4XrJ9Wl5KABd7lTpkmfqM5QMf2iRJw9Hqp4YUHH LMXCerwAlCmcaO9Fap817H4JuE39LJUpY/0oHcTOtFvZy5Jdl9XeZJhgGpeDDrZ/0UHJ ovyH9fTYv0rmktcn/7i64RJ7OHvp19hJu+oZdYwcsGNq+RSqBpa/WFA+lyLEDX8SYp+N f60sn0QNCSBOB6UcxqZsRxGOsGNeW9rMcs0FTJqwDB2cQvVyO8YzgQOsaA1gndBDscyh +pEw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b=ozwyvQVj; 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 m61-v6si3556470plb.141.2018.01.22.06.33.39; Mon, 22 Jan 2018 06:33:53 -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=ozwyvQVj; 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 S1751398AbeAVOcZ (ORCPT + 99 others); Mon, 22 Jan 2018 09:32:25 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:48185 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751216AbeAVOah (ORCPT ); Mon, 22 Jan 2018 09:30:37 -0500 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20180122143035euoutp0156f2fea95b49179276941985669bcde1~MKEE45V6O2790127901euoutp01k; Mon, 22 Jan 2018 14:30:35 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20180122143035euoutp0156f2fea95b49179276941985669bcde1~MKEE45V6O2790127901euoutp01k DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1516631435; bh=eV36jU+2FVK8J9aCNeEUkr7KA/SMJWay5HOgBz/v9Uk=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=ozwyvQVjkvy7oogdXNC6n5IyEarXTmdSiQ+Y2nPQ7eSlBICU+0ylxgi/Qf0PBriyI GnnjB+IIgiWxMmv272hARqo5RLwLkOpus55cisfJFmu0uvo4eBakrt7aK2BRS9LIVP le65vZlPmzaQnpGtvEn1uLymB8IPvzk+9s9QtbD0= Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20180122143034eucas1p107b14528ea6c98c400931c25c9e03ba0~MKEEOXjbJ1906319063eucas1p1y; Mon, 22 Jan 2018 14:30:34 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 32.A3.12743.A85F56A5; Mon, 22 Jan 2018 14:30:34 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20180122143033eucas1p2adb3b39af238b2449486389d214a3a68~MKEDnZrad2119221192eucas1p22; Mon, 22 Jan 2018 14:30:33 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d0000031c7-ac-5a65f58aa4a1 Received: from eusync4.samsung.com ( [203.254.199.214]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 03.89.20118.985F56A5; Mon, 22 Jan 2018 14:30:33 +0000 (GMT) Received: from AMDC2075.DIGITAL.local ([106.120.51.25]) by eusync4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P2Y0079BOAEJF00@eusync4.samsung.com>; Mon, 22 Jan 2018 14:30:33 +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 v4 5/7] regulator: core: Resolve coupled regulators Date: Mon, 22 Jan 2018 15:30:10 +0100 Message-id: <1516631412-17542-6-git-send-email-m.purski@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1516631412-17542-1-git-send-email-m.purski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrAIsWRmVeSWpSXmKPExsWy7djP87pdX1OjDLadZrfYOGM9q8XUh0/Y LOYfOcdqcXbZQTaLb1c6mCwu75rDZrHg5S0Wi7VH7rJbLL1+kcmide8RdgcujzXz1jB6zG64 yOKxc9Zddo9NqzrZPPq2rGL0+LxJLoAtissmJTUnsyy1SN8ugSvj0OvXTAXNChW9d74yNjD2 SHUxcnJICJhI7Jn5kh3CFpO4cG89WxcjF4eQwFJGid7f51khnM+MErOnzWeH6djydDoTRGIZ o8S5BZ2sIAkhgf+MEtdXxHYxcnCwCWhJrGmPBwmLCNhIvL1xgBGknlngOJPE9akbmUBqhAWc JTpPOIPUsAioSsz5MZUFxOYVcJH41/uCCWKXnMTNc53MIDangKvEn76JLCBzJATWsElsvvaW FaLIRWLVzkdsELawxKvjW6AOlZG4PLmbBcKulrj4dRdUTY1E4+0NUDXWEp8nbQFbwCzAJzFp 23RmkNskBHglOtqEIEo8JM4snAJV7ihx4M0WaKDMYJQ42neFaQKj9AJGhlWMIqmlxbnpqcWm esWJucWleel6yfm5mxiB8Xz63/GvOxiXHrM6xCjAwajEw9thkBolxJpYVlyZe4hRgoNZSYQ3 bQVQiDclsbIqtSg/vqg0J7X4EKM0B4uSOK9tVFukkEB6YklqdmpqQWoRTJaJg1OqgZH3xs0X JX1FKZ5uFc0Kdw/V6Ze3zwvi6DzuemOTrELQLZWeCbcVPe4Xszbc0E47aLzS6alFzUaHunv7 aiatWCm8pVTtzGLWLQd/cU8/0eRennH4xpyFU9eJignu4p6cI9H0fr/M/Jvzhack/vm05GLr wfMhvNaym/prdqzcK3P1pfDLqM74/JtKLMUZiYZazEXFiQBS0bXh4wIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrGLMWRmVeSWpSXmKPExsVy+t/xa7qdX1OjDD6807bYOGM9q8XUh0/Y LOYfOcdqcXbZQTaLb1c6mCwu75rDZrHg5S0Wi7VH7rJbLL1+kcmide8RdgcujzXz1jB6zG64 yOKxc9Zddo9NqzrZPPq2rGL0+LxJLoAtissmJTUnsyy1SN8ugSvj0OvXTAXNChW9d74yNjD2 SHUxcnJICJhIbHk6nQnCFpO4cG89WxcjF4eQwBJGiT/rm5khnEYmiaP3vgNlODjYBLQk1rTH gzSICNhIvL1xgBGkhlngJJPEn4vrGEFqhAWcJTpPOIPUsAioSsz5MZUFxOYVcJH41/sCapmc xM1zncwgNqeAq8SfvolgNUJANXsfvGGfwMi7gJFhFaNIamlxbnpusZFecWJucWleul5yfu4m RmDobTv2c8sOxq53wYcYBTgYlXh4OwxSo4RYE8uKK3MPMUpwMCuJ8KatAArxpiRWVqUW5ccX leakFh9ilOZgURLn7d2zOlJIID2xJDU7NbUgtQgmy8TBKdXA2KbdMXWvddNxP+bDy143BUp9 mBG//q7MmTrBe6nB1ZGa8YczO9bPuBVWqiK5vk+tVNggJvbqprK8ulliX9g5b9/sNn++8d3B uAmWz+ck2m399EzqYvG9Zbvadzv2MXucMmTSi5wUsz/RICCCI1Jt3YSm2sC0PhdtljNVe2tO ii62uPXORCNViaU4I9FQi7moOBEAO4CT0zkCAAA= X-CMS-MailID: 20180122143033eucas1p2adb3b39af238b2449486389d214a3a68 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180122143033eucas1p2adb3b39af238b2449486389d214a3a68 X-RootMTR: 20180122143033eucas1p2adb3b39af238b2449486389d214a3a68 References: <1516631412-17542-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 1118527..3628949 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -3945,6 +3945,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 @@ -4077,6 +4159,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); @@ -4565,6 +4654,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