diff options
author | Jon Smirl <jonsmirl@yahoo.com> | 2004-09-24 03:12:17 +0000 |
---|---|---|
committer | Jon Smirl <jonsmirl@yahoo.com> | 2004-09-24 03:12:17 +0000 |
commit | 74f063fc9d445f263242063e7acab1864ff75205 (patch) | |
tree | efa4cbd32db328d11e0c9777b48094f4e75bbed1 /linux-core | |
parent | 36a257cfe9e45e7a2022f19100a193eb73e30d4b (diff) |
Create new linux-2.6 build. Move all gpl files into the 2.6 build. If you
edit files for 2.6 be sure and break the link to the 2.4 directory and
copy the cvs history.
Diffstat (limited to 'linux-core')
-rw-r--r-- | linux-core/Makefile | 2 | ||||
-rw-r--r-- | linux-core/Makefile.kernel | 2 | ||||
-rw-r--r-- | linux-core/drm_core.h | 1 | ||||
-rw-r--r-- | linux-core/drm_sysfs.c | 206 | ||||
-rw-r--r-- | linux-core/radeon_i2c.c | 157 | ||||
-rw-r--r-- | linux-core/radeon_i2c.h | 29 |
6 files changed, 394 insertions, 3 deletions
diff --git a/linux-core/Makefile b/linux-core/Makefile index b338f7db..41339420 100644 --- a/linux-core/Makefile +++ b/linux-core/Makefile @@ -70,7 +70,7 @@ DRM_MODULES ?= $(MODULE_LIST) DRMTEMPLATES = drm_auth.h drm_bufs.h drm_context.h drm_dma.h drm_drawable.h \ drm_drv.h drm_fops.h drm_init.h drm_ioctl.h drm_irq.h \ drm_lock.h drm_memory.h drm_proc.h drm_stub.h drm_vm.h \ - drm_sysfs.h drm_core.h + drm_core.h DRMSHARED = drm.h drm_sarea.h DRMHEADERS = drmP.h $(DRMSHARED) diff --git a/linux-core/Makefile.kernel b/linux-core/Makefile.kernel index 5ff3d399..92e3f73e 100644 --- a/linux-core/Makefile.kernel +++ b/linux-core/Makefile.kernel @@ -13,7 +13,7 @@ mga-objs := mga_drv.o mga_dma.o mga_state.o mga_warp.o mga_irq.o i810-objs := i810_drv.o i810_dma.o i830-objs := i830_drv.o i830_dma.o i830_irq.o i915-objs := i915_drv.o i915_dma.o i915_irq.o i915_mem.o -radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o radeon_i2c.o +radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o sis-objs := sis_drv.o sis_ds.o sis_mm.o ffb-objs := ffb_drv.o ffb_context.o savage-objs := savage_drv.o savage_dma.o diff --git a/linux-core/drm_core.h b/linux-core/drm_core.h index 4e27d90a..adaf581b 100644 --- a/linux-core/drm_core.h +++ b/linux-core/drm_core.h @@ -39,6 +39,5 @@ #include "drm_pci.h" #include "drm_proc.h" #include "drm_vm.h" -#include "drm_sysfs.h" #include "drm_stub.h" #include "drm_scatter.h" diff --git a/linux-core/drm_sysfs.c b/linux-core/drm_sysfs.c new file mode 100644 index 00000000..c6f6a7a9 --- /dev/null +++ b/linux-core/drm_sysfs.c @@ -0,0 +1,206 @@ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) +/* + * drm_sysfs.c - Modifications to drm_sysfs_class.c to support + * extra sysfs attribute from DRM. Normal drm_sysfs_class + * does not allow adding attributes. + * + * Copyright (c) 2004 Jon Smirl <jonsmirl@gmail.com> + * Copyright (c) 2003-2004 Greg Kroah-Hartman <greg@kroah.com> + * Copyright (c) 2003-2004 IBM Corp. + * + * This file is released under the GPLv2 + * + */ + +#include <linux/config.h> +#include <linux/device.h> +#include <linux/kdev_t.h> +#include <linux/err.h> + +struct drm_sysfs_class { + struct class_device_attribute attr; + struct class class; +}; +#define to_drm_sysfs_class(d) container_of(d, struct drm_sysfs_class, class) + +struct simple_dev { + struct list_head node; + dev_t dev; + struct class_device class_dev; +}; +#define to_simple_dev(d) container_of(d, struct simple_dev, class_dev) + +static LIST_HEAD(simple_dev_list); +static spinlock_t simple_dev_list_lock = SPIN_LOCK_UNLOCKED; + +static void release_simple_dev(struct class_device *class_dev) +{ + struct simple_dev *s_dev = to_simple_dev(class_dev); + kfree(s_dev); +} + +static ssize_t show_dev(struct class_device *class_dev, char *buf) +{ + struct simple_dev *s_dev = to_simple_dev(class_dev); + return print_dev_t(buf, s_dev->dev); +} + +static void drm_sysfs_class_release(struct class *class) +{ + struct drm_sysfs_class *cs = to_drm_sysfs_class(class); + kfree(cs); +} + +/* Display the version of drm_core. This doesn't work right in current design */ +static ssize_t version_show(struct class *dev, char *buf) +{ + return sprintf(buf, "fixme for drm_core %s %d.%d.%d %s\n", DRIVER_NAME, DRIVER_MAJOR, + DRIVER_MINOR, DRIVER_PATCHLEVEL, DRIVER_DATE); +} +static CLASS_ATTR(version, S_IRUGO, version_show, NULL); + +/** + * DRM(sysfs_create) - create a struct drm_sysfs_class structure + * @owner: pointer to the module that is to "own" this struct drm_sysfs_class + * @name: pointer to a string for the name of this class. + * + * This is used to create a struct drm_sysfs_class pointer that can then be used + * in calls to DRM(sysfs_device_add)(). + * + * Note, the pointer created here is to be destroyed when finished by making a + * call to DRM(sysfs_destroy)(). + */ +struct drm_sysfs_class *DRM(sysfs_create)(struct module *owner, char *name) +{ + struct drm_sysfs_class *cs; + int retval; + + cs = kmalloc(sizeof(*cs), GFP_KERNEL); + if (!cs) { + retval = -ENOMEM; + goto error; + } + memset(cs, 0x00, sizeof(*cs)); + + cs->class.name = name; + cs->class.class_release = drm_sysfs_class_release; + cs->class.release = release_simple_dev; + + cs->attr.attr.name = "dev"; + cs->attr.attr.mode = S_IRUGO; + cs->attr.attr.owner = owner; + cs->attr.show = show_dev; + cs->attr.store = NULL; + + retval = class_register(&cs->class); + if (retval) + goto error; + class_create_file(&cs->class, &class_attr_version); + + return cs; + +error: + kfree(cs); + return ERR_PTR(retval); +} + +/** + * DRM(sysfs_destroy) - destroys a struct drm_sysfs_class structure + * @cs: pointer to the struct drm_sysfs_class that is to be destroyed + * + * Note, the pointer to be destroyed must have been created with a call to + * DRM(sysfs_create)(). + */ +void DRM(sysfs_destroy)(struct drm_sysfs_class *cs) +{ + if ((cs == NULL) || (IS_ERR(cs))) + return; + + class_unregister(&cs->class); +} + +/** + * DRM(sysfs_device_add) - adds a class device to sysfs for a character driver + * @cs: pointer to the struct drm_sysfs_class that this device should be registered to. + * @dev: the dev_t for the device to be added. + * @device: a pointer to a struct device that is assiociated with this class device. + * @fmt: string for the class device's name + * + * A struct class_device will be created in sysfs, registered to the specified + * class. A "dev" file will be created, showing the dev_t for the device. The + * pointer to the struct class_device will be returned from the call. Any further + * sysfs files that might be required can be created using this pointer. + * Note: the struct drm_sysfs_class passed to this function must have previously been + * created with a call to DRM(sysfs_create)(). + */ +struct class_device *DRM(sysfs_device_add)(struct drm_sysfs_class *cs, dev_t dev, struct device *device, const char *fmt, ...) +{ + va_list args; + struct simple_dev *s_dev = NULL; + int retval; + + if ((cs == NULL) || (IS_ERR(cs))) { + retval = -ENODEV; + goto error; + } + + s_dev = kmalloc(sizeof(*s_dev), GFP_KERNEL); + if (!s_dev) { + retval = -ENOMEM; + goto error; + } + memset(s_dev, 0x00, sizeof(*s_dev)); + + s_dev->dev = dev; + s_dev->class_dev.dev = device; + s_dev->class_dev.class = &cs->class; + + va_start(args, fmt); + vsnprintf(s_dev->class_dev.class_id, BUS_ID_SIZE, fmt, args); + va_end(args); + retval = class_device_register(&s_dev->class_dev); + if (retval) + goto error; + + class_device_create_file(&s_dev->class_dev, &cs->attr); + + spin_lock(&simple_dev_list_lock); + list_add(&s_dev->node, &simple_dev_list); + spin_unlock(&simple_dev_list_lock); + + return &s_dev->class_dev; + +error: + kfree(s_dev); + return ERR_PTR(retval); +} + +/** + * DRM(sysfs_device_remove) - removes a class device that was created with DRM(sysfs_device_add)() + * @dev: the dev_t of the device that was previously registered. + * + * This call unregisters and cleans up a class device that was created with a + * call to DRM(sysfs_device_add)() + */ +void DRM(sysfs_device_remove)(dev_t dev) +{ + struct simple_dev *s_dev = NULL; + int found = 0; + + spin_lock(&simple_dev_list_lock); + list_for_each_entry(s_dev, &simple_dev_list, node) { + if (s_dev->dev == dev) { + found = 1; + break; + } + } + if (found) { + list_del(&s_dev->node); + spin_unlock(&simple_dev_list_lock); + class_device_unregister(&s_dev->class_dev); + } else { + spin_unlock(&simple_dev_list_lock); + } +} + +#endif diff --git a/linux-core/radeon_i2c.c b/linux-core/radeon_i2c.c new file mode 100644 index 00000000..e2591723 --- /dev/null +++ b/linux-core/radeon_i2c.c @@ -0,0 +1,157 @@ +/* + * linux/radeon_i2c.c + * + * Original author probably Benjamin Herrenschmidt <benh@kernel.crashing.org> + * or Kronos <kronos@kronoz.cjb.net> + * Based on Xfree sources + * (C) Copyright 2004 Jon Smirl <jonsmirl@gmail.com> + * + * This is a GPL licensed file from the Linux kernel, don't add it to the BSD build + * + * Radeon I2C support routines + * + */ + +#include <linux/config.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/delay.h> +#include <linux/pci.h> +#include <linux/fb.h> +#include <linux/version.h> + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + +#include <asm/io.h> +#include <video/radeon.h> + +#include "radeon.h" +#include "drmP.h" +#include "drm.h" +#include "radeon_drm.h" +#include "radeon_drv.h" + +static void gpio_setscl(void* data, int state) +{ + struct radeon_i2c_chan *chan = data; + drm_radeon_private_t *dev_priv = chan->dev->dev_private; + u32 val; + + val = RADEON_READ(chan->ddc_reg) & ~(VGA_DDC_CLK_OUT_EN); + if (!state) + val |= VGA_DDC_CLK_OUT_EN; + + RADEON_WRITE(chan->ddc_reg, val); + (void)RADEON_READ(chan->ddc_reg); +} + +static void gpio_setsda(void* data, int state) +{ + struct radeon_i2c_chan *chan = data; + drm_radeon_private_t *dev_priv = chan->dev->dev_private; + u32 val; + + val = RADEON_READ(chan->ddc_reg) & ~(VGA_DDC_DATA_OUT_EN); + if (!state) + val |= VGA_DDC_DATA_OUT_EN; + + RADEON_WRITE(chan->ddc_reg, val); + (void)RADEON_READ(chan->ddc_reg); +} + +static int gpio_getscl(void* data) +{ + struct radeon_i2c_chan *chan = data; + drm_radeon_private_t *dev_priv = chan->dev->dev_private; + u32 val; + + val = RADEON_READ(chan->ddc_reg); + + return (val & VGA_DDC_CLK_INPUT) ? 1 : 0; +} + +static int gpio_getsda(void* data) +{ + struct radeon_i2c_chan *chan = data; + drm_radeon_private_t *dev_priv = chan->dev->dev_private; + u32 val; + + val = RADEON_READ(chan->ddc_reg); + + return (val & VGA_DDC_DATA_INPUT) ? 1 : 0; +} + +static int setup_i2c_bus(struct radeon_i2c_chan *chan, const char *name) +{ + int rc; + + strcpy(chan->adapter.name, name); + chan->adapter.owner = THIS_MODULE; + chan->adapter.id = I2C_ALGO_ATI; + chan->adapter.algo_data = &chan->algo; + chan->adapter.dev.parent = &chan->dev->pdev->dev; + chan->algo.setsda = gpio_setsda; + chan->algo.setscl = gpio_setscl; + chan->algo.getsda = gpio_getsda; + chan->algo.getscl = gpio_getscl; + chan->algo.udelay = 40; + chan->algo.timeout = 20; + chan->algo.data = chan; + + i2c_set_adapdata(&chan->adapter, chan); + + /* Raise SCL and SDA */ + gpio_setsda(chan, 1); + gpio_setscl(chan, 1); + udelay(20); + + rc = i2c_bit_add_bus(&chan->adapter); + if (rc == 0) + DRM_DEBUG("I2C bus %s registered.\n", name); + else + DRM_ERROR("Failed to register I2C bus %s.\n", name); + return rc; +} + +int radeon_create_i2c_busses(drm_device_t *dev) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + int ret; + + dev_priv->i2c[0].dev = dev; + dev_priv->i2c[0].ddc_reg = GPIO_MONID; + if ((ret = setup_i2c_bus(&dev_priv->i2c[0], "monid"))) + return ret; + + dev_priv->i2c[1].dev = dev; + dev_priv->i2c[1].ddc_reg = GPIO_DVI_DDC; + if ((ret = setup_i2c_bus(&dev_priv->i2c[1], "dvi"))) + return ret; + + dev_priv->i2c[2].dev = dev; + dev_priv->i2c[2].ddc_reg = GPIO_VGA_DDC; + if ((ret = setup_i2c_bus(&dev_priv->i2c[2], "vga"))) + return ret; + + dev_priv->i2c[3].dev = dev; + dev_priv->i2c[3].ddc_reg = GPIO_CRT2_DDC; + if ((ret = setup_i2c_bus(&dev_priv->i2c[3], "crt2"))) + return ret; + return 0; +} + +void radeon_delete_i2c_busses(drm_device_t *dev) +{ + drm_radeon_private_t *dev_priv = dev->dev_private; + int i, ret; + + for (i = 0; i < 4; i++) { + if (dev_priv->i2c[i].dev) { + ret = i2c_bit_del_bus(&dev_priv->i2c[i].adapter); + } + dev_priv->i2c[i].dev = NULL; + } +} + +#endif diff --git a/linux-core/radeon_i2c.h b/linux-core/radeon_i2c.h new file mode 100644 index 00000000..2adc6723 --- /dev/null +++ b/linux-core/radeon_i2c.h @@ -0,0 +1,29 @@ +/* + * linux/radeon_i2c.h + * + * Original author probably Benjamin Herrenschmidt <benh@kernel.crashing.org> + * or Kronos <kronos@kronoz.cjb.net> + * Based on Xfree sources + * (C) Copyright 2004 Jon Smirl <jonsmirl@gmail.com> + * + * This is a GPL licensed file from the Linux kernel, don't add it to the BSD build + * + * Radeon I2C support routines + * + */ + +#include <linux/i2c.h> +#include <linux/i2c-id.h> +#include <linux/i2c-algo-bit.h> + +struct radeon_i2c_chan { + drm_device_t *dev; + u32 ddc_reg; + struct i2c_adapter adapter; + struct i2c_algo_bit_data algo; +}; + +extern int radeon_create_i2c_busses(drm_device_t *dev); +extern void radeon_delete_i2c_busses(drm_device_t *dev); + + |