diff options
Diffstat (limited to 'drivers/gpu/drm/aspeed/aspeed_gfx_drv.c')
| -rw-r--r-- | drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 80 | 
1 files changed, 73 insertions, 7 deletions
| diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c index 2b424b2b85cc..457ec04950f7 100644 --- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c @@ -191,14 +191,9 @@ static void aspeed_gfx_unload(struct drm_device *drm)  DEFINE_DRM_GEM_CMA_FOPS(fops); -static struct drm_driver aspeed_gfx_driver = { +static const struct drm_driver aspeed_gfx_driver = {  	.driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC, -	.gem_create_object	= drm_gem_cma_create_object_default_funcs, -	.dumb_create		= drm_gem_cma_dumb_create, -	.prime_handle_to_fd	= drm_gem_prime_handle_to_fd, -	.prime_fd_to_handle	= drm_gem_prime_fd_to_handle, -	.gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table, -	.gem_prime_mmap		= drm_gem_prime_mmap, +	DRM_GEM_CMA_DRIVER_OPS,  	.fops = &fops,  	.name = "aspeed-gfx-drm",  	.desc = "ASPEED GFX DRM", @@ -212,6 +207,69 @@ static const struct of_device_id aspeed_gfx_match[] = {  	{ }  }; +#define ASPEED_SCU_VGA0		0x50 +#define ASPEED_SCU_MISC_CTRL	0x2c + +static ssize_t dac_mux_store(struct device *dev, struct device_attribute *attr, +			     const char *buf, size_t count) +{ +	struct aspeed_gfx *priv = dev_get_drvdata(dev); +	u32 val; +	int rc; + +	rc = kstrtou32(buf, 0, &val); +	if (rc) +		return rc; + +	if (val > 3) +		return -EINVAL; + +	rc = regmap_update_bits(priv->scu, ASPEED_SCU_MISC_CTRL, 0x30000, val << 16); +	if (rc < 0) +		return 0; + +	return count; +} + +static ssize_t dac_mux_show(struct device *dev, struct device_attribute *attr, char *buf) +{ +	struct aspeed_gfx *priv = dev_get_drvdata(dev); +	u32 reg; +	int rc; + +	rc = regmap_read(priv->scu, ASPEED_SCU_MISC_CTRL, ®); +	if (rc) +		return rc; + +	return sprintf(buf, "%u\n", (reg >> 16) & 0x3); +} +static DEVICE_ATTR_RW(dac_mux); + +static ssize_t +vga_pw_show(struct device *dev, struct device_attribute *attr, char *buf) +{ +	struct aspeed_gfx *priv = dev_get_drvdata(dev); +	u32 reg; +	int rc; + +	rc = regmap_read(priv->scu, ASPEED_SCU_VGA0, ®); +	if (rc) +		return rc; + +	return sprintf(buf, "%u\n", reg & 1); +} +static DEVICE_ATTR_RO(vga_pw); + +static struct attribute *aspeed_sysfs_entries[] = { +	&dev_attr_vga_pw.attr, +	&dev_attr_dac_mux.attr, +	NULL, +}; + +static struct attribute_group aspeed_sysfs_attr_group = { +	.attrs = aspeed_sysfs_entries, +}; +  static int aspeed_gfx_probe(struct platform_device *pdev)  {  	struct aspeed_gfx *priv; @@ -226,6 +284,12 @@ static int aspeed_gfx_probe(struct platform_device *pdev)  	if (ret)  		return ret; +	dev_set_drvdata(&pdev->dev, priv); + +	ret = sysfs_create_group(&pdev->dev.kobj, &aspeed_sysfs_attr_group); +	if (ret) +		return ret; +  	ret = drm_dev_register(&priv->drm, 0);  	if (ret)  		goto err_unload; @@ -234,6 +298,7 @@ static int aspeed_gfx_probe(struct platform_device *pdev)  	return 0;  err_unload: +	sysfs_remove_group(&pdev->dev.kobj, &aspeed_sysfs_attr_group);  	aspeed_gfx_unload(&priv->drm);  	return ret; @@ -243,6 +308,7 @@ static int aspeed_gfx_remove(struct platform_device *pdev)  {  	struct drm_device *drm = platform_get_drvdata(pdev); +	sysfs_remove_group(&pdev->dev.kobj, &aspeed_sysfs_attr_group);  	drm_dev_unregister(drm);  	aspeed_gfx_unload(drm); | 
