blob: c5dcd08efa9faf4e41a9c2daf66514fe9371b199 [file] [log] [blame]
/*
* Copyright (c) 2012, 2014-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.
*/
#include "sw.h"
#include "ssdk_init.h"
#include "ssdk_led.h"
#include <linux/kconfig.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include "ssdk_plat.h"
#if defined(CONFIG_OF)
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0))
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0))
#include <drivers/leds/leds-ipq.h>
#endif
#else
#include <drivers/leds/leds-ipq40xx.h>
#endif
#endif
#ifdef DESS
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0))
static int ssdk_dess_led_source_select(int led_num, enum led_source src_type)
{
#if defined(CONFIG_OF)
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0))
ipq_led_source_select(led_num, src_type);
#else
ipq40xx_led_source_select(led_num, src_type);
#endif
#endif
return 0;
}
#endif
int ssdk_dess_led_init(ssdk_init_cfg *cfg)
{
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,5,0))
a_uint32_t i,led_num, led_source_id,source_id;
led_ctrl_pattern_t pattern;
if(cfg->led_source_num != 0) {
for (i = 0; i < cfg->led_source_num; i++) {
led_source_id = cfg->led_source_cfg[i].led_source_id;
pattern.mode = cfg->led_source_cfg[i].led_pattern.mode;
pattern.map = cfg->led_source_cfg[i].led_pattern.map;
pattern.freq = cfg->led_source_cfg[i].led_pattern.freq;
#ifdef IN_LED
fal_led_source_pattern_set(0, led_source_id,&pattern);
#endif
led_num = ((led_source_id -1) /3) + 3;
source_id = led_source_id % 3;
if (source_id == SRC_SELECTION_1) {
if (led_source_id == LED_SRC_ID_1) {
ssdk_dess_led_source_select(led_num,
LAN0_1000_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_4) {
ssdk_dess_led_source_select(led_num,
LAN1_1000_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_7) {
ssdk_dess_led_source_select(led_num,
LAN2_1000_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_10) {
ssdk_dess_led_source_select(led_num,
LAN3_1000_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_13) {
ssdk_dess_led_source_select(led_num,
WAN_1000_LNK_ACTIVITY);
}
}
if (source_id == SRC_SELECTION_2) {
if (led_source_id == LED_SRC_ID_2) {
ssdk_dess_led_source_select(led_num,
LAN0_100_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_5) {
ssdk_dess_led_source_select(led_num,
LAN1_100_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_8) {
ssdk_dess_led_source_select(led_num,
LAN2_100_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_11) {
ssdk_dess_led_source_select(led_num,
LAN3_100_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_14) {
ssdk_dess_led_source_select(led_num,
WAN_100_LNK_ACTIVITY);
}
}
if (source_id == SRC_SELECTION_0) {
if (led_source_id == LED_SRC_ID_3) {
ssdk_dess_led_source_select(led_num,
LAN0_10_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_6) {
ssdk_dess_led_source_select(led_num,
LAN1_10_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_9) {
ssdk_dess_led_source_select(led_num,
LAN2_10_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_12) {
ssdk_dess_led_source_select(led_num,
LAN3_10_LNK_ACTIVITY);
}
if (led_source_id == LED_SRC_ID_15) {
ssdk_dess_led_source_select(led_num,
WAN_10_LNK_ACTIVITY);
}
}
}
}
#endif
return 0;
}
#endif
#ifdef IN_LED
sw_error_t ssdk_led_init(a_uint32_t dev_id, ssdk_init_cfg *cfg)
{
a_uint32_t src_index = 0, led_src_id = 0;
sw_error_t rv = SW_OK;
led_ctrl_pattern_t pattern = {0};
for(src_index = 0; src_index < cfg->led_source_num; src_index++)
{
pattern.mode = cfg->led_source_cfg[src_index].led_pattern.mode;
pattern.map = cfg->led_source_cfg[src_index].led_pattern.map;
led_src_id = cfg->led_source_cfg[src_index].led_source_id;
SSDK_INFO("ssdk_led_mode:%x, ssdk_led_map:%x, ssdk_led_src_id:%x\n",
pattern.mode, pattern.map, led_src_id);
rv = fal_led_source_pattern_set(dev_id, led_src_id, &pattern);
SW_RTN_ON_ERROR(rv);
}
return SW_OK;
}
#endif