* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-02 9:05 Yu Chen
0 siblings, 0 replies; 11+ messages in thread
From: Yu Chen @ 2019-03-02 9:05 UTC (permalink / raw)
To: linux-usb, devicetree, linux-kernel
Cc: john.stultz, suzhuangluan, kongfei, liuyu712, wanghu17, butao,
chenyao11, fangshengzhou, lipengcheng8, songxiaowei, xuyiping,
xuyoujun4, yudongbin, zangleigang, Yu Chen, Chunfeng Yun,
Andy Shevchenko, Arnd Bergmann, Greg Kroah-Hartman, Binghui Wang,
Heikki Krogerus
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;
+ 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");
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-02 16:01 Andy Shevchenko
0 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2019-03-02 16:01 UTC (permalink / raw)
To: Yu Chen
Cc: USB, devicetree, Linux Kernel Mailing List, John Stultz,
Suzhuangluan, Kongfei, liuyu712, wanghu17, butao, Yao Chen,
fangshengzhou, lipengcheng8, songxiaowei, xu yiping, xuyoujun4,
yudongbin, zangleigang, Chunfeng Yun, Arnd Bergmann,
Greg Kroah-Hartman, Binghui Wang, Heikki Krogerus
On Sat, Mar 2, 2019 at 11:05 AM Yu Chen <chenyu56@huawei.com> 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
> +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.
> +#include <linux/of.h>
It's hard to see why this have
depends on OF followed by above header inclusion.
> + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
> + GPIOD_OUT_LOW);
> + if (!hisi_hikey_usb->typec_vbus)
> + return -ENOENT;
Hmm... Is it possible to get NULL pointer from gpiod_get() at all?
> + if (!hisi_hikey_usb->otg_switch)
> + return -ENOENT;
Ditto.
> + /* hub-vdd33-en is optional */
> + hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
> + GPIOD_OUT_HIGH);
devm_gpio_get_optional() if it's indeed optional.
> + hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
> + if (!hisi_hikey_usb->role_sw)
> + return -EPROBE_DEFER;
> + else if (IS_ERR(hisi_hikey_usb->role_sw))
Redundant 'else'
> + return PTR_ERR(hisi_hikey_usb->role_sw);
> +static const struct of_device_id id_table_hisi_hikey_usb[] = {
> + {.compatible = "hisilicon,gpio_hubv1"},
> + {.compatible = "hisilicon,hikey960_usb"},
> + {}
> +};
MODULE_DEVICE_TABLE()?
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-03 20:17 John Stultz
0 siblings, 0 replies; 11+ messages in thread
From: John Stultz @ 2019-03-03 20:17 UTC (permalink / raw)
To: Yu Chen
Cc: Linux USB List,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, lkml,
Zhuangluan Su, Kongfei, Liuyu (R), wanghu17, butao, chenyao11,
fangshengzhou, Li Pengcheng, songxiaowei, YiPing Xu, xuyoujun4,
yudongbin, Zang Leigang, Chunfeng Yun, Andy Shevchenko,
Arnd Bergmann, Greg Kroah-Hartman, Binghui Wang, Heikki Krogerus
On Sat, Mar 2, 2019 at 4:05 AM Yu Chen <chenyu56@huawei.com> wrote:
> +static int hisi_hikey_usb_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct device_node *root = dev->of_node;
Minor nit: root is unused and generates build warnings.
thanks
-john
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 1:27 Yu Chen
0 siblings, 0 replies; 11+ messages in thread
From: Yu Chen @ 2019-03-04 1:27 UTC (permalink / raw)
To: John Stultz
Cc: liuyu712, Linux USB List,
open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, lkml,
Zhuangluan Su, Kongfei, wanghu17, butao, chenyao11, fangshengzhou,
Li Pengcheng, songxiaowei, YiPing Xu, xuyoujun4, yudongbin,
Zang Leigang, Chunfeng Yun, Andy Shevchenko, Arnd Bergmann,
Greg Kroah-Hartman, Binghui Wang, Heikki Krogerus
On 2019/3/4 4:17, John Stultz wrote:
> On Sat, Mar 2, 2019 at 4:05 AM Yu Chen <chenyu56@huawei.com> wrote:
>> +static int hisi_hikey_usb_probe(struct platform_device *pdev)
>> +{
>> + struct device *dev = &pdev->dev;
>> + struct device_node *root = dev->of_node;
>
> Minor nit: root is unused and generates build warnings.
>
OK. Thanks!
> thanks
> -john
>
> .
>
Thanks
Yu Chen
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 1:47 Chunfeng Yun
0 siblings, 0 replies; 11+ messages in thread
From: Chunfeng Yun @ 2019-03-04 1:47 UTC (permalink / raw)
To: Yu Chen
Cc: linux-usb, devicetree, linux-kernel, john.stultz, suzhuangluan,
kongfei, liuyu712, wanghu17, butao, chenyao11, fangshengzhou,
lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
zangleigang, Andy Shevchenko, Arnd Bergmann, Greg Kroah-Hartman,
Binghui Wang, Heikki Krogerus
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");
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 1:55 Yu Chen
0 siblings, 0 replies; 11+ messages in thread
From: Yu Chen @ 2019-03-04 1:55 UTC (permalink / raw)
To: Chunfeng Yun
Cc: liuyu712, linux-usb, devicetree, linux-kernel, john.stultz,
suzhuangluan, kongfei, wanghu17, butao, chenyao11, fangshengzhou,
lipengcheng8, songxiaowei, xuyiping, xuyoujun4, yudongbin,
zangleigang, Andy Shevchenko, Arnd Bergmann, Greg Kroah-Hartman,
Binghui Wang, Heikki Krogerus
Hi Chunfeng Yun,
On 2019/3/4 9:47, Chunfeng Yun wrote:
>> +
>> + 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
Yes, the driver which register the usb_role_switch may finish probe after
this driver is probed for the first time.
>> + 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;
>> +}
>> +
>
>
> .
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 2:35 Yu Chen
0 siblings, 0 replies; 11+ messages in thread
From: Yu Chen @ 2019-03-04 2:35 UTC (permalink / raw)
To: Andy Shevchenko
Cc: liuyu712, USB, devicetree, Linux Kernel Mailing List, John Stultz,
Suzhuangluan, Kongfei, wanghu17, butao, Yao Chen, fangshengzhou,
lipengcheng8, songxiaowei, xu yiping, xuyoujun4, yudongbin,
zangleigang, Chunfeng Yun, Arnd Bergmann, Greg Kroah-Hartman,
Binghui Wang, Heikki Krogerus
Hi Andy,
On 2019/3/3 0:01, Andy Shevchenko wrote:
> On Sat, Mar 2, 2019 at 11:05 AM Yu Chen <chenyu56@huawei.com> 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
>
>> +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.
>
>> +#include <linux/of.h>
>
> It's hard to see why this have
> depends on OF followed by above header inclusion.
>
This driver depends on devicetree, so I add "depends on OF".
But is seems that "#include <linux/of.h>" can be removed after "of_" API
have been removed. Thanks for your reminder!
>> + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
>> + GPIOD_OUT_LOW);
>
>> + if (!hisi_hikey_usb->typec_vbus)
>> + return -ENOENT;
>
> Hmm... Is it possible to get NULL pointer from gpiod_get() at all?
>
>> + if (!hisi_hikey_usb->otg_switch)
>> + return -ENOENT;
>
> Ditto.
>
I check the comments of devm_gpio_get API, it will not return NULL pointer.
But is it more safe to keep the NULL checking? What is your advice?
>> + /* hub-vdd33-en is optional */
>> + hisi_hikey_usb->hub_vbus = devm_gpiod_get(dev, "hub-vdd33-en",
>> + GPIOD_OUT_HIGH);
>
> devm_gpio_get_optional() if it's indeed optional.
>
OK.Thanks!
>> + hisi_hikey_usb->role_sw = usb_role_switch_get(dev);
>> + if (!hisi_hikey_usb->role_sw)
>> + return -EPROBE_DEFER;
>
>> + else if (IS_ERR(hisi_hikey_usb->role_sw))
>
> Redundant 'else'
>
OK.
>> + return PTR_ERR(hisi_hikey_usb->role_sw);
>
>> +static const struct of_device_id id_table_hisi_hikey_usb[] = {
>> + {.compatible = "hisilicon,gpio_hubv1"},
>> + {.compatible = "hisilicon,hikey960_usb"},
>> + {}
>> +};
>
> MODULE_DEVICE_TABLE()?
>
OK.
Thanks
Yu Chen
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 6:50 Andy Shevchenko
0 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2019-03-04 6:50 UTC (permalink / raw)
To: Chunfeng Yun
Cc: Yu Chen, USB, devicetree, Linux Kernel Mailing List, John Stultz,
Suzhuangluan, Kongfei, liuyu712, wanghu17, butao, Yao Chen,
fangshengzhou, lipengcheng8, songxiaowei, xu yiping, xuyoujun4,
yudongbin, zangleigang, Arnd Bergmann, Greg Kroah-Hartman,
Binghui Wang, Heikki Krogerus
On Mon, Mar 4, 2019 at 3:47 AM Chunfeng Yun <chunfeng.yun@mediatek.com> wrote:
> On Sat, 2019-03-02 at 17:05 +0800, Yu Chen wrote:
> > + 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
How enough? If return value is NULL it would be transformered to 0,
which is success return code from the ->probe() which means we will
have ->probed() and not functional device.
Am I missing something?
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 6:55 Andy Shevchenko
0 siblings, 0 replies; 11+ messages in thread
From: Andy Shevchenko @ 2019-03-04 6:55 UTC (permalink / raw)
To: Chen Yu
Cc: liuyu712, USB, devicetree, Linux Kernel Mailing List, John Stultz,
Suzhuangluan, Kongfei, wanghu17, butao, Yao Chen, fangshengzhou,
lipengcheng8, songxiaowei, xu yiping, xuyoujun4, yudongbin,
zangleigang, Chunfeng Yun, Arnd Bergmann, Greg Kroah-Hartman,
Binghui Wang, Heikki Krogerus
On Mon, Mar 4, 2019 at 4:35 AM Chen Yu <chenyu56@huawei.com> wrote:
> On 2019/3/3 0:01, Andy Shevchenko wrote:
> > On Sat, Mar 2, 2019 at 11:05 AM Yu Chen <chenyu56@huawei.com> wrote:
> >> +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.
> >
> >> +#include <linux/of.h>
> >
> > It's hard to see why this have
> > depends on OF followed by above header inclusion.
> >
> This driver depends on devicetree, so I add "depends on OF".
> But is seems that "#include <linux/of.h>" can be removed after "of_" API
> have been removed. Thanks for your reminder!
So, it means that technically there is no such dependency, rather
administratively.
> >> + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
> >> + GPIOD_OUT_LOW);
> >
> >> + if (!hisi_hikey_usb->typec_vbus)
> >> + return -ENOENT;
> >
> > Hmm... Is it possible to get NULL pointer from gpiod_get() at all?
> >
> >> + if (!hisi_hikey_usb->otg_switch)
> >> + return -ENOENT;
> >
> > Ditto.
> >
> I check the comments of devm_gpio_get API, it will not return NULL pointer.
> But is it more safe to keep the NULL checking? What is your advice?
Why do we need dead code?
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 6:58 Chunfeng Yun
0 siblings, 0 replies; 11+ messages in thread
From: Chunfeng Yun @ 2019-03-04 6:58 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Yu Chen, USB, devicetree, Linux Kernel Mailing List, John Stultz,
Suzhuangluan, Kongfei, liuyu712, wanghu17, butao, Yao Chen,
fangshengzhou, lipengcheng8, songxiaowei, xu yiping, xuyoujun4,
yudongbin, zangleigang, Arnd Bergmann, Greg Kroah-Hartman,
Binghui Wang, Heikki Krogerus
hi,
On Mon, 2019-03-04 at 08:50 +0200, Andy Shevchenko wrote:
> On Mon, Mar 4, 2019 at 3:47 AM Chunfeng Yun <chunfeng.yun@mediatek.com> wrote:
> > On Sat, 2019-03-02 at 17:05 +0800, Yu Chen wrote:
>
> > > + 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
>
> How enough? If return value is NULL it would be transformered to 0,
> which is success return code from the ->probe() which means we will
> have ->probed() and not functional device.
>
You are right:)
> Am I missing something?
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* [v3,10/12] hikey960: Support usb functionality of Hikey960
@ 2019-03-04 7:31 Yu Chen
0 siblings, 0 replies; 11+ messages in thread
From: Yu Chen @ 2019-03-04 7:31 UTC (permalink / raw)
To: Andy Shevchenko
Cc: liuyu712, USB, devicetree, Linux Kernel Mailing List, John Stultz,
Suzhuangluan, Kongfei, wanghu17, butao, Yao Chen, fangshengzhou,
lipengcheng8, songxiaowei, xu yiping, xuyoujun4, yudongbin,
zangleigang, Chunfeng Yun, Arnd Bergmann, Greg Kroah-Hartman,
Binghui Wang, Heikki Krogerus
Hi,
On 2019/3/4 14:55, Andy Shevchenko wrote:
> On Mon, Mar 4, 2019 at 4:35 AM Chen Yu <chenyu56@huawei.com> wrote:
>> On 2019/3/3 0:01, Andy Shevchenko wrote:
>>> On Sat, Mar 2, 2019 at 11:05 AM Yu Chen <chenyu56@huawei.com> wrote:
>
>>>> +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.
>>>
>>>> +#include <linux/of.h>
>>>
>>> It's hard to see why this have
>>> depends on OF followed by above header inclusion.
>>>
>> This driver depends on devicetree, so I add "depends on OF".
>> But is seems that "#include <linux/of.h>" can be removed after "of_" API
>> have been removed. Thanks for your reminder!
>
> So, it means that technically there is no such dependency, rather
> administratively.
>
OK. I will remove the dependent next version.
>>>> + hisi_hikey_usb->typec_vbus = devm_gpiod_get(dev, "typec-vbus",
>>>> + GPIOD_OUT_LOW);
>>>
>>>> + if (!hisi_hikey_usb->typec_vbus)
>>>> + return -ENOENT;
>>>
>>> Hmm... Is it possible to get NULL pointer from gpiod_get() at all?
>>>
>>>> + if (!hisi_hikey_usb->otg_switch)
>>>> + return -ENOENT;
>>>
>>> Ditto.
>>>
>> I check the comments of devm_gpio_get API, it will not return NULL pointer.
>> But is it more safe to keep the NULL checking? What is your advice?
>
> Why do we need dead code?
>
OK.I will remove it.
Thanks
Yu Chen
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2019-03-04 7:31 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-02 16:01 [v3,10/12] hikey960: Support usb functionality of Hikey960 Andy Shevchenko
-- strict thread matches above, loose matches on Subject: below --
2019-03-04 7:31 Yu Chen
2019-03-04 6:58 Chunfeng Yun
2019-03-04 6:55 Andy Shevchenko
2019-03-04 6:50 Andy Shevchenko
2019-03-04 2:35 Yu Chen
2019-03-04 1:55 Yu Chen
2019-03-04 1:47 Chunfeng Yun
2019-03-04 1:27 Yu Chen
2019-03-03 20:17 John Stultz
2019-03-02 9:05 Yu Chen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).