18611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#ifndef __LINUX_MFD_MSM_ADIE_CODEC_H 28611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define __LINUX_MFD_MSM_ADIE_CODEC_H 38611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 48611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#include <linux/types.h> 58611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 68611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* Value Represents a entry */ 78611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_ACTION_ENTRY 0x1 88611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* Value representing a delay wait */ 98611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_ACTION_DELAY_WAIT 0x2 108611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* Value representing a stage reached */ 118611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_ACTION_STAGE_REACHED 0x3 128611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 138611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* This value is the state after the client sets the path */ 148611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_PATH_OFF 0x0050 158611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 168611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* State to which client asks the drv to proceed to where it can 178611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * set up the clocks and 0-fill PCM buffers 188611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu */ 198611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_DIGITAL_READY 0x0100 208611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 218611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* State to which client asks the drv to proceed to where it can 228611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * start sending data after internal steady state delay 238611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu */ 248611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_DIGITAL_ANALOG_READY 0x1000 258611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 268611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 278611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* Client Asks adie to switch off the Analog portion of the 288611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * the internal codec. After the use of this path 298611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu */ 308611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_ANALOG_OFF 0x0750 318611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 328611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 338611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* Client Asks adie to switch off the digital portion of the 348611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * the internal codec. After switching off the analog portion. 358611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * 368611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * 0-fill PCM may or maynot be sent at this point 378611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * 388611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu */ 398611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_DIGITAL_OFF 0x0600 408611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 418611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* State to which client asks the drv to write the default values 428611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * to the registers */ 438611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_FLASH_IMAGE 0x0001 448611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 458611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu/* Path type */ 468611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_RX 0 478611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_TX 1 488611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_LB 3 498611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_MAX 4 508611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 518611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_PACK_ENTRY(reg, mask, val) ((val)|(mask << 8)|(reg << 16)) 528611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 538611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#define ADIE_CODEC_UNPACK_ENTRY(packed, reg, mask, val) \ 548611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu do { \ 558611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu ((reg) = ((packed >> 16) & (0xff))); \ 568611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu ((mask) = ((packed >> 8) & (0xff))); \ 578611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu ((val) = ((packed) & (0xff))); \ 588611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu } while (0); 598611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 608611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_action_unit { 618611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 type; 628611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 action; 638611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu}; 648611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 658611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_hwsetting_entry{ 668611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu struct adie_codec_action_unit *actions; 678611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 action_sz; 688611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 freq_plan; 698611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 osr; 708611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu /* u32 VolMask; 718611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu * u32 SidetoneMask; 728611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu */ 738611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu}; 748611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 758611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_dev_profile { 768611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 path_type; /* RX or TX */ 778611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 setting_sz; 788611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu struct adie_codec_hwsetting_entry *settings; 798611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu}; 808611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 818611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_register { 828611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u8 reg; 838611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u8 mask; 848611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u8 val; 858611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu}; 868611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 878611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_register_image { 888611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu struct adie_codec_register *regs; 898611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 img_sz; 908611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu}; 918611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 928611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_path; 938611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 948611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_anc_data { 958611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 size; 968611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 writes[]; 978611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu}; 988611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 998611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsustruct adie_codec_operations { 1008611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int codec_id; 1018611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_open) (struct adie_codec_dev_profile *profile, 1028611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu struct adie_codec_path **path_pptr); 1038611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_close) (struct adie_codec_path *path_ptr); 1048611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_setpath) (struct adie_codec_path *path_ptr, 1058611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 freq_plan, u32 osr); 1068611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_proceed_stage) (struct adie_codec_path *path_ptr, 1078611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 state); 1088611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 (*codec_freq_supported) (struct adie_codec_dev_profile *profile, 1098611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 requested_freq); 1108611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_enable_sidetone) (struct adie_codec_path *rx_path_ptr, 1118611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 enable); 1128611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_enable_anc) (struct adie_codec_path *rx_path_ptr, 1138611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 enable, struct adie_codec_anc_data *calibration_writes); 1148611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_set_device_digital_volume) ( 1158611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu struct adie_codec_path *path_ptr, 1168611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 num_channels, 1178611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 vol_percentage); 1188611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 1198611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_set_device_analog_volume) (struct adie_codec_path *path_ptr, 1208611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 num_channels, 1218611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 volume); 1228611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu int (*codec_set_master_mode) (struct adie_codec_path *path_ptr, 1238611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u8 master); 1248611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu}; 1258611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 1268611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_register_codec_operations( 1278611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu const struct adie_codec_operations *codec_ops); 1288611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_open(struct adie_codec_dev_profile *profile, 1298611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu struct adie_codec_path **path_pptr); 1308611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_setpath(struct adie_codec_path *path_ptr, 1318611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 freq_plan, u32 osr); 1328611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_proceed_stage(struct adie_codec_path *path_ptr, u32 state); 1338611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_close(struct adie_codec_path *path_ptr); 1348611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuu32 adie_codec_freq_supported(struct adie_codec_dev_profile *profile, 1358611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 requested_freq); 1368611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_enable_sidetone(struct adie_codec_path *rx_path_ptr, u32 enable); 1378611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_enable_anc(struct adie_codec_path *rx_path_ptr, u32 enable, 1388611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu struct adie_codec_anc_data *calibration_writes); 1398611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_set_device_digital_volume(struct adie_codec_path *path_ptr, 1408611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 num_channels, u32 vol_percentage /* in percentage */); 1418611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 1428611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_set_device_analog_volume(struct adie_codec_path *path_ptr, 1438611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu u32 num_channels, u32 volume /* in percentage */); 1448611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu 1458611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsuint adie_codec_set_master_mode(struct adie_codec_path *path_ptr, u8 master); 1468611d5578ff014a1415b26e75e63aecbc4ad266cBrian Muramatsu#endif 147