diff options
author | Helge Deller <deller@parisc-linux.org> | 2006-03-22 17:19:46 -0500 |
---|---|---|
committer | Kyle McMartin <kyle@hera.kernel.org> | 2006-03-30 12:48:47 -0500 |
commit | 857600c77161fd36e30cd6bcca9a0a8676036323 (patch) | |
tree | bef75f9f9a2bebd9fc084b8a15064bdce1a45aef /drivers/video/stifb.c | |
parent | b8ce0aadcdebbaf5ec013c57e2a0803060817bcc (diff) |
[PARISC] Fix stifb with IOREMAP and a 64-bit kernel
Kill various warnings when built using ioremap.
Remove stifb_{read,write} functions, which are now obsolete (and stack abusers!)
Disable stifb mmap() functionality on a 64-bit kernel, it will crash the
machine.
Signed-off-by: Helge Deller <deller@parisc-linux.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
Diffstat (limited to 'drivers/video/stifb.c')
-rw-r--r-- | drivers/video/stifb.c | 91 |
1 files changed, 6 insertions, 85 deletions
diff --git a/drivers/video/stifb.c b/drivers/video/stifb.c index 56d71d6e9a72..8d5f35676f9a 100644 --- a/drivers/video/stifb.c +++ b/drivers/video/stifb.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * Low level Frame buffer driver for HP workstations with | 3 | * Low level Frame buffer driver for HP workstations with |
4 | * STI (standard text interface) video firmware. | 4 | * STI (standard text interface) video firmware. |
5 | * | 5 | * |
6 | * Copyright (C) 2001-2005 Helge Deller <deller@gmx.de> | 6 | * Copyright (C) 2001-2006 Helge Deller <deller@gmx.de> |
7 | * Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de> | 7 | * Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de> |
8 | * | 8 | * |
9 | * Based on: | 9 | * Based on: |
@@ -514,7 +514,7 @@ rattlerSetupPlanes(struct stifb_info *fb) | |||
514 | SETUP_HW(fb); | 514 | SETUP_HW(fb); |
515 | WRITE_BYTE(1, fb, REG_16b1); | 515 | WRITE_BYTE(1, fb, REG_16b1); |
516 | 516 | ||
517 | fb_memset(fb->info.fix.smem_start, 0xff, | 517 | fb_memset((void*)fb->info.fix.smem_start, 0xff, |
518 | fb->info.var.yres*fb->info.fix.line_length); | 518 | fb->info.var.yres*fb->info.fix.line_length); |
519 | 519 | ||
520 | CRX24_SET_OVLY_MASK(fb); | 520 | CRX24_SET_OVLY_MASK(fb); |
@@ -908,83 +908,6 @@ SETUP_HCRX(struct stifb_info *fb) | |||
908 | 908 | ||
909 | /* ------------------- driver specific functions --------------------------- */ | 909 | /* ------------------- driver specific functions --------------------------- */ |
910 | 910 | ||
911 | #define TMPBUFLEN 2048 | ||
912 | |||
913 | static ssize_t | ||
914 | stifb_read(struct file *file, char *buf, size_t count, loff_t *ppos) | ||
915 | { | ||
916 | unsigned long p = *ppos; | ||
917 | struct inode *inode = file->f_dentry->d_inode; | ||
918 | int fbidx = iminor(inode); | ||
919 | struct fb_info *info = registered_fb[fbidx]; | ||
920 | char tmpbuf[TMPBUFLEN]; | ||
921 | |||
922 | if (!info || ! info->screen_base) | ||
923 | return -ENODEV; | ||
924 | |||
925 | if (p >= info->fix.smem_len) | ||
926 | return 0; | ||
927 | if (count >= info->fix.smem_len) | ||
928 | count = info->fix.smem_len; | ||
929 | if (count + p > info->fix.smem_len) | ||
930 | count = info->fix.smem_len - p; | ||
931 | if (count > sizeof(tmpbuf)) | ||
932 | count = sizeof(tmpbuf); | ||
933 | if (count) { | ||
934 | char *base_addr; | ||
935 | |||
936 | base_addr = info->screen_base; | ||
937 | memcpy_fromio(&tmpbuf, base_addr+p, count); | ||
938 | count -= copy_to_user(buf, &tmpbuf, count); | ||
939 | if (!count) | ||
940 | return -EFAULT; | ||
941 | *ppos += count; | ||
942 | } | ||
943 | return count; | ||
944 | } | ||
945 | |||
946 | static ssize_t | ||
947 | stifb_write(struct file *file, const char *buf, size_t count, loff_t *ppos) | ||
948 | { | ||
949 | struct inode *inode = file->f_dentry->d_inode; | ||
950 | int fbidx = iminor(inode); | ||
951 | struct fb_info *info = registered_fb[fbidx]; | ||
952 | unsigned long p = *ppos; | ||
953 | size_t c; | ||
954 | int err; | ||
955 | char tmpbuf[TMPBUFLEN]; | ||
956 | |||
957 | if (!info || !info->screen_base) | ||
958 | return -ENODEV; | ||
959 | |||
960 | if (p > info->fix.smem_len) | ||
961 | return -ENOSPC; | ||
962 | if (count >= info->fix.smem_len) | ||
963 | count = info->fix.smem_len; | ||
964 | err = 0; | ||
965 | if (count + p > info->fix.smem_len) { | ||
966 | count = info->fix.smem_len - p; | ||
967 | err = -ENOSPC; | ||
968 | } | ||
969 | |||
970 | p += (unsigned long)info->screen_base; | ||
971 | c = count; | ||
972 | while (c) { | ||
973 | int len = c > sizeof(tmpbuf) ? sizeof(tmpbuf) : c; | ||
974 | err = -EFAULT; | ||
975 | if (copy_from_user(&tmpbuf, buf, len)) | ||
976 | break; | ||
977 | memcpy_toio(p, &tmpbuf, len); | ||
978 | c -= len; | ||
979 | p += len; | ||
980 | buf += len; | ||
981 | *ppos += len; | ||
982 | } | ||
983 | if (count-c) | ||
984 | return (count-c); | ||
985 | return err; | ||
986 | } | ||
987 | |||
988 | static int | 911 | static int |
989 | stifb_setcolreg(u_int regno, u_int red, u_int green, | 912 | stifb_setcolreg(u_int regno, u_int red, u_int green, |
990 | u_int blue, u_int transp, struct fb_info *info) | 913 | u_int blue, u_int transp, struct fb_info *info) |
@@ -1137,8 +1060,6 @@ stifb_init_display(struct stifb_info *fb) | |||
1137 | 1060 | ||
1138 | static struct fb_ops stifb_ops = { | 1061 | static struct fb_ops stifb_ops = { |
1139 | .owner = THIS_MODULE, | 1062 | .owner = THIS_MODULE, |
1140 | .fb_read = stifb_read, | ||
1141 | .fb_write = stifb_write, | ||
1142 | .fb_setcolreg = stifb_setcolreg, | 1063 | .fb_setcolreg = stifb_setcolreg, |
1143 | .fb_blank = stifb_blank, | 1064 | .fb_blank = stifb_blank, |
1144 | .fb_fillrect = cfb_fillrect, | 1065 | .fb_fillrect = cfb_fillrect, |
@@ -1162,7 +1083,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
1162 | char *dev_name; | 1083 | char *dev_name; |
1163 | int bpp, xres, yres; | 1084 | int bpp, xres, yres; |
1164 | 1085 | ||
1165 | fb = kmalloc(sizeof(*fb), GFP_ATOMIC); | 1086 | fb = kzalloc(sizeof(*fb), GFP_ATOMIC); |
1166 | if (!fb) { | 1087 | if (!fb) { |
1167 | printk(KERN_ERR "stifb: Could not allocate stifb structure\n"); | 1088 | printk(KERN_ERR "stifb: Could not allocate stifb structure\n"); |
1168 | return -ENODEV; | 1089 | return -ENODEV; |
@@ -1171,7 +1092,6 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
1171 | info = &fb->info; | 1092 | info = &fb->info; |
1172 | 1093 | ||
1173 | /* set struct to a known state */ | 1094 | /* set struct to a known state */ |
1174 | memset(fb, 0, sizeof(*fb)); | ||
1175 | fix = &info->fix; | 1095 | fix = &info->fix; |
1176 | var = &info->var; | 1096 | var = &info->var; |
1177 | 1097 | ||
@@ -1234,7 +1154,7 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
1234 | case S9000_ID_TOMCAT: /* Dual CRX, behaves else like a CRX */ | 1154 | case S9000_ID_TOMCAT: /* Dual CRX, behaves else like a CRX */ |
1235 | /* FIXME: TomCat supports two heads: | 1155 | /* FIXME: TomCat supports two heads: |
1236 | * fb.iobase = REGION_BASE(fb_info,3); | 1156 | * fb.iobase = REGION_BASE(fb_info,3); |
1237 | * fb.screen_base = (void*) REGION_BASE(fb_info,2); | 1157 | * fb.screen_base = ioremap_nocache(REGION_BASE(fb_info,2),xxx); |
1238 | * for now we only support the left one ! */ | 1158 | * for now we only support the left one ! */ |
1239 | xres = fb->ngle_rom.x_size_visible; | 1159 | xres = fb->ngle_rom.x_size_visible; |
1240 | yres = fb->ngle_rom.y_size_visible; | 1160 | yres = fb->ngle_rom.y_size_visible; |
@@ -1327,7 +1247,8 @@ stifb_init_fb(struct sti_struct *sti, int bpp_pref) | |||
1327 | 1247 | ||
1328 | strcpy(fix->id, "stifb"); | 1248 | strcpy(fix->id, "stifb"); |
1329 | info->fbops = &stifb_ops; | 1249 | info->fbops = &stifb_ops; |
1330 | info->screen_base = (void*) REGION_BASE(fb,1); | 1250 | info->screen_base = ioremap_nocache(REGION_BASE(fb,1), fix->smem_len); |
1251 | info->screen_size = fix->smem_len; | ||
1331 | info->flags = FBINFO_DEFAULT; | 1252 | info->flags = FBINFO_DEFAULT; |
1332 | info->pseudo_palette = &fb->pseudo_palette; | 1253 | info->pseudo_palette = &fb->pseudo_palette; |
1333 | 1254 | ||