static int wm8994_device_resume(struct device *dev) { struct wm8994 *wm8994 = dev_get_drvdata(dev); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(wm8994_main_supplies), wm8994->supplies); if (ret != 0) { dev_err(dev, "Failed to enable supplies: %d\n", ret); return ret; } ret = wm8994_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK, WM8994_NUM_IRQ_REGS * 2, &wm8994->irq_masks_cur); if (ret < 0) dev_err(dev, "Failed to restore interrupt masks: %d\n", ret); ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2, &wm8994->ldo_regs); if (ret < 0) dev_err(dev, "Failed to restore LDO registers: %d\n", ret); ret = wm8994_write(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2, &wm8994->gpio_regs); if (ret < 0) dev_err(dev, "Failed to restore GPIO registers: %d\n", ret); return 0; }
static int wm8523_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); u16 *reg_cache = codec->reg_cache; int ret, i; switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: /* Full power on */ snd_soc_update_bits(codec, WM8523_PSCTRL1, WM8523_SYS_ENA_MASK, 3); break; case SND_SOC_BIAS_STANDBY: if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { ret = regulator_bulk_enable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); return ret; } /* Initial power up */ snd_soc_update_bits(codec, WM8523_PSCTRL1, WM8523_SYS_ENA_MASK, 1); /* Sync back default/cached values */ for (i = WM8523_AIF_CTRL1; i < WM8523_MAX_REGISTER; i++) snd_soc_write(codec, i, reg_cache[i]); msleep(100); } /* Power up to mute */ snd_soc_update_bits(codec, WM8523_PSCTRL1, WM8523_SYS_ENA_MASK, 2); break; case SND_SOC_BIAS_OFF: /* The chip runs through the power down sequence for us. */ snd_soc_update_bits(codec, WM8523_PSCTRL1, WM8523_SYS_ENA_MASK, 0); msleep(100); regulator_bulk_disable(ARRAY_SIZE(wm8523->supplies), wm8523->supplies); break; } codec->dapm.bias_level = level; return 0; }
static int wm8994_resume(struct device *dev) { struct wm8994 *wm8994 = dev_get_drvdata(dev); int ret; /* We may have lied to the PM core about suspending */ if (!wm8994->suspended) return 0; ret = regulator_bulk_enable(wm8994->num_supplies, wm8994->supplies); if (ret != 0) { dev_err(dev, "Failed to enable supplies: %d\n", ret); return ret; } ret = wm8994_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK, WM8994_NUM_IRQ_REGS * 2, &wm8994->irq_masks_cur); if (ret < 0) dev_err(dev, "Failed to restore interrupt masks: %d\n", ret); ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2, &wm8994->ldo_regs); if (ret < 0) dev_err(dev, "Failed to restore LDO registers: %d\n", ret); ret = wm8994_write(wm8994, WM8994_GPIO_1, WM8994_NUM_GPIO_REGS * 2, &wm8994->gpio_regs); if (ret < 0) dev_err(dev, "Failed to restore GPIO registers: %d\n", ret); wm8994->suspended = false; return 0; }
static int ft5x06_ts_power_on(bool on) { int rc; rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_ft5x06), regs_ft5x06); if (rc) { printk("%s: could not get regulators: %d\n", __func__, rc); } rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_ft5x06), regs_ft5x06); if (rc) { printk("%s: could not set voltages: %d\n", __func__, rc); } rc = on ? regulator_bulk_enable(ARRAY_SIZE(regs_ft5x06), regs_ft5x06) : regulator_bulk_disable(ARRAY_SIZE(regs_ft5x06), regs_ft5x06); if (rc) pr_err("%s: could not %sable regulators: %d\n", __func__, on ? "en" : "dis", rc); else msleep(50); return rc; }
static int cs4270_soc_resume(struct platform_device *pdev) { struct snd_soc_codec *codec = cs4270_codec; struct cs4270_private *cs4270 = codec->private_data; struct i2c_client *i2c_client = codec->control_data; int reg; regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies); /* In case the device was put to hard reset during sleep, we need to * wait 500ns here before any I2C communication. */ ndelay(500); /* first restore the entire register cache ... */ for (reg = CS4270_FIRSTREG; reg <= CS4270_LASTREG; reg++) { u8 val = snd_soc_read(codec, reg); if (i2c_smbus_write_byte_data(i2c_client, reg, val)) { dev_err(codec->dev, "i2c write failed\n"); return -EIO; } } /* ... then disable the power-down bits */ reg = snd_soc_read(codec, CS4270_PWRCTL); reg &= ~CS4270_PWRCTL_PDN_ALL; return snd_soc_write(codec, CS4270_PWRCTL, reg); }
static void twl6040_vibra_enable(struct vibra_info *info) { struct twl6040 *twl6040 = info->twl6040; int ret; ret = regulator_bulk_enable(ARRAY_SIZE(info->supplies), info->supplies); if (ret) { dev_err(info->dev, "failed to enable regulators %d\n", ret); return; } twl6040_power(info->twl6040, 1); if (twl6040_get_revid(twl6040) <= TWL6040_REV_ES1_1) { /* */ twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, TWL6040_VIBENA | TWL6040_VIBCTRL); twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, TWL6040_VIBENA | TWL6040_VIBCTRL); usleep_range(3000, 3500); } twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, TWL6040_VIBENA); twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, TWL6040_VIBENA); info->enabled = true; }
static int msm_fb_lcdc_power_save(int on) { int rc = 0; /* Doing the init of the LCDC GPIOs very late as they are from an I2C-controlled IO Expander */ lcdc_toshiba_gpio_init(); if (lcdc_gpio_initialized) { gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, on); /*++ Huize - 20120927 Modify for identifying what the code is used by customization ++*/ #ifndef DISPLAY_CUSTOMIZATION gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, on); #endif /*-- Huize - 20120927 Modify for identifying what the code is used by customization --*/ rc = on ? regulator_bulk_enable( ARRAY_SIZE(regs_lcdc), regs_lcdc) : regulator_bulk_disable( ARRAY_SIZE(regs_lcdc), regs_lcdc); if (rc) pr_err("%s: could not %sable regulators: %d\n", __func__, on ? "en" : "dis", rc); } return rc; }
static int aic31xx_set_power(struct snd_soc_codec *codec, int power) { struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); int ret; dev_dbg(codec->dev, "## %s: %d\n", __func__, power); if (power) { ret = regulator_bulk_enable(ARRAY_SIZE(aic31xx->supplies), aic31xx->supplies); if (ret) return ret; aic31xx->power = 1; if (gpio_is_valid(aic31xx->pdata.gpio_reset)) { gpio_set_value(aic31xx->pdata.gpio_reset, 1); mdelay(10); } } else { /* * Do soft reset to this codec instance in order to clear * possible VDD leakage currents in case the supply regulators * remain on */ snd_soc_write(codec, AIC31XX_RESET, 0x01); if (gpio_is_valid(aic31xx->pdata.gpio_reset)) gpio_set_value(aic31xx->pdata.gpio_reset, 0); aic31xx->power = 0; ret = regulator_bulk_disable(ARRAY_SIZE(aic31xx->supplies), aic31xx->supplies); } return ret; }
/** * cs4270_probe - ASoC probe function * @pdev: platform device * * This function is called when ASoC has all the pieces it needs to * instantiate a sound driver. */ static int cs4270_probe(struct snd_soc_codec *codec) { struct cs4270_private *cs4270 = snd_soc_codec_get_drvdata(codec); int ret; /* Disable auto-mute. This feature appears to be buggy. In some * situations, auto-mute will not deactivate when it should, so we want * this feature disabled by default. An application (e.g. alsactl) can * re-enabled it by using the controls. */ ret = snd_soc_update_bits(codec, CS4270_MUTE, CS4270_MUTE_AUTO, 0); if (ret < 0) { dev_err(codec->dev, "i2c write failed\n"); return ret; } /* Disable automatic volume control. The hardware enables, and it * causes volume change commands to be delayed, sometimes until after * playback has started. An application (e.g. alsactl) can * re-enabled it by using the controls. */ ret = snd_soc_update_bits(codec, CS4270_TRANS, CS4270_TRANS_SOFT | CS4270_TRANS_ZERO, 0); if (ret < 0) { dev_err(codec->dev, "i2c write failed\n"); return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(cs4270->supplies), cs4270->supplies); return ret; }
static int __dwc2_lowlevel_hw_enable(struct dwc2_hsotg *hsotg) { struct platform_device *pdev = to_platform_device(hsotg->dev); int ret; ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies), hsotg->supplies); if (ret) return ret; ret = clk_prepare_enable(hsotg->clk); if (ret) return ret; if (hsotg->uphy) ret = usb_phy_init(hsotg->uphy); else if (hsotg->plat && hsotg->plat->phy_init) ret = hsotg->plat->phy_init(pdev, hsotg->plat->phy_type); else { ret = phy_power_on(hsotg->phy); if (ret == 0) ret = phy_init(hsotg->phy); } return ret; }
static int es8328_codec_probe(struct snd_soc_codec *codec) { struct es8328_priv *es8328; int ret; es8328 = snd_soc_codec_get_drvdata(codec); ret = regulator_bulk_enable(ARRAY_SIZE(es8328->supplies), es8328->supplies); if (ret) { dev_err(codec->dev, "unable to enable regulators\n"); return ret; } /* Setup clocks */ es8328->clk = devm_clk_get(codec->dev, NULL); if (IS_ERR(es8328->clk)) { dev_err(codec->dev, "codec clock missing or invalid\n"); ret = PTR_ERR(es8328->clk); goto clk_fail; } ret = clk_prepare_enable(es8328->clk); if (ret) { dev_err(codec->dev, "unable to prepare codec clk\n"); goto clk_fail; } return 0; clk_fail: regulator_bulk_disable(ARRAY_SIZE(es8328->supplies), es8328->supplies); return ret; }
static void twl6040_vibra_enable(struct vibra_info *info) { struct twl6040 *twl6040 = info->twl6040; int ret; ret = regulator_bulk_enable(ARRAY_SIZE(info->supplies), info->supplies); if (ret) { dev_err(info->dev, "failed to enable regulators %d\n", ret); return; } twl6040_power(info->twl6040, 1); if (twl6040_get_revid(twl6040) <= TWL6040_REV_ES1_1) { /* * ERRATA: Disable overcurrent protection for at least * 3ms when enabling vibrator drivers to avoid false * overcurrent detection */ twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, TWL6040_VIBENA | TWL6040_VIBCTRL); twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, TWL6040_VIBENA | TWL6040_VIBCTRL); usleep_range(3000, 3500); } twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, TWL6040_VIBENA); twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, TWL6040_VIBENA); info->enabled = true; }
static int aic31xx_power_on(struct snd_soc_codec *codec) { struct aic31xx_priv *aic31xx = snd_soc_codec_get_drvdata(codec); int ret = 0; ret = regulator_bulk_enable(ARRAY_SIZE(aic31xx->supplies), aic31xx->supplies); if (ret) return ret; if (gpio_is_valid(aic31xx->pdata.gpio_reset)) { gpio_set_value(aic31xx->pdata.gpio_reset, 1); udelay(100); } regcache_cache_only(aic31xx->regmap, false); ret = regcache_sync(aic31xx->regmap); if (ret != 0) { dev_err(codec->dev, "Failed to restore cache: %d\n", ret); regcache_cache_only(aic31xx->regmap, true); regulator_bulk_disable(ARRAY_SIZE(aic31xx->supplies), aic31xx->supplies); return ret; } return 0; }
static int mpu3050_power_up(struct mpu3050 *mpu3050) { int ret; ret = regulator_bulk_enable(ARRAY_SIZE(mpu3050->regs), mpu3050->regs); if (ret) { dev_err(mpu3050->dev, "cannot enable regulators\n"); return ret; } /* * 20-100 ms start-up time for register read/write according to * the datasheet, be on the safe side and wait 200 ms. */ msleep(200); /* Take device out of sleep mode */ ret = regmap_update_bits(mpu3050->map, MPU3050_PWR_MGM, MPU3050_PWR_MGM_SLEEP, 0); if (ret) { dev_err(mpu3050->dev, "error setting power mode\n"); return ret; } msleep(10); return 0; }
static int es8328_resume(struct snd_soc_codec *codec) { struct regmap *regmap = dev_get_regmap(codec->dev, NULL); struct es8328_priv *es8328; int ret; es8328 = snd_soc_codec_get_drvdata(codec); ret = clk_prepare_enable(es8328->clk); if (ret) { dev_err(codec->dev, "unable to enable clock\n"); return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(es8328->supplies), es8328->supplies); if (ret) { dev_err(codec->dev, "unable to enable regulators\n"); return ret; } regcache_mark_dirty(regmap); ret = regcache_sync(regmap); if (ret) { dev_err(codec->dev, "unable to sync regcache\n"); return ret; } return 0; }
/** * sta350_set_bias_level - DAPM callback * @codec: the codec device * @level: DAPM power level * * This is called by ALSA to put the codec into low power mode * or to wake it up. If the codec is powered off completely * all registers must be restored after power on. */ static int sta350_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { struct sta350_priv *sta350 = snd_soc_codec_get_drvdata(codec); int ret; dev_dbg(codec->dev, "level = %d\n", level); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: /* Full power on */ regmap_update_bits(sta350->regmap, STA350_CONFF, STA350_CONFF_PWDN | STA350_CONFF_EAPD, STA350_CONFF_PWDN | STA350_CONFF_EAPD); break; case SND_SOC_BIAS_STANDBY: if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { ret = regulator_bulk_enable( ARRAY_SIZE(sta350->supplies), sta350->supplies); if (ret < 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); return ret; } sta350_startup_sequence(sta350); sta350_cache_sync(codec); } /* Power down */ regmap_update_bits(sta350->regmap, STA350_CONFF, STA350_CONFF_PWDN | STA350_CONFF_EAPD, 0); break; case SND_SOC_BIAS_OFF: /* The chip runs through the power down sequence for us */ regmap_update_bits(sta350->regmap, STA350_CONFF, STA350_CONFF_PWDN | STA350_CONFF_EAPD, 0); /* power down: low */ if (sta350->gpiod_power_down) gpiod_set_value(sta350->gpiod_power_down, 0); if (sta350->gpiod_nreset) gpiod_set_value(sta350->gpiod_nreset, 0); regulator_bulk_disable(ARRAY_SIZE(sta350->supplies), sta350->supplies); break; } codec->dapm.bias_level = level; return 0; }
static int wm8741_probe(struct snd_soc_codec *codec) { struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); int ret = 0; int i; for (i = 0; i < ARRAY_SIZE(wm8741->supplies); i++) wm8741->supplies[i].supply = wm8741_supply_names[i]; ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8741->supplies), wm8741->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); goto err; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); goto err_get; } ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); goto err_enable; } ret = wm8741_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); goto err_enable; } /* Change some default settings - latch VU */ snd_soc_update_bits(codec, WM8741_DACLLSB_ATTENUATION, WM8741_UPDATELL, WM8741_UPDATELL); snd_soc_update_bits(codec, WM8741_DACLMSB_ATTENUATION, WM8741_UPDATELM, WM8741_UPDATELM); snd_soc_update_bits(codec, WM8741_DACRLSB_ATTENUATION, WM8741_UPDATERL, WM8741_UPDATERL); snd_soc_update_bits(codec, WM8741_DACRMSB_ATTENUATION, WM8741_UPDATERM, WM8741_UPDATERM); snd_soc_add_controls(codec, wm8741_snd_controls, ARRAY_SIZE(wm8741_snd_controls)); wm8741_add_widgets(codec); dev_dbg(codec->dev, "Successful registration\n"); return ret; err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); err_get: regulator_bulk_free(ARRAY_SIZE(wm8741->supplies), wm8741->supplies); err: return ret; }
static int wm8731_probe(struct snd_soc_codec *codec) { struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); int ret = 0, i; codec->control_data = wm8731->regmap; ret = snd_soc_codec_set_cache_io(codec, 7, 9, SND_SOC_REGMAP); if (ret < 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); return ret; } for (i = 0; i < ARRAY_SIZE(wm8731->supplies); i++) wm8731->supplies[i].supply = wm8731_supply_names[i]; ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8731->supplies), wm8731->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); goto err_regulator_get; } ret = wm8731_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset: %d\n", ret); goto err_regulator_enable; } wm8731_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* Latch the update bits */ snd_soc_update_bits(codec, WM8731_LOUT1V, 0x100, 0); snd_soc_update_bits(codec, WM8731_ROUT1V, 0x100, 0); snd_soc_update_bits(codec, WM8731_LINVOL, 0x100, 0); snd_soc_update_bits(codec, WM8731_RINVOL, 0x100, 0); /* Disable bypass path by default */ snd_soc_update_bits(codec, WM8731_APANA, 0x8, 0); /* Regulators will have been enabled by bias management */ regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); return 0; err_regulator_enable: regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); err_regulator_get: regulator_bulk_free(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); return ret; }
static int tas6424_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct tas6424_data *tas6424; int ret; int i; tas6424 = devm_kzalloc(dev, sizeof(*tas6424), GFP_KERNEL); if (!tas6424) return -ENOMEM; dev_set_drvdata(dev, tas6424); tas6424->dev = dev; tas6424->regmap = devm_regmap_init_i2c(client, &tas6424_regmap_config); if (IS_ERR(tas6424->regmap)) { ret = PTR_ERR(tas6424->regmap); dev_err(dev, "unable to allocate register map: %d\n", ret); return ret; } for (i = 0; i < ARRAY_SIZE(tas6424->supplies); i++) tas6424->supplies[i].supply = tas6424_supply_names[i]; ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(tas6424->supplies), tas6424->supplies); if (ret) { dev_err(dev, "unable to request supplies: %d\n", ret); return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(tas6424->supplies), tas6424->supplies); if (ret) { dev_err(dev, "unable to enable supplies: %d\n", ret); return ret; } /* Reset device to establish well-defined startup state */ ret = regmap_update_bits(tas6424->regmap, TAS6424_MODE_CTRL, TAS6424_RESET, TAS6424_RESET); if (ret) { dev_err(dev, "unable to reset device: %d\n", ret); return ret; } INIT_DELAYED_WORK(&tas6424->fault_check_work, tas6424_fault_check_work); ret = snd_soc_register_codec(dev, &soc_codec_dev_tas6424, tas6424_dai, ARRAY_SIZE(tas6424_dai)); if (ret < 0) { dev_err(dev, "unable to register codec: %d\n", ret); return ret; } return 0; }
static int wm8737_probe(struct snd_soc_codec *codec) { struct wm8737_priv *wm8737 = snd_soc_codec_get_drvdata(codec); int ret, i; ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8737->control_type); if (ret != 0) { dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); return ret; } for (i = 0; i < ARRAY_SIZE(wm8737->supplies); i++) wm8737->supplies[i].supply = wm8737_supply_names[i]; ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8737->supplies), wm8737->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to request supplies: %d\n", ret); return ret; } ret = regulator_bulk_enable(ARRAY_SIZE(wm8737->supplies), wm8737->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); goto err_get; } ret = wm8737_reset(codec); if (ret < 0) { dev_err(codec->dev, "Failed to issue reset\n"); goto err_enable; } snd_soc_update_bits(codec, WM8737_LEFT_PGA_VOLUME, WM8737_LVU, WM8737_LVU); snd_soc_update_bits(codec, WM8737_RIGHT_PGA_VOLUME, WM8737_RVU, WM8737_RVU); wm8737_set_bias_level(codec, SND_SOC_BIAS_STANDBY); /* Bias level configuration will have done an extra enable */ regulator_bulk_disable(ARRAY_SIZE(wm8737->supplies), wm8737->supplies); snd_soc_add_controls(codec, wm8737_snd_controls, ARRAY_SIZE(wm8737_snd_controls)); wm8737_add_widgets(codec); return 0; err_enable: regulator_bulk_disable(ARRAY_SIZE(wm8737->supplies), wm8737->supplies); err_get: regulator_bulk_free(ARRAY_SIZE(wm8737->supplies), wm8737->supplies); return ret; }
static int cs4271_codec_probe(struct snd_soc_codec *codec) { struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); struct cs4271_platform_data *cs4271plat = codec->dev->platform_data; int ret; bool amutec_eq_bmutec = false; #ifdef CONFIG_OF if (of_match_device(cs4271_dt_ids, codec->dev)) { if (of_get_property(codec->dev->of_node, "cirrus,amutec-eq-bmutec", NULL)) amutec_eq_bmutec = true; if (of_get_property(codec->dev->of_node, "cirrus,enable-soft-reset", NULL)) cs4271->enable_soft_reset = true; } #endif ret = regulator_bulk_enable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); if (ret < 0) { dev_err(codec->dev, "Failed to enable regulators: %d\n", ret); return ret; } if (cs4271plat) { amutec_eq_bmutec = cs4271plat->amutec_eq_bmutec; cs4271->enable_soft_reset = cs4271plat->enable_soft_reset; } /* Reset codec */ cs4271_reset(codec); ret = regcache_sync(cs4271->regmap); if (ret < 0) return ret; ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, CS4271_MODE2_PDN | CS4271_MODE2_CPEN, CS4271_MODE2_PDN | CS4271_MODE2_CPEN); if (ret < 0) return ret; ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, CS4271_MODE2_PDN, 0); if (ret < 0) return ret; /* Power-up sequence requires 85 uS */ udelay(85); if (amutec_eq_bmutec) regmap_update_bits(cs4271->regmap, CS4271_MODE2, CS4271_MODE2_MUTECAEQUB, CS4271_MODE2_MUTECAEQUB); return 0; }
static int ak8974_regulators_on(struct ak8974_chip *chip) { int ret; ret = regulator_bulk_enable(ARRAY_SIZE(chip->regs), chip->regs); if (ret == 0) msleep(AK8974_POWERON_DELAY); return ret; }
static int regulator_userspace_consumer_probe(struct platform_device *pdev) { struct regulator_userspace_consumer_data *pdata; struct userspace_consumer_data *drvdata; int ret; pdata = pdev->dev.platform_data; if (!pdata) return -EINVAL; drvdata = kzalloc(sizeof(struct userspace_consumer_data), GFP_KERNEL); if (drvdata == NULL) return -ENOMEM; drvdata->name = pdata->name; drvdata->num_supplies = pdata->num_supplies; drvdata->supplies = pdata->supplies; mutex_init(&drvdata->lock); ret = regulator_bulk_get(&pdev->dev, drvdata->num_supplies, drvdata->supplies); if (ret) { dev_err(&pdev->dev, "Failed to get supplies: %d\n", ret); goto err_alloc_supplies; } ret = sysfs_create_group(&pdev->dev.kobj, &attr_group); if (ret != 0) goto err_create_attrs; if (pdata->init_on) { ret = regulator_bulk_enable(drvdata->num_supplies, drvdata->supplies); if (ret) { dev_err(&pdev->dev, "Failed to set initial state: %d\n", ret); goto err_enable; } } drvdata->enabled = pdata->init_on; platform_set_drvdata(pdev, drvdata); return 0; err_enable: sysfs_remove_group(&pdev->dev.kobj, &attr_group); err_create_attrs: regulator_bulk_free(drvdata->num_supplies, drvdata->supplies); err_alloc_supplies: kfree(drvdata); return ret; }
/** * sta32x_set_bias_level - DAPM callback * @codec: the codec device * @level: DAPM power level * * This is called by ALSA to put the codec into low power mode * or to wake it up. If the codec is powered off completely * all registers must be restored after power on. */ static int sta32x_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { int ret; struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); dev_dbg(codec->dev, "level = %d\n", level); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: /* Full power on */ regmap_update_bits(sta32x->regmap, STA32X_CONFF, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD); break; case SND_SOC_BIAS_STANDBY: if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) { ret = regulator_bulk_enable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); return ret; } sta32x_startup_sequence(sta32x); sta32x_cache_sync(codec); sta32x_watchdog_start(sta32x); } /* Power down */ regmap_update_bits(sta32x->regmap, STA32X_CONFF, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD, 0); break; case SND_SOC_BIAS_OFF: /* The chip runs through the power down sequence for us. */ regmap_update_bits(sta32x->regmap, STA32X_CONFF, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD, 0); msleep(300); sta32x_watchdog_stop(sta32x); if (sta32x->gpiod_nreset) gpiod_set_value(sta32x->gpiod_nreset, 0); regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); break; } return 0; }
static void msm_camera_vreg_config(int vreg_en) { int rc = vreg_en ? regulator_bulk_enable(ARRAY_SIZE(regs_camera), regs_camera) : regulator_bulk_disable(ARRAY_SIZE(regs_camera), regs_camera); if (rc) pr_err("%s: could not %sable regulators: %d\n", __func__, vreg_en ? "en" : "dis", rc); }
int m6mo_mipi_cam_power(int enable) { struct regulator_bulk_data supplies[5]; int num_consumers = ARRAY_SIZE(supplies); unsigned int gpio, front_gpio; int ret; pr_info("%s():%d\n", __FUNCTION__, enable); if (machine_is_m030()) { supplies[0].supply = "cam_isp_1.8v"; supplies[1].supply = "cam_isp_core"; supplies[2].supply = "cam_sensor_2.7v"; supplies[3].supply = "cam_sensor_1.2v"; supplies[4].supply = "cam_af_2.7v"; gpio = M030_GPIO_CAMERA0_RST; front_gpio = M030_GPIO_CAMERA1_PDN; } else { supplies[0].supply = "cam_1.8v"; supplies[1].supply = "cam0_isp_1.2v"; supplies[2].supply = "cam0_sensor_1.2v"; supplies[3].supply = "cam0_sensor_2.7v"; supplies[4].supply = "cam0_af_2.7v"; gpio = BACK_CAM_RST; front_gpio = FRONT_CAM_DOWN; } ret = regulator_bulk_get(NULL, num_consumers, supplies); if (ret) { pr_err("%s():regulator_bulk_get failed\n", __func__); return ret; } if (enable) { gpio_set_value(front_gpio, 1); ret = regulator_bulk_enable(num_consumers, supplies); gpio_set_value(gpio, 1); } else { gpio_set_value(gpio, 0); ret = regulator_bulk_disable(num_consumers, supplies); gpio_set_value(front_gpio, 0); } if (ret) { pr_err("%s():regulator_bulk_%sable failed\n", __func__, enable?"en":"dis"); goto exit_regulator; } usleep_range(5000, 5000); exit_regulator: regulator_bulk_free(num_consumers, supplies); return ret; }
int sku3_lcdc_lcd_camera_power_onoff(int on) { int rc = 0; u32 socinfo = socinfo_get_platform_type(); static int refcount = 0; if (on) { if (refcount > 0) { refcount++; return rc; } if (socinfo == 0x0B) gpio_set_value_cansleep(SKU3_LCDC_LCD_CAMERA_LDO_1V8, 1); else if (socinfo == 0x0F || machine_is_msm8625_qrd7()) gpio_set_value_cansleep(SKU3_1_LCDC_LCD_CAMERA_LDO_1V8, 1); gpio_set_value_cansleep(SKU3_LCDC_LCD_CAMERA_LDO_2V8, 1); rc = regulator_bulk_enable(ARRAY_SIZE(regs_truly_lcdc), regs_truly_lcdc); if (rc) pr_err("%s: could not enable regulators: %d\n", __func__, rc); else refcount++; } else { if (refcount > 1) { refcount--; return rc; } if (socinfo == 0x0B) gpio_set_value_cansleep(SKU3_LCDC_LCD_CAMERA_LDO_1V8, 0); else if (socinfo == 0x0F || machine_is_msm8625_qrd7()) gpio_set_value_cansleep(SKU3_1_LCDC_LCD_CAMERA_LDO_1V8, 0); gpio_set_value_cansleep(SKU3_LCDC_LCD_CAMERA_LDO_2V8, 0); rc = regulator_bulk_disable(ARRAY_SIZE(regs_truly_lcdc), regs_truly_lcdc); if (rc) pr_err("%s: could not disable regulators: %d\n", __func__, rc); else refcount--; } return rc; }
/** * sta32x_set_bias_level - DAPM callback * @codec: the codec device * @level: DAPM power level * * This is called by ALSA to put the codec into low power mode * or to wake it up. If the codec is powered off completely * all registers must be restored after power on. */ static int sta32x_set_bias_level(struct snd_soc_codec *codec, enum snd_soc_bias_level level) { int ret; struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec); pr_debug("level = %d\n", level); switch (level) { case SND_SOC_BIAS_ON: break; case SND_SOC_BIAS_PREPARE: /* Full power on */ snd_soc_update_bits(codec, STA32X_CONFF, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD); break; case SND_SOC_BIAS_STANDBY: if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { ret = regulator_bulk_enable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); if (ret != 0) { dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); return ret; } sta32x_cache_sync(codec); } /* Power up to mute */ /* FIXME */ snd_soc_update_bits(codec, STA32X_CONFF, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD); break; case SND_SOC_BIAS_OFF: /* The chip runs through the power down sequence for us. */ snd_soc_update_bits(codec, STA32X_CONFF, STA32X_CONFF_PWDN | STA32X_CONFF_EAPD, STA32X_CONFF_PWDN); msleep(300); regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies); break; } codec->dapm.bias_level = level; return 0; }
/* * si4713_powerup - Powers the device up * @sdev: si4713_device structure for the device we are communicating */ static int si4713_powerup(struct si4713_device *sdev) { int err; u8 resp[SI4713_PWUP_NRESP]; /* * .First byte = Enabled interrupts and boot function * .Second byte = Input operation mode */ const u8 args[SI4713_PWUP_NARGS] = { SI4713_PWUP_CTSIEN | SI4713_PWUP_GPO2OEN | SI4713_PWUP_FUNC_TX, SI4713_PWUP_OPMOD_ANALOG, }; if (sdev->power_state) return 0; err = regulator_bulk_enable(ARRAY_SIZE(sdev->supplies), sdev->supplies); if (err) { v4l2_err(&sdev->sd, "Failed to enable supplies: %d\n", err); return err; } if (gpio_is_valid(sdev->gpio_reset)) { udelay(50); gpio_set_value(sdev->gpio_reset, 1); } err = si4713_send_command(sdev, SI4713_CMD_POWER_UP, args, ARRAY_SIZE(args), resp, ARRAY_SIZE(resp), TIMEOUT_POWER_UP); if (!err) { v4l2_dbg(1, debug, &sdev->sd, "Powerup response: 0x%02x\n", resp[0]); v4l2_dbg(1, debug, &sdev->sd, "Device in power up mode\n"); sdev->power_state = POWER_ON; err = si4713_write_property(sdev, SI4713_GPO_IEN, SI4713_STC_INT | SI4713_CTS); } else { if (gpio_is_valid(sdev->gpio_reset)) gpio_set_value(sdev->gpio_reset, 0); err = regulator_bulk_disable(ARRAY_SIZE(sdev->supplies), sdev->supplies); if (err) v4l2_err(&sdev->sd, "Failed to disable supplies: %d\n", err); } return err; }
static int lis3_reg_ctrl(struct lis3lv02d *lis3, bool state) { int ret; if (state == LIS3_REG_OFF) { ret = regulator_bulk_disable(ARRAY_SIZE(lis3->regulators), lis3->regulators); } else { ret = regulator_bulk_enable(ARRAY_SIZE(lis3->regulators), lis3->regulators); /* Chip needs time to wakeup. Not mentioned in datasheet */ usleep_range(10000, 20000); } return ret; }