Commit 5393f780 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc

* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (29 commits)
  powerpc/83xx: Move mcu_mpc8349emitx driver out of drivers/i2c/chips/
  powerpc/83xx: Make serial ports work on MPC8315E-RDB w/ FSL U-Boots
  powerpc/e500mc: Doorbells need to be taken w/exceptions disabled
  powerpc: Enable PS3 options and QPACE in ppc64_defconfig
  powerpc/powermac: Fix occasional SMP boot failure
  powerpc/cacheinfo: Rename cache_dir per-cpu variable
  hvc_console: Use kzalloc() instead of kmalloc() + memset()
  hvc_console: Do not set low_latency when using interrupts
  hvc_console: Call free_irq() only if request_irq() was successful
  hvc_console: Change an mb() to smp_mb() and add some comments
  powerpc: Cleanup from l64 to ll64 change: drivers/net
  powerpc: Cleanup from l64 to ll64 change: drivers/char
  powerpc: Cleanup from l64 to ll64 change: arch code
  powerpc: Change u64/s64 to a long long integer type
  powerpc/kexec: Check crash_base for relocatable kernel
  powerpc: Make dummy section a valid note header
  Xilinx: SPI: updated driver for device tree
  drivers/of: Add the of_find_i2c_device_by_node function.
  powerpc/xsysace: add compatible string for non-ipcore instance
  powerpc/mpc52xx: remove dead code from GPIO driver
  ...
parents bca26856 ea0105ea
...@@ -255,7 +255,7 @@ serial0: serial@4500 { ...@@ -255,7 +255,7 @@ serial0: serial@4500 {
device_type = "serial"; device_type = "serial";
compatible = "ns16550"; compatible = "ns16550";
reg = <0x4500 0x100>; reg = <0x4500 0x100>;
clock-frequency = <0>; clock-frequency = <133333333>;
interrupts = <9 0x8>; interrupts = <9 0x8>;
interrupt-parent = <&ipic>; interrupt-parent = <&ipic>;
}; };
...@@ -265,7 +265,7 @@ serial1: serial@4600 { ...@@ -265,7 +265,7 @@ serial1: serial@4600 {
device_type = "serial"; device_type = "serial";
compatible = "ns16550"; compatible = "ns16550";
reg = <0x4600 0x100>; reg = <0x4600 0x100>;
clock-frequency = <0>; clock-frequency = <133333333>;
interrupts = <10 0x8>; interrupts = <10 0x8>;
interrupt-parent = <&ipic>; interrupt-parent = <&ipic>;
}; };
......
...@@ -313,7 +313,7 @@ pci1: pcie@e0009000 { ...@@ -313,7 +313,7 @@ pci1: pcie@e0009000 {
0x1000000 0x0 0x0 0xe1010000 0x0 0x10000>; 0x1000000 0x0 0x0 0xe1010000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <26 2>; interrupts = <25 2>;
interrupt-map-mask = <0xf800 0x0 0x0 0x7>; interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
interrupt-map = < interrupt-map = <
/* IDSEL 0x0 */ /* IDSEL 0x0 */
...@@ -350,7 +350,7 @@ pci2: pcie@e000a000 { ...@@ -350,7 +350,7 @@ pci2: pcie@e000a000 {
0x1000000 0x0 0x0 0xe1020000 0x0 0x10000>; 0x1000000 0x0 0x0 0xe1020000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <25 2>; interrupts = <26 2>;
interrupt-map-mask = <0xf800 0x0 0x0 0x7>; interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
interrupt-map = < interrupt-map = <
/* IDSEL 0x0 */ /* IDSEL 0x0 */
......
...@@ -724,7 +724,7 @@ pci1: pcie@ffe09000 { ...@@ -724,7 +724,7 @@ pci1: pcie@ffe09000 {
0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x00010000>; 0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x00010000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <26 2>; interrupts = <25 2>;
interrupt-map-mask = <0xf800 0x0 0x0 0x7>; interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
interrupt-map = < interrupt-map = <
/* IDSEL 0x0 */ /* IDSEL 0x0 */
...@@ -761,7 +761,7 @@ pci2: pcie@ffe0a000 { ...@@ -761,7 +761,7 @@ pci2: pcie@ffe0a000 {
0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x00010000>; 0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x00010000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <27 2>; interrupts = <26 2>;
interrupt-map-mask = <0xf800 0x0 0x0 0x7>; interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
interrupt-map = < interrupt-map = <
/* IDSEL 0x0 */ /* IDSEL 0x0 */
......
...@@ -457,7 +457,7 @@ pci1: pcie@ffe09000 { ...@@ -457,7 +457,7 @@ pci1: pcie@ffe09000 {
0x1000000 0x0 0x0 0xffc10000 0x0 0x10000>; 0x1000000 0x0 0x0 0xffc10000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <26 2>; interrupts = <25 2>;
interrupt-map-mask = <0xf800 0x0 0x0 0x7>; interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
interrupt-map = < interrupt-map = <
/* IDSEL 0x0 */ /* IDSEL 0x0 */
......
...@@ -208,7 +208,7 @@ pci2: pcie@ffe0a000 { ...@@ -208,7 +208,7 @@ pci2: pcie@ffe0a000 {
0x1000000 0x0 0x0 0xffc20000 0x0 0x10000>; 0x1000000 0x0 0x0 0xffc20000 0x0 0x10000>;
clock-frequency = <33333333>; clock-frequency = <33333333>;
interrupt-parent = <&mpic>; interrupt-parent = <&mpic>;
interrupts = <27 2>; interrupts = <26 2>;
interrupt-map-mask = <0xf800 0x0 0x0 0x7>; interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
interrupt-map = < interrupt-map = <
/* IDSEL 0x0 */ /* IDSEL 0x0 */
......
...@@ -211,11 +211,28 @@ CONFIG_PPC_PASEMI=y ...@@ -211,11 +211,28 @@ CONFIG_PPC_PASEMI=y
CONFIG_PPC_PASEMI_IOMMU=y CONFIG_PPC_PASEMI_IOMMU=y
# CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
CONFIG_PPC_PASEMI_MDIO=y CONFIG_PPC_PASEMI_MDIO=y
# CONFIG_PPC_PS3 is not set CONFIG_PPC_PS3=y
#
# PS3 Platform Options
#
# CONFIG_PS3_ADVANCED is not set
CONFIG_PS3_HTAB_SIZE=20
# CONFIG_PS3_DYNAMIC_DMA is not set
CONFIG_PS3_VUART=y
CONFIG_PS3_PS3AV=y
CONFIG_PS3_SYS_MANAGER=y
CONFIG_PS3_STORAGE=m
CONFIG_PS3_DISK=m
CONFIG_PS3_ROM=m
CONFIG_PS3_FLASH=m
CONFIG_PS3_LPM=m
CONFIG_PPC_CELL=y CONFIG_PPC_CELL=y
CONFIG_PPC_CELL_COMMON=y
CONFIG_PPC_CELL_NATIVE=y CONFIG_PPC_CELL_NATIVE=y
CONFIG_PPC_IBM_CELL_BLADE=y CONFIG_PPC_IBM_CELL_BLADE=y
CONFIG_PPC_CELLEB=y CONFIG_PPC_CELLEB=y
CONFIG_PPC_CELL_QPACE=y
# #
# Cell Broadband Engine options # Cell Broadband Engine options
...@@ -981,6 +998,9 @@ CONFIG_E1000=y ...@@ -981,6 +998,9 @@ CONFIG_E1000=y
CONFIG_TIGON3=y CONFIG_TIGON3=y
# CONFIG_BNX2 is not set # CONFIG_BNX2 is not set
CONFIG_SPIDER_NET=m CONFIG_SPIDER_NET=m
CONFIG_GELIC_NET=m
CONFIG_GELIC_WIRELESS=y
# CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE is not set
# CONFIG_QLA3XXX is not set # CONFIG_QLA3XXX is not set
# CONFIG_ATL1 is not set # CONFIG_ATL1 is not set
# CONFIG_ATL1E is not set # CONFIG_ATL1E is not set
...@@ -1370,6 +1390,8 @@ CONFIG_FB_RADEON_BACKLIGHT=y ...@@ -1370,6 +1390,8 @@ CONFIG_FB_RADEON_BACKLIGHT=y
# CONFIG_FB_PM3 is not set # CONFIG_FB_PM3 is not set
# CONFIG_FB_CARMINE is not set # CONFIG_FB_CARMINE is not set
CONFIG_FB_IBM_GXT4500=y CONFIG_FB_IBM_GXT4500=y
CONFIG_FB_PS3=m
CONFIG_FB_PS3_DEFAULT_SIZE_M=9
# CONFIG_FB_VIRTUAL is not set # CONFIG_FB_VIRTUAL is not set
# CONFIG_FB_METRONOME is not set # CONFIG_FB_METRONOME is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_BACKLIGHT_LCD_SUPPORT=y
...@@ -1492,6 +1514,8 @@ CONFIG_SND_PCI=y ...@@ -1492,6 +1514,8 @@ CONFIG_SND_PCI=y
CONFIG_SND_PPC=y CONFIG_SND_PPC=y
CONFIG_SND_POWERMAC=m CONFIG_SND_POWERMAC=m
CONFIG_SND_POWERMAC_AUTO_DRC=y CONFIG_SND_POWERMAC_AUTO_DRC=y
CONFIG_SND_PS3=m
CONFIG_SND_PS3_DEFAULT_START_DELAY=2000
CONFIG_SND_AOA=m CONFIG_SND_AOA=m
CONFIG_SND_AOA_FABRIC_LAYOUT=m CONFIG_SND_AOA_FABRIC_LAYOUT=m
CONFIG_SND_AOA_ONYX=m CONFIG_SND_AOA_ONYX=m
......
...@@ -624,7 +624,7 @@ struct ucc_slow_pram { ...@@ -624,7 +624,7 @@ struct ucc_slow_pram {
#define UCC_GETH_UCCE_RXF1 0x00000002 #define UCC_GETH_UCCE_RXF1 0x00000002
#define UCC_GETH_UCCE_RXF0 0x00000001 #define UCC_GETH_UCCE_RXF0 0x00000001
/* UPSMR, when used as a UART */ /* UCC Protocol Specific Mode Register (UPSMR), when used for UART */
#define UCC_UART_UPSMR_FLC 0x8000 #define UCC_UART_UPSMR_FLC 0x8000
#define UCC_UART_UPSMR_SL 0x4000 #define UCC_UART_UPSMR_SL 0x4000
#define UCC_UART_UPSMR_CL_MASK 0x3000 #define UCC_UART_UPSMR_CL_MASK 0x3000
...@@ -652,6 +652,23 @@ struct ucc_slow_pram { ...@@ -652,6 +652,23 @@ struct ucc_slow_pram {
#define UCC_UART_UPSMR_TPM_EVEN 0x0002 #define UCC_UART_UPSMR_TPM_EVEN 0x0002
#define UCC_UART_UPSMR_TPM_HIGH 0x0003 #define UCC_UART_UPSMR_TPM_HIGH 0x0003
/* UCC Protocol Specific Mode Register (UPSMR), when used for Ethernet */
#define UCC_GETH_UPSMR_FTFE 0x80000000
#define UCC_GETH_UPSMR_PTPE 0x40000000
#define UCC_GETH_UPSMR_ECM 0x04000000
#define UCC_GETH_UPSMR_HSE 0x02000000
#define UCC_GETH_UPSMR_PRO 0x00400000
#define UCC_GETH_UPSMR_CAP 0x00200000
#define UCC_GETH_UPSMR_RSH 0x00100000
#define UCC_GETH_UPSMR_RPM 0x00080000
#define UCC_GETH_UPSMR_R10M 0x00040000
#define UCC_GETH_UPSMR_RLPB 0x00020000
#define UCC_GETH_UPSMR_TBIM 0x00010000
#define UCC_GETH_UPSMR_RES1 0x00002000
#define UCC_GETH_UPSMR_RMM 0x00001000
#define UCC_GETH_UPSMR_CAM 0x00000400
#define UCC_GETH_UPSMR_BRO 0x00000200
/* UCC Transmit On Demand Register (UTODR) */ /* UCC Transmit On Demand Register (UTODR) */
#define UCC_SLOW_TOD 0x8000 #define UCC_SLOW_TOD 0x8000
#define UCC_FAST_TOD 0x8000 #define UCC_FAST_TOD 0x8000
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
*/ */
#define RTAS_UNKNOWN_SERVICE (-1) #define RTAS_UNKNOWN_SERVICE (-1)
#define RTAS_INSTANTIATE_MAX (1UL<<30) /* Don't instantiate rtas at/above this value */ #define RTAS_INSTANTIATE_MAX (1ULL<<30) /* Don't instantiate rtas at/above this value */
/* Buffer size for ppc_rtas system call. */ /* Buffer size for ppc_rtas system call. */
#define RTAS_RMOBUF_MAX (64 * 1024) #define RTAS_RMOBUF_MAX (64 * 1024)
......
#ifndef _ASM_POWERPC_TYPES_H #ifndef _ASM_POWERPC_TYPES_H
#define _ASM_POWERPC_TYPES_H #define _ASM_POWERPC_TYPES_H
#ifdef __powerpc64__ /*
* This is here because we used to use l64 for 64bit powerpc
* and we don't want to impact user mode with our change to ll64
* in the kernel.
*/
#if defined(__powerpc64__) && !defined(__KERNEL__)
# include <asm-generic/int-l64.h> # include <asm-generic/int-l64.h>
#else #else
# include <asm-generic/int-ll64.h> # include <asm-generic/int-ll64.h>
......
...@@ -56,6 +56,10 @@ ...@@ -56,6 +56,10 @@
#include "head_booke.h" #include "head_booke.h"
#endif #endif
#if defined(CONFIG_FSL_BOOKE)
#include "../mm/mmu_decl.h"
#endif
int main(void) int main(void)
{ {
DEFINE(THREAD, offsetof(struct task_struct, thread)); DEFINE(THREAD, offsetof(struct task_struct, thread));
...@@ -382,6 +386,9 @@ int main(void) ...@@ -382,6 +386,9 @@ int main(void)
DEFINE(PGD_T_LOG2, PGD_T_LOG2); DEFINE(PGD_T_LOG2, PGD_T_LOG2);
DEFINE(PTE_T_LOG2, PTE_T_LOG2); DEFINE(PTE_T_LOG2, PTE_T_LOG2);
#endif #endif
#ifdef CONFIG_FSL_BOOKE
DEFINE(TLBCAM_SIZE, sizeof(struct tlbcam));
#endif
#ifdef CONFIG_KVM_EXIT_TIMING #ifdef CONFIG_KVM_EXIT_TIMING
DEFINE(VCPU_TIMING_EXIT_TBU, offsetof(struct kvm_vcpu, DEFINE(VCPU_TIMING_EXIT_TBU, offsetof(struct kvm_vcpu,
......
...@@ -113,7 +113,7 @@ struct cache { ...@@ -113,7 +113,7 @@ struct cache {
struct cache *next_local; /* next cache of >= level */ struct cache *next_local; /* next cache of >= level */
}; };
static DEFINE_PER_CPU(struct cache_dir *, cache_dir); static DEFINE_PER_CPU(struct cache_dir *, cache_dir_pcpu);
/* traversal/modification of this list occurs only at cpu hotplug time; /* traversal/modification of this list occurs only at cpu hotplug time;
* access is serialized by cpu hotplug locking * access is serialized by cpu hotplug locking
...@@ -468,9 +468,9 @@ static struct cache_dir *__cpuinit cacheinfo_create_cache_dir(unsigned int cpu_i ...@@ -468,9 +468,9 @@ static struct cache_dir *__cpuinit cacheinfo_create_cache_dir(unsigned int cpu_i
cache_dir->kobj = kobj; cache_dir->kobj = kobj;
WARN_ON_ONCE(per_cpu(cache_dir, cpu_id) != NULL); WARN_ON_ONCE(per_cpu(cache_dir_pcpu, cpu_id) != NULL);
per_cpu(cache_dir, cpu_id) = cache_dir; per_cpu(cache_dir_pcpu, cpu_id) = cache_dir;
return cache_dir; return cache_dir;
err: err:
...@@ -820,13 +820,13 @@ void cacheinfo_cpu_offline(unsigned int cpu_id) ...@@ -820,13 +820,13 @@ void cacheinfo_cpu_offline(unsigned int cpu_id)
/* Prevent userspace from seeing inconsistent state - remove /* Prevent userspace from seeing inconsistent state - remove
* the sysfs hierarchy first */ * the sysfs hierarchy first */
cache_dir = per_cpu(cache_dir, cpu_id); cache_dir = per_cpu(cache_dir_pcpu, cpu_id);
/* careful, sysfs population may have failed */ /* careful, sysfs population may have failed */
if (cache_dir) if (cache_dir)
remove_cache_dir(cache_dir); remove_cache_dir(cache_dir);
per_cpu(cache_dir, cpu_id) = NULL; per_cpu(cache_dir_pcpu, cpu_id) = NULL;
/* clear the CPU's bit in its cache chain, possibly freeing /* clear the CPU's bit in its cache chain, possibly freeing
* cache objects */ * cache objects */
......
...@@ -79,10 +79,10 @@ static int dma_iommu_dma_supported(struct device *dev, u64 mask) ...@@ -79,10 +79,10 @@ static int dma_iommu_dma_supported(struct device *dev, u64 mask)
"Warning: IOMMU offset too big for device mask\n"); "Warning: IOMMU offset too big for device mask\n");
if (tbl) if (tbl)
printk(KERN_INFO printk(KERN_INFO
"mask: 0x%08lx, table offset: 0x%08lx\n", "mask: 0x%08llx, table offset: 0x%08lx\n",
mask, tbl->it_offset); mask, tbl->it_offset);
else else
printk(KERN_INFO "mask: 0x%08lx, table unavailable\n", printk(KERN_INFO "mask: 0x%08llx, table unavailable\n",
mask); mask);
return 0; return 0;
} else } else
......
...@@ -1518,6 +1518,15 @@ _GLOBAL(pmac_secondary_start) ...@@ -1518,6 +1518,15 @@ _GLOBAL(pmac_secondary_start)
/* turn on 64-bit mode */ /* turn on 64-bit mode */
bl .enable_64b_mode bl .enable_64b_mode
li r0,0
mfspr r3,SPRN_HID4
rldimi r3,r0,40,23 /* clear bit 23 (rm_ci) */
sync
mtspr SPRN_HID4,r3
isync
sync
slbia
/* get TOC pointer (real address) */ /* get TOC pointer (real address) */
bl .relative_toc bl .relative_toc
......
...@@ -389,10 +389,6 @@ skpinv: addi r6,r6,1 /* Increment */ ...@@ -389,10 +389,6 @@ skpinv: addi r6,r6,1 /* Increment */
#endif #endif
#endif #endif
mfspr r3,SPRN_TLB1CFG
andi. r3,r3,0xfff
lis r4,num_tlbcam_entries@ha
stw r3,num_tlbcam_entries@l(r4)
/* /*
* Decide what sort of machine this is and initialize the MMU. * Decide what sort of machine this is and initialize the MMU.
*/ */
...@@ -711,7 +707,7 @@ interrupt_base: ...@@ -711,7 +707,7 @@ interrupt_base:
EXCEPTION(0x2060, PerformanceMonitor, performance_monitor_exception, EXC_XFER_STD) EXCEPTION(0x2060, PerformanceMonitor, performance_monitor_exception, EXC_XFER_STD)
#ifdef CONFIG_PPC_E500MC #ifdef CONFIG_PPC_E500MC
EXCEPTION(0x2070, Doorbell, unknown_exception, EXC_XFER_EE) EXCEPTION(0x2070, Doorbell, unknown_exception, EXC_XFER_STD)
#endif #endif
/* Debug Interrupt */ /* Debug Interrupt */
...@@ -909,7 +905,7 @@ KernelSPE: ...@@ -909,7 +905,7 @@ KernelSPE:
_GLOBAL(loadcam_entry) _GLOBAL(loadcam_entry)
lis r4,TLBCAM@ha lis r4,TLBCAM@ha
addi r4,r4,TLBCAM@l addi r4,r4,TLBCAM@l
mulli r5,r3,20 mulli r5,r3,TLBCAM_SIZE
add r3,r5,r4 add r3,r5,r4
lwz r4,0(r3) lwz r4,0(r3)
mtspr SPRN_MAS0,r4 mtspr SPRN_MAS0,r4
......
...@@ -239,12 +239,12 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, ...@@ -239,12 +239,12 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
if (printk_ratelimit()) { if (printk_ratelimit()) {
printk(KERN_INFO "iommu_free: invalid entry\n"); printk(KERN_INFO "iommu_free: invalid entry\n");
printk(KERN_INFO "\tentry = 0x%lx\n", entry); printk(KERN_INFO "\tentry = 0x%lx\n", entry);
printk(KERN_INFO "\tdma_addr = 0x%lx\n", (u64)dma_addr); printk(KERN_INFO "\tdma_addr = 0x%llx\n", (u64)dma_addr);
printk(KERN_INFO "\tTable = 0x%lx\n", (u64)tbl); printk(KERN_INFO "\tTable = 0x%llx\n", (u64)tbl);
printk(KERN_INFO "\tbus# = 0x%lx\n", (u64)tbl->it_busno); printk(KERN_INFO "\tbus# = 0x%llx\n", (u64)tbl->it_busno);
printk(KERN_INFO "\tsize = 0x%lx\n", (u64)tbl->it_size); printk(KERN_INFO "\tsize = 0x%llx\n", (u64)tbl->it_size);
printk(KERN_INFO "\tstartOff = 0x%lx\n", (u64)tbl->it_offset); printk(KERN_INFO "\tstartOff = 0x%llx\n", (u64)tbl->it_offset);
printk(KERN_INFO "\tindex = 0x%lx\n", (u64)tbl->it_index); printk(KERN_INFO "\tindex = 0x%llx\n", (u64)tbl->it_index);
WARN_ON(1); WARN_ON(1);
} }
return; return;
......
...@@ -240,7 +240,7 @@ static void parse_ppp_data(struct seq_file *m) ...@@ -240,7 +240,7 @@ static void parse_ppp_data(struct seq_file *m)
if (rc) if (rc)
return; return;
seq_printf(m, "partition_entitled_capacity=%ld\n", seq_printf(m, "partition_entitled_capacity=%lld\n",
ppp_data.entitlement); ppp_data.entitlement);
seq_printf(m, "group=%d\n", ppp_data.group_num); seq_printf(m, "group=%d\n", ppp_data.group_num);
seq_printf(m, "system_active_processors=%d\n", seq_printf(m, "system_active_processors=%d\n",
...@@ -265,7 +265,7 @@ static void parse_ppp_data(struct seq_file *m) ...@@ -265,7 +265,7 @@ static void parse_ppp_data(struct seq_file *m)
ppp_data.unallocated_weight); ppp_data.unallocated_weight);
seq_printf(m, "capacity_weight=%d\n", ppp_data.weight); seq_printf(m, "capacity_weight=%d\n", ppp_data.weight);
seq_printf(m, "capped=%d\n", ppp_data.capped); seq_printf(m, "capped=%d\n", ppp_data.capped);
seq_printf(m, "unallocated_capacity=%ld\n", seq_printf(m, "unallocated_capacity=%lld\n",
ppp_data.unallocated_entitlement); ppp_data.unallocated_entitlement);
} }
...@@ -509,10 +509,10 @@ static ssize_t update_ppp(u64 *entitlement, u8 *weight) ...@@ -509,10 +509,10 @@ static ssize_t update_ppp(u64 *entitlement, u8 *weight)
} else } else
return -EINVAL; return -EINVAL;
pr_debug("%s: current_entitled = %lu, current_weight = %u\n", pr_debug("%s: current_entitled = %llu, current_weight = %u\n",
__func__, ppp_data.entitlement, ppp_data.weight); __func__, ppp_data.entitlement, ppp_data.weight);
pr_debug("%s: new_entitled = %lu, new_weight = %u\n", pr_debug("%s: new_entitled = %llu, new_weight = %u\n",
__func__, new_entitled, new_weight); __func__, new_entitled, new_weight);
retval = plpar_hcall_norets(H_SET_PPP, new_entitled, new_weight); retval = plpar_hcall_norets(H_SET_PPP, new_entitled, new_weight);
...@@ -558,7 +558,7 @@ static ssize_t update_mpp(u64 *entitlement, u8 *weight) ...@@ -558,7 +558,7 @@ static ssize_t update_mpp(u64 *entitlement, u8 *weight)
pr_debug("%s: current_entitled = %lu, current_weight = %u\n", pr_debug("%s: current_entitled = %lu, current_weight = %u\n",
__func__, mpp_data.entitled_mem, mpp_data.mem_weight); __func__, mpp_data.entitled_mem, mpp_data.mem_weight);
pr_debug("%s: new_entitled = %lu, new_weight = %u\n", pr_debug("%s: new_entitled = %llu, new_weight = %u\n",
__func__, new_entitled, new_weight); __func__, new_entitled, new_weight);
rc = plpar_hcall_norets(H_SET_MPP, new_entitled, new_weight); rc = plpar_hcall_norets(H_SET_MPP, new_entitled, new_weight);
......
...@@ -93,10 +93,35 @@ void __init reserve_crashkernel(void) ...@@ -93,10 +93,35 @@ void __init reserve_crashkernel(void)
KDUMP_KERNELBASE); KDUMP_KERNELBASE);
crashk_res.start = KDUMP_KERNELBASE; crashk_res.start = KDUMP_KERNELBASE;
#else
if (!crashk_res.start) {
/*
* unspecified address, choose a region of specified size
* can overlap with initrd (ignoring corruption when retained)
* ppc64 requires kernel and some stacks to be in first segemnt
*/
crashk_res.start = KDUMP_KERNELBASE;
}
crash_base = PAGE_ALIGN(crashk_res.start);
if (crash_base != crashk_res.start) {
printk("Crash kernel base must be aligned to 0x%lx\n",
PAGE_SIZE);
crashk_res.start = crash_base;
}
#endif #endif
crash_size = PAGE_ALIGN(crash_size); crash_size = PAGE_ALIGN(crash_size);
crashk_res.end = crashk_res.start + crash_size - 1; crashk_res.end = crashk_res.start + crash_size - 1;
/* The crash region must not overlap the current kernel */
if (overlaps_crashkernel(__pa(_stext), _end - _stext)) {
printk(KERN_WARNING
"Crash kernel can not overlap current kernel\n");
crashk_res.start = crashk_res.end = 0;
return;
}
/* Crash kernel trumps memory limit */ /* Crash kernel trumps memory limit */
if (memory_limit && memory_limit <= crashk_res.end) { if (memory_limit && memory_limit <= crashk_res.end) {
memory_limit = crashk_res.end + 1; memory_limit = crashk_res.end + 1;
......
...@@ -470,7 +470,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus) ...@@ -470,7 +470,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus)
if (bus->self) { if (bus->self) {
pr_debug("IO mapping for PCI-PCI bridge %s\n", pr_debug("IO mapping for PCI-PCI bridge %s\n",
pci_name(bus->self)); pci_name(bus->self));
pr_debug(" virt=0x%016lx...0x%016lx\n", pr_debug(" virt=0x%016llx...0x%016llx\n",
bus->resource[0]->start + _IO_BASE, bus->resource[0]->start + _IO_BASE,
bus->resource[0]->end + _IO_BASE); bus->resource[0]->end + _IO_BASE);
return 0; return 0;
...@@ -502,7 +502,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus) ...@@ -502,7 +502,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus)
hose->io_base_phys - phys_page); hose->io_base_phys - phys_page);
pr_debug("IO mapping for PHB %s\n", hose->dn->full_name); pr_debug("IO mapping for PHB %s\n", hose->dn->full_name);
pr_debug(" phys=0x%016lx, virt=0x%p (alloc=0x%p)\n", pr_debug(" phys=0x%016llx, virt=0x%p (alloc=0x%p)\n",
hose->io_base_phys, hose->io_base_virt, hose->io_base_alloc); hose->io_base_phys, hose->io_base_virt, hose->io_base_alloc);
pr_debug(" size=0x%016lx (alloc=0x%016lx)\n", pr_debug(" size=0x%016lx (alloc=0x%016lx)\n",
hose->pci_io_size, size_page); hose->pci_io_size, size_page);
...@@ -517,7 +517,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus) ...@@ -517,7 +517,7 @@ int __devinit pcibios_map_io_space(struct pci_bus *bus)
hose->io_resource.start += io_virt_offset; hose->io_resource.start += io_virt_offset;
hose->io_resource.end += io_virt_offset; hose->io_resource.end += io_virt_offset;
pr_debug(" hose->io_resource=0x%016lx...0x%016lx\n", pr_debug(" hose->io_resource=0x%016llx...0x%016llx\n",
hose->io_resource.start, hose->io_resource.end); hose->io_resource.start, hose->io_resource.end);
return 0; return 0;
......
...@@ -434,8 +434,8 @@ void __init setup_system(void) ...@@ -434,8 +434,8 @@ void __init setup_system(void)
printk("Starting Linux PPC64 %s\n", init_utsname()->version); printk("Starting Linux PPC64 %s\n", init_utsname()->version);
printk("-----------------------------------------------------\n"); printk("-----------------------------------------------------\n");
printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size); printk("ppc64_pft_size = 0x%llx\n", ppc64_pft_size);
printk("physicalMemorySize = 0x%lx\n", lmb_phys_mem_size()); printk("physicalMemorySize = 0x%llx\n", lmb_phys_mem_size());
if (ppc64_caches.dline_size != 0x80) if (ppc64_caches.dline_size != 0x80)
printk("ppc64_caches.dcache_line_size = 0x%x\n", printk("ppc64_caches.dcache_line_size = 0x%x\n",
ppc64_caches.dline_size); ppc64_caches.dline_size);
...@@ -493,7 +493,7 @@ static void __init emergency_stack_init(void) ...@@ -493,7 +493,7 @@ static void __init emergency_stack_init(void)
* bringup, we need to get at them in real mode. This means they * bringup, we need to get at them in real mode. This means they
* must also be within the RMO region. * must also be within the RMO region.
*/ */
limit = min(0x10000000UL, lmb.rmo_size); limit = min(0x10000000ULL, lmb.rmo_size);
for_each_possible_cpu(i) { for_each_possible_cpu(i) {
unsigned long sp; unsigned long sp;
......
...@@ -87,7 +87,9 @@ SECTIONS ...@@ -87,7 +87,9 @@ SECTIONS
/* The dummy segment contents for the bug workaround mentioned above /* The dummy segment contents for the bug workaround mentioned above
near PHDRS. */ near PHDRS. */
.dummy : AT(ADDR(.dummy) - LOAD_OFFSET) { .dummy : AT(ADDR(.dummy) - LOAD_OFFSET) {
LONG(0xf177) LONG(0)
LONG(0)
LONG(0)
} :kernel :dummy } :kernel :dummy
/* /*
......
...@@ -56,18 +56,11 @@ ...@@ -56,18 +56,11 @@
extern void loadcam_entry(unsigned int index); extern void loadcam_entry(unsigned int index);
unsigned int tlbcam_index; unsigned int tlbcam_index;
unsigned int num_tlbcam_entries;
static unsigned long __cam0, __cam1, __cam2; static unsigned long __cam0, __cam1, __cam2;
#define NUM_TLBCAMS (16) #define NUM_TLBCAMS (16)
struct tlbcam { struct tlbcam TLBCAM[NUM_TLBCAMS];
u32 MAS0;
u32 MAS1;
u32 MAS2;
u32 MAS3;
u32 MAS7;
} TLBCAM[NUM_TLBCAMS];
struct tlbcamrange { struct tlbcamrange {
unsigned long start; unsigned long start;
......
...@@ -75,6 +75,15 @@ extern void _tlbia(void); ...@@ -75,6 +75,15 @@ extern void _tlbia(void);
#endif /* CONFIG_PPC_MMU_NOHASH */ #endif /* CONFIG_PPC_MMU_NOHASH */
#ifdef CONFIG_PPC32 #ifdef CONFIG_PPC32
struct tlbcam {
u32 MAS0;
u32 MAS1;
u32 MAS2;
u32 MAS3;
u32 MAS7;
};
extern void mapin_ram(void); extern void mapin_ram(void);
extern int map_page(unsigned long va, phys_addr_t pa, int flags); extern int map_page(unsigned long va, phys_addr_t pa, int flags);
extern void setbat(int index, unsigned long virt, phys_addr_t phys, extern void setbat(int index, unsigned long virt, phys_addr_t phys,
...@@ -90,8 +99,6 @@ extern unsigned int rtas_data, rtas_size; ...@@ -90,8 +99,6 @@ extern unsigned int rtas_data, rtas_size;
struct hash_pte; struct hash_pte;
extern struct hash_pte *Hash, *Hash_end; extern struct hash_pte *Hash, *Hash_end;
extern unsigned long Hash_size, Hash_mask; extern unsigned long Hash_size, Hash_mask;
extern unsigned int num_tlbcam_entries;
#endif #endif
extern unsigned long ioremap_bot; extern unsigned long ioremap_bot;
......
...@@ -251,8 +251,8 @@ void __init stabs_alloc(void) ...@@ -251,8 +251,8 @@ void __init stabs_alloc(void)
paca[cpu].stab_addr = newstab; paca[cpu].stab_addr = newstab;
paca[cpu].stab_real = virt_to_abs(newstab); paca[cpu].stab_real = virt_to_abs(newstab);
printk(KERN_INFO "Segment table for CPU %d at 0x%lx " printk(KERN_INFO "Segment table for CPU %d at 0x%llx "
"virtual, 0x%lx absolute\n", "virtual, 0x%llx absolute\n",
cpu, paca[cpu].stab_addr, paca[cpu].stab_real); cpu, paca[cpu].stab_addr, paca[cpu].stab_real);
} }
} }
......
...@@ -132,7 +132,7 @@ static int pa6t_reg_setup(struct op_counter_config *ctr, ...@@ -132,7 +132,7 @@ static int pa6t_reg_setup(struct op_counter_config *ctr,
for (pmc = 0; pmc < cur_cpu_spec->num_pmcs; pmc++) { for (pmc = 0; pmc < cur_cpu_spec->num_pmcs; pmc++) {
/* counters are 40 bit. Move to cputable at some point? */ /* counters are 40 bit. Move to cputable at some point? */
reset_value[pmc] = (0x1UL << 39) - ctr[pmc].count; reset_value[pmc] = (0x1UL << 39) - ctr[pmc].count;
pr_debug("reset_value for pmc%u inited to 0x%lx\n", pr_debug("reset_value for pmc%u inited to 0x%llx\n",
pmc, reset_value[pmc]); pmc, reset_value[pmc]);
} }
...@@ -177,7 +177,7 @@ static int pa6t_start(struct op_counter_config *ctr) ...@@ -177,7 +177,7 @@ static int pa6t_start(struct op_counter_config *ctr)
oprofile_running = 1; oprofile_running = 1;
pr_debug("start on cpu %d, mmcr0 %lx\n", smp_processor_id(), mmcr0); pr_debug("start on cpu %d, mmcr0 %llx\n", smp_processor_id(), mmcr0);
return 0; return 0;
} }
...@@ -193,7 +193,7 @@ static void pa6t_stop(void) ...@@ -193,7 +193,7 @@ static void pa6t_stop(void)
oprofile_running = 0; oprofile_running = 0;
pr_debug("stop on cpu %d, mmcr0 %lx\n", smp_processor_id(), mmcr0); pr_debug("stop on cpu %d, mmcr0 %llx\n", smp_processor_id(), mmcr0);
} }
/* handle the perfmon overflow vector */ /* handle the perfmon overflow vector */
......
...@@ -56,12 +56,12 @@ static struct clk *mpc5121_clk_get(struct device *dev, const char *id) ...@@ -56,12 +56,12 @@ static struct clk *mpc5121_clk_get(struct device *dev, const char *id)
int dev_match = 0; int dev_match = 0;
int id_match = 0; int id_match = 0;
if (dev == NULL && id == NULL) if (dev == NULL || id == NULL)
return NULL; return NULL;
mutex_lock(&clocks_mutex); mutex_lock(&clocks_mutex);
list_for_each_entry(p, &clocks, node) { list_for_each_entry(p, &clocks, node) {
if (dev && dev == p->dev) if (dev == p->dev)
dev_match++; dev_match++;
if (strcmp(id, p->name) == 0) if (strcmp(id, p->name) == 0)
id_match++; id_match++;
......
...@@ -363,11 +363,8 @@ static int mpc52xx_gpt_gpio_get(struct gpio_chip *gc, unsigned int gpio) ...@@ -363,11 +363,8 @@ static int mpc52xx_gpt_gpio_get(struct gpio_chip *gc, unsigned int gpio)
{ {
struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc); struct of_mm_gpio_chip *mm_gc = to_of_mm_gpio_chip(gc);
struct mpc52xx_gpt __iomem *regs = mm_gc->regs; struct mpc52xx_gpt __iomem *regs = mm_gc->regs;
unsigned int ret;
return (in_be32(&regs->status) & (1 << (31 - 23))) ? 1 : 0; return (in_be32(&regs->status) & (1 << (31 - 23))) ? 1 : 0;
return ret;
} }
static void static void
......
...@@ -196,6 +196,7 @@ static void mpc52xx_extirq_ack(unsigned int virq) ...@@ -196,6 +196,7 @@ static void mpc52xx_extirq_ack(unsigned int virq)
static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type) static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type)
{ {
struct irq_desc *desc = get_irq_desc(virq);
u32 ctrl_reg, type; u32 ctrl_reg, type;
int irq; int irq;
int l2irq; int l2irq;
...@@ -222,6 +223,11 @@ static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type) ...@@ -222,6 +223,11 @@ static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type)
type = 0; type = 0;
} }
desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
if (flow_type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW))
desc->status |= IRQ_LEVEL;
ctrl_reg = in_be32(&intr->ctrl); ctrl_reg = in_be32(&intr->ctrl);
ctrl_reg &= ~(0x3 << (22 - (l2irq * 2))); ctrl_reg &= ~(0x3 << (22 - (l2irq * 2)));
ctrl_reg |= (type << (22 - (l2irq * 2))); ctrl_reg |= (type << (22 - (l2irq * 2)));
...@@ -231,7 +237,7 @@ static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type) ...@@ -231,7 +237,7 @@ static int mpc52xx_extirq_set_type(unsigned int virq, unsigned int flow_type)
} }
static struct irq_chip mpc52xx_extirq_irqchip = { static struct irq_chip mpc52xx_extirq_irqchip = {
.typename = " MPC52xx IRQ[0-3] ", .typename = "MPC52xx External",
.mask = mpc52xx_extirq_mask, .mask = mpc52xx_extirq_mask,
.unmask = mpc52xx_extirq_unmask, .unmask = mpc52xx_extirq_unmask,
.ack = mpc52xx_extirq_ack, .ack = mpc52xx_extirq_ack,
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
# #
obj-y := misc.o usb.o obj-y := misc.o usb.o
obj-$(CONFIG_SUSPEND) += suspend.o suspend-asm.o obj-$(CONFIG_SUSPEND) += suspend.o suspend-asm.o
obj-$(CONFIG_MCU_MPC8349EMITX) += mcu_mpc8349emitx.o
obj-$(CONFIG_MPC831x_RDB) += mpc831x_rdb.o obj-$(CONFIG_MPC831x_RDB) += mpc831x_rdb.o
obj-$(CONFIG_MPC832x_RDB) += mpc832x_rdb.o obj-$(CONFIG_MPC832x_RDB) += mpc832x_rdb.o
obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds.o obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds.o
......
...@@ -323,4 +323,15 @@ config SIMPLE_GPIO ...@@ -323,4 +323,15 @@ config SIMPLE_GPIO
chip-selects, Ethernet/USB PHY's power and various other small chip-selects, Ethernet/USB PHY's power and various other small
on-board peripherals. on-board peripherals.
config MCU_MPC8349EMITX
tristate "MPC8349E-mITX MCU driver"
depends on I2C && PPC_83xx
select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
help
Say Y here to enable soft power-off functionality on the Freescale
boards with the MPC8349E-mITX-compatible MCU chips. This driver will
also register MCU GPIOs with the generic GPIO API, so you'll able
to use MCU pins as GPIOs.
endmenu endmenu
...@@ -99,7 +99,7 @@ static void beatic_end_irq(unsigned int irq_plug) ...@@ -99,7 +99,7 @@ static void beatic_end_irq(unsigned int irq_plug)
err = beat_downcount_of_interrupt(irq_plug); err = beat_downcount_of_interrupt(irq_plug);
if (err != 0) { if (err != 0) {
if ((err & 0xFFFFFFFF) != 0xFFFFFFF5) /* -11: wrong state */ if ((err & 0xFFFFFFFF) != 0xFFFFFFF5) /* -11: wrong state */
panic("Failed to downcount IRQ! Error = %16lx", err); panic("Failed to downcount IRQ! Error = %16llx", err);
printk(KERN_ERR "IRQ over-downcounted, plug %d\n", irq_plug); printk(KERN_ERR "IRQ over-downcounted, plug %d\n", irq_plug);
} }
......
...@@ -405,7 +405,7 @@ static int __init celleb_setup_epci(struct device_node *node, ...@@ -405,7 +405,7 @@ static int __init celleb_setup_epci(struct device_node *node,
hose->cfg_addr = ioremap(r.start, (r.end - r.start + 1)); hose->cfg_addr = ioremap(r.start, (r.end - r.start + 1));
if (!hose->cfg_addr) if (!hose->cfg_addr)
goto error; goto error;
pr_debug("EPCI: cfg_addr map 0x%016lx->0x%016lx + 0x%016lx\n", pr_debug("EPCI: cfg_addr map 0x%016llx->0x%016lx + 0x%016llx\n",
r.start, (unsigned long)hose->cfg_addr, (r.end - r.start + 1)); r.start, (unsigned long)hose->cfg_addr, (r.end - r.start + 1));
if (of_address_to_resource(node, 2, &r)) if (of_address_to_resource(node, 2, &r))
...@@ -413,7 +413,7 @@ static int __init celleb_setup_epci(struct device_node *node, ...@@ -413,7 +413,7 @@ static int __init celleb_setup_epci(struct device_node *node,
hose->cfg_data = ioremap(r.start, (r.end - r.start + 1)); hose->cfg_data = ioremap(r.start, (r.end - r.start + 1));
if (!hose->cfg_data) if (!hose->cfg_data)
goto error; goto error;
pr_debug("EPCI: cfg_data map 0x%016lx->0x%016lx + 0x%016lx\n", pr_debug("EPCI: cfg_data map 0x%016llx->0x%016lx + 0x%016llx\n",
r.start, (unsigned long)hose->cfg_data, (r.end - r.start + 1)); r.start, (unsigned long)hose->cfg_data, (r.end - r.start + 1));
hose->ops = &celleb_epci_ops; hose->ops = &celleb_epci_ops;
......
...@@ -855,7 +855,7 @@ static int __init cell_iommu_init_disabled(void) ...@@ -855,7 +855,7 @@ static int __init cell_iommu_init_disabled(void)
*/ */
if (np && size < lmb_end_of_DRAM()) { if (np && size < lmb_end_of_DRAM()) {
printk(KERN_WARNING "iommu: force-enabled, dma window" printk(KERN_WARNING "iommu: force-enabled, dma window"
" (%ldMB) smaller than total memory (%ldMB)\n", " (%ldMB) smaller than total memory (%lldMB)\n",
size >> 20, lmb_end_of_DRAM() >> 20); size >> 20, lmb_end_of_DRAM() >> 20);
return -ENODEV; return -ENODEV;
} }
...@@ -985,7 +985,7 @@ static void cell_dma_dev_setup_fixed(struct device *dev) ...@@ -985,7 +985,7 @@ static void cell_dma_dev_setup_fixed(struct device *dev)
addr = cell_iommu_get_fixed_address(dev) + dma_iommu_fixed_base; addr = cell_iommu_get_fixed_address(dev) + dma_iommu_fixed_base;
archdata->dma_data = (void *)addr; archdata->dma_data = (void *)addr;
dev_dbg(dev, "iommu: fixed addr = %lx\n", addr); dev_dbg(dev, "iommu: fixed addr = %llx\n", addr);
} }
static void insert_16M_pte(unsigned long addr, unsigned long *ptab, static void insert_16M_pte(unsigned long addr, unsigned long *ptab,
......
...@@ -38,16 +38,16 @@ static void dump_fir(int cpu) ...@@ -38,16 +38,16 @@ static void dump_fir(int cpu)
/* Todo: do some nicer parsing of bits and based on them go down /* Todo: do some nicer parsing of bits and based on them go down
* to other sub-units FIRs and not only IIC * to other sub-units FIRs and not only IIC
*/ */
printk(KERN_ERR "Global Checkstop FIR : 0x%016lx\n", printk(KERN_ERR "Global Checkstop FIR : 0x%016llx\n",
in_be64(&pregs->checkstop_fir)); in_be64(&pregs->checkstop_fir));
printk(KERN_ERR "Global Recoverable FIR : 0x%016lx\n", printk(KERN_ERR "Global Recoverable FIR : 0x%016llx\n",
in_be64(&pregs->checkstop_fir)); in_be64(&pregs->checkstop_fir));
printk(KERN_ERR "Global MachineCheck FIR : 0x%016lx\n", printk(KERN_ERR "Global MachineCheck FIR : 0x%016llx\n",
in_be64(&pregs->spec_att_mchk_fir)); in_be64(&pregs->spec_att_mchk_fir));
if (iregs == NULL) if (iregs == NULL)
return; return;
printk(KERN_ERR "IOC FIR : 0x%016lx\n", printk(KERN_ERR "IOC FIR : 0x%016llx\n",
in_be64(&iregs->ioc_fir)); in_be64(&iregs->ioc_fir));
} }
......
...@@ -151,7 +151,7 @@ static inline void spu_load_slb(struct spu *spu, int slbe, struct spu_slb *slb) ...@@ -151,7 +151,7 @@ static inline void spu_load_slb(struct spu *spu, int slbe, struct spu_slb *slb)
{ {
struct spu_priv2 __iomem *priv2 = spu->priv2; struct spu_priv2 __iomem *priv2 = spu->priv2;
pr_debug("%s: adding SLB[%d] 0x%016lx 0x%016lx\n", pr_debug("%s: adding SLB[%d] 0x%016llx 0x%016llx\n",
__func__, slbe, slb->vsid, slb->esid); __func__, slbe, slb->vsid, slb->esid);
out_be64(&priv2->slb_index_W, slbe); out_be64(&priv2->slb_index_W, slbe);
...@@ -221,7 +221,7 @@ static int __spu_trap_data_map(struct spu *spu, unsigned long ea, u64 dsisr) ...@@ -221,7 +221,7 @@ static int __spu_trap_data_map(struct spu *spu, unsigned long ea, u64 dsisr)
{ {
int ret; int ret;
pr_debug("%s, %lx, %lx\n", __func__, dsisr, ea); pr_debug("%s, %llx, %lx\n", __func__, dsisr, ea);
/* /*
* Handle kernel space hash faults immediately. User hash * Handle kernel space hash faults immediately. User hash
......
...@@ -54,7 +54,7 @@ long spu_sys_callback(struct spu_syscall_block *s) ...@@ -54,7 +54,7 @@ long spu_sys_callback(struct spu_syscall_block *s)
long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6); long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6);
if (s->nr_ret >= ARRAY_SIZE(spu_syscall_table)) { if (s->nr_ret >= ARRAY_SIZE(spu_syscall_table)) {
pr_debug("%s: invalid syscall #%ld", __func__, s->nr_ret); pr_debug("%s: invalid syscall #%lld", __func__, s->nr_ret);
return -ENOSYS; return -ENOSYS;
} }
......
...@@ -42,7 +42,7 @@ static ssize_t do_coredump_read(int num, struct spu_context *ctx, void *buffer, ...@@ -42,7 +42,7 @@ static ssize_t do_coredump_read(int num, struct spu_context *ctx, void *buffer,
return spufs_coredump_read[num].read(ctx, buffer, size, off); return spufs_coredump_read[num].read(ctx, buffer, size, off);
data = spufs_coredump_read[num].get(ctx); data = spufs_coredump_read[num].get(ctx);
ret = snprintf(buffer, size, "0x%.16lx", data); ret = snprintf(buffer, size, "0x%.16llx", data);
if (ret >= size) if (ret >= size)
return size; return size;
return ++ret; /* count trailing NULL */ return ++ret; /* count trailing NULL */
......
...@@ -132,7 +132,7 @@ int spufs_handle_class1(struct spu_context *ctx) ...@@ -132,7 +132,7 @@ int spufs_handle_class1(struct spu_context *ctx)
spuctx_switch_state(ctx, SPU_UTIL_IOWAIT); spuctx_switch_state(ctx, SPU_UTIL_IOWAIT);
pr_debug("ctx %p: ea %016lx, dsisr %016lx state %d\n", ctx, ea, pr_debug("ctx %p: ea %016llx, dsisr %016llx state %d\n", ctx, ea,
dsisr, ctx->state); dsisr, ctx->state);
ctx->stats.hash_flt++; ctx->stats.hash_flt++;
......
...@@ -1654,7 +1654,7 @@ static ssize_t spufs_mfc_read(struct file *file, char __user *buffer, ...@@ -1654,7 +1654,7 @@ static ssize_t spufs_mfc_read(struct file *file, char __user *buffer,
static int spufs_check_valid_dma(struct mfc_dma_command *cmd) static int spufs_check_valid_dma(struct mfc_dma_command *cmd)
{ {
pr_debug("queueing DMA %x %lx %x %x %x\n", cmd->lsa, pr_debug("queueing DMA %x %llx %x %x %x\n", cmd->lsa,
cmd->ea, cmd->size, cmd->tag, cmd->cmd); cmd->ea, cmd->size, cmd->tag, cmd->cmd);
switch (cmd->cmd) { switch (cmd->cmd) {
...@@ -1671,7 +1671,7 @@ static int spufs_check_valid_dma(struct mfc_dma_command *cmd) ...@@ -1671,7 +1671,7 @@ static int spufs_check_valid_dma(struct mfc_dma_command *cmd)
} }
if ((cmd->lsa & 0xf) != (cmd->ea &0xf)) { if ((cmd->lsa & 0xf) != (cmd->ea &0xf)) {
pr_debug("invalid DMA alignment, ea %lx lsa %x\n", pr_debug("invalid DMA alignment, ea %llx lsa %x\n",
cmd->ea, cmd->lsa); cmd->ea, cmd->lsa);
return -EIO; return -EIO;
} }
...@@ -2633,7 +2633,7 @@ static int spufs_show_ctx(struct seq_file *s, void *private) ...@@ -2633,7 +2633,7 @@ static int spufs_show_ctx(struct seq_file *s, void *private)
} }
seq_printf(s, "%c flgs(%lx) sflgs(%lx) pri(%d) ts(%d) spu(%02d)" seq_printf(s, "%c flgs(%lx) sflgs(%lx) pri(%d) ts(%d) spu(%02d)"
" %c %lx %lx %lx %lx %x %x\n", " %c %llx %llx %llx %llx %x %x\n",
ctx->state == SPU_STATE_SAVED ? 'S' : 'R', ctx->state == SPU_STATE_SAVED ? 'S' : 'R',
ctx->flags, ctx->flags,
ctx->sched_flags, ctx->sched_flags,
......
...@@ -249,6 +249,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288); ...@@ -249,6 +249,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229); DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x5249, quirk_final_uli5249); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x5249, quirk_final_uli5249);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x1575, quirk_final_uli1575); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x1575, quirk_final_uli1575);
DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229);
static void __devinit hpcd_quirk_uli1575(struct pci_dev *dev) static void __devinit hpcd_quirk_uli1575(struct pci_dev *dev)
{ {
......
...@@ -66,7 +66,7 @@ static int tce_build_iSeries(struct iommu_table *tbl, long index, long npages, ...@@ -66,7 +66,7 @@ static int tce_build_iSeries(struct iommu_table *tbl, long index, long npages,
rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, tce); rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, tce);
if (rc) if (rc)
panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%llx\n",
rc); rc);
index++; index++;
uaddr += TCE_PAGE_SIZE; uaddr += TCE_PAGE_SIZE;
...@@ -81,7 +81,7 @@ static void tce_free_iSeries(struct iommu_table *tbl, long index, long npages) ...@@ -81,7 +81,7 @@ static void tce_free_iSeries(struct iommu_table *tbl, long index, long npages)
while (npages--) { while (npages--) {
rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, 0); rc = HvCallXm_setTce((u64)tbl->it_index, (u64)index, 0);
if (rc) if (rc)
panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%llx\n",
rc); rc);
index++; index++;
} }
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
#include <asm/pmac_low_i2c.h> #include <asm/pmac_low_i2c.h>
#include <asm/pmac_pfunc.h> #include <asm/pmac_pfunc.h>
#define DEBUG #undef DEBUG
#ifdef DEBUG #ifdef DEBUG
#define DBG(fmt...) udbg_printf(fmt) #define DBG(fmt...) udbg_printf(fmt)
......
...@@ -127,10 +127,10 @@ static int tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum, ...@@ -127,10 +127,10 @@ static int tce_build_pSeriesLP(struct iommu_table *tbl, long tcenum,
} }
if (rc && printk_ratelimit()) { if (rc && printk_ratelimit()) {
printk("tce_build_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); printk("tce_build_pSeriesLP: plpar_tce_put failed. rc=%lld\n", rc);
printk("\tindex = 0x%lx\n", (u64)tbl->it_index); printk("\tindex = 0x%llx\n", (u64)tbl->it_index);
printk("\ttcenum = 0x%lx\n", (u64)tcenum); printk("\ttcenum = 0x%llx\n", (u64)tcenum);
printk("\ttce val = 0x%lx\n", tce ); printk("\ttce val = 0x%llx\n", tce );
show_stack(current, (unsigned long *)__get_SP()); show_stack(current, (unsigned long *)__get_SP());
} }
...@@ -210,10 +210,10 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, ...@@ -210,10 +210,10 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum,
} }
if (rc && printk_ratelimit()) { if (rc && printk_ratelimit()) {
printk("tce_buildmulti_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); printk("tce_buildmulti_pSeriesLP: plpar_tce_put failed. rc=%lld\n", rc);
printk("\tindex = 0x%lx\n", (u64)tbl->it_index); printk("\tindex = 0x%llx\n", (u64)tbl->it_index);
printk("\tnpages = 0x%lx\n", (u64)npages); printk("\tnpages = 0x%llx\n", (u64)npages);
printk("\ttce[0] val = 0x%lx\n", tcep[0]); printk("\ttce[0] val = 0x%llx\n", tcep[0]);
show_stack(current, (unsigned long *)__get_SP()); show_stack(current, (unsigned long *)__get_SP());
} }
return ret; return ret;
...@@ -227,9 +227,9 @@ static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages ...@@ -227,9 +227,9 @@ static void tce_free_pSeriesLP(struct iommu_table *tbl, long tcenum, long npages
rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, 0); rc = plpar_tce_put((u64)tbl->it_index, (u64)tcenum << 12, 0);
if (rc && printk_ratelimit()) { if (rc && printk_ratelimit()) {
printk("tce_free_pSeriesLP: plpar_tce_put failed. rc=%ld\n", rc); printk("tce_free_pSeriesLP: plpar_tce_put failed. rc=%lld\n", rc);
printk("\tindex = 0x%lx\n", (u64)tbl->it_index); printk("\tindex = 0x%llx\n", (u64)tbl->it_index);
printk("\ttcenum = 0x%lx\n", (u64)tcenum); printk("\ttcenum = 0x%llx\n", (u64)tcenum);
show_stack(current, (unsigned long *)__get_SP()); show_stack(current, (unsigned long *)__get_SP());
} }
...@@ -246,9 +246,9 @@ static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long n ...@@ -246,9 +246,9 @@ static void tce_freemulti_pSeriesLP(struct iommu_table *tbl, long tcenum, long n
if (rc && printk_ratelimit()) { if (rc && printk_ratelimit()) {
printk("tce_freemulti_pSeriesLP: plpar_tce_stuff failed\n"); printk("tce_freemulti_pSeriesLP: plpar_tce_stuff failed\n");
printk("\trc = %ld\n", rc); printk("\trc = %lld\n", rc);
printk("\tindex = 0x%lx\n", (u64)tbl->it_index); printk("\tindex = 0x%llx\n", (u64)tbl->it_index);
printk("\tnpages = 0x%lx\n", (u64)npages); printk("\tnpages = 0x%llx\n", (u64)npages);
show_stack(current, (unsigned long *)__get_SP()); show_stack(current, (unsigned long *)__get_SP());
} }
} }
...@@ -261,10 +261,9 @@ static unsigned long tce_get_pSeriesLP(struct iommu_table *tbl, long tcenum) ...@@ -261,10 +261,9 @@ static unsigned long tce_get_pSeriesLP(struct iommu_table *tbl, long tcenum)
rc = plpar_tce_get((u64)tbl->it_index, (u64)tcenum << 12, &tce_ret); rc = plpar_tce_get((u64)tbl->it_index, (u64)tcenum << 12, &tce_ret);
if (rc && printk_ratelimit()) { if (rc && printk_ratelimit()) {
printk("tce_get_pSeriesLP: plpar_tce_get failed. rc=%ld\n", printk("tce_get_pSeriesLP: plpar_tce_get failed. rc=%lld\n", rc);
rc); printk("\tindex = 0x%llx\n", (u64)tbl->it_index);
printk("\tindex = 0x%lx\n", (u64)tbl->it_index); printk("\ttcenum = 0x%llx\n", (u64)tcenum);
printk("\ttcenum = 0x%lx\n", (u64)tcenum);
show_stack(current, (unsigned long *)__get_SP()); show_stack(current, (unsigned long *)__get_SP());
} }
......
...@@ -28,63 +28,104 @@ ...@@ -28,63 +28,104 @@
#include <sysdev/fsl_pci.h> #include <sysdev/fsl_pci.h>
#if defined(CONFIG_PPC_85xx) || defined(CONFIG_PPC_86xx) #if defined(CONFIG_PPC_85xx) || defined(CONFIG_PPC_86xx)
static int __init setup_one_atmu(struct ccsr_pci __iomem *pci,
unsigned int index, const struct resource *res,
resource_size_t offset)
{
resource_size_t pci_addr = res->start - offset;
resource_size_t phys_addr = res->start;
resource_size_t size = res->end - res->start + 1;
u32 flags = 0x80044000; /* enable & mem R/W */
unsigned int i;
pr_debug("PCI MEM resource start 0x%016llx, size 0x%016llx.\n",
(u64)res->start, (u64)size);
if (res->flags & IORESOURCE_PREFETCH)
flags |= 0x10000000; /* enable relaxed ordering */
for (i = 0; size > 0; i++) {
unsigned int bits = min(__ilog2(size),
__ffs(pci_addr | phys_addr));
if (index + i >= 5)
return -1;
out_be32(&pci->pow[index + i].potar, pci_addr >> 12);
out_be32(&pci->pow[index + i].potear, (u64)pci_addr >> 44);
out_be32(&pci->pow[index + i].powbar, phys_addr >> 12);
out_be32(&pci->pow[index + i].powar, flags | (bits - 1));
pci_addr += (resource_size_t)1U << bits;
phys_addr += (resource_size_t)1U << bits;
size -= (resource_size_t)1U << bits;
}
return i;
}
/* atmu setup for fsl pci/pcie controller */ /* atmu setup for fsl pci/pcie controller */
static void __init setup_pci_atmu(struct pci_controller *hose, static void __init setup_pci_atmu(struct pci_controller *hose,
struct resource *rsrc) struct resource *rsrc)
{ {
struct ccsr_pci __iomem *pci; struct ccsr_pci __iomem *pci;
int i; int i, j, n;
pr_debug("PCI memory map start 0x%016llx, size 0x%016llx\n", pr_debug("PCI memory map start 0x%016llx, size 0x%016llx\n",
(u64)rsrc->start, (u64)rsrc->end - (u64)rsrc->start + 1); (u64)rsrc->start, (u64)rsrc->end - (u64)rsrc->start + 1);
pci = ioremap(rsrc->start, rsrc->end - rsrc->start + 1); pci = ioremap(rsrc->start, rsrc->end - rsrc->start + 1);
if (!pci) {
dev_err(hose->parent, "Unable to map ATMU registers\n");
return;
}
/* Disable all windows (except powar0 since its ignored) */ /* Disable all windows (except powar0 since it's ignored) */
for(i = 1; i < 5; i++) for(i = 1; i < 5; i++)
out_be32(&pci->pow[i].powar, 0); out_be32(&pci->pow[i].powar, 0);
for(i = 0; i < 3; i++) for(i = 0; i < 3; i++)
out_be32(&pci->piw[i].piwar, 0); out_be32(&pci->piw[i].piwar, 0);
/* Setup outbound MEM window */ /* Setup outbound MEM window */
for(i = 0; i < 3; i++) for(i = 0, j = 1; i < 3; i++) {
if (hose->mem_resources[i].flags & IORESOURCE_MEM){ if (!(hose->mem_resources[i].flags & IORESOURCE_MEM))
resource_size_t pci_addr_start = continue;
hose->mem_resources[i].start -
hose->pci_mem_offset; n = setup_one_atmu(pci, j, &hose->mem_resources[i],
pr_debug("PCI MEM resource start 0x%016llx, size 0x%016llx.\n", hose->pci_mem_offset);
(u64)hose->mem_resources[i].start,
(u64)hose->mem_resources[i].end if (n < 0 || j >= 5) {
- (u64)hose->mem_resources[i].start + 1); pr_err("Ran out of outbound PCI ATMUs for resource %d!\n", i);
out_be32(&pci->pow[i+1].potar, (pci_addr_start >> 12)); hose->mem_resources[i].flags |= IORESOURCE_DISABLED;
out_be32(&pci->pow[i+1].potear, 0); } else
out_be32(&pci->pow[i+1].powbar, j += n;
(hose->mem_resources[i].start >> 12));
/* Enable, Mem R/W */
out_be32(&pci->pow[i+1].powar, 0x80044000
| (__ilog2(hose->mem_resources[i].end
- hose->mem_resources[i].start + 1) - 1));
} }
/* Setup outbound IO window */ /* Setup outbound IO window */
if (hose->io_resource.flags & IORESOURCE_IO){ if (hose->io_resource.flags & IORESOURCE_IO) {
if (j >= 5) {
pr_err("Ran out of outbound PCI ATMUs for IO resource\n");
} else {
pr_debug("PCI IO resource start 0x%016llx, size 0x%016llx, " pr_debug("PCI IO resource start 0x%016llx, size 0x%016llx, "
"phy base 0x%016llx.\n", "phy base 0x%016llx.\n",
(u64)hose->io_resource.start, (u64)hose->io_resource.start,
(u64)hose->io_resource.end - (u64)hose->io_resource.start + 1, (u64)hose->io_resource.end - (u64)hose->io_resource.start + 1,
(u64)hose->io_base_phys); (u64)hose->io_base_phys);
out_be32(&pci->pow[i+1].potar, (hose->io_resource.start >> 12)); out_be32(&pci->pow[j].potar, (hose->io_resource.start >> 12));
out_be32(&pci->pow[i+1].potear, 0); out_be32(&pci->pow[j].potear, 0);
out_be32(&pci->pow[i+1].powbar, (hose->io_base_phys >> 12)); out_be32(&pci->pow[j].powbar, (hose->io_base_phys >> 12));
/* Enable, IO R/W */ /* Enable, IO R/W */
out_be32(&pci->pow[i+1].powar, 0x80088000 out_be32(&pci->pow[j].powar, 0x80088000
| (__ilog2(hose->io_resource.end | (__ilog2(hose->io_resource.end
- hose->io_resource.start + 1) - 1)); - hose->io_resource.start + 1) - 1));
} }
}
/* Setup 2G inbound Memory Window @ 1 */ /* Setup 2G inbound Memory Window @ 1 */
out_be32(&pci->piw[2].pitar, 0x00000000); out_be32(&pci->piw[2].pitar, 0x00000000);
out_be32(&pci->piw[2].piwbar,0x00000000); out_be32(&pci->piw[2].piwbar,0x00000000);
out_be32(&pci->piw[2].piwar, PIWAR_2G); out_be32(&pci->piw[2].piwar, PIWAR_2G);
iounmap(pci);
} }
static void __init setup_pci_cmd(struct pci_controller *hose) static void __init setup_pci_cmd(struct pci_controller *hose)
......
...@@ -435,7 +435,7 @@ static void __init mpic_scan_ht_msi(struct mpic *mpic, u8 __iomem *devbase, ...@@ -435,7 +435,7 @@ static void __init mpic_scan_ht_msi(struct mpic *mpic, u8 __iomem *devbase,
addr = addr | ((u64)readl(base + HT_MSI_ADDR_HI) << 32); addr = addr | ((u64)readl(base + HT_MSI_ADDR_HI) << 32);
} }
printk(KERN_DEBUG "mpic: - HT:%02x.%x %s MSI mapping found @ 0x%lx\n", printk(KERN_DEBUG "mpic: - HT:%02x.%x %s MSI mapping found @ 0x%llx\n",
PCI_SLOT(devfn), PCI_FUNC(devfn), PCI_SLOT(devfn), PCI_FUNC(devfn),
flags & HT_MSI_FLAGS_ENABLE ? "enabled" : "disabled", addr); flags & HT_MSI_FLAGS_ENABLE ? "enabled" : "disabled", addr);
......
...@@ -1206,6 +1206,7 @@ static struct of_device_id ace_of_match[] __devinitdata = { ...@@ -1206,6 +1206,7 @@ static struct of_device_id ace_of_match[] __devinitdata = {
{ .compatible = "xlnx,opb-sysace-1.00.b", }, { .compatible = "xlnx,opb-sysace-1.00.b", },
{ .compatible = "xlnx,opb-sysace-1.00.c", }, { .compatible = "xlnx,opb-sysace-1.00.c", },
{ .compatible = "xlnx,xps-sysace-1.00.a", }, { .compatible = "xlnx,xps-sysace-1.00.a", },
{ .compatible = "xlnx,sysace", },
{}, {},
}; };
MODULE_DEVICE_TABLE(of, ace_of_match); MODULE_DEVICE_TABLE(of, ace_of_match);
......
...@@ -103,7 +103,7 @@ static ssize_t ...@@ -103,7 +103,7 @@ static ssize_t
bsr_len_show(struct device *dev, struct device_attribute *attr, char *buf) bsr_len_show(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct bsr_dev *bsr_dev = dev_get_drvdata(dev); struct bsr_dev *bsr_dev = dev_get_drvdata(dev);
return sprintf(buf, "%lu\n", bsr_dev->bsr_len); return sprintf(buf, "%llu\n", bsr_dev->bsr_len);
} }
static struct device_attribute bsr_dev_attrs[] = { static struct device_attribute bsr_dev_attrs[] = {
......
...@@ -318,6 +318,7 @@ static int hvc_open(struct tty_struct *tty, struct file * filp) ...@@ -318,6 +318,7 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
} /* else count == 0 */ } /* else count == 0 */
tty->driver_data = hp; tty->driver_data = hp;
if (!hp->irq_requested)
tty->low_latency = 1; /* Makes flushes to ldisc synchronous. */ tty->low_latency = 1; /* Makes flushes to ldisc synchronous. */
hp->tty = tty; hp->tty = tty;
...@@ -764,13 +765,11 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int data, ...@@ -764,13 +765,11 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int data,
return ERR_PTR(err); return ERR_PTR(err);
} }
hp = kmalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size, hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
GFP_KERNEL); GFP_KERNEL);
if (!hp) if (!hp)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
memset(hp, 0x00, sizeof(*hp));
hp->vtermno = vtermno; hp->vtermno = vtermno;
hp->data = data; hp->data = data;
hp->ops = ops; hp->ops = ops;
...@@ -876,8 +875,11 @@ static int hvc_init(void) ...@@ -876,8 +875,11 @@ static int hvc_init(void)
goto stop_thread; goto stop_thread;
} }
/* FIXME: This mb() seems completely random. Remove it. */ /*
mb(); * Make sure tty is fully registered before allowing it to be
* found by hvc_console_device.
*/
smp_mb();
hvc_driver = drv; hvc_driver = drv;
return 0; return 0;
......
...@@ -37,7 +37,7 @@ int notifier_add_irq(struct hvc_struct *hp, int irq) ...@@ -37,7 +37,7 @@ int notifier_add_irq(struct hvc_struct *hp, int irq)
void notifier_del_irq(struct hvc_struct *hp, int irq) void notifier_del_irq(struct hvc_struct *hp, int irq)
{ {
if (!irq) if (!hp->irq_requested)
return; return;
free_irq(irq, hp); free_irq(irq, hp);
hp->irq_requested = 0; hp->irq_requested = 0;
......
...@@ -139,15 +139,4 @@ config SENSORS_TSL2550 ...@@ -139,15 +139,4 @@ config SENSORS_TSL2550
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
will be called tsl2550. will be called tsl2550.
config MCU_MPC8349EMITX
tristate "MPC8349E-mITX MCU driver"
depends on I2C && PPC_83xx
select GENERIC_GPIO
select ARCH_REQUIRE_GPIOLIB
help
Say Y here to enable soft power-off functionality on the Freescale
boards with the MPC8349E-mITX-compatible MCU chips. This driver will
also register MCU GPIOs with the generic GPIO API, so you'll able
to use MCU pins as GPIOs.
endmenu endmenu
...@@ -19,7 +19,6 @@ obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o ...@@ -19,7 +19,6 @@ obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o
obj-$(CONFIG_PCF8575) += pcf8575.o obj-$(CONFIG_PCF8575) += pcf8575.o
obj-$(CONFIG_SENSORS_PCF8591) += pcf8591.o obj-$(CONFIG_SENSORS_PCF8591) += pcf8591.o
obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o
obj-$(CONFIG_MCU_MPC8349EMITX) += mcu_mpc8349emitx.o
ifeq ($(CONFIG_I2C_DEBUG_CHIP),y) ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
EXTRA_CFLAGS += -DDEBUG EXTRA_CFLAGS += -DDEBUG
......
...@@ -132,7 +132,7 @@ void ehea_dump(void *adr, int len, char *msg) ...@@ -132,7 +132,7 @@ void ehea_dump(void *adr, int len, char *msg)
int x; int x;
unsigned char *deb = adr; unsigned char *deb = adr;
for (x = 0; x < len; x += 16) { for (x = 0; x < len; x += 16) {
printk(DRV_NAME " %s adr=%p ofs=%04x %016lx %016lx\n", msg, printk(DRV_NAME " %s adr=%p ofs=%04x %016llx %016llx\n", msg,
deb, x, *((u64 *)&deb[0]), *((u64 *)&deb[8])); deb, x, *((u64 *)&deb[0]), *((u64 *)&deb[8]));
deb += 16; deb += 16;
} }
...@@ -883,7 +883,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param) ...@@ -883,7 +883,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
while (eqe) { while (eqe) {
qp_token = EHEA_BMASK_GET(EHEA_EQE_QP_TOKEN, eqe->entry); qp_token = EHEA_BMASK_GET(EHEA_EQE_QP_TOKEN, eqe->entry);
ehea_error("QP aff_err: entry=0x%lx, token=0x%x", ehea_error("QP aff_err: entry=0x%llx, token=0x%x",
eqe->entry, qp_token); eqe->entry, qp_token);
qp = port->port_res[qp_token].qp; qp = port->port_res[qp_token].qp;
...@@ -1159,7 +1159,7 @@ static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe) ...@@ -1159,7 +1159,7 @@ static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe)
netif_stop_queue(port->netdev); netif_stop_queue(port->netdev);
break; break;
default: default:
ehea_error("unknown event code %x, eqe=0x%lX", ec, eqe); ehea_error("unknown event code %x, eqe=0x%llX", ec, eqe);
break; break;
} }
} }
...@@ -1971,7 +1971,7 @@ static void ehea_set_multicast_list(struct net_device *dev) ...@@ -1971,7 +1971,7 @@ static void ehea_set_multicast_list(struct net_device *dev)
} }
if (dev->mc_count > port->adapter->max_mc_mac) { if (dev->mc_count > port->adapter->max_mc_mac) {
ehea_info("Mcast registration limit reached (0x%lx). " ehea_info("Mcast registration limit reached (0x%llx). "
"Use ALLMULTI!", "Use ALLMULTI!",
port->adapter->max_mc_mac); port->adapter->max_mc_mac);
goto out; goto out;
......
...@@ -168,7 +168,7 @@ struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter, ...@@ -168,7 +168,7 @@ struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter,
cq->fw_handle, rpage, 1); cq->fw_handle, rpage, 1);
if (hret < H_SUCCESS) { if (hret < H_SUCCESS) {
ehea_error("register_rpage_cq failed ehea_cq=%p " ehea_error("register_rpage_cq failed ehea_cq=%p "
"hret=%lx counter=%i act_pages=%i", "hret=%llx counter=%i act_pages=%i",
cq, hret, counter, cq->attr.nr_pages); cq, hret, counter, cq->attr.nr_pages);
goto out_kill_hwq; goto out_kill_hwq;
} }
...@@ -178,13 +178,13 @@ struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter, ...@@ -178,13 +178,13 @@ struct ehea_cq *ehea_create_cq(struct ehea_adapter *adapter,
if ((hret != H_SUCCESS) || (vpage)) { if ((hret != H_SUCCESS) || (vpage)) {
ehea_error("registration of pages not " ehea_error("registration of pages not "
"complete hret=%lx\n", hret); "complete hret=%llx\n", hret);
goto out_kill_hwq; goto out_kill_hwq;
} }
} else { } else {
if (hret != H_PAGE_REGISTERED) { if (hret != H_PAGE_REGISTERED) {
ehea_error("CQ: registration of page failed " ehea_error("CQ: registration of page failed "
"hret=%lx\n", hret); "hret=%llx\n", hret);
goto out_kill_hwq; goto out_kill_hwq;
} }
} }
...@@ -986,15 +986,15 @@ void print_error_data(u64 *data) ...@@ -986,15 +986,15 @@ void print_error_data(u64 *data)
length = EHEA_PAGESIZE; length = EHEA_PAGESIZE;
if (type == 0x8) /* Queue Pair */ if (type == 0x8) /* Queue Pair */
ehea_error("QP (resource=%lX) state: AER=0x%lX, AERR=0x%lX, " ehea_error("QP (resource=%llX) state: AER=0x%llX, AERR=0x%llX, "
"port=%lX", resource, data[6], data[12], data[22]); "port=%llX", resource, data[6], data[12], data[22]);
if (type == 0x4) /* Completion Queue */ if (type == 0x4) /* Completion Queue */
ehea_error("CQ (resource=%lX) state: AER=0x%lX", resource, ehea_error("CQ (resource=%llX) state: AER=0x%llX", resource,
data[6]); data[6]);
if (type == 0x3) /* Event Queue */ if (type == 0x3) /* Event Queue */
ehea_error("EQ (resource=%lX) state: AER=0x%lX", resource, ehea_error("EQ (resource=%llX) state: AER=0x%llX", resource,
data[6]); data[6]);
ehea_dump(data, length, "error data"); ehea_dump(data, length, "error data");
...@@ -1016,11 +1016,11 @@ void ehea_error_data(struct ehea_adapter *adapter, u64 res_handle) ...@@ -1016,11 +1016,11 @@ void ehea_error_data(struct ehea_adapter *adapter, u64 res_handle)
rblock); rblock);
if (ret == H_R_STATE) if (ret == H_R_STATE)
ehea_error("No error data is available: %lX.", res_handle); ehea_error("No error data is available: %llX.", res_handle);
else if (ret == H_SUCCESS) else if (ret == H_SUCCESS)
print_error_data(rblock); print_error_data(rblock);
else else
ehea_error("Error data could not be fetched: %lX", res_handle); ehea_error("Error data could not be fetched: %llX", res_handle);
kfree(rblock); kfree(rblock);
} }
...@@ -602,7 +602,7 @@ static int ibmveth_open(struct net_device *netdev) ...@@ -602,7 +602,7 @@ static int ibmveth_open(struct net_device *netdev)
if(lpar_rc != H_SUCCESS) { if(lpar_rc != H_SUCCESS) {
ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc); ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc);
ibmveth_error_printk("buffer TCE:0x%lx filter TCE:0x%lx rxq desc:0x%lx MAC:0x%lx\n", ibmveth_error_printk("buffer TCE:0x%llx filter TCE:0x%llx rxq desc:0x%llx MAC:0x%llx\n",
adapter->buffer_list_dma, adapter->buffer_list_dma,
adapter->filter_list_dma, adapter->filter_list_dma,
rxq_desc.desc, rxq_desc.desc,
...@@ -1378,13 +1378,13 @@ static int ibmveth_show(struct seq_file *seq, void *v) ...@@ -1378,13 +1378,13 @@ static int ibmveth_show(struct seq_file *seq, void *v)
seq_printf(seq, "Firmware MAC: %pM\n", firmware_mac); seq_printf(seq, "Firmware MAC: %pM\n", firmware_mac);
seq_printf(seq, "\nAdapter Statistics:\n"); seq_printf(seq, "\nAdapter Statistics:\n");
seq_printf(seq, " TX: vio_map_single failres: %ld\n", adapter->tx_map_failed); seq_printf(seq, " TX: vio_map_single failres: %lld\n", adapter->tx_map_failed);
seq_printf(seq, " send failures: %ld\n", adapter->tx_send_failed); seq_printf(seq, " send failures: %lld\n", adapter->tx_send_failed);
seq_printf(seq, " RX: replenish task cycles: %ld\n", adapter->replenish_task_cycles); seq_printf(seq, " RX: replenish task cycles: %lld\n", adapter->replenish_task_cycles);
seq_printf(seq, " alloc_skb_failures: %ld\n", adapter->replenish_no_mem); seq_printf(seq, " alloc_skb_failures: %lld\n", adapter->replenish_no_mem);
seq_printf(seq, " add buffer failures: %ld\n", adapter->replenish_add_buff_failure); seq_printf(seq, " add buffer failures: %lld\n", adapter->replenish_add_buff_failure);
seq_printf(seq, " invalid buffers: %ld\n", adapter->rx_invalid_buffer); seq_printf(seq, " invalid buffers: %lld\n", adapter->rx_invalid_buffer);
seq_printf(seq, " no buffers: %ld\n", adapter->rx_no_buffer); seq_printf(seq, " no buffers: %lld\n", adapter->rx_no_buffer);
return 0; return 0;
} }
......
...@@ -429,7 +429,7 @@ SIMPLE_PORT_ATTR(promiscuous); ...@@ -429,7 +429,7 @@ SIMPLE_PORT_ATTR(promiscuous);
SIMPLE_PORT_ATTR(num_mcast); SIMPLE_PORT_ATTR(num_mcast);
CUSTOM_PORT_ATTR(lpar_map, "0x%X\n", port->lpar_map); CUSTOM_PORT_ATTR(lpar_map, "0x%X\n", port->lpar_map);
CUSTOM_PORT_ATTR(stopped_map, "0x%X\n", port->stopped_map); CUSTOM_PORT_ATTR(stopped_map, "0x%X\n", port->stopped_map);
CUSTOM_PORT_ATTR(mac_addr, "0x%lX\n", port->mac_addr); CUSTOM_PORT_ATTR(mac_addr, "0x%llX\n", port->mac_addr);
#define GET_PORT_ATTR(_name) (&veth_port_attr_##_name.attr) #define GET_PORT_ATTR(_name) (&veth_port_attr_##_name.attr)
static struct attribute *veth_port_default_attrs[] = { static struct attribute *veth_port_default_attrs[] = {
......
...@@ -712,7 +712,7 @@ static inline void pasemi_mac_rx_error(const struct pasemi_mac *mac, ...@@ -712,7 +712,7 @@ static inline void pasemi_mac_rx_error(const struct pasemi_mac *mac,
rcmdsta = read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if)); rcmdsta = read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
ccmdsta = read_dma_reg(PAS_DMA_RXCHAN_CCMDSTA(chan->chno)); ccmdsta = read_dma_reg(PAS_DMA_RXCHAN_CCMDSTA(chan->chno));
printk(KERN_ERR "pasemi_mac: rx error. macrx %016lx, rx status %lx\n", printk(KERN_ERR "pasemi_mac: rx error. macrx %016llx, rx status %llx\n",
macrx, *chan->status); macrx, *chan->status);
printk(KERN_ERR "pasemi_mac: rcmdsta %08x ccmdsta %08x\n", printk(KERN_ERR "pasemi_mac: rcmdsta %08x ccmdsta %08x\n",
...@@ -730,8 +730,8 @@ static inline void pasemi_mac_tx_error(const struct pasemi_mac *mac, ...@@ -730,8 +730,8 @@ static inline void pasemi_mac_tx_error(const struct pasemi_mac *mac,
cmdsta = read_dma_reg(PAS_DMA_TXCHAN_TCMDSTA(chan->chno)); cmdsta = read_dma_reg(PAS_DMA_TXCHAN_TCMDSTA(chan->chno));
printk(KERN_ERR "pasemi_mac: tx error. mactx 0x%016lx, "\ printk(KERN_ERR "pasemi_mac: tx error. mactx 0x%016llx, "\
"tx status 0x%016lx\n", mactx, *chan->status); "tx status 0x%016llx\n", mactx, *chan->status);
printk(KERN_ERR "pasemi_mac: tcmdsta 0x%08x\n", cmdsta); printk(KERN_ERR "pasemi_mac: tcmdsta 0x%08x\n", cmdsta);
} }
......
...@@ -66,4 +66,23 @@ void of_register_i2c_devices(struct i2c_adapter *adap, ...@@ -66,4 +66,23 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
} }
EXPORT_SYMBOL(of_register_i2c_devices); EXPORT_SYMBOL(of_register_i2c_devices);
static int of_dev_node_match(struct device *dev, void *data)
{
return dev_archdata_get_node(&dev->archdata) == data;
}
/* must call put_device() when done with returned i2c_client device */
struct i2c_client *of_find_i2c_device_by_node(struct device_node *node)
{
struct device *dev;
dev = bus_find_device(&i2c_bus_type, NULL, node,
of_dev_node_match);
if (!dev)
return NULL;
return to_i2c_client(dev);
}
EXPORT_SYMBOL(of_find_i2c_device_by_node);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -297,7 +297,7 @@ static int __devinit electra_cf_probe(struct of_device *ofdev, ...@@ -297,7 +297,7 @@ static int __devinit electra_cf_probe(struct of_device *ofdev,
goto fail3; goto fail3;
} }
dev_info(device, "at mem 0x%lx io 0x%lx irq %d\n", dev_info(device, "at mem 0x%lx io 0x%llx irq %d\n",
cf->mem_phys, io.start, cf->irq); cf->mem_phys, io.start, cf->irq);
cf->active = 1; cf->active = 1;
......
...@@ -1061,7 +1061,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) ...@@ -1061,7 +1061,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
} }
sdev_printk(KERN_INFO, cmd->device, sdev_printk(KERN_INFO, cmd->device,
"aborting command. lun 0x%lx, tag 0x%lx\n", "aborting command. lun 0x%llx, tag 0x%llx\n",
(((u64) lun) << 48), (u64) found_evt); (((u64) lun) << 48), (u64) found_evt);
wait_for_completion(&evt->comp); wait_for_completion(&evt->comp);
...@@ -1082,7 +1082,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) ...@@ -1082,7 +1082,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
if (rsp_rc) { if (rsp_rc) {
if (printk_ratelimit()) if (printk_ratelimit())
sdev_printk(KERN_WARNING, cmd->device, sdev_printk(KERN_WARNING, cmd->device,
"abort code %d for task tag 0x%lx\n", "abort code %d for task tag 0x%llx\n",
rsp_rc, tsk_mgmt->task_tag); rsp_rc, tsk_mgmt->task_tag);
return FAILED; return FAILED;
} }
...@@ -1102,12 +1102,12 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) ...@@ -1102,12 +1102,12 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
if (found_evt == NULL) { if (found_evt == NULL) {
spin_unlock_irqrestore(hostdata->host->host_lock, flags); spin_unlock_irqrestore(hostdata->host->host_lock, flags);
sdev_printk(KERN_INFO, cmd->device, "aborted task tag 0x%lx completed\n", sdev_printk(KERN_INFO, cmd->device, "aborted task tag 0x%llx completed\n",
tsk_mgmt->task_tag); tsk_mgmt->task_tag);
return SUCCESS; return SUCCESS;
} }
sdev_printk(KERN_INFO, cmd->device, "successfully aborted task tag 0x%lx\n", sdev_printk(KERN_INFO, cmd->device, "successfully aborted task tag 0x%llx\n",
tsk_mgmt->task_tag); tsk_mgmt->task_tag);
cmd->result = (DID_ABORT << 16); cmd->result = (DID_ABORT << 16);
...@@ -1182,7 +1182,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) ...@@ -1182,7 +1182,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
return FAILED; return FAILED;
} }
sdev_printk(KERN_INFO, cmd->device, "resetting device. lun 0x%lx\n", sdev_printk(KERN_INFO, cmd->device, "resetting device. lun 0x%llx\n",
(((u64) lun) << 48)); (((u64) lun) << 48));
wait_for_completion(&evt->comp); wait_for_completion(&evt->comp);
...@@ -1203,7 +1203,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) ...@@ -1203,7 +1203,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
if (rsp_rc) { if (rsp_rc) {
if (printk_ratelimit()) if (printk_ratelimit())
sdev_printk(KERN_WARNING, cmd->device, sdev_printk(KERN_WARNING, cmd->device,
"reset code %d for task tag 0x%lx\n", "reset code %d for task tag 0x%llx\n",
rsp_rc, tsk_mgmt->task_tag); rsp_rc, tsk_mgmt->task_tag);
return FAILED; return FAILED;
} }
......
...@@ -15,12 +15,15 @@ ...@@ -15,12 +15,15 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/of_platform.h>
#include <linux/of_device.h>
#include <linux/of_spi.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/spi_bitbang.h> #include <linux/spi/spi_bitbang.h>
#include <linux/io.h> #include <linux/io.h>
#include <syslib/virtex_devices.h>
#define XILINX_SPI_NAME "xilinx_spi" #define XILINX_SPI_NAME "xilinx_spi"
/* Register definitions as per "OPB Serial Peripheral Interface (SPI) (v1.00e) /* Register definitions as per "OPB Serial Peripheral Interface (SPI) (v1.00e)
...@@ -144,23 +147,14 @@ static int xilinx_spi_setup_transfer(struct spi_device *spi, ...@@ -144,23 +147,14 @@ static int xilinx_spi_setup_transfer(struct spi_device *spi,
struct spi_transfer *t) struct spi_transfer *t)
{ {
u8 bits_per_word; u8 bits_per_word;
u32 hz;
struct xilinx_spi *xspi = spi_master_get_devdata(spi->master);
bits_per_word = (t) ? t->bits_per_word : spi->bits_per_word; bits_per_word = (t) ? t->bits_per_word : spi->bits_per_word;
hz = (t) ? t->speed_hz : spi->max_speed_hz;
if (bits_per_word != 8) { if (bits_per_word != 8) {
dev_err(&spi->dev, "%s, unsupported bits_per_word=%d\n", dev_err(&spi->dev, "%s, unsupported bits_per_word=%d\n",
__func__, bits_per_word); __func__, bits_per_word);
return -EINVAL; return -EINVAL;
} }
if (hz && xspi->speed_hz > hz) {
dev_err(&spi->dev, "%s, unsupported clock rate %uHz\n",
__func__, hz);
return -EINVAL;
}
return 0; return 0;
} }
...@@ -304,32 +298,38 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id) ...@@ -304,32 +298,38 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int __init xilinx_spi_probe(struct platform_device *dev) static int __init xilinx_spi_of_probe(struct of_device *ofdev,
const struct of_device_id *match)
{ {
int ret = 0;
struct spi_master *master; struct spi_master *master;
struct xilinx_spi *xspi; struct xilinx_spi *xspi;
struct xspi_platform_data *pdata; struct resource r_irq_struct;
struct resource *r; struct resource r_mem_struct;
struct resource *r_irq = &r_irq_struct;
struct resource *r_mem = &r_mem_struct;
int rc = 0;
const u32 *prop;
int len;
/* Get resources(memory, IRQ) associated with the device */ /* Get resources(memory, IRQ) associated with the device */
master = spi_alloc_master(&dev->dev, sizeof(struct xilinx_spi)); master = spi_alloc_master(&ofdev->dev, sizeof(struct xilinx_spi));
if (master == NULL) { if (master == NULL) {
return -ENOMEM; return -ENOMEM;
} }
platform_set_drvdata(dev, master); dev_set_drvdata(&ofdev->dev, master);
pdata = dev->dev.platform_data;
if (pdata == NULL) { rc = of_address_to_resource(ofdev->node, 0, r_mem);
ret = -ENODEV; if (rc) {
dev_warn(&ofdev->dev, "invalid address\n");
goto put_master; goto put_master;
} }
r = platform_get_resource(dev, IORESOURCE_MEM, 0); rc = of_irq_to_resource(ofdev->node, 0, r_irq);
if (r == NULL) { if (rc == NO_IRQ) {
ret = -ENODEV; dev_warn(&ofdev->dev, "no IRQ found\n");
goto put_master; goto put_master;
} }
...@@ -341,47 +341,57 @@ static int __init xilinx_spi_probe(struct platform_device *dev) ...@@ -341,47 +341,57 @@ static int __init xilinx_spi_probe(struct platform_device *dev)
xspi->bitbang.master->setup = xilinx_spi_setup; xspi->bitbang.master->setup = xilinx_spi_setup;
init_completion(&xspi->done); init_completion(&xspi->done);
if (!request_mem_region(r->start, xspi->irq = r_irq->start;
r->end - r->start + 1, XILINX_SPI_NAME)) {
ret = -ENXIO; if (!request_mem_region(r_mem->start,
r_mem->end - r_mem->start + 1, XILINX_SPI_NAME)) {
rc = -ENXIO;
dev_warn(&ofdev->dev, "memory request failure\n");
goto put_master; goto put_master;
} }
xspi->regs = ioremap(r->start, r->end - r->start + 1); xspi->regs = ioremap(r_mem->start, r_mem->end - r_mem->start + 1);
if (xspi->regs == NULL) { if (xspi->regs == NULL) {
ret = -ENOMEM; rc = -ENOMEM;
dev_warn(&ofdev->dev, "ioremap failure\n");
goto put_master; goto put_master;
} }
xspi->irq = r_irq->start;
ret = platform_get_irq(dev, 0); /* dynamic bus assignment */
if (ret < 0) { master->bus_num = -1;
ret = -ENXIO;
goto unmap_io;
}
xspi->irq = ret;
master->bus_num = pdata->bus_num; /* number of slave select bits is required */
master->num_chipselect = pdata->num_chipselect; prop = of_get_property(ofdev->node, "xlnx,num-ss-bits", &len);
xspi->speed_hz = pdata->speed_hz; if (!prop || len < sizeof(*prop)) {
dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n");
goto put_master;
}
master->num_chipselect = *prop;
/* SPI controller initializations */ /* SPI controller initializations */
xspi_init_hw(xspi->regs); xspi_init_hw(xspi->regs);
/* Register for SPI Interrupt */ /* Register for SPI Interrupt */
ret = request_irq(xspi->irq, xilinx_spi_irq, 0, XILINX_SPI_NAME, xspi); rc = request_irq(xspi->irq, xilinx_spi_irq, 0, XILINX_SPI_NAME, xspi);
if (ret != 0) if (rc != 0) {
dev_warn(&ofdev->dev, "irq request failure: %d\n", xspi->irq);
goto unmap_io; goto unmap_io;
}
ret = spi_bitbang_start(&xspi->bitbang); rc = spi_bitbang_start(&xspi->bitbang);
if (ret != 0) { if (rc != 0) {
dev_err(&dev->dev, "spi_bitbang_start FAILED\n"); dev_err(&ofdev->dev, "spi_bitbang_start FAILED\n");
goto free_irq; goto free_irq;
} }
dev_info(&dev->dev, "at 0x%08X mapped to 0x%08X, irq=%d\n", dev_info(&ofdev->dev, "at 0x%08X mapped to 0x%08X, irq=%d\n",
r->start, (u32)xspi->regs, xspi->irq); (unsigned int)r_mem->start, (u32)xspi->regs, xspi->irq);
/* Add any subnodes on the SPI bus */
of_register_spi_devices(master, ofdev->node);
return ret; return rc;
free_irq: free_irq:
free_irq(xspi->irq, xspi); free_irq(xspi->irq, xspi);
...@@ -389,21 +399,21 @@ static int __init xilinx_spi_probe(struct platform_device *dev) ...@@ -389,21 +399,21 @@ static int __init xilinx_spi_probe(struct platform_device *dev)
iounmap(xspi->regs); iounmap(xspi->regs);
put_master: put_master:
spi_master_put(master); spi_master_put(master);
return ret; return rc;
} }
static int __devexit xilinx_spi_remove(struct platform_device *dev) static int __devexit xilinx_spi_remove(struct of_device *ofdev)
{ {
struct xilinx_spi *xspi; struct xilinx_spi *xspi;
struct spi_master *master; struct spi_master *master;
master = platform_get_drvdata(dev); master = platform_get_drvdata(ofdev);
xspi = spi_master_get_devdata(master); xspi = spi_master_get_devdata(master);
spi_bitbang_stop(&xspi->bitbang); spi_bitbang_stop(&xspi->bitbang);
free_irq(xspi->irq, xspi); free_irq(xspi->irq, xspi);
iounmap(xspi->regs); iounmap(xspi->regs);
platform_set_drvdata(dev, 0); dev_set_drvdata(&ofdev->dev, 0);
spi_master_put(xspi->bitbang.master); spi_master_put(xspi->bitbang.master);
return 0; return 0;
...@@ -412,27 +422,42 @@ static int __devexit xilinx_spi_remove(struct platform_device *dev) ...@@ -412,27 +422,42 @@ static int __devexit xilinx_spi_remove(struct platform_device *dev)
/* work with hotplug and coldplug */ /* work with hotplug and coldplug */
MODULE_ALIAS("platform:" XILINX_SPI_NAME); MODULE_ALIAS("platform:" XILINX_SPI_NAME);
static struct platform_driver xilinx_spi_driver = { static int __exit xilinx_spi_of_remove(struct of_device *op)
.probe = xilinx_spi_probe, {
.remove = __devexit_p(xilinx_spi_remove), return xilinx_spi_remove(op);
}
static struct of_device_id xilinx_spi_of_match[] = {
{ .compatible = "xlnx,xps-spi-2.00.a", },
{ .compatible = "xlnx,xps-spi-2.00.b", },
{}
};
MODULE_DEVICE_TABLE(of, xilinx_spi_of_match);
static struct of_platform_driver xilinx_spi_of_driver = {
.owner = THIS_MODULE,
.name = "xilinx-xps-spi",
.match_table = xilinx_spi_of_match,
.probe = xilinx_spi_of_probe,
.remove = __exit_p(xilinx_spi_of_remove),
.driver = { .driver = {
.name = XILINX_SPI_NAME, .name = "xilinx-xps-spi",
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
}; };
static int __init xilinx_spi_init(void) static int __init xilinx_spi_init(void)
{ {
return platform_driver_register(&xilinx_spi_driver); return of_register_platform_driver(&xilinx_spi_of_driver);
} }
module_init(xilinx_spi_init); module_init(xilinx_spi_init);
static void __exit xilinx_spi_exit(void) static void __exit xilinx_spi_exit(void)
{ {
platform_driver_unregister(&xilinx_spi_driver); of_unregister_platform_driver(&xilinx_spi_of_driver);
} }
module_exit(xilinx_spi_exit); module_exit(xilinx_spi_exit);
MODULE_AUTHOR("MontaVista Software, Inc. <source@mvista.com>"); MODULE_AUTHOR("MontaVista Software, Inc. <source@mvista.com>");
MODULE_DESCRIPTION("Xilinx SPI driver"); MODULE_DESCRIPTION("Xilinx SPI driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -17,4 +17,7 @@ ...@@ -17,4 +17,7 @@
void of_register_i2c_devices(struct i2c_adapter *adap, void of_register_i2c_devices(struct i2c_adapter *adap,
struct device_node *adap_node); struct device_node *adap_node);
/* must call put_device() when done with returned i2c_client device */
struct i2c_client *of_find_i2c_device_by_node(struct device_node *node);
#endif /* __LINUX_OF_I2C_H */ #endif /* __LINUX_OF_I2C_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment