Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp530541imu; Wed, 9 Jan 2019 01:54:02 -0800 (PST) X-Google-Smtp-Source: ALg8bN6anWTiPsiA3AQNMRtqH4SHSUP/mUO+qvrvQzmJETmsRX0dfJGytXYuyaxrnOiTqnL/rzup X-Received: by 2002:a62:3241:: with SMTP id y62mr5269035pfy.178.1547027642477; Wed, 09 Jan 2019 01:54:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547027642; cv=none; d=google.com; s=arc-20160816; b=zghXKML5ZT+qUcGT51qlOH4GTRBFNuzc4gRKiZbMvzi3QI3Qm2d0c3ixGG8M5KAbX4 hU1mYHREA0zseVtEvY43ZHPfq6dQrUMgAD5LVoY/P4iWY+ik2Yb9ThAXrIwOb/YKrJW7 g1T6K2CzTZJJG1VrPjSGfNvk8YLa4TF3EUAFLKfXqVaw/mokkoznz8NkvuQ1/WDK10Et qlsT/gC3/4SEsNR52isDlWqeEdAlPZtjMP8w0DQZ82Nsl4p/jZ92ZJyUYpqbKRYDZ91F MddfQMABF70qChYPFtAE2gB1IEGTvvJ9DoydrzcplTYyYky4aaVSJ1njpgo19ZIAVWgl YMHA== 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=TVjGpedH46I2C/QY6necVQKT6ImcsN9c0ByU781JhxE=; b=Y0AaL5505FGPj9AtMQg3HfEaXAD5Cf0Ek16oMDpEiJqxT1O+YZfhK5ui4MMbWNDVDf PV9ruwPQeaf6nO6wmQGznS3XogRsVCCLD9g8wWbmDOsX8+Li8eoNbudP0iRzIpNMQkvj zsRINFyFTVlUZNGX1o2BmxVp+TQpD/mvl2aSio6thZ5Qf/uKlCPGLmbKG/dZf5W05yhE lX+MwsKv31VfVQ7vLQjqZBaV/D9hn4490T2h7uRVxBi4gTj9MQFz2DtOT48rgr0LzFPR S+28FMZB4zLydxiSdyey9lfdzB/s3Vnv0a0iL+MFkTrErxRuOYXFgVTdsV2PtTVPkBtH OUyg== 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 x61si3513190plb.303.2019.01.09.01.53.46; Wed, 09 Jan 2019 01:54:02 -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 S1729699AbfAII1J (ORCPT + 99 others); Wed, 9 Jan 2019 03:27:09 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:40954 "EHLO mail-out.m-online.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725865AbfAII1I (ORCPT ); Wed, 9 Jan 2019 03:27:08 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 43ZMgC3RYFz1qxDK; Wed, 9 Jan 2019 09:27:03 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 43ZMgC2F1qz1qsnL; Wed, 9 Jan 2019 09:27:03 +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 xBvQsi6o18L9; Wed, 9 Jan 2019 09:27:01 +0100 (CET) X-Auth-Info: 1+rO4lRmIIukx0YPZJNK1lgwjqcb6gvY5S0Z71gKMp8= 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; Wed, 9 Jan 2019 09:27:01 +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: [PATCH v5] ARM: dspi: Provide support for DSPI slave mode operation (Vybryd vf610) Date: Wed, 9 Jan 2019 09:26:44 +0100 Message-Id: <20190109082644.14941-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 v5: - Rebase to v5.0-rc1 (no code changes needed) 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 5e10dc5c93a5..348682be9dd5 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