[PATCH v2 3/3] phy: mapphone-mdm6600: Fix pinctrl_pm handling for sleep pins

Sebastian Reichel sebastian.reichel at collabora.com
Wed Sep 13 07:11:12 PDT 2023


Hi,

On Wed, Sep 13, 2023 at 09:04:29AM +0300, Tony Lindgren wrote:
> Looks like the driver sleep pins configuration is unusable. Adding the
> sleep pins causes the usb phy to not respond. We need to use the default
> pins in probe, and only set sleep pins at phy_mdm6600_device_power_off().
> 
> As the modem can also be booted to a serial port mode for firmware
> flashing, let's make the pin changes limited to probe and remove. For
> probe, we get the default pins automatically. We only need to set the
> sleep pins in phy_mdm6600_device_power_off() to prevent the modem from
> waking up because the gpio line glitches.
> 
> If it turns out that we need a separate state for phy_mdm6600_power_on()
> and phy_mdm6600_power_off(), we can use the pinctrl idle state.
> 
> Cc: Ivaylo Dimitrov <ivo.g.dimitrov.75 at gmail.com>
> Cc: Merlijn Wajer <merlijn at wizzup.org>
> Cc: Pavel Machek <pavel at ucw.cz>
> Cc: Sebastian Reichel <sre at kernel.org>
> Fixes: 2ad2af081622 ("phy: mapphone-mdm6600: Improve phy related runtime PM calls")
> Signed-off-by: Tony Lindgren <tony at atomide.com>
> ---
> 
> Changes since v1:
> 
> - Limit the pinctrl state changes to remove for now based on what
>   Sebastian was wondering about
> 
> ---

LGTM.

Reviewed-by: Sebastian Reichel <sebastian.reichel at collabora.com>

-- Sebastian

>  drivers/phy/motorola/phy-mapphone-mdm6600.c | 29 +++++++++------------
>  1 file changed, 12 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/phy/motorola/phy-mapphone-mdm6600.c b/drivers/phy/motorola/phy-mapphone-mdm6600.c
> --- a/drivers/phy/motorola/phy-mapphone-mdm6600.c
> +++ b/drivers/phy/motorola/phy-mapphone-mdm6600.c
> @@ -122,16 +122,10 @@ static int phy_mdm6600_power_on(struct phy *x)
>  {
>  	struct phy_mdm6600 *ddata = phy_get_drvdata(x);
>  	struct gpio_desc *enable_gpio = ddata->ctrl_gpios[PHY_MDM6600_ENABLE];
> -	int error;
>  
>  	if (!ddata->enabled)
>  		return -ENODEV;
>  
> -	error = pinctrl_pm_select_default_state(ddata->dev);
> -	if (error)
> -		dev_warn(ddata->dev, "%s: error with default_state: %i\n",
> -			 __func__, error);
> -
>  	gpiod_set_value_cansleep(enable_gpio, 1);
>  
>  	/* Allow aggressive PM for USB, it's only needed for n_gsm port */
> @@ -160,11 +154,6 @@ static int phy_mdm6600_power_off(struct phy *x)
>  
>  	gpiod_set_value_cansleep(enable_gpio, 0);
>  
> -	error = pinctrl_pm_select_sleep_state(ddata->dev);
> -	if (error)
> -		dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
> -			 __func__, error);
> -
>  	return 0;
>  }
>  
> @@ -456,6 +445,7 @@ static void phy_mdm6600_device_power_off(struct phy_mdm6600 *ddata)
>  {
>  	struct gpio_desc *reset_gpio =
>  		ddata->ctrl_gpios[PHY_MDM6600_RESET];
> +	int error;
>  
>  	ddata->enabled = false;
>  	phy_mdm6600_cmd(ddata, PHY_MDM6600_CMD_BP_SHUTDOWN_REQ);
> @@ -471,6 +461,17 @@ static void phy_mdm6600_device_power_off(struct phy_mdm6600 *ddata)
>  	} else {
>  		dev_err(ddata->dev, "Timed out powering down\n");
>  	}
> +
> +	/*
> +	 * Keep reset gpio high with padconf internal pull-up resistor to
> +	 * prevent modem from waking up during deeper SoC idle states. The
> +	 * gpio bank lines can have glitches if not in the always-on wkup
> +	 * domain.
> +	 */
> +	error = pinctrl_pm_select_sleep_state(ddata->dev);
> +	if (error)
> +		dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
> +			 __func__, error);
>  }
>  
>  static void phy_mdm6600_deferred_power_on(struct work_struct *work)
> @@ -571,12 +572,6 @@ static int phy_mdm6600_probe(struct platform_device *pdev)
>  	ddata->dev = &pdev->dev;
>  	platform_set_drvdata(pdev, ddata);
>  
> -	/* Active state selected in phy_mdm6600_power_on() */
> -	error = pinctrl_pm_select_sleep_state(ddata->dev);
> -	if (error)
> -		dev_warn(ddata->dev, "%s: error with sleep_state: %i\n",
> -			 __func__, error);
> -
>  	error = phy_mdm6600_init_lines(ddata);
>  	if (error)
>  		return error;
> -- 
> 2.42.0
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-phy/attachments/20230913/05079c18/attachment.sig>


More information about the linux-phy mailing list