net: dsa: microchip: add separate struct ksz_chip_data for KSZ8563 chip
authorOleksij Rempel <o.rempel@pengutronix.de>
Fri, 26 Aug 2022 10:56:18 +0000 (12:56 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Aug 2022 08:40:39 +0000 (09:40 +0100)
Add separate entry for the KSZ8563 chip. According to the documentation
it can support Gbit only on RGMII port. So, we will need to be able to
describe in the followup patch.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h
drivers/net/dsa/microchip/ksz_spi.c

index 6bd69a7..5cadc83 100644 (file)
@@ -413,6 +413,29 @@ static const u8 lan937x_shifts[] = {
 };
 
 const struct ksz_chip_data ksz_switch_chips[] = {
+       [KSZ8563] = {
+               .chip_id = KSZ8563_CHIP_ID,
+               .dev_name = "KSZ8563",
+               .num_vlans = 4096,
+               .num_alus = 4096,
+               .num_statics = 16,
+               .cpu_ports = 0x07,      /* can be configured as cpu port */
+               .port_cnt = 3,          /* total port count */
+               .ops = &ksz9477_dev_ops,
+               .mib_names = ksz9477_mib_names,
+               .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
+               .reg_mib_cnt = MIB_COUNTER_NUM,
+               .regs = ksz9477_regs,
+               .masks = ksz9477_masks,
+               .shifts = ksz9477_shifts,
+               .xmii_ctrl0 = ksz9477_xmii_ctrl0,
+               .xmii_ctrl1 = ksz8795_xmii_ctrl1, /* Same as ksz8795 */
+               .supports_mii = {false, false, true},
+               .supports_rmii = {false, false, true},
+               .supports_rgmii = {false, false, true},
+               .internal_phy = {true, true, false},
+       },
+
        [KSZ8795] = {
                .chip_id = KSZ8795_CHIP_ID,
                .dev_name = "KSZ8795",
@@ -1366,6 +1389,7 @@ static enum dsa_tag_protocol ksz_get_tag_protocol(struct dsa_switch *ds,
                proto = DSA_TAG_PROTO_KSZ8795;
 
        if (dev->chip_id == KSZ8830_CHIP_ID ||
+           dev->chip_id == KSZ8563_CHIP_ID ||
            dev->chip_id == KSZ9893_CHIP_ID)
                proto = DSA_TAG_PROTO_KSZ9893;
 
@@ -1685,7 +1709,7 @@ static void ksz_phylink_mac_link_up(struct dsa_switch *ds, int port,
 
 static int ksz_switch_detect(struct ksz_device *dev)
 {
-       u8 id1, id2;
+       u8 id1, id2, id4;
        u16 id16;
        u32 id32;
        int ret;
@@ -1731,7 +1755,6 @@ static int ksz_switch_detect(struct ksz_device *dev)
                switch (id32) {
                case KSZ9477_CHIP_ID:
                case KSZ9897_CHIP_ID:
-               case KSZ9893_CHIP_ID:
                case KSZ9567_CHIP_ID:
                case LAN9370_CHIP_ID:
                case LAN9371_CHIP_ID:
@@ -1740,6 +1763,18 @@ static int ksz_switch_detect(struct ksz_device *dev)
                case LAN9374_CHIP_ID:
                        dev->chip_id = id32;
                        break;
+               case KSZ9893_CHIP_ID:
+                       ret = ksz_read8(dev, REG_CHIP_ID4,
+                                       &id4);
+                       if (ret)
+                               return ret;
+
+                       if (id4 == SKU_ID_KSZ8563)
+                               dev->chip_id = KSZ8563_CHIP_ID;
+                       else
+                               dev->chip_id = KSZ9893_CHIP_ID;
+
+                       break;
                default:
                        dev_err(dev->dev,
                                "unsupported switch detected %x)\n", id32);
index 0d9520d..eedcbcd 100644 (file)
@@ -124,6 +124,7 @@ struct ksz_device {
 
 /* List of supported models */
 enum ksz_model {
+       KSZ8563,
        KSZ8795,
        KSZ8794,
        KSZ8765,
@@ -140,6 +141,7 @@ enum ksz_model {
 };
 
 enum ksz_chip_id {
+       KSZ8563_CHIP_ID = 0x8563,
        KSZ8795_CHIP_ID = 0x8795,
        KSZ8794_CHIP_ID = 0x8794,
        KSZ8765_CHIP_ID = 0x8765,
@@ -483,6 +485,10 @@ static inline int is_lan937x(struct ksz_device *dev)
 
 #define SW_REV_ID_M                    GENMASK(7, 4)
 
+/* KSZ9893, KSZ9563, KSZ8563 specific register  */
+#define REG_CHIP_ID4                   0x0f
+#define SKU_ID_KSZ8563                 0x3c
+
 /* Driver set switch broadcast storm protection at 10% rate. */
 #define BROADCAST_STORM_PROT_RATE      10
 
index 05bd089..746b725 100644 (file)
@@ -160,7 +160,7 @@ static const struct of_device_id ksz_dt_ids[] = {
        },
        {
                .compatible = "microchip,ksz8563",
-               .data = &ksz_switch_chips[KSZ9893]
+               .data = &ksz_switch_chips[KSZ8563]
        },
        {
                .compatible = "microchip,ksz9567",