Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/hda/codecs/side-codecs/hda_component.h
26481 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
3
* HD audio Component Binding Interface
4
*
5
* Copyright (C) 2021 Cirrus Logic, Inc. and
6
* Cirrus Logic International Semiconductor Ltd.
7
*/
8
9
#ifndef __HDA_COMPONENT_H__
10
#define __HDA_COMPONENT_H__
11
12
#include <linux/acpi.h>
13
#include <linux/component.h>
14
#include <linux/mutex.h>
15
#include <sound/hda_codec.h>
16
17
#define HDA_MAX_COMPONENTS 4
18
#define HDA_MAX_NAME_SIZE 50
19
20
struct hda_component {
21
struct device *dev;
22
char name[HDA_MAX_NAME_SIZE];
23
struct acpi_device *adev;
24
bool acpi_notifications_supported;
25
void (*acpi_notify)(acpi_handle handle, u32 event, struct device *dev);
26
void (*pre_playback_hook)(struct device *dev, int action);
27
void (*playback_hook)(struct device *dev, int action);
28
void (*post_playback_hook)(struct device *dev, int action);
29
};
30
31
struct hda_component_parent {
32
struct mutex mutex;
33
struct hda_codec *codec;
34
struct hda_component comps[HDA_MAX_COMPONENTS];
35
};
36
37
#ifdef CONFIG_ACPI
38
void hda_component_acpi_device_notify(struct hda_component_parent *parent,
39
acpi_handle handle, u32 event, void *data);
40
int hda_component_manager_bind_acpi_notifications(struct hda_codec *cdc,
41
struct hda_component_parent *parent,
42
acpi_notify_handler handler, void *data);
43
void hda_component_manager_unbind_acpi_notifications(struct hda_codec *cdc,
44
struct hda_component_parent *parent,
45
acpi_notify_handler handler);
46
#else
47
static inline void hda_component_acpi_device_notify(struct hda_component_parent *parent,
48
acpi_handle handle,
49
u32 event,
50
void *data)
51
{
52
}
53
54
static inline int hda_component_manager_bind_acpi_notifications(struct hda_codec *cdc,
55
struct hda_component_parent *parent,
56
acpi_notify_handler handler,
57
void *data)
58
59
{
60
return 0;
61
}
62
63
static inline void hda_component_manager_unbind_acpi_notifications(struct hda_codec *cdc,
64
struct hda_component_parent *parent,
65
acpi_notify_handler handler)
66
{
67
}
68
#endif /* ifdef CONFIG_ACPI */
69
70
void hda_component_manager_playback_hook(struct hda_component_parent *parent, int action);
71
72
int hda_component_manager_init(struct hda_codec *cdc,
73
struct hda_component_parent *parent, int count,
74
const char *bus, const char *hid,
75
const char *match_str,
76
const struct component_master_ops *ops);
77
78
void hda_component_manager_free(struct hda_component_parent *parent,
79
const struct component_master_ops *ops);
80
81
int hda_component_manager_bind(struct hda_codec *cdc, struct hda_component_parent *parent);
82
83
static inline struct hda_component *hda_component_from_index(struct hda_component_parent *parent,
84
int index)
85
{
86
if (!parent)
87
return NULL;
88
89
if (index < 0 || index >= ARRAY_SIZE(parent->comps))
90
return NULL;
91
92
return &parent->comps[index];
93
}
94
95
static inline void hda_component_manager_unbind(struct hda_codec *cdc,
96
struct hda_component_parent *parent)
97
{
98
mutex_lock(&parent->mutex);
99
component_unbind_all(hda_codec_dev(cdc), parent);
100
mutex_unlock(&parent->mutex);
101
}
102
103
#endif /* ifndef __HDA_COMPONENT_H__ */
104
105