1e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown#ifndef __SOUND_JACK_H
2e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown#define __SOUND_JACK_H
3e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
4e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown/*
5e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *  Jack abstraction layer
6e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *
7e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *  Copyright 2008 Wolfson Microelectronics plc
8e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *
9e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *
10e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   This program is free software; you can redistribute it and/or modify
11e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   it under the terms of the GNU General Public License as published by
12e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   the Free Software Foundation; either version 2 of the License, or
13e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   (at your option) any later version.
14e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *
15e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   This program is distributed in the hope that it will be useful,
16e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   but WITHOUT ANY WARRANTY; without even the implied warranty of
17e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   GNU General Public License for more details.
19e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *
20e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   You should have received a copy of the GNU General Public License
21e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   along with this program; if not, write to the Free Software
22e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown *
24e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown */
25e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
26e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown#include <sound/core.h>
27e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
28e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownstruct input_dev;
29e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
30e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown/**
31e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown * Jack types which can be reported.  These values are used as a
32e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown * bitmask.
33bd8a71a7b0f50da9350d202d325c3926ffd6b189Mark Brown *
34bd8a71a7b0f50da9350d202d325c3926ffd6b189Mark Brown * Note that this must be kept in sync with the lookup table in
35bd8a71a7b0f50da9350d202d325c3926ffd6b189Mark Brown * sound/core/jack.c.
36e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown */
37e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownenum snd_jack_types {
38e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	SND_JACK_HEADPHONE	= 0x0001,
39e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	SND_JACK_MICROPHONE	= 0x0002,
40e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	SND_JACK_HEADSET	= SND_JACK_HEADPHONE | SND_JACK_MICROPHONE,
41a53ccab3ccac9e8676a683df9822a2daec83ef54Matthew Ranostay	SND_JACK_LINEOUT	= 0x0004,
42cdc693643271b2e6a693cf8f6afb258cce01f058Mark Brown	SND_JACK_MECHANICAL	= 0x0008, /* If detected separately */
43d506fc322ec2af04fc47be83d796a1c9e1a16022Jani Nikula	SND_JACK_VIDEOOUT	= 0x0010,
44d506fc322ec2af04fc47be83d796a1c9e1a16022Jani Nikula	SND_JACK_AVOUT		= SND_JACK_LINEOUT | SND_JACK_VIDEOOUT,
457c2f8e4009d4b66c8458e3a5c20510b4262853bbDavid Henningsson	SND_JACK_LINEIN		= 0x0020,
46ebb812cb8df48e299b3d4ab75cbb0042384ef70dMark Brown
47ebb812cb8df48e299b3d4ab75cbb0042384ef70dMark Brown	/* Kept separate from switches to facilitate implementation */
48ebb812cb8df48e299b3d4ab75cbb0042384ef70dMark Brown	SND_JACK_BTN_0		= 0x4000,
49ebb812cb8df48e299b3d4ab75cbb0042384ef70dMark Brown	SND_JACK_BTN_1		= 0x2000,
50ebb812cb8df48e299b3d4ab75cbb0042384ef70dMark Brown	SND_JACK_BTN_2		= 0x1000,
51831853c87fb7234a8650484d30993242ea9ad6d3Mark Brown	SND_JACK_BTN_3		= 0x0800,
52831853c87fb7234a8650484d30993242ea9ad6d3Mark Brown	SND_JACK_BTN_4		= 0x0400,
53831853c87fb7234a8650484d30993242ea9ad6d3Mark Brown	SND_JACK_BTN_5		= 0x0200,
54e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown};
55e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
5653803aead010a314f76a8a6fa132fdcc5edf55edMark Brown/* Keep in sync with definitions above */
5753803aead010a314f76a8a6fa132fdcc5edf55edMark Brown#define SND_JACK_SWITCH_TYPES 6
5853803aead010a314f76a8a6fa132fdcc5edf55edMark Brown
59e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownstruct snd_jack {
60e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	struct input_dev *input_dev;
61e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	int registered;
62e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	int type;
63e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	const char *id;
64e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	char name[100];
65831853c87fb7234a8650484d30993242ea9ad6d3Mark Brown	unsigned int key[6];   /* Keep in sync with definitions above */
669d59065cd6fae841ca56c281189d5b8d0817d35fTakashi Iwai	void *private_data;
679d59065cd6fae841ca56c281189d5b8d0817d35fTakashi Iwai	void (*private_free)(struct snd_jack *);
68e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown};
69e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
70e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown#ifdef CONFIG_SND_JACK
71e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
72e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownint snd_jack_new(struct snd_card *card, const char *id, int type,
73e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown		 struct snd_jack **jack);
74e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownvoid snd_jack_set_parent(struct snd_jack *jack, struct device *parent);
75ebb812cb8df48e299b3d4ab75cbb0042384ef70dMark Brownint snd_jack_set_key(struct snd_jack *jack, enum snd_jack_types type,
76ebb812cb8df48e299b3d4ab75cbb0042384ef70dMark Brown		     int keytype);
77e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
78e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownvoid snd_jack_report(struct snd_jack *jack, int status);
79e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
80e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown#else
81e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
82e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownstatic inline int snd_jack_new(struct snd_card *card, const char *id, int type,
83e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown			       struct snd_jack **jack)
84e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown{
85e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown	return 0;
86e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown}
87e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
88e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownstatic inline void snd_jack_set_parent(struct snd_jack *jack,
89e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown				       struct device *parent)
90e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown{
91e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown}
92e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
93e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brownstatic inline void snd_jack_report(struct snd_jack *jack, int status)
94e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown{
95e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown}
96e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
97e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown#endif
98e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown
99e76d8ceaaff9d7fc1ba2b1963a9f34151832223bMark Brown#endif
100