From patchwork Sun Feb 7 22:39:08 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helmut Buchsbaum X-Patchwork-Id: 580107 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 803FC14032A for ; Mon, 8 Feb 2016 09:41:16 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=W02qzxVU; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755144AbcBGWkt (ORCPT ); Sun, 7 Feb 2016 17:40:49 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:32847 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754863AbcBGWj5 (ORCPT ); Sun, 7 Feb 2016 17:39:57 -0500 Received: by mail-wm0-f65.google.com with SMTP id r129so12869066wmr.0 for ; Sun, 07 Feb 2016 14:39:56 -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=cdEFiA97RYIb/HXIADjaAs5oRN/cSinGS3YTuD9fKx4=; b=W02qzxVU2IOmdcrg1WkueGYg8FMgvQvs4Hh+4RZ2wcRKgAR+bxyahBLRi4H7sDx9AS nR20F9AYFUJyLmOraCu7SDJOpyy7Tl+lGR5nTYw6gDwL/okg8RzY1xOBQpyxdQ0p6UO8 yyDUiHpXmzV5TP2j9tNAcbnVUb7yn4cfRw5gW+uOWXFWzFCGjx1n3FC5KLYcn2FC6pFc rJf8bkkeKabbNrWeJwUQvub5n4ISmS228EJaVZqAcwq97DoDP2OpHOJwOS34CshHd8z4 frdBe2eTdgd3yU+ccEAHmogKZUFFfn8Ki1YvrKMjidMg1RCSYwlZTLlF2ceUbq2OhGEk XRgw== 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=cdEFiA97RYIb/HXIADjaAs5oRN/cSinGS3YTuD9fKx4=; b=h4wzd2yv56lU9QoGl7OlTBBAsLEcrLK+jKTk7OCjkxFmrQihy1HKh3XlZqi6ZxQ2sr iB2Gp0j71LvFujiq+uz7+EjGBtmmlePcTVF0uR0i2B8LVc4iVS+KgT878Qh/7CnjMUHS XwjA+lyQiW3L4UHnpNi2UqVZcIJXa03hAAS/CJVbLrJiqcYm/aoUJTTfLfWD8sP07uWU P0sdDnx5sXiyrQ+AHs13tNcRpam0ESPcMJBFPwiINVmVp+KEIMJo41iVCjrjvVAym6yX vFXXgUsgCGglkD2ZX1ML+jK5KbRYyHO37W63QLzLaBhGZx/FNHo7dYLkUw6g3E1/LHjC 3aoQ== X-Gm-Message-State: AG10YOTxZXf7uGaVVb4LEdMM9aAOfxER1Jre4glSYCHuSBLQw6DATmFuoEamAGvDi7wtfQ== X-Received: by 10.194.192.170 with SMTP id hh10mr26955572wjc.69.1454884796375; Sun, 07 Feb 2016 14:39:56 -0800 (PST) Received: from jessie64.at.festo.net (178-191-150-217.adsl.highway.telekom.at. [178.191.150.217]) by smtp.gmail.com with ESMTPSA id x10sm26840106wjx.8.2016.02.07.14.39.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 07 Feb 2016 14:39:55 -0800 (PST) From: Helmut Buchsbaum To: "David S. Miller" Cc: Florian Fainelli , netdev@vger.kernel.org, Helmut Buchsbaum Subject: [PATCH 2/7] net: phy: spi_ks8995: verify chip and determine revision Date: Sun, 7 Feb 2016 23:39:08 +0100 Message-Id: <1454884753-4560-3-git-send-email-helmut.buchsbaum@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1454884753-4560-1-git-send-email-helmut.buchsbaum@gmail.com> References: <1454884753-4560-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 Since the chip variant is now determined by spi_device_id, verify family and chip id and determine the revision id. Conflicts: drivers/net/phy/spi_ks8995.c Signed-off-by: Helmut Buchsbaum --- drivers/net/phy/spi_ks8995.c | 118 +++++++++++++++++++++++++++++-------------- 1 file changed, 80 insertions(+), 38 deletions(-) diff --git a/drivers/net/phy/spi_ks8995.c b/drivers/net/phy/spi_ks8995.c index e848ad9..2803c8e 100644 --- a/drivers/net/phy/spi_ks8995.c +++ b/drivers/net/phy/spi_ks8995.c @@ -83,6 +83,8 @@ #define FAMILY_KS8995 0x95 #define CHIPID_M 0 +#define KS8995_CHIP_ID 0x00 +#define KSZ8864_CHIP_ID 0x01 #define KS8995_CMD_WRITE 0x02U #define KS8995_CMD_READ 0x03U @@ -97,16 +99,22 @@ enum ks8995_chip_variant { struct ks8995_chip_params { char *name; + int family_id; + int chip_id; int regs_size; }; static const struct ks8995_chip_params ks8995_chip[] = { [ks8995] = { .name = "KS8995MA", + .family_id = FAMILY_KS8995, + .chip_id = KS8995_CHIP_ID, .regs_size = KS8995_REGS_SIZE, }, [ksz8864] = { .name = "KSZ8864RMN", + .family_id = FAMILY_KS8995, + .chip_id = KSZ8864_CHIP_ID, .regs_size = KSZ8864_REGS_SIZE, }, }; @@ -121,6 +129,7 @@ struct ks8995_switch { struct ks8995_pdata *pdata; struct bin_attribute regs_attr; const struct ks8995_chip_params *chip; + int revision_id; }; static const struct spi_device_id ks8995_id[] = { @@ -263,6 +272,73 @@ static ssize_t ks8995_registers_write(struct file *filp, struct kobject *kobj, return ks8995_write(ks8995, buf, off, count); } +/* ks8995_get_revision - get chip revision + * @ks: pointer to switch instance + * + * Verify chip family and id and get chip revision. + */ +static int ks8995_get_revision(struct ks8995_switch *ks) +{ + int err; + u8 id0, id1, ksz8864_id; + + /* read family id */ + err = ks8995_read_reg(ks, KS8995_REG_ID0, &id0); + if (err) { + err = -EIO; + goto err_out; + } + + /* verify family id */ + if (id0 != ks->chip->family_id) { + dev_err(&ks->spi->dev, "chip family id mismatch: expected 0x%02x but 0x%02x read\n", + ks->chip->family_id, id0); + err = -ENODEV; + goto err_out; + } + + switch (ks->chip->family_id) { + case FAMILY_KS8995: + /* try reading chip id at CHIP ID1 */ + err = ks8995_read_reg(ks, KS8995_REG_ID1, &id1); + if (err) { + err = -EIO; + goto err_out; + } + + /* verify chip id */ + if ((get_chip_id(id1) == CHIPID_M) && + (get_chip_id(id1) == ks->chip->chip_id)) { + /* KS8995MA */ + ks->revision_id = get_chip_rev(id1); + } else if (get_chip_id(id1) != CHIPID_M) { + /* KSZ8864RMN */ + err = ks8995_read_reg(ks, KS8995_REG_ID1, &ksz8864_id); + if (err) { + err = -EIO; + goto err_out; + } + + if ((ksz8864_id & 0x80) && + (ks->chip->chip_id == KSZ8864_CHIP_ID)) { + ks->revision_id = get_chip_rev(id1); + } + + } else { + dev_err(&ks->spi->dev, "unsupported chip id for KS8995 family: 0x%02x\n", + id1); + err = -ENODEV; + } + break; + default: + dev_err(&ks->spi->dev, "unsupported family id: 0x%02x\n", id0); + err = -ENODEV; + break; + } +err_out: + return err; +} + static const struct bin_attribute ks8995_registers_attr = { .attr = { .name = "registers", @@ -278,7 +354,6 @@ static int ks8995_probe(struct spi_device *spi) { struct ks8995_switch *ks; struct ks8995_pdata *pdata; - u8 ids[2]; int err; int variant = spi_get_device_id(spi)->driver_data; @@ -309,39 +384,12 @@ static int ks8995_probe(struct spi_device *spi) return err; } - err = ks8995_read(ks, ids, KS8995_REG_ID0, sizeof(ids)); - if (err < 0) { - dev_err(&spi->dev, "unable to read id registers, err=%d\n", - err); + err = ks8995_get_revision(ks); + if (err) return err; - } - - switch (ids[0]) { - case FAMILY_KS8995: - break; - default: - dev_err(&spi->dev, "unknown family id:%02x\n", ids[0]); - return -ENODEV; - } ks->regs_attr.size = ks->chip->regs_size; memcpy(&ks->regs_attr, &ks8995_registers_attr, sizeof(ks->regs_attr)); - if (get_chip_id(ids[1]) != CHIPID_M) { - u8 val; - - /* Check if this is a KSZ8864RMN */ - err = ks8995_read(ks, &val, KSZ8864_REG_ID1, sizeof(val)); - if (err < 0) { - dev_err(&spi->dev, - "unable to read chip id register, err=%d\n", - err); - return err; - } - if ((val & 0x80) == 0) { - dev_err(&spi->dev, "unknown chip:%02x,0\n", ids[1]); - return err; - } - } err = ks8995_reset(ks); if (err) @@ -354,14 +402,8 @@ static int ks8995_probe(struct spi_device *spi) return err; } - if (get_chip_id(ids[1]) == CHIPID_M) { - dev_info(&spi->dev, - "KS8995 device found, Chip ID:%x, Revision:%x\n", - get_chip_id(ids[1]), get_chip_rev(ids[1])); - } else { - dev_info(&spi->dev, "KSZ8864 device found, Revision:%x\n", - get_chip_rev(ids[1])); - } + dev_info(&spi->dev, "%s device found, Chip ID:%x, Revision:%x\n", + ks->chip->name, ks->chip->chip_id, ks->revision_id); return 0; }