From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965535AbcJZNeZ (ORCPT ); Wed, 26 Oct 2016 09:34:25 -0400 Received: from mail-wm0-f41.google.com ([74.125.82.41]:37532 "EHLO mail-wm0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964776AbcJZNdk (ORCPT ); Wed, 26 Oct 2016 09:33:40 -0400 From: Benjamin Gaignard To: labbott@redhat.com, sumit.semwal@linaro.org, gregkh@linuxfoundation.org, yudongbin@hisilicon.com, puck.chen@hisilicon.com, linux-kernel@vger.kernel.org Cc: linaro-kernel@lists.linaro.org, kernel@stlinux.com, Benjamin Gaignard Subject: [PATCH 2/3] add STIH4xx ION driver Date: Wed, 26 Oct 2016 15:32:27 +0200 Message-Id: <1477488748-10065-3-git-send-email-benjamin.gaignard@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1477488748-10065-1-git-send-email-benjamin.gaignard@linaro.org> References: <1477488748-10065-1-git-send-email-benjamin.gaignard@linaro.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This the same driver that Hisilicon one. Change the list of heap to fit with sti SoC needs. Rename/prefix some functions and structure with sti Signed-off-by: Benjamin Gaignard --- drivers/staging/android/ion/Kconfig | 7 ++ drivers/staging/android/ion/Makefile | 2 + drivers/staging/android/ion/sti/Makefile | 1 + drivers/staging/android/ion/sti/sti_ion.c | 103 ++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 drivers/staging/android/ion/sti/Makefile create mode 100644 drivers/staging/android/ion/sti/sti_ion.c diff --git a/drivers/staging/android/ion/Kconfig b/drivers/staging/android/ion/Kconfig index c8fb413..eb47230 100644 --- a/drivers/staging/android/ion/Kconfig +++ b/drivers/staging/android/ion/Kconfig @@ -42,6 +42,13 @@ config ION_HISI source "drivers/staging/android/ion/hisilicon/Kconfig" +config ION_STI + bool "stih4xx ION Driver" + depends on ARCH_STI && ION + select ION_OF + help + Choose this option if you wish to use ion on STIH4xx SoC. + config ION_OF bool "Devicetree support for Ion" depends on ION && OF_ADDRESS diff --git a/drivers/staging/android/ion/Makefile b/drivers/staging/android/ion/Makefile index 5d630a0..bc02ea4 100644 --- a/drivers/staging/android/ion/Makefile +++ b/drivers/staging/android/ion/Makefile @@ -9,5 +9,7 @@ endif obj-$(CONFIG_ION_DUMMY) += ion_dummy_driver.o obj-$(CONFIG_ION_TEGRA) += tegra/ obj-$(CONFIG_ION_HISI) += hisilicon/ +obj-$(CONFIG_ION_STI) += sti/ + obj-$(CONFIG_ION_OF) += ion_of.o diff --git a/drivers/staging/android/ion/sti/Makefile b/drivers/staging/android/ion/sti/Makefile new file mode 100644 index 0000000..5690431 --- /dev/null +++ b/drivers/staging/android/ion/sti/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ION_STI) += sti_ion.o diff --git a/drivers/staging/android/ion/sti/sti_ion.c b/drivers/staging/android/ion/sti/sti_ion.c new file mode 100644 index 0000000..4c0f52b --- /dev/null +++ b/drivers/staging/android/ion/sti/sti_ion.c @@ -0,0 +1,103 @@ +/* + * STIH4xx ION Driver + * + * Copyright (c) 2016 STMicroelectronics + * + * Author: Benjamin Gaignard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include + +#include "../ion_priv.h" +#include "../ion.h" +#include "../ion_of.h" + +struct sti_ion_dev { + struct ion_heap **heaps; + struct ion_device *idev; + struct ion_platform_data *data; +}; + +static struct ion_of_heap sti_heaps[] = { + PLATFORM_HEAP("st,cma", 0, ION_HEAP_TYPE_DMA, "cma"), + {} +}; + +static int sti_ion_probe(struct platform_device *pdev) +{ + struct sti_ion_dev *ipdev; + int i; + + ipdev = devm_kzalloc(&pdev->dev, sizeof(*ipdev), GFP_KERNEL); + if (!ipdev) + return -ENOMEM; + + platform_set_drvdata(pdev, ipdev); + + ipdev->idev = ion_device_create(NULL); + if (IS_ERR(ipdev->idev)) + return PTR_ERR(ipdev->idev); + + ipdev->data = ion_parse_dt(pdev, sti_heaps); + if (IS_ERR(ipdev->data)) + return PTR_ERR(ipdev->data); + + ipdev->heaps = devm_kzalloc(&pdev->dev, + sizeof(struct ion_heap) * ipdev->data->nr, + GFP_KERNEL); + if (!ipdev->heaps) { + ion_destroy_platform_data(ipdev->data); + return -ENOMEM; + } + + for (i = 0; i < ipdev->data->nr; i++) { + ipdev->heaps[i] = ion_heap_create(&ipdev->data->heaps[i]); + if (!ipdev->heaps) { + ion_destroy_platform_data(ipdev->data); + return -ENOMEM; + } + ion_device_add_heap(ipdev->idev, ipdev->heaps[i]); + } + return 0; +} + +static int sti_ion_remove(struct platform_device *pdev) +{ + struct sti_ion_dev *ipdev; + int i; + + ipdev = platform_get_drvdata(pdev); + + for (i = 0; i < ipdev->data->nr; i++) + ion_heap_destroy(ipdev->heaps[i]); + + ion_destroy_platform_data(ipdev->data); + ion_device_destroy(ipdev->idev); + + return 0; +} + +static const struct of_device_id sti_ion_match_table[] = { + {.compatible = "st,sti-ion"}, + {}, +}; + +static struct platform_driver sti_ion_driver = { + .probe = sti_ion_probe, + .remove = sti_ion_remove, + .driver = { + .name = "ion-sti", + .of_match_table = sti_ion_match_table, + }, +}; + +module_platform_driver(sti_ion_driver); -- 1.9.1