- 根目录:
- sound
- soc
- codecs
- wm8962.c
C++程序
|
4314行
|
176.53 KB
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/gcd.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <linux/workqueue.h>
#include <sound/core.h>
#include <sound/jack.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/initval.h>
#include <sound/tlv.h>
#include <sound/wm8962.h>
#include <trace/events/asoc.h>
#include "wm8962.h"
#define WM8962_NUM_SUPPLIES 8
static const char *wm8962_supply_names[WM8962_NUM_SUPPLIES] = {
"DCVDD",
"DBVDD",
"AVDD",
"CPVDD",
"MICVDD",
"PLLVDD",
"SPKVDD1",
"SPKVDD2",
};
struct wm8962_priv {
struct regmap *regmap;
struct snd_soc_codec *codec;
int sysclk;
int sysclk_rate;
int bclk;
int lrclk;
struct completion fll_lock;
int fll_src;
int fll_fref;
int fll_fout;
u16 dsp2_ena;
struct delayed_work mic_work;
struct snd_soc_jack *jack;
struct regulator_bulk_data supplies[WM8962_NUM_SUPPLIES];
struct notifier_block disable_nb[WM8962_NUM_SUPPLIES];
#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
struct input_dev *beep;
struct work_struct beep_work;
int beep_rate;
#endif
#ifdef CONFIG_GPIOLIB
struct gpio_chip gpio_chip;
#endif
int irq;
};
#define WM8962_REGULATOR_EVENT(n) \
static int wm8962_regulator_event_##n(struct notifier_block *nb, \
unsigned long event, void *data) \
{ \
struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \
disable_nb[n]); \
if (event & REGULATOR_EVENT_DISABLE) { \
regcache_mark_dirty(wm8962->regmap); \
} \
return 0; \
}
WM8962_REGULATOR_EVENT(0)
WM8962_REGULATOR_EVENT(1)
WM8962_REGULATOR_EVENT(2)
WM8962_REGULATOR_EVENT(3)
WM8962_REGULATOR_EVENT(4)
WM8962_REGULATOR_EVENT(5)
WM8962_REGULATOR_EVENT(6)
WM8962_REGULATOR_EVENT(7)
static struct reg_default wm8962_reg[] = {
{ 0, 0x009F },
{ 1, 0x049F },
{ 2, 0x0000 },
{ 3, 0x0000 },
{ 4, 0x0020 },
{ 5, 0x0018 },
{ 6, 0x2008 },
{ 7, 0x000A },
{ 8, 0x01E4 },
{ 9, 0x0300 },
{ 10, 0x00C0 },
{ 11, 0x00C0 },
{ 14, 0x0040 },
{ 15, 0x6243 },
{ 17, 0x007B },
{ 18, 0x0000 },
{ 19, 0x1C32 },
{ 20, 0x3200 },
{ 21, 0x00C0 },
{ 22, 0x00C0 },
{ 23, 0x0160 },
{ 24, 0x0000 },
{ 25, 0x0000 },
{ 26, 0x0000 },
{ 27, 0x0010 },
{ 28, 0x0000 },
{ 30, 0x005E },
{ 31, 0x0000 },
{ 32, 0x0145 },
{ 33, 0x0145 },
{ 34, 0x0009 },
{ 35, 0x0003 },
{ 37, 0x0008 },
{ 38, 0x0008 },
{ 40, 0x0000 },
{ 41, 0x0000 },
{ 47, 0x0000 },
{ 48, 0x8027 },
{ 49, 0x0010 },
{ 51, 0x0003 },
{ 56, 0x0506 },
{ 57, 0x0000 },
{ 58, 0x0000 },
{ 60, 0x0300 },
{ 61, 0x0300 },
{ 64, 0x0810 },
{ 66, 0x0000 },
{ 68, 0x001B },
{ 69, 0x0000 },
{ 71, 0x01FB },
{ 72, 0x0000 },
{ 82, 0x0004 },
{ 87, 0x0000 },
{ 90, 0x0000 },
{ 93, 0x0000 },
{ 94, 0x0000 },
{ 99, 0x0000 },
{ 100, 0x0000 },
{ 101, 0x0000 },
{ 102, 0x013F },
{ 103, 0x013F },
{ 105, 0x0000 },
{ 106, 0x0000 },
{ 107, 0x013F },
{ 108, 0x013F },
{ 109, 0x0003 },
{ 110, 0x0002 },
{ 115, 0x0006 },
{ 116, 0x0026 },
{ 119, 0x0000 },
{ 124, 0x0011 },
{ 125, 0x004B },
{ 126, 0x000D },
{ 127, 0x0000 },
{ 129, 0x0000 },
{ 131, 0x0000 },
{ 136, 0x0067 },
{ 137, 0x001C },
{ 138, 0x0071 },
{ 139, 0x00C7 },
{ 140, 0x0067 },
{ 141, 0x0048 },
{ 142, 0x0022 },
{ 143, 0x0097 },
{ 155, 0x000C },
{ 156, 0x0039 },
{ 157, 0x0180 },
{ 159, 0x0032 },
{ 160, 0x0018 },
{ 161, 0x007D },
{ 162, 0x0008 },
{ 252, 0x0005 },
{ 256, 0x0000 },
{ 257, 0x0000 },
{ 258, 0x0000 },
{ 259, 0x0000 },
{ 260, 0x0000 },
{ 261, 0x0000 },
{ 262, 0x0000 },
{ 264, 0x0000 },
{ 265, 0x0000 },
{ 268, 0x0000 },
{ 269, 0x0000 },
{ 270, 0x0000 },
{ 271, 0x0000 },
{ 276, 0x000C },
{ 277, 0x0925 },
{ 278, 0x0000 },
{ 279, 0x0000 },
{ 280, 0x0000 },
{ 285, 0x0000 },
{ 335, 0x0004 },
{ 336, 0x6318 },
{ 337, 0x6300 },
{ 338, 0x0FCA },
{ 339, 0x0400 },
{ 340, 0x00D8 },
{ 341, 0x1EB5 },
{ 342, 0xF145 },
{ 343, 0x0B75 },
{ 344, 0x01C5 },
{ 345, 0x1C58 },
{ 346, 0xF373 },
{ 347, 0x0A54 },
{ 348, 0x0558 },
{ 349, 0x168E },
{ 350, 0xF829 },
{ 351, 0x07AD },
{ 352, 0x1103 },
{ 353, 0x0564 },
{ 354, 0x0559 },
{ 355, 0x4000 },
{ 356, 0x6318 },
{ 357, 0x6300 },
{ 358, 0x0FCA },
{ 359, 0x0400 },
{ 360, 0x00D8 },
{ 361, 0x1EB5 },
{ 362, 0xF145 },
{ 363, 0x0B75 },
{ 364, 0x01C5 },
{ 365, 0x1C58 },
{ 366, 0xF373 },
{ 367, 0x0A54 },
{ 368, 0x0558 },
{ 369, 0x168E },
{ 370, 0xF829 },
{ 371, 0x07AD },
{ 372, 0x1103 },
{ 373, 0x0564 },
{ 374, 0x0559 },
{ 375, 0x4000 },
{ 513, 0x0000 },
{ 514, 0x0000 },
{ 516, 0x8100 },
{ 517, 0x8100 },
{ 560, 0x0000 },
{ 561, 0x0000 },
{ 568, 0x0030 },
{ 569, 0xFFED },
{ 576, 0x0000 },
{ 584, 0x002D },
{ 586, 0x0000 },
{ 768, 0x1C00 },
{ 1037, 0x0000 },
{ 8192, 0x0000 },
{ 9216, 0x0030 },
{ 9217, 0x0000 },
{ 9218, 0x0000 },
{ 12288, 0x0000 },
{ 12289, 0x0000 },
{ 13312, 0x0000 },
{ 13313, 0x0000 },
{ 14336, 0x0000 },
{ 14337, 0x0000 },
{ 15360, 0x000A },
{ 16384, 0x0000 },
{ 16385, 0x0000 },
{ 16386, 0x0000 },
{ 16387, 0x0000 },
{ 16388, 0x0000 },
{ 16389, 0x0000 },
{ 16896, 0x0002 },
{ 16897, 0xBD12 },
{ 16898, 0x007C },
{ 16899, 0x586C },
{ 16900, 0x0053 },
{ 16901, 0x8121 },
{ 16902, 0x003F },
{ 16903, 0x8BD8 },
{ 16904, 0x0032 },
{ 16905, 0xF52D },
{ 16906, 0x0065 },
{ 16907, 0xAC8C },
{ 16908, 0x006B },
{ 16909, 0xE087 },
{ 16910, 0x0072 },
{ 16911, 0x1483 },
{ 16912, 0x0072 },
{ 16913, 0x1483 },
{ 16914, 0x0043 },
{ 16915, 0x3525 },
{ 16916, 0x0006 },
{ 16917, 0x6A4A },
{ 16918, 0x0043 },
{ 16919, 0x6079 },
{ 16920, 0x0008 },
{ 16921, 0x0000 },
{ 16922, 0x0001 },
{ 16923, 0x0000 },
{ 16924, 0x0059 },
{ 16925, 0x999A },
{ 17048, 0x0083 },
{ 17049, 0x98AD },
{ 17920, 0x007F },
{ 17921, 0xFFFF },
{ 17922, 0x0000 },
{ 17923, 0x0000 },
{ 17924, 0x0000 },
{ 17925, 0x0000 },
{ 17926, 0x0000 },
{ 17927, 0x0000 },
{ 17928, 0x0000 },
{ 17929, 0x0000 },
{ 17930, 0x0000 },
{ 17931, 0x0000 },
{ 17932, 0x0000 },
{ 17933, 0x0000 },
{ 17934, 0x0000 },
{ 17935, 0x0000 },
{ 17936, 0x0000 },
{ 17937, 0x0000 },
{ 17938, 0x0000 },
{ 17939, 0x0000 },
{ 17940, 0x0000 },
{ 17941, 0x0000 },
{ 17942, 0x0000 },
{ 17943, 0x0000 },
{ 17944, 0x0000 },
{ 17945, 0x0000 },
{ 17946, 0x0000 },
{ 17947, 0x0000 },
{ 17948, 0x0000 },
{ 17949, 0x0000 },
{ 17950, 0x0000 },
{ 17951, 0x0000 },
{ 17952, 0x0000 },
{ 17953, 0x0000 },
{ 17954, 0x0000 },
{ 17955, 0x0000 },
{ 17956, 0x0000 },
{ 17957, 0x0000 },
{ 17958, 0x0000 },
{ 17959, 0x0000 },
{ 17960, 0x0000 },
{ 17961, 0x0000 },
{ 17962, 0x0000 },
{ 17963, 0x0000 },
{ 17964, 0x0000 },
{ 17965, 0x0000 },
{ 17966, 0x0000 },
{ 17967, 0x0000 },
{ 17968, 0x0000 },
{ 17969, 0x0000 },
{ 17970, 0x0000 },
{ 17971, 0x0000 },
{ 17972, 0x0000 },
{ 17973, 0x0000 },
{ 17974, 0x0000 },
{ 17975, 0x0000 },
{ 17976, 0x0000 },
{ 17977, 0x0000 },
{ 17978, 0x0000 },
{ 17979, 0x0000 },
{ 17980, 0x0000 },
{ 17981, 0x0000 },
{ 17982, 0x0000 },
{ 17983, 0x0000 },
{ 18432, 0x0020 },
{ 18433, 0x0000 },
{ 18434, 0x0040 },
{ 18435, 0x0000 },
{ 18944, 0x007F },
{ 18945, 0xFFFF },
{ 18946, 0x0000 },
{ 18947, 0x0000 },
{ 18948, 0x0000 },
{ 18949, 0x0000 },
{ 18950, 0x0000 },
{ 18951, 0x0000 },
{ 18952, 0x0000 },
{ 18953, 0x0000 },
{ 18954, 0x0000 },
{ 18955, 0x0000 },
{ 18956, 0x0000 },
{ 18957, 0x0000 },
{ 18958, 0x0000 },
{ 18959, 0x0000 },
{ 18960, 0x0000 },
{ 18961, 0x0000 },
{ 18962, 0x0000 },
{ 18963, 0x0000 },
{ 18964, 0x0000 },
{ 18965, 0x0000 },
{ 18966, 0x0000 },
{ 18967, 0x0000 },
{ 18968, 0x0000 },
{ 18969, 0x0000 },
{ 18970, 0x0000 },
{ 18971, 0x0000 },
{ 18972, 0x0000 },
{ 18973, 0x0000 },
{ 18974, 0x0000 },
{ 18975, 0x0000 },
{ 18976, 0x0000 },
{ 18977, 0x0000 },
{ 18978, 0x0000 },
{ 18979, 0x0000 },
{ 18980, 0x0000 },
{ 18981, 0x0000 },
{ 18982, 0x0000 },
{ 18983, 0x0000 },
{ 18984, 0x0000 },
{ 18985, 0x0000 },
{ 18986, 0x0000 },
{ 18987, 0x0000 },
{ 18988, 0x0000 },
{ 18989, 0x0000 },
{ 18990, 0x0000 },
{ 18991, 0x0000 },
{ 18992, 0x0000 },
{ 18993, 0x0000 },
{ 18994, 0x0000 },
{ 18995, 0x0000 },
{ 18996, 0x0000 },
{ 18997, 0x0000 },
{ 18998, 0x0000 },
{ 18999, 0x0000 },
{ 19000, 0x0000 },
{ 19001, 0x0000 },
{ 19002, 0x0000 },
{ 19003, 0x0000 },
{ 19004, 0x0000 },
{ 19005, 0x0000 },
{ 19006, 0x0000 },
{ 19007, 0x0000 },
{ 19456, 0x007F },
{ 19457, 0xFFFF },
{ 19458, 0x0000 },
{ 19459, 0x0000 },
{ 19460, 0x0000 },
{ 19461, 0x0000 },
{ 19462, 0x0000 },
{ 19463, 0x0000 },
{ 19464, 0x0000 },
{ 19465, 0x0000 },
{ 19466, 0x0000 },
{ 19467, 0x0000 },
{ 19468, 0x0000 },
{ 19469, 0x0000 },
{ 19470, 0x0000 },
{ 19471, 0x0000 },
{ 19472, 0x0000 },
{ 19473, 0x0000 },
{ 19474, 0x0000 },
{ 19475, 0x0000 },
{ 19476, 0x0000 },
{ 19477, 0x0000 },
{ 19478, 0x0000 },
{ 19479, 0x0000 },
{ 19480, 0x0000 },
{ 19481, 0x0000 },
{ 19482, 0x0000 },
{ 19483, 0x0000 },
{ 19484, 0x0000 },
{ 19485, 0x0000 },
{ 19486, 0x0000 },
{ 19487, 0x0000 },
{ 19488, 0x0000 },
{ 19489, 0x0000 },
{ 19490, 0x0000 },
{ 19491, 0x0000 },
{ 19492, 0x0000 },
{ 19493, 0x0000 },
{ 19494, 0x0000 },
{ 19495, 0x0000 },
{ 19496, 0x0000 },
{ 19497, 0x0000 },
{ 19498, 0x0000 },
{ 19499, 0x0000 },
{ 19500, 0x0000 },
{ 19501, 0x0000 },
{ 19502, 0x0000 },
{ 19503, 0x0000 },
{ 19504, 0x0000 },
{ 19505, 0x0000 },
{ 19506, 0x0000 },
{ 19507, 0x0000 },
{ 19508, 0x0000 },
{ 19509, 0x0000 },
{ 19510, 0x0000 },
{ 19511, 0x0000 },
{ 19512, 0x0000 },
{ 19513, 0x0000 },
{ 19514, 0x0000 },
{ 19515, 0x0000 },
{ 19516, 0x0000 },
{ 19517, 0x0000 },
{ 19518, 0x0000 },
{ 19519, 0x0000 },
{ 19968, 0x0020 },
{ 19969, 0x0000 },
{ 19970, 0x0040 },
{ 19971, 0x0000 },
{ 20480, 0x007F },
{ 20481, 0xFFFF },
{ 20482, 0x0000 },
{ 20483, 0x0000 },
{ 20484, 0x0000 },
{ 20485, 0x0000 },
{ 20486, 0x0000 },
{ 20487, 0x0000 },
{ 20488, 0x0000 },
{ 20489, 0x0000 },
{ 20490, 0x0000 },
{ 20491, 0x0000 },
{ 20492, 0x0000 },
{ 20493, 0x0000 },
{ 20494, 0x0000 },
{ 20495, 0x0000 },
{ 20496, 0x0000 },
{ 20497, 0x0000 },
{ 20498, 0x0000 },
{ 20499, 0x0000 },
{ 20500, 0x0000 },
{ 20501, 0x0000 },
{ 20502, 0x0000 },
{ 20503, 0x0000 },
{ 20504, 0x0000 },
{ 20505, 0x0000 },
{ 20506, 0x0000 },
{ 20507, 0x0000 },
{ 20508, 0x0000 },
{ 20509, 0x0000 },
{ 20510, 0x0000 },
{ 20511, 0x0000 },
{ 20512, 0x0000 },
{ 20513, 0x0000 },
{ 20514, 0x0000 },
{ 20515, 0x0000 },
{ 20516, 0x0000 },
{ 20517, 0x0000 },
{ 20518, 0x0000 },
{ 20519, 0x0000 },
{ 20520, 0x0000 },
{ 20521, 0x0000 },
{ 20522, 0x0000 },
{ 20523, 0x0000 },
{ 20524, 0x0000 },
{ 20525, 0x0000 },
{ 20526, 0x0000 },
{ 20527, 0x0000 },
{ 20528, 0x0000 },
{ 20529, 0x0000 },
{ 20530, 0x0000 },
{ 20531, 0x0000 },
{ 20532, 0x0000 },
{ 20533, 0x0000 },
{ 20534, 0x0000 },
{ 20535, 0x0000 },
{ 20536, 0x0000 },
{ 20537, 0x0000 },
{ 20538, 0x0000 },
{ 20539, 0x0000 },
{ 20540, 0x0000 },
{ 20541, 0x0000 },
{ 20542, 0x0000 },
{ 20543, 0x0000 },
{ 20992, 0x008C },
{ 20993, 0x0200 },
{ 20994, 0x0035 },
{ 20995, 0x0700 },
{ 20996, 0x003A },
{ 20997, 0x4100 },
{ 20998, 0x008B },
{ 20999, 0x7D00 },
{ 21000, 0x003A },
{ 21001, 0x4100 },
{ 21002, 0x008C },
{ 21003, 0xFEE8 },
{ 21004, 0x0078 },
{ 21005, 0x0000 },
{ 21006, 0x003F },
{ 21007, 0xB260 },
{ 21008, 0x002D },
{ 21009, 0x1818 },
{ 21010, 0x0020 },
{ 21011, 0x0000 },
{ 21012, 0x00F1 },
{ 21013, 0x8340 },
{ 21014, 0x00FB },
{ 21015, 0x8300 },
{ 21016, 0x00EE },
{ 21017, 0xAEC0 },
{ 21018, 0x00FB },
{ 21019, 0xAC40 },
{ 21020, 0x00F1 },
{ 21021, 0x7F80 },
{ 21022, 0x00F4 },
{ 21023, 0x3B40 },
{ 21024, 0x00F5 },
{ 21025, 0xFB00 },
{ 21026, 0x00EA },
{ 21027, 0x10C0 },
{ 21028, 0x00FC },
{ 21029, 0xC580 },
{ 21030, 0x00E2 },
{ 21031, 0x75C0 },
{ 21032, 0x0004 },
{ 21033, 0xB480 },
{ 21034, 0x00D4 },
{ 21035, 0xF980 },
{ 21036, 0x0004 },
{ 21037, 0x9140 },
{ 21038, 0x00D8 },
{ 21039, 0xA480 },
{ 21040, 0x0002 },
{ 21041, 0x3DC0 },
{ 21042, 0x00CF },
{ 21043, 0x7A80 },
{ 21044, 0x00DC },
{ 21045, 0x0600 },
{ 21046, 0x00F2 },
{ 21047, 0xDAC0 },
{ 21048, 0x00BA },
{ 21049, 0xF340 },
{ 21050, 0x000A },
{ 21051, 0x7940 },
{ 21052, 0x001C },
{ 21053, 0x0680 },
{ 21054, 0x00FD },
{ 21055, 0x2D00 },
{ 21056, 0x001C },
{ 21057, 0xE840 },
{ 21058, 0x000D },
{ 21059, 0xDC40 },
{ 21060, 0x00FC },
{ 21061, 0x9D00 },
{ 21062, 0x0009 },
{ 21063, 0x5580 },
{ 21064, 0x00FE },
{ 21065, 0x7E80 },
{ 21066, 0x000E },
{ 21067, 0xAB40 },
{ 21068, 0x00F9 },
{ 21069, 0x9880 },
{ 21070, 0x0009 },
{ 21071, 0x87C0 },
{ 21072, 0x00FD },
{ 21073, 0x2C40 },
{ 21074, 0x0009 },
{ 21075, 0x4800 },
{ 21076, 0x0003 },
{ 21077, 0x5F40 },
{ 21078, 0x0000 },
{ 21079, 0x8700 },
{ 21080, 0x00FA },
{ 21081, 0xE4C0 },
{ 21082, 0x0000 },
{ 21083, 0x0B40 },
{ 21084, 0x0004 },
{ 21085, 0xE180 },
{ 21086, 0x0001 },
{ 21087, 0x1F40 },
{ 21088, 0x00F8 },
{ 21089, 0xB000 },
{ 21090, 0x00FB },
{ 21091, 0xCBC0 },
{ 21092, 0x0004 },
{ 21093, 0xF380 },
{ 21094, 0x0007 },
{ 21095, 0xDF40 },
{ 21096, 0x00FF },
{ 21097, 0x0700 },
{ 21098, 0x00EF },
{ 21099, 0xD700 },
{ 21100, 0x00FB },
{ 21101, 0xAF40 },
{ 21102, 0x0010 },
{ 21103, 0x8A80 },
{ 21104, 0x0011 },
{ 21105, 0x07C0 },
{ 21106, 0x00E0 },
{ 21107, 0x0800 },
{ 21108, 0x00D2 },
{ 21109, 0x7600 },
{ 21110, 0x0020 },
{ 21111, 0xCF40 },
{ 21112, 0x0030 },
{ 21113, 0x2340 },
{ 21114, 0x00FD },
{ 21115, 0x69C0 },
{ 21116, 0x0028 },
{ 21117, 0x3500 },
{ 21118, 0x0006 },
{ 21119, 0x3300 },
{ 21120, 0x00D9 },
{ 21121, 0xF6C0 },
{ 21122, 0x00F3 },
{ 21123, 0x3340 },
{ 21124, 0x000F },
{ 21125, 0x4200 },
{ 21126, 0x0004 },
{ 21127, 0x0C80 },
{ 21128, 0x00FB },
{ 21129, 0x3F80 },
{ 21130, 0x00F7 },
{ 21131, 0x57C0 },
{ 21132, 0x0003 },
{ 21133, 0x5400 },
{ 21134, 0x0000 },
{ 21135, 0xC6C0 },
{ 21136, 0x0003 },
{ 21137, 0x12C0 },
{ 21138, 0x00FD },
{ 21139, 0x8580 },
};
static const struct wm8962_reg_access {
u16 read;
u16 write;
u16 vol;
} wm8962_reg_access[WM8962_MAX_REGISTER + 1] = {
[0] = { 0x00FF, 0x01FF, 0x0000 },
[1] = { 0xFEFF, 0x01FF, 0x0000 },
[2] = { 0x00FF, 0x01FF, 0x0000 },
[3] = { 0x00FF, 0x01FF, 0x0000 },
[4] = { 0x07FE, 0x07FE, 0xFFFF },
[5] = { 0x007F, 0x007F, 0x0000 },
[6] = { 0x37ED, 0x37ED, 0x0000 },
[7] = { 0x1FFF, 0x1FFF, 0x0000 },
[8] = { 0x0FEF, 0x0FEF, 0xFFFF },
[9] = { 0x0B9F, 0x039F, 0x0000 },
[10] = { 0x00FF, 0x01FF, 0x0000 },
[11] = { 0x00FF, 0x01FF, 0x0000 },
[14] = { 0x07FF, 0x07FF, 0x0000 },
[15] = { 0xFFFF, 0xFFFF, 0xFFFF },
[17] = { 0x07FF, 0x07FF, 0x0000 },
[18] = { 0xF8FF, 0x00FF, 0xFFFF },
[19] = { 0x1DFF, 0x1DFF, 0x0000 },
[20] = { 0xFFFF, 0xFFFF, 0x0000 },
[21] = { 0x00FF, 0x01FF, 0x0000 },
[22] = { 0x00FF, 0x01FF, 0x0000 },
[23] = { 0x0161, 0x0161, 0x0000 },
[24] = { 0x0008, 0x0008, 0x0000 },
[25] = { 0x07FE, 0x07FE, 0x0000 },
[26] = { 0x01FB, 0x01FB, 0x0000 },
[27] = { 0x0017, 0x0017, 0x0000 },
[28] = { 0x001C, 0x001C, 0x0000 },
[30] = { 0xFFFE, 0xFFFE, 0x0000 },
[31] = { 0x000F, 0x000F, 0x0000 },
[32] = { 0x01FF, 0x01FF, 0x0000 },
[33] = { 0x01FF, 0x01FF, 0x0000 },
[34] = { 0x003F, 0x003F, 0x0000 },
[35] = { 0x003F, 0x003F, 0x0000 },
[37] = { 0x001F, 0x001F, 0x0000 },
[38] = { 0x001F, 0x001F, 0x0000 },
[40] = { 0x00FF, 0x01FF, 0x0000 },
[41] = { 0x00FF, 0x01FF, 0x0000 },
[47] = { 0x000F, 0x0000, 0xFFFF },
[48] = { 0x7EC7, 0x7E07, 0xFFFF },
[49] = { 0x00D3, 0x00D7, 0xFFFF },
[51] = { 0x0047, 0x0047, 0x0000 },
[56] = { 0x001E, 0x001E, 0x0000 },
[57] = { 0x02FC, 0x02FC, 0x0000 },
[58] = { 0x00FC, 0x00FC, 0x0000 },
[60] = { 0x00CC, 0x00CC, 0x0000 },
[61] = { 0x00DD, 0x00DD, 0x0000 },
[64] = { 0x3F80, 0x3F80, 0x0000 },
[66] = { 0x0780, 0x0000, 0xFFFF },
[68] = { 0x0007, 0x0007, 0x0000 },
[69] = { 0x00FF, 0x00FF, 0x0000 },
[71] = { 0x01FF, 0x01FF, 0x0000 },
[72] = { 0x0001, 0x0001, 0x0000 },
[82] = { 0x0001, 0x0001, 0x0000 },
[87] = { 0x00A0, 0x00A0, 0x0000 },
[90] = { 0x007F, 0x01FF, 0x0000 },
[93] = { 0x03F9, 0x0000, 0x0000 },
[94] = { 0x0070, 0x0070, 0x0000 },
[99] = { 0x000F, 0x000F, 0x0000 },
[100] = { 0x00BF, 0x00BF, 0x0000 },
[101] = { 0x00BF, 0x00BF, 0x0000 },
[102] = { 0x01FF, 0x01FF, 0x0000 },
[103] = { 0x01FF, 0x01FF, 0x0000 },
[105] = { 0x00BF, 0x00BF, 0x0000 },
[106] = { 0x00BF, 0x00BF, 0x0000 },
[107] = { 0x01FF, 0x01FF, 0x0000 },
[108] = { 0x01FF, 0x01FF, 0x0000 },
[109] = { 0x00F0, 0x00F0, 0x0000 },
[110] = { 0x00F7, 0x00F7, 0x0000 },
[115] = { 0x001F, 0x001F, 0x0000 },
[116] = { 0x001F, 0x001F, 0x0000 },
[119] = { 0x00FF, 0x00FF, 0x0000 },
[124] = { 0x0079, 0x0079, 0x0000 },
[125] = { 0x00DF, 0x00DF, 0x0000 },
[126] = { 0x000D, 0x000D, 0x0000 },
[127] = { 0x0000, 0xFFFF, 0x0000 },
[129] = { 0x00B0, 0x00B0, 0x0000 },
[131] = { 0x0003, 0x0003, 0x0000 },
[136] = { 0x005F, 0x005F, 0x0000 },
[137] = { 0x00FF, 0x00FF, 0x0000 },
[138] = { 0x00FF, 0x00FF, 0x0000 },
[139] = { 0x00FF, 0x00FF, 0x0000 },
[140] = { 0x005F, 0x005F, 0x0000 },
[141] = { 0x00FF, 0x00FF, 0x0000 },
[142] = { 0x00FF, 0x00FF, 0x0000 },
[143] = { 0x00FF, 0x00FF, 0x0000 },
[155] = { 0x0067, 0x0067, 0x0000 },
[156] = { 0x01FB, 0x01FB, 0x0000 },
[157] = { 0x0007, 0x0007, 0x0000 },
[159] = { 0x007F, 0x007F, 0x0000 },
[160] = { 0xFFFF, 0xFFFF, 0x0000 },
[161] = { 0xFFFF, 0xFFFF, 0x0000 },
[162] = { 0x03FF, 0x03FF, 0x0000 },
[252] = { 0x0005, 0x0005, 0x0000 },
[256] = { 0x000F, 0x000F, 0x0000 },
[257] = { 0xFFFF, 0xFFFF, 0x0000 },
[258] = { 0xFFFF, 0xFFFF, 0x0000 },
[259] = { 0xFFFF, 0xFFFF, 0x0000 },
[260] = { 0xFFFF, 0xFFFF, 0x0000 },
[261] = { 0xFFFF, 0xFFFF, 0x0000 },
[262] = { 0xFFFF, 0xFFFF, 0x0000 },
[264] = { 0x0003, 0x0003, 0x0000 },
[265] = { 0xFFFF, 0xFFFF, 0x0000 },
[268] = { 0x0077, 0x0077, 0x0000 },
[269] = { 0xFFFC, 0xFFFC, 0x0000 },
[270] = { 0xFFFF, 0xFFFF, 0x0000 },
[271] = { 0xFFFC, 0xFFFC, 0x0000 },
[276] = { 0x7FFF, 0x7FFF, 0x0000 },
[277] = { 0x1FFF, 0x1FFF, 0x0000 },
[278] = { 0xFFFF, 0xFFFF, 0x0000 },
[279] = { 0x07FF, 0x07FF, 0x0000 },
[280] = { 0x03FF, 0x03FF, 0x0000 },
[285] = { 0x0003, 0x0003, 0x0000 },
[335] = { 0x0007, 0x0007, 0x0000 },
[336] = { 0xFFFE, 0xFFFE, 0x0000 },
[337] = { 0xFFC0, 0xFFC0, 0x0000 },
[338] = { 0xFFFF, 0xFFFF, 0x0000 },
[339] = { 0xFFFF, 0xFFFF, 0x0000 },
[340] = { 0xFFFF, 0xFFFF, 0x0000 },
[341] = { 0xFFFF, 0xFFFF, 0x0000 },
[342] = { 0xFFFF, 0xFFFF, 0x0000 },
[343] = { 0xFFFF, 0xFFFF, 0x0000 },
[344] = { 0xFFFF, 0xFFFF, 0x0000 },
[345] = { 0xFFFF, 0xFFFF, 0x0000 },
[346] = { 0xFFFF, 0xFFFF, 0x0000 },
[347] = { 0xFFFF, 0xFFFF, 0x0000 },
[348] = { 0xFFFF, 0xFFFF, 0x0000 },
[349] = { 0xFFFF, 0xFFFF, 0x0000 },
[350] = { 0xFFFF, 0xFFFF, 0x0000 },
[351] = { 0xFFFF, 0xFFFF, 0x0000 },
[352] = { 0xFFFF, 0xFFFF, 0x0000 },
[353] = { 0xFFFF, 0xFFFF, 0x0000 },
[354] = { 0xFFFF, 0xFFFF, 0x0000 },
[355] = { 0xFFFF, 0xFFFF, 0x0000 },
[356] = { 0xFFFE, 0xFFFE, 0x0000 },
[357] = { 0xFFC0, 0xFFC0, 0x0000 },
[358] = { 0xFFFF, 0xFFFF, 0x0000 },
[359] = { 0xFFFF, 0xFFFF, 0x0000 },
[360] = { 0xFFFF, 0xFFFF, 0x0000 },
[361] = { 0xFFFF, 0xFFFF, 0x0000 },
[362] = { 0xFFFF, 0xFFFF, 0x0000 },
[363] = { 0xFFFF, 0xFFFF, 0x0000 },
[364] = { 0xFFFF, 0xFFFF, 0x0000 },
[365] = { 0xFFFF, 0xFFFF, 0x0000 },
[366] = { 0xFFFF, 0xFFFF, 0x0000 },
[367] = { 0xFFFF, 0xFFFF, 0x0000 },
[368] = { 0xFFFF, 0xFFFF, 0x0000 },
[369] = { 0xFFFF, 0xFFFF, 0x0000 },
[370] = { 0xFFFF, 0xFFFF, 0x0000 },
[371] = { 0xFFFF, 0xFFFF, 0x0000 },
[372] = { 0xFFFF, 0xFFFF, 0x0000 },
[373] = { 0xFFFF, 0xFFFF, 0x0000 },
[374] = { 0xFFFF, 0xFFFF, 0x0000 },
[375] = { 0xFFFF, 0xFFFF, 0x0000 },
[513] = { 0x045F, 0x045F, 0x0000 },
[514] = { 0x045F, 0x045F, 0x0000 },
[516] = { 0xE75F, 0xE75F, 0x0000 },
[517] = { 0xE75F, 0xE75F, 0x0000 },
[560] = { 0x0030, 0x0030, 0xFFFF },
[561] = { 0xFFED, 0xFFED, 0xFFFF },
[568] = { 0x0030, 0x0030, 0x0000 },
[569] = { 0xFFED, 0xFFED, 0x0000 },
[576] = { 0x0001, 0x0001, 0x0000 },
[584] = { 0x002D, 0x002D, 0x0000 },
[586] = { 0xC000, 0xC000, 0x0000 },
[768] = { 0x0001, 0x0001, 0x0000 },
[1037] = { 0x0000, 0x003F, 0xFFFF },
[4096] = { 0x3FFF, 0x3FFF, 0x0000 },
[4097] = { 0x00FF, 0x00FF, 0x0000 },
[4098] = { 0x070F, 0x070F, 0x0000 },
[4099] = { 0x010F, 0x010F, 0x0000 },
[4100] = { 0x3FFF, 0x3FFF, 0x0000 },
[4101] = { 0x00FF, 0x00FF, 0x0000 },
[4102] = { 0x070F, 0x070F, 0x0000 },
[4103] = { 0x010F, 0x010F, 0x0000 },
[4104] = { 0x3FFF, 0x3FFF, 0x0000 },
[4105] = { 0x00FF, 0x00FF, 0x0000 },
[4106] = { 0x070F, 0x070F, 0x0000 },
[4107] = { 0x010F, 0x010F, 0x0000 },
[4108] = { 0x3FFF, 0x3FFF, 0x0000 },
[4109] = { 0x00FF, 0x00FF, 0x0000 },
[4110] = { 0x070F, 0x070F, 0x0000 },
[4111] = { 0x010F, 0x010F, 0x0000 },
[4112] = { 0x3FFF, 0x3FFF, 0x0000 },
[4113] = { 0x00FF, 0x00FF, 0x0000 },
[4114] = { 0x070F, 0x070F, 0x0000 },
[4115] = { 0x010F, 0x010F, 0x0000 },
[4116] = { 0x3FFF, 0x3FFF, 0x0000 },
[4117] = { 0x00FF, 0x00FF, 0x0000 },
[4118] = { 0x070F, 0x070F, 0x0000 },
[4119] = { 0x010F, 0x010F, 0x0000 },
[4120] = { 0x3FFF, 0x3FFF, 0x0000 },
[4121] = { 0x00FF, 0x00FF, 0x0000 },
[4122] = { 0x070F, 0x070F, 0x0000 },
[4123] = { 0x010F, 0x010F, 0x0000 },
[4124] = { 0x3FFF, 0x3FFF, 0x0000 },
[4125] = { 0x00FF, 0x00FF, 0x0000 },
[4126] = { 0x070F, 0x070F, 0x0000 },
[4127] = { 0x010F, 0x010F, 0x0000 },
[4128] = { 0x3FFF, 0x3FFF, 0x0000 },
[4129] = { 0x00FF, 0x00FF, 0x0000 },
[4130] = { 0x070F, 0x070F, 0x0000 },
[4131] = { 0x010F, 0x010F, 0x0000 },
[4132] = { 0x3FFF, 0x3FFF, 0x0000 },
[4133] = { 0x00FF, 0x00FF, 0x0000 },
[4134] = { 0x070F, 0x070F, 0x0000 },
[4135] = { 0x010F, 0x010F, 0x0000 },
[4136] = { 0x3FFF, 0x3FFF, 0x0000 },
[4137] = { 0x00FF, 0x00FF, 0x0000 },
[4138] = { 0x070F, 0x070F, 0x0000 },
[4139] = { 0x010F, 0x010F, 0x0000 },
[4140] = { 0x3FFF, 0x3FFF, 0x0000 },
[4141] = { 0x00FF, 0x00FF, 0x0000 },
[4142] = { 0x070F, 0x070F, 0x0000 },
[4143] = { 0x010F, 0x010F, 0x0000 },
[4144] = { 0x3FFF, 0x3FFF, 0x0000 },
[4145] = { 0x00FF, 0x00FF, 0x0000 },
[4146] = { 0x070F, 0x070F, 0x0000 },
[4147] = { 0x010F, 0x010F, 0x0000 },
[4148] = { 0x3FFF, 0x3FFF, 0x0000 },
[4149] = { 0x00FF, 0x00FF, 0x0000 },
[4150] = { 0x070F, 0x070F, 0x0000 },
[4151] = { 0x010F, 0x010F, 0x0000 },
[4152] = { 0x3FFF, 0x3FFF, 0x0000 },
[4153] = { 0x00FF, 0x00FF, 0x0000 },
[4154] = { 0x070F, 0x070F, 0x0000 },
[4155] = { 0x010F, 0x010F, 0x0000 },
[4156] = { 0x3FFF, 0x3FFF, 0x0000 },
[4157] = { 0x00FF, 0x00FF, 0x0000 },
[4158] = { 0x070F, 0x070F, 0x0000 },
[4159] = { 0x010F, 0x010F, 0x0000 },
[4160] = { 0x3FFF, 0x3FFF, 0x0000 },
[4161] = { 0x00FF, 0x00FF, 0x0000 },
[4162] = { 0x070F, 0x070F, 0x0000 },
[4163] = { 0x010F, 0x010F, 0x0000 },
[4164] = { 0x3FFF, 0x3FFF, 0x0000 },
[4165] = { 0x00FF, 0x00FF, 0x0000 },
[4166] = { 0x070F, 0x070F, 0x0000 },
[4167] = { 0x010F, 0x010F, 0x0000 },
[4168] = { 0x3FFF, 0x3FFF, 0x0000 },
[4169] = { 0x00FF, 0x00FF, 0x0000 },
[4170] = { 0x070F, 0x070F, 0x0000 },
[4171] = { 0x010F, 0x010F, 0x0000 },
[4172] = { 0x3FFF, 0x3FFF, 0x0000 },
[4173] = { 0x00FF, 0x00FF, 0x0000 },
[4174] = { 0x070F, 0x070F, 0x0000 },
[4175] = { 0x010F, 0x010F, 0x0000 },
[4176] = { 0x3FFF, 0x3FFF, 0x0000 },
[4177] = { 0x00FF, 0x00FF, 0x0000 },
[4178] = { 0x070F, 0x070F, 0x0000 },
[4179] = { 0x010F, 0x010F, 0x0000 },
[4180] = { 0x3FFF, 0x3FFF, 0x0000 },
[4181] = { 0x00FF, 0x00FF, 0x0000 },
[4182] = { 0x070F, 0x070F, 0x0000 },
[4183] = { 0x010F, 0x010F, 0x0000 },
[4184] = { 0x3FFF, 0x3FFF, 0x0000 },
[4185] = { 0x00FF, 0x00FF, 0x0000 },
[4186] = { 0x070F, 0x070F, 0x0000 },
[4187] = { 0x010F, 0x010F, 0x0000 },
[4188] = { 0x3FFF, 0x3FFF, 0x0000 },
[4189] = { 0x00FF, 0x00FF, 0x0000 },
[4190] = { 0x070F, 0x070F, 0x0000 },
[4191] = { 0x010F, 0x010F, 0x0000 },
[4192] = { 0x3FFF, 0x3FFF, 0x0000 },
[4193] = { 0x00FF, 0x00FF, 0x0000 },
[4194] = { 0x070F, 0x070F, 0x0000 },
[4195] = { 0x010F, 0x010F, 0x0000 },
[4196] = { 0x3FFF, 0x3FFF, 0x0000 },
[4197] = { 0x00FF, 0x00FF, 0x0000 },
[4198] = { 0x070F, 0x070F, 0x0000 },
[4199] = { 0x010F, 0x010F, 0x0000 },
[4200] = { 0x3FFF, 0x3FFF, 0x0000 },
[4201] = { 0x00FF, 0x00FF, 0x0000 },
[4202] = { 0x070F, 0x070F, 0x0000 },
[4203] = { 0x010F, 0x010F, 0x0000 },
[4204] = { 0x3FFF, 0x3FFF, 0x0000 },
[4205] = { 0x00FF, 0x00FF, 0x0000 },
[4206] = { 0x070F, 0x070F, 0x0000 },
[4207] = { 0x010F, 0x010F, 0x0000 },
[4208] = { 0x3FFF, 0x3FFF, 0x0000 },
[4209] = { 0x00FF, 0x00FF, 0x0000 },
[4210] = { 0x070F, 0x070F, 0x0000 },
[4211] = { 0x010F, 0x010F, 0x0000 },
[4212] = { 0x3FFF, 0x3FFF, 0x0000 },
[4213] = { 0x00FF, 0x00FF, 0x0000 },
[4214] = { 0x070F, 0x070F, 0x0000 },
[4215] = { 0x010F, 0x010F, 0x0000 },
[4216] = { 0x3FFF, 0x3FFF, 0x0000 },
[4217] = { 0x00FF, 0x00FF, 0x0000 },
[4218] = { 0x070F, 0x070F, 0x0000 },
[4219] = { 0x010F, 0x010F, 0x0000 },
[4220] = { 0x3FFF, 0x3FFF, 0x0000 },
[4221] = { 0x00FF, 0x00FF, 0x0000 },
[4222] = { 0x070F, 0x070F, 0x0000 },
[4223] = { 0x010F, 0x010F, 0x0000 },
[4224] = { 0x3FFF, 0x3FFF, 0x0000 },
[4225] = { 0x00FF, 0x00FF, 0x0000 },
[4226] = { 0x070F, 0x070F, 0x0000 },
[4227] = { 0x010F, 0x010F, 0x0000 },
[4228] = { 0x3FFF, 0x3FFF, 0x0000 },
[4229] = { 0x00FF, 0x00FF, 0x0000 },
[4230] = { 0x070F, 0x070F, 0x0000 },
[4231] = { 0x010F, 0x010F, 0x0000 },
[4232] = { 0x3FFF, 0x3FFF, 0x0000 },
[4233] = { 0x00FF, 0x00FF, 0x0000 },
[4234] = { 0x070F, 0x070F, 0x0000 },
[4235] = { 0x010F, 0x010F, 0x0000 },
[4236] = { 0x3FFF, 0x3FFF, 0x0000 },
[4237] = { 0x00FF, 0x00FF, 0x0000 },
[4238] = { 0x070F, 0x070F, 0x0000 },
[4239] = { 0x010F, 0x010F, 0x0000 },
[4240] = { 0x3FFF, 0x3FFF, 0x0000 },
[4241] = { 0x00FF, 0x00FF, 0x0000 },
[4242] = { 0x070F, 0x070F, 0x0000 },
[4243] = { 0x010F, 0x010F, 0x0000 },
[4244] = { 0x3FFF, 0x3FFF, 0x0000 },
[4245] = { 0x00FF, 0x00FF, 0x0000 },
[4246] = { 0x070F, 0x070F, 0x0000 },
[4247] = { 0x010F, 0x010F, 0x0000 },
[4248] = { 0x3FFF, 0x3FFF, 0x0000 },
[4249] = { 0x00FF, 0x00FF, 0x0000 },
[4250] = { 0x070F, 0x070F, 0x0000 },
[4251] = { 0x010F, 0x010F, 0x0000 },
[4252] = { 0x3FFF, 0x3FFF, 0x0000 },
[4253] = { 0x00FF, 0x00FF, 0x0000 },
[4254] = { 0x070F, 0x070F, 0x0000 },
[4255] = { 0x010F, 0x010F, 0x0000 },
[4256] = { 0x3FFF, 0x3FFF, 0x0000 },
[4257] = { 0x00FF, 0x00FF, 0x0000 },
[4258] = { 0x070F, 0x070F, 0x0000 },
[4259] = { 0x010F, 0x010F, 0x0000 },
[4260] = { 0x3FFF, 0x3FFF, 0x0000 },
[4261] = { 0x00FF, 0x00FF, 0x0000 },
[4262] = { 0x070F, 0x070F, 0x0000 },
[4263] = { 0x010F, 0x010F, 0x0000 },
[4264] = { 0x3FFF, 0x3FFF, 0x0000 },
[4265] = { 0x00FF, 0x00FF, 0x0000 },
[4266] = { 0x070F, 0x070F, 0x0000 },
[4267] = { 0x010F, 0x010F, 0x0000 },
[4268] = { 0x3FFF, 0x3FFF, 0x0000 },
[4269] = { 0x00FF, 0x00FF, 0x0000 },
[4270] = { 0x070F, 0x070F, 0x0000 },
[4271] = { 0x010F, 0x010F, 0x0000 },
[4272] = { 0x3FFF, 0x3FFF, 0x0000 },
[4273] = { 0x00FF, 0x00FF, 0x0000 },
[4274] = { 0x070F, 0x070F, 0x0000 },
[4275] = { 0x010F, 0x010F, 0x0000 },
[4276] = { 0x3FFF, 0x3FFF, 0x0000 },
[4277] = { 0x00FF, 0x00FF, 0x0000 },
[4278] = { 0x070F, 0x070F, 0x0000 },
[4279] = { 0x010F, 0x010F, 0x0000 },
[4280] = { 0x3FFF, 0x3FFF, 0x0000 },
[4281] = { 0x00FF, 0x00FF, 0x0000 },
[4282] = { 0x070F, 0x070F, 0x0000 },
[4283] = { 0x010F, 0x010F, 0x0000 },
[4284] = { 0x3FFF, 0x3FFF, 0x0000 },
[4285] = { 0x00FF, 0x00FF, 0x0000 },
[4286] = { 0x070F, 0x070F, 0x0000 },
[4287] = { 0x010F, 0x010F, 0x0000 },
[4288] = { 0x3FFF, 0x3FFF, 0x0000 },
[4289] = { 0x00FF, 0x00FF, 0x0000 },
[4290] = { 0x070F, 0x070F, 0x0000 },
[4291] = { 0x010F, 0x010F, 0x0000 },
[4292] = { 0x3FFF, 0x3FFF, 0x0000 },
[4293] = { 0x00FF, 0x00FF, 0x0000 },
[4294] = { 0x070F, 0x070F, 0x0000 },
[4295] = { 0x010F, 0x010F, 0x0000 },
[4296] = { 0x3FFF, 0x3FFF, 0x0000 },
[4297] = { 0x00FF, 0x00FF, 0x0000 },
[4298] = { 0x070F, 0x070F, 0x0000 },
[4299] = { 0x010F, 0x010F, 0x0000 },
[4300] = { 0x3FFF, 0x3FFF, 0x0000 },
[4301] = { 0x00FF, 0x00FF, 0x0000 },
[4302] = { 0x070F, 0x070F, 0x0000 },
[4303] = { 0x010F, 0x010F, 0x0000 },
[4304] = { 0x3FFF, 0x3FFF, 0x0000 },
[4305] = { 0x00FF, 0x00FF, 0x0000 },
[4306] = { 0x070F, 0x070F, 0x0000 },
[4307] = { 0x010F, 0x010F, 0x0000 },
[4308] = { 0x3FFF, 0x3FFF, 0x0000 },
[4309] = { 0x00FF, 0x00FF, 0x0000 },
[4310] = { 0x070F, 0x070F, 0x0000 },
[4311] = { 0x010F, 0x010F, 0x0000 },
[4312] = { 0x3FFF, 0x3FFF, 0x0000 },
[4313] = { 0x00FF, 0x00FF, 0x0000 },
[4314] = { 0x070F, 0x070F, 0x0000 },
[4315] = { 0x010F, 0x010F, 0x0000 },
[4316] = { 0x3FFF, 0x3FFF, 0x0000 },
[4317] = { 0x00FF, 0x00FF, 0x0000 },
[4318] = { 0x070F, 0x070F, 0x0000 },
[4319] = { 0x010F, 0x010F, 0x0000 },
[4320] = { 0x3FFF, 0x3FFF, 0x0000 },
[4321] = { 0x00FF, 0x00FF, 0x0000 },
[4322] = { 0x070F, 0x070F, 0x0000 },
[4323] = { 0x010F, 0x010F, 0x0000 },
[4324] = { 0x3FFF, 0x3FFF, 0x0000 },
[4325] = { 0x00FF, 0x00FF, 0x0000 },
[4326] = { 0x070F, 0x070F, 0x0000 },
[4327] = { 0x010F, 0x010F, 0x0000 },
[4328] = { 0x3FFF, 0x3FFF, 0x0000 },
[4329] = { 0x00FF, 0x00FF, 0x0000 },
[4330] = { 0x070F, 0x070F, 0x0000 },
[4331] = { 0x010F, 0x010F, 0x0000 },
[4332] = { 0x3FFF, 0x3FFF, 0x0000 },
[4333] = { 0x00FF, 0x00FF, 0x0000 },
[4334] = { 0x070F, 0x070F, 0x0000 },
[4335] = { 0x010F, 0x010F, 0x0000 },
[4336] = { 0x3FFF, 0x3FFF, 0x0000 },
[4337] = { 0x00FF, 0x00FF, 0x0000 },
[4338] = { 0x070F, 0x070F, 0x0000 },
[4339] = { 0x010F, 0x010F, 0x0000 },
[4340] = { 0x3FFF, 0x3FFF, 0x0000 },
[4341] = { 0x00FF, 0x00FF, 0x0000 },
[4342] = { 0x070F, 0x070F, 0x0000 },
[4343] = { 0x010F, 0x010F, 0x0000 },
[4344] = { 0x3FFF, 0x3FFF, 0x0000 },
[4345] = { 0x00FF, 0x00FF, 0x0000 },
[4346] = { 0x070F, 0x070F, 0x0000 },
[4347] = { 0x010F, 0x010F, 0x0000 },
[4348] = { 0x3FFF, 0x3FFF, 0x0000 },
[4349] = { 0x00FF, 0x00FF, 0x0000 },
[4350] = { 0x070F, 0x070F, 0x0000 },
[4351] = { 0x010F, 0x010F, 0x0000 },
[4352] = { 0x3FFF, 0x3FFF, 0x0000 },
[4353] = { 0x00FF, 0x00FF, 0x0000 },
[4354] = { 0x070F, 0x070F, 0x0000 },
[4355] = { 0x010F, 0x010F, 0x0000 },
[4356] = { 0x3FFF, 0x3FFF, 0x0000 },
[4357] = { 0x00FF, 0x00FF, 0x0000 },
[4358] = { 0x070F, 0x070F, 0x0000 },
[4359] = { 0x010F, 0x010F, 0x0000 },
[4360] = { 0x3FFF, 0x3FFF, 0x0000 },
[4361] = { 0x00FF, 0x00FF, 0x0000 },
[4362] = { 0x070F, 0x070F, 0x0000 },
[4363] = { 0x010F, 0x010F, 0x0000 },
[4364] = { 0x3FFF, 0x3FFF, 0x0000 },
[4365] = { 0x00FF, 0x00FF, 0x0000 },
[4366] = { 0x070F, 0x070F, 0x0000 },
[4367] = { 0x010F, 0x010F, 0x0000 },
[4368] = { 0x3FFF, 0x3FFF, 0x0000 },
[4369] = { 0x00FF, 0x00FF, 0x0000 },
[4370] = { 0x070F, 0x070F, 0x0000 },
[4371] = { 0x010F, 0x010F, 0x0000 },
[4372] = { 0x3FFF, 0x3FFF, 0x0000 },
[4373] = { 0x00FF, 0x00FF, 0x0000 },
[4374] = { 0x070F, 0x070F, 0x0000 },
[4375] = { 0x010F, 0x010F, 0x0000 },
[4376] = { 0x3FFF, 0x3FFF, 0x0000 },
[4377] = { 0x00FF, 0x00FF, 0x0000 },
[4378] = { 0x070F, 0x070F, 0x0000 },
[4379] = { 0x010F, 0x010F, 0x0000 },
[4380] = { 0x3FFF, 0x3FFF, 0x0000 },
[4381] = { 0x00FF, 0x00FF, 0x0000 },
[4382] = { 0x070F, 0x070F, 0x0000 },
[4383] = { 0x010F, 0x010F, 0x0000 },
[4384] = { 0x3FFF, 0x3FFF, 0x0000 },
[4385] = { 0x00FF, 0x00FF, 0x0000 },
[4386] = { 0x070F, 0x070F, 0x0000 },
[4387] = { 0x010F, 0x010F, 0x0000 },
[4388] = { 0x3FFF, 0x3FFF, 0x0000 },
[4389] = { 0x00FF, 0x00FF, 0x0000 },
[4390] = { 0x070F, 0x070F, 0x0000 },
[4391] = { 0x010F, 0x010F, 0x0000 },
[4392] = { 0x3FFF, 0x3FFF, 0x0000 },
[4393] = { 0x00FF, 0x00FF, 0x0000 },
[4394] = { 0x070F, 0x070F, 0x0000 },
[4395] = { 0x010F, 0x010F, 0x0000 },
[4396] = { 0x3FFF, 0x3FFF, 0x0000 },
[4397] = { 0x00FF, 0x00FF, 0x0000 },
[4398] = { 0x070F, 0x070F, 0x0000 },
[4399] = { 0x010F, 0x010F, 0x0000 },
[4400] = { 0x3FFF, 0x3FFF, 0x0000 },
[4401] = { 0x00FF, 0x00FF, 0x0000 },
[4402] = { 0x070F, 0x070F, 0x0000 },
[4403] = { 0x010F, 0x010F, 0x0000 },
[4404] = { 0x3FFF, 0x3FFF, 0x0000 },
[4405] = { 0x00FF, 0x00FF, 0x0000 },
[4406] = { 0x070F, 0x070F, 0x0000 },
[4407] = { 0x010F, 0x010F, 0x0000 },
[4408] = { 0x3FFF, 0x3FFF, 0x0000 },
[4409] = { 0x00FF, 0x00FF, 0x0000 },
[4410] = { 0x070F, 0x070F, 0x0000 },
[4411] = { 0x010F, 0x010F, 0x0000 },
[4412] = { 0x3FFF, 0x3FFF, 0x0000 },
[4413] = { 0x00FF, 0x00FF, 0x0000 },
[4414] = { 0x070F, 0x070F, 0x0000 },
[4415] = { 0x010F, 0x010F, 0x0000 },
[4416] = { 0x3FFF, 0x3FFF, 0x0000 },
[4417] = { 0x00FF, 0x00FF, 0x0000 },
[4418] = { 0x070F, 0x070F, 0x0000 },
[4419] = { 0x010F, 0x010F, 0x0000 },
[4420] = { 0x3FFF, 0x3FFF, 0x0000 },
[4421] = { 0x00FF, 0x00FF, 0x0000 },
[4422] = { 0x070F, 0x070F, 0x0000 },
[4423] = { 0x010F, 0x010F, 0x0000 },
[4424] = { 0x3FFF, 0x3FFF, 0x0000 },
[4425] = { 0x00FF, 0x00FF, 0x0000 },
[4426] = { 0x070F, 0x070F, 0x0000 },
[4427] = { 0x010F, 0x010F, 0x0000 },
[4428] = { 0x3FFF, 0x3FFF, 0x0000 },
[4429] = { 0x00FF, 0x00FF, 0x0000 },
[4430] = { 0x070F, 0x070F, 0x0000 },
[4431] = { 0x010F, 0x010F, 0x0000 },
[4432] = { 0x3FFF, 0x3FFF, 0x0000 },
[4433] = { 0x00FF, 0x00FF, 0x0000 },
[4434] = { 0x070F, 0x070F, 0x0000 },
[4435] = { 0x010F, 0x010F, 0x0000 },
[4436] = { 0x3FFF, 0x3FFF, 0x0000 },
[4437] = { 0x00FF, 0x00FF, 0x0000 },
[4438] = { 0x070F, 0x070F, 0x0000 },
[4439] = { 0x010F, 0x010F, 0x0000 },
[4440] = { 0x3FFF, 0x3FFF, 0x0000 },
[4441] = { 0x00FF, 0x00FF, 0x0000 },
[4442] = { 0x070F, 0x070F, 0x0000 },
[4443] = { 0x010F, 0x010F, 0x0000 },
[4444] = { 0x3FFF, 0x3FFF, 0x0000 },
[4445] = { 0x00FF, 0x00FF, 0x0000 },
[4446] = { 0x070F, 0x070F, 0x0000 },
[4447] = { 0x010F, 0x010F, 0x0000 },
[4448] = { 0x3FFF, 0x3FFF, 0x0000 },
[4449] = { 0x00FF, 0x00FF, 0x0000 },
[4450] = { 0x070F, 0x070F, 0x0000 },
[4451] = { 0x010F, 0x010F, 0x0000 },
[4452] = { 0x3FFF, 0x3FFF, 0x0000 },
[4453] = { 0x00FF, 0x00FF, 0x0000 },
[4454] = { 0x070F, 0x070F, 0x0000 },
[4455] = { 0x010F, 0x010F, 0x0000 },
[4456] = { 0x3FFF, 0x3FFF, 0x0000 },
[4457] = { 0x00FF, 0x00FF, 0x0000 },
[4458] = { 0x070F, 0x070F, 0x0000 },
[4459] = { 0x010F, 0x010F, 0x0000 },
[4460] = { 0x3FFF, 0x3FFF, 0x0000 },
[4461] = { 0x00FF, 0x00FF, 0x0000 },
[4462] = { 0x070F, 0x070F, 0x0000 },
[4463] = { 0x010F, 0x010F, 0x0000 },
[4464] = { 0x3FFF, 0x3FFF, 0x0000 },
[4465] = { 0x00FF, 0x00FF, 0x0000 },
[4466] = { 0x070F, 0x070F, 0x0000 },
[4467] = { 0x010F, 0x010F, 0x0000 },
[4468] = { 0x3FFF, 0x3FFF, 0x0000 },
[4469] = { 0x00FF, 0x00FF, 0x0000 },
[4470] = { 0x070F, 0x070F, 0x0000 },
[4471] = { 0x010F, 0x010F, 0x0000 },
[4472] = { 0x3FFF, 0x3FFF, 0x0000 },
[4473] = { 0x00FF, 0x00FF, 0x0000 },
[4474] = { 0x070F, 0x070F, 0x0000 },
[4475] = { 0x010F, 0x010F, 0x0000 },
[4476] = { 0x3FFF, 0x3FFF, 0x0000 },
[4477] = { 0x00FF, 0x00FF, 0x0000 },
[4478] = { 0x070F, 0x070F, 0x0000 },
[4479] = { 0x010F, 0x010F, 0x0000 },
[4480] = { 0x3FFF, 0x3FFF, 0x0000 },
[4481] = { 0x00FF, 0x00FF, 0x0000 },
[4482] = { 0x070F, 0x070F, 0x0000 },
[4483] = { 0x010F, 0x010F, 0x0000 },
[4484] = { 0x3FFF, 0x3FFF, 0x0000 },
[4485] = { 0x00FF, 0x00FF, 0x0000 },
[4486] = { 0x070F, 0x070F, 0x0000 },
[4487] = { 0x010F, 0x010F, 0x0000 },
[4488] = { 0x3FFF, 0x3FFF, 0x0000 },
[4489] = { 0x00FF, 0x00FF, 0x0000 },
[4490] = { 0x070F, 0x070F, 0x0000 },
[4491] = { 0x010F, 0x010F, 0x0000 },
[4492] = { 0x3FFF, 0x3FFF, 0x0000 },
[4493] = { 0x00FF, 0x00FF, 0x0000 },
[4494] = { 0x070F, 0x070F, 0x0000 },
[4495] = { 0x010F, 0x010F, 0x0000 },
[4496] = { 0x3FFF, 0x3FFF, 0x0000 },
[4497] = { 0x00FF, 0x00FF, 0x0000 },
[4498] = { 0x070F, 0x070F, 0x0000 },
[4499] = { 0x010F, 0x010F, 0x0000 },
[4500] = { 0x3FFF, 0x3FFF, 0x0000 },
[4501] = { 0x00FF, 0x00FF, 0x0000 },
[4502] = { 0x070F, 0x070F, 0x0000 },
[4503] = { 0x010F, 0x010F, 0x0000 },
[4504] = { 0x3FFF, 0x3FFF, 0x0000 },
[4505] = { 0x00FF, 0x00FF, 0x0000 },
[4506] = { 0x070F, 0x070F, 0x0000 },
[4507] = { 0x010F, 0x010F, 0x0000 },
[4508] = { 0x3FFF, 0x3FFF, 0x0000 },
[4509] = { 0x00FF, 0x00FF, 0x0000 },
[4510] = { 0x070F, 0x070F, 0x0000 },
[4511] = { 0x010F, 0x010F, 0x0000 },
[4512] = { 0x3FFF, 0x3FFF, 0x0000 },
[4513] = { 0x00FF, 0x00FF, 0x0000 },
[4514] = { 0x070F, 0x070F, 0x0000 },
[4515] = { 0x010F, 0x010F, 0x0000 },
[4516] = { 0x3FFF, 0x3FFF, 0x0000 },
[4517] = { 0x00FF, 0x00FF, 0x0000 },
[4518] = { 0x070F, 0x070F, 0x0000 },
[4519] = { 0x010F, 0x010F, 0x0000 },
[4520] = { 0x3FFF, 0x3FFF, 0x0000 },
[4521] = { 0x00FF, 0x00FF, 0x0000 },
[4522] = { 0x070F, 0x070F, 0x0000 },
[4523] = { 0x010F, 0x010F, 0x0000 },
[4524] = { 0x3FFF, 0x3FFF, 0x0000 },
[4525] = { 0x00FF, 0x00FF, 0x0000 },
[4526] = { 0x070F, 0x070F, 0x0000 },
[4527] = { 0x010F, 0x010F, 0x0000 },
[4528] = { 0x3FFF, 0x3FFF, 0x0000 },
[4529] = { 0x00FF, 0x00FF, 0x0000 },
[4530] = { 0x070F, 0x070F, 0x0000 },
[4531] = { 0x010F, 0x010F, 0x0000 },
[4532] = { 0x3FFF, 0x3FFF, 0x0000 },
[4533] = { 0x00FF, 0x00FF, 0x0000 },
[4534] = { 0x070F, 0x070F, 0x0000 },
[4535] = { 0x010F, 0x010F, 0x0000 },
[4536] = { 0x3FFF, 0x3FFF, 0x0000 },
[4537] = { 0x00FF, 0x00FF, 0x0000 },
[4538] = { 0x070F, 0x070F, 0x0000 },
[4539] = { 0x010F, 0x010F, 0x0000 },
[4540] = { 0x3FFF, 0x3FFF, 0x0000 },
[4541] = { 0x00FF, 0x00FF, 0x0000 },
[4542] = { 0x070F, 0x070F, 0x0000 },
[4543] = { 0x010F, 0x010F, 0x0000 },
[4544] = { 0x3FFF, 0x3FFF, 0x0000 },
[4545] = { 0x00FF, 0x00FF, 0x0000 },
[4546] = { 0x070F, 0x070F, 0x0000 },
[4547] = { 0x010F, 0x010F, 0x0000 },
[4548] = { 0x3FFF, 0x3FFF, 0x0000 },
[4549] = { 0x00FF, 0x00FF, 0x0000 },
[4550] = { 0x070F, 0x070F, 0x0000 },
[4551] = { 0x010F, 0x010F, 0x0000 },
[4552] = { 0x3FFF, 0x3FFF, 0x0000 },
[4553] = { 0x00FF, 0x00FF, 0x0000 },
[4554] = { 0x070F, 0x070F, 0x0000 },
[4555] = { 0x010F, 0x010F, 0x0000 },
[4556] = { 0x3FFF, 0x3FFF, 0x0000 },
[4557] = { 0x00FF, 0x00FF, 0x0000 },
[4558] = { 0x070F, 0x070F, 0x0000 },
[4559] = { 0x010F, 0x010F, 0x0000 },
[4560] = { 0x3FFF, 0x3FFF, 0x0000 },
[4561] = { 0x00FF, 0x00FF, 0x0000 },
[4562] = { 0x070F, 0x070F, 0x0000 },
[4563] = { 0x010F, 0x010F, 0x0000 },
[4564] = { 0x3FFF, 0x3FFF, 0x0000 },
[4565] = { 0x00FF, 0x00FF, 0x0000 },
[4566] = { 0x070F, 0x070F, 0x0000 },
[4567] = { 0x010F, 0x010F, 0x0000 },
[4568] = { 0x3FFF, 0x3FFF, 0x0000 },
[4569] = { 0x00FF, 0x00FF, 0x0000 },
[4570] = { 0x070F, 0x070F, 0x0000 },
[4571] = { 0x010F, 0x010F, 0x0000 },
[4572] = { 0x3FFF, 0x3FFF, 0x0000 },
[4573] = { 0x00FF, 0x00FF, 0x0000 },
[4574] = { 0x070F, 0x070F, 0x0000 },
[4575] = { 0x010F, 0x010F, 0x0000 },
[4576] = { 0x3FFF, 0x3FFF, 0x0000 },
[4577] = { 0x00FF, 0x00FF, 0x0000 },
[4578] = { 0x070F, 0x070F, 0x0000 },
[4579] = { 0x010F, 0x010F, 0x0000 },
[4580] = { 0x3FFF, 0x3FFF, 0x0000 },
[4581] = { 0x00FF, 0x00FF, 0x0000 },
[4582] = { 0x070F, 0x070F, 0x0000 },
[4583] = { 0x010F, 0x010F, 0x0000 },
[4584] = { 0x3FFF, 0x3FFF, 0x0000 },
[4585] = { 0x00FF, 0x00FF, 0x0000 },
[4586] = { 0x070F, 0x070F, 0x0000 },
[4587] = { 0x010F, 0x010F, 0x0000 },
[4588] = { 0x3FFF, 0x3FFF, 0x0000 },
[4589] = { 0x00FF, 0x00FF, 0x0000 },
[4590] = { 0x070F, 0x070F, 0x0000 },
[4591] = { 0x010F, 0x010F, 0x0000 },
[4592] = { 0x3FFF, 0x3FFF, 0x0000 },
[4593] = { 0x00FF, 0x00FF, 0x0000 },
[4594] = { 0x070F, 0x070F, 0x0000 },
[4595] = { 0x010F, 0x010F, 0x0000 },
[4596] = { 0x3FFF, 0x3FFF, 0x0000 },
[4597] = { 0x00FF, 0x00FF, 0x0000 },
[4598] = { 0x070F, 0x070F, 0x0000 },
[4599] = { 0x010F, 0x010F, 0x0000 },
[4600] = { 0x3FFF, 0x3FFF, 0x0000 },
[4601] = { 0x00FF, 0x00FF, 0x0000 },
[4602] = { 0x070F, 0x070F, 0x0000 },
[4603] = { 0x010F, 0x010F, 0x0000 },
[4604] = { 0x3FFF, 0x3FFF, 0x0000 },
[4605] = { 0x00FF, 0x00FF, 0x0000 },
[4606] = { 0x070F, 0x070F, 0x0000 },
[4607] = { 0x010F, 0x010F, 0x0000 },
[8192] = { 0x03FF, 0x03FF, 0x0000 },
[9216] = { 0x003F, 0x003F, 0x0000 },
[9217] = { 0xFFFF, 0xFFFF, 0x0000 },
[9218] = { 0xFFFF, 0xFFFF, 0x0000 },
[12288] = { 0x00FF, 0x00FF, 0x0000 },
[12289] = { 0xFFFF, 0xFFFF, 0x0000 },
[13312] = { 0x00FF, 0x00FF, 0x0000 },
[13313] = { 0xFFFF, 0xFFFF, 0x0000 },
[14336] = { 0x00FF, 0x00FF, 0x0000 },
[14337] = { 0xFFFF, 0xFFFF, 0x0000 },
[15360] = { 0x07FF, 0x07FF, 0x0000 },
[16384] = { 0x00FF, 0x00FF, 0x0000 },
[16385] = { 0xFFFF, 0xFFFF, 0x0000 },
[16386] = { 0x00FF, 0x00FF, 0x0000 },
[16387] = { 0xFFFF, 0xFFFF, 0x0000 },
[16388] = { 0x00FF, 0x00FF, 0x0000 },
[16389] = { 0xFFFF, 0xFFFF, 0x0000 },
[16896] = { 0x00FF, 0x00FF, 0x0000 },
[16897] = { 0xFFFF, 0xFFFF, 0x0000 },
[16898] = { 0x00FF, 0x00FF, 0x0000 },
[16899] = { 0xFFFF, 0xFFFF, 0x0000 },
[16900] = { 0x00FF, 0x00FF, 0x0000 },
[16901] = { 0xFFFF, 0xFFFF, 0x0000 },
[16902] = { 0x00FF, 0x00FF, 0x0000 },
[16903] = { 0xFFFF, 0xFFFF, 0x0000 },
[16904] = { 0x00FF, 0x00FF, 0x0000 },
[16905] = { 0xFFFF, 0xFFFF, 0x0000 },
[16906] = { 0x00FF, 0x00FF, 0x0000 },
[16907] = { 0xFFFF, 0xFFFF, 0x0000 },
[16908] = { 0x00FF, 0x00FF, 0x0000 },
[16909] = { 0xFFFF, 0xFFFF, 0x0000 },
[16910] = { 0x00FF, 0x00FF, 0x0000 },
[16911] = { 0xFFFF, 0xFFFF, 0x0000 },
[16912] = { 0x00FF, 0x00FF, 0x0000 },
[16913] = { 0xFFFF, 0xFFFF, 0x0000 },
[16914] = { 0x00FF, 0x00FF, 0x0000 },
[16915] = { 0xFFFF, 0xFFFF, 0x0000 },
[16916] = { 0x00FF, 0x00FF, 0x0000 },
[16917] = { 0xFFFF, 0xFFFF, 0x0000 },
[16918] = { 0x00FF, 0x00FF, 0x0000 },
[16919] = { 0xFFFF, 0xFFFF, 0x0000 },
[16920] = { 0x00FF, 0x00FF, 0x0000 },
[16921] = { 0xFFFF, 0xFFFF, 0x0000 },
[16922] = { 0x00FF, 0x00FF, 0x0000 },
[16923] = { 0xFFFF, 0xFFFF, 0x0000 },
[16924] = { 0x00FF, 0x00FF, 0x0000 },
[16925] = { 0xFFFF, 0xFFFF, 0x0000 },
[17408] = { 0x00FF, 0x00FF, 0x0000 },
[17409] = { 0xFFFF, 0xFFFF, 0x0000 },
[17920] = { 0x00FF, 0x00FF, 0x0000 },
[17921] = { 0xFFFF, 0xFFFF, 0x0000 },
[17922] = { 0x00FF, 0x00FF, 0x0000 },
[17923] = { 0xFFFF, 0xFFFF, 0x0000 },
[17924] = { 0x00FF, 0x00FF, 0x0000 },
[17925] = { 0xFFFF, 0xFFFF, 0x0000 },
[17926] = { 0x00FF, 0x00FF, 0x0000 },
[17927] = { 0xFFFF, 0xFFFF, 0x0000 },
[17928] = { 0x00FF, 0x00FF, 0x0000 },
[17929] = { 0xFFFF, 0xFFFF, 0x0000 },
[17930] = { 0x00FF, 0x00FF, 0x0000 },
[17931] = { 0xFFFF, 0xFFFF, 0x0000 },
[17932] = { 0x00FF, 0x00FF, 0x0000 },
[17933] = { 0xFFFF, 0xFFFF, 0x0000 },
[17934] = { 0x00FF, 0x00FF, 0x0000 },
[17935] = { 0xFFFF, 0xFFFF, 0x0000 },
[17936] = { 0x00FF, 0x00FF, 0x0000 },
[17937] = { 0xFFFF, 0xFFFF, 0x0000 },
[17938] = { 0x00FF, 0x00FF, 0x0000 },
[17939] = { 0xFFFF, 0xFFFF, 0x0000 },
[17940] = { 0x00FF, 0x00FF, 0x0000 },
[17941] = { 0xFFFF, 0xFFFF, 0x0000 },
[17942] = { 0x00FF, 0x00FF, 0x0000 },
[17943] = { 0xFFFF, 0xFFFF, 0x0000 },
[17944] = { 0x00FF, 0x00FF, 0x0000 },
[17945] = { 0xFFFF, 0xFFFF, 0x0000 },
[17946] = { 0x00FF, 0x00FF, 0x0000 },
[17947] = { 0xFFFF, 0xFFFF, 0x0000 },
[17948] = { 0x00FF, 0x00FF, 0x0000 },
[17949] = { 0xFFFF, 0xFFFF, 0x0000 },
[17950] = { 0x00FF, 0x00FF, 0x0000 },
[17951] = { 0xFFFF, 0xFFFF, 0x0000 },
[17952] = { 0x00FF, 0x00FF, 0x0000 },
[17953] = { 0xFFFF, 0xFFFF, 0x0000 },
[17954] = { 0x00FF, 0x00FF, 0x0000 },
[17955] = { 0xFFFF, 0xFFFF, 0x0000 },
[17956] = { 0x00FF, 0x00FF, 0x0000 },
[17957] = { 0xFFFF, 0xFFFF, 0x0000 },
[17958] = { 0x00FF, 0x00FF, 0x0000 },
[17959] = { 0xFFFF, 0xFFFF, 0x0000 },
[17960] = { 0x00FF, 0x00FF, 0x0000 },
[17961] = { 0xFFFF, 0xFFFF, 0x0000 },
[17962] = { 0x00FF, 0x00FF, 0x0000 },
[17963] = { 0xFFFF, 0xFFFF, 0x0000 },
[17964] = { 0x00FF, 0x00FF, 0x0000 },
[17965] = { 0xFFFF, 0xFFFF, 0x0000 },
[17966] = { 0x00FF, 0x00FF, 0x0000 },
[17967] = { 0xFFFF, 0xFFFF, 0x0000 },
[17968] = { 0x00FF, 0x00FF, 0x0000 },
[17969] = { 0xFFFF, 0xFFFF, 0x0000 },
[17970] = { 0x00FF, 0x00FF, 0x0000 },
[17971] = { 0xFFFF, 0xFFFF, 0x0000 },
[17972] = { 0x00FF, 0x00FF, 0x0000 },
[17973] = { 0xFFFF, 0xFFFF, 0x0000 },
[17974] = { 0x00FF, 0x00FF, 0x0000 },
[17975] = { 0xFFFF, 0xFFFF, 0x0000 },
[17976] = { 0x00FF, 0x00FF, 0x0000 },
[17977] = { 0xFFFF, 0xFFFF, 0x0000 },
[17978] = { 0x00FF, 0x00FF, 0x0000 },
[17979] = { 0xFFFF, 0xFFFF, 0x0000 },
[17980] = { 0x00FF, 0x00FF, 0x0000 },
[17981] = { 0xFFFF, 0xFFFF, 0x0000 },
[17982] = { 0x00FF, 0x00FF, 0x0000 },
[17983] = { 0xFFFF, 0xFFFF, 0x0000 },
[18432] = { 0x00FF, 0x00FF, 0x0000 },
[18433] = { 0xFFFF, 0xFFFF, 0x0000 },
[18434] = { 0x00FF, 0x00FF, 0x0000 },
[18435] = { 0xFFFF, 0xFFFF, 0x0000 },
[18944] = { 0x00FF, 0x00FF, 0x0000 },
[18945] = { 0xFFFF, 0xFFFF, 0x0000 },
[18946] = { 0x00FF, 0x00FF, 0x0000 },
[18947] = { 0xFFFF, 0xFFFF, 0x0000 },
[18948] = { 0x00FF, 0x00FF, 0x0000 },
[18949] = { 0xFFFF, 0xFFFF, 0x0000 },
[18950] = { 0x00FF, 0x00FF, 0x0000 },
[18951] = { 0xFFFF, 0xFFFF, 0x0000 },
[18952] = { 0x00FF, 0x00FF, 0x0000 },
[18953] = { 0xFFFF, 0xFFFF, 0x0000 },
[18954] = { 0x00FF, 0x00FF, 0x0000 },
[18955] = { 0xFFFF, 0xFFFF, 0x0000 },
[18956] = { 0x00FF, 0x00FF, 0x0000 },
[18957] = { 0xFFFF, 0xFFFF, 0x0000 },
[18958] = { 0x00FF, 0x00FF, 0x0000 },
[18959] = { 0xFFFF, 0xFFFF, 0x0000 },
[18960] = { 0x00FF, 0x00FF, 0x0000 },
[18961] = { 0xFFFF, 0xFFFF, 0x0000 },
[18962] = { 0x00FF, 0x00FF, 0x0000 },
[18963] = { 0xFFFF, 0xFFFF, 0x0000 },
[18964] = { 0x00FF, 0x00FF, 0x0000 },
[18965] = { 0xFFFF, 0xFFFF, 0x0000 },
[18966] = { 0x00FF, 0x00FF, 0x0000 },
[18967] = { 0xFFFF, 0xFFFF, 0x0000 },
[18968] = { 0x00FF, 0x00FF, 0x0000 },
[18969] = { 0xFFFF, 0xFFFF, 0x0000 },
[18970] = { 0x00FF, 0x00FF, 0x0000 },
[18971] = { 0xFFFF, 0xFFFF, 0x0000 },
[18972] = { 0x00FF, 0x00FF, 0x0000 },
[18973] = { 0xFFFF, 0xFFFF, 0x0000 },
[18974] = { 0x00FF, 0x00FF, 0x0000 },
[18975] = { 0xFFFF, 0xFFFF, 0x0000 },
[18976] = { 0x00FF, 0x00FF, 0x0000 },
[18977] = { 0xFFFF, 0xFFFF, 0x0000 },
[18978] = { 0x00FF, 0x00FF, 0x0000 },
[18979] = { 0xFFFF, 0xFFFF, 0x0000 },
[18980] = { 0x00FF, 0x00FF, 0x0000 },
[18981] = { 0xFFFF, 0xFFFF, 0x0000 },
[18982] = { 0x00FF, 0x00FF, 0x0000 },
[18983] = { 0xFFFF, 0xFFFF, 0x0000 },
[18984] = { 0x00FF, 0x00FF, 0x0000 },
[18985] = { 0xFFFF, 0xFFFF, 0x0000 },
[18986] = { 0x00FF, 0x00FF, 0x0000 },
[18987] = { 0xFFFF, 0xFFFF, 0x0000 },
[18988] = { 0x00FF, 0x00FF, 0x0000 },
[18989] = { 0xFFFF, 0xFFFF, 0x0000 },
[18990] = { 0x00FF, 0x00FF, 0x0000 },
[18991] = { 0xFFFF, 0xFFFF, 0x0000 },
[18992] = { 0x00FF, 0x00FF, 0x0000 },
[18993] = { 0xFFFF, 0xFFFF, 0x0000 },
[18994] = { 0x00FF, 0x00FF, 0x0000 },
[18995] = { 0xFFFF, 0xFFFF, 0x0000 },
[18996] = { 0x00FF, 0x00FF, 0x0000 },
[18997] = { 0xFFFF, 0xFFFF, 0x0000 },
[18998] = { 0x00FF, 0x00FF, 0x0000 },
[18999] = { 0xFFFF, 0xFFFF, 0x0000 },
[19000] = { 0x00FF, 0x00FF, 0x0000 },
[19001] = { 0xFFFF, 0xFFFF, 0x0000 },
[19002] = { 0x00FF, 0x00FF, 0x0000 },
[19003] = { 0xFFFF, 0xFFFF, 0x0000 },
[19004] = { 0x00FF, 0x00FF, 0x0000 },
[19005] = { 0xFFFF, 0xFFFF, 0x0000 },
[19006] = { 0x00FF, 0x00FF, 0x0000 },
[19007] = { 0xFFFF, 0xFFFF, 0x0000 },
[19456] = { 0x00FF, 0x00FF, 0x0000 },
[19457] = { 0xFFFF, 0xFFFF, 0x0000 },
[19458] = { 0x00FF, 0x00FF, 0x0000 },
[19459] = { 0xFFFF, 0xFFFF, 0x0000 },
[19460] = { 0x00FF, 0x00FF, 0x0000 },
[19461] = { 0xFFFF, 0xFFFF, 0x0000 },
[19462] = { 0x00FF, 0x00FF, 0x0000 },
[19463] = { 0xFFFF, 0xFFFF, 0x0000 },
[19464] = { 0x00FF, 0x00FF, 0x0000 },
[19465] = { 0xFFFF, 0xFFFF, 0x0000 },
[19466] = { 0x00FF, 0x00FF, 0x0000 },
[19467] = { 0xFFFF, 0xFFFF, 0x0000 },
[19468] = { 0x00FF, 0x00FF, 0x0000 },
[19469] = { 0xFFFF, 0xFFFF, 0x0000 },
[19470] = { 0x00FF, 0x00FF, 0x0000 },
[19471] = { 0xFFFF, 0xFFFF, 0x0000 },
[19472] = { 0x00FF, 0x00FF, 0x0000 },
[19473] = { 0xFFFF, 0xFFFF, 0x0000 },
[19474] = { 0x00FF, 0x00FF, 0x0000 },
[19475] = { 0xFFFF, 0xFFFF, 0x0000 },
[19476] = { 0x00FF, 0x00FF, 0x0000 },
[19477] = { 0xFFFF, 0xFFFF, 0x0000 },
[19478] = { 0x00FF, 0x00FF, 0x0000 },
[19479] = { 0xFFFF, 0xFFFF, 0x0000 },
[19480] = { 0x00FF, 0x00FF, 0x0000 },
[19481] = { 0xFFFF, 0xFFFF, 0x0000 },
[19482] = { 0x00FF, 0x00FF, 0x0000 },
[19483] = { 0xFFFF, 0xFFFF, 0x0000 },
[19484] = { 0x00FF, 0x00FF, 0x0000 },
[19485] = { 0xFFFF, 0xFFFF, 0x0000 },
[19486] = { 0x00FF, 0x00FF, 0x0000 },
[19487] = { 0xFFFF, 0xFFFF, 0x0000 },
[19488] = { 0x00FF, 0x00FF, 0x0000 },
[19489] = { 0xFFFF, 0xFFFF, 0x0000 },
[19490] = { 0x00FF, 0x00FF, 0x0000 },
[19491] = { 0xFFFF, 0xFFFF, 0x0000 },
[19492] = { 0x00FF, 0x00FF, 0x0000 },
[19493] = { 0xFFFF, 0xFFFF, 0x0000 },
[19494] = { 0x00FF, 0x00FF, 0x0000 },
[19495] = { 0xFFFF, 0xFFFF, 0x0000 },
[19496] = { 0x00FF, 0x00FF, 0x0000 },
[19497] = { 0xFFFF, 0xFFFF, 0x0000 },
[19498] = { 0x00FF, 0x00FF, 0x0000 },
[19499] = { 0xFFFF, 0xFFFF, 0x0000 },
[19500] = { 0x00FF, 0x00FF, 0x0000 },
[19501] = { 0xFFFF, 0xFFFF, 0x0000 },
[19502] = { 0x00FF, 0x00FF, 0x0000 },
[19503] = { 0xFFFF, 0xFFFF, 0x0000 },
[19504] = { 0x00FF, 0x00FF, 0x0000 },
[19505] = { 0xFFFF, 0xFFFF, 0x0000 },
[19506] = { 0x00FF, 0x00FF, 0x0000 },
[19507] = { 0xFFFF, 0xFFFF, 0x0000 },
[19508] = { 0x00FF, 0x00FF, 0x0000 },
[19509] = { 0xFFFF, 0xFFFF, 0x0000 },
[19510] = { 0x00FF, 0x00FF, 0x0000 },
[19511] = { 0xFFFF, 0xFFFF, 0x0000 },
[19512] = { 0x00FF, 0x00FF, 0x0000 },
[19513] = { 0xFFFF, 0xFFFF, 0x0000 },
[19514] = { 0x00FF, 0x00FF, 0x0000 },
[19515] = { 0xFFFF, 0xFFFF, 0x0000 },
[19516] = { 0x00FF, 0x00FF, 0x0000 },
[19517] = { 0xFFFF, 0xFFFF, 0x0000 },
[19518] = { 0x00FF, 0x00FF, 0x0000 },
[19519] = { 0xFFFF, 0xFFFF, 0x0000 },
[19968] = { 0x00FF, 0x00FF, 0x0000 },
[19969] = { 0xFFFF, 0xFFFF, 0x0000 },
[19970] = { 0x00FF, 0x00FF, 0x0000 },
[19971] = { 0xFFFF, 0xFFFF, 0x0000 },
[20480] = { 0x00FF, 0x00FF, 0x0000 },
[20481] = { 0xFFFF, 0xFFFF, 0x0000 },
[20482] = { 0x00FF, 0x00FF, 0x0000 },
[20483] = { 0xFFFF, 0xFFFF, 0x0000 },
[20484] = { 0x00FF, 0x00FF, 0x0000 },
[20485] = { 0xFFFF, 0xFFFF, 0x0000 },
[20486] = { 0x00FF, 0x00FF, 0x0000 },
[20487] = { 0xFFFF, 0xFFFF, 0x0000 },
[20488] = { 0x00FF, 0x00FF, 0x0000 },
[20489] = { 0xFFFF, 0xFFFF, 0x0000 },
[20490] = { 0x00FF, 0x00FF, 0x0000 },
[20491] = { 0xFFFF, 0xFFFF, 0x0000 },
[20492] = { 0x00FF, 0x00FF, 0x0000 },
[20493] = { 0xFFFF, 0xFFFF, 0x0000 },
[20494] = { 0x00FF, 0x00FF, 0x0000 },
[20495] = { 0xFFFF, 0xFFFF, 0x0000 },
[20496] = { 0x00FF, 0x00FF, 0x0000 },
[20497] = { 0xFFFF, 0xFFFF, 0x0000 },
[20498] = { 0x00FF, 0x00FF, 0x0000 },
[20499] = { 0xFFFF, 0xFFFF, 0x0000 },
[20500] = { 0x00FF, 0x00FF, 0x0000 },
[20501] = { 0xFFFF, 0xFFFF, 0x0000 },
[20502] = { 0x00FF, 0x00FF, 0x0000 },
[20503] = { 0xFFFF, 0xFFFF, 0x0000 },
[20504] = { 0x00FF, 0x00FF, 0x0000 },
[20505] = { 0xFFFF, 0xFFFF, 0x0000 },
[20506] = { 0x00FF, 0x00FF, 0x0000 },
[20507] = { 0xFFFF, 0xFFFF, 0x0000 },
[20508] = { 0x00FF, 0x00FF, 0x0000 },
[20509] = { 0xFFFF, 0xFFFF, 0x0000 },
[20510] = { 0x00FF, 0x00FF, 0x0000 },
[20511] = { 0xFFFF, 0xFFFF, 0x0000 },
[20512] = { 0x00FF, 0x00FF, 0x0000 },
[20513] = { 0xFFFF, 0xFFFF, 0x0000 },
[20514] = { 0x00FF, 0x00FF, 0x0000 },
[20515] = { 0xFFFF, 0xFFFF, 0x0000 },
[20516] = { 0x00FF, 0x00FF, 0x0000 },
[20517] = { 0xFFFF, 0xFFFF, 0x0000 },
[20518] = { 0x00FF, 0x00FF, 0x0000 },
[20519] = { 0xFFFF, 0xFFFF, 0x0000 },
[20520] = { 0x00FF, 0x00FF, 0x0000 },
[20521] = { 0xFFFF, 0xFFFF, 0x0000 },
[20522] = { 0x00FF, 0x00FF, 0x0000 },
[20523] = { 0xFFFF, 0xFFFF, 0x0000 },
[20524] = { 0x00FF, 0x00FF, 0x0000 },
[20525] = { 0xFFFF, 0xFFFF, 0x0000 },
[20526] = { 0x00FF, 0x00FF, 0x0000 },
[20527] = { 0xFFFF, 0xFFFF, 0x0000 },
[20528] = { 0x00FF, 0x00FF, 0x0000 },
[20529] = { 0xFFFF, 0xFFFF, 0x0000 },
[20530] = { 0x00FF, 0x00FF, 0x0000 },
[20531] = { 0xFFFF, 0xFFFF, 0x0000 },
[20532] = { 0x00FF, 0x00FF, 0x0000 },
[20533] = { 0xFFFF, 0xFFFF, 0x0000 },
[20534] = { 0x00FF, 0x00FF, 0x0000 },
[20535] = { 0xFFFF, 0xFFFF, 0x0000 },
[20536] = { 0x00FF, 0x00FF, 0x0000 },
[20537] = { 0xFFFF, 0xFFFF, 0x0000 },
[20538] = { 0x00FF, 0x00FF, 0x0000 },
[20539] = { 0xFFFF, 0xFFFF, 0x0000 },
[20540] = { 0x00FF, 0x00FF, 0x0000 },
[20541] = { 0xFFFF, 0xFFFF, 0x0000 },
[20542] = { 0x00FF, 0x00FF, 0x0000 },
[20543] = { 0xFFFF, 0xFFFF, 0x0000 },
[20992] = { 0x00FF, 0x00FF, 0x0000 },
[20993] = { 0xFFFF, 0xFFFF, 0x0000 },
[20994] = { 0x00FF, 0x00FF, 0x0000 },
[20995] = { 0xFFFF, 0xFFFF, 0x0000 },
[20996] = { 0x00FF, 0x00FF, 0x0000 },
[20997] = { 0xFFFF, 0xFFFF, 0x0000 },
[20998] = { 0x00FF, 0x00FF, 0x0000 },
[20999] = { 0xFFFF, 0xFFFF, 0x0000 },
[21000] = { 0x00FF, 0x00FF, 0x0000 },
[21001] = { 0xFFFF, 0xFFFF, 0x0000 },
[21002] = { 0x00FF, 0x00FF, 0x0000 },
[21003] = { 0xFFFF, 0xFFFF, 0x0000 },
[21004] = { 0x00FF, 0x00FF, 0x0000 },
[21005] = { 0xFFFF, 0xFFFF, 0x0000 },
[21006] = { 0x00FF, 0x00FF, 0x0000 },
[21007] = { 0xFFFF, 0xFFFF, 0x0000 },
[21008] = { 0x00FF, 0x00FF, 0x0000 },
[21009] = { 0xFFFF, 0xFFFF, 0x0000 },
[21010] = { 0x00FF, 0x00FF, 0x0000 },
[21011] = { 0xFFFF, 0xFFFF, 0x0000 },
[21012] = { 0x00FF, 0x00FF, 0x0000 },
[21013] = { 0xFFFF, 0xFFFF, 0x0000 },
[21014] = { 0x00FF, 0x00FF, 0x0000 },
[21015] = { 0xFFFF, 0xFFFF, 0x0000 },
[21016] = { 0x00FF, 0x00FF, 0x0000 },
[21017] = { 0xFFFF, 0xFFFF, 0x0000 },
[21018] = { 0x00FF, 0x00FF, 0x0000 },
[21019] = { 0xFFFF, 0xFFFF, 0x0000 },
[21020] = { 0x00FF, 0x00FF, 0x0000 },
[21021] = { 0xFFFF, 0xFFFF, 0x0000 },
[21022] = { 0x00FF, 0x00FF, 0x0000 },
[21023] = { 0xFFFF, 0xFFFF, 0x0000 },
[21024] = { 0x00FF, 0x00FF, 0x0000 },
[21025] = { 0xFFFF, 0xFFFF, 0x0000 },
[21026] = { 0x00FF, 0x00FF, 0x0000 },
[21027] = { 0xFFFF, 0xFFFF, 0x0000 },
[21028] = { 0x00FF, 0x00FF, 0x0000 },
[21029] = { 0xFFFF, 0xFFFF, 0x0000 },
[21030] = { 0x00FF, 0x00FF, 0x0000 },
[21031] = { 0xFFFF, 0xFFFF, 0x0000 },
[21032] = { 0x00FF, 0x00FF, 0x0000 },
[21033] = { 0xFFFF, 0xFFFF, 0x0000 },
[21034] = { 0x00FF, 0x00FF, 0x0000 },
[21035] = { 0xFFFF, 0xFFFF, 0x0000 },
[21036] = { 0x00FF, 0x00FF, 0x0000 },
[21037] = { 0xFFFF, 0xFFFF, 0x0000 },
[21038] = { 0x00FF, 0x00FF, 0x0000 },
[21039] = { 0xFFFF, 0xFFFF, 0x0000 },
[21040] = { 0x00FF, 0x00FF, 0x0000 },
[21041] = { 0xFFFF, 0xFFFF, 0x0000 },
[21042] = { 0x00FF, 0x00FF, 0x0000 },
[21043] = { 0xFFFF, 0xFFFF, 0x0000 },
[21044] = { 0x00FF, 0x00FF, 0x0000 },
[21045] = { 0xFFFF, 0xFFFF, 0x0000 },
[21046] = { 0x00FF, 0x00FF, 0x0000 },
[21047] = { 0xFFFF, 0xFFFF, 0x0000 },
[21048] = { 0x00FF, 0x00FF, 0x0000 },
[21049] = { 0xFFFF, 0xFFFF, 0x0000 },
[21050] = { 0x00FF, 0x00FF, 0x0000 },
[21051] = { 0xFFFF, 0xFFFF, 0x0000 },
[21052] = { 0x00FF, 0x00FF, 0x0000 },
[21053] = { 0xFFFF, 0xFFFF, 0x0000 },
[21054] = { 0x00FF, 0x00FF, 0x0000 },
[21055] = { 0xFFFF, 0xFFFF, 0x0000 },
[21056] = { 0x00FF, 0x00FF, 0x0000 },
[21057] = { 0xFFFF, 0xFFFF, 0x0000 },
[21058] = { 0x00FF, 0x00FF, 0x0000 },
[21059] = { 0xFFFF, 0xFFFF, 0x0000 },
[21060] = { 0x00FF, 0x00FF, 0x0000 },
[21061] = { 0xFFFF, 0xFFFF, 0x0000 },
[21062] = { 0x00FF, 0x00FF, 0x0000 },
[21063] = { 0xFFFF, 0xFFFF, 0x0000 },
[21064] = { 0x00FF, 0x00FF, 0x0000 },
[21065] = { 0xFFFF, 0xFFFF, 0x0000 },
[21066] = { 0x00FF, 0x00FF, 0x0000 },
[21067] = { 0xFFFF, 0xFFFF, 0x0000 },
[21068] = { 0x00FF, 0x00FF, 0x0000 },
[21069] = { 0xFFFF, 0xFFFF, 0x0000 },
[21070] = { 0x00FF, 0x00FF, 0x0000 },
[21071] = { 0xFFFF, 0xFFFF, 0x0000 },
[21072] = { 0x00FF, 0x00FF, 0x0000 },
[21073] = { 0xFFFF, 0xFFFF, 0x0000 },
[21074] = { 0x00FF, 0x00FF, 0x0000 },
[21075] = { 0xFFFF, 0xFFFF, 0x0000 },
[21076] = { 0x00FF, 0x00FF, 0x0000 },
[21077] = { 0xFFFF, 0xFFFF, 0x0000 },
[21078] = { 0x00FF, 0x00FF, 0x0000 },
[21079] = { 0xFFFF, 0xFFFF, 0x0000 },
[21080] = { 0x00FF, 0x00FF, 0x0000 },
[21081] = { 0xFFFF, 0xFFFF, 0x0000 },
[21082] = { 0x00FF, 0x00FF, 0x0000 },
[21083] = { 0xFFFF, 0xFFFF, 0x0000 },
[21084] = { 0x00FF, 0x00FF, 0x0000 },
[21085] = { 0xFFFF, 0xFFFF, 0x0000 },
[21086] = { 0x00FF, 0x00FF, 0x0000 },
[21087] = { 0xFFFF, 0xFFFF, 0x0000 },
[21088] = { 0x00FF, 0x00FF, 0x0000 },
[21089] = { 0xFFFF, 0xFFFF, 0x0000 },
[21090] = { 0x00FF, 0x00FF, 0x0000 },
[21091] = { 0xFFFF, 0xFFFF, 0x0000 },
[21092] = { 0x00FF, 0x00FF, 0x0000 },
[21093] = { 0xFFFF, 0xFFFF, 0x0000 },
[21094] = { 0x00FF, 0x00FF, 0x0000 },
[21095] = { 0xFFFF, 0xFFFF, 0x0000 },
[21096] = { 0x00FF, 0x00FF, 0x0000 },
[21097] = { 0xFFFF, 0xFFFF, 0x0000 },
[21098] = { 0x00FF, 0x00FF, 0x0000 },
[21099] = { 0xFFFF, 0xFFFF, 0x0000 },
[21100] = { 0x00FF, 0x00FF, 0x0000 },
[21101] = { 0xFFFF, 0xFFFF, 0x0000 },
[21102] = { 0x00FF, 0x00FF, 0x0000 },
[21103] = { 0xFFFF, 0xFFFF, 0x0000 },
[21104] = { 0x00FF, 0x00FF, 0x0000 },
[21105] = { 0xFFFF, 0xFFFF, 0x0000 },
[21106] = { 0x00FF, 0x00FF, 0x0000 },
[21107] = { 0xFFFF, 0xFFFF, 0x0000 },
[21108] = { 0x00FF, 0x00FF, 0x0000 },
[21109] = { 0xFFFF, 0xFFFF, 0x0000 },
[21110] = { 0x00FF, 0x00FF, 0x0000 },
[21111] = { 0xFFFF, 0xFFFF, 0x0000 },
[21112] = { 0x00FF, 0x00FF, 0x0000 },
[21113] = { 0xFFFF, 0xFFFF, 0x0000 },
[21114] = { 0x00FF, 0x00FF, 0x0000 },
[21115] = { 0xFFFF, 0xFFFF, 0x0000 },
[21116] = { 0x00FF, 0x00FF, 0x0000 },
[21117] = { 0xFFFF, 0xFFFF, 0x0000 },
[21118] = { 0x00FF, 0x00FF, 0x0000 },
[21119] = { 0xFFFF, 0xFFFF, 0x0000 },
[21120] = { 0x00FF, 0x00FF, 0x0000 },
[21121] = { 0xFFFF, 0xFFFF, 0x0000 },
[21122] = { 0x00FF, 0x00FF, 0x0000 },
[21123] = { 0xFFFF, 0xFFFF, 0x0000 },
[21124] = { 0x00FF, 0x00FF, 0x0000 },
[21125] = { 0xFFFF, 0xFFFF, 0x0000 },
[21126] = { 0x00FF, 0x00FF, 0x0000 },
[21127] = { 0xFFFF, 0xFFFF, 0x0000 },
[21128] = { 0x00FF, 0x00FF, 0x0000 },
[21129] = { 0xFFFF, 0xFFFF, 0x0000 },
[21130] = { 0x00FF, 0x00FF, 0x0000 },
[21131] = { 0xFFFF, 0xFFFF, 0x0000 },
[21132] = { 0x00FF, 0x00FF, 0x0000 },
[21133] = { 0xFFFF, 0xFFFF, 0x0000 },
[21134] = { 0x00FF, 0x00FF, 0x0000 },
[21135] = { 0xFFFF, 0xFFFF, 0x0000 },
[21136] = { 0x00FF, 0x00FF, 0x0000 },
[21137] = { 0xFFFF, 0xFFFF, 0x0000 },
[21138] = { 0x00FF, 0x00FF, 0x0000 },
[21139] = { 0xFFFF, 0xFFFF, 0x0000 },
};
static bool wm8962_volatile_register(struct device *dev, unsigned int reg)
{
if (wm8962_reg_access[reg].vol)
return 1;
else
return 0;
}
static bool wm8962_readable_register(struct device *dev, unsigned int reg)
{
if (wm8962_reg_access[reg].read)
return 1;
else
return 0;
}
static int wm8962_reset(struct wm8962_priv *wm8962)
{
int ret;
ret = regmap_write(wm8962->regmap, WM8962_SOFTWARE_RESET, 0x6243);
if (ret != 0)
return ret;
return regmap_write(wm8962->regmap, WM8962_PLL_SOFTWARE_RESET, 0);
}
static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0);
static const DECLARE_TLV_DB_SCALE(mixin_tlv, -1500, 300, 0);
static const unsigned int mixinpga_tlv[] = {
TLV_DB_RANGE_HEAD(5),
0, 1, TLV_DB_SCALE_ITEM(0, 600, 0),
2, 2, TLV_DB_SCALE_ITEM(1300, 1300, 0),
3, 4, TLV_DB_SCALE_ITEM(1800, 200, 0),
5, 5, TLV_DB_SCALE_ITEM(2400, 0, 0),
6, 7, TLV_DB_SCALE_ITEM(2700, 300, 0),
};
static const DECLARE_TLV_DB_SCALE(beep_tlv, -9600, 600, 1);
static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1);
static const DECLARE_TLV_DB_SCALE(st_tlv, -3600, 300, 0);
static const DECLARE_TLV_DB_SCALE(inmix_tlv, -600, 600, 0);
static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0);
static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1);
static const DECLARE_TLV_DB_SCALE(hp_tlv, -700, 100, 0);
static const unsigned int classd_tlv[] = {
TLV_DB_RANGE_HEAD(2),
0, 6, TLV_DB_SCALE_ITEM(0, 150, 0),
7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0),
};
static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
static int wm8962_dsp2_write_config(struct snd_soc_codec *codec)
{
return 0;
}
static int wm8962_dsp2_set_enable(struct snd_soc_codec *codec, u16 val)
{
u16 adcl = snd_soc_read(codec, WM8962_LEFT_ADC_VOLUME);
u16 adcr = snd_soc_read(codec, WM8962_RIGHT_ADC_VOLUME);
u16 dac = snd_soc_read(codec, WM8962_ADC_DAC_CONTROL_1);
snd_soc_write(codec, WM8962_LEFT_ADC_VOLUME, 0);
snd_soc_write(codec, WM8962_RIGHT_ADC_VOLUME, WM8962_ADC_VU);
snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1,
WM8962_DAC_MUTE, WM8962_DAC_MUTE);
snd_soc_write(codec, WM8962_SOUNDSTAGE_ENABLES_0, val);
snd_soc_write(codec, WM8962_LEFT_ADC_VOLUME, adcl);
snd_soc_write(codec, WM8962_RIGHT_ADC_VOLUME, adcr);
snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1,
WM8962_DAC_MUTE, dac);
return 0;
}
static int wm8962_dsp2_start(struct snd_soc_codec *codec)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
wm8962_dsp2_write_config(codec);
snd_soc_write(codec, WM8962_DSP2_EXECCONTROL, WM8962_DSP2_RUNR);
wm8962_dsp2_set_enable(codec, wm8962->dsp2_ena);
return 0;
}
static int wm8962_dsp2_stop(struct snd_soc_codec *codec)
{
wm8962_dsp2_set_enable(codec, 0);
snd_soc_write(codec, WM8962_DSP2_EXECCONTROL, WM8962_DSP2_STOP);
return 0;
}
#define WM8962_DSP2_ENABLE(xname, xshift) \
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
.info = wm8962_dsp2_ena_info, \
.get = wm8962_dsp2_ena_get, .put = wm8962_dsp2_ena_put, \
.private_value = xshift }
static int wm8962_dsp2_ena_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
uinfo->count = 1;
uinfo->value.integer.min = 0;
uinfo->value.integer.max = 1;
return 0;
}
static int wm8962_dsp2_ena_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
int shift = kcontrol->private_value;
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
ucontrol->value.integer.value[0] = !!(wm8962->dsp2_ena & 1 << shift);
return 0;
}
static int wm8962_dsp2_ena_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
int shift = kcontrol->private_value;
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int old = wm8962->dsp2_ena;
int ret = 0;
int dsp2_running = snd_soc_read(codec, WM8962_DSP2_POWER_MANAGEMENT) &
WM8962_DSP2_ENA;
mutex_lock(&codec->mutex);
if (ucontrol->value.integer.value[0])
wm8962->dsp2_ena |= 1 << shift;
else
wm8962->dsp2_ena &= ~(1 << shift);
if (wm8962->dsp2_ena == old)
goto out;
ret = 1;
if (dsp2_running) {
if (wm8962->dsp2_ena)
wm8962_dsp2_set_enable(codec, wm8962->dsp2_ena);
else
wm8962_dsp2_stop(codec);
}
out:
mutex_unlock(&codec->mutex);
return ret;
}
static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
u16 *reg_cache = codec->reg_cache;
int ret;
ret = snd_soc_put_volsw(kcontrol, ucontrol);
if (ret == 0)
return 0;
if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA)
return snd_soc_write(codec, WM8962_HPOUTL_VOLUME,
reg_cache[WM8962_HPOUTL_VOLUME]);
if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA)
return snd_soc_write(codec, WM8962_HPOUTR_VOLUME,
reg_cache[WM8962_HPOUTR_VOLUME]);
return 0;
}
static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
int ret;
ret = snd_soc_put_volsw(kcontrol, ucontrol);
if (ret == 0)
return 0;
ret = snd_soc_read(codec, WM8962_PWR_MGMT_2);
if (ret & WM8962_SPKOUTL_PGA_ENA) {
snd_soc_write(codec, WM8962_SPKOUTL_VOLUME,
snd_soc_read(codec, WM8962_SPKOUTL_VOLUME));
return 1;
}
if (ret & WM8962_SPKOUTR_PGA_ENA)
snd_soc_write(codec, WM8962_SPKOUTR_VOLUME,
snd_soc_read(codec, WM8962_SPKOUTR_VOLUME));
return 1;
}
static const char *cap_hpf_mode_text[] = {
"Hi-fi", "Application"
};
static const struct soc_enum cap_hpf_mode =
SOC_ENUM_SINGLE(WM8962_ADC_DAC_CONTROL_2, 10, 2, cap_hpf_mode_text);
static const char *cap_lhpf_mode_text[] = {
"LPF", "HPF"
};
static const struct soc_enum cap_lhpf_mode =
SOC_ENUM_SINGLE(WM8962_LHPF1, 1, 2, cap_lhpf_mode_text);
static const struct snd_kcontrol_new wm8962_snd_controls[] = {
SOC_DOUBLE("Input Mixer Switch", WM8962_INPUT_MIXER_CONTROL_1, 3, 2, 1, 1),
SOC_SINGLE_TLV("MIXINL IN2L Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 6, 7, 0,
mixin_tlv),
SOC_SINGLE_TLV("MIXINL PGA Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 3, 7, 0,
mixinpga_tlv),
SOC_SINGLE_TLV("MIXINL IN3L Volume", WM8962_LEFT_INPUT_MIXER_VOLUME, 0, 7, 0,
mixin_tlv),
SOC_SINGLE_TLV("MIXINR IN2R Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 6, 7, 0,
mixin_tlv),
SOC_SINGLE_TLV("MIXINR PGA Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 3, 7, 0,
mixinpga_tlv),
SOC_SINGLE_TLV("MIXINR IN3R Volume", WM8962_RIGHT_INPUT_MIXER_VOLUME, 0, 7, 0,
mixin_tlv),
SOC_DOUBLE_R_TLV("Digital Capture Volume", WM8962_LEFT_ADC_VOLUME,
WM8962_RIGHT_ADC_VOLUME, 1, 127, 0, digital_tlv),
SOC_DOUBLE_R_TLV("Capture Volume", WM8962_LEFT_INPUT_VOLUME,
WM8962_RIGHT_INPUT_VOLUME, 0, 63, 0, inpga_tlv),
SOC_DOUBLE_R("Capture Switch", WM8962_LEFT_INPUT_VOLUME,
WM8962_RIGHT_INPUT_VOLUME, 7, 1, 1),
SOC_DOUBLE_R("Capture ZC Switch", WM8962_LEFT_INPUT_VOLUME,
WM8962_RIGHT_INPUT_VOLUME, 6, 1, 1),
SOC_SINGLE("Capture HPF Switch", WM8962_ADC_DAC_CONTROL_1, 0, 1, 1),
SOC_ENUM("Capture HPF Mode", cap_hpf_mode),
SOC_SINGLE("Capture HPF Cutoff", WM8962_ADC_DAC_CONTROL_2, 7, 7, 0),
SOC_SINGLE("Capture LHPF Switch", WM8962_LHPF1, 0, 1, 0),
SOC_ENUM("Capture LHPF Mode", cap_lhpf_mode),
SOC_DOUBLE_R_TLV("Sidetone Volume", WM8962_DAC_DSP_MIXING_1,
WM8962_DAC_DSP_MIXING_2, 4, 12, 0, st_tlv),
SOC_DOUBLE_R_TLV("Digital Playback Volume", WM8962_LEFT_DAC_VOLUME,
WM8962_RIGHT_DAC_VOLUME, 1, 127, 0, digital_tlv),
SOC_SINGLE("DAC High Performance Switch", WM8962_ADC_DAC_CONTROL_2, 0, 1, 0),
SOC_SINGLE("ADC High Performance Switch", WM8962_ADDITIONAL_CONTROL_1,
5, 1, 0),
SOC_SINGLE_TLV("Beep Volume", WM8962_BEEP_GENERATOR_1, 4, 15, 0, beep_tlv),
SOC_DOUBLE_R_TLV("Headphone Volume", WM8962_HPOUTL_VOLUME,
WM8962_HPOUTR_VOLUME, 0, 127, 0, out_tlv),
SOC_DOUBLE_EXT("Headphone Switch", WM8962_PWR_MGMT_2, 1, 0, 1, 1,
snd_soc_get_volsw, wm8962_put_hp_sw),
SOC_DOUBLE_R("Headphone ZC Switch", WM8962_HPOUTL_VOLUME, WM8962_HPOUTR_VOLUME,
7, 1, 0),
SOC_DOUBLE_TLV("Headphone Aux Volume", WM8962_ANALOGUE_HP_2, 3, 6, 7, 0,
hp_tlv),
SOC_DOUBLE_R("Headphone Mixer Switch", WM8962_HEADPHONE_MIXER_3,
WM8962_HEADPHONE_MIXER_4, 8, 1, 1),
SOC_SINGLE_TLV("HPMIXL IN4L Volume", WM8962_HEADPHONE_MIXER_3,
3, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("HPMIXL IN4R Volume", WM8962_HEADPHONE_MIXER_3,
0, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("HPMIXL MIXINL Volume", WM8962_HEADPHONE_MIXER_3,
7, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("HPMIXL MIXINR Volume", WM8962_HEADPHONE_MIXER_3,
6, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("HPMIXR IN4L Volume", WM8962_HEADPHONE_MIXER_4,
3, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("HPMIXR IN4R Volume", WM8962_HEADPHONE_MIXER_4,
0, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("HPMIXR MIXINL Volume", WM8962_HEADPHONE_MIXER_4,
7, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("HPMIXR MIXINR Volume", WM8962_HEADPHONE_MIXER_4,
6, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("Speaker Boost Volume", WM8962_CLASS_D_CONTROL_2, 0, 7, 0,
classd_tlv),
SOC_SINGLE("EQ Switch", WM8962_EQ1, WM8962_EQ_ENA_SHIFT, 1, 0),
SOC_DOUBLE_R_TLV("EQ1 Volume", WM8962_EQ2, WM8962_EQ22,
WM8962_EQL_B1_GAIN_SHIFT, 31, 0, eq_tlv),
SOC_DOUBLE_R_TLV("EQ2 Volume", WM8962_EQ2, WM8962_EQ22,
WM8962_EQL_B2_GAIN_SHIFT, 31, 0, eq_tlv),
SOC_DOUBLE_R_TLV("EQ3 Volume", WM8962_EQ2, WM8962_EQ22,
WM8962_EQL_B3_GAIN_SHIFT, 31, 0, eq_tlv),
SOC_DOUBLE_R_TLV("EQ4 Volume", WM8962_EQ3, WM8962_EQ23,
WM8962_EQL_B4_GAIN_SHIFT, 31, 0, eq_tlv),
SOC_DOUBLE_R_TLV("EQ5 Volume", WM8962_EQ3, WM8962_EQ23,
WM8962_EQL_B5_GAIN_SHIFT, 31, 0, eq_tlv),
WM8962_DSP2_ENABLE("VSS Switch", WM8962_VSS_ENA_SHIFT),
WM8962_DSP2_ENABLE("HPF1 Switch", WM8962_HPF1_ENA_SHIFT),
WM8962_DSP2_ENABLE("HPF2 Switch", WM8962_HPF2_ENA_SHIFT),
WM8962_DSP2_ENABLE("HD Bass Switch", WM8962_HDBASS_ENA_SHIFT),
};
static const struct snd_kcontrol_new wm8962_spk_mono_controls[] = {
SOC_SINGLE_TLV("Speaker Volume", WM8962_SPKOUTL_VOLUME, 0, 127, 0, out_tlv),
SOC_SINGLE_EXT("Speaker Switch", WM8962_CLASS_D_CONTROL_1, 1, 1, 1,
snd_soc_get_volsw, wm8962_put_spk_sw),
SOC_SINGLE("Speaker ZC Switch", WM8962_SPKOUTL_VOLUME, 7, 1, 0),
SOC_SINGLE("Speaker Mixer Switch", WM8962_SPEAKER_MIXER_3, 8, 1, 1),
SOC_SINGLE_TLV("Speaker Mixer IN4L Volume", WM8962_SPEAKER_MIXER_3,
3, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("Speaker Mixer IN4R Volume", WM8962_SPEAKER_MIXER_3,
0, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("Speaker Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_3,
7, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("Speaker Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_3,
6, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("Speaker Mixer DACL Volume", WM8962_SPEAKER_MIXER_5,
7, 1, 0, inmix_tlv),
SOC_SINGLE_TLV("Speaker Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
6, 1, 0, inmix_tlv),
};
static const struct snd_kcontrol_new wm8962_spk_stereo_controls[] = {
SOC_DOUBLE_R_TLV("Speaker Volume", WM8962_SPKOUTL_VOLUME,
WM8962_SPKOUTR_VOLUME, 0, 127, 0, out_tlv),
SOC_DOUBLE_EXT("Speaker Switch", WM8962_CLASS_D_CONTROL_1, 1, 0, 1, 1,
snd_soc_get_volsw, wm8962_put_spk_sw),
SOC_DOUBLE_R("Speaker ZC Switch", WM8962_SPKOUTL_VOLUME, WM8962_SPKOUTR_VOLUME,
7, 1, 0),
SOC_DOUBLE_R("Speaker Mixer Switch", WM8962_SPEAKER_MIXER_3,
WM8962_SPEAKER_MIXER_4, 8, 1, 1),
SOC_SINGLE_TLV("SPKOUTL Mixer IN4L Volume", WM8962_SPEAKER_MIXER_3,
3, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("SPKOUTL Mixer IN4R Volume", WM8962_SPEAKER_MIXER_3,
0, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("SPKOUTL Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_3,
7, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("SPKOUTL Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_3,
6, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("SPKOUTL Mixer DACL Volume", WM8962_SPEAKER_MIXER_5,
7, 1, 0, inmix_tlv),
SOC_SINGLE_TLV("SPKOUTL Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
6, 1, 0, inmix_tlv),
SOC_SINGLE_TLV("SPKOUTR Mixer IN4L Volume", WM8962_SPEAKER_MIXER_4,
3, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("SPKOUTR Mixer IN4R Volume", WM8962_SPEAKER_MIXER_4,
0, 7, 0, bypass_tlv),
SOC_SINGLE_TLV("SPKOUTR Mixer MIXINL Volume", WM8962_SPEAKER_MIXER_4,
7, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("SPKOUTR Mixer MIXINR Volume", WM8962_SPEAKER_MIXER_4,
6, 1, 1, inmix_tlv),
SOC_SINGLE_TLV("SPKOUTR Mixer DACL Volume", WM8962_SPEAKER_MIXER_5,
5, 1, 0, inmix_tlv),
SOC_SINGLE_TLV("SPKOUTR Mixer DACR Volume", WM8962_SPEAKER_MIXER_5,
4, 1, 0, inmix_tlv),
};
static int sysclk_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_codec *codec = w->codec;
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
unsigned long timeout;
int src;
int fll;
if (codec->dapm.bias_level == SND_SOC_BIAS_OFF)
return 0;
src = snd_soc_read(codec, WM8962_CLOCKING2) & WM8962_SYSCLK_SRC_MASK;
switch (src) {
case 0:
fll = 0;
break;
case 0x200:
fll = 1;
break;
default:
dev_err(codec->dev, "Unknown SYSCLK source %x\n", src);
return -EINVAL;
}
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
if (fll) {
try_wait_for_completion(&wm8962->fll_lock);
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
WM8962_FLL_ENA, WM8962_FLL_ENA);
timeout = msecs_to_jiffies(5);
timeout = wait_for_completion_timeout(&wm8962->fll_lock,
timeout);
if (wm8962->irq && timeout == 0)
dev_err(codec->dev,
"Timed out starting FLL\n");
}
break;
case SND_SOC_DAPM_POST_PMD:
if (fll)
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
WM8962_FLL_ENA, 0);
break;
default:
BUG();
return -EINVAL;
}
return 0;
}
static int cp_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
switch (event) {
case SND_SOC_DAPM_POST_PMU:
msleep(5);
break;
default:
BUG();
return -EINVAL;
}
return 0;
}
static int hp_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_codec *codec = w->codec;
int timeout;
int reg;
int expected = (WM8962_DCS_STARTUP_DONE_HP1L |
WM8962_DCS_STARTUP_DONE_HP1R);
switch (event) {
case SND_SOC_DAPM_POST_PMU:
snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
WM8962_HP1L_ENA | WM8962_HP1R_ENA,
WM8962_HP1L_ENA | WM8962_HP1R_ENA);
udelay(20);
snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY,
WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY);
snd_soc_update_bits(codec, WM8962_DC_SERVO_1,
WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA |
WM8962_HP1L_DCS_STARTUP |
WM8962_HP1R_DCS_STARTUP,
WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA |
WM8962_HP1L_DCS_STARTUP |
WM8962_HP1R_DCS_STARTUP);
timeout = 0;
do {
msleep(1);
reg = snd_soc_read(codec, WM8962_DC_SERVO_6);
if (reg < 0) {
dev_err(codec->dev,
"Failed to read DCS status: %d\n",
reg);
continue;
}
dev_dbg(codec->dev, "DCS status: %x\n", reg);
} while (++timeout < 200 && (reg & expected) != expected);
if ((reg & expected) != expected)
dev_err(codec->dev, "DC servo timed out\n");
else
dev_dbg(codec->dev, "DC servo complete after %dms\n",
timeout);
snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
WM8962_HP1L_ENA_OUTP |
WM8962_HP1R_ENA_OUTP,
WM8962_HP1L_ENA_OUTP |
WM8962_HP1R_ENA_OUTP);
udelay(20);
snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
WM8962_HP1L_RMV_SHORT |
WM8962_HP1R_RMV_SHORT,
WM8962_HP1L_RMV_SHORT |
WM8962_HP1R_RMV_SHORT);
break;
case SND_SOC_DAPM_PRE_PMD:
snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
WM8962_HP1L_RMV_SHORT |
WM8962_HP1R_RMV_SHORT, 0);
udelay(20);
snd_soc_update_bits(codec, WM8962_DC_SERVO_1,
WM8962_HP1L_DCS_ENA | WM8962_HP1R_DCS_ENA |
WM8962_HP1L_DCS_STARTUP |
WM8962_HP1R_DCS_STARTUP,
0);
snd_soc_update_bits(codec, WM8962_ANALOGUE_HP_0,
WM8962_HP1L_ENA | WM8962_HP1R_ENA |
WM8962_HP1L_ENA_DLY | WM8962_HP1R_ENA_DLY |
WM8962_HP1L_ENA_OUTP |
WM8962_HP1R_ENA_OUTP, 0);
break;
default:
BUG();
return -EINVAL;
}
return 0;
}
static int out_pga_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_codec *codec = w->codec;
int reg;
switch (w->shift) {
case WM8962_HPOUTR_PGA_ENA_SHIFT:
reg = WM8962_HPOUTR_VOLUME;
break;
case WM8962_HPOUTL_PGA_ENA_SHIFT:
reg = WM8962_HPOUTL_VOLUME;
break;
case WM8962_SPKOUTR_PGA_ENA_SHIFT:
reg = WM8962_SPKOUTR_VOLUME;
break;
case WM8962_SPKOUTL_PGA_ENA_SHIFT:
reg = WM8962_SPKOUTL_VOLUME;
break;
default:
BUG();
return -EINVAL;
}
switch (event) {
case SND_SOC_DAPM_POST_PMU:
return snd_soc_write(codec, reg, snd_soc_read(codec, reg));
default:
BUG();
return -EINVAL;
}
}
static int dsp2_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
struct snd_soc_codec *codec = w->codec;
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
switch (event) {
case SND_SOC_DAPM_POST_PMU:
if (wm8962->dsp2_ena)
wm8962_dsp2_start(codec);
break;
case SND_SOC_DAPM_PRE_PMD:
if (wm8962->dsp2_ena)
wm8962_dsp2_stop(codec);
break;
default:
BUG();
return -EINVAL;
}
return 0;
}
static const char *st_text[] = { "None", "Left", "Right" };
static const struct soc_enum str_enum =
SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_1, 2, 3, st_text);
static const struct snd_kcontrol_new str_mux =
SOC_DAPM_ENUM("Right Sidetone", str_enum);
static const struct soc_enum stl_enum =
SOC_ENUM_SINGLE(WM8962_DAC_DSP_MIXING_2, 2, 3, st_text);
static const struct snd_kcontrol_new stl_mux =
SOC_DAPM_ENUM("Left Sidetone", stl_enum);
static const char *outmux_text[] = { "DAC", "Mixer" };
static const struct soc_enum spkoutr_enum =
SOC_ENUM_SINGLE(WM8962_SPEAKER_MIXER_2, 7, 2, outmux_text);
static const struct snd_kcontrol_new spkoutr_mux =
SOC_DAPM_ENUM("SPKOUTR Mux", spkoutr_enum);
static const struct soc_enum spkoutl_enum =
SOC_ENUM_SINGLE(WM8962_SPEAKER_MIXER_1, 7, 2, outmux_text);
static const struct snd_kcontrol_new spkoutl_mux =
SOC_DAPM_ENUM("SPKOUTL Mux", spkoutl_enum);
static const struct soc_enum hpoutr_enum =
SOC_ENUM_SINGLE(WM8962_HEADPHONE_MIXER_2, 7, 2, outmux_text);
static const struct snd_kcontrol_new hpoutr_mux =
SOC_DAPM_ENUM("HPOUTR Mux", hpoutr_enum);
static const struct soc_enum hpoutl_enum =
SOC_ENUM_SINGLE(WM8962_HEADPHONE_MIXER_1, 7, 2, outmux_text);
static const struct snd_kcontrol_new hpoutl_mux =
SOC_DAPM_ENUM("HPOUTL Mux", hpoutl_enum);
static const struct snd_kcontrol_new inpgal[] = {
SOC_DAPM_SINGLE("IN1L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 3, 1, 0),
SOC_DAPM_SINGLE("IN2L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 2, 1, 0),
SOC_DAPM_SINGLE("IN3L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 1, 1, 0),
SOC_DAPM_SINGLE("IN4L Switch", WM8962_LEFT_INPUT_PGA_CONTROL, 0, 1, 0),
};
static const struct snd_kcontrol_new inpgar[] = {
SOC_DAPM_SINGLE("IN1R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 3, 1, 0),
SOC_DAPM_SINGLE("IN2R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 2, 1, 0),
SOC_DAPM_SINGLE("IN3R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 1, 1, 0),
SOC_DAPM_SINGLE("IN4R Switch", WM8962_RIGHT_INPUT_PGA_CONTROL, 0, 1, 0),
};
static const struct snd_kcontrol_new mixinl[] = {
SOC_DAPM_SINGLE("IN2L Switch", WM8962_INPUT_MIXER_CONTROL_2, 5, 1, 0),
SOC_DAPM_SINGLE("IN3L Switch", WM8962_INPUT_MIXER_CONTROL_2, 4, 1, 0),
SOC_DAPM_SINGLE("PGA Switch", WM8962_INPUT_MIXER_CONTROL_2, 3, 1, 0),
};
static const struct snd_kcontrol_new mixinr[] = {
SOC_DAPM_SINGLE("IN2R Switch", WM8962_INPUT_MIXER_CONTROL_2, 2, 1, 0),
SOC_DAPM_SINGLE("IN3R Switch", WM8962_INPUT_MIXER_CONTROL_2, 1, 1, 0),
SOC_DAPM_SINGLE("PGA Switch", WM8962_INPUT_MIXER_CONTROL_2, 0, 1, 0),
};
static const struct snd_kcontrol_new hpmixl[] = {
SOC_DAPM_SINGLE("DACL Switch", WM8962_HEADPHONE_MIXER_1, 5, 1, 0),
SOC_DAPM_SINGLE("DACR Switch", WM8962_HEADPHONE_MIXER_1, 4, 1, 0),
SOC_DAPM_SINGLE("MIXINL Switch", WM8962_HEADPHONE_MIXER_1, 3, 1, 0),
SOC_DAPM_SINGLE("MIXINR Switch", WM8962_HEADPHONE_MIXER_1, 2, 1, 0),
SOC_DAPM_SINGLE("IN4L Switch", WM8962_HEADPHONE_MIXER_1, 1, 1, 0),
SOC_DAPM_SINGLE("IN4R Switch", WM8962_HEADPHONE_MIXER_1, 0, 1, 0),
};
static const struct snd_kcontrol_new hpmixr[] = {
SOC_DAPM_SINGLE("DACL Switch", WM8962_HEADPHONE_MIXER_2, 5, 1, 0),
SOC_DAPM_SINGLE("DACR Switch", WM8962_HEADPHONE_MIXER_2, 4, 1, 0),
SOC_DAPM_SINGLE("MIXINL Switch", WM8962_HEADPHONE_MIXER_2, 3, 1, 0),
SOC_DAPM_SINGLE("MIXINR Switch", WM8962_HEADPHONE_MIXER_2, 2, 1, 0),
SOC_DAPM_SINGLE("IN4L Switch", WM8962_HEADPHONE_MIXER_2, 1, 1, 0),
SOC_DAPM_SINGLE("IN4R Switch", WM8962_HEADPHONE_MIXER_2, 0, 1, 0),
};
static const struct snd_kcontrol_new spkmixl[] = {
SOC_DAPM_SINGLE("DACL Switch", WM8962_SPEAKER_MIXER_1, 5, 1, 0),
SOC_DAPM_SINGLE("DACR Switch", WM8962_SPEAKER_MIXER_1, 4, 1, 0),
SOC_DAPM_SINGLE("MIXINL Switch", WM8962_SPEAKER_MIXER_1, 3, 1, 0),
SOC_DAPM_SINGLE("MIXINR Switch", WM8962_SPEAKER_MIXER_1, 2, 1, 0),
SOC_DAPM_SINGLE("IN4L Switch", WM8962_SPEAKER_MIXER_1, 1, 1, 0),
SOC_DAPM_SINGLE("IN4R Switch", WM8962_SPEAKER_MIXER_1, 0, 1, 0),
};
static const struct snd_kcontrol_new spkmixr[] = {
SOC_DAPM_SINGLE("DACL Switch", WM8962_SPEAKER_MIXER_2, 5, 1, 0),
SOC_DAPM_SINGLE("DACR Switch", WM8962_SPEAKER_MIXER_2, 4, 1, 0),
SOC_DAPM_SINGLE("MIXINL Switch", WM8962_SPEAKER_MIXER_2, 3, 1, 0),
SOC_DAPM_SINGLE("MIXINR Switch", WM8962_SPEAKER_MIXER_2, 2, 1, 0),
SOC_DAPM_SINGLE("IN4L Switch", WM8962_SPEAKER_MIXER_2, 1, 1, 0),
SOC_DAPM_SINGLE("IN4R Switch", WM8962_SPEAKER_MIXER_2, 0, 1, 0),
};
static const struct snd_soc_dapm_widget wm8962_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("IN1L"),
SND_SOC_DAPM_INPUT("IN1R"),
SND_SOC_DAPM_INPUT("IN2L"),
SND_SOC_DAPM_INPUT("IN2R"),
SND_SOC_DAPM_INPUT("IN3L"),
SND_SOC_DAPM_INPUT("IN3R"),
SND_SOC_DAPM_INPUT("IN4L"),
SND_SOC_DAPM_INPUT("IN4R"),
SND_SOC_DAPM_SIGGEN("Beep"),
SND_SOC_DAPM_INPUT("DMICDAT"),
SND_SOC_DAPM_SUPPLY("MICBIAS", WM8962_PWR_MGMT_1, 1, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("Class G", WM8962_CHARGE_PUMP_B, 0, 1, NULL, 0),
SND_SOC_DAPM_SUPPLY("SYSCLK", WM8962_CLOCKING2, 5, 0, sysclk_event,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_SUPPLY("Charge Pump", WM8962_CHARGE_PUMP_1, 0, 0, cp_event,
SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_SUPPLY("TOCLK", WM8962_ADDITIONAL_CONTROL_1, 0, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY_S("DSP2", 1, WM8962_DSP2_POWER_MANAGEMENT,
WM8962_DSP2_ENA_SHIFT, 0, dsp2_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_SUPPLY("TEMP_HP", WM8962_ADDITIONAL_CONTROL_4, 2, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY("TEMP_SPK", WM8962_ADDITIONAL_CONTROL_4, 1, 0, NULL, 0),
SND_SOC_DAPM_MIXER("INPGAL", WM8962_LEFT_INPUT_PGA_CONTROL, 4, 0,
inpgal, ARRAY_SIZE(inpgal)),
SND_SOC_DAPM_MIXER("INPGAR", WM8962_RIGHT_INPUT_PGA_CONTROL, 4, 0,
inpgar, ARRAY_SIZE(inpgar)),
SND_SOC_DAPM_MIXER("MIXINL", WM8962_PWR_MGMT_1, 5, 0,
mixinl, ARRAY_SIZE(mixinl)),
SND_SOC_DAPM_MIXER("MIXINR", WM8962_PWR_MGMT_1, 4, 0,
mixinr, ARRAY_SIZE(mixinr)),
SND_SOC_DAPM_AIF_IN("DMIC_ENA", NULL, 0, WM8962_PWR_MGMT_1, 10, 0),
SND_SOC_DAPM_ADC("ADCL", "Capture", WM8962_PWR_MGMT_1, 3, 0),
SND_SOC_DAPM_ADC("ADCR", "Capture", WM8962_PWR_MGMT_1, 2, 0),
SND_SOC_DAPM_MUX("STL", SND_SOC_NOPM, 0, 0, &stl_mux),
SND_SOC_DAPM_MUX("STR", SND_SOC_NOPM, 0, 0, &str_mux),
SND_SOC_DAPM_DAC("DACL", "Playback", WM8962_PWR_MGMT_2, 8, 0),
SND_SOC_DAPM_DAC("DACR", "Playback", WM8962_PWR_MGMT_2, 7, 0),
SND_SOC_DAPM_PGA("Left Bypass", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_PGA("Right Bypass", SND_SOC_NOPM, 0, 0, NULL, 0),
SND_SOC_DAPM_MIXER("HPMIXL", WM8962_MIXER_ENABLES, 3, 0,
hpmixl, ARRAY_SIZE(hpmixl)),
SND_SOC_DAPM_MIXER("HPMIXR", WM8962_MIXER_ENABLES, 2, 0,
hpmixr, ARRAY_SIZE(hpmixr)),
SND_SOC_DAPM_MUX_E("HPOUTL PGA", WM8962_PWR_MGMT_2, 6, 0, &hpoutl_mux,
out_pga_event, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_MUX_E("HPOUTR PGA", WM8962_PWR_MGMT_2, 5, 0, &hpoutr_mux,
out_pga_event, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_PGA_E("HPOUT", SND_SOC_NOPM, 0, 0, NULL, 0, hp_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_OUTPUT("HPOUTL"),
SND_SOC_DAPM_OUTPUT("HPOUTR"),
};
static const struct snd_soc_dapm_widget wm8962_dapm_spk_mono_widgets[] = {
SND_SOC_DAPM_MIXER("Speaker Mixer", WM8962_MIXER_ENABLES, 1, 0,
spkmixl, ARRAY_SIZE(spkmixl)),
SND_SOC_DAPM_MUX_E("Speaker PGA", WM8962_PWR_MGMT_2, 4, 0, &spkoutl_mux,
out_pga_event, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_PGA("Speaker Output", WM8962_CLASS_D_CONTROL_1, 7, 0, NULL, 0),
SND_SOC_DAPM_OUTPUT("SPKOUT"),
};
static const struct snd_soc_dapm_widget wm8962_dapm_spk_stereo_widgets[] = {
SND_SOC_DAPM_MIXER("SPKOUTL Mixer", WM8962_MIXER_ENABLES, 1, 0,
spkmixl, ARRAY_SIZE(spkmixl)),
SND_SOC_DAPM_MIXER("SPKOUTR Mixer", WM8962_MIXER_ENABLES, 0, 0,
spkmixr, ARRAY_SIZE(spkmixr)),
SND_SOC_DAPM_MUX_E("SPKOUTL PGA", WM8962_PWR_MGMT_2, 4, 0, &spkoutl_mux,
out_pga_event, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_MUX_E("SPKOUTR PGA", WM8962_PWR_MGMT_2, 3, 0, &spkoutr_mux,
out_pga_event, SND_SOC_DAPM_POST_PMU),
SND_SOC_DAPM_PGA("SPKOUTR Output", WM8962_CLASS_D_CONTROL_1, 7, 0, NULL, 0),
SND_SOC_DAPM_PGA("SPKOUTL Output", WM8962_CLASS_D_CONTROL_1, 6, 0, NULL, 0),
SND_SOC_DAPM_OUTPUT("SPKOUTL"),
SND_SOC_DAPM_OUTPUT("SPKOUTR"),
};
static const struct snd_soc_dapm_route wm8962_intercon[] = {
{ "INPGAL", "IN1L Switch", "IN1L" },
{ "INPGAL", "IN2L Switch", "IN2L" },
{ "INPGAL", "IN3L Switch", "IN3L" },
{ "INPGAL", "IN4L Switch", "IN4L" },
{ "INPGAR", "IN1R Switch", "IN1R" },
{ "INPGAR", "IN2R Switch", "IN2R" },
{ "INPGAR", "IN3R Switch", "IN3R" },
{ "INPGAR", "IN4R Switch", "IN4R" },
{ "MIXINL", "IN2L Switch", "IN2L" },
{ "MIXINL", "IN3L Switch", "IN3L" },
{ "MIXINL", "PGA Switch", "INPGAL" },
{ "MIXINR", "IN2R Switch", "IN2R" },
{ "MIXINR", "IN3R Switch", "IN3R" },
{ "MIXINR", "PGA Switch", "INPGAR" },
{ "MICBIAS", NULL, "SYSCLK" },
{ "DMIC_ENA", NULL, "DMICDAT" },
{ "ADCL", NULL, "SYSCLK" },
{ "ADCL", NULL, "TOCLK" },
{ "ADCL", NULL, "MIXINL" },
{ "ADCL", NULL, "DMIC_ENA" },
{ "ADCL", NULL, "DSP2" },
{ "ADCR", NULL, "SYSCLK" },
{ "ADCR", NULL, "TOCLK" },
{ "ADCR", NULL, "MIXINR" },
{ "ADCR", NULL, "DMIC_ENA" },
{ "ADCR", NULL, "DSP2" },
{ "STL", "Left", "ADCL" },
{ "STL", "Right", "ADCR" },
{ "STR", "Left", "ADCL" },
{ "STR", "Right", "ADCR" },
{ "DACL", NULL, "SYSCLK" },
{ "DACL", NULL, "TOCLK" },
{ "DACL", NULL, "Beep" },
{ "DACL", NULL, "STL" },
{ "DACL", NULL, "DSP2" },
{ "DACR", NULL, "SYSCLK" },
{ "DACR", NULL, "TOCLK" },
{ "DACR", NULL, "Beep" },
{ "DACR", NULL, "STR" },
{ "DACR", NULL, "DSP2" },
{ "HPMIXL", "IN4L Switch", "IN4L" },
{ "HPMIXL", "IN4R Switch", "IN4R" },
{ "HPMIXL", "DACL Switch", "DACL" },
{ "HPMIXL", "DACR Switch", "DACR" },
{ "HPMIXL", "MIXINL Switch", "MIXINL" },
{ "HPMIXL", "MIXINR Switch", "MIXINR" },
{ "HPMIXR", "IN4L Switch", "IN4L" },
{ "HPMIXR", "IN4R Switch", "IN4R" },
{ "HPMIXR", "DACL Switch", "DACL" },
{ "HPMIXR", "DACR Switch", "DACR" },
{ "HPMIXR", "MIXINL Switch", "MIXINL" },
{ "HPMIXR", "MIXINR Switch", "MIXINR" },
{ "Left Bypass", NULL, "HPMIXL" },
{ "Left Bypass", NULL, "Class G" },
{ "Right Bypass", NULL, "HPMIXR" },
{ "Right Bypass", NULL, "Class G" },
{ "HPOUTL PGA", "Mixer", "Left Bypass" },
{ "HPOUTL PGA", "DAC", "DACL" },
{ "HPOUTR PGA", "Mixer", "Right Bypass" },
{ "HPOUTR PGA", "DAC", "DACR" },
{ "HPOUT", NULL, "HPOUTL PGA" },
{ "HPOUT", NULL, "HPOUTR PGA" },
{ "HPOUT", NULL, "Charge Pump" },
{ "HPOUT", NULL, "SYSCLK" },
{ "HPOUT", NULL, "TOCLK" },
{ "HPOUTL", NULL, "HPOUT" },
{ "HPOUTR", NULL, "HPOUT" },
{ "HPOUTL", NULL, "TEMP_HP" },
{ "HPOUTR", NULL, "TEMP_HP" },
};
static const struct snd_soc_dapm_route wm8962_spk_mono_intercon[] = {
{ "Speaker Mixer", "IN4L Switch", "IN4L" },
{ "Speaker Mixer", "IN4R Switch", "IN4R" },
{ "Speaker Mixer", "DACL Switch", "DACL" },
{ "Speaker Mixer", "DACR Switch", "DACR" },
{ "Speaker Mixer", "MIXINL Switch", "MIXINL" },
{ "Speaker Mixer", "MIXINR Switch", "MIXINR" },
{ "Speaker PGA", "Mixer", "Speaker Mixer" },
{ "Speaker PGA", "DAC", "DACL" },
{ "Speaker Output", NULL, "Speaker PGA" },
{ "Speaker Output", NULL, "SYSCLK" },
{ "Speaker Output", NULL, "TOCLK" },
{ "Speaker Output", NULL, "TEMP_SPK" },
{ "SPKOUT", NULL, "Speaker Output" },
};
static const struct snd_soc_dapm_route wm8962_spk_stereo_intercon[] = {
{ "SPKOUTL Mixer", "IN4L Switch", "IN4L" },
{ "SPKOUTL Mixer", "IN4R Switch", "IN4R" },
{ "SPKOUTL Mixer", "DACL Switch", "DACL" },
{ "SPKOUTL Mixer", "DACR Switch", "DACR" },
{ "SPKOUTL Mixer", "MIXINL Switch", "MIXINL" },
{ "SPKOUTL Mixer", "MIXINR Switch", "MIXINR" },
{ "SPKOUTR Mixer", "IN4L Switch", "IN4L" },
{ "SPKOUTR Mixer", "IN4R Switch", "IN4R" },
{ "SPKOUTR Mixer", "DACL Switch", "DACL" },
{ "SPKOUTR Mixer", "DACR Switch", "DACR" },
{ "SPKOUTR Mixer", "MIXINL Switch", "MIXINL" },
{ "SPKOUTR Mixer", "MIXINR Switch", "MIXINR" },
{ "SPKOUTL PGA", "Mixer", "SPKOUTL Mixer" },
{ "SPKOUTL PGA", "DAC", "DACL" },
{ "SPKOUTR PGA", "Mixer", "SPKOUTR Mixer" },
{ "SPKOUTR PGA", "DAC", "DACR" },
{ "SPKOUTL Output", NULL, "SPKOUTL PGA" },
{ "SPKOUTL Output", NULL, "SYSCLK" },
{ "SPKOUTL Output", NULL, "TOCLK" },
{ "SPKOUTL Output", NULL, "TEMP_SPK" },
{ "SPKOUTR Output", NULL, "SPKOUTR PGA" },
{ "SPKOUTR Output", NULL, "SYSCLK" },
{ "SPKOUTR Output", NULL, "TOCLK" },
{ "SPKOUTR Output", NULL, "TEMP_SPK" },
{ "SPKOUTL", NULL, "SPKOUTL Output" },
{ "SPKOUTR", NULL, "SPKOUTR Output" },
};
static int wm8962_add_widgets(struct snd_soc_codec *codec)
{
struct wm8962_pdata *pdata = dev_get_platdata(codec->dev);
struct snd_soc_dapm_context *dapm = &codec->dapm;
snd_soc_add_controls(codec, wm8962_snd_controls,
ARRAY_SIZE(wm8962_snd_controls));
if (pdata && pdata->spk_mono)
snd_soc_add_controls(codec, wm8962_spk_mono_controls,
ARRAY_SIZE(wm8962_spk_mono_controls));
else
snd_soc_add_controls(codec, wm8962_spk_stereo_controls,
ARRAY_SIZE(wm8962_spk_stereo_controls));
snd_soc_dapm_new_controls(dapm, wm8962_dapm_widgets,
ARRAY_SIZE(wm8962_dapm_widgets));
if (pdata && pdata->spk_mono)
snd_soc_dapm_new_controls(dapm, wm8962_dapm_spk_mono_widgets,
ARRAY_SIZE(wm8962_dapm_spk_mono_widgets));
else
snd_soc_dapm_new_controls(dapm, wm8962_dapm_spk_stereo_widgets,
ARRAY_SIZE(wm8962_dapm_spk_stereo_widgets));
snd_soc_dapm_add_routes(dapm, wm8962_intercon,
ARRAY_SIZE(wm8962_intercon));
if (pdata && pdata->spk_mono)
snd_soc_dapm_add_routes(dapm, wm8962_spk_mono_intercon,
ARRAY_SIZE(wm8962_spk_mono_intercon));
else
snd_soc_dapm_add_routes(dapm, wm8962_spk_stereo_intercon,
ARRAY_SIZE(wm8962_spk_stereo_intercon));
snd_soc_dapm_disable_pin(dapm, "Beep");
return 0;
}
static const int bclk_divs[] = {
1, -1, 2, 3, 4, -1, 6, 8, -1, 12, 16, 24, -1, 32, 32, 32
};
static const int sysclk_rates[] = {
64, 128, 192, 256, 384, 512, 768, 1024, 1408, 1536,
};
static void wm8962_configure_bclk(struct snd_soc_codec *codec)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int dspclk, i;
int clocking2 = 0;
int clocking4 = 0;
int aif2 = 0;
if (!wm8962->sysclk_rate) {
dev_dbg(codec->dev, "No SYSCLK configured\n");
return;
}
if (!wm8962->bclk || !wm8962->lrclk) {
dev_dbg(codec->dev, "No audio clocks configured\n");
return;
}
for (i = 0; i < ARRAY_SIZE(sysclk_rates); i++) {
if (sysclk_rates[i] == wm8962->sysclk_rate / wm8962->lrclk) {
clocking4 |= i << WM8962_SYSCLK_RATE_SHIFT;
break;
}
}
if (i == ARRAY_SIZE(sysclk_rates)) {
dev_err(codec->dev, "Unsupported sysclk ratio %d\n",
wm8962->sysclk_rate / wm8962->lrclk);
return;
}
snd_soc_update_bits(codec, WM8962_CLOCKING_4,
WM8962_SYSCLK_RATE_MASK, clocking4);
dspclk = snd_soc_read(codec, WM8962_CLOCKING1);
if (dspclk < 0) {
dev_err(codec->dev, "Failed to read DSPCLK: %d\n", dspclk);
return;
}
dspclk = (dspclk & WM8962_DSPCLK_DIV_MASK) >> WM8962_DSPCLK_DIV_SHIFT;
switch (dspclk) {
case 0:
dspclk = wm8962->sysclk_rate;
break;
case 1:
dspclk = wm8962->sysclk_rate / 2;
break;
case 2:
dspclk = wm8962->sysclk_rate / 4;
break;
default:
dev_warn(codec->dev, "Unknown DSPCLK divisor read back\n");
dspclk = wm8962->sysclk;
}
dev_dbg(codec->dev, "DSPCLK is %dHz, BCLK %d\n", dspclk, wm8962->bclk);
for (i = 0; i < ARRAY_SIZE(bclk_divs); i++) {
if (bclk_divs[i] < 0)
continue;
if (dspclk / bclk_divs[i] == wm8962->bclk) {
dev_dbg(codec->dev, "Selected BCLK_DIV %d for %dHz\n",
bclk_divs[i], wm8962->bclk);
clocking2 |= i;
break;
}
}
if (i == ARRAY_SIZE(bclk_divs)) {
dev_err(codec->dev, "Unsupported BCLK ratio %d\n",
dspclk / wm8962->bclk);
return;
}
aif2 |= wm8962->bclk / wm8962->lrclk;
dev_dbg(codec->dev, "Selected LRCLK divisor %d for %dHz\n",
wm8962->bclk / wm8962->lrclk, wm8962->lrclk);
snd_soc_update_bits(codec, WM8962_CLOCKING2,
WM8962_BCLK_DIV_MASK, clocking2);
snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_2,
WM8962_AIF_RATE_MASK, aif2);
}
static int wm8962_set_bias_level(struct snd_soc_codec *codec,
enum snd_soc_bias_level level)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int ret;
if (level == codec->dapm.bias_level)
return 0;
switch (level) {
case SND_SOC_BIAS_ON:
break;
case SND_SOC_BIAS_PREPARE:
snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
WM8962_VMID_SEL_MASK, 0x80);
wm8962_configure_bclk(codec);
break;
case SND_SOC_BIAS_STANDBY:
if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies),
wm8962->supplies);
if (ret != 0) {
dev_err(codec->dev,
"Failed to enable supplies: %d\n",
ret);
return ret;
}
regcache_cache_only(wm8962->regmap, false);
regcache_sync(wm8962->regmap);
snd_soc_update_bits(codec, WM8962_ANTI_POP,
WM8962_STARTUP_BIAS_ENA |
WM8962_VMID_BUF_ENA,
WM8962_STARTUP_BIAS_ENA |
WM8962_VMID_BUF_ENA);
snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
WM8962_VMID_SEL_MASK |
WM8962_BIAS_ENA,
WM8962_BIAS_ENA | 0x180);
msleep(5);
}
snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
WM8962_VMID_SEL_MASK, 0x100);
break;
case SND_SOC_BIAS_OFF:
snd_soc_update_bits(codec, WM8962_PWR_MGMT_1,
WM8962_VMID_SEL_MASK | WM8962_BIAS_ENA, 0);
snd_soc_update_bits(codec, WM8962_ANTI_POP,
WM8962_STARTUP_BIAS_ENA |
WM8962_VMID_BUF_ENA, 0);
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies),
wm8962->supplies);
break;
}
codec->dapm.bias_level = level;
return 0;
}
static const struct {
int rate;
int reg;
} sr_vals[] = {
{ 48000, 0 },
{ 44100, 0 },
{ 32000, 1 },
{ 22050, 2 },
{ 24000, 2 },
{ 16000, 3 },
{ 11025, 4 },
{ 12000, 4 },
{ 8000, 5 },
{ 88200, 6 },
{ 96000, 6 },
};
static int wm8962_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_codec *codec = rtd->codec;
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int i;
int aif0 = 0;
int adctl3 = 0;
wm8962->bclk = snd_soc_params_to_bclk(params);
wm8962->lrclk = params_rate(params);
for (i = 0; i < ARRAY_SIZE(sr_vals); i++) {
if (sr_vals[i].rate == wm8962->lrclk) {
adctl3 |= sr_vals[i].reg;
break;
}
}
if (i == ARRAY_SIZE(sr_vals)) {
dev_err(codec->dev, "Unsupported rate %dHz\n", wm8962->lrclk);
return -EINVAL;
}
if (wm8962->lrclk % 8000 == 0)
adctl3 |= WM8962_SAMPLE_RATE_INT_MODE;
switch (params_format(params)) {
case SNDRV_PCM_FORMAT_S16_LE:
break;
case SNDRV_PCM_FORMAT_S20_3LE:
aif0 |= 0x4;
break;
case SNDRV_PCM_FORMAT_S24_LE:
aif0 |= 0x8;
break;
case SNDRV_PCM_FORMAT_S32_LE:
aif0 |= 0xc;
break;
default:
return -EINVAL;
}
snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_0,
WM8962_WL_MASK, aif0);
snd_soc_update_bits(codec, WM8962_ADDITIONAL_CONTROL_3,
WM8962_SAMPLE_RATE_INT_MODE |
WM8962_SAMPLE_RATE_MASK, adctl3);
wm8962_configure_bclk(codec);
return 0;
}
static int wm8962_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
unsigned int freq, int dir)
{
struct snd_soc_codec *codec = dai->codec;
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int src;
switch (clk_id) {
case WM8962_SYSCLK_MCLK:
wm8962->sysclk = WM8962_SYSCLK_MCLK;
src = 0;
break;
case WM8962_SYSCLK_FLL:
wm8962->sysclk = WM8962_SYSCLK_FLL;
src = 1 << WM8962_SYSCLK_SRC_SHIFT;
break;
default:
return -EINVAL;
}
snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_SRC_MASK,
src);
wm8962->sysclk_rate = freq;
return 0;
}
static int wm8962_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
struct snd_soc_codec *codec = dai->codec;
int aif0 = 0;
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_DSP_B:
aif0 |= WM8962_LRCLK_INV | 3;
case SND_SOC_DAIFMT_DSP_A:
aif0 |= 3;
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
case SND_SOC_DAIFMT_NB_NF:
case SND_SOC_DAIFMT_IB_NF:
break;
default:
return -EINVAL;
}
break;
case SND_SOC_DAIFMT_RIGHT_J:
break;
case SND_SOC_DAIFMT_LEFT_J:
aif0 |= 1;
break;
case SND_SOC_DAIFMT_I2S:
aif0 |= 2;
break;
default:
return -EINVAL;
}
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
case SND_SOC_DAIFMT_NB_NF:
break;
case SND_SOC_DAIFMT_IB_NF:
aif0 |= WM8962_BCLK_INV;
break;
case SND_SOC_DAIFMT_NB_IF:
aif0 |= WM8962_LRCLK_INV;
break;
case SND_SOC_DAIFMT_IB_IF:
aif0 |= WM8962_BCLK_INV | WM8962_LRCLK_INV;
break;
default:
return -EINVAL;
}
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
case SND_SOC_DAIFMT_CBM_CFM:
aif0 |= WM8962_MSTR;
break;
case SND_SOC_DAIFMT_CBS_CFS:
break;
default:
return -EINVAL;
}
snd_soc_update_bits(codec, WM8962_AUDIO_INTERFACE_0,
WM8962_FMT_MASK | WM8962_BCLK_INV | WM8962_MSTR |
WM8962_LRCLK_INV, aif0);
return 0;
}
struct _fll_div {
u16 fll_fratio;
u16 fll_outdiv;
u16 fll_refclk_div;
u16 n;
u16 theta;
u16 lambda;
};
#define FIXED_FLL_SIZE ((1 << 16) * 10)
static struct {
unsigned int min;
unsigned int max;
u16 fll_fratio;
int ratio;
} fll_fratios[] = {
{ 0, 64000, 4, 16 },
{ 64000, 128000, 3, 8 },
{ 128000, 256000, 2, 4 },
{ 256000, 1000000, 1, 2 },
{ 1000000, 13500000, 0, 1 },
};
static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
unsigned int Fout)
{
unsigned int target;
unsigned int div;
unsigned int fratio, gcd_fll;
int i;
div = 1;
fll_div->fll_refclk_div = 0;
while ((Fref / div) > 13500000) {
div *= 2;
fll_div->fll_refclk_div++;
if (div > 4) {
pr_err("Can't scale %dMHz input down to <=13.5MHz\n",
Fref);
return -EINVAL;
}
}
pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout);
Fref /= div;
div = 2;
while (Fout * div < 90000000) {
div++;
if (div > 64) {
pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n",
Fout);
return -EINVAL;
}
}
target = Fout * div;
fll_div->fll_outdiv = div - 1;
pr_debug("FLL Fvco=%dHz\n", target);
for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
fll_div->fll_fratio = fll_fratios[i].fll_fratio;
fratio = fll_fratios[i].ratio;
break;
}
}
if (i == ARRAY_SIZE(fll_fratios)) {
pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref);
return -EINVAL;
}
fll_div->n = target / (fratio * Fref);
if (target % Fref == 0) {
fll_div->theta = 0;
fll_div->lambda = 0;
} else {
gcd_fll = gcd(target, fratio * Fref);
fll_div->theta = (target - (fll_div->n * fratio * Fref))
/ gcd_fll;
fll_div->lambda = (fratio * Fref) / gcd_fll;
}
pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n",
fll_div->n, fll_div->theta, fll_div->lambda);
pr_debug("FLL_FRATIO=%x FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n",
fll_div->fll_fratio, fll_div->fll_outdiv,
fll_div->fll_refclk_div);
return 0;
}
static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
unsigned int Fref, unsigned int Fout)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
struct _fll_div fll_div;
unsigned long timeout;
int ret;
int fll1 = snd_soc_read(codec, WM8962_FLL_CONTROL_1) & WM8962_FLL_ENA;
int sysclk = snd_soc_read(codec, WM8962_CLOCKING2) & WM8962_SYSCLK_ENA;
if (source == wm8962->fll_src && Fref == wm8962->fll_fref &&
Fout == wm8962->fll_fout)
return 0;
if (Fout == 0) {
dev_dbg(codec->dev, "FLL disabled\n");
wm8962->fll_fref = 0;
wm8962->fll_fout = 0;
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
WM8962_FLL_ENA, 0);
return 0;
}
ret = fll_factors(&fll_div, Fref, Fout);
if (ret != 0)
return ret;
switch (fll_id) {
case WM8962_FLL_MCLK:
case WM8962_FLL_BCLK:
case WM8962_FLL_OSC:
fll1 |= (fll_id - 1) << WM8962_FLL_REFCLK_SRC_SHIFT;
break;
case WM8962_FLL_INT:
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
WM8962_FLL_OSC_ENA, WM8962_FLL_OSC_ENA);
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_5,
WM8962_FLL_FRC_NCO, WM8962_FLL_FRC_NCO);
break;
default:
dev_err(codec->dev, "Unknown FLL source %d\n", ret);
return -EINVAL;
}
if (fll_div.theta || fll_div.lambda)
fll1 |= WM8962_FLL_FRAC;
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1, WM8962_FLL_ENA, 0);
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_2,
WM8962_FLL_OUTDIV_MASK |
WM8962_FLL_REFCLK_DIV_MASK,
(fll_div.fll_outdiv << WM8962_FLL_OUTDIV_SHIFT) |
(fll_div.fll_refclk_div));
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_3,
WM8962_FLL_FRATIO_MASK, fll_div.fll_fratio);
snd_soc_write(codec, WM8962_FLL_CONTROL_6, fll_div.theta);
snd_soc_write(codec, WM8962_FLL_CONTROL_7, fll_div.lambda);
snd_soc_write(codec, WM8962_FLL_CONTROL_8, fll_div.n);
try_wait_for_completion(&wm8962->fll_lock);
if (sysclk)
fll1 |= WM8962_FLL_ENA;
snd_soc_update_bits(codec, WM8962_FLL_CONTROL_1,
WM8962_FLL_FRAC | WM8962_FLL_REFCLK_SRC_MASK |
WM8962_FLL_ENA, fll1);
dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout);
ret = 0;
if (fll1 & WM8962_FLL_ENA) {
if (wm8962->irq)
timeout = msecs_to_jiffies(5);
else
timeout = msecs_to_jiffies(1);
timeout = wait_for_completion_timeout(&wm8962->fll_lock,
timeout);
if (timeout == 0 && wm8962->irq) {
dev_err(codec->dev, "FLL lock timed out");
ret = -ETIMEDOUT;
}
}
wm8962->fll_fref = Fref;
wm8962->fll_fout = Fout;
wm8962->fll_src = source;
return ret;
}
static int wm8962_mute(struct snd_soc_dai *dai, int mute)
{
struct snd_soc_codec *codec = dai->codec;
int val;
if (mute)
val = WM8962_DAC_MUTE;
else
val = 0;
return snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1,
WM8962_DAC_MUTE, val);
}
#define WM8962_RATES SNDRV_PCM_RATE_8000_96000
#define WM8962_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
static const struct snd_soc_dai_ops wm8962_dai_ops = {
.hw_params = wm8962_hw_params,
.set_sysclk = wm8962_set_dai_sysclk,
.set_fmt = wm8962_set_dai_fmt,
.digital_mute = wm8962_mute,
};
static struct snd_soc_dai_driver wm8962_dai = {
.name = "wm8962",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
.channels_max = 2,
.rates = WM8962_RATES,
.formats = WM8962_FORMATS,
},
.capture = {
.stream_name = "Capture",
.channels_min = 2,
.channels_max = 2,
.rates = WM8962_RATES,
.formats = WM8962_FORMATS,
},
.ops = &wm8962_dai_ops,
.symmetric_rates = 1,
};
static void wm8962_mic_work(struct work_struct *work)
{
struct wm8962_priv *wm8962 = container_of(work,
struct wm8962_priv,
mic_work.work);
struct snd_soc_codec *codec = wm8962->codec;
int status = 0;
int irq_pol = 0;
int reg;
reg = snd_soc_read(codec, WM8962_ADDITIONAL_CONTROL_4);
if (reg & WM8962_MICDET_STS) {
status |= SND_JACK_MICROPHONE;
irq_pol |= WM8962_MICD_IRQ_POL;
}
if (reg & WM8962_MICSHORT_STS) {
status |= SND_JACK_BTN_0;
irq_pol |= WM8962_MICSCD_IRQ_POL;
}
snd_soc_jack_report(wm8962->jack, status,
SND_JACK_MICROPHONE | SND_JACK_BTN_0);
snd_soc_update_bits(codec, WM8962_MICINT_SOURCE_POL,
WM8962_MICSCD_IRQ_POL |
WM8962_MICD_IRQ_POL, irq_pol);
}
static irqreturn_t wm8962_irq(int irq, void *data)
{
struct snd_soc_codec *codec = data;
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int mask;
int active;
int reg;
mask = snd_soc_read(codec, WM8962_INTERRUPT_STATUS_2_MASK);
active = snd_soc_read(codec, WM8962_INTERRUPT_STATUS_2);
active &= ~mask;
if (!active)
return IRQ_NONE;
snd_soc_write(codec, WM8962_INTERRUPT_STATUS_2, active);
if (active & WM8962_FLL_LOCK_EINT) {
dev_dbg(codec->dev, "FLL locked\n");
complete(&wm8962->fll_lock);
}
if (active & WM8962_FIFOS_ERR_EINT)
dev_err(codec->dev, "FIFO error\n");
if (active & WM8962_TEMP_SHUT_EINT) {
dev_crit(codec->dev, "Thermal shutdown\n");
reg = snd_soc_read(codec, WM8962_THERMAL_SHUTDOWN_STATUS);
if (reg & WM8962_TEMP_ERR_HP)
dev_crit(codec->dev, "Headphone thermal error\n");
if (reg & WM8962_TEMP_WARN_HP)
dev_crit(codec->dev, "Headphone thermal warning\n");
if (reg & WM8962_TEMP_ERR_SPK)
dev_crit(codec->dev, "Speaker thermal error\n");
if (reg & WM8962_TEMP_WARN_SPK)
dev_crit(codec->dev, "Speaker thermal warning\n");
}
if (active & (WM8962_MICSCD_EINT | WM8962_MICD_EINT)) {
dev_dbg(codec->dev, "Microphone event detected\n");
#ifndef CONFIG_SND_SOC_WM8962_MODULE
trace_snd_soc_jack_irq(dev_name(codec->dev));
#endif
pm_wakeup_event(codec->dev, 300);
schedule_delayed_work(&wm8962->mic_work,
msecs_to_jiffies(250));
}
return IRQ_HANDLED;
}
int wm8962_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int irq_mask, enable;
wm8962->jack = jack;
if (jack) {
irq_mask = 0;
enable = WM8962_MICDET_ENA;
} else {
irq_mask = WM8962_MICD_EINT | WM8962_MICSCD_EINT;
enable = 0;
}
snd_soc_update_bits(codec, WM8962_INTERRUPT_STATUS_2_MASK,
WM8962_MICD_EINT | WM8962_MICSCD_EINT, irq_mask);
snd_soc_update_bits(codec, WM8962_ADDITIONAL_CONTROL_4,
WM8962_MICDET_ENA, enable);
snd_soc_jack_report(wm8962->jack, 0,
SND_JACK_MICROPHONE | SND_JACK_BTN_0);
if (jack) {
snd_soc_dapm_force_enable_pin(&codec->dapm, "SYSCLK");
snd_soc_dapm_force_enable_pin(&codec->dapm, "MICBIAS");
} else {
snd_soc_dapm_disable_pin(&codec->dapm, "SYSCLK");
snd_soc_dapm_disable_pin(&codec->dapm, "MICBIAS");
}
return 0;
}
EXPORT_SYMBOL_GPL(wm8962_mic_detect);
#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
static int beep_rates[] = {
500, 1000, 2000, 4000,
};
static void wm8962_beep_work(struct work_struct *work)
{
struct wm8962_priv *wm8962 =
container_of(work, struct wm8962_priv, beep_work);
struct snd_soc_codec *codec = wm8962->codec;
struct snd_soc_dapm_context *dapm = &codec->dapm;
int i;
int reg = 0;
int best = 0;
if (wm8962->beep_rate) {
for (i = 0; i < ARRAY_SIZE(beep_rates); i++) {
if (abs(wm8962->beep_rate - beep_rates[i]) <
abs(wm8962->beep_rate - beep_rates[best]))
best = i;
}
dev_dbg(codec->dev, "Set beep rate %dHz for requested %dHz\n",
beep_rates[best], wm8962->beep_rate);
reg = WM8962_BEEP_ENA | (best << WM8962_BEEP_RATE_SHIFT);
snd_soc_dapm_enable_pin(dapm, "Beep");
} else {
dev_dbg(codec->dev, "Disabling beep\n");
snd_soc_dapm_disable_pin(dapm, "Beep");
}
snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1,
WM8962_BEEP_ENA | WM8962_BEEP_RATE_MASK, reg);
snd_soc_dapm_sync(dapm);
}
static int wm8962_beep_event(struct input_dev *dev, unsigned int type,
unsigned int code, int hz)
{
struct snd_soc_codec *codec = input_get_drvdata(dev);
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
dev_dbg(codec->dev, "Beep event %x %x\n", code, hz);
switch (code) {
case SND_BELL:
if (hz)
hz = 1000;
case SND_TONE:
break;
default:
return -1;
}
wm8962->beep_rate = hz;
schedule_work(&wm8962->beep_work);
return 0;
}
static ssize_t wm8962_beep_set(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct wm8962_priv *wm8962 = dev_get_drvdata(dev);
long int time;
int ret;
ret = strict_strtol(buf, 10, &time);
if (ret != 0)
return ret;
input_event(wm8962->beep, EV_SND, SND_TONE, time);
return count;
}
static DEVICE_ATTR(beep, 0200, NULL, wm8962_beep_set);
static void wm8962_init_beep(struct snd_soc_codec *codec)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int ret;
wm8962->beep = input_allocate_device();
if (!wm8962->beep) {
dev_err(codec->dev, "Failed to allocate beep device\n");
return;
}
INIT_WORK(&wm8962->beep_work, wm8962_beep_work);
wm8962->beep_rate = 0;
wm8962->beep->name = "WM8962 Beep Generator";
wm8962->beep->phys = dev_name(codec->dev);
wm8962->beep->id.bustype = BUS_I2C;
wm8962->beep->evbit[0] = BIT_MASK(EV_SND);
wm8962->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
wm8962->beep->event = wm8962_beep_event;
wm8962->beep->dev.parent = codec->dev;
input_set_drvdata(wm8962->beep, codec);
ret = input_register_device(wm8962->beep);
if (ret != 0) {
input_free_device(wm8962->beep);
wm8962->beep = NULL;
dev_err(codec->dev, "Failed to register beep device\n");
}
ret = device_create_file(codec->dev, &dev_attr_beep);
if (ret != 0) {
dev_err(codec->dev, "Failed to create keyclick file: %d\n",
ret);
}
}
static void wm8962_free_beep(struct snd_soc_codec *codec)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
device_remove_file(codec->dev, &dev_attr_beep);
input_unregister_device(wm8962->beep);
cancel_work_sync(&wm8962->beep_work);
wm8962->beep = NULL;
snd_soc_update_bits(codec, WM8962_BEEP_GENERATOR_1, WM8962_BEEP_ENA,0);
}
#else
static void wm8962_init_beep(struct snd_soc_codec *codec)
{
}
static void wm8962_free_beep(struct snd_soc_codec *codec)
{
}
#endif
static void wm8962_set_gpio_mode(struct snd_soc_codec *codec, int gpio)
{
int mask = 0;
int val = 0;
switch (gpio) {
case 2:
mask = WM8962_CLKOUT2_SEL_MASK;
val = 1 << WM8962_CLKOUT2_SEL_SHIFT;
break;
case 3:
mask = WM8962_CLKOUT3_SEL_MASK;
val = 1 << WM8962_CLKOUT3_SEL_SHIFT;
break;
default:
break;
}
if (mask)
snd_soc_update_bits(codec, WM8962_ANALOGUE_CLOCKING1,
mask, val);
}
#ifdef CONFIG_GPIOLIB
static inline struct wm8962_priv *gpio_to_wm8962(struct gpio_chip *chip)
{
return container_of(chip, struct wm8962_priv, gpio_chip);
}
static int wm8962_gpio_request(struct gpio_chip *chip, unsigned offset)
{
struct wm8962_priv *wm8962 = gpio_to_wm8962(chip);
struct snd_soc_codec *codec = wm8962->codec;
switch (offset + 1) {
case 2:
case 3:
case 5:
case 6:
break;
default:
return -EINVAL;
}
wm8962_set_gpio_mode(codec, offset + 1);
return 0;
}
static void wm8962_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
struct wm8962_priv *wm8962 = gpio_to_wm8962(chip);
struct snd_soc_codec *codec = wm8962->codec;
snd_soc_update_bits(codec, WM8962_GPIO_BASE + offset,
WM8962_GP2_LVL, !!value << WM8962_GP2_LVL_SHIFT);
}
static int wm8962_gpio_direction_out(struct gpio_chip *chip,
unsigned offset, int value)
{
struct wm8962_priv *wm8962 = gpio_to_wm8962(chip);
struct snd_soc_codec *codec = wm8962->codec;
int ret, val;
val = (1 << WM8962_GP2_FN_SHIFT) | (value << WM8962_GP2_LVL_SHIFT);
ret = snd_soc_update_bits(codec, WM8962_GPIO_BASE + offset,
WM8962_GP2_FN_MASK | WM8962_GP2_LVL, val);
if (ret < 0)
return ret;
return 0;
}
static struct gpio_chip wm8962_template_chip = {
.label = "wm8962",
.owner = THIS_MODULE,
.request = wm8962_gpio_request,
.direction_output = wm8962_gpio_direction_out,
.set = wm8962_gpio_set,
.can_sleep = 1,
};
static void wm8962_init_gpio(struct snd_soc_codec *codec)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
struct wm8962_pdata *pdata = dev_get_platdata(codec->dev);
int ret;
wm8962->gpio_chip = wm8962_template_chip;
wm8962->gpio_chip.ngpio = WM8962_MAX_GPIO;
wm8962->gpio_chip.dev = codec->dev;
if (pdata && pdata->gpio_base)
wm8962->gpio_chip.base = pdata->gpio_base;
else
wm8962->gpio_chip.base = -1;
ret = gpiochip_add(&wm8962->gpio_chip);
if (ret != 0)
dev_err(codec->dev, "Failed to add GPIOs: %d\n", ret);
}
static void wm8962_free_gpio(struct snd_soc_codec *codec)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int ret;
ret = gpiochip_remove(&wm8962->gpio_chip);
if (ret != 0)
dev_err(codec->dev, "Failed to remove GPIOs: %d\n", ret);
}
#else
static void wm8962_init_gpio(struct snd_soc_codec *codec)
{
}
static void wm8962_free_gpio(struct snd_soc_codec *codec)
{
}
#endif
static int wm8962_probe(struct snd_soc_codec *codec)
{
int ret;
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
struct wm8962_pdata *pdata = dev_get_platdata(codec->dev);
u16 *reg_cache = codec->reg_cache;
int i, trigger, irq_pol;
bool dmicclk, dmicdat;
wm8962->codec = codec;
codec->control_data = wm8962->regmap;
ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_REGMAP);
if (ret != 0) {
dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret);
return ret;
}
wm8962->disable_nb[0].notifier_call = wm8962_regulator_event_0;
wm8962->disable_nb[1].notifier_call = wm8962_regulator_event_1;
wm8962->disable_nb[2].notifier_call = wm8962_regulator_event_2;
wm8962->disable_nb[3].notifier_call = wm8962_regulator_event_3;
wm8962->disable_nb[4].notifier_call = wm8962_regulator_event_4;
wm8962->disable_nb[5].notifier_call = wm8962_regulator_event_5;
wm8962->disable_nb[6].notifier_call = wm8962_regulator_event_6;
wm8962->disable_nb[7].notifier_call = wm8962_regulator_event_7;
for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) {
ret = regulator_register_notifier(wm8962->supplies[i].consumer,
&wm8962->disable_nb[i]);
if (ret != 0) {
dev_err(codec->dev,
"Failed to register regulator notifier: %d\n",
ret);
}
}
snd_soc_update_bits(codec, WM8962_CLOCKING2, WM8962_SYSCLK_ENA, 0);
snd_soc_update_bits(codec, WM8962_CLOCKING2,
WM8962_CLKREG_OVD, WM8962_CLKREG_OVD);
snd_soc_update_bits(codec, WM8962_PLL2,
WM8962_OSC_ENA | WM8962_PLL2_ENA | WM8962_PLL3_ENA,
0);
if (pdata) {
for (i = 0; i < ARRAY_SIZE(pdata->gpio_init); i++)
if (pdata->gpio_init[i]) {
wm8962_set_gpio_mode(codec, i + 1);
snd_soc_write(codec, 0x200 + i,
pdata->gpio_init[i] & 0xffff);
}
if (pdata->spk_mono)
reg_cache[WM8962_CLASS_D_CONTROL_2]
|= WM8962_SPK_MONO;
if (pdata->mic_cfg)
snd_soc_update_bits(codec, WM8962_ADDITIONAL_CONTROL_4,
WM8962_MICDET_ENA |
WM8962_MICDET_THR_MASK |
WM8962_MICSHORT_THR_MASK |
WM8962_MICBIAS_LVL,
pdata->mic_cfg);
}
snd_soc_update_bits(codec, WM8962_LEFT_INPUT_VOLUME,
WM8962_IN_VU, WM8962_IN_VU);
snd_soc_update_bits(codec, WM8962_RIGHT_INPUT_VOLUME,
WM8962_IN_VU, WM8962_IN_VU);
snd_soc_update_bits(codec, WM8962_LEFT_ADC_VOLUME,
WM8962_ADC_VU, WM8962_ADC_VU);
snd_soc_update_bits(codec, WM8962_RIGHT_ADC_VOLUME,
WM8962_ADC_VU, WM8962_ADC_VU);
snd_soc_update_bits(codec, WM8962_LEFT_DAC_VOLUME,
WM8962_DAC_VU, WM8962_DAC_VU);
snd_soc_update_bits(codec, WM8962_RIGHT_DAC_VOLUME,
WM8962_DAC_VU, WM8962_DAC_VU);
snd_soc_update_bits(codec, WM8962_SPKOUTL_VOLUME,
WM8962_SPKOUT_VU, WM8962_SPKOUT_VU);
snd_soc_update_bits(codec, WM8962_SPKOUTR_VOLUME,
WM8962_SPKOUT_VU, WM8962_SPKOUT_VU);
snd_soc_update_bits(codec, WM8962_HPOUTL_VOLUME,
WM8962_HPOUT_VU, WM8962_HPOUT_VU);
snd_soc_update_bits(codec, WM8962_HPOUTR_VOLUME,
WM8962_HPOUT_VU, WM8962_HPOUT_VU);
snd_soc_update_bits(codec, WM8962_EQ1, WM8962_EQ_SHARED_COEFF, 0);
snd_soc_update_bits(codec, WM8962_IRQ_DEBOUNCE,
WM8962_FLL_LOCK_DB | WM8962_PLL3_LOCK_DB |
WM8962_PLL2_LOCK_DB | WM8962_TEMP_SHUT_DB,
0);
wm8962_add_widgets(codec);
dmicclk = false;
dmicdat = false;
for (i = 0; i < WM8962_MAX_GPIO; i++) {
switch (snd_soc_read(codec, WM8962_GPIO_BASE + i)
& WM8962_GP2_FN_MASK) {
case WM8962_GPIO_FN_DMICCLK:
dmicclk = true;
break;
case WM8962_GPIO_FN_DMICDAT:
dmicdat = true;
break;
default:
break;
}
}
if (!dmicclk || !dmicdat) {
dev_dbg(codec->dev, "DMIC not in use, disabling\n");
snd_soc_dapm_nc_pin(&codec->dapm, "DMICDAT");
}
if (dmicclk != dmicdat)
dev_warn(codec->dev, "DMIC GPIOs partially configured\n");
wm8962_init_beep(codec);
wm8962_init_gpio(codec);
if (wm8962->irq) {
if (pdata && pdata->irq_active_low) {
trigger = IRQF_TRIGGER_LOW;
irq_pol = WM8962_IRQ_POL;
} else {
trigger = IRQF_TRIGGER_HIGH;
irq_pol = 0;
}
snd_soc_update_bits(codec, WM8962_INTERRUPT_CONTROL,
WM8962_IRQ_POL, irq_pol);
ret = request_threaded_irq(wm8962->irq, NULL, wm8962_irq,
trigger | IRQF_ONESHOT,
"wm8962", codec);
if (ret != 0) {
dev_err(codec->dev, "Failed to request IRQ %d: %d\n",
wm8962->irq, ret);
wm8962->irq = 0;
} else {
snd_soc_update_bits(codec,
WM8962_INTERRUPT_STATUS_2_MASK,
WM8962_FLL_LOCK_EINT |
WM8962_TEMP_SHUT_EINT |
WM8962_FIFOS_ERR_EINT, 0);
}
}
return 0;
}
static int wm8962_remove(struct snd_soc_codec *codec)
{
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
int i;
if (wm8962->irq)
free_irq(wm8962->irq, codec);
cancel_delayed_work_sync(&wm8962->mic_work);
wm8962_free_gpio(codec);
wm8962_free_beep(codec);
for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++)
regulator_unregister_notifier(wm8962->supplies[i].consumer,
&wm8962->disable_nb[i]);
return 0;
}
static int wm8962_soc_volatile(struct snd_soc_codec *codec,
unsigned int reg)
{
return true;
}
static struct snd_soc_codec_driver soc_codec_dev_wm8962 = {
.probe = wm8962_probe,
.remove = wm8962_remove,
.set_bias_level = wm8962_set_bias_level,
.set_pll = wm8962_set_fll,
.reg_cache_size = WM8962_MAX_REGISTER,
.volatile_register = wm8962_soc_volatile,
};
static const struct regmap_config wm8962_regmap = {
.reg_bits = 16,
.val_bits = 16,
.max_register = WM8962_MAX_REGISTER,
.reg_defaults = wm8962_reg,
.num_reg_defaults = ARRAY_SIZE(wm8962_reg),
.volatile_reg = wm8962_volatile_register,
.readable_reg = wm8962_readable_register,
.cache_type = REGCACHE_RBTREE,
};
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
static __devinit int wm8962_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct wm8962_priv *wm8962;
unsigned int reg;
int ret, i;
wm8962 = devm_kzalloc(&i2c->dev, sizeof(struct wm8962_priv),
GFP_KERNEL);
if (wm8962 == NULL)
return -ENOMEM;
i2c_set_clientdata(i2c, wm8962);
INIT_DELAYED_WORK(&wm8962->mic_work, wm8962_mic_work);
init_completion(&wm8962->fll_lock);
wm8962->irq = i2c->irq;
for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++)
wm8962->supplies[i].supply = wm8962_supply_names[i];
ret = regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8962->supplies),
wm8962->supplies);
if (ret != 0) {
dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
goto err;
}
ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies),
wm8962->supplies);
if (ret != 0) {
dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
goto err_get;
}
wm8962->regmap = regmap_init_i2c(i2c, &wm8962_regmap);
if (IS_ERR(wm8962->regmap)) {
ret = PTR_ERR(wm8962->regmap);
dev_err(&i2c->dev, "Failed to allocate regmap: %d\n", ret);
goto err_enable;
}
regcache_cache_bypass(wm8962->regmap, true);
ret = regmap_read(wm8962->regmap, WM8962_SOFTWARE_RESET, ®);
if (ret < 0) {
dev_err(&i2c->dev, "Failed to read ID register\n");
goto err_regmap;
}
if (reg != 0x6243) {
dev_err(&i2c->dev,
"Device is not a WM8962, ID %x != 0x6243\n", ret);
ret = -EINVAL;
goto err_regmap;
}
ret = regmap_read(wm8962->regmap, WM8962_RIGHT_INPUT_VOLUME, ®);
if (ret < 0) {
dev_err(&i2c->dev, "Failed to read device revision: %d\n",
ret);
goto err_regmap;
}
dev_info(&i2c->dev, "customer id %x revision %c\n",
(reg & WM8962_CUST_ID_MASK) >> WM8962_CUST_ID_SHIFT,
((reg & WM8962_CHIP_REV_MASK) >> WM8962_CHIP_REV_SHIFT)
+ 'A');
regcache_cache_bypass(wm8962->regmap, false);
ret = wm8962_reset(wm8962);
if (ret < 0) {
dev_err(&i2c->dev, "Failed to issue reset\n");
goto err_regmap;
}
regcache_cache_only(wm8962->regmap, true);
ret = snd_soc_register_codec(&i2c->dev,
&soc_codec_dev_wm8962, &wm8962_dai, 1);
if (ret < 0)
goto err_regmap;
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
return 0;
err_regmap:
regmap_exit(wm8962->regmap);
err_enable:
regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
err_get:
regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
err:
return ret;
}
static __devexit int wm8962_i2c_remove(struct i2c_client *client)
{
struct wm8962_priv *wm8962 = dev_get_drvdata(&client->dev);
snd_soc_unregister_codec(&client->dev);
regmap_exit(wm8962->regmap);
regulator_bulk_free(ARRAY_SIZE(wm8962->supplies), wm8962->supplies);
return 0;
}
static const struct i2c_device_id wm8962_i2c_id[] = {
{ "wm8962", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, wm8962_i2c_id);
static struct i2c_driver wm8962_i2c_driver = {
.driver = {
.name = "wm8962",
.owner = THIS_MODULE,
},
.probe = wm8962_i2c_probe,
.remove = __devexit_p(wm8962_i2c_remove),
.id_table = wm8962_i2c_id,
};
#endif
static int __init wm8962_modinit(void)
{
int ret;
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
ret = i2c_add_driver(&wm8962_i2c_driver);
if (ret != 0) {
printk(KERN_ERR "Failed to register WM8962 I2C driver: %d\n",
ret);
}
#endif
return 0;
}
module_init(wm8962_modinit);
static void __exit wm8962_exit(void)
{
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
i2c_del_driver(&wm8962_i2c_driver);
#endif
}
module_exit(wm8962_exit);
MODULE_DESCRIPTION("ASoC WM8962 driver");
MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
MODULE_LICENSE("GPL");
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 633
- 634
- 635
- 636
- 637
- 638
- 639
- 640
- 641
- 642
- 643
- 644
- 645
- 646
- 647
- 648
- 649
- 650
- 651
- 652
- 653
- 654
- 655
- 656
- 657
- 658
- 659
- 660
- 661
- 662
- 663
- 664
- 665
- 666
- 667
- 668
- 669
- 670
- 671
- 672
- 673
- 674
- 675
- 676
- 677
- 678
- 679
- 680
- 681
- 682
- 683
- 684
- 685
- 686
- 687
- 688
- 689
- 690
- 691
- 692
- 693
- 694
- 695
- 696
- 697
- 698
- 699
- 700
- 701
- 702
- 703
- 704
- 705
- 706
- 707
- 708
- 709
- 710
- 711
- 712
- 713
- 714
- 715
- 716
- 717
- 718
- 719
- 720
- 721
- 722
- 723
- 724
- 725
- 726
- 727
- 728
- 729
- 730
- 731
- 732
- 733
- 734
- 735
- 736
- 737
- 738
- 739
- 740
- 741
- 742
- 743
- 744
- 745
- 746
- 747
- 748
- 749
- 750
- 751
- 752
- 753
- 754
- 755
- 756
- 757
- 758
- 759
- 760
- 761
- 762
- 763
- 764
- 765
- 766
- 767
- 768
- 769
- 770
- 771
- 772
- 773
- 774
- 775
- 776
- 777
- 778
- 779
- 780
- 781
- 782
- 783
- 784
- 785
- 786
- 787
- 788
- 789
- 790
- 791
- 792
- 793
- 794
- 795
- 796
- 797
- 798
- 799
- 800
- 801
- 802
- 803
- 804
- 805
- 806
- 807
- 808
- 809
- 810
- 811
- 812
- 813
- 814
- 815
- 816
- 817
- 818
- 819
- 820
- 821
- 822
- 823
- 824
- 825
- 826
- 827
- 828
- 829
- 830
- 831
- 832
- 833
- 834
- 835
- 836
- 837
- 838
- 839
- 840
- 841
- 842
- 843
- 844
- 845
- 846
- 847
- 848
- 849
- 850
- 851
- 852
- 853
- 854
- 855
- 856
- 857
- 858
- 859
- 860
- 861
- 862
- 863
- 864
- 865
- 866
- 867
- 868
- 869
- 870
- 871
- 872
- 873
- 874
- 875
- 876
- 877
- 878
- 879
- 880
- 881
- 882
- 883
- 884
- 885
- 886
- 887
- 888
- 889
- 890
- 891
- 892
- 893
- 894
- 895
- 896
- 897
- 898
- 899
- 900
- 901
- 902
- 903
- 904
- 905
- 906
- 907
- 908
- 909
- 910
- 911
- 912
- 913
- 914
- 915
- 916
- 917
- 918
- 919
- 920
- 921
- 922
- 923
- 924
- 925
- 926
- 927
- 928
- 929
- 930
- 931
- 932
- 933
- 934
- 935
- 936
- 937
- 938
- 939
- 940
- 941
- 942
- 943
- 944
- 945
- 946
- 947
- 948
- 949
- 950
- 951
- 952
- 953
- 954
- 955
- 956
- 957
- 958
- 959
- 960
- 961
- 962
- 963
- 964
- 965
- 966
- 967
- 968
- 969
- 970
- 971
- 972
- 973
- 974
- 975
- 976
- 977
- 978
- 979
- 980
- 981
- 982
- 983
- 984
- 985
- 986
- 987
- 988
- 989
- 990
- 991
- 992
- 993
- 994
- 995
- 996
- 997
- 998
- 999
- 1000
- 1001
- 1002
- 1003
- 1004
- 1005
- 1006
- 1007
- 1008
- 1009
- 1010
- 1011
- 1012
- 1013
- 1014
- 1015
- 1016
- 1017
- 1018
- 1019
- 1020
- 1021
- 1022
- 1023
- 1024
- 1025
- 1026
- 1027
- 1028
- 1029
- 1030
- 1031
- 1032
- 1033
- 1034
- 1035
- 1036
- 1037
- 1038
- 1039
- 1040
- 1041
- 1042
- 1043
- 1044
- 1045
- 1046
- 1047
- 1048
- 1049
- 1050
- 1051
- 1052
- 1053
- 1054
- 1055
- 1056
- 1057
- 1058
- 1059
- 1060
- 1061
- 1062
- 1063
- 1064
- 1065
- 1066
- 1067
- 1068
- 1069
- 1070
- 1071
- 1072
- 1073
- 1074
- 1075
- 1076
- 1077
- 1078
- 1079
- 1080
- 1081
- 1082
- 1083
- 1084
- 1085
- 1086
- 1087
- 1088
- 1089
- 1090
- 1091
- 1092
- 1093
- 1094
- 1095
- 1096
- 1097
- 1098
- 1099
- 1100
- 1101
- 1102
- 1103
- 1104
- 1105
- 1106
- 1107
- 1108
- 1109
- 1110
- 1111
- 1112
- 1113
- 1114
- 1115
- 1116
- 1117
- 1118
- 1119
- 1120
- 1121
- 1122
- 1123
- 1124
- 1125
- 1126
- 1127
- 1128
- 1129
- 1130
- 1131
- 1132
- 1133
- 1134
- 1135
- 1136
- 1137
- 1138
- 1139
- 1140
- 1141
- 1142
- 1143
- 1144
- 1145
- 1146
- 1147
- 1148
- 1149
- 1150
- 1151
- 1152
- 1153
- 1154
- 1155
- 1156
- 1157
- 1158
- 1159
- 1160
- 1161
- 1162
- 1163
- 1164
- 1165
- 1166
- 1167
- 1168
- 1169
- 1170
- 1171
- 1172
- 1173
- 1174
- 1175
- 1176
- 1177
- 1178
- 1179
- 1180
- 1181
- 1182
- 1183
- 1184
- 1185
- 1186
- 1187
- 1188
- 1189
- 1190
- 1191
- 1192
- 1193
- 1194
- 1195
- 1196
- 1197
- 1198
- 1199
- 1200
- 1201
- 1202
- 1203
- 1204
- 1205
- 1206
- 1207
- 1208
- 1209
- 1210
- 1211
- 1212
- 1213
- 1214
- 1215
- 1216
- 1217
- 1218
- 1219
- 1220
- 1221
- 1222
- 1223
- 1224
- 1225
- 1226
- 1227
- 1228
- 1229
- 1230
- 1231
- 1232
- 1233
- 1234
- 1235
- 1236
- 1237
- 1238
- 1239
- 1240
- 1241
- 1242
- 1243
- 1244
- 1245
- 1246
- 1247
- 1248
- 1249
- 1250
- 1251
- 1252
- 1253
- 1254
- 1255
- 1256
- 1257
- 1258
- 1259
- 1260
- 1261
- 1262
- 1263
- 1264
- 1265
- 1266
- 1267
- 1268
- 1269
- 1270
- 1271
- 1272
- 1273
- 1274
- 1275
- 1276
- 1277
- 1278
- 1279
- 1280
- 1281
- 1282
- 1283
- 1284
- 1285
- 1286
- 1287
- 1288
- 1289
- 1290
- 1291
- 1292
- 1293
- 1294
- 1295
- 1296
- 1297
- 1298
- 1299
- 1300
- 1301
- 1302
- 1303
- 1304
- 1305
- 1306
- 1307
- 1308
- 1309
- 1310
- 1311
- 1312
- 1313
- 1314
- 1315
- 1316
- 1317
- 1318
- 1319
- 1320
- 1321
- 1322
- 1323
- 1324
- 1325
- 1326
- 1327
- 1328
- 1329
- 1330
- 1331
- 1332
- 1333
- 1334
- 1335
- 1336
- 1337
- 1338
- 1339
- 1340
- 1341
- 1342
- 1343
- 1344
- 1345
- 1346
- 1347
- 1348
- 1349
- 1350
- 1351
- 1352
- 1353
- 1354
- 1355
- 1356
- 1357
- 1358
- 1359
- 1360
- 1361
- 1362
- 1363
- 1364
- 1365
- 1366
- 1367
- 1368
- 1369
- 1370
- 1371
- 1372
- 1373
- 1374
- 1375
- 1376
- 1377
- 1378
- 1379
- 1380
- 1381
- 1382
- 1383
- 1384
- 1385
- 1386
- 1387
- 1388
- 1389
- 1390
- 1391
- 1392
- 1393
- 1394
- 1395
- 1396
- 1397
- 1398
- 1399
- 1400
- 1401
- 1402
- 1403
- 1404
- 1405
- 1406
- 1407
- 1408
- 1409
- 1410
- 1411
- 1412
- 1413
- 1414
- 1415
- 1416
- 1417
- 1418
- 1419
- 1420
- 1421
- 1422
- 1423
- 1424
- 1425
- 1426
- 1427
- 1428
- 1429
- 1430
- 1431
- 1432
- 1433
- 1434
- 1435
- 1436
- 1437
- 1438
- 1439
- 1440
- 1441
- 1442
- 1443
- 1444
- 1445
- 1446
- 1447
- 1448
- 1449
- 1450
- 1451
- 1452
- 1453
- 1454
- 1455
- 1456
- 1457
- 1458
- 1459
- 1460
- 1461
- 1462
- 1463
- 1464
- 1465
- 1466
- 1467
- 1468
- 1469
- 1470
- 1471
- 1472
- 1473
- 1474
- 1475
- 1476
- 1477
- 1478
- 1479
- 1480
- 1481
- 1482
- 1483
- 1484
- 1485
- 1486
- 1487
- 1488
- 1489
- 1490
- 1491
- 1492
- 1493
- 1494
- 1495
- 1496
- 1497
- 1498
- 1499
- 1500
- 1501
- 1502
- 1503
- 1504
- 1505
- 1506
- 1507
- 1508
- 1509
- 1510
- 1511
- 1512
- 1513
- 1514
- 1515
- 1516
- 1517
- 1518
- 1519
- 1520
- 1521
- 1522
- 1523
- 1524
- 1525
- 1526
- 1527
- 1528
- 1529
- 1530
- 1531
- 1532
- 1533
- 1534
- 1535
- 1536
- 1537
- 1538
- 1539
- 1540
- 1541
- 1542
- 1543
- 1544
- 1545
- 1546
- 1547
- 1548
- 1549
- 1550
- 1551
- 1552
- 1553
- 1554
- 1555
- 1556
- 1557
- 1558
- 1559
- 1560
- 1561
- 1562
- 1563
- 1564
- 1565
- 1566
- 1567
- 1568
- 1569
- 1570
- 1571
- 1572
- 1573
- 1574
- 1575
- 1576
- 1577
- 1578
- 1579
- 1580
- 1581
- 1582
- 1583
- 1584
- 1585
- 1586
- 1587
- 1588
- 1589
- 1590
- 1591
- 1592
- 1593
- 1594
- 1595
- 1596
- 1597
- 1598
- 1599
- 1600
- 1601
- 1602
- 1603
- 1604
- 1605
- 1606
- 1607
- 1608
- 1609
- 1610
- 1611
- 1612
- 1613
- 1614
- 1615
- 1616
- 1617
- 1618
- 1619
- 1620
- 1621
- 1622
- 1623
- 1624
- 1625
- 1626
- 1627
- 1628
- 1629
- 1630
- 1631
- 1632
- 1633
- 1634
- 1635
- 1636
- 1637
- 1638
- 1639
- 1640
- 1641
- 1642
- 1643
- 1644
- 1645
- 1646
- 1647
- 1648
- 1649
- 1650
- 1651
- 1652
- 1653
- 1654
- 1655
- 1656
- 1657
- 1658
- 1659
- 1660
- 1661
- 1662
- 1663
- 1664
- 1665
- 1666
- 1667
- 1668
- 1669
- 1670
- 1671
- 1672
- 1673
- 1674
- 1675
- 1676
- 1677
- 1678
- 1679
- 1680
- 1681
- 1682
- 1683
- 1684
- 1685
- 1686
- 1687
- 1688
- 1689
- 1690
- 1691
- 1692
- 1693
- 1694
- 1695
- 1696
- 1697
- 1698
- 1699
- 1700
- 1701
- 1702
- 1703
- 1704
- 1705
- 1706
- 1707
- 1708
- 1709
- 1710
- 1711
- 1712
- 1713
- 1714
- 1715
- 1716
- 1717
- 1718
- 1719
- 1720
- 1721
- 1722
- 1723
- 1724
- 1725
- 1726
- 1727
- 1728
- 1729
- 1730
- 1731
- 1732
- 1733
- 1734
- 1735
- 1736
- 1737
- 1738
- 1739
- 1740
- 1741
- 1742
- 1743
- 1744
- 1745
- 1746
- 1747
- 1748
- 1749
- 1750
- 1751
- 1752
- 1753
- 1754
- 1755
- 1756
- 1757
- 1758
- 1759
- 1760
- 1761
- 1762
- 1763
- 1764
- 1765
- 1766
- 1767
- 1768
- 1769
- 1770
- 1771
- 1772
- 1773
- 1774
- 1775
- 1776
- 1777
- 1778
- 1779
- 1780
- 1781
- 1782
- 1783
- 1784
- 1785
- 1786
- 1787
- 1788
- 1789
- 1790
- 1791
- 1792
- 1793
- 1794
- 1795
- 1796
- 1797
- 1798
- 1799
- 1800
- 1801
- 1802
- 1803
- 1804
- 1805
- 1806
- 1807
- 1808
- 1809
- 1810
- 1811
- 1812
- 1813
- 1814
- 1815
- 1816
- 1817
- 1818
- 1819
- 1820
- 1821
- 1822
- 1823
- 1824
- 1825
- 1826
- 1827
- 1828
- 1829
- 1830
- 1831
- 1832
- 1833
- 1834
- 1835
- 1836
- 1837
- 1838
- 1839
- 1840
- 1841
- 1842
- 1843
- 1844
- 1845
- 1846
- 1847
- 1848
- 1849
- 1850
- 1851
- 1852
- 1853
- 1854
- 1855
- 1856
- 1857
- 1858
- 1859
- 1860
- 1861
- 1862
- 1863
- 1864
- 1865
- 1866
- 1867
- 1868
- 1869
- 1870
- 1871
- 1872
- 1873
- 1874
- 1875
- 1876
- 1877
- 1878
- 1879
- 1880
- 1881
- 1882
- 1883
- 1884
- 1885
- 1886
- 1887
- 1888
- 1889
- 1890
- 1891
- 1892
- 1893
- 1894
- 1895
- 1896
- 1897
- 1898
- 1899
- 1900
- 1901
- 1902
- 1903
- 1904
- 1905
- 1906
- 1907
- 1908
- 1909
- 1910
- 1911
- 1912
- 1913
- 1914
- 1915
- 1916
- 1917
- 1918
- 1919
- 1920
- 1921
- 1922
- 1923
- 1924
- 1925
- 1926
- 1927
- 1928
- 1929
- 1930
- 1931
- 1932
- 1933
- 1934
- 1935
- 1936
- 1937
- 1938
- 1939
- 1940
- 1941
- 1942
- 1943
- 1944
- 1945
- 1946
- 1947
- 1948
- 1949
- 1950
- 1951
- 1952
- 1953
- 1954
- 1955
- 1956
- 1957
- 1958
- 1959
- 1960
- 1961
- 1962
- 1963
- 1964
- 1965
- 1966
- 1967
- 1968
- 1969
- 1970
- 1971
- 1972
- 1973
- 1974
- 1975
- 1976
- 1977
- 1978
- 1979
- 1980
- 1981
- 1982
- 1983
- 1984
- 1985
- 1986
- 1987
- 1988
- 1989
- 1990
- 1991
- 1992
- 1993
- 1994
- 1995
- 1996
- 1997
- 1998
- 1999
- 2000
- 2001
- 2002
- 2003
- 2004
- 2005
- 2006
- 2007
- 2008
- 2009
- 2010
- 2011
- 2012
- 2013
- 2014
- 2015
- 2016
- 2017
- 2018
- 2019
- 2020
- 2021
- 2022
- 2023
- 2024
- 2025
- 2026
- 2027
- 2028
- 2029
- 2030
- 2031
- 2032
- 2033
- 2034
- 2035
- 2036
- 2037
- 2038
- 2039
- 2040
- 2041
- 2042
- 2043
- 2044
- 2045
- 2046
- 2047
- 2048
- 2049
- 2050
- 2051
- 2052
- 2053
- 2054
- 2055
- 2056
- 2057
- 2058
- 2059
- 2060
- 2061
- 2062
- 2063
- 2064
- 2065
- 2066
- 2067
- 2068
- 2069
- 2070
- 2071
- 2072
- 2073
- 2074
- 2075
- 2076
- 2077
- 2078
- 2079
- 2080
- 2081
- 2082
- 2083
- 2084
- 2085
- 2086
- 2087
- 2088
- 2089
- 2090
- 2091
- 2092
- 2093
- 2094
- 2095
- 2096
- 2097
- 2098
- 2099
- 2100
- 2101
- 2102
- 2103
- 2104
- 2105
- 2106
- 2107
- 2108
- 2109
- 2110
- 2111
- 2112
- 2113
- 2114
- 2115
- 2116
- 2117
- 2118
- 2119
- 2120
- 2121
- 2122
- 2123
- 2124
- 2125
- 2126
- 2127
- 2128
- 2129
- 2130
- 2131
- 2132
- 2133
- 2134
- 2135
- 2136
- 2137
- 2138
- 2139
- 2140
- 2141
- 2142
- 2143
- 2144
- 2145
- 2146
- 2147
- 2148
- 2149
- 2150
- 2151
- 2152
- 2153
- 2154
- 2155
- 2156
- 2157
- 2158
- 2159
- 2160
- 2161
- 2162
- 2163
- 2164
- 2165
- 2166
- 2167
- 2168
- 2169
- 2170
- 2171
- 2172
- 2173
- 2174
- 2175
- 2176
- 2177
- 2178
- 2179
- 2180
- 2181
- 2182
- 2183
- 2184
- 2185
- 2186
- 2187
- 2188
- 2189
- 2190
- 2191
- 2192
- 2193
- 2194
- 2195
- 2196
- 2197
- 2198
- 2199
- 2200
- 2201
- 2202
- 2203
- 2204
- 2205
- 2206
- 2207
- 2208
- 2209
- 2210
- 2211
- 2212
- 2213
- 2214
- 2215
- 2216
- 2217
- 2218
- 2219
- 2220
- 2221
- 2222
- 2223
- 2224
- 2225
- 2226
- 2227
- 2228
- 2229
- 2230
- 2231
- 2232
- 2233
- 2234
- 2235
- 2236
- 2237
- 2238
- 2239
- 2240
- 2241
- 2242
- 2243
- 2244
- 2245
- 2246
- 2247
- 2248
- 2249
- 2250
- 2251
- 2252
- 2253
- 2254
- 2255
- 2256
- 2257
- 2258
- 2259
- 2260
- 2261
- 2262
- 2263
- 2264
- 2265
- 2266
- 2267
- 2268
- 2269
- 2270
- 2271
- 2272
- 2273
- 2274
- 2275
- 2276
- 2277
- 2278
- 2279
- 2280
- 2281
- 2282
- 2283
- 2284
- 2285
- 2286
- 2287
- 2288
- 2289
- 2290
- 2291
- 2292
- 2293
- 2294
- 2295
- 2296
- 2297
- 2298
- 2299
- 2300
- 2301
- 2302
- 2303
- 2304
- 2305
- 2306
- 2307
- 2308
- 2309
- 2310
- 2311
- 2312
- 2313
- 2314
- 2315
- 2316
- 2317
- 2318
- 2319
- 2320
- 2321
- 2322
- 2323
- 2324
- 2325
- 2326
- 2327
- 2328
- 2329
- 2330
- 2331
- 2332
- 2333
- 2334
- 2335
- 2336
- 2337
- 2338
- 2339
- 2340
- 2341
- 2342
- 2343
- 2344
- 2345
- 2346
- 2347
- 2348
- 2349
- 2350
- 2351
- 2352
- 2353
- 2354
- 2355
- 2356
- 2357
- 2358
- 2359
- 2360
- 2361
- 2362
- 2363
- 2364
- 2365
- 2366
- 2367
- 2368
- 2369
- 2370
- 2371
- 2372
- 2373
- 2374
- 2375
- 2376
- 2377
- 2378
- 2379
- 2380
- 2381
- 2382
- 2383
- 2384
- 2385
- 2386
- 2387
- 2388
- 2389
- 2390
- 2391
- 2392
- 2393
- 2394
- 2395
- 2396
- 2397
- 2398
- 2399
- 2400
- 2401
- 2402
- 2403
- 2404
- 2405
- 2406
- 2407
- 2408
- 2409
- 2410
- 2411
- 2412
- 2413
- 2414
- 2415
- 2416
- 2417
- 2418
- 2419
- 2420
- 2421
- 2422
- 2423
- 2424
- 2425
- 2426
- 2427
- 2428
- 2429
- 2430
- 2431
- 2432
- 2433
- 2434
- 2435
- 2436
- 2437
- 2438
- 2439
- 2440
- 2441
- 2442
- 2443
- 2444
- 2445
- 2446
- 2447
- 2448
- 2449
- 2450
- 2451
- 2452
- 2453
- 2454
- 2455
- 2456
- 2457
- 2458
- 2459
- 2460
- 2461
- 2462
- 2463
- 2464
- 2465
- 2466
- 2467
- 2468
- 2469
- 2470
- 2471
- 2472
- 2473
- 2474
- 2475
- 2476
- 2477
- 2478
- 2479
- 2480
- 2481
- 2482
- 2483
- 2484
- 2485
- 2486
- 2487
- 2488
- 2489
- 2490
- 2491
- 2492
- 2493
- 2494
- 2495
- 2496
- 2497
- 2498
- 2499
- 2500
- 2501
- 2502
- 2503
- 2504
- 2505
- 2506
- 2507
- 2508
- 2509
- 2510
- 2511
- 2512
- 2513
- 2514
- 2515
- 2516
- 2517
- 2518
- 2519
- 2520
- 2521
- 2522
- 2523
- 2524
- 2525
- 2526
- 2527
- 2528
- 2529
- 2530
- 2531
- 2532
- 2533
- 2534
- 2535
- 2536
- 2537
- 2538
- 2539
- 2540
- 2541
- 2542
- 2543
- 2544
- 2545
- 2546
- 2547
- 2548
- 2549
- 2550
- 2551
- 2552
- 2553
- 2554
- 2555
- 2556
- 2557
- 2558
- 2559
- 2560
- 2561
- 2562
- 2563
- 2564
- 2565
- 2566
- 2567
- 2568
- 2569
- 2570
- 2571
- 2572
- 2573
- 2574
- 2575
- 2576
- 2577
- 2578
- 2579
- 2580
- 2581
- 2582
- 2583
- 2584
- 2585
- 2586
- 2587
- 2588
- 2589
- 2590
- 2591
- 2592
- 2593
- 2594
- 2595
- 2596
- 2597
- 2598
- 2599
- 2600
- 2601
- 2602
- 2603
- 2604
- 2605
- 2606
- 2607
- 2608
- 2609
- 2610
- 2611
- 2612
- 2613
- 2614
- 2615
- 2616
- 2617
- 2618
- 2619
- 2620
- 2621
- 2622
- 2623
- 2624
- 2625
- 2626
- 2627
- 2628
- 2629
- 2630
- 2631
- 2632
- 2633
- 2634
- 2635
- 2636
- 2637
- 2638
- 2639
- 2640
- 2641
- 2642
- 2643
- 2644
- 2645
- 2646
- 2647
- 2648
- 2649
- 2650
- 2651
- 2652
- 2653
- 2654
- 2655
- 2656
- 2657
- 2658
- 2659
- 2660
- 2661
- 2662
- 2663
- 2664
- 2665
- 2666
- 2667
- 2668
- 2669
- 2670
- 2671
- 2672
- 2673
- 2674
- 2675
- 2676
- 2677
- 2678
- 2679
- 2680
- 2681
- 2682
- 2683
- 2684
- 2685
- 2686
- 2687
- 2688
- 2689
- 2690
- 2691
- 2692
- 2693
- 2694
- 2695
- 2696
- 2697
- 2698
- 2699
- 2700
- 2701
- 2702
- 2703
- 2704
- 2705
- 2706
- 2707
- 2708
- 2709
- 2710
- 2711
- 2712
- 2713
- 2714
- 2715
- 2716
- 2717
- 2718
- 2719
- 2720
- 2721
- 2722
- 2723
- 2724
- 2725
- 2726
- 2727
- 2728
- 2729
- 2730
- 2731
- 2732
- 2733
- 2734
- 2735
- 2736
- 2737
- 2738
- 2739
- 2740
- 2741
- 2742
- 2743
- 2744
- 2745
- 2746
- 2747
- 2748
- 2749
- 2750
- 2751
- 2752
- 2753
- 2754
- 2755
- 2756
- 2757
- 2758
- 2759
- 2760
- 2761
- 2762
- 2763
- 2764
- 2765
- 2766
- 2767
- 2768
- 2769
- 2770
- 2771
- 2772
- 2773
- 2774
- 2775
- 2776
- 2777
- 2778
- 2779
- 2780
- 2781
- 2782
- 2783
- 2784
- 2785
- 2786
- 2787
- 2788
- 2789
- 2790
- 2791
- 2792
- 2793
- 2794
- 2795
- 2796
- 2797
- 2798
- 2799
- 2800
- 2801
- 2802
- 2803
- 2804
- 2805
- 2806
- 2807
- 2808
- 2809
- 2810
- 2811
- 2812
- 2813
- 2814
- 2815
- 2816
- 2817
- 2818
- 2819
- 2820
- 2821
- 2822
- 2823
- 2824
- 2825
- 2826
- 2827
- 2828
- 2829
- 2830
- 2831
- 2832
- 2833
- 2834
- 2835
- 2836
- 2837
- 2838
- 2839
- 2840
- 2841
- 2842
- 2843
- 2844
- 2845
- 2846
- 2847
- 2848
- 2849
- 2850
- 2851
- 2852
- 2853
- 2854
- 2855
- 2856
- 2857
- 2858
- 2859
- 2860
- 2861
- 2862
- 2863
- 2864
- 2865
- 2866
- 2867
- 2868
- 2869
- 2870
- 2871
- 2872
- 2873
- 2874
- 2875
- 2876
- 2877
- 2878
- 2879
- 2880
- 2881
- 2882
- 2883
- 2884
- 2885
- 2886
- 2887
- 2888
- 2889
- 2890
- 2891
- 2892
- 2893
- 2894
- 2895
- 2896
- 2897
- 2898
- 2899
- 2900
- 2901
- 2902
- 2903
- 2904
- 2905
- 2906
- 2907
- 2908
- 2909
- 2910
- 2911
- 2912
- 2913
- 2914
- 2915
- 2916
- 2917
- 2918
- 2919
- 2920
- 2921
- 2922
- 2923
- 2924
- 2925
- 2926
- 2927
- 2928
- 2929
- 2930
- 2931
- 2932
- 2933
- 2934
- 2935
- 2936
- 2937
- 2938
- 2939
- 2940
- 2941
- 2942
- 2943
- 2944
- 2945
- 2946
- 2947
- 2948
- 2949
- 2950
- 2951
- 2952
- 2953
- 2954
- 2955
- 2956
- 2957
- 2958
- 2959
- 2960
- 2961
- 2962
- 2963
- 2964
- 2965
- 2966
- 2967
- 2968
- 2969
- 2970
- 2971
- 2972
- 2973
- 2974
- 2975
- 2976
- 2977
- 2978
- 2979
- 2980
- 2981
- 2982
- 2983
- 2984
- 2985
- 2986
- 2987
- 2988
- 2989
- 2990
- 2991
- 2992
- 2993
- 2994
- 2995
- 2996
- 2997
- 2998
- 2999
- 3000
- 3001
- 3002
- 3003
- 3004
- 3005
- 3006
- 3007
- 3008
- 3009
- 3010
- 3011
- 3012
- 3013
- 3014
- 3015
- 3016
- 3017
- 3018
- 3019
- 3020
- 3021
- 3022
- 3023
- 3024
- 3025
- 3026
- 3027
- 3028
- 3029
- 3030
- 3031
- 3032
- 3033
- 3034
- 3035
- 3036
- 3037
- 3038
- 3039
- 3040
- 3041
- 3042
- 3043
- 3044
- 3045
- 3046
- 3047
- 3048
- 3049
- 3050
- 3051
- 3052
- 3053
- 3054
- 3055
- 3056
- 3057
- 3058
- 3059
- 3060
- 3061
- 3062
- 3063
- 3064
- 3065
- 3066
- 3067
- 3068
- 3069
- 3070
- 3071
- 3072
- 3073
- 3074
- 3075
- 3076
- 3077
- 3078
- 3079
- 3080
- 3081
- 3082
- 3083
- 3084
- 3085
- 3086
- 3087
- 3088
- 3089
- 3090
- 3091
- 3092
- 3093
- 3094
- 3095
- 3096
- 3097
- 3098
- 3099
- 3100
- 3101
- 3102
- 3103
- 3104
- 3105
- 3106
- 3107
- 3108
- 3109
- 3110
- 3111
- 3112
- 3113
- 3114
- 3115
- 3116
- 3117
- 3118
- 3119
- 3120
- 3121
- 3122
- 3123
- 3124
- 3125
- 3126
- 3127
- 3128
- 3129
- 3130
- 3131
- 3132
- 3133
- 3134
- 3135
- 3136
- 3137
- 3138
- 3139
- 3140
- 3141
- 3142
- 3143
- 3144
- 3145
- 3146
- 3147
- 3148
- 3149
- 3150
- 3151
- 3152
- 3153
- 3154
- 3155
- 3156
- 3157
- 3158
- 3159
- 3160
- 3161
- 3162
- 3163
- 3164
- 3165
- 3166
- 3167
- 3168
- 3169
- 3170
- 3171
- 3172
- 3173
- 3174
- 3175
- 3176
- 3177
- 3178
- 3179
- 3180
- 3181
- 3182
- 3183
- 3184
- 3185
- 3186
- 3187
- 3188
- 3189
- 3190
- 3191
- 3192
- 3193
- 3194
- 3195
- 3196
- 3197
- 3198
- 3199
- 3200
- 3201
- 3202
- 3203
- 3204
- 3205
- 3206
- 3207
- 3208
- 3209
- 3210
- 3211
- 3212
- 3213
- 3214
- 3215
- 3216
- 3217
- 3218
- 3219
- 3220
- 3221
- 3222
- 3223
- 3224
- 3225
- 3226
- 3227
- 3228
- 3229
- 3230
- 3231
- 3232
- 3233
- 3234
- 3235
- 3236
- 3237
- 3238
- 3239
- 3240
- 3241
- 3242
- 3243
- 3244
- 3245
- 3246
- 3247
- 3248
- 3249
- 3250
- 3251
- 3252
- 3253
- 3254
- 3255
- 3256
- 3257
- 3258
- 3259
- 3260
- 3261
- 3262
- 3263
- 3264
- 3265
- 3266
- 3267
- 3268
- 3269
- 3270
- 3271
- 3272
- 3273
- 3274
- 3275
- 3276
- 3277
- 3278
- 3279
- 3280
- 3281
- 3282
- 3283
- 3284
- 3285
- 3286
- 3287
- 3288
- 3289
- 3290
- 3291
- 3292
- 3293
- 3294
- 3295
- 3296
- 3297
- 3298
- 3299
- 3300
- 3301
- 3302
- 3303
- 3304
- 3305
- 3306
- 3307
- 3308
- 3309
- 3310
- 3311
- 3312
- 3313
- 3314
- 3315
- 3316
- 3317
- 3318
- 3319
- 3320
- 3321
- 3322
- 3323
- 3324
- 3325
- 3326
- 3327
- 3328
- 3329
- 3330
- 3331
- 3332
- 3333
- 3334
- 3335
- 3336
- 3337
- 3338
- 3339
- 3340
- 3341
- 3342
- 3343
- 3344
- 3345
- 3346
- 3347
- 3348
- 3349
- 3350
- 3351
- 3352
- 3353
- 3354
- 3355
- 3356
- 3357
- 3358
- 3359
- 3360
- 3361
- 3362
- 3363
- 3364
- 3365
- 3366
- 3367
- 3368
- 3369
- 3370
- 3371
- 3372
- 3373
- 3374
- 3375
- 3376
- 3377
- 3378
- 3379
- 3380
- 3381
- 3382
- 3383
- 3384
- 3385
- 3386
- 3387
- 3388
- 3389
- 3390
- 3391
- 3392
- 3393
- 3394
- 3395
- 3396
- 3397
- 3398
- 3399
- 3400
- 3401
- 3402
- 3403
- 3404
- 3405
- 3406
- 3407
- 3408
- 3409
- 3410
- 3411
- 3412
- 3413
- 3414
- 3415
- 3416
- 3417
- 3418
- 3419
- 3420
- 3421
- 3422
- 3423
- 3424
- 3425
- 3426
- 3427
- 3428
- 3429
- 3430
- 3431
- 3432
- 3433
- 3434
- 3435
- 3436
- 3437
- 3438
- 3439
- 3440
- 3441
- 3442
- 3443
- 3444
- 3445
- 3446
- 3447
- 3448
- 3449
- 3450
- 3451
- 3452
- 3453
- 3454
- 3455
- 3456
- 3457
- 3458
- 3459
- 3460
- 3461
- 3462
- 3463
- 3464
- 3465
- 3466
- 3467
- 3468
- 3469
- 3470
- 3471
- 3472
- 3473
- 3474
- 3475
- 3476
- 3477
- 3478
- 3479
- 3480
- 3481
- 3482
- 3483
- 3484
- 3485
- 3486
- 3487
- 3488
- 3489
- 3490
- 3491
- 3492
- 3493
- 3494
- 3495
- 3496
- 3497
- 3498
- 3499
- 3500
- 3501
- 3502
- 3503
- 3504
- 3505
- 3506
- 3507
- 3508
- 3509
- 3510
- 3511
- 3512
- 3513
- 3514
- 3515
- 3516
- 3517
- 3518
- 3519
- 3520
- 3521
- 3522
- 3523
- 3524
- 3525
- 3526
- 3527
- 3528
- 3529
- 3530
- 3531
- 3532
- 3533
- 3534
- 3535
- 3536
- 3537
- 3538
- 3539
- 3540
- 3541
- 3542
- 3543
- 3544
- 3545
- 3546
- 3547
- 3548
- 3549
- 3550
- 3551
- 3552
- 3553
- 3554
- 3555
- 3556
- 3557
- 3558
- 3559
- 3560
- 3561
- 3562
- 3563
- 3564
- 3565
- 3566
- 3567
- 3568
- 3569
- 3570
- 3571
- 3572
- 3573
- 3574
- 3575
- 3576
- 3577
- 3578
- 3579
- 3580
- 3581
- 3582
- 3583
- 3584
- 3585
- 3586
- 3587
- 3588
- 3589
- 3590
- 3591
- 3592
- 3593
- 3594
- 3595
- 3596
- 3597
- 3598
- 3599
- 3600
- 3601
- 3602
- 3603
- 3604
- 3605
- 3606
- 3607
- 3608
- 3609
- 3610
- 3611
- 3612
- 3613
- 3614
- 3615
- 3616
- 3617
- 3618
- 3619
- 3620
- 3621
- 3622
- 3623
- 3624
- 3625
- 3626
- 3627
- 3628
- 3629
- 3630
- 3631
- 3632
- 3633
- 3634
- 3635
- 3636
- 3637
- 3638
- 3639
- 3640
- 3641
- 3642
- 3643
- 3644
- 3645
- 3646
- 3647
- 3648
- 3649
- 3650
- 3651
- 3652
- 3653
- 3654
- 3655
- 3656
- 3657
- 3658
- 3659
- 3660
- 3661
- 3662
- 3663
- 3664
- 3665
- 3666
- 3667
- 3668
- 3669
- 3670
- 3671
- 3672
- 3673
- 3674
- 3675
- 3676
- 3677
- 3678
- 3679
- 3680
- 3681
- 3682
- 3683
- 3684
- 3685
- 3686
- 3687
- 3688
- 3689
- 3690
- 3691
- 3692
- 3693
- 3694
- 3695
- 3696
- 3697
- 3698
- 3699
- 3700
- 3701
- 3702
- 3703
- 3704
- 3705
- 3706
- 3707
- 3708
- 3709
- 3710
- 3711
- 3712
- 3713
- 3714
- 3715
- 3716
- 3717
- 3718
- 3719
- 3720
- 3721
- 3722
- 3723
- 3724
- 3725
- 3726
- 3727
- 3728
- 3729
- 3730
- 3731
- 3732
- 3733
- 3734
- 3735
- 3736
- 3737
- 3738
- 3739
- 3740
- 3741
- 3742
- 3743
- 3744
- 3745
- 3746
- 3747
- 3748
- 3749
- 3750
- 3751
- 3752
- 3753
- 3754
- 3755
- 3756
- 3757
- 3758
- 3759
- 3760
- 3761
- 3762
- 3763
- 3764
- 3765
- 3766
- 3767
- 3768
- 3769
- 3770
- 3771
- 3772
- 3773
- 3774
- 3775
- 3776
- 3777
- 3778
- 3779
- 3780
- 3781
- 3782
- 3783
- 3784
- 3785
- 3786
- 3787
- 3788
- 3789
- 3790
- 3791
- 3792
- 3793
- 3794
- 3795
- 3796
- 3797
- 3798
- 3799
- 3800
- 3801
- 3802
- 3803
- 3804
- 3805
- 3806
- 3807
- 3808
- 3809
- 3810
- 3811
- 3812
- 3813
- 3814
- 3815
- 3816
- 3817
- 3818
- 3819
- 3820
- 3821
- 3822
- 3823
- 3824
- 3825
- 3826
- 3827
- 3828
- 3829
- 3830
- 3831
- 3832
- 3833
- 3834
- 3835
- 3836
- 3837
- 3838
- 3839
- 3840
- 3841
- 3842
- 3843
- 3844
- 3845
- 3846
- 3847
- 3848
- 3849
- 3850
- 3851
- 3852
- 3853
- 3854
- 3855
- 3856
- 3857
- 3858
- 3859
- 3860
- 3861
- 3862
- 3863
- 3864
- 3865
- 3866
- 3867
- 3868
- 3869
- 3870
- 3871
- 3872
- 3873
- 3874
- 3875
- 3876
- 3877
- 3878
- 3879
- 3880
- 3881
- 3882
- 3883
- 3884
- 3885
- 3886
- 3887
- 3888
- 3889
- 3890
- 3891
- 3892
- 3893
- 3894
- 3895
- 3896
- 3897
- 3898
- 3899
- 3900
- 3901
- 3902
- 3903
- 3904
- 3905
- 3906
- 3907
- 3908
- 3909
- 3910
- 3911
- 3912
- 3913
- 3914
- 3915
- 3916
- 3917
- 3918
- 3919
- 3920
- 3921
- 3922
- 3923
- 3924
- 3925
- 3926
- 3927
- 3928
- 3929
- 3930
- 3931
- 3932
- 3933
- 3934
- 3935
- 3936
- 3937
- 3938
- 3939
- 3940
- 3941
- 3942
- 3943
- 3944
- 3945
- 3946
- 3947
- 3948
- 3949
- 3950
- 3951
- 3952
- 3953
- 3954
- 3955
- 3956
- 3957
- 3958
- 3959
- 3960
- 3961
- 3962
- 3963
- 3964
- 3965
- 3966
- 3967
- 3968
- 3969
- 3970
- 3971
- 3972
- 3973
- 3974
- 3975
- 3976
- 3977
- 3978
- 3979
- 3980
- 3981
- 3982
- 3983
- 3984
- 3985
- 3986
- 3987
- 3988
- 3989
- 3990
- 3991
- 3992
- 3993
- 3994
- 3995
- 3996
- 3997
- 3998
- 3999
- 4000
- 4001
- 4002
- 4003
- 4004
- 4005
- 4006
- 4007
- 4008
- 4009
- 4010
- 4011
- 4012
- 4013
- 4014
- 4015
- 4016
- 4017
- 4018
- 4019
- 4020
- 4021
- 4022
- 4023
- 4024
- 4025
- 4026
- 4027
- 4028
- 4029
- 4030
- 4031
- 4032
- 4033
- 4034
- 4035
- 4036
- 4037
- 4038
- 4039
- 4040
- 4041
- 4042
- 4043
- 4044
- 4045
- 4046
- 4047
- 4048
- 4049
- 4050
- 4051
- 4052
- 4053
- 4054
- 4055
- 4056
- 4057
- 4058
- 4059
- 4060
- 4061
- 4062
- 4063
- 4064
- 4065
- 4066
- 4067
- 4068
- 4069
- 4070
- 4071
- 4072
- 4073
- 4074
- 4075
- 4076
- 4077
- 4078
- 4079
- 4080
- 4081
- 4082
- 4083
- 4084
- 4085
- 4086
- 4087
- 4088
- 4089
- 4090
- 4091
- 4092
- 4093
- 4094
- 4095
- 4096
- 4097
- 4098
- 4099
- 4100
- 4101
- 4102
- 4103
- 4104
- 4105
- 4106
- 4107
- 4108
- 4109
- 4110
- 4111
- 4112
- 4113
- 4114
- 4115
- 4116
- 4117
- 4118
- 4119
- 4120
- 4121
- 4122
- 4123
- 4124
- 4125
- 4126
- 4127
- 4128
- 4129
- 4130
- 4131
- 4132
- 4133
- 4134
- 4135
- 4136
- 4137
- 4138
- 4139
- 4140
- 4141
- 4142
- 4143
- 4144
- 4145
- 4146
- 4147
- 4148
- 4149
- 4150
- 4151
- 4152
- 4153
- 4154
- 4155
- 4156
- 4157
- 4158
- 4159
- 4160
- 4161
- 4162
- 4163
- 4164
- 4165
- 4166
- 4167
- 4168
- 4169
- 4170
- 4171
- 4172
- 4173
- 4174
- 4175
- 4176
- 4177
- 4178
- 4179
- 4180
- 4181
- 4182
- 4183
- 4184
- 4185
- 4186
- 4187
- 4188
- 4189
- 4190
- 4191
- 4192
- 4193
- 4194
- 4195
- 4196
- 4197
- 4198
- 4199
- 4200
- 4201
- 4202
- 4203
- 4204
- 4205
- 4206
- 4207
- 4208
- 4209
- 4210
- 4211
- 4212
- 4213
- 4214
- 4215
- 4216
- 4217
- 4218
- 4219
- 4220
- 4221
- 4222
- 4223
- 4224
- 4225
- 4226
- 4227
- 4228
- 4229
- 4230
- 4231
- 4232
- 4233
- 4234
- 4235
- 4236
- 4237
- 4238
- 4239
- 4240
- 4241
- 4242
- 4243
- 4244
- 4245
- 4246
- 4247
- 4248
- 4249
- 4250
- 4251
- 4252
- 4253
- 4254
- 4255
- 4256
- 4257
- 4258
- 4259
- 4260
- 4261
- 4262
- 4263
- 4264
- 4265
- 4266
- 4267
- 4268
- 4269
- 4270
- 4271
- 4272
- 4273
- 4274
- 4275
- 4276
- 4277
- 4278
- 4279
- 4280
- 4281
- 4282
- 4283
- 4284
- 4285
- 4286
- 4287
- 4288
- 4289
- 4290
- 4291
- 4292
- 4293
- 4294
- 4295
- 4296
- 4297
- 4298
- 4299
- 4300
- 4301
- 4302
- 4303
- 4304
- 4305
- 4306
- 4307
- 4308
- 4309
- 4310
- 4311
- 4312
- 4313