Merge master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6
This commit is contained in:
commit
05f6ece6f3
|
@ -29,9 +29,9 @@
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
|
||||||
int split_tlb;
|
int split_tlb __read_mostly;
|
||||||
int dcache_stride;
|
int dcache_stride __read_mostly;
|
||||||
int icache_stride;
|
int icache_stride __read_mostly;
|
||||||
EXPORT_SYMBOL(dcache_stride);
|
EXPORT_SYMBOL(dcache_stride);
|
||||||
|
|
||||||
|
|
||||||
|
@ -45,29 +45,29 @@ DEFINE_SPINLOCK(pa_tlb_lock);
|
||||||
EXPORT_SYMBOL(pa_tlb_lock);
|
EXPORT_SYMBOL(pa_tlb_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct pdc_cache_info cache_info;
|
struct pdc_cache_info cache_info __read_mostly;
|
||||||
#ifndef CONFIG_PA20
|
#ifndef CONFIG_PA20
|
||||||
static struct pdc_btlb_info btlb_info;
|
static struct pdc_btlb_info btlb_info __read_mostly;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
void
|
void
|
||||||
flush_data_cache(void)
|
flush_data_cache(void)
|
||||||
{
|
{
|
||||||
on_each_cpu((void (*)(void *))flush_data_cache_local, NULL, 1, 1);
|
on_each_cpu(flush_data_cache_local, NULL, 1, 1);
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
flush_instruction_cache(void)
|
flush_instruction_cache(void)
|
||||||
{
|
{
|
||||||
on_each_cpu((void (*)(void *))flush_instruction_cache_local, NULL, 1, 1);
|
on_each_cpu(flush_instruction_cache_local, NULL, 1, 1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
flush_cache_all_local(void)
|
flush_cache_all_local(void)
|
||||||
{
|
{
|
||||||
flush_instruction_cache_local();
|
flush_instruction_cache_local(NULL);
|
||||||
flush_data_cache_local();
|
flush_data_cache_local(NULL);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(flush_cache_all_local);
|
EXPORT_SYMBOL(flush_cache_all_local);
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ void clear_user_page_asm(void *page, unsigned long vaddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLUSH_THRESHOLD 0x80000 /* 0.5MB */
|
#define FLUSH_THRESHOLD 0x80000 /* 0.5MB */
|
||||||
int parisc_cache_flush_threshold = FLUSH_THRESHOLD;
|
int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD;
|
||||||
|
|
||||||
void parisc_setup_cache_timing(void)
|
void parisc_setup_cache_timing(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#include <asm/parisc-device.h>
|
#include <asm/parisc-device.h>
|
||||||
|
|
||||||
/* See comments in include/asm-parisc/pci.h */
|
/* See comments in include/asm-parisc/pci.h */
|
||||||
struct hppa_dma_ops *hppa_dma_ops;
|
struct hppa_dma_ops *hppa_dma_ops __read_mostly;
|
||||||
EXPORT_SYMBOL(hppa_dma_ops);
|
EXPORT_SYMBOL(hppa_dma_ops);
|
||||||
|
|
||||||
static struct device root = {
|
static struct device root = {
|
||||||
|
@ -515,8 +515,13 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
|
||||||
(iodc_data[5] << 8) | iodc_data[6];
|
(iodc_data[5] << 8) | iodc_data[6];
|
||||||
dev->hpa.name = parisc_pathname(dev);
|
dev->hpa.name = parisc_pathname(dev);
|
||||||
dev->hpa.start = hpa;
|
dev->hpa.start = hpa;
|
||||||
if (hpa == 0xf4000000 || hpa == 0xf6000000 ||
|
/* This is awkward. The STI spec says that gfx devices may occupy
|
||||||
hpa == 0xf8000000 || hpa == 0xfa000000) {
|
* 32MB or 64MB. Unfortunately, we don't know how to tell whether
|
||||||
|
* it's the former or the latter. Assumptions either way can hurt us.
|
||||||
|
*/
|
||||||
|
if (hpa == 0xf4000000 || hpa == 0xf8000000) {
|
||||||
|
dev->hpa.end = hpa + 0x03ffffff;
|
||||||
|
} else if (hpa == 0xf6000000 || hpa == 0xfa000000) {
|
||||||
dev->hpa.end = hpa + 0x01ffffff;
|
dev->hpa.end = hpa + 0x01ffffff;
|
||||||
} else {
|
} else {
|
||||||
dev->hpa.end = hpa + 0xfff;
|
dev->hpa.end = hpa + 0xfff;
|
||||||
|
@ -834,7 +839,7 @@ static void print_parisc_device(struct parisc_device *dev)
|
||||||
|
|
||||||
if (dev->num_addrs) {
|
if (dev->num_addrs) {
|
||||||
int k;
|
int k;
|
||||||
printk(", additional addresses: ");
|
printk(", additional addresses: ");
|
||||||
for (k = 0; k < dev->num_addrs; k++)
|
for (k = 0; k < dev->num_addrs; k++)
|
||||||
printk("0x%lx ", dev->addr[k]);
|
printk("0x%lx ", dev->addr[k]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ static unsigned long pdc_result2[32] __attribute__ ((aligned (8)));
|
||||||
|
|
||||||
/* Firmware needs to be initially set to narrow to determine the
|
/* Firmware needs to be initially set to narrow to determine the
|
||||||
* actual firmware width. */
|
* actual firmware width. */
|
||||||
int parisc_narrow_firmware = 1;
|
int parisc_narrow_firmware __read_mostly = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* On most currently-supported platforms, IODC I/O calls are 32-bit calls
|
/* On most currently-supported platforms, IODC I/O calls are 32-bit calls
|
||||||
|
|
|
@ -551,6 +551,7 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
|
||||||
{HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O BC Merced Port"},
|
{HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O BC Merced Port"},
|
||||||
{HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O BC Ropes Port"},
|
{HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O BC Ropes Port"},
|
||||||
{HPHW_BCPORT, 0x784, 0x0000C, 0x00, "Pluto I/O BC Ropes Port"},
|
{HPHW_BCPORT, 0x784, 0x0000C, 0x00, "Pluto I/O BC Ropes Port"},
|
||||||
|
{HPHW_BRIDGE, 0x05D, 0x0000A, 0x00, "SummitHawk Dino PCI Bridge"},
|
||||||
{HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"},
|
{HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"},
|
||||||
{HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"},
|
{HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"},
|
||||||
{HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"},
|
{HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"},
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
*/
|
*/
|
||||||
#undef DEBUG_PAT
|
#undef DEBUG_PAT
|
||||||
|
|
||||||
int pdc_type = PDC_TYPE_ILLEGAL;
|
int pdc_type __read_mostly = PDC_TYPE_ILLEGAL;
|
||||||
|
|
||||||
void __init setup_pdc(void)
|
void __init setup_pdc(void)
|
||||||
{
|
{
|
||||||
|
@ -120,8 +120,8 @@ set_pmem_entry(physmem_range_t *pmem_ptr, unsigned long start,
|
||||||
* pdc info is bad in this case).
|
* pdc info is bad in this case).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ( ((start & (PAGE_SIZE - 1)) != 0)
|
if (unlikely( ((start & (PAGE_SIZE - 1)) != 0)
|
||||||
|| ((pages4k & ((1UL << PDC_PAGE_ADJ_SHIFT) - 1)) != 0) ) {
|
|| ((pages4k & ((1UL << PDC_PAGE_ADJ_SHIFT) - 1)) != 0) )) {
|
||||||
|
|
||||||
panic("Memory range doesn't align with page size!\n");
|
panic("Memory range doesn't align with page size!\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,10 +33,10 @@
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/tlbflush.h> /* for purge_tlb_*() macros */
|
#include <asm/tlbflush.h> /* for purge_tlb_*() macros */
|
||||||
|
|
||||||
static struct proc_dir_entry * proc_gsc_root = NULL;
|
static struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
||||||
static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
|
static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
|
||||||
static unsigned long pcxl_used_bytes = 0;
|
static unsigned long pcxl_used_bytes __read_mostly = 0;
|
||||||
static unsigned long pcxl_used_pages = 0;
|
static unsigned long pcxl_used_pages __read_mostly = 0;
|
||||||
|
|
||||||
extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */
|
extern unsigned long pcxl_dma_start; /* Start of pcxl dma mapping area */
|
||||||
static spinlock_t pcxl_res_lock;
|
static spinlock_t pcxl_res_lock;
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
|
#include <linux/cache.h>
|
||||||
|
|
||||||
#include <asm/pdc_chassis.h>
|
#include <asm/pdc_chassis.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@ -38,8 +39,8 @@
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_PDC_CHASSIS
|
#ifdef CONFIG_PDC_CHASSIS
|
||||||
static int pdc_chassis_old = 0;
|
static int pdc_chassis_old __read_mostly = 0;
|
||||||
static unsigned int pdc_chassis_enabled = 1;
|
static unsigned int pdc_chassis_enabled __read_mostly = 1;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -132,7 +133,7 @@ void __init parisc_pdc_chassis_init(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PDC_CHASSIS
|
#ifdef CONFIG_PDC_CHASSIS
|
||||||
int handle = 0;
|
int handle = 0;
|
||||||
if (pdc_chassis_enabled) {
|
if (likely(pdc_chassis_enabled)) {
|
||||||
DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
|
DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
|
||||||
|
|
||||||
/* Let see if we have something to handle... */
|
/* Let see if we have something to handle... */
|
||||||
|
@ -142,7 +143,7 @@ void __init parisc_pdc_chassis_init(void)
|
||||||
printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n");
|
printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n");
|
||||||
handle = 1;
|
handle = 1;
|
||||||
}
|
}
|
||||||
else if (pdc_chassis_old) {
|
else if (unlikely(pdc_chassis_old)) {
|
||||||
printk(KERN_INFO "Enabling old style chassis LED panel support.\n");
|
printk(KERN_INFO "Enabling old style chassis LED panel support.\n");
|
||||||
handle = 1;
|
handle = 1;
|
||||||
}
|
}
|
||||||
|
@ -178,7 +179,7 @@ int pdc_chassis_send_status(int message)
|
||||||
/* Maybe we should do that in an other way ? */
|
/* Maybe we should do that in an other way ? */
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
#ifdef CONFIG_PDC_CHASSIS
|
#ifdef CONFIG_PDC_CHASSIS
|
||||||
if (pdc_chassis_enabled) {
|
if (likely(pdc_chassis_enabled)) {
|
||||||
|
|
||||||
DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
|
DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
|
||||||
|
|
||||||
|
@ -214,7 +215,7 @@ int pdc_chassis_send_status(int message)
|
||||||
}
|
}
|
||||||
} else retval = -1;
|
} else retval = -1;
|
||||||
#else
|
#else
|
||||||
if (pdc_chassis_old) {
|
if (unlikely(pdc_chassis_old)) {
|
||||||
switch (message) {
|
switch (message) {
|
||||||
case PDC_CHASSIS_DIRECT_BSTART:
|
case PDC_CHASSIS_DIRECT_BSTART:
|
||||||
case PDC_CHASSIS_DIRECT_BCOMPLETE:
|
case PDC_CHASSIS_DIRECT_BCOMPLETE:
|
||||||
|
|
|
@ -66,10 +66,10 @@ struct rdr_tbl_ent {
|
||||||
uint8_t write_control;
|
uint8_t write_control;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int perf_processor_interface = UNKNOWN_INTF;
|
static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
|
||||||
static int perf_enabled = 0;
|
static int perf_enabled __read_mostly = 0;
|
||||||
static spinlock_t perf_lock;
|
static spinlock_t perf_lock;
|
||||||
struct parisc_device *cpu_device = NULL;
|
struct parisc_device *cpu_device __read_mostly = NULL;
|
||||||
|
|
||||||
/* RDRs to write for PCX-W */
|
/* RDRs to write for PCX-W */
|
||||||
static int perf_rdrs_W[] =
|
static int perf_rdrs_W[] =
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/unwind.h>
|
#include <asm/unwind.h>
|
||||||
|
|
||||||
static int hlt_counter;
|
static int hlt_counter __read_mostly;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Power off function, if any
|
* Power off function, if any
|
||||||
|
|
|
@ -44,10 +44,10 @@
|
||||||
#include <asm/irq.h> /* for struct irq_region */
|
#include <asm/irq.h> /* for struct irq_region */
|
||||||
#include <asm/parisc-device.h>
|
#include <asm/parisc-device.h>
|
||||||
|
|
||||||
struct system_cpuinfo_parisc boot_cpu_data;
|
struct system_cpuinfo_parisc boot_cpu_data __read_mostly;
|
||||||
EXPORT_SYMBOL(boot_cpu_data);
|
EXPORT_SYMBOL(boot_cpu_data);
|
||||||
|
|
||||||
struct cpuinfo_parisc cpu_data[NR_CPUS];
|
struct cpuinfo_parisc cpu_data[NR_CPUS] __read_mostly;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** PARISC CPU driver - claim "device" and initialize CPU data structures.
|
** PARISC CPU driver - claim "device" and initialize CPU data structures.
|
||||||
|
@ -378,12 +378,12 @@ show_cpuinfo (struct seq_file *m, void *v)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct parisc_device_id processor_tbl[] = {
|
static struct parisc_device_id processor_tbl[] __read_mostly = {
|
||||||
{ HPHW_NPROC, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, SVERSION_ANY_ID },
|
{ HPHW_NPROC, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, SVERSION_ANY_ID },
|
||||||
{ 0, }
|
{ 0, }
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct parisc_driver cpu_driver = {
|
static struct parisc_driver cpu_driver __read_mostly = {
|
||||||
.name = "CPU",
|
.name = "CPU",
|
||||||
.id_table = processor_tbl,
|
.id_table = processor_tbl,
|
||||||
.probe = processor_probe
|
.probe = processor_probe
|
||||||
|
|
|
@ -46,15 +46,15 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
|
||||||
char command_line[COMMAND_LINE_SIZE];
|
char command_line[COMMAND_LINE_SIZE] __read_mostly;
|
||||||
|
|
||||||
/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
|
/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
|
||||||
struct proc_dir_entry * proc_runway_root = NULL;
|
struct proc_dir_entry * proc_runway_root __read_mostly = NULL;
|
||||||
struct proc_dir_entry * proc_gsc_root = NULL;
|
struct proc_dir_entry * proc_gsc_root __read_mostly = NULL;
|
||||||
struct proc_dir_entry * proc_mckinley_root = NULL;
|
struct proc_dir_entry * proc_mckinley_root __read_mostly = NULL;
|
||||||
|
|
||||||
#if !defined(CONFIG_PA20) && (defined(CONFIG_IOMMU_CCIO) || defined(CONFIG_IOMMU_SBA))
|
#if !defined(CONFIG_PA20) && (defined(CONFIG_IOMMU_CCIO) || defined(CONFIG_IOMMU_SBA))
|
||||||
int parisc_bus_is_phys = 1; /* Assume no IOMMU is present */
|
int parisc_bus_is_phys __read_mostly = 1; /* Assume no IOMMU is present */
|
||||||
EXPORT_SYMBOL(parisc_bus_is_phys);
|
EXPORT_SYMBOL(parisc_bus_is_phys);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/current.h>
|
#include <asm/current.h>
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/pgalloc.h> /* for flush_tlb_all() proto/macro */
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/irq.h> /* for CPU_IRQ_REGION and friends */
|
#include <asm/irq.h> /* for CPU_IRQ_REGION and friends */
|
||||||
|
@ -58,9 +58,9 @@ DEFINE_SPINLOCK(smp_lock);
|
||||||
|
|
||||||
volatile struct task_struct *smp_init_current_idle_task;
|
volatile struct task_struct *smp_init_current_idle_task;
|
||||||
|
|
||||||
static volatile int cpu_now_booting = 0; /* track which CPU is booting */
|
static volatile int cpu_now_booting __read_mostly = 0; /* track which CPU is booting */
|
||||||
|
|
||||||
static int parisc_max_cpus = 1;
|
static int parisc_max_cpus __read_mostly = 1;
|
||||||
|
|
||||||
/* online cpus are ones that we've managed to bring up completely
|
/* online cpus are ones that we've managed to bring up completely
|
||||||
* possible cpus are all valid cpu
|
* possible cpus are all valid cpu
|
||||||
|
@ -71,8 +71,8 @@ static int parisc_max_cpus = 1;
|
||||||
* empty in the beginning.
|
* empty in the beginning.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */
|
cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE; /* Bitmap of online CPUs */
|
||||||
cpumask_t cpu_possible_map = CPU_MASK_ALL; /* Bitmap of Present CPUs */
|
cpumask_t cpu_possible_map __read_mostly = CPU_MASK_ALL; /* Bitmap of Present CPUs */
|
||||||
|
|
||||||
EXPORT_SYMBOL(cpu_online_map);
|
EXPORT_SYMBOL(cpu_online_map);
|
||||||
EXPORT_SYMBOL(cpu_possible_map);
|
EXPORT_SYMBOL(cpu_possible_map);
|
||||||
|
@ -406,12 +406,10 @@ EXPORT_SYMBOL(smp_call_function);
|
||||||
* as we want to ensure all TLB's flushed before proceeding.
|
* as we want to ensure all TLB's flushed before proceeding.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern void flush_tlb_all_local(void);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
smp_flush_tlb_all(void)
|
smp_flush_tlb_all(void)
|
||||||
{
|
{
|
||||||
on_each_cpu((void (*)(void *))flush_tlb_all_local, NULL, 1, 1);
|
on_each_cpu(flush_tlb_all_local, NULL, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -487,7 +485,7 @@ void __init smp_callin(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
flush_cache_all_local(); /* start with known state */
|
flush_cache_all_local(); /* start with known state */
|
||||||
flush_tlb_all_local();
|
flush_tlb_all_local(NULL);
|
||||||
|
|
||||||
local_irq_enable(); /* Interrupts have been off until now */
|
local_irq_enable(); /* Interrupts have been off until now */
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,8 @@
|
||||||
/* xtime and wall_jiffies keep wall-clock time */
|
/* xtime and wall_jiffies keep wall-clock time */
|
||||||
extern unsigned long wall_jiffies;
|
extern unsigned long wall_jiffies;
|
||||||
|
|
||||||
static long clocktick; /* timer cycles per tick */
|
static long clocktick __read_mostly; /* timer cycles per tick */
|
||||||
static long halftick;
|
static long halftick __read_mostly;
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
extern void smp_do_timer(struct pt_regs *regs);
|
extern void smp_do_timer(struct pt_regs *regs);
|
||||||
|
|
|
@ -20,8 +20,9 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
|
#include <linux/cache.h>
|
||||||
|
|
||||||
static struct cpu cpu_devices[NR_CPUS];
|
static struct cpu cpu_devices[NR_CPUS] __read_mostly;
|
||||||
|
|
||||||
static int __init topology_init(void)
|
static int __init topology_init(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -122,7 +122,7 @@
|
||||||
#define ERR_NOTHANDLED -1
|
#define ERR_NOTHANDLED -1
|
||||||
#define ERR_PAGEFAULT -2
|
#define ERR_PAGEFAULT -2
|
||||||
|
|
||||||
int unaligned_enabled = 1;
|
int unaligned_enabled __read_mostly = 1;
|
||||||
|
|
||||||
void die_if_kernel (char *str, struct pt_regs *regs, long err);
|
void die_if_kernel (char *str, struct pt_regs *regs, long err);
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ static spinlock_t unwind_lock;
|
||||||
* we can call unwind_init as early in the bootup process as
|
* we can call unwind_init as early in the bootup process as
|
||||||
* possible (before the slab allocator is initialized)
|
* possible (before the slab allocator is initialized)
|
||||||
*/
|
*/
|
||||||
static struct unwind_table kernel_unwind_table;
|
static struct unwind_table kernel_unwind_table __read_mostly;
|
||||||
static LIST_HEAD(unwind_tables);
|
static LIST_HEAD(unwind_tables);
|
||||||
|
|
||||||
static inline const struct unwind_table_entry *
|
static inline const struct unwind_table_entry *
|
||||||
|
|
|
@ -68,7 +68,7 @@ SECTIONS
|
||||||
RODATA
|
RODATA
|
||||||
|
|
||||||
/* writeable */
|
/* writeable */
|
||||||
. = ALIGN(4096); /* Make sure this is paged aligned so
|
. = ALIGN(4096); /* Make sure this is page aligned so
|
||||||
that we can properly leave these
|
that we can properly leave these
|
||||||
as writable */
|
as writable */
|
||||||
data_start = .;
|
data_start = .;
|
||||||
|
@ -105,6 +105,10 @@ SECTIONS
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
.data.lock_aligned : { *(.data.lock_aligned) }
|
.data.lock_aligned : { *(.data.lock_aligned) }
|
||||||
|
|
||||||
|
/* rarely changed data like cpu maps */
|
||||||
|
. = ALIGN(16);
|
||||||
|
.data.read_mostly : { *(.data.read_mostly) }
|
||||||
|
|
||||||
_edata = .; /* End of data section */
|
_edata = .; /* End of data section */
|
||||||
|
|
||||||
. = ALIGN(16384); /* init_task */
|
. = ALIGN(16384); /* init_task */
|
||||||
|
@ -194,14 +198,7 @@ SECTIONS
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
STABS_DEBUG
|
||||||
.stab 0 : { *(.stab) }
|
|
||||||
.stabstr 0 : { *(.stabstr) }
|
|
||||||
.stab.excl 0 : { *(.stab.excl) }
|
|
||||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
|
||||||
.stab.index 0 : { *(.stab.index) }
|
|
||||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
|
||||||
.comment 0 : { *(.comment) }
|
|
||||||
.note 0 : { *(.note) }
|
.note 0 : { *(.note) }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,9 +36,9 @@ extern char _end; /* end of BSS, defined by linker */
|
||||||
extern char __init_begin, __init_end;
|
extern char __init_begin, __init_end;
|
||||||
|
|
||||||
#ifdef CONFIG_DISCONTIGMEM
|
#ifdef CONFIG_DISCONTIGMEM
|
||||||
struct node_map_data node_data[MAX_NUMNODES];
|
struct node_map_data node_data[MAX_NUMNODES] __read_mostly;
|
||||||
bootmem_data_t bmem_data[MAX_NUMNODES];
|
bootmem_data_t bmem_data[MAX_NUMNODES] __read_mostly;
|
||||||
unsigned char pfnnid_map[PFNNID_MAP_MAX];
|
unsigned char pfnnid_map[PFNNID_MAP_MAX] __read_mostly;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct resource data_resource = {
|
static struct resource data_resource = {
|
||||||
|
@ -58,14 +58,14 @@ static struct resource pdcdata_resource = {
|
||||||
.flags = IORESOURCE_BUSY | IORESOURCE_MEM,
|
.flags = IORESOURCE_BUSY | IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource sysram_resources[MAX_PHYSMEM_RANGES];
|
static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;
|
||||||
|
|
||||||
/* The following array is initialized from the firmware specific
|
/* The following array is initialized from the firmware specific
|
||||||
* information retrieved in kernel/inventory.c.
|
* information retrieved in kernel/inventory.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES];
|
physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES] __read_mostly;
|
||||||
int npmem_ranges;
|
int npmem_ranges __read_mostly;
|
||||||
|
|
||||||
#ifdef __LP64__
|
#ifdef __LP64__
|
||||||
#define MAX_MEM (~0UL)
|
#define MAX_MEM (~0UL)
|
||||||
|
@ -73,7 +73,7 @@ int npmem_ranges;
|
||||||
#define MAX_MEM (3584U*1024U*1024U)
|
#define MAX_MEM (3584U*1024U*1024U)
|
||||||
#endif /* !__LP64__ */
|
#endif /* !__LP64__ */
|
||||||
|
|
||||||
static unsigned long mem_limit = MAX_MEM;
|
static unsigned long mem_limit __read_mostly = MAX_MEM;
|
||||||
|
|
||||||
static void __init mem_limit_func(void)
|
static void __init mem_limit_func(void)
|
||||||
{
|
{
|
||||||
|
@ -300,6 +300,13 @@ static void __init setup_bootmem(void)
|
||||||
max_pfn = start_pfn + npages;
|
max_pfn = start_pfn + npages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* IOMMU is always used to access "high mem" on those boxes
|
||||||
|
* that can support enough mem that a PCI device couldn't
|
||||||
|
* directly DMA to any physical addresses.
|
||||||
|
* ISA DMA support will need to revisit this.
|
||||||
|
*/
|
||||||
|
max_low_pfn = max_pfn;
|
||||||
|
|
||||||
if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) {
|
if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) {
|
||||||
printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n");
|
printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n");
|
||||||
BUG();
|
BUG();
|
||||||
|
@ -431,11 +438,11 @@ void free_initmem(void)
|
||||||
#define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \
|
#define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \
|
||||||
& ~(VM_MAP_OFFSET-1)))
|
& ~(VM_MAP_OFFSET-1)))
|
||||||
|
|
||||||
void *vmalloc_start;
|
void *vmalloc_start __read_mostly;
|
||||||
EXPORT_SYMBOL(vmalloc_start);
|
EXPORT_SYMBOL(vmalloc_start);
|
||||||
|
|
||||||
#ifdef CONFIG_PA11
|
#ifdef CONFIG_PA11
|
||||||
unsigned long pcxl_dma_start;
|
unsigned long pcxl_dma_start __read_mostly;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void __init mem_init(void)
|
void __init mem_init(void)
|
||||||
|
@ -475,7 +482,7 @@ int do_check_pgt_cache(int low, int high)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long *empty_zero_page;
|
unsigned long *empty_zero_page __read_mostly;
|
||||||
|
|
||||||
void show_mem(void)
|
void show_mem(void)
|
||||||
{
|
{
|
||||||
|
@ -998,7 +1005,7 @@ void flush_tlb_all(void)
|
||||||
void flush_tlb_all(void)
|
void flush_tlb_all(void)
|
||||||
{
|
{
|
||||||
spin_lock(&sid_lock);
|
spin_lock(&sid_lock);
|
||||||
flush_tlb_all_local();
|
flush_tlb_all_local(NULL);
|
||||||
recycle_sids();
|
recycle_sids();
|
||||||
spin_unlock(&sid_lock);
|
spin_unlock(&sid_lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
/*
|
/*
|
||||||
* arch/parisc/mm/ioremap.c
|
* arch/parisc/mm/ioremap.c
|
||||||
*
|
*
|
||||||
* Re-map IO memory to kernel address space so that we can access it.
|
|
||||||
* This is needed for high PCI addresses that aren't mapped in the
|
|
||||||
* 640k-1MB IO memory area on PC's
|
|
||||||
*
|
|
||||||
* (C) Copyright 1995 1996 Linus Torvalds
|
* (C) Copyright 1995 1996 Linus Torvalds
|
||||||
* (C) Copyright 2001 Helge Deller <deller@gmx.de>
|
* (C) Copyright 2001 Helge Deller <deller@gmx.de>
|
||||||
|
* (C) Copyright 2005 Kyle McMartin <kyle@parisc-linux.org>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
|
@ -14,81 +11,107 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
|
#include <asm/tlbflush.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size,
|
static inline void
|
||||||
unsigned long phys_addr, unsigned long flags)
|
remap_area_pte(pte_t *pte, unsigned long address, unsigned long size,
|
||||||
|
unsigned long phys_addr, unsigned long flags)
|
||||||
{
|
{
|
||||||
unsigned long end;
|
unsigned long end, pfn;
|
||||||
|
pgprot_t pgprot = __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY |
|
||||||
|
_PAGE_ACCESSED | flags);
|
||||||
|
|
||||||
address &= ~PMD_MASK;
|
address &= ~PMD_MASK;
|
||||||
|
|
||||||
end = address + size;
|
end = address + size;
|
||||||
if (end > PMD_SIZE)
|
if (end > PMD_SIZE)
|
||||||
end = PMD_SIZE;
|
end = PMD_SIZE;
|
||||||
if (address >= end)
|
|
||||||
BUG();
|
BUG_ON(address >= end);
|
||||||
|
|
||||||
|
pfn = phys_addr >> PAGE_SHIFT;
|
||||||
do {
|
do {
|
||||||
if (!pte_none(*pte)) {
|
BUG_ON(!pte_none(*pte));
|
||||||
printk(KERN_ERR "remap_area_pte: page already exists\n");
|
|
||||||
BUG();
|
set_pte(pte, pfn_pte(pfn, pgprot));
|
||||||
}
|
|
||||||
set_pte(pte, mk_pte_phys(phys_addr, __pgprot(_PAGE_PRESENT | _PAGE_RW |
|
|
||||||
_PAGE_DIRTY | _PAGE_ACCESSED | flags)));
|
|
||||||
address += PAGE_SIZE;
|
address += PAGE_SIZE;
|
||||||
phys_addr += PAGE_SIZE;
|
pfn++;
|
||||||
pte++;
|
pte++;
|
||||||
} while (address && (address < end));
|
} while (address && (address < end));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size,
|
static inline int
|
||||||
unsigned long phys_addr, unsigned long flags)
|
remap_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size,
|
||||||
|
unsigned long phys_addr, unsigned long flags)
|
||||||
{
|
{
|
||||||
unsigned long end;
|
unsigned long end;
|
||||||
|
|
||||||
address &= ~PGDIR_MASK;
|
address &= ~PGDIR_MASK;
|
||||||
|
|
||||||
end = address + size;
|
end = address + size;
|
||||||
if (end > PGDIR_SIZE)
|
if (end > PGDIR_SIZE)
|
||||||
end = PGDIR_SIZE;
|
end = PGDIR_SIZE;
|
||||||
|
|
||||||
|
BUG_ON(address >= end);
|
||||||
|
|
||||||
phys_addr -= address;
|
phys_addr -= address;
|
||||||
if (address >= end)
|
|
||||||
BUG();
|
|
||||||
do {
|
do {
|
||||||
pte_t * pte = pte_alloc_kernel(pmd, address);
|
pte_t *pte = pte_alloc_kernel(pmd, address);
|
||||||
if (!pte)
|
if (!pte)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
remap_area_pte(pte, address, end - address, address + phys_addr, flags);
|
|
||||||
|
remap_area_pte(pte, address, end - address,
|
||||||
|
address + phys_addr, flags);
|
||||||
|
|
||||||
address = (address + PMD_SIZE) & PMD_MASK;
|
address = (address + PMD_SIZE) & PMD_MASK;
|
||||||
pmd++;
|
pmd++;
|
||||||
} while (address && (address < end));
|
} while (address && (address < end));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (USE_HPPA_IOREMAP)
|
#if USE_HPPA_IOREMAP
|
||||||
static int remap_area_pages(unsigned long address, unsigned long phys_addr,
|
static int
|
||||||
unsigned long size, unsigned long flags)
|
remap_area_pages(unsigned long address, unsigned long phys_addr,
|
||||||
|
unsigned long size, unsigned long flags)
|
||||||
{
|
{
|
||||||
int error;
|
pgd_t *dir;
|
||||||
pgd_t * dir;
|
int error = 0;
|
||||||
unsigned long end = address + size;
|
unsigned long end = address + size;
|
||||||
|
|
||||||
|
BUG_ON(address >= end);
|
||||||
|
|
||||||
phys_addr -= address;
|
phys_addr -= address;
|
||||||
dir = pgd_offset(&init_mm, address);
|
dir = pgd_offset_k(address);
|
||||||
|
|
||||||
flush_cache_all();
|
flush_cache_all();
|
||||||
if (address >= end)
|
|
||||||
BUG();
|
|
||||||
do {
|
do {
|
||||||
|
pud_t *pud;
|
||||||
pmd_t *pmd;
|
pmd_t *pmd;
|
||||||
pmd = pmd_alloc(&init_mm, dir, address);
|
|
||||||
error = -ENOMEM;
|
error = -ENOMEM;
|
||||||
|
pud = pud_alloc(&init_mm, dir, address);
|
||||||
|
if (!pud)
|
||||||
|
break;
|
||||||
|
|
||||||
|
pmd = pmd_alloc(&init_mm, pud, address);
|
||||||
if (!pmd)
|
if (!pmd)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (remap_area_pmd(pmd, address, end - address,
|
if (remap_area_pmd(pmd, address, end - address,
|
||||||
phys_addr + address, flags))
|
phys_addr + address, flags))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
address = (address + PGDIR_SIZE) & PGDIR_MASK;
|
address = (address + PGDIR_SIZE) & PGDIR_MASK;
|
||||||
dir++;
|
dir++;
|
||||||
} while (address && (address < end));
|
} while (address && (address < end));
|
||||||
|
|
||||||
flush_tlb_all();
|
flush_tlb_all();
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
#endif /* USE_HPPA_IOREMAP */
|
#endif /* USE_HPPA_IOREMAP */
|
||||||
|
@ -123,8 +146,7 @@ EXPORT_SYMBOL(__raw_bad_addr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remap an arbitrary physical address space into the kernel virtual
|
* Remap an arbitrary physical address space into the kernel virtual
|
||||||
* address space. Needed when the kernel wants to access high addresses
|
* address space.
|
||||||
* directly.
|
|
||||||
*
|
*
|
||||||
* NOTE! We need to allow non-page-aligned mappings too: we will obviously
|
* NOTE! We need to allow non-page-aligned mappings too: we will obviously
|
||||||
* have to convert them into an offset in a page-aligned mapping, but the
|
* have to convert them into an offset in a page-aligned mapping, but the
|
||||||
|
@ -148,8 +170,8 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
void * addr;
|
void *addr;
|
||||||
struct vm_struct * area;
|
struct vm_struct *area;
|
||||||
unsigned long offset, last_addr;
|
unsigned long offset, last_addr;
|
||||||
|
|
||||||
/* Don't allow wraparound or zero size */
|
/* Don't allow wraparound or zero size */
|
||||||
|
@ -167,9 +189,11 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
|
||||||
t_addr = __va(phys_addr);
|
t_addr = __va(phys_addr);
|
||||||
t_end = t_addr + (size - 1);
|
t_end = t_addr + (size - 1);
|
||||||
|
|
||||||
for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++)
|
for (page = virt_to_page(t_addr);
|
||||||
|
page <= virt_to_page(t_end); page++) {
|
||||||
if(!PageReserved(page))
|
if(!PageReserved(page))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -185,11 +209,13 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
|
||||||
area = get_vm_area(size, VM_IOREMAP);
|
area = get_vm_area(size, VM_IOREMAP);
|
||||||
if (!area)
|
if (!area)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
addr = area->addr;
|
addr = area->addr;
|
||||||
if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) {
|
if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) {
|
||||||
vfree(addr);
|
vfree(addr);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (void __iomem *) (offset + (char *)addr);
|
return (void __iomem *) (offset + (char *)addr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -83,7 +83,8 @@
|
||||||
** bus number for each dino.
|
** bus number for each dino.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define is_card_dino(id) ((id)->hw_type == HPHW_A_DMA)
|
#define is_card_dino(id) ((id)->hw_type == HPHW_A_DMA)
|
||||||
|
#define is_cujo(id) ((id)->hversion == 0x682)
|
||||||
|
|
||||||
#define DINO_IAR0 0x004
|
#define DINO_IAR0 0x004
|
||||||
#define DINO_IODC_ADDR 0x008
|
#define DINO_IODC_ADDR 0x008
|
||||||
|
@ -124,6 +125,7 @@
|
||||||
|
|
||||||
#define DINO_IRQS 11 /* bits 0-10 are architected */
|
#define DINO_IRQS 11 /* bits 0-10 are architected */
|
||||||
#define DINO_IRR_MASK 0x5ff /* only 10 bits are implemented */
|
#define DINO_IRR_MASK 0x5ff /* only 10 bits are implemented */
|
||||||
|
#define DINO_LOCAL_IRQS (DINO_IRQS+1)
|
||||||
|
|
||||||
#define DINO_MASK_IRQ(x) (1<<(x))
|
#define DINO_MASK_IRQ(x) (1<<(x))
|
||||||
|
|
||||||
|
@ -146,7 +148,7 @@ struct dino_device
|
||||||
unsigned long txn_addr; /* EIR addr to generate interrupt */
|
unsigned long txn_addr; /* EIR addr to generate interrupt */
|
||||||
u32 txn_data; /* EIR data assign to each dino */
|
u32 txn_data; /* EIR data assign to each dino */
|
||||||
u32 imr; /* IRQ's which are enabled */
|
u32 imr; /* IRQ's which are enabled */
|
||||||
int global_irq[12]; /* map IMR bit to global irq */
|
int global_irq[DINO_LOCAL_IRQS]; /* map IMR bit to global irq */
|
||||||
#ifdef DINO_DEBUG
|
#ifdef DINO_DEBUG
|
||||||
unsigned int dino_irr0; /* save most recent IRQ line stat */
|
unsigned int dino_irr0; /* save most recent IRQ line stat */
|
||||||
#endif
|
#endif
|
||||||
|
@ -297,7 +299,7 @@ struct pci_port_ops dino_port_ops = {
|
||||||
static void dino_disable_irq(unsigned int irq)
|
static void dino_disable_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
struct dino_device *dino_dev = irq_desc[irq].handler_data;
|
struct dino_device *dino_dev = irq_desc[irq].handler_data;
|
||||||
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq);
|
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS);
|
||||||
|
|
||||||
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
|
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
|
||||||
|
|
||||||
|
@ -309,7 +311,7 @@ static void dino_disable_irq(unsigned int irq)
|
||||||
static void dino_enable_irq(unsigned int irq)
|
static void dino_enable_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
struct dino_device *dino_dev = irq_desc[irq].handler_data;
|
struct dino_device *dino_dev = irq_desc[irq].handler_data;
|
||||||
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq);
|
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, DINO_LOCAL_IRQS);
|
||||||
u32 tmp;
|
u32 tmp;
|
||||||
|
|
||||||
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
|
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
|
||||||
|
@ -435,6 +437,21 @@ static void dino_choose_irq(struct parisc_device *dev, void *ctrl)
|
||||||
dino_assign_irq(dino, irq, &dev->irq);
|
dino_assign_irq(dino, irq, &dev->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cirrus 6832 Cardbus reports wrong irq on RDI Tadpole PARISC Laptop (deller@gmx.de)
|
||||||
|
* (the irqs are off-by-one, not sure yet if this is a cirrus, dino-hardware or dino-driver problem...)
|
||||||
|
*/
|
||||||
|
static void __devinit quirk_cirrus_cardbus(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
u8 new_irq = dev->irq - 1;
|
||||||
|
printk(KERN_INFO "PCI: Cirrus Cardbus IRQ fixup for %s, from %d to %d\n",
|
||||||
|
pci_name(dev), dev->irq, new_irq);
|
||||||
|
dev->irq = new_irq;
|
||||||
|
}
|
||||||
|
DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_6832, quirk_cirrus_cardbus );
|
||||||
|
|
||||||
|
|
||||||
static void __init
|
static void __init
|
||||||
dino_bios_init(void)
|
dino_bios_init(void)
|
||||||
{
|
{
|
||||||
|
@ -666,7 +683,6 @@ dino_fixup_bus(struct pci_bus *bus)
|
||||||
printk(KERN_WARNING "Device %s has unassigned IRQ\n", pci_name(dev));
|
printk(KERN_WARNING "Device %s has unassigned IRQ\n", pci_name(dev));
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
/* Adjust INT_LINE for that busses region */
|
/* Adjust INT_LINE for that busses region */
|
||||||
dino_assign_irq(dino_dev, dev->irq, &dev->irq);
|
dino_assign_irq(dino_dev, dev->irq, &dev->irq);
|
||||||
}
|
}
|
||||||
|
@ -872,7 +888,7 @@ static int __init dino_common_init(struct parisc_device *dev,
|
||||||
|
|
||||||
/* allocate I/O Port resource region */
|
/* allocate I/O Port resource region */
|
||||||
res = &dino_dev->hba.io_space;
|
res = &dino_dev->hba.io_space;
|
||||||
if (dev->id.hversion == 0x680 || is_card_dino(&dev->id)) {
|
if (!is_cujo(&dev->id)) {
|
||||||
res->name = "Dino I/O Port";
|
res->name = "Dino I/O Port";
|
||||||
} else {
|
} else {
|
||||||
res->name = "Cujo I/O Port";
|
res->name = "Cujo I/O Port";
|
||||||
|
@ -927,7 +943,7 @@ static int __init dino_probe(struct parisc_device *dev)
|
||||||
if (is_card_dino(&dev->id)) {
|
if (is_card_dino(&dev->id)) {
|
||||||
version = "3.x (card mode)";
|
version = "3.x (card mode)";
|
||||||
} else {
|
} else {
|
||||||
if(dev->id.hversion == 0x680) {
|
if (!is_cujo(&dev->id)) {
|
||||||
if (dev->id.hversion_rev < 4) {
|
if (dev->id.hversion_rev < 4) {
|
||||||
version = dino_vers[dev->id.hversion_rev];
|
version = dino_vers[dev->id.hversion_rev];
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(eisa_irq_lock);
|
static DEFINE_SPINLOCK(eisa_irq_lock);
|
||||||
|
|
||||||
void __iomem *eisa_eeprom_addr;
|
void __iomem *eisa_eeprom_addr __read_mostly;
|
||||||
|
|
||||||
/* We can only have one EISA adapter in the system because neither
|
/* We can only have one EISA adapter in the system because neither
|
||||||
* implementation can be flexed.
|
* implementation can be flexed.
|
||||||
|
@ -141,7 +141,7 @@ static int slave_mask;
|
||||||
* in the furure.
|
* in the furure.
|
||||||
*/
|
*/
|
||||||
/* irq 13,8,2,1,0 must be edge */
|
/* irq 13,8,2,1,0 must be edge */
|
||||||
static unsigned int eisa_irq_level; /* default to edge triggered */
|
static unsigned int eisa_irq_level __read_mostly; /* default to edge triggered */
|
||||||
|
|
||||||
|
|
||||||
/* called by free irq */
|
/* called by free irq */
|
||||||
|
|
|
@ -48,7 +48,7 @@ static loff_t eisa_eeprom_llseek(struct file *file, loff_t offset, int origin )
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t eisa_eeprom_read(struct file * file,
|
static ssize_t eisa_eeprom_read(struct file * file,
|
||||||
char *buf, size_t count, loff_t *ppos )
|
char __user *buf, size_t count, loff_t *ppos )
|
||||||
{
|
{
|
||||||
unsigned char *tmp;
|
unsigned char *tmp;
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
|
@ -150,7 +150,7 @@ void __init lasi_led_init(unsigned long lasi_hpa)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static unsigned long lasi_power_off_hpa;
|
static unsigned long lasi_power_off_hpa __read_mostly;
|
||||||
|
|
||||||
static void lasi_power_off(void)
|
static void lasi_power_off(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -167,7 +167,7 @@
|
||||||
|
|
||||||
/* non-postable I/O port space, densely packed */
|
/* non-postable I/O port space, densely packed */
|
||||||
#define LBA_PORT_BASE (PCI_F_EXTEND | 0xfee00000UL)
|
#define LBA_PORT_BASE (PCI_F_EXTEND | 0xfee00000UL)
|
||||||
static void __iomem *astro_iop_base;
|
static void __iomem *astro_iop_base __read_mostly;
|
||||||
|
|
||||||
#define ELROY_HVERS 0x782
|
#define ELROY_HVERS 0x782
|
||||||
#define MERCURY_HVERS 0x783
|
#define MERCURY_HVERS 0x783
|
||||||
|
@ -695,11 +695,71 @@ lba_claim_dev_resources(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#define lba_claim_dev_resources(dev)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* truncate_pat_collision: Deal with overlaps or outright collisions
|
||||||
|
* between PAT PDC reported ranges.
|
||||||
|
*
|
||||||
|
* Broken PA8800 firmware will report lmmio range that
|
||||||
|
* overlaps with CPU HPA. Just truncate the lmmio range.
|
||||||
|
*
|
||||||
|
* BEWARE: conflicts with this lmmio range may be an
|
||||||
|
* elmmio range which is pointing down another rope.
|
||||||
|
*
|
||||||
|
* FIXME: only deals with one collision per range...theoretically we
|
||||||
|
* could have several. Supporting more than one collision will get messy.
|
||||||
|
*/
|
||||||
|
static unsigned long
|
||||||
|
truncate_pat_collision(struct resource *root, struct resource *new)
|
||||||
|
{
|
||||||
|
unsigned long start = new->start;
|
||||||
|
unsigned long end = new->end;
|
||||||
|
struct resource *tmp = root->child;
|
||||||
|
|
||||||
|
if (end <= start || start < root->start || !tmp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* find first overlap */
|
||||||
|
while (tmp && tmp->end < start)
|
||||||
|
tmp = tmp->sibling;
|
||||||
|
|
||||||
|
/* no entries overlap */
|
||||||
|
if (!tmp) return 0;
|
||||||
|
|
||||||
|
/* found one that starts behind the new one
|
||||||
|
** Don't need to do anything.
|
||||||
|
*/
|
||||||
|
if (tmp->start >= end) return 0;
|
||||||
|
|
||||||
|
if (tmp->start <= start) {
|
||||||
|
/* "front" of new one overlaps */
|
||||||
|
new->start = tmp->end + 1;
|
||||||
|
|
||||||
|
if (tmp->end >= end) {
|
||||||
|
/* AACCKK! totally overlaps! drop this range. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tmp->end < end ) {
|
||||||
|
/* "end" of new one overlaps */
|
||||||
|
new->end = tmp->start - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(KERN_WARNING "LBA: Truncating lmmio_space [%lx/%lx] "
|
||||||
|
"to [%lx,%lx]\n",
|
||||||
|
start, end,
|
||||||
|
new->start, new->end );
|
||||||
|
|
||||||
|
return 0; /* truncation successful */
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define lba_claim_dev_resources(dev) do { } while (0)
|
||||||
|
#define truncate_pat_collision(r,n) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The algorithm is generic code.
|
** The algorithm is generic code.
|
||||||
** But it needs to access local data structures to get the IRQ base.
|
** But it needs to access local data structures to get the IRQ base.
|
||||||
|
@ -747,6 +807,9 @@ lba_fixup_bus(struct pci_bus *bus)
|
||||||
lba_dump_res(&ioport_resource, 2);
|
lba_dump_res(&ioport_resource, 2);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
/* advertize Host bridge resources to PCI bus */
|
||||||
|
bus->resource[0] = &(ldev->hba.io_space);
|
||||||
|
i = 1;
|
||||||
|
|
||||||
if (ldev->hba.elmmio_space.start) {
|
if (ldev->hba.elmmio_space.start) {
|
||||||
err = request_resource(&iomem_resource,
|
err = request_resource(&iomem_resource,
|
||||||
|
@ -760,23 +823,35 @@ lba_fixup_bus(struct pci_bus *bus)
|
||||||
|
|
||||||
/* lba_dump_res(&iomem_resource, 2); */
|
/* lba_dump_res(&iomem_resource, 2); */
|
||||||
/* BUG(); */
|
/* BUG(); */
|
||||||
}
|
} else
|
||||||
|
bus->resource[i++] = &(ldev->hba.elmmio_space);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space));
|
|
||||||
if (err < 0) {
|
|
||||||
/* FIXME overlaps with elmmio will fail here.
|
|
||||||
* Need to prune (or disable) the distributed range.
|
|
||||||
*
|
|
||||||
* BEWARE: conflicts with this lmmio range may be
|
|
||||||
* elmmio range which is pointing down another rope.
|
|
||||||
*/
|
|
||||||
|
|
||||||
printk("FAILED: lba_fixup_bus() request for "
|
/* Overlaps with elmmio can (and should) fail here.
|
||||||
|
* We will prune (or ignore) the distributed range.
|
||||||
|
*
|
||||||
|
* FIXME: SBA code should register all elmmio ranges first.
|
||||||
|
* that would take care of elmmio ranges routed
|
||||||
|
* to a different rope (already discovered) from
|
||||||
|
* getting registered *after* LBA code has already
|
||||||
|
* registered it's distributed lmmio range.
|
||||||
|
*/
|
||||||
|
if (truncate_pat_collision(&iomem_resource,
|
||||||
|
&(ldev->hba.lmmio_space))) {
|
||||||
|
|
||||||
|
printk(KERN_WARNING "LBA: lmmio_space [%lx/%lx] duplicate!\n",
|
||||||
|
ldev->hba.lmmio_space.start,
|
||||||
|
ldev->hba.lmmio_space.end);
|
||||||
|
} else {
|
||||||
|
err = request_resource(&iomem_resource, &(ldev->hba.lmmio_space));
|
||||||
|
if (err < 0) {
|
||||||
|
printk(KERN_ERR "FAILED: lba_fixup_bus() request for "
|
||||||
"lmmio_space [%lx/%lx]\n",
|
"lmmio_space [%lx/%lx]\n",
|
||||||
ldev->hba.lmmio_space.start,
|
ldev->hba.lmmio_space.start,
|
||||||
ldev->hba.lmmio_space.end);
|
ldev->hba.lmmio_space.end);
|
||||||
/* lba_dump_res(&iomem_resource, 2); */
|
} else
|
||||||
|
bus->resource[i++] = &(ldev->hba.lmmio_space);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
|
@ -791,18 +866,10 @@ lba_fixup_bus(struct pci_bus *bus)
|
||||||
lba_dump_res(&iomem_resource, 2);
|
lba_dump_res(&iomem_resource, 2);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
bus->resource[i++] = &(ldev->hba.gmmio_space);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* advertize Host bridge resources to PCI bus */
|
|
||||||
bus->resource[0] = &(ldev->hba.io_space);
|
|
||||||
bus->resource[1] = &(ldev->hba.lmmio_space);
|
|
||||||
i=2;
|
|
||||||
if (ldev->hba.elmmio_space.start)
|
|
||||||
bus->resource[i++] = &(ldev->hba.elmmio_space);
|
|
||||||
if (ldev->hba.gmmio_space.start)
|
|
||||||
bus->resource[i++] = &(ldev->hba.gmmio_space);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
list_for_each(ln, &bus->devices) {
|
list_for_each(ln, &bus->devices) {
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* (c) Copyright 2000 Red Hat Software
|
* (c) Copyright 2000 Red Hat Software
|
||||||
* (c) Copyright 2000 Helge Deller <hdeller@redhat.com>
|
* (c) Copyright 2000 Helge Deller <hdeller@redhat.com>
|
||||||
* (c) Copyright 2001-2004 Helge Deller <deller@gmx.de>
|
* (c) Copyright 2001-2005 Helge Deller <deller@gmx.de>
|
||||||
* (c) Copyright 2001 Randolph Chung <tausq@debian.org>
|
* (c) Copyright 2001 Randolph Chung <tausq@debian.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -56,13 +56,13 @@
|
||||||
relatively large amount of CPU time, some of the calculations can be
|
relatively large amount of CPU time, some of the calculations can be
|
||||||
turned off with the following variables (controlled via procfs) */
|
turned off with the following variables (controlled via procfs) */
|
||||||
|
|
||||||
static int led_type = -1;
|
static int led_type __read_mostly = -1;
|
||||||
static unsigned char lastleds; /* LED state from most recent update */
|
static unsigned char lastleds; /* LED state from most recent update */
|
||||||
static unsigned int led_heartbeat = 1;
|
static unsigned int led_heartbeat __read_mostly = 1;
|
||||||
static unsigned int led_diskio = 1;
|
static unsigned int led_diskio __read_mostly = 1;
|
||||||
static unsigned int led_lanrxtx = 1;
|
static unsigned int led_lanrxtx __read_mostly = 1;
|
||||||
static char lcd_text[32];
|
static char lcd_text[32] __read_mostly;
|
||||||
static char lcd_text_default[32];
|
static char lcd_text_default[32] __read_mostly;
|
||||||
|
|
||||||
|
|
||||||
static struct workqueue_struct *led_wq;
|
static struct workqueue_struct *led_wq;
|
||||||
|
@ -108,7 +108,7 @@ struct pdc_chassis_lcd_info_ret_block {
|
||||||
/* lcd_info is pre-initialized to the values needed to program KittyHawk LCD's
|
/* lcd_info is pre-initialized to the values needed to program KittyHawk LCD's
|
||||||
* HP seems to have used Sharp/Hitachi HD44780 LCDs most of the time. */
|
* HP seems to have used Sharp/Hitachi HD44780 LCDs most of the time. */
|
||||||
static struct pdc_chassis_lcd_info_ret_block
|
static struct pdc_chassis_lcd_info_ret_block
|
||||||
lcd_info __attribute__((aligned(8))) =
|
lcd_info __attribute__((aligned(8))) __read_mostly =
|
||||||
{
|
{
|
||||||
.model = DISPLAY_MODEL_LCD,
|
.model = DISPLAY_MODEL_LCD,
|
||||||
.lcd_width = 16,
|
.lcd_width = 16,
|
||||||
|
@ -144,7 +144,7 @@ static int start_task(void)
|
||||||
device_initcall(start_task);
|
device_initcall(start_task);
|
||||||
|
|
||||||
/* ptr to LCD/LED-specific function */
|
/* ptr to LCD/LED-specific function */
|
||||||
static void (*led_func_ptr) (unsigned char);
|
static void (*led_func_ptr) (unsigned char) __read_mostly;
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
static int led_proc_read(char *page, char **start, off_t off, int count,
|
static int led_proc_read(char *page, char **start, off_t off, int count,
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
|
|
||||||
#define PDCS_VERSION "0.09"
|
#define PDCS_VERSION "0.10"
|
||||||
|
|
||||||
#define PDCS_ADDR_PPRI 0x00
|
#define PDCS_ADDR_PPRI 0x00
|
||||||
#define PDCS_ADDR_OSID 0x40
|
#define PDCS_ADDR_OSID 0x40
|
||||||
|
@ -70,7 +70,7 @@ MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_VERSION(PDCS_VERSION);
|
MODULE_VERSION(PDCS_VERSION);
|
||||||
|
|
||||||
static unsigned long pdcs_size = 0;
|
static unsigned long pdcs_size __read_mostly;
|
||||||
|
|
||||||
/* This struct defines what we need to deal with a parisc pdc path entry */
|
/* This struct defines what we need to deal with a parisc pdc path entry */
|
||||||
struct pdcspath_entry {
|
struct pdcspath_entry {
|
||||||
|
@ -194,7 +194,8 @@ pdcspath_store(struct pdcspath_entry *entry)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry->ready = 1;
|
/* kobject is already registered */
|
||||||
|
entry->ready = 2;
|
||||||
|
|
||||||
DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
|
DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
|
||||||
|
|
||||||
|
@ -653,15 +654,21 @@ pdcs_register_pathentries(void)
|
||||||
{
|
{
|
||||||
unsigned short i;
|
unsigned short i;
|
||||||
struct pdcspath_entry *entry;
|
struct pdcspath_entry *entry;
|
||||||
|
int err;
|
||||||
|
|
||||||
for (i = 0; (entry = pdcspath_entries[i]); i++) {
|
for (i = 0; (entry = pdcspath_entries[i]); i++) {
|
||||||
if (pdcspath_fetch(entry) < 0)
|
if (pdcspath_fetch(entry) < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
kobject_set_name(&entry->kobj, "%s", entry->name);
|
if ((err = kobject_set_name(&entry->kobj, "%s", entry->name)))
|
||||||
|
return err;
|
||||||
kobj_set_kset_s(entry, paths_subsys);
|
kobj_set_kset_s(entry, paths_subsys);
|
||||||
kobject_register(&entry->kobj);
|
if ((err = kobject_register(&entry->kobj)))
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* kobject is now registered */
|
||||||
|
entry->ready = 2;
|
||||||
|
|
||||||
if (!entry->dev)
|
if (!entry->dev)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -675,14 +682,14 @@ pdcs_register_pathentries(void)
|
||||||
/**
|
/**
|
||||||
* pdcs_unregister_pathentries - Routine called when unregistering the module.
|
* pdcs_unregister_pathentries - Routine called when unregistering the module.
|
||||||
*/
|
*/
|
||||||
static inline void __exit
|
static inline void
|
||||||
pdcs_unregister_pathentries(void)
|
pdcs_unregister_pathentries(void)
|
||||||
{
|
{
|
||||||
unsigned short i;
|
unsigned short i;
|
||||||
struct pdcspath_entry *entry;
|
struct pdcspath_entry *entry;
|
||||||
|
|
||||||
for (i = 0; (entry = pdcspath_entries[i]); i++)
|
for (i = 0; (entry = pdcspath_entries[i]); i++)
|
||||||
if (entry->ready)
|
if (entry->ready >= 2)
|
||||||
kobject_unregister(&entry->kobj);
|
kobject_unregister(&entry->kobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -704,7 +711,7 @@ pdc_stable_init(void)
|
||||||
|
|
||||||
/* For now we'll register the pdc subsys within this driver */
|
/* For now we'll register the pdc subsys within this driver */
|
||||||
if ((rc = firmware_register(&pdc_subsys)))
|
if ((rc = firmware_register(&pdc_subsys)))
|
||||||
return rc;
|
goto fail_firmreg;
|
||||||
|
|
||||||
/* Don't forget the info entry */
|
/* Don't forget the info entry */
|
||||||
for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++)
|
for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++)
|
||||||
|
@ -713,12 +720,25 @@ pdc_stable_init(void)
|
||||||
|
|
||||||
/* register the paths subsys as a subsystem of pdc subsys */
|
/* register the paths subsys as a subsystem of pdc subsys */
|
||||||
kset_set_kset_s(&paths_subsys, pdc_subsys);
|
kset_set_kset_s(&paths_subsys, pdc_subsys);
|
||||||
subsystem_register(&paths_subsys);
|
if ((rc= subsystem_register(&paths_subsys)))
|
||||||
|
goto fail_subsysreg;
|
||||||
|
|
||||||
/* now we create all "files" for the paths subsys */
|
/* now we create all "files" for the paths subsys */
|
||||||
pdcs_register_pathentries();
|
if ((rc = pdcs_register_pathentries()))
|
||||||
|
goto fail_pdcsreg;
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
return 0;
|
fail_pdcsreg:
|
||||||
|
pdcs_unregister_pathentries();
|
||||||
|
subsystem_unregister(&paths_subsys);
|
||||||
|
|
||||||
|
fail_subsysreg:
|
||||||
|
firmware_unregister(&pdc_subsys);
|
||||||
|
|
||||||
|
fail_firmreg:
|
||||||
|
printk(KERN_INFO "PDC Stable Storage bailing out\n");
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit
|
static void __exit
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* linux/arch/parisc/kernel/power.c
|
* linux/arch/parisc/kernel/power.c
|
||||||
* HP PARISC soft power switch support driver
|
* HP PARISC soft power switch support driver
|
||||||
*
|
*
|
||||||
* Copyright (c) 2001-2002 Helge Deller <deller@gmx.de>
|
* Copyright (c) 2001-2005 Helge Deller <deller@gmx.de>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -102,7 +102,7 @@ static DECLARE_WORK(poweroff_work, deferred_poweroff, NULL);
|
||||||
|
|
||||||
static void poweroff(void)
|
static void poweroff(void)
|
||||||
{
|
{
|
||||||
static int powering_off;
|
static int powering_off __read_mostly;
|
||||||
|
|
||||||
if (powering_off)
|
if (powering_off)
|
||||||
return;
|
return;
|
||||||
|
@ -113,7 +113,7 @@ static void poweroff(void)
|
||||||
|
|
||||||
|
|
||||||
/* local time-counter for shutdown */
|
/* local time-counter for shutdown */
|
||||||
static int shutdown_timer;
|
static int shutdown_timer __read_mostly;
|
||||||
|
|
||||||
/* check, give feedback and start shutdown after one second */
|
/* check, give feedback and start shutdown after one second */
|
||||||
static void process_shutdown(void)
|
static void process_shutdown(void)
|
||||||
|
@ -139,7 +139,7 @@ static void process_shutdown(void)
|
||||||
DECLARE_TASKLET_DISABLED(power_tasklet, NULL, 0);
|
DECLARE_TASKLET_DISABLED(power_tasklet, NULL, 0);
|
||||||
|
|
||||||
/* soft power switch enabled/disabled */
|
/* soft power switch enabled/disabled */
|
||||||
int pwrsw_enabled = 1;
|
int pwrsw_enabled __read_mostly = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On gecko style machines (e.g. 712/xx and 715/xx)
|
* On gecko style machines (e.g. 712/xx and 715/xx)
|
||||||
|
@ -149,7 +149,7 @@ int pwrsw_enabled = 1;
|
||||||
*/
|
*/
|
||||||
static void gecko_tasklet_func(unsigned long unused)
|
static void gecko_tasklet_func(unsigned long unused)
|
||||||
{
|
{
|
||||||
if (!pwrsw_enabled)
|
if (unlikely(!pwrsw_enabled))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (__getDIAG(25) & 0x80000000) {
|
if (__getDIAG(25) & 0x80000000) {
|
||||||
|
@ -173,7 +173,7 @@ static void polling_tasklet_func(unsigned long soft_power_reg)
|
||||||
{
|
{
|
||||||
unsigned long current_status;
|
unsigned long current_status;
|
||||||
|
|
||||||
if (!pwrsw_enabled)
|
if (unlikely(!pwrsw_enabled))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
current_status = gsc_readl(soft_power_reg);
|
current_status = gsc_readl(soft_power_reg);
|
||||||
|
|
|
@ -121,6 +121,7 @@ config PARPORT_GSC
|
||||||
tristate
|
tristate
|
||||||
default GSC
|
default GSC
|
||||||
depends on PARPORT
|
depends on PARPORT
|
||||||
|
select PARPORT_NOT_PC
|
||||||
|
|
||||||
config PARPORT_SUNBPP
|
config PARPORT_SUNBPP
|
||||||
tristate "Sparc hardware (EXPERIMENTAL)"
|
tristate "Sparc hardware (EXPERIMENTAL)"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* Low level Frame buffer driver for HP workstations with
|
* Low level Frame buffer driver for HP workstations with
|
||||||
* STI (standard text interface) video firmware.
|
* STI (standard text interface) video firmware.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2001-2004 Helge Deller <deller@gmx.de>
|
* Copyright (C) 2001-2005 Helge Deller <deller@gmx.de>
|
||||||
* Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
* Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||||
*
|
*
|
||||||
* Based on:
|
* Based on:
|
||||||
|
@ -73,16 +73,13 @@
|
||||||
#include "sticore.h"
|
#include "sticore.h"
|
||||||
|
|
||||||
/* REGION_BASE(fb_info, index) returns the virtual address for region <index> */
|
/* REGION_BASE(fb_info, index) returns the virtual address for region <index> */
|
||||||
#ifdef __LP64__
|
#define REGION_BASE(fb_info, index) \
|
||||||
#define REGION_BASE(fb_info, index) \
|
F_EXTEND(fb_info->sti->glob_cfg->region_ptrs[index])
|
||||||
(fb_info->sti->glob_cfg->region_ptrs[index] | 0xffffffff00000000)
|
|
||||||
#else
|
|
||||||
#define REGION_BASE(fb_info, index) \
|
|
||||||
fb_info->sti->glob_cfg->region_ptrs[index]
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NGLEDEVDEPROM_CRT_REGION 1
|
#define NGLEDEVDEPROM_CRT_REGION 1
|
||||||
|
|
||||||
|
#define NR_PALETTE 256
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
__s32 video_config_reg;
|
__s32 video_config_reg;
|
||||||
__s32 misc_video_start;
|
__s32 misc_video_start;
|
||||||
|
@ -112,7 +109,7 @@ struct stifb_info {
|
||||||
ngle_rom_t ngle_rom;
|
ngle_rom_t ngle_rom;
|
||||||
struct sti_struct *sti;
|
struct sti_struct *sti;
|
||||||
int deviceSpecificConfig;
|
int deviceSpecificConfig;
|
||||||
u32 pseudo_palette[256];
|
u32 pseudo_palette[16];
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __initdata stifb_bpp_pref[MAX_STI_ROMS];
|
static int __initdata stifb_bpp_pref[MAX_STI_ROMS];
|
||||||
|
@ -352,10 +349,10 @@ ARTIST_ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable)
|
||||||
#define IS_888_DEVICE(fb) \
|
#define IS_888_DEVICE(fb) \
|
||||||
(!(IS_24_DEVICE(fb)))
|
(!(IS_24_DEVICE(fb)))
|
||||||
|
|
||||||
#define GET_FIFO_SLOTS(fb, cnt, numslots) \
|
#define GET_FIFO_SLOTS(fb, cnt, numslots) \
|
||||||
{ while (cnt < numslots) \
|
{ while (cnt < numslots) \
|
||||||
cnt = READ_WORD(fb, REG_34); \
|
cnt = READ_WORD(fb, REG_34); \
|
||||||
cnt -= numslots; \
|
cnt -= numslots; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define IndexedDcd 0 /* Pixel data is indexed (pseudo) color */
|
#define IndexedDcd 0 /* Pixel data is indexed (pseudo) color */
|
||||||
|
@ -995,7 +992,7 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
|
||||||
struct stifb_info *fb = (struct stifb_info *) info;
|
struct stifb_info *fb = (struct stifb_info *) info;
|
||||||
u32 color;
|
u32 color;
|
||||||
|
|
||||||
if (regno >= 256) /* no. of hw registers */
|
if (regno >= NR_PALETTE)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
red >>= 8;
|
red >>= 8;
|
||||||
|
@ -1005,8 +1002,8 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
|
||||||
DEBUG_OFF();
|
DEBUG_OFF();
|
||||||
|
|
||||||
START_IMAGE_COLORMAP_ACCESS(fb);
|
START_IMAGE_COLORMAP_ACCESS(fb);
|
||||||
|
|
||||||
if (fb->info.var.grayscale) {
|
if (unlikely(fb->info.var.grayscale)) {
|
||||||
/* gray = 0.30*R + 0.59*G + 0.11*B */
|
/* gray = 0.30*R + 0.59*G + 0.11*B */
|
||||||
color = ((red * 77) +
|
color = ((red * 77) +
|
||||||
(green * 151) +
|
(green * 151) +
|
||||||
|
@ -1017,17 +1014,17 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
|
||||||
(blue));
|
(blue));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->var.bits_per_pixel == 32) {
|
if (fb->info.fix.visual == FB_VISUAL_DIRECTCOLOR) {
|
||||||
((u32 *)(info->pseudo_palette))[regno] =
|
struct fb_var_screeninfo *var = &fb->info.var;
|
||||||
(red << info->var.red.offset) |
|
if (regno < 16)
|
||||||
(green << info->var.green.offset) |
|
((u32 *)fb->info.pseudo_palette)[regno] =
|
||||||
(blue << info->var.blue.offset);
|
regno << var->red.offset |
|
||||||
} else {
|
regno << var->green.offset |
|
||||||
((u32 *)(info->pseudo_palette))[regno] = regno;
|
regno << var->blue.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE_IMAGE_COLOR(fb, regno, color);
|
WRITE_IMAGE_COLOR(fb, regno, color);
|
||||||
|
|
||||||
if (fb->id == S9000_ID_HCRX) {
|
if (fb->id == S9000_ID_HCRX) {
|
||||||
NgleLutBltCtl lutBltCtl;
|
NgleLutBltCtl lutBltCtl;
|
||||||
|
|
||||||
|
@ -1066,9 +1063,9 @@ stifb_blank(int blank_mode, struct fb_info *info)
|
||||||
case S9000_ID_HCRX:
|
case S9000_ID_HCRX:
|
||||||
HYPER_ENABLE_DISABLE_DISPLAY(fb, enable);
|
HYPER_ENABLE_DISABLE_DISPLAY(fb, enable);
|
||||||
break;
|
break;
|
||||||
case S9000_ID_A1659A:; /* fall through */
|
case S9000_ID_A1659A: /* fall through */
|
||||||
case S9000_ID_TIMBER:;
|
case S9000_ID_TIMBER:
|
||||||
case CRX24_OVERLAY_PLANES:;
|
case CRX24_OVERLAY_PLANES:
|
||||||
default:
|
default:
|
||||||
ENABLE_DISABLE_DISPLAY(fb, enable);
|
ENABLE_DISABLE_DISPLAY(fb, enable);
|
||||||
break;
|
break;
|
||||||
|
@ -1250,12 +1247,10 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
|
||||||
memset(&fb->ngle_rom, 0, sizeof(fb->ngle_rom));
|
memset(&fb->ngle_rom, 0, sizeof(fb->ngle_rom));
|
||||||
if ((fb->sti->regions_phys[0] & 0xfc000000) ==
|
if ((fb->sti->regions_phys[0] & 0xfc000000) ==
|
||||||
(fb->sti->regions_phys[2] & 0xfc000000))
|
(fb->sti->regions_phys[2] & 0xfc000000))
|
||||||
sti_rom_address = fb->sti->regions_phys[0];
|
sti_rom_address = F_EXTEND(fb->sti->regions_phys[0]);
|
||||||
else
|
else
|
||||||
sti_rom_address = fb->sti->regions_phys[1];
|
sti_rom_address = F_EXTEND(fb->sti->regions_phys[1]);
|
||||||
#ifdef __LP64__
|
|
||||||
sti_rom_address |= 0xffffffff00000000;
|
|
||||||
#endif
|
|
||||||
fb->deviceSpecificConfig = gsc_readl(sti_rom_address);
|
fb->deviceSpecificConfig = gsc_readl(sti_rom_address);
|
||||||
if (IS_24_DEVICE(fb)) {
|
if (IS_24_DEVICE(fb)) {
|
||||||
if (bpp_pref == 8 || bpp_pref == 32)
|
if (bpp_pref == 8 || bpp_pref == 32)
|
||||||
|
@ -1315,7 +1310,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
fix->type = FB_TYPE_PACKED_PIXELS;
|
fix->type = FB_TYPE_PACKED_PIXELS;
|
||||||
fix->visual = FB_VISUAL_TRUECOLOR;
|
fix->visual = FB_VISUAL_DIRECTCOLOR;
|
||||||
var->red.length = var->green.length = var->blue.length = var->transp.length = 8;
|
var->red.length = var->green.length = var->blue.length = var->transp.length = 8;
|
||||||
var->blue.offset = 0;
|
var->blue.offset = 0;
|
||||||
var->green.offset = 8;
|
var->green.offset = 8;
|
||||||
|
@ -1337,7 +1332,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref)
|
||||||
info->pseudo_palette = &fb->pseudo_palette;
|
info->pseudo_palette = &fb->pseudo_palette;
|
||||||
|
|
||||||
/* This has to been done !!! */
|
/* This has to been done !!! */
|
||||||
fb_alloc_cmap(&info->cmap, 256, 0);
|
fb_alloc_cmap(&info->cmap, NR_PALETTE, 0);
|
||||||
stifb_init_display(fb);
|
stifb_init_display(fb);
|
||||||
|
|
||||||
if (!request_mem_region(fix->smem_start, fix->smem_len, "stifb fb")) {
|
if (!request_mem_region(fix->smem_start, fix->smem_len, "stifb fb")) {
|
||||||
|
@ -1488,7 +1483,3 @@ module_exit(stifb_cleanup);
|
||||||
MODULE_AUTHOR("Helge Deller <deller@gmx.de>, Thomas Bogendoerfer <tsbogend@alpha.franken.de>");
|
MODULE_AUTHOR("Helge Deller <deller@gmx.de>, Thomas Bogendoerfer <tsbogend@alpha.franken.de>");
|
||||||
MODULE_DESCRIPTION("Framebuffer driver for HP's NGLE series graphics cards in HP PARISC machines");
|
MODULE_DESCRIPTION("Framebuffer driver for HP's NGLE series graphics cards in HP PARISC machines");
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
||||||
MODULE_PARM(bpp, "i");
|
|
||||||
MODULE_PARM_DESC(mem, "Bits per pixel (default: 8)");
|
|
||||||
|
|
||||||
|
|
|
@ -29,14 +29,14 @@
|
||||||
|
|
||||||
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
||||||
|
|
||||||
extern void flush_data_cache_local(void); /* flushes local data-cache only */
|
extern void flush_data_cache_local(void *); /* flushes local data-cache only */
|
||||||
extern void flush_instruction_cache_local(void); /* flushes local code-cache only */
|
extern void flush_instruction_cache_local(void *); /* flushes local code-cache only */
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
extern void flush_data_cache(void); /* flushes data-cache only (all processors) */
|
extern void flush_data_cache(void); /* flushes data-cache only (all processors) */
|
||||||
extern void flush_instruction_cache(void); /* flushes i-cache only (all processors) */
|
extern void flush_instruction_cache(void); /* flushes i-cache only (all processors) */
|
||||||
#else
|
#else
|
||||||
#define flush_data_cache flush_data_cache_local
|
#define flush_data_cache() flush_data_cache_local(NULL)
|
||||||
#define flush_instruction_cache flush_instruction_cache_local
|
#define flush_instruction_cache() flush_instruction_cache_local(NULL)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void parisc_cache_init(void); /* initializes cache-flushing */
|
extern void parisc_cache_init(void); /* initializes cache-flushing */
|
||||||
|
|
|
@ -41,7 +41,7 @@ extern void __raw_bad_addr(const volatile void __iomem *addr);
|
||||||
#define __raw_check_addr(addr) \
|
#define __raw_check_addr(addr) \
|
||||||
if (((unsigned long)addr >> NYBBLE_SHIFT) != 0xe) \
|
if (((unsigned long)addr >> NYBBLE_SHIFT) != 0xe) \
|
||||||
__raw_bad_addr(addr); \
|
__raw_bad_addr(addr); \
|
||||||
addr = (void *)((unsigned long)addr | (0xfUL << NYBBLE_SHIFT));
|
addr = (void __iomem *)((unsigned long)addr | (0xfUL << NYBBLE_SHIFT));
|
||||||
#else
|
#else
|
||||||
#define gsc_check_addr(addr)
|
#define gsc_check_addr(addr)
|
||||||
#define __raw_check_addr(addr)
|
#define __raw_check_addr(addr)
|
||||||
|
|
|
@ -135,6 +135,13 @@ extern int npmem_ranges;
|
||||||
#define pfn_valid(pfn) ((pfn) < max_mapnr)
|
#define pfn_valid(pfn) ((pfn) < max_mapnr)
|
||||||
#endif /* CONFIG_DISCONTIGMEM */
|
#endif /* CONFIG_DISCONTIGMEM */
|
||||||
|
|
||||||
|
#ifdef CONFIG_HUGETLB_PAGE
|
||||||
|
#define HPAGE_SHIFT 22 /* 4MB (is this fixed?) */
|
||||||
|
#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT)
|
||||||
|
#define HPAGE_MASK (~(HPAGE_SIZE - 1))
|
||||||
|
#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
||||||
|
|
||||||
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
|
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
|
||||||
|
|
|
@ -84,11 +84,17 @@ static __inline__ int pci_is_lmmio(struct pci_hba_data *hba, unsigned long a)
|
||||||
/*
|
/*
|
||||||
** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses.
|
** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses.
|
||||||
** See pcibios.c for more conversions used by Generic PCI code.
|
** See pcibios.c for more conversions used by Generic PCI code.
|
||||||
|
**
|
||||||
|
** Platform characteristics/firmware guarantee that
|
||||||
|
** (1) PA_VIEW - IO_VIEW = lmmio_offset for both LMMIO and ELMMIO
|
||||||
|
** (2) PA_VIEW == IO_VIEW for GMMIO
|
||||||
*/
|
*/
|
||||||
#define PCI_BUS_ADDR(hba,a) (PCI_IS_LMMIO(hba,a) \
|
#define PCI_BUS_ADDR(hba,a) (PCI_IS_LMMIO(hba,a) \
|
||||||
? ((a) - hba->lmmio_space_offset) /* mangle LMMIO */ \
|
? ((a) - hba->lmmio_space_offset) /* mangle LMMIO */ \
|
||||||
: (a)) /* GMMIO */
|
: (a)) /* GMMIO */
|
||||||
#define PCI_HOST_ADDR(hba,a) ((a) + hba->lmmio_space_offset)
|
#define PCI_HOST_ADDR(hba,a) (((a) & PCI_F_EXTEND) == 0 \
|
||||||
|
? (a) + hba->lmmio_space_offset \
|
||||||
|
: (a))
|
||||||
|
|
||||||
#else /* !CONFIG_64BIT */
|
#else /* !CONFIG_64BIT */
|
||||||
|
|
||||||
|
|
|
@ -144,16 +144,16 @@ struct thread_struct {
|
||||||
})
|
})
|
||||||
|
|
||||||
#define INIT_THREAD { \
|
#define INIT_THREAD { \
|
||||||
regs: { gr: { 0, }, \
|
.regs = { .gr = { 0, }, \
|
||||||
fr: { 0, }, \
|
.fr = { 0, }, \
|
||||||
sr: { 0, }, \
|
.sr = { 0, }, \
|
||||||
iasq: { 0, }, \
|
.iasq = { 0, }, \
|
||||||
iaoq: { 0, }, \
|
.iaoq = { 0, }, \
|
||||||
cr27: 0, \
|
.cr27 = 0, \
|
||||||
}, \
|
}, \
|
||||||
task_size: DEFAULT_TASK_SIZE, \
|
.task_size = DEFAULT_TASK_SIZE, \
|
||||||
map_base: DEFAULT_MAP_BASE, \
|
.map_base = DEFAULT_MAP_BASE, \
|
||||||
flags: 0 \
|
.flags = 0 \
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -22,6 +22,7 @@ extern spinlock_t pa_tlb_lock;
|
||||||
#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
|
#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
|
||||||
|
|
||||||
extern void flush_tlb_all(void);
|
extern void flush_tlb_all(void);
|
||||||
|
extern void flush_tlb_all_local(void *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* flush_tlb_mm()
|
* flush_tlb_mm()
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
#define SMP_CACHE_BYTES L1_CACHE_BYTES
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_IA64)
|
#if defined(CONFIG_X86) || defined(CONFIG_SPARC64) || defined(CONFIG_IA64) || defined(CONFIG_PARISC)
|
||||||
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
|
||||||
#else
|
#else
|
||||||
#define __read_mostly
|
#define __read_mostly
|
||||||
|
|
|
@ -1236,7 +1236,7 @@ harmony_driver_probe(struct parisc_device *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the HPA of harmony */
|
/* Set the HPA of harmony */
|
||||||
harmony.hpa = (struct harmony_hpa *)dev->hpa;
|
harmony.hpa = (struct harmony_hpa *)dev->hpa.start;
|
||||||
harmony.dev = dev;
|
harmony.dev = dev;
|
||||||
|
|
||||||
/* Grab the ID and revision from the device */
|
/* Grab the ID and revision from the device */
|
||||||
|
@ -1250,7 +1250,7 @@ harmony_driver_probe(struct parisc_device *dev)
|
||||||
|
|
||||||
printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", "
|
printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", "
|
||||||
"h/w id %i, rev. %i at 0x%lx, IRQ %i\n",
|
"h/w id %i, rev. %i at 0x%lx, IRQ %i\n",
|
||||||
id, rev, dev->hpa, harmony.dev->irq);
|
id, rev, dev->hpa.start, harmony.dev->irq);
|
||||||
|
|
||||||
/* Make sure the control bit isn't set, although I don't think it
|
/* Make sure the control bit isn't set, although I don't think it
|
||||||
ever is. */
|
ever is. */
|
||||||
|
|
Loading…
Reference in New Issue