From patchwork Wed Dec 7 02:09:33 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Bostic X-Patchwork-Id: 9463763 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AA44B6022E for ; Wed, 7 Dec 2016 02:12:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9B8E3284D0 for ; Wed, 7 Dec 2016 02:12:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8F3A2284F2; Wed, 7 Dec 2016 02:12:40 +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=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 2365F284D0 for ; Wed, 7 Dec 2016 02:12:40 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1cERhC-0000Lk-4S; Wed, 07 Dec 2016 02:10:58 +0000 Received: from mail-oi0-x244.google.com ([2607:f8b0:4003:c06::244]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1cERgL-0006j5-Vv for linux-arm-kernel@lists.infradead.org; Wed, 07 Dec 2016 02:10:08 +0000 Received: by mail-oi0-x244.google.com with SMTP id v84so43674226oie.2 for ; Tue, 06 Dec 2016 18:09:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5ap8oSOtZ9Uq5VVDOO43ivQd5WTvVoP2r+Fn78dWWMg=; b=lLjACEzX84po+bhuKD+/WphhD9AwyZcWTTaHmSA0TN1bUKmvHsLuFuUdBMZWUUIkIY l9K9BjqGq3V4Q7QSo4tJtOQmKG3oETdz6ghUEyABSyeB6fxERwZAQSwNoS5yNZOeDXGV rXAuq0Mc1+/ZdJHMNq2iER+Q5s9azyLgAMe6TexXA71rbAldwY5sNS4J2eQ/lBG0WjqD owIR2wPd3D+e/F6+4uq3kAYXtNzXjiWwxD8PG0KUwviXxqZwINt4UejQ+FaOBNhsGvmC bNr5nDOvF0aSpRFG4hQ4nUdc7OQNwlRGDXSDX5funIIsYHp42xAl+XOTKDgegmRFjUIz fi7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5ap8oSOtZ9Uq5VVDOO43ivQd5WTvVoP2r+Fn78dWWMg=; b=WvT26NCTU1RMXUhWnM4N0Rr1+LzDq8DS1ZBIDZ0zsCdHeYWmSzAkfhdcedGMmPN+ty WfTMm7weBIdUfZR4WEjF/AogzeR8QWHciRvZhNfiSYRcT109o86EEK5XXZKIVIOpm3t/ AJobVGzZtjhukdE9q6IK3o/MOk7ArD1zkg3wQ0oTglEwMisGBnyIte5lK9cv+zmIoWzE G5Pcwl2Galgg9grigObb2afaBxgrm7tMNGR3Y/OeHL14sZ7DNUwI/OyIFLI188/76oDk jq0bW3PWv/amW8XtHIZ1hz+XiH6aP3GLJW7tVXcejrQivDrRN+OSML+mj07Dcjlo4EFc R+/A== X-Gm-Message-State: AKaTC01xUP1cVOkL/q+RcDCWBB4qaAqPFH1yL/bud6P18mYzu9cCW6Rr264dPLc0JU1yrg== X-Received: by 10.202.50.4 with SMTP id y4mr21081551oiy.180.1481076584958; Tue, 06 Dec 2016 18:09:44 -0800 (PST) Received: from Christophers-MacBook-Pro.local.com (45-20-192-79.lightspeed.austtx.sbcglobal.net. [45.20.192.79]) by smtp.gmail.com with ESMTPSA id q66sm8826335oic.8.2016.12.06.18.09.43 (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 06 Dec 2016 18:09:44 -0800 (PST) From: Chris Bostic To: robh+dt@kernel.org, mark.rutland@arm.com, linux@armlinux.org.uk, gregkh@linuxfoundation.org, sre@kernel.org, mturquette@baylibre.com, geert+renesas@glider.be, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 11/16] drivers/fsi: Add device read/write/peek functions Date: Tue, 6 Dec 2016 20:09:33 -0600 Message-Id: <1481076574-54711-4-git-send-email-christopher.lee.bostic@gmail.com> X-Mailer: git-send-email 2.7.4 (Apple Git-66) In-Reply-To: <1481076574-54711-1-git-send-email-christopher.lee.bostic@gmail.com> References: <1481076574-54711-1-git-send-email-christopher.lee.bostic@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161206_181006_260385_F28E2322 X-CRM114-Status: GOOD ( 13.28 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: andrew@aj.id.au, alistair@popple.id.au, linux-kernel@vger.kernel.org, Chris Bostic , Jeremy Kerr , benh@kernel.crashing.org, joel@jms.id.au MIME-Version: 1.0 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 From: Jeremy Kerr This change introduces the fsi device API: simple read, write and peek accessors for the devices' address spaces. Includes contributions from Chris Bostic Signed-off-by: Jeremy Kerr Signed-off-by: Chris Bostic --- drivers/fsi/fsi-core.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fsi.h | 7 ++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c index b51ea35..80feeb8 100644 --- a/drivers/fsi/fsi-core.c +++ b/drivers/fsi/fsi-core.c @@ -33,6 +33,8 @@ #define FSI_SLAVE_CONF_CRC_MASK 0x0000000f #define FSI_SLAVE_CONF_DATA_BITS 28 +#define FSI_PEEK_BASE 0x410 + static const int engine_page_size = 0x400; static atomic_t master_idx = ATOMIC_INIT(-1); @@ -46,8 +48,46 @@ struct fsi_slave { #define to_fsi_slave(d) container_of(d, struct fsi_slave, dev) +static int fsi_slave_read(struct fsi_slave *slave, uint32_t addr, + void *val, size_t size); +static int fsi_slave_write(struct fsi_slave *slave, uint32_t addr, + const void *val, size_t size); + /* FSI endpoint-device support */ +int fsi_device_read(struct fsi_device *dev, uint32_t addr, void *val, + size_t size) +{ + if (addr > dev->size) + return -EINVAL; + + if (addr + size > dev->size) + return -EINVAL; + + return fsi_slave_read(dev->slave, dev->addr + addr, val, size); +} +EXPORT_SYMBOL_GPL(fsi_device_read); + +int fsi_device_write(struct fsi_device *dev, uint32_t addr, const void *val, + size_t size) +{ + if (addr > dev->size) + return -EINVAL; + + if (addr + size > dev->size) + return -EINVAL; + + return fsi_slave_write(dev->slave, dev->addr + addr, val, size); +} +EXPORT_SYMBOL_GPL(fsi_device_write); + +int fsi_device_peek(struct fsi_device *dev, void *val) +{ + uint32_t addr = FSI_PEEK_BASE + ((dev->unit - 2) * sizeof(uint32_t)); + + return fsi_slave_read(dev->slave, addr, val, sizeof(uint32_t)); +} + static void fsi_device_release(struct device *_device) { struct fsi_device *device = to_fsi_dev(_device); @@ -100,6 +140,13 @@ static int fsi_slave_read(struct fsi_slave *slave, uint32_t addr, slave->id, addr, val, size); } +static int fsi_slave_write(struct fsi_slave *slave, uint32_t addr, + const void *val, size_t size) +{ + return slave->master->write(slave->master, slave->link, + slave->id, addr, val, size); +} + static int fsi_slave_scan(struct fsi_slave *slave) { uint32_t engine_addr; diff --git a/include/linux/fsi.h b/include/linux/fsi.h index efa55ba..66bce48 100644 --- a/include/linux/fsi.h +++ b/include/linux/fsi.h @@ -27,6 +27,12 @@ struct fsi_device { uint32_t size; }; +extern int fsi_device_read(struct fsi_device *dev, uint32_t addr, + void *val, size_t size); +extern int fsi_device_write(struct fsi_device *dev, uint32_t addr, + const void *val, size_t size); +extern int fsi_device_peek(struct fsi_device *dev, void *val); + struct fsi_device_id { u8 engine_type; u8 version; @@ -40,7 +46,6 @@ struct fsi_device_id { #define FSI_DEVICE_VERSIONED(t, v) \ .engine_type = (t), .version = (v), - struct fsi_driver { struct device_driver drv; const struct fsi_device_id *id_table;