Blame view
drivers/macintosh/ans-lcd.c
4.01 KB
b24413180 License cleanup: ... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 5 6 7 8 9 10 |
/* * /dev/lcd driver for Apple Network Servers. */ #include <linux/types.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/miscdevice.h> #include <linux/fcntl.h> |
120d200a8 macintosh/ans-lcd... |
11 |
#include <linux/module.h> |
1da177e4c Linux-2.6.12-rc2 |
12 13 |
#include <linux/delay.h> #include <linux/fs.h> |
7c0f6ba68 Replace <asm/uacc... |
14 |
#include <linux/uaccess.h> |
1da177e4c Linux-2.6.12-rc2 |
15 16 |
#include <asm/sections.h> #include <asm/prom.h> |
1da177e4c Linux-2.6.12-rc2 |
17 |
#include <asm/io.h> |
33d71d26b [POWERPC] Copy ov... |
18 |
#include "ans-lcd.h" |
1da177e4c Linux-2.6.12-rc2 |
19 20 21 22 23 24 25 |
#define ANSLCD_ADDR 0xf301c000 #define ANSLCD_CTRL_IX 0x00 #define ANSLCD_DATA_IX 0x10 static unsigned long anslcd_short_delay = 80; static unsigned long anslcd_long_delay = 3280; static volatile unsigned char __iomem *anslcd_ptr; |
95fdac737 macintosh: Remove... |
26 |
static DEFINE_MUTEX(anslcd_mutex); |
1da177e4c Linux-2.6.12-rc2 |
27 28 |
#undef DEBUG |
aacaf9bd9 [PATCH] powerpc: ... |
29 |
static void |
1da177e4c Linux-2.6.12-rc2 |
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
anslcd_write_byte_ctrl ( unsigned char c ) { #ifdef DEBUG printk(KERN_DEBUG "LCD: CTRL byte: %02x ",c); #endif out_8(anslcd_ptr + ANSLCD_CTRL_IX, c); switch(c) { case 1: case 2: case 3: udelay(anslcd_long_delay); break; default: udelay(anslcd_short_delay); } } |
aacaf9bd9 [PATCH] powerpc: ... |
45 |
static void |
1da177e4c Linux-2.6.12-rc2 |
46 47 48 49 50 |
anslcd_write_byte_data ( unsigned char c ) { out_8(anslcd_ptr + ANSLCD_DATA_IX, c); udelay(anslcd_short_delay); } |
aacaf9bd9 [PATCH] powerpc: ... |
51 |
static ssize_t |
1da177e4c Linux-2.6.12-rc2 |
52 53 54 55 56 57 58 59 60 61 |
anslcd_write( struct file * file, const char __user * buf, size_t count, loff_t *ppos ) { const char __user *p = buf; int i; #ifdef DEBUG printk(KERN_DEBUG "LCD: write "); #endif |
96d4f267e Remove 'type' arg... |
62 |
if (!access_ok(buf, count)) |
1da177e4c Linux-2.6.12-rc2 |
63 |
return -EFAULT; |
95fdac737 macintosh: Remove... |
64 65 |
mutex_lock(&anslcd_mutex); |
1da177e4c Linux-2.6.12-rc2 |
66 67 68 69 70 71 |
for ( i = *ppos; count > 0; ++i, ++p, --count ) { char c; __get_user(c, p); anslcd_write_byte_data( c ); } |
95fdac737 macintosh: Remove... |
72 |
mutex_unlock(&anslcd_mutex); |
1da177e4c Linux-2.6.12-rc2 |
73 74 75 |
*ppos = i; return p - buf; } |
95fdac737 macintosh: Remove... |
76 77 |
static long anslcd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
1da177e4c Linux-2.6.12-rc2 |
78 79 |
{ char ch, __user *temp; |
95fdac737 macintosh: Remove... |
80 |
long ret = 0; |
1da177e4c Linux-2.6.12-rc2 |
81 82 83 84 85 |
#ifdef DEBUG printk(KERN_DEBUG "LCD: ioctl(%d,%d) ",cmd,arg); #endif |
95fdac737 macintosh: Remove... |
86 |
mutex_lock(&anslcd_mutex); |
1da177e4c Linux-2.6.12-rc2 |
87 88 89 90 91 92 93 94 |
switch ( cmd ) { case ANSLCD_CLEAR: anslcd_write_byte_ctrl ( 0x38 ); anslcd_write_byte_ctrl ( 0x0f ); anslcd_write_byte_ctrl ( 0x06 ); anslcd_write_byte_ctrl ( 0x01 ); anslcd_write_byte_ctrl ( 0x02 ); |
95fdac737 macintosh: Remove... |
95 |
break; |
1da177e4c Linux-2.6.12-rc2 |
96 97 98 99 100 101 102 |
case ANSLCD_SENDCTRL: temp = (char __user *) arg; __get_user(ch, temp); for (; ch; temp++) { /* FIXME: This is ugly, but should work, as a \0 byte is not a valid command code */ anslcd_write_byte_ctrl ( ch ); __get_user(ch, temp); } |
95fdac737 macintosh: Remove... |
103 |
break; |
1da177e4c Linux-2.6.12-rc2 |
104 105 |
case ANSLCD_SETSHORTDELAY: if (!capable(CAP_SYS_ADMIN)) |
95fdac737 macintosh: Remove... |
106 107 108 109 |
ret =-EACCES; else anslcd_short_delay=arg; break; |
1da177e4c Linux-2.6.12-rc2 |
110 111 |
case ANSLCD_SETLONGDELAY: if (!capable(CAP_SYS_ADMIN)) |
95fdac737 macintosh: Remove... |
112 113 114 115 |
ret = -EACCES; else anslcd_long_delay=arg; break; |
1da177e4c Linux-2.6.12-rc2 |
116 |
default: |
95fdac737 macintosh: Remove... |
117 |
ret = -EINVAL; |
1da177e4c Linux-2.6.12-rc2 |
118 |
} |
95fdac737 macintosh: Remove... |
119 120 121 |
mutex_unlock(&anslcd_mutex); return ret; |
1da177e4c Linux-2.6.12-rc2 |
122 |
} |
aacaf9bd9 [PATCH] powerpc: ... |
123 |
static int |
1da177e4c Linux-2.6.12-rc2 |
124 125 126 127 |
anslcd_open( struct inode * inode, struct file * file ) { return 0; } |
fa027c2a0 [PATCH] mark stru... |
128 |
const struct file_operations anslcd_fops = { |
95fdac737 macintosh: Remove... |
129 130 131 |
.write = anslcd_write, .unlocked_ioctl = anslcd_ioctl, .open = anslcd_open, |
6038f373a llseek: automatic... |
132 |
.llseek = default_llseek, |
1da177e4c Linux-2.6.12-rc2 |
133 134 135 |
}; static struct miscdevice anslcd_dev = { |
6ce6ae7c1 misc: cleanup min... |
136 |
LCD_MINOR, |
1da177e4c Linux-2.6.12-rc2 |
137 138 139 |
"anslcd", &anslcd_fops }; |
3775026a6 macintosh: ans-lc... |
140 141 |
static const char anslcd_logo[] __initconst = "********************" /* Line #1 */ |
1da177e4c Linux-2.6.12-rc2 |
142 143 144 145 146 147 148 149 150 151 |
"* LINUX! *" /* Line #3 */ "* Welcome to *" /* Line #2 */ "********************"; /* Line #4 */ static int __init anslcd_init(void) { int a; int retval; struct device_node* node; |
30686ba6d [POWERPC] Remove ... |
152 |
node = of_find_node_by_name(NULL, "lcd"); |
f1e0addca macintosh: Use of... |
153 |
if (!node || !of_node_name_eq(node->parent, "gc")) { |
30686ba6d [POWERPC] Remove ... |
154 |
of_node_put(node); |
1da177e4c Linux-2.6.12-rc2 |
155 |
return -ENODEV; |
30686ba6d [POWERPC] Remove ... |
156 157 |
} of_node_put(node); |
1da177e4c Linux-2.6.12-rc2 |
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
anslcd_ptr = ioremap(ANSLCD_ADDR, 0x20); retval = misc_register(&anslcd_dev); if(retval < 0){ printk(KERN_INFO "LCD: misc_register failed "); iounmap(anslcd_ptr); return retval; } #ifdef DEBUG printk(KERN_DEBUG "LCD: init "); #endif |
95fdac737 macintosh: Remove... |
173 |
mutex_lock(&anslcd_mutex); |
1da177e4c Linux-2.6.12-rc2 |
174 175 176 177 178 179 180 181 |
anslcd_write_byte_ctrl ( 0x38 ); anslcd_write_byte_ctrl ( 0x0c ); anslcd_write_byte_ctrl ( 0x06 ); anslcd_write_byte_ctrl ( 0x01 ); anslcd_write_byte_ctrl ( 0x02 ); for(a=0;a<80;a++) { anslcd_write_byte_data(anslcd_logo[a]); } |
95fdac737 macintosh: Remove... |
182 |
mutex_unlock(&anslcd_mutex); |
1da177e4c Linux-2.6.12-rc2 |
183 184 185 186 187 188 189 190 191 192 193 194 |
return 0; } static void __exit anslcd_exit(void) { misc_deregister(&anslcd_dev); iounmap(anslcd_ptr); } module_init(anslcd_init); module_exit(anslcd_exit); |
47d703e1d macintosh: Add mo... |
195 |
MODULE_LICENSE("GPL v2"); |