[U-Boot] [PATCH] [U-boot] net/phy/cortina: Add support for CS4223 PHY
Joe Hershberger
joe.hershberger at ni.com
Tue May 1 23:06:20 UTC 2018
Hi Vicentiu,
On Mon, Apr 23, 2018 at 7:02 AM, Vicentiu Galanopulo
<vicentiu.galanopulo at nxp.com> wrote:
> Add support for Cortina CS4223 10G PHY
> - As per the CS4223 specs, an EEPROM module is
> connected to the PHY. At startup the PHY reads
> the firmware line and tries to load the firmware
> into the internal memory.
> - This driver reads the EEPROM status
> and checks if firmware has been loaded
>
> Signed-off-by: Vicentiu Galanopulo <vicentiu.galanopulo at nxp.com>
> ---
> drivers/net/phy/cortina.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-
> include/cortina.h | 4 ++++
> include/phy.h | 1 +
> 3 files changed, 52 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/phy/cortina.c b/drivers/net/phy/cortina.c
> index 9cb3a52..cb6dc56 100644
> --- a/drivers/net/phy/cortina.c
> +++ b/drivers/net/phy/cortina.c
> @@ -285,6 +285,38 @@ int cs4340_startup(struct phy_device *phydev)
> return 0;
> }
>
> +int cs4223_phy_init(struct phy_device *phydev)
> +{
> + int reg_value;
> +
> + reg_value = phy_read(phydev, 0x00, CS4223_EEPROM_STATUS);
> + if (!(reg_value & CS4223_EEPROM_FIRMWARE_LOADDONE)) {
> + printf("%s CS4223 Firmware not present in EERPOM\n", __func__);
> + return -1;
You should return a real errno here. Something like: return -ENOSYS;
> + }
> +
> + return 0;
> +}
> +
> +int cs4223_config(struct phy_device *phydev)
> +{
> + return cs4223_phy_init(phydev);
> +}
> +
> +int cs4223_probe(struct phy_device *phydev)
> +{
> + phydev->flags = PHY_FLAG_BROKEN_RESET;
> + return 0;
> +}
> +
> +int cs4223_startup(struct phy_device *phydev)
> +{
> + phydev->link = 1;
> + phydev->speed = SPEED_10000;
> + phydev->duplex = DUPLEX_FULL;
> + return 0;
> +}
> +
> struct phy_driver cs4340_driver = {
> .name = "Cortina CS4315/CS4340",
> .uid = PHY_UID_CS4340,
> @@ -299,9 +331,23 @@ struct phy_driver cs4340_driver = {
> .shutdown = &gen10g_shutdown,
> };
>
> +struct phy_driver cs4223_driver = {
> + .name = "Cortina CS4223",
> + .uid = PHY_UID_CS4223,
> + .mask = 0x0ffff00f,
> + .features = PHY_10G_FEATURES,
> + .mmds = (MDIO_DEVS_PMAPMD | MDIO_DEVS_PCS |
> + MDIO_DEVS_AN),
> + .config = &cs4223_config,
> + .probe = &cs4223_probe,
> + .startup = &cs4223_startup,
> + .shutdown = &gen10g_shutdown,
> +};
> +
> int phy_cortina_init(void)
> {
> phy_register(&cs4340_driver);
> + phy_register(&cs4223_driver);
> return 0;
> }
>
> @@ -320,7 +366,7 @@ int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id)
> return -EIO;
> *phy_id |= (phy_reg & 0xffff);
>
> - if (*phy_id == PHY_UID_CS4340)
> + if ((*phy_id == PHY_UID_CS4340) || (*phy_id == PHY_UID_CS4223))
> return 0;
>
> /*
> diff --git a/include/cortina.h b/include/cortina.h
> index 6cadd28..b64cb44 100644
> --- a/include/cortina.h
> +++ b/include/cortina.h
> @@ -65,6 +65,10 @@
> #define VILLA_LINE_SDS_COMMON_STX0_TX_OUTPUT_CTRLA 0x427
> #define VILLA_LINE_SDS_COMMON_STX0_TX_OUTPUT_CTRLB 0x428
>
> +/* Cortina CS4223 */
> +#define CS4223_EEPROM_STATUS 0x5001
> +#define CS4223_EEPROM_FIRMWARE_LOADDONE 0x1
> +
> #define mseq_edc_bist_done (0x1<<0)
> #define mseq_edc_bist_fail (0x1<<8)
>
> diff --git a/include/phy.h b/include/phy.h
> index 0543ec1..2239317 100644
> --- a/include/phy.h
> +++ b/include/phy.h
> @@ -315,6 +315,7 @@ static inline bool phy_interface_is_sgmii(struct phy_device *phydev)
>
> /* PHY UIDs for various PHYs that are referenced in external code */
> #define PHY_UID_CS4340 0x13e51002
> +#define PHY_UID_CS4223 0x03e57003
> #define PHY_UID_TN2020 0x00a19410
>
> #endif
> --
> 1.9.3
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
More information about the U-Boot
mailing list