Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-serial
[pandora-kernel.git] / drivers / char / drm / via_map.c
index bb17113..782011e 100644 (file)
 
 static int via_do_init_map(drm_device_t * dev, drm_via_init_t * init)
 {
-       drm_via_private_t *dev_priv;
+       drm_via_private_t *dev_priv = dev->dev_private;
 
        DRM_DEBUG("%s\n", __FUNCTION__);
 
-       dev_priv = drm_alloc(sizeof(drm_via_private_t), DRM_MEM_DRIVER);
-       if (dev_priv == NULL)
-               return -ENOMEM;
-
-       memset(dev_priv, 0, sizeof(drm_via_private_t));
-
        DRM_GETSAREA();
        if (!dev_priv->sarea) {
                DRM_ERROR("could not find sarea!\n");
@@ -66,8 +60,9 @@ static int via_do_init_map(drm_device_t * dev, drm_via_init_t * init)
 
        dev_priv->agpAddr = init->agpAddr;
 
-       via_init_futex( dev_priv );
-       dev_priv->pro_group_a = (dev->pdev->device == 0x3118);
+       via_init_futex(dev_priv);
+
+       via_init_dmablit(dev);
 
        dev->dev_private = (void *)dev_priv;
        return 0;
@@ -75,15 +70,7 @@ static int via_do_init_map(drm_device_t * dev, drm_via_init_t * init)
 
 int via_do_cleanup_map(drm_device_t * dev)
 {
-       if (dev->dev_private) {
-
-               drm_via_private_t *dev_priv = dev->dev_private;
-
-               via_dma_cleanup(dev);
-
-               drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
-               dev->dev_private = NULL;
-       }
+       via_dma_cleanup(dev);
 
        return 0;
 }
@@ -108,4 +95,35 @@ int via_map_init(DRM_IOCTL_ARGS)
        return -EINVAL;
 }
 
+int via_driver_load(drm_device_t *dev, unsigned long chipset)
+{
+       drm_via_private_t *dev_priv;
+       int ret = 0;
+
+       dev_priv = drm_calloc(1, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
+       if (dev_priv == NULL)
+               return DRM_ERR(ENOMEM);
+
+       dev->dev_private = (void *)dev_priv;
+
+       if (chipset == VIA_PRO_GROUP_A)
+               dev_priv->pro_group_a = 1;
+
+       ret = drm_sman_init(&dev_priv->sman, 2, 12, 8);
+       if (ret) {
+               drm_free(dev_priv, sizeof(*dev_priv), DRM_MEM_DRIVER);
+       }
+       return ret;
+}
+
+int via_driver_unload(drm_device_t *dev)
+{
+       drm_via_private_t *dev_priv = dev->dev_private;
+
+       drm_sman_takedown(&dev_priv->sman);
+
+       drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER);
+
+       return 0;
+}