mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
This commit is contained in:
		
						commit
						9e6c67fd27
					
				
					 14 changed files with 141 additions and 118 deletions
				
			
		|  | @ -40,10 +40,6 @@ IOCTL_TABLE_START | |||
| #define DECLARES | ||||
| #include "compat_ioctl.c" | ||||
| 
 | ||||
| /* Little p (/dev/rtc, /dev/envctrl, etc.) */ | ||||
| COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */ | ||||
| COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */ | ||||
| 
 | ||||
| IOCTL_TABLE_END | ||||
| 
 | ||||
| int ioctl_table_size = ARRAY_SIZE(ioctl_start); | ||||
|  |  | |||
|  | @ -12,86 +12,10 @@ | |||
| #define INCLUDES | ||||
| #include "compat_ioctl.c" | ||||
| #include <linux/syscalls.h> | ||||
| #include <asm/fbio.h> | ||||
| 
 | ||||
| /* Use this to get at 32-bit user passed pointers. 
 | ||||
|  * See sys_sparc32.c for description about it. | ||||
|  */ | ||||
| #define A(__x) compat_ptr(__x) | ||||
| 
 | ||||
| #define CODE | ||||
| #include "compat_ioctl.c" | ||||
| 
 | ||||
| struct  fbcmap32 { | ||||
| 	int             index;          /* first element (0 origin) */ | ||||
| 	int             count; | ||||
| 	u32		red; | ||||
| 	u32		green; | ||||
| 	u32		blue; | ||||
| }; | ||||
| 
 | ||||
| #define FBIOPUTCMAP32	_IOW('F', 3, struct fbcmap32) | ||||
| #define FBIOGETCMAP32	_IOW('F', 4, struct fbcmap32) | ||||
| 
 | ||||
| static int fbiogetputcmap(unsigned int fd, unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	struct fbcmap32 __user *argp = (void __user *)arg; | ||||
| 	struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p)); | ||||
| 	u32 addr; | ||||
| 	int ret; | ||||
| 	 | ||||
| 	ret = copy_in_user(p, argp, 2 * sizeof(int)); | ||||
| 	ret |= get_user(addr, &argp->red); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->red); | ||||
| 	ret |= get_user(addr, &argp->green); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->green); | ||||
| 	ret |= get_user(addr, &argp->blue); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->blue); | ||||
| 	if (ret) | ||||
| 		return -EFAULT; | ||||
| 	return sys_ioctl(fd, (cmd == FBIOPUTCMAP32) ? FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, (unsigned long)p); | ||||
| } | ||||
| 
 | ||||
| struct fbcursor32 { | ||||
| 	short set;		/* what to set, choose from the list above */ | ||||
| 	short enable;		/* cursor on/off */ | ||||
| 	struct fbcurpos pos;	/* cursor position */ | ||||
| 	struct fbcurpos hot;	/* cursor hot spot */ | ||||
| 	struct fbcmap32 cmap;	/* color map info */ | ||||
| 	struct fbcurpos size;	/* cursor bit map size */ | ||||
| 	u32	image;		/* cursor image bits */ | ||||
| 	u32	mask;		/* cursor mask bits */ | ||||
| }; | ||||
| 	 | ||||
| #define FBIOSCURSOR32	_IOW('F', 24, struct fbcursor32) | ||||
| #define FBIOGCURSOR32	_IOW('F', 25, struct fbcursor32) | ||||
| 
 | ||||
| static int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p)); | ||||
| 	struct fbcursor32 __user *argp =  (void __user *)arg; | ||||
| 	compat_uptr_t addr; | ||||
| 	int ret; | ||||
| 	 | ||||
| 	ret = copy_in_user(p, argp, | ||||
| 			      2 * sizeof (short) + 2 * sizeof(struct fbcurpos)); | ||||
| 	ret |= copy_in_user(&p->size, &argp->size, sizeof(struct fbcurpos)); | ||||
| 	ret |= copy_in_user(&p->cmap, &argp->cmap, 2 * sizeof(int)); | ||||
| 	ret |= get_user(addr, &argp->cmap.red); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->cmap.red); | ||||
| 	ret |= get_user(addr, &argp->cmap.green); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->cmap.green); | ||||
| 	ret |= get_user(addr, &argp->cmap.blue); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->cmap.blue); | ||||
| 	ret |= get_user(addr, &argp->mask); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->mask); | ||||
| 	ret |= get_user(addr, &argp->image); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->image); | ||||
| 	if (ret) | ||||
| 		return -EFAULT; | ||||
| 	return sys_ioctl (fd, FBIOSCURSOR, (unsigned long)p); | ||||
| } | ||||
| 
 | ||||
| #define COMPATIBLE_IOCTL(cmd)		HANDLE_IOCTL((cmd),sys_ioctl) | ||||
| #define HANDLE_IOCTL(cmd,handler)	{ (cmd), (ioctl_trans_handler_t)(handler), NULL }, | ||||
| #define IOCTL_TABLE_START \ | ||||
|  | @ -103,22 +27,6 @@ IOCTL_TABLE_START | |||
| #include <linux/compat_ioctl.h> | ||||
| #define DECLARES | ||||
| #include "compat_ioctl.c" | ||||
| COMPATIBLE_IOCTL(FBIOGTYPE) | ||||
| COMPATIBLE_IOCTL(FBIOSATTR) | ||||
| COMPATIBLE_IOCTL(FBIOGATTR) | ||||
| COMPATIBLE_IOCTL(FBIOSVIDEO) | ||||
| COMPATIBLE_IOCTL(FBIOGVIDEO) | ||||
| COMPATIBLE_IOCTL(FBIOGCURSOR32)  /* This is not implemented yet. Later it should be converted... */ | ||||
| COMPATIBLE_IOCTL(FBIOSCURPOS) | ||||
| COMPATIBLE_IOCTL(FBIOGCURPOS) | ||||
| COMPATIBLE_IOCTL(FBIOGCURMAX) | ||||
| /* Little k */ | ||||
| /* Little v, the video4linux ioctls */ | ||||
| /* And these ioctls need translation */ | ||||
| /* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */ | ||||
| HANDLE_IOCTL(FBIOPUTCMAP32, fbiogetputcmap) | ||||
| HANDLE_IOCTL(FBIOGETCMAP32, fbiogetputcmap) | ||||
| HANDLE_IOCTL(FBIOSCURSOR32, fbiogscursor) | ||||
| #if 0 | ||||
| HANDLE_IOCTL(RTC32_IRQP_READ, do_rtc_ioctl) | ||||
| HANDLE_IOCTL(RTC32_IRQP_SET, do_rtc_ioctl) | ||||
|  |  | |||
|  | @ -210,27 +210,6 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| static long rtc_compat_ioctl(struct file *file, unsigned int cmd, | ||||
| 	unsigned long arg) | ||||
| { | ||||
| 	int rval = -ENOIOCTLCMD; | ||||
| 
 | ||||
| 	switch (cmd) { | ||||
| 	/*
 | ||||
| 	 * These two are specific to this driver, the generic rtc ioctls | ||||
| 	 * are hanlded elsewhere. | ||||
| 	 */ | ||||
| 	case RTCGET: | ||||
| 	case RTCSET: | ||||
| 		lock_kernel(); | ||||
| 		rval = rtc_ioctl(file->f_dentry->d_inode, file, cmd, arg); | ||||
| 		unlock_kernel(); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	return rval; | ||||
| } | ||||
| 
 | ||||
| static int rtc_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	int ret; | ||||
|  | @ -258,7 +237,6 @@ static struct file_operations rtc_fops = { | |||
| 	.owner =	THIS_MODULE, | ||||
| 	.llseek =	no_llseek, | ||||
| 	.ioctl =	rtc_ioctl, | ||||
| 	.compat_ioctl =	rtc_compat_ioctl, | ||||
| 	.open =		rtc_open, | ||||
| 	.release =	rtc_release, | ||||
| }; | ||||
|  |  | |||
|  | @ -51,6 +51,9 @@ static struct fb_ops bw2_ops = { | |||
| 	.fb_imageblit		= cfb_imageblit, | ||||
| 	.fb_mmap		= bw2_mmap, | ||||
| 	.fb_ioctl		= bw2_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| /* OBio addresses for the bwtwo registers */ | ||||
|  |  | |||
|  | @ -49,6 +49,9 @@ static struct fb_ops cg14_ops = { | |||
| 	.fb_imageblit		= cfb_imageblit, | ||||
| 	.fb_mmap		= cg14_mmap, | ||||
| 	.fb_ioctl		= cg14_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| #define CG14_MCR_INTENABLE_SHIFT	7 | ||||
|  |  | |||
|  | @ -50,6 +50,9 @@ static struct fb_ops cg3_ops = { | |||
| 	.fb_imageblit		= cfb_imageblit, | ||||
| 	.fb_mmap		= cg3_mmap, | ||||
| 	.fb_ioctl		= cg3_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -54,6 +54,9 @@ static struct fb_ops cg6_ops = { | |||
| 	.fb_sync		= cg6_sync, | ||||
| 	.fb_mmap		= cg6_mmap, | ||||
| 	.fb_ioctl		= cg6_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| /* Offset of interesting structures in the OBIO space */ | ||||
|  |  | |||
|  | @ -57,6 +57,9 @@ static struct fb_ops ffb_ops = { | |||
| 	.fb_sync		= ffb_sync, | ||||
| 	.fb_mmap		= ffb_mmap, | ||||
| 	.fb_ioctl		= ffb_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| /* Register layout and definitions */ | ||||
|  |  | |||
|  | @ -51,6 +51,9 @@ static struct fb_ops leo_ops = { | |||
| 	.fb_imageblit		= cfb_imageblit, | ||||
| 	.fb_mmap		= leo_mmap, | ||||
| 	.fb_ioctl		= leo_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| #define LEO_OFF_LC_SS0_KRN	0x00200000UL | ||||
|  |  | |||
|  | @ -48,6 +48,9 @@ static struct fb_ops p9100_ops = { | |||
| 	.fb_imageblit		= cfb_imageblit, | ||||
| 	.fb_mmap		= p9100_mmap, | ||||
| 	.fb_ioctl		= p9100_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| /* P9100 control registers */ | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
|  * Copyright (C) 2003 David S. Miller (davem@redhat.com) | ||||
|  */ | ||||
| 
 | ||||
| #include <linux/compat.h> | ||||
| #include <linux/kernel.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/string.h> | ||||
|  | @ -182,3 +183,109 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, | |||
| 	}; | ||||
| } | ||||
| EXPORT_SYMBOL(sbusfb_ioctl_helper); | ||||
| 
 | ||||
| #ifdef CONFIG_COMPAT | ||||
| struct  fbcmap32 { | ||||
| 	int             index;          /* first element (0 origin) */ | ||||
| 	int             count; | ||||
| 	u32		red; | ||||
| 	u32		green; | ||||
| 	u32		blue; | ||||
| }; | ||||
| 
 | ||||
| #define FBIOPUTCMAP32	_IOW('F', 3, struct fbcmap32) | ||||
| #define FBIOGETCMAP32	_IOW('F', 4, struct fbcmap32) | ||||
| 
 | ||||
| static int fbiogetputcmap(struct file *file, struct fb_info *info, | ||||
| 		unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	struct fbcmap32 __user *argp = (void __user *)arg; | ||||
| 	struct fbcmap __user *p = compat_alloc_user_space(sizeof(*p)); | ||||
| 	u32 addr; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = copy_in_user(p, argp, 2 * sizeof(int)); | ||||
| 	ret |= get_user(addr, &argp->red); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->red); | ||||
| 	ret |= get_user(addr, &argp->green); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->green); | ||||
| 	ret |= get_user(addr, &argp->blue); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->blue); | ||||
| 	if (ret) | ||||
| 		return -EFAULT; | ||||
| 	return info->fbops->fb_ioctl(file->f_dentry->d_inode, file, | ||||
| 			(cmd == FBIOPUTCMAP32) ? | ||||
| 			FBIOPUTCMAP_SPARC : FBIOGETCMAP_SPARC, | ||||
| 			(unsigned long)p, info); | ||||
| } | ||||
| 
 | ||||
| struct fbcursor32 { | ||||
| 	short set;		/* what to set, choose from the list above */ | ||||
| 	short enable;		/* cursor on/off */ | ||||
| 	struct fbcurpos pos;	/* cursor position */ | ||||
| 	struct fbcurpos hot;	/* cursor hot spot */ | ||||
| 	struct fbcmap32 cmap;	/* color map info */ | ||||
| 	struct fbcurpos size;	/* cursor bit map size */ | ||||
| 	u32	image;		/* cursor image bits */ | ||||
| 	u32	mask;		/* cursor mask bits */ | ||||
| }; | ||||
| 
 | ||||
| #define FBIOSCURSOR32	_IOW('F', 24, struct fbcursor32) | ||||
| #define FBIOGCURSOR32	_IOW('F', 25, struct fbcursor32) | ||||
| 
 | ||||
| static int fbiogscursor(struct file *file, struct fb_info *info, | ||||
| 		unsigned long arg) | ||||
| { | ||||
| 	struct fbcursor __user *p = compat_alloc_user_space(sizeof(*p)); | ||||
| 	struct fbcursor32 __user *argp =  (void __user *)arg; | ||||
| 	compat_uptr_t addr; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	ret = copy_in_user(p, argp, | ||||
| 			      2 * sizeof (short) + 2 * sizeof(struct fbcurpos)); | ||||
| 	ret |= copy_in_user(&p->size, &argp->size, sizeof(struct fbcurpos)); | ||||
| 	ret |= copy_in_user(&p->cmap, &argp->cmap, 2 * sizeof(int)); | ||||
| 	ret |= get_user(addr, &argp->cmap.red); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->cmap.red); | ||||
| 	ret |= get_user(addr, &argp->cmap.green); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->cmap.green); | ||||
| 	ret |= get_user(addr, &argp->cmap.blue); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->cmap.blue); | ||||
| 	ret |= get_user(addr, &argp->mask); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->mask); | ||||
| 	ret |= get_user(addr, &argp->image); | ||||
| 	ret |= put_user(compat_ptr(addr), &p->image); | ||||
| 	if (ret) | ||||
| 		return -EFAULT; | ||||
| 	return info->fbops->fb_ioctl(file->f_dentry->d_inode, file, | ||||
| 			FBIOSCURSOR, (unsigned long)p, info); | ||||
| } | ||||
| 
 | ||||
| long sbusfb_compat_ioctl(struct file *file, unsigned int cmd, | ||||
| 		unsigned long arg, struct fb_info *info) | ||||
| { | ||||
| 	switch (cmd) { | ||||
| 	case FBIOGTYPE: | ||||
| 	case FBIOSATTR: | ||||
| 	case FBIOGATTR: | ||||
| 	case FBIOSVIDEO: | ||||
| 	case FBIOGVIDEO: | ||||
| 	case FBIOGCURSOR32:	/* This is not implemented yet.
 | ||||
| 				   Later it should be converted... */ | ||||
| 	case FBIOSCURPOS: | ||||
| 	case FBIOGCURPOS: | ||||
| 	case FBIOGCURMAX: | ||||
| 		return info->fbops->fb_ioctl(file->f_dentry->d_inode, | ||||
| 				file, cmd, arg, info); | ||||
| 	case FBIOPUTCMAP32: | ||||
| 		return fbiogetputcmap(file, info, cmd, arg); | ||||
| 	case FBIOGETCMAP32: | ||||
| 		return fbiogetputcmap(file, info, cmd, arg); | ||||
| 	case FBIOSCURSOR32: | ||||
| 		return fbiogscursor(file, info, arg); | ||||
| 	default: | ||||
| 		return -ENOIOCTLCMD; | ||||
| 	} | ||||
| } | ||||
| EXPORT_SYMBOL(sbusfb_compat_ioctl); | ||||
| #endif | ||||
|  |  | |||
|  | @ -20,5 +20,7 @@ extern int sbusfb_mmap_helper(struct sbus_mmap_map *map, | |||
| int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, | ||||
| 			struct fb_info *info, | ||||
| 			int type, int fb_depth, unsigned long fb_size); | ||||
| long sbusfb_compat_ioctl(struct file *file, unsigned int cmd, | ||||
| 		unsigned long arg, struct fb_info *info); | ||||
| 
 | ||||
| #endif /* _SBUSLIB_H */ | ||||
|  |  | |||
|  | @ -52,6 +52,9 @@ static struct fb_ops tcx_ops = { | |||
| 	.fb_imageblit		= cfb_imageblit, | ||||
| 	.fb_mmap		= tcx_mmap, | ||||
| 	.fb_ioctl		= tcx_ioctl, | ||||
| #ifdef CONFIG_COMPAT | ||||
| 	.fb_compat_ioctl	= sbusfb_compat_ioctl, | ||||
| #endif | ||||
| }; | ||||
| 
 | ||||
| /* THC definitions */ | ||||
|  |  | |||
|  | @ -259,6 +259,14 @@ COMPATIBLE_IOCTL(RTC_RD_TIME) | |||
| COMPATIBLE_IOCTL(RTC_SET_TIME) | ||||
| COMPATIBLE_IOCTL(RTC_WKALM_SET) | ||||
| COMPATIBLE_IOCTL(RTC_WKALM_RD) | ||||
| /*
 | ||||
|  * These two are only for the sbus rtc driver, but | ||||
|  * hwclock tries them on every rtc device first when | ||||
|  * running on sparc.  On other architectures the entries | ||||
|  * are useless but harmless. | ||||
|  */ | ||||
| COMPATIBLE_IOCTL(_IOR('p', 20, int[7])) /* RTCGET */ | ||||
| COMPATIBLE_IOCTL(_IOW('p', 21, int[7])) /* RTCSET */ | ||||
| /* Little m */ | ||||
| COMPATIBLE_IOCTL(MTIOCTOP) | ||||
| /* Socket level stuff */ | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Linus Torvalds
						Linus Torvalds