blob: c578def79fc68076cfe22b071f0ed411d6d8a701 [file] [log] [blame]
/*
* Copyright (c) 2012, 2017-2018, 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.
*/
/*qca808x_start*/
/**
* @defgroup fal_reg_access FAL_REG_ACCESS
* @{
*/
#include "sw.h"
#include "fal_reg_access.h"
#include "hsl_api.h"
#include "hsl_phy.h"
static sw_error_t
_fal_phy_get(a_uint32_t dev_id, a_uint32_t phy_addr,
a_uint32_t reg, a_uint16_t * value)
{
sw_error_t rv;
hsl_api_t *p_api;
a_uint8_t phy_addr_type;
hsl_phy_get phy_get_func;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
/* the MSB first byte of phy_addr marks the type of
* phy address, such as the i2c address, the value of
* MSB first byte should be 1 */
phy_addr_type = (phy_addr & 0xff000000) >> 24;
phy_addr = phy_addr & 0xff;
switch (phy_addr_type) {
case PHY_I2C_ACCESS:
phy_get_func = p_api->phy_i2c_get;
break;
default:
phy_get_func = p_api->phy_get;
break;
}
if (NULL == phy_get_func) {
return SW_NOT_SUPPORTED;
}
rv = phy_get_func(dev_id, phy_addr, reg, value);
return rv;
}
static sw_error_t
_fal_phy_set(a_uint32_t dev_id, a_uint32_t phy_addr,
a_uint32_t reg, a_uint16_t value)
{
sw_error_t rv;
hsl_api_t *p_api;
a_uint8_t phy_addr_type;
hsl_phy_set phy_set_func;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
/* the MSB first byte of phy_addr marks the type of
* phy address, such as the i2c address, the value of
* MSB first byte should be 1 */
phy_addr_type = (phy_addr & 0xff000000) >> 24;
phy_addr = phy_addr & 0xff;
switch (phy_addr_type) {
case PHY_I2C_ACCESS:
phy_set_func = p_api->phy_i2c_set;
break;
default:
phy_set_func = p_api->phy_set;
break;
}
if (NULL == phy_set_func) {
return SW_NOT_SUPPORTED;
}
rv = phy_set_func(dev_id, phy_addr, reg, value);
return rv;
}
/*qca808x_end*/
static sw_error_t
_fal_reg_get(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->reg_get)
return SW_NOT_SUPPORTED;
rv = p_api->reg_get(dev_id, reg_addr, value, value_len);
return rv;
}
static sw_error_t
_fal_reg_set(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->reg_set)
return SW_NOT_SUPPORTED;
rv = p_api->reg_set(dev_id, reg_addr, value, value_len);
return rv;
}
static sw_error_t
_fal_psgmii_reg_get(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->psgmii_reg_get)
return SW_NOT_SUPPORTED;
rv = p_api->psgmii_reg_get(dev_id, reg_addr, value, value_len);
return rv;
}
static sw_error_t
_fal_psgmii_reg_set(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->psgmii_reg_set)
return SW_NOT_SUPPORTED;
rv = p_api->psgmii_reg_set(dev_id, reg_addr, value, value_len);
return rv;
}
static sw_error_t
_fal_reg_field_get(a_uint32_t dev_id, a_uint32_t reg_addr,
a_uint32_t bit_offset, a_uint32_t field_len,
a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->reg_field_get)
return SW_NOT_SUPPORTED;
rv = p_api->reg_field_get(dev_id, reg_addr, bit_offset, field_len, value, value_len);
return rv;
}
static sw_error_t
_fal_reg_field_set(a_uint32_t dev_id, a_uint32_t reg_addr,
a_uint32_t bit_offset, a_uint32_t field_len,
const a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->reg_field_set)
return SW_NOT_SUPPORTED;
rv = p_api->reg_field_set(dev_id, reg_addr, bit_offset, field_len, value, value_len);
return rv;
}
static sw_error_t
_fal_reg_dump(a_uint32_t dev_id, a_uint32_t reg_idx,fal_reg_dump_t *reg_dump)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->register_dump)
return SW_NOT_SUPPORTED;
rv = p_api->register_dump(dev_id, reg_idx,reg_dump);
return rv;
}
static sw_error_t
_fal_debug_reg_dump(a_uint32_t dev_id, fal_debug_reg_dump_t *reg_dump)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->debug_register_dump)
return SW_NOT_SUPPORTED;
rv = p_api->debug_register_dump(dev_id, reg_dump);
return rv;
}
static sw_error_t
_fal_debug_psgmii_self_test(a_uint32_t dev_id, a_bool_t enable,
a_uint32_t times, a_uint32_t *result)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->debug_psgmii_self_test)
return SW_NOT_SUPPORTED;
rv = p_api->debug_psgmii_self_test(dev_id, enable, times, result);
return rv;
}
static sw_error_t
_fal_phy_dump(a_uint32_t dev_id, a_uint32_t phy_addr, a_uint32_t idx,fal_phy_dump_t *phy_dump)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->phy_dump)
return SW_NOT_SUPPORTED;
rv = p_api->phy_dump(dev_id, phy_addr,idx,phy_dump);
return rv;
}
static sw_error_t
_fal_uniphy_reg_get(a_uint32_t dev_id, a_uint32_t index, a_uint32_t reg_addr,
a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->uniphy_reg_get)
return SW_NOT_SUPPORTED;
rv = p_api->uniphy_reg_get(dev_id, index, reg_addr, value, value_len);
return rv;
}
static sw_error_t
_fal_uniphy_reg_set(a_uint32_t dev_id, a_uint32_t index, a_uint32_t reg_addr,
a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
hsl_api_t *p_api;
SW_RTN_ON_NULL(p_api = hsl_api_ptr_get(dev_id));
if (NULL == p_api->uniphy_reg_set)
return SW_NOT_SUPPORTED;
rv = p_api->uniphy_reg_set(dev_id, index, reg_addr, value, value_len);
return rv;
}
/*qca808x_start*/
/**
* fal_phy_get - get value of specific phy device
* @phy_addr: id of the phy device
* @reg: register id of phy device
* @value: pointer to the memory storing the value.
* @return SW_OK or error code
*/
sw_error_t
fal_phy_get(a_uint32_t dev_id, a_uint32_t phy_addr,
a_uint32_t reg, a_uint16_t * value)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_phy_get(dev_id, phy_addr, reg, value);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_phy_set - set value of specific phy device
* @phy_addr: id of the phy device
* @reg: register id of phy device
* @value: register value.
* @return SW_OK or error code
*/
sw_error_t
fal_phy_set(a_uint32_t dev_id, a_uint32_t phy_addr,
a_uint32_t reg, a_uint16_t value)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_phy_set(dev_id, phy_addr, reg, value);
FAL_API_UNLOCK;
return rv;
}
/*qca808x_end*/
/**
* fal_reg_get - get value of specific register
* @reg_addr: address of the register
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Get the value of a specific register field with related parameter
*/
sw_error_t
fal_reg_get(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_reg_get(dev_id, reg_addr, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_reg_set - set value of specific register
* @reg_addr: address of the register
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Get the value of a specific register field with related parameter
*/
sw_error_t
fal_reg_set(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_reg_set(dev_id, reg_addr, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_psgmii_reg_get - get value of specific register in psgmii module
* @reg_addr: address of the register
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Get the value of a specific register field with related parameter
*/
sw_error_t
fal_psgmii_reg_get(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_psgmii_reg_get(dev_id, reg_addr, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_psgmii_reg_set - set value of specific register in psgmii module
* @reg_addr: address of the register
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Get the value of a specific register field with related parameter
*/
sw_error_t
fal_psgmii_reg_set(a_uint32_t dev_id, a_uint32_t reg_addr, a_uint8_t value[],
a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_psgmii_reg_set(dev_id, reg_addr, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_reg_field_get - get value of specific register field
* @reg_addr: address of the register
* @bit_offset: position of the field in bit
* @field_len: length of the field in bit
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Get the value of a specific register field with related parameter
*/
sw_error_t
fal_reg_field_get(a_uint32_t dev_id, a_uint32_t reg_addr,
a_uint32_t bit_offset, a_uint32_t field_len,
a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_reg_field_get(dev_id, reg_addr, bit_offset, field_len, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_reg_field_set - set value of specific register field
* @reg_addr: address of the register
* @bit_offset: position of the field in bit
* @field_len: length of the field in bit
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Set the value of a specific register field with related parameter
*/
sw_error_t
fal_reg_field_set(a_uint32_t dev_id, a_uint32_t reg_addr,
a_uint32_t bit_offset, a_uint32_t field_len,
const a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_reg_field_set(dev_id, reg_addr, bit_offset, field_len, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief dump device register group
* @details Comments:
* The unit of packets size is byte.
* @param[in] dev_id device id
* @param[out] reg_dump dump out register group
* @return SW_OK or error code
*/
sw_error_t
fal_reg_dump(a_uint32_t dev_id, a_uint32_t reg_idx,fal_reg_dump_t *reg_dump)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_reg_dump(dev_id, reg_idx,reg_dump);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief dump device debug register
* @details Comments:
* The unit of packets size is byte.
* @param[in] dev_id device id
* @param[out] reg_dump dump out debub register
* @return SW_OK or error code
*/
sw_error_t
fal_debug_reg_dump(a_uint32_t dev_id, fal_debug_reg_dump_t *reg_dump)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_debug_reg_dump(dev_id,reg_dump);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief psgmii self test
* @details Comments:
* The unit of packets size is byte.
* @param[in] dev_id device id, enable, times
* @param[out] status
* @return SW_OK or error code
*/
sw_error_t
fal_debug_psgmii_self_test(a_uint32_t dev_id, a_bool_t enable,
a_uint32_t times, a_uint32_t *result)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_debug_psgmii_self_test(dev_id, enable, times, result);
FAL_API_UNLOCK;
return rv;
}
/**
* @brief phy dump
* @details Comments:
* The unit of packets size is byte.
* @param[in] dev_id device id, phy addr, phy reg group
* @param[out] reg value
* @return SW_OK or error code
*/
sw_error_t
fal_phy_dump(a_uint32_t dev_id, a_uint32_t phy_addr,
a_uint32_t idx, fal_phy_dump_t * phy_dump)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_phy_dump(dev_id, phy_addr, idx, phy_dump);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_uniphy_reg_get - get value of specific register in uniphy module
* @reg_addr: address of the register
* @uniphy_index: index of uniphy
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Get the value of a specific register field with related parameter
*/
sw_error_t
fal_uniphy_reg_get(a_uint32_t dev_id, a_uint32_t index, a_uint32_t reg_addr,
a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_uniphy_reg_get(dev_id, index, reg_addr, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* fal_uniphy_reg_set - set value of specific register in uniphy module
* @reg_addr: address of the register
* @uniphy_index: index of uniphy
* @value: pointer to the memory storing the value.
* @value_len: length of the value.
*
* Get the value of a specific register field with related parameter
*/
sw_error_t
fal_uniphy_reg_set(a_uint32_t dev_id, a_uint32_t index, a_uint32_t reg_addr,
a_uint8_t value[], a_uint32_t value_len)
{
sw_error_t rv;
FAL_API_LOCK;
rv = _fal_uniphy_reg_set(dev_id, index, reg_addr, value, value_len);
FAL_API_UNLOCK;
return rv;
}
/**
* @}
*/