Commit 9910f5c4 authored by Thierry Reding's avatar Thierry Reding

drm/tegra: Remove host1x drm_bus implementation

The DRM core can now cope with drivers that don't have an associated
struct drm_bus, so the host1x implementation is no longer useful.
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent b528ae71
ccflags-$(CONFIG_DRM_TEGRA_DEBUG) += -DDEBUG ccflags-$(CONFIG_DRM_TEGRA_DEBUG) += -DDEBUG
tegra-drm-y := \ tegra-drm-y := \
bus.o \
drm.o \ drm.o \
gem.o \ gem.o \
fb.o \ fb.o \
......
/*
* Copyright (C) 2013 NVIDIA Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include "drm.h"
static int drm_host1x_set_busid(struct drm_device *dev,
struct drm_master *master)
{
const char *device = dev_name(dev->dev);
const char *bus = dev->dev->bus->name;
master->unique_len = strlen(bus) + 1 + strlen(device);
master->unique_size = master->unique_len;
master->unique = kmalloc(master->unique_len + 1, GFP_KERNEL);
if (!master->unique)
return -ENOMEM;
snprintf(master->unique, master->unique_len + 1, "%s:%s", bus, device);
return 0;
}
static struct drm_bus drm_host1x_bus = {
.set_busid = drm_host1x_set_busid,
};
int drm_host1x_init(struct drm_driver *driver, struct host1x_device *device)
{
struct drm_device *drm;
int ret;
driver->bus = &drm_host1x_bus;
drm = drm_dev_alloc(driver, &device->dev);
if (!drm)
return -ENOMEM;
ret = drm_dev_register(drm, 0);
if (ret)
goto err_free;
DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", driver->name,
driver->major, driver->minor, driver->patchlevel,
driver->date, drm->primary->index);
return 0;
err_free:
drm_dev_unref(drm);
return ret;
}
void drm_host1x_exit(struct drm_driver *driver, struct host1x_device *device)
{
struct tegra_drm *tegra = dev_get_drvdata(&device->dev);
drm_put_dev(tegra->drm);
}
...@@ -1104,26 +1104,26 @@ static int tegra_dc_debugfs_exit(struct tegra_dc *dc) ...@@ -1104,26 +1104,26 @@ static int tegra_dc_debugfs_exit(struct tegra_dc *dc)
static int tegra_dc_init(struct host1x_client *client) static int tegra_dc_init(struct host1x_client *client)
{ {
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *drm = dev_get_drvdata(client->parent);
struct tegra_dc *dc = host1x_client_to_dc(client); struct tegra_dc *dc = host1x_client_to_dc(client);
int err; int err;
drm_crtc_init(tegra->drm, &dc->base, &tegra_crtc_funcs); drm_crtc_init(drm, &dc->base, &tegra_crtc_funcs);
drm_mode_crtc_set_gamma_size(&dc->base, 256); drm_mode_crtc_set_gamma_size(&dc->base, 256);
drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs); drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs);
err = tegra_dc_rgb_init(tegra->drm, dc); err = tegra_dc_rgb_init(drm, dc);
if (err < 0 && err != -ENODEV) { if (err < 0 && err != -ENODEV) {
dev_err(dc->dev, "failed to initialize RGB output: %d\n", err); dev_err(dc->dev, "failed to initialize RGB output: %d\n", err);
return err; return err;
} }
err = tegra_dc_add_planes(tegra->drm, dc); err = tegra_dc_add_planes(drm, dc);
if (err < 0) if (err < 0)
return err; return err;
if (IS_ENABLED(CONFIG_DEBUG_FS)) { if (IS_ENABLED(CONFIG_DEBUG_FS)) {
err = tegra_dc_debugfs_init(dc, tegra->drm->primary); err = tegra_dc_debugfs_init(dc, drm->primary);
if (err < 0) if (err < 0)
dev_err(dc->dev, "debugfs setup failed: %d\n", err); dev_err(dc->dev, "debugfs setup failed: %d\n", err);
} }
......
...@@ -33,7 +33,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags) ...@@ -33,7 +33,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
if (!tegra) if (!tegra)
return -ENOMEM; return -ENOMEM;
dev_set_drvdata(drm->dev, tegra);
mutex_init(&tegra->clients_lock); mutex_init(&tegra->clients_lock);
INIT_LIST_HEAD(&tegra->clients); INIT_LIST_HEAD(&tegra->clients);
drm->dev_private = tegra; drm->dev_private = tegra;
...@@ -640,14 +639,40 @@ int tegra_drm_unregister_client(struct tegra_drm *tegra, ...@@ -640,14 +639,40 @@ int tegra_drm_unregister_client(struct tegra_drm *tegra,
return 0; return 0;
} }
static int host1x_drm_probe(struct host1x_device *device) static int host1x_drm_probe(struct host1x_device *dev)
{ {
return drm_host1x_init(&tegra_drm_driver, device); struct drm_driver *driver = &tegra_drm_driver;
struct drm_device *drm;
int err;
drm = drm_dev_alloc(driver, &dev->dev);
if (!drm)
return -ENOMEM;
drm_dev_set_unique(drm, dev_name(&dev->dev));
dev_set_drvdata(&dev->dev, drm);
err = drm_dev_register(drm, 0);
if (err < 0)
goto unref;
DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", driver->name,
driver->major, driver->minor, driver->patchlevel,
driver->date, drm->primary->index);
return 0;
unref:
drm_dev_unref(drm);
return err;
} }
static int host1x_drm_remove(struct host1x_device *device) static int host1x_drm_remove(struct host1x_device *dev)
{ {
drm_host1x_exit(&tegra_drm_driver, device); struct drm_device *drm = dev_get_drvdata(&dev->dev);
drm_dev_unregister(drm);
drm_dev_unref(drm);
return 0; return 0;
} }
......
...@@ -249,10 +249,6 @@ static inline int tegra_output_check_mode(struct tegra_output *output, ...@@ -249,10 +249,6 @@ static inline int tegra_output_check_mode(struct tegra_output *output,
return output ? -ENOSYS : -EINVAL; return output ? -ENOSYS : -EINVAL;
} }
/* from bus.c */
int drm_host1x_init(struct drm_driver *driver, struct host1x_device *device);
void drm_host1x_exit(struct drm_driver *driver, struct host1x_device *device);
/* from rgb.c */ /* from rgb.c */
int tegra_dc_rgb_probe(struct tegra_dc *dc); int tegra_dc_rgb_probe(struct tegra_dc *dc);
int tegra_dc_rgb_remove(struct tegra_dc *dc); int tegra_dc_rgb_remove(struct tegra_dc *dc);
......
...@@ -715,7 +715,7 @@ static int tegra_dsi_pad_calibrate(struct tegra_dsi *dsi) ...@@ -715,7 +715,7 @@ static int tegra_dsi_pad_calibrate(struct tegra_dsi *dsi)
static int tegra_dsi_init(struct host1x_client *client) static int tegra_dsi_init(struct host1x_client *client)
{ {
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *drm = dev_get_drvdata(client->parent);
struct tegra_dsi *dsi = host1x_client_to_dsi(client); struct tegra_dsi *dsi = host1x_client_to_dsi(client);
int err; int err;
...@@ -723,14 +723,14 @@ static int tegra_dsi_init(struct host1x_client *client) ...@@ -723,14 +723,14 @@ static int tegra_dsi_init(struct host1x_client *client)
dsi->output.dev = client->dev; dsi->output.dev = client->dev;
dsi->output.ops = &dsi_ops; dsi->output.ops = &dsi_ops;
err = tegra_output_init(tegra->drm, &dsi->output); err = tegra_output_init(drm, &dsi->output);
if (err < 0) { if (err < 0) {
dev_err(client->dev, "output setup failed: %d\n", err); dev_err(client->dev, "output setup failed: %d\n", err);
return err; return err;
} }
if (IS_ENABLED(CONFIG_DEBUG_FS)) { if (IS_ENABLED(CONFIG_DEBUG_FS)) {
err = tegra_dsi_debugfs_init(dsi, tegra->drm->primary); err = tegra_dsi_debugfs_init(dsi, drm->primary);
if (err < 0) if (err < 0)
dev_err(dsi->dev, "debugfs setup failed: %d\n", err); dev_err(dsi->dev, "debugfs setup failed: %d\n", err);
} }
......
...@@ -28,7 +28,7 @@ static inline struct gr2d *to_gr2d(struct tegra_drm_client *client) ...@@ -28,7 +28,7 @@ static inline struct gr2d *to_gr2d(struct tegra_drm_client *client)
static int gr2d_init(struct host1x_client *client) static int gr2d_init(struct host1x_client *client)
{ {
struct tegra_drm_client *drm = host1x_to_drm_client(client); struct tegra_drm_client *drm = host1x_to_drm_client(client);
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *dev = dev_get_drvdata(client->parent);
unsigned long flags = HOST1X_SYNCPT_HAS_BASE; unsigned long flags = HOST1X_SYNCPT_HAS_BASE;
struct gr2d *gr2d = to_gr2d(drm); struct gr2d *gr2d = to_gr2d(drm);
...@@ -42,17 +42,17 @@ static int gr2d_init(struct host1x_client *client) ...@@ -42,17 +42,17 @@ static int gr2d_init(struct host1x_client *client)
return -ENOMEM; return -ENOMEM;
} }
return tegra_drm_register_client(tegra, drm); return tegra_drm_register_client(dev->dev_private, drm);
} }
static int gr2d_exit(struct host1x_client *client) static int gr2d_exit(struct host1x_client *client)
{ {
struct tegra_drm_client *drm = host1x_to_drm_client(client); struct tegra_drm_client *drm = host1x_to_drm_client(client);
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *dev = dev_get_drvdata(client->parent);
struct gr2d *gr2d = to_gr2d(drm); struct gr2d *gr2d = to_gr2d(drm);
int err; int err;
err = tegra_drm_unregister_client(tegra, drm); err = tegra_drm_unregister_client(dev->dev_private, drm);
if (err < 0) if (err < 0)
return err; return err;
......
...@@ -37,7 +37,7 @@ static inline struct gr3d *to_gr3d(struct tegra_drm_client *client) ...@@ -37,7 +37,7 @@ static inline struct gr3d *to_gr3d(struct tegra_drm_client *client)
static int gr3d_init(struct host1x_client *client) static int gr3d_init(struct host1x_client *client)
{ {
struct tegra_drm_client *drm = host1x_to_drm_client(client); struct tegra_drm_client *drm = host1x_to_drm_client(client);
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *dev = dev_get_drvdata(client->parent);
unsigned long flags = HOST1X_SYNCPT_HAS_BASE; unsigned long flags = HOST1X_SYNCPT_HAS_BASE;
struct gr3d *gr3d = to_gr3d(drm); struct gr3d *gr3d = to_gr3d(drm);
...@@ -51,17 +51,17 @@ static int gr3d_init(struct host1x_client *client) ...@@ -51,17 +51,17 @@ static int gr3d_init(struct host1x_client *client)
return -ENOMEM; return -ENOMEM;
} }
return tegra_drm_register_client(tegra, drm); return tegra_drm_register_client(dev->dev_private, drm);
} }
static int gr3d_exit(struct host1x_client *client) static int gr3d_exit(struct host1x_client *client)
{ {
struct tegra_drm_client *drm = host1x_to_drm_client(client); struct tegra_drm_client *drm = host1x_to_drm_client(client);
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *dev = dev_get_drvdata(client->parent);
struct gr3d *gr3d = to_gr3d(drm); struct gr3d *gr3d = to_gr3d(drm);
int err; int err;
err = tegra_drm_unregister_client(tegra, drm); err = tegra_drm_unregister_client(dev->dev_private, drm);
if (err < 0) if (err < 0)
return err; return err;
......
...@@ -1347,7 +1347,7 @@ static int tegra_hdmi_debugfs_exit(struct tegra_hdmi *hdmi) ...@@ -1347,7 +1347,7 @@ static int tegra_hdmi_debugfs_exit(struct tegra_hdmi *hdmi)
static int tegra_hdmi_init(struct host1x_client *client) static int tegra_hdmi_init(struct host1x_client *client)
{ {
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *drm = dev_get_drvdata(client->parent);
struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
int err; int err;
...@@ -1355,14 +1355,14 @@ static int tegra_hdmi_init(struct host1x_client *client) ...@@ -1355,14 +1355,14 @@ static int tegra_hdmi_init(struct host1x_client *client)
hdmi->output.dev = client->dev; hdmi->output.dev = client->dev;
hdmi->output.ops = &hdmi_ops; hdmi->output.ops = &hdmi_ops;
err = tegra_output_init(tegra->drm, &hdmi->output); err = tegra_output_init(drm, &hdmi->output);
if (err < 0) { if (err < 0) {
dev_err(client->dev, "output setup failed: %d\n", err); dev_err(client->dev, "output setup failed: %d\n", err);
return err; return err;
} }
if (IS_ENABLED(CONFIG_DEBUG_FS)) { if (IS_ENABLED(CONFIG_DEBUG_FS)) {
err = tegra_hdmi_debugfs_init(hdmi, tegra->drm->primary); err = tegra_hdmi_debugfs_init(hdmi, drm->primary);
if (err < 0) if (err < 0)
dev_err(client->dev, "debugfs setup failed: %d\n", err); dev_err(client->dev, "debugfs setup failed: %d\n", err);
} }
......
...@@ -1044,7 +1044,7 @@ static int tegra_sor_debugfs_exit(struct tegra_sor *sor) ...@@ -1044,7 +1044,7 @@ static int tegra_sor_debugfs_exit(struct tegra_sor *sor)
static int tegra_sor_init(struct host1x_client *client) static int tegra_sor_init(struct host1x_client *client)
{ {
struct tegra_drm *tegra = dev_get_drvdata(client->parent); struct drm_device *drm = dev_get_drvdata(client->parent);
struct tegra_sor *sor = host1x_client_to_sor(client); struct tegra_sor *sor = host1x_client_to_sor(client);
int err; int err;
...@@ -1056,14 +1056,14 @@ static int tegra_sor_init(struct host1x_client *client) ...@@ -1056,14 +1056,14 @@ static int tegra_sor_init(struct host1x_client *client)
sor->output.dev = sor->dev; sor->output.dev = sor->dev;
sor->output.ops = &sor_ops; sor->output.ops = &sor_ops;
err = tegra_output_init(tegra->drm, &sor->output); err = tegra_output_init(drm, &sor->output);
if (err < 0) { if (err < 0) {
dev_err(sor->dev, "output setup failed: %d\n", err); dev_err(sor->dev, "output setup failed: %d\n", err);
return err; return err;
} }
if (IS_ENABLED(CONFIG_DEBUG_FS)) { if (IS_ENABLED(CONFIG_DEBUG_FS)) {
struct dentry *root = tegra->drm->primary->debugfs_root; struct dentry *root = drm->primary->debugfs_root;
err = tegra_sor_debugfs_init(sor, root); err = tegra_sor_debugfs_init(sor, root);
if (err < 0) if (err < 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment