xref: /linux/drivers/dpll/zl3073x/out.c (revision 607f2c00c61faa3b437dbb0d38287e7a9d398a52)
1*607f2c00SIvan Vecera // SPDX-License-Identifier: GPL-2.0-only
2*607f2c00SIvan Vecera 
3*607f2c00SIvan Vecera #include <linux/bitfield.h>
4*607f2c00SIvan Vecera #include <linux/cleanup.h>
5*607f2c00SIvan Vecera #include <linux/dev_printk.h>
6*607f2c00SIvan Vecera #include <linux/string.h>
7*607f2c00SIvan Vecera #include <linux/string_choices.h>
8*607f2c00SIvan Vecera #include <linux/types.h>
9*607f2c00SIvan Vecera 
10*607f2c00SIvan Vecera #include "core.h"
11*607f2c00SIvan Vecera #include "out.h"
12*607f2c00SIvan Vecera 
13*607f2c00SIvan Vecera /**
14*607f2c00SIvan Vecera  * zl3073x_out_state_fetch - fetch output state from hardware
15*607f2c00SIvan Vecera  * @zldev: pointer to zl3073x_dev structure
16*607f2c00SIvan Vecera  * @index: output index to fetch state for
17*607f2c00SIvan Vecera  *
18*607f2c00SIvan Vecera  * Function fetches state of the given output from hardware and stores it
19*607f2c00SIvan Vecera  * for later use.
20*607f2c00SIvan Vecera  *
21*607f2c00SIvan Vecera  * Return: 0 on success, <0 on error
22*607f2c00SIvan Vecera  */
23*607f2c00SIvan Vecera int zl3073x_out_state_fetch(struct zl3073x_dev *zldev, u8 index)
24*607f2c00SIvan Vecera {
25*607f2c00SIvan Vecera 	struct zl3073x_out *out = &zldev->out[index];
26*607f2c00SIvan Vecera 	int rc;
27*607f2c00SIvan Vecera 
28*607f2c00SIvan Vecera 	/* Read output configuration */
29*607f2c00SIvan Vecera 	rc = zl3073x_read_u8(zldev, ZL_REG_OUTPUT_CTRL(index), &out->ctrl);
30*607f2c00SIvan Vecera 	if (rc)
31*607f2c00SIvan Vecera 		return rc;
32*607f2c00SIvan Vecera 
33*607f2c00SIvan Vecera 	dev_dbg(zldev->dev, "OUT%u is %s and connected to SYNTH%u\n", index,
34*607f2c00SIvan Vecera 		str_enabled_disabled(zl3073x_out_is_enabled(out)),
35*607f2c00SIvan Vecera 		zl3073x_out_synth_get(out));
36*607f2c00SIvan Vecera 
37*607f2c00SIvan Vecera 	guard(mutex)(&zldev->multiop_lock);
38*607f2c00SIvan Vecera 
39*607f2c00SIvan Vecera 	/* Read output configuration */
40*607f2c00SIvan Vecera 	rc = zl3073x_mb_op(zldev, ZL_REG_OUTPUT_MB_SEM, ZL_OUTPUT_MB_SEM_RD,
41*607f2c00SIvan Vecera 			   ZL_REG_OUTPUT_MB_MASK, BIT(index));
42*607f2c00SIvan Vecera 	if (rc)
43*607f2c00SIvan Vecera 		return rc;
44*607f2c00SIvan Vecera 
45*607f2c00SIvan Vecera 	/* Read output mode */
46*607f2c00SIvan Vecera 	rc = zl3073x_read_u8(zldev, ZL_REG_OUTPUT_MODE, &out->mode);
47*607f2c00SIvan Vecera 	if (rc)
48*607f2c00SIvan Vecera 		return rc;
49*607f2c00SIvan Vecera 
50*607f2c00SIvan Vecera 	dev_dbg(zldev->dev, "OUT%u has signal format 0x%02x\n", index,
51*607f2c00SIvan Vecera 		zl3073x_out_signal_format_get(out));
52*607f2c00SIvan Vecera 
53*607f2c00SIvan Vecera 	return rc;
54*607f2c00SIvan Vecera }
55*607f2c00SIvan Vecera 
56*607f2c00SIvan Vecera /**
57*607f2c00SIvan Vecera  * zl3073x_out_state_get - get current output state
58*607f2c00SIvan Vecera  * @zldev: pointer to zl3073x_dev structure
59*607f2c00SIvan Vecera  * @index: output index to get state for
60*607f2c00SIvan Vecera  *
61*607f2c00SIvan Vecera  * Return: pointer to given output state
62*607f2c00SIvan Vecera  */
63*607f2c00SIvan Vecera const struct zl3073x_out *zl3073x_out_state_get(struct zl3073x_dev *zldev,
64*607f2c00SIvan Vecera 						u8 index)
65*607f2c00SIvan Vecera {
66*607f2c00SIvan Vecera 	return &zldev->out[index];
67*607f2c00SIvan Vecera }
68