mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-26 21:13:48 +00:00
4559df9e81
The AB8500 PMIC contains an USB PHY that needs to be set up in device or host mode to make USB work properly. Add a simple driver for the generic PHY uclass that allows enabling it. The if (CONFIG_IS_ENABLED(USB_MUSB_HOST)) might be a bit strange. The USB PHY must be configured in either host or device mode and somehow the USB PHY driver must be made aware of the mode. Actually, the MUSB driver used together with this PHY does not support dynamic selection of host/device mode in U-Boot at the moment. Therefore, one very simple approach that works fine is to select the mode to configure at compile time. When the MUSB driver is configured in host mode the PHY is configured in host mode, and similarly when the MUSB driver is configured in device/gadget mode. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Stephan Gerhold <stephan@gerhold.net> Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>
52 lines
1.3 KiB
C
52 lines
1.3 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/* Copyright (C) 2019 Stephan Gerhold */
|
|
|
|
#include <common.h>
|
|
#include <dm.h>
|
|
#include <generic-phy.h>
|
|
#include <linux/bitops.h>
|
|
#include <power/pmic.h>
|
|
#include <power/ab8500.h>
|
|
|
|
#define AB8500_USB_PHY_CTRL_REG AB8500_USB(0x8A)
|
|
#define AB8500_BIT_PHY_CTRL_HOST_EN BIT(0)
|
|
#define AB8500_BIT_PHY_CTRL_DEVICE_EN BIT(1)
|
|
#define AB8500_USB_PHY_CTRL_MASK (AB8500_BIT_PHY_CTRL_HOST_EN |\
|
|
AB8500_BIT_PHY_CTRL_DEVICE_EN)
|
|
|
|
static int ab8500_usb_phy_power_on(struct phy *phy)
|
|
{
|
|
struct udevice *dev = phy->dev;
|
|
uint set = AB8500_BIT_PHY_CTRL_DEVICE_EN;
|
|
|
|
if (CONFIG_IS_ENABLED(USB_MUSB_HOST))
|
|
set = AB8500_BIT_PHY_CTRL_HOST_EN;
|
|
|
|
return pmic_clrsetbits(dev->parent, AB8500_USB_PHY_CTRL_REG,
|
|
AB8500_USB_PHY_CTRL_MASK, set);
|
|
}
|
|
|
|
static int ab8500_usb_phy_power_off(struct phy *phy)
|
|
{
|
|
struct udevice *dev = phy->dev;
|
|
|
|
return pmic_clrsetbits(dev->parent, AB8500_USB_PHY_CTRL_REG,
|
|
AB8500_USB_PHY_CTRL_MASK, 0);
|
|
}
|
|
|
|
struct phy_ops ab8500_usb_phy_ops = {
|
|
.power_on = ab8500_usb_phy_power_on,
|
|
.power_off = ab8500_usb_phy_power_off,
|
|
};
|
|
|
|
static const struct udevice_id ab8500_usb_phy_ids[] = {
|
|
{ .compatible = "stericsson,ab8500-usb" },
|
|
{ }
|
|
};
|
|
|
|
U_BOOT_DRIVER(ab8500_usb_phy) = {
|
|
.name = "ab8500_usb_phy",
|
|
.id = UCLASS_PHY,
|
|
.of_match = ab8500_usb_phy_ids,
|
|
.ops = &ab8500_usb_phy_ops,
|
|
};
|