blob: 78797675cca2a3d3bfea22505b554cce5ac698a8 [file] [log] [blame]
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/amlogic/usb-v2.h>
#include "../phy/phy-aml-new-usb-v2.h"
int amlogic_crg_drd_usbphy_reset(struct amlogic_usb_v2 *phy)
{
static int init_count;
if (!init_count) {
init_count++;
if (phy->usb_reset_bit == 2)
writel((readl(phy->reset_regs) |
(0x1 << phy->usb_reset_bit)), phy->reset_regs);
else
writel((0x1 << phy->usb_reset_bit), phy->reset_regs);
}
return 0;
}
EXPORT_SYMBOL_GPL(amlogic_crg_drd_usbphy_reset);
int amlogic_crg_drd_usbphy_reset_phycfg(struct amlogic_usb_v2 *phy, int cnt)
{
u32 val, i = 0;
u32 temp = 0;
size_t mask = 0;
mask = (size_t)phy->reset_regs & 0xf;
for (i = 0; i < cnt; i++)
temp = temp | (1 << phy->phy_reset_level_bit[i]);
/* set usb phy to low power mode */
val = readl((void __iomem *)
((unsigned long)phy->reset_regs + (phy->reset_level - mask)));
writel((val & (~temp)), (void __iomem *)
((unsigned long)phy->reset_regs + (phy->reset_level - mask)));
usleep_range(99, 100);
val = readl((void __iomem *)
((unsigned long)phy->reset_regs + (phy->reset_level - mask)));
writel((val | temp), (void __iomem *)
((unsigned long)phy->reset_regs + (phy->reset_level - mask)));
return 0;
}
EXPORT_SYMBOL_GPL(amlogic_crg_drd_usbphy_reset_phycfg);