Commit 4732158c authored by Anton Blanchard's avatar Anton Blanchard

Merge samba.org:/scratch/anton/linux-2.5

into samba.org:/scratch/anton/export
parents 459d979e 23f3c02f
...@@ -58,7 +58,7 @@ static void nmi_save_registers(struct op_msrs * msrs) ...@@ -58,7 +58,7 @@ static void nmi_save_registers(struct op_msrs * msrs)
unsigned int const nr_ctrls = model->num_controls; unsigned int const nr_ctrls = model->num_controls;
struct op_msr_group * counters = &msrs->counters; struct op_msr_group * counters = &msrs->counters;
struct op_msr_group * controls = &msrs->controls; struct op_msr_group * controls = &msrs->controls;
int i; unsigned int i;
for (i = 0; i < nr_ctrs; ++i) { for (i = 0; i < nr_ctrs; ++i) {
rdmsr(counters->addrs[i], rdmsr(counters->addrs[i],
...@@ -108,7 +108,7 @@ static void nmi_restore_registers(struct op_msrs * msrs) ...@@ -108,7 +108,7 @@ static void nmi_restore_registers(struct op_msrs * msrs)
unsigned int const nr_ctrls = model->num_controls; unsigned int const nr_ctrls = model->num_controls;
struct op_msr_group * counters = &msrs->counters; struct op_msr_group * counters = &msrs->counters;
struct op_msr_group * controls = &msrs->controls; struct op_msr_group * controls = &msrs->controls;
int i; unsigned int i;
for (i = 0; i < nr_ctrls; ++i) { for (i = 0; i < nr_ctrls; ++i) {
wrmsr(controls->addrs[i], wrmsr(controls->addrs[i],
...@@ -182,7 +182,7 @@ struct op_counter_config counter_config[OP_MAX_COUNTER]; ...@@ -182,7 +182,7 @@ struct op_counter_config counter_config[OP_MAX_COUNTER];
static int nmi_create_files(struct super_block * sb, struct dentry * root) static int nmi_create_files(struct super_block * sb, struct dentry * root)
{ {
int i; unsigned int i;
for (i = 0; i < model->num_counters; ++i) { for (i = 0; i < model->num_counters; ++i) {
struct dentry * dir; struct dentry * dir;
......
...@@ -389,7 +389,7 @@ static unsigned long reset_value[NUM_COUNTERS_NON_HT]; ...@@ -389,7 +389,7 @@ static unsigned long reset_value[NUM_COUNTERS_NON_HT];
static void p4_fill_in_addresses(struct op_msrs * const msrs) static void p4_fill_in_addresses(struct op_msrs * const msrs)
{ {
int i; unsigned int i;
unsigned int addr, stag; unsigned int addr, stag;
setup_num_counters(); setup_num_counters();
......
...@@ -151,9 +151,14 @@ config CPU_FREQ ...@@ -151,9 +151,14 @@ config CPU_FREQ
If in doubt, say N. If in doubt, say N.
config CPU_FREQ_TABLE config CPU_FREQ_TABLE
tristate tristate "CPU frequency table helpers"
depends on CPU_FREQ
default y default y
help
Many CPUFreq drivers use these helpers, so only say N here if
the CPUFreq driver of your choice doesn't need these helpers.
If in doubt, say Y.
config US3_FREQ config US3_FREQ
tristate "UltraSPARC-III CPU Frequency driver" tristate "UltraSPARC-III CPU Frequency driver"
......
...@@ -59,12 +59,9 @@ void platform_device_unregister(struct platform_device * pdev) ...@@ -59,12 +59,9 @@ void platform_device_unregister(struct platform_device * pdev)
static int platform_match(struct device * dev, struct device_driver * drv) static int platform_match(struct device * dev, struct device_driver * drv)
{ {
char name[BUS_ID_SIZE]; struct platform_device *pdev = container_of(dev, struct platform_device, dev);
if (sscanf(dev->bus_id,"%s",name)) return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);
return (strcmp(name,drv->name) == 0);
return 0;
} }
struct bus_type platform_bus_type = { struct bus_type platform_bus_type = {
......
...@@ -511,7 +511,7 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy, ...@@ -511,7 +511,7 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
cpu_min_freq[cpu] = policy->min; cpu_min_freq[cpu] = policy->min;
cpu_max_freq[cpu] = policy->max; cpu_max_freq[cpu] = policy->max;
cpu_cur_freq[cpu] = policy->cur; cpu_cur_freq[cpu] = policy->cur;
device_create_file (policy->intf.dev, &dev_attr_scaling_setspeed); device_create_file (policy->dev, &dev_attr_scaling_setspeed);
memcpy (&current_policy[cpu], policy, sizeof(struct cpufreq_policy)); memcpy (&current_policy[cpu], policy, sizeof(struct cpufreq_policy));
up(&userspace_sem); up(&userspace_sem);
break; break;
...@@ -520,7 +520,7 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy, ...@@ -520,7 +520,7 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
cpu_is_managed[cpu] = 0; cpu_is_managed[cpu] = 0;
cpu_min_freq[cpu] = 0; cpu_min_freq[cpu] = 0;
cpu_max_freq[cpu] = 0; cpu_max_freq[cpu] = 0;
device_remove_file (policy->intf.dev, &dev_attr_scaling_setspeed); device_remove_file (policy->dev, &dev_attr_scaling_setspeed);
up(&userspace_sem); up(&userspace_sem);
module_put(THIS_MODULE); module_put(THIS_MODULE);
break; break;
......
...@@ -277,10 +277,7 @@ static void release_mm(struct mm_struct * mm) ...@@ -277,10 +277,7 @@ static void release_mm(struct mm_struct * mm)
*/ */
static struct mm_struct * take_task_mm(struct task_struct * task) static struct mm_struct * take_task_mm(struct task_struct * task)
{ {
struct mm_struct * mm; struct mm_struct * mm = task->mm;
task_lock(task);
mm = task->mm;
task_unlock(task);
/* if task->mm !NULL, mm_count must be at least 1. It cannot /* if task->mm !NULL, mm_count must be at least 1. It cannot
* drop to 0 without the task exiting, which will have to sleep * drop to 0 without the task exiting, which will have to sleep
...@@ -310,6 +307,32 @@ static inline int is_ctx_switch(unsigned long val) ...@@ -310,6 +307,32 @@ static inline int is_ctx_switch(unsigned long val)
} }
/* compute number of filled slots in cpu_buffer queue */
static unsigned long nr_filled_slots(struct oprofile_cpu_buffer * b)
{
unsigned long head = b->head_pos;
unsigned long tail = b->tail_pos;
if (head >= tail)
return head - tail;
return head + (b->buffer_size - tail);
}
static void increment_tail(struct oprofile_cpu_buffer * b)
{
unsigned long new_tail = b->tail_pos + 1;
rmb();
if (new_tail < (b->buffer_size))
b->tail_pos = new_tail;
else
b->tail_pos = 0;
}
/* Sync one of the CPU's buffers into the global event buffer. /* Sync one of the CPU's buffers into the global event buffer.
* Here we need to go through each batch of samples punctuated * Here we need to go through each batch of samples punctuated
* by context switch notes, taking the task's mmap_sem and doing * by context switch notes, taking the task's mmap_sem and doing
...@@ -322,10 +345,14 @@ static void sync_buffer(struct oprofile_cpu_buffer * cpu_buf) ...@@ -322,10 +345,14 @@ static void sync_buffer(struct oprofile_cpu_buffer * cpu_buf)
struct task_struct * new; struct task_struct * new;
unsigned long cookie; unsigned long cookie;
int in_kernel = 1; int in_kernel = 1;
int i; unsigned int i;
for (i=0; i < cpu_buf->pos; ++i) { /* Remember, only we can modify tail_pos */
struct op_sample * s = &cpu_buf->buffer[i];
unsigned long const available_elements = nr_filled_slots(cpu_buf);
for (i=0; i < available_elements; ++i) {
struct op_sample * s = &cpu_buf->buffer[cpu_buf->tail_pos];
if (is_ctx_switch(s->eip)) { if (is_ctx_switch(s->eip)) {
if (s->event <= 1) { if (s->event <= 1) {
...@@ -345,6 +372,8 @@ static void sync_buffer(struct oprofile_cpu_buffer * cpu_buf) ...@@ -345,6 +372,8 @@ static void sync_buffer(struct oprofile_cpu_buffer * cpu_buf)
} else { } else {
add_sample(mm, s, in_kernel); add_sample(mm, s, in_kernel);
} }
increment_tail(cpu_buf);
} }
release_mm(mm); release_mm(mm);
...@@ -369,17 +398,8 @@ static void sync_cpu_buffers(void) ...@@ -369,17 +398,8 @@ static void sync_cpu_buffers(void)
cpu_buf = &cpu_buffer[i]; cpu_buf = &cpu_buffer[i];
/* We take a spin lock even though we might add_cpu_switch(i);
* sleep. It's OK because other users are try sync_buffer(cpu_buf);
* lockers only, and this region is already
* protected by buffer_sem. It's raw to prevent
* the preempt bogometer firing. Fruity, huh ? */
if (cpu_buf->pos > 0) {
_raw_spin_lock(&cpu_buf->int_lock);
add_cpu_switch(i);
sync_buffer(cpu_buf);
_raw_spin_unlock(&cpu_buf->int_lock);
}
} }
up(&buffer_sem); up(&buffer_sem);
......
...@@ -26,8 +26,6 @@ ...@@ -26,8 +26,6 @@
struct oprofile_cpu_buffer cpu_buffer[NR_CPUS] __cacheline_aligned; struct oprofile_cpu_buffer cpu_buffer[NR_CPUS] __cacheline_aligned;
static unsigned long buffer_size;
static void __free_cpu_buffers(int num) static void __free_cpu_buffers(int num)
{ {
int i; int i;
...@@ -47,7 +45,7 @@ int alloc_cpu_buffers(void) ...@@ -47,7 +45,7 @@ int alloc_cpu_buffers(void)
{ {
int i; int i;
buffer_size = fs_cpu_buffer_size; unsigned long buffer_size = fs_cpu_buffer_size;
for (i=0; i < NR_CPUS; ++i) { for (i=0; i < NR_CPUS; ++i) {
struct oprofile_cpu_buffer * b = &cpu_buffer[i]; struct oprofile_cpu_buffer * b = &cpu_buffer[i];
...@@ -59,12 +57,12 @@ int alloc_cpu_buffers(void) ...@@ -59,12 +57,12 @@ int alloc_cpu_buffers(void)
if (!b->buffer) if (!b->buffer)
goto fail; goto fail;
spin_lock_init(&b->int_lock);
b->pos = 0;
b->last_task = 0; b->last_task = 0;
b->last_is_kernel = -1; b->last_is_kernel = -1;
b->buffer_size = buffer_size;
b->tail_pos = 0;
b->head_pos = 0;
b->sample_received = 0; b->sample_received = 0;
b->sample_lost_locked = 0;
b->sample_lost_overflow = 0; b->sample_lost_overflow = 0;
b->sample_lost_task_exit = 0; b->sample_lost_task_exit = 0;
} }
...@@ -80,11 +78,41 @@ void free_cpu_buffers(void) ...@@ -80,11 +78,41 @@ void free_cpu_buffers(void)
__free_cpu_buffers(NR_CPUS); __free_cpu_buffers(NR_CPUS);
} }
/* Note we can't use a semaphore here as this is supposed to /* compute number of available slots in cpu_buffer queue */
* be safe from any context. Instead we trylock the CPU's int_lock. static unsigned long nr_available_slots(struct oprofile_cpu_buffer const * b)
* int_lock is taken by the processing code in sync_cpu_buffers() {
* so we avoid disturbing that. unsigned long head = b->head_pos;
unsigned long tail = b->tail_pos;
if (tail == head)
return b->buffer_size;
if (tail > head)
return tail - head;
return tail + (b->buffer_size - head);
}
static void increment_head(struct oprofile_cpu_buffer * b)
{
unsigned long new_head = b->head_pos + 1;
/* Ensure anything written to the slot before we
* increment is visible */
wmb();
if (new_head < (b->buffer_size))
b->head_pos = new_head;
else
b->head_pos = 0;
}
/* This must be safe from any context. It's safe writing here
* because of the head/tail separation of the writer and reader
* of the CPU buffer.
* *
* is_kernel is needed because on some architectures you cannot * is_kernel is needed because on some architectures you cannot
* tell if you are in kernel or user space simply by looking at * tell if you are in kernel or user space simply by looking at
...@@ -101,14 +129,10 @@ void oprofile_add_sample(unsigned long eip, unsigned int is_kernel, ...@@ -101,14 +129,10 @@ void oprofile_add_sample(unsigned long eip, unsigned int is_kernel,
cpu_buf->sample_received++; cpu_buf->sample_received++;
if (!spin_trylock(&cpu_buf->int_lock)) {
cpu_buf->sample_lost_locked++;
return;
}
if (cpu_buf->pos > buffer_size - 2) { if (nr_available_slots(cpu_buf) < 3) {
cpu_buf->sample_lost_overflow++; cpu_buf->sample_lost_overflow++;
goto out; return;
} }
task = current; task = current;
...@@ -116,18 +140,18 @@ void oprofile_add_sample(unsigned long eip, unsigned int is_kernel, ...@@ -116,18 +140,18 @@ void oprofile_add_sample(unsigned long eip, unsigned int is_kernel,
/* notice a switch from user->kernel or vice versa */ /* notice a switch from user->kernel or vice versa */
if (cpu_buf->last_is_kernel != is_kernel) { if (cpu_buf->last_is_kernel != is_kernel) {
cpu_buf->last_is_kernel = is_kernel; cpu_buf->last_is_kernel = is_kernel;
cpu_buf->buffer[cpu_buf->pos].eip = ~0UL; cpu_buf->buffer[cpu_buf->head_pos].eip = ~0UL;
cpu_buf->buffer[cpu_buf->pos].event = is_kernel; cpu_buf->buffer[cpu_buf->head_pos].event = is_kernel;
cpu_buf->pos++; increment_head(cpu_buf);
} }
/* notice a task switch */ /* notice a task switch */
if (cpu_buf->last_task != task) { if (cpu_buf->last_task != task) {
cpu_buf->last_task = task; cpu_buf->last_task = task;
if (!(task->flags & PF_EXITING)) { if (!(task->flags & PF_EXITING)) {
cpu_buf->buffer[cpu_buf->pos].eip = ~0UL; cpu_buf->buffer[cpu_buf->head_pos].eip = ~0UL;
cpu_buf->buffer[cpu_buf->pos].event = (unsigned long)task; cpu_buf->buffer[cpu_buf->head_pos].event = (unsigned long)task;
cpu_buf->pos++; increment_head(cpu_buf);
} }
} }
...@@ -138,23 +162,20 @@ void oprofile_add_sample(unsigned long eip, unsigned int is_kernel, ...@@ -138,23 +162,20 @@ void oprofile_add_sample(unsigned long eip, unsigned int is_kernel,
*/ */
if (task->flags & PF_EXITING) { if (task->flags & PF_EXITING) {
cpu_buf->sample_lost_task_exit++; cpu_buf->sample_lost_task_exit++;
goto out; return;
} }
cpu_buf->buffer[cpu_buf->pos].eip = eip; cpu_buf->buffer[cpu_buf->head_pos].eip = eip;
cpu_buf->buffer[cpu_buf->pos].event = event; cpu_buf->buffer[cpu_buf->head_pos].event = event;
cpu_buf->pos++; increment_head(cpu_buf);
out:
spin_unlock(&cpu_buf->int_lock);
} }
/* resets the cpu buffer to a sane state - should be called with /* resets the cpu buffer to a sane state - should be called with
* cpu_buf->int_lock held * cpu_buf->int_lock held
*/ */
void cpu_buffer_reset(struct oprofile_cpu_buffer *cpu_buf) void cpu_buffer_reset(struct oprofile_cpu_buffer *cpu_buf)
{ {
cpu_buf->pos = 0;
/* reset these to invalid values; the next sample /* reset these to invalid values; the next sample
* collected will populate the buffer with proper * collected will populate the buffer with proper
* values to initialize the buffer * values to initialize the buffer
...@@ -162,4 +183,3 @@ void cpu_buffer_reset(struct oprofile_cpu_buffer *cpu_buf) ...@@ -162,4 +183,3 @@ void cpu_buffer_reset(struct oprofile_cpu_buffer *cpu_buf)
cpu_buf->last_is_kernel = -1; cpu_buf->last_is_kernel = -1;
cpu_buf->last_task = 0; cpu_buf->last_task = 0;
} }
...@@ -30,14 +30,13 @@ struct op_sample { ...@@ -30,14 +30,13 @@ struct op_sample {
}; };
struct oprofile_cpu_buffer { struct oprofile_cpu_buffer {
spinlock_t int_lock; volatile unsigned long head_pos;
/* protected by int_lock */ volatile unsigned long tail_pos;
unsigned long pos; unsigned long buffer_size;
struct task_struct * last_task; struct task_struct * last_task;
int last_is_kernel; int last_is_kernel;
struct op_sample * buffer; struct op_sample * buffer;
unsigned long sample_received; unsigned long sample_received;
unsigned long sample_lost_locked;
unsigned long sample_lost_overflow; unsigned long sample_lost_overflow;
unsigned long sample_lost_task_exit; unsigned long sample_lost_task_exit;
} ____cacheline_aligned; } ____cacheline_aligned;
......
...@@ -27,7 +27,6 @@ void oprofile_reset_stats(void) ...@@ -27,7 +27,6 @@ void oprofile_reset_stats(void)
cpu_buf = &cpu_buffer[i]; cpu_buf = &cpu_buffer[i];
cpu_buf->sample_received = 0; cpu_buf->sample_received = 0;
cpu_buf->sample_lost_locked = 0;
cpu_buf->sample_lost_overflow = 0; cpu_buf->sample_lost_overflow = 0;
cpu_buf->sample_lost_task_exit = 0; cpu_buf->sample_lost_task_exit = 0;
} }
...@@ -63,8 +62,6 @@ void oprofile_create_stats_files(struct super_block * sb, struct dentry * root) ...@@ -63,8 +62,6 @@ void oprofile_create_stats_files(struct super_block * sb, struct dentry * root)
*/ */
oprofilefs_create_ro_ulong(sb, cpudir, "sample_received", oprofilefs_create_ro_ulong(sb, cpudir, "sample_received",
&cpu_buf->sample_received); &cpu_buf->sample_received);
oprofilefs_create_ro_ulong(sb, cpudir, "sample_lost_locked",
&cpu_buf->sample_lost_locked);
oprofilefs_create_ro_ulong(sb, cpudir, "sample_lost_overflow", oprofilefs_create_ro_ulong(sb, cpudir, "sample_lost_overflow",
&cpu_buf->sample_lost_overflow); &cpu_buf->sample_lost_overflow);
oprofilefs_create_ro_ulong(sb, cpudir, "sample_lost_task_exit", oprofilefs_create_ro_ulong(sb, cpudir, "sample_lost_task_exit",
......
...@@ -1490,9 +1490,9 @@ static void scsi_eh_ready_devs(struct Scsi_Host *shost, ...@@ -1490,9 +1490,9 @@ static void scsi_eh_ready_devs(struct Scsi_Host *shost,
struct list_head *work_q, struct list_head *work_q,
struct list_head *done_q) struct list_head *done_q)
{ {
if (scsi_eh_bus_device_reset(shost, work_q, done_q)) if (!scsi_eh_bus_device_reset(shost, work_q, done_q))
if (scsi_eh_bus_reset(shost, work_q, done_q)) if (!scsi_eh_bus_reset(shost, work_q, done_q))
if (scsi_eh_host_reset(work_q, done_q)) if (!scsi_eh_host_reset(work_q, done_q))
scsi_eh_offline_sdevs(work_q, done_q); scsi_eh_offline_sdevs(work_q, done_q);
} }
......
...@@ -33,11 +33,11 @@ ...@@ -33,11 +33,11 @@
* Local functions. * Local functions.
*/ */
static int bw2_check_var(struct fb_var_screeninfo *, struct fb_info *);
static int bw2_set_par(struct fb_info *);
static int bw2_blank(int, struct fb_info *); static int bw2_blank(int, struct fb_info *);
static int bw2_mmap(struct fb_info *, struct file *, struct vm_area_struct *); static int bw2_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static int bw2_ioctl(struct inode *, struct file *, unsigned int,
unsigned long, struct fb_info *);
/* /*
* Frame buffer operations * Frame buffer operations
...@@ -45,13 +45,12 @@ static int bw2_mmap(struct fb_info *, struct file *, struct vm_area_struct *); ...@@ -45,13 +45,12 @@ static int bw2_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static struct fb_ops bw2_ops = { static struct fb_ops bw2_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = bw2_check_var,
.fb_set_par = bw2_set_par,
.fb_blank = bw2_blank, .fb_blank = bw2_blank,
.fb_fillrect = cfb_fillrect, .fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit, .fb_imageblit = cfb_imageblit,
.fb_mmap = bw2_mmap, .fb_mmap = bw2_mmap,
.fb_ioctl = bw2_ioctl,
.fb_cursor = soft_cursor, .fb_cursor = soft_cursor,
}; };
...@@ -123,39 +122,6 @@ struct bw2_par { ...@@ -123,39 +122,6 @@ struct bw2_par {
struct list_head list; struct list_head list;
}; };
/**
* bw2_check_var - Optional function. Validates a var passed in.
* @var: frame buffer variable screen structure
* @info: frame buffer structure that represents a single frame buffer
*/
static int bw2_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
if (var->bits_per_pixel != 8)
return -EINVAL;
if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
return -EINVAL;
if (var->nonstd)
return -EINVAL;
if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
return -EINVAL;
if (var->xres != info->var.xres || var->yres != info->var.yres)
return -EINVAL;
return 0;
}
/**
* bw2_set_par - Optional function. Alters the hardware state.
* @info: frame buffer structure that represents a single frame buffer
*/
static int
bw2_set_par(struct fb_info *info)
{
return 0;
}
/** /**
* bw2_blank - Optional function. Blanks the display. * bw2_blank - Optional function. Blanks the display.
* @blank_mode: the blank mode we want. * @blank_mode: the blank mode we want.
...@@ -212,6 +178,15 @@ static int bw2_mmap(struct fb_info *info, struct file *file, struct vm_area_stru ...@@ -212,6 +178,15 @@ static int bw2_mmap(struct fb_info *info, struct file *file, struct vm_area_stru
vma); vma);
} }
static int bw2_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, struct fb_info *info)
{
struct bw2_par *par = (struct bw2_par *) info->par;
return sbusfb_ioctl_helper(cmd, arg, info,
FBTYPE_SUN2BW, 1, par->fbsize);
}
/* /*
* Initialisation * Initialisation
*/ */
...@@ -387,7 +362,6 @@ static void bw2_init_one(struct sbus_dev *sdev) ...@@ -387,7 +362,6 @@ static void bw2_init_one(struct sbus_dev *sdev)
bw2_blank(0, &all->info); bw2_blank(0, &all->info);
bw2_set_par(&all->info);
bw2_init_fix(&all->info, linebytes); bw2_init_fix(&all->info, linebytes);
if (register_framebuffer(&all->info) < 0) { if (register_framebuffer(&all->info) < 0) {
......
...@@ -28,8 +28,6 @@ ...@@ -28,8 +28,6 @@
* Local functions. * Local functions.
*/ */
static int cg14_check_var(struct fb_var_screeninfo *, struct fb_info *);
static int cg14_set_par(struct fb_info *);
static int cg14_setcolreg(unsigned, unsigned, unsigned, unsigned, static int cg14_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned, struct fb_info *); unsigned, struct fb_info *);
...@@ -43,8 +41,6 @@ static int cg14_ioctl(struct inode *, struct file *, unsigned int, ...@@ -43,8 +41,6 @@ static int cg14_ioctl(struct inode *, struct file *, unsigned int,
static struct fb_ops cg14_ops = { static struct fb_ops cg14_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = cg14_check_var,
.fb_set_par = cg14_set_par,
.fb_setcolreg = cg14_setcolreg, .fb_setcolreg = cg14_setcolreg,
.fb_fillrect = cfb_fillrect, .fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,
...@@ -219,39 +215,6 @@ static void __cg14_reset(struct cg14_par *par) ...@@ -219,39 +215,6 @@ static void __cg14_reset(struct cg14_par *par)
sbus_writeb(val, &regs->mcr); sbus_writeb(val, &regs->mcr);
} }
/**
* cg14_check_var - Optional function. Validates a var passed in.
* @var: frame buffer variable screen structure
* @info: frame buffer structure that represents a single frame buffer
*/
static int cg14_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
if (var->bits_per_pixel != 8)
return -EINVAL;
if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
return -EINVAL;
if (var->nonstd)
return -EINVAL;
if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
return -EINVAL;
if (var->xres != info->var.xres || var->yres != info->var.yres)
return -EINVAL;
return 0;
}
/**
* cg14_set_par - Optional function. Alters the hardware state.
* @info: frame buffer structure that represents a single frame buffer
*/
static int
cg14_set_par(struct fb_info *info)
{
return 0;
}
/** /**
* cg14_setcolreg - Optional function. Sets a color register. * cg14_setcolreg - Optional function. Sets a color register.
* @regno: boolean, 0 copy local, 1 get_user() function * @regno: boolean, 0 copy local, 1 get_user() function
...@@ -358,7 +321,8 @@ static int cg14_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ...@@ -358,7 +321,8 @@ static int cg14_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
break; break;
default: default:
ret = -EINVAL; ret = sbusfb_ioctl_helper(cmd, arg, info,
FBTYPE_MDICOLOR, 24, par->fbsize);
break; break;
}; };
...@@ -523,7 +487,6 @@ static void cg14_init_one(struct sbus_dev *sdev, int node, int parent_node) ...@@ -523,7 +487,6 @@ static void cg14_init_one(struct sbus_dev *sdev, int node, int parent_node)
return; return;
} }
cg14_set_par(&all->info);
cg14_init_fix(&all->info, linebytes); cg14_init_fix(&all->info, linebytes);
if (register_framebuffer(&all->info) < 0) { if (register_framebuffer(&all->info) < 0) {
......
...@@ -29,13 +29,13 @@ ...@@ -29,13 +29,13 @@
* Local functions. * Local functions.
*/ */
static int cg3_check_var(struct fb_var_screeninfo *, struct fb_info *);
static int cg3_set_par(struct fb_info *);
static int cg3_setcolreg(unsigned, unsigned, unsigned, unsigned, static int cg3_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned, struct fb_info *); unsigned, struct fb_info *);
static int cg3_blank(int, struct fb_info *); static int cg3_blank(int, struct fb_info *);
static int cg3_mmap(struct fb_info *, struct file *, struct vm_area_struct *); static int cg3_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static int cg3_ioctl(struct inode *, struct file *, unsigned int,
unsigned long, struct fb_info *);
/* /*
* Frame buffer operations * Frame buffer operations
...@@ -43,14 +43,13 @@ static int cg3_mmap(struct fb_info *, struct file *, struct vm_area_struct *); ...@@ -43,14 +43,13 @@ static int cg3_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static struct fb_ops cg3_ops = { static struct fb_ops cg3_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = cg3_check_var,
.fb_set_par = cg3_set_par,
.fb_setcolreg = cg3_setcolreg, .fb_setcolreg = cg3_setcolreg,
.fb_blank = cg3_blank, .fb_blank = cg3_blank,
.fb_fillrect = cfb_fillrect, .fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit, .fb_imageblit = cfb_imageblit,
.fb_mmap = cg3_mmap, .fb_mmap = cg3_mmap,
.fb_ioctl = cg3_ioctl,
.fb_cursor = soft_cursor, .fb_cursor = soft_cursor,
}; };
...@@ -126,39 +125,6 @@ struct cg3_par { ...@@ -126,39 +125,6 @@ struct cg3_par {
struct list_head list; struct list_head list;
}; };
/**
* cg3_check_var - Optional function. Validates a var passed in.
* @var: frame buffer variable screen structure
* @info: frame buffer structure that represents a single frame buffer
*/
static int cg3_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
if (var->bits_per_pixel != 8)
return -EINVAL;
if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
return -EINVAL;
if (var->nonstd)
return -EINVAL;
if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
return -EINVAL;
if (var->xres != info->var.xres || var->yres != info->var.yres)
return -EINVAL;
return 0;
}
/**
* cg3_set_par - Optional function. Alters the hardware state.
* @info: frame buffer structure that represents a single frame buffer
*/
static int
cg3_set_par(struct fb_info *info)
{
return 0;
}
/** /**
* cg3_setcolreg - Optional function. Sets a color register. * cg3_setcolreg - Optional function. Sets a color register.
* @regno: boolean, 0 copy local, 1 get_user() function * @regno: boolean, 0 copy local, 1 get_user() function
...@@ -269,6 +235,15 @@ static int cg3_mmap(struct fb_info *info, struct file *file, struct vm_area_stru ...@@ -269,6 +235,15 @@ static int cg3_mmap(struct fb_info *info, struct file *file, struct vm_area_stru
vma); vma);
} }
static int cg3_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, struct fb_info *info)
{
struct cg3_par *par = (struct cg3_par *) info->par;
return sbusfb_ioctl_helper(cmd, arg, info,
FBTYPE_SUN3COLOR, 8, par->fbsize);
}
/* /*
* Initialisation * Initialisation
*/ */
...@@ -445,7 +420,6 @@ static void cg3_init_one(struct sbus_dev *sdev) ...@@ -445,7 +420,6 @@ static void cg3_init_one(struct sbus_dev *sdev)
return; return;
} }
cg3_set_par(&all->info);
cg3_init_fix(&all->info, linebytes); cg3_init_fix(&all->info, linebytes);
if (register_framebuffer(&all->info) < 0) { if (register_framebuffer(&all->info) < 0) {
......
...@@ -29,8 +29,6 @@ ...@@ -29,8 +29,6 @@
* Local functions. * Local functions.
*/ */
static int cg6_check_var(struct fb_var_screeninfo *, struct fb_info *);
static int cg6_set_par(struct fb_info *);
static int cg6_setcolreg(unsigned, unsigned, unsigned, unsigned, static int cg6_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned, struct fb_info *); unsigned, struct fb_info *);
static int cg6_blank(int, struct fb_info *); static int cg6_blank(int, struct fb_info *);
...@@ -39,6 +37,8 @@ static void cg6_imageblit(struct fb_info *, struct fb_image *); ...@@ -39,6 +37,8 @@ static void cg6_imageblit(struct fb_info *, struct fb_image *);
static void cg6_fillrect(struct fb_info *, struct fb_fillrect *); static void cg6_fillrect(struct fb_info *, struct fb_fillrect *);
static int cg6_sync(struct fb_info *); static int cg6_sync(struct fb_info *);
static int cg6_mmap(struct fb_info *, struct file *, struct vm_area_struct *); static int cg6_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static int cg6_ioctl(struct inode *, struct file *, unsigned int,
unsigned long, struct fb_info *);
/* /*
* Frame buffer operations * Frame buffer operations
...@@ -46,8 +46,6 @@ static int cg6_mmap(struct fb_info *, struct file *, struct vm_area_struct *); ...@@ -46,8 +46,6 @@ static int cg6_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static struct fb_ops cg6_ops = { static struct fb_ops cg6_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = cg6_check_var,
.fb_set_par = cg6_set_par,
.fb_setcolreg = cg6_setcolreg, .fb_setcolreg = cg6_setcolreg,
.fb_blank = cg6_blank, .fb_blank = cg6_blank,
.fb_fillrect = cg6_fillrect, .fb_fillrect = cg6_fillrect,
...@@ -55,6 +53,7 @@ static struct fb_ops cg6_ops = { ...@@ -55,6 +53,7 @@ static struct fb_ops cg6_ops = {
.fb_imageblit = cg6_imageblit, .fb_imageblit = cg6_imageblit,
.fb_sync = cg6_sync, .fb_sync = cg6_sync,
.fb_mmap = cg6_mmap, .fb_mmap = cg6_mmap,
.fb_ioctl = cg6_ioctl,
.fb_cursor = soft_cursor, .fb_cursor = soft_cursor,
}; };
...@@ -405,39 +404,6 @@ static void cg6_imageblit(struct fb_info *info, struct fb_image *image) ...@@ -405,39 +404,6 @@ static void cg6_imageblit(struct fb_info *info, struct fb_image *image)
spin_unlock_irqrestore(&par->lock, flags); spin_unlock_irqrestore(&par->lock, flags);
} }
/**
* cg6_check_var - Optional function. Validates a var passed in.
* @var: frame buffer variable screen structure
* @info: frame buffer structure that represents a single frame buffer
*/
static int cg6_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
if (var->bits_per_pixel != 8)
return -EINVAL;
if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
return -EINVAL;
if (var->nonstd)
return -EINVAL;
if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
return -EINVAL;
if (var->xres != info->var.xres || var->yres != info->var.yres)
return -EINVAL;
return 0;
}
/**
* cg6_set_par - Optional function. Alters the hardware state.
* @info: frame buffer structure that represents a single frame buffer
*/
static int
cg6_set_par(struct fb_info *info)
{
return 0;
}
/** /**
* cg6_setcolreg - Optional function. Sets a color register. * cg6_setcolreg - Optional function. Sets a color register.
* @regno: boolean, 0 copy local, 1 get_user() function * @regno: boolean, 0 copy local, 1 get_user() function
...@@ -535,6 +501,15 @@ static int cg6_mmap(struct fb_info *info, struct file *file, struct vm_area_stru ...@@ -535,6 +501,15 @@ static int cg6_mmap(struct fb_info *info, struct file *file, struct vm_area_stru
vma); vma);
} }
static int cg6_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, struct fb_info *info)
{
struct cg6_par *par = (struct cg6_par *) info->par;
return sbusfb_ioctl_helper(cmd, arg, info,
FBTYPE_SUNFAST_COLOR, 8, par->fbsize);
}
/* /*
* Initialisation * Initialisation
*/ */
...@@ -731,7 +706,6 @@ static void cg6_init_one(struct sbus_dev *sdev) ...@@ -731,7 +706,6 @@ static void cg6_init_one(struct sbus_dev *sdev)
return; return;
} }
cg6_set_par(&all->info);
cg6_init_fix(&all->info, linebytes); cg6_init_fix(&all->info, linebytes);
if (register_framebuffer(&all->info) < 0) { if (register_framebuffer(&all->info) < 0) {
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/upa.h> #include <asm/upa.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/fbio.h>
#include "sbuslib.h" #include "sbuslib.h"
...@@ -27,8 +28,6 @@ ...@@ -27,8 +28,6 @@
* Local functions. * Local functions.
*/ */
static int ffb_check_var(struct fb_var_screeninfo *, struct fb_info *);
static int ffb_set_par(struct fb_info *);
static int ffb_setcolreg(unsigned, unsigned, unsigned, unsigned, static int ffb_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned, struct fb_info *); unsigned, struct fb_info *);
static int ffb_blank(int, struct fb_info *); static int ffb_blank(int, struct fb_info *);
...@@ -39,6 +38,8 @@ static void ffb_fillrect(struct fb_info *, struct fb_fillrect *); ...@@ -39,6 +38,8 @@ static void ffb_fillrect(struct fb_info *, struct fb_fillrect *);
static void ffb_copyarea(struct fb_info *, struct fb_copyarea *); static void ffb_copyarea(struct fb_info *, struct fb_copyarea *);
static int ffb_sync(struct fb_info *); static int ffb_sync(struct fb_info *);
static int ffb_mmap(struct fb_info *, struct file *, struct vm_area_struct *); static int ffb_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static int ffb_ioctl(struct inode *, struct file *, unsigned int,
unsigned long, struct fb_info *);
/* /*
* Frame buffer operations * Frame buffer operations
...@@ -46,8 +47,6 @@ static int ffb_mmap(struct fb_info *, struct file *, struct vm_area_struct *); ...@@ -46,8 +47,6 @@ static int ffb_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static struct fb_ops ffb_ops = { static struct fb_ops ffb_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = ffb_check_var,
.fb_set_par = ffb_set_par,
.fb_setcolreg = ffb_setcolreg, .fb_setcolreg = ffb_setcolreg,
.fb_blank = ffb_blank, .fb_blank = ffb_blank,
.fb_fillrect = ffb_fillrect, .fb_fillrect = ffb_fillrect,
...@@ -55,6 +54,7 @@ static struct fb_ops ffb_ops = { ...@@ -55,6 +54,7 @@ static struct fb_ops ffb_ops = {
.fb_imageblit = ffb_imageblit, .fb_imageblit = ffb_imageblit,
.fb_sync = ffb_sync, .fb_sync = ffb_sync,
.fb_mmap = ffb_mmap, .fb_mmap = ffb_mmap,
.fb_ioctl = ffb_ioctl,
/* XXX Use FFB hw cursor once fb cursor API is better understood... */ /* XXX Use FFB hw cursor once fb cursor API is better understood... */
.fb_cursor = soft_cursor, .fb_cursor = soft_cursor,
...@@ -672,41 +672,6 @@ static void ffb_fixup_var_rgb(struct fb_var_screeninfo *var) ...@@ -672,41 +672,6 @@ static void ffb_fixup_var_rgb(struct fb_var_screeninfo *var)
var->transp.length = 0; var->transp.length = 0;
} }
/**
* ffb_check_var - Optional function. Validates a var passed in.
* @var: frame buffer variable screen structure
* @info: frame buffer structure that represents a single frame buffer
*/
static int ffb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
if (var->bits_per_pixel != 32)
return -EINVAL;
if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
return -EINVAL;
if (var->nonstd)
return -EINVAL;
if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
return -EINVAL;
if (var->xres != info->var.xres || var->yres != info->var.yres)
return -EINVAL;
ffb_fixup_var_rgb(var);
return 0;
}
/**
* ffb_set_par - Optional function. Alters the hardware state.
* @info: frame buffer structure that represents a single frame buffer
*/
static int
ffb_set_par(struct fb_info *info)
{
return 0;
}
/** /**
* ffb_setcolreg - Optional function. Sets a color register. * ffb_setcolreg - Optional function. Sets a color register.
* @regno: boolean, 0 copy local, 1 get_user() function * @regno: boolean, 0 copy local, 1 get_user() function
...@@ -818,6 +783,15 @@ static int ffb_mmap(struct fb_info *info, struct file *file, struct vm_area_stru ...@@ -818,6 +783,15 @@ static int ffb_mmap(struct fb_info *info, struct file *file, struct vm_area_stru
0, vma); 0, vma);
} }
static int ffb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, struct fb_info *info)
{
struct ffb_par *par = (struct ffb_par *) info->par;
return sbusfb_ioctl_helper(cmd, arg, info,
FBTYPE_CREATOR, 24, par->fbsize);
}
/* /*
* Initialisation * Initialisation
*/ */
...@@ -972,7 +946,6 @@ static void ffb_init_one(int node, int parent) ...@@ -972,7 +946,6 @@ static void ffb_init_one(int node, int parent)
return; return;
} }
ffb_set_par(&all->info);
ffb_init_fix(&all->info); ffb_init_fix(&all->info);
if (register_framebuffer(&all->info) < 0) { if (register_framebuffer(&all->info) < 0) {
......
...@@ -27,13 +27,13 @@ ...@@ -27,13 +27,13 @@
* Local functions. * Local functions.
*/ */
static int p9100_check_var(struct fb_var_screeninfo *, struct fb_info *);
static int p9100_set_par(struct fb_info *);
static int p9100_setcolreg(unsigned, unsigned, unsigned, unsigned, static int p9100_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned, struct fb_info *); unsigned, struct fb_info *);
static int p9100_blank(int, struct fb_info *); static int p9100_blank(int, struct fb_info *);
static int p9100_mmap(struct fb_info *, struct file *, struct vm_area_struct *); static int p9100_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static int p9100_ioctl(struct inode *, struct file *, unsigned int,
unsigned long, struct fb_info *);
/* /*
* Frame buffer operations * Frame buffer operations
...@@ -41,14 +41,13 @@ static int p9100_mmap(struct fb_info *, struct file *, struct vm_area_struct *); ...@@ -41,14 +41,13 @@ static int p9100_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static struct fb_ops p9100_ops = { static struct fb_ops p9100_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = p9100_check_var,
.fb_set_par = p9100_set_par,
.fb_setcolreg = p9100_setcolreg, .fb_setcolreg = p9100_setcolreg,
.fb_blank = p9100_blank, .fb_blank = p9100_blank,
.fb_fillrect = cfb_fillrect, .fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit, .fb_imageblit = cfb_imageblit,
.fb_mmap = p9100_mmap, .fb_mmap = p9100_mmap,
.fb_ioctl = p9100_ioctl,
.fb_cursor = soft_cursor, .fb_cursor = soft_cursor,
}; };
...@@ -142,39 +141,6 @@ struct p9100_par { ...@@ -142,39 +141,6 @@ struct p9100_par {
struct list_head list; struct list_head list;
}; };
/**
* p9100_check_var - Optional function. Validates a var passed in.
* @var: frame buffer variable screen structure
* @info: frame buffer structure that represents a single frame buffer
*/
static int p9100_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
if (var->bits_per_pixel != 8)
return -EINVAL;
if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
return -EINVAL;
if (var->nonstd)
return -EINVAL;
if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
return -EINVAL;
if (var->xres != info->var.xres || var->yres != info->var.yres)
return -EINVAL;
return 0;
}
/**
* p9100_set_par - Optional function. Alters the hardware state.
* @info: frame buffer structure that represents a single frame buffer
*/
static int
p9100_set_par(struct fb_info *info)
{
return 0;
}
/** /**
* p9100_setcolreg - Optional function. Sets a color register. * p9100_setcolreg - Optional function. Sets a color register.
* @regno: boolean, 0 copy local, 1 get_user() function * @regno: boolean, 0 copy local, 1 get_user() function
...@@ -265,6 +231,16 @@ static int p9100_mmap(struct fb_info *info, struct file *file, struct vm_area_st ...@@ -265,6 +231,16 @@ static int p9100_mmap(struct fb_info *info, struct file *file, struct vm_area_st
vma); vma);
} }
static int p9100_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, struct fb_info *info)
{
struct p9100_par *par = (struct p9100_par *) info->par;
/* Make it look like a cg3. */
return sbusfb_ioctl_helper(cmd, arg, info,
FBTYPE_SUN3COLOR, 8, par->fbsize);
}
/* /*
* Initialisation * Initialisation
*/ */
...@@ -344,7 +320,6 @@ static void p9100_init_one(struct sbus_dev *sdev) ...@@ -344,7 +320,6 @@ static void p9100_init_one(struct sbus_dev *sdev)
return; return;
} }
p9100_set_par(&all->info);
p9100_init_fix(&all->info, linebytes); p9100_init_fix(&all->info, linebytes);
if (register_framebuffer(&all->info) < 0) { if (register_framebuffer(&all->info) < 0) {
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/fb.h> #include <linux/fb.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/fbio.h>
#include "sbuslib.h" #include "sbuslib.h"
...@@ -83,3 +84,84 @@ int sbusfb_mmap_helper(struct sbus_mmap_map *map, ...@@ -83,3 +84,84 @@ int sbusfb_mmap_helper(struct sbus_mmap_map *map,
return 0; return 0;
} }
EXPORT_SYMBOL(sbusfb_mmap_helper);
int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg,
struct fb_info *info,
int type, int fb_depth, unsigned long fb_size)
{
switch(cmd) {
case FBIOGTYPE: {
struct fbtype *f = (struct fbtype *) arg;
if (put_user(type, &f->fb_type) ||
__put_user(info->var.yres, &f->fb_height) ||
__put_user(info->var.xres, &f->fb_width) ||
__put_user(fb_depth, &f->fb_depth) ||
__put_user(0, &f->fb_cmsize) ||
__put_user(fb_size, &f->fb_cmsize))
return -EFAULT;
return 0;
}
case FBIOPUTCMAP_SPARC: {
struct fbcmap *c = (struct fbcmap *) arg;
struct fb_cmap cmap;
u16 red, green, blue;
unsigned char *ured, *ugreen, *ublue;
int index, count, i;
if (get_user(index, &c->index) ||
__get_user(count, &c->count) ||
__get_user(ured, &c->red) ||
__get_user(ugreen, &c->green) ||
__get_user(ublue, &c->blue))
return -EFAULT;
cmap.len = 1;
cmap.red = &red;
cmap.green = &green;
cmap.blue = &blue;
for (i = 0; i < count; i++) {
int err;
if (get_user(red, &ured[i]) ||
get_user(green, &ugreen[i]) ||
get_user(blue, &ublue[i]))
return -EFAULT;
cmap.start = index + i;
err = fb_set_cmap(&cmap, 0, info);
if (err)
return err;
}
return 0;
}
case FBIOGETCMAP_SPARC: {
struct fbcmap *c = (struct fbcmap *) arg;
unsigned char *ured, *ugreen, *ublue;
struct fb_cmap *cmap = &info->cmap;
int index, count, i;
if (get_user(index, &c->index) ||
__get_user(count, &c->count) ||
__get_user(ured, &c->red) ||
__get_user(ugreen, &c->green) ||
__get_user(ublue, &c->blue))
return -EFAULT;
if (index + count > cmap->len)
return -EINVAL;
for (i = 0; i < count; i++) {
if (put_user(cmap->red[index + i], &ured[i]) ||
put_user(cmap->green[index + i], &ugreen[i]) ||
put_user(cmap->blue[index + i], &ublue[i]))
return -EFAULT;
}
return 0;
}
default:
return -EINVAL;
};
}
EXPORT_SYMBOL(sbusfb_ioctl_helper);
...@@ -17,5 +17,8 @@ extern int sbusfb_mmap_helper(struct sbus_mmap_map *map, ...@@ -17,5 +17,8 @@ extern int sbusfb_mmap_helper(struct sbus_mmap_map *map,
unsigned long physbase, unsigned long fbsize, unsigned long physbase, unsigned long fbsize,
unsigned long iospace, unsigned long iospace,
struct vm_area_struct *vma); struct vm_area_struct *vma);
int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg,
struct fb_info *info,
int type, int fb_depth, unsigned long fb_size);
#endif /* _SBUSLIB_H */ #endif /* _SBUSLIB_H */
...@@ -29,13 +29,13 @@ ...@@ -29,13 +29,13 @@
* Local functions. * Local functions.
*/ */
static int tcx_check_var(struct fb_var_screeninfo *, struct fb_info *);
static int tcx_set_par(struct fb_info *);
static int tcx_setcolreg(unsigned, unsigned, unsigned, unsigned, static int tcx_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned, struct fb_info *); unsigned, struct fb_info *);
static int tcx_blank(int, struct fb_info *); static int tcx_blank(int, struct fb_info *);
static int tcx_mmap(struct fb_info *, struct file *, struct vm_area_struct *); static int tcx_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static int tcx_ioctl(struct inode *, struct file *, unsigned int,
unsigned long, struct fb_info *);
/* /*
* Frame buffer operations * Frame buffer operations
...@@ -43,14 +43,13 @@ static int tcx_mmap(struct fb_info *, struct file *, struct vm_area_struct *); ...@@ -43,14 +43,13 @@ static int tcx_mmap(struct fb_info *, struct file *, struct vm_area_struct *);
static struct fb_ops tcx_ops = { static struct fb_ops tcx_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_check_var = tcx_check_var,
.fb_set_par = tcx_set_par,
.fb_setcolreg = tcx_setcolreg, .fb_setcolreg = tcx_setcolreg,
.fb_blank = tcx_blank, .fb_blank = tcx_blank,
.fb_fillrect = cfb_fillrect, .fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea, .fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit, .fb_imageblit = cfb_imageblit,
.fb_mmap = tcx_mmap, .fb_mmap = tcx_mmap,
.fb_ioctl = tcx_ioctl,
.fb_cursor = soft_cursor, .fb_cursor = soft_cursor,
}; };
...@@ -154,39 +153,6 @@ static void tcx_reset (struct fb_info *info) ...@@ -154,39 +153,6 @@ static void tcx_reset (struct fb_info *info)
spin_unlock_irqrestore(&par->lock, flags); spin_unlock_irqrestore(&par->lock, flags);
} }
/**
* tcx_check_var - Optional function. Validates a var passed in.
* @var: frame buffer variable screen structure
* @info: frame buffer structure that represents a single frame buffer
*/
static int tcx_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
if (var->bits_per_pixel != 8)
return -EINVAL;
if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
return -EINVAL;
if (var->nonstd)
return -EINVAL;
if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
return -EINVAL;
if (var->xres != info->var.xres || var->yres != info->var.yres)
return -EINVAL;
return 0;
}
/**
* tcx_set_par - Optional function. Alters the hardware state.
* @info: frame buffer structure that represents a single frame buffer
*/
static int
tcx_set_par(struct fb_info *info)
{
return 0;
}
/** /**
* tcx_setcolreg - Optional function. Sets a color register. * tcx_setcolreg - Optional function. Sets a color register.
* @regno: boolean, 0 copy local, 1 get_user() function * @regno: boolean, 0 copy local, 1 get_user() function
...@@ -298,6 +264,17 @@ static int tcx_mmap(struct fb_info *info, struct file *file, struct vm_area_stru ...@@ -298,6 +264,17 @@ static int tcx_mmap(struct fb_info *info, struct file *file, struct vm_area_stru
vma); vma);
} }
static int tcx_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg, struct fb_info *info)
{
struct tcx_par *par = (struct tcx_par *) info->par;
return sbusfb_ioctl_helper(cmd, arg, info,
FBTYPE_TCXCOLOR,
(par->lowdepth ? 8 : 24),
par->fbsize);
}
/* /*
* Initialisation * Initialisation
*/ */
...@@ -431,7 +408,6 @@ static void tcx_init_one(struct sbus_dev *sdev) ...@@ -431,7 +408,6 @@ static void tcx_init_one(struct sbus_dev *sdev)
return; return;
} }
tcx_set_par(&all->info);
tcx_init_fix(&all->info, linebytes); tcx_init_fix(&all->info, linebytes);
if (register_framebuffer(&all->info) < 0) { if (register_framebuffer(&all->info) < 0) {
......
...@@ -125,9 +125,7 @@ int register_filesystem(struct file_system_type * fs) ...@@ -125,9 +125,7 @@ int register_filesystem(struct file_system_type * fs)
if (!res) { if (!res) {
/* we implicitly possess reference to @fs during registration, /* we implicitly possess reference to @fs during registration,
* so it cannot be unregister from under us. */ * so it cannot be unregister from under us. */
if (register_fs_subsys(fs)) register_fs_subsys(fs);
printk(KERN_WARNING "Failed to register '%s' in sysfs\n",
fs->name);
} }
return res; return res;
} }
......
...@@ -33,7 +33,7 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -33,7 +33,7 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
sb->s_op = &sysfs_ops; sb->s_op = &sysfs_ops;
sysfs_sb = sb; sysfs_sb = sb;
inode = sysfs_new_inode(S_IFDIR | S_IRUGO | S_IWUSR); inode = sysfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO);
if (inode) { if (inode) {
inode->i_op = &simple_dir_inode_operations; inode->i_op = &simple_dir_inode_operations;
inode->i_fop = &simple_dir_operations; inode->i_fop = &simple_dir_operations;
......
...@@ -2,15 +2,15 @@ ...@@ -2,15 +2,15 @@
#define _LINUX_PROFILE_H #define _LINUX_PROFILE_H
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/errno.h> #include <asm/errno.h>
/* parse command line */ /* parse command line */
int __init profile_setup(char * str); int __init profile_setup(char * str);
/* init basic kernel profiler */ /* init basic kernel profiler */
void __init profile_init(void); void __init profile_init(void);
...@@ -27,14 +27,14 @@ enum profile_type { ...@@ -27,14 +27,14 @@ enum profile_type {
}; };
#ifdef CONFIG_PROFILING #ifdef CONFIG_PROFILING
struct notifier_block; struct notifier_block;
struct task_struct; struct task_struct;
struct mm_struct; struct mm_struct;
/* task is in do_exit() */ /* task is in do_exit() */
void profile_exit_task(struct task_struct * task); void profile_exit_task(struct task_struct * task);
/* change of vma mappings */ /* change of vma mappings */
void profile_exec_unmap(struct mm_struct * mm); void profile_exec_unmap(struct mm_struct * mm);
...@@ -44,10 +44,10 @@ void profile_exit_mmap(struct mm_struct * mm); ...@@ -44,10 +44,10 @@ void profile_exit_mmap(struct mm_struct * mm);
int profile_event_register(enum profile_type, struct notifier_block * n); int profile_event_register(enum profile_type, struct notifier_block * n);
int profile_event_unregister(enum profile_type, struct notifier_block * n); int profile_event_unregister(enum profile_type, struct notifier_block * n);
int register_profile_notifier(struct notifier_block * nb); int register_profile_notifier(struct notifier_block * nb);
int unregister_profile_notifier(struct notifier_block * nb); int unregister_profile_notifier(struct notifier_block * nb);
/* profiling hook activated on each timer interrupt */ /* profiling hook activated on each timer interrupt */
void profile_hook(struct pt_regs * regs); void profile_hook(struct pt_regs * regs);
...@@ -57,12 +57,12 @@ static inline int profile_event_register(enum profile_type t, struct notifier_bl ...@@ -57,12 +57,12 @@ static inline int profile_event_register(enum profile_type t, struct notifier_bl
{ {
return -ENOSYS; return -ENOSYS;
} }
static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n) static inline int profile_event_unregister(enum profile_type t, struct notifier_block * n)
{ {
return -ENOSYS; return -ENOSYS;
} }
#define profile_exit_task(a) do { } while (0) #define profile_exit_task(a) do { } while (0)
#define profile_exec_unmap(a) do { } while (0) #define profile_exec_unmap(a) do { } while (0)
#define profile_exit_mmap(a) do { } while (0) #define profile_exit_mmap(a) do { } while (0)
...@@ -80,7 +80,7 @@ static inline int unregister_profile_notifier(struct notifier_block * nb) ...@@ -80,7 +80,7 @@ static inline int unregister_profile_notifier(struct notifier_block * nb)
#define profile_hook(regs) do { } while (0) #define profile_hook(regs) do { } while (0)
#endif /* CONFIG_PROFILING */ #endif /* CONFIG_PROFILING */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _LINUX_PROFILE_H */ #endif /* _LINUX_PROFILE_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