^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * License. See the file "COPYING" in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <bcm63xx_dev_enet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <bcm63xx_io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <bcm63xx_regs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) static const unsigned long bcm6348_regs_enetdmac[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) [ENETDMAC_CHANCFG] = ENETDMAC_CHANCFG_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) [ENETDMAC_IR] = ENETDMAC_IR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) [ENETDMAC_IRMASK] = ENETDMAC_IRMASK_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) [ENETDMAC_MAXBURST] = ENETDMAC_MAXBURST_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static const unsigned long bcm6345_regs_enetdmac[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) [ENETDMAC_CHANCFG] = ENETDMA_6345_CHANCFG_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) [ENETDMAC_IR] = ENETDMA_6345_IR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) [ENETDMAC_IRMASK] = ENETDMA_6345_IRMASK_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) [ENETDMAC_MAXBURST] = ENETDMA_6345_MAXBURST_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) [ENETDMAC_BUFALLOC] = ENETDMA_6345_BUFALLOC_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) [ENETDMAC_RSTART] = ENETDMA_6345_RSTART_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) [ENETDMAC_FC] = ENETDMA_6345_FC_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) [ENETDMAC_LEN] = ENETDMA_6345_LEN_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) const unsigned long *bcm63xx_regs_enetdmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) EXPORT_SYMBOL(bcm63xx_regs_enetdmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static __init void bcm63xx_enetdmac_regs_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) if (BCMCPU_IS_6345())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) bcm63xx_regs_enetdmac = bcm6345_regs_enetdmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) bcm63xx_regs_enetdmac = bcm6348_regs_enetdmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static struct resource shared_res[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) .end = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .end = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .end = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) static struct platform_device bcm63xx_enet_shared_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .name = "bcm63xx_enet_shared",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .num_resources = ARRAY_SIZE(shared_res),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .resource = shared_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static int shared_device_registered;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) static u64 enet_dmamask = DMA_BIT_MASK(32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) static struct resource enet0_res[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .end = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static struct bcm63xx_enet_platform_data enet0_pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static struct platform_device bcm63xx_enet0_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .name = "bcm63xx_enet",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .num_resources = ARRAY_SIZE(enet0_res),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .resource = enet0_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .platform_data = &enet0_pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .dma_mask = &enet_dmamask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .coherent_dma_mask = DMA_BIT_MASK(32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) static struct resource enet1_res[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .end = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) .start = -1, /* filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) static struct bcm63xx_enet_platform_data enet1_pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static struct platform_device bcm63xx_enet1_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .name = "bcm63xx_enet",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .num_resources = ARRAY_SIZE(enet1_res),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .resource = enet1_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .platform_data = &enet1_pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .dma_mask = &enet_dmamask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) .coherent_dma_mask = DMA_BIT_MASK(32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static struct resource enetsw_res[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* start & end filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) /* start filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) /* start filled at runtime */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .flags = IORESOURCE_IRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static struct bcm63xx_enetsw_platform_data enetsw_pd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static struct platform_device bcm63xx_enetsw_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .name = "bcm63xx_enetsw",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .num_resources = ARRAY_SIZE(enetsw_res),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .resource = enetsw_res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .platform_data = &enetsw_pd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .dma_mask = &enet_dmamask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) .coherent_dma_mask = DMA_BIT_MASK(32),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) static int __init register_shared(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) int ret, chan_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) if (shared_device_registered)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) bcm63xx_enetdmac_regs_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) shared_res[0].start = bcm63xx_regset_address(RSET_ENETDMA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) shared_res[0].end = shared_res[0].start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) if (BCMCPU_IS_6345())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) shared_res[0].end += (RSET_6345_ENETDMA_SIZE) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) shared_res[0].end += (RSET_ENETDMA_SIZE) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (BCMCPU_IS_6328() || BCMCPU_IS_6362() || BCMCPU_IS_6368())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) chan_count = 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) else if (BCMCPU_IS_6345())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) chan_count = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) chan_count = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) shared_res[1].start = bcm63xx_regset_address(RSET_ENETDMAC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) shared_res[1].end = shared_res[1].start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) shared_res[1].end += RSET_ENETDMAC_SIZE(chan_count) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) shared_res[2].start = bcm63xx_regset_address(RSET_ENETDMAS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) shared_res[2].end = shared_res[2].start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) shared_res[2].end += RSET_ENETDMAS_SIZE(chan_count) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) ret = platform_device_register(&bcm63xx_enet_shared_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) shared_device_registered = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) int __init bcm63xx_enet_register(int unit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) const struct bcm63xx_enet_platform_data *pd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct platform_device *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) struct bcm63xx_enet_platform_data *dpd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (unit > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (unit == 1 && (BCMCPU_IS_6338() || BCMCPU_IS_6345()))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) ret = register_shared();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (unit == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) enet0_res[0].start = bcm63xx_regset_address(RSET_ENET0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) enet0_res[0].end = enet0_res[0].start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) enet0_res[0].end += RSET_ENET_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) enet0_res[1].start = bcm63xx_get_irq_number(IRQ_ENET0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) enet0_res[2].start = bcm63xx_get_irq_number(IRQ_ENET0_RXDMA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) enet0_res[3].start = bcm63xx_get_irq_number(IRQ_ENET0_TXDMA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) pdev = &bcm63xx_enet0_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) enet1_res[0].start = bcm63xx_regset_address(RSET_ENET1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) enet1_res[0].end = enet1_res[0].start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) enet1_res[0].end += RSET_ENET_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) enet1_res[1].start = bcm63xx_get_irq_number(IRQ_ENET1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) enet1_res[2].start = bcm63xx_get_irq_number(IRQ_ENET1_RXDMA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) enet1_res[3].start = bcm63xx_get_irq_number(IRQ_ENET1_TXDMA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) pdev = &bcm63xx_enet1_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) /* copy given platform data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) dpd = pdev->dev.platform_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) memcpy(dpd, pd, sizeof(*pd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /* adjust them in case internal phy is used */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (dpd->use_internal_phy) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* internal phy only exists for enet0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) if (unit == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) dpd->phy_id = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) dpd->has_phy_interrupt = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) dpd->phy_interrupt = bcm63xx_get_irq_number(IRQ_ENET_PHY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) dpd->dma_chan_en_mask = ENETDMAC_CHANCFG_EN_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) dpd->dma_chan_int_mask = ENETDMAC_IR_PKTDONE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) if (BCMCPU_IS_6345()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) dpd->dma_chan_en_mask |= ENETDMAC_CHANCFG_CHAINING_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) dpd->dma_chan_en_mask |= ENETDMAC_CHANCFG_WRAP_EN_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) dpd->dma_chan_en_mask |= ENETDMAC_CHANCFG_FLOWC_EN_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) dpd->dma_chan_int_mask |= ENETDMA_IR_BUFDONE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) dpd->dma_chan_int_mask |= ENETDMA_IR_NOTOWNER_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) dpd->dma_chan_width = ENETDMA_6345_CHAN_WIDTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) dpd->dma_desc_shift = ENETDMA_6345_DESC_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) dpd->dma_has_sram = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) dpd->dma_chan_width = ENETDMA_CHAN_WIDTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (unit == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) dpd->rx_chan = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) dpd->tx_chan = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) dpd->rx_chan = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) dpd->tx_chan = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) ret = platform_device_register(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) bcm63xx_enetsw_register(const struct bcm63xx_enetsw_platform_data *pd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (!BCMCPU_IS_6328() && !BCMCPU_IS_6362() && !BCMCPU_IS_6368())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) ret = register_shared();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) enetsw_res[0].start = bcm63xx_regset_address(RSET_ENETSW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) enetsw_res[0].end = enetsw_res[0].start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) enetsw_res[0].end += RSET_ENETSW_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) enetsw_res[1].start = bcm63xx_get_irq_number(IRQ_ENETSW_RXDMA0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) enetsw_res[2].start = bcm63xx_get_irq_number(IRQ_ENETSW_TXDMA0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (!enetsw_res[2].start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) enetsw_res[2].start = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) memcpy(bcm63xx_enetsw_device.dev.platform_data, pd, sizeof(*pd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (BCMCPU_IS_6328())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) enetsw_pd.num_ports = ENETSW_PORTS_6328;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) else if (BCMCPU_IS_6362() || BCMCPU_IS_6368())
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) enetsw_pd.num_ports = ENETSW_PORTS_6368;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) enetsw_pd.dma_has_sram = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) enetsw_pd.dma_chan_width = ENETDMA_CHAN_WIDTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) enetsw_pd.dma_chan_en_mask = ENETDMAC_CHANCFG_EN_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) enetsw_pd.dma_chan_int_mask = ENETDMAC_IR_PKTDONE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) ret = platform_device_register(&bcm63xx_enetsw_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }