You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'tty-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
Pull TTY/serial patches from Greg KH: "tty and serial merge for 3.4-rc1 Here's the big serial and tty merge for the 3.4-rc1 tree. There's loads of fixes and reworks in here from Jiri for the tty layer, and a number of patches from Alan to help try to wrestle the vt layer into a sane model. Other than that, lots of driver updates and fixes, and other minor stuff, all detailed in the shortlog." * tag 'tty-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (132 commits) serial: pxa: add clk_prepare/clk_unprepare calls TTY: Wrong unicode value copied in con_set_unimap() serial: PL011: clear pending interrupts serial: bfin-uart: Don't access tty circular buffer in TX DMA interrupt after it is reset. vt: NULL dereference in vt_do_kdsk_ioctl() tty: serial: vt8500: fix annotations for probe/remove serial: remove back and forth conversions in serial_out_sync serial: use serial_port_in/out vs serial_in/out in 8250 serial: introduce generic port in/out helpers serial: reduce number of indirections in 8250 code serial: delete useless void casts in 8250.c serial: make 8250's serial_in shareable to other drivers. serial: delete last unused traces of pausing I/O in 8250 pch_uart: Add module parameter descriptions pch_uart: Use existing default_baud in setup_console pch_uart: Add user_uartclk parameter pch_uart: Add Fish River Island II uart clock quirks pch_uart: Use uartclk instead of base_baud mpc5200b/uart: select more tolerant uart prescaler on low baudrates tty: moxa: fix bit test in moxa_start() ...
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
* Energymicro efm32 UART
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "efm32,uart"
|
||||
- reg : Address and length of the register set
|
||||
- interrupts : Should contain uart interrupt
|
||||
|
||||
Example:
|
||||
|
||||
uart@0x4000c400 {
|
||||
compatible = "efm32,uart";
|
||||
reg = <0x4000c400 0x400>;
|
||||
interrupts = <15>;
|
||||
};
|
||||
+1
-1
@@ -6212,8 +6212,8 @@ L: sparclinux@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6.git
|
||||
S: Maintained
|
||||
F: include/linux/sunserialcore.h
|
||||
F: drivers/tty/serial/suncore.c
|
||||
F: drivers/tty/serial/suncore.h
|
||||
F: drivers/tty/serial/sunhv.c
|
||||
F: drivers/tty/serial/sunsab.c
|
||||
F: drivers/tty/serial/sunsab.h
|
||||
|
||||
+23
-55
@@ -30,10 +30,9 @@ static int srm_is_registered_console = 0;
|
||||
#define MAX_SRM_CONSOLE_DEVICES 1 /* only support 1 console device */
|
||||
|
||||
struct srmcons_private {
|
||||
struct tty_struct *tty;
|
||||
struct tty_port port;
|
||||
struct timer_list timer;
|
||||
spinlock_t lock;
|
||||
};
|
||||
} srmcons_singleton;
|
||||
|
||||
typedef union _srmcons_result {
|
||||
struct {
|
||||
@@ -68,22 +67,21 @@ static void
|
||||
srmcons_receive_chars(unsigned long data)
|
||||
{
|
||||
struct srmcons_private *srmconsp = (struct srmcons_private *)data;
|
||||
struct tty_port *port = &srmconsp->port;
|
||||
unsigned long flags;
|
||||
int incr = 10;
|
||||
|
||||
local_irq_save(flags);
|
||||
if (spin_trylock(&srmcons_callback_lock)) {
|
||||
if (!srmcons_do_receive_chars(srmconsp->tty))
|
||||
if (!srmcons_do_receive_chars(port->tty))
|
||||
incr = 100;
|
||||
spin_unlock(&srmcons_callback_lock);
|
||||
}
|
||||
|
||||
spin_lock(&srmconsp->lock);
|
||||
if (srmconsp->tty) {
|
||||
srmconsp->timer.expires = jiffies + incr;
|
||||
add_timer(&srmconsp->timer);
|
||||
}
|
||||
spin_unlock(&srmconsp->lock);
|
||||
spin_lock(&port->lock);
|
||||
if (port->tty)
|
||||
mod_timer(&srmconsp->timer, jiffies + incr);
|
||||
spin_unlock(&port->lock);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
@@ -155,57 +153,23 @@ srmcons_chars_in_buffer(struct tty_struct *tty)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
srmcons_get_private_struct(struct srmcons_private **ps)
|
||||
{
|
||||
static struct srmcons_private *srmconsp = NULL;
|
||||
static DEFINE_SPINLOCK(srmconsp_lock);
|
||||
unsigned long flags;
|
||||
int retval = 0;
|
||||
|
||||
if (srmconsp == NULL) {
|
||||
srmconsp = kmalloc(sizeof(*srmconsp), GFP_KERNEL);
|
||||
spin_lock_irqsave(&srmconsp_lock, flags);
|
||||
|
||||
if (srmconsp == NULL)
|
||||
retval = -ENOMEM;
|
||||
else {
|
||||
srmconsp->tty = NULL;
|
||||
spin_lock_init(&srmconsp->lock);
|
||||
init_timer(&srmconsp->timer);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&srmconsp_lock, flags);
|
||||
}
|
||||
|
||||
*ps = srmconsp;
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
srmcons_open(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
struct srmcons_private *srmconsp;
|
||||
struct srmcons_private *srmconsp = &srmcons_singleton;
|
||||
struct tty_port *port = &srmconsp->port;
|
||||
unsigned long flags;
|
||||
int retval;
|
||||
|
||||
retval = srmcons_get_private_struct(&srmconsp);
|
||||
if (retval)
|
||||
return retval;
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
spin_lock_irqsave(&srmconsp->lock, flags);
|
||||
|
||||
if (!srmconsp->tty) {
|
||||
if (!port->tty) {
|
||||
tty->driver_data = srmconsp;
|
||||
|
||||
srmconsp->tty = tty;
|
||||
srmconsp->timer.function = srmcons_receive_chars;
|
||||
srmconsp->timer.data = (unsigned long)srmconsp;
|
||||
srmconsp->timer.expires = jiffies + 10;
|
||||
add_timer(&srmconsp->timer);
|
||||
tty->port = port;
|
||||
port->tty = tty; /* XXX proper refcounting */
|
||||
mod_timer(&srmconsp->timer, jiffies + 10);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&srmconsp->lock, flags);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -214,16 +178,17 @@ static void
|
||||
srmcons_close(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
struct srmcons_private *srmconsp = tty->driver_data;
|
||||
struct tty_port *port = &srmconsp->port;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&srmconsp->lock, flags);
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
if (tty->count == 1) {
|
||||
srmconsp->tty = NULL;
|
||||
port->tty = NULL;
|
||||
del_timer(&srmconsp->timer);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&srmconsp->lock, flags);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -240,6 +205,9 @@ static const struct tty_operations srmcons_ops = {
|
||||
static int __init
|
||||
srmcons_init(void)
|
||||
{
|
||||
tty_port_init(&srmcons_singleton.port);
|
||||
setup_timer(&srmcons_singleton.timer, srmcons_receive_chars,
|
||||
(unsigned long)&srmcons_singleton);
|
||||
if (srm_is_registered_console) {
|
||||
struct tty_driver *driver;
|
||||
int err;
|
||||
|
||||
@@ -160,28 +160,19 @@ sal_emulator (long index, unsigned long in1, unsigned long in2,
|
||||
*/
|
||||
status = 0;
|
||||
if (index == SAL_FREQ_BASE) {
|
||||
switch (in1) {
|
||||
case SAL_FREQ_BASE_PLATFORM:
|
||||
if (in1 == SAL_FREQ_BASE_PLATFORM)
|
||||
r9 = 200000000;
|
||||
break;
|
||||
|
||||
case SAL_FREQ_BASE_INTERVAL_TIMER:
|
||||
else if (in1 == SAL_FREQ_BASE_INTERVAL_TIMER) {
|
||||
/*
|
||||
* Is this supposed to be the cr.itc frequency
|
||||
* or something platform specific? The SAL
|
||||
* doc ain't exactly clear on this...
|
||||
*/
|
||||
r9 = 700000000;
|
||||
break;
|
||||
|
||||
case SAL_FREQ_BASE_REALTIME_CLOCK:
|
||||
} else if (in1 == SAL_FREQ_BASE_REALTIME_CLOCK)
|
||||
r9 = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
else
|
||||
status = -1;
|
||||
break;
|
||||
}
|
||||
} else if (index == SAL_SET_VECTORS) {
|
||||
;
|
||||
} else if (index == SAL_GET_STATE_INFO) {
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include "hpsim_ssc.h"
|
||||
|
||||
static unsigned int
|
||||
hpsim_irq_startup(struct irq_data *data)
|
||||
{
|
||||
@@ -37,15 +39,37 @@ static struct irq_chip irq_type_hp_sim = {
|
||||
.irq_set_affinity = hpsim_set_affinity_noop,
|
||||
};
|
||||
|
||||
static void hpsim_irq_set_chip(int irq)
|
||||
{
|
||||
struct irq_chip *chip = irq_get_chip(irq);
|
||||
|
||||
if (chip == &no_irq_chip)
|
||||
irq_set_chip(irq, &irq_type_hp_sim);
|
||||
}
|
||||
|
||||
static void hpsim_connect_irq(int intr, int irq)
|
||||
{
|
||||
ia64_ssc(intr, irq, 0, 0, SSC_CONNECT_INTERRUPT);
|
||||
}
|
||||
|
||||
int hpsim_get_irq(int intr)
|
||||
{
|
||||
int irq = assign_irq_vector(AUTO_ASSIGN);
|
||||
|
||||
if (irq >= 0) {
|
||||
hpsim_irq_set_chip(irq);
|
||||
irq_set_handler(irq, handle_simple_irq);
|
||||
hpsim_connect_irq(intr, irq);
|
||||
}
|
||||
|
||||
return irq;
|
||||
}
|
||||
|
||||
void __init
|
||||
hpsim_irq_init (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_active_irq(i) {
|
||||
struct irq_chip *chip = irq_get_chip(i);
|
||||
|
||||
if (chip == &no_irq_chip)
|
||||
irq_set_chip(i, &irq_type_hp_sim);
|
||||
}
|
||||
for_each_active_irq(i)
|
||||
hpsim_irq_set_chip(i);
|
||||
}
|
||||
|
||||
@@ -25,12 +25,6 @@
|
||||
|
||||
#include "hpsim_ssc.h"
|
||||
|
||||
void
|
||||
ia64_ssc_connect_irq (long intr, long irq)
|
||||
{
|
||||
ia64_ssc(intr, irq, 0, 0, SSC_CONNECT_INTERRUPT);
|
||||
}
|
||||
|
||||
void
|
||||
ia64_ctl_trace (long on)
|
||||
{
|
||||
|
||||
@@ -128,17 +128,6 @@ netdev_probe(char *name, unsigned char *ether)
|
||||
}
|
||||
|
||||
|
||||
static inline int
|
||||
netdev_connect(int irq)
|
||||
{
|
||||
/* XXX Fix me
|
||||
* this does not support multiple cards
|
||||
* also no return value
|
||||
*/
|
||||
ia64_ssc_connect_irq(NETWORK_INTR, irq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
netdev_attach(int fd, int irq, unsigned int ipaddr)
|
||||
{
|
||||
@@ -226,15 +215,13 @@ simeth_probe1(void)
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __func__);
|
||||
dev->irq = rc;
|
||||
|
||||
/*
|
||||
* attach the interrupt in the simulator, this does enable interrupts
|
||||
* until a netdev_attach() is called
|
||||
*/
|
||||
netdev_connect(dev->irq);
|
||||
if ((rc = hpsim_get_irq(NETWORK_INTR)) < 0)
|
||||
panic("%s: out of interrupt vectors!\n", __func__);
|
||||
dev->irq = rc;
|
||||
|
||||
printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr",
|
||||
dev->name, simeth_device, local->simfd);
|
||||
|
||||
+121
-532
File diff suppressed because it is too large
Load Diff
@@ -10,7 +10,7 @@ int simcons_register(void);
|
||||
struct tty_driver;
|
||||
extern struct tty_driver *hp_simserial_driver;
|
||||
|
||||
void ia64_ssc_connect_irq(long intr, long irq);
|
||||
extern int hpsim_get_irq(int intr);
|
||||
void ia64_ctl_trace(long on);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -127,7 +127,6 @@ static int __init nfcon_init(void)
|
||||
if (!nfcon_tty_driver)
|
||||
return -ENOMEM;
|
||||
|
||||
nfcon_tty_driver->owner = THIS_MODULE;
|
||||
nfcon_tty_driver->driver_name = "nfcon";
|
||||
nfcon_tty_driver->name = "nfcon";
|
||||
nfcon_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
|
||||
|
||||
@@ -90,11 +90,13 @@ static int pdc_console_setup(struct console *co, char *options)
|
||||
|
||||
#define PDC_CONS_POLL_DELAY (30 * HZ / 1000)
|
||||
|
||||
static struct timer_list pdc_console_timer;
|
||||
static void pdc_console_poll(unsigned long unused);
|
||||
static DEFINE_TIMER(pdc_console_timer, pdc_console_poll, 0, 0);
|
||||
static struct tty_port tty_port;
|
||||
|
||||
static int pdc_console_tty_open(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
|
||||
tty_port_tty_set(&tty_port, tty);
|
||||
mod_timer(&pdc_console_timer, jiffies + PDC_CONS_POLL_DELAY);
|
||||
|
||||
return 0;
|
||||
@@ -102,8 +104,10 @@ static int pdc_console_tty_open(struct tty_struct *tty, struct file *filp)
|
||||
|
||||
static void pdc_console_tty_close(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
if (!tty->count)
|
||||
del_timer(&pdc_console_timer);
|
||||
if (!tty->count) {
|
||||
del_timer_sync(&pdc_console_timer);
|
||||
tty_port_tty_set(&tty_port, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static int pdc_console_tty_write(struct tty_struct *tty, const unsigned char *buf, int count)
|
||||
@@ -122,8 +126,6 @@ static int pdc_console_tty_chars_in_buffer(struct tty_struct *tty)
|
||||
return 0; /* no buffer */
|
||||
}
|
||||
|
||||
static struct tty_driver *pdc_console_tty_driver;
|
||||
|
||||
static const struct tty_operations pdc_console_tty_ops = {
|
||||
.open = pdc_console_tty_open,
|
||||
.close = pdc_console_tty_close,
|
||||
@@ -134,10 +136,8 @@ static const struct tty_operations pdc_console_tty_ops = {
|
||||
|
||||
static void pdc_console_poll(unsigned long unused)
|
||||
{
|
||||
|
||||
int data, count = 0;
|
||||
|
||||
struct tty_struct *tty = pdc_console_tty_driver->ttys[0];
|
||||
struct tty_struct *tty = tty_port_tty_get(&tty_port);
|
||||
|
||||
if (!tty)
|
||||
return;
|
||||
@@ -153,15 +153,17 @@ static void pdc_console_poll(unsigned long unused)
|
||||
if (count)
|
||||
tty_flip_buffer_push(tty);
|
||||
|
||||
if (tty->count && (pdc_cons.flags & CON_ENABLED))
|
||||
tty_kref_put(tty);
|
||||
|
||||
if (pdc_cons.flags & CON_ENABLED)
|
||||
mod_timer(&pdc_console_timer, jiffies + PDC_CONS_POLL_DELAY);
|
||||
}
|
||||
|
||||
static struct tty_driver *pdc_console_tty_driver;
|
||||
|
||||
static int __init pdc_console_tty_driver_init(void)
|
||||
{
|
||||
|
||||
int err;
|
||||
struct tty_driver *drv;
|
||||
|
||||
/* Check if the console driver is still registered.
|
||||
* It is unregistered if the pdc console was not selected as the
|
||||
@@ -183,32 +185,29 @@ static int __init pdc_console_tty_driver_init(void)
|
||||
printk(KERN_INFO "The PDC console driver is still registered, removing CON_BOOT flag\n");
|
||||
pdc_cons.flags &= ~CON_BOOT;
|
||||
|
||||
drv = alloc_tty_driver(1);
|
||||
tty_port_init(&tty_port);
|
||||
|
||||
if (!drv)
|
||||
pdc_console_tty_driver = alloc_tty_driver(1);
|
||||
|
||||
if (!pdc_console_tty_driver)
|
||||
return -ENOMEM;
|
||||
|
||||
drv->driver_name = "pdc_cons";
|
||||
drv->name = "ttyB";
|
||||
drv->major = MUX_MAJOR;
|
||||
drv->minor_start = 0;
|
||||
drv->type = TTY_DRIVER_TYPE_SYSTEM;
|
||||
drv->init_termios = tty_std_termios;
|
||||
drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;
|
||||
tty_set_operations(drv, &pdc_console_tty_ops);
|
||||
pdc_console_tty_driver->driver_name = "pdc_cons";
|
||||
pdc_console_tty_driver->name = "ttyB";
|
||||
pdc_console_tty_driver->major = MUX_MAJOR;
|
||||
pdc_console_tty_driver->minor_start = 0;
|
||||
pdc_console_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
|
||||
pdc_console_tty_driver->init_termios = tty_std_termios;
|
||||
pdc_console_tty_driver->flags = TTY_DRIVER_REAL_RAW |
|
||||
TTY_DRIVER_RESET_TERMIOS;
|
||||
tty_set_operations(pdc_console_tty_driver, &pdc_console_tty_ops);
|
||||
|
||||
err = tty_register_driver(drv);
|
||||
err = tty_register_driver(pdc_console_tty_driver);
|
||||
if (err) {
|
||||
printk(KERN_ERR "Unable to register the PDC console TTY driver\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
pdc_console_tty_driver = drv;
|
||||
|
||||
/* No need to initialize the pdc_console_timer if tty isn't allocated */
|
||||
init_timer(&pdc_console_timer);
|
||||
pdc_console_timer.function = pdc_console_poll;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#include <linux/param.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serialP.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -37,6 +36,7 @@
|
||||
#define SERIAL_TIMER_VALUE (20 * HZ)
|
||||
|
||||
static struct tty_driver *serial_driver;
|
||||
static struct tty_port serial_port;
|
||||
static struct timer_list serial_timer;
|
||||
|
||||
static DEFINE_SPINLOCK(timer_lock);
|
||||
@@ -68,17 +68,10 @@ static void rs_poll(unsigned long);
|
||||
|
||||
static int rs_open(struct tty_struct *tty, struct file * filp)
|
||||
{
|
||||
int line = tty->index;
|
||||
|
||||
if ((line < 0) || (line >= SERIAL_MAX_NUM_LINES))
|
||||
return -ENODEV;
|
||||
|
||||
tty->port = &serial_port;
|
||||
spin_lock(&timer_lock);
|
||||
|
||||
if (tty->count == 1) {
|
||||
init_timer(&serial_timer);
|
||||
serial_timer.data = (unsigned long) tty;
|
||||
serial_timer.function = rs_poll;
|
||||
setup_timer(&serial_timer, rs_poll, (unsigned long)tty);
|
||||
mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
|
||||
}
|
||||
spin_unlock(&timer_lock);
|
||||
@@ -99,10 +92,10 @@ static int rs_open(struct tty_struct *tty, struct file * filp)
|
||||
*/
|
||||
static void rs_close(struct tty_struct *tty, struct file * filp)
|
||||
{
|
||||
spin_lock(&timer_lock);
|
||||
spin_lock_bh(&timer_lock);
|
||||
if (tty->count == 1)
|
||||
del_timer_sync(&serial_timer);
|
||||
spin_unlock(&timer_lock);
|
||||
spin_unlock_bh(&timer_lock);
|
||||
}
|
||||
|
||||
|
||||
@@ -210,13 +203,14 @@ static const struct tty_operations serial_ops = {
|
||||
|
||||
int __init rs_init(void)
|
||||
{
|
||||
serial_driver = alloc_tty_driver(1);
|
||||
tty_port_init(&serial_port);
|
||||
|
||||
serial_driver = alloc_tty_driver(SERIAL_MAX_NUM_LINES);
|
||||
|
||||
printk ("%s %s\n", serial_name, serial_version);
|
||||
|
||||
/* Initialize the tty_driver structure */
|
||||
|
||||
serial_driver->owner = THIS_MODULE;
|
||||
serial_driver->driver_name = "iss_serial";
|
||||
serial_driver->name = "ttyS";
|
||||
serial_driver->major = TTY_MAJOR;
|
||||
|
||||
@@ -244,16 +244,13 @@ static int keyboard_notifier_call(struct notifier_block *blk,
|
||||
|
||||
switch (val) {
|
||||
case KVAL(K_CAPS):
|
||||
on_off = vc_kbd_led(kbd_table + fg_console,
|
||||
VC_CAPSLOCK);
|
||||
on_off = vt_get_leds(fg_console, VC_CAPSLOCK);
|
||||
break;
|
||||
case KVAL(K_NUM):
|
||||
on_off = vc_kbd_led(kbd_table + fg_console,
|
||||
VC_NUMLOCK);
|
||||
on_off = vt_get_leds(fg_console, VC_NUMLOCK);
|
||||
break;
|
||||
case KVAL(K_HOLD):
|
||||
on_off = vc_kbd_led(kbd_table + fg_console,
|
||||
VC_SCROLLOCK);
|
||||
on_off = vt_get_leds(fg_console, VC_SCROLLOCK);
|
||||
break;
|
||||
}
|
||||
if (on_off == 1)
|
||||
|
||||
@@ -66,21 +66,6 @@ config TTY_PRINTK
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config BRIQ_PANEL
|
||||
tristate 'Total Impact briQ front panel driver'
|
||||
depends on PPC_CHRP
|
||||
---help---
|
||||
The briQ is a small footprint CHRP computer with a frontpanel VFD, a
|
||||
tristate led and two switches. It is the size of a CDROM drive.
|
||||
|
||||
If you have such one and want anything showing on the VFD then you
|
||||
must answer Y here.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called briq_panel.
|
||||
|
||||
It's safe to say N here.
|
||||
|
||||
config BFIN_OTP
|
||||
tristate "Blackfin On-Chip OTP Memory Support"
|
||||
depends on BLACKFIN && (BF51x || BF52x || BF54x)
|
||||
|
||||
@@ -16,7 +16,6 @@ obj-$(CONFIG_UV_MMTIMER) += uv_mmtimer.o
|
||||
obj-$(CONFIG_VIOTAPE) += viotape.o
|
||||
obj-$(CONFIG_IBM_BSR) += bsr.o
|
||||
obj-$(CONFIG_SGI_MBCS) += mbcs.o
|
||||
obj-$(CONFIG_BRIQ_PANEL) += briq_panel.o
|
||||
obj-$(CONFIG_BFIN_OTP) += bfin-otp.o
|
||||
|
||||
obj-$(CONFIG_PRINTER) += lp.o
|
||||
|
||||
@@ -1,266 +0,0 @@
|
||||
/*
|
||||
* Drivers for the Total Impact PPC based computer "BRIQ"
|
||||
* by Dr. Karsten Jeppesen
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
#define BRIQ_PANEL_MINOR 156
|
||||
#define BRIQ_PANEL_VFD_IOPORT 0x0390
|
||||
#define BRIQ_PANEL_LED_IOPORT 0x0398
|
||||
#define BRIQ_PANEL_VER "1.1 (04/20/2002)"
|
||||
#define BRIQ_PANEL_MSG0 "Loading Linux"
|
||||
|
||||
static int vfd_is_open;
|
||||
static unsigned char vfd[40];
|
||||
static int vfd_cursor;
|
||||
static unsigned char ledpb, led;
|
||||
|
||||
static void update_vfd(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* cursor home */
|
||||
outb(0x02, BRIQ_PANEL_VFD_IOPORT);
|
||||
for (i=0; i<20; i++)
|
||||
outb(vfd[i], BRIQ_PANEL_VFD_IOPORT + 1);
|
||||
|
||||
/* cursor to next line */
|
||||
outb(0xc0, BRIQ_PANEL_VFD_IOPORT);
|
||||
for (i=20; i<40; i++)
|
||||
outb(vfd[i], BRIQ_PANEL_VFD_IOPORT + 1);
|
||||
|
||||
}
|
||||
|
||||
static void set_led(char state)
|
||||
{
|
||||
if (state == 'R')
|
||||
led = 0x01;
|
||||
else if (state == 'G')
|
||||
led = 0x02;
|
||||
else if (state == 'Y')
|
||||
led = 0x03;
|
||||
else if (state == 'X')
|
||||
led = 0x00;
|
||||
outb(led, BRIQ_PANEL_LED_IOPORT);
|
||||
}
|
||||
|
||||
static int briq_panel_open(struct inode *ino, struct file *filep)
|
||||
{
|
||||
tty_lock();
|
||||
/* enforce single access, vfd_is_open is protected by BKL */
|
||||
if (vfd_is_open) {
|
||||
tty_unlock();
|
||||
return -EBUSY;
|
||||
}
|
||||
vfd_is_open = 1;
|
||||
|
||||
tty_unlock();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int briq_panel_release(struct inode *ino, struct file *filep)
|
||||
{
|
||||
if (!vfd_is_open)
|
||||
return -ENODEV;
|
||||
|
||||
vfd_is_open = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t briq_panel_read(struct file *file, char __user *buf, size_t count,
|
||||
loff_t *ppos)
|
||||
{
|
||||
unsigned short c;
|
||||
unsigned char cp;
|
||||
|
||||
if (!vfd_is_open)
|
||||
return -ENODEV;
|
||||
|
||||
c = (inb(BRIQ_PANEL_LED_IOPORT) & 0x000c) | (ledpb & 0x0003);
|
||||
set_led(' ');
|
||||
/* upper button released */
|
||||
if ((!(ledpb & 0x0004)) && (c & 0x0004)) {
|
||||
cp = ' ';
|
||||
ledpb = c;
|
||||
if (copy_to_user(buf, &cp, 1))
|
||||
return -EFAULT;
|
||||
return 1;
|
||||
}
|
||||
/* lower button released */
|
||||
else if ((!(ledpb & 0x0008)) && (c & 0x0008)) {
|
||||
cp = '\r';
|
||||
ledpb = c;
|
||||
if (copy_to_user(buf, &cp, 1))
|
||||
return -EFAULT;
|
||||
return 1;
|
||||
} else {
|
||||
ledpb = c;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void scroll_vfd( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<20; i++) {
|
||||
vfd[i] = vfd[i+20];
|
||||
vfd[i+20] = ' ';
|
||||
}
|
||||
vfd_cursor = 20;
|
||||
}
|
||||
|
||||
static ssize_t briq_panel_write(struct file *file, const char __user *buf, size_t len,
|
||||
loff_t *ppos)
|
||||
{
|
||||
size_t indx = len;
|
||||
int i, esc = 0;
|
||||
|
||||
if (!vfd_is_open)
|
||||
return -EBUSY;
|
||||
|
||||
for (;;) {
|
||||
char c;
|
||||
if (!indx)
|
||||
break;
|
||||
if (get_user(c, buf))
|
||||
return -EFAULT;
|
||||
if (esc) {
|
||||
set_led(c);
|
||||
esc = 0;
|
||||
} else if (c == 27) {
|
||||
esc = 1;
|
||||
} else if (c == 12) {
|
||||
/* do a form feed */
|
||||
for (i=0; i<40; i++)
|
||||
vfd[i] = ' ';
|
||||
vfd_cursor = 0;
|
||||
} else if (c == 10) {
|
||||
if (vfd_cursor < 20)
|
||||
vfd_cursor = 20;
|
||||
else if (vfd_cursor < 40)
|
||||
vfd_cursor = 40;
|
||||
else if (vfd_cursor < 60)
|
||||
vfd_cursor = 60;
|
||||
if (vfd_cursor > 59)
|
||||
scroll_vfd();
|
||||
} else {
|
||||
/* just a character */
|
||||
if (vfd_cursor > 39)
|
||||
scroll_vfd();
|
||||
vfd[vfd_cursor++] = c;
|
||||
}
|
||||
indx--;
|
||||
buf++;
|
||||
}
|
||||
update_vfd();
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static const struct file_operations briq_panel_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = briq_panel_read,
|
||||
.write = briq_panel_write,
|
||||
.open = briq_panel_open,
|
||||
.release = briq_panel_release,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static struct miscdevice briq_panel_miscdev = {
|
||||
BRIQ_PANEL_MINOR,
|
||||
"briq_panel",
|
||||
&briq_panel_fops
|
||||
};
|
||||
|
||||
static int __init briq_panel_init(void)
|
||||
{
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
const char *machine;
|
||||
int i;
|
||||
|
||||
machine = of_get_property(root, "model", NULL);
|
||||
if (!machine || strncmp(machine, "TotalImpact,BRIQ-1", 18) != 0) {
|
||||
of_node_put(root);
|
||||
return -ENODEV;
|
||||
}
|
||||
of_node_put(root);
|
||||
|
||||
printk(KERN_INFO
|
||||
"briq_panel: v%s Dr. Karsten Jeppesen (kj@totalimpact.com)\n",
|
||||
BRIQ_PANEL_VER);
|
||||
|
||||
if (!request_region(BRIQ_PANEL_VFD_IOPORT, 4, "BRIQ Front Panel"))
|
||||
return -EBUSY;
|
||||
|
||||
if (!request_region(BRIQ_PANEL_LED_IOPORT, 2, "BRIQ Front Panel")) {
|
||||
release_region(BRIQ_PANEL_VFD_IOPORT, 4);
|
||||
return -EBUSY;
|
||||
}
|
||||
ledpb = inb(BRIQ_PANEL_LED_IOPORT) & 0x000c;
|
||||
|
||||
if (misc_register(&briq_panel_miscdev) < 0) {
|
||||
release_region(BRIQ_PANEL_VFD_IOPORT, 4);
|
||||
release_region(BRIQ_PANEL_LED_IOPORT, 2);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
outb(0x38, BRIQ_PANEL_VFD_IOPORT); /* Function set */
|
||||
outb(0x01, BRIQ_PANEL_VFD_IOPORT); /* Clear display */
|
||||
outb(0x0c, BRIQ_PANEL_VFD_IOPORT); /* Display on */
|
||||
outb(0x06, BRIQ_PANEL_VFD_IOPORT); /* Entry normal */
|
||||
for (i=0; i<40; i++)
|
||||
vfd[i]=' ';
|
||||
#ifndef MODULE
|
||||
vfd[0] = 'L';
|
||||
vfd[1] = 'o';
|
||||
vfd[2] = 'a';
|
||||
vfd[3] = 'd';
|
||||
vfd[4] = 'i';
|
||||
vfd[5] = 'n';
|
||||
vfd[6] = 'g';
|
||||
vfd[7] = ' ';
|
||||
vfd[8] = '.';
|
||||
vfd[9] = '.';
|
||||
vfd[10] = '.';
|
||||
#endif /* !MODULE */
|
||||
|
||||
update_vfd();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit briq_panel_exit(void)
|
||||
{
|
||||
misc_deregister(&briq_panel_miscdev);
|
||||
release_region(BRIQ_PANEL_VFD_IOPORT, 4);
|
||||
release_region(BRIQ_PANEL_LED_IOPORT, 2);
|
||||
}
|
||||
|
||||
module_init(briq_panel_init);
|
||||
module_exit(briq_panel_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Karsten Jeppesen <karsten@jeppesens.com>");
|
||||
MODULE_DESCRIPTION("Driver for the Total Impact briQ front panel");
|
||||
@@ -2484,7 +2484,7 @@ static int mgslpc_open(struct tty_struct *tty, struct file * filp)
|
||||
|
||||
/* verify range of specified line number */
|
||||
line = tty->index;
|
||||
if ((line < 0) || (line >= mgslpc_device_count)) {
|
||||
if (line >= mgslpc_device_count) {
|
||||
printk("%s(%d):mgslpc_open with invalid line #%d.\n",
|
||||
__FILE__,__LINE__,line);
|
||||
return -ENODEV;
|
||||
@@ -2836,7 +2836,6 @@ static int __init synclink_cs_init(void)
|
||||
|
||||
/* Initialize the tty_driver structure */
|
||||
|
||||
serial_driver->owner = THIS_MODULE;
|
||||
serial_driver->driver_name = "synclink_cs";
|
||||
serial_driver->name = "ttySLP";
|
||||
serial_driver->major = ttymajor;
|
||||
|
||||
@@ -184,12 +184,10 @@ static int __init ttyprintk_init(void)
|
||||
if (!ttyprintk_driver)
|
||||
return ret;
|
||||
|
||||
ttyprintk_driver->owner = THIS_MODULE;
|
||||
ttyprintk_driver->driver_name = "ttyprintk";
|
||||
ttyprintk_driver->name = "ttyprintk";
|
||||
ttyprintk_driver->major = TTYAUX_MAJOR;
|
||||
ttyprintk_driver->minor_start = 3;
|
||||
ttyprintk_driver->num = 1;
|
||||
ttyprintk_driver->type = TTY_DRIVER_TYPE_CONSOLE;
|
||||
ttyprintk_driver->init_termios = tty_std_termios;
|
||||
ttyprintk_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET;
|
||||
|
||||
@@ -1013,16 +1013,12 @@ static const struct file_operations capi_fops =
|
||||
static int
|
||||
capinc_tty_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||
{
|
||||
int idx = tty->index;
|
||||
struct capiminor *mp = capiminor_get(idx);
|
||||
int ret = tty_init_termios(tty);
|
||||
struct capiminor *mp = capiminor_get(tty->index);
|
||||
int ret = tty_standard_install(driver, tty);
|
||||
|
||||
if (ret == 0) {
|
||||
tty_driver_kref_get(driver);
|
||||
tty->count++;
|
||||
if (ret == 0)
|
||||
tty->driver_data = mp;
|
||||
driver->ttys[idx] = tty;
|
||||
} else
|
||||
else
|
||||
capiminor_put(mp);
|
||||
return ret;
|
||||
}
|
||||
@@ -1290,7 +1286,6 @@ static int __init capinc_tty_init(void)
|
||||
kfree(capiminors);
|
||||
return -ENOMEM;
|
||||
}
|
||||
drv->owner = THIS_MODULE;
|
||||
drv->driver_name = "capi_nc";
|
||||
drv->name = "capi";
|
||||
drv->major = 0;
|
||||
|
||||
@@ -720,12 +720,11 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
|
||||
|
||||
tasklet_init(&cs->event_tasklet, gigaset_handle_event,
|
||||
(unsigned long) cs);
|
||||
tty_port_init(&cs->port);
|
||||
cs->commands_pending = 0;
|
||||
cs->cur_at_seq = 0;
|
||||
cs->gotfwver = -1;
|
||||
cs->open_count = 0;
|
||||
cs->dev = NULL;
|
||||
cs->tty = NULL;
|
||||
cs->tty_dev = NULL;
|
||||
cs->cidmode = cidmode != 0;
|
||||
cs->tabnocid = gigaset_tab_nocid;
|
||||
@@ -1051,8 +1050,6 @@ static struct cardstate *gigaset_get_cs_by_minor(unsigned minor)
|
||||
|
||||
struct cardstate *gigaset_get_cs_by_tty(struct tty_struct *tty)
|
||||
{
|
||||
if (tty->index < 0 || tty->index >= tty->driver->num)
|
||||
return NULL;
|
||||
return gigaset_get_cs_by_minor(tty->index + tty->driver->minor_start);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user