Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
  1/*
  2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
  4 *
  5 * Permission is hereby granted, free of charge, to any person obtaining a
  6 * copy of this software and associated documentation files (the "Software"),
  7 * to deal in the Software without restriction, including without limitation
  8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
  9 * and/or sell copies of the Software, and to permit persons to whom the
 10 * Software is furnished to do so, subject to the following conditions:
 11 *
 12 * The above copyright notice and this permission notice (including the
 13 * next paragraph) shall be included in all copies or substantial portions
 14 * of the Software.
 15 *
 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
 19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 22 * DEALINGS IN THE SOFTWARE.
 23 */
 24#include "drmP.h"
 25#include "via_drm.h"
 26#include "via_drv.h"
 27
 28static int via_do_init_map(struct drm_device *dev, drm_via_init_t *init)
 29{
 30	drm_via_private_t *dev_priv = dev->dev_private;
 31
 32	DRM_DEBUG("\n");
 33
 34	dev_priv->sarea = drm_getsarea(dev);
 35	if (!dev_priv->sarea) {
 36		DRM_ERROR("could not find sarea!\n");
 37		dev->dev_private = (void *)dev_priv;
 38		via_do_cleanup_map(dev);
 39		return -EINVAL;
 40	}
 41
 42	dev_priv->fb = drm_core_findmap(dev, init->fb_offset);
 43	if (!dev_priv->fb) {
 44		DRM_ERROR("could not find framebuffer!\n");
 45		dev->dev_private = (void *)dev_priv;
 46		via_do_cleanup_map(dev);
 47		return -EINVAL;
 48	}
 49	dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset);
 50	if (!dev_priv->mmio) {
 51		DRM_ERROR("could not find mmio region!\n");
 52		dev->dev_private = (void *)dev_priv;
 53		via_do_cleanup_map(dev);
 54		return -EINVAL;
 55	}
 56
 57	dev_priv->sarea_priv =
 58	    (drm_via_sarea_t *) ((u8 *) dev_priv->sarea->handle +
 59				 init->sarea_priv_offset);
 60
 61	dev_priv->agpAddr = init->agpAddr;
 62
 63	via_init_futex(dev_priv);
 64
 65	via_init_dmablit(dev);
 66
 67	dev->dev_private = (void *)dev_priv;
 68	return 0;
 69}
 70
 71int via_do_cleanup_map(struct drm_device *dev)
 72{
 73	via_dma_cleanup(dev);
 74
 75	return 0;
 76}
 77
 78int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
 79{
 80	drm_via_init_t *init = data;
 81
 82	DRM_DEBUG("\n");
 83
 84	switch (init->func) {
 85	case VIA_INIT_MAP:
 86		return via_do_init_map(dev, init);
 87	case VIA_CLEANUP_MAP:
 88		return via_do_cleanup_map(dev);
 89	}
 90
 91	return -EINVAL;
 92}
 93
 94int via_driver_load(struct drm_device *dev, unsigned long chipset)
 95{
 96	drm_via_private_t *dev_priv;
 97	int ret = 0;
 98
 99	dev_priv = kzalloc(sizeof(drm_via_private_t), GFP_KERNEL);
100	if (dev_priv == NULL)
101		return -ENOMEM;
102
103	dev->dev_private = (void *)dev_priv;
104
105	dev_priv->chipset = chipset;
106
107	ret = drm_sman_init(&dev_priv->sman, 2, 12, 8);
108	if (ret) {
109		kfree(dev_priv);
110		return ret;
111	}
112
113	ret = drm_vblank_init(dev, 1);
114	if (ret) {
115		drm_sman_takedown(&dev_priv->sman);
116		kfree(dev_priv);
117		return ret;
118	}
119
120	return 0;
121}
122
123int via_driver_unload(struct drm_device *dev)
124{
125	drm_via_private_t *dev_priv = dev->dev_private;
126
127	drm_sman_takedown(&dev_priv->sman);
128
129	kfree(dev_priv);
130
131	return 0;
132}