Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0dc82fa5 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull char/misc driver fixes from Greg KH:
 "A smattering of different small fixes for some random driver
  subsystems. Nothing all that major, just resolutions for reported
  issues and bugs.

  All have been in linux-next with no reported issues"

* tag 'char-misc-4.11-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (21 commits)
  extcon: int3496: Set the id pin to direction-input if necessary
  extcon: int3496: Use gpiod_get instead of gpiod_get_index
  extcon: int3496: Add dependency on X86 as it's Intel specific
  extcon: int3496: Add GPIO ACPI mapping table
  extcon: int3496: Rename GPIO pins in accordance with binding
  vmw_vmci: handle the return value from pci_alloc_irq_vectors correctly
  ppdev: fix registering same device name
  parport: fix attempt to write duplicate procfiles
  auxdisplay: img-ascii-lcd: add missing sentinel entry in img_ascii_lcd_matches
  Drivers: hv: vmbus: Don't leak memory when a channel is rescinded
  Drivers: hv: vmbus: Don't leak channel ids
  Drivers: hv: util: don't forget to init host_ts.lock
  Drivers: hv: util: move waiting for release to hv_utils_transport itself
  vmbus: remove hv_event_tasklet_disable/enable
  vmbus: use rcu for per-cpu channel list
  mei: don't wait for os version message reply
  mei: fix deadlock on mei reset
  intel_th: pci: Add Gemini Lake support
  intel_th: pci: Add Denverton SOC support
  intel_th: Don't leak module refcount on failure to activate
  ...
parents 9e54ef9d 5c1724c4
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -20,3 +20,8 @@ Index 1: The output gpio for enabling Vbus output from the device to the otg
Index 2: The output gpio for muxing of the data pins between the USB host and
Index 2: The output gpio for muxing of the data pins between the USB host and
         the USB peripheral controller, write 1 to mux to the peripheral
         the USB peripheral controller, write 1 to mux to the peripheral
         controller
         controller

There is a mapping between indices and GPIO connection IDs as follows
	id	index 0
	vbus	index 1
	mux	index 2
+1 −0
Original line number Original line Diff line number Diff line
@@ -218,6 +218,7 @@ static const struct of_device_id img_ascii_lcd_matches[] = {
	{ .compatible = "img,boston-lcd", .data = &boston_config },
	{ .compatible = "img,boston-lcd", .data = &boston_config },
	{ .compatible = "mti,malta-lcd", .data = &malta_config },
	{ .compatible = "mti,malta-lcd", .data = &malta_config },
	{ .compatible = "mti,sead3-lcd", .data = &sead3_config },
	{ .compatible = "mti,sead3-lcd", .data = &sead3_config },
	{ /* sentinel */ }
};
};


/**
/**
+9 −2
Original line number Original line Diff line number Diff line
@@ -84,11 +84,14 @@ struct pp_struct {
	struct ieee1284_info state;
	struct ieee1284_info state;
	struct ieee1284_info saved_state;
	struct ieee1284_info saved_state;
	long default_inactivity;
	long default_inactivity;
	int index;
};
};


/* should we use PARDEVICE_MAX here? */
/* should we use PARDEVICE_MAX here? */
static struct device *devices[PARPORT_MAX];
static struct device *devices[PARPORT_MAX];


static DEFINE_IDA(ida_index);

/* pp_struct.flags bitfields */
/* pp_struct.flags bitfields */
#define PP_CLAIMED    (1<<0)
#define PP_CLAIMED    (1<<0)
#define PP_EXCL       (1<<1)
#define PP_EXCL       (1<<1)
@@ -290,7 +293,7 @@ static int register_device(int minor, struct pp_struct *pp)
	struct pardevice *pdev = NULL;
	struct pardevice *pdev = NULL;
	char *name;
	char *name;
	struct pardev_cb ppdev_cb;
	struct pardev_cb ppdev_cb;
	int rc = 0;
	int rc = 0, index;


	name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
	name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor);
	if (name == NULL)
	if (name == NULL)
@@ -303,20 +306,23 @@ static int register_device(int minor, struct pp_struct *pp)
		goto err;
		goto err;
	}
	}


	index = ida_simple_get(&ida_index, 0, 0, GFP_KERNEL);
	memset(&ppdev_cb, 0, sizeof(ppdev_cb));
	memset(&ppdev_cb, 0, sizeof(ppdev_cb));
	ppdev_cb.irq_func = pp_irq;
	ppdev_cb.irq_func = pp_irq;
	ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
	ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0;
	ppdev_cb.private = pp;
	ppdev_cb.private = pp;
	pdev = parport_register_dev_model(port, name, &ppdev_cb, minor);
	pdev = parport_register_dev_model(port, name, &ppdev_cb, index);
	parport_put_port(port);
	parport_put_port(port);


	if (!pdev) {
	if (!pdev) {
		pr_warn("%s: failed to register device!\n", name);
		pr_warn("%s: failed to register device!\n", name);
		rc = -ENXIO;
		rc = -ENXIO;
		ida_simple_remove(&ida_index, index);
		goto err;
		goto err;
	}
	}


	pp->pdev = pdev;
	pp->pdev = pdev;
	pp->index = index;
	dev_dbg(&pdev->dev, "registered pardevice\n");
	dev_dbg(&pdev->dev, "registered pardevice\n");
err:
err:
	kfree(name);
	kfree(name);
@@ -755,6 +761,7 @@ static int pp_release(struct inode *inode, struct file *file)


	if (pp->pdev) {
	if (pp->pdev) {
		parport_unregister_device(pp->pdev);
		parport_unregister_device(pp->pdev);
		ida_simple_remove(&ida_index, pp->index);
		pp->pdev = NULL;
		pp->pdev = NULL;
		pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
		pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
	}
	}
+1 −1
Original line number Original line Diff line number Diff line
@@ -44,7 +44,7 @@ config EXTCON_GPIO


config EXTCON_INTEL_INT3496
config EXTCON_INTEL_INT3496
	tristate "Intel INT3496 ACPI device extcon driver"
	tristate "Intel INT3496 ACPI device extcon driver"
	depends on GPIOLIB && ACPI
	depends on GPIOLIB && ACPI && (X86 || COMPILE_TEST)
	help
	help
	  Say Y here to enable extcon support for USB OTG ports controlled by
	  Say Y here to enable extcon support for USB OTG ports controlled by
	  an Intel INT3496 ACPI device.
	  an Intel INT3496 ACPI device.
+28 −11
Original line number Original line Diff line number Diff line
@@ -45,6 +45,17 @@ static const unsigned int int3496_cable[] = {
	EXTCON_NONE,
	EXTCON_NONE,
};
};


static const struct acpi_gpio_params id_gpios = { INT3496_GPIO_USB_ID, 0, false };
static const struct acpi_gpio_params vbus_gpios = { INT3496_GPIO_VBUS_EN, 0, false };
static const struct acpi_gpio_params mux_gpios = { INT3496_GPIO_USB_MUX, 0, false };

static const struct acpi_gpio_mapping acpi_int3496_default_gpios[] = {
	{ "id-gpios", &id_gpios, 1 },
	{ "vbus-gpios", &vbus_gpios, 1 },
	{ "mux-gpios", &mux_gpios, 1 },
	{ },
};

static void int3496_do_usb_id(struct work_struct *work)
static void int3496_do_usb_id(struct work_struct *work)
{
{
	struct int3496_data *data =
	struct int3496_data *data =
@@ -83,6 +94,13 @@ static int int3496_probe(struct platform_device *pdev)
	struct int3496_data *data;
	struct int3496_data *data;
	int ret;
	int ret;


	ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev),
					acpi_int3496_default_gpios);
	if (ret) {
		dev_err(dev, "can't add GPIO ACPI mapping\n");
		return ret;
	}

	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
	data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
	if (!data)
	if (!data)
		return -ENOMEM;
		return -ENOMEM;
@@ -90,30 +108,27 @@ static int int3496_probe(struct platform_device *pdev)
	data->dev = dev;
	data->dev = dev;
	INIT_DELAYED_WORK(&data->work, int3496_do_usb_id);
	INIT_DELAYED_WORK(&data->work, int3496_do_usb_id);


	data->gpio_usb_id = devm_gpiod_get_index(dev, "id",
	data->gpio_usb_id = devm_gpiod_get(dev, "id", GPIOD_IN);
						INT3496_GPIO_USB_ID,
						GPIOD_IN);
	if (IS_ERR(data->gpio_usb_id)) {
	if (IS_ERR(data->gpio_usb_id)) {
		ret = PTR_ERR(data->gpio_usb_id);
		ret = PTR_ERR(data->gpio_usb_id);
		dev_err(dev, "can't request USB ID GPIO: %d\n", ret);
		dev_err(dev, "can't request USB ID GPIO: %d\n", ret);
		return ret;
		return ret;
	} else if (gpiod_get_direction(data->gpio_usb_id) != GPIOF_DIR_IN) {
		dev_warn(dev, FW_BUG "USB ID GPIO not in input mode, fixing\n");
		gpiod_direction_input(data->gpio_usb_id);
	}
	}


	data->usb_id_irq = gpiod_to_irq(data->gpio_usb_id);
	data->usb_id_irq = gpiod_to_irq(data->gpio_usb_id);
	if (data->usb_id_irq <= 0) {
	if (data->usb_id_irq < 0) {
		dev_err(dev, "can't get USB ID IRQ: %d\n", data->usb_id_irq);
		dev_err(dev, "can't get USB ID IRQ: %d\n", data->usb_id_irq);
		return -EINVAL;
		return data->usb_id_irq;
	}
	}


	data->gpio_vbus_en = devm_gpiod_get_index(dev, "vbus en",
	data->gpio_vbus_en = devm_gpiod_get(dev, "vbus", GPIOD_ASIS);
						 INT3496_GPIO_VBUS_EN,
						 GPIOD_ASIS);
	if (IS_ERR(data->gpio_vbus_en))
	if (IS_ERR(data->gpio_vbus_en))
		dev_info(dev, "can't request VBUS EN GPIO\n");
		dev_info(dev, "can't request VBUS EN GPIO\n");


	data->gpio_usb_mux = devm_gpiod_get_index(dev, "usb mux",
	data->gpio_usb_mux = devm_gpiod_get(dev, "mux", GPIOD_ASIS);
						 INT3496_GPIO_USB_MUX,
						 GPIOD_ASIS);
	if (IS_ERR(data->gpio_usb_mux))
	if (IS_ERR(data->gpio_usb_mux))
		dev_info(dev, "can't request USB MUX GPIO\n");
		dev_info(dev, "can't request USB MUX GPIO\n");


@@ -154,6 +169,8 @@ static int int3496_remove(struct platform_device *pdev)
	devm_free_irq(&pdev->dev, data->usb_id_irq, data);
	devm_free_irq(&pdev->dev, data->usb_id_irq, data);
	cancel_delayed_work_sync(&data->work);
	cancel_delayed_work_sync(&data->work);


	acpi_dev_remove_driver_gpios(ACPI_COMPANION(&pdev->dev));

	return 0;
	return 0;
}
}


Loading