From patchwork Mon Aug 20 13:35:08 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Shevchenko X-Patchwork-Id: 959714 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=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linux.intel.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41vFDX4M0Hz9sBj for ; Mon, 20 Aug 2018 23:35:24 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726883AbeHTQu7 (ORCPT ); Mon, 20 Aug 2018 12:50:59 -0400 Received: from mga12.intel.com ([192.55.52.136]:23699 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727420AbeHTQu7 (ORCPT ); Mon, 20 Aug 2018 12:50:59 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Aug 2018 06:35:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,265,1531810800"; d="scan'208";a="78409964" Received: from black.fi.intel.com ([10.237.72.28]) by fmsmga002.fm.intel.com with ESMTP; 20 Aug 2018 06:35:14 -0700 Received: by black.fi.intel.com (Postfix, from userid 1003) id 93A855D; Mon, 20 Aug 2018 16:35:13 +0300 (EEST) From: Andy Shevchenko To: Linus Walleij , linux-gpio@vger.kernel.org, Mika Westerberg Cc: Andy Shevchenko Subject: [PATCH v1 2/7] pinctrl: intel: Introduce intel_pinctrl_get_soc_data() internal API Date: Mon, 20 Aug 2018 16:35:08 +0300 Message-Id: <20180820133513.79629-2-andriy.shevchenko@linux.intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180820133513.79629-1-andriy.shevchenko@linux.intel.com> References: <20180820133513.79629-1-andriy.shevchenko@linux.intel.com> Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Introduce intel_pinctrl_get_soc_data() internal API to simplify drivers, which are using ACPI _UID to distinguish which SoC data needs to be used when being probed. Signed-off-by: Andy Shevchenko --- drivers/pinctrl/intel/pinctrl-intel.c | 38 +++++++++++++++++++++++++++ drivers/pinctrl/intel/pinctrl-intel.h | 2 ++ 2 files changed, 40 insertions(+) diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c index a356a5b8bab2..08a48a03eb65 100644 --- a/drivers/pinctrl/intel/pinctrl-intel.c +++ b/drivers/pinctrl/intel/pinctrl-intel.c @@ -7,6 +7,7 @@ * Mika Westerberg */ +#include #include #include #include @@ -1314,6 +1315,43 @@ static int intel_pinctrl_pm_init(struct intel_pinctrl *pctrl) return 0; } +int intel_pinctrl_get_soc_data(struct platform_device *pdev, + const struct intel_pinctrl_soc_data **soc_data) +{ + const struct intel_pinctrl_soc_data *data = NULL; + const struct intel_pinctrl_soc_data **table; + struct acpi_device *adev; + unsigned int i; + + adev = ACPI_COMPANION(&pdev->dev); + if (adev) { + const void *match = device_get_match_data(&pdev->dev); + + table = (const struct intel_pinctrl_soc_data **)match; + for (i = 0; table[i]; i++) { + if (!strcmp(adev->pnp.unique_id, table[i]->uid)) { + data = table[i]; + break; + } + } + } else { + const struct platform_device_id *id; + + id = platform_get_device_id(pdev); + if (!id) + return -ENODEV; + + table = (const struct intel_pinctrl_soc_data **)id->driver_data; + data = table[pdev->id]; + } + if (!data) + return -ENODEV; + + *soc_data = data; + return 0; +} +EXPORT_SYMBOL_GPL(intel_pinctrl_get_soc_data); + int intel_pinctrl_probe(struct platform_device *pdev, const struct intel_pinctrl_soc_data *soc_data) { diff --git a/drivers/pinctrl/intel/pinctrl-intel.h b/drivers/pinctrl/intel/pinctrl-intel.h index 1785abf157e4..9ad15198d0db 100644 --- a/drivers/pinctrl/intel/pinctrl-intel.h +++ b/drivers/pinctrl/intel/pinctrl-intel.h @@ -171,6 +171,8 @@ struct intel_pinctrl_soc_data { size_t ncommunities; }; +int intel_pinctrl_get_soc_data(struct platform_device *pdev, + const struct intel_pinctrl_soc_data **soc_data); int intel_pinctrl_probe(struct platform_device *pdev, const struct intel_pinctrl_soc_data *soc_data); #ifdef CONFIG_PM_SLEEP