Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
23eca831
Commit
23eca831
authored
Jun 11, 2021
by
Thierry Reding
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-5.14/phy' into for-5.14/usb
parents
6efb943b
1f9cab6c
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
2127 additions
and
424 deletions
+2127
-424
drivers/phy/tegra/xusb-tegra186.c
drivers/phy/tegra/xusb-tegra186.c
+549
-1
drivers/phy/tegra/xusb-tegra210.c
drivers/phy/tegra/xusb-tegra210.c
+1460
-417
drivers/phy/tegra/xusb.c
drivers/phy/tegra/xusb.c
+90
-2
drivers/phy/tegra/xusb.h
drivers/phy/tegra/xusb.h
+19
-3
include/linux/phy/tegra/xusb.h
include/linux/phy/tegra/xusb.h
+9
-1
No files found.
drivers/phy/tegra/xusb-tegra186.c
View file @
23eca831
This diff is collapsed.
Click to expand it.
drivers/phy/tegra/xusb-tegra210.c
View file @
23eca831
This diff is collapsed.
Click to expand it.
drivers/phy/tegra/xusb.c
View file @
23eca831
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2014-20
16
, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2014-20
20
, NVIDIA CORPORATION. All rights reserved.
*/
#include <linux/delay.h>
...
...
@@ -321,11 +321,17 @@ static void tegra_xusb_lane_program(struct tegra_xusb_lane *lane)
if
(
soc
->
num_funcs
<
2
)
return
;
if
(
lane
->
pad
->
ops
->
iddq_enable
)
lane
->
pad
->
ops
->
iddq_enable
(
lane
);
/* choose function */
value
=
padctl_readl
(
padctl
,
soc
->
offset
);
value
&=
~
(
soc
->
mask
<<
soc
->
shift
);
value
|=
lane
->
function
<<
soc
->
shift
;
padctl_writel
(
padctl
,
value
,
soc
->
offset
);
if
(
lane
->
pad
->
ops
->
iddq_disable
)
lane
->
pad
->
ops
->
iddq_disable
(
lane
);
}
static
void
tegra_xusb_pad_program
(
struct
tegra_xusb_pad
*
pad
)
...
...
@@ -376,7 +382,7 @@ static int tegra_xusb_setup_pads(struct tegra_xusb_padctl *padctl)
return
0
;
}
static
bool
tegra_xusb_lane_check
(
struct
tegra_xusb_lane
*
lane
,
bool
tegra_xusb_lane_check
(
struct
tegra_xusb_lane
*
lane
,
const
char
*
function
)
{
const
char
*
func
=
lane
->
soc
->
funcs
[
lane
->
function
];
...
...
@@ -1267,10 +1273,36 @@ static int tegra_xusb_padctl_remove(struct platform_device *pdev)
return
err
;
}
static
int
tegra_xusb_padctl_suspend_noirq
(
struct
device
*
dev
)
{
struct
tegra_xusb_padctl
*
padctl
=
dev_get_drvdata
(
dev
);
if
(
padctl
->
soc
&&
padctl
->
soc
->
ops
&&
padctl
->
soc
->
ops
->
suspend_noirq
)
return
padctl
->
soc
->
ops
->
suspend_noirq
(
padctl
);
return
0
;
}
static
int
tegra_xusb_padctl_resume_noirq
(
struct
device
*
dev
)
{
struct
tegra_xusb_padctl
*
padctl
=
dev_get_drvdata
(
dev
);
if
(
padctl
->
soc
&&
padctl
->
soc
->
ops
&&
padctl
->
soc
->
ops
->
resume_noirq
)
return
padctl
->
soc
->
ops
->
resume_noirq
(
padctl
);
return
0
;
}
static
const
struct
dev_pm_ops
tegra_xusb_padctl_pm_ops
=
{
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS
(
tegra_xusb_padctl_suspend_noirq
,
tegra_xusb_padctl_resume_noirq
)
};
static
struct
platform_driver
tegra_xusb_padctl_driver
=
{
.
driver
=
{
.
name
=
"tegra-xusb-padctl"
,
.
of_match_table
=
tegra_xusb_padctl_of_match
,
.
pm
=
&
tegra_xusb_padctl_pm_ops
,
},
.
probe
=
tegra_xusb_padctl_probe
,
.
remove
=
tegra_xusb_padctl_remove
,
...
...
@@ -1337,6 +1369,62 @@ int tegra_xusb_padctl_hsic_set_idle(struct tegra_xusb_padctl *padctl,
}
EXPORT_SYMBOL_GPL
(
tegra_xusb_padctl_hsic_set_idle
);
int
tegra_xusb_padctl_enable_phy_sleepwalk
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
,
enum
usb_device_speed
speed
)
{
struct
tegra_xusb_lane
*
lane
=
phy_get_drvdata
(
phy
);
if
(
lane
->
pad
->
ops
->
enable_phy_sleepwalk
)
return
lane
->
pad
->
ops
->
enable_phy_sleepwalk
(
lane
,
speed
);
return
-
EOPNOTSUPP
;
}
EXPORT_SYMBOL_GPL
(
tegra_xusb_padctl_enable_phy_sleepwalk
);
int
tegra_xusb_padctl_disable_phy_sleepwalk
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
)
{
struct
tegra_xusb_lane
*
lane
=
phy_get_drvdata
(
phy
);
if
(
lane
->
pad
->
ops
->
disable_phy_sleepwalk
)
return
lane
->
pad
->
ops
->
disable_phy_sleepwalk
(
lane
);
return
-
EOPNOTSUPP
;
}
EXPORT_SYMBOL_GPL
(
tegra_xusb_padctl_disable_phy_sleepwalk
);
int
tegra_xusb_padctl_enable_phy_wake
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
)
{
struct
tegra_xusb_lane
*
lane
=
phy_get_drvdata
(
phy
);
if
(
lane
->
pad
->
ops
->
enable_phy_wake
)
return
lane
->
pad
->
ops
->
enable_phy_wake
(
lane
);
return
-
EOPNOTSUPP
;
}
EXPORT_SYMBOL_GPL
(
tegra_xusb_padctl_enable_phy_wake
);
int
tegra_xusb_padctl_disable_phy_wake
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
)
{
struct
tegra_xusb_lane
*
lane
=
phy_get_drvdata
(
phy
);
if
(
lane
->
pad
->
ops
->
disable_phy_wake
)
return
lane
->
pad
->
ops
->
disable_phy_wake
(
lane
);
return
-
EOPNOTSUPP
;
}
EXPORT_SYMBOL_GPL
(
tegra_xusb_padctl_disable_phy_wake
);
bool
tegra_xusb_padctl_remote_wake_detected
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
)
{
struct
tegra_xusb_lane
*
lane
=
phy_get_drvdata
(
phy
);
if
(
lane
->
pad
->
ops
->
remote_wake_detected
)
return
lane
->
pad
->
ops
->
remote_wake_detected
(
lane
);
return
false
;
}
EXPORT_SYMBOL_GPL
(
tegra_xusb_padctl_remote_wake_detected
);
int
tegra_xusb_padctl_usb3_set_lfps_detect
(
struct
tegra_xusb_padctl
*
padctl
,
unsigned
int
port
,
bool
enable
)
{
...
...
drivers/phy/tegra/xusb.h
View file @
23eca831
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2014-20
15
, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2014-20
20
, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2015, Google Inc.
*/
...
...
@@ -11,6 +11,7 @@
#include <linux/mutex.h>
#include <linux/workqueue.h>
#include <linux/usb/ch9.h>
#include <linux/usb/otg.h>
#include <linux/usb/role.h>
...
...
@@ -35,6 +36,10 @@ struct tegra_xusb_lane_soc {
const
char
*
const
*
funcs
;
unsigned
int
num_funcs
;
struct
{
unsigned
int
misc_ctl2
;
}
regs
;
};
struct
tegra_xusb_lane
{
...
...
@@ -126,8 +131,17 @@ struct tegra_xusb_lane_ops {
struct
device_node
*
np
,
unsigned
int
index
);
void
(
*
remove
)(
struct
tegra_xusb_lane
*
lane
);
void
(
*
iddq_enable
)(
struct
tegra_xusb_lane
*
lane
);
void
(
*
iddq_disable
)(
struct
tegra_xusb_lane
*
lane
);
int
(
*
enable_phy_sleepwalk
)(
struct
tegra_xusb_lane
*
lane
,
enum
usb_device_speed
speed
);
int
(
*
disable_phy_sleepwalk
)(
struct
tegra_xusb_lane
*
lane
);
int
(
*
enable_phy_wake
)(
struct
tegra_xusb_lane
*
lane
);
int
(
*
disable_phy_wake
)(
struct
tegra_xusb_lane
*
lane
);
bool
(
*
remote_wake_detected
)(
struct
tegra_xusb_lane
*
lane
);
};
bool
tegra_xusb_lane_check
(
struct
tegra_xusb_lane
*
lane
,
const
char
*
function
);
/*
* pads
*/
...
...
@@ -230,7 +244,7 @@ struct tegra_xusb_pcie_pad {
struct
reset_control
*
rst
;
struct
clk
*
pll
;
unsigned
int
enable
;
bool
enable
;
};
static
inline
struct
tegra_xusb_pcie_pad
*
...
...
@@ -245,7 +259,7 @@ struct tegra_xusb_sata_pad {
struct
reset_control
*
rst
;
struct
clk
*
pll
;
unsigned
int
enable
;
bool
enable
;
};
static
inline
struct
tegra_xusb_sata_pad
*
...
...
@@ -388,6 +402,8 @@ struct tegra_xusb_padctl_ops {
const
struct
tegra_xusb_padctl_soc
*
soc
);
void
(
*
remove
)(
struct
tegra_xusb_padctl
*
padctl
);
int
(
*
suspend_noirq
)(
struct
tegra_xusb_padctl
*
padctl
);
int
(
*
resume_noirq
)(
struct
tegra_xusb_padctl
*
padctl
);
int
(
*
usb3_save_context
)(
struct
tegra_xusb_padctl
*
padctl
,
unsigned
int
index
);
int
(
*
hsic_set_idle
)(
struct
tegra_xusb_padctl
*
padctl
,
...
...
include/linux/phy/tegra/xusb.h
View file @
23eca831
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2016
-2020
, NVIDIA CORPORATION. All rights reserved.
*/
#ifndef PHY_TEGRA_XUSB_H
...
...
@@ -8,6 +8,7 @@
struct
tegra_xusb_padctl
;
struct
device
;
enum
usb_device_speed
;
struct
tegra_xusb_padctl
*
tegra_xusb_padctl_get
(
struct
device
*
dev
);
void
tegra_xusb_padctl_put
(
struct
tegra_xusb_padctl
*
padctl
);
...
...
@@ -23,4 +24,11 @@ int tegra_xusb_padctl_set_vbus_override(struct tegra_xusb_padctl *padctl,
int
tegra_phy_xusb_utmi_port_reset
(
struct
phy
*
phy
);
int
tegra_xusb_padctl_get_usb3_companion
(
struct
tegra_xusb_padctl
*
padctl
,
unsigned
int
port
);
int
tegra_xusb_padctl_enable_phy_sleepwalk
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
,
enum
usb_device_speed
speed
);
int
tegra_xusb_padctl_disable_phy_sleepwalk
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
);
int
tegra_xusb_padctl_enable_phy_wake
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
);
int
tegra_xusb_padctl_disable_phy_wake
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
);
bool
tegra_xusb_padctl_remote_wake_detected
(
struct
tegra_xusb_padctl
*
padctl
,
struct
phy
*
phy
);
#endif
/* PHY_TEGRA_XUSB_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment