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

Merge branch 'net-dsa-microchip-add-lan9646-switch-support'

Tristram Ha says:

====================
net: dsa: microchip: Add LAN9646 switch support

This series of patches is to add LAN9646 switch support to the KSZ DSA
driver.
====================

Link: https://patch.msgid.link/20241109015705.82685-1-Tristram.Ha@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+75 -3
+1
Documentation/devicetree/bindings/net/dsa/microchip,ksz.yaml
··· 34 34 - microchip,ksz9563 35 35 - microchip,ksz8563 36 36 - microchip,ksz8567 37 + - microchip,lan9646 37 38 38 39 reset-gpios: 39 40 description:
+4
drivers/net/dsa/microchip/ksz9477.c
··· 1131 1131 if (i == dev->cpu_port) 1132 1132 continue; 1133 1133 ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED); 1134 + 1135 + /* Power down the internal PHY if port is unused. */ 1136 + if (dsa_is_unused_port(ds, i) && dev->info->internal_phy[i]) 1137 + ksz_pwrite16(dev, i, 0x100, BMCR_PDOWN); 1134 1138 } 1135 1139 } 1136 1140
+13 -1
drivers/net/dsa/microchip/ksz9477_i2c.c
··· 2 2 /* 3 3 * Microchip KSZ9477 series register access through I2C 4 4 * 5 - * Copyright (C) 2018-2019 Microchip Technology Inc. 5 + * Copyright (C) 2018-2024 Microchip Technology Inc. 6 6 */ 7 7 8 8 #include <linux/i2c.h> ··· 16 16 17 17 static int ksz9477_i2c_probe(struct i2c_client *i2c) 18 18 { 19 + const struct ksz_chip_data *chip; 20 + struct device *ddev = &i2c->dev; 19 21 struct regmap_config rc; 20 22 struct ksz_device *dev; 21 23 int i, ret; ··· 26 24 if (!dev) 27 25 return -ENOMEM; 28 26 27 + chip = device_get_match_data(ddev); 28 + if (!chip) 29 + return -EINVAL; 30 + 31 + /* Save chip id to do special initialization when probing. */ 32 + dev->chip_id = chip->chip_id; 29 33 for (i = 0; i < __KSZ_NUM_REGMAPS; i++) { 30 34 rc = ksz9477_regmap_config[i]; 31 35 rc.lock_arg = &dev->regmap_mutex; ··· 118 110 { 119 111 .compatible = "microchip,ksz9567", 120 112 .data = &ksz_switch_chips[KSZ9567] 113 + }, 114 + { 115 + .compatible = "microchip,lan9646", 116 + .data = &ksz_switch_chips[LAN9646] 121 117 }, 122 118 {}, 123 119 };
+48 -2
drivers/net/dsa/microchip/ksz_common.c
··· 1908 1908 .internal_phy = {true, true, true, true, 1909 1909 false, false, true, true}, 1910 1910 }, 1911 + 1912 + [LAN9646] = { 1913 + .chip_id = LAN9646_CHIP_ID, 1914 + .dev_name = "LAN9646", 1915 + .num_vlans = 4096, 1916 + .num_alus = 4096, 1917 + .num_statics = 16, 1918 + .cpu_ports = 0x7F, /* can be configured as cpu port */ 1919 + .port_cnt = 7, /* total physical port count */ 1920 + .port_nirqs = 4, 1921 + .num_tx_queues = 4, 1922 + .num_ipms = 8, 1923 + .ops = &ksz9477_dev_ops, 1924 + .phylink_mac_ops = &ksz9477_phylink_mac_ops, 1925 + .phy_errata_9477 = true, 1926 + .mib_names = ksz9477_mib_names, 1927 + .mib_cnt = ARRAY_SIZE(ksz9477_mib_names), 1928 + .reg_mib_cnt = MIB_COUNTER_NUM, 1929 + .regs = ksz9477_regs, 1930 + .masks = ksz9477_masks, 1931 + .shifts = ksz9477_shifts, 1932 + .xmii_ctrl0 = ksz9477_xmii_ctrl0, 1933 + .xmii_ctrl1 = ksz9477_xmii_ctrl1, 1934 + .supports_mii = {false, false, false, false, 1935 + false, true, true}, 1936 + .supports_rmii = {false, false, false, false, 1937 + false, true, true}, 1938 + .supports_rgmii = {false, false, false, false, 1939 + false, true, true}, 1940 + .internal_phy = {true, true, true, true, 1941 + true, false, false}, 1942 + .gbit_capable = {true, true, true, true, true, true, true}, 1943 + .wr_table = &ksz9477_register_set, 1944 + .rd_table = &ksz9477_register_set, 1945 + }, 1911 1946 }; 1912 1947 EXPORT_SYMBOL_GPL(ksz_switch_chips); 1913 1948 ··· 3005 2970 case KSZ9896_CHIP_ID: 3006 2971 /* KSZ9896C Errata DS80000757A Module 3 */ 3007 2972 case KSZ9897_CHIP_ID: 2973 + case LAN9646_CHIP_ID: 3008 2974 /* KSZ9897R Errata DS80000758C Module 4 */ 3009 2975 /* Energy Efficient Ethernet (EEE) feature select must be manually disabled 3010 2976 * The EEE feature is enabled by default, but it is not fully ··· 3266 3230 case KSZ9893_CHIP_ID: 3267 3231 case KSZ9896_CHIP_ID: 3268 3232 case KSZ9897_CHIP_ID: 3233 + case LAN9646_CHIP_ID: 3269 3234 if (dsa_is_user_port(ds, port)) 3270 3235 ksz9477_port_acl_free(dev, port); 3271 3236 } ··· 3323 3286 dev->chip_id == KSZ9477_CHIP_ID || 3324 3287 dev->chip_id == KSZ9896_CHIP_ID || 3325 3288 dev->chip_id == KSZ9897_CHIP_ID || 3326 - dev->chip_id == KSZ9567_CHIP_ID) 3289 + dev->chip_id == KSZ9567_CHIP_ID || 3290 + dev->chip_id == LAN9646_CHIP_ID) 3327 3291 proto = DSA_TAG_PROTO_KSZ9477; 3328 3292 3329 3293 if (is_lan937x(dev)) ··· 3443 3405 case LAN9372_CHIP_ID: 3444 3406 case LAN9373_CHIP_ID: 3445 3407 case LAN9374_CHIP_ID: 3408 + case LAN9646_CHIP_ID: 3446 3409 return KSZ9477_MAX_FRAME_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN; 3447 3410 } 3448 3411 ··· 3466 3427 case KSZ9893_CHIP_ID: 3467 3428 case KSZ9896_CHIP_ID: 3468 3429 case KSZ9897_CHIP_ID: 3430 + case LAN9646_CHIP_ID: 3469 3431 return 0; 3470 3432 } 3471 3433 ··· 3819 3779 case LAN9372_CHIP_ID: 3820 3780 case LAN9373_CHIP_ID: 3821 3781 case LAN9374_CHIP_ID: 3822 - dev->chip_id = id32; 3782 + 3783 + /* LAN9646 does not have its own chip id. */ 3784 + if (dev->chip_id != LAN9646_CHIP_ID) 3785 + dev->chip_id = id32; 3823 3786 break; 3824 3787 case KSZ9893_CHIP_ID: 3825 3788 ret = ksz_read8(dev, REG_CHIP_ID4, ··· 3861 3818 case KSZ9893_CHIP_ID: 3862 3819 case KSZ9896_CHIP_ID: 3863 3820 case KSZ9897_CHIP_ID: 3821 + case LAN9646_CHIP_ID: 3864 3822 return ksz9477_cls_flower_add(ds, port, cls, ingress); 3865 3823 } 3866 3824 ··· 3882 3838 case KSZ9893_CHIP_ID: 3883 3839 case KSZ9896_CHIP_ID: 3884 3840 case KSZ9897_CHIP_ID: 3841 + case LAN9646_CHIP_ID: 3885 3842 return ksz9477_cls_flower_del(ds, port, cls, ingress); 3886 3843 } 3887 3844 ··· 4970 4925 case KSZ9893_CHIP_ID: 4971 4926 case KSZ9896_CHIP_ID: 4972 4927 case KSZ9897_CHIP_ID: 4928 + case LAN9646_CHIP_ID: 4973 4929 return ksz9477_drive_strength_write(dev, of_props, 4974 4930 ARRAY_SIZE(of_props)); 4975 4931 default:
+1
drivers/net/dsa/microchip/ksz_common.h
··· 236 236 LAN9372, 237 237 LAN9373, 238 238 LAN9374, 239 + LAN9646, 239 240 }; 240 241 241 242 enum ksz_regs {
+7
drivers/net/dsa/microchip/ksz_spi.c
··· 54 54 if (!chip) 55 55 return -EINVAL; 56 56 57 + /* Save chip id to do special initialization when probing. */ 58 + dev->chip_id = chip->chip_id; 57 59 if (chip->chip_id == KSZ88X3_CHIP_ID) 58 60 regmap_config = ksz8863_regmap_config; 59 61 else if (chip->chip_id == KSZ8795_CHIP_ID || ··· 205 203 .compatible = "microchip,lan9374", 206 204 .data = &ksz_switch_chips[LAN9374] 207 205 }, 206 + { 207 + .compatible = "microchip,lan9646", 208 + .data = &ksz_switch_chips[LAN9646] 209 + }, 208 210 {}, 209 211 }; 210 212 MODULE_DEVICE_TABLE(of, ksz_dt_ids); ··· 234 228 { "lan9372" }, 235 229 { "lan9373" }, 236 230 { "lan9374" }, 231 + { "lan9646" }, 237 232 { }, 238 233 }; 239 234 MODULE_DEVICE_TABLE(spi, ksz_spi_ids);
+1
include/linux/platform_data/microchip-ksz.h
··· 42 42 LAN9372_CHIP_ID = 0x00937200, 43 43 LAN9373_CHIP_ID = 0x00937300, 44 44 LAN9374_CHIP_ID = 0x00937400, 45 + LAN9646_CHIP_ID = 0x00964600, 45 46 }; 46 47 47 48 struct ksz_platform_data {