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