File Index
Files and directories
Sign in
FILE

hda_component.h

File preview with syntax highlighting.

linux-6.19.14/sound/hda/codecs/side-codecs/hda_component.h C
  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
 20struct 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
 31struct 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
 38void hda_component_acpi_device_notify(struct hda_component_parent *parent,
 39				      acpi_handle handle, u32 event, void *data);
 40int hda_component_manager_bind_acpi_notifications(struct hda_codec *cdc,
 41						  struct hda_component_parent *parent,
 42						  acpi_notify_handler handler, void *data);
 43void hda_component_manager_unbind_acpi_notifications(struct hda_codec *cdc,
 44						     struct hda_component_parent *parent,
 45						     acpi_notify_handler handler);
 46#else
 47static 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
 54static 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
 63static 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
 70void hda_component_manager_playback_hook(struct hda_component_parent *parent, int action);
 71
 72int 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
 78void hda_component_manager_free(struct hda_component_parent *parent,
 79				const struct component_master_ops *ops);
 80
 81int hda_component_manager_bind(struct hda_codec *cdc, struct hda_component_parent *parent);
 82
 83static 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
 95static inline void hda_component_manager_unbind(struct hda_codec *cdc,
 96						struct hda_component_parent *parent)
 97{
 98	guard(mutex)(&parent->mutex);
 99	component_unbind_all(hda_codec_dev(cdc), parent);
100}
101
102#endif /* ifndef __HDA_COMPONENT_H__ */
~/ Read-only file preview.