diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-05-26 21:57:53 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-05-26 21:57:53 -0400 |
| commit | 8095e4e81b4bc38eef7e0be99f9ecc744eaa1683 (patch) | |
| tree | d3b5100db11784093e78513f3429022569b4bf7b /drivers/tty | |
| parent | 6b5f146535fe6969aeded9f00b0bc42b3783f7fd (diff) | |
| parent | e4aa937ec75df0eea0bee03bffa3303ad36c986b (diff) | |
Merge 3.10-rc3 into tty-next
We want these fixes.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
| -rw-r--r-- | drivers/tty/ehv_bytechan.c | 1 | ||||
| -rw-r--r-- | drivers/tty/mxser.c | 11 | ||||
| -rw-r--r-- | drivers/tty/n_tty.c | 8 | ||||
| -rw-r--r-- | drivers/tty/rocket.c | 288 | ||||
| -rw-r--r-- | drivers/tty/serial/8250/8250_dw.c | 7 | ||||
| -rw-r--r-- | drivers/tty/serial/amba-pl011.c | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/mcf.c | 4 | ||||
| -rw-r--r-- | drivers/tty/serial/mpc52xx_uart.c | 11 | ||||
| -rw-r--r-- | drivers/tty/serial/nwpserial.c | 2 | ||||
| -rw-r--r-- | drivers/tty/serial/omap-serial.c | 23 | ||||
| -rw-r--r-- | drivers/tty/serial/samsung.c | 1 | ||||
| -rw-r--r-- | drivers/tty/vt/vt.c | 14 | ||||
| -rw-r--r-- | drivers/tty/vt/vt_ioctl.c | 67 |
13 files changed, 233 insertions, 206 deletions
diff --git a/drivers/tty/ehv_bytechan.c b/drivers/tty/ehv_bytechan.c index 6d0c27cd03da..9bffcec5ad82 100644 --- a/drivers/tty/ehv_bytechan.c +++ b/drivers/tty/ehv_bytechan.c | |||
| @@ -859,6 +859,7 @@ error: | |||
| 859 | */ | 859 | */ |
| 860 | static void __exit ehv_bc_exit(void) | 860 | static void __exit ehv_bc_exit(void) |
| 861 | { | 861 | { |
| 862 | platform_driver_unregister(&ehv_bc_tty_driver); | ||
| 862 | tty_unregister_driver(ehv_bc_driver); | 863 | tty_unregister_driver(ehv_bc_driver); |
| 863 | put_tty_driver(ehv_bc_driver); | 864 | put_tty_driver(ehv_bc_driver); |
| 864 | kfree(bcs); | 865 | kfree(bcs); |
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index 71d6eb2c93b1..4c4a23674569 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c | |||
| @@ -1618,8 +1618,12 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp) | |||
| 1618 | if (ip->type == PORT_16550A) | 1618 | if (ip->type == PORT_16550A) |
| 1619 | me->fifo[p] = 1; | 1619 | me->fifo[p] = 1; |
| 1620 | 1620 | ||
| 1621 | opmode = inb(ip->opmode_ioaddr)>>((p % 4) * 2); | 1621 | if (ip->board->chip_flag == MOXA_MUST_MU860_HWID) { |
| 1622 | opmode &= OP_MODE_MASK; | 1622 | opmode = inb(ip->opmode_ioaddr)>>((p % 4) * 2); |
| 1623 | opmode &= OP_MODE_MASK; | ||
| 1624 | } else { | ||
| 1625 | opmode = RS232_MODE; | ||
| 1626 | } | ||
| 1623 | me->iftype[p] = opmode; | 1627 | me->iftype[p] = opmode; |
| 1624 | mutex_unlock(&port->mutex); | 1628 | mutex_unlock(&port->mutex); |
| 1625 | } | 1629 | } |
| @@ -1676,6 +1680,9 @@ static int mxser_ioctl(struct tty_struct *tty, | |||
| 1676 | int shiftbit; | 1680 | int shiftbit; |
| 1677 | unsigned char val, mask; | 1681 | unsigned char val, mask; |
| 1678 | 1682 | ||
| 1683 | if (info->board->chip_flag != MOXA_MUST_MU860_HWID) | ||
| 1684 | return -EFAULT; | ||
| 1685 | |||
| 1679 | p = tty->index % 4; | 1686 | p = tty->index % 4; |
| 1680 | if (cmd == MOXA_SET_OP_MODE) { | 1687 | if (cmd == MOXA_SET_OP_MODE) { |
| 1681 | if (get_user(opmode, (int __user *) argp)) | 1688 | if (get_user(opmode, (int __user *) argp)) |
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 905a6fa5250e..cdcdb0ea061a 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c | |||
| @@ -1567,6 +1567,14 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
| 1567 | ldata->real_raw = 0; | 1567 | ldata->real_raw = 0; |
| 1568 | } | 1568 | } |
| 1569 | n_tty_set_room(tty); | 1569 | n_tty_set_room(tty); |
| 1570 | /* | ||
| 1571 | * Fix tty hang when I_IXON(tty) is cleared, but the tty | ||
| 1572 | * been stopped by STOP_CHAR(tty) before it. | ||
| 1573 | */ | ||
| 1574 | if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) { | ||
| 1575 | start_tty(tty); | ||
| 1576 | } | ||
| 1577 | |||
| 1570 | /* The termios change make the tty ready for I/O */ | 1578 | /* The termios change make the tty ready for I/O */ |
| 1571 | wake_up_interruptible(&tty->write_wait); | 1579 | wake_up_interruptible(&tty->write_wait); |
| 1572 | wake_up_interruptible(&tty->read_wait); | 1580 | wake_up_interruptible(&tty->read_wait); |
diff --git a/drivers/tty/rocket.c b/drivers/tty/rocket.c index 82d35c5a58fd..354564ea47c5 100644 --- a/drivers/tty/rocket.c +++ b/drivers/tty/rocket.c | |||
| @@ -150,12 +150,14 @@ static Word_t aiop_intr_bits[AIOP_CTL_SIZE] = { | |||
| 150 | AIOP_INTR_BIT_3 | 150 | AIOP_INTR_BIT_3 |
| 151 | }; | 151 | }; |
| 152 | 152 | ||
| 153 | #ifdef CONFIG_PCI | ||
| 153 | static Word_t upci_aiop_intr_bits[AIOP_CTL_SIZE] = { | 154 | static Word_t upci_aiop_intr_bits[AIOP_CTL_SIZE] = { |
| 154 | UPCI_AIOP_INTR_BIT_0, | 155 | UPCI_AIOP_INTR_BIT_0, |
| 155 | UPCI_AIOP_INTR_BIT_1, | 156 | UPCI_AIOP_INTR_BIT_1, |
| 156 | UPCI_AIOP_INTR_BIT_2, | 157 | UPCI_AIOP_INTR_BIT_2, |
| 157 | UPCI_AIOP_INTR_BIT_3 | 158 | UPCI_AIOP_INTR_BIT_3 |
| 158 | }; | 159 | }; |
| 160 | #endif | ||
| 159 | 161 | ||
| 160 | static Byte_t RData[RDATASIZE] = { | 162 | static Byte_t RData[RDATASIZE] = { |
| 161 | 0x00, 0x09, 0xf6, 0x82, | 163 | 0x00, 0x09, 0xf6, 0x82, |
| @@ -227,7 +229,6 @@ static unsigned long nextLineNumber; | |||
| 227 | static int __init init_ISA(int i); | 229 | static int __init init_ISA(int i); |
| 228 | static void rp_wait_until_sent(struct tty_struct *tty, int timeout); | 230 | static void rp_wait_until_sent(struct tty_struct *tty, int timeout); |
| 229 | static void rp_flush_buffer(struct tty_struct *tty); | 231 | static void rp_flush_buffer(struct tty_struct *tty); |
| 230 | static void rmSpeakerReset(CONTROLLER_T * CtlP, unsigned long model); | ||
| 231 | static unsigned char GetLineNumber(int ctrl, int aiop, int ch); | 232 | static unsigned char GetLineNumber(int ctrl, int aiop, int ch); |
| 232 | static unsigned char SetLineNumber(int ctrl, int aiop, int ch); | 233 | static unsigned char SetLineNumber(int ctrl, int aiop, int ch); |
| 233 | static void rp_start(struct tty_struct *tty); | 234 | static void rp_start(struct tty_struct *tty); |
| @@ -241,11 +242,6 @@ static void sDisInterrupts(CHANNEL_T * ChP, Word_t Flags); | |||
| 241 | static void sModemReset(CONTROLLER_T * CtlP, int chan, int on); | 242 | static void sModemReset(CONTROLLER_T * CtlP, int chan, int on); |
| 242 | static void sPCIModemReset(CONTROLLER_T * CtlP, int chan, int on); | 243 | static void sPCIModemReset(CONTROLLER_T * CtlP, int chan, int on); |
| 243 | static int sWriteTxPrioByte(CHANNEL_T * ChP, Byte_t Data); | 244 | static int sWriteTxPrioByte(CHANNEL_T * ChP, Byte_t Data); |
| 244 | static int sPCIInitController(CONTROLLER_T * CtlP, int CtlNum, | ||
| 245 | ByteIO_t * AiopIOList, int AiopIOListSize, | ||
| 246 | WordIO_t ConfigIO, int IRQNum, Byte_t Frequency, | ||
| 247 | int PeriodicOnly, int altChanRingIndicator, | ||
| 248 | int UPCIRingInd); | ||
| 249 | static int sInitController(CONTROLLER_T * CtlP, int CtlNum, ByteIO_t MudbacIO, | 245 | static int sInitController(CONTROLLER_T * CtlP, int CtlNum, ByteIO_t MudbacIO, |
| 250 | ByteIO_t * AiopIOList, int AiopIOListSize, | 246 | ByteIO_t * AiopIOList, int AiopIOListSize, |
| 251 | int IRQNum, Byte_t Frequency, int PeriodicOnly); | 247 | int IRQNum, Byte_t Frequency, int PeriodicOnly); |
| @@ -1775,6 +1771,145 @@ static DEFINE_PCI_DEVICE_TABLE(rocket_pci_ids) = { | |||
| 1775 | }; | 1771 | }; |
| 1776 | MODULE_DEVICE_TABLE(pci, rocket_pci_ids); | 1772 | MODULE_DEVICE_TABLE(pci, rocket_pci_ids); |
| 1777 | 1773 | ||
| 1774 | /* Resets the speaker controller on RocketModem II and III devices */ | ||
| 1775 | static void rmSpeakerReset(CONTROLLER_T * CtlP, unsigned long model) | ||
| 1776 | { | ||
| 1777 | ByteIO_t addr; | ||
| 1778 | |||
| 1779 | /* RocketModem II speaker control is at the 8th port location of offset 0x40 */ | ||
| 1780 | if ((model == MODEL_RP4M) || (model == MODEL_RP6M)) { | ||
| 1781 | addr = CtlP->AiopIO[0] + 0x4F; | ||
| 1782 | sOutB(addr, 0); | ||
| 1783 | } | ||
| 1784 | |||
| 1785 | /* RocketModem III speaker control is at the 1st port location of offset 0x80 */ | ||
| 1786 | if ((model == MODEL_UPCI_RM3_8PORT) | ||
| 1787 | || (model == MODEL_UPCI_RM3_4PORT)) { | ||
| 1788 | addr = CtlP->AiopIO[0] + 0x88; | ||
| 1789 | sOutB(addr, 0); | ||
| 1790 | } | ||
| 1791 | } | ||
| 1792 | |||
| 1793 | /*************************************************************************** | ||
| 1794 | Function: sPCIInitController | ||
| 1795 | Purpose: Initialization of controller global registers and controller | ||
| 1796 | structure. | ||
| 1797 | Call: sPCIInitController(CtlP,CtlNum,AiopIOList,AiopIOListSize, | ||
| 1798 | IRQNum,Frequency,PeriodicOnly) | ||
| 1799 | CONTROLLER_T *CtlP; Ptr to controller structure | ||
| 1800 | int CtlNum; Controller number | ||
| 1801 | ByteIO_t *AiopIOList; List of I/O addresses for each AIOP. | ||
| 1802 | This list must be in the order the AIOPs will be found on the | ||
| 1803 | controller. Once an AIOP in the list is not found, it is | ||
| 1804 | assumed that there are no more AIOPs on the controller. | ||
| 1805 | int AiopIOListSize; Number of addresses in AiopIOList | ||
| 1806 | int IRQNum; Interrupt Request number. Can be any of the following: | ||
| 1807 | 0: Disable global interrupts | ||
| 1808 | 3: IRQ 3 | ||
| 1809 | 4: IRQ 4 | ||
| 1810 | 5: IRQ 5 | ||
| 1811 | 9: IRQ 9 | ||
| 1812 | 10: IRQ 10 | ||
| 1813 | 11: IRQ 11 | ||
| 1814 | 12: IRQ 12 | ||
| 1815 | 15: IRQ 15 | ||
| 1816 | Byte_t Frequency: A flag identifying the frequency | ||
| 1817 | of the periodic interrupt, can be any one of the following: | ||
| 1818 | FREQ_DIS - periodic interrupt disabled | ||
| 1819 | FREQ_137HZ - 137 Hertz | ||
| 1820 | FREQ_69HZ - 69 Hertz | ||
| 1821 | FREQ_34HZ - 34 Hertz | ||
| 1822 | FREQ_17HZ - 17 Hertz | ||
| 1823 | FREQ_9HZ - 9 Hertz | ||
| 1824 | FREQ_4HZ - 4 Hertz | ||
| 1825 | If IRQNum is set to 0 the Frequency parameter is | ||
| 1826 | overidden, it is forced to a value of FREQ_DIS. | ||
| 1827 | int PeriodicOnly: 1 if all interrupts except the periodic | ||
| 1828 | interrupt are to be blocked. | ||
| 1829 | 0 is both the periodic interrupt and | ||
| 1830 | other channel interrupts are allowed. | ||
| 1831 | If IRQNum is set to 0 the PeriodicOnly parameter is | ||
| 1832 | overidden, it is forced to a value of 0. | ||
| 1833 | Return: int: Number of AIOPs on the controller, or CTLID_NULL if controller | ||
| 1834 | initialization failed. | ||
| 1835 | |||
| 1836 | Comments: | ||
| 1837 | If periodic interrupts are to be disabled but AIOP interrupts | ||
| 1838 | are allowed, set Frequency to FREQ_DIS and PeriodicOnly to 0. | ||
| 1839 | |||
| 1840 | If interrupts are to be completely disabled set IRQNum to 0. | ||
| 1841 | |||
| 1842 | Setting Frequency to FREQ_DIS and PeriodicOnly to 1 is an | ||
| 1843 | invalid combination. | ||
| 1844 | |||
| 1845 | This function performs initialization of global interrupt modes, | ||
| 1846 | but it does not actually enable global interrupts. To enable | ||
| 1847 | and disable global interrupts use functions sEnGlobalInt() and | ||
| 1848 | sDisGlobalInt(). Enabling of global interrupts is normally not | ||
| 1849 | done until all other initializations are complete. | ||
| 1850 | |||
| 1851 | Even if interrupts are globally enabled, they must also be | ||
| 1852 | individually enabled for each channel that is to generate | ||
| 1853 | interrupts. | ||
| 1854 | |||
| 1855 | Warnings: No range checking on any of the parameters is done. | ||
| 1856 | |||
| 1857 | No context switches are allowed while executing this function. | ||
| 1858 | |||
| 1859 | After this function all AIOPs on the controller are disabled, | ||
| 1860 | they can be enabled with sEnAiop(). | ||
| 1861 | */ | ||
| 1862 | static int sPCIInitController(CONTROLLER_T * CtlP, int CtlNum, | ||
| 1863 | ByteIO_t * AiopIOList, int AiopIOListSize, | ||
| 1864 | WordIO_t ConfigIO, int IRQNum, Byte_t Frequency, | ||
| 1865 | int PeriodicOnly, int altChanRingIndicator, | ||
| 1866 | int UPCIRingInd) | ||
| 1867 | { | ||
| 1868 | int i; | ||
| 1869 | ByteIO_t io; | ||
| 1870 | |||
| 1871 | CtlP->AltChanRingIndicator = altChanRingIndicator; | ||
| 1872 | CtlP->UPCIRingInd = UPCIRingInd; | ||
| 1873 | CtlP->CtlNum = CtlNum; | ||
| 1874 | CtlP->CtlID = CTLID_0001; /* controller release 1 */ | ||
| 1875 | CtlP->BusType = isPCI; /* controller release 1 */ | ||
| 1876 | |||
| 1877 | if (ConfigIO) { | ||
| 1878 | CtlP->isUPCI = 1; | ||
| 1879 | CtlP->PCIIO = ConfigIO + _PCI_9030_INT_CTRL; | ||
| 1880 | CtlP->PCIIO2 = ConfigIO + _PCI_9030_GPIO_CTRL; | ||
| 1881 | CtlP->AiopIntrBits = upci_aiop_intr_bits; | ||
| 1882 | } else { | ||
| 1883 | CtlP->isUPCI = 0; | ||
| 1884 | CtlP->PCIIO = | ||
| 1885 | (WordIO_t) ((ByteIO_t) AiopIOList[0] + _PCI_INT_FUNC); | ||
| 1886 | CtlP->AiopIntrBits = aiop_intr_bits; | ||
| 1887 | } | ||
| 1888 | |||
| 1889 | sPCIControllerEOI(CtlP); /* clear EOI if warm init */ | ||
| 1890 | /* Init AIOPs */ | ||
| 1891 | CtlP->NumAiop = 0; | ||
| 1892 | for (i = 0; i < AiopIOListSize; i++) { | ||
| 1893 | io = AiopIOList[i]; | ||
| 1894 | CtlP->AiopIO[i] = (WordIO_t) io; | ||
| 1895 | CtlP->AiopIntChanIO[i] = io + _INT_CHAN; | ||
| 1896 | |||
| 1897 | CtlP->AiopID[i] = sReadAiopID(io); /* read AIOP ID */ | ||
| 1898 | if (CtlP->AiopID[i] == AIOPID_NULL) /* if AIOP does not exist */ | ||
| 1899 | break; /* done looking for AIOPs */ | ||
| 1900 | |||
| 1901 | CtlP->AiopNumChan[i] = sReadAiopNumChan((WordIO_t) io); /* num channels in AIOP */ | ||
| 1902 | sOutW((WordIO_t) io + _INDX_ADDR, _CLK_PRE); /* clock prescaler */ | ||
| 1903 | sOutB(io + _INDX_DATA, sClockPrescale); | ||
| 1904 | CtlP->NumAiop++; /* bump count of AIOPs */ | ||
| 1905 | } | ||
| 1906 | |||
| 1907 | if (CtlP->NumAiop == 0) | ||
| 1908 | return (-1); | ||
| 1909 | else | ||
| 1910 | return (CtlP->NumAiop); | ||
| 1911 | } | ||
| 1912 | |||
| 1778 | /* | 1913 | /* |
| 1779 | * Called when a PCI card is found. Retrieves and stores model information, | 1914 | * Called when a PCI card is found. Retrieves and stores model information, |
| 1780 | * init's aiopic and serial port hardware. | 1915 | * init's aiopic and serial port hardware. |
| @@ -2519,147 +2654,6 @@ static int sInitController(CONTROLLER_T * CtlP, int CtlNum, ByteIO_t MudbacIO, | |||
| 2519 | return (CtlP->NumAiop); | 2654 | return (CtlP->NumAiop); |
| 2520 | } | 2655 | } |
| 2521 | 2656 | ||
| 2522 | #ifdef CONFIG_PCI | ||
| 2523 | /*************************************************************************** | ||
| 2524 | Function: sPCIInitController | ||
| 2525 | Purpose: Initialization of controller global registers and controller | ||
| 2526 | structure. | ||
| 2527 | Call: sPCIInitController(CtlP,CtlNum,AiopIOList,AiopIOListSize, | ||
| 2528 | IRQNum,Frequency,PeriodicOnly) | ||
| 2529 | CONTROLLER_T *CtlP; Ptr to controller structure | ||
| 2530 | int CtlNum; Controller number | ||
| 2531 | ByteIO_t *AiopIOList; List of I/O addresses for each AIOP. | ||
| 2532 | This list must be in the order the AIOPs will be found on the | ||
| 2533 | controller. Once an AIOP in the list is not found, it is | ||
| 2534 | assumed that there are no more AIOPs on the controller. | ||
| 2535 | int AiopIOListSize; Number of addresses in AiopIOList | ||
| 2536 | int IRQNum; Interrupt Request number. Can be any of the following: | ||
| 2537 | 0: Disable global interrupts | ||
| 2538 | 3: IRQ 3 | ||
| 2539 | 4: IRQ 4 | ||
| 2540 | 5: IRQ 5 | ||
| 2541 | 9: IRQ 9 | ||
| 2542 | 10: IRQ 10 | ||
| 2543 | 11: IRQ 11 | ||
| 2544 | 12: IRQ 12 | ||
| 2545 | 15: IRQ 15 | ||
| 2546 | Byte_t Frequency: A flag identifying the frequency | ||
| 2547 | of the periodic interrupt, can be any one of the following: | ||
| 2548 | FREQ_DIS - periodic interrupt disabled | ||
| 2549 | FREQ_137HZ - 137 Hertz | ||
| 2550 | FREQ_69HZ - 69 Hertz | ||
| 2551 | FREQ_34HZ - 34 Hertz | ||
| 2552 | FREQ_17HZ - 17 Hertz | ||
| 2553 | FREQ_9HZ - 9 Hertz | ||
| 2554 | FREQ_4HZ - 4 Hertz | ||
| 2555 | If IRQNum is set to 0 the Frequency parameter is | ||
| 2556 | overidden, it is forced to a value of FREQ_DIS. | ||
| 2557 | int PeriodicOnly: 1 if all interrupts except the periodic | ||
| 2558 | interrupt are to be blocked. | ||
| 2559 | 0 is both the periodic interrupt and | ||
| 2560 | other channel interrupts are allowed. | ||
| 2561 | If IRQNum is set to 0 the PeriodicOnly parameter is | ||
| 2562 | overidden, it is forced to a value of 0. | ||
| 2563 | Return: int: Number of AIOPs on the controller, or CTLID_NULL if controller | ||
| 2564 | initialization failed. | ||
| 2565 | |||
| 2566 | Comments: | ||
| 2567 | If periodic interrupts are to be disabled but AIOP interrupts | ||
| 2568 | are allowed, set Frequency to FREQ_DIS and PeriodicOnly to 0. | ||
| 2569 | |||
| 2570 | If interrupts are to be completely disabled set IRQNum to 0. | ||
| 2571 | |||
| 2572 | Setting Frequency to FREQ_DIS and PeriodicOnly to 1 is an | ||
| 2573 | invalid combination. | ||
| 2574 | |||
| 2575 | This function performs initialization of global interrupt modes, | ||
| 2576 | but it does not actually enable global interrupts. To enable | ||
| 2577 | and disable global interrupts use functions sEnGlobalInt() and | ||
| 2578 | sDisGlobalInt(). Enabling of global interrupts is normally not | ||
| 2579 | done until all other initializations are complete. | ||
| 2580 | |||
| 2581 | Even if interrupts are globally enabled, they must also be | ||
| 2582 | individually enabled for each channel that is to generate | ||
| 2583 | interrupts. | ||
| 2584 | |||
| 2585 | Warnings: No range checking on any of the parameters is done. | ||
| 2586 | |||
| 2587 | No context switches are allowed while executing this function. | ||
| 2588 | |||
| 2589 | After this function all AIOPs on the controller are disabled, | ||
| 2590 | they can be enabled with sEnAiop(). | ||
| 2591 | */ | ||
| 2592 | static int sPCIInitController(CONTROLLER_T * CtlP, int CtlNum, | ||
| 2593 | ByteIO_t * AiopIOList, int AiopIOListSize, | ||
| 2594 | WordIO_t ConfigIO, int IRQNum, Byte_t Frequency, | ||
| 2595 | int PeriodicOnly, int altChanRingIndicator, | ||
| 2596 | int UPCIRingInd) | ||
| 2597 | { | ||
| 2598 | int i; | ||
| 2599 | ByteIO_t io; | ||
| 2600 | |||
| 2601 | CtlP->AltChanRingIndicator = altChanRingIndicator; | ||
| 2602 | CtlP->UPCIRingInd = UPCIRingInd; | ||
| 2603 | CtlP->CtlNum = CtlNum; | ||
| 2604 | CtlP->CtlID = CTLID_0001; /* controller release 1 */ | ||
| 2605 | CtlP->BusType = isPCI; /* controller release 1 */ | ||
| 2606 | |||
| 2607 | if (ConfigIO) { | ||
| 2608 | CtlP->isUPCI = 1; | ||
| 2609 | CtlP->PCIIO = ConfigIO + _PCI_9030_INT_CTRL; | ||
| 2610 | CtlP->PCIIO2 = ConfigIO + _PCI_9030_GPIO_CTRL; | ||
| 2611 | CtlP->AiopIntrBits = upci_aiop_intr_bits; | ||
| 2612 | } else { | ||
| 2613 | CtlP->isUPCI = 0; | ||
| 2614 | CtlP->PCIIO = | ||
| 2615 | (WordIO_t) ((ByteIO_t) AiopIOList[0] + _PCI_INT_FUNC); | ||
| 2616 | CtlP->AiopIntrBits = aiop_intr_bits; | ||
| 2617 | } | ||
| 2618 | |||
| 2619 | sPCIControllerEOI(CtlP); /* clear EOI if warm init */ | ||
| 2620 | /* Init AIOPs */ | ||
| 2621 | CtlP->NumAiop = 0; | ||
| 2622 | for (i = 0; i < AiopIOListSize; i++) { | ||
| 2623 | io = AiopIOList[i]; | ||
| 2624 | CtlP->AiopIO[i] = (WordIO_t) io; | ||
| 2625 | CtlP->AiopIntChanIO[i] = io + _INT_CHAN; | ||
| 2626 | |||
| 2627 | CtlP->AiopID[i] = sReadAiopID(io); /* read AIOP ID */ | ||
| 2628 | if (CtlP->AiopID[i] == AIOPID_NULL) /* if AIOP does not exist */ | ||
| 2629 | break; /* done looking for AIOPs */ | ||
| 2630 | |||
| 2631 | CtlP->AiopNumChan[i] = sReadAiopNumChan((WordIO_t) io); /* num channels in AIOP */ | ||
| 2632 | sOutW((WordIO_t) io + _INDX_ADDR, _CLK_PRE); /* clock prescaler */ | ||
| 2633 | sOutB(io + _INDX_DATA, sClockPrescale); | ||
| 2634 | CtlP->NumAiop++; /* bump count of AIOPs */ | ||
| 2635 | } | ||
| 2636 | |||
| 2637 | if (CtlP->NumAiop == 0) | ||
| 2638 | return (-1); | ||
| 2639 | else | ||
| 2640 | return (CtlP->NumAiop); | ||
| 2641 | } | ||
| 2642 | |||
| 2643 | /* Resets the speaker controller on RocketModem II and III devices */ | ||
| 2644 | static void rmSpeakerReset(CONTROLLER_T * CtlP, unsigned long model) | ||
| 2645 | { | ||
| 2646 | ByteIO_t addr; | ||
| 2647 | |||
| 2648 | /* RocketModem II speaker control is at the 8th port location of offset 0x40 */ | ||
| 2649 | if ((model == MODEL_RP4M) || (model == MODEL_RP6M)) { | ||
| 2650 | addr = CtlP->AiopIO[0] + 0x4F; | ||
| 2651 | sOutB(addr, 0); | ||
| 2652 | } | ||
| 2653 | |||
| 2654 | /* RocketModem III speaker control is at the 1st port location of offset 0x80 */ | ||
| 2655 | if ((model == MODEL_UPCI_RM3_8PORT) | ||
| 2656 | || (model == MODEL_UPCI_RM3_4PORT)) { | ||
| 2657 | addr = CtlP->AiopIO[0] + 0x88; | ||
| 2658 | sOutB(addr, 0); | ||
| 2659 | } | ||
| 2660 | } | ||
| 2661 | #endif | ||
| 2662 | |||
| 2663 | /*************************************************************************** | 2657 | /*************************************************************************** |
| 2664 | Function: sReadAiopID | 2658 | Function: sReadAiopID |
| 2665 | Purpose: Read the AIOP idenfication number directly from an AIOP. | 2659 | Purpose: Read the AIOP idenfication number directly from an AIOP. |
diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c index beaa283f5cc6..d07b6af3a937 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c | |||
| @@ -338,7 +338,8 @@ static int dw8250_runtime_suspend(struct device *dev) | |||
| 338 | { | 338 | { |
| 339 | struct dw8250_data *data = dev_get_drvdata(dev); | 339 | struct dw8250_data *data = dev_get_drvdata(dev); |
| 340 | 340 | ||
| 341 | clk_disable_unprepare(data->clk); | 341 | if (!IS_ERR(data->clk)) |
| 342 | clk_disable_unprepare(data->clk); | ||
| 342 | 343 | ||
| 343 | return 0; | 344 | return 0; |
| 344 | } | 345 | } |
| @@ -347,7 +348,8 @@ static int dw8250_runtime_resume(struct device *dev) | |||
| 347 | { | 348 | { |
| 348 | struct dw8250_data *data = dev_get_drvdata(dev); | 349 | struct dw8250_data *data = dev_get_drvdata(dev); |
| 349 | 350 | ||
| 350 | clk_prepare_enable(data->clk); | 351 | if (!IS_ERR(data->clk)) |
| 352 | clk_prepare_enable(data->clk); | ||
| 351 | 353 | ||
| 352 | return 0; | 354 | return 0; |
| 353 | } | 355 | } |
| @@ -367,6 +369,7 @@ MODULE_DEVICE_TABLE(of, dw8250_of_match); | |||
| 367 | static const struct acpi_device_id dw8250_acpi_match[] = { | 369 | static const struct acpi_device_id dw8250_acpi_match[] = { |
| 368 | { "INT33C4", 0 }, | 370 | { "INT33C4", 0 }, |
| 369 | { "INT33C5", 0 }, | 371 | { "INT33C5", 0 }, |
| 372 | { "80860F0A", 0 }, | ||
| 370 | { }, | 373 | { }, |
| 371 | }; | 374 | }; |
| 372 | MODULE_DEVICE_TABLE(acpi, dw8250_acpi_match); | 375 | MODULE_DEVICE_TABLE(acpi, dw8250_acpi_match); |
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 85cfe116f423..ad41319d1d9b 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c | |||
| @@ -331,7 +331,7 @@ static void pl011_dma_probe_initcall(struct device *dev, struct uart_amba_port * | |||
| 331 | dmaengine_slave_config(chan, &rx_conf); | 331 | dmaengine_slave_config(chan, &rx_conf); |
| 332 | uap->dmarx.chan = chan; | 332 | uap->dmarx.chan = chan; |
| 333 | 333 | ||
| 334 | if (plat->dma_rx_poll_enable) { | 334 | if (plat && plat->dma_rx_poll_enable) { |
| 335 | /* Set poll rate if specified. */ | 335 | /* Set poll rate if specified. */ |
| 336 | if (plat->dma_rx_poll_rate) { | 336 | if (plat->dma_rx_poll_rate) { |
| 337 | uap->dmarx.auto_poll_rate = false; | 337 | uap->dmarx.auto_poll_rate = false; |
diff --git a/drivers/tty/serial/mcf.c b/drivers/tty/serial/mcf.c index e956377a38fe..65be0c00c4bf 100644 --- a/drivers/tty/serial/mcf.c +++ b/drivers/tty/serial/mcf.c | |||
| @@ -707,8 +707,10 @@ static int __init mcf_init(void) | |||
| 707 | if (rc) | 707 | if (rc) |
| 708 | return rc; | 708 | return rc; |
| 709 | rc = platform_driver_register(&mcf_platform_driver); | 709 | rc = platform_driver_register(&mcf_platform_driver); |
| 710 | if (rc) | 710 | if (rc) { |
| 711 | uart_unregister_driver(&mcf_driver); | ||
| 711 | return rc; | 712 | return rc; |
| 713 | } | ||
| 712 | return 0; | 714 | return 0; |
| 713 | } | 715 | } |
| 714 | 716 | ||
diff --git a/drivers/tty/serial/mpc52xx_uart.c b/drivers/tty/serial/mpc52xx_uart.c index d74ac060c06f..510fa986cf9e 100644 --- a/drivers/tty/serial/mpc52xx_uart.c +++ b/drivers/tty/serial/mpc52xx_uart.c | |||
| @@ -1487,18 +1487,23 @@ mpc52xx_uart_init(void) | |||
| 1487 | if (psc_ops && psc_ops->fifoc_init) { | 1487 | if (psc_ops && psc_ops->fifoc_init) { |
| 1488 | ret = psc_ops->fifoc_init(); | 1488 | ret = psc_ops->fifoc_init(); |
| 1489 | if (ret) | 1489 | if (ret) |
| 1490 | return ret; | 1490 | goto err_init; |
| 1491 | } | 1491 | } |
| 1492 | 1492 | ||
| 1493 | ret = platform_driver_register(&mpc52xx_uart_of_driver); | 1493 | ret = platform_driver_register(&mpc52xx_uart_of_driver); |
| 1494 | if (ret) { | 1494 | if (ret) { |
| 1495 | printk(KERN_ERR "%s: platform_driver_register failed (%i)\n", | 1495 | printk(KERN_ERR "%s: platform_driver_register failed (%i)\n", |
| 1496 | __FILE__, ret); | 1496 | __FILE__, ret); |
| 1497 | uart_unregister_driver(&mpc52xx_uart_driver); | 1497 | goto err_reg; |
| 1498 | return ret; | ||
| 1499 | } | 1498 | } |
| 1500 | 1499 | ||
| 1501 | return 0; | 1500 | return 0; |
| 1501 | err_reg: | ||
| 1502 | if (psc_ops && psc_ops->fifoc_uninit) | ||
| 1503 | psc_ops->fifoc_uninit(); | ||
| 1504 | err_init: | ||
| 1505 | uart_unregister_driver(&mpc52xx_uart_driver); | ||
| 1506 | return ret; | ||
| 1502 | } | 1507 | } |
| 1503 | 1508 | ||
| 1504 | static void __exit | 1509 | static void __exit |
diff --git a/drivers/tty/serial/nwpserial.c b/drivers/tty/serial/nwpserial.c index 77287c54f331..549c70a2a63e 100644 --- a/drivers/tty/serial/nwpserial.c +++ b/drivers/tty/serial/nwpserial.c | |||
| @@ -199,7 +199,7 @@ static void nwpserial_shutdown(struct uart_port *port) | |||
| 199 | dcr_write(up->dcr_host, UART_IER, up->ier); | 199 | dcr_write(up->dcr_host, UART_IER, up->ier); |
| 200 | 200 | ||
| 201 | /* free irq */ | 201 | /* free irq */ |
| 202 | free_irq(up->port.irq, port); | 202 | free_irq(up->port.irq, up); |
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | static int nwpserial_verify_port(struct uart_port *port, | 205 | static int nwpserial_verify_port(struct uart_port *port, |
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index 9457fe331ab5..393a8eb98d72 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c | |||
| @@ -203,26 +203,6 @@ static int serial_omap_get_context_loss_count(struct uart_omap_port *up) | |||
| 203 | return pdata->get_context_loss_count(up->dev); | 203 | return pdata->get_context_loss_count(up->dev); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | static void serial_omap_set_forceidle(struct uart_omap_port *up) | ||
| 207 | { | ||
| 208 | struct omap_uart_port_info *pdata = up->dev->platform_data; | ||
| 209 | |||
| 210 | if (!pdata || !pdata->set_forceidle) | ||
| 211 | return; | ||
| 212 | |||
| 213 | pdata->set_forceidle(up->dev); | ||
| 214 | } | ||
| 215 | |||
| 216 | static void serial_omap_set_noidle(struct uart_omap_port *up) | ||
| 217 | { | ||
| 218 | struct omap_uart_port_info *pdata = up->dev->platform_data; | ||
| 219 | |||
| 220 | if (!pdata || !pdata->set_noidle) | ||
| 221 | return; | ||
| 222 | |||
| 223 | pdata->set_noidle(up->dev); | ||
| 224 | } | ||
| 225 | |||
| 226 | static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable) | 206 | static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable) |
| 227 | { | 207 | { |
| 228 | struct omap_uart_port_info *pdata = up->dev->platform_data; | 208 | struct omap_uart_port_info *pdata = up->dev->platform_data; |
| @@ -299,8 +279,6 @@ static void serial_omap_stop_tx(struct uart_port *port) | |||
| 299 | serial_out(up, UART_IER, up->ier); | 279 | serial_out(up, UART_IER, up->ier); |
| 300 | } | 280 | } |
| 301 | 281 | ||
| 302 | serial_omap_set_forceidle(up); | ||
| 303 | |||
| 304 | pm_runtime_mark_last_busy(up->dev); | 282 | pm_runtime_mark_last_busy(up->dev); |
| 305 | pm_runtime_put_autosuspend(up->dev); | 283 | pm_runtime_put_autosuspend(up->dev); |
| 306 | } | 284 | } |
| @@ -365,7 +343,6 @@ static void serial_omap_start_tx(struct uart_port *port) | |||
| 365 | 343 | ||
| 366 | pm_runtime_get_sync(up->dev); | 344 | pm_runtime_get_sync(up->dev); |
| 367 | serial_omap_enable_ier_thri(up); | 345 | serial_omap_enable_ier_thri(up); |
| 368 | serial_omap_set_noidle(up); | ||
| 369 | pm_runtime_mark_last_busy(up->dev); | 346 | pm_runtime_mark_last_busy(up->dev); |
| 370 | pm_runtime_put_autosuspend(up->dev); | 347 | pm_runtime_put_autosuspend(up->dev); |
| 371 | } | 348 | } |
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 074b9194144f..89429410a245 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c | |||
| @@ -1803,6 +1803,7 @@ static int __init s3c24xx_serial_modinit(void) | |||
| 1803 | 1803 | ||
| 1804 | static void __exit s3c24xx_serial_modexit(void) | 1804 | static void __exit s3c24xx_serial_modexit(void) |
| 1805 | { | 1805 | { |
| 1806 | platform_driver_unregister(&samsung_serial_driver); | ||
| 1806 | uart_unregister_driver(&s3c24xx_uart_drv); | 1807 | uart_unregister_driver(&s3c24xx_uart_drv); |
| 1807 | } | 1808 | } |
| 1808 | 1809 | ||
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index d4ba2ba78d13..c677829baa8b 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
| @@ -779,7 +779,6 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ | |||
| 779 | con_set_default_unimap(vc); | 779 | con_set_default_unimap(vc); |
| 780 | vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL); | 780 | vc->vc_screenbuf = kmalloc(vc->vc_screenbuf_size, GFP_KERNEL); |
| 781 | if (!vc->vc_screenbuf) { | 781 | if (!vc->vc_screenbuf) { |
| 782 | tty_port_destroy(&vc->port); | ||
| 783 | kfree(vc); | 782 | kfree(vc); |
| 784 | vc_cons[currcons].d = NULL; | 783 | vc_cons[currcons].d = NULL; |
| 785 | return -ENOMEM; | 784 | return -ENOMEM; |
| @@ -986,26 +985,25 @@ static int vt_resize(struct tty_struct *tty, struct winsize *ws) | |||
| 986 | return ret; | 985 | return ret; |
| 987 | } | 986 | } |
| 988 | 987 | ||
| 989 | void vc_deallocate(unsigned int currcons) | 988 | struct vc_data *vc_deallocate(unsigned int currcons) |
| 990 | { | 989 | { |
| 990 | struct vc_data *vc = NULL; | ||
| 991 | |||
| 991 | WARN_CONSOLE_UNLOCKED(); | 992 | WARN_CONSOLE_UNLOCKED(); |
| 992 | 993 | ||
| 993 | if (vc_cons_allocated(currcons)) { | 994 | if (vc_cons_allocated(currcons)) { |
| 994 | struct vc_data *vc = vc_cons[currcons].d; | 995 | struct vt_notifier_param param; |
| 995 | struct vt_notifier_param param = { .vc = vc }; | ||
| 996 | 996 | ||
| 997 | param.vc = vc = vc_cons[currcons].d; | ||
| 997 | atomic_notifier_call_chain(&vt_notifier_list, VT_DEALLOCATE, ¶m); | 998 | atomic_notifier_call_chain(&vt_notifier_list, VT_DEALLOCATE, ¶m); |
| 998 | vcs_remove_sysfs(currcons); | 999 | vcs_remove_sysfs(currcons); |
| 999 | vc->vc_sw->con_deinit(vc); | 1000 | vc->vc_sw->con_deinit(vc); |
| 1000 | put_pid(vc->vt_pid); | 1001 | put_pid(vc->vt_pid); |
| 1001 | module_put(vc->vc_sw->owner); | 1002 | module_put(vc->vc_sw->owner); |
| 1002 | kfree(vc->vc_screenbuf); | 1003 | kfree(vc->vc_screenbuf); |
| 1003 | if (currcons >= MIN_NR_CONSOLES) { | ||
| 1004 | tty_port_destroy(&vc->port); | ||
| 1005 | kfree(vc); | ||
| 1006 | } | ||
| 1007 | vc_cons[currcons].d = NULL; | 1004 | vc_cons[currcons].d = NULL; |
| 1008 | } | 1005 | } |
| 1006 | return vc; | ||
| 1009 | } | 1007 | } |
| 1010 | 1008 | ||
| 1011 | /* | 1009 | /* |
diff --git a/drivers/tty/vt/vt_ioctl.c b/drivers/tty/vt/vt_ioctl.c index 98ff1735eafc..fc2c06c66e89 100644 --- a/drivers/tty/vt/vt_ioctl.c +++ b/drivers/tty/vt/vt_ioctl.c | |||
| @@ -283,6 +283,51 @@ do_unimap_ioctl(int cmd, struct unimapdesc __user *user_ud, int perm, struct vc_ | |||
| 283 | return 0; | 283 | return 0; |
| 284 | } | 284 | } |
| 285 | 285 | ||
| 286 | /* deallocate a single console, if possible (leave 0) */ | ||
| 287 | static int vt_disallocate(unsigned int vc_num) | ||
| 288 | { | ||
| 289 | struct vc_data *vc = NULL; | ||
| 290 | int ret = 0; | ||
| 291 | |||
| 292 | if (!vc_num) | ||
| 293 | return 0; | ||
| 294 | |||
| 295 | console_lock(); | ||
| 296 | if (VT_BUSY(vc_num)) | ||
| 297 | ret = -EBUSY; | ||
| 298 | else | ||
| 299 | vc = vc_deallocate(vc_num); | ||
| 300 | console_unlock(); | ||
| 301 | |||
| 302 | if (vc && vc_num >= MIN_NR_CONSOLES) { | ||
| 303 | tty_port_destroy(&vc->port); | ||
| 304 | kfree(vc); | ||
| 305 | } | ||
| 306 | |||
| 307 | return ret; | ||
| 308 | } | ||
| 309 | |||
| 310 | /* deallocate all unused consoles, but leave 0 */ | ||
| 311 | static void vt_disallocate_all(void) | ||
| 312 | { | ||
| 313 | struct vc_data *vc[MAX_NR_CONSOLES]; | ||
| 314 | int i; | ||
| 315 | |||
| 316 | console_lock(); | ||
| 317 | for (i = 1; i < MAX_NR_CONSOLES; i++) | ||
| 318 | if (!VT_BUSY(i)) | ||
| 319 | vc[i] = vc_deallocate(i); | ||
| 320 | else | ||
| 321 | vc[i] = NULL; | ||
| 322 | console_unlock(); | ||
| 323 | |||
| 324 | for (i = 1; i < MAX_NR_CONSOLES; i++) { | ||
| 325 | if (vc[i] && i >= MIN_NR_CONSOLES) { | ||
| 326 | tty_port_destroy(&vc[i]->port); | ||
| 327 | kfree(vc[i]); | ||
| 328 | } | ||
| 329 | } | ||
| 330 | } | ||
| 286 | 331 | ||
| 287 | 332 | ||
| 288 | /* | 333 | /* |
| @@ -769,24 +814,10 @@ int vt_ioctl(struct tty_struct *tty, | |||
| 769 | ret = -ENXIO; | 814 | ret = -ENXIO; |
| 770 | break; | 815 | break; |
| 771 | } | 816 | } |
| 772 | if (arg == 0) { | 817 | if (arg == 0) |
| 773 | /* deallocate all unused consoles, but leave 0 */ | 818 | vt_disallocate_all(); |
| 774 | console_lock(); | 819 | else |
| 775 | for (i=1; i<MAX_NR_CONSOLES; i++) | 820 | ret = vt_disallocate(--arg); |
| 776 | if (! VT_BUSY(i)) | ||
| 777 | vc_deallocate(i); | ||
| 778 | console_unlock(); | ||
| 779 | } else { | ||
| 780 | /* deallocate a single console, if possible */ | ||
| 781 | arg--; | ||
| 782 | if (VT_BUSY(arg)) | ||
| 783 | ret = -EBUSY; | ||
| 784 | else if (arg) { /* leave 0 */ | ||
| 785 | console_lock(); | ||
| 786 | vc_deallocate(arg); | ||
| 787 | console_unlock(); | ||
| 788 | } | ||
| 789 | } | ||
| 790 | break; | 821 | break; |
| 791 | 822 | ||
| 792 | case VT_RESIZE: | 823 | case VT_RESIZE: |
