From patchwork Mon Mar 30 08:28:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "J. Holland" X-Patchwork-Id: 1263827 X-Patchwork-Delegate: jagannadh.teki@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.a=rsa-sha256 header.s=badeba3b8450 header.b=AFQ+wQBw; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48rQZq0SC5z9sPk for ; Mon, 30 Mar 2020 19:28:19 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0E961818B2; Mon, 30 Mar 2020 10:28:12 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="AFQ+wQBw"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id A87C88065F; Mon, 30 Mar 2020 10:28:09 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0903B8065F for ; Mon, 30 Mar 2020 10:28:07 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=joh.ho@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585556885; bh=HLR0BqoSSDQL+47fGdcBww2oRCzsreAKZKWof07dzvY=; h=X-UI-Sender-Class:To:Cc:From:Subject:Date; b=AFQ+wQBwUW0PamHFF/fkuDcraugTthEFnZnR++rTV0q9eAt8UeYIrrRWWKwzqBgrk QxuE9DIxdrJptKi9TcKoViUCIaK+4KHvnr6Difr3jZZLllJeHzRR3tcIFE8l/QqvYm 7cklss/DthyQq5GdGXsAPs8UXWIDkGn0QiaURW6U= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [172.16.1.34] ([188.174.74.162]) by mail.gmx.com (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MIdeX-1jWpsG2nET-00Ecob; Mon, 30 Mar 2020 10:28:05 +0200 To: jagan@amarulasolutions.com, pierre.ftn@pfontaine.fr, u-boot@lists.denx.de Cc: trini@konsulko.com From: "J. Holland" Subject: [PATCH] dm: spi: fix CPHA and implement CPOL for soft-spi Message-ID: Date: Mon, 30 Mar 2020 10:28:04 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 Content-Language: en-US X-Provags-ID: V03:K1:dyuoeDArbsjaC7mLNBO8wQ8tNkv/qHo1zBzPOufTiyAfSKHeYYK vo+aqgHTpr7jUR0aDIGA65IIjVLLHo/9xbiSlfYXzblno1cT5CCxF3hwronFkxTnxhf/KUt ESALWI8LlIXUFfUDZG/ddMjPX0+4upSaYm+bRheqPcoaOjMYR7w+u5K6sKc6qV+YsQHf+9b UHy3zc1y8v1GadS4XbKyw== X-UI-Out-Filterresults: notjunk:1; V03:K0:ZOmPEO7uU5M=:Oz4sNus4iJQfsc6DC90Bsq 1e9OFIdC9BdymPUVqBByzrAuurBdLFq0+kV0JWxuTeNJITrSCRnnKyh7a4g2EBiyf0pyXIPAc ID4QIJOxg3DHn1r15/4iMesu3i2pRizeYIxKOSBaOfaVaBgZcy5oh09ZnJAdDTGdi3nhUPmik ib8V9FYsMEA20mD0ap7aXaOsg1BcALbnzqZP70fqb28nBO1QRMgqiOtM6DNHmGeZYWA1Ogz+B bdXYRVFmiBKXpE19uMUV8CuoQ5iljsyNiH3fxPNEO2rYa5dMO7xvRFRq+gTNyRuOjTClt2YtA DsIRjMvd50RhEXPAydNFifS/jAjzbWllyDLRTJRSyriTsE61/X3PD3MSnzQHECf7d7rV4vuf/ mssBmCQev1PU0OIk6q5nh+N+xtYiJ7jMv8rU4fpuYtJ27/cKI8w4V7BtJq0DxnkNMducKmoKM QyEivxy+1hXRd9wPnKCUsUKrokJuVjgG3OzFw6+J7vMo+oz3Co7Kl4Hv4pOvjEZUoAqdZ9eYh q1wn6qbE45IvxxddjM9uuRcnQRQqYzUYO7a76dspUqpi2rGPlJF+1Y/XwKt6RV6lcZ7DyjzXm Qk+8vvls4BHPRJyduXvOSHDr3T7qiT/2dvIB4nI0Fl1V2Ik8jAz5lMff+ANFzotnwLMkzCeix Ze3LUNo11ZaH0iMf2JZnebgx6QrAPU4pyfK+XSU6++3mk4omeTX+3YGvTbAZcPDTN4sF9W03e 5W3gT0gMDqCQaOGmTUvx5ENq3EZMZqxdX4tPzk8UzAlZIkr9mdqb9De8EbIKHyNd3eydYWkoc jzUcVZv+nCmsxQCHIRPYkw8L/BX5XHpLMQ0fyO+d+YmLCRzxhiIJFbBW8mXv2a7vrOKnUhJMM VVqqcCIddeMEElA7ienK6iXPsyaBJ92ve+eElZr6IoTDtAE8cG08jb0nKotid7ILiCriS+8KF Oeb9pEAkakCkL5HprSleZanp7qqBsmaGqvR7E/7VcfwSfLchaVaDLgAyaaRrrCyzd9XpvdAYC U1Jcsv7w0l2FJWr1/8NGyYkApH5y9O3VW8RImNRVGsiSxh/HWU7PEXQcgDK6QwZKz3RzyRq80 zE8KpD51x+0GhnBafoY4WkpncyAEO2ibsn79Z6ZJqL7A7SLr8FpYWrHpZ8VTIXdfPNXkd4OBz 7ToyBHCvLIu/IP38klWIgN0tKqE07bBPsWYzvcp0+UCFldBKqmnp74VwvvQ60WE14Fl89aPWA A77ab0mXpaZn6kkP0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.102.2 at phobos.denx.de X-Virus-Status: Clean Implement SPI modes for CPOL/CPHA in the soft-spi driver. Previously, CPOL=1 was hard-coded and CPHA was implemented inversely (defaulting to CPHA=1). Signed-off-by: Johannes Holland ---  drivers/spi/soft_spi.c | 56 ++++++++++++++++++++++++++++++++----------  1 file changed, 43 insertions(+), 13 deletions(-)          /* @@ -140,22 +148,42 @@ static int soft_spi_xfer(struct udevice *dev, unsigned int bitlen,              tmpdin  = 0;          } -        if (!cpha) -            soft_spi_scl(dev, 0); +        /* +         * CPOL 0: idle is low (0), active is high (1) +         * CPOL 1: idle is high (1), active is low (0) +         */ + +        /* +         * drive bit +         *  CPHA 1: CLK from idle to active +         */ +        if (cpha) +            soft_spi_scl(dev, !cidle);          if ((plat->flags & SPI_MASTER_NO_TX) == 0)              soft_spi_sda(dev, !!(tmpdout & 0x80));          udelay(plat->spi_delay_us); -        if (cpha) -            soft_spi_scl(dev, 0); + +        /* +         * sample bit +         *  CPHA 0: CLK from idle to active +         *  CPHA 1: CLK from active to idle +         */ +        if (!cpha) +            soft_spi_scl(dev, !cidle);          else -            soft_spi_scl(dev, 1); +            soft_spi_scl(dev, cidle);          tmpdin    <<= 1;          if ((plat->flags & SPI_MASTER_NO_RX) == 0)              tmpdin    |= dm_gpio_get_value(&plat->miso);          tmpdout    <<= 1;          udelay(plat->spi_delay_us); -        if (cpha) -            soft_spi_scl(dev, 1); + +        /* +         * drive bit +         *  CPHA 0: CLK from active to idle +         */ +        if (!cpha) +            soft_spi_scl(dev, cidle);      }      /*       * If the number of bits isn't a multiple of 8, shift the last @@ -168,15 +196,17 @@ static int soft_spi_xfer(struct udevice *dev, unsigned int bitlen,          *rxd++ = tmpdin;      } -    if (flags & SPI_XFER_END) +    if (flags & SPI_XFER_END) { +        udelay(plat->spi_delay_us);          soft_spi_cs_deactivate(dev); +    }      return 0;  }  static int soft_spi_set_speed(struct udevice *dev, unsigned int speed)  { -    /* Accept any speed */ +    /* Ignore any speed settings. Speed is implemented via "spi-delay-us" */      return 0;  } -- 2.26.0 diff --git a/drivers/spi/soft_spi.c b/drivers/spi/soft_spi.c index b80f810bd1..5932ce8c5c 100644 --- a/drivers/spi/soft_spi.c +++ b/drivers/spi/soft_spi.c @@ -58,10 +58,12 @@ static int soft_spi_sda(struct udevice *dev, int bit)  static int soft_spi_cs_activate(struct udevice *dev)  {      struct udevice *bus = dev_get_parent(dev); +    struct soft_spi_priv *priv = dev_get_priv(bus);      struct soft_spi_platdata *plat = dev_get_platdata(bus); +    int cidle = !!(priv->mode & SPI_CPOL);      dm_gpio_set_value(&plat->cs, 0); -    dm_gpio_set_value(&plat->sclk, 0); +    dm_gpio_set_value(&plat->sclk, cidle); /* to idle */      dm_gpio_set_value(&plat->cs, 1);      return 0; @@ -79,11 +81,14 @@ static int soft_spi_cs_deactivate(struct udevice *dev)  static int soft_spi_claim_bus(struct udevice *dev)  { +    struct udevice *bus = dev_get_parent(dev); +    struct soft_spi_priv *priv = dev_get_priv(bus); +    int cidle = !!(priv->mode & SPI_CPOL);      /*       * Make sure the SPI clock is in idle state as defined for       * this slave.       */ -    return soft_spi_scl(dev, 0); +    return soft_spi_scl(dev, cidle);  }  static int soft_spi_release_bus(struct udevice *dev) @@ -114,15 +119,18 @@ static int soft_spi_xfer(struct udevice *dev, unsigned int bitlen,      uchar        tmpdout = 0;      const u8    *txd = dout;      u8        *rxd = din; -    int        cpha = priv->mode & SPI_CPHA; +    int        cpha = !!(priv->mode & SPI_CPHA); +    int        cidle = !!(priv->mode & SPI_CPOL);      unsigned int    j;      debug("spi_xfer: slave %s:%s dout %08X din %08X bitlen %u\n",            dev->parent->name, dev->name, *(uint *)txd, *(uint *)rxd,            bitlen); -    if (flags & SPI_XFER_BEGIN) +    if (flags & SPI_XFER_BEGIN) {          soft_spi_cs_activate(dev); +        udelay(plat->spi_delay_us); +    }      for (j = 0; j < bitlen; j++) {