/*
 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/**
 * @defgroup
 * @{
 */

#include "sw.h"
#include "hppe_reg_access.h"
#include "mp_uniphy_reg.h"
#include "mp_uniphy.h"

sw_error_t
mp_uniphy_clock_output_control_get(
		a_uint32_t dev_id,
		a_uint32_t index,
		union uniphy_clock_output_control_u *value)
{
	if (index >= UNIPHY_CLOCK_OUTPUT_CONTROL_MAX_ENTRY)
		return SW_OUT_OF_RANGE;
	return hppe_uniphy_reg_get(
				dev_id,
				NSS_UNIPHY_BASE_ADDR + UNIPHY_CLOCK_OUTPUT_CONTROL_ADDRESS,
				index * UNIPHY_CLOCK_OUTPUT_CONTROL_INC,
				&value->val);
}

sw_error_t
mp_uniphy_clock_output_control_set(
		a_uint32_t dev_id,
		a_uint32_t index,
		union uniphy_clock_output_control_u *value)
{
	if (index >= UNIPHY_CLOCK_OUTPUT_CONTROL_MAX_ENTRY)
		return SW_OUT_OF_RANGE;
	return hppe_uniphy_reg_set(
				dev_id,
				NSS_UNIPHY_BASE_ADDR + UNIPHY_CLOCK_OUTPUT_CONTROL_ADDRESS,
				index * UNIPHY_CLOCK_OUTPUT_CONTROL_INC,
				value->val);
}
