From patchwork Mon Jan 7 19:45:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 10751175 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1CFB86C5 for ; Mon, 7 Jan 2019 19:46:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0ABF8212DB for ; Mon, 7 Jan 2019 19:46:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F00212899B; Mon, 7 Jan 2019 19:46:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C0A58212DB for ; Mon, 7 Jan 2019 19:46:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To :From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=JMycF5oqHSHOy1V/DfZ0UFhn0zYRuqb589+O4MLl3IE=; b=l7B+lmLWZmxpME 5CfYBNz5nK219m4jTMRKhCthXh3dF/MpzN0DHIn4xyVDkfsEKfVnpAQgdtPGokDn34vs2tZORuNZm Bz4RGN1Gjy3axQ1Ns17d3Tubk6X/EC4jknRs+foHpl8zRPZp3LglTMtcSzRZiW1jN71MfYNIa+DNR fRK9e6n7Z9jXN8DFkVfvaOiA41nK82usdxsCyddiHcpt0QHFvwXxIfsG5ud81llCe5xGKbV/oiPZC V8I3hPt/95SXQxS/p+11ixVWXn+UIKmKgrG78s1zI3WY0cLWJbdYkxTNqFW7T18Kqvl6qkB5YQn18 vPYll1yuoE+VbDP/IcdA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1ggaql-0006Xq-Tm; Mon, 07 Jan 2019 19:46:15 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1ggaqh-0006XD-LZ for linux-arm-kernel@lists.infradead.org; Mon, 07 Jan 2019 19:46:14 +0000 Received: from pty.hi.pengutronix.de ([2001:67c:670:100:1d::c5]) by metis.ext.pengutronix.de with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1ggaqV-0001e2-Aq; Mon, 07 Jan 2019 20:45:59 +0100 Received: from ukl by pty.hi.pengutronix.de with local (Exim 4.89) (envelope-from ) id 1ggaqT-0006Iw-63; Mon, 07 Jan 2019 20:45:57 +0100 From: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= To: Arnd Bergmann Subject: [PATCH] bus: ts-nbus: remove bus driver without user Date: Mon, 7 Jan 2019 20:45:24 +0100 Message-Id: <20190107194523.2772-1-u.kleine-koenig@pengutronix.de> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::c5 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190107_114612_063413_46C59017 X-CRM114-Status: GOOD ( 27.21 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Linus Walleij , kernel@savoirfairelinux.com, kernel@pengutronix.de, linux-arm-kernel@lists.infradead.org, =?utf-8?q?J?= =?utf-8?q?=C3=A9r=C3=B4me_OUFELLA?= Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Since the ts-nbus driver was introduced in 2017 it only saw some reworking changes. There is no user in the tree, neither a machine that has this bus nor a driver for a device on that bus. Also the email address of the author doesn't exist any more. So remove this bus. Signed-off-by: Uwe Kleine-König --- Hello, I'm not sure where to send this patch to. There was a patch set on the arm-kernel list but I didn't find the final version in my archive. Arnd applied the patch (5b143d2a6ede ("bus: add driver for the Technologic Systems NBUS")) so I send it to him :-) Best regards Uwe .../devicetree/bindings/bus/ts-nbus.txt | 50 --- drivers/bus/Kconfig | 8 - drivers/bus/Makefile | 1 - drivers/bus/ts-nbus.c | 369 ------------------ include/linux/ts-nbus.h | 18 - 5 files changed, 446 deletions(-) delete mode 100644 Documentation/devicetree/bindings/bus/ts-nbus.txt delete mode 100644 drivers/bus/ts-nbus.c delete mode 100644 include/linux/ts-nbus.h diff --git a/Documentation/devicetree/bindings/bus/ts-nbus.txt b/Documentation/devicetree/bindings/bus/ts-nbus.txt deleted file mode 100644 index 2a10d065b9fa..000000000000 --- a/Documentation/devicetree/bindings/bus/ts-nbus.txt +++ /dev/null @@ -1,50 +0,0 @@ -Technologic Systems NBUS - -The NBUS is a bus used to interface with peripherals in the Technologic -Systems FPGA on the TS-4600 SoM. - -Required properties : - - compatible : "technologic,ts-nbus" - - #address-cells : must be 1 - - #size-cells : must be 0 - - pwms : The PWM bound to the FPGA - - ts,data-gpios : The 8 GPIO pins connected to the data lines on the FPGA - - ts,csn-gpios : The GPIO pin connected to the csn line on the FPGA - - ts,txrx-gpios : The GPIO pin connected to the txrx line on the FPGA - - ts,strobe-gpios : The GPIO pin connected to the stobe line on the FPGA - - ts,ale-gpios : The GPIO pin connected to the ale line on the FPGA - - ts,rdy-gpios : The GPIO pin connected to the rdy line on the FPGA - -Child nodes: - -The NBUS node can contain zero or more child nodes representing peripherals -on the bus. - -Example: - - nbus { - compatible = "technologic,ts-nbus"; - pinctrl-0 = <&nbus_pins>; - #address-cells = <1>; - #size-cells = <0>; - pwms = <&pwm 2 83>; - ts,data-gpios = <&gpio0 0 GPIO_ACTIVE_HIGH - &gpio0 1 GPIO_ACTIVE_HIGH - &gpio0 2 GPIO_ACTIVE_HIGH - &gpio0 3 GPIO_ACTIVE_HIGH - &gpio0 4 GPIO_ACTIVE_HIGH - &gpio0 5 GPIO_ACTIVE_HIGH - &gpio0 6 GPIO_ACTIVE_HIGH - &gpio0 7 GPIO_ACTIVE_HIGH>; - ts,csn-gpios = <&gpio0 16 GPIO_ACTIVE_HIGH>; - ts,txrx-gpios = <&gpio0 24 GPIO_ACTIVE_HIGH>; - ts,strobe-gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; - ts,ale-gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; - ts,rdy-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; - - watchdog@2a { - compatible = "..."; - - /* ... */ - }; - }; diff --git a/drivers/bus/Kconfig b/drivers/bus/Kconfig index 1851112ccc29..275402198537 100644 --- a/drivers/bus/Kconfig +++ b/drivers/bus/Kconfig @@ -147,14 +147,6 @@ config TI_SYSC Generic driver for Texas Instruments interconnect target module found on many TI SoCs. -config TS_NBUS - tristate "Technologic Systems NBUS Driver" - depends on SOC_IMX28 - depends on OF_GPIO && PWM - help - Driver for the Technologic Systems NBUS which is used to interface - with the peripherals in the FPGA of the TS-4600 SoM. - config UNIPHIER_SYSTEM_BUS tristate "UniPhier System Bus driver" depends on ARCH_UNIPHIER && OF diff --git a/drivers/bus/Makefile b/drivers/bus/Makefile index ca300b1914ce..1cb001b6fc4f 100644 --- a/drivers/bus/Makefile +++ b/drivers/bus/Makefile @@ -27,7 +27,6 @@ obj-$(CONFIG_SIMPLE_PM_BUS) += simple-pm-bus.o obj-$(CONFIG_TEGRA_ACONNECT) += tegra-aconnect.o obj-$(CONFIG_TEGRA_GMI) += tegra-gmi.o obj-$(CONFIG_TI_SYSC) += ti-sysc.o -obj-$(CONFIG_TS_NBUS) += ts-nbus.o obj-$(CONFIG_UNIPHIER_SYSTEM_BUS) += uniphier-system-bus.o obj-$(CONFIG_VEXPRESS_CONFIG) += vexpress-config.o diff --git a/drivers/bus/ts-nbus.c b/drivers/bus/ts-nbus.c deleted file mode 100644 index 9989ce904a37..000000000000 --- a/drivers/bus/ts-nbus.c +++ /dev/null @@ -1,369 +0,0 @@ -/* - * NBUS driver for TS-4600 based boards - * - * Copyright (c) 2016 - Savoir-faire Linux - * Author: Sebastien Bourdelin - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - * - * This driver implements a GPIOs bit-banged bus, called the NBUS by Technologic - * Systems. It is used to communicate with the peripherals in the FPGA on the - * TS-4600 SoM. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define TS_NBUS_DIRECTION_IN 0 -#define TS_NBUS_DIRECTION_OUT 1 -#define TS_NBUS_WRITE_ADR 0 -#define TS_NBUS_WRITE_VAL 1 - -struct ts_nbus { - struct pwm_device *pwm; - struct gpio_descs *data; - struct gpio_desc *csn; - struct gpio_desc *txrx; - struct gpio_desc *strobe; - struct gpio_desc *ale; - struct gpio_desc *rdy; - struct mutex lock; -}; - -/* - * request all gpios required by the bus. - */ -static int ts_nbus_init_pdata(struct platform_device *pdev, struct ts_nbus - *ts_nbus) -{ - ts_nbus->data = devm_gpiod_get_array(&pdev->dev, "ts,data", - GPIOD_OUT_HIGH); - if (IS_ERR(ts_nbus->data)) { - dev_err(&pdev->dev, "failed to retrieve ts,data-gpio from dts\n"); - return PTR_ERR(ts_nbus->data); - } - - ts_nbus->csn = devm_gpiod_get(&pdev->dev, "ts,csn", GPIOD_OUT_HIGH); - if (IS_ERR(ts_nbus->csn)) { - dev_err(&pdev->dev, "failed to retrieve ts,csn-gpio from dts\n"); - return PTR_ERR(ts_nbus->csn); - } - - ts_nbus->txrx = devm_gpiod_get(&pdev->dev, "ts,txrx", GPIOD_OUT_HIGH); - if (IS_ERR(ts_nbus->txrx)) { - dev_err(&pdev->dev, "failed to retrieve ts,txrx-gpio from dts\n"); - return PTR_ERR(ts_nbus->txrx); - } - - ts_nbus->strobe = devm_gpiod_get(&pdev->dev, "ts,strobe", GPIOD_OUT_HIGH); - if (IS_ERR(ts_nbus->strobe)) { - dev_err(&pdev->dev, "failed to retrieve ts,strobe-gpio from dts\n"); - return PTR_ERR(ts_nbus->strobe); - } - - ts_nbus->ale = devm_gpiod_get(&pdev->dev, "ts,ale", GPIOD_OUT_HIGH); - if (IS_ERR(ts_nbus->ale)) { - dev_err(&pdev->dev, "failed to retrieve ts,ale-gpio from dts\n"); - return PTR_ERR(ts_nbus->ale); - } - - ts_nbus->rdy = devm_gpiod_get(&pdev->dev, "ts,rdy", GPIOD_IN); - if (IS_ERR(ts_nbus->rdy)) { - dev_err(&pdev->dev, "failed to retrieve ts,rdy-gpio from dts\n"); - return PTR_ERR(ts_nbus->rdy); - } - - return 0; -} - -/* - * the data gpios are used for reading and writing values, their directions - * should be adjusted accordingly. - */ -static void ts_nbus_set_direction(struct ts_nbus *ts_nbus, int direction) -{ - int i; - - for (i = 0; i < 8; i++) { - if (direction == TS_NBUS_DIRECTION_IN) - gpiod_direction_input(ts_nbus->data->desc[i]); - else - /* when used as output the default state of the data - * lines are set to high */ - gpiod_direction_output(ts_nbus->data->desc[i], 1); - } -} - -/* - * reset the bus in its initial state. - * The data, csn, strobe and ale lines must be zero'ed to let the FPGA knows a - * new transaction can be process. - */ -static void ts_nbus_reset_bus(struct ts_nbus *ts_nbus) -{ - DECLARE_BITMAP(values, 8); - - values[0] = 0; - - gpiod_set_array_value_cansleep(8, ts_nbus->data->desc, - ts_nbus->data->info, values); - gpiod_set_value_cansleep(ts_nbus->csn, 0); - gpiod_set_value_cansleep(ts_nbus->strobe, 0); - gpiod_set_value_cansleep(ts_nbus->ale, 0); -} - -/* - * let the FPGA knows it can process. - */ -static void ts_nbus_start_transaction(struct ts_nbus *ts_nbus) -{ - gpiod_set_value_cansleep(ts_nbus->strobe, 1); -} - -/* - * read a byte value from the data gpios. - * return 0 on success or negative errno on failure. - */ -static int ts_nbus_read_byte(struct ts_nbus *ts_nbus, u8 *val) -{ - struct gpio_descs *gpios = ts_nbus->data; - int ret, i; - - *val = 0; - for (i = 0; i < 8; i++) { - ret = gpiod_get_value_cansleep(gpios->desc[i]); - if (ret < 0) - return ret; - if (ret) - *val |= BIT(i); - } - - return 0; -} - -/* - * set the data gpios accordingly to the byte value. - */ -static void ts_nbus_write_byte(struct ts_nbus *ts_nbus, u8 byte) -{ - struct gpio_descs *gpios = ts_nbus->data; - DECLARE_BITMAP(values, 8); - - values[0] = byte; - - gpiod_set_array_value_cansleep(8, gpios->desc, gpios->info, values); -} - -/* - * reading the bus consists of resetting the bus, then notifying the FPGA to - * send the data in the data gpios and return the read value. - * return 0 on success or negative errno on failure. - */ -static int ts_nbus_read_bus(struct ts_nbus *ts_nbus, u8 *val) -{ - ts_nbus_reset_bus(ts_nbus); - ts_nbus_start_transaction(ts_nbus); - - return ts_nbus_read_byte(ts_nbus, val); -} - -/* - * writing to the bus consists of resetting the bus, then define the type of - * command (address/value), write the data and notify the FPGA to retrieve the - * value in the data gpios. - */ -static void ts_nbus_write_bus(struct ts_nbus *ts_nbus, int cmd, u8 val) -{ - ts_nbus_reset_bus(ts_nbus); - - if (cmd == TS_NBUS_WRITE_ADR) - gpiod_set_value_cansleep(ts_nbus->ale, 1); - - ts_nbus_write_byte(ts_nbus, val); - ts_nbus_start_transaction(ts_nbus); -} - -/* - * read the value in the FPGA register at the given address. - * return 0 on success or negative errno on failure. - */ -int ts_nbus_read(struct ts_nbus *ts_nbus, u8 adr, u16 *val) -{ - int ret, i; - u8 byte; - - /* bus access must be atomic */ - mutex_lock(&ts_nbus->lock); - - /* set the bus in read mode */ - gpiod_set_value_cansleep(ts_nbus->txrx, 0); - - /* write address */ - ts_nbus_write_bus(ts_nbus, TS_NBUS_WRITE_ADR, adr); - - /* set the data gpios direction as input before reading */ - ts_nbus_set_direction(ts_nbus, TS_NBUS_DIRECTION_IN); - - /* reading value MSB first */ - do { - *val = 0; - byte = 0; - for (i = 1; i >= 0; i--) { - /* read a byte from the bus, leave on error */ - ret = ts_nbus_read_bus(ts_nbus, &byte); - if (ret < 0) - goto err; - - /* append the byte read to the final value */ - *val |= byte << (i * 8); - } - gpiod_set_value_cansleep(ts_nbus->csn, 1); - ret = gpiod_get_value_cansleep(ts_nbus->rdy); - } while (ret); - -err: - /* restore the data gpios direction as output after reading */ - ts_nbus_set_direction(ts_nbus, TS_NBUS_DIRECTION_OUT); - - mutex_unlock(&ts_nbus->lock); - - return ret; -} -EXPORT_SYMBOL_GPL(ts_nbus_read); - -/* - * write the desired value in the FPGA register at the given address. - */ -int ts_nbus_write(struct ts_nbus *ts_nbus, u8 adr, u16 val) -{ - int i; - - /* bus access must be atomic */ - mutex_lock(&ts_nbus->lock); - - /* set the bus in write mode */ - gpiod_set_value_cansleep(ts_nbus->txrx, 1); - - /* write address */ - ts_nbus_write_bus(ts_nbus, TS_NBUS_WRITE_ADR, adr); - - /* writing value MSB first */ - for (i = 1; i >= 0; i--) - ts_nbus_write_bus(ts_nbus, TS_NBUS_WRITE_VAL, (u8)(val >> (i * 8))); - - /* wait for completion */ - gpiod_set_value_cansleep(ts_nbus->csn, 1); - while (gpiod_get_value_cansleep(ts_nbus->rdy) != 0) { - gpiod_set_value_cansleep(ts_nbus->csn, 0); - gpiod_set_value_cansleep(ts_nbus->csn, 1); - } - - mutex_unlock(&ts_nbus->lock); - - return 0; -} -EXPORT_SYMBOL_GPL(ts_nbus_write); - -static int ts_nbus_probe(struct platform_device *pdev) -{ - struct pwm_device *pwm; - struct pwm_args pargs; - struct device *dev = &pdev->dev; - struct ts_nbus *ts_nbus; - int ret; - - ts_nbus = devm_kzalloc(dev, sizeof(*ts_nbus), GFP_KERNEL); - if (!ts_nbus) - return -ENOMEM; - - mutex_init(&ts_nbus->lock); - - ret = ts_nbus_init_pdata(pdev, ts_nbus); - if (ret < 0) - return ret; - - pwm = devm_pwm_get(dev, NULL); - if (IS_ERR(pwm)) { - ret = PTR_ERR(pwm); - if (ret != -EPROBE_DEFER) - dev_err(dev, "unable to request PWM\n"); - return ret; - } - - pwm_get_args(pwm, &pargs); - if (!pargs.period) { - dev_err(&pdev->dev, "invalid PWM period\n"); - return -EINVAL; - } - - /* - * FIXME: pwm_apply_args() should be removed when switching to - * the atomic PWM API. - */ - pwm_apply_args(pwm); - ret = pwm_config(pwm, pargs.period, pargs.period); - if (ret < 0) - return ret; - - /* - * we can now start the FPGA and populate the peripherals. - */ - pwm_enable(pwm); - ts_nbus->pwm = pwm; - - /* - * let the child nodes retrieve this instance of the ts-nbus. - */ - dev_set_drvdata(dev, ts_nbus); - - ret = of_platform_populate(dev->of_node, NULL, NULL, dev); - if (ret < 0) - return ret; - - dev_info(dev, "initialized\n"); - - return 0; -} - -static int ts_nbus_remove(struct platform_device *pdev) -{ - struct ts_nbus *ts_nbus = dev_get_drvdata(&pdev->dev); - - /* shutdown the FPGA */ - mutex_lock(&ts_nbus->lock); - pwm_disable(ts_nbus->pwm); - mutex_unlock(&ts_nbus->lock); - - return 0; -} - -static const struct of_device_id ts_nbus_of_match[] = { - { .compatible = "technologic,ts-nbus", }, - { }, -}; -MODULE_DEVICE_TABLE(of, ts_nbus_of_match); - -static struct platform_driver ts_nbus_driver = { - .probe = ts_nbus_probe, - .remove = ts_nbus_remove, - .driver = { - .name = "ts_nbus", - .of_match_table = ts_nbus_of_match, - }, -}; - -module_platform_driver(ts_nbus_driver); - -MODULE_ALIAS("platform:ts_nbus"); -MODULE_AUTHOR("Sebastien Bourdelin "); -MODULE_DESCRIPTION("Technologic Systems NBUS"); -MODULE_LICENSE("GPL v2"); diff --git a/include/linux/ts-nbus.h b/include/linux/ts-nbus.h deleted file mode 100644 index 5bd4c822f7cf..000000000000 --- a/include/linux/ts-nbus.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2016 - Savoir-faire Linux - * Author: Sebastien Bourdelin - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#ifndef _TS_NBUS_H -#define _TS_NBUS_H - -struct ts_nbus; - -extern int ts_nbus_read(struct ts_nbus *ts_nbus, u8 adr, u16 *val); -extern int ts_nbus_write(struct ts_nbus *ts_nbus, u8 adr, u16 val); - -#endif /* _TS_NBUS_H */