From: Kishon Vijay Abraham I <kishon@ti.com>
To: John Crispin <blogic@openwrt.org>
Cc: <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] phy: ralink-usb: add driver for Mediatek/Ralink
Date: Fri, 13 Nov 2015 17:40:45 +0530 [thread overview]
Message-ID: <5645D345.7060706@ti.com> (raw)
In-Reply-To: <1446634498-11902-1-git-send-email-blogic@openwrt.org>
Hi,
On Wednesday 04 November 2015 04:24 PM, John Crispin wrote:
> Add a driver to setup the USB phy on Mediatek/Ralink SoCs.
> The driver is trivial and only sets the power and host/device mode.
>
> Signed-off-by: John Crispin <blogic@openwrt.org>
> ---
> .../devicetree/bindings/phy/ralink-usb-phy.txt | 17 ++
> drivers/phy/Kconfig | 7 +
> drivers/phy/Makefile | 1 +
> drivers/phy/phy-ralink-usb.c | 183 ++++++++++++++++++++
> 4 files changed, 208 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/phy/ralink-usb-phy.txt
> create mode 100644 drivers/phy/phy-ralink-usb.c
>
> diff --git a/Documentation/devicetree/bindings/phy/ralink-usb-phy.txt b/Documentation/devicetree/bindings/phy/ralink-usb-phy.txt
> new file mode 100644
> index 0000000..363cff0
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/phy/ralink-usb-phy.txt
> @@ -0,0 +1,17 @@
> +Mediatek/Ralink USB PHY
> +
> +Required properties:
> + - compatible: ralink,rt3xxx-usbphy or ralink,mt7620-usbphy
is *ralink,rt3xxx-usbphy* really needed.
> + - #phy-cells: should be 0
> + - resets: the two reset controllers for host and device
> + - reset-names: the names of the 2 reset controllers
> +
> +Example:
> +
> +usbphy: phy {
> + compatible = "ralink,mt7620a-usbphy";
> + #phy-cells = <0>;
> +
> + resets = <&rstctrl 22 &rstctrl 25>;
> + reset-names = "host", "device";
> +};
> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> index 47da573..01e4df4 100644
> --- a/drivers/phy/Kconfig
> +++ b/drivers/phy/Kconfig
> @@ -331,6 +331,13 @@ config PHY_XGENE
> help
> This option enables support for APM X-Gene SoC multi-purpose PHY.
>
> +config PHY_RALINK_USB
> + tristate "Ralink USB PHY driver"
> + select GENERIC_PHY
> + depends on RALINK
> + help
> + This option enables support for Ralink SoC USB PHY.
> +
> config PHY_STIH407_USB
> tristate "STMicroelectronics USB2 picoPHY driver for STiH407 family"
> depends on RESET_CONTROLLER
> diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> index a5b18c1..8dbf6cc 100644
> --- a/drivers/phy/Makefile
> +++ b/drivers/phy/Makefile
> @@ -46,3 +46,4 @@ obj-$(CONFIG_PHY_QCOM_UFS) += phy-qcom-ufs-qmp-14nm.o
> obj-$(CONFIG_PHY_TUSB1210) += phy-tusb1210.o
> obj-$(CONFIG_PHY_BRCMSTB_SATA) += phy-brcmstb-sata.o
> obj-$(CONFIG_PHY_PISTACHIO_USB) += phy-pistachio-usb.o
> +obj-$(CONFIG_PHY_RALINK_USB) += phy-ralink-usb.o
> diff --git a/drivers/phy/phy-ralink-usb.c b/drivers/phy/phy-ralink-usb.c
> new file mode 100644
> index 0000000..d3b590b
> --- /dev/null
> +++ b/drivers/phy/phy-ralink-usb.c
> @@ -0,0 +1,183 @@
> +/*
> + * Ralink USB phy driver
> + *
> + * Copyright (C) 2014 John Crispin <blogic@openwrt.org>
2015..
> + *
> + * Based on code from
> + * Allwinner Technology Co., Ltd. <www.allwinnertech.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.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/err.h>
> +#include <linux/io.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/phy/phy.h>
> +#include <linux/platform_device.h>
> +#include <linux/reset.h>
> +#include <linux/of_platform.h>
> +
> +#include <asm/mach-ralink/ralink_regs.h>
> +
> +#define RT_SYSC_REG_SYSCFG1 0x014
> +#define RT_SYSC_REG_CLKCFG1 0x030
> +#define RT_SYSC_REG_USB_PHY_CFG 0x05c
> +
> +#define RT_RSTCTRL_UDEV BIT(25)
> +#define RT_RSTCTRL_UHST BIT(22)
> +#define RT_SYSCFG1_USB0_HOST_MODE BIT(10)
> +
> +#define MT7620_CLKCFG1_UPHY0_CLK_EN BIT(25)
> +#define MT7620_CLKCFG1_UPHY1_CLK_EN BIT(22)
> +#define RT_CLKCFG1_UPHY1_CLK_EN BIT(20)
> +#define RT_CLKCFG1_UPHY0_CLK_EN BIT(18)
> +
> +#define USB_PHY_UTMI_8B60M BIT(1)
> +#define UDEV_WAKEUP BIT(0)
> +
> +static atomic_t usb_pwr_ref = ATOMIC_INIT(0);
> +static struct reset_control *rstdev;
> +static struct reset_control *rsthost;
> +static u32 phy_clk;
> +static struct phy *rt_phy;
Avoid using global variable. These are not required to be global at all.
> +
> +static void usb_phy_enable(int state)
> +{
> + if (state)
> + rt_sysc_m32(0, phy_clk, RT_SYSC_REG_CLKCFG1);
> + else
> + rt_sysc_m32(phy_clk, 0, RT_SYSC_REG_CLKCFG1);
> + mdelay(100);
> +}
> +
> +static int ralink_usb_phy_init(struct phy *_phy)
> +{
> + return 0;
> +}
> +
> +static int ralink_usb_phy_exit(struct phy *_phy)
> +{
> + return 0;
> +}
These empty functions are not required.
> +
> +static int ralink_usb_phy_power_on(struct phy *_phy)
> +{
> + if (atomic_inc_return(&usb_pwr_ref) == 1) {
Why do you need this? Is the reference counting provided in phy-core not enough?
> + int host = 1;
> + u32 t;
> +
> + usb_phy_enable(1);
> +
> + if (host) {
> + rt_sysc_m32(0, RT_SYSCFG1_USB0_HOST_MODE,
> + RT_SYSC_REG_SYSCFG1);
> + if (!IS_ERR(rsthost))
> + reset_control_deassert(rsthost);
> + if (!IS_ERR(rstdev))
> + reset_control_deassert(rstdev);
> + } else {
> + rt_sysc_m32(RT_SYSCFG1_USB0_HOST_MODE, 0,
> + RT_SYSC_REG_SYSCFG1);
> + if (!IS_ERR(rstdev))
> + reset_control_deassert(rstdev);
> + }
> + mdelay(100);
> +
> + t = rt_sysc_r32(RT_SYSC_REG_USB_PHY_CFG);
> + dev_info(&_phy->dev, "remote usb device wakeup %s\n",
> + (t & UDEV_WAKEUP) ? ("enabbled") : ("disabled"));
> + if (t & USB_PHY_UTMI_8B60M)
> + dev_info(&_phy->dev, "UTMI 8bit 60MHz\n");
> + else
> + dev_info(&_phy->dev, "UTMI 16bit 30MHz\n");
> + }
> +
> + return 0;
> +}
> +
> +static int ralink_usb_phy_power_off(struct phy *_phy)
> +{
> + if (atomic_dec_return(&usb_pwr_ref) == 0) {
> + usb_phy_enable(0);
> + if (!IS_ERR(rstdev))
> + reset_control_assert(rstdev);
> + if (!IS_ERR(rsthost))
> + reset_control_assert(rsthost);
> + }
> +
> + return 0;
> +}
> +
> +static struct phy_ops ralink_usb_phy_ops = {
> + .init = ralink_usb_phy_init,
> + .exit = ralink_usb_phy_exit,
> + .power_on = ralink_usb_phy_power_on,
> + .power_off = ralink_usb_phy_power_off,
> + .owner = THIS_MODULE,
> +};
> +
> +static struct phy *ralink_usb_phy_xlate(struct device *dev,
> + struct of_phandle_args *args)
> +{
> + return rt_phy;
> +}
weird.. why do you need empty xlate function? use of_phy_simple_xlate.
> +
> +static const struct of_device_id ralink_usb_phy_of_match[] = {
> + {
> + .compatible = "ralink,rt3xxx-usbphy",
Use a specific compatible string. Which SoC's should use "ralink,rt3xxx-usbphy"?
Thanks
Kishon
prev parent reply other threads:[~2015-11-13 12:10 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-04 10:54 [PATCH] phy: ralink-usb: add driver for Mediatek/Ralink John Crispin
2015-11-05 23:38 ` Alexey Klimov
2015-11-06 20:47 ` Andy Shevchenko
2015-11-13 12:10 ` Kishon Vijay Abraham I [this message]
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=5645D345.7060706@ti.com \
--to=kishon@ti.com \
--cc=blogic@openwrt.org \
--cc=linux-kernel@vger.kernel.org \
/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.