lkml.org 
[lkml]   [2016]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 5/7] mfd: intel_vuport: Add Intel virtual USB port MFD Driver
    Date
    Some Intel platforms have an USB port mux controlled by GPIOs.
    There's a single ACPI platform device that provides 1) USB ID
    extcon device; 2) USB vbus regulator device; and 3) USB port
    switch device. This MFD driver will split these 3 devices for
    their respective drivers.

    [baolu: removed .owner per platform_no_drv_owner.cocci]
    Suggested-by: David Cohen <david.a.cohen@linux.intel.com>
    Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
    Reviewed-by: Felipe Balbi <balbi@kernel.org>
    Acked-by: Lee Jones <lee.jones@linaro.org>
    ---
    drivers/mfd/Kconfig | 8 +++++
    drivers/mfd/Makefile | 1 +
    drivers/mfd/intel-vuport.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++
    3 files changed, 95 insertions(+)
    create mode 100644 drivers/mfd/intel-vuport.c

    diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
    index 1bcf601..94affb3 100644
    --- a/drivers/mfd/Kconfig
    +++ b/drivers/mfd/Kconfig
    @@ -1603,5 +1603,13 @@ config MFD_VEXPRESS_SYSREG
    System Registers are the platform configuration block
    on the ARM Ltd. Versatile Express board.

    +config MFD_INTEL_VUPORT
    + tristate "Intel virtual USB port controller"
    + select MFD_CORE
    + depends on X86 && ACPI
    + help
    + Say Y here to enable support for Intel's dual role port mux
    + controlled by GPIOs.
    +
    endmenu
    endif
    diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
    index 42a66e1..b86d4f9 100644
    --- a/drivers/mfd/Makefile
    +++ b/drivers/mfd/Makefile
    @@ -205,3 +205,4 @@ intel-soc-pmic-objs := intel_soc_pmic_core.o intel_soc_pmic_crc.o
    intel-soc-pmic-$(CONFIG_INTEL_PMC_IPC) += intel_soc_pmic_bxtwc.o
    obj-$(CONFIG_INTEL_SOC_PMIC) += intel-soc-pmic.o
    obj-$(CONFIG_MFD_MT6397) += mt6397-core.o
    +obj-$(CONFIG_MFD_INTEL_VUPORT) += intel-vuport.o
    diff --git a/drivers/mfd/intel-vuport.c b/drivers/mfd/intel-vuport.c
    new file mode 100644
    index 0000000..eb27a8f
    --- /dev/null
    +++ b/drivers/mfd/intel-vuport.c
    @@ -0,0 +1,86 @@
    +/*
    + * MFD driver for Intel virtual USB port
    + *
    + * Copyright(c) 2016 Intel Corporation.
    + * Author: Lu Baolu <baolu.lu@linux.intel.com>
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU General Public License version 2 as
    + * published by the Free Software Foundation.
    + */
    +
    +#include <linux/acpi.h>
    +#include <linux/module.h>
    +#include <linux/gpio.h>
    +#include <linux/mfd/core.h>
    +#include <linux/property.h>
    +#include <linux/platform_device.h>
    +
    +/* ACPI GPIO Mappings */
    +static const struct acpi_gpio_params id_gpio = { 0, 0, false };
    +static const struct acpi_gpio_params vbus_gpio = { 1, 0, false };
    +static const struct acpi_gpio_params mux_gpio = { 2, 0, false };
    +static const struct acpi_gpio_mapping acpi_usb_gpios[] = {
    + { "id-gpios", &id_gpio, 1 },
    + { "gpio-gpios", &vbus_gpio, 1 },
    + { "usb_mux-gpios", &mux_gpio, 1 },
    + { },
    +};
    +
    +static struct property_entry reg_properties[] = {
    + PROPERTY_ENTRY_STRING("supply-name", "regulator-usb-gpio"),
    + { },
    +};
    +
    +static const struct mfd_cell intel_vuport_mfd_cells[] = {
    + { .name = "extcon-usb-gpio", },
    + {
    + .name = "reg-fixed-voltage",
    + .properties = reg_properties,
    + },
    + { .name = "intel-mux-gpio", },
    +};
    +
    +static int vuport_probe(struct platform_device *pdev)
    +{
    + struct device *dev = &pdev->dev;
    + int ret;
    +
    + ret = acpi_dev_add_driver_gpios(ACPI_COMPANION(dev), acpi_usb_gpios);
    + if (ret)
    + return ret;
    +
    + return mfd_add_devices(&pdev->dev, PLATFORM_DEVID_NONE,
    + intel_vuport_mfd_cells,
    + ARRAY_SIZE(intel_vuport_mfd_cells), NULL, 0,
    + NULL);
    +}
    +
    +static int vuport_remove(struct platform_device *pdev)
    +{
    + mfd_remove_devices(&pdev->dev);
    + acpi_dev_remove_driver_gpios(ACPI_COMPANION(&pdev->dev));
    +
    + return 0;
    +}
    +
    +static struct acpi_device_id vuport_acpi_match[] = {
    + { "INT3496" },
    + { }
    +};
    +MODULE_DEVICE_TABLE(acpi, vuport_acpi_match);
    +
    +static struct platform_driver vuport_driver = {
    + .driver = {
    + .name = "intel-vuport",
    + .acpi_match_table = ACPI_PTR(vuport_acpi_match),
    + },
    + .probe = vuport_probe,
    + .remove = vuport_remove,
    +};
    +
    +module_platform_driver(vuport_driver);
    +
    +MODULE_AUTHOR("Lu Baolu <baolu.lu@linux.intel.com>");
    +MODULE_DESCRIPTION("Intel virtual USB port");
    +MODULE_LICENSE("GPL v2");
    --
    2.1.4
    \
     
     \ /
      Last update: 2016-05-30 08:21    [W:7.335 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site