All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dirk Behme <dirk.behme@googlemail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] Remove board specific code from ENC28J60 network driver?
Date: Sun, 27 Dec 2009 08:59:21 +0100	[thread overview]
Message-ID: <4B3713D9.7060100@googlemail.com> (raw)
In-Reply-To: <200912261340.46179.vapier@gentoo.org>

On 26.12.2009 19:40, Mike Frysinger wrote:
> On Friday 25 December 2009 13:57:55 Dirk Behme wrote:
>> I started to convert the enc28j60.c to common SPI framework. Do you
>> like to have a look at attachment (and maybe test it?)?
>>
>> It is compile tested only. And for the moment it just re-uses the
>> existing driver. When we know that it basically works this way, doing
>> it in a clean way as you describe above would be the next step.
>> CONFIG_NET_MULTI is still missing, too.
>
> spi_lock/spi_unlock should redirect to spi_claim_bus/spi_release_bus.  this
> isnt so much an "interrupts" issue as the process of claiming the bus
> reprograms the controller with the slave settings.
>
>> In your config file you have to set and configure
>>
>> #define CONFIG_xxx_SPI
>> #define CONFIG_ENC28J60
>> #define CONFIG_ENC28J60_SPI_BUS		0
>> #define CONFIG_ENC28J60_SPI_CS		0
>> #define CONFIG_ENC28J60_SPI_CLK		1000000
>> #define CONFIG_CMD_NET
>>
>> for your board.
>
> this is ok with the current design, but broken for NET_MULTI.  when converted
> to NET_MULTI, the new enc28j60_register() function will take the spi settings
> as function arguments.  so the function would look something like:
> int enc28j60_register(bd_t *bis, unsigned int spi_bus, unsigned int spi_cs,
> unsigned int max_hz, unsigned int mode);
>
> and it'd be up to the board to call it with the settings it wants

Both changes, enc28j60_initialize() (NET_MULTI enabled) and 
spi_claim_bus/spi_release_bus done in below.

In the the board file I now have

int board_eth_init(bd_t *bis)
{
	int rc = 0;
#ifdef CONFIG_ENC28J60
	rc = enc28j60_initialize(bis,
				 CONFIG_ENC28J60_SPI_BUS,
				 CONFIG_ENC28J60_SPI_CS,
				 CONFIG_ENC28J60_SPI_CLK,
				 SPI_MODE_3);
#endif
	return rc;
}

Do you like to test? Any further comments?

As mentioned, when we know that it works this way, I will do a clean 
version.

Best regards

Dirk


Index: u-boot-main/drivers/net/enc28j60.c
===================================================================
--- u-boot-main.orig/drivers/net/enc28j60.c
+++ u-boot-main/drivers/net/enc28j60.c
@@ -18,8 +18,8 @@
  #include <config.h>
  #include <common.h>
  #include <net.h>
-#include <asm/arch/hardware.h>
-#include <asm/arch/spi.h>
+//#include <asm/arch/hardware.h>
+#include <spi.h>

  /*
   * Control Registers in Bank 0
@@ -284,10 +284,14 @@
  /* maximum frame length */
  #define ENC_MAX_FRM_LEN 1518

-#define enc_enable() PUT32(IO1CLR, ENC_SPI_SLAVE_CS)
-#define enc_disable() PUT32(IO1SET, ENC_SPI_SLAVE_CS)
-#define enc_cfg_spi() spi_set_cfg(0, 0, 0); spi_set_clock(8);
-
+#define enc_enable(x) spi_cs_activate(x);
+#define enc_disable(x) spi_cs_deactivate(x);
+#define spi_write(x) spi_w8r8(slave, x)
+#define spi_read() spi_w8r8(slave, 0)
+#define spi_lock() spi_claim_bus(slave)
+#define spi_unlock() spi_release_bus(slave)
+/* Use spi_setup_slave() instead of enc_cfg_spi() */
+#define enc_cfg_spi()

  static unsigned char encReadReg (unsigned char regNo);
  static void encWriteReg (unsigned char regNo, unsigned char data);
@@ -322,25 +326,26 @@ static unsigned char next_pointer_msb;
  static unsigned char buffer[ENC_MAX_FRM_LEN];
  static int rxResetCounter = 0;

+static struct spi_slave *slave;
+
  #define RX_RESET_COUNTER 1000;

 
/*-----------------------------------------------------------------------------
   * Always returns 0
   */
-int eth_init (bd_t * bis)
+int enc28j60_initialize(bd_t *bis, unsigned int spi_bus, unsigned int 
spi_cs,
+			unsigned int max_hz, unsigned int mode)
  {
  	unsigned char estatVal;
  	uchar enetaddr[6];

-	/* configure GPIO */
-	(*((volatile unsigned long *) IO1DIR)) |= ENC_SPI_SLAVE_CS;
-	(*((volatile unsigned long *) IO1DIR)) |= ENC_RESET;
-
-	/* CS and RESET active low */
-	PUT32 (IO1SET, ENC_SPI_SLAVE_CS);
-	PUT32 (IO1SET, ENC_RESET);
-
  	spi_init ();
+	if (!slave) {
+		slave = spi_setup_slave(spi_bus, spi_cs, max_hz, mode);
+		if (!slave)
+			return -1;
+	}
+	spi_claim_bus(slave);

  	/* taken from the Linux driver - dangerous stuff here! */
  	/* Wait for CLKRDY to become set (i.e., check that we can 
communicate with
@@ -592,17 +597,17 @@ static void encWriteReg (unsigned char r
  {
  	spi_lock ();
  	enc_cfg_spi ();
-	enc_enable ();
+	enc_enable (slave);

  	spi_write (0x40 | regNo);	/* write in regNo */
  	spi_write (data);

-	enc_disable ();
-	enc_enable ();
+	enc_disable (slave);
+	enc_enable (slave);

  	spi_write (0x1f);	/* write reg 0x1f */

-	enc_disable ();
+	enc_disable (slave);
  	spi_unlock ();
  }

@@ -615,17 +620,17 @@ static void encWriteRegRetry (unsigned c

  	for (i = 0; i < c; i++) {
  		enc_cfg_spi ();
-		enc_enable ();
+		enc_enable (slave);

  		spi_write (0x40 | regNo);	/* write in regNo */
  		spi_write (data);

-		enc_disable ();
-		enc_enable ();
+		enc_disable (slave);
+		enc_enable (slave);

  		spi_write (0x1f);	/* write reg 0x1f */

-		enc_disable ();
+		enc_disable (slave);

  		spi_unlock ();	/* we must unlock spi first */

@@ -649,14 +654,14 @@ static unsigned char encReadReg (unsigne

  	spi_lock ();
  	enc_cfg_spi ();
-	enc_enable ();
+	enc_enable (slave);

  	spi_write (0x1f);	/* read reg 0x1f */

  	bank = spi_read () & 0x3;

-	enc_disable ();
-	enc_enable ();
+	enc_disable (slave);
+	enc_enable (slave);

  	spi_write (regNo);
  	rxByte = spi_read ();
@@ -668,7 +673,7 @@ static unsigned char encReadReg (unsigne
  		rxByte = spi_read ();
  	}

-	enc_disable ();
+	enc_disable (slave);
  	spi_unlock ();

  	return rxByte;
@@ -678,7 +683,7 @@ static void encReadBuff (unsigned short
  {
  	spi_lock ();
  	enc_cfg_spi ();
-	enc_enable ();
+	enc_enable (slave);

  	spi_write (0x20 | 0x1a);	/* read buffer memory */

@@ -689,7 +694,7 @@ static void encReadBuff (unsigned short
  			spi_write (0);
  	}

-	enc_disable ();
+	enc_disable (slave);
  	spi_unlock ();
  }

@@ -697,7 +702,7 @@ static void encWriteBuff (unsigned short
  {
  	spi_lock ();
  	enc_cfg_spi ();
-	enc_enable ();
+	enc_enable (slave);

  	spi_write (0x60 | 0x1a);	/* write buffer memory */

@@ -706,7 +711,7 @@ static void encWriteBuff (unsigned short
  	while (length--)
  		spi_write (*pBuff++);

-	enc_disable ();
+	enc_disable (slave);
  	spi_unlock ();
  }

@@ -714,12 +719,12 @@ static void encBitSet (unsigned char reg
  {
  	spi_lock ();
  	enc_cfg_spi ();
-	enc_enable ();
+	enc_enable (slave);

  	spi_write (0x80 | regNo);	/* bit field set */
  	spi_write (data);

-	enc_disable ();
+	enc_disable (slave);
  	spi_unlock ();
  }

@@ -727,12 +732,12 @@ static void encBitClr (unsigned char reg
  {
  	spi_lock ();
  	enc_cfg_spi ();
-	enc_enable ();
+	enc_enable (slave);

  	spi_write (0xA0 | regNo);	/* bit field clear */
  	spi_write (data);

-	enc_disable ();
+	enc_disable (slave);
  	spi_unlock ();
  }

@@ -740,11 +745,11 @@ static void encReset (void)
  {
  	spi_lock ();
  	enc_cfg_spi ();
-	enc_enable ();
+	enc_enable (slave);

  	spi_write (0xff);	/* soft reset */

-	enc_disable ();
+	enc_disable (slave);
  	spi_unlock ();

  	/* sleep 1 ms. See errata pt. 2 */
Index: u-boot-main/include/netdev.h
===================================================================
--- u-boot-main.orig/include/netdev.h
+++ u-boot-main/include/netdev.h
@@ -49,6 +49,8 @@ int davinci_emac_initialize(void);
  int dnet_eth_initialize(int id, void *regs, unsigned int phy_addr);
  int e1000_initialize(bd_t *bis);
  int eepro100_initialize(bd_t *bis);
+int enc28j60_initialize(bd_t *bis, unsigned int spi_bus, unsigned int 
spi_cs,
+			unsigned int max_hz, unsigned int mode);
  int eth_3com_initialize (bd_t * bis);
  int fec_initialize (bd_t *bis);
  int fecmxc_initialize (bd_t *bis);

  reply	other threads:[~2009-12-27  7:59 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-20 19:30 [U-Boot] Remove board specific code from ENC28J60 network driver? Dirk Behme
2009-12-20 19:54 ` Ben Warren
2009-12-20 20:05 ` Mike Frysinger
2009-12-21  8:26   ` Dirk Behme
2009-12-21 13:17     ` Mike Frysinger
2009-12-25 18:57   ` Dirk Behme
2009-12-26 18:40     ` Mike Frysinger
2009-12-27  7:59       ` Dirk Behme [this message]
2009-12-27 15:32         ` Ben Warren
2009-12-27 18:55           ` Dirk Behme
2009-12-28 18:33             ` Mike Frysinger
2009-12-28 21:29             ` Ben Warren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B3713D9.7060100@googlemail.com \
    --to=dirk.behme@googlemail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.