int (*config_polarity)(struct rtpcs_serdes *sds, unsigned int tx_pol,
unsigned int rx_pol);
+ /* required: power down before reconfiguration */
+ int (*deactivate)(struct rtpcs_serdes *sds);
+ /* required: power back up */
+ int (*activate)(struct rtpcs_serdes *sds);
/* optional: finalization that must follow power-up, e.g. RX calibration */
int (*post_config)(struct rtpcs_serdes *sds, enum rtpcs_sds_mode hw_mode);
};
{
int ret;
- rtpcs_838x_sds_deactivate(sds);
-
rtpcs_838x_sds_patch(sds, hw_mode);
ret = rtpcs_838x_sds_set_mode(sds, hw_mode);
sds->hw_mode = hw_mode;
rtpcs_838x_sds_reset(sds);
-
- rtpcs_838x_sds_activate(sds);
-
return 0;
}
return 0;
}
+/*
+ * These no-op stubs satisfy the mandatory activate/deactivate contract until
+ * real power sequencing is implemented.
+ */
+static int rtpcs_839x_sds_deactivate(struct rtpcs_serdes *sds)
+{
+ return 0;
+}
+
+static int rtpcs_839x_sds_activate(struct rtpcs_serdes *sds)
+{
+ return 0;
+}
+
static int rtpcs_839x_setup_serdes(struct rtpcs_serdes *sds,
enum rtpcs_sds_mode hw_mode)
{
{
int ret;
- ret = rtpcs_930x_sds_deactivate(sds);
- if (ret < 0)
- return ret;
-
/* Apply configuration for a hardware mode to SerDes */
ret = rtpcs_930x_sds_config_hw_mode(sds, hw_mode);
if (ret < 0)
sds->hw_mode = hw_mode;
- rtpcs_930x_sds_activate(sds);
-
return 0;
}
enum rtpcs_sds_media sds_media;
int ret;
- rtpcs_931x_sds_deactivate(sds);
-
ret = rtpcs_931x_sds_config_hw_mode(sds, hw_mode);
if (ret < 0)
return ret;
sds->hw_mode = hw_mode;
- rtpcs_931x_sds_activate(sds);
return 0;
}
goto out;
}
+ ret = sds->ops->deactivate(sds);
+ if (ret < 0)
+ goto out;
+
ret = ctrl->cfg->setup_serdes(sds, hw_mode);
if (ret < 0)
goto out;
+ ret = sds->ops->activate(sds);
+ if (ret < 0)
+ goto out;
+
if (sds->ops->post_config) {
ret = sds->ops->post_config(sds, hw_mode);
if (ret < 0)
.write = rtpcs_generic_sds_op_write,
.set_autoneg = rtpcs_generic_sds_set_autoneg,
.restart_autoneg = rtpcs_generic_sds_restart_autoneg,
+ .deactivate = rtpcs_838x_sds_deactivate,
+ .activate = rtpcs_838x_sds_activate,
.post_config = rtpcs_838x_sds_post_config,
};
.write = rtpcs_generic_sds_op_write,
.set_autoneg = rtpcs_generic_sds_set_autoneg,
.restart_autoneg = rtpcs_generic_sds_restart_autoneg,
+ .deactivate = rtpcs_839x_sds_deactivate,
+ .activate = rtpcs_839x_sds_activate,
};
static const struct rtpcs_sds_regs rtpcs_839x_sds_regs = {
.reset_cmu = rtpcs_930x_sds_reset_cmu,
.reconfigure_to_pll = rtpcs_930x_sds_reconfigure_to_pll,
.config_polarity = rtpcs_930x_sds_config_polarity,
+ .deactivate = rtpcs_930x_sds_deactivate,
+ .activate = rtpcs_930x_sds_activate,
.post_config = rtpcs_930x_sds_post_config,
};
.set_pll_select = rtpcs_931x_sds_set_pll_select,
.reconfigure_to_pll = rtpcs_931x_sds_reconfigure_to_pll,
.config_polarity = rtpcs_931x_sds_config_polarity,
+ .deactivate = rtpcs_931x_sds_deactivate,
+ .activate = rtpcs_931x_sds_activate,
};
static const struct rtpcs_sds_regs rtpcs_931x_sds_regs = {