/* * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef __CONFIG_LINUX_KERNEL_INC__ #define __CONFIG_LINUX_KERNEL_INC__ #include #include #include #include #include #include #include #include /* i2c transaction on Linux limited to 64k (See Linux kernel documentation: Documentation/i2c/writing-clients) */ #define MAX_I2C_BUFFER_SIZE 65536 /* max. length of a alsa mixer control name */ #define MAX_CONTROL_NAME 48 /* dbgprint.h */ #define PRINT(fmt) "%s: " fmt, __func__ #define _ASSERT(e) #define PRINT_ASSERT(e) do { \ if ((e)) \ printk(KERN_ERR "PrintAssert:%s (%s:%d) error code:%d\n", __FUNCTION__, __FILE__, __LINE__, e); \ } while (0) #define TFA98XX_MAX_REGISTER 0xff #define TFA98XX_FLAG_DSP_START_ON_MUTE (1 << 0) #define TFA98XX_FLAG_SKIP_INTERRUPTS (1 << 1) #define TFA98XX_FLAG_SAAM_AVAILABLE (1 << 2) #define TFA98XX_FLAG_STEREO_DEVICE (1 << 3) #define TFA98XX_FLAG_MULTI_MIC_INPUTS (1 << 4) #define TFA98XX_FLAG_TAPDET_AVAILABLE (1 << 5) #define TFA98XX_FLAG_TFA9890_FAM_DEV (1 << 6) #define TFA98XX_NUM_RATES 9 /* DSP init status */ enum tfa98xx_dsp_init_state { TFA98XX_DSP_INIT_STOPPED, /* DSP not running */ TFA98XX_DSP_INIT_RECOVER, /* DSP error detected at runtime */ TFA98XX_DSP_INIT_FAIL, /* DSP init failed */ TFA98XX_DSP_INIT_PENDING, /* DSP start requested */ TFA98XX_DSP_INIT_DONE, /* DSP running */ TFA98XX_DSP_INIT_INVALIDATED, /* DSP was running, requires re-init */ }; enum tfa98xx_dsp_fw_state { TFA98XX_DSP_FW_NONE = 0, TFA98XX_DSP_FW_PENDING, TFA98XX_DSP_FW_FAIL, TFA98XX_DSP_FW_OK, }; struct tfa98xx_firmware { void *base; struct tfa98xx_device *dev; char name[9]; /* TODO get length from tfa parameter defs */ }; struct tfa98xx_baseprofile { char basename[MAX_CONTROL_NAME]; /* profile basename */ int len; /* profile length */ int item_id; /* profile id */ int sr_rate_sup[TFA98XX_NUM_RATES]; /* sample rates supported by this profile */ struct list_head list; /* list of all profiles */ }; struct tfa98xx { struct regmap *regmap; struct i2c_client *i2c; struct regulator *vdd; struct snd_soc_codec *codec; struct workqueue_struct *tfa98xx_wq; struct delayed_work init_work; struct delayed_work monitor_work; struct delayed_work interrupt_work; struct delayed_work tapdet_work; struct mutex dsp_lock; int dsp_init; int dsp_fw_state; int sysclk; int rst_gpio; u16 rev; int has_drc; int audio_mode; struct tfa98xx_firmware fw; char *fw_name; int rate; wait_queue_head_t wq; struct device *dev; unsigned int init_count; int pstream; int cstream; struct input_dev *input; bool tapdet_enabled; /* service enabled */ bool tapdet_open; /* device file opened */ unsigned int tapdet_profiles; /* tapdet profile bitfield */ bool tapdet_poll; /* tapdet running on polling mode */ unsigned int rate_constraint_list[TFA98XX_NUM_RATES]; struct snd_pcm_hw_constraint_list rate_constraint; int reset_gpio; int power_gpio; int irq_gpio; int handle; #ifdef CONFIG_DEBUG_FS struct dentry *dbg_dir; #endif u8 reg; unsigned int count_wait_for_source_state; unsigned int count_noclk; unsigned int flags; }; #if defined(CONFIG_TRACING) && defined(DEBUG) #define tfa98xx_trace_printk(...) trace_printk(__VA_ARGS__) #else #define tfa98xx_trace_printk(...) #endif #endif /* __CONFIG_LINUX_KERNEL_INC__ */