mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	phy: marvell: a3700: Convert to official DT bindings in COMPHY driver
Convert A3720 common PHY driver to official DT bindings. This puts us closer to be able to synchronize A3720 device-trees with those from Linux. Signed-off-by: Pali Rohár <pali@kernel.org> Signed-off-by: Marek Behún <marek.behun@nic.cz> Cc: Konstantin Porotchkin <kostap@marvell.com> Cc: Robert Marko <robert.marko@sartura.hr> Cc: Luka Perkov <luka.perkov@sartura.hr> Cc: Marcin Wojtas <mw@semihalf.com> Cc: Grzegorz Jaszczyk <jaz@semihalf.com> Reviewed-by: Stefan Roese <sr@denx.de>
This commit is contained in:
		| @@ -80,24 +80,6 @@ | |||||||
| 	}; | 	}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| &comphy { |  | ||||||
| 	max-lanes = <3>; |  | ||||||
| 	phy0 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_USB3_HOST0>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_5G>; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	phy1 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_PEX0>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_2_5G>; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	phy2 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_SATA0>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_5G>; |  | ||||||
| 	}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| ð0 { | ð0 { | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
| 	pinctrl-names = "default"; | 	pinctrl-names = "default"; | ||||||
| @@ -119,6 +101,7 @@ | |||||||
| /* CON3 */ | /* CON3 */ | ||||||
| &sata { | &sata { | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
|  | 	phys = <&comphy2 0>; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| &sdhci0 { | &sdhci0 { | ||||||
| @@ -200,6 +183,7 @@ | |||||||
| /* CON31 */ | /* CON31 */ | ||||||
| &usb3 { | &usb3 { | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
|  | 	phys = <&comphy0 0>; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| &pcie0 { | &pcie0 { | ||||||
| @@ -207,4 +191,5 @@ | |||||||
| 	pinctrl-0 = <&pcie_pins>; | 	pinctrl-0 = <&pcie_pins>; | ||||||
| 	reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; | 	reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
|  | 	phys = <&comphy1 0>; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -94,24 +94,6 @@ | |||||||
| 	}; | 	}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| &comphy { |  | ||||||
| 	max-lanes = <3>; |  | ||||||
| 	phy0 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_SGMII1>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_3_125G>; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	phy1 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_PEX0>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_5G>; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	phy2 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_USB3_HOST0>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_5G>; |  | ||||||
| 	}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| ð0 { | ð0 { | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
| 	pinctrl-names = "default"; | 	pinctrl-names = "default"; | ||||||
| @@ -120,6 +102,11 @@ | |||||||
| 	phy = <ð_phy1>; | 	phy = <ð_phy1>; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | ð1 { | ||||||
|  | 	phy-mode = "2500base-x"; | ||||||
|  | 	phys = <&comphy0 1>; | ||||||
|  | }; | ||||||
|  |  | ||||||
| &i2c0 { | &i2c0 { | ||||||
| 	pinctrl-names = "default"; | 	pinctrl-names = "default"; | ||||||
| 	pinctrl-0 = <&i2c1_pins>; | 	pinctrl-0 = <&i2c1_pins>; | ||||||
| @@ -222,6 +209,7 @@ | |||||||
| &usb3 { | &usb3 { | ||||||
| 	vbus-supply = <®_usb3_vbus>; | 	vbus-supply = <®_usb3_vbus>; | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
|  | 	phys = <&comphy2 0>; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| &pcie0 { | &pcie0 { | ||||||
| @@ -229,4 +217,5 @@ | |||||||
| 	pinctrl-0 = <&pcie_pins>; | 	pinctrl-0 = <&pcie_pins>; | ||||||
| 	reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; | 	reset-gpios = <&gpiosb 3 GPIO_ACTIVE_LOW>; | ||||||
| 	status = "disabled"; | 	status = "disabled"; | ||||||
|  | 	phys = <&comphy1 0>; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -106,36 +106,21 @@ | |||||||
| 	}; | 	}; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| &comphy { |  | ||||||
| 	phy0 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_SGMII1>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_1_25G>; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	phy1 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_SGMII0>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_1_25G>; |  | ||||||
| 	}; |  | ||||||
|  |  | ||||||
| 	phy2 { |  | ||||||
| 		phy-type = <COMPHY_TYPE_USB3_HOST1>; |  | ||||||
| 		phy-speed = <COMPHY_SPEED_5G>; |  | ||||||
| 	}; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| ð0 { | ð0 { | ||||||
| 	pinctrl-0 = <&pcie_pins>; | 	pinctrl-0 = <&pcie_pins>; | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
| 	phy-mode = "2500base-x"; | 	phy-mode = "sgmii"; | ||||||
| 	managed = "in-band-status"; | 	managed = "in-band-status"; | ||||||
| 	phy = <ðphy0>; | 	phy = <ðphy0>; | ||||||
|  | 	phys = <&comphy1 0>; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| ð1 { | ð1 { | ||||||
| 	status = "okay"; | 	status = "okay"; | ||||||
| 	phy-mode = "2500base-x"; | 	phy-mode = "sgmii"; | ||||||
| 	managed = "in-band-status"; | 	managed = "in-band-status"; | ||||||
| 	phy = <ðphy1>; | 	phy = <ðphy1>; | ||||||
|  | 	phys = <&comphy0 1>; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| &i2c0 { | &i2c0 { | ||||||
|   | |||||||
| @@ -316,9 +316,23 @@ | |||||||
| 				compatible = "marvell,mvebu-comphy", "marvell,comphy-armada-3700"; | 				compatible = "marvell,mvebu-comphy", "marvell,comphy-armada-3700"; | ||||||
| 				reg = <0x18300 0x28>, | 				reg = <0x18300 0x28>, | ||||||
| 				      <0x1f300 0x3d000>; | 				      <0x1f300 0x3d000>; | ||||||
| 				mux-bitcount = <4>; | 				#address-cells = <1>; | ||||||
| 				mux-lane-order = <1 0 2>; | 				#size-cells = <0>; | ||||||
| 				max-lanes = <3>; |  | ||||||
|  | 				comphy0: phy@0 { | ||||||
|  | 					reg = <0>; | ||||||
|  | 					#phy-cells = <1>; | ||||||
|  | 				}; | ||||||
|  |  | ||||||
|  | 				comphy1: phy@1 { | ||||||
|  | 					reg = <1>; | ||||||
|  | 					#phy-cells = <1>; | ||||||
|  | 				}; | ||||||
|  |  | ||||||
|  | 				comphy2: phy@2 { | ||||||
|  | 					reg = <2>; | ||||||
|  | 					#phy-cells = <1>; | ||||||
|  | 				}; | ||||||
| 			}; | 			}; | ||||||
| 		}; | 		}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ | |||||||
| #include <asm/arch/cpu.h> | #include <asm/arch/cpu.h> | ||||||
| #include <asm/arch/soc.h> | #include <asm/arch/soc.h> | ||||||
| #include <linux/delay.h> | #include <linux/delay.h> | ||||||
|  | #include <phy.h> | ||||||
|  |  | ||||||
| #include "comphy_a3700.h" | #include "comphy_a3700.h" | ||||||
|  |  | ||||||
| @@ -982,6 +983,138 @@ void comphy_dedicated_phys_init(void) | |||||||
| 	debug_exit(); | 	debug_exit(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static int find_available_node_by_compatible(int offset, const char *compatible) | ||||||
|  | { | ||||||
|  | 	do { | ||||||
|  | 		offset = fdt_node_offset_by_compatible(gd->fdt_blob, offset, | ||||||
|  | 						       compatible); | ||||||
|  | 	} while (offset > 0 && !fdtdec_get_is_enabled(gd->fdt_blob, offset)); | ||||||
|  |  | ||||||
|  | 	return offset; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static bool comphy_a3700_find_lane(const int nodes[3], int node, | ||||||
|  | 				   int port, int *lane, int *invert) | ||||||
|  | { | ||||||
|  | 	int res, i, j; | ||||||
|  |  | ||||||
|  | 	for (i = 0; ; i++) { | ||||||
|  | 		struct fdtdec_phandle_args args; | ||||||
|  |  | ||||||
|  | 		res = fdtdec_parse_phandle_with_args(gd->fdt_blob, node, "phys", | ||||||
|  | 						     "#phy-cells", 0, i, &args); | ||||||
|  | 		if (res) | ||||||
|  | 			return false; | ||||||
|  |  | ||||||
|  | 		for (j = 0; j < 3; j++) { | ||||||
|  | 			if (nodes[j] >= 0 && args.node == nodes[j] && | ||||||
|  | 			    (args.args_count >= 1 ? args.args[0] : 0) == port) { | ||||||
|  | 				*lane = j; | ||||||
|  | 				*invert = args.args_count >= 2 ? args.args[1] | ||||||
|  | 							       : 0; | ||||||
|  | 				return true; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void comphy_a3700_fill_cfg(struct chip_serdes_phy_config *cfg, | ||||||
|  | 				  const int nodes[3], const char *compatible, | ||||||
|  | 				  int type) | ||||||
|  | { | ||||||
|  | 	int node, lane, port, speed, invert; | ||||||
|  |  | ||||||
|  | 	port = (type == COMPHY_TYPE_SGMII1) ? 1 : 0; | ||||||
|  |  | ||||||
|  | 	node = -1; | ||||||
|  | 	while (1) { | ||||||
|  | 		node = find_available_node_by_compatible(node, compatible); | ||||||
|  | 		if (node < 0) | ||||||
|  | 			return; | ||||||
|  |  | ||||||
|  | 		if (comphy_a3700_find_lane(nodes, node, port, &lane, &invert)) | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (cfg->comphy_map_data[lane].type != COMPHY_TYPE_UNCONNECTED) { | ||||||
|  | 		printf("Error: More PHYs defined for lane %d, skipping\n", | ||||||
|  | 		       lane); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if (type == COMPHY_TYPE_SGMII0 || type == COMPHY_TYPE_SGMII1) { | ||||||
|  | 		const char *phy_mode; | ||||||
|  |  | ||||||
|  | 		phy_mode = fdt_getprop(gd->fdt_blob, node, "phy-mode", NULL); | ||||||
|  | 		if (phy_mode && | ||||||
|  | 		    !strcmp(phy_mode, | ||||||
|  | 			    phy_string_for_interface(PHY_INTERFACE_MODE_2500BASEX))) | ||||||
|  | 			speed = COMPHY_SPEED_3_125G; | ||||||
|  | 		else | ||||||
|  | 			speed = COMPHY_SPEED_1_25G; | ||||||
|  | 	} else if (type == COMPHY_TYPE_SATA0) { | ||||||
|  | 		speed = COMPHY_SPEED_6G; | ||||||
|  | 	} else { | ||||||
|  | 		speed = COMPHY_SPEED_5G; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	cfg->comphy_map_data[lane].type = type; | ||||||
|  | 	cfg->comphy_map_data[lane].speed = speed; | ||||||
|  | 	cfg->comphy_map_data[lane].invert = invert; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static const fdt32_t comphy_a3700_mux_lane_order[3] = { | ||||||
|  | 	__constant_cpu_to_be32(1), | ||||||
|  | 	__constant_cpu_to_be32(0), | ||||||
|  | 	__constant_cpu_to_be32(2), | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int comphy_a3700_init_serdes_map(int node, struct chip_serdes_phy_config *cfg) | ||||||
|  | { | ||||||
|  | 	int comphy_nodes[3]; | ||||||
|  | 	int child, i; | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < ARRAY_SIZE(comphy_nodes); i++) | ||||||
|  | 		comphy_nodes[i] = -FDT_ERR_NOTFOUND; | ||||||
|  |  | ||||||
|  | 	fdt_for_each_subnode(child, gd->fdt_blob, node) { | ||||||
|  | 		if (!fdtdec_get_is_enabled(gd->fdt_blob, child)) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		i = fdtdec_get_int(gd->fdt_blob, child, "reg", -1); | ||||||
|  | 		if (i < 0 || i >= ARRAY_SIZE(comphy_nodes)) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		comphy_nodes[i] = child; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for (i = 0; i < ARRAY_SIZE(comphy_nodes); i++) { | ||||||
|  | 		cfg->comphy_map_data[i].type = COMPHY_TYPE_UNCONNECTED; | ||||||
|  | 		cfg->comphy_map_data[i].speed = COMPHY_SPEED_INVALID; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	comphy_a3700_fill_cfg(cfg, comphy_nodes, "marvell,armada3700-u3d", | ||||||
|  | 			      COMPHY_TYPE_USB3_DEVICE); | ||||||
|  | 	comphy_a3700_fill_cfg(cfg, comphy_nodes, "marvell,armada3700-xhci", | ||||||
|  | 			      COMPHY_TYPE_USB3_HOST0); | ||||||
|  | 	comphy_a3700_fill_cfg(cfg, comphy_nodes, "marvell,armada-3700-pcie", | ||||||
|  | 			      COMPHY_TYPE_PEX0); | ||||||
|  | 	comphy_a3700_fill_cfg(cfg, comphy_nodes, "marvell,armada-3700-ahci", | ||||||
|  | 			      COMPHY_TYPE_SATA0); | ||||||
|  | 	comphy_a3700_fill_cfg(cfg, comphy_nodes, "marvell,armada-3700-neta", | ||||||
|  | 			      COMPHY_TYPE_SGMII0); | ||||||
|  | 	comphy_a3700_fill_cfg(cfg, comphy_nodes, "marvell,armada-3700-neta", | ||||||
|  | 			      COMPHY_TYPE_SGMII1); | ||||||
|  |  | ||||||
|  | 	cfg->comphy_lanes_count = 3; | ||||||
|  | 	cfg->comphy_mux_bitcount = 4; | ||||||
|  | 	cfg->comphy_mux_lane_order = comphy_a3700_mux_lane_order; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| int comphy_a3700_init(struct chip_serdes_phy_config *chip_cfg, | int comphy_a3700_init(struct chip_serdes_phy_config *chip_cfg, | ||||||
| 		      struct comphy_map *serdes_map) | 		      struct comphy_map *serdes_map) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -86,11 +86,8 @@ __weak int comphy_update_map(struct comphy_map *serdes_map, int count) | |||||||
|  |  | ||||||
| static int comphy_probe(struct udevice *dev) | static int comphy_probe(struct udevice *dev) | ||||||
| { | { | ||||||
| 	const void *blob = gd->fdt_blob; |  | ||||||
| 	int node = dev_of_offset(dev); | 	int node = dev_of_offset(dev); | ||||||
| 	struct chip_serdes_phy_config *chip_cfg = dev_get_priv(dev); | 	struct chip_serdes_phy_config *chip_cfg = dev_get_priv(dev); | ||||||
| 	int subnode; |  | ||||||
| 	int lane; |  | ||||||
| 	int last_idx = 0; | 	int last_idx = 0; | ||||||
| 	static int current_idx; | 	static int current_idx; | ||||||
| 	int res; | 	int res; | ||||||
| @@ -104,30 +101,14 @@ static int comphy_probe(struct udevice *dev) | |||||||
| 	if (IS_ERR(chip_cfg->hpipe3_base_addr)) | 	if (IS_ERR(chip_cfg->hpipe3_base_addr)) | ||||||
| 		return PTR_ERR(chip_cfg->hpipe3_base_addr); | 		return PTR_ERR(chip_cfg->hpipe3_base_addr); | ||||||
|  |  | ||||||
| 	chip_cfg->comphy_lanes_count = fdtdec_get_int(blob, node, |  | ||||||
| 						      "max-lanes", 0); |  | ||||||
| 	if (chip_cfg->comphy_lanes_count <= 0) { |  | ||||||
| 		dev_err(dev, "comphy max lanes is wrong\n"); |  | ||||||
| 		return -EINVAL; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	chip_cfg->comphy_mux_bitcount = fdtdec_get_int(blob, node, |  | ||||||
| 						       "mux-bitcount", 0); |  | ||||||
| 	if (chip_cfg->comphy_mux_bitcount <= 0) { |  | ||||||
| 		dev_err(dev, "comphy mux bit count is wrong\n"); |  | ||||||
| 		return -EINVAL; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	chip_cfg->comphy_mux_lane_order = |  | ||||||
| 		fdtdec_locate_array(blob, node, "mux-lane-order", |  | ||||||
| 				    chip_cfg->comphy_lanes_count); |  | ||||||
|  |  | ||||||
| 	if (device_is_compatible(dev, "marvell,comphy-armada-3700")) { | 	if (device_is_compatible(dev, "marvell,comphy-armada-3700")) { | ||||||
|  | 		chip_cfg->comphy_init_map = comphy_a3700_init_serdes_map; | ||||||
| 		chip_cfg->ptr_comphy_chip_init = comphy_a3700_init; | 		chip_cfg->ptr_comphy_chip_init = comphy_a3700_init; | ||||||
| 		chip_cfg->rx_training = NULL; | 		chip_cfg->rx_training = NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (device_is_compatible(dev, "marvell,comphy-cp110")) { | 	if (device_is_compatible(dev, "marvell,comphy-cp110")) { | ||||||
|  | 		chip_cfg->comphy_init_map = comphy_cp110_init_serdes_map; | ||||||
| 		chip_cfg->ptr_comphy_chip_init = comphy_cp110_init; | 		chip_cfg->ptr_comphy_chip_init = comphy_cp110_init; | ||||||
| 		chip_cfg->rx_training = comphy_cp110_sfi_rx_training; | 		chip_cfg->rx_training = comphy_cp110_sfi_rx_training; | ||||||
| 	} | 	} | ||||||
| @@ -141,39 +122,9 @@ static int comphy_probe(struct udevice *dev) | |||||||
| 		return -ENODEV; | 		return -ENODEV; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	lane = 0; | 	res = chip_cfg->comphy_init_map(node, chip_cfg); | ||||||
| 	fdt_for_each_subnode(subnode, blob, node) { | 	if (res < 0) | ||||||
| 		/* Skip disabled ports */ | 		return res; | ||||||
| 		if (!fdtdec_get_is_enabled(blob, subnode)) |  | ||||||
| 			continue; |  | ||||||
|  |  | ||||||
| 		chip_cfg->comphy_map_data[lane].type = |  | ||||||
| 			fdtdec_get_int(blob, subnode, "phy-type", |  | ||||||
| 				       COMPHY_TYPE_INVALID); |  | ||||||
|  |  | ||||||
| 		if (chip_cfg->comphy_map_data[lane].type == |  | ||||||
| 		    COMPHY_TYPE_INVALID) { |  | ||||||
| 			printf("no phy type for lane %d, setting lane as unconnected\n", |  | ||||||
| 			       lane + 1); |  | ||||||
| 			continue; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		chip_cfg->comphy_map_data[lane].speed = |  | ||||||
| 			fdtdec_get_int(blob, subnode, "phy-speed", |  | ||||||
| 				       COMPHY_SPEED_INVALID); |  | ||||||
|  |  | ||||||
| 		chip_cfg->comphy_map_data[lane].invert = |  | ||||||
| 			fdtdec_get_int(blob, subnode, "phy-invert", |  | ||||||
| 				       COMPHY_POLARITY_NO_INVERT); |  | ||||||
|  |  | ||||||
| 		chip_cfg->comphy_map_data[lane].clk_src = |  | ||||||
| 			fdtdec_get_bool(blob, subnode, "clk-src"); |  | ||||||
|  |  | ||||||
| 		chip_cfg->comphy_map_data[lane].end_point = |  | ||||||
| 			fdtdec_get_bool(blob, subnode, "end_point"); |  | ||||||
|  |  | ||||||
| 		lane++; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	res = comphy_update_map(chip_cfg->comphy_map_data, chip_cfg->comphy_lanes_count); | 	res = comphy_update_map(chip_cfg->comphy_map_data, chip_cfg->comphy_lanes_count); | ||||||
| 	if (res < 0) | 	if (res < 0) | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ struct comphy_mux_data { | |||||||
|  |  | ||||||
| struct chip_serdes_phy_config { | struct chip_serdes_phy_config { | ||||||
| 	struct comphy_mux_data *mux_data; | 	struct comphy_mux_data *mux_data; | ||||||
|  | 	int (*comphy_init_map)(int, struct chip_serdes_phy_config *); | ||||||
| 	int (*ptr_comphy_chip_init)(struct chip_serdes_phy_config *, | 	int (*ptr_comphy_chip_init)(struct chip_serdes_phy_config *, | ||||||
| 				    struct comphy_map *); | 				    struct comphy_map *); | ||||||
| 	int (*rx_training)(struct chip_serdes_phy_config *, u32); | 	int (*rx_training)(struct chip_serdes_phy_config *, u32); | ||||||
| @@ -85,9 +86,20 @@ static inline void reg_set16(void __iomem *addr, u16 data, u16 mask) | |||||||
|  |  | ||||||
| /* SoC specific init functions */ | /* SoC specific init functions */ | ||||||
| #ifdef CONFIG_ARMADA_3700 | #ifdef CONFIG_ARMADA_3700 | ||||||
|  | int comphy_a3700_init_serdes_map(int node, struct chip_serdes_phy_config *cfg); | ||||||
| int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg, | int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg, | ||||||
| 		      struct comphy_map *serdes_map); | 		      struct comphy_map *serdes_map); | ||||||
| #else | #else | ||||||
|  | static inline int | ||||||
|  | comphy_a3700_init_serdes_map(int node, struct chip_serdes_phy_config *cfg) | ||||||
|  | { | ||||||
|  | 	/* | ||||||
|  | 	 * This function should never be called in this configuration, so | ||||||
|  | 	 * lets return an error here. | ||||||
|  | 	 */ | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  |  | ||||||
| static inline int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg, | static inline int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg, | ||||||
| 				    struct comphy_map *serdes_map) | 				    struct comphy_map *serdes_map) | ||||||
| { | { | ||||||
| @@ -100,11 +112,22 @@ static inline int comphy_a3700_init(struct chip_serdes_phy_config *ptr_chip_cfg, | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef CONFIG_ARMADA_8K | #ifdef CONFIG_ARMADA_8K | ||||||
|  | int comphy_cp110_init_serdes_map(int node, struct chip_serdes_phy_config *cfg); | ||||||
| int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, | int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, | ||||||
| 		      struct comphy_map *serdes_map); | 		      struct comphy_map *serdes_map); | ||||||
| int comphy_cp110_sfi_rx_training(struct chip_serdes_phy_config *ptr_chip_cfg, | int comphy_cp110_sfi_rx_training(struct chip_serdes_phy_config *ptr_chip_cfg, | ||||||
| 				 u32 lane); | 				 u32 lane); | ||||||
| #else | #else | ||||||
|  | static inline int | ||||||
|  | comphy_cp110_init_serdes_map(int node, struct chip_serdes_phy_config *cfg) | ||||||
|  | { | ||||||
|  | 	/* | ||||||
|  | 	 * This function should never be called in this configuration, so | ||||||
|  | 	 * lets return an error here. | ||||||
|  | 	 */ | ||||||
|  | 	return -1; | ||||||
|  | } | ||||||
|  |  | ||||||
| static inline int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, | static inline int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, | ||||||
| 		      struct comphy_map *serdes_map) | 		      struct comphy_map *serdes_map) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -554,6 +554,64 @@ void comphy_dedicated_phys_init(void) | |||||||
| 	debug_exit(); | 	debug_exit(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int comphy_cp110_init_serdes_map(int node, struct chip_serdes_phy_config *cfg) | ||||||
|  | { | ||||||
|  | 	int lane, subnode; | ||||||
|  |  | ||||||
|  | 	cfg->comphy_lanes_count = fdtdec_get_int(gd->fdt_blob, node, | ||||||
|  | 						 "max-lanes", 0); | ||||||
|  | 	if (cfg->comphy_lanes_count <= 0) { | ||||||
|  | 		printf("comphy max lanes is wrong\n"); | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	cfg->comphy_mux_bitcount = fdtdec_get_int(gd->fdt_blob, node, | ||||||
|  | 						  "mux-bitcount", 0); | ||||||
|  | 	if (cfg->comphy_mux_bitcount <= 0) { | ||||||
|  | 		printf("comphy mux bit count is wrong\n"); | ||||||
|  | 		return -EINVAL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	cfg->comphy_mux_lane_order = fdtdec_locate_array(gd->fdt_blob, node, | ||||||
|  | 							 "mux-lane-order", | ||||||
|  | 							 cfg->comphy_lanes_count); | ||||||
|  |  | ||||||
|  | 	lane = 0; | ||||||
|  | 	fdt_for_each_subnode(subnode, gd->fdt_blob, node) { | ||||||
|  | 		/* Skip disabled ports */ | ||||||
|  | 		if (!fdtdec_get_is_enabled(gd->fdt_blob, subnode)) | ||||||
|  | 			continue; | ||||||
|  |  | ||||||
|  | 		cfg->comphy_map_data[lane].type = | ||||||
|  | 			fdtdec_get_int(gd->fdt_blob, subnode, "phy-type", | ||||||
|  | 				       COMPHY_TYPE_INVALID); | ||||||
|  |  | ||||||
|  | 		if (cfg->comphy_map_data[lane].type == COMPHY_TYPE_INVALID) { | ||||||
|  | 			printf("no phy type for lane %d, setting lane as unconnected\n", | ||||||
|  | 			       lane + 1); | ||||||
|  | 			continue; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		cfg->comphy_map_data[lane].speed = | ||||||
|  | 			fdtdec_get_int(gd->fdt_blob, subnode, "phy-speed", | ||||||
|  | 				       COMPHY_SPEED_INVALID); | ||||||
|  |  | ||||||
|  | 		cfg->comphy_map_data[lane].invert = | ||||||
|  | 			fdtdec_get_int(gd->fdt_blob, subnode, "phy-invert", | ||||||
|  | 				       COMPHY_POLARITY_NO_INVERT); | ||||||
|  |  | ||||||
|  | 		cfg->comphy_map_data[lane].clk_src = | ||||||
|  | 			fdtdec_get_bool(gd->fdt_blob, subnode, "clk-src"); | ||||||
|  |  | ||||||
|  | 		cfg->comphy_map_data[lane].end_point = | ||||||
|  | 			fdtdec_get_bool(gd->fdt_blob, subnode, "end_point"); | ||||||
|  |  | ||||||
|  | 		lane++; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
| int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, | int comphy_cp110_init(struct chip_serdes_phy_config *ptr_chip_cfg, | ||||||
| 		      struct comphy_map *serdes_map) | 		      struct comphy_map *serdes_map) | ||||||
| { | { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user