All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans de Goede <hdegoede@redhat.com>
To: Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Andy Shevchenko <andy@infradead.org>,
	linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
	platform-driver-x86@vger.kernel.org
Subject: Re: [PATCH v4 15/16] platform/x86: intel_cht_int33fe: Supply fwnodes for the external dependencies
Date: Wed, 29 May 2019 11:36:04 +0200	[thread overview]
Message-ID: <d174e7e9-f44c-b257-4678-d53676265d44@redhat.com> (raw)
In-Reply-To: <20190522105113.11153-16-heikki.krogerus@linux.intel.com>

Hi,

On 5/22/19 12:51 PM, Heikki Krogerus wrote:
> Supplying also external devices, the DisplayPort connector
> and the USB role switch, software fwnodes. After this the
> driver has access to all the components tied to the USB
> Type-C connector and can start creating software node
> references to actually associate them with the USB Type-C
> connector device.
> 
> Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> ---
>   drivers/platform/x86/intel_cht_int33fe.c | 128 ++++++++++++++++++++++-
>   1 file changed, 125 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel_cht_int33fe.c b/drivers/platform/x86/intel_cht_int33fe.c
> index 34bc2d178760..e5c0b6573618 100644
> --- a/drivers/platform/x86/intel_cht_int33fe.c
> +++ b/drivers/platform/x86/intel_cht_int33fe.c
> @@ -21,6 +21,7 @@
>   #include <linux/i2c.h>
>   #include <linux/interrupt.h>
>   #include <linux/module.h>
> +#include <linux/pci.h>
>   #include <linux/platform_device.h>
>   #include <linux/regulator/consumer.h>
>   #include <linux/slab.h>
> @@ -32,6 +33,8 @@ enum {
>   	INT33FE_NODE_FUSB302,
>   	INT33FE_NODE_MAX17047,
>   	INT33FE_NODE_PI3USB30532,
> +	INT33FE_NODE_DISPLAYPORT,
> +	INT33FE_NODE_ROLE_SWITCH,
>   	INT33FE_NODE_USB_CONNECTOR,
>   	INT33FE_NODE_MAX,
>   };
> @@ -42,6 +45,9 @@ struct cht_int33fe_data {
>   	struct i2c_client *pi3usb30532;
>   	/* Contain a list-head must be per device */
>   	struct device_connection connections[4];
> +
> +	struct fwnode_handle *dp;
> +	struct fwnode_handle *mux;
>   };
>   
>   /*
> @@ -110,10 +116,126 @@ static const struct software_node nodes[] = {
>   	{ "fusb302", NULL, fusb302_props },
>   	{ "max17047", NULL, max17047_props },
>   	{ "pi3usb30532" },
> +	{ "displayport" },
> +	{ "usb-role-switch" },
>   	{ "connector", &nodes[0], usb_connector_props },
>   	{ }
>   };
>   
> +static int cht_int33fe_setup_mux(struct cht_int33fe_data *data)
> +{
> +	struct fwnode_handle *fwnode;
> +	struct device *dev;
> +	struct device *p;
> +
> +	fwnode = software_node_fwnode(&nodes[INT33FE_NODE_ROLE_SWITCH]);
> +	if (!fwnode)
> +		return -ENODEV;
> +
> +	/* First finding the platform device */
> +	p = bus_find_device_by_name(&platform_bus_type, NULL,
> +				    "intel_xhci_usb_sw");
> +	if (!p)
> +		return -EPROBE_DEFER;
> +
> +	/* Then the mux child device */
> +	dev = device_find_child_by_name(p, "intel_xhci_usb_sw-role-switch");
> +	put_device(p);
> +	if (!dev)
> +		return -EPROBE_DEFER;
> +
> +	/* If there already is a node for the mux, using that one. */
> +	if (dev->fwnode)
> +		fwnode_remove_software_node(fwnode);
> +	else
> +		dev->fwnode = fwnode;
> +
> +	data->mux = fwnode_handle_get(dev->fwnode);
> +	put_device(dev);
> +
> +	return 0;
> +}
> +
> +static int cht_int33fe_setup_dp(struct cht_int33fe_data *data)
> +{
> +	struct fwnode_handle *fwnode;
> +	struct pci_dev *pdev;
> +
> +	fwnode = software_node_fwnode(&nodes[INT33FE_NODE_DISPLAYPORT]);
> +	if (!fwnode)
> +		return -ENODEV;
> +
> +	/* First let's find the GPU PCI device */
> +	pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, NULL);
> +	if (!pdev || pdev->vendor != PCI_VENDOR_ID_INTEL) {
> +		pci_dev_put(pdev);
> +		return -ENODEV;
> +	}
> +
> +	/* Then the DP child device node */
> +	data->dp = device_get_named_child_node(&pdev->dev, "DD02");
> +	pci_dev_put(pdev);
> +	if (!data->dp)
> +		return -ENODEV;
> +
> +	fwnode->secondary = ERR_PTR(-ENODEV);
> +	data->dp->secondary = fwnode;
> +
> +	return 0;
> +}
> +
> +static void cht_int33fe_remove_nodes(struct cht_int33fe_data *data)
> +{
> +	software_node_unregister_nodes(nodes);
> +
> +	if (data->mux) {
> +		fwnode_handle_put(data->mux);
> +		data->mux = NULL;
> +	}
> +
> +	if (data->dp) {
> +		data->dp->secondary = NULL;
> +		fwnode_handle_put(data->dp);
> +		data->dp = NULL;
> +	}
> +}
> +
> +static int cht_int33fe_add_nodes(struct cht_int33fe_data *data)
> +{
> +	int ret;
> +
> +	ret = software_node_register_nodes(nodes);
> +	if (ret)
> +		return ret;
> +
> +	/* The devices that are not created in this driver need extra steps. */
> +
> +	/*
> +	 * There is no ACPI device node for the USB role mux, so we need to find
> +	 * the mux device and assign our node directly to it. That means we
> +	 * depend on the mux driver. This function will return -PROBE_DEFER
> +	 * until the mux device is registered.
> +	 */
> +	ret = cht_int33fe_setup_mux(data);
> +	if (ret)
> +		goto err_remove_nodes;
> +
> +	/*
> +	 * The DP connector does have ACPI device node. In this case we can just
> +	 * find that ACPI node and assing our node as the secondary node to it.
> +	 */


s/assing/adding/  I presume ?

Regards,

Hans



> +	ret = cht_int33fe_setup_dp(data);
> +	if (ret)
> +		goto err_remove_nodes;
> +
> +	return 0;
> +
> +err_remove_nodes:
> +	cht_int33fe_remove_nodes(data);
> +
> +	return ret;
> +}
> +
>   static int
>   cht_int33fe_register_max17047(struct device *dev, struct cht_int33fe_data *data)
>   {
> @@ -211,7 +333,7 @@ static int cht_int33fe_probe(struct platform_device *pdev)
>   	if (!data)
>   		return -ENOMEM;
>   
> -	ret = software_node_register_nodes(nodes);
> +	ret = cht_int33fe_add_nodes(data);
>   	if (ret)
>   		return ret;
>   
> @@ -280,7 +402,7 @@ static int cht_int33fe_probe(struct platform_device *pdev)
>   	device_connections_remove(data->connections);
>   
>   out_remove_nodes:
> -	software_node_unregister_nodes(nodes);
> +	cht_int33fe_remove_nodes(data);
>   
>   	return ret;
>   }
> @@ -294,7 +416,7 @@ static int cht_int33fe_remove(struct platform_device *pdev)
>   	i2c_unregister_device(data->max17047);
>   
>   	device_connections_remove(data->connections);
> -	software_node_unregister_nodes(nodes);
> +	cht_int33fe_remove_nodes(data);
>   
>   	return 0;
>   }
> 

  reply	other threads:[~2019-05-29  9:36 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-22 10:50 [PATCH v4 00/16] Software fwnode references Heikki Krogerus
2019-05-22 10:50 ` [PATCH v4 01/16] software node: Allow node creation without properties Heikki Krogerus
2019-05-22 10:50 ` [PATCH v4 02/16] software node: Simplify software_node_release() function Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 03/16] software node: Add support for static node descriptors Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 04/16] software node: Use kobject name when finding child nodes by name Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 05/16] software node: Add software_node_get_reference_args() Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 06/16] driver core: Add helper device_find_child_by_name() Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 07/16] ACPI / property: Don't limit named child node matching to data nodes Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 08/16] device property: Introduce fwnode_find_reference() Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 09/16] device connection: Find connections also by checking the references Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 10/16] usb: typec: Registering real device entries for the muxes Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 11/16] platform/x86: intel_cht_int33fe: Register max17047 in its own function Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 12/16] platform/x86: intel_cht_int33fe: Remove unused fusb302 device property Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 13/16] platform/x86: intel_cht_int33fe: Provide software nodes for the devices Heikki Krogerus
2019-05-29  9:30   ` Hans de Goede
2019-05-31  9:10     ` Rafael J. Wysocki
2019-05-31 13:46       ` Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 14/16] platform/x86: intel_cht_int33fe: Provide fwnode for the USB connector Heikki Krogerus
2019-05-22 10:51 ` [PATCH v4 15/16] platform/x86: intel_cht_int33fe: Supply fwnodes for the external dependencies Heikki Krogerus
2019-05-29  9:36   ` Hans de Goede [this message]
2019-05-22 10:51 ` [PATCH v4 16/16] platform/x86: intel_cht_int33fe: Replacing the old connections with references Heikki Krogerus
2019-05-24 18:44 ` [PATCH v4 00/16] Software fwnode references Andy Shevchenko
2019-05-29  9:29 ` Hans de Goede
2019-05-31 13:42   ` Heikki Krogerus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d174e7e9-f44c-b257-4678-d53676265d44@redhat.com \
    --to=hdegoede@redhat.com \
    --cc=andy@infradead.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.