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 <sound/hda_codec.h>
15
16#define HDA_MAX_COMPONENTS	4
17#define HDA_MAX_NAME_SIZE	50
18
19struct hda_component {
20	struct device *dev;
21	char name[HDA_MAX_NAME_SIZE];
22	struct hda_codec *codec;
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#ifdef CONFIG_ACPI
32void hda_component_acpi_device_notify(struct hda_component *comps, int num_comps,
33				      acpi_handle handle, u32 event, void *data);
34int hda_component_manager_bind_acpi_notifications(struct hda_codec *cdc,
35						  struct hda_component *comps, int num_comps,
36						  acpi_notify_handler handler, void *data);
37void hda_component_manager_unbind_acpi_notifications(struct hda_codec *cdc,
38						     struct hda_component *comps,
39						     acpi_notify_handler handler);
40#else
41static inline void hda_component_acpi_device_notify(struct hda_component *comps,
42						    int num_comps,
43						    acpi_handle handle,
44						    u32 event,
45						    void *data)
46{
47}
48
49static inline int hda_component_manager_bind_acpi_notifications(struct hda_codec *cdc,
50								struct hda_component *comps,
51								int num_comps,
52								acpi_notify_handler handler,
53								void *data)
54
55{
56	return 0;
57}
58
59static inline void hda_component_manager_unbind_acpi_notifications(struct hda_codec *cdc,
60								   struct hda_component *comps,
61								   acpi_notify_handler handler)
62{
63}
64#endif /* ifdef CONFIG_ACPI */
65
66void hda_component_manager_playback_hook(struct hda_component *comps, int num_comps,
67					 int action);
68
69int hda_component_manager_init(struct hda_codec *cdc,
70			       struct hda_component *comps, int count,
71			       const char *bus, const char *hid,
72			       const char *match_str,
73			       const struct component_master_ops *ops);
74
75void hda_component_manager_free(struct hda_codec *cdc,
76				const struct component_master_ops *ops);
77
78static inline int hda_component_manager_bind(struct hda_codec *cdc,
79					     struct hda_component *comps)
80{
81	return component_bind_all(hda_codec_dev(cdc), comps);
82}
83
84static inline void hda_component_manager_unbind(struct hda_codec *cdc,
85					       struct hda_component *comps)
86{
87	component_unbind_all(hda_codec_dev(cdc), comps);
88}
89
90#endif /* ifndef __HDA_COMPONENT_H__ */
91