Skip to contentSkip to conversation

cs89x0: add support for i.MX31ADS ARM board

PATCH In review Gilles Chanteperdrix 3 participants 8 messages Aug 9, 2008 – Sep 16, 2008

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 cs89x0: add support for i.MX31ADS ARM board

---

drivers/net/cs89x0.c +10 -2
index ea6144a..875a43d 100644
@@ -194,6 +194,12 @@ static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};
 #define CIRRUS_DEFAULT_IRQ	VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* Event inputs bank 1 - ID 35/bit 3 */
 static unsigned int netcard_portlist[] __used __initdata = {CIRRUS_DEFAULT_BASE, 0};
 static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};
+#elif defined(CONFIG_MACH_MX31ADS)
+#include <mach/board-mx31ads.h>
+static unsigned int netcard_portlist[] __used __initdata = {
+	PBC_BASE_ADDRESS + PBC_CS8900A_IOBASE + 0x300, 0
+};
+static unsigned cs8900_irq_map[] = {EXPIO_INT_ENET_INT, 0, 0, 0};
 #else
 static unsigned int netcard_portlist[] __used __initdata =
    { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
@@ -802,7 +808,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
 	} else {
 		i = lp->isa_config & INT_NO_MASK;
 		if (lp->chip_type == CS8900) {
-#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X)
+#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X) || defined(CONFIG_MACH_MX31ADS)
 		        i = cs8900_irq_map[0];
 #else
 			/* Translate the IRQ using the IRQ mapping table. */
@@ -1029,6 +1035,7 @@ skip_this_frame:
 
 void  __init reset_chip(struct net_device *dev)
 {
+#if !defined(CONFIG_MACH_MX31ADS)
 #if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01)
 	struct net_local *lp = netdev_priv(dev);
 	int ioaddr = dev->base_addr;
@@ -1057,6 +1064,7 @@ void  __init reset_chip(struct net_device *dev)
 	reset_start_time = jiffies;
 	while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
 		;
+#endif /* !CONFIG_MACH_MX31ADS */
 }
 
 
@@ -1304,7 +1312,7 @@ net_open(struct net_device *dev)
 	else
 #endif
 	{
-#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)
+#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_MACH_MX31ADS)
 		if (((1 << dev->irq) & lp->irq_map) == 0) {
 			printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
                                dev->name, dev->irq, lp->irq_map);
#1 lore raw
Quoted 45 lines · Gilles Chanteperdrix

---

drivers/net/cs89x0.c +9 -1
index ea6144a..875a43d 100644
@@ -194,6 +194,12 @@ static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0};
 #define CIRRUS_DEFAULT_IRQ	VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* Event inputs bank 1 - ID 35/bit 3 */
 static unsigned int netcard_portlist[] __used __initdata = {CIRRUS_DEFAULT_BASE, 0};
 static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};
+#elif defined(CONFIG_MACH_MX31ADS)
+#include <mach/board-mx31ads.h>
+static unsigned int netcard_portlist[] __used __initdata = {
+	PBC_BASE_ADDRESS + PBC_CS8900A_IOBASE + 0x300, 0
+};
+static unsigned cs8900_irq_map[] = {EXPIO_INT_ENET_INT, 0, 0, 0};
 #else
 static unsigned int netcard_portlist[] __used __initdata =
    { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
@@ -802,7 +808,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular)
 	} else {
 		i = lp->isa_config & INT_NO_MASK;
 		if (lp->chip_type == CS8900) {
-#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X)
+#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X) || defined(CONFIG_MACH_MX31ADS)
 		        i = cs8900_irq_map[0];
 #else
 			/* Translate the IRQ using the IRQ mapping table. */
@@ -1029,6 +1035,7 @@ skip_this_frame:
 
 void  __init reset_chip(struct net_device *dev)
 {
+#if !defined(CONFIG_MACH_MX31ADS)
 #if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01)
 	struct net_local *lp = netdev_priv(dev);
 	int ioaddr = dev->base_addr;
@@ -1057,6 +1064,7 @@ void  __init reset_chip(struct net_device *dev)
 	reset_start_time = jiffies;
 	while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time < 2)
 		;
+#endif /* !CONFIG_MACH_MX31ADS */
 }
 
 

drivers/net/cs89x0.c net_open(struct net_device *dev) · line 1317

Quoted 7 lines
drivers/net/cs89x0.c +1 -1
@@ -1304,7 +1312,7 @@ net_open(struct net_device *dev)
 	else
 #endif
 	{
-#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)
+#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_MACH_MX31ADS)
 		if (((1 << dev->irq) & lp->irq_map) == 0) {
 			printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",

I don't know enough about the arch to be able to ACK or NAK... pass this through the appropriate arch maintainer tree please?

#2 lore raw
Quoted 52 lines · Jeff Garzik
Quoted 52 lines

---

drivers/net/cs89x0.c +0 -0
index ea6144a..875a43d 100644
@@ -194,6 +194,12 @@ static unsigned int cs8900_irq_map[] = 
 {IRQ_IXDP2X01_CS8900, 0, 0, 0};
 #define CIRRUS_DEFAULT_IRQ	VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* 

Event inputs bank 1 - ID 35/bit 3 */
static unsigned int netcard_portlist[] __used __initdata = {CIRRUS_DEFAULT_BASE, 0};
static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};

drivers/net/cs89x0.c +6 -0
+#elif defined(CONFIG_MACH_MX31ADS)
+#include <mach/board-mx31ads.h>
+static unsigned int netcard_portlist[] __used __initdata = {
+	PBC_BASE_ADDRESS + PBC_CS8900A_IOBASE + 0x300, 0
+};
+static unsigned cs8900_irq_map[] = {EXPIO_INT_ENET_INT, 0, 0, 0};

#else
static unsigned int netcard_portlist[] __used __initdata =
{ 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};

drivers/net/cs89x0.c +1 -1
@@ -802,7 +808,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int 
 modular)
 	} else {
 		i = lp->isa_config & INT_NO_MASK;
 		if (lp->chip_type == CS8900) {
-#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || 
 defined(CONFIG_ARCH_PNX010X)
+#if defined(CONFIG_MACH_IXDP2351) || defined(CONFIG_ARCH_IXDP2X01) || 
 defined(CONFIG_ARCH_PNX010X) || defined(CONFIG_MACH_MX31ADS)
		        i = cs8900_irq_map[0];
#else
			/* Translate the IRQ using the IRQ mapping table. */
drivers/net/cs89x0.c +2 -0
@@ -1029,6 +1035,7 @@ skip_this_frame:
 
 void  __init reset_chip(struct net_device *dev)
 {
+#if !defined(CONFIG_MACH_MX31ADS)
 #if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01)
 	struct net_local *lp = netdev_priv(dev);
 	int ioaddr = dev->base_addr;
@@ -1057,6 +1064,7 @@ void  __init reset_chip(struct net_device *dev)
 	reset_start_time = jiffies;
 	while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - 
 	reset_start_time < 2)
 		;
+#endif /* !CONFIG_MACH_MX31ADS */
 }
 
Quoted 14 lines
Quoted 11 lines
drivers/net/cs89x0.c +1 -1
@@ -1304,7 +1312,7 @@ net_open(struct net_device *dev)
 	else
 #endif
 	{
-#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && 
 !defined(CONFIG_ARCH_PNX010X)
+#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && 
 !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_MACH_MX31ADS)
 		if (((1 << dev->irq) & lp->irq_map) == 0) {

printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",

I don't know enough about the arch to be able to ACK or NAK... pass this through the appropriate arch maintainer tree please?

I don't have the original patch in my netdev box anymore, but what seems to me should be done is to add a platform driver interface to the cs89x0 driver, like how most other non-PCI non-other-autoconf- supporting-bus net drivers do it. (There aren't too many -- grep for platform_driver_register in drivers/net/*)

Then the knowledge about I/O addresses and IRQ lines can live in the platform code (where it belongs) instead of having it all in the driver (where it doesn't belong). And all the IXDP2351 and IXDP2X01 ifdefs can disappear as well. And the ->readword()/->writeword() hacks that need to be done for IXDP2351 and IXDP2X01 and PNX can then just be an (optional) set of platform data methods, with a fallback to the default one if they aren't passed in.

The question is whether someone wants to step up and do that work. cs89x0 has seen a lot of drive-by patching by people looking to satisfy their needs, but noone has stepped up to give it the proper love and care that it deserves.

Gilles, are you willing to do the platform driver conversion? If not, then I guess we should just merge this patch as-is (after you explain why you need to stub out reset_chip() on your board, as no other board seems to need this?).

#3 lore raw
Quoted 19 lines · Lennert Buytenhek

I don't have the original patch in my netdev box anymore, but what seems to me should be done is to add a platform driver interface to the cs89x0 driver, like how most other non-PCI non-other-autoconf- supporting-bus net drivers do it. (There aren't too many -- grep for platform_driver_register in drivers/net/*)

Then the knowledge about I/O addresses and IRQ lines can live in the platform code (where it belongs) instead of having it all in the driver (where it doesn't belong). And all the IXDP2351 and IXDP2X01 ifdefs can disappear as well. And the ->readword()/->writeword() hacks that need to be done for IXDP2351 and IXDP2X01 and PNX can then just be an (optional) set of platform data methods, with a fallback to the default one if they aren't passed in.

The question is whether someone wants to step up and do that work. cs89x0 has seen a lot of drive-by patching by people looking to satisfy their needs, but noone has stepped up to give it the proper love and care that it deserves.

Quoted 4 lines

Gilles, are you willing to do the platform driver conversion? If not, then I guess we should just merge this patch as-is (after you explain why you need to stub out reset_chip() on your board, as no other board seems to need this?).

Hi Lennert,

When I published this patch, I had access to an i.MX31ADS board, and getting Linux to work on this board was just a necessity to get my job done. I did this by copying the parts I needed working (the serial console and ethernet driver) from the Freescale tree.

Now, I am no longer working on this, so I can not test any modification. And I do not even know why people at Freescale did what they did.

All I can tell you is that an i.MX31ADS board works when using this patch.

Regards.

Signature · 1 line
					    Gilles.
#4 lore raw
Quoted 26 lines · Gilles Chanteperdrix
Quoted 19 lines

I don't have the original patch in my netdev box anymore, but what seems to me should be done is to add a platform driver interface to the cs89x0 driver, like how most other non-PCI non-other-autoconf- supporting-bus net drivers do it. (There aren't too many -- grep for platform_driver_register in drivers/net/*)

Then the knowledge about I/O addresses and IRQ lines can live in the platform code (where it belongs) instead of having it all in the driver (where it doesn't belong). And all the IXDP2351 and IXDP2X01 ifdefs can disappear as well. And the ->readword()/->writeword() hacks that need to be done for IXDP2351 and IXDP2X01 and PNX can then just be an (optional) set of platform data methods, with a fallback to the default one if they aren't passed in.

The question is whether someone wants to step up and do that work. cs89x0 has seen a lot of drive-by patching by people looking to satisfy their needs, but noone has stepped up to give it the proper love and care that it deserves.

Quoted 4 lines

Gilles, are you willing to do the platform driver conversion? If not, then I guess we should just merge this patch as-is (after you explain why you need to stub out reset_chip() on your board, as no other board seems to need this?).

Hi Lennert,

Quoted 7 lines

When I published this patch, I had access to an i.MX31ADS board, and getting Linux to work on this board was just a necessity to get my job done. I did this by copying the parts I needed working (the serial console and ethernet driver) from the Freescale tree.

Now, I am no longer working on this, so I can not test any modification. And I do not even know why people at Freescale did what they did.

I guess then we should just wait until the Freescale people submit it.

#5 lore raw
Quoted 32 lines · Lennert Buytenhek
Quoted 30 lines · Gilles Chanteperdrix
Quoted 19 lines

I don't have the original patch in my netdev box anymore, but what seems to me should be done is to add a platform driver interface to the cs89x0 driver, like how most other non-PCI non-other-autoconf- supporting-bus net drivers do it. (There aren't too many -- grep for platform_driver_register in drivers/net/*)

Then the knowledge about I/O addresses and IRQ lines can live in the platform code (where it belongs) instead of having it all in the driver (where it doesn't belong). And all the IXDP2351 and IXDP2X01 ifdefs can disappear as well. And the ->readword()/->writeword() hacks that need to be done for IXDP2351 and IXDP2X01 and PNX can then just be an (optional) set of platform data methods, with a fallback to the default one if they aren't passed in.

The question is whether someone wants to step up and do that work. cs89x0 has seen a lot of drive-by patching by people looking to satisfy their needs, but noone has stepped up to give it the proper love and care that it deserves.

Quoted 4 lines

Gilles, are you willing to do the platform driver conversion? If not, then I guess we should just merge this patch as-is (after you explain why you need to stub out reset_chip() on your board, as no other board seems to need this?).

Hi Lennert,

When I published this patch, I had access to an i.MX31ADS board, and getting Linux to work on this board was just a necessity to get my job done. I did this by copying the parts I needed working (the serial console and ethernet driver) from the Freescale tree.

Quoted 4 lines
Quoted 2 lines

Now, I am no longer working on this, so I can not test any modification. And I do not even know why people at Freescale did what they did.

I guess then we should just wait until the Freescale people submit it.

I will be able to test the modification soon. I will repost the patch on linux-arm-kernel after this test.

Signature · 1 line
                                                 Gilles.
#6 lore raw
Quoted 30 lines · Gilles Chanteperdrix
Quoted 30 lines
Quoted 30 lines
Quoted 19 lines

I don't have the original patch in my netdev box anymore, but what seems to me should be done is to add a platform driver interface to the cs89x0 driver, like how most other non-PCI non-other-autoconf- supporting-bus net drivers do it. (There aren't too many -- grep for platform_driver_register in drivers/net/*)

Then the knowledge about I/O addresses and IRQ lines can live in the platform code (where it belongs) instead of having it all in the driver (where it doesn't belong). And all the IXDP2351 and IXDP2X01 ifdefs can disappear as well. And the ->readword()/->writeword() hacks that need to be done for IXDP2351 and IXDP2X01 and PNX can then just be an (optional) set of platform data methods, with a fallback to the default one if they aren't passed in.

The question is whether someone wants to step up and do that work. cs89x0 has seen a lot of drive-by patching by people looking to satisfy their needs, but noone has stepped up to give it the proper love and care that it deserves.

Quoted 4 lines

Gilles, are you willing to do the platform driver conversion? If not, then I guess we should just merge this patch as-is (after you explain why you need to stub out reset_chip() on your board, as no other board seems to need this?).

Hi Lennert,

When I published this patch, I had access to an i.MX31ADS board, and getting Linux to work on this board was just a necessity to get my job done. I did this by copying the parts I needed working (the serial console and ethernet driver) from the Freescale tree.

Quoted 7 lines
Quoted 4 lines
Quoted 2 lines

Now, I am no longer working on this, so I can not test any modification. And I do not even know why people at Freescale did what they did.

I guess then we should just wait until the Freescale people submit it.

I will be able to test the modification soon. I will repost the patch on linux-arm-kernel after this test.

OK. Please also try leaving reset_chip() as it is and see if it still works like that -- I suspect that that part of the patch might have been a debug leftover.

#7 lore raw
Quoted 9 lines · Lennert Buytenhek
Quoted 9 lines
Quoted 9 lines
Quoted 9 lines

Hi Lennert,

When I published this patch, I had access to an i.MX31ADS board, and getting Linux to work on this board was just a necessity to get my job done. I did this by copying the parts I needed working (the serial console and ethernet driver) from the Freescale tree.

Now, I am no longer working on this, so I can not test any modification. And I do not even know why people at Freescale did what they did.

Quoted 7 lines
Quoted 3 lines
Quoted 1 line

I guess then we should just wait until the Freescale people submit it.

I will be able to test the modification soon. I will repost the patch on linux-arm-kernel after this test.

OK. Please also try leaving reset_chip() as it is and see if it still works like that -- I suspect that that part of the patch might have been a debug leftover.

Yes, that is precisely the part I want to test.

Signature · 1 line
                                                 Gilles.