aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/phy
diff options
context:
space:
mode:
authorMaxime Ripard <maxime.ripard@bootlin.com>2018-12-07 08:55:29 -0500
committerKishon Vijay Abraham I <kishon@ti.com>2018-12-11 23:31:50 -0500
commitaeaac93ddb28eeacc0dff9c12cb338eb1de7481d (patch)
tree9324e79bddac5a7cdff0d62582b16100f1aef2ea /include/linux/phy
parentc8457828ff481411dca4cdea944c1a0980c862e1 (diff)
phy: Add configuration interface
The phy framework is only allowing to configure the power state of the PHY using the init and power_on hooks, and their power_off and exit counterparts. While it works for most, simple, PHYs supported so far, some more advanced PHYs need some configuration depending on runtime parameters. These PHYs have been supported by a number of means already, often by using ad-hoc drivers in their consumer drivers. That doesn't work too well however, when a consumer device needs to deal with multiple PHYs, or when multiple consumers need to deal with the same PHY (a DSI driver and a CSI driver for example). So we'll add a new interface, through two funtions, phy_validate and phy_configure. The first one will allow to check that a current configuration, for a given mode, is applicable. It will also allow the PHY driver to tune the settings given as parameters as it sees fit. phy_configure will actually apply that configuration in the phy itself. Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Diffstat (limited to 'include/linux/phy')
-rw-r--r--include/linux/phy/phy.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
index 453f21834685..04476c026b5a 100644
--- a/include/linux/phy/phy.h
+++ b/include/linux/phy/phy.h
@@ -43,6 +43,12 @@ enum phy_mode {
43}; 43};
44 44
45/** 45/**
46 * union phy_configure_opts - Opaque generic phy configuration
47 */
48union phy_configure_opts {
49};
50
51/**
46 * struct phy_ops - set of function pointers for performing phy operations 52 * struct phy_ops - set of function pointers for performing phy operations
47 * @init: operation to be performed for initializing phy 53 * @init: operation to be performed for initializing phy
48 * @exit: operation to be performed while exiting 54 * @exit: operation to be performed while exiting
@@ -59,6 +65,37 @@ struct phy_ops {
59 int (*power_on)(struct phy *phy); 65 int (*power_on)(struct phy *phy);
60 int (*power_off)(struct phy *phy); 66 int (*power_off)(struct phy *phy);
61 int (*set_mode)(struct phy *phy, enum phy_mode mode, int submode); 67 int (*set_mode)(struct phy *phy, enum phy_mode mode, int submode);
68
69 /**
70 * @configure:
71 *
72 * Optional.
73 *
74 * Used to change the PHY parameters. phy_init() must have
75 * been called on the phy.
76 *
77 * Returns: 0 if successful, an negative error code otherwise
78 */
79 int (*configure)(struct phy *phy, union phy_configure_opts *opts);
80
81 /**
82 * @validate:
83 *
84 * Optional.
85 *
86 * Used to check that the current set of parameters can be
87 * handled by the phy. Implementations are free to tune the
88 * parameters passed as arguments if needed by some
89 * implementation detail or constraints. It must not change
90 * any actual configuration of the PHY, so calling it as many
91 * times as deemed fit by the consumer must have no side
92 * effect.
93 *
94 * Returns: 0 if the configuration can be applied, an negative
95 * error code otherwise
96 */
97 int (*validate)(struct phy *phy, enum phy_mode mode, int submode,
98 union phy_configure_opts *opts);
62 int (*reset)(struct phy *phy); 99 int (*reset)(struct phy *phy);
63 int (*calibrate)(struct phy *phy); 100 int (*calibrate)(struct phy *phy);
64 struct module *owner; 101 struct module *owner;
@@ -165,6 +202,9 @@ int phy_power_off(struct phy *phy);
165int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode); 202int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode);
166#define phy_set_mode(phy, mode) \ 203#define phy_set_mode(phy, mode) \
167 phy_set_mode_ext(phy, mode, 0) 204 phy_set_mode_ext(phy, mode, 0)
205int phy_configure(struct phy *phy, union phy_configure_opts *opts);
206int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
207 union phy_configure_opts *opts);
168 208
169static inline enum phy_mode phy_get_mode(struct phy *phy) 209static inline enum phy_mode phy_get_mode(struct phy *phy)
170{ 210{
@@ -309,6 +349,24 @@ static inline int phy_calibrate(struct phy *phy)
309 return -ENOSYS; 349 return -ENOSYS;
310} 350}
311 351
352static inline int phy_configure(struct phy *phy,
353 union phy_configure_opts *opts)
354{
355 if (!phy)
356 return 0;
357
358 return -ENOSYS;
359}
360
361static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
362 union phy_configure_opts *opts)
363{
364 if (!phy)
365 return 0;
366
367 return -ENOSYS;
368}
369
312static inline int phy_get_bus_width(struct phy *phy) 370static inline int phy_get_bus_width(struct phy *phy)
313{ 371{
314 return -ENOSYS; 372 return -ENOSYS;