forked from KolibriOS/kolibrios
init modeset
git-svn-id: svn://kolibrios.org@1125 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
a7e3c97cc5
commit
3c7b2b4679
@ -222,6 +222,7 @@ again:
|
|||||||
|
|
||||||
obj->id = new_id;
|
obj->id = new_id;
|
||||||
obj->type = obj_type;
|
obj->type = obj_type;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -361,6 +362,8 @@ EXPORT_SYMBOL(drm_framebuffer_cleanup);
|
|||||||
void drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
|
void drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
|
||||||
const struct drm_crtc_funcs *funcs)
|
const struct drm_crtc_funcs *funcs)
|
||||||
{
|
{
|
||||||
|
ENTRY();
|
||||||
|
|
||||||
crtc->dev = dev;
|
crtc->dev = dev;
|
||||||
crtc->funcs = funcs;
|
crtc->funcs = funcs;
|
||||||
|
|
||||||
@ -369,7 +372,10 @@ void drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
|
|||||||
|
|
||||||
list_add_tail(&crtc->head, &dev->mode_config.crtc_list);
|
list_add_tail(&crtc->head, &dev->mode_config.crtc_list);
|
||||||
dev->mode_config.num_crtc++;
|
dev->mode_config.num_crtc++;
|
||||||
|
|
||||||
// mutex_unlock(&dev->mode_config.mutex);
|
// mutex_unlock(&dev->mode_config.mutex);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_crtc_init);
|
EXPORT_SYMBOL(drm_crtc_init);
|
||||||
|
|
||||||
@ -586,6 +592,7 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
|
|||||||
struct drm_property *dpms;
|
struct drm_property *dpms;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
ENTRY();
|
||||||
/*
|
/*
|
||||||
* Standard properties (apply to all connectors)
|
* Standard properties (apply to all connectors)
|
||||||
*/
|
*/
|
||||||
@ -601,6 +608,7 @@ static int drm_mode_create_standard_connector_properties(struct drm_device *dev)
|
|||||||
drm_dpms_enum_list[i].name);
|
drm_dpms_enum_list[i].name);
|
||||||
dev->mode_config.dpms_property = dpms;
|
dev->mode_config.dpms_property = dpms;
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -794,6 +802,8 @@ EXPORT_SYMBOL(drm_mode_create_dithering_property);
|
|||||||
*/
|
*/
|
||||||
void drm_mode_config_init(struct drm_device *dev)
|
void drm_mode_config_init(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
|
ENTRY();
|
||||||
|
|
||||||
// mutex_init(&dev->mode_config.mutex);
|
// mutex_init(&dev->mode_config.mutex);
|
||||||
// mutex_init(&dev->mode_config.idr_mutex);
|
// mutex_init(&dev->mode_config.idr_mutex);
|
||||||
INIT_LIST_HEAD(&dev->mode_config.fb_list);
|
INIT_LIST_HEAD(&dev->mode_config.fb_list);
|
||||||
@ -803,6 +813,7 @@ void drm_mode_config_init(struct drm_device *dev)
|
|||||||
INIT_LIST_HEAD(&dev->mode_config.encoder_list);
|
INIT_LIST_HEAD(&dev->mode_config.encoder_list);
|
||||||
INIT_LIST_HEAD(&dev->mode_config.property_list);
|
INIT_LIST_HEAD(&dev->mode_config.property_list);
|
||||||
INIT_LIST_HEAD(&dev->mode_config.property_blob_list);
|
INIT_LIST_HEAD(&dev->mode_config.property_blob_list);
|
||||||
|
|
||||||
idr_init(&dev->mode_config.crtc_idr);
|
idr_init(&dev->mode_config.crtc_idr);
|
||||||
|
|
||||||
// mutex_lock(&dev->mode_config.mutex);
|
// mutex_lock(&dev->mode_config.mutex);
|
||||||
@ -814,6 +825,9 @@ void drm_mode_config_init(struct drm_device *dev)
|
|||||||
dev->mode_config.num_connector = 0;
|
dev->mode_config.num_connector = 0;
|
||||||
dev->mode_config.num_crtc = 0;
|
dev->mode_config.num_crtc = 0;
|
||||||
dev->mode_config.num_encoder = 0;
|
dev->mode_config.num_encoder = 0;
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_mode_config_init);
|
EXPORT_SYMBOL(drm_mode_config_init);
|
||||||
|
|
||||||
@ -1946,6 +1960,7 @@ struct drm_property *drm_property_create(struct drm_device *dev, int flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
drm_mode_object_get(dev, &property->base, DRM_MODE_OBJECT_PROPERTY);
|
drm_mode_object_get(dev, &property->base, DRM_MODE_OBJECT_PROPERTY);
|
||||||
|
|
||||||
property->flags = flags;
|
property->flags = flags;
|
||||||
property->num_values = num_values;
|
property->num_values = num_values;
|
||||||
INIT_LIST_HEAD(&property->enum_blob_list);
|
INIT_LIST_HEAD(&property->enum_blob_list);
|
||||||
@ -1953,7 +1968,11 @@ struct drm_property *drm_property_create(struct drm_device *dev, int flags,
|
|||||||
if (name)
|
if (name)
|
||||||
strncpy(property->name, name, DRM_PROP_NAME_LEN);
|
strncpy(property->name, name, DRM_PROP_NAME_LEN);
|
||||||
|
|
||||||
|
|
||||||
list_add_tail(&property->head, &dev->mode_config.property_list);
|
list_add_tail(&property->head, &dev->mode_config.property_list);
|
||||||
|
|
||||||
|
dbgprintf("%s %x name %s\n", __FUNCTION__, property, name);
|
||||||
|
|
||||||
return property;
|
return property;
|
||||||
fail:
|
fail:
|
||||||
kfree(property);
|
kfree(property);
|
||||||
|
@ -479,6 +479,8 @@ static void drm_setup_crtcs(struct drm_device *dev)
|
|||||||
|
|
||||||
drm_pick_crtcs(dev, crtcs, modes, 0, width, height);
|
drm_pick_crtcs(dev, crtcs, modes, 0, width, height);
|
||||||
|
|
||||||
|
dbgprintf("done\n");
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||||
struct drm_display_mode *mode = modes[i];
|
struct drm_display_mode *mode = modes[i];
|
||||||
@ -502,6 +504,8 @@ static void drm_setup_crtcs(struct drm_device *dev)
|
|||||||
kfree(crtcs);
|
kfree(crtcs);
|
||||||
kfree(modes);
|
kfree(modes);
|
||||||
kfree(enabled);
|
kfree(enabled);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -518,7 +522,7 @@ static bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
|
|||||||
struct drm_crtc *tmp;
|
struct drm_crtc *tmp;
|
||||||
int crtc_mask = 1;
|
int crtc_mask = 1;
|
||||||
|
|
||||||
WARN(!crtc, "checking null crtc?");
|
// WARN(!crtc, "checking null crtc?");
|
||||||
|
|
||||||
dev = crtc->dev;
|
dev = crtc->dev;
|
||||||
|
|
||||||
@ -909,7 +913,7 @@ bool drm_helper_plugged_event(struct drm_device *dev)
|
|||||||
drm_setup_crtcs(dev);
|
drm_setup_crtcs(dev);
|
||||||
|
|
||||||
/* alert the driver fb layer */
|
/* alert the driver fb layer */
|
||||||
dev->mode_config.funcs->fb_changed(dev);
|
// dev->mode_config.funcs->fb_changed(dev);
|
||||||
|
|
||||||
/* FIXME: send hotplug event */
|
/* FIXME: send hotplug event */
|
||||||
return true;
|
return true;
|
||||||
@ -933,6 +937,8 @@ bool drm_helper_initial_config(struct drm_device *dev)
|
|||||||
struct drm_connector *connector;
|
struct drm_connector *connector;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
|
ENTRY();
|
||||||
|
|
||||||
count = drm_helper_probe_connector_modes(dev,
|
count = drm_helper_probe_connector_modes(dev,
|
||||||
dev->mode_config.max_width,
|
dev->mode_config.max_width,
|
||||||
dev->mode_config.max_height);
|
dev->mode_config.max_height);
|
||||||
@ -952,7 +958,9 @@ bool drm_helper_initial_config(struct drm_device *dev)
|
|||||||
drm_setup_crtcs(dev);
|
drm_setup_crtcs(dev);
|
||||||
|
|
||||||
/* alert the driver fb layer */
|
/* alert the driver fb layer */
|
||||||
dev->mode_config.funcs->fb_changed(dev);
|
// dev->mode_config.funcs->fb_changed(dev);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,12 @@
|
|||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
//#include <linux/kernel.h>
|
//#include <linux/kernel.h>
|
||||||
//#include <linux/i2c.h>
|
#include <types.h>
|
||||||
//#include <linux/i2c-algo-bit.h>
|
#include <list.h>
|
||||||
|
|
||||||
|
#include <linux/idr.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/i2c-algo-bit.h>
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm_edid.h"
|
#include "drm_edid.h"
|
||||||
|
|
||||||
|
615
drivers/video/drm/i2c/i2c-algo-bit.c
Normal file
615
drivers/video/drm/i2c/i2c-algo-bit.c
Normal file
@ -0,0 +1,615 @@
|
|||||||
|
/* -------------------------------------------------------------------------
|
||||||
|
* i2c-algo-bit.c i2c driver algorithms for bit-shift adapters
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
* Copyright (C) 1995-2000 Simon G. Vogl
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* With some changes from Frodo Looijaard <frodol@dds.nl>, Kyösti Mälkki
|
||||||
|
<kmalkki@cc.hut.fi> and Jean Delvare <khali@linux-fr.org> */
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <list.h>
|
||||||
|
#include <syscall.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <linux/i2c-algo-bit.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- global defines ----------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
#define bit_dbg(level, dev, format, args...) \
|
||||||
|
do { \
|
||||||
|
if (i2c_debug >= level) \
|
||||||
|
dev_dbg(dev, format, ##args); \
|
||||||
|
} while (0)
|
||||||
|
#else
|
||||||
|
#define bit_dbg(level, dev, format, args...) \
|
||||||
|
do {} while (0)
|
||||||
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- global variables --------------------------------------------- */
|
||||||
|
|
||||||
|
static int bit_test; /* see if the line-setting functions work */
|
||||||
|
|
||||||
|
|
||||||
|
/* --- setting states on the bus with the right timing: --------------- */
|
||||||
|
|
||||||
|
#define setsda(adap, val) adap->setsda(adap->data, val)
|
||||||
|
#define setscl(adap, val) adap->setscl(adap->data, val)
|
||||||
|
#define getsda(adap) adap->getsda(adap->data)
|
||||||
|
#define getscl(adap) adap->getscl(adap->data)
|
||||||
|
|
||||||
|
static inline void sdalo(struct i2c_algo_bit_data *adap)
|
||||||
|
{
|
||||||
|
setsda(adap, 0);
|
||||||
|
udelay((adap->udelay + 1) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void sdahi(struct i2c_algo_bit_data *adap)
|
||||||
|
{
|
||||||
|
setsda(adap, 1);
|
||||||
|
udelay((adap->udelay + 1) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void scllo(struct i2c_algo_bit_data *adap)
|
||||||
|
{
|
||||||
|
setscl(adap, 0);
|
||||||
|
udelay(adap->udelay / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Raise scl line, and do checking for delays. This is necessary for slower
|
||||||
|
* devices.
|
||||||
|
*/
|
||||||
|
static int sclhi(struct i2c_algo_bit_data *adap)
|
||||||
|
{
|
||||||
|
unsigned long start;
|
||||||
|
|
||||||
|
setscl(adap, 1);
|
||||||
|
|
||||||
|
/* Not all adapters have scl sense line... */
|
||||||
|
if (!adap->getscl)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
// start = jiffies;
|
||||||
|
while (!getscl(adap)) {
|
||||||
|
/* This hw knows how to read the clock line, so we wait
|
||||||
|
* until it actually gets high. This is safer as some
|
||||||
|
* chips may hold it low ("clock stretching") while they
|
||||||
|
* are processing data internally.
|
||||||
|
*/
|
||||||
|
// if (time_after(jiffies, start + adap->timeout))
|
||||||
|
// return -ETIMEDOUT;
|
||||||
|
|
||||||
|
udelay(adap->udelay);
|
||||||
|
|
||||||
|
// cond_resched();
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
if (jiffies != start && i2c_debug >= 3)
|
||||||
|
pr_debug("i2c-algo-bit: needed %ld jiffies for SCL to go "
|
||||||
|
"high\n", jiffies - start);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
done:
|
||||||
|
udelay(adap->udelay);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* --- other auxiliary functions -------------------------------------- */
|
||||||
|
static void i2c_start(struct i2c_algo_bit_data *adap)
|
||||||
|
{
|
||||||
|
/* assert: scl, sda are high */
|
||||||
|
setsda(adap, 0);
|
||||||
|
udelay(adap->udelay);
|
||||||
|
scllo(adap);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void i2c_repstart(struct i2c_algo_bit_data *adap)
|
||||||
|
{
|
||||||
|
/* assert: scl is low */
|
||||||
|
sdahi(adap);
|
||||||
|
sclhi(adap);
|
||||||
|
setsda(adap, 0);
|
||||||
|
udelay(adap->udelay);
|
||||||
|
scllo(adap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void i2c_stop(struct i2c_algo_bit_data *adap)
|
||||||
|
{
|
||||||
|
/* assert: scl is low */
|
||||||
|
sdalo(adap);
|
||||||
|
sclhi(adap);
|
||||||
|
setsda(adap, 1);
|
||||||
|
udelay(adap->udelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* send a byte without start cond., look for arbitration,
|
||||||
|
check ackn. from slave */
|
||||||
|
/* returns:
|
||||||
|
* 1 if the device acknowledged
|
||||||
|
* 0 if the device did not ack
|
||||||
|
* -ETIMEDOUT if an error occurred (while raising the scl line)
|
||||||
|
*/
|
||||||
|
static int i2c_outb(struct i2c_adapter *i2c_adap, unsigned char c)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int sb;
|
||||||
|
int ack;
|
||||||
|
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
|
||||||
|
|
||||||
|
/* assert: scl is low */
|
||||||
|
for (i = 7; i >= 0; i--) {
|
||||||
|
sb = (c >> i) & 1;
|
||||||
|
setsda(adap, sb);
|
||||||
|
udelay((adap->udelay + 1) / 2);
|
||||||
|
if (sclhi(adap) < 0) { /* timed out */
|
||||||
|
// bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, "
|
||||||
|
// "timeout at bit #%d\n", (int)c, i);
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
/* FIXME do arbitration here:
|
||||||
|
* if (sb && !getsda(adap)) -> ouch! Get out of here.
|
||||||
|
*
|
||||||
|
* Report a unique code, so higher level code can retry
|
||||||
|
* the whole (combined) message and *NOT* issue STOP.
|
||||||
|
*/
|
||||||
|
scllo(adap);
|
||||||
|
}
|
||||||
|
sdahi(adap);
|
||||||
|
if (sclhi(adap) < 0) { /* timeout */
|
||||||
|
// bit_dbg(1, &i2c_adap->dev, "i2c_outb: 0x%02x, "
|
||||||
|
// "timeout at ack\n", (int)c);
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read ack: SDA should be pulled down by slave, or it may
|
||||||
|
* NAK (usually to report problems with the data we wrote).
|
||||||
|
*/
|
||||||
|
ack = !getsda(adap); /* ack: sda is pulled low -> success */
|
||||||
|
// bit_dbg(2, &i2c_adap->dev, "i2c_outb: 0x%02x %s\n", (int)c,
|
||||||
|
// ack ? "A" : "NA");
|
||||||
|
|
||||||
|
scllo(adap);
|
||||||
|
return ack;
|
||||||
|
/* assert: scl is low (sda undef) */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int i2c_inb(struct i2c_adapter *i2c_adap)
|
||||||
|
{
|
||||||
|
/* read byte via i2c port, without start/stop sequence */
|
||||||
|
/* acknowledge is sent in i2c_read. */
|
||||||
|
int i;
|
||||||
|
unsigned char indata = 0;
|
||||||
|
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
|
||||||
|
|
||||||
|
/* assert: scl is low */
|
||||||
|
sdahi(adap);
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
if (sclhi(adap) < 0) { /* timeout */
|
||||||
|
bit_dbg(1, &i2c_adap->dev, "i2c_inb: timeout at bit "
|
||||||
|
"#%d\n", 7 - i);
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
indata *= 2;
|
||||||
|
if (getsda(adap))
|
||||||
|
indata |= 0x01;
|
||||||
|
setscl(adap, 0);
|
||||||
|
udelay(i == 7 ? adap->udelay / 2 : adap->udelay);
|
||||||
|
}
|
||||||
|
/* assert: scl is low */
|
||||||
|
return indata;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanity check for the adapter hardware - check the reaction of
|
||||||
|
* the bus lines only if it seems to be idle.
|
||||||
|
*/
|
||||||
|
static int test_bus(struct i2c_algo_bit_data *adap, char *name)
|
||||||
|
{
|
||||||
|
int scl, sda;
|
||||||
|
|
||||||
|
if (adap->getscl == NULL)
|
||||||
|
pr_info("%s: Testing SDA only, SCL is not readable\n", name);
|
||||||
|
|
||||||
|
sda = getsda(adap);
|
||||||
|
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
|
||||||
|
if (!scl || !sda) {
|
||||||
|
printk(KERN_WARNING "%s: bus seems to be busy\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdalo(adap);
|
||||||
|
sda = getsda(adap);
|
||||||
|
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
|
||||||
|
if (sda) {
|
||||||
|
printk(KERN_WARNING "%s: SDA stuck high!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
if (!scl) {
|
||||||
|
printk(KERN_WARNING "%s: SCL unexpected low "
|
||||||
|
"while pulling SDA low!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdahi(adap);
|
||||||
|
sda = getsda(adap);
|
||||||
|
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
|
||||||
|
if (!sda) {
|
||||||
|
printk(KERN_WARNING "%s: SDA stuck low!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
if (!scl) {
|
||||||
|
printk(KERN_WARNING "%s: SCL unexpected low "
|
||||||
|
"while pulling SDA high!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
|
||||||
|
scllo(adap);
|
||||||
|
sda = getsda(adap);
|
||||||
|
scl = (adap->getscl == NULL) ? 0 : getscl(adap);
|
||||||
|
if (scl) {
|
||||||
|
printk(KERN_WARNING "%s: SCL stuck high!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
if (!sda) {
|
||||||
|
printk(KERN_WARNING "%s: SDA unexpected low "
|
||||||
|
"while pulling SCL low!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
|
||||||
|
sclhi(adap);
|
||||||
|
sda = getsda(adap);
|
||||||
|
scl = (adap->getscl == NULL) ? 1 : getscl(adap);
|
||||||
|
if (!scl) {
|
||||||
|
printk(KERN_WARNING "%s: SCL stuck low!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
if (!sda) {
|
||||||
|
printk(KERN_WARNING "%s: SDA unexpected low "
|
||||||
|
"while pulling SCL high!\n", name);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
pr_info("%s: Test OK\n", name);
|
||||||
|
return 0;
|
||||||
|
bailout:
|
||||||
|
sdahi(adap);
|
||||||
|
sclhi(adap);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----- Utility functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* try_address tries to contact a chip for a number of
|
||||||
|
* times before it gives up.
|
||||||
|
* return values:
|
||||||
|
* 1 chip answered
|
||||||
|
* 0 chip did not answer
|
||||||
|
* -x transmission error
|
||||||
|
*/
|
||||||
|
static int try_address(struct i2c_adapter *i2c_adap,
|
||||||
|
unsigned char addr, int retries)
|
||||||
|
{
|
||||||
|
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
|
||||||
|
int i, ret = 0;
|
||||||
|
|
||||||
|
for (i = 0; i <= retries; i++) {
|
||||||
|
ret = i2c_outb(i2c_adap, addr);
|
||||||
|
if (ret == 1 || i == retries)
|
||||||
|
break;
|
||||||
|
bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
|
||||||
|
i2c_stop(adap);
|
||||||
|
udelay(adap->udelay);
|
||||||
|
// yield();
|
||||||
|
bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
|
||||||
|
i2c_start(adap);
|
||||||
|
}
|
||||||
|
if (i && ret)
|
||||||
|
bit_dbg(1, &i2c_adap->dev, "Used %d tries to %s client at "
|
||||||
|
"0x%02x: %s\n", i + 1,
|
||||||
|
addr & 1 ? "read from" : "write to", addr >> 1,
|
||||||
|
ret == 1 ? "success" : "failed, timeout?");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
|
||||||
|
{
|
||||||
|
const unsigned char *temp = msg->buf;
|
||||||
|
int count = msg->len;
|
||||||
|
unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
|
||||||
|
int retval;
|
||||||
|
int wrcount = 0;
|
||||||
|
|
||||||
|
while (count > 0) {
|
||||||
|
retval = i2c_outb(i2c_adap, *temp);
|
||||||
|
|
||||||
|
/* OK/ACK; or ignored NAK */
|
||||||
|
if ((retval > 0) || (nak_ok && (retval == 0))) {
|
||||||
|
count--;
|
||||||
|
temp++;
|
||||||
|
wrcount++;
|
||||||
|
|
||||||
|
/* A slave NAKing the master means the slave didn't like
|
||||||
|
* something about the data it saw. For example, maybe
|
||||||
|
* the SMBus PEC was wrong.
|
||||||
|
*/
|
||||||
|
} else if (retval == 0) {
|
||||||
|
// dev_err(&i2c_adap->dev, "sendbytes: NAK bailout.\n");
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
/* Timeout; or (someday) lost arbitration
|
||||||
|
*
|
||||||
|
* FIXME Lost ARB implies retrying the transaction from
|
||||||
|
* the first message, after the "winning" master issues
|
||||||
|
* its STOP. As a rule, upper layer code has no reason
|
||||||
|
* to know or care about this ... it is *NOT* an error.
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
// dev_err(&i2c_adap->dev, "sendbytes: error %d\n",
|
||||||
|
// retval);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wrcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int acknak(struct i2c_adapter *i2c_adap, int is_ack)
|
||||||
|
{
|
||||||
|
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
|
||||||
|
|
||||||
|
/* assert: sda is high */
|
||||||
|
if (is_ack) /* send ack */
|
||||||
|
setsda(adap, 0);
|
||||||
|
udelay((adap->udelay + 1) / 2);
|
||||||
|
if (sclhi(adap) < 0) { /* timeout */
|
||||||
|
// dev_err(&i2c_adap->dev, "readbytes: ack/nak timeout\n");
|
||||||
|
// return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
scllo(adap);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
|
||||||
|
{
|
||||||
|
int inval;
|
||||||
|
int rdcount = 0; /* counts bytes read */
|
||||||
|
unsigned char *temp = msg->buf;
|
||||||
|
int count = msg->len;
|
||||||
|
const unsigned flags = msg->flags;
|
||||||
|
|
||||||
|
while (count > 0) {
|
||||||
|
inval = i2c_inb(i2c_adap);
|
||||||
|
if (inval >= 0) {
|
||||||
|
*temp = inval;
|
||||||
|
rdcount++;
|
||||||
|
} else { /* read timed out */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
temp++;
|
||||||
|
count--;
|
||||||
|
|
||||||
|
/* Some SMBus transactions require that we receive the
|
||||||
|
transaction length as the first read byte. */
|
||||||
|
if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) {
|
||||||
|
if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) {
|
||||||
|
if (!(flags & I2C_M_NO_RD_ACK))
|
||||||
|
acknak(i2c_adap, 0);
|
||||||
|
// dev_err(&i2c_adap->dev, "readbytes: invalid "
|
||||||
|
// "block length (%d)\n", inval);
|
||||||
|
return -EREMOTEIO;
|
||||||
|
}
|
||||||
|
/* The original count value accounts for the extra
|
||||||
|
bytes, that is, either 1 for a regular transaction,
|
||||||
|
or 2 for a PEC transaction. */
|
||||||
|
count += inval;
|
||||||
|
msg->len += inval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n",
|
||||||
|
// inval,
|
||||||
|
// (flags & I2C_M_NO_RD_ACK)
|
||||||
|
// ? "(no ack/nak)"
|
||||||
|
// : (count ? "A" : "NA"));
|
||||||
|
|
||||||
|
if (!(flags & I2C_M_NO_RD_ACK)) {
|
||||||
|
inval = acknak(i2c_adap, count);
|
||||||
|
if (inval < 0)
|
||||||
|
return inval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rdcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* doAddress initiates the transfer by generating the start condition (in
|
||||||
|
* try_address) and transmits the address in the necessary format to handle
|
||||||
|
* reads, writes as well as 10bit-addresses.
|
||||||
|
* returns:
|
||||||
|
* 0 everything went okay, the chip ack'ed, or IGNORE_NAK flag was set
|
||||||
|
* -x an error occurred (like: -EREMOTEIO if the device did not answer, or
|
||||||
|
* -ETIMEDOUT, for example if the lines are stuck...)
|
||||||
|
*/
|
||||||
|
static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
|
||||||
|
{
|
||||||
|
unsigned short flags = msg->flags;
|
||||||
|
unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
|
||||||
|
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
|
||||||
|
|
||||||
|
unsigned char addr;
|
||||||
|
int ret, retries;
|
||||||
|
|
||||||
|
retries = nak_ok ? 0 : i2c_adap->retries;
|
||||||
|
|
||||||
|
if (flags & I2C_M_TEN) {
|
||||||
|
/* a ten bit address */
|
||||||
|
addr = 0xf0 | ((msg->addr >> 7) & 0x03);
|
||||||
|
bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr);
|
||||||
|
/* try extended address code...*/
|
||||||
|
ret = try_address(i2c_adap, addr, retries);
|
||||||
|
if ((ret != 1) && !nak_ok) {
|
||||||
|
// dev_err(&i2c_adap->dev,
|
||||||
|
// "died at extended address code\n");
|
||||||
|
return -EREMOTEIO;
|
||||||
|
}
|
||||||
|
/* the remaining 8 bit address */
|
||||||
|
ret = i2c_outb(i2c_adap, msg->addr & 0x7f);
|
||||||
|
if ((ret != 1) && !nak_ok) {
|
||||||
|
/* the chip did not ack / xmission error occurred */
|
||||||
|
// dev_err(&i2c_adap->dev, "died at 2nd address code\n");
|
||||||
|
return -EREMOTEIO;
|
||||||
|
}
|
||||||
|
if (flags & I2C_M_RD) {
|
||||||
|
bit_dbg(3, &i2c_adap->dev, "emitting repeated "
|
||||||
|
"start condition\n");
|
||||||
|
i2c_repstart(adap);
|
||||||
|
/* okay, now switch into reading mode */
|
||||||
|
addr |= 0x01;
|
||||||
|
ret = try_address(i2c_adap, addr, retries);
|
||||||
|
if ((ret != 1) && !nak_ok) {
|
||||||
|
// dev_err(&i2c_adap->dev,
|
||||||
|
// "died at repeated address code\n");
|
||||||
|
return -EREMOTEIO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { /* normal 7bit address */
|
||||||
|
addr = msg->addr << 1;
|
||||||
|
if (flags & I2C_M_RD)
|
||||||
|
addr |= 1;
|
||||||
|
if (flags & I2C_M_REV_DIR_ADDR)
|
||||||
|
addr ^= 1;
|
||||||
|
ret = try_address(i2c_adap, addr, retries);
|
||||||
|
if ((ret != 1) && !nak_ok)
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int bit_xfer(struct i2c_adapter *i2c_adap,
|
||||||
|
struct i2c_msg msgs[], int num)
|
||||||
|
{
|
||||||
|
struct i2c_msg *pmsg;
|
||||||
|
struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
|
||||||
|
int i, ret;
|
||||||
|
unsigned short nak_ok;
|
||||||
|
|
||||||
|
bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
|
||||||
|
i2c_start(adap);
|
||||||
|
for (i = 0; i < num; i++) {
|
||||||
|
pmsg = &msgs[i];
|
||||||
|
nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
|
||||||
|
if (!(pmsg->flags & I2C_M_NOSTART)) {
|
||||||
|
if (i) {
|
||||||
|
bit_dbg(3, &i2c_adap->dev, "emitting "
|
||||||
|
"repeated start condition\n");
|
||||||
|
i2c_repstart(adap);
|
||||||
|
}
|
||||||
|
ret = bit_doAddress(i2c_adap, pmsg);
|
||||||
|
if ((ret != 0) && !nak_ok) {
|
||||||
|
bit_dbg(1, &i2c_adap->dev, "NAK from "
|
||||||
|
"device addr 0x%02x msg #%d\n",
|
||||||
|
msgs[i].addr, i);
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pmsg->flags & I2C_M_RD) {
|
||||||
|
/* read bytes into buffer*/
|
||||||
|
ret = readbytes(i2c_adap, pmsg);
|
||||||
|
if (ret >= 1)
|
||||||
|
bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n",
|
||||||
|
ret, ret == 1 ? "" : "s");
|
||||||
|
if (ret < pmsg->len) {
|
||||||
|
if (ret >= 0)
|
||||||
|
ret = -EREMOTEIO;
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* write bytes from buffer */
|
||||||
|
ret = sendbytes(i2c_adap, pmsg);
|
||||||
|
if (ret >= 1)
|
||||||
|
bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n",
|
||||||
|
ret, ret == 1 ? "" : "s");
|
||||||
|
if (ret < pmsg->len) {
|
||||||
|
if (ret >= 0)
|
||||||
|
ret = -EREMOTEIO;
|
||||||
|
goto bailout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = i;
|
||||||
|
|
||||||
|
bailout:
|
||||||
|
bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
|
||||||
|
i2c_stop(adap);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 bit_func(struct i2c_adapter *adap)
|
||||||
|
{
|
||||||
|
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
|
||||||
|
I2C_FUNC_SMBUS_READ_BLOCK_DATA |
|
||||||
|
I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
|
||||||
|
I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -----exported algorithm data: ------------------------------------- */
|
||||||
|
|
||||||
|
static const struct i2c_algorithm i2c_bit_algo = {
|
||||||
|
.master_xfer = bit_xfer,
|
||||||
|
.functionality = bit_func,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* registering functions to load algorithms at runtime
|
||||||
|
*/
|
||||||
|
static int i2c_bit_prepare_bus(struct i2c_adapter *adap)
|
||||||
|
{
|
||||||
|
struct i2c_algo_bit_data *bit_adap = adap->algo_data;
|
||||||
|
|
||||||
|
// if (bit_test) {
|
||||||
|
// int ret = test_bus(bit_adap, adap->name);
|
||||||
|
// if (ret < 0)
|
||||||
|
// return -ENODEV;
|
||||||
|
// }
|
||||||
|
|
||||||
|
/* register new adapter to i2c module... */
|
||||||
|
adap->algo = &i2c_bit_algo;
|
||||||
|
adap->retries = 3;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i2c_bit_add_bus(struct i2c_adapter *adap)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = i2c_bit_prepare_bus(adap);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
return 0; //i2c_add_adapter(adap);
|
||||||
|
}
|
||||||
|
|
108
drivers/video/drm/i2c/i2c-core.c
Normal file
108
drivers/video/drm/i2c/i2c-core.c
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/* i2c-core.c - a device driver for the iic-bus interface */
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* Copyright (C) 1995-99 Simon G. Vogl
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
|
||||||
|
All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
|
||||||
|
SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
|
||||||
|
Jean Delvare <khali@linux-fr.org> */
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <list.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
|
#include <syscall.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* i2c_transfer - execute a single or combined I2C message
|
||||||
|
* @adap: Handle to I2C bus
|
||||||
|
* @msgs: One or more messages to execute before STOP is issued to
|
||||||
|
* terminate the operation; each message begins with a START.
|
||||||
|
* @num: Number of messages to be executed.
|
||||||
|
*
|
||||||
|
* Returns negative errno, else the number of messages executed.
|
||||||
|
*
|
||||||
|
* Note that there is no requirement that each message be sent to
|
||||||
|
* the same slave address, although that is the most common model.
|
||||||
|
*/
|
||||||
|
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||||
|
{
|
||||||
|
unsigned long orig_jiffies;
|
||||||
|
int ret, try;
|
||||||
|
|
||||||
|
/* REVISIT the fault reporting model here is weak:
|
||||||
|
*
|
||||||
|
* - When we get an error after receiving N bytes from a slave,
|
||||||
|
* there is no way to report "N".
|
||||||
|
*
|
||||||
|
* - When we get a NAK after transmitting N bytes to a slave,
|
||||||
|
* there is no way to report "N" ... or to let the master
|
||||||
|
* continue executing the rest of this combined message, if
|
||||||
|
* that's the appropriate response.
|
||||||
|
*
|
||||||
|
* - When for example "num" is two and we successfully complete
|
||||||
|
* the first message but get an error part way through the
|
||||||
|
* second, it's unclear whether that should be reported as
|
||||||
|
* one (discarding status on the second message) or errno
|
||||||
|
* (discarding status on the first one).
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (adap->algo->master_xfer) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
for (ret = 0; ret < num; ret++) {
|
||||||
|
dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
|
||||||
|
"len=%d%s\n", ret, (msgs[ret].flags & I2C_M_RD)
|
||||||
|
? 'R' : 'W', msgs[ret].addr, msgs[ret].len,
|
||||||
|
(msgs[ret].flags & I2C_M_RECV_LEN) ? "+" : "");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// if (in_atomic() || irqs_disabled()) {
|
||||||
|
// ret = mutex_trylock(&adap->bus_lock);
|
||||||
|
// if (!ret)
|
||||||
|
// /* I2C activity is ongoing. */
|
||||||
|
// return -EAGAIN;
|
||||||
|
// } else {
|
||||||
|
// mutex_lock_nested(&adap->bus_lock, adap->level);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/* Retry automatically on arbitration loss */
|
||||||
|
// orig_jiffies = jiffies;
|
||||||
|
for (ret = 0, try = 0; try <= adap->retries; try++) {
|
||||||
|
ret = adap->algo->master_xfer(adap, msgs, num);
|
||||||
|
if (ret != -EAGAIN)
|
||||||
|
break;
|
||||||
|
// if (time_after(jiffies, orig_jiffies + adap->timeout))
|
||||||
|
// break;
|
||||||
|
delay(1);
|
||||||
|
}
|
||||||
|
// mutex_unlock(&adap->bus_lock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
// dev_dbg(&adap->dev, "I2C level transfers not supported\n");
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(i2c_transfer);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
1064
drivers/video/drm/idr.c
Normal file
1064
drivers/video/drm/idr.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -67,6 +67,9 @@ extern void drm_ut_debug_printk(unsigned int request_level,
|
|||||||
__func__, ##args); \
|
__func__, ##args); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define DRM_DEBUG(fmt, arg...) \
|
||||||
|
printk("[" DRM_NAME ":%s] " fmt , __func__ , ##arg)
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
@ -25,10 +25,10 @@
|
|||||||
#ifndef __DRM_CRTC_H__
|
#ifndef __DRM_CRTC_H__
|
||||||
#define __DRM_CRTC_H__
|
#define __DRM_CRTC_H__
|
||||||
|
|
||||||
//#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
//#include <linux/spinlock.h>
|
//#include <linux/spinlock.h>
|
||||||
//#include <linux/types.h>
|
//#include <linux/types.h>
|
||||||
//#include <linux/idr.h>
|
#include <linux/idr.h>
|
||||||
|
|
||||||
//#include <linux/fb.h>
|
//#include <linux/fb.h>
|
||||||
|
|
||||||
|
@ -193,97 +193,6 @@ struct edid {
|
|||||||
|
|
||||||
#define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8))
|
#define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8))
|
||||||
|
|
||||||
#define KOBJ_NAME_LEN 20
|
|
||||||
|
|
||||||
#define I2C_NAME_SIZE 20
|
|
||||||
|
|
||||||
|
|
||||||
/* --- Defines for bit-adapters --------------------------------------- */
|
|
||||||
/*
|
|
||||||
* This struct contains the hw-dependent functions of bit-style adapters to
|
|
||||||
* manipulate the line states, and to init any hw-specific features. This is
|
|
||||||
* only used if you have more than one hw-type of adapter running.
|
|
||||||
*/
|
|
||||||
struct i2c_algo_bit_data {
|
|
||||||
void *data; /* private data for lowlevel routines */
|
|
||||||
void (*setsda) (void *data, int state);
|
|
||||||
void (*setscl) (void *data, int state);
|
|
||||||
int (*getsda) (void *data);
|
|
||||||
int (*getscl) (void *data);
|
|
||||||
|
|
||||||
/* local settings */
|
|
||||||
int udelay; /* half clock cycle time in us,
|
|
||||||
minimum 2 us for fast-mode I2C,
|
|
||||||
minimum 5 us for standard-mode I2C and SMBus,
|
|
||||||
maximum 50 us for SMBus */
|
|
||||||
int timeout; /* in jiffies */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct i2c_client;
|
|
||||||
/*
|
|
||||||
* i2c_adapter is the structure used to identify a physical i2c bus along
|
|
||||||
* with the access algorithms necessary to access it.
|
|
||||||
*/
|
|
||||||
struct i2c_adapter {
|
|
||||||
// struct module *owner;
|
|
||||||
unsigned int id;
|
|
||||||
unsigned int class;
|
|
||||||
// const struct i2c_algorithm *algo; /* the algorithm to access the bus */
|
|
||||||
void *algo_data;
|
|
||||||
|
|
||||||
/* --- administration stuff. */
|
|
||||||
int (*client_register)(struct i2c_client *);
|
|
||||||
int (*client_unregister)(struct i2c_client *);
|
|
||||||
|
|
||||||
/* data fields that are valid for all devices */
|
|
||||||
u8 level; /* nesting level for lockdep */
|
|
||||||
// struct mutex bus_lock;
|
|
||||||
// struct mutex clist_lock;
|
|
||||||
|
|
||||||
int timeout;
|
|
||||||
int retries;
|
|
||||||
// struct device dev; /* the adapter device */
|
|
||||||
|
|
||||||
int nr;
|
|
||||||
struct list_head clients; /* DEPRECATED */
|
|
||||||
char name[48];
|
|
||||||
// struct completion dev_released;
|
|
||||||
};
|
|
||||||
#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
|
|
||||||
|
|
||||||
struct i2c_client {
|
|
||||||
unsigned short flags; /* div., see below */
|
|
||||||
unsigned short addr; /* chip address - NOTE: 7bit */
|
|
||||||
/* addresses are stored in the */
|
|
||||||
/* _LOWER_ 7 bits */
|
|
||||||
char name[I2C_NAME_SIZE];
|
|
||||||
struct i2c_adapter *adapter; /* the adapter we sit on */
|
|
||||||
// struct i2c_driver *driver; /* and our access routines */
|
|
||||||
// struct device dev; /* the device structure */
|
|
||||||
int irq; /* irq issued by device (or -1) */
|
|
||||||
char driver_name[KOBJ_NAME_LEN];
|
|
||||||
struct list_head list; /* DEPRECATED */
|
|
||||||
// struct completion released;
|
|
||||||
};
|
|
||||||
#define to_i2c_client(d) container_of(d, struct i2c_client, dev)
|
|
||||||
|
|
||||||
int i2c_bit_add_bus(struct i2c_adapter *);
|
|
||||||
int i2c_bit_add_numbered_bus(struct i2c_adapter *);
|
|
||||||
|
|
||||||
|
|
||||||
struct i2c_msg {
|
|
||||||
u16 addr; /* slave address */
|
|
||||||
u16 flags;
|
|
||||||
#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
|
|
||||||
#define I2C_M_RD 0x0001 /* read data, from slave to master */
|
|
||||||
#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
|
||||||
#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
|
||||||
#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
|
||||||
#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
|
||||||
#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
|
|
||||||
u16 len; /* msg length */
|
|
||||||
u8 *buf; /* pointer to msg data */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* __DRM_EDID_H__ */
|
#endif /* __DRM_EDID_H__ */
|
||||||
|
111
drivers/video/drm/include/errno.h
Normal file
111
drivers/video/drm/include/errno.h
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#ifndef _ASM_GENERIC_ERRNO_H
|
||||||
|
#define _ASM_GENERIC_ERRNO_H
|
||||||
|
|
||||||
|
#include <errno-base.h>
|
||||||
|
|
||||||
|
#define EDEADLK 35 /* Resource deadlock would occur */
|
||||||
|
#define ENAMETOOLONG 36 /* File name too long */
|
||||||
|
#define ENOLCK 37 /* No record locks available */
|
||||||
|
#define ENOSYS 38 /* Function not implemented */
|
||||||
|
#define ENOTEMPTY 39 /* Directory not empty */
|
||||||
|
#define ELOOP 40 /* Too many symbolic links encountered */
|
||||||
|
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||||
|
#define ENOMSG 42 /* No message of desired type */
|
||||||
|
#define EIDRM 43 /* Identifier removed */
|
||||||
|
#define ECHRNG 44 /* Channel number out of range */
|
||||||
|
#define EL2NSYNC 45 /* Level 2 not synchronized */
|
||||||
|
#define EL3HLT 46 /* Level 3 halted */
|
||||||
|
#define EL3RST 47 /* Level 3 reset */
|
||||||
|
#define ELNRNG 48 /* Link number out of range */
|
||||||
|
#define EUNATCH 49 /* Protocol driver not attached */
|
||||||
|
#define ENOCSI 50 /* No CSI structure available */
|
||||||
|
#define EL2HLT 51 /* Level 2 halted */
|
||||||
|
#define EBADE 52 /* Invalid exchange */
|
||||||
|
#define EBADR 53 /* Invalid request descriptor */
|
||||||
|
#define EXFULL 54 /* Exchange full */
|
||||||
|
#define ENOANO 55 /* No anode */
|
||||||
|
#define EBADRQC 56 /* Invalid request code */
|
||||||
|
#define EBADSLT 57 /* Invalid slot */
|
||||||
|
|
||||||
|
#define EDEADLOCK EDEADLK
|
||||||
|
|
||||||
|
#define EBFONT 59 /* Bad font file format */
|
||||||
|
#define ENOSTR 60 /* Device not a stream */
|
||||||
|
#define ENODATA 61 /* No data available */
|
||||||
|
#define ETIME 62 /* Timer expired */
|
||||||
|
#define ENOSR 63 /* Out of streams resources */
|
||||||
|
#define ENONET 64 /* Machine is not on the network */
|
||||||
|
#define ENOPKG 65 /* Package not installed */
|
||||||
|
#define EREMOTE 66 /* Object is remote */
|
||||||
|
#define ENOLINK 67 /* Link has been severed */
|
||||||
|
#define EADV 68 /* Advertise error */
|
||||||
|
#define ESRMNT 69 /* Srmount error */
|
||||||
|
#define ECOMM 70 /* Communication error on send */
|
||||||
|
#define EPROTO 71 /* Protocol error */
|
||||||
|
#define EMULTIHOP 72 /* Multihop attempted */
|
||||||
|
#define EDOTDOT 73 /* RFS specific error */
|
||||||
|
#define EBADMSG 74 /* Not a data message */
|
||||||
|
#define EOVERFLOW 75 /* Value too large for defined data type */
|
||||||
|
#define ENOTUNIQ 76 /* Name not unique on network */
|
||||||
|
#define EBADFD 77 /* File descriptor in bad state */
|
||||||
|
#define EREMCHG 78 /* Remote address changed */
|
||||||
|
#define ELIBACC 79 /* Can not access a needed shared library */
|
||||||
|
#define ELIBBAD 80 /* Accessing a corrupted shared library */
|
||||||
|
#define ELIBSCN 81 /* .lib section in a.out corrupted */
|
||||||
|
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
|
||||||
|
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
|
||||||
|
#define EILSEQ 84 /* Illegal byte sequence */
|
||||||
|
#define ERESTART 85 /* Interrupted system call should be restarted */
|
||||||
|
#define ESTRPIPE 86 /* Streams pipe error */
|
||||||
|
#define EUSERS 87 /* Too many users */
|
||||||
|
#define ENOTSOCK 88 /* Socket operation on non-socket */
|
||||||
|
#define EDESTADDRREQ 89 /* Destination address required */
|
||||||
|
#define EMSGSIZE 90 /* Message too long */
|
||||||
|
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
|
||||||
|
#define ENOPROTOOPT 92 /* Protocol not available */
|
||||||
|
#define EPROTONOSUPPORT 93 /* Protocol not supported */
|
||||||
|
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
|
||||||
|
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
|
||||||
|
#define EPFNOSUPPORT 96 /* Protocol family not supported */
|
||||||
|
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
|
||||||
|
#define EADDRINUSE 98 /* Address already in use */
|
||||||
|
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
|
||||||
|
#define ENETDOWN 100 /* Network is down */
|
||||||
|
#define ENETUNREACH 101 /* Network is unreachable */
|
||||||
|
#define ENETRESET 102 /* Network dropped connection because of reset */
|
||||||
|
#define ECONNABORTED 103 /* Software caused connection abort */
|
||||||
|
#define ECONNRESET 104 /* Connection reset by peer */
|
||||||
|
#define ENOBUFS 105 /* No buffer space available */
|
||||||
|
#define EISCONN 106 /* Transport endpoint is already connected */
|
||||||
|
#define ENOTCONN 107 /* Transport endpoint is not connected */
|
||||||
|
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
|
||||||
|
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
|
||||||
|
#define ETIMEDOUT 110 /* Connection timed out */
|
||||||
|
#define ECONNREFUSED 111 /* Connection refused */
|
||||||
|
#define EHOSTDOWN 112 /* Host is down */
|
||||||
|
#define EHOSTUNREACH 113 /* No route to host */
|
||||||
|
#define EALREADY 114 /* Operation already in progress */
|
||||||
|
#define EINPROGRESS 115 /* Operation now in progress */
|
||||||
|
#define ESTALE 116 /* Stale NFS file handle */
|
||||||
|
#define EUCLEAN 117 /* Structure needs cleaning */
|
||||||
|
#define ENOTNAM 118 /* Not a XENIX named type file */
|
||||||
|
#define ENAVAIL 119 /* No XENIX semaphores available */
|
||||||
|
#define EISNAM 120 /* Is a named type file */
|
||||||
|
#define EREMOTEIO 121 /* Remote I/O error */
|
||||||
|
#define EDQUOT 122 /* Quota exceeded */
|
||||||
|
|
||||||
|
#define ENOMEDIUM 123 /* No medium found */
|
||||||
|
#define EMEDIUMTYPE 124 /* Wrong medium type */
|
||||||
|
#define ECANCELED 125 /* Operation Canceled */
|
||||||
|
#define ENOKEY 126 /* Required key not available */
|
||||||
|
#define EKEYEXPIRED 127 /* Key has expired */
|
||||||
|
#define EKEYREVOKED 128 /* Key has been revoked */
|
||||||
|
#define EKEYREJECTED 129 /* Key was rejected by service */
|
||||||
|
|
||||||
|
/* for robust mutexes */
|
||||||
|
#define EOWNERDEAD 130 /* Owner died */
|
||||||
|
#define ENOTRECOVERABLE 131 /* State not recoverable */
|
||||||
|
|
||||||
|
#define ERFKILL 132 /* Operation not possible due to RF-kill */
|
||||||
|
|
||||||
|
#endif
|
191
drivers/video/drm/include/linux/bitops.h
Normal file
191
drivers/video/drm/include/linux/bitops.h
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
#ifndef _LINUX_BITOPS_H
|
||||||
|
#define _LINUX_BITOPS_H
|
||||||
|
|
||||||
|
#define BIT(nr) (1UL << (nr))
|
||||||
|
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
|
||||||
|
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
|
||||||
|
#define BITS_PER_BYTE 8
|
||||||
|
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Include this here because some architectures need generic_ffs/fls in
|
||||||
|
* scope
|
||||||
|
*/
|
||||||
|
#include <asm/bitops.h>
|
||||||
|
|
||||||
|
#define for_each_bit(bit, addr, size) \
|
||||||
|
for ((bit) = find_first_bit((addr), (size)); \
|
||||||
|
(bit) < (size); \
|
||||||
|
(bit) = find_next_bit((addr), (size), (bit) + 1))
|
||||||
|
|
||||||
|
|
||||||
|
static __inline__ int get_bitmask_order(unsigned int count)
|
||||||
|
{
|
||||||
|
int order;
|
||||||
|
|
||||||
|
order = fls(count);
|
||||||
|
return order; /* We could be slightly more clever with -1 here... */
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ int get_count_order(unsigned int count)
|
||||||
|
{
|
||||||
|
int order;
|
||||||
|
|
||||||
|
order = fls(count) - 1;
|
||||||
|
if (count & (count - 1))
|
||||||
|
order++;
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned long hweight_long(unsigned long w)
|
||||||
|
{
|
||||||
|
return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rol32 - rotate a 32-bit value left
|
||||||
|
* @word: value to rotate
|
||||||
|
* @shift: bits to roll
|
||||||
|
*/
|
||||||
|
static inline __u32 rol32(__u32 word, unsigned int shift)
|
||||||
|
{
|
||||||
|
return (word << shift) | (word >> (32 - shift));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ror32 - rotate a 32-bit value right
|
||||||
|
* @word: value to rotate
|
||||||
|
* @shift: bits to roll
|
||||||
|
*/
|
||||||
|
static inline __u32 ror32(__u32 word, unsigned int shift)
|
||||||
|
{
|
||||||
|
return (word >> shift) | (word << (32 - shift));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rol16 - rotate a 16-bit value left
|
||||||
|
* @word: value to rotate
|
||||||
|
* @shift: bits to roll
|
||||||
|
*/
|
||||||
|
static inline __u16 rol16(__u16 word, unsigned int shift)
|
||||||
|
{
|
||||||
|
return (word << shift) | (word >> (16 - shift));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ror16 - rotate a 16-bit value right
|
||||||
|
* @word: value to rotate
|
||||||
|
* @shift: bits to roll
|
||||||
|
*/
|
||||||
|
static inline __u16 ror16(__u16 word, unsigned int shift)
|
||||||
|
{
|
||||||
|
return (word >> shift) | (word << (16 - shift));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* rol8 - rotate an 8-bit value left
|
||||||
|
* @word: value to rotate
|
||||||
|
* @shift: bits to roll
|
||||||
|
*/
|
||||||
|
static inline __u8 rol8(__u8 word, unsigned int shift)
|
||||||
|
{
|
||||||
|
return (word << shift) | (word >> (8 - shift));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ror8 - rotate an 8-bit value right
|
||||||
|
* @word: value to rotate
|
||||||
|
* @shift: bits to roll
|
||||||
|
*/
|
||||||
|
static inline __u8 ror8(__u8 word, unsigned int shift)
|
||||||
|
{
|
||||||
|
return (word >> shift) | (word << (8 - shift));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned fls_long(unsigned long l)
|
||||||
|
{
|
||||||
|
if (sizeof(l) == 4)
|
||||||
|
return fls(l);
|
||||||
|
return fls64(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __ffs64 - find first set bit in a 64 bit word
|
||||||
|
* @word: The 64 bit word
|
||||||
|
*
|
||||||
|
* On 64 bit arches this is a synomyn for __ffs
|
||||||
|
* The result is not defined if no bits are set, so check that @word
|
||||||
|
* is non-zero before calling this.
|
||||||
|
*/
|
||||||
|
static inline unsigned long __ffs64(u64 word)
|
||||||
|
{
|
||||||
|
#if BITS_PER_LONG == 32
|
||||||
|
if (((u32)word) == 0UL)
|
||||||
|
return __ffs((u32)(word >> 32)) + 32;
|
||||||
|
#elif BITS_PER_LONG != 64
|
||||||
|
#error BITS_PER_LONG not 32 or 64
|
||||||
|
#endif
|
||||||
|
return __ffs((unsigned long)word);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __KERNEL__
|
||||||
|
#ifdef CONFIG_GENERIC_FIND_FIRST_BIT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find_first_bit - find the first set bit in a memory region
|
||||||
|
* @addr: The address to start the search at
|
||||||
|
* @size: The maximum size to search
|
||||||
|
*
|
||||||
|
* Returns the bit number of the first set bit.
|
||||||
|
*/
|
||||||
|
extern unsigned long find_first_bit(const unsigned long *addr,
|
||||||
|
unsigned long size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find_first_zero_bit - find the first cleared bit in a memory region
|
||||||
|
* @addr: The address to start the search at
|
||||||
|
* @size: The maximum size to search
|
||||||
|
*
|
||||||
|
* Returns the bit number of the first cleared bit.
|
||||||
|
*/
|
||||||
|
extern unsigned long find_first_zero_bit(const unsigned long *addr,
|
||||||
|
unsigned long size);
|
||||||
|
#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */
|
||||||
|
|
||||||
|
#ifdef CONFIG_GENERIC_FIND_LAST_BIT
|
||||||
|
/**
|
||||||
|
* find_last_bit - find the last set bit in a memory region
|
||||||
|
* @addr: The address to start the search at
|
||||||
|
* @size: The maximum size to search
|
||||||
|
*
|
||||||
|
* Returns the bit number of the first set bit, or size.
|
||||||
|
*/
|
||||||
|
extern unsigned long find_last_bit(const unsigned long *addr,
|
||||||
|
unsigned long size);
|
||||||
|
#endif /* CONFIG_GENERIC_FIND_LAST_BIT */
|
||||||
|
|
||||||
|
#ifdef CONFIG_GENERIC_FIND_NEXT_BIT
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find_next_bit - find the next set bit in a memory region
|
||||||
|
* @addr: The address to base the search on
|
||||||
|
* @offset: The bitnumber to start searching at
|
||||||
|
* @size: The bitmap size in bits
|
||||||
|
*/
|
||||||
|
extern unsigned long find_next_bit(const unsigned long *addr,
|
||||||
|
unsigned long size, unsigned long offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find_next_zero_bit - find the next cleared bit in a memory region
|
||||||
|
* @addr: The address to base the search on
|
||||||
|
* @offset: The bitnumber to start searching at
|
||||||
|
* @size: The bitmap size in bits
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern unsigned long find_next_zero_bit(const unsigned long *addr,
|
||||||
|
unsigned long size,
|
||||||
|
unsigned long offset);
|
||||||
|
|
||||||
|
#endif /* CONFIG_GENERIC_FIND_NEXT_BIT */
|
||||||
|
#endif /* __KERNEL__ */
|
||||||
|
#endif
|
51
drivers/video/drm/include/linux/i2c-algo-bit.h
Normal file
51
drivers/video/drm/include/linux/i2c-algo-bit.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* i2c-algo-bit.h i2c driver algorithms for bit-shift adapters */
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* Copyright (C) 1995-99 Simon G. Vogl
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
|
||||||
|
Frodo Looijaard <frodol@dds.nl> */
|
||||||
|
|
||||||
|
#ifndef _LINUX_I2C_ALGO_BIT_H
|
||||||
|
#define _LINUX_I2C_ALGO_BIT_H
|
||||||
|
|
||||||
|
/* --- Defines for bit-adapters --------------------------------------- */
|
||||||
|
/*
|
||||||
|
* This struct contains the hw-dependent functions of bit-style adapters to
|
||||||
|
* manipulate the line states, and to init any hw-specific features. This is
|
||||||
|
* only used if you have more than one hw-type of adapter running.
|
||||||
|
*/
|
||||||
|
struct i2c_algo_bit_data {
|
||||||
|
void *data; /* private data for lowlevel routines */
|
||||||
|
void (*setsda) (void *data, int state);
|
||||||
|
void (*setscl) (void *data, int state);
|
||||||
|
int (*getsda) (void *data);
|
||||||
|
int (*getscl) (void *data);
|
||||||
|
|
||||||
|
/* local settings */
|
||||||
|
int udelay; /* half clock cycle time in us,
|
||||||
|
minimum 2 us for fast-mode I2C,
|
||||||
|
minimum 5 us for standard-mode I2C and SMBus,
|
||||||
|
maximum 50 us for SMBus */
|
||||||
|
int timeout; /* in jiffies */
|
||||||
|
};
|
||||||
|
|
||||||
|
int i2c_bit_add_bus(struct i2c_adapter *);
|
||||||
|
int i2c_bit_add_numbered_bus(struct i2c_adapter *);
|
||||||
|
|
||||||
|
#endif /* _LINUX_I2C_ALGO_BIT_H */
|
299
drivers/video/drm/include/linux/i2c.h
Normal file
299
drivers/video/drm/include/linux/i2c.h
Normal file
@ -0,0 +1,299 @@
|
|||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* */
|
||||||
|
/* i2c.h - definitions for the i2c-bus interface */
|
||||||
|
/* */
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* Copyright (C) 1995-2000 Simon G. Vogl
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and
|
||||||
|
Frodo Looijaard <frodol@dds.nl> */
|
||||||
|
|
||||||
|
#ifndef _LINUX_I2C_H
|
||||||
|
#define _LINUX_I2C_H
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define I2C_NAME_SIZE 20
|
||||||
|
|
||||||
|
struct i2c_msg;
|
||||||
|
struct i2c_algorithm;
|
||||||
|
struct i2c_adapter;
|
||||||
|
struct i2c_client;
|
||||||
|
union i2c_smbus_data;
|
||||||
|
|
||||||
|
|
||||||
|
/* Transfer num messages.
|
||||||
|
*/
|
||||||
|
extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
|
||||||
|
int num);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct i2c_client - represent an I2C slave device
|
||||||
|
* @flags: I2C_CLIENT_TEN indicates the device uses a ten bit chip address;
|
||||||
|
* I2C_CLIENT_PEC indicates it uses SMBus Packet Error Checking
|
||||||
|
* @addr: Address used on the I2C bus connected to the parent adapter.
|
||||||
|
* @name: Indicates the type of the device, usually a chip name that's
|
||||||
|
* generic enough to hide second-sourcing and compatible revisions.
|
||||||
|
* @adapter: manages the bus segment hosting this I2C device
|
||||||
|
* @driver: device's driver, hence pointer to access routines
|
||||||
|
* @dev: Driver model device node for the slave.
|
||||||
|
* @irq: indicates the IRQ generated by this device (if any)
|
||||||
|
* @detected: member of an i2c_driver.clients list or i2c-core's
|
||||||
|
* userspace_devices list
|
||||||
|
*
|
||||||
|
* An i2c_client identifies a single device (i.e. chip) connected to an
|
||||||
|
* i2c bus. The behaviour exposed to Linux is defined by the driver
|
||||||
|
* managing the device.
|
||||||
|
*/
|
||||||
|
struct i2c_client {
|
||||||
|
unsigned short flags; /* div., see below */
|
||||||
|
unsigned short addr; /* chip address - NOTE: 7bit */
|
||||||
|
/* addresses are stored in the */
|
||||||
|
/* _LOWER_ 7 bits */
|
||||||
|
char name[I2C_NAME_SIZE];
|
||||||
|
struct i2c_adapter *adapter; /* the adapter we sit on */
|
||||||
|
// struct i2c_driver *driver; /* and our access routines */
|
||||||
|
// struct device dev; /* the device structure */
|
||||||
|
int irq; /* irq issued by device (or -1) */
|
||||||
|
struct list_head detected;
|
||||||
|
};
|
||||||
|
#define to_i2c_client(d) container_of(d, struct i2c_client, dev)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following structs are for those who like to implement new bus drivers:
|
||||||
|
* i2c_algorithm is the interface to a class of hardware solutions which can
|
||||||
|
* be addressed using the same bus algorithms - i.e. bit-banging or the PCF8584
|
||||||
|
* to name two of the most common.
|
||||||
|
*/
|
||||||
|
struct i2c_algorithm {
|
||||||
|
/* If an adapter algorithm can't do I2C-level access, set master_xfer
|
||||||
|
to NULL. If an adapter algorithm can do SMBus access, set
|
||||||
|
smbus_xfer. If set to NULL, the SMBus protocol is simulated
|
||||||
|
using common I2C messages */
|
||||||
|
/* master_xfer should return the number of messages successfully
|
||||||
|
processed, or a negative value on error */
|
||||||
|
int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
|
||||||
|
int num);
|
||||||
|
int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
|
||||||
|
unsigned short flags, char read_write,
|
||||||
|
u8 command, int size, union i2c_smbus_data *data);
|
||||||
|
|
||||||
|
/* To determine what the adapter supports */
|
||||||
|
u32 (*functionality) (struct i2c_adapter *);
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* i2c_adapter is the structure used to identify a physical i2c bus along
|
||||||
|
* with the access algorithms necessary to access it.
|
||||||
|
*/
|
||||||
|
struct i2c_adapter {
|
||||||
|
unsigned int id;
|
||||||
|
unsigned int class; /* classes to allow probing for */
|
||||||
|
const struct i2c_algorithm *algo; /* the algorithm to access the bus */
|
||||||
|
void *algo_data;
|
||||||
|
|
||||||
|
/* data fields that are valid for all devices */
|
||||||
|
u8 level; /* nesting level for lockdep */
|
||||||
|
|
||||||
|
int timeout; /* in jiffies */
|
||||||
|
int retries;
|
||||||
|
// struct device dev; /* the adapter device */
|
||||||
|
|
||||||
|
int nr;
|
||||||
|
char name[48];
|
||||||
|
};
|
||||||
|
#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
|
||||||
|
|
||||||
|
|
||||||
|
/*flags for the client struct: */
|
||||||
|
#define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */
|
||||||
|
#define I2C_CLIENT_TEN 0x10 /* we have a ten bit chip address */
|
||||||
|
/* Must equal I2C_M_TEN below */
|
||||||
|
#define I2C_CLIENT_WAKE 0x80 /* for board_info; true iff can wake */
|
||||||
|
|
||||||
|
/* i2c adapter classes (bitmask) */
|
||||||
|
#define I2C_CLASS_HWMON (1<<0) /* lm_sensors, ... */
|
||||||
|
#define I2C_CLASS_TV_ANALOG (1<<1) /* bttv + friends */
|
||||||
|
#define I2C_CLASS_TV_DIGITAL (1<<2) /* dvb cards */
|
||||||
|
#define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */
|
||||||
|
#define I2C_CLASS_SPD (1<<7) /* SPD EEPROMs and similar */
|
||||||
|
|
||||||
|
/* i2c_client_address_data is the struct for holding default client
|
||||||
|
* addresses for a driver and for the parameters supplied on the
|
||||||
|
* command line
|
||||||
|
*/
|
||||||
|
struct i2c_client_address_data {
|
||||||
|
const unsigned short *normal_i2c;
|
||||||
|
const unsigned short *probe;
|
||||||
|
const unsigned short *ignore;
|
||||||
|
const unsigned short * const *forces;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Internal numbers to terminate lists */
|
||||||
|
#define I2C_CLIENT_END 0xfffeU
|
||||||
|
|
||||||
|
/* The numbers to use to set I2C bus address */
|
||||||
|
#define ANY_I2C_BUS 0xffff
|
||||||
|
|
||||||
|
/* Construct an I2C_CLIENT_END-terminated array of i2c addresses */
|
||||||
|
#define I2C_ADDRS(addr, addrs...) \
|
||||||
|
((const unsigned short []){ addr, ## addrs, I2C_CLIENT_END })
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct i2c_msg - an I2C transaction segment beginning with START
|
||||||
|
* @addr: Slave address, either seven or ten bits. When this is a ten
|
||||||
|
* bit address, I2C_M_TEN must be set in @flags and the adapter
|
||||||
|
* must support I2C_FUNC_10BIT_ADDR.
|
||||||
|
* @flags: I2C_M_RD is handled by all adapters. No other flags may be
|
||||||
|
* provided unless the adapter exported the relevant I2C_FUNC_*
|
||||||
|
* flags through i2c_check_functionality().
|
||||||
|
* @len: Number of data bytes in @buf being read from or written to the
|
||||||
|
* I2C slave address. For read transactions where I2C_M_RECV_LEN
|
||||||
|
* is set, the caller guarantees that this buffer can hold up to
|
||||||
|
* 32 bytes in addition to the initial length byte sent by the
|
||||||
|
* slave (plus, if used, the SMBus PEC); and this value will be
|
||||||
|
* incremented by the number of block data bytes received.
|
||||||
|
* @buf: The buffer into which data is read, or from which it's written.
|
||||||
|
*
|
||||||
|
* An i2c_msg is the low level representation of one segment of an I2C
|
||||||
|
* transaction. It is visible to drivers in the @i2c_transfer() procedure,
|
||||||
|
* to userspace from i2c-dev, and to I2C adapter drivers through the
|
||||||
|
* @i2c_adapter.@master_xfer() method.
|
||||||
|
*
|
||||||
|
* Except when I2C "protocol mangling" is used, all I2C adapters implement
|
||||||
|
* the standard rules for I2C transactions. Each transaction begins with a
|
||||||
|
* START. That is followed by the slave address, and a bit encoding read
|
||||||
|
* versus write. Then follow all the data bytes, possibly including a byte
|
||||||
|
* with SMBus PEC. The transfer terminates with a NAK, or when all those
|
||||||
|
* bytes have been transferred and ACKed. If this is the last message in a
|
||||||
|
* group, it is followed by a STOP. Otherwise it is followed by the next
|
||||||
|
* @i2c_msg transaction segment, beginning with a (repeated) START.
|
||||||
|
*
|
||||||
|
* Alternatively, when the adapter supports I2C_FUNC_PROTOCOL_MANGLING then
|
||||||
|
* passing certain @flags may have changed those standard protocol behaviors.
|
||||||
|
* Those flags are only for use with broken/nonconforming slaves, and with
|
||||||
|
* adapters which are known to support the specific mangling options they
|
||||||
|
* need (one or more of IGNORE_NAK, NO_RD_ACK, NOSTART, and REV_DIR_ADDR).
|
||||||
|
*/
|
||||||
|
struct i2c_msg {
|
||||||
|
u16 addr; /* slave address */
|
||||||
|
u16 flags;
|
||||||
|
#define I2C_M_TEN 0x0010 /* this is a ten bit chip address */
|
||||||
|
#define I2C_M_RD 0x0001 /* read data, from slave to master */
|
||||||
|
#define I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
||||||
|
#define I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
||||||
|
#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
||||||
|
#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
||||||
|
#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
|
||||||
|
u16 len; /* msg length */
|
||||||
|
u8 *buf; /* pointer to msg data */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* To determine what functionality is present */
|
||||||
|
|
||||||
|
#define I2C_FUNC_I2C 0x00000001
|
||||||
|
#define I2C_FUNC_10BIT_ADDR 0x00000002
|
||||||
|
#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004 /* I2C_M_NOSTART etc. */
|
||||||
|
#define I2C_FUNC_SMBUS_PEC 0x00000008
|
||||||
|
#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000 /* SMBus 2.0 */
|
||||||
|
#define I2C_FUNC_SMBUS_QUICK 0x00010000
|
||||||
|
#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000
|
||||||
|
#define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000
|
||||||
|
#define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000
|
||||||
|
#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000
|
||||||
|
#define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000
|
||||||
|
#define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000
|
||||||
|
#define I2C_FUNC_SMBUS_PROC_CALL 0x00800000
|
||||||
|
#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000
|
||||||
|
#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000
|
||||||
|
#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000 /* I2C-like block xfer */
|
||||||
|
#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000 /* w/ 1-byte reg. addr. */
|
||||||
|
|
||||||
|
#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \
|
||||||
|
I2C_FUNC_SMBUS_WRITE_BYTE)
|
||||||
|
#define I2C_FUNC_SMBUS_BYTE_DATA (I2C_FUNC_SMBUS_READ_BYTE_DATA | \
|
||||||
|
I2C_FUNC_SMBUS_WRITE_BYTE_DATA)
|
||||||
|
#define I2C_FUNC_SMBUS_WORD_DATA (I2C_FUNC_SMBUS_READ_WORD_DATA | \
|
||||||
|
I2C_FUNC_SMBUS_WRITE_WORD_DATA)
|
||||||
|
#define I2C_FUNC_SMBUS_BLOCK_DATA (I2C_FUNC_SMBUS_READ_BLOCK_DATA | \
|
||||||
|
I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)
|
||||||
|
#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \
|
||||||
|
I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)
|
||||||
|
|
||||||
|
#define I2C_FUNC_SMBUS_EMUL (I2C_FUNC_SMBUS_QUICK | \
|
||||||
|
I2C_FUNC_SMBUS_BYTE | \
|
||||||
|
I2C_FUNC_SMBUS_BYTE_DATA | \
|
||||||
|
I2C_FUNC_SMBUS_WORD_DATA | \
|
||||||
|
I2C_FUNC_SMBUS_PROC_CALL | \
|
||||||
|
I2C_FUNC_SMBUS_WRITE_BLOCK_DATA | \
|
||||||
|
I2C_FUNC_SMBUS_I2C_BLOCK | \
|
||||||
|
I2C_FUNC_SMBUS_PEC)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Data for SMBus Messages
|
||||||
|
*/
|
||||||
|
#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */
|
||||||
|
union i2c_smbus_data {
|
||||||
|
__u8 byte;
|
||||||
|
__u16 word;
|
||||||
|
__u8 block[I2C_SMBUS_BLOCK_MAX + 2]; /* block[0] is used for length */
|
||||||
|
/* and one more for user-space compatibility */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* i2c_smbus_xfer read or write markers */
|
||||||
|
#define I2C_SMBUS_READ 1
|
||||||
|
#define I2C_SMBUS_WRITE 0
|
||||||
|
|
||||||
|
/* SMBus transaction types (size parameter in the above functions)
|
||||||
|
Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */
|
||||||
|
#define I2C_SMBUS_QUICK 0
|
||||||
|
#define I2C_SMBUS_BYTE 1
|
||||||
|
#define I2C_SMBUS_BYTE_DATA 2
|
||||||
|
#define I2C_SMBUS_WORD_DATA 3
|
||||||
|
#define I2C_SMBUS_PROC_CALL 4
|
||||||
|
#define I2C_SMBUS_BLOCK_DATA 5
|
||||||
|
#define I2C_SMBUS_I2C_BLOCK_BROKEN 6
|
||||||
|
#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */
|
||||||
|
#define I2C_SMBUS_I2C_BLOCK_DATA 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _LINUX_I2C_H */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
144
drivers/video/drm/include/linux/idr.h
Normal file
144
drivers/video/drm/include/linux/idr.h
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
/*
|
||||||
|
* include/linux/idr.h
|
||||||
|
*
|
||||||
|
* 2002-10-18 written by Jim Houston jim.houston@ccur.com
|
||||||
|
* Copyright (C) 2002 by Concurrent Computer Corporation
|
||||||
|
* Distributed under the GNU GPL license version 2.
|
||||||
|
*
|
||||||
|
* Small id to pointer translation service avoiding fixed sized
|
||||||
|
* tables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __IDR_H__
|
||||||
|
#define __IDR_H__
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <errno-base.h>
|
||||||
|
|
||||||
|
//#include <linux/bitops.h>
|
||||||
|
//#include <linux/init.h>
|
||||||
|
//#include <linux/rcupdate.h>
|
||||||
|
|
||||||
|
struct rcu_head {
|
||||||
|
struct rcu_head *next;
|
||||||
|
void (*func)(struct rcu_head *head);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# define IDR_BITS 5
|
||||||
|
# define IDR_FULL 0xfffffffful
|
||||||
|
/* We can only use two of the bits in the top level because there is
|
||||||
|
only one possible bit in the top level (5 bits * 7 levels = 35
|
||||||
|
bits, but you only use 31 bits in the id). */
|
||||||
|
# define TOP_LEVEL_FULL (IDR_FULL >> 30)
|
||||||
|
|
||||||
|
#define IDR_SIZE (1 << IDR_BITS)
|
||||||
|
#define IDR_MASK ((1 << IDR_BITS)-1)
|
||||||
|
|
||||||
|
#define MAX_ID_SHIFT (sizeof(int)*8 - 1)
|
||||||
|
#define MAX_ID_BIT (1U << MAX_ID_SHIFT)
|
||||||
|
#define MAX_ID_MASK (MAX_ID_BIT - 1)
|
||||||
|
|
||||||
|
/* Leave the possibility of an incomplete final layer */
|
||||||
|
#define MAX_LEVEL (MAX_ID_SHIFT + IDR_BITS - 1) / IDR_BITS
|
||||||
|
|
||||||
|
/* Number of id_layer structs to leave in free list */
|
||||||
|
#define IDR_FREE_MAX MAX_LEVEL + MAX_LEVEL
|
||||||
|
|
||||||
|
struct idr_layer {
|
||||||
|
unsigned long bitmap; /* A zero bit means "space here" */
|
||||||
|
struct idr_layer *ary[1<<IDR_BITS];
|
||||||
|
int count; /* When zero, we can release it */
|
||||||
|
int layer; /* distance from leaf */
|
||||||
|
struct rcu_head rcu_head;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct idr {
|
||||||
|
struct idr_layer *top;
|
||||||
|
struct idr_layer *id_free;
|
||||||
|
int layers; /* only valid without concurrent changes */
|
||||||
|
int id_free_cnt;
|
||||||
|
// spinlock_t lock;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IDR_INIT(name) \
|
||||||
|
{ \
|
||||||
|
.top = NULL, \
|
||||||
|
.id_free = NULL, \
|
||||||
|
.layers = 0, \
|
||||||
|
.id_free_cnt = 0, \
|
||||||
|
// .lock = __SPIN_LOCK_UNLOCKED(name.lock), \
|
||||||
|
}
|
||||||
|
#define DEFINE_IDR(name) struct idr name = IDR_INIT(name)
|
||||||
|
|
||||||
|
/* Actions to be taken after a call to _idr_sub_alloc */
|
||||||
|
#define IDR_NEED_TO_GROW -2
|
||||||
|
#define IDR_NOMORE_SPACE -3
|
||||||
|
|
||||||
|
#define _idr_rc_to_errno(rc) ((rc) == -1 ? -EAGAIN : -ENOSPC)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* idr synchronization (stolen from radix-tree.h)
|
||||||
|
*
|
||||||
|
* idr_find() is able to be called locklessly, using RCU. The caller must
|
||||||
|
* ensure calls to this function are made within rcu_read_lock() regions.
|
||||||
|
* Other readers (lock-free or otherwise) and modifications may be running
|
||||||
|
* concurrently.
|
||||||
|
*
|
||||||
|
* It is still required that the caller manage the synchronization and
|
||||||
|
* lifetimes of the items. So if RCU lock-free lookups are used, typically
|
||||||
|
* this would mean that the items have their own locks, or are amenable to
|
||||||
|
* lock-free access; and that the items are freed by RCU (or only freed after
|
||||||
|
* having been deleted from the idr tree *and* a synchronize_rcu() grace
|
||||||
|
* period).
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is what we export.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void *idr_find(struct idr *idp, int id);
|
||||||
|
int idr_pre_get(struct idr *idp, u32_t gfp_mask);
|
||||||
|
int idr_get_new(struct idr *idp, void *ptr, int *id);
|
||||||
|
int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
|
||||||
|
int idr_for_each(struct idr *idp,
|
||||||
|
int (*fn)(int id, void *p, void *data), void *data);
|
||||||
|
void *idr_get_next(struct idr *idp, int *nextid);
|
||||||
|
void *idr_replace(struct idr *idp, void *ptr, int id);
|
||||||
|
void idr_remove(struct idr *idp, int id);
|
||||||
|
void idr_remove_all(struct idr *idp);
|
||||||
|
void idr_destroy(struct idr *idp);
|
||||||
|
void idr_init(struct idr *idp);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IDA - IDR based id allocator, use when translation from id to
|
||||||
|
* pointer isn't necessary.
|
||||||
|
*/
|
||||||
|
#define IDA_CHUNK_SIZE 128 /* 128 bytes per chunk */
|
||||||
|
#define IDA_BITMAP_LONGS (128 / sizeof(long) - 1)
|
||||||
|
#define IDA_BITMAP_BITS (IDA_BITMAP_LONGS * sizeof(long) * 8)
|
||||||
|
|
||||||
|
struct ida_bitmap {
|
||||||
|
long nr_busy;
|
||||||
|
unsigned long bitmap[IDA_BITMAP_LONGS];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ida {
|
||||||
|
struct idr idr;
|
||||||
|
struct ida_bitmap *free_bitmap;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IDA_INIT(name) { .idr = IDR_INIT(name), .free_bitmap = NULL, }
|
||||||
|
#define DEFINE_IDA(name) struct ida name = IDA_INIT(name)
|
||||||
|
|
||||||
|
int ida_pre_get(struct ida *ida, u32_t gfp_mask);
|
||||||
|
int ida_get_new_above(struct ida *ida, int starting_id, int *p_id);
|
||||||
|
int ida_get_new(struct ida *ida, int *p_id);
|
||||||
|
void ida_remove(struct ida *ida, int id);
|
||||||
|
void ida_destroy(struct ida *ida);
|
||||||
|
void ida_init(struct ida *ida);
|
||||||
|
|
||||||
|
void idr_init_cache(void);
|
||||||
|
|
||||||
|
#endif /* __IDR_H__ */
|
@ -86,9 +86,6 @@ typedef uint32_t resource_size_t;
|
|||||||
|
|
||||||
#define DRM_INFO(fmt, arg...) dbgprintf("DRM: "fmt , ##arg)
|
#define DRM_INFO(fmt, arg...) dbgprintf("DRM: "fmt , ##arg)
|
||||||
|
|
||||||
#define DRM_DEBUG(fmt, arg...) \
|
|
||||||
printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __func__ , ##arg)
|
|
||||||
|
|
||||||
#define DRM_ERROR(fmt, arg...) \
|
#define DRM_ERROR(fmt, arg...) \
|
||||||
printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __func__ , ##arg)
|
printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __func__ , ##arg)
|
||||||
|
|
||||||
@ -230,24 +227,6 @@ static inline void bitmap_zero(unsigned long *dst, int nbits)
|
|||||||
|
|
||||||
#define EXPORT_SYMBOL(x)
|
#define EXPORT_SYMBOL(x)
|
||||||
|
|
||||||
#define IDR_BITS 5
|
|
||||||
#define IDR_FULL 0xfffffffful
|
|
||||||
|
|
||||||
struct idr_layer {
|
|
||||||
unsigned long bitmap; /* A zero bit means "space here" */
|
|
||||||
struct idr_layer *ary[1<<IDR_BITS];
|
|
||||||
int count; /* When zero, we can release it */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct idr {
|
|
||||||
struct idr_layer *top;
|
|
||||||
struct idr_layer *id_free;
|
|
||||||
int layers;
|
|
||||||
int id_free_cnt;
|
|
||||||
// spinlock_t lock;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define min(x,y) ({ \
|
#define min(x,y) ({ \
|
||||||
typeof(x) _x = (x); \
|
typeof(x) _x = (x); \
|
||||||
typeof(y) _y = (y); \
|
typeof(y) _y = (y); \
|
||||||
@ -292,7 +271,10 @@ static inline void *kcalloc(size_t n, size_t size, u32_t flags)
|
|||||||
{
|
{
|
||||||
if (n != 0 && size > ULONG_MAX / n)
|
if (n != 0 && size > ULONG_MAX / n)
|
||||||
return NULL;
|
return NULL;
|
||||||
return kmalloc(n * size, 0);
|
return kzalloc(n * size, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ENTRY() dbgprintf("entry %s\n",__FUNCTION__)
|
||||||
|
#define LEAVE() dbgprintf("leave %s\n",__FUNCTION__)
|
||||||
|
|
||||||
#endif //__TYPES_H__
|
#endif //__TYPES_H__
|
||||||
|
55
drivers/video/drm/radeon/atikms.lds
Normal file
55
drivers/video/drm/radeon/atikms.lds
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
|
||||||
|
|
||||||
|
OUTPUT_FORMAT(pei-i386)
|
||||||
|
|
||||||
|
ENTRY("_drvEntry")
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = SIZEOF_HEADERS;
|
||||||
|
. = ALIGN(__section_alignment__);
|
||||||
|
|
||||||
|
.text __image_base__ + ( __section_alignment__ < 0x1000 ? . : __section_alignment__ ) :
|
||||||
|
|
||||||
|
{
|
||||||
|
*(.text) *(.rdata)
|
||||||
|
}
|
||||||
|
|
||||||
|
.data ALIGN(__section_alignment__) :
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
.reloc ALIGN(__section_alignment__) :
|
||||||
|
{
|
||||||
|
*(.reloc)
|
||||||
|
}
|
||||||
|
|
||||||
|
.idata ALIGN(__section_alignment__):
|
||||||
|
{
|
||||||
|
SORT(*)(.idata$2)
|
||||||
|
SORT(*)(.idata$3)
|
||||||
|
/* These zeroes mark the end of the import list. */
|
||||||
|
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
|
||||||
|
SORT(*)(.idata$4)
|
||||||
|
SORT(*)(.idata$5)
|
||||||
|
SORT(*)(.idata$6)
|
||||||
|
SORT(*)(.idata$7)
|
||||||
|
}
|
||||||
|
|
||||||
|
.bss ALIGN(__section_alignment__):
|
||||||
|
{
|
||||||
|
*(.bss)
|
||||||
|
*(COMMON)
|
||||||
|
}
|
||||||
|
|
||||||
|
/DISCARD/ :
|
||||||
|
{
|
||||||
|
*(.debug$S)
|
||||||
|
*(.debug$T)
|
||||||
|
*(.debug$F)
|
||||||
|
*(.drectve)
|
||||||
|
*(.edata)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -549,6 +549,9 @@ void radeon_atombios_init_crtc(struct drm_device *dev,
|
|||||||
radeon_crtc->crtc_offset =
|
radeon_crtc->crtc_offset =
|
||||||
AVIVO_D2CRTC_H_TOTAL - AVIVO_D1CRTC_H_TOTAL;
|
AVIVO_D2CRTC_H_TOTAL - AVIVO_D1CRTC_H_TOTAL;
|
||||||
drm_crtc_helper_add(&radeon_crtc->base, &atombios_helper_funcs);
|
drm_crtc_helper_add(&radeon_crtc->base, &atombios_helper_funcs);
|
||||||
|
|
||||||
|
dbgprintf("done %s\n",__FUNCTION__);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void radeon_init_disp_bw_avivo(struct drm_device *dev,
|
void radeon_init_disp_bw_avivo(struct drm_device *dev,
|
||||||
|
78
drivers/video/drm/radeon/makefile
Normal file
78
drivers/video/drm/radeon/makefile
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
CC = gcc
|
||||||
|
FASM = e:/fasm/fasm.exe
|
||||||
|
CFLAGS = -c -O2 -fomit-frame-pointer -fno-builtin-printf
|
||||||
|
LDFLAGS = -nostdlib -shared -s -Map atikms.map --image-base 0 --file-alignment 512 --section-alignment 4096
|
||||||
|
|
||||||
|
DRM_TOPDIR = $(CURDIR)/..
|
||||||
|
DRM_INCLUDES = $(DRM_TOPDIR)/include
|
||||||
|
|
||||||
|
LIBPATH:= .
|
||||||
|
|
||||||
|
LIBS:= -ldrv -lcore
|
||||||
|
|
||||||
|
NAME:= atikms
|
||||||
|
|
||||||
|
INCLUDES = -I $(DRM_INCLUDES) -I $(DRM_INCLUDES)/ttm
|
||||||
|
|
||||||
|
HFILES:= $(DRM_INCLUDES)/types.h \
|
||||||
|
$(DRM_INCLUDES)/list.h \
|
||||||
|
$(DRM_INCLUDES)/pci.h \
|
||||||
|
$(DRM_INCLUDES)/drm.h \
|
||||||
|
$(DRM_INCLUDES)/drmP.h \
|
||||||
|
$(DRM_INCLUDES)/drm_edid.h \
|
||||||
|
$(DRM_INCLUDES)/drm_crtc.h \
|
||||||
|
$(DRM_INCLUDES)/drm_mode.h \
|
||||||
|
$(DRM_INCLUDES)/drm_mm.h \
|
||||||
|
atom.h \
|
||||||
|
radeon.h \
|
||||||
|
radeon_asic.h
|
||||||
|
|
||||||
|
NAME_SRC= \
|
||||||
|
pci.c \
|
||||||
|
$(DRM_TOPDIR)/drm_mm.c \
|
||||||
|
$(DRM_TOPDIR)/drm_edid.c \
|
||||||
|
$(DRM_TOPDIR)/drm_modes.c \
|
||||||
|
$(DRM_TOPDIR)/drm_crtc.c \
|
||||||
|
$(DRM_TOPDIR)/drm_crtc_helper.c \
|
||||||
|
$(DRM_TOPDIR)/i2c/i2c-core.c \
|
||||||
|
$(DRM_TOPDIR)/i2c/i2c-algo-bit.c \
|
||||||
|
$(DRM_TOPDIR)/idr.c \
|
||||||
|
radeon_device.c \
|
||||||
|
radeon_clocks.c \
|
||||||
|
radeon_i2c.c \
|
||||||
|
atom.c \
|
||||||
|
radeon_atombios.c \
|
||||||
|
atombios_crtc.c \
|
||||||
|
radeon_encoders.c \
|
||||||
|
radeon_connectors.c \
|
||||||
|
radeon_bios.c \
|
||||||
|
radeon_combios.c \
|
||||||
|
radeon_legacy_crtc.c \
|
||||||
|
radeon_legacy_encoders.c \
|
||||||
|
radeon_display.c \
|
||||||
|
radeon_object.c \
|
||||||
|
radeon_gart.c \
|
||||||
|
radeon_ring.c \
|
||||||
|
r100.c \
|
||||||
|
r300.c \
|
||||||
|
rv515.c \
|
||||||
|
r520.c
|
||||||
|
|
||||||
|
|
||||||
|
SRC_DEP:=
|
||||||
|
|
||||||
|
|
||||||
|
NAME_OBJS = $(patsubst %.s, %.obj, $(patsubst %.asm, %.obj,\
|
||||||
|
$(patsubst %.c, %.obj, $(NAME_SRC))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
all: $(NAME).dll
|
||||||
|
|
||||||
|
$(NAME).dll: $(NAME_OBJS) $(SRC_DEP) $(HFILES) atikms.lds Makefile
|
||||||
|
ld -L$(LIBPATH) $(LDFLAGS) -T atikms.lds -o $@ $(NAME_OBJS) vsprintf.obj icompute.obj $(LIBS)
|
||||||
|
|
||||||
|
|
||||||
|
%.obj : %.c $(HFILES) Makefile
|
||||||
|
$(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ -c $<
|
@ -26,8 +26,8 @@
|
|||||||
* Jerome Glisse
|
* Jerome Glisse
|
||||||
*/
|
*/
|
||||||
//#include <linux/seq_file.h>
|
//#include <linux/seq_file.h>
|
||||||
//#include "drmP.h"
|
#include "drmP.h"
|
||||||
//#include "drm.h"
|
#include "drm.h"
|
||||||
#include "radeon_drm.h"
|
#include "radeon_drm.h"
|
||||||
#include "radeon_microcode.h"
|
#include "radeon_microcode.h"
|
||||||
#include "radeon_reg.h"
|
#include "radeon_reg.h"
|
||||||
|
@ -26,8 +26,8 @@
|
|||||||
* Jerome Glisse
|
* Jerome Glisse
|
||||||
*/
|
*/
|
||||||
//#include <linux/seq_file.h>
|
//#include <linux/seq_file.h>
|
||||||
//#include "drmP.h"
|
#include "drmP.h"
|
||||||
//#include "drm.h"
|
#include "drm.h"
|
||||||
#include "radeon_reg.h"
|
#include "radeon_reg.h"
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
* Alex Deucher
|
* Alex Deucher
|
||||||
* Jerome Glisse
|
* Jerome Glisse
|
||||||
*/
|
*/
|
||||||
//#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "radeon_reg.h"
|
#include "radeon_reg.h"
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
|
|
||||||
@ -501,4 +501,4 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//domodedovo 9-00 16/07/2009
|
||||||
|
@ -403,8 +403,8 @@ static struct radeon_asic r520_asic = {
|
|||||||
.gpu_reset = &rv515_gpu_reset,
|
.gpu_reset = &rv515_gpu_reset,
|
||||||
.mc_init = &r520_mc_init,
|
.mc_init = &r520_mc_init,
|
||||||
.mc_fini = &r520_mc_fini,
|
.mc_fini = &r520_mc_fini,
|
||||||
.wb_init = &r100_wb_init,
|
// .wb_init = &r100_wb_init,
|
||||||
.wb_fini = &r100_wb_fini,
|
// .wb_fini = &r100_wb_fini,
|
||||||
.gart_enable = &r300_gart_enable,
|
.gart_enable = &r300_gart_enable,
|
||||||
.gart_disable = &rv370_pcie_gart_disable,
|
.gart_disable = &rv370_pcie_gart_disable,
|
||||||
.gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
|
.gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
|
||||||
|
@ -447,7 +447,7 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||||||
struct bios_connector bios_connectors[ATOM_MAX_SUPPORTED_DEVICE];
|
struct bios_connector bios_connectors[ATOM_MAX_SUPPORTED_DEVICE];
|
||||||
|
|
||||||
atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset);
|
atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset);
|
||||||
|
ENTRY();
|
||||||
supported_devices =
|
supported_devices =
|
||||||
(union atom_supported_devices *)(ctx->bios + data_offset);
|
(union atom_supported_devices *)(ctx->bios + data_offset);
|
||||||
|
|
||||||
@ -596,7 +596,7 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct
|
|||||||
}
|
}
|
||||||
|
|
||||||
radeon_link_encoder_connector(dev);
|
radeon_link_encoder_connector(dev);
|
||||||
|
LEAVE();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,11 +37,9 @@
|
|||||||
|
|
||||||
#include <syscall.h>
|
#include <syscall.h>
|
||||||
|
|
||||||
int radeon_modeset = -1;
|
|
||||||
int radeon_dynclks = -1;
|
int radeon_dynclks = -1;
|
||||||
int radeon_r4xx_atom = 0;
|
int radeon_r4xx_atom = 0;
|
||||||
int radeon_agpmode = 0;
|
int radeon_agpmode = -1;
|
||||||
int radeon_vram_limit = 0;
|
|
||||||
int radeon_gart_size = 512; /* default gart size */
|
int radeon_gart_size = 512; /* default gart size */
|
||||||
int radeon_benchmarking = 0;
|
int radeon_benchmarking = 0;
|
||||||
int radeon_connector_table = 0;
|
int radeon_connector_table = 0;
|
||||||
@ -517,7 +515,6 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||||||
if (r) {
|
if (r) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
// r = radeon_init(rdev);
|
|
||||||
|
|
||||||
r = rdev->asic->init(rdev);
|
r = rdev->asic->init(rdev);
|
||||||
|
|
||||||
@ -639,14 +636,15 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||||||
if (!r) {
|
if (!r) {
|
||||||
r = radeon_cp_init(rdev, 1024 * 1024);
|
r = radeon_cp_init(rdev, 1024 * 1024);
|
||||||
}
|
}
|
||||||
if (!r) {
|
// if (!r) {
|
||||||
r = radeon_wb_init(rdev);
|
// r = radeon_wb_init(rdev);
|
||||||
if (r) {
|
// if (r) {
|
||||||
DRM_ERROR("radeon: failled initializing WB (%d).\n", r);
|
// DRM_ERROR("radeon: failled initializing WB (%d).\n", r);
|
||||||
return r;
|
// return r;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (!r) {
|
if (!r) {
|
||||||
r = radeon_ib_pool_init(rdev);
|
r = radeon_ib_pool_init(rdev);
|
||||||
if (r) {
|
if (r) {
|
||||||
@ -654,8 +652,6 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
|
|
||||||
if (!r) {
|
if (!r) {
|
||||||
r = radeon_ib_test(rdev);
|
r = radeon_ib_test(rdev);
|
||||||
if (r) {
|
if (r) {
|
||||||
@ -663,14 +659,16 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = r;
|
ret = r;
|
||||||
r = radeon_modeset_init(rdev);
|
r = radeon_modeset_init(rdev);
|
||||||
if (r) {
|
if (r) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
if (rdev->fbdev_rfb && rdev->fbdev_rfb->obj) {
|
// if (rdev->fbdev_rfb && rdev->fbdev_rfb->obj) {
|
||||||
rdev->fbdev_robj = rdev->fbdev_rfb->obj->driver_private;
|
// rdev->fbdev_robj = rdev->fbdev_rfb->obj->driver_private;
|
||||||
}
|
// }
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
|
DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
|
||||||
}
|
}
|
||||||
@ -678,9 +676,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||||||
// radeon_benchmark(rdev);
|
// radeon_benchmark(rdev);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
#endif
|
return -1;
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_device_id pciidlist[] = {
|
static struct pci_device_id pciidlist[] = {
|
||||||
|
@ -179,6 +179,8 @@ static void radeon_crtc_init(struct drm_device *dev, int index)
|
|||||||
struct radeon_crtc *radeon_crtc;
|
struct radeon_crtc *radeon_crtc;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
ENTRY();
|
||||||
|
|
||||||
radeon_crtc = kzalloc(sizeof(struct radeon_crtc) + (RADEONFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
|
radeon_crtc = kzalloc(sizeof(struct radeon_crtc) + (RADEONFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
|
||||||
if (radeon_crtc == NULL)
|
if (radeon_crtc == NULL)
|
||||||
return;
|
return;
|
||||||
@ -202,6 +204,8 @@ static void radeon_crtc_init(struct drm_device *dev, int index)
|
|||||||
radeon_atombios_init_crtc(dev, radeon_crtc);
|
radeon_atombios_init_crtc(dev, radeon_crtc);
|
||||||
else
|
else
|
||||||
radeon_legacy_init_crtc(dev, radeon_crtc);
|
radeon_legacy_init_crtc(dev, radeon_crtc);
|
||||||
|
|
||||||
|
LEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *encoder_names[34] = {
|
static const char *encoder_names[34] = {
|
||||||
@ -318,6 +322,8 @@ bool radeon_setup_enc_conn(struct drm_device *dev)
|
|||||||
struct drm_connector *drm_connector;
|
struct drm_connector *drm_connector;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
|
ENTRY();
|
||||||
|
|
||||||
if (rdev->bios) {
|
if (rdev->bios) {
|
||||||
if (rdev->is_atom_bios) {
|
if (rdev->is_atom_bios) {
|
||||||
if (rdev->family >= CHIP_R600)
|
if (rdev->family >= CHIP_R600)
|
||||||
@ -335,6 +341,7 @@ bool radeon_setup_enc_conn(struct drm_device *dev)
|
|||||||
list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head)
|
list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head)
|
||||||
radeon_ddc_dump(drm_connector);
|
radeon_ddc_dump(drm_connector);
|
||||||
}
|
}
|
||||||
|
LEAVE();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -584,6 +591,8 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
|
|||||||
.create_handle = radeon_user_framebuffer_create_handle,
|
.create_handle = radeon_user_framebuffer_create_handle,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
struct drm_framebuffer *
|
struct drm_framebuffer *
|
||||||
radeon_framebuffer_create(struct drm_device *dev,
|
radeon_framebuffer_create(struct drm_device *dev,
|
||||||
struct drm_mode_fb_cmd *mode_cmd,
|
struct drm_mode_fb_cmd *mode_cmd,
|
||||||
@ -595,8 +604,8 @@ radeon_framebuffer_create(struct drm_device *dev,
|
|||||||
if (radeon_fb == NULL) {
|
if (radeon_fb == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
drm_framebuffer_init(dev, &radeon_fb->base, &radeon_fb_funcs);
|
// drm_framebuffer_init(dev, &radeon_fb->base, &radeon_fb_funcs);
|
||||||
drm_helper_mode_fill_fb_struct(&radeon_fb->base, mode_cmd);
|
// drm_helper_mode_fill_fb_struct(&radeon_fb->base, mode_cmd);
|
||||||
radeon_fb->obj = obj;
|
radeon_fb->obj = obj;
|
||||||
return &radeon_fb->base;
|
return &radeon_fb->base;
|
||||||
}
|
}
|
||||||
@ -608,27 +617,32 @@ radeon_user_framebuffer_create(struct drm_device *dev,
|
|||||||
{
|
{
|
||||||
struct drm_gem_object *obj;
|
struct drm_gem_object *obj;
|
||||||
|
|
||||||
obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
|
return NULL;
|
||||||
|
|
||||||
return radeon_framebuffer_create(dev, mode_cmd, obj);
|
// obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
|
||||||
|
//
|
||||||
|
// return radeon_framebuffer_create(dev, mode_cmd, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static const struct drm_mode_config_funcs radeon_mode_funcs = {
|
static const struct drm_mode_config_funcs radeon_mode_funcs = {
|
||||||
.fb_create = radeon_user_framebuffer_create,
|
// .fb_create = radeon_user_framebuffer_create,
|
||||||
.fb_changed = radeonfb_probe,
|
// .fb_changed = radeonfb_probe,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int radeon_modeset_init(struct radeon_device *rdev)
|
int radeon_modeset_init(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
dbgprintf("%s\n",__FUNCTION__);
|
||||||
|
|
||||||
int num_crtc = 2, i;
|
int num_crtc = 2, i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
drm_mode_config_init(rdev->ddev);
|
drm_mode_config_init(rdev->ddev);
|
||||||
rdev->mode_info.mode_config_initialized = true;
|
rdev->mode_info.mode_config_initialized = true;
|
||||||
|
|
||||||
// rdev->ddev->mode_config.funcs = (void *)&radeon_mode_funcs;
|
rdev->ddev->mode_config.funcs = (void *)&radeon_mode_funcs;
|
||||||
|
|
||||||
if (ASIC_IS_AVIVO(rdev)) {
|
if (ASIC_IS_AVIVO(rdev)) {
|
||||||
rdev->ddev->mode_config.max_width = 8192;
|
rdev->ddev->mode_config.max_width = 8192;
|
||||||
@ -651,6 +665,9 @@ int radeon_modeset_init(struct radeon_device *rdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
drm_helper_initial_config(rdev->ddev);
|
drm_helper_initial_config(rdev->ddev);
|
||||||
|
|
||||||
|
dbgprintf("done %s\n",__FUNCTION__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1714
drivers/video/drm/radeon/radeon_encoders.c
Normal file
1714
drivers/video/drm/radeon/radeon_encoders.c
Normal file
File diff suppressed because it is too large
Load Diff
387
drivers/video/drm/radeon/radeon_fence.c
Normal file
387
drivers/video/drm/radeon/radeon_fence.c
Normal file
@ -0,0 +1,387 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009 Jerome Glisse.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
* copy of this software and associated documentation files (the
|
||||||
|
* "Software"), to deal in the Software without restriction, including
|
||||||
|
* without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
* distribute, sub license, and/or sell copies of the Software, and to
|
||||||
|
* permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
* the following conditions:
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
* THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
|
||||||
|
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||||
|
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||||
|
* USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice (including the
|
||||||
|
* next paragraph) shall be included in all copies or substantial portions
|
||||||
|
* of the Software.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Authors:
|
||||||
|
* Jerome Glisse <glisse@freedesktop.org>
|
||||||
|
* Dave Airlie
|
||||||
|
*/
|
||||||
|
#include <linux/seq_file.h>
|
||||||
|
#include <asm/atomic.h>
|
||||||
|
#include <linux/wait.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
#include <linux/kref.h>
|
||||||
|
#include "drmP.h"
|
||||||
|
#include "drm.h"
|
||||||
|
#include "radeon_reg.h"
|
||||||
|
#include "radeon.h"
|
||||||
|
|
||||||
|
int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
|
||||||
|
write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
if (fence->emited) {
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fence->seq = atomic_add_return(1, &rdev->fence_drv.seq);
|
||||||
|
if (!rdev->cp.ready) {
|
||||||
|
/* FIXME: cp is not running assume everythings is done right
|
||||||
|
* away
|
||||||
|
*/
|
||||||
|
WREG32(rdev->fence_drv.scratch_reg, fence->seq);
|
||||||
|
} else {
|
||||||
|
radeon_fence_ring_emit(rdev, fence);
|
||||||
|
}
|
||||||
|
fence->emited = true;
|
||||||
|
fence->timeout = jiffies + ((2000 * HZ) / 1000);
|
||||||
|
list_del(&fence->list);
|
||||||
|
list_add_tail(&fence->list, &rdev->fence_drv.emited);
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool radeon_fence_poll_locked(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
struct radeon_fence *fence;
|
||||||
|
struct list_head *i, *n;
|
||||||
|
uint32_t seq;
|
||||||
|
bool wake = false;
|
||||||
|
|
||||||
|
if (rdev == NULL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (rdev->shutdown) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
seq = RREG32(rdev->fence_drv.scratch_reg);
|
||||||
|
rdev->fence_drv.last_seq = seq;
|
||||||
|
n = NULL;
|
||||||
|
list_for_each(i, &rdev->fence_drv.emited) {
|
||||||
|
fence = list_entry(i, struct radeon_fence, list);
|
||||||
|
if (fence->seq == seq) {
|
||||||
|
n = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* all fence previous to this one are considered as signaled */
|
||||||
|
if (n) {
|
||||||
|
i = n;
|
||||||
|
do {
|
||||||
|
n = i->prev;
|
||||||
|
list_del(i);
|
||||||
|
list_add_tail(i, &rdev->fence_drv.signaled);
|
||||||
|
fence = list_entry(i, struct radeon_fence, list);
|
||||||
|
fence->signaled = true;
|
||||||
|
i = n;
|
||||||
|
} while (i != &rdev->fence_drv.emited);
|
||||||
|
wake = true;
|
||||||
|
}
|
||||||
|
return wake;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void radeon_fence_destroy(struct kref *kref)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
struct radeon_fence *fence;
|
||||||
|
|
||||||
|
fence = container_of(kref, struct radeon_fence, kref);
|
||||||
|
write_lock_irqsave(&fence->rdev->fence_drv.lock, irq_flags);
|
||||||
|
list_del(&fence->list);
|
||||||
|
fence->emited = false;
|
||||||
|
write_unlock_irqrestore(&fence->rdev->fence_drv.lock, irq_flags);
|
||||||
|
kfree(fence);
|
||||||
|
}
|
||||||
|
|
||||||
|
int radeon_fence_create(struct radeon_device *rdev, struct radeon_fence **fence)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
|
||||||
|
*fence = kmalloc(sizeof(struct radeon_fence), GFP_KERNEL);
|
||||||
|
if ((*fence) == NULL) {
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
kref_init(&((*fence)->kref));
|
||||||
|
(*fence)->rdev = rdev;
|
||||||
|
(*fence)->emited = false;
|
||||||
|
(*fence)->signaled = false;
|
||||||
|
(*fence)->seq = 0;
|
||||||
|
INIT_LIST_HEAD(&(*fence)->list);
|
||||||
|
|
||||||
|
write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
list_add_tail(&(*fence)->list, &rdev->fence_drv.created);
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool radeon_fence_signaled(struct radeon_fence *fence)
|
||||||
|
{
|
||||||
|
struct radeon_device *rdev = fence->rdev;
|
||||||
|
unsigned long irq_flags;
|
||||||
|
bool signaled = false;
|
||||||
|
|
||||||
|
if (rdev->gpu_lockup) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (fence == NULL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
write_lock_irqsave(&fence->rdev->fence_drv.lock, irq_flags);
|
||||||
|
signaled = fence->signaled;
|
||||||
|
/* if we are shuting down report all fence as signaled */
|
||||||
|
if (fence->rdev->shutdown) {
|
||||||
|
signaled = true;
|
||||||
|
}
|
||||||
|
if (!fence->emited) {
|
||||||
|
WARN(1, "Querying an unemited fence : %p !\n", fence);
|
||||||
|
signaled = true;
|
||||||
|
}
|
||||||
|
if (!signaled) {
|
||||||
|
radeon_fence_poll_locked(fence->rdev);
|
||||||
|
signaled = fence->signaled;
|
||||||
|
}
|
||||||
|
write_unlock_irqrestore(&fence->rdev->fence_drv.lock, irq_flags);
|
||||||
|
return signaled;
|
||||||
|
}
|
||||||
|
|
||||||
|
int radeon_fence_wait(struct radeon_fence *fence, bool interruptible)
|
||||||
|
{
|
||||||
|
struct radeon_device *rdev;
|
||||||
|
unsigned long cur_jiffies;
|
||||||
|
unsigned long timeout;
|
||||||
|
bool expired = false;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
|
||||||
|
if (fence == NULL) {
|
||||||
|
WARN(1, "Querying an invalid fence : %p !\n", fence);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
rdev = fence->rdev;
|
||||||
|
if (radeon_fence_signaled(fence)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
retry:
|
||||||
|
cur_jiffies = jiffies;
|
||||||
|
timeout = HZ / 100;
|
||||||
|
if (time_after(fence->timeout, cur_jiffies)) {
|
||||||
|
timeout = fence->timeout - cur_jiffies;
|
||||||
|
}
|
||||||
|
if (interruptible) {
|
||||||
|
r = wait_event_interruptible_timeout(rdev->fence_drv.queue,
|
||||||
|
radeon_fence_signaled(fence), timeout);
|
||||||
|
if (unlikely(r == -ERESTARTSYS)) {
|
||||||
|
return -ERESTART;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r = wait_event_timeout(rdev->fence_drv.queue,
|
||||||
|
radeon_fence_signaled(fence), timeout);
|
||||||
|
}
|
||||||
|
if (unlikely(!radeon_fence_signaled(fence))) {
|
||||||
|
if (unlikely(r == 0)) {
|
||||||
|
expired = true;
|
||||||
|
}
|
||||||
|
if (unlikely(expired)) {
|
||||||
|
timeout = 1;
|
||||||
|
if (time_after(cur_jiffies, fence->timeout)) {
|
||||||
|
timeout = cur_jiffies - fence->timeout;
|
||||||
|
}
|
||||||
|
timeout = jiffies_to_msecs(timeout);
|
||||||
|
if (timeout > 500) {
|
||||||
|
DRM_ERROR("fence(%p:0x%08X) %lums timeout "
|
||||||
|
"going to reset GPU\n",
|
||||||
|
fence, fence->seq, timeout);
|
||||||
|
radeon_gpu_reset(rdev);
|
||||||
|
WREG32(rdev->fence_drv.scratch_reg, fence->seq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
if (unlikely(expired)) {
|
||||||
|
rdev->fence_drv.count_timeout++;
|
||||||
|
cur_jiffies = jiffies;
|
||||||
|
timeout = 1;
|
||||||
|
if (time_after(cur_jiffies, fence->timeout)) {
|
||||||
|
timeout = cur_jiffies - fence->timeout;
|
||||||
|
}
|
||||||
|
timeout = jiffies_to_msecs(timeout);
|
||||||
|
DRM_ERROR("fence(%p:0x%08X) %lums timeout\n",
|
||||||
|
fence, fence->seq, timeout);
|
||||||
|
DRM_ERROR("last signaled fence(0x%08X)\n",
|
||||||
|
rdev->fence_drv.last_seq);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int radeon_fence_wait_next(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
struct radeon_fence *fence;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (rdev->gpu_lockup) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
if (list_empty(&rdev->fence_drv.emited)) {
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fence = list_entry(rdev->fence_drv.emited.next,
|
||||||
|
struct radeon_fence, list);
|
||||||
|
radeon_fence_ref(fence);
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
r = radeon_fence_wait(fence, false);
|
||||||
|
radeon_fence_unref(&fence);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int radeon_fence_wait_last(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
struct radeon_fence *fence;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (rdev->gpu_lockup) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
if (list_empty(&rdev->fence_drv.emited)) {
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
fence = list_entry(rdev->fence_drv.emited.prev,
|
||||||
|
struct radeon_fence, list);
|
||||||
|
radeon_fence_ref(fence);
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
r = radeon_fence_wait(fence, false);
|
||||||
|
radeon_fence_unref(&fence);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct radeon_fence *radeon_fence_ref(struct radeon_fence *fence)
|
||||||
|
{
|
||||||
|
kref_get(&fence->kref);
|
||||||
|
return fence;
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_fence_unref(struct radeon_fence **fence)
|
||||||
|
{
|
||||||
|
struct radeon_fence *tmp = *fence;
|
||||||
|
|
||||||
|
*fence = NULL;
|
||||||
|
if (tmp) {
|
||||||
|
kref_put(&tmp->kref, &radeon_fence_destroy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_fence_process(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
bool wake;
|
||||||
|
|
||||||
|
write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
wake = radeon_fence_poll_locked(rdev);
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
if (wake) {
|
||||||
|
wake_up_all(&rdev->fence_drv.queue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int radeon_fence_driver_init(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
r = radeon_scratch_get(rdev, &rdev->fence_drv.scratch_reg);
|
||||||
|
if (r) {
|
||||||
|
DRM_ERROR("Fence failed to get a scratch register.");
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
WREG32(rdev->fence_drv.scratch_reg, 0);
|
||||||
|
atomic_set(&rdev->fence_drv.seq, 0);
|
||||||
|
INIT_LIST_HEAD(&rdev->fence_drv.created);
|
||||||
|
INIT_LIST_HEAD(&rdev->fence_drv.emited);
|
||||||
|
INIT_LIST_HEAD(&rdev->fence_drv.signaled);
|
||||||
|
rdev->fence_drv.count_timeout = 0;
|
||||||
|
init_waitqueue_head(&rdev->fence_drv.queue);
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
if (radeon_debugfs_fence_init(rdev)) {
|
||||||
|
DRM_ERROR("Failed to register debugfs file for fence !\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void radeon_fence_driver_fini(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
unsigned long irq_flags;
|
||||||
|
|
||||||
|
wake_up_all(&rdev->fence_drv.queue);
|
||||||
|
write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
radeon_scratch_free(rdev, rdev->fence_drv.scratch_reg);
|
||||||
|
write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
|
||||||
|
DRM_INFO("radeon: fence finalized\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fence debugfs
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_DEBUG_FS)
|
||||||
|
static int radeon_debugfs_fence_info(struct seq_file *m, void *data)
|
||||||
|
{
|
||||||
|
struct drm_info_node *node = (struct drm_info_node *)m->private;
|
||||||
|
struct drm_device *dev = node->minor->dev;
|
||||||
|
struct radeon_device *rdev = dev->dev_private;
|
||||||
|
struct radeon_fence *fence;
|
||||||
|
|
||||||
|
seq_printf(m, "Last signaled fence 0x%08X\n",
|
||||||
|
RREG32(rdev->fence_drv.scratch_reg));
|
||||||
|
if (!list_empty(&rdev->fence_drv.emited)) {
|
||||||
|
fence = list_entry(rdev->fence_drv.emited.prev,
|
||||||
|
struct radeon_fence, list);
|
||||||
|
seq_printf(m, "Last emited fence %p with 0x%08X\n",
|
||||||
|
fence, fence->seq);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct drm_info_list radeon_debugfs_fence_list[] = {
|
||||||
|
{"radeon_fence_info", &radeon_debugfs_fence_info, 0, NULL},
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int radeon_debugfs_fence_init(struct radeon_device *rdev)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_DEBUG_FS)
|
||||||
|
return radeon_debugfs_add_files(rdev, radeon_debugfs_fence_list, 1);
|
||||||
|
#else
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
@ -25,7 +25,7 @@
|
|||||||
* Alex Deucher
|
* Alex Deucher
|
||||||
* Jerome Glisse
|
* Jerome Glisse
|
||||||
*/
|
*/
|
||||||
//#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "radeon_drm.h"
|
#include "radeon_drm.h"
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
#include "radeon_reg.h"
|
#include "radeon_reg.h"
|
||||||
@ -80,6 +80,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
|
|||||||
uint32_t gpu_addr;
|
uint32_t gpu_addr;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
dbgprintf("%s\n",__FUNCTION__);
|
||||||
|
|
||||||
if (rdev->gart.table.vram.robj == NULL) {
|
if (rdev->gart.table.vram.robj == NULL) {
|
||||||
r = radeon_object_create(rdev, NULL,
|
r = radeon_object_create(rdev, NULL,
|
||||||
|
@ -179,7 +179,7 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev,
|
|||||||
i2c->algo.timeout = 2;
|
i2c->algo.timeout = 2;
|
||||||
i2c->algo.data = i2c;
|
i2c->algo.data = i2c;
|
||||||
i2c->rec = *rec;
|
i2c->rec = *rec;
|
||||||
i2c_set_adapdata(&i2c->adapter, i2c);
|
// i2c_set_adapdata(&i2c->adapter, i2c);
|
||||||
|
|
||||||
ret = i2c_bit_add_bus(&i2c->adapter);
|
ret = i2c_bit_add_bus(&i2c->adapter);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -199,7 +199,7 @@ void radeon_i2c_destroy(struct radeon_i2c_chan *i2c)
|
|||||||
if (!i2c)
|
if (!i2c)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
i2c_del_adapter(&i2c->adapter);
|
// i2c_del_adapter(&i2c->adapter);
|
||||||
kfree(i2c);
|
kfree(i2c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,13 +30,11 @@
|
|||||||
#ifndef RADEON_MODE_H
|
#ifndef RADEON_MODE_H
|
||||||
#define RADEON_MODE_H
|
#define RADEON_MODE_H
|
||||||
|
|
||||||
#include "drm_mode.h"
|
#include <drm_crtc.h>
|
||||||
#include "drm_crtc.h"
|
#include <drm_mode.h>
|
||||||
#include <drm_edid.h>
|
#include <drm_edid.h>
|
||||||
|
#include <linux/i2c.h>
|
||||||
//#include <linux/i2c.h>
|
#include <linux/i2c-algo-bit.h>
|
||||||
//#include <linux/i2c-id.h>
|
|
||||||
//#include <linux/i2c-algo-bit.h>
|
|
||||||
|
|
||||||
#define to_radeon_crtc(x) container_of(x, struct radeon_crtc, base)
|
#define to_radeon_crtc(x) container_of(x, struct radeon_crtc, base)
|
||||||
#define to_radeon_connector(x) container_of(x, struct radeon_connector, base)
|
#define to_radeon_connector(x) container_of(x, struct radeon_connector, base)
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
* Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
|
* Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
|
||||||
* Dave Airlie
|
* Dave Airlie
|
||||||
*/
|
*/
|
||||||
//#include <linux/list.h>
|
#include <list.h>
|
||||||
//#include <drm/drmP.h>
|
#include <drmP.h>
|
||||||
|
|
||||||
#include "radeon_drm.h"
|
#include "radeon_drm.h"
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
@ -359,6 +359,8 @@ int radeon_object_init(struct radeon_device *rdev)
|
|||||||
{
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
|
||||||
|
dbgprintf("%s\n",__FUNCTION__);
|
||||||
|
|
||||||
r = drm_mm_init(&mm_vram, 0x800000 >> PAGE_SHIFT,
|
r = drm_mm_init(&mm_vram, 0x800000 >> PAGE_SHIFT,
|
||||||
((rdev->mc.aper_size - 0x800000) >> PAGE_SHIFT));
|
((rdev->mc.aper_size - 0x800000) >> PAGE_SHIFT));
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
* Jerome Glisse
|
* Jerome Glisse
|
||||||
*/
|
*/
|
||||||
//#include <linux/seq_file.h>
|
//#include <linux/seq_file.h>
|
||||||
//#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "radeon_drm.h"
|
#include "radeon_drm.h"
|
||||||
#include "radeon_reg.h"
|
#include "radeon_reg.h"
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
@ -99,7 +99,6 @@ out:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib)
|
void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib **ib)
|
||||||
{
|
{
|
||||||
struct radeon_ib *tmp = *ib;
|
struct radeon_ib *tmp = *ib;
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
* Jerome Glisse
|
* Jerome Glisse
|
||||||
*/
|
*/
|
||||||
//#include <linux/seq_file.h>
|
//#include <linux/seq_file.h>
|
||||||
//#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "radeon_reg.h"
|
#include "radeon_reg.h"
|
||||||
#include "radeon.h"
|
#include "radeon.h"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user