public inbox for u-boot@lists.denx.de
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox