Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5274204imu; Tue, 13 Nov 2018 04:07:42 -0800 (PST) X-Google-Smtp-Source: AJdET5flclZoMpU1fl7yHs7kDMB/FaJHRmOJ8gCYtx0fBFhx6YfJJWGB6jQLOBZsk/icY+2PfVoE X-Received: by 2002:a63:ba48:: with SMTP id l8mr4444684pgu.72.1542110862132; Tue, 13 Nov 2018 04:07:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542110862; cv=none; d=google.com; s=arc-20160816; b=vUOXHgeET3DHDJ+3lDJwhlm0N0wjsgzmHh9mpMgXjewzPKHDYeN7VyowLYtoATCEhd 2kXlMJ9uqYDwFOElApys2InUB2YuayPpz9P/S1Ka8kvjrm4ibR+3OuLqBvoRBTd2vJ4x 2HgbvWFDFANpkGPFicoltBUIQzHdyi+Q8yP11d97RxkB1hHW4mNIX1JC086fi/TgIRoB AhYD0SzQYdQMjNgOOGde+1lw0lO69LoSs9BFlogScgS/RWmJtVoK5MuBEnMcktU2g3Us 0grDnZ+g6/AFoh+3ZbytKfemWXP2LNAEbXERIF071ir86bdOooolRYr8vRvEnbkpyR6G Errg== 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=qxMJsmDOtWV+xLclB94+F49kp3YKgSpeoUvSaFDfv34=; b=qO/Ryia1dSOXeYXRnc9mVDNs2C+ft1u+ktzCXlZcPbaZHRubDykdj71mBFoSjpdqp3 c6TQeqH2lHcrGsIgqHed6FVmvkgyJotUFEfA5a4+e3dZDVk6Ej0vJhGUQE+1ilq+6U67 nvBLyzsy12Z9XCalghhg00i+dSw9Q/O2KvrM9+KStcB5sPlmLTFEyHvOj6eU4+fwCEfd S2sDOpVyD0n+3rZM1DfdgJkqgaJzQiCdpTpDs0tpw/uOiMahbDkRUbfvtAsc4osDkRJ1 GrE4Mm9ORRSRjKWG0Q7BtItthxbfAr+AiSC2yzUF4+gWEEQMxsz/LC/hHYWg05++dYfN fr2w== 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 r68-v6si23014716pfk.151.2018.11.13.04.07.19; Tue, 13 Nov 2018 04:07:42 -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 S1732777AbeKMWEr (ORCPT + 99 others); Tue, 13 Nov 2018 17:04:47 -0500 Received: from mail-out.m-online.net ([212.18.0.10]:43335 "EHLO mail-out.m-online.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726934AbeKMWEr (ORCPT ); Tue, 13 Nov 2018 17:04:47 -0500 Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 42vRF83YJzz1qxJp; Tue, 13 Nov 2018 13:06:52 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 42vRF82k33z1qr2g; Tue, 13 Nov 2018 13:06:52 +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 4O9Lm_iTs-_y; Tue, 13 Nov 2018 13:06:48 +0100 (CET) X-Auth-Info: zaHRM1UV1E6dlXiMaoeBxHsyinfzEHHU8qyAo3ts7lY= 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; Tue, 13 Nov 2018 13:06:48 +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: [PATCHv3] ARM: dspi: Provide support for DSPI slave mode operation (Vybryd vf610) Date: Tue, 13 Nov 2018 13:06:31 +0100 Message-Id: <20181113120631.13514-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 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