Blame view
drivers/net/fsl_mdio.c
2.55 KB
063c12633
|
1 |
/* |
5be00a016
|
2 |
* Copyright 2009-2010, 2013 Freescale Semiconductor, Inc. |
063c12633
|
3 4 5 |
* Jun-jie Zhang <b18070@freescale.com> * Mingkai Hu <Mingkai.hu@freescale.com> * |
1a4596601
|
6 |
* SPDX-License-Identifier: GPL-2.0+ |
063c12633
|
7 |
*/ |
9872b736f
|
8 |
|
063c12633
|
9 10 11 12 13 14 |
#include <common.h> #include <miiphy.h> #include <phy.h> #include <fsl_mdio.h> #include <asm/io.h> #include <asm/errno.h> |
063c12633
|
15 |
|
5be00a016
|
16 |
void tsec_local_mdio_write(struct tsec_mii_mng __iomem *phyregs, int port_addr, |
063c12633
|
17 18 19 20 21 22 |
int dev_addr, int regnum, int value) { int timeout = 1000000; out_be32(&phyregs->miimadd, (port_addr << 8) | (regnum & 0x1f)); out_be32(&phyregs->miimcon, value); |
d2614ea0f
|
23 24 |
/* Memory barrier */ mb(); |
063c12633
|
25 26 27 28 |
while ((in_be32(&phyregs->miimind) & MIIMIND_BUSY) && timeout--) ; } |
5be00a016
|
29 |
int tsec_local_mdio_read(struct tsec_mii_mng __iomem *phyregs, int port_addr, |
063c12633
|
30 31 32 33 |
int dev_addr, int regnum) { int value; int timeout = 1000000; |
9872b736f
|
34 |
/* Put the address of the phy, and the register number into MIIMADD */ |
063c12633
|
35 36 37 38 |
out_be32(&phyregs->miimadd, (port_addr << 8) | (regnum & 0x1f)); /* Clear the command register, and wait */ out_be32(&phyregs->miimcom, 0); |
d2614ea0f
|
39 40 |
/* Memory barrier */ mb(); |
063c12633
|
41 42 43 |
/* Initiate a read command, and wait */ out_be32(&phyregs->miimcom, MIIMCOM_READ_CYCLE); |
d2614ea0f
|
44 45 |
/* Memory barrier */ mb(); |
063c12633
|
46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
/* Wait for the the indication that the read is done */ while ((in_be32(&phyregs->miimind) & (MIIMIND_NOTVALID | MIIMIND_BUSY)) && timeout--) ; /* Grab the value read from the PHY */ value = in_be32(&phyregs->miimstat); return value; } static int fsl_pq_mdio_reset(struct mii_dev *bus) { |
5be00a016
|
60 61 |
struct tsec_mii_mng __iomem *regs = (struct tsec_mii_mng __iomem *)bus->priv; |
063c12633
|
62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
/* Reset MII (due to new addresses) */ out_be32(®s->miimcfg, MIIMCFG_RESET_MGMT); out_be32(®s->miimcfg, MIIMCFG_INIT_VALUE); while (in_be32(®s->miimind) & MIIMIND_BUSY) ; return 0; } int tsec_phy_read(struct mii_dev *bus, int addr, int dev_addr, int regnum) { |
5be00a016
|
76 77 |
struct tsec_mii_mng __iomem *phyregs = (struct tsec_mii_mng __iomem *)bus->priv; |
063c12633
|
78 79 80 81 82 83 84 |
return tsec_local_mdio_read(phyregs, addr, dev_addr, regnum); } int tsec_phy_write(struct mii_dev *bus, int addr, int dev_addr, int regnum, u16 value) { |
5be00a016
|
85 86 |
struct tsec_mii_mng __iomem *phyregs = (struct tsec_mii_mng __iomem *)bus->priv; |
063c12633
|
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
tsec_local_mdio_write(phyregs, addr, dev_addr, regnum, value); return 0; } int fsl_pq_mdio_init(bd_t *bis, struct fsl_pq_mdio_info *info) { struct mii_dev *bus = mdio_alloc(); if (!bus) { printf("Failed to allocate FSL MDIO bus "); return -1; } bus->read = tsec_phy_read; bus->write = tsec_phy_write; bus->reset = fsl_pq_mdio_reset; |
192bc6948
|
106 |
strcpy(bus->name, info->name); |
063c12633
|
107 |
|
5be00a016
|
108 |
bus->priv = (void *)info->regs; |
063c12633
|
109 110 111 |
return mdio_register(bus); } |