提交 18b095d4 编写于 作者: Y Yoichi Yuasa 提交者: Linus Torvalds

drivers/char: remove old broken Cobalt LCD driver

Remove old broken Cobalt LCD driver.
Signed-off-by: NYoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
Acked-by: NRalf Baechle <ralf@linux-mips.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 5abe3b40
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
......@@ -857,13 +857,6 @@ config DS1302
endif # RTC_LIB
config COBALT_LCD
bool "Support for Cobalt LCD"
depends on MIPS_COBALT
help
This option enables support for the LCD display and buttons found
on Cobalt systems through a misc device.
config DTLK
tristate "Double Talk PC internal speech card support"
depends on ISA
......
......@@ -88,7 +88,6 @@ obj-$(CONFIG_TOSHIBA) += toshiba.o
obj-$(CONFIG_I8K) += i8k.o
obj-$(CONFIG_DS1620) += ds1620.o
obj-$(CONFIG_HW_RANDOM) += hw_random/
obj-$(CONFIG_COBALT_LCD) += lcd.o
obj-$(CONFIG_PPDEV) += ppdev.o
obj-$(CONFIG_NWBUTTON) += nwbutton.o
obj-$(CONFIG_NWFLASH) += nwflash.o
......
/*
* LCD, LED and Button interface for Cobalt
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1996, 1997 by Andrew Bose
*
* Linux kernel version history:
* March 2001: Ported from 2.0.34 by Liam Davies
*
*/
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <linux/ioport.h>
#include <linux/fcntl.h>
#include <linux/mc146818rtc.h>
#include <linux/netdevice.h>
#include <linux/sched.h>
#include <linux/smp_lock.h>
#include <linux/delay.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include "lcd.h"
static int lcd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg);
static unsigned int lcd_present = 1;
/* used in arch/mips/cobalt/reset.c */
int led_state = 0;
#if defined(CONFIG_TULIP) && 0
#define MAX_INTERFACES 8
static linkcheck_func_t linkcheck_callbacks[MAX_INTERFACES];
static void *linkcheck_cookies[MAX_INTERFACES];
int lcd_register_linkcheck_func(int iface_num, void *func, void *cookie)
{
if (iface_num < 0 ||
iface_num >= MAX_INTERFACES ||
linkcheck_callbacks[iface_num] != NULL)
return -1;
linkcheck_callbacks[iface_num] = (linkcheck_func_t) func;
linkcheck_cookies[iface_num] = cookie;
return 0;
}
#endif
static int lcd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
struct lcd_display button_display;
unsigned long address, a;
switch (cmd) {
case LCD_On:
udelay(150);
BusyCheck();
LCDWriteInst(0x0F);
break;
case LCD_Off:
udelay(150);
BusyCheck();
LCDWriteInst(0x08);
break;
case LCD_Reset:
udelay(150);
LCDWriteInst(0x3F);
udelay(150);
LCDWriteInst(0x3F);
udelay(150);
LCDWriteInst(0x3F);
udelay(150);
LCDWriteInst(0x3F);
udelay(150);
LCDWriteInst(0x01);
udelay(150);
LCDWriteInst(0x06);
break;
case LCD_Clear:
udelay(150);
BusyCheck();
LCDWriteInst(0x01);
break;
case LCD_Cursor_Left:
udelay(150);
BusyCheck();
LCDWriteInst(0x10);
break;
case LCD_Cursor_Right:
udelay(150);
BusyCheck();
LCDWriteInst(0x14);
break;
case LCD_Cursor_Off:
udelay(150);
BusyCheck();
LCDWriteInst(0x0C);
break;
case LCD_Cursor_On:
udelay(150);
BusyCheck();
LCDWriteInst(0x0F);
break;
case LCD_Blink_Off:
udelay(150);
BusyCheck();
LCDWriteInst(0x0E);
break;
case LCD_Get_Cursor_Pos:{
struct lcd_display display;
udelay(150);
BusyCheck();
display.cursor_address = (LCDReadInst);
display.cursor_address =
(display.cursor_address & 0x07F);
if (copy_to_user
((struct lcd_display *) arg, &display,
sizeof(struct lcd_display)))
return -EFAULT;
break;
}
case LCD_Set_Cursor_Pos:{
struct lcd_display display;
if (copy_from_user
(&display, (struct lcd_display *) arg,
sizeof(struct lcd_display)))
return -EFAULT;
a = (display.cursor_address | kLCD_Addr);
udelay(150);
BusyCheck();
LCDWriteInst(a);
break;
}
case LCD_Get_Cursor:{
struct lcd_display display;
udelay(150);
BusyCheck();
display.character = LCDReadData;
if (copy_to_user
((struct lcd_display *) arg, &display,
sizeof(struct lcd_display)))
return -EFAULT;
udelay(150);
BusyCheck();
LCDWriteInst(0x10);
break;
}
case LCD_Set_Cursor:{
struct lcd_display display;
if (copy_from_user
(&display, (struct lcd_display *) arg,
sizeof(struct lcd_display)))
return -EFAULT;
udelay(150);
BusyCheck();
LCDWriteData(display.character);
udelay(150);
BusyCheck();
LCDWriteInst(0x10);
break;
}
case LCD_Disp_Left:
udelay(150);
BusyCheck();
LCDWriteInst(0x18);
break;
case LCD_Disp_Right:
udelay(150);
BusyCheck();
LCDWriteInst(0x1C);
break;
case LCD_Home:
udelay(150);
BusyCheck();
LCDWriteInst(0x02);
break;
case LCD_Write:{
struct lcd_display display;
unsigned int index;
if (copy_from_user
(&display, (struct lcd_display *) arg,
sizeof(struct lcd_display)))
return -EFAULT;
udelay(150);
BusyCheck();
LCDWriteInst(0x80);
udelay(150);
BusyCheck();
for (index = 0; index < (display.size1); index++) {
udelay(150);
BusyCheck();
LCDWriteData(display.line1[index]);
BusyCheck();
}
udelay(150);
BusyCheck();
LCDWriteInst(0xC0);
udelay(150);
BusyCheck();
for (index = 0; index < (display.size2); index++) {
udelay(150);
BusyCheck();
LCDWriteData(display.line2[index]);
}
break;
}
case LCD_Read:{
struct lcd_display display;
BusyCheck();
for (address = kDD_R00; address <= kDD_R01;
address++) {
a = (address | kLCD_Addr);
udelay(150);
BusyCheck();
LCDWriteInst(a);
udelay(150);
BusyCheck();
display.line1[address] = LCDReadData;
}
display.line1[0x27] = '\0';
for (address = kDD_R10; address <= kDD_R11;
address++) {
a = (address | kLCD_Addr);
udelay(150);
BusyCheck();
LCDWriteInst(a);
udelay(150);
BusyCheck();
display.line2[address - 0x40] =
LCDReadData;
}
display.line2[0x27] = '\0';
if (copy_to_user
((struct lcd_display *) arg, &display,
sizeof(struct lcd_display)))
return -EFAULT;
break;
}
// set all GPIO leds to led_display.leds
case LED_Set:{
struct lcd_display led_display;
if (copy_from_user
(&led_display, (struct lcd_display *) arg,
sizeof(struct lcd_display)))
return -EFAULT;
led_state = led_display.leds;
LEDSet(led_state);
break;
}
// set only bit led_display.leds
case LED_Bit_Set:{
unsigned int i;
int bit = 1;
struct lcd_display led_display;
if (copy_from_user
(&led_display, (struct lcd_display *) arg,
sizeof(struct lcd_display)))
return -EFAULT;
for (i = 0; i < (int) led_display.leds; i++) {
bit = 2 * bit;
}
led_state = led_state | bit;
LEDSet(led_state);
break;
}
// clear only bit led_display.leds
case LED_Bit_Clear:{
unsigned int i;
int bit = 1;
struct lcd_display led_display;
if (copy_from_user
(&led_display, (struct lcd_display *) arg,
sizeof(struct lcd_display)))
return -EFAULT;
for (i = 0; i < (int) led_display.leds; i++) {
bit = 2 * bit;
}
led_state = led_state & ~bit;
LEDSet(led_state);
break;
}
case BUTTON_Read:{
button_display.buttons = GPIRead;
if (copy_to_user
((struct lcd_display *) arg, &button_display,
sizeof(struct lcd_display)))
return -EFAULT;
break;
}
case LINK_Check:{
button_display.buttons =
*((volatile unsigned long *) (0xB0100060));
if (copy_to_user
((struct lcd_display *) arg, &button_display,
sizeof(struct lcd_display)))
return -EFAULT;
break;
}
case LINK_Check_2:{
int iface_num;
/* panel-utils should pass in the desired interface status is wanted for
* in "buttons" of the structure. We will set this to non-zero if the
* link is in fact up for the requested interface. --DaveM
*/
if (copy_from_user
(&button_display, (struct lcd_display *) arg,
sizeof(button_display)))
return -EFAULT;
iface_num = button_display.buttons;
#if defined(CONFIG_TULIP) && 0
if (iface_num >= 0 &&
iface_num < MAX_INTERFACES &&
linkcheck_callbacks[iface_num] != NULL) {
button_display.buttons =
linkcheck_callbacks[iface_num]
(linkcheck_cookies[iface_num]);
} else
#endif
button_display.buttons = 0;
if (__copy_to_user
((struct lcd_display *) arg, &button_display,
sizeof(struct lcd_display)))
return -EFAULT;
break;
}
default:
return -EINVAL;
}
return 0;
}
static int lcd_open(struct inode *inode, struct file *file)
{
cycle_kernel_lock();
if (!lcd_present)
return -ENXIO;
else
return 0;
}
/* Only RESET or NEXT counts as button pressed */
static inline int button_pressed(void)
{
unsigned long buttons = GPIRead;
if ((buttons == BUTTON_Next) || (buttons == BUTTON_Next_B)
|| (buttons == BUTTON_Reset_B))
return buttons;
return 0;
}
/* LED daemon sits on this and we wake him up once a key is pressed. */
static int lcd_waiters = 0;
static ssize_t lcd_read(struct file *file, char *buf,
size_t count, loff_t *ofs)
{
long buttons_now;
if (lcd_waiters > 0)
return -EINVAL;
lcd_waiters++;
while (((buttons_now = (long) button_pressed()) == 0) &&
!(signal_pending(current))) {
msleep_interruptible(2000);
}
lcd_waiters--;
if (signal_pending(current))
return -ERESTARTSYS;
return buttons_now;
}
/*
* The various file operations we support.
*/
static const struct file_operations lcd_fops = {
.read = lcd_read,
.ioctl = lcd_ioctl,
.open = lcd_open,
};
static struct miscdevice lcd_dev = {
MISC_DYNAMIC_MINOR,
"lcd",
&lcd_fops
};
static int lcd_init(void)
{
int ret;
unsigned long data;
pr_info("%s\n", LCD_DRIVER);
ret = misc_register(&lcd_dev);
if (ret) {
printk(KERN_WARNING LCD "Unable to register misc device.\n");
return ret;
}
/* Check region? Naaah! Just snarf it up. */
/* request_region(RTC_PORT(0), RTC_IO_EXTENT, "lcd");*/
udelay(150);
data = LCDReadData;
if ((data & 0x000000FF) == (0x00)) {
lcd_present = 0;
pr_info(LCD "LCD Not Present\n");
} else {
lcd_present = 1;
WRITE_GAL(kGal_DevBank2PReg, kGal_DevBank2Cfg);
WRITE_GAL(kGal_DevBank3PReg, kGal_DevBank3Cfg);
}
return 0;
}
static void __exit lcd_exit(void)
{
misc_deregister(&lcd_dev);
}
module_init(lcd_init);
module_exit(lcd_exit);
MODULE_AUTHOR("Andrew Bose");
MODULE_LICENSE("GPL");
/*
* LED, LCD and Button panel driver for Cobalt
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1996, 1997 by Andrew Bose
*
* Linux kernel version history:
* March 2001: Ported from 2.0.34 by Liam Davies
*
*/
// function headers
#define LCD_CHARS_PER_LINE 40
#define MAX_IDLE_TIME 120
struct lcd_display {
unsigned buttons;
int size1;
int size2;
unsigned char line1[LCD_CHARS_PER_LINE];
unsigned char line2[LCD_CHARS_PER_LINE];
unsigned char cursor_address;
unsigned char character;
unsigned char leds;
unsigned char *RomImage;
};
#define LCD_DRIVER "Cobalt LCD Driver v2.10"
#define LCD "lcd: "
#define kLCD_IR 0x0F000000
#define kLCD_DR 0x0F000010
#define kGPI 0x0D000000
#define kLED 0x0C000000
#define kDD_R00 0x00
#define kDD_R01 0x27
#define kDD_R10 0x40
#define kDD_R11 0x67
#define kLCD_Addr 0x00000080
#define LCDTimeoutValue 0xfff
// Macros
#define LCDWriteData(x) outl((x << 24), kLCD_DR)
#define LCDWriteInst(x) outl((x << 24), kLCD_IR)
#define LCDReadData (inl(kLCD_DR) >> 24)
#define LCDReadInst (inl(kLCD_IR) >> 24)
#define GPIRead (inl(kGPI) >> 24)
#define LEDSet(x) outb((char)x, kLED)
#define WRITE_GAL(x,y) outl(y, 0x04000000 | (x))
#define BusyCheck() while ((LCDReadInst & 0x80) == 0x80)
/*
* Function command codes for io_ctl.
*/
#define LCD_On 1
#define LCD_Off 2
#define LCD_Clear 3
#define LCD_Reset 4
#define LCD_Cursor_Left 5
#define LCD_Cursor_Right 6
#define LCD_Disp_Left 7
#define LCD_Disp_Right 8
#define LCD_Get_Cursor 9
#define LCD_Set_Cursor 10
#define LCD_Home 11
#define LCD_Read 12
#define LCD_Write 13
#define LCD_Cursor_Off 14
#define LCD_Cursor_On 15
#define LCD_Get_Cursor_Pos 16
#define LCD_Set_Cursor_Pos 17
#define LCD_Blink_Off 18
#define LED_Set 40
#define LED_Bit_Set 41
#define LED_Bit_Clear 42
// Button defs
#define BUTTON_Read 50
// Ethernet LINK check hackaroo
#define LINK_Check 90
#define LINK_Check_2 91
// Button patterns _B - single layer lcd boards
#define BUTTON_NONE 0x3F
#define BUTTON_NONE_B 0xFE
#define BUTTON_Left 0x3B
#define BUTTON_Left_B 0xFA
#define BUTTON_Right 0x37
#define BUTTON_Right_B 0xDE
#define BUTTON_Up 0x2F
#define BUTTON_Up_B 0xF6
#define BUTTON_Down 0x1F
#define BUTTON_Down_B 0xEE
#define BUTTON_Next 0x3D
#define BUTTON_Next_B 0x7E
#define BUTTON_Enter 0x3E
#define BUTTON_Enter_B 0xBE
#define BUTTON_Reset_B 0xFC
// debounce constants
#define BUTTON_SENSE 160000
#define BUTTON_DEBOUNCE 5000
// Galileo register stuff
#define kGal_DevBank2Cfg 0x1466DB33
#define kGal_DevBank2PReg 0x464
#define kGal_DevBank3Cfg 0x146FDFFB
#define kGal_DevBank3PReg 0x468
// Network
#define kIPADDR 1
#define kNETMASK 2
#define kGATEWAY 3
#define kDNS 4
#define kClassA 5
#define kClassB 6
#define kClassC 7
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部