mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 12:35:52 +02:00
phy: renesas: rcar-gen3-usb2: Allow SoC-specific OBINT bits via phy_data
Update the PHY driver to support SoC-specific OBINT enable bits by introducing the `obint_enable_bits` field in the `rcar_gen3_phy_drv_data` structure. This allows each SoC to specify bits required. Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Link: https://lore.kernel.org/r/20250808215209.3692744-4-prabhakar.mahadev-lad.rj@bp.renesas.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
parent
f75806d263
commit
4b7aa47e4c
|
|
@ -71,8 +71,7 @@
|
|||
/* OBINTSTA and OBINTEN */
|
||||
#define USB2_OBINT_SESSVLDCHG BIT(12)
|
||||
#define USB2_OBINT_IDDIGCHG BIT(11)
|
||||
#define USB2_OBINT_BITS (USB2_OBINT_SESSVLDCHG | \
|
||||
USB2_OBINT_IDDIGCHG)
|
||||
#define USB2_OBINT_IDCHG_EN BIT(0) /* RZ/G2L specific */
|
||||
|
||||
/* VBCTRL */
|
||||
#define USB2_VBCTRL_OCCLREN BIT(16)
|
||||
|
|
@ -93,7 +92,6 @@
|
|||
#define USB2_ADPCTRL_DRVVBUS BIT(4)
|
||||
|
||||
/* RZ/G2L specific */
|
||||
#define USB2_OBINT_IDCHG_EN BIT(0)
|
||||
#define USB2_LINECTRL1_USB2_IDMON BIT(0)
|
||||
|
||||
#define NUM_OF_PHYS 4
|
||||
|
|
@ -130,7 +128,6 @@ struct rcar_gen3_chan {
|
|||
struct work_struct work;
|
||||
spinlock_t lock; /* protects access to hardware and driver data structure. */
|
||||
enum usb_dr_mode dr_mode;
|
||||
u32 obint_enable_bits;
|
||||
bool extcon_host;
|
||||
bool is_otg_channel;
|
||||
bool uses_otg_pins;
|
||||
|
|
@ -141,6 +138,7 @@ struct rcar_gen3_phy_drv_data {
|
|||
bool no_adp_ctrl;
|
||||
bool init_bus;
|
||||
bool utmi_ctrl;
|
||||
u32 obint_enable_bits;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -225,9 +223,9 @@ static void rcar_gen3_control_otg_irq(struct rcar_gen3_chan *ch, int enable)
|
|||
u32 val = readl(usb2_base + USB2_OBINTEN);
|
||||
|
||||
if (ch->uses_otg_pins && enable)
|
||||
val |= ch->obint_enable_bits;
|
||||
val |= ch->phy_data->obint_enable_bits;
|
||||
else
|
||||
val &= ~ch->obint_enable_bits;
|
||||
val &= ~ch->phy_data->obint_enable_bits;
|
||||
writel(val, usb2_base + USB2_OBINTEN);
|
||||
}
|
||||
|
||||
|
|
@ -430,7 +428,7 @@ static void rcar_gen3_init_otg(struct rcar_gen3_chan *ch)
|
|||
mdelay(20);
|
||||
|
||||
writel(0xffffffff, usb2_base + USB2_OBINTSTA);
|
||||
writel(ch->obint_enable_bits, usb2_base + USB2_OBINTEN);
|
||||
writel(ch->phy_data->obint_enable_bits, usb2_base + USB2_OBINTEN);
|
||||
|
||||
rcar_gen3_device_recognition(ch);
|
||||
}
|
||||
|
|
@ -450,9 +448,9 @@ static irqreturn_t rcar_gen3_phy_usb2_irq(int irq, void *_ch)
|
|||
|
||||
scoped_guard(spinlock, &ch->lock) {
|
||||
status = readl(usb2_base + USB2_OBINTSTA);
|
||||
if (status & ch->obint_enable_bits) {
|
||||
if (status & ch->phy_data->obint_enable_bits) {
|
||||
dev_vdbg(dev, "%s: %08x\n", __func__, status);
|
||||
writel(ch->obint_enable_bits, usb2_base + USB2_OBINTSTA);
|
||||
writel(ch->phy_data->obint_enable_bits, usb2_base + USB2_OBINTSTA);
|
||||
rcar_gen3_device_recognition(ch);
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
|
@ -591,28 +589,35 @@ static const struct phy_ops rz_g1c_phy_usb2_ops = {
|
|||
static const struct rcar_gen3_phy_drv_data rcar_gen3_phy_usb2_data = {
|
||||
.phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
|
||||
.no_adp_ctrl = false,
|
||||
.obint_enable_bits = USB2_OBINT_SESSVLDCHG |
|
||||
USB2_OBINT_IDDIGCHG,
|
||||
};
|
||||
|
||||
static const struct rcar_gen3_phy_drv_data rz_g1c_phy_usb2_data = {
|
||||
.phy_usb2_ops = &rz_g1c_phy_usb2_ops,
|
||||
.no_adp_ctrl = false,
|
||||
.obint_enable_bits = USB2_OBINT_SESSVLDCHG |
|
||||
USB2_OBINT_IDDIGCHG,
|
||||
};
|
||||
|
||||
static const struct rcar_gen3_phy_drv_data rz_g2l_phy_usb2_data = {
|
||||
.phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
|
||||
.no_adp_ctrl = true,
|
||||
.obint_enable_bits = USB2_OBINT_IDCHG_EN,
|
||||
};
|
||||
|
||||
static const struct rcar_gen3_phy_drv_data rz_g3s_phy_usb2_data = {
|
||||
.phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
|
||||
.no_adp_ctrl = true,
|
||||
.init_bus = true,
|
||||
.obint_enable_bits = USB2_OBINT_IDCHG_EN,
|
||||
};
|
||||
|
||||
static const struct rcar_gen3_phy_drv_data rz_v2h_phy_usb2_data = {
|
||||
.phy_usb2_ops = &rcar_gen3_phy_usb2_ops,
|
||||
.no_adp_ctrl = true,
|
||||
.utmi_ctrl = true,
|
||||
.obint_enable_bits = USB2_OBINT_IDCHG_EN,
|
||||
};
|
||||
|
||||
static const struct of_device_id rcar_gen3_phy_usb2_match_table[] = {
|
||||
|
|
@ -747,7 +752,6 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(channel->base))
|
||||
return PTR_ERR(channel->base);
|
||||
|
||||
channel->obint_enable_bits = USB2_OBINT_BITS;
|
||||
channel->dr_mode = rcar_gen3_get_dr_mode(dev->of_node);
|
||||
if (channel->dr_mode != USB_DR_MODE_UNKNOWN) {
|
||||
channel->is_otg_channel = true;
|
||||
|
|
@ -786,9 +790,6 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev)
|
|||
goto error;
|
||||
}
|
||||
|
||||
if (channel->phy_data->no_adp_ctrl)
|
||||
channel->obint_enable_bits = USB2_OBINT_IDCHG_EN;
|
||||
|
||||
spin_lock_init(&channel->lock);
|
||||
for (i = 0; i < NUM_OF_PHYS; i++) {
|
||||
channel->rphys[i].phy = devm_phy_create(dev, NULL,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user