Commit 9f2cdbef authored by Baihan Li's avatar Baihan Li Committed by Yongbang Shi
Browse files

drm/hisilicon/hibmc: refactored struct hibmc_drm_private

maillist inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IBSNIA
CVE: NA

Reference: https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=587013d72c1a217ced9f42a9a08c8013052cabfc



----------------------------------------------------------------------

Refactored struct hibmc_drm_private to separate VGA module from
generic struct.

Signed-off-by: default avatarBaihan Li <libaihan@huawei.com>
Signed-off-by: default avatarYongbang Shi <shiyongbang@huawei.com>
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: default avatarTian Tao <tiantao6@hisilicon.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250103093824.1963816-5-shiyongbang@huawei.com


Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
parent 71544d0b
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -21,9 +21,10 @@
#include <drm/drm_edid.h>
#include <drm/drm_framebuffer.h>

struct hibmc_connector {
	struct drm_connector base;

struct hibmc_vdac {
	struct drm_device *dev;
	struct drm_encoder encoder;
	struct drm_connector connector;
	struct i2c_adapter adapter;
	struct i2c_algo_bit_data bit_data;
};
@@ -36,13 +37,12 @@ struct hibmc_drm_private {
	struct drm_device dev;
	struct drm_plane primary_plane;
	struct drm_crtc crtc;
	struct drm_encoder encoder;
	struct hibmc_connector connector;
	struct hibmc_vdac vdac;
};

static inline struct hibmc_connector *to_hibmc_connector(struct drm_connector *connector)
static inline struct hibmc_vdac *to_hibmc_vdac(struct drm_connector *connector)
{
	return container_of(connector, struct hibmc_connector, base);
	return container_of(connector, struct hibmc_vdac, connector);
}

static inline struct hibmc_drm_private *to_hibmc_drm_private(struct drm_device *dev)
@@ -59,6 +59,6 @@ int hibmc_de_init(struct hibmc_drm_private *priv);
int hibmc_vdac_init(struct hibmc_drm_private *priv);

int hibmc_mm_init(struct hibmc_drm_private *hibmc);
int hibmc_ddc_create(struct drm_device *drm_dev, struct hibmc_connector *connector);
int hibmc_ddc_create(struct drm_device *drm_dev, struct hibmc_vdac *connector);

#endif
+20 −22
Original line number Diff line number Diff line
@@ -25,8 +25,8 @@

static void hibmc_set_i2c_signal(void *data, u32 mask, int value)
{
	struct hibmc_connector *hibmc_connector = data;
	struct hibmc_drm_private *priv = to_hibmc_drm_private(hibmc_connector->base.dev);
	struct hibmc_vdac *vdac = data;
	struct hibmc_drm_private *priv = to_hibmc_drm_private(vdac->connector.dev);
	u32 tmp_dir = readl(priv->mmio + GPIO_DATA_DIRECTION);

	if (value) {
@@ -45,8 +45,8 @@ static void hibmc_set_i2c_signal(void *data, u32 mask, int value)

static int hibmc_get_i2c_signal(void *data, u32 mask)
{
	struct hibmc_connector *hibmc_connector = data;
	struct hibmc_drm_private *priv = to_hibmc_drm_private(hibmc_connector->base.dev);
	struct hibmc_vdac *vdac = data;
	struct hibmc_drm_private *priv = to_hibmc_drm_private(vdac->connector.dev);
	u32 tmp_dir = readl(priv->mmio + GPIO_DATA_DIRECTION);

	if ((tmp_dir & mask) != mask) {
@@ -77,23 +77,21 @@ static int hibmc_ddc_getscl(void *data)
	return hibmc_get_i2c_signal(data, I2C_SCL_MASK);
}

int hibmc_ddc_create(struct drm_device *drm_dev,
		     struct hibmc_connector *connector)
int hibmc_ddc_create(struct drm_device *drm_dev, struct hibmc_vdac *vdac)
{
	connector->adapter.owner = THIS_MODULE;
	connector->adapter.class = I2C_CLASS_DDC;
	snprintf(connector->adapter.name, I2C_NAME_SIZE, "HIS i2c bit bus");
	connector->adapter.dev.parent = drm_dev->dev;
	i2c_set_adapdata(&connector->adapter, connector);
	connector->adapter.algo_data = &connector->bit_data;

	connector->bit_data.udelay = 20;
	connector->bit_data.timeout = usecs_to_jiffies(2000);
	connector->bit_data.data = connector;
	connector->bit_data.setsda = hibmc_ddc_setsda;
	connector->bit_data.setscl = hibmc_ddc_setscl;
	connector->bit_data.getsda = hibmc_ddc_getsda;
	connector->bit_data.getscl = hibmc_ddc_getscl;

	return i2c_bit_add_bus(&connector->adapter);
	vdac->adapter.owner = THIS_MODULE;
	snprintf(vdac->adapter.name, I2C_NAME_SIZE, "HIS i2c bit bus");
	vdac->adapter.dev.parent = drm_dev->dev;
	i2c_set_adapdata(&vdac->adapter, vdac);
	vdac->adapter.algo_data = &vdac->bit_data;

	vdac->bit_data.udelay = 20;
	vdac->bit_data.timeout = usecs_to_jiffies(2000);
	vdac->bit_data.data = vdac;
	vdac->bit_data.setsda = hibmc_ddc_setsda;
	vdac->bit_data.setscl = hibmc_ddc_setscl;
	vdac->bit_data.getsda = hibmc_ddc_getsda;
	vdac->bit_data.getscl = hibmc_ddc_getscl;

	return i2c_bit_add_bus(&vdac->adapter);
}
+10 −10
Original line number Diff line number Diff line
@@ -23,11 +23,11 @@

static int hibmc_connector_get_modes(struct drm_connector *connector)
{
	struct hibmc_connector *hibmc_connector = to_hibmc_connector(connector);
	struct hibmc_vdac *vdac = to_hibmc_vdac(connector);
	const struct drm_edid *drm_edid;
	int count;

	drm_edid = drm_edid_read_ddc(connector, &hibmc_connector->adapter);
	drm_edid = drm_edid_read_ddc(connector, &vdac->adapter);

	drm_edid_connector_update(connector, drm_edid);

@@ -50,9 +50,9 @@ static int hibmc_connector_get_modes(struct drm_connector *connector)

static void hibmc_connector_destroy(struct drm_connector *connector)
{
	struct hibmc_connector *hibmc_connector = to_hibmc_connector(connector);
	struct hibmc_vdac *vdac = to_hibmc_vdac(connector);

	i2c_del_adapter(&hibmc_connector->adapter);
	i2c_del_adapter(&vdac->adapter);
	drm_connector_cleanup(connector);
}

@@ -92,20 +92,20 @@ static const struct drm_encoder_helper_funcs hibmc_encoder_helper_funcs = {
int hibmc_vdac_init(struct hibmc_drm_private *priv)
{
	struct drm_device *dev = &priv->dev;
	struct hibmc_connector *hibmc_connector = &priv->connector;
	struct drm_encoder *encoder = &priv->encoder;
	struct hibmc_vdac *vdac = &priv->vdac;
	struct drm_encoder *encoder = &vdac->encoder;
	struct drm_crtc *crtc = &priv->crtc;
	struct drm_connector *connector = &hibmc_connector->base;
	struct drm_connector *connector = &vdac->connector;
	int ret;

	ret = hibmc_ddc_create(dev, hibmc_connector);
	ret = hibmc_ddc_create(dev, vdac);
	if (ret) {
		drm_err(dev, "failed to create ddc: %d\n", ret);
		return ret;
	}

	encoder->possible_crtcs = drm_crtc_mask(crtc);
	ret = drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_DAC);
	ret = drmm_encoder_init(dev, encoder, NULL, DRM_MODE_ENCODER_DAC, NULL);
	if (ret) {
		drm_err(dev, "failed to init encoder: %d\n", ret);
		return ret;
@@ -116,7 +116,7 @@ int hibmc_vdac_init(struct hibmc_drm_private *priv)
	ret = drm_connector_init_with_ddc(dev, connector,
					  &hibmc_connector_funcs,
					  DRM_MODE_CONNECTOR_VGA,
					  &hibmc_connector->adapter);
					  &vdac->adapter);
	if (ret) {
		drm_err(dev, "failed to init connector: %d\n", ret);
		return ret;