Commit 9af4b834 authored by Vojtech Pavlik's avatar Vojtech Pavlik

Merge suse.cz:/home/vojtech/bk/linus into suse.cz:/home/vojtech/bk/input

parents d1745915 88f48c81
...@@ -242,18 +242,9 @@ asmlinkage int sys_rt_sigreturn(void) ...@@ -242,18 +242,9 @@ asmlinkage int sys_rt_sigreturn(void)
if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8)) if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8))
goto badframe; goto badframe;
if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) if (do_sigaltstack(&frame->uc.uc_stack, NULL, __frame->sp) == -EFAULT)
goto badframe; goto badframe;
/* It is more difficult to avoid calling this function than to
* call it and ignore errors. */
/*
* THIS CANNOT WORK! "&st" is a kernel address, and "do_sigaltstack()"
* takes a user address (and verifies that it is a user address). End
* result: it does exactly _nothing_.
*/
do_sigaltstack(&st, NULL, __frame->sp);
return gr8; return gr8;
badframe: badframe:
......
...@@ -1174,10 +1174,6 @@ config TOSHIBA_BOARDS ...@@ -1174,10 +1174,6 @@ config TOSHIBA_BOARDS
depends on TOSHIBA_JMR3927 || TOSHIBA_RBTX4927 depends on TOSHIBA_JMR3927 || TOSHIBA_RBTX4927
default y default y
config TANBAC_TB0219
bool "Added TANBAC TB0219 Base board support"
depends on TANBAC_TB0229
endmenu endmenu
menu "CPU selection" menu "CPU selection"
......
...@@ -39,8 +39,8 @@ MODE_INCLUDE += $(foreach mode,$(um-modes-y),\ ...@@ -39,8 +39,8 @@ MODE_INCLUDE += $(foreach mode,$(um-modes-y),\
MAKEFILES-INCL += $(foreach mode,$(um-modes-y),\ MAKEFILES-INCL += $(foreach mode,$(um-modes-y),\
$(srctree)/$(ARCH_DIR)/Makefile-$(mode)) $(srctree)/$(ARCH_DIR)/Makefile-$(mode))
ifneq ($(MAKEFILE-INCL),) ifneq ($(MAKEFILES-INCL),)
include $(MAKEFILE-INCL) include $(MAKEFILES-INCL)
endif endif
ARCH_INCLUDE := -I$(ARCH_DIR)/include ARCH_INCLUDE := -I$(ARCH_DIR)/include
......
...@@ -26,6 +26,26 @@ extern void ptrace_pokeuser(unsigned long addr, unsigned long data); ...@@ -26,6 +26,26 @@ extern void ptrace_pokeuser(unsigned long addr, unsigned long data);
#define PTRACE_SYSEMU_SINGLESTEP 32 #define PTRACE_SYSEMU_SINGLESTEP 32
#endif #endif
/* On architectures, that started to support PTRACE_O_TRACESYSGOOD
* in linux 2.4, there are two different definitions of
* PTRACE_SETOPTIONS: linux 2.4 uses 21 while linux 2.6 uses 0x4200.
* For binary compatibility, 2.6 also supports the old "21", named
* PTRACE_OLDSETOPTION. On these architectures, UML always must use
* "21", to ensure the kernel runs on 2.4 and 2.6 host without
* recompilation. So, we use PTRACE_OLDSETOPTIONS in UML.
* We also want to be able to build the kernel on 2.4, which doesn't
* have PTRACE_OLDSETOPTIONS. So, if it is missing, we declare
* PTRACE_OLDSETOPTIONS to to be the same as PTRACE_SETOPTIONS.
*
* On architectures, that start to support PTRACE_O_TRACESYSGOOD on
* linux 2.6, PTRACE_OLDSETOPTIONS never is defined, and also isn't
* supported by the host kernel. In that case, our trick lets us use
* the new 0x4200 with the name PTRACE_OLDSETOPTIONS.
*/
#ifndef PTRACE_OLDSETOPTIONS
#define PTRACE_OLDSETOPTIONS PTRACE_SETOPTIONS
#endif
void set_using_sysemu(int value); void set_using_sysemu(int value);
int get_using_sysemu(void); int get_using_sysemu(void);
extern int sysemu_supported; extern int sysemu_supported;
......
...@@ -49,10 +49,11 @@ ...@@ -49,10 +49,11 @@
#define MAX_REG_NR ((MAX_REG_OFFSET) / sizeof(unsigned long)) #define MAX_REG_NR ((MAX_REG_OFFSET) / sizeof(unsigned long))
/* x86_64 FC3 doesn't define this in /usr/include/linux/ptrace.h even though /* x86_64 FC3 doesn't define this in /usr/include/linux/ptrace.h even though
* it's defined in the kernel's include/linux/ptrace.h * it's defined in the kernel's include/linux/ptrace.h. Additionally, use the
* 2.4 name and value for 2.4 host compatibility.
*/ */
#ifndef PTRACE_SETOPTIONS #ifndef PTRACE_OLDSETOPTIONS
#define PTRACE_SETOPTIONS 0x4200 #define PTRACE_OLDSETOPTIONS 21
#endif #endif
#endif #endif
......
...@@ -322,7 +322,7 @@ void __init check_ptrace(void) ...@@ -322,7 +322,7 @@ void __init check_ptrace(void)
printk("Checking that ptrace can change system call numbers..."); printk("Checking that ptrace can change system call numbers...");
pid = start_ptraced_child(&stack); pid = start_ptraced_child(&stack);
if(ptrace(PTRACE_SETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno); panic("check_ptrace: PTRACE_SETOPTIONS failed, errno = %d", errno);
while(1){ while(1){
......
...@@ -124,7 +124,7 @@ void start_userspace(int cpu) ...@@ -124,7 +124,7 @@ void start_userspace(int cpu)
panic("start_userspace : expected SIGSTOP, got status = %d", panic("start_userspace : expected SIGSTOP, got status = %d",
status); status);
if (ptrace(PTRACE_SETOPTIONS, pid, NULL, (void *)PTRACE_O_TRACESYSGOOD) < 0) if (ptrace(PTRACE_OLDSETOPTIONS, pid, NULL, (void *)PTRACE_O_TRACESYSGOOD) < 0)
panic("start_userspace : PTRACE_SETOPTIONS failed, errno=%d\n", panic("start_userspace : PTRACE_SETOPTIONS failed, errno=%d\n",
errno); errno);
......
...@@ -39,7 +39,7 @@ void do_exec(int old_pid, int new_pid) ...@@ -39,7 +39,7 @@ void do_exec(int old_pid, int new_pid)
os_kill_ptraced_process(old_pid, 0); os_kill_ptraced_process(old_pid, 0);
if (ptrace(PTRACE_SETOPTIONS, new_pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) if (ptrace(PTRACE_OLDSETOPTIONS, new_pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
tracer_panic("do_exec: PTRACE_SETOPTIONS failed, errno = %d", errno); tracer_panic("do_exec: PTRACE_SETOPTIONS failed, errno = %d", errno);
if(ptrace_setregs(new_pid, regs) < 0) if(ptrace_setregs(new_pid, regs) < 0)
......
...@@ -72,7 +72,7 @@ void attach_process(int pid) ...@@ -72,7 +72,7 @@ void attach_process(int pid)
(ptrace(PTRACE_CONT, pid, 0, 0) < 0)) (ptrace(PTRACE_CONT, pid, 0, 0) < 0))
tracer_panic("OP_FORK failed to attach pid"); tracer_panic("OP_FORK failed to attach pid");
wait_for_stop(pid, SIGSTOP, PTRACE_CONT, NULL); wait_for_stop(pid, SIGSTOP, PTRACE_CONT, NULL);
if (ptrace(PTRACE_SETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
tracer_panic("OP_FORK: PTRACE_SETOPTIONS failed, errno = %d", errno); tracer_panic("OP_FORK: PTRACE_SETOPTIONS failed, errno = %d", errno);
if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) if(ptrace(PTRACE_CONT, pid, 0, 0) < 0)
tracer_panic("OP_FORK failed to continue process"); tracer_panic("OP_FORK failed to continue process");
...@@ -200,7 +200,7 @@ int tracer(int (*init_proc)(void *), void *sp) ...@@ -200,7 +200,7 @@ int tracer(int (*init_proc)(void *), void *sp)
printf("waitpid on idle thread failed, errno = %d\n", errno); printf("waitpid on idle thread failed, errno = %d\n", errno);
exit(1); exit(1);
} }
if (ptrace(PTRACE_SETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) { if (ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0) {
printf("Failed to PTRACE_SETOPTIONS for idle thread, errno = %d\n", errno); printf("Failed to PTRACE_SETOPTIONS for idle thread, errno = %d\n", errno);
exit(1); exit(1);
} }
......
...@@ -105,7 +105,7 @@ config SBPCD ...@@ -105,7 +105,7 @@ config SBPCD
config MCD config MCD
tristate "Mitsumi (standard) [no XA/Multisession] CDROM support" tristate "Mitsumi (standard) [no XA/Multisession] CDROM support"
depends on CD_NO_IDESCSI depends on CD_NO_IDESCSI && BROKEN
---help--- ---help---
This is the older of the two drivers for the older Mitsumi models This is the older of the two drivers for the older Mitsumi models
LU-005, FX-001 and FX-001D. This is not the right driver for the LU-005, FX-001 and FX-001D. This is not the right driver for the
......
...@@ -1564,48 +1564,54 @@ static int decode_dmi(dmi_header_t *dm, dmi_ipmi_data_t *ipmi_data) ...@@ -1564,48 +1564,54 @@ static int decode_dmi(dmi_header_t *dm, dmi_ipmi_data_t *ipmi_data)
u8 *data = (u8 *)dm; u8 *data = (u8 *)dm;
unsigned long base_addr; unsigned long base_addr;
u8 reg_spacing; u8 reg_spacing;
u8 len = dm->length;
ipmi_data->type = data[0x04]; ipmi_data->type = data[4];
memcpy(&base_addr,&data[0x08],sizeof(unsigned long)); memcpy(&base_addr, data+8, sizeof(unsigned long));
if (base_addr & 1) { if (len >= 0x11) {
/* I/O */ if (base_addr & 1) {
base_addr &= 0xFFFE; /* I/O */
base_addr &= 0xFFFE;
ipmi_data->addr_space = IPMI_IO_ADDR_SPACE;
}
else {
/* Memory */
ipmi_data->addr_space = IPMI_MEM_ADDR_SPACE;
}
/* If bit 4 of byte 0x10 is set, then the lsb for the address
is odd. */
ipmi_data->base_addr = base_addr | ((data[0x10] & 0x10) >> 4);
ipmi_data->irq = data[0x11];
/* The top two bits of byte 0x10 hold the register spacing. */
reg_spacing = (data[0x10] & 0xC0) >> 6;
switch(reg_spacing){
case 0x00: /* Byte boundaries */
ipmi_data->offset = 1;
break;
case 0x01: /* 32-bit boundaries */
ipmi_data->offset = 4;
break;
case 0x02: /* 16-byte boundaries */
ipmi_data->offset = 16;
break;
default:
/* Some other interface, just ignore it. */
return -EIO;
}
} else {
/* Old DMI spec. */
ipmi_data->base_addr = base_addr;
ipmi_data->addr_space = IPMI_IO_ADDR_SPACE; ipmi_data->addr_space = IPMI_IO_ADDR_SPACE;
}
else {
/* Memory */
ipmi_data->addr_space = IPMI_MEM_ADDR_SPACE;
}
/* The top two bits of byte 0x10 hold the register spacing. */
reg_spacing = (data[0x10] & 0xC0) >> 6;
switch(reg_spacing){
case 0x00: /* Byte boundaries */
ipmi_data->offset = 1; ipmi_data->offset = 1;
break;
case 0x01: /* 32-bit boundaries */
ipmi_data->offset = 4;
break;
case 0x02: /* 16-byte boundaries */
ipmi_data->offset = 16;
break;
default:
printk("ipmi_si: Unknown SMBIOS IPMI Base Addr"
" Modifier: 0x%x\n", reg_spacing);
return -EIO;
} }
/* If bit 4 of byte 0x10 is set, then the lsb for the address
is odd. */
ipmi_data->base_addr = base_addr | ((data[0x10] & 0x10) >> 4);
ipmi_data->irq = data[0x11];
if (is_new_interface(-1, ipmi_data->addr_space,ipmi_data->base_addr)) if (is_new_interface(-1, ipmi_data->addr_space,ipmi_data->base_addr))
return 0; return 0;
memset(ipmi_data,0,sizeof(dmi_ipmi_data_t)); memset(ipmi_data, 0, sizeof(dmi_ipmi_data_t));
return -1; return -1;
} }
......
...@@ -174,7 +174,7 @@ static int stripe_map(struct dm_target *ti, struct bio *bio, ...@@ -174,7 +174,7 @@ static int stripe_map(struct dm_target *ti, struct bio *bio,
sector_t offset = bio->bi_sector - ti->begin; sector_t offset = bio->bi_sector - ti->begin;
sector_t chunk = offset >> sc->chunk_shift; sector_t chunk = offset >> sc->chunk_shift;
uint32_t stripe = do_div(chunk, sc->stripes); uint32_t stripe = sector_div(chunk, sc->stripes);
bio->bi_bdev = sc->stripe[stripe].dev->bdev; bio->bi_bdev = sc->stripe[stripe].dev->bdev;
bio->bi_sector = sc->stripe[stripe].physical_start + bio->bi_sector = sc->stripe[stripe].physical_start +
......
...@@ -4,6 +4,18 @@ ...@@ -4,6 +4,18 @@
* radeonfb * radeonfb
*/ */
#define PCI_CHIP_RV380_3150 0x3150
#define PCI_CHIP_RV380_3151 0x3151
#define PCI_CHIP_RV380_3152 0x3152
#define PCI_CHIP_RV380_3153 0x3153
#define PCI_CHIP_RV380_3154 0x3154
#define PCI_CHIP_RV380_3156 0x3156
#define PCI_CHIP_RV380_3E50 0x3E50
#define PCI_CHIP_RV380_3E51 0x3E51
#define PCI_CHIP_RV380_3E52 0x3E52
#define PCI_CHIP_RV380_3E53 0x3E53
#define PCI_CHIP_RV380_3E54 0x3E54
#define PCI_CHIP_RV380_3E56 0x3E56
#define PCI_CHIP_RS100_4136 0x4136 #define PCI_CHIP_RS100_4136 0x4136
#define PCI_CHIP_RS200_4137 0x4137 #define PCI_CHIP_RS200_4137 0x4137
#define PCI_CHIP_R300_AD 0x4144 #define PCI_CHIP_R300_AD 0x4144
...@@ -52,6 +64,14 @@ ...@@ -52,6 +64,14 @@
#define PCI_CHIP_RV250_Ie 0x4965 #define PCI_CHIP_RV250_Ie 0x4965
#define PCI_CHIP_RV250_If 0x4966 #define PCI_CHIP_RV250_If 0x4966
#define PCI_CHIP_RV250_Ig 0x4967 #define PCI_CHIP_RV250_Ig 0x4967
#define PCI_CHIP_R420_JH 0x4A48
#define PCI_CHIP_R420_JI 0x4A49
#define PCI_CHIP_R420_JJ 0x4A4A
#define PCI_CHIP_R420_JK 0x4A4B
#define PCI_CHIP_R420_JL 0x4A4C
#define PCI_CHIP_R420_JM 0x4A4D
#define PCI_CHIP_R420_JN 0x4A4E
#define PCI_CHIP_R420_JP 0x4A50
#define PCI_CHIP_MACH64LB 0x4C42 #define PCI_CHIP_MACH64LB 0x4C42
#define PCI_CHIP_MACH64LD 0x4C44 #define PCI_CHIP_MACH64LD 0x4C44
#define PCI_CHIP_RAGE128LE 0x4C45 #define PCI_CHIP_RAGE128LE 0x4C45
...@@ -73,6 +93,7 @@ ...@@ -73,6 +93,7 @@
#define PCI_CHIP_RV250_Le 0x4C65 #define PCI_CHIP_RV250_Le 0x4C65
#define PCI_CHIP_RV250_Lf 0x4C66 #define PCI_CHIP_RV250_Lf 0x4C66
#define PCI_CHIP_RV250_Lg 0x4C67 #define PCI_CHIP_RV250_Lg 0x4C67
#define PCI_CHIP_RV250_Ln 0x4C6E
#define PCI_CHIP_RAGE128MF 0x4D46 #define PCI_CHIP_RAGE128MF 0x4D46
#define PCI_CHIP_RAGE128ML 0x4D4C #define PCI_CHIP_RAGE128ML 0x4D4C
#define PCI_CHIP_R300_ND 0x4E44 #define PCI_CHIP_R300_ND 0x4E44
...@@ -148,6 +169,21 @@ ...@@ -148,6 +169,21 @@
#define PCI_CHIP_RAGE128TS 0x5453 #define PCI_CHIP_RAGE128TS 0x5453
#define PCI_CHIP_RAGE128TT 0x5454 #define PCI_CHIP_RAGE128TT 0x5454
#define PCI_CHIP_RAGE128TU 0x5455 #define PCI_CHIP_RAGE128TU 0x5455
#define PCI_CHIP_RV370_5460 0x5460
#define PCI_CHIP_RV370_5461 0x5461
#define PCI_CHIP_RV370_5462 0x5462
#define PCI_CHIP_RV370_5463 0x5463
#define PCI_CHIP_RV370_5464 0x5464
#define PCI_CHIP_RV370_5465 0x5465
#define PCI_CHIP_RV370_5466 0x5466
#define PCI_CHIP_RV370_5467 0x5467
#define PCI_CHIP_R423_UH 0x5548
#define PCI_CHIP_R423_UI 0x5549
#define PCI_CHIP_R423_UJ 0x554A
#define PCI_CHIP_R423_UK 0x554B
#define PCI_CHIP_R423_UQ 0x5551
#define PCI_CHIP_R423_UR 0x5552
#define PCI_CHIP_R423_UT 0x5554
#define PCI_CHIP_MACH64VT 0x5654 #define PCI_CHIP_MACH64VT 0x5654
#define PCI_CHIP_MACH64VU 0x5655 #define PCI_CHIP_MACH64VU 0x5655
#define PCI_CHIP_MACH64VV 0x5656 #define PCI_CHIP_MACH64VV 0x5656
...@@ -155,14 +191,21 @@ ...@@ -155,14 +191,21 @@
#define PCI_CHIP_RS300_5835 0x5835 #define PCI_CHIP_RS300_5835 0x5835
#define PCI_CHIP_RS300_5836 0x5836 #define PCI_CHIP_RS300_5836 0x5836
#define PCI_CHIP_RS300_5837 0x5837 #define PCI_CHIP_RS300_5837 0x5837
#define PCI_CHIP_RV370_5B60 0x5B60
#define PCI_CHIP_RV370_5B61 0x5B61
#define PCI_CHIP_RV370_5B62 0x5B62
#define PCI_CHIP_RV370_5B63 0x5B63
#define PCI_CHIP_RV370_5B64 0x5B64
#define PCI_CHIP_RV370_5B65 0x5B65
#define PCI_CHIP_RV370_5B66 0x5B66
#define PCI_CHIP_RV370_5B67 0x5B67
#define PCI_CHIP_RV280_5960 0x5960 #define PCI_CHIP_RV280_5960 0x5960
#define PCI_CHIP_RV280_5961 0x5961 #define PCI_CHIP_RV280_5961 0x5961
#define PCI_CHIP_RV280_5962 0x5962 #define PCI_CHIP_RV280_5962 0x5962
#define PCI_CHIP_RV280_5963 0x5963
#define PCI_CHIP_RV280_5964 0x5964 #define PCI_CHIP_RV280_5964 0x5964
#define PCI_CHIP_RV280_5968 0x5968
#define PCI_CHIP_RV280_5969 0x5969
#define PCI_CHIP_RV280_596A 0x596A
#define PCI_CHIP_RV280_596B 0x596B
#define PCI_CHIP_RV280_5C61 0x5C61 #define PCI_CHIP_RV280_5C61 0x5C61
#define PCI_CHIP_RV280_5C63 0x5C63 #define PCI_CHIP_RV280_5C63 0x5C63
#define PCI_CHIP_R423_5D57 0x5D57
#define PCI_CHIP_RS350_7834 0x7834
#define PCI_CHIP_RS350_7835 0x7835
...@@ -67,6 +67,7 @@ ...@@ -67,6 +67,7 @@
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_PPC_PMAC #ifdef CONFIG_PPC_PMAC
#include <asm/pmac_feature.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
#include "../macmodes.h" #include "../macmodes.h"
...@@ -167,6 +168,7 @@ static int aty128_probe(struct pci_dev *pdev, ...@@ -167,6 +168,7 @@ static int aty128_probe(struct pci_dev *pdev,
static void aty128_remove(struct pci_dev *pdev); static void aty128_remove(struct pci_dev *pdev);
static int aty128_pci_suspend(struct pci_dev *pdev, u32 state); static int aty128_pci_suspend(struct pci_dev *pdev, u32 state);
static int aty128_pci_resume(struct pci_dev *pdev); static int aty128_pci_resume(struct pci_dev *pdev);
static int aty128_do_resume(struct pci_dev *pdev);
/* supported Rage128 chipsets */ /* supported Rage128 chipsets */
static struct pci_device_id aty128_pci_tbl[] = { static struct pci_device_id aty128_pci_tbl[] = {
...@@ -1705,6 +1707,18 @@ int __init aty128fb_setup(char *options) ...@@ -1705,6 +1707,18 @@ int __init aty128fb_setup(char *options)
* Initialisation * Initialisation
*/ */
#ifdef CONFIG_PPC_PMAC
static void aty128_early_resume(void *data)
{
struct aty128fb_par *par = data;
if (try_acquire_console_sem())
return;
aty128_do_resume(par->pdev);
release_console_sem();
}
#endif /* CONFIG_PPC_PMAC */
static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent) static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id *ent)
{ {
struct fb_info *info = pci_get_drvdata(pdev); struct fb_info *info = pci_get_drvdata(pdev);
...@@ -1749,6 +1763,13 @@ static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id * ...@@ -1749,6 +1763,13 @@ static int __init aty128_init(struct pci_dev *pdev, const struct pci_device_id *
var = default_var; var = default_var;
#ifdef CONFIG_PPC_PMAC #ifdef CONFIG_PPC_PMAC
if (_machine == _MACH_Pmac) { if (_machine == _MACH_Pmac) {
/* Indicate sleep capability */
if (par->chip_gen == rage_M3) {
pmac_call_feature(PMAC_FTR_DEVICE_CAN_WAKE, NULL, 0, 1);
pmac_set_early_video_resume(aty128_early_resume, par);
}
/* Find default mode */
if (mode_option) { if (mode_option) {
if (!mac_find_mode(&var, info, mode_option, 8)) if (!mac_find_mode(&var, info, mode_option, 8))
var = default_var; var = default_var;
...@@ -2365,7 +2386,7 @@ static int aty128_pci_suspend(struct pci_dev *pdev, u32 state) ...@@ -2365,7 +2386,7 @@ static int aty128_pci_suspend(struct pci_dev *pdev, u32 state)
return 0; return 0;
} }
static int aty128_pci_resume(struct pci_dev *pdev) static int aty128_do_resume(struct pci_dev *pdev)
{ {
struct fb_info *info = pci_get_drvdata(pdev); struct fb_info *info = pci_get_drvdata(pdev);
struct aty128fb_par *par = info->par; struct aty128fb_par *par = info->par;
...@@ -2373,8 +2394,6 @@ static int aty128_pci_resume(struct pci_dev *pdev) ...@@ -2373,8 +2394,6 @@ static int aty128_pci_resume(struct pci_dev *pdev)
if (pdev->dev.power.power_state == 0) if (pdev->dev.power.power_state == 0)
return 0; return 0;
acquire_console_sem();
/* Wakeup chip */ /* Wakeup chip */
if (pdev->dev.power.power_state == 2) if (pdev->dev.power.power_state == 2)
aty128_set_suspend(par, 0); aty128_set_suspend(par, 0);
...@@ -2394,8 +2413,6 @@ static int aty128_pci_resume(struct pci_dev *pdev) ...@@ -2394,8 +2413,6 @@ static int aty128_pci_resume(struct pci_dev *pdev)
par->lock_blank = 0; par->lock_blank = 0;
aty128fb_blank(0, info); aty128fb_blank(0, info);
release_console_sem();
pdev->dev.power.power_state = 0; pdev->dev.power.power_state = 0;
printk(KERN_DEBUG "aty128fb: resumed !\n"); printk(KERN_DEBUG "aty128fb: resumed !\n");
...@@ -2403,6 +2420,18 @@ static int aty128_pci_resume(struct pci_dev *pdev) ...@@ -2403,6 +2420,18 @@ static int aty128_pci_resume(struct pci_dev *pdev)
return 0; return 0;
} }
static int aty128_pci_resume(struct pci_dev *pdev)
{
int rc;
acquire_console_sem();
rc = aty128_do_resume(pdev);
release_console_sem();
return rc;
}
int __init aty128fb_init(void) int __init aty128fb_init(void)
{ {
#ifndef MODULE #ifndef MODULE
......
This diff is collapsed.
#include "radeonfb.h" #include "radeonfb.h"
#include "../edid.h" #include "../edid.h"
#ifdef CONFIG_PPC_OF
#include <asm/prom.h>
#include <asm/pci-bridge.h>
#endif /* CONFIG_PPC_OF */
static struct fb_var_screeninfo radeonfb_default_var = { static struct fb_var_screeninfo radeonfb_default_var = {
.xres = 640, .xres = 640,
.yres = 480, .yres = 480,
...@@ -64,9 +59,11 @@ static char *radeon_get_mon_name(int type) ...@@ -64,9 +59,11 @@ static char *radeon_get_mon_name(int type)
* models with broken OF probing by hard-coding known EDIDs for some Mac * models with broken OF probing by hard-coding known EDIDs for some Mac
* laptops internal LVDS panel. (XXX: not done yet) * laptops internal LVDS panel. (XXX: not done yet)
*/ */
static int __devinit radeon_parse_montype_prop(struct device_node *dp, u8 **out_EDID, int hdno) static int __devinit radeon_parse_montype_prop(struct device_node *dp, u8 **out_EDID,
int hdno)
{ {
static char *propnames[] = { "DFP,EDID", "LCD,EDID", "EDID", "EDID1", "EDID2", NULL }; static char *propnames[] = { "DFP,EDID", "LCD,EDID", "EDID",
"EDID1", "EDID2", NULL };
u8 *pedid = NULL; u8 *pedid = NULL;
u8 *pmt = NULL; u8 *pmt = NULL;
u8 *tmp; u8 *tmp;
...@@ -122,7 +119,7 @@ static int __devinit radeon_probe_OF_head(struct radeonfb_info *rinfo, int head_ ...@@ -122,7 +119,7 @@ static int __devinit radeon_probe_OF_head(struct radeonfb_info *rinfo, int head_
RTRACE("radeon_probe_OF_head\n"); RTRACE("radeon_probe_OF_head\n");
dp = pci_device_to_OF_node(rinfo->pdev); dp = rinfo->of_node;
while (dp == NULL) while (dp == NULL)
return MT_NONE; return MT_NONE;
...@@ -502,8 +499,9 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo, ...@@ -502,8 +499,9 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo,
#endif /* CONFIG_PPC_OF */ #endif /* CONFIG_PPC_OF */
#ifdef CONFIG_FB_RADEON_I2C #ifdef CONFIG_FB_RADEON_I2C
if (rinfo->mon1_type == MT_NONE) if (rinfo->mon1_type == MT_NONE)
rinfo->mon1_type = radeon_probe_i2c_connector(rinfo, ddc_dvi, rinfo->mon1_type =
&rinfo->mon1_EDID); radeon_probe_i2c_connector(rinfo, ddc_dvi,
&rinfo->mon1_EDID);
if (rinfo->mon1_type == MT_NONE) if (rinfo->mon1_type == MT_NONE)
rinfo->mon1_type = rinfo->mon1_type =
radeon_probe_i2c_connector(rinfo, ddc_vga, radeon_probe_i2c_connector(rinfo, ddc_vga,
...@@ -545,7 +543,8 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo, ...@@ -545,7 +543,8 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo,
*/ */
#ifdef CONFIG_PPC_OF #ifdef CONFIG_PPC_OF
if (rinfo->mon1_type == MT_NONE) if (rinfo->mon1_type == MT_NONE)
rinfo->mon1_type = radeon_probe_OF_head(rinfo, 0, &rinfo->mon1_EDID); rinfo->mon1_type = radeon_probe_OF_head(rinfo, 0,
&rinfo->mon1_EDID);
#endif /* CONFIG_PPC_OF */ #endif /* CONFIG_PPC_OF */
#ifdef CONFIG_FB_RADEON_I2C #ifdef CONFIG_FB_RADEON_I2C
if (rinfo->mon1_type == MT_NONE) if (rinfo->mon1_type == MT_NONE)
...@@ -572,7 +571,8 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo, ...@@ -572,7 +571,8 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo,
*/ */
#ifdef CONFIG_PPC_OF #ifdef CONFIG_PPC_OF
if (rinfo->mon2_type == MT_NONE) if (rinfo->mon2_type == MT_NONE)
rinfo->mon2_type = radeon_probe_OF_head(rinfo, 1, &rinfo->mon2_EDID); rinfo->mon2_type = radeon_probe_OF_head(rinfo, 1,
&rinfo->mon2_EDID);
#endif /* CONFIG_PPC_OF */ #endif /* CONFIG_PPC_OF */
#ifdef CONFIG_FB_RADEON_I2C #ifdef CONFIG_FB_RADEON_I2C
if (rinfo->mon2_type == MT_NONE) if (rinfo->mon2_type == MT_NONE)
...@@ -648,10 +648,10 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo, ...@@ -648,10 +648,10 @@ void __devinit radeon_probe_screens(struct radeonfb_info *rinfo,
*/ */
static void radeon_fixup_panel_info(struct radeonfb_info *rinfo) static void radeon_fixup_panel_info(struct radeonfb_info *rinfo)
{ {
#ifdef CONFIG_PPC_OF #ifdef CONFIG_PPC_OF
/* /*
* LCD Flat panels should use fixed dividers, we enfore that on * LCD Flat panels should use fixed dividers, we enfore that on
* PowerMac only for now... * PPC only for now...
*/ */
if (!rinfo->panel_info.use_bios_dividers && rinfo->mon1_type == MT_LCD if (!rinfo->panel_info.use_bios_dividers && rinfo->mon1_type == MT_LCD
&& rinfo->is_mobility) { && rinfo->is_mobility) {
...@@ -702,40 +702,24 @@ static void radeon_var_to_panel_info(struct radeonfb_info *rinfo, struct fb_var_ ...@@ -702,40 +702,24 @@ static void radeon_var_to_panel_info(struct radeonfb_info *rinfo, struct fb_var_
rinfo->panel_info.pwr_delay = 200; rinfo->panel_info.pwr_delay = 200;
} }
static void radeon_var_to_videomode(struct fb_videomode *mode,
const struct fb_var_screeninfo *var)
{
mode->xres = var->xres;
mode->yres = var->yres;
mode->pixclock = var->pixclock;
mode->left_margin = var->left_margin;
mode->right_margin = var->right_margin;
mode->upper_margin = var->upper_margin;
mode->lower_margin = var->lower_margin;
mode->hsync_len = var->hsync_len;
mode->vsync_len = var->vsync_len;
mode->sync = var->sync;
mode->vmode = var->vmode;
}
static void radeon_videomode_to_var(struct fb_var_screeninfo *var, static void radeon_videomode_to_var(struct fb_var_screeninfo *var,
const struct fb_videomode *mode) const struct fb_videomode *mode)
{ {
var->xres = mode->xres; var->xres = mode->xres;
var->yres = mode->yres; var->yres = mode->yres;
var->xres_virtual = mode->xres; var->xres_virtual = mode->xres;
var->yres_virtual = mode->yres; var->yres_virtual = mode->yres;
var->xoffset = 0; var->xoffset = 0;
var->yoffset = 0; var->yoffset = 0;
var->pixclock = mode->pixclock; var->pixclock = mode->pixclock;
var->left_margin = mode->left_margin; var->left_margin = mode->left_margin;
var->right_margin = mode->right_margin; var->right_margin = mode->right_margin;
var->upper_margin = mode->upper_margin; var->upper_margin = mode->upper_margin;
var->lower_margin = mode->lower_margin; var->lower_margin = mode->lower_margin;
var->hsync_len = mode->hsync_len; var->hsync_len = mode->hsync_len;
var->vsync_len = mode->vsync_len; var->vsync_len = mode->vsync_len;
var->sync = mode->sync; var->sync = mode->sync;
var->vmode = mode->vmode; var->vmode = mode->vmode;
} }
/* /*
...@@ -744,12 +728,14 @@ static void radeon_videomode_to_var(struct fb_var_screeninfo *var, ...@@ -744,12 +728,14 @@ static void radeon_videomode_to_var(struct fb_var_screeninfo *var,
*/ */
void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_option) void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_option)
{ {
struct fb_info * info = rinfo->info;
int has_default_mode = 0; int has_default_mode = 0;
/* /*
* Fill default var first * Fill default var first
*/ */
rinfo->info->var = radeonfb_default_var; info->var = radeonfb_default_var;
INIT_LIST_HEAD(&info->modelist);
/* /*
* First check out what BIOS has to say * First check out what BIOS has to say
...@@ -783,7 +769,7 @@ void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_ ...@@ -783,7 +769,7 @@ void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_
* those * those
*/ */
if (rinfo->mon1_type != MT_CRT && rinfo->panel_info.valid) { if (rinfo->mon1_type != MT_CRT && rinfo->panel_info.valid) {
struct fb_var_screeninfo *var = &rinfo->info->var; struct fb_var_screeninfo *var = &info->var;
RTRACE("Setting up default mode based on panel info\n"); RTRACE("Setting up default mode based on panel info\n");
var->xres = rinfo->panel_info.xres; var->xres = rinfo->panel_info.xres;
...@@ -814,9 +800,12 @@ void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_ ...@@ -814,9 +800,12 @@ void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_
* Now build modedb from EDID * Now build modedb from EDID
*/ */
if (rinfo->mon1_EDID) { if (rinfo->mon1_EDID) {
rinfo->mon1_modedb = fb_create_modedb(rinfo->mon1_EDID, fb_edid_to_monspecs(rinfo->mon1_EDID, &info->monspecs);
&rinfo->mon1_dbsize); fb_videomode_to_modelist(info->monspecs.modedb,
fb_get_monitor_limits(rinfo->mon1_EDID, &rinfo->info->monspecs); info->monspecs.modedb_len,
&info->modelist);
rinfo->mon1_modedb = info->monspecs.modedb;
rinfo->mon1_dbsize = info->monspecs.modedb_len;
} }
...@@ -847,31 +836,62 @@ void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_ ...@@ -847,31 +836,62 @@ void __devinit radeon_check_modes(struct radeonfb_info *rinfo, const char *mode_
modedb = rinfo->mon1_modedb; modedb = rinfo->mon1_modedb;
dbsize = rinfo->mon1_dbsize; dbsize = rinfo->mon1_dbsize;
snprintf(modename, 31, "%dx%d", rinfo->panel_info.xres, rinfo->panel_info.yres); snprintf(modename, 31, "%dx%d", rinfo->panel_info.xres, rinfo->panel_info.yres);
if (fb_find_mode(&rinfo->info->var, rinfo->info, modename, if (fb_find_mode(&info->var, info, modename,
modedb, dbsize, NULL, 8) == 0) { modedb, dbsize, NULL, 8) == 0) {
printk(KERN_WARNING "radeonfb: Can't find mode for panel size, going back to CRT\n"); printk(KERN_WARNING "radeonfb: Can't find mode for panel size, going back to CRT\n");
rinfo->mon1_type = MT_CRT; rinfo->mon1_type = MT_CRT;
goto pickup_default; goto pickup_default;
} }
has_default_mode = 1; has_default_mode = 1;
radeon_var_to_panel_info(rinfo, &rinfo->info->var); radeon_var_to_panel_info(rinfo, &info->var);
} }
pickup_default: pickup_default:
/* /*
* Pick up a random default mode * Apply passed-in mode option if any
*/ */
if (!has_default_mode || mode_option) { if (mode_option) {
struct fb_videomode default_mode; if (fb_find_mode(&info->var, info, mode_option,
if (has_default_mode) info->monspecs.modedb,
radeon_var_to_videomode(&default_mode, &rinfo->info->var); info->monspecs.modedb_len, NULL, 8) != 0)
else has_default_mode = 1;
radeon_var_to_videomode(&default_mode, &radeonfb_default_var); }
if (fb_find_mode(&rinfo->info->var, rinfo->info, mode_option,
rinfo->mon1_modedb, rinfo->mon1_dbsize, &default_mode, 8) == 0) /*
rinfo->info->var = radeonfb_default_var; * Still no mode, let's pick up a default from the db
} */
if (!has_default_mode && info->monspecs.modedb != NULL) {
struct fb_monspecs *specs = &info->monspecs;
struct fb_videomode *modedb = NULL;
/* get preferred timing */
if (specs->misc & FB_MISC_1ST_DETAIL) {
int i;
for (i = 0; i < specs->modedb_len; i++) {
if (specs->modedb[i].flag & FB_MODE_IS_FIRST) {
modedb = &specs->modedb[i];
break;
}
}
} else {
/* otherwise, get first mode in database */
modedb = &specs->modedb[0];
}
if (modedb != NULL) {
info->var.bits_per_pixel = 8;
radeon_videomode_to_var(&info->var, modedb);
has_default_mode = 1;
}
}
if (1) {
struct fb_videomode mode;
/* Make sure that whatever mode got selected is actually in the
* modelist or the kernel may die
*/
fb_var_to_videomode(&mode, &info->var);
fb_add_videomode(&mode, &info->modelist);
}
} }
/* /*
......
This diff is collapsed.
This diff is collapsed.
...@@ -814,7 +814,7 @@ static void radeon_get_pllinfo(struct radeonfb_info *rinfo, void __iomem *bios_s ...@@ -814,7 +814,7 @@ static void radeon_get_pllinfo(struct radeonfb_info *rinfo, void __iomem *bios_s
if (radeon_read_OF(rinfo)) { if (radeon_read_OF(rinfo)) {
unsigned int tmp, Nx, M, ref_div, xclk; unsigned int tmp, Nx, M, ref_div, xclk;
tmp = INPLL(X_MPLL_REF_FB_DIV); tmp = INPLL(M_SPLL_REF_FB_DIV);
ref_div = INPLL(PPLL_REF_DIV) & 0x3ff; ref_div = INPLL(PPLL_REF_DIV) & 0x3ff;
Nx = (tmp & 0xff00) >> 8; Nx = (tmp & 0xff00) >> 8;
......
...@@ -2848,48 +2848,42 @@ struct i2c_smbus_ioctl_data32 { ...@@ -2848,48 +2848,42 @@ struct i2c_smbus_ioctl_data32 {
compat_caddr_t data; /* union i2c_smbus_data *data */ compat_caddr_t data; /* union i2c_smbus_data *data */
}; };
struct i2c_rdwr_aligned {
struct i2c_rdwr_ioctl_data cmd;
struct i2c_msg msgs[0];
};
static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) static int do_i2c_rdwr_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
{ {
struct i2c_rdwr_ioctl_data __user *tdata; struct i2c_rdwr_ioctl_data32 __user *udata = compat_ptr(arg);
struct i2c_rdwr_ioctl_data32 __user *udata; struct i2c_rdwr_aligned __user *tdata;
struct i2c_msg __user *tmsgs; struct i2c_msg __user *tmsgs;
struct i2c_msg32 __user *umsgs; struct i2c_msg32 __user *umsgs;
compat_caddr_t datap; compat_caddr_t datap;
int nmsgs, i; int nmsgs, i;
tdata = compat_alloc_user_space(sizeof(*tdata)); if (get_user(nmsgs, &udata->nmsgs))
if (tdata == NULL)
return -ENOMEM;
if (verify_area(VERIFY_WRITE, tdata, sizeof(*tdata)))
return -EFAULT;
udata = compat_ptr(arg);
if (verify_area(VERIFY_READ, udata, sizeof(*udata)))
return -EFAULT;
if (__get_user(nmsgs, &udata->nmsgs) || __put_user(nmsgs, &tdata->nmsgs))
return -EFAULT; return -EFAULT;
if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS) if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
return -EINVAL; return -EINVAL;
if (__get_user(datap, &udata->msgs))
if (get_user(datap, &udata->msgs))
return -EFAULT; return -EFAULT;
umsgs = compat_ptr(datap); umsgs = compat_ptr(datap);
if (verify_area(VERIFY_READ, umsgs, sizeof(struct i2c_msg) * nmsgs))
return -EFAULT;
tmsgs = compat_alloc_user_space(sizeof(struct i2c_msg) * nmsgs); tdata = compat_alloc_user_space(sizeof(*tdata) +
if (tmsgs == NULL) nmsgs * sizeof(struct i2c_msg));
return -ENOMEM; tmsgs = &tdata->msgs[0];
if (verify_area(VERIFY_WRITE, tmsgs, sizeof(struct i2c_msg) * nmsgs))
if (put_user(nmsgs, &tdata->cmd.nmsgs) ||
put_user(tmsgs, &tdata->cmd.msgs))
return -EFAULT; return -EFAULT;
if (__put_user(tmsgs, &tdata->msgs))
return -ENOMEM;
for (i = 0; i < nmsgs; i++) { for (i = 0; i < nmsgs; i++) {
if (__copy_in_user(&tmsgs[i].addr, if (copy_in_user(&tmsgs[i].addr, &umsgs[i].addr, 3*sizeof(u16)))
&umsgs[i].addr,
3 * sizeof(u16)))
return -EFAULT; return -EFAULT;
if (__get_user(datap, &umsgs[i].buf) || if (get_user(datap, &umsgs[i].buf) ||
__put_user(compat_ptr(datap), &tmsgs[i].buf)) put_user(compat_ptr(datap), &tmsgs[i].buf))
return -EFAULT; return -EFAULT;
} }
return sys_ioctl(fd, cmd, (unsigned long)tdata); return sys_ioctl(fd, cmd, (unsigned long)tdata);
......
...@@ -105,6 +105,7 @@ extern void register_console(struct console *); ...@@ -105,6 +105,7 @@ extern void register_console(struct console *);
extern int unregister_console(struct console *); extern int unregister_console(struct console *);
extern struct console *console_drivers; extern struct console *console_drivers;
extern void acquire_console_sem(void); extern void acquire_console_sem(void);
extern int try_acquire_console_sem(void);
extern void release_console_sem(void); extern void release_console_sem(void);
extern void console_conditional_schedule(void); extern void console_conditional_schedule(void);
extern void console_unblank(void); extern void console_unblank(void);
......
This diff is collapsed.
...@@ -611,6 +611,16 @@ void acquire_console_sem(void) ...@@ -611,6 +611,16 @@ void acquire_console_sem(void)
} }
EXPORT_SYMBOL(acquire_console_sem); EXPORT_SYMBOL(acquire_console_sem);
int try_acquire_console_sem(void)
{
if (down_trylock(&console_sem))
return -1;
console_locked = 1;
console_may_schedule = 0;
return 0;
}
EXPORT_SYMBOL(try_acquire_console_sem);
int is_console_locked(void) int is_console_locked(void)
{ {
return console_locked; return console_locked;
......
...@@ -109,39 +109,45 @@ asmlinkage long sys_mincore(unsigned long start, size_t len, ...@@ -109,39 +109,45 @@ asmlinkage long sys_mincore(unsigned long start, size_t len,
unsigned char __user * vec) unsigned char __user * vec)
{ {
int index = 0; int index = 0;
unsigned long end; unsigned long end, limit;
struct vm_area_struct * vma; struct vm_area_struct * vma;
size_t max;
int unmapped_error = 0; int unmapped_error = 0;
long error = -EINVAL; long error;
down_read(&current->mm->mmap_sem); /* check the arguments */
if (start & ~PAGE_CACHE_MASK)
goto einval;
if (start < FIRST_USER_PGD_NR * PGDIR_SIZE)
goto enomem;
limit = TASK_SIZE;
if (start >= limit)
goto enomem;
max = limit - start;
len = PAGE_CACHE_ALIGN(len);
if (len > max)
goto einval;
if (start & ~PAGE_CACHE_MASK)
goto out;
len = (len + ~PAGE_CACHE_MASK) & PAGE_CACHE_MASK;
end = start + len; end = start + len;
if (end < start)
goto out;
/* check the output buffer whilst holding the lock */
error = -EFAULT; error = -EFAULT;
if (!access_ok(VERIFY_WRITE, vec, len >> PAGE_SHIFT)) down_read(&current->mm->mmap_sem);
goto out;
error = 0; if (!access_ok(VERIFY_WRITE, vec, len >> PAGE_SHIFT))
if (end == start)
goto out; goto out;
/* /*
* If the interval [start,end) covers some unmapped address * If the interval [start,end) covers some unmapped address
* ranges, just ignore them, but return -ENOMEM at the end. * ranges, just ignore them, but return -ENOMEM at the end.
*/ */
vma = find_vma(current->mm, start); error = 0;
for (;;) {
/* Still start < end. */
error = -ENOMEM;
if (!vma)
goto out;
vma = find_vma(current->mm, start);
while (vma) {
/* Here start < vma->vm_end. */ /* Here start < vma->vm_end. */
if (start < vma->vm_start) { if (start < vma->vm_start) {
unmapped_error = -ENOMEM; unmapped_error = -ENOMEM;
...@@ -169,7 +175,15 @@ asmlinkage long sys_mincore(unsigned long start, size_t len, ...@@ -169,7 +175,15 @@ asmlinkage long sys_mincore(unsigned long start, size_t len,
vma = vma->vm_next; vma = vma->vm_next;
} }
/* we found a hole in the area queried if we arrive here */
error = -ENOMEM;
out: out:
up_read(&current->mm->mmap_sem); up_read(&current->mm->mmap_sem);
return error; return error;
einval:
return -EINVAL;
enomem:
return -ENOMEM;
} }
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