1/* 2 * wmfw.h - Wolfson firmware format information 3 * 4 * Copyright 2012 Wolfson Microelectronics plc 5 * 6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13#ifndef __WMFW_H 14#define __WMFW_H 15 16#include <linux/types.h> 17 18#define WMFW_MAX_ALG_NAME 256 19#define WMFW_MAX_ALG_DESCR_NAME 256 20 21#define WMFW_MAX_COEFF_NAME 256 22#define WMFW_MAX_COEFF_DESCR_NAME 256 23 24#define WMFW_CTL_FLAG_SYS 0x8000 25#define WMFW_CTL_FLAG_VOLATILE 0x0004 26#define WMFW_CTL_FLAG_WRITEABLE 0x0002 27#define WMFW_CTL_FLAG_READABLE 0x0001 28 29/* Non-ALSA coefficient types start at 0x1000 */ 30#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */ 31#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */ 32 33struct wmfw_header { 34 char magic[4]; 35 __le32 len; 36 __le16 rev; 37 u8 core; 38 u8 ver; 39} __packed; 40 41struct wmfw_footer { 42 __le64 timestamp; 43 __le32 checksum; 44} __packed; 45 46struct wmfw_adsp1_sizes { 47 __le32 dm; 48 __le32 pm; 49 __le32 zm; 50} __packed; 51 52struct wmfw_adsp2_sizes { 53 __le32 xm; 54 __le32 ym; 55 __le32 pm; 56 __le32 zm; 57} __packed; 58 59struct wmfw_region { 60 union { 61 __be32 type; 62 __le32 offset; 63 }; 64 __le32 len; 65 u8 data[]; 66} __packed; 67 68struct wmfw_id_hdr { 69 __be32 core_id; 70 __be32 core_rev; 71 __be32 id; 72 __be32 ver; 73} __packed; 74 75struct wmfw_adsp1_id_hdr { 76 struct wmfw_id_hdr fw; 77 __be32 zm; 78 __be32 dm; 79 __be32 n_algs; 80} __packed; 81 82struct wmfw_adsp2_id_hdr { 83 struct wmfw_id_hdr fw; 84 __be32 zm; 85 __be32 xm; 86 __be32 ym; 87 __be32 n_algs; 88} __packed; 89 90struct wmfw_alg_hdr { 91 __be32 id; 92 __be32 ver; 93} __packed; 94 95struct wmfw_adsp1_alg_hdr { 96 struct wmfw_alg_hdr alg; 97 __be32 zm; 98 __be32 dm; 99} __packed; 100 101struct wmfw_adsp2_alg_hdr { 102 struct wmfw_alg_hdr alg; 103 __be32 zm; 104 __be32 xm; 105 __be32 ym; 106} __packed; 107 108struct wmfw_adsp_alg_data { 109 __le32 id; 110 u8 name[WMFW_MAX_ALG_NAME]; 111 u8 descr[WMFW_MAX_ALG_DESCR_NAME]; 112 __le32 ncoeff; 113 u8 data[]; 114} __packed; 115 116struct wmfw_adsp_coeff_data { 117 struct { 118 __le16 offset; 119 __le16 type; 120 __le32 size; 121 } hdr; 122 u8 name[WMFW_MAX_COEFF_NAME]; 123 u8 descr[WMFW_MAX_COEFF_DESCR_NAME]; 124 __le16 ctl_type; 125 __le16 flags; 126 __le32 len; 127 u8 data[]; 128} __packed; 129 130struct wmfw_coeff_hdr { 131 u8 magic[4]; 132 __le32 len; 133 union { 134 __be32 rev; 135 __le32 ver; 136 }; 137 union { 138 __be32 core; 139 __le32 core_ver; 140 }; 141 u8 data[]; 142} __packed; 143 144struct wmfw_coeff_item { 145 __le16 offset; 146 __le16 type; 147 __le32 id; 148 __le32 ver; 149 __le32 sr; 150 __le32 len; 151 u8 data[]; 152} __packed; 153 154#define WMFW_ADSP1 1 155#define WMFW_ADSP2 2 156 157#define WMFW_ABSOLUTE 0xf0 158#define WMFW_ALGORITHM_DATA 0xf2 159#define WMFW_NAME_TEXT 0xfe 160#define WMFW_INFO_TEXT 0xff 161 162#define WMFW_ADSP1_PM 2 163#define WMFW_ADSP1_DM 3 164#define WMFW_ADSP1_ZM 4 165 166#define WMFW_ADSP2_PM 2 167#define WMFW_ADSP2_ZM 4 168#define WMFW_ADSP2_XM 5 169#define WMFW_ADSP2_YM 6 170 171#endif 172