lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 13 Nov 2015 17:40:45 +0530 From: Kishon Vijay Abraham I <kishon@...com> To: John Crispin <blogic@...nwrt.org> CC: <linux-kernel@...r.kernel.org> Subject: Re: [PATCH] phy: ralink-usb: add driver for Mediatek/Ralink 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@...nwrt.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@...nwrt.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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists