From 89b8dc025eb0cf23a9952b989741027a4ca40760 Mon Sep 17 00:00:00 2001
From: florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Mon, 1 Sep 2008 11:49:57 +0000
Subject: Fix divisor calculation and configuration from previous commit,
 thanks sn9

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@12454 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 target/linux/ar7/files/arch/mips/ar7/platform.c    |  2 +-
 target/linux/ar7/files/arch/mips/ar7/prom.c        |  4 +-
 target/linux/ar7/files/drivers/vlynq/vlynq.c       | 53 +++++++---------------
 target/linux/ar7/files/include/asm-mips/ar7/prom.h |  4 +-
 .../ar7/patches-2.6.26/100-board_support.patch     |  3 +-
 5 files changed, 22 insertions(+), 44 deletions(-)

(limited to 'target/linux/ar7')

diff --git a/target/linux/ar7/files/arch/mips/ar7/platform.c b/target/linux/ar7/files/arch/mips/ar7/platform.c
index 81d4290e8..1464ccdd6 100644
--- a/target/linux/ar7/files/arch/mips/ar7/platform.c
+++ b/target/linux/ar7/files/arch/mips/ar7/platform.c
@@ -493,11 +493,11 @@ static int __init ar7_register_devices(void)
 	if (res)
 		return res;
 
+	ar7_device_disable(vlynq_low_data.reset_bit);
 	res = platform_device_register(&vlynq_low);
 	if (res)
 		return res;
 
-	ar7_device_disable(vlynq_low_data.reset_bit);
 	if (ar7_has_high_vlynq()) {
 		ar7_device_disable(vlynq_high_data.reset_bit);
 		res = platform_device_register(&vlynq_high);
diff --git a/target/linux/ar7/files/arch/mips/ar7/prom.c b/target/linux/ar7/files/arch/mips/ar7/prom.c
index 249aab586..4a6cd290b 100644
--- a/target/linux/ar7/files/arch/mips/ar7/prom.c
+++ b/target/linux/ar7/files/arch/mips/ar7/prom.c
@@ -39,7 +39,7 @@ struct env_var {
 
 static struct env_var adam2_env[MAX_ENTRY] = { { 0, }, };
 
-char *prom_getenv(char *name)
+char *prom_getenv(const char *name)
 {
 	int i;
 	for (i = 0; (i < MAX_ENTRY) && adam2_env[i].name; i++)
@@ -288,7 +288,7 @@ int prom_putchar(char c)
 }
 
 /* from adm5120/prom.c */
-void prom_printf(char *fmt, ...)
+void prom_printf(const char *fmt, ...)
 {
 	va_list args;
 	int l;
diff --git a/target/linux/ar7/files/drivers/vlynq/vlynq.c b/target/linux/ar7/files/drivers/vlynq/vlynq.c
index 1de5789b7..14022b1fb 100644
--- a/target/linux/ar7/files/drivers/vlynq/vlynq.c
+++ b/target/linux/ar7/files/drivers/vlynq/vlynq.c
@@ -26,6 +26,7 @@
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/device.h>
+#include <linux/delay.h>
 #include <linux/io.h>
 
 #include <linux/vlynq.h>
@@ -301,39 +302,19 @@ static int vlynq_device_match(struct device *dev,
 {
 	struct vlynq_device *vdev = to_vlynq_device(dev);
 	struct vlynq_driver *vdrv = to_vlynq_driver(drv);
-	struct plat_vlynq_ops *ops = dev->platform_data;
 	struct vlynq_device_id *ids = vdrv->id_table;
-	u32 id = 0;
-	int result, flag;
 
 	while (ids->id) {
-		flag = 0;
-		if (ids->divisor != vlynq_div_auto
-				&& vdev->divisor == vlynq_div_auto) {
-			flag = 1;
+		if (ids->id == vdev->dev_id) {
 			vdev->divisor = ids->divisor;
-			result = __vlynq_enable_device(vdev);
-			if (result == 0) {
-				id = vlynq_reg_read(vdev->remote->chip);
-				vlynq_reg_write(vdev->local->control, 0);
-				vlynq_reg_write(vdev->remote->control, 0);
-				ops->off(vdev);
-			} else
-				id = vdev->dev_id;
-		} else
-			id = vdev->dev_id;
-		if (ids->id == id) {
-			vdev->dev_id = id;
 			vlynq_set_drvdata(vdev, ids);
 			printk(KERN_INFO "Driver found for VLYNQ " \
-				"device: %08x\n", id);
+				"device: %08x\n", vdev->dev_id);
 			return 1;
 		}
-		printk(KERN_INFO "Not using the %08x VLYNQ device's " \
-			"driver for VLYNQ device: %08x\n", ids->id, id);
+		printk(KERN_DEBUG "Not using the %08x VLYNQ device's driver" \
+			" for VLYNQ device: %08x\n", ids->id, vdev->dev_id);
 		ids++;
-		if (flag)
-			vdev->divisor = vlynq_div_auto;
 	}
 	return 0;
 }
@@ -385,20 +366,20 @@ static int __vlynq_enable_device(struct vlynq_device *dev)
 	if (result)
 		return result;
 
-	vlynq_reg_write(dev->local->control, 0);
-	vlynq_reg_write(dev->remote->control, 0);
-	if (vlynq_linked(dev)) {
-		printk(KERN_DEBUG "%s: using external clock\n",
-			dev->dev.bus_id);
-		return 0;
-	}
-
 	switch (dev->divisor) {
 	case vlynq_div_auto:
 		/* Only try locally supplied clock, others cause problems */
 		vlynq_reg_write(dev->local->control, 0);
 		vlynq_reg_write(dev->remote->control, 0);
-		for (i = vlynq_ldiv2; i <= vlynq_ldiv8; i++) {
+		if (vlynq_linked(dev)) {
+			dev->divisor = vlynq_div_external;
+			printk(KERN_DEBUG "%s: using external clock\n",
+				dev->dev.bus_id);
+			return 0;
+		}
+		for (i = dev->dev_id ? vlynq_ldiv2 : vlynq_ldiv8; dev->dev_id ?
+				i <= vlynq_ldiv8 : i >= vlynq_ldiv2;
+				dev->dev_id ? i++ : i--) {
 			vlynq_reg_write(dev->local->control,
 					VLYNQ_CTRL_CLOCK_INT |
 					VLYNQ_CTRL_CLOCK_DIV(i - vlynq_ldiv1));
@@ -618,15 +599,13 @@ static int vlynq_probe(struct platform_device *pdev)
 	       dev->dev.bus_id, (void *)dev->regs_start, dev->irq,
 	       (void *)dev->mem_start);
 
+	dev->dev_id = 0;
 	dev->divisor = vlynq_div_auto;
 	result = __vlynq_enable_device(dev);
 	if (result == 0) {
 		dev->dev_id = vlynq_reg_read(dev->remote->chip);
-		vlynq_reg_write(dev->local->control, 0);
-		vlynq_reg_write(dev->remote->control, 0);
 		((struct plat_vlynq_ops *)(dev->dev.platform_data))->off(dev);
-	} else
-		dev->dev_id = 0;
+	}
 	if (dev->dev_id)
 		printk(KERN_INFO "Found a VLYNQ device: %08x\n", dev->dev_id);
 
diff --git a/target/linux/ar7/files/include/asm-mips/ar7/prom.h b/target/linux/ar7/files/include/asm-mips/ar7/prom.h
index 2f3f67fe6..55f5939db 100644
--- a/target/linux/ar7/files/include/asm-mips/ar7/prom.h
+++ b/target/linux/ar7/files/include/asm-mips/ar7/prom.h
@@ -19,8 +19,8 @@
 #ifndef __PROM_H__
 #define __PROM_H__
 
-extern char *prom_getenv(char *name);
-extern void prom_printf(char *fmt, ...);
+extern char *prom_getenv(const char *name);
+extern void prom_printf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
 extern void prom_meminit(void);
 
 #endif /* __PROM_H__ */
diff --git a/target/linux/ar7/patches-2.6.26/100-board_support.patch b/target/linux/ar7/patches-2.6.26/100-board_support.patch
index 658a80e51..33b0b8baa 100644
--- a/target/linux/ar7/patches-2.6.26/100-board_support.patch
+++ b/target/linux/ar7/patches-2.6.26/100-board_support.patch
@@ -1,6 +1,6 @@
 --- a/arch/mips/Kconfig
 +++ b/arch/mips/Kconfig
-@@ -18,6 +18,24 @@
+@@ -18,6 +18,23 @@
  	prompt "System type"
  	default SGI_IP22
  
@@ -11,7 +11,6 @@
 +	select CEVT_R4K
 +	select CSRC_R4K
 +	select IRQ_CPU
-+	select NO_EXCEPT_FILL
 +	select SWAP_IO_SPACE
 +	select SYS_HAS_CPU_MIPS32_R1
 +	select SYS_HAS_EARLY_PRINTK
-- 
cgit v1.2.3