[PATCH v11 3/9] drm/display: Add Type-C switch helpers

Andi Shyti andi.shyti at linux.intel.com
Tue Feb 7 21:25:34 UTC 2023


Hi Pin-yen,

[...]

> +static int drm_dp_register_mode_switch(struct device *dev,
> +				       struct fwnode_handle *fwnode,
> +				       struct drm_dp_typec_switch_desc *switch_desc,
> +				       void *data, typec_mux_set_fn_t mux_set)
> +{
> +	struct drm_dp_typec_port_data *port_data;
> +	struct typec_mux_desc mux_desc = {};
> +	char name[32];
> +	u32 port_num;
> +	int ret;
> +
> +	ret = fwnode_property_read_u32(fwnode, "reg", &port_num);
> +	if (ret) {
> +		dev_err(dev, "Failed to read reg property: %d\n", ret);
> +		return ret;
> +	}
> +
> +	port_data = &switch_desc->typec_ports[port_num];
> +	port_data->data = data;
> +	port_data->port_num = port_num;
> +	port_data->fwnode = fwnode;
> +	mux_desc.fwnode = fwnode;
> +	mux_desc.drvdata = port_data;
> +	snprintf(name, sizeof(name), "%pfwP-%u", fwnode, port_num);
> +	mux_desc.name = name;
> +	mux_desc.set = mux_set;
> +
> +	port_data->typec_mux = typec_mux_register(dev, &mux_desc);
> +	if (IS_ERR(port_data->typec_mux)) {
> +		ret = PTR_ERR(port_data->typec_mux);
> +		dev_err(dev, "Mode switch register for port %d failed: %d\n",
> +			port_num, ret);
> +
> +		return ret;

you don't need this return here...

> +	}
> +
> +	return 0;

Just "return ret;" here.

> +}
> +
> +/**
> + * drm_dp_register_typec_switches() - register Type-C switches
> + * @dev: Device that registers Type-C switches
> + * @port: Device node for the switch
> + * @switch_desc: A Type-C switch descriptor
> + * @data: Private data for the switches
> + * @mux_set: Callback function for typec_mux_set
> + *
> + * This function registers USB Type-C switches for DP bridges that can switch
> + * the output signal between their output pins.
> + *
> + * Currently only mode switches are implemented, and the function assumes the
> + * given @port device node has endpoints with "mode-switch" property.
> + * The port number is determined by the "reg" property of the endpoint.
> + */
> +int drm_dp_register_typec_switches(struct device *dev, struct fwnode_handle *port,
> +				   struct drm_dp_typec_switch_desc *switch_desc,
> +				   void *data, typec_mux_set_fn_t mux_set)
> +{
> +	struct fwnode_handle *sw;
> +	int ret;
> +
> +	fwnode_for_each_child_node(port, sw) {
> +		if (fwnode_property_present(sw, "mode-switch"))
> +			switch_desc->num_typec_switches++;
> +	}

no need for brackets here

> +
> +	if (!switch_desc->num_typec_switches) {
> +		dev_dbg(dev, "No Type-C switches node found\n");

dev_warn()?

> +		return 0;
> +	}
> +
> +	switch_desc->typec_ports = devm_kcalloc(
> +		dev, switch_desc->num_typec_switches,
> +		sizeof(struct drm_dp_typec_port_data), GFP_KERNEL);
> +
> +	if (!switch_desc->typec_ports)
> +		return -ENOMEM;
> +
> +	/* Register switches for each connector. */
> +	fwnode_for_each_child_node(port, sw) {
> +		if (!fwnode_property_present(sw, "mode-switch"))
> +			continue;
> +		ret = drm_dp_register_mode_switch(dev, sw, switch_desc, data, mux_set);
> +		if (ret)
> +			goto err_unregister_typec_switches;
> +	}
> +
> +	return 0;
> +
> +err_unregister_typec_switches:
> +	fwnode_handle_put(sw);
> +	drm_dp_unregister_typec_switches(switch_desc);
> +	dev_err(dev, "Failed to register mode switch: %d\n", ret);

there is a bit of dmesg spamming. Please choose where you want to
print the error, either in this function or in
drm_dp_register_mode_switch().

Andi

> +	return ret;
> +}
> +EXPORT_SYMBOL(drm_dp_register_typec_switches);

[...]


More information about the dri-devel mailing list