xref: /openbmc/linux/include/sound/ac97/codec.h (revision 7351324c)
11a8f0a3cSKuninori Morimoto /* SPDX-License-Identifier: GPL-2.0
274426fbfSRobert Jarzmik  *
31a8f0a3cSKuninori Morimoto  *  Copyright (C) 2016 Robert Jarzmik <robert.jarzmik@free.fr>
474426fbfSRobert Jarzmik  */
51a8f0a3cSKuninori Morimoto 
674426fbfSRobert Jarzmik #ifndef __SOUND_AC97_CODEC2_H
774426fbfSRobert Jarzmik #define __SOUND_AC97_CODEC2_H
874426fbfSRobert Jarzmik 
974426fbfSRobert Jarzmik #include <linux/device.h>
1074426fbfSRobert Jarzmik 
1174426fbfSRobert Jarzmik #define AC97_ID(vendor_id1, vendor_id2) \
1274426fbfSRobert Jarzmik 	((((vendor_id1) & 0xffff) << 16) | ((vendor_id2) & 0xffff))
1374426fbfSRobert Jarzmik #define AC97_DRIVER_ID(vendor_id1, vendor_id2, mask_id1, mask_id2, _data) \
1474426fbfSRobert Jarzmik 	{ .id = (((vendor_id1) & 0xffff) << 16) | ((vendor_id2) & 0xffff), \
1574426fbfSRobert Jarzmik 	  .mask = (((mask_id1) & 0xffff) << 16) | ((mask_id2) & 0xffff), \
1674426fbfSRobert Jarzmik 	  .data = (_data) }
1774426fbfSRobert Jarzmik 
1874426fbfSRobert Jarzmik struct ac97_controller;
1974426fbfSRobert Jarzmik struct clk;
2074426fbfSRobert Jarzmik 
2174426fbfSRobert Jarzmik /**
2274426fbfSRobert Jarzmik  * struct ac97_id - matches a codec device and driver on an ac97 bus
2374426fbfSRobert Jarzmik  * @id: The significant bits if the codec vendor ID1 and ID2
2474426fbfSRobert Jarzmik  * @mask: Bitmask specifying which bits of the id field are significant when
2574426fbfSRobert Jarzmik  *	  matching. A driver binds to a device when :
2674426fbfSRobert Jarzmik  *        ((vendorID1 << 8 | vendorID2) & (mask_id1 << 8 | mask_id2)) == id.
2774426fbfSRobert Jarzmik  * @data: Private data used by the driver.
2874426fbfSRobert Jarzmik  */
2974426fbfSRobert Jarzmik struct ac97_id {
3074426fbfSRobert Jarzmik 	unsigned int		id;
3174426fbfSRobert Jarzmik 	unsigned int		mask;
3274426fbfSRobert Jarzmik 	void			*data;
3374426fbfSRobert Jarzmik };
3474426fbfSRobert Jarzmik 
3574426fbfSRobert Jarzmik /**
3674426fbfSRobert Jarzmik  * ac97_codec_device - a ac97 codec
3774426fbfSRobert Jarzmik  * @dev: the core device
3874426fbfSRobert Jarzmik  * @vendor_id: the vendor_id of the codec, as sensed on the AC-link
3974426fbfSRobert Jarzmik  * @num: the codec number, 0 is primary, 1 is first slave, etc ...
4074426fbfSRobert Jarzmik  * @clk: the clock BIT_CLK provided by the codec
4174426fbfSRobert Jarzmik  * @ac97_ctrl: ac97 digital controller on the same AC-link
4274426fbfSRobert Jarzmik  *
4374426fbfSRobert Jarzmik  * This is the device instantiated for each codec living on a AC-link. There are
4474426fbfSRobert Jarzmik  * normally 0 to 4 codec devices per AC-link, and all of them are controlled by
4574426fbfSRobert Jarzmik  * an AC97 digital controller.
4674426fbfSRobert Jarzmik  */
4774426fbfSRobert Jarzmik struct ac97_codec_device {
4874426fbfSRobert Jarzmik 	struct device		dev;
4974426fbfSRobert Jarzmik 	unsigned int		vendor_id;
5074426fbfSRobert Jarzmik 	unsigned int		num;
5174426fbfSRobert Jarzmik 	struct clk		*clk;
5274426fbfSRobert Jarzmik 	struct ac97_controller	*ac97_ctrl;
5374426fbfSRobert Jarzmik };
5474426fbfSRobert Jarzmik 
5574426fbfSRobert Jarzmik /**
5674426fbfSRobert Jarzmik  * ac97_codec_driver - a ac97 codec driver
5774426fbfSRobert Jarzmik  * @driver: the device driver structure
5874426fbfSRobert Jarzmik  * @probe: the function called when a ac97_codec_device is matched
5974426fbfSRobert Jarzmik  * @remove: the function called when the device is unbound/removed
6074426fbfSRobert Jarzmik  * @shutdown: shutdown function (might be NULL)
6174426fbfSRobert Jarzmik  * @id_table: ac97 vendor_id match table, { } member terminated
6274426fbfSRobert Jarzmik  */
6374426fbfSRobert Jarzmik struct ac97_codec_driver {
6474426fbfSRobert Jarzmik 	struct device_driver	driver;
6574426fbfSRobert Jarzmik 	int			(*probe)(struct ac97_codec_device *);
66*7351324cSDawei Li 	void			(*remove)(struct ac97_codec_device *dev);
6774426fbfSRobert Jarzmik 	void			(*shutdown)(struct ac97_codec_device *);
6874426fbfSRobert Jarzmik 	const struct ac97_id	*id_table;
6974426fbfSRobert Jarzmik };
7074426fbfSRobert Jarzmik 
to_ac97_device(struct device * d)7174426fbfSRobert Jarzmik static inline struct ac97_codec_device *to_ac97_device(struct device *d)
7274426fbfSRobert Jarzmik {
7374426fbfSRobert Jarzmik 	return container_of(d, struct ac97_codec_device, dev);
7474426fbfSRobert Jarzmik }
7574426fbfSRobert Jarzmik 
to_ac97_driver(struct device_driver * d)7674426fbfSRobert Jarzmik static inline struct ac97_codec_driver *to_ac97_driver(struct device_driver *d)
7774426fbfSRobert Jarzmik {
7874426fbfSRobert Jarzmik 	return container_of(d, struct ac97_codec_driver, driver);
7974426fbfSRobert Jarzmik }
8074426fbfSRobert Jarzmik 
8174426fbfSRobert Jarzmik #if IS_ENABLED(CONFIG_AC97_BUS_NEW)
8274426fbfSRobert Jarzmik int snd_ac97_codec_driver_register(struct ac97_codec_driver *drv);
8374426fbfSRobert Jarzmik void snd_ac97_codec_driver_unregister(struct ac97_codec_driver *drv);
8474426fbfSRobert Jarzmik #else
8574426fbfSRobert Jarzmik static inline int
snd_ac97_codec_driver_register(struct ac97_codec_driver * drv)8674426fbfSRobert Jarzmik snd_ac97_codec_driver_register(struct ac97_codec_driver *drv)
8774426fbfSRobert Jarzmik {
8874426fbfSRobert Jarzmik 	return 0;
8974426fbfSRobert Jarzmik }
9074426fbfSRobert Jarzmik static inline void
snd_ac97_codec_driver_unregister(struct ac97_codec_driver * drv)9174426fbfSRobert Jarzmik snd_ac97_codec_driver_unregister(struct ac97_codec_driver *drv)
9274426fbfSRobert Jarzmik {
9374426fbfSRobert Jarzmik }
9474426fbfSRobert Jarzmik #endif
9574426fbfSRobert Jarzmik 
9674426fbfSRobert Jarzmik 
9774426fbfSRobert Jarzmik static inline struct device *
ac97_codec_dev2dev(struct ac97_codec_device * adev)9874426fbfSRobert Jarzmik ac97_codec_dev2dev(struct ac97_codec_device *adev)
9974426fbfSRobert Jarzmik {
10074426fbfSRobert Jarzmik 	return &adev->dev;
10174426fbfSRobert Jarzmik }
10274426fbfSRobert Jarzmik 
ac97_get_drvdata(struct ac97_codec_device * adev)10374426fbfSRobert Jarzmik static inline void *ac97_get_drvdata(struct ac97_codec_device *adev)
10474426fbfSRobert Jarzmik {
10574426fbfSRobert Jarzmik 	return dev_get_drvdata(ac97_codec_dev2dev(adev));
10674426fbfSRobert Jarzmik }
10774426fbfSRobert Jarzmik 
ac97_set_drvdata(struct ac97_codec_device * adev,void * data)10874426fbfSRobert Jarzmik static inline void ac97_set_drvdata(struct ac97_codec_device *adev,
10974426fbfSRobert Jarzmik 				    void *data)
11074426fbfSRobert Jarzmik {
11174426fbfSRobert Jarzmik 	dev_set_drvdata(ac97_codec_dev2dev(adev), data);
11274426fbfSRobert Jarzmik }
11374426fbfSRobert Jarzmik 
11474426fbfSRobert Jarzmik void *snd_ac97_codec_get_platdata(const struct ac97_codec_device *adev);
11574426fbfSRobert Jarzmik 
11674426fbfSRobert Jarzmik #endif
117