Commit d5ef6423 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6

* 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: (26 commits)
  amba pl011: workaround for uart registers lockup
  n_gsm: fix the wrong FCS handling
  pch_uart: add missing comment about OKI ML7223
  pch_uart: Add MSI support
  tty: fix "IRQ45: nobody cared"
  PTI feature to allow user to name and mark masterchannel request.
  0 for o PTI Makefile bug.
  tty: serial: samsung.c remove legacy PM code.
  SERIAL: SC26xx: Fix link error.
  serial: mrst_max3110: initialize waitqueue earlier
  mrst_max3110: Change max missing message priority.
  tty: s5pv210: Add delay loop on fifo reset function for UART
  tty/serial: Fix XSCALE serial ports, e.g. ce4100
  serial: bfin_5xx: fix off-by-one with resource size
  drivers/tty: use printk_ratelimited() instead of printk_ratelimit()
  tty: n_gsm: Added refcount usage to gsm_mux and gsm_dlci structs
  tty: n_gsm: Add raw-ip support
  tty: n_gsm: expose gsmtty device nodes at ldisc open time
  pch_phub: Fix register miss-setting issue
  serial: 8250, increase PASS_LIMIT
  ...
parents f549953c def90f42
...@@ -6,7 +6,7 @@ obj-$(CONFIG_IBM_ASM) += ibmasm/ ...@@ -6,7 +6,7 @@ obj-$(CONFIG_IBM_ASM) += ibmasm/
obj-$(CONFIG_AD525X_DPOT) += ad525x_dpot.o obj-$(CONFIG_AD525X_DPOT) += ad525x_dpot.o
obj-$(CONFIG_AD525X_DPOT_I2C) += ad525x_dpot-i2c.o obj-$(CONFIG_AD525X_DPOT_I2C) += ad525x_dpot-i2c.o
obj-$(CONFIG_AD525X_DPOT_SPI) += ad525x_dpot-spi.o obj-$(CONFIG_AD525X_DPOT_SPI) += ad525x_dpot-spi.o
0bj-$(CONFIG_INTEL_MID_PTI) += pti.o obj-$(CONFIG_INTEL_MID_PTI) += pti.o
obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o obj-$(CONFIG_ATMEL_PWM) += atmel_pwm.o
obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o obj-$(CONFIG_ATMEL_SSC) += atmel-ssc.o
obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o
......
...@@ -735,6 +735,8 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev, ...@@ -735,6 +735,8 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
* Device8(GbE) * Device8(GbE)
*/ */
iowrite32(0x000a0000, chip->pch_phub_base_address + 0x14); iowrite32(0x000a0000, chip->pch_phub_base_address + 0x14);
/* set the interrupt delay value */
iowrite32(0x25, chip->pch_phub_base_address + 0x140);
chip->pch_opt_rom_start_address =\ chip->pch_opt_rom_start_address =\
PCH_PHUB_ROM_START_ADDR_ML7223; PCH_PHUB_ROM_START_ADDR_ML7223;
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223; chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;
...@@ -752,8 +754,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev, ...@@ -752,8 +754,6 @@ static int __devinit pch_phub_probe(struct pci_dev *pdev,
* Device6(SATA 2):f * Device6(SATA 2):f
*/ */
iowrite32(0x0000ffa0, chip->pch_phub_base_address + 0x14); iowrite32(0x0000ffa0, chip->pch_phub_base_address + 0x14);
/* set the interrupt delay value */
iowrite32(0x25, chip->pch_phub_base_address + 0x140);
chip->pch_opt_rom_start_address =\ chip->pch_opt_rom_start_address =\
PCH_PHUB_ROM_START_ADDR_ML7223; PCH_PHUB_ROM_START_ADDR_ML7223;
chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223; chip->pch_mac_start_address = PCH_PHUB_MAC_START_ADDR_ML7223;
......
...@@ -146,45 +146,54 @@ static void pti_write_to_aperture(struct pti_masterchannel *mc, ...@@ -146,45 +146,54 @@ static void pti_write_to_aperture(struct pti_masterchannel *mc,
/** /**
* pti_control_frame_built_and_sent()- control frame build and send function. * pti_control_frame_built_and_sent()- control frame build and send function.
* *
* @mc: The master / channel structure on which the function * @mc: The master / channel structure on which the function
* built a control frame. * built a control frame.
* @thread_name: The thread name associated with the master / channel or
* 'NULL' if using the 'current' global variable.
* *
* To be able to post process the PTI contents on host side, a control frame * To be able to post process the PTI contents on host side, a control frame
* is added before sending any PTI content. So the host side knows on * is added before sending any PTI content. So the host side knows on
* each PTI frame the name of the thread using a dedicated master / channel. * each PTI frame the name of the thread using a dedicated master / channel.
* The thread name is retrieved from the 'current' global variable. * The thread name is retrieved from 'current' global variable if 'thread_name'
* is 'NULL', else it is retrieved from 'thread_name' parameter.
* This function builds this frame and sends it to a master ID CONTROL_ID. * This function builds this frame and sends it to a master ID CONTROL_ID.
* The overhead is only 32 bytes since the driver only writes to HW * The overhead is only 32 bytes since the driver only writes to HW
* in 32 byte chunks. * in 32 byte chunks.
*/ */
static void pti_control_frame_built_and_sent(struct pti_masterchannel *mc,
static void pti_control_frame_built_and_sent(struct pti_masterchannel *mc) const char *thread_name)
{ {
struct pti_masterchannel mccontrol = {.master = CONTROL_ID, struct pti_masterchannel mccontrol = {.master = CONTROL_ID,
.channel = 0}; .channel = 0};
const char *thread_name_p;
const char *control_format = "%3d %3d %s"; const char *control_format = "%3d %3d %s";
u8 control_frame[CONTROL_FRAME_LEN]; u8 control_frame[CONTROL_FRAME_LEN];
/* if (!thread_name) {
* Since we access the comm member in current's task_struct, /*
* we only need to be as large as what 'comm' in that * Since we access the comm member in current's task_struct,
* structure is. * we only need to be as large as what 'comm' in that
*/ * structure is.
char comm[TASK_COMM_LEN]; */
char comm[TASK_COMM_LEN];
if (!in_interrupt()) if (!in_interrupt())
get_task_comm(comm, current); get_task_comm(comm, current);
else else
strncpy(comm, "Interrupt", TASK_COMM_LEN); strncpy(comm, "Interrupt", TASK_COMM_LEN);
/* Absolutely ensure our buffer is zero terminated. */ /* Absolutely ensure our buffer is zero terminated. */
comm[TASK_COMM_LEN-1] = 0; comm[TASK_COMM_LEN-1] = 0;
thread_name_p = comm;
} else {
thread_name_p = thread_name;
}
mccontrol.channel = pti_control_channel; mccontrol.channel = pti_control_channel;
pti_control_channel = (pti_control_channel + 1) & 0x7f; pti_control_channel = (pti_control_channel + 1) & 0x7f;
snprintf(control_frame, CONTROL_FRAME_LEN, control_format, mc->master, snprintf(control_frame, CONTROL_FRAME_LEN, control_format, mc->master,
mc->channel, comm); mc->channel, thread_name_p);
pti_write_to_aperture(&mccontrol, control_frame, strlen(control_frame)); pti_write_to_aperture(&mccontrol, control_frame, strlen(control_frame));
} }
...@@ -206,18 +215,20 @@ static void pti_write_full_frame_to_aperture(struct pti_masterchannel *mc, ...@@ -206,18 +215,20 @@ static void pti_write_full_frame_to_aperture(struct pti_masterchannel *mc,
const unsigned char *buf, const unsigned char *buf,
int len) int len)
{ {
pti_control_frame_built_and_sent(mc); pti_control_frame_built_and_sent(mc, NULL);
pti_write_to_aperture(mc, (u8 *)buf, len); pti_write_to_aperture(mc, (u8 *)buf, len);
} }
/** /**
* get_id()- Allocate a master and channel ID. * get_id()- Allocate a master and channel ID.
* *
* @id_array: an array of bits representing what channel * @id_array: an array of bits representing what channel
* id's are allocated for writing. * id's are allocated for writing.
* @max_ids: The max amount of available write IDs to use. * @max_ids: The max amount of available write IDs to use.
* @base_id: The starting SW channel ID, based on the Intel * @base_id: The starting SW channel ID, based on the Intel
* PTI arch. * PTI arch.
* @thread_name: The thread name associated with the master / channel or
* 'NULL' if using the 'current' global variable.
* *
* Returns: * Returns:
* pti_masterchannel struct with master, channel ID address * pti_masterchannel struct with master, channel ID address
...@@ -227,7 +238,10 @@ static void pti_write_full_frame_to_aperture(struct pti_masterchannel *mc, ...@@ -227,7 +238,10 @@ static void pti_write_full_frame_to_aperture(struct pti_masterchannel *mc,
* channel id. The bit is one if the id is taken and 0 if free. For * channel id. The bit is one if the id is taken and 0 if free. For
* every master there are 128 channel id's. * every master there are 128 channel id's.
*/ */
static struct pti_masterchannel *get_id(u8 *id_array, int max_ids, int base_id) static struct pti_masterchannel *get_id(u8 *id_array,
int max_ids,
int base_id,
const char *thread_name)
{ {
struct pti_masterchannel *mc; struct pti_masterchannel *mc;
int i, j, mask; int i, j, mask;
...@@ -257,7 +271,7 @@ static struct pti_masterchannel *get_id(u8 *id_array, int max_ids, int base_id) ...@@ -257,7 +271,7 @@ static struct pti_masterchannel *get_id(u8 *id_array, int max_ids, int base_id)
mc->master = base_id; mc->master = base_id;
mc->channel = ((i & 0xf)<<3) + j; mc->channel = ((i & 0xf)<<3) + j;
/* write new master Id / channel Id allocation to channel control */ /* write new master Id / channel Id allocation to channel control */
pti_control_frame_built_and_sent(mc); pti_control_frame_built_and_sent(mc, thread_name);
return mc; return mc;
} }
...@@ -273,18 +287,22 @@ static struct pti_masterchannel *get_id(u8 *id_array, int max_ids, int base_id) ...@@ -273,18 +287,22 @@ static struct pti_masterchannel *get_id(u8 *id_array, int max_ids, int base_id)
* a master, channel ID address * a master, channel ID address
* to write to PTI HW. * to write to PTI HW.
* *
* @type: 0- request Application master, channel aperture ID write address. * @type: 0- request Application master, channel aperture ID
* 1- request OS master, channel aperture ID write * write address.
* address. * 1- request OS master, channel aperture ID write
* 2- request Modem master, channel aperture ID * address.
* write address. * 2- request Modem master, channel aperture ID
* Other values, error. * write address.
* Other values, error.
* @thread_name: The thread name associated with the master / channel or
* 'NULL' if using the 'current' global variable.
* *
* Returns: * Returns:
* pti_masterchannel struct * pti_masterchannel struct
* 0 for error * 0 for error
*/ */
struct pti_masterchannel *pti_request_masterchannel(u8 type) struct pti_masterchannel *pti_request_masterchannel(u8 type,
const char *thread_name)
{ {
struct pti_masterchannel *mc; struct pti_masterchannel *mc;
...@@ -293,15 +311,18 @@ struct pti_masterchannel *pti_request_masterchannel(u8 type) ...@@ -293,15 +311,18 @@ struct pti_masterchannel *pti_request_masterchannel(u8 type)
switch (type) { switch (type) {
case 0: case 0:
mc = get_id(drv_data->ia_app, MAX_APP_IDS, APP_BASE_ID); mc = get_id(drv_data->ia_app, MAX_APP_IDS,
APP_BASE_ID, thread_name);
break; break;
case 1: case 1:
mc = get_id(drv_data->ia_os, MAX_OS_IDS, OS_BASE_ID); mc = get_id(drv_data->ia_os, MAX_OS_IDS,
OS_BASE_ID, thread_name);
break; break;
case 2: case 2:
mc = get_id(drv_data->ia_modem, MAX_MODEM_IDS, MODEM_BASE_ID); mc = get_id(drv_data->ia_modem, MAX_MODEM_IDS,
MODEM_BASE_ID, thread_name);
break; break;
default: default:
mc = NULL; mc = NULL;
...@@ -472,9 +493,9 @@ static int pti_tty_install(struct tty_driver *driver, struct tty_struct *tty) ...@@ -472,9 +493,9 @@ static int pti_tty_install(struct tty_driver *driver, struct tty_struct *tty)
return -ENOMEM; return -ENOMEM;
if (idx == PTITTY_MINOR_START) if (idx == PTITTY_MINOR_START)
pti_tty_data->mc = pti_request_masterchannel(0); pti_tty_data->mc = pti_request_masterchannel(0, NULL);
else else
pti_tty_data->mc = pti_request_masterchannel(2); pti_tty_data->mc = pti_request_masterchannel(2, NULL);
if (pti_tty_data->mc == NULL) { if (pti_tty_data->mc == NULL) {
kfree(pti_tty_data); kfree(pti_tty_data);
...@@ -563,7 +584,7 @@ static int pti_char_open(struct inode *inode, struct file *filp) ...@@ -563,7 +584,7 @@ static int pti_char_open(struct inode *inode, struct file *filp)
* before assigning the value to filp->private_data. * before assigning the value to filp->private_data.
* Slightly easier to debug if this driver needs debugging. * Slightly easier to debug if this driver needs debugging.
*/ */
mc = pti_request_masterchannel(0); mc = pti_request_masterchannel(0, NULL);
if (mc == NULL) if (mc == NULL)
return -ENOMEM; return -ENOMEM;
filp->private_data = mc; filp->private_data = mc;
......
...@@ -2864,24 +2864,6 @@ enum parport_pc_pci_cards { ...@@ -2864,24 +2864,6 @@ enum parport_pc_pci_cards {
lava_parallel_dual_b, lava_parallel_dual_b,
boca_ioppar, boca_ioppar,
plx_9050, plx_9050,
timedia_4078a,
timedia_4079h,
timedia_4085h,
timedia_4088a,
timedia_4089a,
timedia_4095a,
timedia_4096a,
timedia_4078u,
timedia_4079a,
timedia_4085u,
timedia_4079r,
timedia_4079s,
timedia_4079d,
timedia_4079e,
timedia_4079f,
timedia_9079a,
timedia_9079b,
timedia_9079c,
timedia_4006a, timedia_4006a,
timedia_4014, timedia_4014,
timedia_4008a, timedia_4008a,
...@@ -2940,24 +2922,6 @@ static struct parport_pc_pci { ...@@ -2940,24 +2922,6 @@ static struct parport_pc_pci {
/* lava_parallel_dual_b */ { 1, { { 0, -1 }, } }, /* lava_parallel_dual_b */ { 1, { { 0, -1 }, } },
/* boca_ioppar */ { 1, { { 0, -1 }, } }, /* boca_ioppar */ { 1, { { 0, -1 }, } },
/* plx_9050 */ { 2, { { 4, -1 }, { 5, -1 }, } }, /* plx_9050 */ { 2, { { 4, -1 }, { 5, -1 }, } },
/* timedia_4078a */ { 1, { { 2, -1 }, } },
/* timedia_4079h */ { 1, { { 2, 3 }, } },
/* timedia_4085h */ { 2, { { 2, -1 }, { 4, -1 }, } },
/* timedia_4088a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4089a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4095a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4096a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4078u */ { 1, { { 2, -1 }, } },
/* timedia_4079a */ { 1, { { 2, 3 }, } },
/* timedia_4085u */ { 2, { { 2, -1 }, { 4, -1 }, } },
/* timedia_4079r */ { 1, { { 2, 3 }, } },
/* timedia_4079s */ { 1, { { 2, 3 }, } },
/* timedia_4079d */ { 1, { { 2, 3 }, } },
/* timedia_4079e */ { 1, { { 2, 3 }, } },
/* timedia_4079f */ { 1, { { 2, 3 }, } },
/* timedia_9079a */ { 1, { { 2, 3 }, } },
/* timedia_9079b */ { 1, { { 2, 3 }, } },
/* timedia_9079c */ { 1, { { 2, 3 }, } },
/* timedia_4006a */ { 1, { { 0, -1 }, } }, /* timedia_4006a */ { 1, { { 0, -1 }, } },
/* timedia_4014 */ { 2, { { 0, -1 }, { 2, -1 }, } }, /* timedia_4014 */ { 2, { { 0, -1 }, { 2, -1 }, } },
/* timedia_4008a */ { 1, { { 0, 1 }, } }, /* timedia_4008a */ { 1, { { 0, 1 }, } },
...@@ -3019,24 +2983,6 @@ static const struct pci_device_id parport_pc_pci_tbl[] = { ...@@ -3019,24 +2983,6 @@ static const struct pci_device_id parport_pc_pci_tbl[] = {
{ PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, { PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
PCI_SUBVENDOR_ID_EXSYS, PCI_SUBDEVICE_ID_EXSYS_4014, 0, 0, plx_9050 }, PCI_SUBVENDOR_ID_EXSYS, PCI_SUBDEVICE_ID_EXSYS_4014, 0, 0, plx_9050 },
/* PCI_VENDOR_ID_TIMEDIA/SUNIX has many differing cards ...*/ /* PCI_VENDOR_ID_TIMEDIA/SUNIX has many differing cards ...*/
{ 0x1409, 0x7168, 0x1409, 0x4078, 0, 0, timedia_4078a },
{ 0x1409, 0x7168, 0x1409, 0x4079, 0, 0, timedia_4079h },
{ 0x1409, 0x7168, 0x1409, 0x4085, 0, 0, timedia_4085h },
{ 0x1409, 0x7168, 0x1409, 0x4088, 0, 0, timedia_4088a },
{ 0x1409, 0x7168, 0x1409, 0x4089, 0, 0, timedia_4089a },
{ 0x1409, 0x7168, 0x1409, 0x4095, 0, 0, timedia_4095a },
{ 0x1409, 0x7168, 0x1409, 0x4096, 0, 0, timedia_4096a },
{ 0x1409, 0x7168, 0x1409, 0x5078, 0, 0, timedia_4078u },
{ 0x1409, 0x7168, 0x1409, 0x5079, 0, 0, timedia_4079a },
{ 0x1409, 0x7168, 0x1409, 0x5085, 0, 0, timedia_4085u },
{ 0x1409, 0x7168, 0x1409, 0x6079, 0, 0, timedia_4079r },
{ 0x1409, 0x7168, 0x1409, 0x7079, 0, 0, timedia_4079s },
{ 0x1409, 0x7168, 0x1409, 0x8079, 0, 0, timedia_4079d },
{ 0x1409, 0x7168, 0x1409, 0x9079, 0, 0, timedia_4079e },
{ 0x1409, 0x7168, 0x1409, 0xa079, 0, 0, timedia_4079f },
{ 0x1409, 0x7168, 0x1409, 0xb079, 0, 0, timedia_9079a },
{ 0x1409, 0x7168, 0x1409, 0xc079, 0, 0, timedia_9079b },
{ 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c },
{ 0x1409, 0x7268, 0x1409, 0x0101, 0, 0, timedia_4006a }, { 0x1409, 0x7268, 0x1409, 0x0101, 0, 0, timedia_4006a },
{ 0x1409, 0x7268, 0x1409, 0x0102, 0, 0, timedia_4014 }, { 0x1409, 0x7268, 0x1409, 0x0102, 0, 0, timedia_4014 },
{ 0x1409, 0x7268, 0x1409, 0x0103, 0, 0, timedia_4008a }, { 0x1409, 0x7268, 0x1409, 0x0103, 0, 0, timedia_4008a },
......
...@@ -33,6 +33,9 @@ enum parport_pc_pci_cards { ...@@ -33,6 +33,9 @@ enum parport_pc_pci_cards {
netmos_9xx5_combo, netmos_9xx5_combo,
netmos_9855, netmos_9855,
netmos_9855_2p, netmos_9855_2p,
netmos_9900,
netmos_9900_2p,
netmos_99xx_1p,
avlab_1s1p, avlab_1s1p,
avlab_1s2p, avlab_1s2p,
avlab_2s1p, avlab_2s1p,
...@@ -41,6 +44,24 @@ enum parport_pc_pci_cards { ...@@ -41,6 +44,24 @@ enum parport_pc_pci_cards {
siig_2p1s_20x, siig_2p1s_20x,
siig_1s1p_20x, siig_1s1p_20x,
siig_2s1p_20x, siig_2s1p_20x,
timedia_4078a,
timedia_4079h,
timedia_4085h,
timedia_4088a,
timedia_4089a,
timedia_4095a,
timedia_4096a,
timedia_4078u,
timedia_4079a,
timedia_4085u,
timedia_4079r,
timedia_4079s,
timedia_4079d,
timedia_4079e,
timedia_4079f,
timedia_9079a,
timedia_9079b,
timedia_9079c,
}; };
/* each element directly indexed from enum list, above */ /* each element directly indexed from enum list, above */
...@@ -72,22 +93,20 @@ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc ...@@ -72,22 +93,20 @@ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc
dev->subsystem_vendor == PCI_VENDOR_ID_IBM && dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
dev->subsystem_device == 0x0299) dev->subsystem_device == 0x0299)
return -ENODEV; return -ENODEV;
/*
* Netmos uses the subdevice ID to indicate the number of parallel if (dev->device == PCI_DEVICE_ID_NETMOS_9912) {
* and serial ports. The form is 0x00PS, where <P> is the number of par->numports = 1;
* parallel ports and <S> is the number of serial ports. } else {
*/ /*
par->numports = (dev->subsystem_device & 0xf0) >> 4; * Netmos uses the subdevice ID to indicate the number of parallel
if (par->numports > ARRAY_SIZE(par->addr)) * and serial ports. The form is 0x00PS, where <P> is the number of
par->numports = ARRAY_SIZE(par->addr); * parallel ports and <S> is the number of serial ports.
/* */
* This function is currently only called for cards with up to par->numports = (dev->subsystem_device & 0xf0) >> 4;
* one parallel port. if (par->numports > ARRAY_SIZE(par->addr))
* Parallel port BAR is either before or after serial ports BARS; par->numports = ARRAY_SIZE(par->addr);
* hence, lo should be either 0 or equal to the number of serial ports. }
*/
if (par->addr[0].lo != 0)
par->addr[0].lo = dev->subsystem_device & 0xf;
return 0; return 0;
} }
...@@ -97,6 +116,9 @@ static struct parport_pc_pci cards[] __devinitdata = { ...@@ -97,6 +116,9 @@ static struct parport_pc_pci cards[] __devinitdata = {
/* netmos_9xx5_combo */ { 1, { { 2, -1 }, }, netmos_parallel_init }, /* netmos_9xx5_combo */ { 1, { { 2, -1 }, }, netmos_parallel_init },
/* netmos_9855 */ { 1, { { 0, -1 }, }, netmos_parallel_init }, /* netmos_9855 */ { 1, { { 0, -1 }, }, netmos_parallel_init },
/* netmos_9855_2p */ { 2, { { 0, -1 }, { 2, -1 }, } }, /* netmos_9855_2p */ { 2, { { 0, -1 }, { 2, -1 }, } },
/* netmos_9900 */ {1, { { 3, 4 }, }, netmos_parallel_init },
/* netmos_9900_2p */ {2, { { 0, 1 }, { 3, 4 }, } },
/* netmos_99xx_1p */ {1, { { 0, 1 }, } },
/* avlab_1s1p */ { 1, { { 1, 2}, } }, /* avlab_1s1p */ { 1, { { 1, 2}, } },
/* avlab_1s2p */ { 2, { { 1, 2}, { 3, 4 },} }, /* avlab_1s2p */ { 2, { { 1, 2}, { 3, 4 },} },
/* avlab_2s1p */ { 1, { { 2, 3}, } }, /* avlab_2s1p */ { 1, { { 2, 3}, } },
...@@ -105,6 +127,24 @@ static struct parport_pc_pci cards[] __devinitdata = { ...@@ -105,6 +127,24 @@ static struct parport_pc_pci cards[] __devinitdata = {
/* siig_2p1s_20x */ { 2, { { 1, 2 }, { 3, 4 }, } }, /* siig_2p1s_20x */ { 2, { { 1, 2 }, { 3, 4 }, } },
/* siig_1s1p_20x */ { 1, { { 1, 2 }, } }, /* siig_1s1p_20x */ { 1, { { 1, 2 }, } },
/* siig_2s1p_20x */ { 1, { { 2, 3 }, } }, /* siig_2s1p_20x */ { 1, { { 2, 3 }, } },
/* timedia_4078a */ { 1, { { 2, -1 }, } },
/* timedia_4079h */ { 1, { { 2, 3 }, } },
/* timedia_4085h */ { 2, { { 2, -1 }, { 4, -1 }, } },
/* timedia_4088a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4089a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4095a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4096a */ { 2, { { 2, 3 }, { 4, 5 }, } },
/* timedia_4078u */ { 1, { { 2, -1 }, } },
/* timedia_4079a */ { 1, { { 2, 3 }, } },
/* timedia_4085u */ { 2, { { 2, -1 }, { 4, -1 }, } },
/* timedia_4079r */ { 1, { { 2, 3 }, } },
/* timedia_4079s */ { 1, { { 2, 3 }, } },
/* timedia_4079d */ { 1, { { 2, 3 }, } },
/* timedia_4079e */ { 1, { { 2, 3 }, } },
/* timedia_4079f */ { 1, { { 2, 3 }, } },
/* timedia_9079a */ { 1, { { 2, 3 }, } },
/* timedia_9079b */ { 1, { { 2, 3 }, } },
/* timedia_9079c */ { 1, { { 2, 3 }, } },
}; };
static struct pci_device_id parport_serial_pci_tbl[] = { static struct pci_device_id parport_serial_pci_tbl[] = {
...@@ -127,6 +167,14 @@ static struct pci_device_id parport_serial_pci_tbl[] = { ...@@ -127,6 +167,14 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
0x1000, 0x0022, 0, 0, netmos_9855_2p }, 0x1000, 0x0022, 0, 0, netmos_9855_2p },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855, { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9855 }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9855 },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
0xA000, 0x3011, 0, 0, netmos_9900 },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
0xA000, 0x3012, 0, 0, netmos_9900 },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
0xA000, 0x3020, 0, 0, netmos_9900_2p },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912,
0xA000, 0x2000, 0, 0, netmos_99xx_1p },
/* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/ /* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/
{ PCI_VENDOR_ID_AFAVLAB, 0x2110, { PCI_VENDOR_ID_AFAVLAB, 0x2110,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, avlab_1s1p },
...@@ -176,6 +224,25 @@ static struct pci_device_id parport_serial_pci_tbl[] = { ...@@ -176,6 +224,25 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
{ PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850, { PCI_VENDOR_ID_SIIG, PCI_DEVICE_ID_SIIG_2S1P_20x_850,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, siig_2s1p_20x },
/* PCI_VENDOR_ID_TIMEDIA/SUNIX has many differing cards ...*/
{ 0x1409, 0x7168, 0x1409, 0x4078, 0, 0, timedia_4078a },
{ 0x1409, 0x7168, 0x1409, 0x4079, 0, 0, timedia_4079h },
{ 0x1409, 0x7168, 0x1409, 0x4085, 0, 0, timedia_4085h },
{ 0x1409, 0x7168, 0x1409, 0x4088, 0, 0, timedia_4088a },
{ 0x1409, 0x7168, 0x1409, 0x4089, 0, 0, timedia_4089a },
{ 0x1409, 0x7168, 0x1409, 0x4095, 0, 0, timedia_4095a },
{ 0x1409, 0x7168, 0x1409, 0x4096, 0, 0, timedia_4096a },
{ 0x1409, 0x7168, 0x1409, 0x5078, 0, 0, timedia_4078u },
{ 0x1409, 0x7168, 0x1409, 0x5079, 0, 0, timedia_4079a },
{ 0x1409, 0x7168, 0x1409, 0x5085, 0, 0, timedia_4085u },
{ 0x1409, 0x7168, 0x1409, 0x6079, 0, 0, timedia_4079r },
{ 0x1409, 0x7168, 0x1409, 0x7079, 0, 0, timedia_4079s },
{ 0x1409, 0x7168, 0x1409, 0x8079, 0, 0, timedia_4079d },
{ 0x1409, 0x7168, 0x1409, 0x9079, 0, 0, timedia_4079e },
{ 0x1409, 0x7168, 0x1409, 0xa079, 0, 0, timedia_4079f },
{ 0x1409, 0x7168, 0x1409, 0xb079, 0, 0, timedia_9079a },
{ 0x1409, 0x7168, 0x1409, 0xc079, 0, 0, timedia_9079b },
{ 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c },
{ 0, } /* terminate list */ { 0, } /* terminate list */
}; };
...@@ -219,6 +286,24 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = { ...@@ -219,6 +286,24 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = {
.base_baud = 115200, .base_baud = 115200,
.uart_offset = 8, .uart_offset = 8,
}, },
[netmos_9900] = { /* n/t */
.flags = FL_BASE0 | FL_BASE_BARS,
.num_ports = 1,
.base_baud = 115200,
.uart_offset = 8,
},
[netmos_9900_2p] = { /* parallel only */ /* n/t */
.flags = FL_BASE0,
.num_ports = 0,
.base_baud = 115200,
.uart_offset = 8,
},
[netmos_99xx_1p] = { /* parallel only */ /* n/t */
.flags = FL_BASE0,
.num_ports = 0,
.base_baud = 115200,
.uart_offset = 8,
},
[avlab_1s1p] = { /* n/t */ [avlab_1s1p] = { /* n/t */
.flags = FL_BASE0 | FL_BASE_BARS, .flags = FL_BASE0 | FL_BASE_BARS,
.num_ports = 1, .num_ports = 1,
...@@ -267,6 +352,114 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = { ...@@ -267,6 +352,114 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = {
.base_baud = 921600, .base_baud = 921600,
.uart_offset = 8, .uart_offset = 8,
}, },
[timedia_4078a] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4079h] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4085h] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4088a] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4089a] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4095a] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4096a] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4078u] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4079a] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4085u] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4079r] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4079s] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4079d] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4079e] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_4079f] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_9079a] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_9079b] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
[timedia_9079c] = {
.flags = FL_BASE0|FL_BASE_BARS,
.num_ports = 1,
.base_baud = 921600,
.uart_offset = 8,
},
}; };
struct parport_serial_private { struct parport_serial_private {
...@@ -285,6 +478,10 @@ static int __devinit serial_register (struct pci_dev *dev, ...@@ -285,6 +478,10 @@ static int __devinit serial_register (struct pci_dev *dev,
struct serial_private *serial; struct serial_private *serial;
board = &pci_parport_serial_boards[id->driver_data]; board = &pci_parport_serial_boards[id->driver_data];
if (board->num_ports == 0)
return 0;
serial = pciserial_init_ports(dev, board); serial = pciserial_init_ports(dev, board);
if (IS_ERR(serial)) if (IS_ERR(serial))
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/ratelimit.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -242,8 +243,8 @@ static void moxa_wait_finish(void __iomem *ofsAddr) ...@@ -242,8 +243,8 @@ static void moxa_wait_finish(void __iomem *ofsAddr)
while (readw(ofsAddr + FuncCode) != 0) while (readw(ofsAddr + FuncCode) != 0)
if (time_after(jiffies, end)) if (time_after(jiffies, end))
return; return;
if (readw(ofsAddr + FuncCode) != 0 && printk_ratelimit()) if (readw(ofsAddr + FuncCode) != 0)
printk(KERN_WARNING "moxa function expired\n"); printk_ratelimited(KERN_WARNING "moxa function expired\n");
} }
static void moxafunc(void __iomem *ofsAddr, u16 cmd, u16 arg) static void moxafunc(void __iomem *ofsAddr, u16 cmd, u16 arg)
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/ratelimit.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -1490,8 +1491,7 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) ...@@ -1490,8 +1491,7 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
switch (cmd) { switch (cmd) {
case MOXA_GET_MAJOR: case MOXA_GET_MAJOR:
if (printk_ratelimit()) printk_ratelimited(KERN_WARNING "mxser: '%s' uses deprecated ioctl "
printk(KERN_WARNING "mxser: '%s' uses deprecated ioctl "
"%x (GET_MAJOR), fix your userspace\n", "%x (GET_MAJOR), fix your userspace\n",
current->comm, cmd); current->comm, cmd);
return put_user(ttymajor, (int __user *)argp); return put_user(ttymajor, (int __user *)argp);
......
This diff is collapsed.
...@@ -185,7 +185,6 @@ static void reset_buffer_flags(struct tty_struct *tty) ...@@ -185,7 +185,6 @@ static void reset_buffer_flags(struct tty_struct *tty)
tty->canon_head = tty->canon_data = tty->erasing = 0; tty->canon_head = tty->canon_data = tty->erasing = 0;
memset(&tty->read_flags, 0, sizeof tty->read_flags); memset(&tty->read_flags, 0, sizeof tty->read_flags);
n_tty_set_room(tty); n_tty_set_room(tty);
check_unthrottle(tty);
} }
/** /**
...@@ -1587,6 +1586,7 @@ static int n_tty_open(struct tty_struct *tty) ...@@ -1587,6 +1586,7 @@ static int n_tty_open(struct tty_struct *tty)
return -ENOMEM; return -ENOMEM;
} }
reset_buffer_flags(tty); reset_buffer_flags(tty);
tty_unthrottle(tty);
tty->column = 0; tty->column = 0;
n_tty_set_termios(tty, NULL); n_tty_set_termios(tty, NULL);
tty->minimum_to_wake = 1; tty->minimum_to_wake = 1;
......
...@@ -81,7 +81,7 @@ static unsigned int skip_txen_test; /* force skip of txen test at init time */ ...@@ -81,7 +81,7 @@ static unsigned int skip_txen_test; /* force skip of txen test at init time */
#define DEBUG_INTR(fmt...) do { } while (0) #define DEBUG_INTR(fmt...) do { } while (0)
#endif #endif
#define PASS_LIMIT 256 #define PASS_LIMIT 512
#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
...@@ -1107,7 +1107,7 @@ static void autoconfig_16550a(struct uart_8250_port *up) ...@@ -1107,7 +1107,7 @@ static void autoconfig_16550a(struct uart_8250_port *up)
*/ */
DEBUG_AUTOCONF("Xscale "); DEBUG_AUTOCONF("Xscale ");
up->port.type = PORT_XSCALE; up->port.type = PORT_XSCALE;
up->capabilities |= UART_CAP_UUE; up->capabilities |= UART_CAP_UUE | UART_CAP_RTOIE;
return; return;
} }
} else { } else {
......
...@@ -39,6 +39,7 @@ struct pci_serial_quirk { ...@@ -39,6 +39,7 @@ struct pci_serial_quirk {
u32 device; u32 device;
u32 subvendor; u32 subvendor;
u32 subdevice; u32 subdevice;
int (*probe)(struct pci_dev *dev);
int (*init)(struct pci_dev *dev); int (*init)(struct pci_dev *dev);
int (*setup)(struct serial_private *, int (*setup)(struct serial_private *,
const struct pciserial_board *, const struct pciserial_board *,
...@@ -56,6 +57,9 @@ struct serial_private { ...@@ -56,6 +57,9 @@ struct serial_private {
int line[0]; int line[0];
}; };
static int pci_default_setup(struct serial_private*,
const struct pciserial_board*, struct uart_port*, int);
static void moan_device(const char *str, struct pci_dev *dev) static void moan_device(const char *str, struct pci_dev *dev)
{ {
printk(KERN_WARNING printk(KERN_WARNING
...@@ -571,6 +575,28 @@ static const struct timedia_struct { ...@@ -571,6 +575,28 @@ static const struct timedia_struct {
{ 8, timedia_eight_port } { 8, timedia_eight_port }
}; };
/*
* There are nearly 70 different Timedia/SUNIX PCI serial devices. Instead of
* listing them individually, this driver merely grabs them all with
* PCI_ANY_ID. Some of these devices, however, also feature a parallel port,
* and should be left free to be claimed by parport_serial instead.
*/
static int pci_timedia_probe(struct pci_dev *dev)
{
/*
* Check the third digit of the subdevice ID
* (0,2,3,5,6: serial only -- 7,8,9: serial + parallel)
*/
if ((dev->subsystem_device & 0x00f0) >= 0x70) {
dev_info(&dev->dev,
"ignoring Timedia subdevice %04x for parport_serial\n",
dev->subsystem_device);
return -ENODEV;
}
return 0;
}
static int pci_timedia_init(struct pci_dev *dev) static int pci_timedia_init(struct pci_dev *dev)
{ {
const unsigned short *ids; const unsigned short *ids;
...@@ -752,6 +778,62 @@ pci_ni8430_setup(struct serial_private *priv, ...@@ -752,6 +778,62 @@ pci_ni8430_setup(struct serial_private *priv,
return setup_port(priv, port, bar, offset, board->reg_shift); return setup_port(priv, port, bar, offset, board->reg_shift);
} }
static int pci_netmos_9900_setup(struct serial_private *priv,
const struct pciserial_board *board,
struct uart_port *port, int idx)
{
unsigned int bar;
if ((priv->dev->subsystem_device & 0xff00) == 0x3000) {
/* netmos apparently orders BARs by datasheet layout, so serial
* ports get BARs 0 and 3 (or 1 and 4 for memmapped)
*/
bar = 3 * idx;
return setup_port(priv, port, bar, 0, board->reg_shift);
} else {
return pci_default_setup(priv, board, port, idx);
}
}
/* the 99xx series comes with a range of device IDs and a variety
* of capabilities:
*
* 9900 has varying capabilities and can cascade to sub-controllers
* (cascading should be purely internal)
* 9904 is hardwired with 4 serial ports
* 9912 and 9922 are hardwired with 2 serial ports
*/
static int pci_netmos_9900_numports(struct pci_dev *dev)
{
unsigned int c = dev->class;
unsigned int pi;
unsigned short sub_serports;
pi = (c & 0xff);
if (pi == 2) {
return 1;
} else if ((pi == 0) &&
(dev->device == PCI_DEVICE_ID_NETMOS_9900)) {
/* two possibilities: 0x30ps encodes number of parallel and
* serial ports, or 0x1000 indicates *something*. This is not
* immediately obvious, since the 2s1p+4s configuration seems
* to offer all functionality on functions 0..2, while still
* advertising the same function 3 as the 4s+2s1p config.
*/
sub_serports = dev->subsystem_device & 0xf;
if (sub_serports > 0) {
return sub_serports;
} else {
printk(KERN_NOTICE "NetMos/Mostech serial driver ignoring port on ambiguous config.\n");
return 0;
}
}
moan_device("unknown NetMos/Mostech program interface", dev);
return 0;
}
static int pci_netmos_init(struct pci_dev *dev) static int pci_netmos_init(struct pci_dev *dev)
{ {
...@@ -761,12 +843,28 @@ static int pci_netmos_init(struct pci_dev *dev) ...@@ -761,12 +843,28 @@ static int pci_netmos_init(struct pci_dev *dev)
if ((dev->device == PCI_DEVICE_ID_NETMOS_9901) || if ((dev->device == PCI_DEVICE_ID_NETMOS_9901) ||
(dev->device == PCI_DEVICE_ID_NETMOS_9865)) (dev->device == PCI_DEVICE_ID_NETMOS_9865))
return 0; return 0;
if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM && if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
dev->subsystem_device == 0x0299) dev->subsystem_device == 0x0299)
return 0; return 0;
switch (dev->device) { /* FALLTHROUGH on all */
case PCI_DEVICE_ID_NETMOS_9904:
case PCI_DEVICE_ID_NETMOS_9912:
case PCI_DEVICE_ID_NETMOS_9922:
case PCI_DEVICE_ID_NETMOS_9900:
num_serial = pci_netmos_9900_numports(dev);
break;
default:
if (num_serial == 0 ) {
moan_device("unknown NetMos/Mostech device", dev);
}
}
if (num_serial == 0) if (num_serial == 0)
return -ENODEV; return -ENODEV;
return num_serial; return num_serial;
} }
...@@ -1396,6 +1494,7 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { ...@@ -1396,6 +1494,7 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
.device = PCI_DEVICE_ID_TIMEDIA_1889, .device = PCI_DEVICE_ID_TIMEDIA_1889,
.subvendor = PCI_VENDOR_ID_TIMEDIA, .subvendor = PCI_VENDOR_ID_TIMEDIA,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
.probe = pci_timedia_probe,
.init = pci_timedia_init, .init = pci_timedia_init,
.setup = pci_timedia_setup, .setup = pci_timedia_setup,
}, },
...@@ -1426,7 +1525,7 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { ...@@ -1426,7 +1525,7 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
.subvendor = PCI_ANY_ID, .subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
.init = pci_netmos_init, .init = pci_netmos_init,
.setup = pci_default_setup, .setup = pci_netmos_9900_setup,
}, },
/* /*
* For Oxford Semiconductor Tornado based devices * For Oxford Semiconductor Tornado based devices
...@@ -1703,6 +1802,7 @@ enum pci_board_num_t { ...@@ -1703,6 +1802,7 @@ enum pci_board_num_t {
pbn_ADDIDATA_PCIe_8_3906250, pbn_ADDIDATA_PCIe_8_3906250,
pbn_ce4100_1_115200, pbn_ce4100_1_115200,
pbn_omegapci, pbn_omegapci,
pbn_NETMOS9900_2s_115200,
}; };
/* /*
...@@ -2404,6 +2504,11 @@ static struct pciserial_board pci_boards[] __devinitdata = { ...@@ -2404,6 +2504,11 @@ static struct pciserial_board pci_boards[] __devinitdata = {
.base_baud = 115200, .base_baud = 115200,
.uart_offset = 0x200, .uart_offset = 0x200,
}, },
[pbn_NETMOS9900_2s_115200] = {
.flags = FL_BASE0,
.num_ports = 2,
.base_baud = 115200,
},
}; };
static const struct pci_device_id softmodem_blacklist[] = { static const struct pci_device_id softmodem_blacklist[] = {
...@@ -2640,11 +2745,19 @@ EXPORT_SYMBOL_GPL(pciserial_resume_ports); ...@@ -2640,11 +2745,19 @@ EXPORT_SYMBOL_GPL(pciserial_resume_ports);
static int __devinit static int __devinit
pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
{ {
struct pci_serial_quirk *quirk;
struct serial_private *priv; struct serial_private *priv;
const struct pciserial_board *board; const struct pciserial_board *board;
struct pciserial_board tmp; struct pciserial_board tmp;
int rc; int rc;
quirk = find_quirk(dev);
if (quirk->probe) {
rc = quirk->probe(dev);
if (rc)
return rc;
}
if (ent->driver_data >= ARRAY_SIZE(pci_boards)) { if (ent->driver_data >= ARRAY_SIZE(pci_boards)) {
printk(KERN_ERR "pci_init_one: invalid driver_data: %ld\n", printk(KERN_ERR "pci_init_one: invalid driver_data: %ld\n",
ent->driver_data); ent->driver_data);
...@@ -2654,6 +2767,7 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent) ...@@ -2654,6 +2767,7 @@ pciserial_init_one(struct pci_dev *dev, const struct pci_device_id *ent)
board = &pci_boards[ent->driver_data]; board = &pci_boards[ent->driver_data];
rc = pci_enable_device(dev); rc = pci_enable_device(dev);
pci_save_state(dev);
if (rc) if (rc)
return rc; return rc;
...@@ -3885,6 +3999,27 @@ static struct pci_device_id serial_pci_tbl[] = { ...@@ -3885,6 +3999,27 @@ static struct pci_device_id serial_pci_tbl[] = {
0xA000, 0x1000, 0xA000, 0x1000,
0, 0, pbn_b0_1_115200 }, 0, 0, pbn_b0_1_115200 },
/* the 9901 is a rebranded 9912 */
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9912,
0xA000, 0x1000,
0, 0, pbn_b0_1_115200 },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
0xA000, 0x1000,
0, 0, pbn_b0_1_115200 },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9904,
0xA000, 0x1000,
0, 0, pbn_b0_1_115200 },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
0xA000, 0x1000,
0, 0, pbn_b0_1_115200 },
{ PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
0xA000, 0x3002,
0, 0, pbn_NETMOS9900_2s_115200 },
/* /*
* Best Connectivity PCI Multi I/O cards * Best Connectivity PCI Multi I/O cards
*/ */
...@@ -3927,6 +4062,51 @@ static struct pci_device_id serial_pci_tbl[] = { ...@@ -3927,6 +4062,51 @@ static struct pci_device_id serial_pci_tbl[] = {
{ 0, } { 0, }
}; };
static pci_ers_result_t serial8250_io_error_detected(struct pci_dev *dev,
pci_channel_state_t state)
{
struct serial_private *priv = pci_get_drvdata(dev);
if (state == pci_channel_io_perm_failure)
return PCI_ERS_RESULT_DISCONNECT;
if (priv)
pciserial_suspend_ports(priv);
pci_disable_device(dev);
return PCI_ERS_RESULT_NEED_RESET;
}
static pci_ers_result_t serial8250_io_slot_reset(struct pci_dev *dev)
{
int rc;
rc = pci_enable_device(dev);
if (rc)
return PCI_ERS_RESULT_DISCONNECT;
pci_restore_state(dev);
pci_save_state(dev);
return PCI_ERS_RESULT_RECOVERED;
}
static void serial8250_io_resume(struct pci_dev *dev)
{
struct serial_private *priv = pci_get_drvdata(dev);
if (priv)
pciserial_resume_ports(priv);
}
static struct pci_error_handlers serial8250_err_handler = {
.error_detected = serial8250_io_error_detected,
.slot_reset = serial8250_io_slot_reset,
.resume = serial8250_io_resume,
};
static struct pci_driver serial_pci_driver = { static struct pci_driver serial_pci_driver = {
.name = "serial", .name = "serial",
.probe = pciserial_init_one, .probe = pciserial_init_one,
...@@ -3936,6 +4116,7 @@ static struct pci_driver serial_pci_driver = { ...@@ -3936,6 +4116,7 @@ static struct pci_driver serial_pci_driver = {
.resume = pciserial_resume_one, .resume = pciserial_resume_one,
#endif #endif
.id_table = serial_pci_tbl, .id_table = serial_pci_tbl,
.err_handler = &serial8250_err_handler,
}; };
static int __init serial8250_pci_init(void) static int __init serial8250_pci_init(void)
......
...@@ -1404,7 +1404,7 @@ config SERIAL_SC26XX ...@@ -1404,7 +1404,7 @@ config SERIAL_SC26XX
config SERIAL_SC26XX_CONSOLE config SERIAL_SC26XX_CONSOLE
bool "Console on SC2681/SC2692 serial port" bool "Console on SC2681/SC2692 serial port"
depends on SERIAL_SC26XX depends on SERIAL_SC26XX=y
select SERIAL_CORE_CONSOLE select SERIAL_CORE_CONSOLE
help help
Support for Console on SC2681/SC2692 serial ports. Support for Console on SC2681/SC2692 serial ports.
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
*along with this program; if not, write to the Free Software *along with this program; if not, write to the Free Software
*Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. *Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include <linux/kernel.h>
#include <linux/serial_reg.h> #include <linux/serial_reg.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -44,6 +45,7 @@ enum { ...@@ -44,6 +45,7 @@ enum {
/* Set the max number of UART port /* Set the max number of UART port
* Intel EG20T PCH: 4 port * Intel EG20T PCH: 4 port
* OKI SEMICONDUCTOR ML7213 IOH: 3 port * OKI SEMICONDUCTOR ML7213 IOH: 3 port
* OKI SEMICONDUCTOR ML7223 IOH: 2 port
*/ */
#define PCH_UART_NR 4 #define PCH_UART_NR 4
...@@ -137,8 +139,6 @@ enum { ...@@ -137,8 +139,6 @@ enum {
#define PCH_UART_DLL 0x00 #define PCH_UART_DLL 0x00
#define PCH_UART_DLM 0x01 #define PCH_UART_DLM 0x01
#define DIV_ROUND(a, b) (((a) + ((b)/2)) / (b))
#define PCH_UART_IID_RLS (PCH_UART_IIR_REI) #define PCH_UART_IID_RLS (PCH_UART_IIR_REI)
#define PCH_UART_IID_RDR (PCH_UART_IIR_RRI) #define PCH_UART_IID_RDR (PCH_UART_IIR_RRI)
#define PCH_UART_IID_RDR_TO (PCH_UART_IIR_RRI | PCH_UART_IIR_TOI) #define PCH_UART_IID_RDR_TO (PCH_UART_IIR_RRI | PCH_UART_IIR_TOI)
...@@ -316,7 +316,7 @@ static int pch_uart_hal_set_line(struct eg20t_port *priv, int baud, ...@@ -316,7 +316,7 @@ static int pch_uart_hal_set_line(struct eg20t_port *priv, int baud,
unsigned int dll, dlm, lcr; unsigned int dll, dlm, lcr;
int div; int div;
div = DIV_ROUND(priv->base_baud / 16, baud); div = DIV_ROUND_CLOSEST(priv->base_baud / 16, baud);
if (div < 0 || USHRT_MAX <= div) { if (div < 0 || USHRT_MAX <= div) {
dev_err(priv->port.dev, "Invalid Baud(div=0x%x)\n", div); dev_err(priv->port.dev, "Invalid Baud(div=0x%x)\n", div);
return -EINVAL; return -EINVAL;
...@@ -1429,6 +1429,8 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev, ...@@ -1429,6 +1429,8 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev,
goto init_port_hal_free; goto init_port_hal_free;
} }
pci_enable_msi(pdev);
iobase = pci_resource_start(pdev, 0); iobase = pci_resource_start(pdev, 0);
mapbase = pci_resource_start(pdev, 1); mapbase = pci_resource_start(pdev, 1);
priv->mapbase = mapbase; priv->mapbase = mapbase;
...@@ -1485,6 +1487,8 @@ static void pch_uart_pci_remove(struct pci_dev *pdev) ...@@ -1485,6 +1487,8 @@ static void pch_uart_pci_remove(struct pci_dev *pdev)
struct eg20t_port *priv; struct eg20t_port *priv;
priv = (struct eg20t_port *)pci_get_drvdata(pdev); priv = (struct eg20t_port *)pci_get_drvdata(pdev);
pci_disable_msi(pdev);
pch_uart_exit_port(priv); pch_uart_exit_port(priv);
pci_disable_device(pdev); pci_disable_device(pdev);
kfree(priv); kfree(priv);
...@@ -1568,6 +1572,7 @@ static int __devinit pch_uart_pci_probe(struct pci_dev *pdev, ...@@ -1568,6 +1572,7 @@ static int __devinit pch_uart_pci_probe(struct pci_dev *pdev,
return ret; return ret;
probe_disable_device: probe_disable_device:
pci_disable_msi(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
probe_error: probe_error:
return ret; return ret;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/serial.h> #include <linux/serial.h>
#include <linux/delay.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <mach/hardware.h> #include <mach/hardware.h>
...@@ -83,6 +84,9 @@ static int s5pv210_serial_resetport(struct uart_port *port, ...@@ -83,6 +84,9 @@ static int s5pv210_serial_resetport(struct uart_port *port,
wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH); wr_regl(port, S3C2410_UFCON, cfg->ufcon | S3C2410_UFCON_RESETBOTH);
wr_regl(port, S3C2410_UFCON, cfg->ufcon); wr_regl(port, S3C2410_UFCON, cfg->ufcon);
/* It is need to delay When reset FIFO register */
udelay(1);
return 0; return 0;
} }
......
...@@ -1194,12 +1194,10 @@ int __devexit s3c24xx_serial_remove(struct platform_device *dev) ...@@ -1194,12 +1194,10 @@ int __devexit s3c24xx_serial_remove(struct platform_device *dev)
EXPORT_SYMBOL_GPL(s3c24xx_serial_remove); EXPORT_SYMBOL_GPL(s3c24xx_serial_remove);
/* UART power management code */ /* UART power management code */
#ifdef CONFIG_PM_SLEEP
#ifdef CONFIG_PM static int s3c24xx_serial_suspend(struct device *dev)
static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t state)
{ {
struct uart_port *port = s3c24xx_dev_to_port(&dev->dev); struct uart_port *port = s3c24xx_dev_to_port(dev);
if (port) if (port)
uart_suspend_port(&s3c24xx_uart_drv, port); uart_suspend_port(&s3c24xx_uart_drv, port);
...@@ -1207,9 +1205,9 @@ static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t stat ...@@ -1207,9 +1205,9 @@ static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t stat
return 0; return 0;
} }
static int s3c24xx_serial_resume(struct platform_device *dev) static int s3c24xx_serial_resume(struct device *dev)
{ {
struct uart_port *port = s3c24xx_dev_to_port(&dev->dev); struct uart_port *port = s3c24xx_dev_to_port(dev);
struct s3c24xx_uart_port *ourport = to_ourport(port); struct s3c24xx_uart_port *ourport = to_ourport(port);
if (port) { if (port) {
...@@ -1222,17 +1220,20 @@ static int s3c24xx_serial_resume(struct platform_device *dev) ...@@ -1222,17 +1220,20 @@ static int s3c24xx_serial_resume(struct platform_device *dev)
return 0; return 0;
} }
#endif
static const struct dev_pm_ops s3c24xx_serial_pm_ops = {
.suspend = s3c24xx_serial_suspend,
.resume = s3c24xx_serial_resume,
};
#else /* !CONFIG_PM_SLEEP */
#define s3c24xx_serial_pm_ops NULL
#endif /* CONFIG_PM_SLEEP */
int s3c24xx_serial_init(struct platform_driver *drv, int s3c24xx_serial_init(struct platform_driver *drv,
struct s3c24xx_uart_info *info) struct s3c24xx_uart_info *info)
{ {
dbg("s3c24xx_serial_init(%p,%p)\n", drv, info); dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);
drv->driver.pm = &s3c24xx_serial_pm_ops;
#ifdef CONFIG_PM
drv->suspend = s3c24xx_serial_suspend;
drv->resume = s3c24xx_serial_resume;
#endif
return platform_driver_register(drv); return platform_driver_register(drv);
} }
......
...@@ -94,6 +94,7 @@ ...@@ -94,6 +94,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/serial.h> #include <linux/serial.h>
#include <linux/ratelimit.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -1420,8 +1421,7 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx, ...@@ -1420,8 +1421,7 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx,
/* call the tty release_tty routine to clean out this slot */ /* call the tty release_tty routine to clean out this slot */
err_release_tty: err_release_tty:
if (printk_ratelimit()) printk_ratelimited(KERN_INFO "tty_init_dev: ldisc open failed, "
printk(KERN_INFO "tty_init_dev: ldisc open failed, "
"clearing slot %d\n", idx); "clearing slot %d\n", idx);
release_tty(tty, idx); release_tty(tty, idx);
return ERR_PTR(retval); return ERR_PTR(retval);
......
...@@ -21,5 +21,16 @@ struct gsm_config ...@@ -21,5 +21,16 @@ struct gsm_config
#define GSMIOC_GETCONF _IOR('G', 0, struct gsm_config) #define GSMIOC_GETCONF _IOR('G', 0, struct gsm_config)
#define GSMIOC_SETCONF _IOW('G', 1, struct gsm_config) #define GSMIOC_SETCONF _IOW('G', 1, struct gsm_config)
struct gsm_netconfig {
unsigned int adaption; /* Adaption to use in network mode */
unsigned short protocol;/* Protocol to use - only ETH_P_IP supported */
unsigned short unused2;
char if_name[IFNAMSIZ]; /* interface name format string */
__u8 unused[28]; /* For future use */
};
#define GSMIOC_ENABLE_NET _IOW('G', 2, struct gsm_netconfig)
#define GSMIOC_DISABLE_NET _IO('G', 3)
#endif #endif
...@@ -2832,7 +2832,11 @@ ...@@ -2832,7 +2832,11 @@
#define PCI_DEVICE_ID_NETMOS_9845 0x9845 #define PCI_DEVICE_ID_NETMOS_9845 0x9845
#define PCI_DEVICE_ID_NETMOS_9855 0x9855 #define PCI_DEVICE_ID_NETMOS_9855 0x9855
#define PCI_DEVICE_ID_NETMOS_9865 0x9865 #define PCI_DEVICE_ID_NETMOS_9865 0x9865
#define PCI_DEVICE_ID_NETMOS_9900 0x9900
#define PCI_DEVICE_ID_NETMOS_9901 0x9901 #define PCI_DEVICE_ID_NETMOS_9901 0x9901
#define PCI_DEVICE_ID_NETMOS_9904 0x9904
#define PCI_DEVICE_ID_NETMOS_9912 0x9912
#define PCI_DEVICE_ID_NETMOS_9922 0x9922
#define PCI_VENDOR_ID_3COM_2 0xa727 #define PCI_VENDOR_ID_3COM_2 0xa727
......
...@@ -36,7 +36,8 @@ struct pti_masterchannel { ...@@ -36,7 +36,8 @@ struct pti_masterchannel {
/* the following functions are defined in misc/pti.c */ /* the following functions are defined in misc/pti.c */
void pti_writedata(struct pti_masterchannel *mc, u8 *buf, int count); void pti_writedata(struct pti_masterchannel *mc, u8 *buf, int count);
struct pti_masterchannel *pti_request_masterchannel(u8 type); struct pti_masterchannel *pti_request_masterchannel(u8 type,
const char *thread_name);
void pti_release_masterchannel(struct pti_masterchannel *mc); void pti_release_masterchannel(struct pti_masterchannel *mc);
#endif /*PTI_H_*/ #endif /*PTI_H_*/
...@@ -5,24 +5,6 @@ ...@@ -5,24 +5,6 @@
* 'tty.h' defines some structures used by tty_io.c and some defines. * 'tty.h' defines some structures used by tty_io.c and some defines.
*/ */
#ifdef __KERNEL__
#include <linux/fs.h>
#include <linux/major.h>
#include <linux/termios.h>
#include <linux/workqueue.h>
#include <linux/tty_driver.h>
#include <linux/tty_ldisc.h>
#include <linux/mutex.h>
#include <asm/system.h>
/*
* (Note: the *_driver.minor_start values 1, 64, 128, 192 are
* hardcoded at present.)
*/
#define NR_UNIX98_PTY_DEFAULT 4096 /* Default maximum for Unix98 ptys */
#define NR_UNIX98_PTY_MAX (1 << MINORBITS) /* Absolute limit */
#define NR_LDISCS 30 #define NR_LDISCS 30
/* line disciplines */ /* line disciplines */
...@@ -53,6 +35,25 @@ ...@@ -53,6 +35,25 @@
#define N_TRACESINK 23 /* Trace data routing for MIPI P1149.7 */ #define N_TRACESINK 23 /* Trace data routing for MIPI P1149.7 */
#define N_TRACEROUTER 24 /* Trace data routing for MIPI P1149.7 */ #define N_TRACEROUTER 24 /* Trace data routing for MIPI P1149.7 */
#ifdef __KERNEL__
#include <linux/fs.h>
#include <linux/major.h>
#include <linux/termios.h>
#include <linux/workqueue.h>
#include <linux/tty_driver.h>
#include <linux/tty_ldisc.h>
#include <linux/mutex.h>
#include <asm/system.h>
/*
* (Note: the *_driver.minor_start values 1, 64, 128, 192 are
* hardcoded at present.)
*/
#define NR_UNIX98_PTY_DEFAULT 4096 /* Default maximum for Unix98 ptys */
#define NR_UNIX98_PTY_MAX (1 << MINORBITS) /* Absolute limit */
/* /*
* This character is the same as _POSIX_VDISABLE: it cannot be used as * This character is the same as _POSIX_VDISABLE: it cannot be used as
* a c_cc[] character, but indicates that a particular special character * a c_cc[] character, but indicates that a particular special character
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment