mirror of
https://github.com/torvalds/linux.git
synced 2024-11-02 02:01:29 +00:00
iwlwifi: remove power-wasting calls to apm_ops.init()
To save power, don't run apm_ops.init() until needed at "up" time. EEPROM (5000 and earlier devices) may be read without running apm_ops.init(), but OTP reads (6000 and newer devices) require a powered-up chip. Therefore, remove apm_ops.init() from the general path in XXXX_pci_probe(), and call it only if device uses OTP. Once done with OTP read, call apm_ops.stop() to reset chip and save power until "up" time comes around. NOTE: This patch depends on removal of priv->lock from iwl_apm_stop(); lock does not get initialized until later in flow. See patch "remove unneeded locks from apm_stop()". Signed-off-by: Ben Cahill <ben.m.cahill@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
5220af0c3b
commit
88521364cc
@ -3113,12 +3113,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
goto out_iounmap;
|
||||
}
|
||||
|
||||
/* amp init */
|
||||
err = priv->cfg->ops->lib->apm_ops.init(priv);
|
||||
if (err < 0) {
|
||||
IWL_ERR(priv, "Failed to init APMG\n");
|
||||
goto out_iounmap;
|
||||
}
|
||||
/*****************
|
||||
* 4. Read EEPROM
|
||||
*****************/
|
||||
|
@ -533,6 +533,10 @@ int iwl_eeprom_init(struct iwl_priv *priv)
|
||||
goto err;
|
||||
}
|
||||
if (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) {
|
||||
|
||||
/* OTP reads require powered-up chip */
|
||||
priv->cfg->ops->lib->apm_ops.init(priv);
|
||||
|
||||
ret = iwl_init_otp_access(priv);
|
||||
if (ret) {
|
||||
IWL_ERR(priv, "Failed to initialize OTP access.\n");
|
||||
@ -563,6 +567,13 @@ int iwl_eeprom_init(struct iwl_priv *priv)
|
||||
e[cache_addr / 2] = eeprom_data;
|
||||
cache_addr += sizeof(u16);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now that OTP reads are complete, reset chip to save
|
||||
* power until we load uCode during "up".
|
||||
*/
|
||||
priv->cfg->ops->lib->apm_ops.stop(priv);
|
||||
|
||||
} else {
|
||||
/* eeprom is an array of 16bit values */
|
||||
for (addr = 0; addr < sz; addr += sizeof(u16)) {
|
||||
|
@ -4000,13 +4000,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
||||
*/
|
||||
spin_lock_init(&priv->reg_lock);
|
||||
|
||||
/* amp init */
|
||||
err = priv->cfg->ops->lib->apm_ops.init(priv);
|
||||
if (err < 0) {
|
||||
IWL_DEBUG_INFO(priv, "Failed to init the card\n");
|
||||
goto out_iounmap;
|
||||
}
|
||||
|
||||
/***********************
|
||||
* 4. Read EEPROM
|
||||
* ********************/
|
||||
|
Loading…
Reference in New Issue
Block a user