From patchwork Tue May 8 10:27:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 135144 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp4209025lji; Tue, 8 May 2018 03:31:30 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrwAYb51adh/LAri5zNO5AqgBZx0sfH38Ry46MTZOA+/xFw8S8E24OWVIQvvPLyKBLGKU9t X-Received: by 2002:a17:902:bb93:: with SMTP id m19-v6mr21001309pls.74.1525775490189; Tue, 08 May 2018 03:31:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525775490; cv=none; d=google.com; s=arc-20160816; b=LJ7mvo0Mw0fQRdeOwJyoP7/szYvcCP8i9YUa9C1a4OuBT63OkuCa1/OAuUXWkyoEMY M2PscORuI7vmzlV6REaSFRshc6/rlXMEQQccjnN6ibyPs1kLRhvXPV1LGmXa5YA+1S6Q XzLGwgpQs4kIqBHGlcvjJWwHChgKJs3sFPj0nVaBixRci6DbHZ1EXjMaEZw42B2FwBGA P0oVKvsAovqAgitM/FcSt5gcIWDU+piGfRLbe94auEkaST5IOaMflID0GVOdtuP7iL3j nh5IF4pmnuE7agtRH7G00/xRv+erbs+H0Uwo966/ohT/6wlMXKOGH0ORXgB0iY8RmlW3 3wyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=ZNACVdP/6b7WsvoOatnGiX63Z3Om2Lv6ZRc0wquD93M=; b=l0pkXdbIvW9lsWBPiuCO+L9/oH0DHwQpt1KKRaHGoSfr8nnTVZdVwIBW8PqXD7ysAn aU/RvCqPJbp2Q01H0u+UVBlD/uyNhYNKaZTAz+kp06Yw586yg6kCkXivLQ0jJECGLZaP OtrZ52aOmYrMK0Mo4NaETkxOgxantN1RGpZHvhM6GUoBR8CoclSraD9YCQnrcSf0a7F2 xFAWiBEbc5ewnwjru3KVNrfliv0AqkcK/Gh9Fl6z+59HuTNM/NQzljsYAff2J7lTiAmw wa5uhtXXgAOiOL1NntX4H5Z2rTHdARQ2YgQ1Wtpi5m67ZJ2fm/HAd85wZBpJyMJDZFUT Zg8g== 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 g77si25292263pfa.304.2018.05.08.03.31.29; Tue, 08 May 2018 03:31:30 -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 S932286AbeEHKbD (ORCPT + 29 others); Tue, 8 May 2018 06:31:03 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:7242 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754628AbeEHKa7 (ORCPT ); Tue, 8 May 2018 06:30:59 -0400 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 61305E72D903E; Tue, 8 May 2018 18:30:46 +0800 (CST) Received: from localhost.localdomain (10.67.212.75) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.361.1; Tue, 8 May 2018 18:30:39 +0800 From: John Garry To: , , , CC: , , , , , , , John Garry Subject: [PATCH v2 2/3] HISI LPC: Re-Add ACPI child enumeration support Date: Tue, 8 May 2018 18:27:31 +0800 Message-ID: <1525775252-239214-3-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1525775252-239214-1-git-send-email-john.garry@huawei.com> References: <1525775252-239214-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.212.75] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since we no longer use the MFD APIs to enumerate the child devices on the bus, use the platform driver APIs directly. In this patch we iterate of the children devices for the host, and create a platform device directly per child. For the iterating, we match the child ACPI HID against a known list of supported child devices and their respective ACPIs HID, to find the device name and any other supplementary data. Signed-off-by: John Garry --- drivers/bus/hisi_lpc.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) -- 1.9.1 diff --git a/drivers/bus/hisi_lpc.c b/drivers/bus/hisi_lpc.c index 252a6a4..eb5b3fc 100644 --- a/drivers/bus/hisi_lpc.c +++ b/drivers/bus/hisi_lpc.c @@ -442,12 +442,28 @@ static int hisi_lpc_acpi_set_io_res(struct device *child, return 0; } +static int hisi_lpc_acpi_remove_subdev(struct device *dev, void *unused) +{ + platform_device_unregister(to_platform_device(dev)); + return 0; +} + +struct hisi_lpc_acpi_cell { + const char *hid; + const char *name; + void *pdata; + size_t pdata_size; +}; + /* * hisi_lpc_acpi_probe - probe children for ACPI FW * @hostdev: LPC host device pointer * * Returns 0 when successful, and a negative value for failure. * + * Create a platform device per child, fixing up the resources + * from bus addresses to Logical PIO addresses. + * */ static int hisi_lpc_acpi_probe(struct device *hostdev) { @@ -457,17 +473,75 @@ static int hisi_lpc_acpi_probe(struct device *hostdev) /* Only consider the children of the host */ list_for_each_entry(child, &adev->children, node) { + const char *hid = acpi_device_hid(child); + const struct hisi_lpc_acpi_cell *cell; + struct platform_device *pdev; const struct resource *res; + bool found = false; int num_res; ret = hisi_lpc_acpi_set_io_res(&child->dev, &adev->dev, &res, &num_res); if (ret) { dev_warn(hostdev, "set resource fail (%d)\n", ret); + goto fail; + } + + cell = (struct hisi_lpc_acpi_cell []){ + /* ipmi */ + { + .hid = "IPI0001", + .name = "hisi-lpc-ipmi", + }, + {} + }; + + for (; cell && cell->name; cell++) { + if (!strcmp(cell->hid, hid)) { + found = true; + break; + } } + + if (!found) { + dev_warn(hostdev, + "could not find cell for child device (%s)\n", + hid); + ret = -ENODEV; + goto fail; + } + + pdev = platform_device_alloc(cell->name, PLATFORM_DEVID_AUTO); + if (!pdev) { + ret = -ENOMEM; + goto fail; + } + + pdev->dev.parent = hostdev; + ACPI_COMPANION_SET(&pdev->dev, child); + + ret = platform_device_add_resources(pdev, res, num_res); + if (ret) + goto fail; + + ret = platform_device_add_data(pdev, cell->pdata, + cell->pdata_size); + if (ret) + goto fail; + + ret = platform_device_add(pdev); + if (ret) + goto fail; + + acpi_device_set_enumerated(child); } return 0; + +fail: + device_for_each_child(hostdev, NULL, + hisi_lpc_acpi_remove_subdev); + return ret; } static const struct acpi_device_id hisi_lpc_acpi_match[] = {