1 /* intel_sst_v1_control.c - Intel SST Driver for audio engine
3 * Copyright (C) 2008-10 Intel Corp
4 * Authors: Vinod Koul <vinod.koul@intel.com>
5 * Harsha Priya <priya.harsha@intel.com>
6 * Dharageswari R <dharageswari.r@intel.com>
7 * KP Jeeja <jeeja.kp@intel.com>
8 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2 of the License.
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25 * This file contains the control operations of vendor 2
28 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
30 #include <linux/pci.h>
31 #include <linux/delay.h>
32 #include <linux/file.h>
34 #include <sound/pcm.h>
36 #include <sound/pcm_params.h>
37 #include <sound/control.h>
38 #include <sound/initval.h>
39 #include "intel_sst.h"
40 #include "intel_sst_ioctl.h"
42 #include "intelmid_snd_control.h"
44 #include <linux/gpio.h>
45 #define KOSKI_VOICE_CODEC_ENABLE 46
49 MASTER_CLOCK_PRESCALAR
= 0x205,
50 SET_MASTER_AND_LR_CLK1
= 0x20b,
51 SET_MASTER_AND_LR_CLK2
= 0x20c,
52 MASTER_MODE_AND_DATA_DELAY
= 0x20d,
53 DIGITAL_INTERFACE_TO_DAI2
= 0x20e,
56 DAI2_TO_DAC_HP
= 0x210,
57 HP_OP_SINGLE_ENDED
= 0x224,
58 ENABLE_OPDEV_CTRL
= 0x226,
59 ENABLE_DEV_AND_USE_XTAL
= 0x227,
61 /* Max audio subsystem (PQ49) MAX 8921 */
62 AS_IP_MODE_CTL
= 0xF9,
63 AS_LEFT_SPKR_VOL_CTL
= 0xFA, /* Mono Earpiece volume control */
64 AS_RIGHT_SPKR_VOL_CTL
= 0xFB,
65 AS_LEFT_HP_VOL_CTL
= 0xFC,
66 AS_RIGHT_HP_VOL_CTL
= 0xFD,
70 /* Headphone volume control & mute registers */
76 * mx_init_card - initialize the sound card
78 * This initializes the audio paths to know values in case of this sound card
80 static int mx_init_card(void)
82 struct sc_reg_access sc_access
[] = {
131 snd_pmic_ops_mx
.card_status
= SND_CARD_INIT_DONE
;
132 snd_pmic_ops_mx
.num_channel
= 2;
133 snd_pmic_ops_mx
.master_mute
= UNMUTE
;
134 snd_pmic_ops_mx
.mute_status
= UNMUTE
;
135 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, 47);
138 static int mx_enable_audiodac(int value
)
140 struct sc_reg_access sc_access
[3];
145 sc_access
[0].reg_addr
= AS_LEFT_HP_VOL_CTL
;
146 sc_access
[1].reg_addr
= AS_RIGHT_HP_VOL_CTL
;
148 if (value
== UNMUTE
) {
155 sc_access
[0].mask
= sc_access
[1].mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
;
156 sc_access
[0].value
= sc_access
[1].value
= (u8
)mute_val
;
157 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
160 pr_debug("mute status = %d\n", snd_pmic_ops_mx
.mute_status
);
161 if (snd_pmic_ops_mx
.mute_status
== MUTE
||
162 snd_pmic_ops_mx
.master_mute
== MUTE
)
165 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
166 sc_access
[1].reg_addr
= VOL_CTRL_RT
;
167 sc_access
[0].mask
= sc_access
[1].mask
= MASK6
;
168 sc_access
[0].value
= sc_access
[1].value
= mute_val1
;
169 if (snd_pmic_ops_mx
.num_channel
== 1)
170 sc_access
[1].value
= 0x40;
171 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
174 static int mx_power_up_pb(unsigned int port
)
178 struct sc_reg_access sc_access
[3];
180 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
181 retval
= mx_init_card();
185 retval
= mx_enable_audiodac(MUTE
);
191 sc_access
[0].reg_addr
= AS_CONFIG
;
192 sc_access
[0].mask
= MASK7
;
193 sc_access
[0].value
= 0x80;
194 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
198 sc_access
[0].reg_addr
= ENABLE_OPDEV_CTRL
;
199 sc_access
[0].mask
= 0xff;
200 sc_access
[0].value
= 0x3C;
201 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
205 sc_access
[0].reg_addr
= ENABLE_DEV_AND_USE_XTAL
;
206 sc_access
[0].mask
= 0x80;
207 sc_access
[0].value
= 0x80;
208 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
212 return mx_enable_audiodac(UNMUTE
);
215 static int mx_power_down_pb(void)
217 struct sc_reg_access sc_access
[3];
220 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
221 retval
= mx_init_card();
226 retval
= mx_enable_audiodac(MUTE
);
230 sc_access
[0].reg_addr
= ENABLE_OPDEV_CTRL
;
231 sc_access
[0].mask
= MASK3
|MASK2
;
232 sc_access
[0].value
= 0x00;
234 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
238 return mx_enable_audiodac(UNMUTE
);
241 static int mx_power_up_cp(unsigned int port
)
244 struct sc_reg_access sc_access
[] = {
245 {ENABLE_DEV_AND_USE_XTAL
, 0x80, MASK7
},
246 {ENABLE_OPDEV_CTRL
, 0x3, 0x3},
249 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
250 retval
= mx_init_card();
255 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
258 static int mx_power_down_cp(void)
260 struct sc_reg_access sc_access
[] = {
261 {ENABLE_OPDEV_CTRL
, 0x00, MASK1
|MASK0
},
265 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
266 retval
= mx_init_card();
271 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
274 static int mx_power_down(void)
277 struct sc_reg_access sc_access
[3];
279 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
280 retval
= mx_init_card();
285 retval
= mx_enable_audiodac(MUTE
);
289 sc_access
[0].reg_addr
= AS_CONFIG
;
290 sc_access
[0].mask
= MASK7
;
291 sc_access
[0].value
= 0x00;
292 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
296 sc_access
[0].reg_addr
= ENABLE_DEV_AND_USE_XTAL
;
297 sc_access
[0].mask
= MASK7
;
298 sc_access
[0].value
= 0x00;
299 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
303 sc_access
[0].reg_addr
= ENABLE_OPDEV_CTRL
;
304 sc_access
[0].mask
= MASK3
|MASK2
;
305 sc_access
[0].value
= 0x00;
306 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 1);
310 return mx_enable_audiodac(UNMUTE
);
313 static int mx_set_pcm_voice_params(void)
316 struct sc_reg_access sc_access
[] = {
329 {0x20c, 0xBE, 0x00},/* 0x00 -> 0xBE Koski */
330 {0x20d, 0x00, 0x00}, /* DAI2 'off' */
334 {0x211, 0x33, 0x00}, /* Voice filter */
349 {0x220, 0x00, 0x00}, /* Microphone configurations */
350 {0x221, 0x00, 0x00}, /* Microphone configurations */
351 {0x222, 0x50, 0x00}, /* Microphone configurations */
352 {0x223, 0x21, 0x00}, /* Microphone configurations */
363 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
364 retval
= mx_init_card();
368 pr_debug("SST DBG:mx_set_pcm_voice_params called\n");
369 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, 44);
372 static int mx_set_pcm_audio_params(int sfreq
, int word_size
, int num_channel
)
376 int config1
= 0, config2
= 0, filter
= 0xB3;
377 struct sc_reg_access sc_access
[5];
379 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
380 retval
= mx_init_card();
424 snd_pmic_ops_mx
.num_channel
= num_channel
;
425 /*mute the right channel if MONO*/
426 if (snd_pmic_ops_mx
.num_channel
== 1) {
427 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
428 sc_access
[0].value
= 0x40;
429 sc_access
[0].mask
= MASK6
;
431 sc_access
[1].reg_addr
= 0x224;
432 sc_access
[1].value
= 0x05;
433 sc_access
[1].mask
= MASK0
|MASK1
|MASK2
;
435 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
439 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
440 sc_access
[0].value
= 0x00;
441 sc_access
[0].mask
= MASK6
;
443 sc_access
[1].reg_addr
= 0x224;
444 sc_access
[1].value
= 0x04;
445 sc_access
[1].mask
= MASK0
|MASK1
|MASK2
;
447 retval
= sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, 2);
451 sc_access
[0].reg_addr
= 0x206;
452 sc_access
[0].value
= config1
;
453 sc_access
[1].reg_addr
= 0x207;
454 sc_access
[1].value
= config2
;
456 if (word_size
== 16) {
457 sc_access
[2].value
= 0x51;
458 sc_access
[3].value
= 0x31;
459 } else if (word_size
== 24) {
460 sc_access
[2].value
= 0x52;
461 sc_access
[3].value
= 0x92;
464 sc_access
[2].reg_addr
= 0x209;
465 sc_access
[3].reg_addr
= 0x20e;
467 sc_access
[4].reg_addr
= 0x211;
468 sc_access
[4].value
= filter
;
470 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, 5);
473 static int mx_set_selected_output_dev(u8 dev_id
)
475 struct sc_reg_access sc_access
[2];
479 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
480 retval
= mx_init_card();
485 pr_debug("mx_set_selected_output_dev dev_id:0x%x\n", dev_id
);
486 snd_pmic_ops_mx
.output_dev_id
= dev_id
;
488 case STEREO_HEADPHONE
:
489 sc_access
[0].reg_addr
= 0xFF;
490 sc_access
[0].value
= 0x8C;
492 MASK2
|MASK3
|MASK5
|MASK6
|MASK4
;
498 sc_access
[0].reg_addr
= 0xFF;
499 sc_access
[0].value
= 0xb0;
500 sc_access
[0].mask
= MASK2
|MASK3
|MASK5
|MASK6
|MASK4
;
505 pr_debug("RECEIVER Koski selected\n");
507 /* configuration - AS enable, receiver enable */
508 sc_access
[0].reg_addr
= 0xFF;
509 sc_access
[0].value
= 0x81;
510 sc_access
[0].mask
= 0xff;
515 pr_err("Not a valid output dev\n");
518 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, num_reg
);
522 static int mx_set_voice_port(int status
)
526 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
527 retval
= mx_init_card();
531 if (status
== ACTIVATE
)
532 retval
= mx_set_pcm_voice_params();
537 static int mx_set_audio_port(int status
)
542 static int mx_set_selected_input_dev(u8 dev_id
)
544 struct sc_reg_access sc_access
[2];
548 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
549 retval
= mx_init_card();
553 snd_pmic_ops_mx
.input_dev_id
= dev_id
;
554 pr_debug("mx_set_selected_input_dev dev_id:0x%x\n", dev_id
);
558 sc_access
[0].reg_addr
= 0x223;
559 sc_access
[0].value
= 0x00;
560 sc_access
[0].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
561 sc_access
[1].reg_addr
= 0x222;
562 sc_access
[1].value
= 0x50;
563 sc_access
[1].mask
= MASK7
|MASK6
|MASK5
|MASK4
;
568 sc_access
[0].reg_addr
= 0x223;
569 sc_access
[0].value
= 0x20;
570 sc_access
[0].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
571 sc_access
[1].reg_addr
= 0x222;
572 sc_access
[1].value
= 0x51;
573 sc_access
[1].mask
= MASK7
|MASK6
|MASK5
|MASK4
;
577 sc_access
[1].reg_addr
= 0x222;
578 sc_access
[1].value
= 0x00;
579 sc_access
[1].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
580 sc_access
[0].reg_addr
= 0x223;
581 sc_access
[0].value
= 0x20;
582 sc_access
[0].mask
= MASK7
|MASK6
|MASK5
|MASK4
|MASK0
;
586 return sst_sc_reg_access(sc_access
, PMIC_WRITE
, num_reg
);
589 static int mx_set_mute(int dev_id
, u8 value
)
591 struct sc_reg_access sc_access
[5];
595 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
596 retval
= mx_init_card();
602 pr_debug("set_mute dev_id:0x%x , value:%d\n", dev_id
, value
);
605 case PMIC_SND_DMIC_MUTE
:
606 case PMIC_SND_AMIC_MUTE
:
607 case PMIC_SND_HP_MIC_MUTE
:
608 sc_access
[0].reg_addr
= 0x220;
609 sc_access
[1].reg_addr
= 0x221;
610 sc_access
[2].reg_addr
= 0x223;
612 sc_access
[0].value
= 0x00;
613 sc_access
[1].value
= 0x00;
614 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
615 sc_access
[2].value
= 0x00;
617 sc_access
[2].value
= 0x20;
619 sc_access
[0].value
= 0x20;
620 sc_access
[1].value
= 0x20;
621 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
622 sc_access
[2].value
= 0x20;
624 sc_access
[2].value
= 0x00;
626 sc_access
[0].mask
= MASK5
|MASK6
;
627 sc_access
[1].mask
= MASK5
|MASK6
;
628 sc_access
[2].mask
= MASK5
|MASK6
;
631 case PMIC_SND_LEFT_SPEAKER_MUTE
:
632 case PMIC_SND_LEFT_HP_MUTE
:
633 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
635 sc_access
[0].value
= 0x40;
637 sc_access
[0].value
= 0x00;
638 sc_access
[0].mask
= MASK6
;
640 snd_pmic_ops_mx
.mute_status
= value
;
642 case PMIC_SND_RIGHT_SPEAKER_MUTE
:
643 case PMIC_SND_RIGHT_HP_MUTE
:
644 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
645 if (snd_pmic_ops_mx
.num_channel
== 1)
648 sc_access
[0].value
= 0x40;
650 sc_access
[0].value
= 0x00;
651 sc_access
[0].mask
= MASK6
;
653 snd_pmic_ops_mx
.mute_status
= value
;
655 case PMIC_SND_MUTE_ALL
:
656 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
657 sc_access
[1].reg_addr
= VOL_CTRL_LT
;
658 sc_access
[2].reg_addr
= 0x220;
659 sc_access
[3].reg_addr
= 0x221;
660 sc_access
[4].reg_addr
= 0x223;
661 snd_pmic_ops_mx
.master_mute
= value
;
663 sc_access
[0].value
= sc_access
[1].value
= 0x40;
664 sc_access
[2].value
= 0x00;
665 sc_access
[3].value
= 0x00;
666 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
667 sc_access
[4].value
= 0x00;
669 sc_access
[4].value
= 0x20;
672 sc_access
[0].value
= sc_access
[1].value
= 0x00;
673 sc_access
[2].value
= sc_access
[3].value
= 0x20;
674 sc_access
[4].value
= 0x20;
675 if (snd_pmic_ops_mx
.input_dev_id
== DMIC
)
676 sc_access
[4].value
= 0x20;
678 sc_access
[4].value
= 0x00;
682 if (snd_pmic_ops_mx
.num_channel
== 1)
683 sc_access
[0].value
= 0x40;
684 sc_access
[0].mask
= sc_access
[1].mask
= MASK6
;
685 sc_access
[2].mask
= MASK5
|MASK6
;
686 sc_access
[3].mask
= MASK5
|MASK6
|MASK2
|MASK4
;
687 sc_access
[4].mask
= MASK5
|MASK6
|MASK4
;
691 case PMIC_SND_RECEIVER_MUTE
:
692 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
694 sc_access
[0].value
= 0x40;
696 sc_access
[0].value
= 0x00;
697 sc_access
[0].mask
= MASK6
;
702 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, num_reg
);
705 static int mx_set_vol(int dev_id
, int value
)
707 struct sc_reg_access sc_access
[2] = {{0},};
711 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
712 retval
= mx_init_card();
716 pr_debug("set_vol dev_id:0x%x ,value:%d\n", dev_id
, value
);
718 case PMIC_SND_RECEIVER_VOL
:
721 case PMIC_SND_CAPTURE_VOL
:
722 sc_access
[0].reg_addr
= 0x220;
723 sc_access
[1].reg_addr
= 0x221;
724 sc_access
[0].value
= sc_access
[1].value
= -value
;
725 sc_access
[0].mask
= sc_access
[1].mask
=
726 (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
);
729 case PMIC_SND_LEFT_PB_VOL
:
730 sc_access
[0].value
= -value
;
731 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
732 sc_access
[0].mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
735 case PMIC_SND_RIGHT_PB_VOL
:
736 sc_access
[0].value
= -value
;
737 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
738 sc_access
[0].mask
= (MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
);
739 if (snd_pmic_ops_mx
.num_channel
== 1) {
740 sc_access
[0].value
= 0x40;
741 sc_access
[0].mask
= MASK6
;
742 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
747 return sst_sc_reg_access(sc_access
, PMIC_READ_MODIFY
, num_reg
);
750 static int mx_get_mute(int dev_id
, u8
*value
)
752 struct sc_reg_access sc_access
[4] = {{0},};
753 int retval
= 0, num_reg
= 0, mask
= 0;
755 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
756 retval
= mx_init_card();
761 case PMIC_SND_DMIC_MUTE
:
762 case PMIC_SND_AMIC_MUTE
:
763 case PMIC_SND_HP_MIC_MUTE
:
764 sc_access
[0].reg_addr
= 0x220;
767 retval
= sst_sc_reg_access(sc_access
, PMIC_READ
, num_reg
);
770 *value
= sc_access
[0].value
& mask
;
776 case PMIC_SND_LEFT_HP_MUTE
:
777 case PMIC_SND_LEFT_SPEAKER_MUTE
:
778 sc_access
[0].reg_addr
= VOL_CTRL_LT
;
782 case PMIC_SND_RIGHT_HP_MUTE
:
783 case PMIC_SND_RIGHT_SPEAKER_MUTE
:
784 sc_access
[0].reg_addr
= VOL_CTRL_RT
;
789 retval
= sst_sc_reg_access(sc_access
, PMIC_READ
, num_reg
);
792 *value
= sc_access
[0].value
& mask
;
800 static int mx_get_vol(int dev_id
, int *value
)
802 struct sc_reg_access sc_access
= {0,};
803 int retval
= 0, mask
= 0, num_reg
= 0;
805 if (snd_pmic_ops_mx
.card_status
== SND_CARD_UN_INIT
) {
806 retval
= mx_init_card();
811 case PMIC_SND_CAPTURE_VOL
:
812 sc_access
.reg_addr
= 0x220;
813 mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
;
816 case PMIC_SND_LEFT_PB_VOL
:
817 sc_access
.reg_addr
= VOL_CTRL_LT
;
818 mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
;
821 case PMIC_SND_RIGHT_PB_VOL
:
822 sc_access
.reg_addr
= VOL_CTRL_RT
;
823 mask
= MASK0
|MASK1
|MASK2
|MASK3
|MASK4
|MASK5
;
827 retval
= sst_sc_reg_access(&sc_access
, PMIC_READ
, num_reg
);
830 *value
= -(sc_access
.value
& mask
);
831 pr_debug("get volume value extracted %d\n", *value
);
835 struct snd_pmic_ops snd_pmic_ops_mx
= {
836 .set_input_dev
= mx_set_selected_input_dev
,
837 .set_output_dev
= mx_set_selected_output_dev
,
838 .set_mute
= mx_set_mute
,
839 .get_mute
= mx_get_mute
,
840 .set_vol
= mx_set_vol
,
841 .get_vol
= mx_get_vol
,
842 .init_card
= mx_init_card
,
843 .set_pcm_audio_params
= mx_set_pcm_audio_params
,
844 .set_pcm_voice_params
= mx_set_pcm_voice_params
,
845 .set_voice_port
= mx_set_voice_port
,
846 .set_audio_port
= mx_set_audio_port
,
847 .power_up_pmic_pb
= mx_power_up_pb
,
848 .power_up_pmic_cp
= mx_power_up_cp
,
849 .power_down_pmic_pb
= mx_power_down_pb
,
850 .power_down_pmic_cp
= mx_power_down_cp
,
851 .power_down_pmic
= mx_power_down
,