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

net: hns: add attribute cpld_ctrl for dsaf port node

This patch adds attribute cpld_ctrl for dsaf port node, parses the syscon
for mac_cb from dts, and changes the method of access the cpld related
registers through syscon.

Signed-off-by: Daode Huang <huangdaode@hisilicon.com>
Signed-off-by: Yisen Zhuang <yisen.zhuang@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Yisen.Zhuang\(Zhuangyuzeng\) and committed by
David S. Miller
31d4446d 831d828b

+51 -34
+1 -1
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
··· 664 664 665 665 assert(handle); 666 666 mac_cb = hns_get_mac_cb(handle); 667 - if (!mac_cb->cpld_vaddr) 667 + if (!mac_cb->cpld_ctrl) 668 668 return; 669 669 hns_set_led_opt(mac_cb); 670 670 }
+21 -17
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
··· 82 82 } 83 83 } 84 84 85 - int hns_mac_get_sfp_prsnt(struct hns_mac_cb *mac_cb, int *sfp_prsnt) 86 - { 87 - if (!mac_cb->cpld_vaddr) 88 - return -ENODEV; 89 - 90 - *sfp_prsnt = !dsaf_read_b((u8 *)mac_cb->cpld_vaddr 91 - + MAC_SFP_PORT_OFFSET); 92 - 93 - return 0; 94 - } 95 - 96 85 void hns_mac_get_link_status(struct hns_mac_cb *mac_cb, u32 *link_status) 97 86 { 98 87 struct mac_driver *mac_ctrl_drv; ··· 647 658 { 648 659 struct device_node *np = mac_cb->dev->of_node; 649 660 struct regmap *syscon; 661 + u32 ret; 662 + 650 663 mac_cb->link = false; 651 664 mac_cb->half_duplex = false; 652 665 mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if]; ··· 692 701 return -EINVAL; 693 702 } 694 703 mac_cb->serdes_ctrl = syscon; 704 + 705 + syscon = syscon_node_to_regmap( 706 + of_parse_phandle(to_of_node(mac_cb->fw_port), 707 + "cpld-syscon", 0)); 708 + if (IS_ERR_OR_NULL(syscon)) { 709 + dev_dbg(mac_cb->dev, "no cpld-syscon found!\n"); 710 + mac_cb->cpld_ctrl = NULL; 711 + } else { 712 + mac_cb->cpld_ctrl = syscon; 713 + ret = fwnode_property_read_u32(mac_cb->fw_port, 714 + "cpld-ctrl-reg", 715 + &mac_cb->cpld_ctrl_reg); 716 + if (ret) { 717 + dev_err(mac_cb->dev, "get cpld-ctrl-reg fail!\n"); 718 + return ret; 719 + } 720 + } 695 721 return 0; 696 722 } 697 723 ··· 759 751 mac_cb->sys_ctl_vaddr = dsaf_dev->sc_base; 760 752 mac_cb->serdes_vaddr = dsaf_dev->sds_base; 761 753 762 - if (dsaf_dev->cpld_base && !HNS_DSAF_IS_DEBUG(dsaf_dev)) { 763 - mac_cb->cpld_vaddr = dsaf_dev->cpld_base + 764 - mac_cb->mac_id * CPLD_ADDR_PORT_OFFSET; 765 - cpld_led_reset(mac_cb); 766 - } 767 754 mac_cb->sfp_prsnt = 0; 768 755 mac_cb->txpkt_for_led = 0; 769 756 mac_cb->rxpkt_for_led = 0; ··· 783 780 if (ret) 784 781 return ret; 785 782 783 + cpld_led_reset(mac_cb); 786 784 mac_cb->vaddr = hns_mac_get_vaddr(dsaf_dev, mac_cb, mac_mode_idx); 787 785 788 786 return 0; ··· 960 956 int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb, 961 957 enum hnae_led_state status) 962 958 { 963 - if (!mac_cb || !mac_cb->cpld_vaddr) 959 + if (!mac_cb || !mac_cb->cpld_ctrl) 964 960 return 0; 965 961 966 962 return cpld_set_led_id(mac_cb, status);
+2 -1
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.h
··· 313 313 struct mac_priv priv; 314 314 struct fwnode_handle *fw_port; 315 315 u8 __iomem *vaddr; 316 - u8 __iomem *cpld_vaddr; 317 316 u8 __iomem *sys_ctl_vaddr; 318 317 u8 __iomem *serdes_vaddr; 319 318 struct regmap *serdes_ctrl; 319 + struct regmap *cpld_ctrl; 320 + u32 cpld_ctrl_reg; 320 321 struct mac_entry_idx addr_entry_idx[DSAF_MAX_VM_NUM]; 321 322 u8 sfp_prsnt; 322 323 u8 cpld_led_value;
-5
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
··· 189 189 iounmap(dsaf_dev->sds_base); 190 190 if (dsaf_dev->sc_base) 191 191 iounmap(dsaf_dev->sc_base); 192 - if (dsaf_dev->cpld_base) 193 - iounmap(dsaf_dev->cpld_base); 194 192 return ret; 195 193 } 196 194 ··· 205 207 206 208 if (dsaf_dev->sc_base) 207 209 iounmap(dsaf_dev->sc_base); 208 - 209 - if (dsaf_dev->cpld_base) 210 - iounmap(dsaf_dev->cpld_base); 211 210 } 212 211 213 212 /**
-1
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
··· 277 277 u8 __iomem *sds_base; 278 278 u8 __iomem *ppe_base; 279 279 u8 __iomem *io_base; 280 - u8 __iomem *cpld_base; 281 280 struct regmap *sub_ctrl; 282 281 phys_addr_t ppe_paddr; 283 282
+27 -9
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
··· 42 42 pr_err("sfp_led_opt mac_dev is null!\n"); 43 43 return; 44 44 } 45 - if (!mac_cb->cpld_vaddr) { 46 - dev_err(mac_cb->dev, "mac_id=%d, cpld_vaddr is null !\n", 45 + if (!mac_cb->cpld_ctrl) { 46 + dev_err(mac_cb->dev, "mac_id=%d, cpld syscon is null !\n", 47 47 mac_cb->mac_id); 48 48 return; 49 49 } ··· 60 60 dsaf_set_bit(value, DSAF_LED_DATA_B, data); 61 61 62 62 if (value != mac_cb->cpld_led_value) { 63 - dsaf_write_b(mac_cb->cpld_vaddr, value); 63 + dsaf_write_syscon(mac_cb->cpld_ctrl, 64 + mac_cb->cpld_ctrl_reg, value); 64 65 mac_cb->cpld_led_value = value; 65 66 } 66 67 } else { 67 - dsaf_write_b(mac_cb->cpld_vaddr, CPLD_LED_DEFAULT_VALUE); 68 + dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg, 69 + CPLD_LED_DEFAULT_VALUE); 68 70 mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE; 69 71 } 70 72 } 71 73 72 74 void cpld_led_reset(struct hns_mac_cb *mac_cb) 73 75 { 74 - if (!mac_cb || !mac_cb->cpld_vaddr) 76 + if (!mac_cb || !mac_cb->cpld_ctrl) 75 77 return; 76 78 77 - dsaf_write_b(mac_cb->cpld_vaddr, CPLD_LED_DEFAULT_VALUE); 79 + dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg, 80 + CPLD_LED_DEFAULT_VALUE); 78 81 mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE; 79 82 } 80 83 ··· 86 83 { 87 84 switch (status) { 88 85 case HNAE_LED_ACTIVE: 89 - mac_cb->cpld_led_value = dsaf_read_b(mac_cb->cpld_vaddr); 86 + mac_cb->cpld_led_value = 87 + dsaf_read_syscon(mac_cb->cpld_ctrl, 88 + mac_cb->cpld_ctrl_reg); 90 89 dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B, 91 90 CPLD_LED_ON_VALUE); 92 - dsaf_write_b(mac_cb->cpld_vaddr, mac_cb->cpld_led_value); 91 + dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg, 92 + mac_cb->cpld_led_value); 93 93 return 2; 94 94 case HNAE_LED_INACTIVE: 95 95 dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B, 96 96 CPLD_LED_DEFAULT_VALUE); 97 - dsaf_write_b(mac_cb->cpld_vaddr, mac_cb->cpld_led_value); 97 + dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg, 98 + mac_cb->cpld_led_value); 98 99 break; 99 100 default: 100 101 break; ··· 306 299 phy_if = PHY_INTERFACE_MODE_SGMII; 307 300 } 308 301 return phy_if; 302 + } 303 + 304 + int hns_mac_get_sfp_prsnt(struct hns_mac_cb *mac_cb, int *sfp_prsnt) 305 + { 306 + if (!mac_cb->cpld_ctrl) 307 + return -ENODEV; 308 + 309 + *sfp_prsnt = !dsaf_read_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg 310 + + MAC_SFP_PORT_OFFSET); 311 + 312 + return 0; 309 313 } 310 314 311 315 /**