Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2970963imu; Sun, 9 Dec 2018 13:59:26 -0800 (PST) X-Google-Smtp-Source: AFSGD/Vncz8RN85SL8jt+/YXRMyHghHR4RHJx0UWan2W0iL3VlsNrULem5OSPAgKCGMqPdhzkRZV X-Received: by 2002:a63:d252:: with SMTP id t18mr8882777pgi.133.1544392766924; Sun, 09 Dec 2018 13:59:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544392766; cv=none; d=google.com; s=arc-20160816; b=GEsSmsqgrqmaM0/iDvT4Tgwcn2Yyat5SBQNDCryO3D4A4ahfALMGIEHPP0WOVyBfo8 dBOU453JePHubNEKYMNX1Q0tza33NA0JXRo6N51cJQKvFZ3lrD/V/I3tTOe7nYAnCy3K FuNrhEYrI2UT9MN3NM4bIBFquPCYpEOOnekyHeO/b+BLkuBQkto4+S2SvOXPXRCp6Ygr 6nn4yJmkD5fz3Rornme9CJJwmOaMJVzmudYlK73vF8/iHJclkMjueJmu6fZrcKOlUBcJ QB4S/3EXOz5ckwiad7X0521asKfbyTgPcPtWtuzyg7HGKtxpSYdiTvqsuFRz7yOBVSJS H45A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=htBQnHK9GA/GgL6edDuBFosj3O4/9FiMqQEZCeE/Lwg=; b=BKFthffgEooglmWuhuLHl21OMFQPBdrCr5mLwwjcj5bbStcHxVrA9YFOr4O9E2POk+ dcnkqzNw9bk5FyCq5kgQV3Oss2IILnPPRVRVMBtXxP9VM55+N7x94AY4pob3ESrALQUS 0mkHQnM5a+SGWWQ95Mo5mcI5V7aGfO42ne5d8DZulVgdzhMsxgHSqSRPgwPWsVZYLkHa mHxjDo70FBofAn1sNZfYbGuxN7LnGriIcCSzk2iw2T6OK7iyomyAQu8a1Rgz9o937q/g 9u5K+jZf8QwmS2S+ZLVjaUMQxpXyEABCR6P+9zBX88zbHdBe2ytAU0KGsHcqUqVhEhe5 +1aw== 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 q24si8197302pgi.334.2018.12.09.13.59.12; Sun, 09 Dec 2018 13:59:26 -0800 (PST) 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 S1727061AbeLIV5x (ORCPT + 99 others); Sun, 9 Dec 2018 16:57:53 -0500 Received: from mail-out.m-online.net ([212.18.0.9]:34663 "EHLO mail-out.m-online.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726760AbeLIV5v (ORCPT ); Sun, 9 Dec 2018 16:57:51 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 43Cg6y40zdz1qxQ5; Sun, 9 Dec 2018 22:57:46 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 43Cg6y30Qzz1qqkb; Sun, 9 Dec 2018 22:57:46 +0100 (CET) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id u9gc70OFzkd2; Sun, 9 Dec 2018 22:57:44 +0100 (CET) X-Auth-Info: d1X4/QWeCb2fgW832h8OGoC9iLZ60oq/qGtKmqAKn7c= Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Sun, 9 Dec 2018 22:57:44 +0100 (CET) From: Lukasz Majewski To: Mark Brown Cc: Mark Rutland , linux-spi@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Esben Haabendal , =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= , Andrey Smirnov , Lukasz Majewski Subject: [PATCHv4] ARM: dspi: Provide support for DSPI slave mode operation (Vybryd vf610) Date: Sun, 9 Dec 2018 22:57:21 +0100 Message-Id: <20181209215721.23063-1-lukma@denx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180927150709.17010-1-lukma@denx.de> References: <20180927150709.17010-1-lukma@denx.de> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The NXP's Vybryd vf610 can work as a SPI slave device (the CS and clock signals are provided by master). It is possible to specify a single device to work in that mode. As we do use DMA for transferring data, the RX channel must be prepared for incoming data. Moreover, in slave mode we just set a subset of control fields in configuration registers (CTAR0, PUSHR). For testing the spidev_test program has been used. Test script for this patch can be found here: https://github.com/lmajewski/tests-spi/blob/master/tests/spi/spi_tests.sh Signed-off-by: Lukasz Majewski --- Changes for v4: - Rebase to v4.20-rc5 (no code changes needed) Changes for v3: - Rebase to v4.20-rc2 (no code changes needed) Changes for v2: - Remove patch which adds extra NXP specific DTS property to support slave mode and reuse the generic one (spi-slave) - Remove patch which brings back the mcr_register local copy. It is not needed as generic SPI slave infrastructure is used. - Rewrite the code to use spi_controller_is_slave() helper functions --- drivers/spi/spi-fsl-dspi.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 3082e72e4f6c..94b6a9690062 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -233,6 +233,9 @@ static u32 dspi_pop_tx_pushr(struct fsl_dspi *dspi) { u16 cmd = dspi->tx_cmd, data = dspi_pop_tx(dspi); + if (spi_controller_is_slave(dspi->master)) + return data; + if (dspi->len > 0) cmd |= SPI_PUSHR_CMD_CONT; return cmd << 16 | data; @@ -329,6 +332,11 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi) dma_async_issue_pending(dma->chan_rx); dma_async_issue_pending(dma->chan_tx); + if (spi_controller_is_slave(dspi->master)) { + wait_for_completion_interruptible(&dspi->dma->cmd_rx_complete); + return 0; + } + time_left = wait_for_completion_timeout(&dspi->dma->cmd_tx_complete, DMA_COMPLETION_TIMEOUT); if (time_left == 0) { @@ -798,14 +806,18 @@ static int dspi_setup(struct spi_device *spi) ns_delay_scale(&pasc, &asc, sck_cs_delay, clkrate); chip->ctar_val = SPI_CTAR_CPOL(spi->mode & SPI_CPOL ? 1 : 0) - | SPI_CTAR_CPHA(spi->mode & SPI_CPHA ? 1 : 0) - | SPI_CTAR_LSBFE(spi->mode & SPI_LSB_FIRST ? 1 : 0) - | SPI_CTAR_PCSSCK(pcssck) - | SPI_CTAR_CSSCK(cssck) - | SPI_CTAR_PASC(pasc) - | SPI_CTAR_ASC(asc) - | SPI_CTAR_PBR(pbr) - | SPI_CTAR_BR(br); + | SPI_CTAR_CPHA(spi->mode & SPI_CPHA ? 1 : 0); + + if (!spi_controller_is_slave(dspi->master)) { + chip->ctar_val |= SPI_CTAR_LSBFE(spi->mode & + SPI_LSB_FIRST ? 1 : 0) + | SPI_CTAR_PCSSCK(pcssck) + | SPI_CTAR_CSSCK(cssck) + | SPI_CTAR_PASC(pasc) + | SPI_CTAR_ASC(asc) + | SPI_CTAR_PBR(pbr) + | SPI_CTAR_BR(br); + } spi_set_ctldata(spi, chip); @@ -970,8 +982,13 @@ static const struct regmap_config dspi_xspi_regmap_config[] = { static void dspi_init(struct fsl_dspi *dspi) { - regmap_write(dspi->regmap, SPI_MCR, SPI_MCR_MASTER | SPI_MCR_PCSIS | - (dspi->devtype_data->xspi_mode ? SPI_MCR_XSPI : 0)); + unsigned int mcr = SPI_MCR_PCSIS | + (dspi->devtype_data->xspi_mode ? SPI_MCR_XSPI : 0); + + if (!spi_controller_is_slave(dspi->master)) + mcr |= SPI_MCR_MASTER; + + regmap_write(dspi->regmap, SPI_MCR, mcr); regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR); if (dspi->devtype_data->xspi_mode) regmap_write(dspi->regmap, SPI_CTARE(0), @@ -1027,6 +1044,9 @@ static int dspi_probe(struct platform_device *pdev) } master->bus_num = bus_num; + if (of_property_read_bool(np, "spi-slave")) + master->slave = true; + dspi->devtype_data = of_device_get_match_data(&pdev->dev); if (!dspi->devtype_data) { dev_err(&pdev->dev, "can't get devtype_data\n"); -- 2.11.0