mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 23:03:57 -04:00
After integrating OLDI support[0], it is necessary to identify which VP
instances use OLDI, since the OLDI driver owns the video port clock
(as a serial clock). Clock operations on these VPs must be delegated to
the OLDI driver, not handled by the TIDSS driver. This issue also
emerged in upstream discussions when DSI-related clock management was
attempted in the TIDSS driver[1].
To address this, add an 'is_ext_vp_clk' array to the 'tidss_device'
structure, marking a VP as 'true' during 'tidss_oldi_init()' and as
'false' during 'tidss_oldi_deinit()'. TIDSS then uses 'is_ext_vp_clk'
to skip clock validation checks in 'dispc_vp_mode_valid()' for VPs
under OLDI control.
Since OLDI uses the DSS VP clock directly as a serial interface and
manages its own rate, mode validation should be implemented in the OLDI
bridge's 'mode_valid' hook. This patch adds that logic, ensuring proper
delegation and avoiding spurious clock handling in the TIDSS driver.
[0]: https://lore.kernel.org/all/20250528122544.817829-1-aradhya.bhatia@linux.dev/
[1]: https://lore.kernel.org/all/DA6TT575Z82D.3MPK8HG5GRL8U@kernel.org/
Fixes: 7246e09299 ("drm/tidss: Add OLDI bridge support")
Tested-by: Michael Walle <mwalle@kernel.org>
Reviewed-by: Devarsh Thakkar <devarsht@ti.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Signed-off-by: Jayesh Choudhary <j-choudhary@ti.com>
Signed-off-by: Swamil Jain <s-jain1@ti.com>
Link: https://patch.msgid.link/20251104151422.307162-3-s-jain1@ti.com
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Link: https://patch.msgid.link/ffd5ebe03391b3c01e616c0c844a4b8ddecede36.1762513240.git.jani.nikula@intel.com
52 lines
1.2 KiB
C
52 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2018 Texas Instruments Incorporated - https://www.ti.com/
|
|
* Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
|
|
*/
|
|
|
|
#ifndef __TIDSS_DRV_H__
|
|
#define __TIDSS_DRV_H__
|
|
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <drm/drm_device.h>
|
|
|
|
#define TIDSS_MAX_PORTS 4
|
|
#define TIDSS_MAX_PLANES 4
|
|
#define TIDSS_MAX_OLDI_TXES 2
|
|
|
|
typedef u32 dispc_irq_t;
|
|
struct tidss_oldi;
|
|
|
|
struct tidss_device {
|
|
struct drm_device ddev; /* DRM device for DSS */
|
|
struct device *dev; /* Underlying DSS device */
|
|
|
|
const struct dispc_features *feat;
|
|
struct dispc_device *dispc;
|
|
bool is_ext_vp_clk[TIDSS_MAX_PORTS];
|
|
|
|
|
|
unsigned int num_crtcs;
|
|
struct drm_crtc *crtcs[TIDSS_MAX_PORTS];
|
|
|
|
unsigned int num_planes;
|
|
struct drm_plane *planes[TIDSS_MAX_PLANES];
|
|
|
|
unsigned int num_oldis;
|
|
struct tidss_oldi *oldis[TIDSS_MAX_OLDI_TXES];
|
|
|
|
unsigned int irq;
|
|
|
|
/* protects the irq masks field and irqenable/irqstatus registers */
|
|
spinlock_t irq_lock;
|
|
dispc_irq_t irq_mask; /* enabled irqs */
|
|
};
|
|
|
|
#define to_tidss(__dev) container_of(__dev, struct tidss_device, ddev)
|
|
|
|
int tidss_runtime_get(struct tidss_device *tidss);
|
|
void tidss_runtime_put(struct tidss_device *tidss);
|
|
|
|
#endif
|