From patchwork Fri Jan 19 10:37:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jassi Brar X-Patchwork-Id: 125142 Delivered-To: patch@linaro.org Received: by 10.46.66.141 with SMTP id h13csp229034ljf; Fri, 19 Jan 2018 02:37:30 -0800 (PST) X-Google-Smtp-Source: ACJfBoseBnkEAp08Mrm6avOP70hDXjkpsHtWXj41/UNnaNXc1Y6j28bS3GB9VwzmRcu++IC9IXsh X-Received: by 10.101.101.11 with SMTP id x11mr15306771pgv.130.1516358250347; Fri, 19 Jan 2018 02:37:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516358250; cv=none; d=google.com; s=arc-20160816; b=gbSTtjb0q/UikSIRu6VKvh+Ur4u6PCnPwwxFQ1t8gbP5iJdMvDxuW9kbQf/BmQfP1t oq/6cL1uD6ppzoL/8s71yfmXQ6MYA3jhHS5w/iCa6wDnsvgEqB2yrm8mzuOv3GG/rVdL bpeaLsBHjX1ClEZyNhK6H6XVItBMa/IJlOBU5UOQYnwY0y4FUIhUPvRuGPW3oVIlVl4u pI5hpLi06tDg+199cxaYAVlT/gkBIJMA99yRzRA0HUKGufCM/bRO88yhDE9fksy7WVzY iVZ0mmSewluBqhVI6GRcLnEb27UAls8OgFlZrvY8803BICzdqopvloQTslT27xO4bISw ImQg== 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:dkim-signature:arc-authentication-results; bh=Qio/bQZyzsy0dWyK13v5V3XKXEq5nV8zuubYKE7kLO8=; b=0G/DQyoRFeCDHwLbi/6t7fp55tgvNOjMjck4SHSHfITK3Toub2ctESVNRpanUFToZR 7dePipkW1a+14ZE7+88oPjkm8cP8iBN8O2YLJHpq0iErP9SsusQy0hncQSMrP33Vg/Jx tsuNXGaKepdAcZ7iORjRp/r3z9HP1WRUbQaVaF+DVwx5N3HT3a/Ffc9O3/tfP/pt0Vaz 4kI5k0phlrYoHnbllZUNVVy2zONfZZkDf7ndlJGl0mqMQZRlpY96MGTn3U6zm2RIE9nI 3cabkrJw3FuvhzrkYq/i0jOvcYAPliZqcSQrGEURqTWycTf1cbfSGsGcx3URbqMZjedv zsHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=UE2UxAEL; spf=pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u74si7913123pgc.445.2018.01.19.02.37.30; Fri, 19 Jan 2018 02:37:30 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=UE2UxAEL; spf=pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754805AbeASKh3 (ORCPT + 1 other); Fri, 19 Jan 2018 05:37:29 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:43603 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753808AbeASKhZ (ORCPT ); Fri, 19 Jan 2018 05:37:25 -0500 Received: by mail-pf0-f194.google.com with SMTP id y26so1046766pfi.10; Fri, 19 Jan 2018 02:37:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=p+RMSNkWoI5IIMNRs36ReQ7zqMtRSLHMz5ihhk1LvJE=; b=UE2UxAELZSM7eUZ+qDSmCmJlcKbVcnc/l5jeqAsnF95WZxzatb5OyeezeNGCUjuGrB UHQKrVwb1ETOi6UODCtClMH2k3+dl2fI1W9RTJ9b950nFtA6hr1qagZt8SHxYyAusT00 RnHEutUc/AxFmFTzZxSb0LKIiFKOZ6U0k37RakgpUSjGEeaVJKWpvmE89KQeXGZM3kUr 3389JNarvK2XKGzFNwZP5QQv9Wk8jy5s3Um65otPRIx3/9CnWokMUVHEw7fi+fzN3LOa dFpqYrw0jbAmkPVHKy8L7i2qyHcz5ZbLea5ejTodGHTVRequWgJXecwFA56zwZ2EzCaw uOYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=p+RMSNkWoI5IIMNRs36ReQ7zqMtRSLHMz5ihhk1LvJE=; b=ht6nMB3fvaGCSm2e2dEGh9bBJsq/1LahcKDzZxhbUMFuNRcIKepwAL9qJ4+iQilLRF gCski16lx7YOrlNlOi3RjO2+78lj1hRtZmy9lK77OfVtpTe/h7WJjcR072ef2e2bP7gF rDtpAVpts4j2g/vA2mbsPTYVhUJD2+zHYF9xPQZmv9VKYWwZHHOmSBUxgYwG/2Xlkbsa vsZKFyJb8MADtY8BqFrE6Nss/Ke5YpYKlLdJ8RfxoWDLS+8X9ikevAt58gbY8+XXw4Qw BItmRHl/RpUnog0ZiegTHKKiwXb2Msn14FDErQTquWgulsdh8SM7ooXa0VTWFK4HhnON Ndvg== X-Gm-Message-State: AKGB3mKMF+Ei9i6FgnOr39n+hsVyE+lExuClXdaj5e5WjLsSDXSWTZ2R lgA9K+coOhQDFz0DVVRoY9wXBFU9 X-Received: by 10.98.204.144 with SMTP id j16mr42044266pfk.101.1516358244272; Fri, 19 Jan 2018 02:37:24 -0800 (PST) Received: from localhost.localdomain ([27.255.219.42]) by smtp.gmail.com with ESMTPSA id 186sm15821270pgi.34.2018.01.19.02.37.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 19 Jan 2018 02:37:23 -0800 (PST) From: jassisinghbrar@gmail.com To: linux-spi@vger.kernel.org, devicetree@vger.kernel.org Cc: tpiepho@impinj.com, broonie@kernel.org, ard.biesheuvel@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, masami.hiramatsu@linaro.org, Jassi Brar Subject: [PATCHv3 1/3] dt-bindings: spi: Add DT bindings for Synquacer Date: Fri, 19 Jan 2018 16:07:16 +0530 Message-Id: <1516358236-4472-1-git-send-email-jassisinghbrar@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516358213-4400-1-git-send-email-jassisinghbrar@gmail.com> References: <1516358213-4400-1-git-send-email-jassisinghbrar@gmail.com> Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org From: Jassi Brar This patch adds documentation for Device-Tree bindings for the Socionext Synquacer spi driver. Signed-off-by: Jassi Brar --- .../devicetree/bindings/spi/spi-synquacer.txt | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Documentation/devicetree/bindings/spi/spi-synquacer.txt -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Reviewed-by: Rob Herring diff --git a/Documentation/devicetree/bindings/spi/spi-synquacer.txt b/Documentation/devicetree/bindings/spi/spi-synquacer.txt new file mode 100644 index 0000000..d945a4a --- /dev/null +++ b/Documentation/devicetree/bindings/spi/spi-synquacer.txt @@ -0,0 +1,23 @@ +* Socionext Synquacer HS-SPI bindings + +Required Properties: +- compatible: should be "socionext,synquacer-spi" +- reg: physical base address of the controller and length of memory mapped + region. +- clocks: core clock iHCLK. Optional rate clock iPCLK (default is iHCLK) +- clock-names: Shall be "iHCLK" and "iPCLK" respectively + +Optional Properties: +- socionext,use-rtm: boolean, if required to use "retimed clock" for RX +- socionext,set-aces: boolean, if same active clock edges field to be set. + +Example: + + spi0: spi@ff110000 { + compatible = "socionext,synquacer-spi"; + reg = <0xff110000 0x1000>; + clocks = <&clk_fip006_spi>; + clock-names = "iHCLK"; + socionext,use-rtm; + socionext,set-aces; + }; From patchwork Fri Jan 19 10:37:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jassi Brar X-Patchwork-Id: 125143 Delivered-To: patch@linaro.org Received: by 10.46.66.141 with SMTP id h13csp229084ljf; Fri, 19 Jan 2018 02:37:43 -0800 (PST) X-Google-Smtp-Source: ACJfBoue1BZWwsy3gv7s7Ard4m2KGbW/kJe/1cGoJOK0qr5euIRY4U1HwkEgfRoMH+opR97QMPh+ X-Received: by 10.99.98.66 with SMTP id w63mr25520594pgb.10.1516358262893; Fri, 19 Jan 2018 02:37:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516358262; cv=none; d=google.com; s=arc-20160816; b=geF0+PDR/NoPEQw+KVDa47bR6cdIqKiZDEX0Tr0MgaKiu00W5Jb3jrZwTez+vUDlhI LErAy+vlicC394iVUQatY1C7cKwlTljLAZ1RJZrEmibbV1hRyTZQfploP6gDqG/cnx71 +6leptgS/fwB3kypLeROcByUUvLrgP8ZhvzmR8XEe8UMhfHe4mgYtHbsyYr6czVIOPn1 3aM1jeMjXab1TtWq5jn1geyBGh0XtPa3KkEunx1YoMopaXCJ38qtw8YK9geTaZrCdP9j L9z+YyOEhtp+jseWiU/NP1GQjejAYGos/bqvbKA4wOVSv0CzE2xCuZeUrbL39DipkSN4 qUhw== 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:dkim-signature:arc-authentication-results; bh=6sXxONpxfaCMhqbRO+84UkwhibhG6KOrH+ewaXxZK90=; b=gBQm8WyNcuKXsJhDjIFKAJT96NYmk771PBa/sK79T1zTq9g5Q6ZA0HFhGuV39DrtzG APNGkCucJZtcQWxqYzTIj2v6w125TwikHRImNml7bXTEHdvpRiXtL1vuumzYDTVkn7FQ uDSsRlogyHgR4Alu8bydce1YqDIr9KNsUPSCpG3vXLXA2D7CF+q0PdNH0s18EBhFI3zd iMO790FDIAx5EXoPKug+Q0W94GJIKtqQKJDQhVyh5jxJLD+nu+EKuMMluJyYFhHCm/AC VNJQsuZY0AbWNXn5qAIB6U+JnElnspmrJc4+no2urJ5vOh+c7+GFv/uoEj1kEtgaV2nC Rx7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Woj1kDvW; spf=pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k133si8002960pgc.672.2018.01.19.02.37.42; Fri, 19 Jan 2018 02:37:42 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Woj1kDvW; spf=pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754534AbeASKhm (ORCPT + 1 other); Fri, 19 Jan 2018 05:37:42 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:39267 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750841AbeASKhk (ORCPT ); Fri, 19 Jan 2018 05:37:40 -0500 Received: by mail-pg0-f68.google.com with SMTP id w17so1107494pgv.6; Fri, 19 Jan 2018 02:37:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sHzUlBFGNKqh9PezF2V5Qkak/IGsShvbpe9w38advyU=; b=Woj1kDvW4O1mF88fe4z530CKBdoZyUUQYEZK2+aRIVeqrCmNF0izIyExSH2AasysUq 09mfs+ZUQ/Tq45wAwf6iDyp6jaNuqhJhGgAvNgISkIW+h0lkLYUur+89vFWasvwbOcBF n27U8X4Hbdg+NOeWT4h0/PJKtLpvaO4zNvoh84aFJXBw5Ck2FZACFnYevMYEkBsuEncl BhCNrgJO4rH+mBb4i0W0+mWa+KoMh0iuWPC6Jj7SSVKXAhDCKCM0XzFgc/7blLGJGShk lHZ7Lv4XOfbqltQR1vn7pyILXJuVhxY++owrIGXvhtP6S3hhJs+rZ+RoVfOoC2yuMmvQ vtDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sHzUlBFGNKqh9PezF2V5Qkak/IGsShvbpe9w38advyU=; b=LBiVqRSHQq5uzWHNLQpTAMgXUaVD0a2sc7d719oiqk4/7PPLa1A6ioQKKySiw7i8yH 4e+pTGUsq4Na/ViNvtzBReeCG2wrn1Rkzw05aro2bXAiXrL19DW60BHX5t/fpEyxOY40 d56xArFmNhPLskZMIrowZWMm4H7SbTKD+AVlnG5TUJiOKDwcT3tBCp5YhjRjeCLWJ9f8 xnfYY/Mr3FHpxcxqFIGcy1LWCxVa0Ibplkp3VJmY4Q9KmIVlZxcT3JrZnMn228XptrS2 J+84Yud6IlfzEqW/YpRnSQ8Yh8moHuAX3wqfnOFCefQrkIc/VPG+OubtOnSNoRo+KOlS mepg== X-Gm-Message-State: AKwxytc974gYUQnJgnAMPlFtjpLR3rqTmQeo3xiGvYiI5zhYjxrp4CNJ bKhDmoGUIdNX4Go6KYPlxAzycgNI X-Received: by 10.98.71.197 with SMTP id p66mr31454066pfi.3.1516358259021; Fri, 19 Jan 2018 02:37:39 -0800 (PST) Received: from localhost.localdomain ([27.255.219.42]) by smtp.gmail.com with ESMTPSA id y14sm15523908pfl.77.2018.01.19.02.37.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 19 Jan 2018 02:37:38 -0800 (PST) From: jassisinghbrar@gmail.com To: linux-spi@vger.kernel.org, devicetree@vger.kernel.org Cc: tpiepho@impinj.com, broonie@kernel.org, ard.biesheuvel@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, masami.hiramatsu@linaro.org, Jassi Brar Subject: [PATCHv3 2/3] spi: Add spi driver for Socionext Synquacer platform Date: Fri, 19 Jan 2018 16:07:31 +0530 Message-Id: <1516358251-4523-1-git-send-email-jassisinghbrar@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516358213-4400-1-git-send-email-jassisinghbrar@gmail.com> References: <1516358213-4400-1-git-send-email-jassisinghbrar@gmail.com> Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org From: Jassi Brar This patch adds support for controller found on synquacer platforms. Signed-off-by: Jassi Brar --- drivers/spi/Kconfig | 11 + drivers/spi/Makefile | 1 + drivers/spi/spi-synquacer.c | 661 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 673 insertions(+) create mode 100644 drivers/spi/spi-synquacer.c -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index 6037839..9e04bbe 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig @@ -659,6 +659,17 @@ config SPI_SUN6I help This enables using the SPI controller on the Allwinner A31 SoCs. +config SPI_SYNQUACER + tristate "Socionext's Synquacer HighSpeed SPI controller" + depends on ARCH_SYNQUACER || COMPILE_TEST + select SPI_BITBANG + help + SPI driver for Socionext's High speed SPI controller which provides + various operating modes for interfacing to serial peripheral devices + that use the de-facto standard SPI protocol. + + It also supports the new dual-bit and quad-bit SPI protocol. + config SPI_MXS tristate "Freescale MXS SPI controller" depends on ARCH_MXS diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile index 34c5f28..7c222f2 100644 --- a/drivers/spi/Makefile +++ b/drivers/spi/Makefile @@ -96,6 +96,7 @@ obj-$(CONFIG_SPI_STM32) += spi-stm32.o obj-$(CONFIG_SPI_ST_SSC4) += spi-st-ssc4.o obj-$(CONFIG_SPI_SUN4I) += spi-sun4i.o obj-$(CONFIG_SPI_SUN6I) += spi-sun6i.o +obj-$(CONFIG_SPI_SYNQUACER) += spi-synquacer.o obj-$(CONFIG_SPI_TEGRA114) += spi-tegra114.o obj-$(CONFIG_SPI_TEGRA20_SFLASH) += spi-tegra20-sflash.o obj-$(CONFIG_SPI_TEGRA20_SLINK) += spi-tegra20-slink.o diff --git a/drivers/spi/spi-synquacer.c b/drivers/spi/spi-synquacer.c new file mode 100644 index 0000000..15568b1 --- /dev/null +++ b/drivers/spi/spi-synquacer.c @@ -0,0 +1,661 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Synquacer HSSPI controller driver +// +// Copyright (c) 2015-2018 Socionext Inc. +// Copyright (c) 2018 Linaro Ltd. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MCTRL 0x0 +#define MEN BIT(0) +#define CSEN BIT(1) +#define BPCLK BIT(3) +#define MES BIT(4) +#define SYNCON BIT(5) + +#define PCC0 0x4 +#define PCC(n) (PCC0 + (n) * 4) +#define RTM BIT(3) +#define ACES BIT(2) +#define SAFESYNC BIT(16) +#define CPHA BIT(0) +#define CPOL BIT(1) +#define SSPOL BIT(4) +#define SDIR BIT(7) +#define SS2CD 5 +#define SENDIAN BIT(8) +#define CDRS_SHIFT 9 +#define CDRS_MASK 0x7f + +#define TXF 0x14 +#define TXE 0x18 +#define TXC 0x1c +#define RXF 0x20 +#define RXE 0x24 +#define RXC 0x28 + +#define FAULTF 0x2c +#define FAULTC 0x30 + +#define DMCFG 0x34 +#define SSDC BIT(1) +#define MSTARTEN BIT(2) + +#define DMSTART 0x38 +#define TRIGGER BIT(0) +#define DMSTOP BIT(8) +#define CS_MASK 3 +#define CS_SHIFT 16 +#define DATA_TXRX 0 +#define DATA_RX 1 +#define DATA_TX 2 +#define DATA_MASK 3 +#define DATA_SHIFT 26 +#define BUS_WIDTH 24 + +#define DMBCC 0x3c +#define DMSTATUS 0x40 +#define RX_DATA_MASK 0x1f +#define RX_DATA_SHIFT 8 +#define TX_DATA_MASK 0x1f +#define TX_DATA_SHIFT 16 + +#define TXBITCNT 0x44 + +#define FIFOCFG 0x4c +#define BPW_MASK 0x3 +#define BPW_SHIFT 8 +#define RX_FLUSH BIT(11) +#define TX_FLUSH BIT(12) +#define RX_TRSHLD_MASK 0xf +#define RX_TRSHLD_SHIFT 0 +#define TX_TRSHLD_MASK 0xf +#define TX_TRSHLD_SHIFT 4 + +#define TXFIFO 0x50 +#define RXFIFO 0x90 +#define MID 0xfc + +#define FIFO_DEPTH 16 +#define TX_TRSHLD 4 +#define RX_TRSHLD (FIFO_DEPTH - TX_TRSHLD) + +#define TXBIT BIT(1) +#define RXBIT BIT(2) + +#define IHCLK 0 +#define IPCLK 1 + +struct synquacer_spi { + struct device *dev; + struct spi_master *master; + + unsigned int cs; + unsigned int bpw; + unsigned int mode; + unsigned int speed; + bool aces, rtm; + void *rx_buf; + const void *tx_buf; + struct clk *clk[2]; + void __iomem *regs; + unsigned int tx_words, rx_words; + unsigned int bus_width; +}; + +static void read_fifo(struct synquacer_spi *sspi) +{ + u32 len = readl_relaxed(sspi->regs + DMSTATUS); + int i; + + len = (len >> RX_DATA_SHIFT) & RX_DATA_MASK; + len = min_t(unsigned int, len, sspi->rx_words); + + switch (sspi->bpw) { + case 8: + { + u8 *buf = sspi->rx_buf; + + for (i = 0; i < len; i++) + *buf++ = readb_relaxed(sspi->regs + RXFIFO); + sspi->rx_buf = buf; + break; + } + case 16: + { + u16 *buf = sspi->rx_buf; + + for (i = 0; i < len; i++) + *buf++ = readw_relaxed(sspi->regs + RXFIFO); + sspi->rx_buf = buf; + break; + } + default: + { + u32 *buf = sspi->rx_buf; + + for (i = 0; i < len; i++) + *buf++ = readl_relaxed(sspi->regs + RXFIFO); + sspi->rx_buf = buf; + break; + } + } + + sspi->rx_words -= len; +} + +static void write_fifo(struct synquacer_spi *sspi) +{ + u32 len = readl_relaxed(sspi->regs + DMSTATUS); + int i; + + len = (len >> TX_DATA_SHIFT) & TX_DATA_MASK; + len = min_t(unsigned int, FIFO_DEPTH - len, sspi->tx_words); + + switch (sspi->bpw) { + case 8: + { + const u8 *buf = sspi->tx_buf; + + for (i = 0; i < len; i++) + writeb_relaxed(*buf++, sspi->regs + TXFIFO); + sspi->tx_buf = buf; + break; + } + case 16: + { + const u16 *buf = sspi->tx_buf; + + for (i = 0; i < len; i++) + writew_relaxed(*buf++, sspi->regs + TXFIFO); + sspi->tx_buf = buf; + break; + } + default: + { + const u32 *buf = sspi->tx_buf; + + for (i = 0; i < len; i++) + writel_relaxed(*buf++, sspi->regs + TXFIFO); + sspi->tx_buf = buf; + break; + } + } + sspi->tx_words -= len; +} + +static int synquacer_spi_config(struct spi_master *master, + struct spi_device *spi, + struct spi_transfer *xfer) +{ + struct synquacer_spi *sspi = spi_master_get_devdata(master); + unsigned int speed, mode, bpw, cs, bus_width; + unsigned long rate; + u32 val, div; + + /* Full Duplex only on 1bit wide bus */ + if (xfer->rx_buf && xfer->tx_buf && + (xfer->rx_nbits != 1 || xfer->tx_nbits != 1)) { + dev_err(sspi->dev, + "RX and TX bus widths must match for Full-Duplex!\n"); + return -EINVAL; + } + + if (xfer->tx_buf) + bus_width = xfer->tx_nbits; + else + bus_width = xfer->rx_nbits; + + mode = spi->mode; + cs = spi->chip_select; + speed = xfer->speed_hz; + bpw = xfer->bits_per_word; + + /* return if nothing to change */ + if (speed == sspi->speed && + bus_width == sspi->bus_width && bpw == sspi->bpw && + mode == sspi->mode && cs == sspi->cs) { + return 0; + } + + rate = master->max_speed_hz; + + div = DIV_ROUND_UP(rate, speed); + if (div > 254) { + dev_err(sspi->dev, "Requested rate too low (%u)\n", + sspi->speed); + return -EINVAL; + } + + val = readl_relaxed(sspi->regs + PCC(cs)); + val &= ~SAFESYNC; + if (bpw == 8 && (mode & (SPI_TX_DUAL | SPI_RX_DUAL)) && div < 3) + val |= SAFESYNC; + if (bpw == 8 && (mode & (SPI_TX_QUAD | SPI_RX_QUAD)) && div < 6) + val |= SAFESYNC; + if (bpw == 16 && (mode & (SPI_TX_QUAD | SPI_RX_QUAD)) && div < 3) + val |= SAFESYNC; + + if (mode & SPI_CPHA) + val |= CPHA; + else + val &= ~CPHA; + + if (mode & SPI_CPOL) + val |= CPOL; + else + val &= ~CPOL; + + if (mode & SPI_CS_HIGH) + val |= SSPOL; + else + val &= ~SSPOL; + + if (mode & SPI_LSB_FIRST) + val |= SDIR; + else + val &= ~SDIR; + + if (sspi->aces) + val |= ACES; + else + val &= ~ACES; + + if (sspi->rtm) + val |= RTM; + else + val &= ~RTM; + + val |= (3 << SS2CD); + val |= SENDIAN; + + val &= ~(CDRS_MASK << CDRS_SHIFT); + val |= ((div >> 1) << CDRS_SHIFT); + + writel_relaxed(val, sspi->regs + PCC(cs)); + + val = readl_relaxed(sspi->regs + FIFOCFG); + val &= ~(BPW_MASK << BPW_SHIFT); + val |= ((bpw / 8 - 1) << BPW_SHIFT); + writel_relaxed(val, sspi->regs + FIFOCFG); + + val = readl_relaxed(sspi->regs + DMSTART); + val &= ~(DATA_MASK << DATA_SHIFT); + + if (xfer->tx_buf && xfer->rx_buf) + val |= (DATA_TXRX << DATA_SHIFT); + else if (xfer->rx_buf) + val |= (DATA_RX << DATA_SHIFT); + else + val |= (DATA_TX << DATA_SHIFT); + + val &= ~(3 << BUS_WIDTH); + val |= ((bus_width >> 1) << BUS_WIDTH); + writel_relaxed(val, sspi->regs + DMSTART); + + sspi->bpw = bpw; + sspi->mode = mode; + sspi->speed = speed; + sspi->cs = spi->chip_select; + sspi->bus_width = bus_width; + + return 0; +} + +static int synquacer_spi_transfer_one(struct spi_master *master, + struct spi_device *spi, + struct spi_transfer *xfer) +{ + struct synquacer_spi *sspi = spi_master_get_devdata(master); + int ret, words, busy = 0; + unsigned long bpw; + u32 val; + + val = readl_relaxed(sspi->regs + FIFOCFG); + val |= RX_FLUSH; + val |= TX_FLUSH; + writel_relaxed(val, sspi->regs + FIFOCFG); + + /* See if we can transfer 4-bytes as 1 word even if not asked */ + bpw = xfer->bits_per_word; + if (bpw == 8 && !(xfer->len % 4) && !(spi->mode & SPI_LSB_FIRST)) + xfer->bits_per_word = 32; + + ret = synquacer_spi_config(master, spi, xfer); + + /* restore */ + xfer->bits_per_word = bpw; + + if (ret) + return ret; + + sspi->tx_buf = xfer->tx_buf; + sspi->rx_buf = xfer->rx_buf; + + switch (sspi->bpw) { + case 8: + words = xfer->len; + break; + case 16: + words = xfer->len / 2; + break; + default: + words = xfer->len / 4; + break; + } + + if (xfer->tx_buf) { + busy |= TXBIT; + sspi->tx_words = words; + } else { + sspi->tx_words = 0; + } + + if (xfer->rx_buf) { + busy |= RXBIT; + sspi->rx_words = words; + } else { + sspi->rx_words = 0; + } + + if (xfer->tx_buf) + write_fifo(sspi); + + if (xfer->rx_buf) { + val = readl_relaxed(sspi->regs + FIFOCFG); + val &= ~(RX_TRSHLD_MASK << RX_TRSHLD_SHIFT); + val |= ((sspi->rx_words > FIFO_DEPTH ? + RX_TRSHLD : sspi->rx_words) << RX_TRSHLD_SHIFT); + writel_relaxed(val, sspi->regs + FIFOCFG); + } + + writel_relaxed(~0, sspi->regs + TXC); + writel_relaxed(~0, sspi->regs + RXC); + + /* Trigger */ + val = readl_relaxed(sspi->regs + DMSTART); + val |= TRIGGER; + writel_relaxed(val, sspi->regs + DMSTART); + + while (busy & (RXBIT | TXBIT)) { + if (sspi->rx_words) + read_fifo(sspi); + else + busy &= ~RXBIT; + + if (sspi->tx_words) { + write_fifo(sspi); + } else { + u32 len; + + do { /* wait for shifter to empty out */ + cpu_relax(); + len = readl_relaxed(sspi->regs + DMSTATUS); + len = (len >> TX_DATA_SHIFT) & TX_DATA_MASK; + } while (xfer->tx_buf && len); + busy &= ~TXBIT; + } + } + + return 0; +} + +static void synquacer_spi_set_cs(struct spi_device *spi, bool enable) +{ + struct synquacer_spi *sspi = spi_master_get_devdata(spi->master); + u32 val; + + val = readl_relaxed(sspi->regs + DMSTART); + val &= ~(CS_MASK << CS_SHIFT); + val |= spi->chip_select << CS_SHIFT; + + if (!enable) { + writel_relaxed(val, sspi->regs + DMSTART); + + val = readl_relaxed(sspi->regs + DMSTART); + val &= ~DMSTOP; + writel_relaxed(val, sspi->regs + DMSTART); + } else { + val |= DMSTOP; + writel_relaxed(val, sspi->regs + DMSTART); + + if (sspi->rx_buf) { + u32 buf[16]; + + sspi->rx_buf = buf; + sspi->rx_words = 16; + read_fifo(sspi); + } + } +} + +static int synquacer_spi_enable(struct spi_master *master) +{ + struct synquacer_spi *sspi = spi_master_get_devdata(master); + u32 val; + + /* Disable module */ + writel_relaxed(0, sspi->regs + MCTRL); + val = 0xfffff; + while (--val && (readl_relaxed(sspi->regs + MCTRL) & MES)) + cpu_relax(); + if (!val) + return -EBUSY; + + writel_relaxed(0, sspi->regs + TXE); + writel_relaxed(0, sspi->regs + RXE); + val = readl_relaxed(sspi->regs + TXF); + writel_relaxed(val, sspi->regs + TXC); + val = readl_relaxed(sspi->regs + RXF); + writel_relaxed(val, sspi->regs + RXC); + val = readl_relaxed(sspi->regs + FAULTF); + writel_relaxed(val, sspi->regs + FAULTC); + + val = readl_relaxed(sspi->regs + DMCFG); + val &= ~SSDC; + val &= ~MSTARTEN; + writel_relaxed(val, sspi->regs + DMCFG); + + val = readl_relaxed(sspi->regs + MCTRL); + if (IS_ERR(sspi->clk[IPCLK])) + val &= ~BPCLK; + else + val |= BPCLK; + + val &= ~CSEN; + val |= MEN; + val |= SYNCON; + writel_relaxed(val, sspi->regs + MCTRL); + + return 0; +} + +static int synquacer_spi_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node; + struct spi_master *master; + struct synquacer_spi *sspi; + struct resource *res; + int ret; + + master = spi_alloc_master(&pdev->dev, sizeof(*sspi)); + if (!master) + return -ENOMEM; + platform_set_drvdata(pdev, master); + + sspi = spi_master_get_devdata(master); + sspi->dev = &pdev->dev; + sspi->master = master; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + sspi->regs = devm_ioremap_resource(sspi->dev, res); + if (IS_ERR(sspi->regs)) { + ret = PTR_ERR(sspi->regs); + goto put_spi; + } + + sspi->clk[IHCLK] = devm_clk_get(sspi->dev, "iHCLK"); + if (IS_ERR(sspi->clk[IHCLK])) { + dev_err(&pdev->dev, "iHCLK not found\n"); + ret = PTR_ERR(sspi->clk[IHCLK]); + goto put_spi; + } + + sspi->clk[IPCLK] = devm_clk_get(sspi->dev, "iPCLK"); + + sspi->aces = of_property_read_bool(np, "socionext,set-aces"); + sspi->rtm = of_property_read_bool(np, "socionext,use-rtm"); + + master->num_chipselect = 4; /* max 4 supported */ + + clk_prepare_enable(sspi->clk[IPCLK]); + ret = clk_prepare_enable(sspi->clk[IHCLK]); + if (ret) + goto put_spi; + + master->dev.of_node = np; + master->auto_runtime_pm = true; + master->bus_num = pdev->id; + + master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_TX_DUAL | SPI_RX_DUAL | + SPI_TX_QUAD | SPI_RX_QUAD; + master->bits_per_word_mask = SPI_BPW_MASK(32) | SPI_BPW_MASK(24) + | SPI_BPW_MASK(16) | SPI_BPW_MASK(8); + + if (!IS_ERR(sspi->clk[IPCLK])) + master->max_speed_hz = clk_get_rate(sspi->clk[IPCLK]); + else + master->max_speed_hz = clk_get_rate(sspi->clk[IHCLK]); + master->min_speed_hz = master->max_speed_hz / 254; + + master->set_cs = synquacer_spi_set_cs; + master->transfer_one = synquacer_spi_transfer_one; + + ret = synquacer_spi_enable(master); + if (ret) + goto fail_enable; + + pm_runtime_set_active(sspi->dev); + pm_runtime_enable(sspi->dev); + + ret = devm_spi_register_master(sspi->dev, master); + if (ret) + goto disable_pm; + + return 0; + +disable_pm: + pm_runtime_disable(sspi->dev); +fail_enable: + clk_disable_unprepare(sspi->clk[IHCLK]); + clk_disable_unprepare(sspi->clk[IPCLK]); +put_spi: + spi_master_put(master); + + return ret; +} + +static int synquacer_spi_remove(struct platform_device *pdev) +{ + struct spi_master *master = platform_get_drvdata(pdev); + struct synquacer_spi *sspi = spi_master_get_devdata(master); + + pm_runtime_disable(sspi->dev); + clk_disable_unprepare(sspi->clk[IHCLK]); + clk_disable_unprepare(sspi->clk[IPCLK]); + spi_master_put(master); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int synquacer_spi_suspend(struct device *dev) +{ + struct spi_master *master = dev_get_drvdata(dev); + struct synquacer_spi *sspi = spi_master_get_devdata(master); + int ret; + + ret = spi_master_suspend(master); + if (ret) + return ret; + + if (!pm_runtime_suspended(dev)) { + clk_disable_unprepare(sspi->clk[IPCLK]); + clk_disable_unprepare(sspi->clk[IHCLK]); + } + + return ret; +} + +static int synquacer_spi_resume(struct device *dev) +{ + struct spi_master *master = dev_get_drvdata(dev); + struct synquacer_spi *sspi = spi_master_get_devdata(master); + int ret; + + if (!pm_runtime_suspended(dev)) { + /* Ensure reconfigure during next xfer */ + sspi->speed = 0; + + clk_prepare_enable(sspi->clk[IPCLK]); + ret = clk_prepare_enable(sspi->clk[IHCLK]); + if (ret < 0) { + dev_err(dev, "failed to enable clk (%d)\n", ret); + return ret; + } + + ret = synquacer_spi_enable(master); + if (ret) { + dev_err(dev, "failed to enable spi (%d)\n", ret); + return ret; + } + } + + ret = spi_master_resume(master); + if (ret < 0) { + clk_disable_unprepare(sspi->clk[IHCLK]); + clk_disable_unprepare(sspi->clk[IPCLK]); + } + + return ret; +} +#endif /* CONFIG_PM_SLEEP */ + +static const struct dev_pm_ops synquacer_spi_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(synquacer_spi_suspend, synquacer_spi_resume) +}; + +static const struct of_device_id synquacer_spi_of_match[] = { + {.compatible = "socionext,synquacer-spi",}, + {}, +}; +MODULE_DEVICE_TABLE(of, synquacer_spi_of_match); + +static struct platform_driver synquacer_spi_driver = { + .driver = { + .name = "synquacer-spi", + .pm = &synquacer_spi_pm_ops, + .of_match_table = of_match_ptr(synquacer_spi_of_match), + }, + .probe = synquacer_spi_probe, + .remove = synquacer_spi_remove, +}; +module_platform_driver(synquacer_spi_driver); + +MODULE_DESCRIPTION("Socionext Synquacer HS-SPI controller driver"); +MODULE_AUTHOR("Jassi Brar "); +MODULE_LICENSE("GPL v2"); From patchwork Fri Jan 19 10:37:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jassi Brar X-Patchwork-Id: 125144 Delivered-To: patch@linaro.org Received: by 10.46.66.141 with SMTP id h13csp229188ljf; Fri, 19 Jan 2018 02:37:56 -0800 (PST) X-Google-Smtp-Source: ACJfBouwomviSvBrcZlrO7eY1s6l5p7+DNk+tQR9yoSen2wFksmyDHUmToBTpl/tK63LO0qhCvBy X-Received: by 10.99.94.193 with SMTP id s184mr39146514pgb.397.1516358275992; Fri, 19 Jan 2018 02:37:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516358275; cv=none; d=google.com; s=arc-20160816; b=tqELjL/XuuJth22XnLzANK7OVeHWIDfYMrqLA3lIlIupNxPxtCPKFmm31HeJTquzVp db7j4SAL6DbO/8+1OAtYlqXGDQXXSnr0sN0aJp8ikdsSLr/+S9mwvzIJ0T8ScxYs0/Ci ffP/hDah0F4wOX0FhjR+Xg8BxIpNcAPIxWPXa6XjOlXbPfih9Hh8fyAJLpdrShymIow8 Ycki/tX4nCqJtoYmk2mR9aZkp+pjR5q0duI09n66ZmT7CSrAYU9rt4q9UwPSbHkpLucc x7DufQFLJA+USiTHb4RIi/CbdtQB0z4pISFRoK86mGtWk9aronJUeFgXe644K6KzE+Kw X8rw== 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:dkim-signature:arc-authentication-results; bh=P8tACSdi/2t69YpBJDyy5OAL9jZy2bAsh+jySmF7s8c=; b=TEsOrNEmFRuMcUlbkn0rMGXjKBg5FyV9ec1X5TXUPnPynvcAU2+XrI1feN4rNYEag6 CRIcczPZPUQWsaQspCqjckN6KWVlIrl5SqCunh/7UjHJBrCJIHX71cW/1TDPtne2iPnh I/cBqgvj4BGQU8Y7Ju4D9WgHvyM8AjsVZc6OMKWue782Oc76r4DJHc7JA2KWDqY5fGzA hhzQ3e4nUhWapxj0kua3TuBokIj81V9A3gyJvAsE3mJaCRR/PzeI3mPmT65W93ALAVY4 +PsZ4oBZcgYxaUHwr0wwFE+7dEqM126bF8SbWcH8LC+gWEUUIEuxKFm7LpEJHX/+CvoK 2Acg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=kTmxsVBs; spf=pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k133si8002960pgc.672.2018.01.19.02.37.55; Fri, 19 Jan 2018 02:37:55 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=kTmxsVBs; spf=pass (google.com: best guess record for domain of linux-spi-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-spi-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753390AbeASKhz (ORCPT + 1 other); Fri, 19 Jan 2018 05:37:55 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:45136 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750841AbeASKhy (ORCPT ); Fri, 19 Jan 2018 05:37:54 -0500 Received: by mail-pg0-f66.google.com with SMTP id c194so1098344pga.12; Fri, 19 Jan 2018 02:37:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VO4BY9Zss6fPTQbKhwCvxah03NShWoip1ww0Oc87rTg=; b=kTmxsVBs+ye2SC/g0EG6akSq8qf+PqURMC9MFmpux8PN1iw3OQt9CIOioI4Qul1I50 ci8Fq3iAKBVMNeNNL68DpcVYz7lvzp+ZVegjjJpUc7qeOb4am1fvZUgkAnYzp9kAesk7 B6OUNDUQiiRrUkwqoNA/q94yKnizAgyil5gsfV4PEBYFZ2IK4a81GxknrCGATc74697A 14BNcLDztolD6wOPlQ5nLADccWNNTaFckGenP+GWCbNz922pdF21c81G1V3ur0vVSrZP ioaXsRXwULRjdxvM0p387RO/JUZGtvOSCjNM0m1MTxoKTPa3/YditJkCcW3C3FaumyCj 0sjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VO4BY9Zss6fPTQbKhwCvxah03NShWoip1ww0Oc87rTg=; b=ZEmPdyWUuOlCFFLT03C2RusQT0UEBqI7/37YbmO98otk9fCWD9Zg63Pn1wzfBwFmjU MrT84ssUCsZcG7lojeZCTs8YuW6Pu4kUn+2w+66MuhT8Ul3zo8MtOgEyIuwbeSEXiblI kGfAFDdf9lX1zO5BPbiwdoQ2NSUZOyz14vF/46z+hCYaUTNufygV1neOnsfTRGdD5aB/ 8EYxNtF6ING1NyUJz3wZg/eyRzAKo/pfB0ugxYld/o2bpSOOvT1zo/Stkjk/z5Yv91iB kIYYrxAAc/CNO7q52gOrei38QRvUGMSuWTuBgkh99ZKYylXy+IP1e1DWd9pr7uB+KrJD 1+tw== X-Gm-Message-State: AKwxytcOAh6supsxCpsy5WZOqVOGOtbkPYakim7PKzLhs+SoOlyTmadR V3bQeKJpPOn/oJ6NQYkBsUeR9MW1 X-Received: by 10.98.197.3 with SMTP id j3mr27717709pfg.93.1516358273288; Fri, 19 Jan 2018 02:37:53 -0800 (PST) Received: from localhost.localdomain ([27.255.219.42]) by smtp.gmail.com with ESMTPSA id m21sm15232229pgn.37.2018.01.19.02.37.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 19 Jan 2018 02:37:52 -0800 (PST) From: jassisinghbrar@gmail.com To: linux-spi@vger.kernel.org, devicetree@vger.kernel.org Cc: tpiepho@impinj.com, broonie@kernel.org, ard.biesheuvel@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, masami.hiramatsu@linaro.org, Jassi Brar Subject: [PATCHv3 3/3] MAINTAINERS: Add entry for Synquacer SPI driver Date: Fri, 19 Jan 2018 16:07:45 +0530 Message-Id: <1516358265-4578-1-git-send-email-jassisinghbrar@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516358213-4400-1-git-send-email-jassisinghbrar@gmail.com> References: <1516358213-4400-1-git-send-email-jassisinghbrar@gmail.com> Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org From: Jassi Brar Add entry for the Synquacer spi driver and DT bindings. Signed-off-by: Jassi Brar --- MAINTAINERS | 7 +++++++ 1 file changed, 7 insertions(+) -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/MAINTAINERS b/MAINTAINERS index 1899480..da79a2a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -12627,6 +12627,13 @@ F: drivers/md/raid* F: include/linux/raid/ F: include/uapi/linux/raid/ +SOCIONEXT (SNI) Synquacer SPI DRIVER +M: Jassi Brar +L: linux-spi@vger.kernel.org +S: Maintained +F: drivers/spi/spi-synquacer.c +F: Documentation/devicetree/bindings/spi/spi-synquacer.txt + SONIC NETWORK DRIVER M: Thomas Bogendoerfer L: netdev@vger.kernel.org