From patchwork Thu May 25 11:37:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gabriele Paoloni X-Patchwork-Id: 100499 Delivered-To: patch@linaro.org Received: by 10.140.96.100 with SMTP id j91csp719376qge; Thu, 25 May 2017 04:39:39 -0700 (PDT) X-Received: by 10.98.211.87 with SMTP id q84mr44729872pfg.126.1495712379181; Thu, 25 May 2017 04:39:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1495712379; cv=none; d=google.com; s=arc-20160816; b=ig5sfVPvIpKt91yCjmQ2efCyn0Jp30jfAESQffH+wpaLTpffoxEhULh9GZNCd31Nbl PJveNE3MejWen1+VQWXjJrJPoq41+hPut8O9/lFqsCKaLdXvg4D35bQpGyFuUhBe7/jp +53yqi9a06onwWxRlLQdgMQfi22lr5rOxyWI1G2adAh2RRDPl8tS8lP9t3zH5auud6Au QgvaC4HMRThbYkjsmY56Tn/VJ3UwVB+aPyDR4mwy0//F6iWB/0dHCKiAGu/tDqOqHI3T 3JqR6s77RMk7KP8Ug4vf1ESU5QUeLx8+k1k+AKOweoYCYx8s7jnHIfZ0u+9y/Z8fAx4S q3ow== 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=gCw5ibRgoepvNs903cFKqEJX+iNOT+DrTj/yUEDjqe8=; b=SNx61ZZEfnOc/72YYbzBWiArZcFBgI94Wz/5WxrLP/FYGBoL4bXLtZfhv5GAms7YzY ecuzrx0r28FctqeIp2CrJN9nxFhUJxPEVl+90eT5HmtU6W3dCD3egUzBY8Ox0MxwoCFR /TTjuao9ODGG4vPb3jNLEuevAuWs0CfX2igF0zQOCbPU7dt8Vxf1lSAD+m7xh+8b/u1y RTyqPWTxnCnI2CoCnPiuffplcOwkWcZ7xgu2w2P7HssHKVemVdqqBySpTNQXRcEDX35B 0xLeidVGSNmqzR8zxDjV7k1NbhRUV9iP5tbBE2JbGlBuVhRTyNKsG2P6Wb5rFtXR7fOR Tbhw== 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 d9si28684453plj.252.2017.05.25.04.39.38; Thu, 25 May 2017 04:39:39 -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 S937902AbdEYLjd (ORCPT + 25 others); Thu, 25 May 2017 07:39:33 -0400 Received: from szxga01-in.huawei.com ([45.249.212.187]:7266 "EHLO szxga01-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1765355AbdEYLjV (ORCPT ); Thu, 25 May 2017 07:39:21 -0400 Received: from 172.30.72.57 (EHLO DGGEML401-HUB.china.huawei.com) ([172.30.72.57]) by dggrg01-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id APE94826; Thu, 25 May 2017 19:39:12 +0800 (CST) Received: from G00308965-DELL1.china.huawei.com (10.203.181.156) by DGGEML401-HUB.china.huawei.com (10.3.17.32) with Microsoft SMTP Server id 14.3.301.0; Thu, 25 May 2017 19:39:03 +0800 From: Gabriele Paoloni To: , , , , , , , , CC: , , , , , , , , , , , , "zhichang.yuan" Subject: [PATCH v9 6/7] LPC: Add the ACPI LPC support Date: Thu, 25 May 2017 12:37:27 +0100 Message-ID: <1495712248-5232-7-git-send-email-gabriele.paoloni@huawei.com> X-Mailer: git-send-email 2.7.1.windows.1 In-Reply-To: <1495712248-5232-1-git-send-email-gabriele.paoloni@huawei.com> References: <1495712248-5232-1-git-send-email-gabriele.paoloni@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.203.181.156] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090204.5926C261.0170, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 5a95c541780afe83448bd7224a026c86 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "zhichang.yuan" Based on the provious patches, this patch supports the ACPI LPC host on Hip06/Hip07. Signed-off-by: zhichang.yuan Signed-off-by: John Garry Signed-off-by: Gabriele Paoloni Tested-by: dann frazier --- drivers/acpi/arm64/acpi_indirect_pio.c | 3 ++ drivers/bus/hisi_lpc.c | 71 ++++++++++++++++++++++++++++++++-- include/acpi/acpi_indirect_pio.h | 4 ++ 3 files changed, 75 insertions(+), 3 deletions(-) -- 2.7.4 diff --git a/drivers/acpi/arm64/acpi_indirect_pio.c b/drivers/acpi/arm64/acpi_indirect_pio.c index 7813f73..3a5ba7a 100644 --- a/drivers/acpi/arm64/acpi_indirect_pio.c +++ b/drivers/acpi/arm64/acpi_indirect_pio.c @@ -261,6 +261,9 @@ int acpi_set_logic_pio_resource(struct device *child, /* All the host devices which apply indirect-PIO can be listed here. */ static const struct acpi_device_id acpi_indirect_host_id[] = { +#ifdef CONFIG_HISILICON_LPC + {"HISI0191", INDIRECT_PIO_INFO(lpc_host_desc)}, +#endif {""}, }; diff --git a/drivers/bus/hisi_lpc.c b/drivers/bus/hisi_lpc.c index 4f3bf76..05a0a84 100644 --- a/drivers/bus/hisi_lpc.c +++ b/drivers/bus/hisi_lpc.c @@ -467,7 +467,9 @@ static int hisilpc_probe(struct platform_device *pdev) } /* register the LPC host PIO resources */ - if (!has_acpi_companion(dev)) { + if (has_acpi_companion(dev)) { + lpcdev->io_host = find_io_range_by_fwnode(dev->fwnode); + } else { struct logic_pio_hwaddr *range; range = kzalloc(sizeof(*range), GFP_KERNEL); @@ -481,13 +483,14 @@ static int hisilpc_probe(struct platform_device *pdev) ret = logic_pio_register_range(range); if (ret) { kfree(range); - dev_err(dev, "OF: register IO range FAIL!\n"); + dev_err(dev, "OF: logic_pio_register_range returned %d!\n", + ret); return -ret; } lpcdev->io_host = range; } if (!lpcdev->io_host) { - dev_err(dev, "Hisilpc IO hasn't registered!\n"); + dev_err(dev, "HiSi LPC IO hasn't been registered!\n"); return -EFAULT; } @@ -533,10 +536,72 @@ static const struct of_device_id hisilpc_of_match[] = { {}, }; +#ifdef CONFIG_ACPI +#include + +struct lpc_private_data { + resource_size_t io_size; + resource_size_t io_start; +}; + +static struct lpc_private_data lpc_data = { + .io_size = LPC_BUS_IO_SIZE, + .io_start = LPC_MIN_BUS_RANGE, +}; + +static int lpc_host_io_setup(struct acpi_device *adev, void *pdata) +{ + int ret = 0; + struct logic_pio_hwaddr *range; + struct lpc_private_data *lpc_private; + struct acpi_device *child; + + lpc_private = (struct lpc_private_data *)pdata; + range = kzalloc(sizeof(*range), GFP_KERNEL); + if (!range) + return -ENOMEM; + range->fwnode = &adev->fwnode; + range->flags = PIO_INDIRECT; + range->size = lpc_private->io_size; + range->hw_start = lpc_private->io_start; + + ret = logic_pio_register_range(range); + if (ret) { + kfree(range); + return ret; + } + + /* In HiSilicon lpc, only care about the children of the host. */ + list_for_each_entry(child, &adev->children, node) { + ret = acpi_set_logic_pio_resource(&child->dev, &adev->dev); + if (ret) { + dev_err(&child->dev, + "acpi_set_logic_pio_resource() returned %d\n", + ret); + return ret; + } + } + + return ret; +} + +static const struct acpi_device_id hisilpc_acpi_match[] = { + {"HISI0191", }, + {}, +}; + +const struct indirect_pio_device_desc lpc_host_desc = { + .pdata = &lpc_data, + .pre_setup = lpc_host_io_setup, +}; + +#endif + static struct platform_driver hisilpc_driver = { .driver = { .name = "hisi_lpc", .of_match_table = hisilpc_of_match, + .acpi_match_table = ACPI_PTR(hisilpc_acpi_match), }, .probe = hisilpc_probe, }; diff --git a/include/acpi/acpi_indirect_pio.h b/include/acpi/acpi_indirect_pio.h index efc5c43..7a8d26b 100644 --- a/include/acpi/acpi_indirect_pio.h +++ b/include/acpi/acpi_indirect_pio.h @@ -18,6 +18,10 @@ struct indirect_pio_device_desc { int (*pre_setup)(struct acpi_device *adev, void *pdata); }; +#ifdef CONFIG_HISILICON_LPC +extern const struct indirect_pio_device_desc lpc_host_desc; +#endif + int acpi_set_logic_pio_resource(struct device *child, struct device *hostdev);