11bd4fe43Sopenharmony_ci/* 21bd4fe43Sopenharmony_ci * Copyright (c) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED. 31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License. 51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at 61bd4fe43Sopenharmony_ci * 71bd4fe43Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81bd4fe43Sopenharmony_ci * 91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and 131bd4fe43Sopenharmony_ci * limitations under the License. 141bd4fe43Sopenharmony_ci */ 151bd4fe43Sopenharmony_ci 161bd4fe43Sopenharmony_ci#ifndef MDIO_H 171bd4fe43Sopenharmony_ci#define MDIO_H 181bd4fe43Sopenharmony_ci 191bd4fe43Sopenharmony_ci#include "eth_mac.h" 201bd4fe43Sopenharmony_ci 211bd4fe43Sopenharmony_ci#ifdef __cplusplus 221bd4fe43Sopenharmony_ci#if __cplusplus 231bd4fe43Sopenharmony_ciextern "C" { 241bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 251bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 261bd4fe43Sopenharmony_ci 271bd4fe43Sopenharmony_ci#define MDIO_RWCTRL 0x1100 281bd4fe43Sopenharmony_ci#define MDIO_RO_DATA 0x1104 291bd4fe43Sopenharmony_ci#define U_MDIO_PHYADDR 0x0108 301bd4fe43Sopenharmony_ci#define D_MDIO_PHYADDR 0x2108 311bd4fe43Sopenharmony_ci#define U_MDIO_RO_STAT 0x010C 321bd4fe43Sopenharmony_ci#define D_MDIO_RO_STAT 0x210C 331bd4fe43Sopenharmony_ci#define U_MDIO_ANEG_CTRL 0x0110 341bd4fe43Sopenharmony_ci#define D_MDIO_ANEG_CTRL 0x2110 351bd4fe43Sopenharmony_ci#define U_MDIO_IRQENA 0x0114 361bd4fe43Sopenharmony_ci#define D_MDIO_IRQENA 0x2114 371bd4fe43Sopenharmony_ci 381bd4fe43Sopenharmony_ci#define MDIO_MK_RWCTL(cpuDataIn, finish, rw, phyExAddr, frqDiv, phyRegNum) \ 391bd4fe43Sopenharmony_ci (((uint32_t)(cpuDataIn) << 16) | \ 401bd4fe43Sopenharmony_ci (((finish) & 0x01) << 15) | \ 411bd4fe43Sopenharmony_ci (((rw) & 0x01) << 13) | \ 421bd4fe43Sopenharmony_ci (((uint32_t)(phyExAddr) & 0x1F) << 8) | \ 431bd4fe43Sopenharmony_ci (((uint32_t)(frqDiv) & 0x7) << 5) | \ 441bd4fe43Sopenharmony_ci ((uint32_t)(phyRegNum) & 0x1F)) 451bd4fe43Sopenharmony_ci 461bd4fe43Sopenharmony_ci/* hardware set bit'15 of MDIO_REG(0) if mdio ready */ 471bd4fe43Sopenharmony_ci#define TestMdioReady(ld) (HiethRead(ld, MDIO_RWCTRL) & (1 << 15)) 481bd4fe43Sopenharmony_ci 491bd4fe43Sopenharmony_ci#define MdioStartPhyread(ld, phyAddr, regNum) \ 501bd4fe43Sopenharmony_ci HiethWrite(ld, MDIO_MK_RWCTL(0, 0, 0, phyAddr, (ld)->mdioFrqdiv, regNum), MDIO_RWCTRL) 511bd4fe43Sopenharmony_ci 521bd4fe43Sopenharmony_ci#define MdioGetPhyreadVal(ld) (HiethRead(ld, MDIO_RO_DATA) & 0xFFFF) 531bd4fe43Sopenharmony_ci 541bd4fe43Sopenharmony_ci#define MdioPhyWrite(ld, phyAddr, regNum, val) \ 551bd4fe43Sopenharmony_ci HiethWrite(ld, MDIO_MK_RWCTL(val, 0, 1, phyAddr, (ld)->mdioFrqdiv, regNum), MDIO_RWCTRL) 561bd4fe43Sopenharmony_ci 571bd4fe43Sopenharmony_ci/* write mdio registers reset value */ 581bd4fe43Sopenharmony_ci#define MdioRegReset(ld) \ 591bd4fe43Sopenharmony_ci do { \ 601bd4fe43Sopenharmony_ci HiethWrite(ld, 0x00008000, MDIO_RWCTRL); \ 611bd4fe43Sopenharmony_ci HiethWrite(ld, 0x00000001, U_MDIO_PHYADDR); \ 621bd4fe43Sopenharmony_ci HiethWrite(ld, 0x00000001, D_MDIO_PHYADDR); \ 631bd4fe43Sopenharmony_ci HiethWrite(ld, 0x04631EA9, U_MDIO_ANEG_CTRL); \ 641bd4fe43Sopenharmony_ci HiethWrite(ld, 0x04631EA9, D_MDIO_ANEG_CTRL); \ 651bd4fe43Sopenharmony_ci HiethWrite(ld, 0x00000000, U_MDIO_IRQENA); \ 661bd4fe43Sopenharmony_ci HiethWrite(ld, 0x00000000, D_MDIO_IRQENA); \ 671bd4fe43Sopenharmony_ci } while (0) 681bd4fe43Sopenharmony_ci 691bd4fe43Sopenharmony_ciint32_t HiethMdioRead(struct HiethNetdevLocal *ld, int32_t phyAddr, int32_t regNum); 701bd4fe43Sopenharmony_ciint32_t HiethMdioWrite(struct HiethNetdevLocal *ld, int32_t phyAddr, int32_t regNum, int32_t val); 711bd4fe43Sopenharmony_ciint32_t HiethMdioReset(struct HiethNetdevLocal *ld); 721bd4fe43Sopenharmony_ciint32_t HiethMdioInit(struct HiethNetdevLocal *ld); 731bd4fe43Sopenharmony_civoid HiethMdioExit(struct HiethNetdevLocal *ld); 741bd4fe43Sopenharmony_ci 751bd4fe43Sopenharmony_ci#ifdef __cplusplus 761bd4fe43Sopenharmony_ci#if __cplusplus 771bd4fe43Sopenharmony_ci} 781bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 791bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 801bd4fe43Sopenharmony_ci 811bd4fe43Sopenharmony_ci#endif /* MDIO_H */ 82