[PATCH 3/4] usb: typec: add typec orientation switch support via mux controller
Heikki Krogerus
heikki.krogerus at linux.intel.com
Thu May 20 05:33:32 PDT 2021
On Wed, May 19, 2021 at 03:14:49PM +0800, Li Jun wrote:
> Some dedicated mux block can use existing mux controller as a
> mux provider, typec port as a consumer to select channel for
> orientation switch, this can be an alternate way to current
> typec_switch interface.
>
> Signed-off-by: Li Jun <jun.li at nxp.com>
> ---
> drivers/usb/typec/class.c | 26 +++++++++++++++++++++++++-
> drivers/usb/typec/class.h | 2 ++
> drivers/usb/typec/mux.c | 34 ++++++++++++++++++++++++++++++++++
> include/linux/usb/typec_mux.h | 4 ++++
> 4 files changed, 65 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> index a29bf2c32233..1bb0275e6204 100644
> --- a/drivers/usb/typec/class.c
> +++ b/drivers/usb/typec/class.c
> @@ -1601,6 +1601,7 @@ static void typec_release(struct device *dev)
> ida_simple_remove(&typec_index_ida, port->id);
> ida_destroy(&port->mode_ids);
> typec_switch_put(port->sw);
> + typec_mux_control_switch_put(port->mux_control_switch);
> typec_mux_put(port->mux);
> kfree(port->cap);
> kfree(port);
> @@ -1816,6 +1817,13 @@ int typec_set_orientation(struct typec_port *port,
> if (ret)
> return ret;
>
> + if (!port->sw) {
> + ret = typec_mux_control_switch_set(port->mux_control_switch,
> + port->mux_control_switch_states[orientation]);
> + if (ret)
> + return ret;
> + }
> +
> port->orientation = orientation;
> sysfs_notify(&port->dev.kobj, NULL, "orientation");
> kobject_uevent(&port->dev.kobj, KOBJ_CHANGE);
> @@ -1991,7 +1999,7 @@ struct typec_port *typec_register_port(struct device *parent,
> const struct typec_capability *cap)
> {
> struct typec_port *port;
> - int ret;
> + int ret = 0;
> int id;
>
> port = kzalloc(sizeof(*port), GFP_KERNEL);
> @@ -2068,6 +2076,22 @@ struct typec_port *typec_register_port(struct device *parent,
> return ERR_PTR(ret);
> }
>
> + if (!port->sw) {
> + /* Try to get typec switch via general mux controller */
> + port->mux_control_switch = typec_mux_control_switch_get(&port->dev);
> + if (IS_ERR(port->mux_control_switch))
> + ret = PTR_ERR(port->mux_control_switch);
> + else if (port->mux_control_switch)
> + ret = device_property_read_u32_array(&port->dev,
> + "mux-control-switch-states",
> + port->mux_control_switch_states,
> + 3);
> + if (ret) {
> + put_device(&port->dev);
> + return ERR_PTR(ret);
> + }
> + }
Why not just do that inside fwnode_typec_switch_get() and handle the
whole thing in drivers/usb/typec/mux.c (or in its own file if you
prefer)?
You'll just need to register a "wrapper" Type-C switch object for the
OF mux controller, but that should not be a problem. That way you
don't need to export any new functions, touch this file or anything
else.
thanks,
--
heikki
More information about the linux-arm-kernel
mailing list