Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: phy: dp83867: Add binding for the CLK_OUT pin muxing option

The DP83867 has a muxing option for the CLK_OUT pin. It is possible
to set CLK_OUT for different channels.
Create a binding to select a specific clock for CLK_OUT pin.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Signed-off-by: Daniel Schultz <d.schultz@phytec.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Wadim Egorov and committed by
David S. Miller
9708fb63 37c64cf6

+33
+19
drivers/net/phy/dp83867.c
··· 75 75 76 76 #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MAX 0x0 77 77 #define DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN 0x1f 78 + #define DP83867_IO_MUX_CFG_CLK_O_SEL_MASK (0x1f << 8) 79 + #define DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT 8 78 80 79 81 /* CFG4 bits */ 80 82 #define DP83867_CFG4_PORT_MIRROR_EN BIT(0) ··· 94 92 int io_impedance; 95 93 int port_mirroring; 96 94 bool rxctrl_strap_quirk; 95 + int clk_output_sel; 97 96 }; 98 97 99 98 static int dp83867_ack_interrupt(struct phy_device *phydev) ··· 163 160 dp83867->io_impedance = -EINVAL; 164 161 165 162 /* Optional configuration */ 163 + ret = of_property_read_u32(of_node, "ti,clk-output-sel", 164 + &dp83867->clk_output_sel); 165 + if (ret || dp83867->clk_output_sel > DP83867_CLK_O_SEL_REF_CLK) 166 + /* Keep the default value if ti,clk-output-sel is not set 167 + * or too high 168 + */ 169 + dp83867->clk_output_sel = DP83867_CLK_O_SEL_REF_CLK; 170 + 166 171 if (of_property_read_bool(of_node, "ti,max-output-impedance")) 167 172 dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MAX; 168 173 else if (of_property_read_bool(of_node, "ti,min-output-impedance")) ··· 305 294 306 295 if (dp83867->port_mirroring != DP83867_PORT_MIRROING_KEEP) 307 296 dp83867_config_port_mirroring(phydev); 297 + 298 + /* Clock output selection if muxing property is set */ 299 + if (dp83867->clk_output_sel != DP83867_CLK_O_SEL_REF_CLK) { 300 + val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_IO_MUX_CFG); 301 + val &= ~DP83867_IO_MUX_CFG_CLK_O_SEL_MASK; 302 + val |= (dp83867->clk_output_sel << DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT); 303 + phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_IO_MUX_CFG, val); 304 + } 308 305 309 306 return 0; 310 307 }
+14
include/dt-bindings/net/ti-dp83867.h
··· 42 42 #define DP83867_RGMIIDCTL_3_75_NS 0xe 43 43 #define DP83867_RGMIIDCTL_4_00_NS 0xf 44 44 45 + /* IO_MUX_CFG - Clock output selection */ 46 + #define DP83867_CLK_O_SEL_CHN_A_RCLK 0x0 47 + #define DP83867_CLK_O_SEL_CHN_B_RCLK 0x1 48 + #define DP83867_CLK_O_SEL_CHN_C_RCLK 0x2 49 + #define DP83867_CLK_O_SEL_CHN_D_RCLK 0x3 50 + #define DP83867_CLK_O_SEL_CHN_A_RCLK_DIV5 0x4 51 + #define DP83867_CLK_O_SEL_CHN_B_RCLK_DIV5 0x5 52 + #define DP83867_CLK_O_SEL_CHN_C_RCLK_DIV5 0x6 53 + #define DP83867_CLK_O_SEL_CHN_D_RCLK_DIV5 0x7 54 + #define DP83867_CLK_O_SEL_CHN_A_TCLK 0x8 55 + #define DP83867_CLK_O_SEL_CHN_B_TCLK 0x9 56 + #define DP83867_CLK_O_SEL_CHN_C_TCLK 0xA 57 + #define DP83867_CLK_O_SEL_CHN_D_TCLK 0xB 58 + #define DP83867_CLK_O_SEL_REF_CLK 0xC 45 59 #endif