From ebbd1c11fb175dfa865af0679cdc85c7d304fe7b Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 9 Feb 2010 10:34:37 +1000 Subject: [PATCH] drm/radeon/kms: expose mm i2c bus to userspace for testing. This just exposes the bus on all cards - needs a lot more work, but I can see two i2c chips on the X600 AIW card I have access to. --- drivers/gpu/drm/radeon/radeon.h | 2 ++ drivers/gpu/drm/radeon/radeon_atombios.c | 19 +++++++++++++++++++ drivers/gpu/drm/radeon/radeon_combios.c | 10 ++++++++++ drivers/gpu/drm/radeon/radeon_display.c | 4 ++++ drivers/gpu/drm/radeon/radeon_mode.h | 2 ++ 5 files changed, 37 insertions(+), 0 deletions(-) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 03d9270..84de743 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -951,6 +951,8 @@ struct radeon_device { int audio_bits_per_sample; uint8_t audio_status_bits; uint8_t audio_category_code; + + struct radeon_i2c_chan *mm_bus; }; int radeon_device_init(struct radeon_device *rdev, diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index c319845..d1d3dfa 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c @@ -2206,3 +2206,22 @@ radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on) else WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch); } + + +void atombios_add_mm_i2c_bus(struct radeon_device *rdev) +{ + struct radeon_i2c_bus_rec mm_bus; + + mm_bus = radeon_lookup_i2c_gpio(rdev, 0xa0); + + if (mm_bus.valid) { + DRM_INFO("Found multimedia i2c bus\n"); + } else { + DRM_INFO("failed to find multimedia i2c bus\n"); + return; + } + + rdev->mm_bus = radeon_i2c_create(rdev->ddev, &mm_bus, "MM"); + if (rdev->mm_bus) + DRM_INFO("Created mm i2c bus\n"); +} diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 8e0ddef..7dc0603 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c @@ -3246,3 +3246,13 @@ radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on) } WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch); } + +void radeon_combios_add_mm_i2c_bus(struct radeon_device *rdev) +{ + struct radeon_i2c_bus_rec i2c_bus; + i2c_bus.valid = true; + i2c_bus.hw_capable = true; + i2c_bus.mm_i2c = true; + rdev->mm_bus = radeon_i2c_create(rdev->ddev, &i2c_bus, "MM"); + +} diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index a41ed40..1634665 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c @@ -347,6 +347,10 @@ static bool radeon_setup_enc_conn(struct drm_device *dev) radeon_ddc_dump(drm_connector); } + if (rdev->is_atom_bios) + atombios_add_mm_i2c_bus(rdev); + else + radeon_combios_add_mm_i2c_bus(rdev); return ret; } diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index d1e859d..03bc2ae 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h @@ -571,4 +571,6 @@ void radeon_legacy_tv_adjust_pll2(struct drm_encoder *encoder, void radeon_legacy_tv_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode); +void atombios_add_mm_i2c_bus(struct radeon_device *rdev); +void radeon_combios_add_mm_i2c_bus(struct radeon_device *rdev); #endif -- 1.6.5.2