Merge tag 'char-misc-4.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc updates from Greg KH: "Here is the big set of char/misc driver patches for 4.17-rc1. There are a lot of little things in here, nothing huge, but all important to the different hardware types involved: - thunderbolt driver updates - parport updates (people still care...) - nvmem driver updates - mei updates (as always) - hwtracing driver updates - hyperv driver updates - extcon driver updates - ... and a handful of even smaller driver subsystem and individual driver updates All of these have been in linux-next with no reported issues" * tag 'char-misc-4.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (149 commits) hwtracing: Add HW tracing support menu intel_th: Add ACPI glue layer intel_th: Allow forcing host mode through drvdata intel_th: Pick up irq number from resources intel_th: Don't touch switch routing in host mode intel_th: Use correct method of finding hub intel_th: Add SPDX GPL-2.0 header to replace GPLv2 boilerplate stm class: Make dummy's master/channel ranges configurable stm class: Add SPDX GPL-2.0 header to replace GPLv2 boilerplate MAINTAINERS: Bestow upon myself the care for drivers/hwtracing hv: add SPDX license id to Kconfig hv: add SPDX license to trace Drivers: hv: vmbus: do not mark HV_PCIE as perf_device Drivers: hv: vmbus: respect what we get from hv_get_synint_state() /dev/mem: Avoid overwriting "err" in read_mem() eeprom: at24: use SPDX identifier instead of GPL boiler-plate eeprom: at24: simplify the i2c functionality checking eeprom: at24: fix a line break eeprom: at24: tweak newlines eeprom: at24: refactor at24_probe() ...
This commit is contained in:
@@ -273,18 +273,16 @@ static int parport_ax88796_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *_dev = &pdev->dev;
|
||||
struct ax_drvdata *dd;
|
||||
struct parport *pp = NULL;
|
||||
struct parport *pp;
|
||||
struct resource *res;
|
||||
unsigned long size;
|
||||
int spacing;
|
||||
int irq;
|
||||
int ret;
|
||||
|
||||
dd = kzalloc(sizeof(struct ax_drvdata), GFP_KERNEL);
|
||||
if (dd == NULL) {
|
||||
dev_err(_dev, "no memory for private data\n");
|
||||
dd = kzalloc(sizeof(*dd), GFP_KERNEL);
|
||||
if (!dd)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (res == NULL) {
|
||||
|
@@ -2646,6 +2646,7 @@ enum parport_pc_pci_cards {
|
||||
netmos_9901,
|
||||
netmos_9865,
|
||||
quatech_sppxp100,
|
||||
wch_ch382l,
|
||||
};
|
||||
|
||||
|
||||
@@ -2708,6 +2709,7 @@ static struct parport_pc_pci {
|
||||
/* netmos_9901 */ { 1, { { 0, -1 }, } },
|
||||
/* netmos_9865 */ { 1, { { 0, -1 }, } },
|
||||
/* quatech_sppxp100 */ { 1, { { 0, 1 }, } },
|
||||
/* wch_ch382l */ { 1, { { 2, -1 }, } },
|
||||
};
|
||||
|
||||
static const struct pci_device_id parport_pc_pci_tbl[] = {
|
||||
@@ -2797,6 +2799,8 @@ static const struct pci_device_id parport_pc_pci_tbl[] = {
|
||||
/* Quatech SPPXP-100 Parallel port PCI ExpressCard */
|
||||
{ PCI_VENDOR_ID_QUATECH, PCI_DEVICE_ID_QUATECH_SPPXP_100,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, quatech_sppxp100 },
|
||||
/* WCH CH382L PCI-E single parallel port card */
|
||||
{ 0x1c00, 0x3050, 0x1c00, 0x3050, 0, 0, wch_ch382l },
|
||||
{ 0, } /* terminate list */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, parport_pc_pci_tbl);
|
||||
|
@@ -1,30 +1,24 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Support for common PCI multi-I/O cards (which is most of them)
|
||||
*
|
||||
* Copyright (C) 2001 Tim Waugh <twaugh@redhat.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
*
|
||||
* Multi-function PCI cards are supposed to present separate logical
|
||||
* devices on the bus. A common thing to do seems to be to just use
|
||||
* one logical device with lots of base address registers for both
|
||||
* parallel ports and serial ports. This driver is for dealing with
|
||||
* that.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/parport.h>
|
||||
#include <linux/parport_pc.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <linux/8250_pci.h>
|
||||
|
||||
enum parport_pc_pci_cards {
|
||||
@@ -65,6 +59,7 @@ enum parport_pc_pci_cards {
|
||||
wch_ch353_1s1p,
|
||||
wch_ch353_2s1p,
|
||||
wch_ch382_2s1p,
|
||||
brainboxes_5s1p,
|
||||
sunix_2s1p,
|
||||
};
|
||||
|
||||
@@ -153,6 +148,7 @@ static struct parport_pc_pci cards[] = {
|
||||
/* wch_ch353_1s1p*/ { 1, { { 1, -1}, } },
|
||||
/* wch_ch353_2s1p*/ { 1, { { 2, -1}, } },
|
||||
/* wch_ch382_2s1p*/ { 1, { { 2, -1}, } },
|
||||
/* brainboxes_5s1p */ { 1, { { 3, -1 }, } },
|
||||
/* sunix_2s1p */ { 1, { { 3, -1 }, } },
|
||||
};
|
||||
|
||||
@@ -258,6 +254,10 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
|
||||
{ 0x4348, 0x7053, 0x4348, 0x3253, 0, 0, wch_ch353_2s1p},
|
||||
{ 0x1c00, 0x3250, 0x1c00, 0x3250, 0, 0, wch_ch382_2s1p},
|
||||
|
||||
/* BrainBoxes PX272/PX306 MIO card */
|
||||
{ PCI_VENDOR_ID_INTASHIELD, 0x4100,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, brainboxes_5s1p },
|
||||
|
||||
/*
|
||||
* More SUNIX variations. At least one of these has part number
|
||||
* '5079A but subdevice 0x102. That board reports 0x0708 as
|
||||
@@ -501,6 +501,12 @@ static struct pciserial_board pci_parport_serial_boards[] = {
|
||||
.uart_offset = 8,
|
||||
.first_offset = 0xC0,
|
||||
},
|
||||
[brainboxes_5s1p] = {
|
||||
.flags = FL_BASE2,
|
||||
.num_ports = 5,
|
||||
.base_baud = 921600,
|
||||
.uart_offset = 8,
|
||||
},
|
||||
[sunix_2s1p] = {
|
||||
.flags = FL_BASE0|FL_BASE_BARS,
|
||||
.num_ports = 2,
|
||||
@@ -524,12 +530,10 @@ static int serial_register(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
struct serial_private *serial;
|
||||
|
||||
board = &pci_parport_serial_boards[id->driver_data];
|
||||
|
||||
if (board->num_ports == 0)
|
||||
return 0;
|
||||
|
||||
serial = pciserial_init_ports(dev, board);
|
||||
|
||||
if (IS_ERR(serial))
|
||||
return PTR_ERR(serial);
|
||||
|
||||
@@ -558,10 +562,9 @@ static int parport_register(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
int irq;
|
||||
|
||||
if (priv->num_par == ARRAY_SIZE (priv->port)) {
|
||||
printk (KERN_WARNING
|
||||
"parport_serial: %s: only %zu parallel ports "
|
||||
"supported (%d reported)\n", pci_name (dev),
|
||||
ARRAY_SIZE(priv->port), card->numports);
|
||||
dev_warn(&dev->dev,
|
||||
"only %zu parallel ports supported (%d reported)\n",
|
||||
ARRAY_SIZE(priv->port), card->numports);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -577,12 +580,12 @@ static int parport_register(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
irq = dev->irq;
|
||||
if (irq == IRQ_NONE) {
|
||||
dev_dbg(&dev->dev,
|
||||
"PCI parallel port detected: I/O at %#lx(%#lx)\n",
|
||||
"PCI parallel port detected: I/O at %#lx(%#lx)\n",
|
||||
io_lo, io_hi);
|
||||
irq = PARPORT_IRQ_NONE;
|
||||
} else {
|
||||
dev_dbg(&dev->dev,
|
||||
"PCI parallel port detected: I/O at %#lx(%#lx), IRQ %d\n",
|
||||
"PCI parallel port detected: I/O at %#lx(%#lx), IRQ %d\n",
|
||||
io_lo, io_hi, irq);
|
||||
}
|
||||
port = parport_pc_probe_port (io_lo, io_hi, irq,
|
||||
@@ -605,28 +608,26 @@ static int parport_serial_pci_probe(struct pci_dev *dev,
|
||||
struct parport_serial_private *priv;
|
||||
int err;
|
||||
|
||||
priv = kzalloc (sizeof *priv, GFP_KERNEL);
|
||||
priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
pci_set_drvdata (dev, priv);
|
||||
|
||||
err = pci_enable_device (dev);
|
||||
if (err) {
|
||||
kfree (priv);
|
||||
err = pcim_enable_device(dev);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (parport_register (dev, id)) {
|
||||
kfree (priv);
|
||||
return -ENODEV;
|
||||
}
|
||||
err = parport_register(dev, id);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (serial_register (dev, id)) {
|
||||
err = serial_register(dev, id);
|
||||
if (err) {
|
||||
int i;
|
||||
for (i = 0; i < priv->num_par; i++)
|
||||
parport_pc_unregister_port (priv->port[i]);
|
||||
kfree (priv);
|
||||
return -ENODEV;
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -645,78 +646,47 @@ static void parport_serial_pci_remove(struct pci_dev *dev)
|
||||
for (i = 0; i < priv->num_par; i++)
|
||||
parport_pc_unregister_port (priv->port[i]);
|
||||
|
||||
kfree (priv);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int parport_serial_pci_suspend(struct pci_dev *dev, pm_message_t state)
|
||||
static int __maybe_unused parport_serial_pci_suspend(struct device *dev)
|
||||
{
|
||||
struct parport_serial_private *priv = pci_get_drvdata(dev);
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct parport_serial_private *priv = pci_get_drvdata(pdev);
|
||||
|
||||
if (priv->serial)
|
||||
pciserial_suspend_ports(priv->serial);
|
||||
|
||||
/* FIXME: What about parport? */
|
||||
|
||||
pci_save_state(dev);
|
||||
pci_set_power_state(dev, pci_choose_state(dev, state));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parport_serial_pci_resume(struct pci_dev *dev)
|
||||
static int __maybe_unused parport_serial_pci_resume(struct device *dev)
|
||||
{
|
||||
struct parport_serial_private *priv = pci_get_drvdata(dev);
|
||||
int err;
|
||||
|
||||
pci_set_power_state(dev, PCI_D0);
|
||||
pci_restore_state(dev);
|
||||
|
||||
/*
|
||||
* The device may have been disabled. Re-enable it.
|
||||
*/
|
||||
err = pci_enable_device(dev);
|
||||
if (err) {
|
||||
printk(KERN_ERR "parport_serial: %s: error enabling "
|
||||
"device for resume (%d)\n", pci_name(dev), err);
|
||||
return err;
|
||||
}
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct parport_serial_private *priv = pci_get_drvdata(pdev);
|
||||
|
||||
if (priv->serial)
|
||||
pciserial_resume_ports(priv->serial);
|
||||
|
||||
/* FIXME: What about parport? */
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(parport_serial_pm_ops,
|
||||
parport_serial_pci_suspend, parport_serial_pci_resume);
|
||||
|
||||
static struct pci_driver parport_serial_pci_driver = {
|
||||
.name = "parport_serial",
|
||||
.id_table = parport_serial_pci_tbl,
|
||||
.probe = parport_serial_pci_probe,
|
||||
.remove = parport_serial_pci_remove,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = parport_serial_pci_suspend,
|
||||
.resume = parport_serial_pci_resume,
|
||||
#endif
|
||||
.driver = {
|
||||
.pm = &parport_serial_pm_ops,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static int __init parport_serial_init (void)
|
||||
{
|
||||
return pci_register_driver (&parport_serial_pci_driver);
|
||||
}
|
||||
|
||||
static void __exit parport_serial_exit (void)
|
||||
{
|
||||
pci_unregister_driver (&parport_serial_pci_driver);
|
||||
return;
|
||||
}
|
||||
module_pci_driver(parport_serial_pci_driver);
|
||||
|
||||
MODULE_AUTHOR("Tim Waugh <twaugh@redhat.com>");
|
||||
MODULE_DESCRIPTION("Driver for common parallel+serial multi-I/O PCI cards");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(parport_serial_init);
|
||||
module_exit(parport_serial_exit);
|
||||
|
Reference in New Issue
Block a user