Commit a0497251 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm/tegra/for-5.12-rc6' of ssh://git.freedesktop.org/git/tegra/linux into drm-fixes



drm/tegra: Fixes for v5.12-rc6

This contains a couple of fixes for various issues such as lockdep
warnings, runtime PM references, coupled display controllers and
misconfigured PLLs.

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Thierry Reding <thierry.reding@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210401163352.3348296-1-thierry.reding@gmail.com
parents dcdb7aa4 ac097aec
Loading
Loading
Loading
Loading
+13 −17
Original line number Diff line number Diff line
@@ -1688,6 +1688,11 @@ static void tegra_dc_commit_state(struct tegra_dc *dc,
			dev_err(dc->dev,
				"failed to set clock rate to %lu Hz\n",
				state->pclk);

		err = clk_set_rate(dc->clk, state->pclk);
		if (err < 0)
			dev_err(dc->dev, "failed to set clock %pC to %lu Hz: %d\n",
				dc->clk, state->pclk, err);
	}

	DRM_DEBUG_KMS("rate: %lu, div: %u\n", clk_get_rate(dc->clk),
@@ -1698,11 +1703,6 @@ static void tegra_dc_commit_state(struct tegra_dc *dc,
		value = SHIFT_CLK_DIVIDER(state->div) | PIXEL_CLK_DIVIDER_PCD1;
		tegra_dc_writel(dc, value, DC_DISP_DISP_CLOCK_CONTROL);
	}

	err = clk_set_rate(dc->clk, state->pclk);
	if (err < 0)
		dev_err(dc->dev, "failed to set clock %pC to %lu Hz: %d\n",
			dc->clk, state->pclk, err);
}

static void tegra_dc_stop(struct tegra_dc *dc)
@@ -2501,22 +2501,18 @@ static int tegra_dc_couple(struct tegra_dc *dc)
	 * POWER_CONTROL registers during CRTC enabling.
	 */
	if (dc->soc->coupled_pm && dc->pipe == 1) {
		u32 flags = DL_FLAG_PM_RUNTIME | DL_FLAG_AUTOREMOVE_CONSUMER;
		struct device_link *link;
		struct device *partner;
		struct device *companion;
		struct tegra_dc *parent;

		partner = driver_find_device(dc->dev->driver, NULL, NULL,
		companion = driver_find_device(dc->dev->driver, NULL, (const void *)0,
					       tegra_dc_match_by_pipe);
		if (!partner)
		if (!companion)
			return -EPROBE_DEFER;

		link = device_link_add(dc->dev, partner, flags);
		if (!link) {
			dev_err(dc->dev, "failed to link controllers\n");
			return -EINVAL;
		}
		parent = dev_get_drvdata(companion);
		dc->client.parent = &parent->client;

		dev_dbg(dc->dev, "coupled to %s\n", dev_name(partner));
		dev_dbg(dc->dev, "coupled to %s\n", dev_name(companion));
	}

	return 0;
+7 −0
Original line number Diff line number Diff line
@@ -3115,6 +3115,12 @@ static int tegra_sor_init(struct host1x_client *client)
	 * kernel is possible.
	 */
	if (sor->rst) {
		err = pm_runtime_resume_and_get(sor->dev);
		if (err < 0) {
			dev_err(sor->dev, "failed to get runtime PM: %d\n", err);
			return err;
		}

		err = reset_control_acquire(sor->rst);
		if (err < 0) {
			dev_err(sor->dev, "failed to acquire SOR reset: %d\n",
@@ -3148,6 +3154,7 @@ static int tegra_sor_init(struct host1x_client *client)
		}

		reset_control_release(sor->rst);
		pm_runtime_put(sor->dev);
	}

	err = clk_prepare_enable(sor->clk_safe);
+6 −4
Original line number Diff line number Diff line
@@ -705,8 +705,9 @@ void host1x_driver_unregister(struct host1x_driver *driver)
EXPORT_SYMBOL(host1x_driver_unregister);

/**
 * host1x_client_register() - register a host1x client
 * __host1x_client_register() - register a host1x client
 * @client: host1x client
 * @key: lock class key for the client-specific mutex
 *
 * Registers a host1x client with each host1x controller instance. Note that
 * each client will only match their parent host1x controller and will only be
@@ -715,13 +716,14 @@ EXPORT_SYMBOL(host1x_driver_unregister);
 * device and call host1x_device_init(), which will in turn call each client's
 * &host1x_client_ops.init implementation.
 */
int host1x_client_register(struct host1x_client *client)
int __host1x_client_register(struct host1x_client *client,
			     struct lock_class_key *key)
{
	struct host1x *host1x;
	int err;

	INIT_LIST_HEAD(&client->list);
	mutex_init(&client->lock);
	__mutex_init(&client->lock, "host1x client lock", key);
	client->usecount = 0;

	mutex_lock(&devices_lock);
@@ -742,7 +744,7 @@ int host1x_client_register(struct host1x_client *client)

	return 0;
}
EXPORT_SYMBOL(host1x_client_register);
EXPORT_SYMBOL(__host1x_client_register);

/**
 * host1x_client_unregister() - unregister a host1x client
+8 −1
Original line number Diff line number Diff line
@@ -320,7 +320,14 @@ static inline struct host1x_device *to_host1x_device(struct device *dev)
int host1x_device_init(struct host1x_device *device);
int host1x_device_exit(struct host1x_device *device);

int host1x_client_register(struct host1x_client *client);
int __host1x_client_register(struct host1x_client *client,
			     struct lock_class_key *key);
#define host1x_client_register(class) \
	({ \
		static struct lock_class_key __key; \
		__host1x_client_register(class, &__key); \
	})

int host1x_client_unregister(struct host1x_client *client);

int host1x_client_suspend(struct host1x_client *client);