Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp3653476img; Mon, 25 Mar 2019 15:00:21 -0700 (PDT) X-Google-Smtp-Source: APXvYqweDMkqL1huDyPLFBDMjX7OIoyv9F39yD1C4z01TXFXJp2dEMCQ2q8vF2C1LMx2FV4vloLg X-Received: by 2002:a65:6489:: with SMTP id e9mr10541988pgv.364.1553551221542; Mon, 25 Mar 2019 15:00:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553551221; cv=none; d=google.com; s=arc-20160816; b=VuDzPOEYQPEWJMHpWPrt7H9JBROGRpbgHVlXQ8lNztEYEpvkTx2MjCtHpYszBtUgxY j+x1CFJbv9dcXggRRIyGGJGAjtarYmwZtEqKE/9eWodA96VrP37xaHQLqxVZJZ9pojLr psBOw+BLB0bXwOoqVh4n4OLgCf1jKv6XgF3Z94f/jmDQeh3TTz0rWJwXoVAw4LeRW8nO P/LVObH4rAuaerL7Mw1elvuxUc2Qz1XvB5bmDRZGlKAdqKJqCfknh32E+lT43+MWH6zW NbsvxN5oTCQsNaIZuMUFZPmI3rCK1qtLd/qlkiUzrawORBtQ9E3MdlptncKhyf2zVIPO D8Og== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=uHm6oOWp9fjIYLy9OYdNESKAJH+NN0yH7BhKHXF8zO0=; b=OSDgDVrauXUqTXNMLsIvHnz+QUBGAn1PSuopyJSNLkVcWWlLqPz7Ih1dpGTng6Y5Pk BoCF3zdhGhH1Yuhl17A+wHZrdKkb1VmplmkwwObAhYvPvOfb8CgBuIRpW7GPi5qfQff2 pNutuaIZRCmGCGe6TVhvlXgpCh/Cu/iKbYeopDXhHu2UdwEskZvCUC4u9AH0c/CdSy5B 2mQMPNaKwgnUcAfIzU5qHEZgBC5lL87sD2FKCBnK84zz9gcGhHfUK98IEq/RielZIzcg WwkzmRFKX02FL2V95r+/S/t6ajHTB6wQdRxy3uC3JX2WbU+1UPx7OEP6avq//Y4sCRjO gKrg== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v9si15672207plg.187.2019.03.25.15.00.06; Mon, 25 Mar 2019 15:00:21 -0700 (PDT) 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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730647AbfCYV7Q (ORCPT + 99 others); Mon, 25 Mar 2019 17:59:16 -0400 Received: from muru.com ([72.249.23.125]:42636 "EHLO muru.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729478AbfCYV7N (ORCPT ); Mon, 25 Mar 2019 17:59:13 -0400 Received: from hillo.muru.com (localhost [127.0.0.1]) by muru.com (Postfix) with ESMTP id 27AE881AE; Mon, 25 Mar 2019 21:59:26 +0000 (UTC) From: Tony Lindgren To: linux-omap@vger.kernel.org Cc: Dave Gerlach , Faiz Abbas , Greg Kroah-Hartman , Keerthy , Nishanth Menon , Peter Ujfalusi , Roger Quadros , Suman Anna , Tero Kristo , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 07/14] bus: ti-sysc: Allocate mdata as needed and do platform data based init later Date: Mon, 25 Mar 2019 14:58:42 -0700 Message-Id: <20190325215849.13182-8-tony@atomide.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190325215849.13182-1-tony@atomide.com> References: <20190325215849.13182-1-tony@atomide.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The platform data based init functions typically reset the interconnect target module configure the registers. As we may need the interconnect target module specific quirks configured based on the revision register, we want to move the platform data based init to happen later. Let's allocate mdata as needed so it's available for sysc_legacy_init() that we call with module clocks enabled from sysc_init_module(). Signed-off-by: Tony Lindgren --- drivers/bus/ti-sysc.c | 54 +++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c --- a/drivers/bus/ti-sysc.c +++ b/drivers/bus/ti-sysc.c @@ -75,6 +75,7 @@ struct sysc { u32 module_size; void __iomem *module_va; int offsets[SYSC_MAX_REGS]; + struct ti_sysc_module_data *mdata; struct clk **clocks; const char **clock_roles; int nr_clocks; @@ -1012,6 +1013,26 @@ static void sysc_init_revision_quirks(struct sysc *ddata) } } +/* + * Note that pdata->init_module() typically does a reset first. After + * pdata->init_module() is done, PM runtime can be used for the interconnect + * target module. + */ +static int sysc_legacy_init(struct sysc *ddata) +{ + struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev); + int error; + + if (!ddata->legacy_mode || !pdata || !pdata->init_module) + return 0; + + error = pdata->init_module(ddata->dev, ddata->mdata, &ddata->cookie); + if (error == -EEXIST) + error = 0; + + return error; +} + static int sysc_reset(struct sysc *ddata) { int offset = ddata->offsets[SYSC_SYSCONFIG]; @@ -1070,10 +1091,15 @@ static int sysc_init_module(struct sysc *ddata) ddata->revision = sysc_read_revision(ddata); sysc_init_revision_quirks(ddata); + error = sysc_legacy_init(ddata); + if (error) + goto err_main_clocks; + error = sysc_reset(ddata); if (error) dev_err(ddata->dev, "Reset failed with %d\n", error); +err_main_clocks: if (manage_clocks) sysc_disable_main_clocks(ddata); err_opt_clocks: @@ -1715,28 +1741,26 @@ static const struct sysc_capabilities sysc_dra7_mcan = { static int sysc_init_pdata(struct sysc *ddata) { struct ti_sysc_platform_data *pdata = dev_get_platdata(ddata->dev); - struct ti_sysc_module_data mdata; - int error = 0; + struct ti_sysc_module_data *mdata; if (!pdata || !ddata->legacy_mode) return 0; - mdata.name = ddata->legacy_mode; - mdata.module_pa = ddata->module_pa; - mdata.module_size = ddata->module_size; - mdata.offsets = ddata->offsets; - mdata.nr_offsets = SYSC_MAX_REGS; - mdata.cap = ddata->cap; - mdata.cfg = &ddata->cfg; + mdata = devm_kzalloc(ddata->dev, sizeof(*mdata), GFP_KERNEL); + if (!mdata) + return -ENOMEM; - if (!pdata->init_module) - return -ENODEV; + mdata->name = ddata->legacy_mode; + mdata->module_pa = ddata->module_pa; + mdata->module_size = ddata->module_size; + mdata->offsets = ddata->offsets; + mdata->nr_offsets = SYSC_MAX_REGS; + mdata->cap = ddata->cap; + mdata->cfg = &ddata->cfg; - error = pdata->init_module(ddata->dev, &mdata, &ddata->cookie); - if (error == -EEXIST) - error = 0; + ddata->mdata = mdata; - return error; + return 0; } static int sysc_init_match(struct sysc *ddata) -- 2.21.0