Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp52145pxb; Mon, 31 Jan 2022 15:01:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJxhyKKqmRD/8s44iY+EYX0hAnWaABDhoM1SvLplkuPkdkhiIZ+HNmtVcSIoxvORLlxZIXuB X-Received: by 2002:a17:902:bf0a:: with SMTP id bi10mr23345964plb.164.1643670084105; Mon, 31 Jan 2022 15:01:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643670084; cv=none; d=google.com; s=arc-20160816; b=ZBg5tF0QbtGfPj9jfO0NlSfTc1j2Rm1Mg4KJsIKaZ5KZGliktUYmRmq18INFdnHQbd cxs3ubs8tt7C+fxjA2WEmxC/CuxGaumRebbOSWOIOETXAUt3VKe/t8A8pSqQn4WyOy6a QPqjhcVbb+cb6OyDa7FHgZ1QP8FJWvxDg+IXEQcCzSxgcPR/ihHDoEy//HXgrfpH9rTk ePKsflpRKVHAaabpNow1Zdkgp4cnxGSh+sWwoCUh9y8Fm5WxkfKfSCj3F6fB0+LyOWxE Fa8xENab3KjxCW4ZxmftuV4wNIu5ERb174SsxQEpii6ROfZe4rflCWveaitiMfnwgOKI s23g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=jNEO6NZFFUT3tUjdLKmLDb1Z96reNNvzPGOdn0B6DJI=; b=nBHh5BN+tkDH8CaJ5NHO9KbC4+OixwsGHG8fptWAfnchs6u4/G2sfFVLwQhPW/8vl1 Ad5RVEBGU5wf/Zp7lLK7+gSMsFwoADAp8RItgVgNmlow7k7XK6qYRsbxPoKWzEPxxPdS F9TVWc2fx674gySfKTu5EM1HX08dFDhRrakIw8TRcg8a4E8tbtb2k8TQ9LEB5+atVlv7 q/eTP38960IRDHmA9XU+4ZXSBIbI3t+A/o5l0X81EfHYNZSTgm1Q/T/Om7DWC2qznLtH hD6ZtWy7h3QqAdChA259JY7f0c7wl+22ORf4p7jJ5eBq5HTBOiMJuZDHFiOo0GjHrbEP 4tfg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=igbcMb5G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 207si15084898pgb.834.2022.01.31.15.01.11; Mon, 31 Jan 2022 15:01:24 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=igbcMb5G; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352327AbiA2EFT (ORCPT + 99 others); Fri, 28 Jan 2022 23:05:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57716 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238931AbiA2EFR (ORCPT ); Fri, 28 Jan 2022 23:05:17 -0500 Received: from mail-oi1-x233.google.com (mail-oi1-x233.google.com [IPv6:2607:f8b0:4864:20::233]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A5513C061714; Fri, 28 Jan 2022 20:05:17 -0800 (PST) Received: by mail-oi1-x233.google.com with SMTP id v67so16157713oie.9; Fri, 28 Jan 2022 20:05:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=jNEO6NZFFUT3tUjdLKmLDb1Z96reNNvzPGOdn0B6DJI=; b=igbcMb5GBjQd7Ocj8jzYOARhuDK0cqEXUQqwuz2Tj5+XjnhV886ZIDsGjANjup0ed/ F0fDaKVGzMfDUis3nWPG88cjJKdzW3E4E1RzOEDYDnymgVWo8QrNu47Og4lMbK+ZaLAC ViyKFmYcx+0re8Sj7iY3O+3/D8lCPkfa+HkR/t3lQCrwuggQGIzc+FZfIaLK4gHwpXK/ lv24B1kZRYOdh021QoHdiRUAL6KferIbKm0cOuGtnBrm8mskLURP67+VqDP41ERaJpt1 4fvUXyCNDO3rzjMcrYgmztWf7LT2hKeCcHhMVuWuewwnDOlMIb/ibvMuuSDeJ1PUqsv8 54jQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=jNEO6NZFFUT3tUjdLKmLDb1Z96reNNvzPGOdn0B6DJI=; b=DfU8CLpE02gpLEkvioT3ED+Jcr9QTd4JsePjZorYbI6v84qxUvV7XtlfAMHhzZOj8f rAmHaASVFNM4We5JpudZhsOuXF11CmkEfKnpYDkNgXaOjVx8SMndUBz4tV/eeQcUdn17 hyBnY7Fo7D5GoNIgfNnxbDQrdlX1n3bT5g6dMi6fhJyNm+Gh0IfeviYnQ9SgUfM7GXFs MGiWepkEQAuQVzBPBCJGjBy1xBvhtOUmtwvKIfiBR7hlT40Uws31bVELodI1oGdQbVPK yJJBOHkd1JGTRtkKw3VMdfEvbhEij/zsbjlErKHZU4+el8iUj34CEFBPbsYfmlcBZrS4 LFEg== X-Gm-Message-State: AOAM533tOSx9h6RZuXGapXmTRxrJ1k7jm6X6wInx9y5TeDTJRDTLpsu6 fTA4MZBFz+2G3U8BwbhMsJVDOPmXvJK+pg== X-Received: by 2002:aca:42c2:: with SMTP id p185mr7417306oia.192.1643429116629; Fri, 28 Jan 2022 20:05:16 -0800 (PST) Received: from tresc043793.tre-sc.gov.br ([187.94.103.218]) by smtp.gmail.com with ESMTPSA id t21sm4972622oor.4.2022.01.28.20.05.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Jan 2022 20:05:15 -0800 (PST) From: Luiz Angelo Daros de Luca To: linux-spi@vger.kernel.org Cc: broonie@kernel.org, linux-kernel@vger.kernel.org, Luiz Angelo Daros de Luca Subject: [PATCH] spi: ath79: add mem_ops for fast-read Date: Sat, 29 Jan 2022 01:04:53 -0300 Message-Id: <20220129040453.8476-1-luizluca@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Reading from memory is 3x faster than bit-bang read operation. Also, for tl-wr2543nd, the bit-bang read was sporadically returning random data, possibly a HW defect, while fast-read works as expected. Signed-off-by: Luiz Angelo Daros de Luca --- drivers/spi/spi-ath79.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/drivers/spi/spi-ath79.c b/drivers/spi/spi-ath79.c index d1e287d2d9cd..607e7a49fb89 100644 --- a/drivers/spi/spi-ath79.c +++ b/drivers/spi/spi-ath79.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -133,6 +134,38 @@ static u32 ath79_spi_txrx_mode0(struct spi_device *spi, unsigned int nsecs, return ath79_spi_rr(sp, AR71XX_SPI_REG_RDS); } +static int ath79_exec_mem_op(struct spi_mem *mem, + const struct spi_mem_op *op) +{ + struct ath79_spi *sp = ath79_spidev_to_sp(mem->spi); + + /* Ensures that reading is performed on device connected to hardware cs0 */ + if (mem->spi->chip_select || mem->spi->cs_gpiod) + return -ENOTSUPP; + + /* Only use for fast-read op. */ + if (op->cmd.opcode != 0x0b || op->data.dir != SPI_MEM_DATA_IN || + op->addr.nbytes != 3 || op->dummy.nbytes != 1) + return -ENOTSUPP; + + /* disable GPIO mode */ + ath79_spi_wr(sp, AR71XX_SPI_REG_FS, 0); + + memcpy_fromio(op->data.buf.in, sp->base + op->addr.val, op->data.nbytes); + + /* enable GPIO mode */ + ath79_spi_wr(sp, AR71XX_SPI_REG_FS, AR71XX_SPI_FS_GPIO); + + /* restore IOC register */ + ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); + + return 0; +} + +static const struct spi_controller_mem_ops ath79_mem_ops = { + .exec_op = ath79_exec_mem_op, +}; + static int ath79_spi_probe(struct platform_device *pdev) { struct spi_master *master; @@ -154,6 +187,7 @@ static int ath79_spi_probe(struct platform_device *pdev) master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32); master->flags = SPI_MASTER_GPIO_SS; master->num_chipselect = 3; + master->mem_ops = &ath79_mem_ops; sp->bitbang.master = master; sp->bitbang.chipselect = ath79_spi_chipselect; -- 2.34.1