diff options
author | Paul Mackerras <paulus@samba.org> | 2007-07-10 23:28:26 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-07-10 23:28:26 -0400 |
commit | bf22f6fe2d72b4d7e9035be8ceb340414cf490e3 (patch) | |
tree | 14085d90de0428316479fe6de8a0c6d32e6e65e2 /arch/powerpc/platforms/powermac | |
parent | 4eb6bf6bfb580afaf1e1a1d30cba17a078530cf4 (diff) | |
parent | 93ab471889c6662b42ce7da257f31f24c08d7d9e (diff) |
Merge branch 'for-2.6.23' into merge
Diffstat (limited to 'arch/powerpc/platforms/powermac')
-rw-r--r-- | arch/powerpc/platforms/powermac/Kconfig | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/low_i2c.c | 23 | ||||
-rw-r--r-- | arch/powerpc/platforms/powermac/pci.c | 46 |
3 files changed, 16 insertions, 54 deletions
diff --git a/arch/powerpc/platforms/powermac/Kconfig b/arch/powerpc/platforms/powermac/Kconfig index 5b7afe50039a..055990ca8ce6 100644 --- a/arch/powerpc/platforms/powermac/Kconfig +++ b/arch/powerpc/platforms/powermac/Kconfig | |||
@@ -2,6 +2,7 @@ config PPC_PMAC | |||
2 | bool "Apple PowerMac based machines" | 2 | bool "Apple PowerMac based machines" |
3 | depends on PPC_MULTIPLATFORM | 3 | depends on PPC_MULTIPLATFORM |
4 | select MPIC | 4 | select MPIC |
5 | select PCI | ||
5 | select PPC_INDIRECT_PCI if PPC32 | 6 | select PPC_INDIRECT_PCI if PPC32 |
6 | select PPC_MPC106 if PPC32 | 7 | select PPC_MPC106 if PPC32 |
7 | select PPC_NATIVE | 8 | select PPC_NATIVE |
diff --git a/arch/powerpc/platforms/powermac/low_i2c.c b/arch/powerpc/platforms/powermac/low_i2c.c index 3f507ab9c5e5..efdf5eb81ecc 100644 --- a/arch/powerpc/platforms/powermac/low_i2c.c +++ b/arch/powerpc/platforms/powermac/low_i2c.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/interrupt.h> | 42 | #include <linux/interrupt.h> |
43 | #include <linux/completion.h> | 43 | #include <linux/completion.h> |
44 | #include <linux/timer.h> | 44 | #include <linux/timer.h> |
45 | #include <linux/mutex.h> | ||
45 | #include <asm/keylargo.h> | 46 | #include <asm/keylargo.h> |
46 | #include <asm/uninorth.h> | 47 | #include <asm/uninorth.h> |
47 | #include <asm/io.h> | 48 | #include <asm/io.h> |
@@ -84,7 +85,7 @@ struct pmac_i2c_bus | |||
84 | void *hostdata; | 85 | void *hostdata; |
85 | int channel; /* some hosts have multiple */ | 86 | int channel; /* some hosts have multiple */ |
86 | int mode; /* current mode */ | 87 | int mode; /* current mode */ |
87 | struct semaphore sem; | 88 | struct mutex mutex; |
88 | int opened; | 89 | int opened; |
89 | int polled; /* open mode */ | 90 | int polled; /* open mode */ |
90 | struct platform_device *platform_dev; | 91 | struct platform_device *platform_dev; |
@@ -104,7 +105,7 @@ static LIST_HEAD(pmac_i2c_busses); | |||
104 | 105 | ||
105 | struct pmac_i2c_host_kw | 106 | struct pmac_i2c_host_kw |
106 | { | 107 | { |
107 | struct semaphore mutex; /* Access mutex for use by | 108 | struct mutex mutex; /* Access mutex for use by |
108 | * i2c-keywest */ | 109 | * i2c-keywest */ |
109 | void __iomem *base; /* register base address */ | 110 | void __iomem *base; /* register base address */ |
110 | int bsteps; /* register stepping */ | 111 | int bsteps; /* register stepping */ |
@@ -375,14 +376,14 @@ static void kw_i2c_timeout(unsigned long data) | |||
375 | static int kw_i2c_open(struct pmac_i2c_bus *bus) | 376 | static int kw_i2c_open(struct pmac_i2c_bus *bus) |
376 | { | 377 | { |
377 | struct pmac_i2c_host_kw *host = bus->hostdata; | 378 | struct pmac_i2c_host_kw *host = bus->hostdata; |
378 | down(&host->mutex); | 379 | mutex_lock(&host->mutex); |
379 | return 0; | 380 | return 0; |
380 | } | 381 | } |
381 | 382 | ||
382 | static void kw_i2c_close(struct pmac_i2c_bus *bus) | 383 | static void kw_i2c_close(struct pmac_i2c_bus *bus) |
383 | { | 384 | { |
384 | struct pmac_i2c_host_kw *host = bus->hostdata; | 385 | struct pmac_i2c_host_kw *host = bus->hostdata; |
385 | up(&host->mutex); | 386 | mutex_unlock(&host->mutex); |
386 | } | 387 | } |
387 | 388 | ||
388 | static int kw_i2c_xfer(struct pmac_i2c_bus *bus, u8 addrdir, int subsize, | 389 | static int kw_i2c_xfer(struct pmac_i2c_bus *bus, u8 addrdir, int subsize, |
@@ -498,7 +499,7 @@ static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np) | |||
498 | kfree(host); | 499 | kfree(host); |
499 | return NULL; | 500 | return NULL; |
500 | } | 501 | } |
501 | init_MUTEX(&host->mutex); | 502 | mutex_init(&host->mutex); |
502 | init_completion(&host->complete); | 503 | init_completion(&host->complete); |
503 | spin_lock_init(&host->lock); | 504 | spin_lock_init(&host->lock); |
504 | init_timer(&host->timeout_timer); | 505 | init_timer(&host->timeout_timer); |
@@ -571,7 +572,7 @@ static void __init kw_i2c_add(struct pmac_i2c_host_kw *host, | |||
571 | bus->open = kw_i2c_open; | 572 | bus->open = kw_i2c_open; |
572 | bus->close = kw_i2c_close; | 573 | bus->close = kw_i2c_close; |
573 | bus->xfer = kw_i2c_xfer; | 574 | bus->xfer = kw_i2c_xfer; |
574 | init_MUTEX(&bus->sem); | 575 | mutex_init(&bus->mutex); |
575 | if (controller == busnode) | 576 | if (controller == busnode) |
576 | bus->flags = pmac_i2c_multibus; | 577 | bus->flags = pmac_i2c_multibus; |
577 | list_add(&bus->link, &pmac_i2c_busses); | 578 | list_add(&bus->link, &pmac_i2c_busses); |
@@ -798,7 +799,7 @@ static void __init pmu_i2c_probe(void) | |||
798 | bus->mode = pmac_i2c_mode_std; | 799 | bus->mode = pmac_i2c_mode_std; |
799 | bus->hostdata = bus + 1; | 800 | bus->hostdata = bus + 1; |
800 | bus->xfer = pmu_i2c_xfer; | 801 | bus->xfer = pmu_i2c_xfer; |
801 | init_MUTEX(&bus->sem); | 802 | mutex_init(&bus->mutex); |
802 | bus->flags = pmac_i2c_multibus; | 803 | bus->flags = pmac_i2c_multibus; |
803 | list_add(&bus->link, &pmac_i2c_busses); | 804 | list_add(&bus->link, &pmac_i2c_busses); |
804 | 805 | ||
@@ -921,7 +922,7 @@ static void __init smu_i2c_probe(void) | |||
921 | bus->mode = pmac_i2c_mode_std; | 922 | bus->mode = pmac_i2c_mode_std; |
922 | bus->hostdata = bus + 1; | 923 | bus->hostdata = bus + 1; |
923 | bus->xfer = smu_i2c_xfer; | 924 | bus->xfer = smu_i2c_xfer; |
924 | init_MUTEX(&bus->sem); | 925 | mutex_init(&bus->mutex); |
925 | bus->flags = 0; | 926 | bus->flags = 0; |
926 | list_add(&bus->link, &pmac_i2c_busses); | 927 | list_add(&bus->link, &pmac_i2c_busses); |
927 | 928 | ||
@@ -1093,13 +1094,13 @@ int pmac_i2c_open(struct pmac_i2c_bus *bus, int polled) | |||
1093 | { | 1094 | { |
1094 | int rc; | 1095 | int rc; |
1095 | 1096 | ||
1096 | down(&bus->sem); | 1097 | mutex_lock(&bus->mutex); |
1097 | bus->polled = polled || pmac_i2c_force_poll; | 1098 | bus->polled = polled || pmac_i2c_force_poll; |
1098 | bus->opened = 1; | 1099 | bus->opened = 1; |
1099 | bus->mode = pmac_i2c_mode_std; | 1100 | bus->mode = pmac_i2c_mode_std; |
1100 | if (bus->open && (rc = bus->open(bus)) != 0) { | 1101 | if (bus->open && (rc = bus->open(bus)) != 0) { |
1101 | bus->opened = 0; | 1102 | bus->opened = 0; |
1102 | up(&bus->sem); | 1103 | mutex_unlock(&bus->mutex); |
1103 | return rc; | 1104 | return rc; |
1104 | } | 1105 | } |
1105 | return 0; | 1106 | return 0; |
@@ -1112,7 +1113,7 @@ void pmac_i2c_close(struct pmac_i2c_bus *bus) | |||
1112 | if (bus->close) | 1113 | if (bus->close) |
1113 | bus->close(bus); | 1114 | bus->close(bus); |
1114 | bus->opened = 0; | 1115 | bus->opened = 0; |
1115 | up(&bus->sem); | 1116 | mutex_unlock(&bus->mutex); |
1116 | } | 1117 | } |
1117 | EXPORT_SYMBOL_GPL(pmac_i2c_close); | 1118 | EXPORT_SYMBOL_GPL(pmac_i2c_close); |
1118 | 1119 | ||
diff --git a/arch/powerpc/platforms/powermac/pci.c b/arch/powerpc/platforms/powermac/pci.c index c4af9e21ac93..92586db19754 100644 --- a/arch/powerpc/platforms/powermac/pci.c +++ b/arch/powerpc/platforms/powermac/pci.c | |||
@@ -35,8 +35,6 @@ | |||
35 | #define DBG(x...) | 35 | #define DBG(x...) |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | static int add_bridge(struct device_node *dev); | ||
39 | |||
40 | /* XXX Could be per-controller, but I don't think we risk anything by | 38 | /* XXX Could be per-controller, but I don't think we risk anything by |
41 | * assuming we won't have both UniNorth and Bandit */ | 39 | * assuming we won't have both UniNorth and Bandit */ |
42 | static int has_uninorth; | 40 | static int has_uninorth; |
@@ -897,7 +895,7 @@ static void __init setup_u3_ht(struct pci_controller* hose) | |||
897 | * "pci" (a MPC106) and no bandit or chaos bridges, and contrariwise, | 895 | * "pci" (a MPC106) and no bandit or chaos bridges, and contrariwise, |
898 | * if we have one or more bandit or chaos bridges, we don't have a MPC106. | 896 | * if we have one or more bandit or chaos bridges, we don't have a MPC106. |
899 | */ | 897 | */ |
900 | static int __init add_bridge(struct device_node *dev) | 898 | static int __init pmac_add_bridge(struct device_node *dev) |
901 | { | 899 | { |
902 | int len; | 900 | int len; |
903 | struct pci_controller *hose; | 901 | struct pci_controller *hose; |
@@ -918,15 +916,9 @@ static int __init add_bridge(struct device_node *dev) | |||
918 | " bus 0\n", dev->full_name); | 916 | " bus 0\n", dev->full_name); |
919 | } | 917 | } |
920 | 918 | ||
921 | /* XXX Different prototypes, to be merged */ | ||
922 | #ifdef CONFIG_PPC64 | ||
923 | hose = pcibios_alloc_controller(dev); | 919 | hose = pcibios_alloc_controller(dev); |
924 | #else | ||
925 | hose = pcibios_alloc_controller(); | ||
926 | #endif | ||
927 | if (!hose) | 920 | if (!hose) |
928 | return -ENOMEM; | 921 | return -ENOMEM; |
929 | hose->arch_data = dev; | ||
930 | hose->first_busno = bus_range ? bus_range[0] : 0; | 922 | hose->first_busno = bus_range ? bus_range[0] : 0; |
931 | hose->last_busno = bus_range ? bus_range[1] : 0xff; | 923 | hose->last_busno = bus_range ? bus_range[1] : 0xff; |
932 | 924 | ||
@@ -1006,19 +998,6 @@ void __devinit pmac_pci_irq_fixup(struct pci_dev *dev) | |||
1006 | #endif /* CONFIG_PPC32 */ | 998 | #endif /* CONFIG_PPC32 */ |
1007 | } | 999 | } |
1008 | 1000 | ||
1009 | #ifdef CONFIG_PPC64 | ||
1010 | static void __init pmac_fixup_phb_resources(void) | ||
1011 | { | ||
1012 | struct pci_controller *hose, *tmp; | ||
1013 | |||
1014 | list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { | ||
1015 | printk(KERN_INFO "PCI Host %d, io start: %lx; io end: %lx\n", | ||
1016 | hose->global_number, | ||
1017 | hose->io_resource.start, hose->io_resource.end); | ||
1018 | } | ||
1019 | } | ||
1020 | #endif | ||
1021 | |||
1022 | void __init pmac_pci_init(void) | 1001 | void __init pmac_pci_init(void) |
1023 | { | 1002 | { |
1024 | struct device_node *np, *root; | 1003 | struct device_node *np, *root; |
@@ -1036,7 +1015,7 @@ void __init pmac_pci_init(void) | |||
1036 | if (strcmp(np->name, "bandit") == 0 | 1015 | if (strcmp(np->name, "bandit") == 0 |
1037 | || strcmp(np->name, "chaos") == 0 | 1016 | || strcmp(np->name, "chaos") == 0 |
1038 | || strcmp(np->name, "pci") == 0) { | 1017 | || strcmp(np->name, "pci") == 0) { |
1039 | if (add_bridge(np) == 0) | 1018 | if (pmac_add_bridge(np) == 0) |
1040 | of_node_get(np); | 1019 | of_node_get(np); |
1041 | } | 1020 | } |
1042 | if (strcmp(np->name, "ht") == 0) { | 1021 | if (strcmp(np->name, "ht") == 0) { |
@@ -1050,28 +1029,9 @@ void __init pmac_pci_init(void) | |||
1050 | /* Probe HT last as it relies on the agp resources to be already | 1029 | /* Probe HT last as it relies on the agp resources to be already |
1051 | * setup | 1030 | * setup |
1052 | */ | 1031 | */ |
1053 | if (ht && add_bridge(ht) != 0) | 1032 | if (ht && pmac_add_bridge(ht) != 0) |
1054 | of_node_put(ht); | 1033 | of_node_put(ht); |
1055 | 1034 | ||
1056 | /* | ||
1057 | * We need to call pci_setup_phb_io for the HT bridge first | ||
1058 | * so it gets the I/O port numbers starting at 0, and we | ||
1059 | * need to call it for the AGP bridge after that so it gets | ||
1060 | * small positive I/O port numbers. | ||
1061 | */ | ||
1062 | if (u3_ht) | ||
1063 | pci_setup_phb_io(u3_ht, 1); | ||
1064 | if (u3_agp) | ||
1065 | pci_setup_phb_io(u3_agp, 0); | ||
1066 | if (u4_pcie) | ||
1067 | pci_setup_phb_io(u4_pcie, 0); | ||
1068 | |||
1069 | /* | ||
1070 | * On ppc64, fixup the IO resources on our host bridges as | ||
1071 | * the common code does it only for children of the host bridges | ||
1072 | */ | ||
1073 | pmac_fixup_phb_resources(); | ||
1074 | |||
1075 | /* Setup the linkage between OF nodes and PHBs */ | 1035 | /* Setup the linkage between OF nodes and PHBs */ |
1076 | pci_devs_phb_init(); | 1036 | pci_devs_phb_init(); |
1077 | 1037 | ||