diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2010-04-22 14:17:56 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-05-18 04:21:02 -0400 |
commit | 678e7dfa9e1bb0d1ad31b7cddce58fc3b67cfb27 (patch) | |
tree | 81a975e6cf18f942ec904419bd5ff8136c5f0024 | |
parent | c00f53be5ec70038d7a34f64872df51dabfc5a5b (diff) |
drm/radeon/kms/atom: load hwmon drivers
Hook the atom table parsing up to module loading, so we can automatically
load the appropriate hwmon drivers.
Based on initial patch for r6xx from Matthew Garrett
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 69 |
1 files changed, 43 insertions, 26 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index dbfb837d224c..a0a99b66af82 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -1442,29 +1442,29 @@ radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder) | |||
1442 | 1442 | ||
1443 | static const char *thermal_controller_names[] = { | 1443 | static const char *thermal_controller_names[] = { |
1444 | "NONE", | 1444 | "NONE", |
1445 | "LM63", | 1445 | "lm63", |
1446 | "ADM1032", | 1446 | "adm1032", |
1447 | "ADM1030", | 1447 | "adm1030", |
1448 | "MUA6649", | 1448 | "max6649", |
1449 | "LM64", | 1449 | "lm64", |
1450 | "F75375", | 1450 | "f75375", |
1451 | "ASC7512", | 1451 | "asc7xxx", |
1452 | }; | 1452 | }; |
1453 | 1453 | ||
1454 | static const char *pp_lib_thermal_controller_names[] = { | 1454 | static const char *pp_lib_thermal_controller_names[] = { |
1455 | "NONE", | 1455 | "NONE", |
1456 | "LM63", | 1456 | "lm63", |
1457 | "ADM1032", | 1457 | "adm1032", |
1458 | "ADM1030", | 1458 | "adm1030", |
1459 | "MUA6649", | 1459 | "max6649", |
1460 | "LM64", | 1460 | "lm64", |
1461 | "F75375", | 1461 | "f75375", |
1462 | "RV6xx", | 1462 | "RV6xx", |
1463 | "RV770", | 1463 | "RV770", |
1464 | "ADT7473", | 1464 | "adt7473", |
1465 | "External GPIO", | 1465 | "External GPIO", |
1466 | "Evergreen", | 1466 | "Evergreen", |
1467 | "ADT7473 with internal", | 1467 | "adt7473 with internal", |
1468 | 1468 | ||
1469 | }; | 1469 | }; |
1470 | 1470 | ||
@@ -1502,6 +1502,14 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev) | |||
1502 | power_info->info.ucOverdriveControllerAddress >> 1); | 1502 | power_info->info.ucOverdriveControllerAddress >> 1); |
1503 | i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine); | 1503 | i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine); |
1504 | rdev->pm.i2c_bus = radeon_i2c_create(rdev->ddev, &i2c_bus, "Thermal"); | 1504 | rdev->pm.i2c_bus = radeon_i2c_create(rdev->ddev, &i2c_bus, "Thermal"); |
1505 | if (rdev->pm.i2c_bus) { | ||
1506 | struct i2c_board_info info = { }; | ||
1507 | const char *name = thermal_controller_names[power_info->info. | ||
1508 | ucOverdriveThermalController]; | ||
1509 | info.addr = power_info->info.ucOverdriveControllerAddress >> 1; | ||
1510 | strlcpy(info.type, name, sizeof(info.type)); | ||
1511 | i2c_new_device(&rdev->pm.i2c_bus->adapter, &info); | ||
1512 | } | ||
1505 | } | 1513 | } |
1506 | num_modes = power_info->info.ucNumOfPowerModeEntries; | 1514 | num_modes = power_info->info.ucNumOfPowerModeEntries; |
1507 | if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK) | 1515 | if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK) |
@@ -1726,26 +1734,35 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev) | |||
1726 | } else { | 1734 | } else { |
1727 | /* add the i2c bus for thermal/fan chip */ | 1735 | /* add the i2c bus for thermal/fan chip */ |
1728 | /* no support for internal controller yet */ | 1736 | /* no support for internal controller yet */ |
1729 | if (power_info->info_4.sThermalController.ucType > 0) { | 1737 | ATOM_PPLIB_THERMALCONTROLLER *controller = &power_info->info_4.sThermalController; |
1730 | if ((power_info->info_4.sThermalController.ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) || | 1738 | if (controller->ucType > 0) { |
1731 | (power_info->info_4.sThermalController.ucType == ATOM_PP_THERMALCONTROLLER_RV770) || | 1739 | if ((controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) || |
1732 | (power_info->info_4.sThermalController.ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN)) { | 1740 | (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) || |
1741 | (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN)) { | ||
1733 | DRM_INFO("Internal thermal controller %s fan control\n", | 1742 | DRM_INFO("Internal thermal controller %s fan control\n", |
1734 | (power_info->info_4.sThermalController.ucFanParameters & | 1743 | (controller->ucFanParameters & |
1735 | ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); | 1744 | ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); |
1736 | } else if ((power_info->info_4.sThermalController.ucType == | 1745 | } else if ((controller->ucType == |
1737 | ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) || | 1746 | ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) || |
1738 | (power_info->info_4.sThermalController.ucType == | 1747 | (controller->ucType == |
1739 | ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL)) { | 1748 | ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL)) { |
1740 | DRM_INFO("Special thermal controller config\n"); | 1749 | DRM_INFO("Special thermal controller config\n"); |
1741 | } else { | 1750 | } else { |
1742 | DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n", | 1751 | DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n", |
1743 | pp_lib_thermal_controller_names[power_info->info_4.sThermalController.ucType], | 1752 | pp_lib_thermal_controller_names[controller->ucType], |
1744 | power_info->info_4.sThermalController.ucI2cAddress >> 1, | 1753 | controller->ucI2cAddress >> 1, |
1745 | (power_info->info_4.sThermalController.ucFanParameters & | 1754 | (controller->ucFanParameters & |
1746 | ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); | 1755 | ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); |
1747 | i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info_4.sThermalController.ucI2cLine); | 1756 | i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine); |
1748 | rdev->pm.i2c_bus = radeon_i2c_create(rdev->ddev, &i2c_bus, "Thermal"); | 1757 | rdev->pm.i2c_bus = radeon_i2c_create(rdev->ddev, &i2c_bus, "Thermal"); |
1758 | if (rdev->pm.i2c_bus) { | ||
1759 | struct i2c_board_info info = { }; | ||
1760 | const char *name = pp_lib_thermal_controller_names[controller->ucType]; | ||
1761 | info.addr = controller->ucI2cAddress >> 1; | ||
1762 | strlcpy(info.type, name, sizeof(info.type)); | ||
1763 | i2c_new_device(&rdev->pm.i2c_bus->adapter, &info); | ||
1764 | } | ||
1765 | |||
1749 | } | 1766 | } |
1750 | } | 1767 | } |
1751 | /* first mode is usually default, followed by low to high */ | 1768 | /* first mode is usually default, followed by low to high */ |