All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chunfeng Yun <chunfeng.yun@mediatek.com>
To: Yu Chen <chenyu56@huawei.com>
Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, john.stultz@linaro.org,
	suzhuangluan@hisilicon.com, kongfei@hisilicon.com,
	liuyu712@hisilicon.com, wanghu17@hisilicon.com,
	butao@hisilicon.com, chenyao11@huawei.com,
	fangshengzhou@hisilicon.com, lipengcheng8@huawei.com,
	songxiaowei@hisilicon.com, xuyiping@hisilicon.com,
	xuyoujun4@huawei.com, yudongbin@hisilicon.com,
	zangleigang@hisilicon.com,
	Andy Shevchenko <andy.shevchenko@gmail.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Binghui Wang <wangbinghui@hisilicon.com>,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>
Subject: [v3,10/12] hikey960: Support usb functionality of Hikey960
Date: Mon, 4 Mar 2019 09:47:49 +0800	[thread overview]
Message-ID: <1551664069.2210.64.camel@mhfsdcap03> (raw)

hi,
On Sat, 2019-03-02 at 17:05 +0800, Yu Chen wrote:
> This driver handles usb hub power on and typeC port event of HiKey960 board:
> 1)DP&DM switching between usb hub and typeC port base on typeC port
> state
> 2)Control power of usb hub on Hikey960
> 3)Control vbus of typeC port
> 
> Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
> Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> ---
> v1:
> * Using gpiod API with the gpios.
> * Removing registering usb role switch.
> * Registering usb role switch notifier.
> v2:
> * Fix license declaration.
> * Add configuration of  gpio direction.
> * Remove some log print.
> v3:
> * Remove property of "typec_vbus_enable_val".
> * Remove gpiod_direction_output and set initial value of gpio by devm_gpiod_get.
> ---
> ---
>  drivers/misc/Kconfig          |   6 ++
>  drivers/misc/Makefile         |   1 +
>  drivers/misc/hisi_hikey_usb.c | 167 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 174 insertions(+)
>  create mode 100644 drivers/misc/hisi_hikey_usb.c
> 
> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> index f417b06e11c5..8d8b717759e2 100644
> --- a/drivers/misc/Kconfig
> +++ b/drivers/misc/Kconfig
> @@ -521,6 +521,12 @@ config PVPANIC
>  	  a paravirtualized device provided by QEMU; it lets a virtual machine
>  	  (guest) communicate panic events to the host.
>  
> +config HISI_HIKEY_USB
> +	tristate "USB functionality of HiSilicon Hikey Platform"
> +	depends on OF && GPIOLIB
> +	help
> +	  If you say yes here you get support for usb functionality of HiSilicon Hikey Platform.
> +
>  source "drivers/misc/c2port/Kconfig"
>  source "drivers/misc/eeprom/Kconfig"
>  source "drivers/misc/cb710/Kconfig"
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index e39ccbbc1b3a..dc8892b13a1a 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -59,3 +59,4 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
>  obj-$(CONFIG_OCXL)		+= ocxl/
>  obj-y				+= cardreader/
>  obj-$(CONFIG_PVPANIC)   	+= pvpanic.o
> +obj-$(CONFIG_HISI_HIKEY_USB)	+= hisi_hikey_usb.o
> diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c
> new file mode 100644
> index 000000000000..85d6fee468c0
> --- /dev/null
> +++ b/drivers/misc/hisi_hikey_usb.c
> @@ -0,0 +1,167 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Support for usb functionality of Hikey series boards
> + * based on Hisilicon Kirin Soc.
> + *
> + * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd.
> + *		http://www.huawei.com
> + *
> + * Authors: Yu Chen <chenyu56@huawei.com>
> + */
> +
> +#include <linux/gpio/consumer.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/usb/role.h>
> +
> +#define DEVICE_DRIVER_NAME "hisi_hikey_usb"
> +
> +#define HUB_VBUS_POWER_ON 1
> +#define HUB_VBUS_POWER_OFF 0
> +#define USB_SWITCH_TO_HUB 1
> +#define USB_SWITCH_TO_TYPEC 0
> +#define TYPEC_VBUS_POWER_ON 1
> +#define TYPEC_VBUS_POWER_OFF 0
> +
> +struct hisi_hikey_usb {
> +	struct gpio_desc *otg_switch;
> +	struct gpio_desc *typec_vbus;
> +	struct gpio_desc *hub_vbus;
> +
> +	struct usb_role_switch *role_sw;
> +	struct notifier_block nb;
> +};
> +
> +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value);
> +}
> +
> +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int switch_to)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to);
> +}
> +
> +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value);
> +}
> +
> +static int hisi_hikey_role_switch(struct notifier_block *nb,
> +			unsigned long state, void *data)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +
> +	hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb);
> +
> +	switch (state) {
> +	case USB_ROLE_NONE:
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB);
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON);
> +		break;
> +	case USB_ROLE_HOST:
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_ON);
> +		break;
> +	case USB_ROLE_DEVICE:
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return 0;
> +}
> +
> +static int hisi_hikey_usb_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *root = dev->of_node;
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +	int ret;
> +
> +	hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL);
> +	if (!hisi_hikey_usb)
> +		return -ENOMEM;
> +
> +	hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch;
> +
> +	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
> +			GPIOD_OUT_LOW);
> +	if (!hisi_hikey_usb->typec_vbus)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
> +		return PTR_ERR(hisi_hikey_usb->typec_vbus);
> +
> +	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch",
> +			GPIOD_OUT_HIGH);
> +	if (!hisi_hikey_usb->otg_switch)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->otg_switch))
> +		return PTR_ERR(hisi_hikey_usb->otg_switch);
> +
> +	/* hub-vdd33-en is optional */
> +	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
> +			GPIOD_OUT_HIGH);
> +	if (IS_ERR(hisi_hikey_usb->hub_vbus))
> +		return PTR_ERR(hisi_hikey_usb->hub_vbus);
> +
> +	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
> +	if (!hisi_hikey_usb->role_sw)
> +		return -EPROBE_DEFER;
Here return EPROBE_DEFFER means the related device_connection is
registered after this probe is called, right?
if not, use IS_ERR_OR_NULL then return PTR_ERR is enough
> +	else if (IS_ERR(hisi_hikey_usb->role_sw))
> +		return PTR_ERR(hisi_hikey_usb->role_sw);
> +
> +	ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +	if (ret) {
> +		usb_role_switch_put(hisi_hikey_usb->role_sw);
> +		return ret;
> +	}
> +
> +	platform_set_drvdata(pdev, hisi_hikey_usb);
> +
> +	return 0;
> +}
> +
> +static int  hisi_hikey_usb_remove(struct platform_device *pdev)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev);
> +
> +	usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +
> +	usb_role_switch_put(hisi_hikey_usb->role_sw);
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id id_table_hisi_hikey_usb[] = {
> +	{.compatible = "hisilicon,gpio_hubv1"},
> +	{.compatible = "hisilicon,hikey960_usb"},
> +	{}
> +};
> +
> +static struct platform_driver hisi_hikey_usb_driver = {
> +	.probe = hisi_hikey_usb_probe,
> +	.remove = hisi_hikey_usb_remove,
> +	.driver = {
> +		.name = DEVICE_DRIVER_NAME,
> +		.of_match_table = id_table_hisi_hikey_usb,
> +	},
> +};
> +
> +module_platform_driver(hisi_hikey_usb_driver);
> +
> +MODULE_AUTHOR("Yu Chen <chenyu56@huawei.com>");
> +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey");
> +MODULE_LICENSE("GPL v2");

WARNING: multiple messages have this Message-ID (diff)
From: Chunfeng Yun <chunfeng.yun@mediatek.com>
To: Yu Chen <chenyu56@huawei.com>
Cc: linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, john.stultz@linaro.org,
	suzhuangluan@hisilicon.com, kongfei@hisilicon.com,
	liuyu712@hisilicon.com, wanghu17@hisilicon.com,
	butao@hisilicon.com, chenyao11@huawei.com,
	fangshengzhou@hisilicon.com, lipengcheng8@huawei.com,
	songxiaowei@hisilicon.com, xuyiping@hisilicon.com,
	xuyoujun4@huawei.com, yudongbin@hisilicon.com,
	zangleigang@hisilicon.com,
	Andy Shevchenko <andy.shevchenko@gmail.com>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Binghui Wang <wangbinghui@hisilicon.com>,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>
Subject: Re: [PATCH v3 10/12] hikey960: Support usb functionality of Hikey960
Date: Mon, 4 Mar 2019 09:47:49 +0800	[thread overview]
Message-ID: <1551664069.2210.64.camel@mhfsdcap03> (raw)
In-Reply-To: <20190302090505.65542-11-chenyu56@huawei.com>

hi,
On Sat, 2019-03-02 at 17:05 +0800, Yu Chen wrote:
> This driver handles usb hub power on and typeC port event of HiKey960 board:
> 1)DP&DM switching between usb hub and typeC port base on typeC port
> state
> 2)Control power of usb hub on Hikey960
> 3)Control vbus of typeC port
> 
> Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
> Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> ---
> v1:
> * Using gpiod API with the gpios.
> * Removing registering usb role switch.
> * Registering usb role switch notifier.
> v2:
> * Fix license declaration.
> * Add configuration of  gpio direction.
> * Remove some log print.
> v3:
> * Remove property of "typec_vbus_enable_val".
> * Remove gpiod_direction_output and set initial value of gpio by devm_gpiod_get.
> ---
> ---
>  drivers/misc/Kconfig          |   6 ++
>  drivers/misc/Makefile         |   1 +
>  drivers/misc/hisi_hikey_usb.c | 167 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 174 insertions(+)
>  create mode 100644 drivers/misc/hisi_hikey_usb.c
> 
> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> index f417b06e11c5..8d8b717759e2 100644
> --- a/drivers/misc/Kconfig
> +++ b/drivers/misc/Kconfig
> @@ -521,6 +521,12 @@ config PVPANIC
>  	  a paravirtualized device provided by QEMU; it lets a virtual machine
>  	  (guest) communicate panic events to the host.
>  
> +config HISI_HIKEY_USB
> +	tristate "USB functionality of HiSilicon Hikey Platform"
> +	depends on OF && GPIOLIB
> +	help
> +	  If you say yes here you get support for usb functionality of HiSilicon Hikey Platform.
> +
>  source "drivers/misc/c2port/Kconfig"
>  source "drivers/misc/eeprom/Kconfig"
>  source "drivers/misc/cb710/Kconfig"
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index e39ccbbc1b3a..dc8892b13a1a 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -59,3 +59,4 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
>  obj-$(CONFIG_OCXL)		+= ocxl/
>  obj-y				+= cardreader/
>  obj-$(CONFIG_PVPANIC)   	+= pvpanic.o
> +obj-$(CONFIG_HISI_HIKEY_USB)	+= hisi_hikey_usb.o
> diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c
> new file mode 100644
> index 000000000000..85d6fee468c0
> --- /dev/null
> +++ b/drivers/misc/hisi_hikey_usb.c
> @@ -0,0 +1,167 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Support for usb functionality of Hikey series boards
> + * based on Hisilicon Kirin Soc.
> + *
> + * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd.
> + *		http://www.huawei.com
> + *
> + * Authors: Yu Chen <chenyu56@huawei.com>
> + */
> +
> +#include <linux/gpio/consumer.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/usb/role.h>
> +
> +#define DEVICE_DRIVER_NAME "hisi_hikey_usb"
> +
> +#define HUB_VBUS_POWER_ON 1
> +#define HUB_VBUS_POWER_OFF 0
> +#define USB_SWITCH_TO_HUB 1
> +#define USB_SWITCH_TO_TYPEC 0
> +#define TYPEC_VBUS_POWER_ON 1
> +#define TYPEC_VBUS_POWER_OFF 0
> +
> +struct hisi_hikey_usb {
> +	struct gpio_desc *otg_switch;
> +	struct gpio_desc *typec_vbus;
> +	struct gpio_desc *hub_vbus;
> +
> +	struct usb_role_switch *role_sw;
> +	struct notifier_block nb;
> +};
> +
> +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value);
> +}
> +
> +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int switch_to)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to);
> +}
> +
> +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value);
> +}
> +
> +static int hisi_hikey_role_switch(struct notifier_block *nb,
> +			unsigned long state, void *data)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +
> +	hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb);
> +
> +	switch (state) {
> +	case USB_ROLE_NONE:
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB);
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON);
> +		break;
> +	case USB_ROLE_HOST:
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_ON);
> +		break;
> +	case USB_ROLE_DEVICE:
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return 0;
> +}
> +
> +static int hisi_hikey_usb_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *root = dev->of_node;
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +	int ret;
> +
> +	hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL);
> +	if (!hisi_hikey_usb)
> +		return -ENOMEM;
> +
> +	hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch;
> +
> +	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
> +			GPIOD_OUT_LOW);
> +	if (!hisi_hikey_usb->typec_vbus)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
> +		return PTR_ERR(hisi_hikey_usb->typec_vbus);
> +
> +	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch",
> +			GPIOD_OUT_HIGH);
> +	if (!hisi_hikey_usb->otg_switch)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->otg_switch))
> +		return PTR_ERR(hisi_hikey_usb->otg_switch);
> +
> +	/* hub-vdd33-en is optional */
> +	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
> +			GPIOD_OUT_HIGH);
> +	if (IS_ERR(hisi_hikey_usb->hub_vbus))
> +		return PTR_ERR(hisi_hikey_usb->hub_vbus);
> +
> +	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
> +	if (!hisi_hikey_usb->role_sw)
> +		return -EPROBE_DEFER;
Here return EPROBE_DEFFER means the related device_connection is
registered after this probe is called, right?
if not, use IS_ERR_OR_NULL then return PTR_ERR is enough
> +	else if (IS_ERR(hisi_hikey_usb->role_sw))
> +		return PTR_ERR(hisi_hikey_usb->role_sw);
> +
> +	ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +	if (ret) {
> +		usb_role_switch_put(hisi_hikey_usb->role_sw);
> +		return ret;
> +	}
> +
> +	platform_set_drvdata(pdev, hisi_hikey_usb);
> +
> +	return 0;
> +}
> +
> +static int  hisi_hikey_usb_remove(struct platform_device *pdev)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev);
> +
> +	usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +
> +	usb_role_switch_put(hisi_hikey_usb->role_sw);
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id id_table_hisi_hikey_usb[] = {
> +	{.compatible = "hisilicon,gpio_hubv1"},
> +	{.compatible = "hisilicon,hikey960_usb"},
> +	{}
> +};
> +
> +static struct platform_driver hisi_hikey_usb_driver = {
> +	.probe = hisi_hikey_usb_probe,
> +	.remove = hisi_hikey_usb_remove,
> +	.driver = {
> +		.name = DEVICE_DRIVER_NAME,
> +		.of_match_table = id_table_hisi_hikey_usb,
> +	},
> +};
> +
> +module_platform_driver(hisi_hikey_usb_driver);
> +
> +MODULE_AUTHOR("Yu Chen <chenyu56@huawei.com>");
> +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey");
> +MODULE_LICENSE("GPL v2");

WARNING: multiple messages have this Message-ID (diff)
From: Chunfeng Yun <chunfeng.yun@mediatek.com>
To: Yu Chen <chenyu56@huawei.com>
Cc: <linux-usb@vger.kernel.org>, <devicetree@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <john.stultz@linaro.org>,
	<suzhuangluan@hisilicon.com>, <kongfei@hisilicon.com>,
	<liuyu712@hisilicon.com>, <wanghu17@hisilicon.com>,
	<butao@hisilicon.com>, <chenyao11@huawei.com>,
	<fangshengzhou@hisilicon.com>, <lipengcheng8@huawei.com>,
	<songxiaowei@hisilicon.com>, <xuyiping@hisilicon.com>,
	<xuyoujun4@huawei.com>, <yudongbin@hisilicon.com>,
	<zangleigang@hisilicon.com>,
	Andy Shevchenko <andy.shevchenko@gmail.com>,
	Arnd Bergmann <arnd@arndb.de>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	Binghui Wang <wangbinghui@hisilicon.com>,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>
Subject: Re: [PATCH v3 10/12] hikey960: Support usb functionality of Hikey960
Date: Mon, 4 Mar 2019 09:47:49 +0800	[thread overview]
Message-ID: <1551664069.2210.64.camel@mhfsdcap03> (raw)
In-Reply-To: <20190302090505.65542-11-chenyu56@huawei.com>

hi,
On Sat, 2019-03-02 at 17:05 +0800, Yu Chen wrote:
> This driver handles usb hub power on and typeC port event of HiKey960 board:
> 1)DP&DM switching between usb hub and typeC port base on typeC port
> state
> 2)Control power of usb hub on Hikey960
> 3)Control vbus of typeC port
> 
> Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
> Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: John Stultz <john.stultz@linaro.org>
> Cc: Binghui Wang <wangbinghui@hisilicon.com>
> Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Signed-off-by: Yu Chen <chenyu56@huawei.com>
> ---
> v1:
> * Using gpiod API with the gpios.
> * Removing registering usb role switch.
> * Registering usb role switch notifier.
> v2:
> * Fix license declaration.
> * Add configuration of  gpio direction.
> * Remove some log print.
> v3:
> * Remove property of "typec_vbus_enable_val".
> * Remove gpiod_direction_output and set initial value of gpio by devm_gpiod_get.
> ---
> ---
>  drivers/misc/Kconfig          |   6 ++
>  drivers/misc/Makefile         |   1 +
>  drivers/misc/hisi_hikey_usb.c | 167 ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 174 insertions(+)
>  create mode 100644 drivers/misc/hisi_hikey_usb.c
> 
> diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
> index f417b06e11c5..8d8b717759e2 100644
> --- a/drivers/misc/Kconfig
> +++ b/drivers/misc/Kconfig
> @@ -521,6 +521,12 @@ config PVPANIC
>  	  a paravirtualized device provided by QEMU; it lets a virtual machine
>  	  (guest) communicate panic events to the host.
>  
> +config HISI_HIKEY_USB
> +	tristate "USB functionality of HiSilicon Hikey Platform"
> +	depends on OF && GPIOLIB
> +	help
> +	  If you say yes here you get support for usb functionality of HiSilicon Hikey Platform.
> +
>  source "drivers/misc/c2port/Kconfig"
>  source "drivers/misc/eeprom/Kconfig"
>  source "drivers/misc/cb710/Kconfig"
> diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
> index e39ccbbc1b3a..dc8892b13a1a 100644
> --- a/drivers/misc/Makefile
> +++ b/drivers/misc/Makefile
> @@ -59,3 +59,4 @@ obj-$(CONFIG_PCI_ENDPOINT_TEST)	+= pci_endpoint_test.o
>  obj-$(CONFIG_OCXL)		+= ocxl/
>  obj-y				+= cardreader/
>  obj-$(CONFIG_PVPANIC)   	+= pvpanic.o
> +obj-$(CONFIG_HISI_HIKEY_USB)	+= hisi_hikey_usb.o
> diff --git a/drivers/misc/hisi_hikey_usb.c b/drivers/misc/hisi_hikey_usb.c
> new file mode 100644
> index 000000000000..85d6fee468c0
> --- /dev/null
> +++ b/drivers/misc/hisi_hikey_usb.c
> @@ -0,0 +1,167 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Support for usb functionality of Hikey series boards
> + * based on Hisilicon Kirin Soc.
> + *
> + * Copyright (C) 2017-2018 Hilisicon Electronics Co., Ltd.
> + *		http://www.huawei.com
> + *
> + * Authors: Yu Chen <chenyu56@huawei.com>
> + */
> +
> +#include <linux/gpio/consumer.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/slab.h>
> +#include <linux/usb/role.h>
> +
> +#define DEVICE_DRIVER_NAME "hisi_hikey_usb"
> +
> +#define HUB_VBUS_POWER_ON 1
> +#define HUB_VBUS_POWER_OFF 0
> +#define USB_SWITCH_TO_HUB 1
> +#define USB_SWITCH_TO_TYPEC 0
> +#define TYPEC_VBUS_POWER_ON 1
> +#define TYPEC_VBUS_POWER_OFF 0
> +
> +struct hisi_hikey_usb {
> +	struct gpio_desc *otg_switch;
> +	struct gpio_desc *typec_vbus;
> +	struct gpio_desc *hub_vbus;
> +
> +	struct usb_role_switch *role_sw;
> +	struct notifier_block nb;
> +};
> +
> +static void hub_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb, int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->hub_vbus, value);
> +}
> +
> +static void usb_switch_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int switch_to)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->otg_switch, switch_to);
> +}
> +
> +static void usb_typec_power_ctrl(struct hisi_hikey_usb *hisi_hikey_usb,
> +		int value)
> +{
> +	gpiod_set_value_cansleep(hisi_hikey_usb->typec_vbus, value);
> +}
> +
> +static int hisi_hikey_role_switch(struct notifier_block *nb,
> +			unsigned long state, void *data)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +
> +	hisi_hikey_usb = container_of(nb, struct hisi_hikey_usb, nb);
> +
> +	switch (state) {
> +	case USB_ROLE_NONE:
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_HUB);
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_ON);
> +		break;
> +	case USB_ROLE_HOST:
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_ON);
> +		break;
> +	case USB_ROLE_DEVICE:
> +		hub_power_ctrl(hisi_hikey_usb, HUB_VBUS_POWER_OFF);
> +		usb_typec_power_ctrl(hisi_hikey_usb, TYPEC_VBUS_POWER_OFF);
> +		usb_switch_ctrl(hisi_hikey_usb, USB_SWITCH_TO_TYPEC);
> +		break;
> +	default:
> +		break;
> +	}
> +
> +	return 0;
> +}
> +
> +static int hisi_hikey_usb_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device_node *root = dev->of_node;
> +	struct hisi_hikey_usb *hisi_hikey_usb;
> +	int ret;
> +
> +	hisi_hikey_usb = devm_kzalloc(dev, sizeof(*hisi_hikey_usb), GFP_KERNEL);
> +	if (!hisi_hikey_usb)
> +		return -ENOMEM;
> +
> +	hisi_hikey_usb->nb.notifier_call = hisi_hikey_role_switch;
> +
> +	hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
> +			GPIOD_OUT_LOW);
> +	if (!hisi_hikey_usb->typec_vbus)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->typec_vbus))
> +		return PTR_ERR(hisi_hikey_usb->typec_vbus);
> +
> +	hisi_hikey_usb->otg_switch = devm_gpiod_get(dev, "otg-switch",
> +			GPIOD_OUT_HIGH);
> +	if (!hisi_hikey_usb->otg_switch)
> +		return -ENOENT;
> +	else if (IS_ERR(hisi_hikey_usb->otg_switch))
> +		return PTR_ERR(hisi_hikey_usb->otg_switch);
> +
> +	/* hub-vdd33-en is optional */
> +	hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
> +			GPIOD_OUT_HIGH);
> +	if (IS_ERR(hisi_hikey_usb->hub_vbus))
> +		return PTR_ERR(hisi_hikey_usb->hub_vbus);
> +
> +	hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
> +	if (!hisi_hikey_usb->role_sw)
> +		return -EPROBE_DEFER;
Here return EPROBE_DEFFER means the related device_connection is
registered after this probe is called, right?
if not, use IS_ERR_OR_NULL then return PTR_ERR is enough
> +	else if (IS_ERR(hisi_hikey_usb->role_sw))
> +		return PTR_ERR(hisi_hikey_usb->role_sw);
> +
> +	ret = usb_role_switch_register_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +	if (ret) {
> +		usb_role_switch_put(hisi_hikey_usb->role_sw);
> +		return ret;
> +	}
> +
> +	platform_set_drvdata(pdev, hisi_hikey_usb);
> +
> +	return 0;
> +}
> +
> +static int  hisi_hikey_usb_remove(struct platform_device *pdev)
> +{
> +	struct hisi_hikey_usb *hisi_hikey_usb = platform_get_drvdata(pdev);
> +
> +	usb_role_switch_unregister_notifier(hisi_hikey_usb->role_sw,
> +			&hisi_hikey_usb->nb);
> +
> +	usb_role_switch_put(hisi_hikey_usb->role_sw);
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id id_table_hisi_hikey_usb[] = {
> +	{.compatible = "hisilicon,gpio_hubv1"},
> +	{.compatible = "hisilicon,hikey960_usb"},
> +	{}
> +};
> +
> +static struct platform_driver hisi_hikey_usb_driver = {
> +	.probe = hisi_hikey_usb_probe,
> +	.remove = hisi_hikey_usb_remove,
> +	.driver = {
> +		.name = DEVICE_DRIVER_NAME,
> +		.of_match_table = id_table_hisi_hikey_usb,
> +	},
> +};
> +
> +module_platform_driver(hisi_hikey_usb_driver);
> +
> +MODULE_AUTHOR("Yu Chen <chenyu56@huawei.com>");
> +MODULE_DESCRIPTION("Driver Support for USB functionality of Hikey");
> +MODULE_LICENSE("GPL v2");



             reply	other threads:[~2019-03-04  1:47 UTC|newest]

Thread overview: 94+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-04  1:47 Chunfeng Yun [this message]
2019-03-04  1:47 ` [PATCH v3 10/12] hikey960: Support usb functionality of Hikey960 Chunfeng Yun
2019-03-04  1:47 ` Chunfeng Yun
  -- strict thread matches above, loose matches on Subject: below --
2019-03-13 19:38 [v3,01/12] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY Rob Herring
2019-03-13 19:38 ` [PATCH v3 01/12] " Rob Herring
2019-03-13  1:40 [v3,01/12] " Yu Chen
2019-03-13  1:40 ` [PATCH v3 01/12] " Chen Yu
2019-03-13  1:40 ` Chen Yu
2019-03-12 13:45 [v3,01/12] " Rob Herring
2019-03-12 13:45 ` [PATCH v3 01/12] " Rob Herring
2019-03-05 13:22 [v3,09/12] usb: dwc3: Registering a role switch in the DRD code kbuild test robot
2019-03-05 13:22 ` [PATCH v3 09/12] " kbuild test robot
2019-03-05 13:22 ` kbuild test robot
2019-03-05  3:11 [v3,04/12] usb: dwc3: Add splitdisable quirk for Hisilicon Kirin Soc kbuild test robot
2019-03-05  3:11 ` [PATCH v3 04/12] " kbuild test robot
2019-03-05  3:11 ` kbuild test robot
2019-03-04 23:53 [v3,04/12] " kbuild test robot
2019-03-04 23:53 ` [PATCH v3 04/12] " kbuild test robot
2019-03-04 23:53 ` kbuild test robot
2019-03-04  7:31 [v3,10/12] hikey960: Support usb functionality of Hikey960 Yu Chen
2019-03-04  7:31 ` [PATCH v3 10/12] " Chen Yu
2019-03-04  7:31 ` Chen Yu
2019-03-04  6:58 [v3,10/12] " Chunfeng Yun
2019-03-04  6:58 ` [PATCH v3 10/12] " Chunfeng Yun
2019-03-04  6:58 ` Chunfeng Yun
2019-03-04  6:55 [v3,10/12] " Andy Shevchenko
2019-03-04  6:55 ` [PATCH v3 10/12] " Andy Shevchenko
2019-03-04  6:50 [v3,10/12] " Andy Shevchenko
2019-03-04  6:50 ` [PATCH v3 10/12] " Andy Shevchenko
2019-03-04  2:53 [v3,06/12] usb: dwc3: Increase timeout for CmdAct cleared by device controller Yu Chen
2019-03-04  2:53 ` //Re: [PATCH v3 06/12] " Chen Yu
2019-03-04  2:53 ` Chen Yu
2019-03-04  2:37 [v3,07/12] phy: Add usb phy support for hi3660 Soc of Hisilicon Yu Chen
2019-03-04  2:37 ` [PATCH v3 07/12] " Chen Yu
2019-03-04  2:37 ` Chen Yu
2019-03-04  2:35 [v3,10/12] hikey960: Support usb functionality of Hikey960 Yu Chen
2019-03-04  2:35 ` [PATCH v3 10/12] " Chen Yu
2019-03-04  2:35 ` Chen Yu
2019-03-04  1:55 [v3,10/12] " Yu Chen
2019-03-04  1:55 ` [PATCH v3 10/12] " Chen Yu
2019-03-04  1:55 ` Chen Yu
2019-03-04  1:27 [v3,10/12] " Yu Chen
2019-03-04  1:27 ` [PATCH v3 10/12] " Chen Yu
2019-03-04  1:27 ` Chen Yu
2019-03-03 20:17 [v3,10/12] " John Stultz
2019-03-03 20:17 ` [PATCH v3 10/12] " John Stultz
2019-03-03 20:17 ` John Stultz
2019-03-02 16:01 [v3,10/12] " Andy Shevchenko
2019-03-02 16:01 ` [PATCH v3 10/12] " Andy Shevchenko
2019-03-02 15:56 [v3,07/12] phy: Add usb phy support for hi3660 Soc of Hisilicon Andy Shevchenko
2019-03-02 15:56 ` [PATCH v3 07/12] " Andy Shevchenko
2019-03-02 15:56 ` Andy Shevchenko
2019-03-02 15:47 [v3,06/12] usb: dwc3: Increase timeout for CmdAct cleared by device controller Andy Shevchenko
2019-03-02 15:47 ` [PATCH v3 06/12] " Andy Shevchenko
2019-03-02  9:05 [v3,12/12] dts: hi3660: Add support for usb on Hikey960 Yu Chen
2019-03-02  9:05 ` [PATCH v3 12/12] " Yu Chen
2019-03-02  9:05 ` Yu Chen
2019-03-02  9:05 ` Yu Chen
2019-03-02  9:05 [v3,11/12] usb: gadget: Add configfs attribuite for controling match_existing_only Yu Chen
2019-03-02  9:05 ` [PATCH v3 11/12] " Yu Chen
2019-03-02  9:05 ` Yu Chen
2019-03-02  9:05 [v3,10/12] hikey960: Support usb functionality of Hikey960 Yu Chen
2019-03-02  9:05 ` [PATCH v3 10/12] " Yu Chen
2019-03-02  9:05 ` Yu Chen
2019-03-02  9:05 [v3,09/12] usb: dwc3: Registering a role switch in the DRD code Yu Chen
2019-03-02  9:05 ` [PATCH v3 09/12] " Yu Chen
2019-03-02  9:05 ` Yu Chen
2019-03-02  9:05 [v3,08/12] usb: roles: Add usb role switch notifier Yu Chen
2019-03-02  9:05 ` [PATCH v3 08/12] " Yu Chen
2019-03-02  9:05 ` Yu Chen
2019-03-02  9:05 [v3,07/12] phy: Add usb phy support for hi3660 Soc of Hisilicon Yu Chen
2019-03-02  9:05 ` [PATCH v3 07/12] " Yu Chen
2019-03-02  9:05 ` Yu Chen
2019-03-02  9:04 [v3,06/12] usb: dwc3: Increase timeout for CmdAct cleared by device controller Yu Chen
2019-03-02  9:04 ` [PATCH v3 06/12] " Yu Chen
2019-03-02  9:04 ` Yu Chen
2019-03-02  9:04 [v3,05/12] usb: dwc3: Execute GCTL Core Soft Reset while switch mdoe for Hisilicon Kirin Soc Yu Chen
2019-03-02  9:04 ` [PATCH v3 05/12] " Yu Chen
2019-03-02  9:04 ` Yu Chen
2019-03-02  9:04 [v3,04/12] usb: dwc3: Add splitdisable quirk " Yu Chen
2019-03-02  9:04 ` [PATCH v3 04/12] " Yu Chen
2019-03-02  9:04 ` Yu Chen
2019-03-02  9:04 [v3,03/12] usb: dwc3: dwc3-of-simple: Add support for dwc3 of Hisilicon Soc Platform Yu Chen
2019-03-02  9:04 ` [PATCH v3 03/12] " Yu Chen
2019-03-02  9:04 ` Yu Chen
2019-03-02  9:04 [v3,02/12] dt-bindings: misc: Add bindings for HiSilicon usb hub and data role switch functionality on HiKey960 Yu Chen
2019-03-02  9:04 ` [PATCH v3 02/12] " Yu Chen
2019-03-02  9:04 ` Yu Chen
2019-03-02  9:04 [v3,01/12] dt-bindings: phy: Add support for HiSilicon's hi3660 USB PHY Yu Chen
2019-03-02  9:04 ` [PATCH v3 01/12] " Yu Chen
2019-03-02  9:04 ` Yu Chen
2019-03-02  9:04 [PATCH v3 00/12] Add support for usb on Hikey960 Yu Chen
2019-03-02  9:04 ` Yu Chen
2019-03-04 12:15 ` Valentin Schneider

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1551664069.2210.64.camel@mhfsdcap03 \
    --to=chunfeng.yun@mediatek.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=arnd@arndb.de \
    --cc=butao@hisilicon.com \
    --cc=chenyao11@huawei.com \
    --cc=chenyu56@huawei.com \
    --cc=devicetree@vger.kernel.org \
    --cc=fangshengzhou@hisilicon.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=john.stultz@linaro.org \
    --cc=kongfei@hisilicon.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=lipengcheng8@huawei.com \
    --cc=liuyu712@hisilicon.com \
    --cc=songxiaowei@hisilicon.com \
    --cc=suzhuangluan@hisilicon.com \
    --cc=wangbinghui@hisilicon.com \
    --cc=wanghu17@hisilicon.com \
    --cc=xuyiping@hisilicon.com \
    --cc=xuyoujun4@huawei.com \
    --cc=yudongbin@hisilicon.com \
    --cc=zangleigang@hisilicon.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.