cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

arizona-core.c (34383B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Arizona core driver
      4 *
      5 * Copyright 2012 Wolfson Microelectronics plc
      6 *
      7 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
      8 */
      9
     10#include <linux/clk.h>
     11#include <linux/delay.h>
     12#include <linux/err.h>
     13#include <linux/gpio/consumer.h>
     14#include <linux/interrupt.h>
     15#include <linux/mfd/core.h>
     16#include <linux/module.h>
     17#include <linux/of.h>
     18#include <linux/of_device.h>
     19#include <linux/pm_runtime.h>
     20#include <linux/regmap.h>
     21#include <linux/regulator/consumer.h>
     22#include <linux/regulator/machine.h>
     23#include <linux/slab.h>
     24#include <linux/ktime.h>
     25#include <linux/platform_device.h>
     26
     27#include <linux/mfd/arizona/core.h>
     28#include <linux/mfd/arizona/registers.h>
     29
     30#include "arizona.h"
     31
     32static const char * const wm5102_core_supplies[] = {
     33	"AVDD",
     34	"DBVDD1",
     35};
     36
     37int arizona_clk32k_enable(struct arizona *arizona)
     38{
     39	int ret = 0;
     40
     41	mutex_lock(&arizona->clk_lock);
     42
     43	arizona->clk32k_ref++;
     44
     45	if (arizona->clk32k_ref == 1) {
     46		switch (arizona->pdata.clk32k_src) {
     47		case ARIZONA_32KZ_MCLK1:
     48			ret = pm_runtime_get_sync(arizona->dev);
     49			if (ret != 0)
     50				goto err_ref;
     51			ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK1]);
     52			if (ret != 0) {
     53				pm_runtime_put_sync(arizona->dev);
     54				goto err_ref;
     55			}
     56			break;
     57		case ARIZONA_32KZ_MCLK2:
     58			ret = clk_prepare_enable(arizona->mclk[ARIZONA_MCLK2]);
     59			if (ret != 0)
     60				goto err_ref;
     61			break;
     62		}
     63
     64		ret = regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1,
     65					 ARIZONA_CLK_32K_ENA,
     66					 ARIZONA_CLK_32K_ENA);
     67	}
     68
     69err_ref:
     70	if (ret != 0)
     71		arizona->clk32k_ref--;
     72
     73	mutex_unlock(&arizona->clk_lock);
     74
     75	return ret;
     76}
     77EXPORT_SYMBOL_GPL(arizona_clk32k_enable);
     78
     79int arizona_clk32k_disable(struct arizona *arizona)
     80{
     81	mutex_lock(&arizona->clk_lock);
     82
     83	WARN_ON(arizona->clk32k_ref <= 0);
     84
     85	arizona->clk32k_ref--;
     86
     87	if (arizona->clk32k_ref == 0) {
     88		regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1,
     89				   ARIZONA_CLK_32K_ENA, 0);
     90
     91		switch (arizona->pdata.clk32k_src) {
     92		case ARIZONA_32KZ_MCLK1:
     93			pm_runtime_put_sync(arizona->dev);
     94			clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK1]);
     95			break;
     96		case ARIZONA_32KZ_MCLK2:
     97			clk_disable_unprepare(arizona->mclk[ARIZONA_MCLK2]);
     98			break;
     99		}
    100	}
    101
    102	mutex_unlock(&arizona->clk_lock);
    103
    104	return 0;
    105}
    106EXPORT_SYMBOL_GPL(arizona_clk32k_disable);
    107
    108static irqreturn_t arizona_clkgen_err(int irq, void *data)
    109{
    110	struct arizona *arizona = data;
    111
    112	dev_err(arizona->dev, "CLKGEN error\n");
    113
    114	return IRQ_HANDLED;
    115}
    116
    117static irqreturn_t arizona_underclocked(int irq, void *data)
    118{
    119	struct arizona *arizona = data;
    120	unsigned int val;
    121	int ret;
    122
    123	ret = regmap_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_8,
    124			  &val);
    125	if (ret != 0) {
    126		dev_err(arizona->dev, "Failed to read underclock status: %d\n",
    127			ret);
    128		return IRQ_NONE;
    129	}
    130
    131	if (val & ARIZONA_AIF3_UNDERCLOCKED_STS)
    132		dev_err(arizona->dev, "AIF3 underclocked\n");
    133	if (val & ARIZONA_AIF2_UNDERCLOCKED_STS)
    134		dev_err(arizona->dev, "AIF2 underclocked\n");
    135	if (val & ARIZONA_AIF1_UNDERCLOCKED_STS)
    136		dev_err(arizona->dev, "AIF1 underclocked\n");
    137	if (val & ARIZONA_ISRC3_UNDERCLOCKED_STS)
    138		dev_err(arizona->dev, "ISRC3 underclocked\n");
    139	if (val & ARIZONA_ISRC2_UNDERCLOCKED_STS)
    140		dev_err(arizona->dev, "ISRC2 underclocked\n");
    141	if (val & ARIZONA_ISRC1_UNDERCLOCKED_STS)
    142		dev_err(arizona->dev, "ISRC1 underclocked\n");
    143	if (val & ARIZONA_FX_UNDERCLOCKED_STS)
    144		dev_err(arizona->dev, "FX underclocked\n");
    145	if (val & ARIZONA_ASRC_UNDERCLOCKED_STS)
    146		dev_err(arizona->dev, "ASRC underclocked\n");
    147	if (val & ARIZONA_DAC_UNDERCLOCKED_STS)
    148		dev_err(arizona->dev, "DAC underclocked\n");
    149	if (val & ARIZONA_ADC_UNDERCLOCKED_STS)
    150		dev_err(arizona->dev, "ADC underclocked\n");
    151	if (val & ARIZONA_MIXER_UNDERCLOCKED_STS)
    152		dev_err(arizona->dev, "Mixer dropped sample\n");
    153
    154	return IRQ_HANDLED;
    155}
    156
    157static irqreturn_t arizona_overclocked(int irq, void *data)
    158{
    159	struct arizona *arizona = data;
    160	unsigned int val[3];
    161	int ret;
    162
    163	ret = regmap_bulk_read(arizona->regmap, ARIZONA_INTERRUPT_RAW_STATUS_6,
    164			       &val[0], 3);
    165	if (ret != 0) {
    166		dev_err(arizona->dev, "Failed to read overclock status: %d\n",
    167			ret);
    168		return IRQ_NONE;
    169	}
    170
    171	switch (arizona->type) {
    172	case WM8998:
    173	case WM1814:
    174		/* Some bits are shifted on WM8998,
    175		 * rearrange to match the standard bit layout
    176		 */
    177		val[0] = ((val[0] & 0x60e0) >> 1) |
    178			 ((val[0] & 0x1e00) >> 2) |
    179			 (val[0] & 0x000f);
    180		break;
    181	default:
    182		break;
    183	}
    184
    185	if (val[0] & ARIZONA_PWM_OVERCLOCKED_STS)
    186		dev_err(arizona->dev, "PWM overclocked\n");
    187	if (val[0] & ARIZONA_FX_CORE_OVERCLOCKED_STS)
    188		dev_err(arizona->dev, "FX core overclocked\n");
    189	if (val[0] & ARIZONA_DAC_SYS_OVERCLOCKED_STS)
    190		dev_err(arizona->dev, "DAC SYS overclocked\n");
    191	if (val[0] & ARIZONA_DAC_WARP_OVERCLOCKED_STS)
    192		dev_err(arizona->dev, "DAC WARP overclocked\n");
    193	if (val[0] & ARIZONA_ADC_OVERCLOCKED_STS)
    194		dev_err(arizona->dev, "ADC overclocked\n");
    195	if (val[0] & ARIZONA_MIXER_OVERCLOCKED_STS)
    196		dev_err(arizona->dev, "Mixer overclocked\n");
    197	if (val[0] & ARIZONA_AIF3_SYNC_OVERCLOCKED_STS)
    198		dev_err(arizona->dev, "AIF3 overclocked\n");
    199	if (val[0] & ARIZONA_AIF2_SYNC_OVERCLOCKED_STS)
    200		dev_err(arizona->dev, "AIF2 overclocked\n");
    201	if (val[0] & ARIZONA_AIF1_SYNC_OVERCLOCKED_STS)
    202		dev_err(arizona->dev, "AIF1 overclocked\n");
    203	if (val[0] & ARIZONA_PAD_CTRL_OVERCLOCKED_STS)
    204		dev_err(arizona->dev, "Pad control overclocked\n");
    205
    206	if (val[1] & ARIZONA_SLIMBUS_SUBSYS_OVERCLOCKED_STS)
    207		dev_err(arizona->dev, "Slimbus subsystem overclocked\n");
    208	if (val[1] & ARIZONA_SLIMBUS_ASYNC_OVERCLOCKED_STS)
    209		dev_err(arizona->dev, "Slimbus async overclocked\n");
    210	if (val[1] & ARIZONA_SLIMBUS_SYNC_OVERCLOCKED_STS)
    211		dev_err(arizona->dev, "Slimbus sync overclocked\n");
    212	if (val[1] & ARIZONA_ASRC_ASYNC_SYS_OVERCLOCKED_STS)
    213		dev_err(arizona->dev, "ASRC async system overclocked\n");
    214	if (val[1] & ARIZONA_ASRC_ASYNC_WARP_OVERCLOCKED_STS)
    215		dev_err(arizona->dev, "ASRC async WARP overclocked\n");
    216	if (val[1] & ARIZONA_ASRC_SYNC_SYS_OVERCLOCKED_STS)
    217		dev_err(arizona->dev, "ASRC sync system overclocked\n");
    218	if (val[1] & ARIZONA_ASRC_SYNC_WARP_OVERCLOCKED_STS)
    219		dev_err(arizona->dev, "ASRC sync WARP overclocked\n");
    220	if (val[1] & ARIZONA_ADSP2_1_OVERCLOCKED_STS)
    221		dev_err(arizona->dev, "DSP1 overclocked\n");
    222	if (val[1] & ARIZONA_ISRC3_OVERCLOCKED_STS)
    223		dev_err(arizona->dev, "ISRC3 overclocked\n");
    224	if (val[1] & ARIZONA_ISRC2_OVERCLOCKED_STS)
    225		dev_err(arizona->dev, "ISRC2 overclocked\n");
    226	if (val[1] & ARIZONA_ISRC1_OVERCLOCKED_STS)
    227		dev_err(arizona->dev, "ISRC1 overclocked\n");
    228
    229	if (val[2] & ARIZONA_SPDIF_OVERCLOCKED_STS)
    230		dev_err(arizona->dev, "SPDIF overclocked\n");
    231
    232	return IRQ_HANDLED;
    233}
    234
    235#define ARIZONA_REG_POLL_DELAY_US 7500
    236
    237static inline bool arizona_poll_reg_delay(ktime_t timeout)
    238{
    239	if (ktime_compare(ktime_get(), timeout) > 0)
    240		return false;
    241
    242	usleep_range(ARIZONA_REG_POLL_DELAY_US / 2, ARIZONA_REG_POLL_DELAY_US);
    243
    244	return true;
    245}
    246
    247static int arizona_poll_reg(struct arizona *arizona,
    248			    int timeout_ms, unsigned int reg,
    249			    unsigned int mask, unsigned int target)
    250{
    251	ktime_t timeout = ktime_add_us(ktime_get(), timeout_ms * USEC_PER_MSEC);
    252	unsigned int val = 0;
    253	int ret;
    254
    255	do {
    256		ret = regmap_read(arizona->regmap, reg, &val);
    257
    258		if ((val & mask) == target)
    259			return 0;
    260	} while (arizona_poll_reg_delay(timeout));
    261
    262	if (ret) {
    263		dev_err(arizona->dev, "Failed polling reg 0x%x: %d\n",
    264			reg, ret);
    265		return ret;
    266	}
    267
    268	dev_err(arizona->dev, "Polling reg 0x%x timed out: %x\n", reg, val);
    269	return -ETIMEDOUT;
    270}
    271
    272static int arizona_wait_for_boot(struct arizona *arizona)
    273{
    274	int ret;
    275
    276	/*
    277	 * We can't use an interrupt as we need to runtime resume to do so,
    278	 * we won't race with the interrupt handler as it'll be blocked on
    279	 * runtime resume.
    280	 */
    281	ret = arizona_poll_reg(arizona, 30, ARIZONA_INTERRUPT_RAW_STATUS_5,
    282			       ARIZONA_BOOT_DONE_STS, ARIZONA_BOOT_DONE_STS);
    283
    284	if (!ret)
    285		regmap_write(arizona->regmap, ARIZONA_INTERRUPT_STATUS_5,
    286			     ARIZONA_BOOT_DONE_STS);
    287
    288	pm_runtime_mark_last_busy(arizona->dev);
    289
    290	return ret;
    291}
    292
    293static inline void arizona_enable_reset(struct arizona *arizona)
    294{
    295	if (arizona->pdata.reset)
    296		gpiod_set_raw_value_cansleep(arizona->pdata.reset, 0);
    297}
    298
    299static void arizona_disable_reset(struct arizona *arizona)
    300{
    301	if (arizona->pdata.reset) {
    302		switch (arizona->type) {
    303		case WM5110:
    304		case WM8280:
    305			/* Meet requirements for minimum reset duration */
    306			usleep_range(5000, 10000);
    307			break;
    308		default:
    309			break;
    310		}
    311
    312		gpiod_set_raw_value_cansleep(arizona->pdata.reset, 1);
    313		usleep_range(1000, 5000);
    314	}
    315}
    316
    317struct arizona_sysclk_state {
    318	unsigned int fll;
    319	unsigned int sysclk;
    320};
    321
    322static int arizona_enable_freerun_sysclk(struct arizona *arizona,
    323					 struct arizona_sysclk_state *state)
    324{
    325	int ret, err;
    326
    327	/* Cache existing FLL and SYSCLK settings */
    328	ret = regmap_read(arizona->regmap, ARIZONA_FLL1_CONTROL_1, &state->fll);
    329	if (ret) {
    330		dev_err(arizona->dev, "Failed to cache FLL settings: %d\n",
    331			ret);
    332		return ret;
    333	}
    334	ret = regmap_read(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1,
    335			  &state->sysclk);
    336	if (ret) {
    337		dev_err(arizona->dev, "Failed to cache SYSCLK settings: %d\n",
    338			ret);
    339		return ret;
    340	}
    341
    342	/* Start up SYSCLK using the FLL in free running mode */
    343	ret = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1,
    344			ARIZONA_FLL1_ENA | ARIZONA_FLL1_FREERUN);
    345	if (ret) {
    346		dev_err(arizona->dev,
    347			"Failed to start FLL in freerunning mode: %d\n",
    348			ret);
    349		return ret;
    350	}
    351	ret = arizona_poll_reg(arizona, 180, ARIZONA_INTERRUPT_RAW_STATUS_5,
    352			       ARIZONA_FLL1_CLOCK_OK_STS,
    353			       ARIZONA_FLL1_CLOCK_OK_STS);
    354	if (ret)
    355		goto err_fll;
    356
    357	ret = regmap_write(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1, 0x0144);
    358	if (ret) {
    359		dev_err(arizona->dev, "Failed to start SYSCLK: %d\n", ret);
    360		goto err_fll;
    361	}
    362
    363	return 0;
    364
    365err_fll:
    366	err = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, state->fll);
    367	if (err)
    368		dev_err(arizona->dev,
    369			"Failed to re-apply old FLL settings: %d\n", err);
    370
    371	return ret;
    372}
    373
    374static int arizona_disable_freerun_sysclk(struct arizona *arizona,
    375					  struct arizona_sysclk_state *state)
    376{
    377	int ret;
    378
    379	ret = regmap_write(arizona->regmap, ARIZONA_SYSTEM_CLOCK_1,
    380			   state->sysclk);
    381	if (ret) {
    382		dev_err(arizona->dev,
    383			"Failed to re-apply old SYSCLK settings: %d\n", ret);
    384		return ret;
    385	}
    386
    387	ret = regmap_write(arizona->regmap, ARIZONA_FLL1_CONTROL_1, state->fll);
    388	if (ret) {
    389		dev_err(arizona->dev,
    390			"Failed to re-apply old FLL settings: %d\n", ret);
    391		return ret;
    392	}
    393
    394	return 0;
    395}
    396
    397static int wm5102_apply_hardware_patch(struct arizona *arizona)
    398{
    399	struct arizona_sysclk_state state;
    400	int err, ret;
    401
    402	ret = arizona_enable_freerun_sysclk(arizona, &state);
    403	if (ret)
    404		return ret;
    405
    406	/* Start the write sequencer and wait for it to finish */
    407	ret = regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_0,
    408			   ARIZONA_WSEQ_ENA | ARIZONA_WSEQ_START | 160);
    409	if (ret) {
    410		dev_err(arizona->dev, "Failed to start write sequencer: %d\n",
    411			ret);
    412		goto err;
    413	}
    414
    415	ret = arizona_poll_reg(arizona, 30, ARIZONA_WRITE_SEQUENCER_CTRL_1,
    416			       ARIZONA_WSEQ_BUSY, 0);
    417	if (ret)
    418		regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_0,
    419			     ARIZONA_WSEQ_ABORT);
    420
    421err:
    422	err = arizona_disable_freerun_sysclk(arizona, &state);
    423
    424	return ret ?: err;
    425}
    426
    427/*
    428 * Register patch to some of the CODECs internal write sequences
    429 * to ensure a clean exit from the low power sleep state.
    430 */
    431static const struct reg_sequence wm5110_sleep_patch[] = {
    432	{ 0x337A, 0xC100 },
    433	{ 0x337B, 0x0041 },
    434	{ 0x3300, 0xA210 },
    435	{ 0x3301, 0x050C },
    436};
    437
    438static int wm5110_apply_sleep_patch(struct arizona *arizona)
    439{
    440	struct arizona_sysclk_state state;
    441	int err, ret;
    442
    443	ret = arizona_enable_freerun_sysclk(arizona, &state);
    444	if (ret)
    445		return ret;
    446
    447	ret = regmap_multi_reg_write_bypassed(arizona->regmap,
    448					      wm5110_sleep_patch,
    449					      ARRAY_SIZE(wm5110_sleep_patch));
    450
    451	err = arizona_disable_freerun_sysclk(arizona, &state);
    452
    453	return ret ?: err;
    454}
    455
    456static int wm5102_clear_write_sequencer(struct arizona *arizona)
    457{
    458	int ret;
    459
    460	ret = regmap_write(arizona->regmap, ARIZONA_WRITE_SEQUENCER_CTRL_3,
    461			   0x0);
    462	if (ret) {
    463		dev_err(arizona->dev,
    464			"Failed to clear write sequencer state: %d\n", ret);
    465		return ret;
    466	}
    467
    468	arizona_enable_reset(arizona);
    469	regulator_disable(arizona->dcvdd);
    470
    471	msleep(20);
    472
    473	ret = regulator_enable(arizona->dcvdd);
    474	if (ret) {
    475		dev_err(arizona->dev, "Failed to re-enable DCVDD: %d\n", ret);
    476		return ret;
    477	}
    478	arizona_disable_reset(arizona);
    479
    480	return 0;
    481}
    482
    483#ifdef CONFIG_PM
    484static int arizona_isolate_dcvdd(struct arizona *arizona)
    485{
    486	int ret;
    487
    488	ret = regmap_update_bits(arizona->regmap,
    489				 ARIZONA_ISOLATION_CONTROL,
    490				 ARIZONA_ISOLATE_DCVDD1,
    491				 ARIZONA_ISOLATE_DCVDD1);
    492	if (ret != 0)
    493		dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n", ret);
    494
    495	return ret;
    496}
    497
    498static int arizona_connect_dcvdd(struct arizona *arizona)
    499{
    500	int ret;
    501
    502	ret = regmap_update_bits(arizona->regmap,
    503				 ARIZONA_ISOLATION_CONTROL,
    504				 ARIZONA_ISOLATE_DCVDD1, 0);
    505	if (ret != 0)
    506		dev_err(arizona->dev, "Failed to connect DCVDD: %d\n", ret);
    507
    508	return ret;
    509}
    510
    511static int arizona_is_jack_det_active(struct arizona *arizona)
    512{
    513	unsigned int val;
    514	int ret;
    515
    516	ret = regmap_read(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE, &val);
    517	if (ret) {
    518		dev_err(arizona->dev,
    519			"Failed to check jack det status: %d\n", ret);
    520		return ret;
    521	} else if (val & ARIZONA_JD1_ENA) {
    522		return 1;
    523	} else {
    524		return 0;
    525	}
    526}
    527
    528static int arizona_runtime_resume(struct device *dev)
    529{
    530	struct arizona *arizona = dev_get_drvdata(dev);
    531	int ret;
    532
    533	dev_dbg(arizona->dev, "Leaving AoD mode\n");
    534
    535	if (arizona->has_fully_powered_off) {
    536		dev_dbg(arizona->dev, "Re-enabling core supplies\n");
    537
    538		ret = regulator_bulk_enable(arizona->num_core_supplies,
    539					    arizona->core_supplies);
    540		if (ret) {
    541			dev_err(dev, "Failed to enable core supplies: %d\n",
    542				ret);
    543			return ret;
    544		}
    545	}
    546
    547	ret = regulator_enable(arizona->dcvdd);
    548	if (ret != 0) {
    549		dev_err(arizona->dev, "Failed to enable DCVDD: %d\n", ret);
    550		if (arizona->has_fully_powered_off)
    551			regulator_bulk_disable(arizona->num_core_supplies,
    552					       arizona->core_supplies);
    553		return ret;
    554	}
    555
    556	if (arizona->has_fully_powered_off) {
    557		arizona_disable_reset(arizona);
    558		enable_irq(arizona->irq);
    559		arizona->has_fully_powered_off = false;
    560	}
    561
    562	regcache_cache_only(arizona->regmap, false);
    563
    564	switch (arizona->type) {
    565	case WM5102:
    566		if (arizona->external_dcvdd) {
    567			ret = arizona_connect_dcvdd(arizona);
    568			if (ret != 0)
    569				goto err;
    570		}
    571
    572		ret = wm5102_patch(arizona);
    573		if (ret != 0) {
    574			dev_err(arizona->dev, "Failed to apply patch: %d\n",
    575				ret);
    576			goto err;
    577		}
    578
    579		ret = wm5102_apply_hardware_patch(arizona);
    580		if (ret) {
    581			dev_err(arizona->dev,
    582				"Failed to apply hardware patch: %d\n",
    583				ret);
    584			goto err;
    585		}
    586		break;
    587	case WM5110:
    588	case WM8280:
    589		ret = arizona_wait_for_boot(arizona);
    590		if (ret)
    591			goto err;
    592
    593		if (arizona->external_dcvdd) {
    594			ret = arizona_connect_dcvdd(arizona);
    595			if (ret != 0)
    596				goto err;
    597		} else {
    598			/*
    599			 * As this is only called for the internal regulator
    600			 * (where we know voltage ranges available) it is ok
    601			 * to request an exact range.
    602			 */
    603			ret = regulator_set_voltage(arizona->dcvdd,
    604						    1200000, 1200000);
    605			if (ret < 0) {
    606				dev_err(arizona->dev,
    607					"Failed to set resume voltage: %d\n",
    608					ret);
    609				goto err;
    610			}
    611		}
    612
    613		ret = wm5110_apply_sleep_patch(arizona);
    614		if (ret) {
    615			dev_err(arizona->dev,
    616				"Failed to re-apply sleep patch: %d\n",
    617				ret);
    618			goto err;
    619		}
    620		break;
    621	case WM1831:
    622	case CS47L24:
    623		ret = arizona_wait_for_boot(arizona);
    624		if (ret != 0)
    625			goto err;
    626		break;
    627	default:
    628		ret = arizona_wait_for_boot(arizona);
    629		if (ret != 0)
    630			goto err;
    631
    632		if (arizona->external_dcvdd) {
    633			ret = arizona_connect_dcvdd(arizona);
    634			if (ret != 0)
    635				goto err;
    636		}
    637		break;
    638	}
    639
    640	ret = regcache_sync(arizona->regmap);
    641	if (ret != 0) {
    642		dev_err(arizona->dev, "Failed to restore register cache\n");
    643		goto err;
    644	}
    645
    646	return 0;
    647
    648err:
    649	regcache_cache_only(arizona->regmap, true);
    650	regulator_disable(arizona->dcvdd);
    651	return ret;
    652}
    653
    654static int arizona_runtime_suspend(struct device *dev)
    655{
    656	struct arizona *arizona = dev_get_drvdata(dev);
    657	int jd_active = 0;
    658	int ret;
    659
    660	dev_dbg(arizona->dev, "Entering AoD mode\n");
    661
    662	switch (arizona->type) {
    663	case WM5110:
    664	case WM8280:
    665		jd_active = arizona_is_jack_det_active(arizona);
    666		if (jd_active < 0)
    667			return jd_active;
    668
    669		if (arizona->external_dcvdd) {
    670			ret = arizona_isolate_dcvdd(arizona);
    671			if (ret != 0)
    672				return ret;
    673		} else {
    674			/*
    675			 * As this is only called for the internal regulator
    676			 * (where we know voltage ranges available) it is ok
    677			 * to request an exact range.
    678			 */
    679			ret = regulator_set_voltage(arizona->dcvdd,
    680						    1175000, 1175000);
    681			if (ret < 0) {
    682				dev_err(arizona->dev,
    683					"Failed to set suspend voltage: %d\n",
    684					ret);
    685				return ret;
    686			}
    687		}
    688		break;
    689	case WM5102:
    690		jd_active = arizona_is_jack_det_active(arizona);
    691		if (jd_active < 0)
    692			return jd_active;
    693
    694		if (arizona->external_dcvdd) {
    695			ret = arizona_isolate_dcvdd(arizona);
    696			if (ret != 0)
    697				return ret;
    698		}
    699
    700		if (!jd_active) {
    701			ret = regmap_write(arizona->regmap,
    702					   ARIZONA_WRITE_SEQUENCER_CTRL_3, 0x0);
    703			if (ret) {
    704				dev_err(arizona->dev,
    705					"Failed to clear write sequencer: %d\n",
    706					ret);
    707				return ret;
    708			}
    709		}
    710		break;
    711	case WM1831:
    712	case CS47L24:
    713		break;
    714	default:
    715		jd_active = arizona_is_jack_det_active(arizona);
    716		if (jd_active < 0)
    717			return jd_active;
    718
    719		if (arizona->external_dcvdd) {
    720			ret = arizona_isolate_dcvdd(arizona);
    721			if (ret != 0)
    722				return ret;
    723		}
    724		break;
    725	}
    726
    727	regcache_cache_only(arizona->regmap, true);
    728	regcache_mark_dirty(arizona->regmap);
    729	regulator_disable(arizona->dcvdd);
    730
    731	/* Allow us to completely power down if no jack detection */
    732	if (!jd_active) {
    733		dev_dbg(arizona->dev, "Fully powering off\n");
    734
    735		arizona->has_fully_powered_off = true;
    736
    737		disable_irq_nosync(arizona->irq);
    738		arizona_enable_reset(arizona);
    739		regulator_bulk_disable(arizona->num_core_supplies,
    740				       arizona->core_supplies);
    741	}
    742
    743	return 0;
    744}
    745#endif
    746
    747#ifdef CONFIG_PM_SLEEP
    748static int arizona_suspend(struct device *dev)
    749{
    750	struct arizona *arizona = dev_get_drvdata(dev);
    751
    752	dev_dbg(arizona->dev, "Suspend, disabling IRQ\n");
    753	disable_irq(arizona->irq);
    754
    755	return 0;
    756}
    757
    758static int arizona_suspend_noirq(struct device *dev)
    759{
    760	struct arizona *arizona = dev_get_drvdata(dev);
    761
    762	dev_dbg(arizona->dev, "Late suspend, reenabling IRQ\n");
    763	enable_irq(arizona->irq);
    764
    765	return 0;
    766}
    767
    768static int arizona_resume_noirq(struct device *dev)
    769{
    770	struct arizona *arizona = dev_get_drvdata(dev);
    771
    772	dev_dbg(arizona->dev, "Early resume, disabling IRQ\n");
    773	disable_irq(arizona->irq);
    774
    775	return 0;
    776}
    777
    778static int arizona_resume(struct device *dev)
    779{
    780	struct arizona *arizona = dev_get_drvdata(dev);
    781
    782	dev_dbg(arizona->dev, "Resume, reenabling IRQ\n");
    783	enable_irq(arizona->irq);
    784
    785	return 0;
    786}
    787#endif
    788
    789const struct dev_pm_ops arizona_pm_ops = {
    790	SET_RUNTIME_PM_OPS(arizona_runtime_suspend,
    791			   arizona_runtime_resume,
    792			   NULL)
    793	SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume)
    794	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(arizona_suspend_noirq,
    795				      arizona_resume_noirq)
    796};
    797EXPORT_SYMBOL_GPL(arizona_pm_ops);
    798
    799#ifdef CONFIG_OF
    800static int arizona_of_get_core_pdata(struct arizona *arizona)
    801{
    802	struct arizona_pdata *pdata = &arizona->pdata;
    803	int ret, i;
    804
    805	/* Handle old non-standard DT binding */
    806	pdata->reset = devm_gpiod_get(arizona->dev, "wlf,reset", GPIOD_OUT_LOW);
    807	if (IS_ERR(pdata->reset)) {
    808		ret = PTR_ERR(pdata->reset);
    809
    810		/*
    811		 * Reset missing will be caught when other binding is read
    812		 * but all other errors imply this binding is in use but has
    813		 * encountered a problem so should be handled.
    814		 */
    815		if (ret == -EPROBE_DEFER)
    816			return ret;
    817		else if (ret != -ENOENT && ret != -ENOSYS)
    818			dev_err(arizona->dev, "Reset GPIO malformed: %d\n",
    819				ret);
    820
    821		pdata->reset = NULL;
    822	}
    823
    824	ret = of_property_read_u32_array(arizona->dev->of_node,
    825					 "wlf,gpio-defaults",
    826					 pdata->gpio_defaults,
    827					 ARRAY_SIZE(pdata->gpio_defaults));
    828	if (ret >= 0) {
    829		/*
    830		 * All values are literal except out of range values
    831		 * which are chip default, translate into platform
    832		 * data which uses 0 as chip default and out of range
    833		 * as zero.
    834		 */
    835		for (i = 0; i < ARRAY_SIZE(pdata->gpio_defaults); i++) {
    836			if (pdata->gpio_defaults[i] > 0xffff)
    837				pdata->gpio_defaults[i] = 0;
    838			else if (pdata->gpio_defaults[i] == 0)
    839				pdata->gpio_defaults[i] = 0x10000;
    840		}
    841	} else {
    842		dev_err(arizona->dev, "Failed to parse GPIO defaults: %d\n",
    843			ret);
    844	}
    845
    846	return 0;
    847}
    848#else
    849static inline int arizona_of_get_core_pdata(struct arizona *arizona)
    850{
    851	return 0;
    852}
    853#endif
    854
    855static const struct mfd_cell early_devs[] = {
    856	{ .name = "arizona-ldo1" },
    857};
    858
    859static const char * const wm5102_supplies[] = {
    860	"MICVDD",
    861	"DBVDD2",
    862	"DBVDD3",
    863	"CPVDD",
    864	"SPKVDDL",
    865	"SPKVDDR",
    866};
    867
    868static const struct mfd_cell wm5102_devs[] = {
    869	{ .name = "arizona-micsupp" },
    870	{ .name = "arizona-gpio" },
    871	{ .name = "arizona-haptics" },
    872	{ .name = "arizona-pwm" },
    873	{
    874		.name = "wm5102-codec",
    875		.parent_supplies = wm5102_supplies,
    876		.num_parent_supplies = ARRAY_SIZE(wm5102_supplies),
    877	},
    878};
    879
    880static const struct mfd_cell wm5110_devs[] = {
    881	{ .name = "arizona-micsupp" },
    882	{ .name = "arizona-gpio" },
    883	{ .name = "arizona-haptics" },
    884	{ .name = "arizona-pwm" },
    885	{
    886		.name = "wm5110-codec",
    887		.parent_supplies = wm5102_supplies,
    888		.num_parent_supplies = ARRAY_SIZE(wm5102_supplies),
    889	},
    890};
    891
    892static const char * const cs47l24_supplies[] = {
    893	"MICVDD",
    894	"CPVDD",
    895	"SPKVDD",
    896};
    897
    898static const struct mfd_cell cs47l24_devs[] = {
    899	{ .name = "arizona-gpio" },
    900	{ .name = "arizona-haptics" },
    901	{ .name = "arizona-pwm" },
    902	{
    903		.name = "cs47l24-codec",
    904		.parent_supplies = cs47l24_supplies,
    905		.num_parent_supplies = ARRAY_SIZE(cs47l24_supplies),
    906	},
    907};
    908
    909static const char * const wm8997_supplies[] = {
    910	"MICVDD",
    911	"DBVDD2",
    912	"CPVDD",
    913	"SPKVDD",
    914};
    915
    916static const struct mfd_cell wm8997_devs[] = {
    917	{ .name = "arizona-micsupp" },
    918	{ .name = "arizona-gpio" },
    919	{ .name = "arizona-haptics" },
    920	{ .name = "arizona-pwm" },
    921	{
    922		.name = "wm8997-codec",
    923		.parent_supplies = wm8997_supplies,
    924		.num_parent_supplies = ARRAY_SIZE(wm8997_supplies),
    925	},
    926};
    927
    928static const struct mfd_cell wm8998_devs[] = {
    929	{ .name = "arizona-micsupp" },
    930	{ .name = "arizona-gpio" },
    931	{ .name = "arizona-haptics" },
    932	{ .name = "arizona-pwm" },
    933	{
    934		.name = "wm8998-codec",
    935		.parent_supplies = wm5102_supplies,
    936		.num_parent_supplies = ARRAY_SIZE(wm5102_supplies),
    937	},
    938};
    939
    940int arizona_dev_init(struct arizona *arizona)
    941{
    942	static const char * const mclk_name[] = { "mclk1", "mclk2" };
    943	struct device *dev = arizona->dev;
    944	const char *type_name = NULL;
    945	unsigned int reg, val;
    946	int (*apply_patch)(struct arizona *) = NULL;
    947	const struct mfd_cell *subdevs = NULL;
    948	int n_subdevs = 0, ret, i;
    949
    950	dev_set_drvdata(arizona->dev, arizona);
    951	mutex_init(&arizona->clk_lock);
    952
    953	if (dev_get_platdata(arizona->dev)) {
    954		memcpy(&arizona->pdata, dev_get_platdata(arizona->dev),
    955		       sizeof(arizona->pdata));
    956	} else {
    957		ret = arizona_of_get_core_pdata(arizona);
    958		if (ret < 0)
    959			return ret;
    960	}
    961
    962	BUILD_BUG_ON(ARRAY_SIZE(arizona->mclk) != ARRAY_SIZE(mclk_name));
    963	for (i = 0; i < ARRAY_SIZE(arizona->mclk); i++) {
    964		arizona->mclk[i] = devm_clk_get(arizona->dev, mclk_name[i]);
    965		if (IS_ERR(arizona->mclk[i])) {
    966			dev_info(arizona->dev, "Failed to get %s: %ld\n",
    967				 mclk_name[i], PTR_ERR(arizona->mclk[i]));
    968			arizona->mclk[i] = NULL;
    969		}
    970	}
    971
    972	regcache_cache_only(arizona->regmap, true);
    973
    974	switch (arizona->type) {
    975	case WM5102:
    976	case WM5110:
    977	case WM8280:
    978	case WM8997:
    979	case WM8998:
    980	case WM1814:
    981	case WM1831:
    982	case CS47L24:
    983		for (i = 0; i < ARRAY_SIZE(wm5102_core_supplies); i++)
    984			arizona->core_supplies[i].supply
    985				= wm5102_core_supplies[i];
    986		arizona->num_core_supplies = ARRAY_SIZE(wm5102_core_supplies);
    987		break;
    988	default:
    989		dev_err(arizona->dev, "Unknown device type %d\n",
    990			arizona->type);
    991		return -ENODEV;
    992	}
    993
    994	/* Mark DCVDD as external, LDO1 driver will clear if internal */
    995	arizona->external_dcvdd = true;
    996
    997	switch (arizona->type) {
    998	case WM1831:
    999	case CS47L24:
   1000		break; /* No LDO1 regulator */
   1001	default:
   1002		ret = mfd_add_devices(arizona->dev, -1, early_devs,
   1003				      ARRAY_SIZE(early_devs), NULL, 0, NULL);
   1004		if (ret != 0) {
   1005			dev_err(dev, "Failed to add early children: %d\n", ret);
   1006			return ret;
   1007		}
   1008		break;
   1009	}
   1010
   1011	ret = devm_regulator_bulk_get(dev, arizona->num_core_supplies,
   1012				      arizona->core_supplies);
   1013	if (ret != 0) {
   1014		dev_err(dev, "Failed to request core supplies: %d\n",
   1015			ret);
   1016		goto err_early;
   1017	}
   1018
   1019	/**
   1020	 * Don't use devres here because the only device we have to get
   1021	 * against is the MFD device and DCVDD will likely be supplied by
   1022	 * one of its children. Meaning that the regulator will be
   1023	 * destroyed by the time devres calls regulator put.
   1024	 */
   1025	arizona->dcvdd = regulator_get(arizona->dev, "DCVDD");
   1026	if (IS_ERR(arizona->dcvdd)) {
   1027		ret = PTR_ERR(arizona->dcvdd);
   1028		dev_err(dev, "Failed to request DCVDD: %d\n", ret);
   1029		goto err_early;
   1030	}
   1031
   1032	if (!arizona->pdata.reset) {
   1033		/* Start out with /RESET low to put the chip into reset */
   1034		arizona->pdata.reset = devm_gpiod_get(arizona->dev, "reset",
   1035						      GPIOD_OUT_LOW);
   1036		if (IS_ERR(arizona->pdata.reset)) {
   1037			ret = PTR_ERR(arizona->pdata.reset);
   1038			if (ret == -EPROBE_DEFER)
   1039				goto err_dcvdd;
   1040
   1041			dev_err(arizona->dev,
   1042				"Reset GPIO missing/malformed: %d\n", ret);
   1043
   1044			arizona->pdata.reset = NULL;
   1045		}
   1046	}
   1047
   1048	ret = regulator_bulk_enable(arizona->num_core_supplies,
   1049				    arizona->core_supplies);
   1050	if (ret != 0) {
   1051		dev_err(dev, "Failed to enable core supplies: %d\n",
   1052			ret);
   1053		goto err_dcvdd;
   1054	}
   1055
   1056	ret = regulator_enable(arizona->dcvdd);
   1057	if (ret != 0) {
   1058		dev_err(dev, "Failed to enable DCVDD: %d\n", ret);
   1059		goto err_enable;
   1060	}
   1061
   1062	arizona_disable_reset(arizona);
   1063
   1064	regcache_cache_only(arizona->regmap, false);
   1065
   1066	/* Verify that this is a chip we know about */
   1067	ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg);
   1068	if (ret != 0) {
   1069		dev_err(dev, "Failed to read ID register: %d\n", ret);
   1070		goto err_reset;
   1071	}
   1072
   1073	switch (reg) {
   1074	case 0x5102:
   1075	case 0x5110:
   1076	case 0x6349:
   1077	case 0x6363:
   1078	case 0x8997:
   1079		break;
   1080	default:
   1081		dev_err(arizona->dev, "Unknown device ID: %x\n", reg);
   1082		ret = -ENODEV;
   1083		goto err_reset;
   1084	}
   1085
   1086	/* If we have a /RESET GPIO we'll already be reset */
   1087	if (!arizona->pdata.reset) {
   1088		ret = regmap_write(arizona->regmap, ARIZONA_SOFTWARE_RESET, 0);
   1089		if (ret != 0) {
   1090			dev_err(dev, "Failed to reset device: %d\n", ret);
   1091			goto err_reset;
   1092		}
   1093
   1094		usleep_range(1000, 5000);
   1095	}
   1096
   1097	/* Ensure device startup is complete */
   1098	switch (arizona->type) {
   1099	case WM5102:
   1100		ret = regmap_read(arizona->regmap,
   1101				  ARIZONA_WRITE_SEQUENCER_CTRL_3, &val);
   1102		if (ret) {
   1103			dev_err(dev,
   1104				"Failed to check write sequencer state: %d\n",
   1105				ret);
   1106		} else if (val & 0x01) {
   1107			ret = wm5102_clear_write_sequencer(arizona);
   1108			if (ret)
   1109				return ret;
   1110		}
   1111		break;
   1112	default:
   1113		break;
   1114	}
   1115
   1116	ret = arizona_wait_for_boot(arizona);
   1117	if (ret) {
   1118		dev_err(arizona->dev, "Device failed initial boot: %d\n", ret);
   1119		goto err_reset;
   1120	}
   1121
   1122	/* Read the device ID information & do device specific stuff */
   1123	ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg);
   1124	if (ret != 0) {
   1125		dev_err(dev, "Failed to read ID register: %d\n", ret);
   1126		goto err_reset;
   1127	}
   1128
   1129	ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION,
   1130			  &arizona->rev);
   1131	if (ret != 0) {
   1132		dev_err(dev, "Failed to read revision register: %d\n", ret);
   1133		goto err_reset;
   1134	}
   1135	arizona->rev &= ARIZONA_DEVICE_REVISION_MASK;
   1136
   1137	switch (reg) {
   1138	case 0x5102:
   1139		if (IS_ENABLED(CONFIG_MFD_WM5102)) {
   1140			type_name = "WM5102";
   1141			if (arizona->type != WM5102) {
   1142				dev_warn(arizona->dev,
   1143					 "WM5102 registered as %d\n",
   1144					 arizona->type);
   1145				arizona->type = WM5102;
   1146			}
   1147
   1148			apply_patch = wm5102_patch;
   1149			arizona->rev &= 0x7;
   1150			subdevs = wm5102_devs;
   1151			n_subdevs = ARRAY_SIZE(wm5102_devs);
   1152		}
   1153		break;
   1154	case 0x5110:
   1155		if (IS_ENABLED(CONFIG_MFD_WM5110)) {
   1156			switch (arizona->type) {
   1157			case WM5110:
   1158				type_name = "WM5110";
   1159				break;
   1160			case WM8280:
   1161				type_name = "WM8280";
   1162				break;
   1163			default:
   1164				type_name = "WM5110";
   1165				dev_warn(arizona->dev,
   1166					 "WM5110 registered as %d\n",
   1167					 arizona->type);
   1168				arizona->type = WM5110;
   1169				break;
   1170			}
   1171
   1172			apply_patch = wm5110_patch;
   1173			subdevs = wm5110_devs;
   1174			n_subdevs = ARRAY_SIZE(wm5110_devs);
   1175		}
   1176		break;
   1177	case 0x6363:
   1178		if (IS_ENABLED(CONFIG_MFD_CS47L24)) {
   1179			switch (arizona->type) {
   1180			case CS47L24:
   1181				type_name = "CS47L24";
   1182				break;
   1183
   1184			case WM1831:
   1185				type_name = "WM1831";
   1186				break;
   1187
   1188			default:
   1189				dev_warn(arizona->dev,
   1190					 "CS47L24 registered as %d\n",
   1191					 arizona->type);
   1192				arizona->type = CS47L24;
   1193				break;
   1194			}
   1195
   1196			apply_patch = cs47l24_patch;
   1197			subdevs = cs47l24_devs;
   1198			n_subdevs = ARRAY_SIZE(cs47l24_devs);
   1199		}
   1200		break;
   1201	case 0x8997:
   1202		if (IS_ENABLED(CONFIG_MFD_WM8997)) {
   1203			type_name = "WM8997";
   1204			if (arizona->type != WM8997) {
   1205				dev_warn(arizona->dev,
   1206					 "WM8997 registered as %d\n",
   1207					 arizona->type);
   1208				arizona->type = WM8997;
   1209			}
   1210
   1211			apply_patch = wm8997_patch;
   1212			subdevs = wm8997_devs;
   1213			n_subdevs = ARRAY_SIZE(wm8997_devs);
   1214		}
   1215		break;
   1216	case 0x6349:
   1217		if (IS_ENABLED(CONFIG_MFD_WM8998)) {
   1218			switch (arizona->type) {
   1219			case WM8998:
   1220				type_name = "WM8998";
   1221				break;
   1222
   1223			case WM1814:
   1224				type_name = "WM1814";
   1225				break;
   1226
   1227			default:
   1228				type_name = "WM8998";
   1229				dev_warn(arizona->dev,
   1230					 "WM8998 registered as %d\n",
   1231					 arizona->type);
   1232				arizona->type = WM8998;
   1233			}
   1234
   1235			apply_patch = wm8998_patch;
   1236			subdevs = wm8998_devs;
   1237			n_subdevs = ARRAY_SIZE(wm8998_devs);
   1238		}
   1239		break;
   1240	default:
   1241		dev_err(arizona->dev, "Unknown device ID %x\n", reg);
   1242		ret = -ENODEV;
   1243		goto err_reset;
   1244	}
   1245
   1246	if (!subdevs) {
   1247		dev_err(arizona->dev,
   1248			"No kernel support for device ID %x\n", reg);
   1249		ret = -ENODEV;
   1250		goto err_reset;
   1251	}
   1252
   1253	dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
   1254
   1255	if (apply_patch) {
   1256		ret = apply_patch(arizona);
   1257		if (ret != 0) {
   1258			dev_err(arizona->dev, "Failed to apply patch: %d\n",
   1259				ret);
   1260			goto err_reset;
   1261		}
   1262
   1263		switch (arizona->type) {
   1264		case WM5102:
   1265			ret = wm5102_apply_hardware_patch(arizona);
   1266			if (ret) {
   1267				dev_err(arizona->dev,
   1268					"Failed to apply hardware patch: %d\n",
   1269					ret);
   1270				goto err_reset;
   1271			}
   1272			break;
   1273		case WM5110:
   1274		case WM8280:
   1275			ret = wm5110_apply_sleep_patch(arizona);
   1276			if (ret) {
   1277				dev_err(arizona->dev,
   1278					"Failed to apply sleep patch: %d\n",
   1279					ret);
   1280				goto err_reset;
   1281			}
   1282			break;
   1283		default:
   1284			break;
   1285		}
   1286	}
   1287
   1288	for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) {
   1289		if (!arizona->pdata.gpio_defaults[i])
   1290			continue;
   1291
   1292		regmap_write(arizona->regmap, ARIZONA_GPIO1_CTRL + i,
   1293			     arizona->pdata.gpio_defaults[i]);
   1294	}
   1295
   1296	/* Chip default */
   1297	if (!arizona->pdata.clk32k_src)
   1298		arizona->pdata.clk32k_src = ARIZONA_32KZ_MCLK2;
   1299
   1300	switch (arizona->pdata.clk32k_src) {
   1301	case ARIZONA_32KZ_MCLK1:
   1302	case ARIZONA_32KZ_MCLK2:
   1303		regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1,
   1304				   ARIZONA_CLK_32K_SRC_MASK,
   1305				   arizona->pdata.clk32k_src - 1);
   1306		arizona_clk32k_enable(arizona);
   1307		break;
   1308	case ARIZONA_32KZ_NONE:
   1309		regmap_update_bits(arizona->regmap, ARIZONA_CLOCK_32K_1,
   1310				   ARIZONA_CLK_32K_SRC_MASK, 2);
   1311		break;
   1312	default:
   1313		dev_err(arizona->dev, "Invalid 32kHz clock source: %d\n",
   1314			arizona->pdata.clk32k_src);
   1315		ret = -EINVAL;
   1316		goto err_reset;
   1317	}
   1318
   1319	for (i = 0; i < ARIZONA_MAX_MICBIAS; i++) {
   1320		if (!arizona->pdata.micbias[i].mV &&
   1321		    !arizona->pdata.micbias[i].bypass)
   1322			continue;
   1323
   1324		/* Apply default for bypass mode */
   1325		if (!arizona->pdata.micbias[i].mV)
   1326			arizona->pdata.micbias[i].mV = 2800;
   1327
   1328		val = (arizona->pdata.micbias[i].mV - 1500) / 100;
   1329
   1330		val <<= ARIZONA_MICB1_LVL_SHIFT;
   1331
   1332		if (arizona->pdata.micbias[i].ext_cap)
   1333			val |= ARIZONA_MICB1_EXT_CAP;
   1334
   1335		if (arizona->pdata.micbias[i].discharge)
   1336			val |= ARIZONA_MICB1_DISCH;
   1337
   1338		if (arizona->pdata.micbias[i].soft_start)
   1339			val |= ARIZONA_MICB1_RATE;
   1340
   1341		if (arizona->pdata.micbias[i].bypass)
   1342			val |= ARIZONA_MICB1_BYPASS;
   1343
   1344		regmap_update_bits(arizona->regmap,
   1345				   ARIZONA_MIC_BIAS_CTRL_1 + i,
   1346				   ARIZONA_MICB1_LVL_MASK |
   1347				   ARIZONA_MICB1_EXT_CAP |
   1348				   ARIZONA_MICB1_DISCH |
   1349				   ARIZONA_MICB1_BYPASS |
   1350				   ARIZONA_MICB1_RATE, val);
   1351	}
   1352
   1353	pm_runtime_set_active(arizona->dev);
   1354	pm_runtime_enable(arizona->dev);
   1355
   1356	/* Set up for interrupts */
   1357	ret = arizona_irq_init(arizona);
   1358	if (ret != 0)
   1359		goto err_pm;
   1360
   1361	pm_runtime_set_autosuspend_delay(arizona->dev, 100);
   1362	pm_runtime_use_autosuspend(arizona->dev);
   1363
   1364	arizona_request_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, "CLKGEN error",
   1365			    arizona_clkgen_err, arizona);
   1366	arizona_request_irq(arizona, ARIZONA_IRQ_OVERCLOCKED, "Overclocked",
   1367			    arizona_overclocked, arizona);
   1368	arizona_request_irq(arizona, ARIZONA_IRQ_UNDERCLOCKED, "Underclocked",
   1369			    arizona_underclocked, arizona);
   1370
   1371	ret = mfd_add_devices(arizona->dev, PLATFORM_DEVID_NONE,
   1372			      subdevs, n_subdevs, NULL, 0, NULL);
   1373
   1374	if (ret) {
   1375		dev_err(arizona->dev, "Failed to add subdevices: %d\n", ret);
   1376		goto err_irq;
   1377	}
   1378
   1379	return 0;
   1380
   1381err_irq:
   1382	arizona_irq_exit(arizona);
   1383err_pm:
   1384	pm_runtime_disable(arizona->dev);
   1385
   1386	switch (arizona->pdata.clk32k_src) {
   1387	case ARIZONA_32KZ_MCLK1:
   1388	case ARIZONA_32KZ_MCLK2:
   1389		arizona_clk32k_disable(arizona);
   1390		break;
   1391	default:
   1392		break;
   1393	}
   1394err_reset:
   1395	arizona_enable_reset(arizona);
   1396	regulator_disable(arizona->dcvdd);
   1397err_enable:
   1398	regulator_bulk_disable(arizona->num_core_supplies,
   1399			       arizona->core_supplies);
   1400err_dcvdd:
   1401	regulator_put(arizona->dcvdd);
   1402err_early:
   1403	mfd_remove_devices(dev);
   1404	return ret;
   1405}
   1406EXPORT_SYMBOL_GPL(arizona_dev_init);
   1407
   1408int arizona_dev_exit(struct arizona *arizona)
   1409{
   1410	disable_irq(arizona->irq);
   1411	pm_runtime_disable(arizona->dev);
   1412
   1413	regulator_disable(arizona->dcvdd);
   1414	regulator_put(arizona->dcvdd);
   1415
   1416	switch (arizona->pdata.clk32k_src) {
   1417	case ARIZONA_32KZ_MCLK1:
   1418	case ARIZONA_32KZ_MCLK2:
   1419		arizona_clk32k_disable(arizona);
   1420		break;
   1421	default:
   1422		break;
   1423	}
   1424
   1425	mfd_remove_devices(arizona->dev);
   1426	arizona_free_irq(arizona, ARIZONA_IRQ_UNDERCLOCKED, arizona);
   1427	arizona_free_irq(arizona, ARIZONA_IRQ_OVERCLOCKED, arizona);
   1428	arizona_free_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, arizona);
   1429	arizona_irq_exit(arizona);
   1430	arizona_enable_reset(arizona);
   1431
   1432	regulator_bulk_disable(arizona->num_core_supplies,
   1433			       arizona->core_supplies);
   1434	return 0;
   1435}
   1436EXPORT_SYMBOL_GPL(arizona_dev_exit);
   1437
   1438MODULE_LICENSE("GPL v2");