Merge branches 'at91', 'dyntick', 'ep93xx', 'iop', 'ixp', 'misc', 'orion', 'omap-reviewed', 'rpc', 'rtc' and 's3c' into devel
This commit is contained in:

committed by
Russell King

@@ -680,7 +680,7 @@ static int __init ecard_probeirqhw(void)
|
||||
#define IO_EC_MEMC8_BASE 0
|
||||
#endif
|
||||
|
||||
unsigned int __ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed)
|
||||
static unsigned int __ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed)
|
||||
{
|
||||
unsigned long address = 0;
|
||||
int slot = ec->slot_no;
|
||||
@@ -1002,7 +1002,7 @@ ecard_probe(int slot, card_type_t type)
|
||||
}
|
||||
|
||||
rc = -ENODEV;
|
||||
if ((ec->podaddr = ecard_address(ec, type, ECARD_SYNC)) == 0)
|
||||
if ((ec->podaddr = __ecard_address(ec, type, ECARD_SYNC)) == 0)
|
||||
goto nodev;
|
||||
|
||||
cid.r_zero = 1;
|
||||
@@ -1141,10 +1141,10 @@ static int ecard_drv_probe(struct device *dev)
|
||||
|
||||
id = ecard_match_device(drv->id_table, ec);
|
||||
|
||||
ecard_claim(ec);
|
||||
ec->claimed = 1;
|
||||
ret = drv->probe(ec, id);
|
||||
if (ret)
|
||||
ecard_release(ec);
|
||||
ec->claimed = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1154,7 +1154,7 @@ static int ecard_drv_remove(struct device *dev)
|
||||
struct ecard_driver *drv = ECARD_DRV(dev->driver);
|
||||
|
||||
drv->remove(ec);
|
||||
ecard_release(ec);
|
||||
ec->claimed = 0;
|
||||
|
||||
/*
|
||||
* Restore the default operations. We ensure that the
|
||||
@@ -1182,7 +1182,7 @@ static void ecard_drv_shutdown(struct device *dev)
|
||||
if (dev->driver) {
|
||||
if (drv->shutdown)
|
||||
drv->shutdown(ec);
|
||||
ecard_release(ec);
|
||||
ec->claimed = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1239,7 +1239,6 @@ static int ecard_bus_init(void)
|
||||
postcore_initcall(ecard_bus_init);
|
||||
|
||||
EXPORT_SYMBOL(ecard_readchunk);
|
||||
EXPORT_SYMBOL(__ecard_address);
|
||||
EXPORT_SYMBOL(ecard_register_driver);
|
||||
EXPORT_SYMBOL(ecard_remove_driver);
|
||||
EXPORT_SYMBOL(ecard_bus_type);
|
||||
|
@@ -54,3 +54,16 @@ struct ex_chunk_dir {
|
||||
#define c_len(x) ((x)->r_len[0]|((x)->r_len[1]<<8)|((x)->r_len[2]<<16))
|
||||
#define c_start(x) ((x)->r_start)
|
||||
};
|
||||
|
||||
typedef enum ecard_type { /* Cards address space */
|
||||
ECARD_IOC,
|
||||
ECARD_MEMC,
|
||||
ECARD_EASI
|
||||
} card_type_t;
|
||||
|
||||
typedef enum { /* Speed for ECARD_IOC space */
|
||||
ECARD_SLOW = 0,
|
||||
ECARD_MEDIUM = 1,
|
||||
ECARD_FAST = 2,
|
||||
ECARD_SYNC = 3
|
||||
} card_speed_t;
|
||||
|
@@ -133,10 +133,8 @@ static void default_idle(void)
|
||||
cpu_relax();
|
||||
else {
|
||||
local_irq_disable();
|
||||
if (!need_resched()) {
|
||||
timer_dyn_reprogram();
|
||||
if (!need_resched())
|
||||
arch_idle();
|
||||
}
|
||||
local_irq_enable();
|
||||
}
|
||||
}
|
||||
|
@@ -36,6 +36,7 @@ EXPORT_SYMBOL(walk_stackframe);
|
||||
#ifdef CONFIG_STACKTRACE
|
||||
struct stack_trace_data {
|
||||
struct stack_trace *trace;
|
||||
unsigned int no_sched_functions;
|
||||
unsigned int skip;
|
||||
};
|
||||
|
||||
@@ -43,27 +44,52 @@ static int save_trace(struct stackframe *frame, void *d)
|
||||
{
|
||||
struct stack_trace_data *data = d;
|
||||
struct stack_trace *trace = data->trace;
|
||||
unsigned long addr = frame->lr;
|
||||
|
||||
if (data->no_sched_functions && in_sched_functions(addr))
|
||||
return 0;
|
||||
if (data->skip) {
|
||||
data->skip--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
trace->entries[trace->nr_entries++] = frame->lr;
|
||||
trace->entries[trace->nr_entries++] = addr;
|
||||
|
||||
return trace->nr_entries >= trace->max_entries;
|
||||
}
|
||||
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
{
|
||||
struct stack_trace_data data;
|
||||
unsigned long fp, base;
|
||||
|
||||
data.trace = trace;
|
||||
data.skip = trace->skip;
|
||||
base = (unsigned long)task_stack_page(current);
|
||||
asm("mov %0, fp" : "=r" (fp));
|
||||
base = (unsigned long)task_stack_page(tsk);
|
||||
|
||||
if (tsk != current) {
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* What guarantees do we have here that 'tsk'
|
||||
* is not running on another CPU?
|
||||
*/
|
||||
BUG();
|
||||
#else
|
||||
data.no_sched_functions = 1;
|
||||
fp = thread_saved_fp(tsk);
|
||||
#endif
|
||||
} else {
|
||||
data.no_sched_functions = 0;
|
||||
asm("mov %0, fp" : "=r" (fp));
|
||||
}
|
||||
|
||||
walk_stackframe(fp, base, base + THREAD_SIZE, save_trace, &data);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
{
|
||||
save_stack_trace_tsk(current, trace);
|
||||
}
|
||||
#endif
|
||||
|
@@ -365,108 +365,6 @@ static struct sysdev_class timer_sysclass = {
|
||||
.resume = timer_resume,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
static int timer_dyn_tick_enable(void)
|
||||
{
|
||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||
unsigned long flags;
|
||||
int ret = -ENODEV;
|
||||
|
||||
if (dyn_tick) {
|
||||
spin_lock_irqsave(&dyn_tick->lock, flags);
|
||||
ret = 0;
|
||||
if (!(dyn_tick->state & DYN_TICK_ENABLED)) {
|
||||
ret = dyn_tick->enable();
|
||||
|
||||
if (ret == 0)
|
||||
dyn_tick->state |= DYN_TICK_ENABLED;
|
||||
}
|
||||
spin_unlock_irqrestore(&dyn_tick->lock, flags);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int timer_dyn_tick_disable(void)
|
||||
{
|
||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||
unsigned long flags;
|
||||
int ret = -ENODEV;
|
||||
|
||||
if (dyn_tick) {
|
||||
spin_lock_irqsave(&dyn_tick->lock, flags);
|
||||
ret = 0;
|
||||
if (dyn_tick->state & DYN_TICK_ENABLED) {
|
||||
ret = dyn_tick->disable();
|
||||
|
||||
if (ret == 0)
|
||||
dyn_tick->state &= ~DYN_TICK_ENABLED;
|
||||
}
|
||||
spin_unlock_irqrestore(&dyn_tick->lock, flags);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reprogram the system timer for at least the calculated time interval.
|
||||
* This function should be called from the idle thread with IRQs disabled,
|
||||
* immediately before sleeping.
|
||||
*/
|
||||
void timer_dyn_reprogram(void)
|
||||
{
|
||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||
unsigned long next, seq, flags;
|
||||
|
||||
if (!dyn_tick)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&dyn_tick->lock, flags);
|
||||
if (dyn_tick->state & DYN_TICK_ENABLED) {
|
||||
next = next_timer_interrupt();
|
||||
do {
|
||||
seq = read_seqbegin(&xtime_lock);
|
||||
dyn_tick->reprogram(next - jiffies);
|
||||
} while (read_seqretry(&xtime_lock, seq));
|
||||
}
|
||||
spin_unlock_irqrestore(&dyn_tick->lock, flags);
|
||||
}
|
||||
|
||||
static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%i\n",
|
||||
(system_timer->dyn_tick->state & DYN_TICK_ENABLED) >> 1);
|
||||
}
|
||||
|
||||
static ssize_t timer_set_dyn_tick(struct sys_device *dev, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
unsigned int enable = simple_strtoul(buf, NULL, 2);
|
||||
|
||||
if (enable)
|
||||
timer_dyn_tick_enable();
|
||||
else
|
||||
timer_dyn_tick_disable();
|
||||
|
||||
return count;
|
||||
}
|
||||
static SYSDEV_ATTR(dyn_tick, 0644, timer_show_dyn_tick, timer_set_dyn_tick);
|
||||
|
||||
/*
|
||||
* dyntick=enable|disable
|
||||
*/
|
||||
static char dyntick_str[4] __initdata = "";
|
||||
|
||||
static int __init dyntick_setup(char *str)
|
||||
{
|
||||
if (str)
|
||||
strlcpy(dyntick_str, str, sizeof(dyntick_str));
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("dyntick=", dyntick_setup);
|
||||
#endif
|
||||
|
||||
static int __init timer_init_sysfs(void)
|
||||
{
|
||||
int ret = sysdev_class_register(&timer_sysclass);
|
||||
@@ -475,19 +373,6 @@ static int __init timer_init_sysfs(void)
|
||||
ret = sysdev_register(&system_timer->dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
if (ret == 0 && system_timer->dyn_tick) {
|
||||
ret = sysdev_create_file(&system_timer->dev, &attr_dyn_tick);
|
||||
|
||||
/*
|
||||
* Turn on dynamic tick after calibrate delay
|
||||
* for correct bogomips
|
||||
*/
|
||||
if (ret == 0 && dyntick_str[0] == 'e')
|
||||
ret = timer_dyn_tick_enable();
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -500,10 +385,5 @@ void __init time_init(void)
|
||||
system_timer->offset = dummy_gettimeoffset;
|
||||
#endif
|
||||
system_timer->init();
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
if (system_timer->dyn_tick)
|
||||
spin_lock_init(&system_timer->dyn_tick->lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user