From patchwork Mon Feb 8 17:35:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helmut Buchsbaum X-Patchwork-Id: 580436 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 7252E140CD4 for ; Tue, 9 Feb 2016 04:36:05 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=gkngepCT; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754291AbcBHRf5 (ORCPT ); Mon, 8 Feb 2016 12:35:57 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:35718 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754079AbcBHRfz (ORCPT ); Mon, 8 Feb 2016 12:35:55 -0500 Received: by mail-wm0-f66.google.com with SMTP id g62so16493532wme.2 for ; Mon, 08 Feb 2016 09:35:55 -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=Ug0eE3AtC+ekKWqe8Oi9Oj1UmJpytK5jG11AtiHx+j4=; b=gkngepCT94S7oCnu51ttwIR7+DwfZIH75PPQJuBES813FrVM1y61ZEoBf06IDFmk9e qj/KwTm6Eoc+g2uV3VfljcDHThl98oPV4Q8DB5A4rjTu1KPmf+vL+vt179Xg4sOJj1vd QGkmmLDTvtAHHRl9xklzHIgZNsTxR3qElWb+eRRuRLbhOCw5IxuUh+0xtzn0GZJpaz43 oG3NUqRqZ//uuwr5jomD49JsQwPYVktVGrmO5WfzJZH0TaXOpnhkpbzj5okw36LXGnAS Duw+a1UxTezCyp84jajv0j1VCQrStgebILQrB8xO13EB9o4/1Z+6GvsW9jSOuHOA/+lC px2Q== 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=Ug0eE3AtC+ekKWqe8Oi9Oj1UmJpytK5jG11AtiHx+j4=; b=LmSSea9X7JoSznj79yCQNutVEmvz+0QFCgamoVHAIZuCETU00adh43l1OLYTnW0uP+ VzG4St2WRPeC6Fsiy37lKbC1IWDCNoR+WonBlcN8USueHZ84YyFAtUVFb4RIrJ3mDnRv Exc6Y47LOPxkgyu6hwV9zelugE0hfTDH5zTXqOXP8wk3O8nVcoZxu33u6zm6TWXWk0xY 2qKPSM5wO+OrZFHWdh8iGk2yyq/hjk/p9uFxLbGZVAWEnsHn3AFRELy2HlHY9cZKb2gy rIkYrkB4Q4wORB24pTmPw1B1BzUa2ZR/Y2oJPCFtb+JzR278CyDe4bByS7/KcINKCI5Q 8hGg== X-Gm-Message-State: AG10YOSJ5HxlM7u8hmC7OaEbepx+U1NMg7NZSgQ3FDSyYDC7qS3Oy2cbVa195cbG7st0xw== X-Received: by 10.194.133.10 with SMTP id oy10mr27828967wjb.93.1454952954759; Mon, 08 Feb 2016 09:35:54 -0800 (PST) Received: from jessie64.at.festo.net ([213.208.155.113]) by smtp.gmail.com with ESMTPSA id gl10sm30767189wjb.30.2016.02.08.09.35.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 08 Feb 2016 09:35:54 -0800 (PST) From: Helmut Buchsbaum To: "David S. Miller" , Florian Fainelli , Andrew Lunn Cc: netdev@vger.kernel.org, Helmut Buchsbaum Subject: [PATCH v2 4/6] net: phy: spi_ks8995: generalize creation of SPI commands Date: Mon, 8 Feb 2016 18:35:35 +0100 Message-Id: <1454952937-19428-5-git-send-email-helmut.buchsbaum@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1454952937-19428-1-git-send-email-helmut.buchsbaum@gmail.com> References: <1454952937-19428-1-git-send-email-helmut.buchsbaum@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Prepare creating SPI reads and writes for other switch families. The KS8995 family uses the straight forward <8bit CMD><8bit ADDR> sequence. To be able to support KSZ8795 family, which uses <3bit CMD><12bit ADDR><1 bit TR> make the SPI command creation chip variant dependent. Signed-off-by: Helmut Buchsbaum --- drivers/net/phy/spi_ks8995.c | 46 +++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/drivers/net/phy/spi_ks8995.c b/drivers/net/phy/spi_ks8995.c index 04d468f..f866786 100644 --- a/drivers/net/phy/spi_ks8995.c +++ b/drivers/net/phy/spi_ks8995.c @@ -105,6 +105,8 @@ struct ks8995_chip_params { int family_id; int chip_id; int regs_size; + int addr_width; + int addr_shift; }; static const struct ks8995_chip_params ks8995_chip[] = { @@ -113,12 +115,16 @@ static const struct ks8995_chip_params ks8995_chip[] = { .family_id = FAMILY_KS8995, .chip_id = KS8995_CHIP_ID, .regs_size = KS8995_REGS_SIZE, + .addr_width = 8, + .addr_shift = 0, }, [ksz8864] = { .name = "KSZ8864RMN", .family_id = FAMILY_KS8995, .chip_id = KSZ8864_CHIP_ID, .regs_size = KSZ8864_REGS_SIZE, + .addr_width = 8, + .addr_shift = 0, }, }; @@ -153,20 +159,44 @@ static inline u8 get_chip_rev(u8 val) return (val >> ID1_REVISION_S) & ID1_REVISION_M; } +/* create_spi_cmd - create a chip specific SPI command header + * @ks: pointer to switch instance + * @cmd: SPI command for switch + * @address: register address for command + * + * Different chip families use different bit pattern to address the switches + * registers: + * + * KS8995: 8bit command + 8bit address + * KSZ8795: 3bit command + 12bit address + 1bit TR (?) + */ +static inline __be16 create_spi_cmd(struct ks8995_switch *ks, int cmd, + unsigned address) +{ + u16 result = cmd; + + /* make room for address (incl. address shift) */ + result <<= ks->chip->addr_width + ks->chip->addr_shift; + /* add address */ + result |= address << ks->chip->addr_shift; + /* SPI protocol needs big endian */ + return cpu_to_be16(result); +} /* ------------------------------------------------------------------------ */ static int ks8995_read(struct ks8995_switch *ks, char *buf, unsigned offset, size_t count) { - u8 cmd[2]; + __be16 cmd; struct spi_transfer t[2]; struct spi_message m; int err; + cmd = create_spi_cmd(ks, KS8995_CMD_READ, offset); spi_message_init(&m); memset(&t, 0, sizeof(t)); - t[0].tx_buf = cmd; + t[0].tx_buf = &cmd; t[0].len = sizeof(cmd); spi_message_add_tail(&t[0], &m); @@ -174,9 +204,6 @@ static int ks8995_read(struct ks8995_switch *ks, char *buf, t[1].len = count; spi_message_add_tail(&t[1], &m); - cmd[0] = KS8995_CMD_READ; - cmd[1] = offset; - mutex_lock(&ks->lock); err = spi_sync(ks->spi, &m); mutex_unlock(&ks->lock); @@ -184,20 +211,20 @@ static int ks8995_read(struct ks8995_switch *ks, char *buf, return err ? err : count; } - static int ks8995_write(struct ks8995_switch *ks, char *buf, unsigned offset, size_t count) { - u8 cmd[2]; + __be16 cmd; struct spi_transfer t[2]; struct spi_message m; int err; + cmd = create_spi_cmd(ks, KS8995_CMD_WRITE, offset); spi_message_init(&m); memset(&t, 0, sizeof(t)); - t[0].tx_buf = cmd; + t[0].tx_buf = &cmd; t[0].len = sizeof(cmd); spi_message_add_tail(&t[0], &m); @@ -205,9 +232,6 @@ static int ks8995_write(struct ks8995_switch *ks, char *buf, t[1].len = count; spi_message_add_tail(&t[1], &m); - cmd[0] = KS8995_CMD_WRITE; - cmd[1] = offset; - mutex_lock(&ks->lock); err = spi_sync(ks->spi, &m); mutex_unlock(&ks->lock);