mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Diff
		
	
	
| --- linux-4.9.37/drivers/net/ethernet/goke/femac/phy_fix.c	1970-01-01 03:00:00.000000000 +0300
 | |
| +++ linux-4.9.y/drivers/net/ethernet/goke/femac/phy_fix.c	2021-06-07 13:01:33.000000000 +0300
 | |
| @@ -0,0 +1,83 @@
 | |
| +/*
 | |
| + * Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
 | |
| + */
 | |
| +
 | |
| +#include <linux/phy.h>
 | |
| +#include "phy_fix.h"
 | |
| +
 | |
| +static const u32 phy_v2_fix_param[] = {
 | |
| +#include "phy_v2.h"
 | |
| +};
 | |
| +
 | |
| +static const u32 phy_v1_fix_param[] = {
 | |
| +#include "phy_v1.h"
 | |
| +};
 | |
| +
 | |
| +static int phy_expanded_write_bulk(struct phy_device *phy_dev,
 | |
| +		  const u32 reg_and_val[], int count)
 | |
| +{
 | |
| +	int i, v;
 | |
| +	u32 reg_addr;
 | |
| +	u16 val;
 | |
| +
 | |
| +	v = phy_read(phy_dev, MII_BMCR);
 | |
| +	v = (u32)v | BMCR_PDOWN;
 | |
| +	phy_write(phy_dev, MII_BMCR, v);
 | |
| +
 | |
| +	for (i = 0; i < count; i += 2) { /* Process 2 data at a time. */
 | |
| +		reg_addr = reg_and_val[i];
 | |
| +		val = (u16)reg_and_val[i + 1];
 | |
| +		phy_write(phy_dev, MII_EXPMA, reg_addr);
 | |
| +		phy_write(phy_dev, MII_EXPMD, val);
 | |
| +	}
 | |
| +
 | |
| +	v = phy_read(phy_dev, MII_BMCR);
 | |
| +	v = (u32)v & (~BMCR_PDOWN);
 | |
| +	phy_write(phy_dev, MII_BMCR, v);
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +static int goke_fephy_v272_fix(struct phy_device *phy_dev)
 | |
| +{
 | |
| +	int count;
 | |
| +
 | |
| +	count = ARRAY_SIZE(phy_v2_fix_param);
 | |
| +	if (count % 2) /* must be an even number, mod 2 */
 | |
| +		pr_warn("internal FEPHY fix register count is not right.\n");
 | |
| +	phy_expanded_write_bulk(phy_dev, phy_v2_fix_param, count);
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +static int goke_fephy_v115_fix(struct phy_device *phy_dev)
 | |
| +{
 | |
| +	int count;
 | |
| +
 | |
| +	count = ARRAY_SIZE(phy_v1_fix_param);
 | |
| +	if (count % 2) /* must be an even number, mod 2 */
 | |
| +		pr_warn("internal FEPHY fix register count is not right.\n");
 | |
| +	phy_expanded_write_bulk(phy_dev, phy_v1_fix_param, count);
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +void phy_register_fixups(void)
 | |
| +{
 | |
| +	phy_register_fixup_for_uid(GOKE_PHY_ID_V272,
 | |
| +							   GOKE_PHY_MASK,
 | |
| +							   goke_fephy_v272_fix);
 | |
| +
 | |
| +	phy_register_fixup_for_uid(GOKE_PHY_ID_V115,
 | |
| +							   GOKE_PHY_MASK,
 | |
| +							   goke_fephy_v115_fix);
 | |
| +}
 | |
| +
 | |
| +void phy_unregister_fixups(void)
 | |
| +{
 | |
| +	phy_unregister_fixup_for_uid(GOKE_PHY_ID_V272,
 | |
| +								 GOKE_PHY_MASK);
 | |
| +
 | |
| +	phy_unregister_fixup_for_uid(GOKE_PHY_ID_V115,
 | |
| +								 GOKE_PHY_MASK);
 | |
| +}
 |