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