xref: /OK3568_Linux_fs/kernel/tools/leds/get_led_device_info.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun
4*4882a593Smuzhiyunled_common_defs_path="include/dt-bindings/leds/common.h"
5*4882a593Smuzhiyun
6*4882a593Smuzhiyunnum_args=$#
7*4882a593Smuzhiyunif [ $num_args -eq 1 ]; then
8*4882a593Smuzhiyun        linux_top=$(dirname `realpath $0` | awk -F/     \
9*4882a593Smuzhiyun                        '{                              \
10*4882a593Smuzhiyun                                i=1;                    \
11*4882a593Smuzhiyun                                while (i <= NF - 2) {   \
12*4882a593Smuzhiyun                                        printf $i"/";   \
13*4882a593Smuzhiyun                                        i++;            \
14*4882a593Smuzhiyun                                };                      \
15*4882a593Smuzhiyun                        }')
16*4882a593Smuzhiyun	led_defs_path=$linux_top/$led_common_defs_path
17*4882a593Smuzhiyunelif [ $num_args -eq 2 ]; then
18*4882a593Smuzhiyun        led_defs_path=`realpath $2`
19*4882a593Smuzhiyunelse
20*4882a593Smuzhiyun	echo "Usage: get_led_device_info.sh LED_CDEV_PATH [LED_COMMON_DEFS_PATH]"
21*4882a593Smuzhiyun	exit 1
22*4882a593Smuzhiyunfi
23*4882a593Smuzhiyun
24*4882a593Smuzhiyunif [ ! -f $led_defs_path ]; then
25*4882a593Smuzhiyun	echo "$led_defs_path doesn't exist"
26*4882a593Smuzhiyun	exit 1
27*4882a593Smuzhiyunfi
28*4882a593Smuzhiyun
29*4882a593Smuzhiyunled_cdev_path=`echo $1 | sed s'/\/$//'`
30*4882a593Smuzhiyun
31*4882a593Smuzhiyunls "$led_cdev_path/brightness" > /dev/null 2>&1
32*4882a593Smuzhiyunif [ $? -ne 0 ]; then
33*4882a593Smuzhiyun	echo "Device \"$led_cdev_path\" does not exist."
34*4882a593Smuzhiyun	exit 1
35*4882a593Smuzhiyunfi
36*4882a593Smuzhiyun
37*4882a593Smuzhiyunbus=`readlink $led_cdev_path/device/subsystem | sed s'/.*\///'`
38*4882a593Smuzhiyunusb_subdev=`readlink $led_cdev_path | grep usb | sed s'/\(.*usb[0-9]*\/[0-9]*-[0-9]*\)\/.*/\1/'`
39*4882a593Smuzhiyunls "$led_cdev_path/device/of_node/compatible" > /dev/null 2>&1
40*4882a593Smuzhiyunof_node_missing=$?
41*4882a593Smuzhiyun
42*4882a593Smuzhiyunif [ "$bus" = "input" ]; then
43*4882a593Smuzhiyun	input_node=`readlink $led_cdev_path/device | sed s'/.*\///'`
44*4882a593Smuzhiyun	if [ ! -z "$usb_subdev" ]; then
45*4882a593Smuzhiyun		bus="usb"
46*4882a593Smuzhiyun	fi
47*4882a593Smuzhiyunfi
48*4882a593Smuzhiyun
49*4882a593Smuzhiyunif [ "$bus" = "usb" ]; then
50*4882a593Smuzhiyun	usb_interface=`readlink $led_cdev_path | sed s'/.*\(usb[0-9]*\)/\1/' | cut -d\/ -f3`
51*4882a593Smuzhiyun	cd $led_cdev_path/../$usb_subdev
52*4882a593Smuzhiyun	driver=`readlink $usb_interface/driver | sed s'/.*\///'`
53*4882a593Smuzhiyun	if [ -d "$usb_interface/ieee80211" ]; then
54*4882a593Smuzhiyun		wifi_phy=`ls -l $usb_interface/ieee80211 | grep phy | awk '{print $9}'`
55*4882a593Smuzhiyun	fi
56*4882a593Smuzhiyun	idVendor=`cat idVendor`
57*4882a593Smuzhiyun	idProduct=`cat idProduct`
58*4882a593Smuzhiyun	manufacturer=`cat manufacturer`
59*4882a593Smuzhiyun	product=`cat product`
60*4882a593Smuzhiyunelif [ "$bus" = "input" ]; then
61*4882a593Smuzhiyun	cd $led_cdev_path
62*4882a593Smuzhiyun	product=`cat device/name`
63*4882a593Smuzhiyun	driver=`cat device/device/driver/description`
64*4882a593Smuzhiyunelif [ $of_node_missing -eq 0 ]; then
65*4882a593Smuzhiyun	cd $led_cdev_path
66*4882a593Smuzhiyun	compatible=`cat device/of_node/compatible`
67*4882a593Smuzhiyun	if [ "$compatible" = "gpio-leds" ]; then
68*4882a593Smuzhiyun		driver="leds-gpio"
69*4882a593Smuzhiyun	elif [ "$compatible" = "pwm-leds" ]; then
70*4882a593Smuzhiyun		driver="leds-pwm"
71*4882a593Smuzhiyun	else
72*4882a593Smuzhiyun		manufacturer=`echo $compatible | awk -F, '{print $1}'`
73*4882a593Smuzhiyun		product=`echo $compatible | awk -F, '{print $2}'`
74*4882a593Smuzhiyun	fi
75*4882a593Smuzhiyunelse
76*4882a593Smuzhiyun	echo "Unknown device type."
77*4882a593Smuzhiyun	exit 1
78*4882a593Smuzhiyunfi
79*4882a593Smuzhiyun
80*4882a593Smuzhiyunprintf "\n#####################################\n"
81*4882a593Smuzhiyunprintf "# LED class device hardware details #\n"
82*4882a593Smuzhiyunprintf "#####################################\n\n"
83*4882a593Smuzhiyun
84*4882a593Smuzhiyunprintf "bus:\t\t\t$bus\n"
85*4882a593Smuzhiyun
86*4882a593Smuzhiyunif [ ! -z "$idVendor" ]; then
87*4882a593Smuzhiyun	printf "idVendor:\t\t$idVendor\n"
88*4882a593Smuzhiyunfi
89*4882a593Smuzhiyun
90*4882a593Smuzhiyunif [ ! -z "$idProduct" ]; then
91*4882a593Smuzhiyun	printf "idProduct:\t\t$idProduct\n"
92*4882a593Smuzhiyunfi
93*4882a593Smuzhiyun
94*4882a593Smuzhiyunif [ ! -z "$manufacturer" ]; then
95*4882a593Smuzhiyun	printf "manufacturer:\t\t$manufacturer\n"
96*4882a593Smuzhiyunfi
97*4882a593Smuzhiyun
98*4882a593Smuzhiyunif [ ! -z "$product" ]; then
99*4882a593Smuzhiyun	printf "product:\t\t$product\n"
100*4882a593Smuzhiyunfi
101*4882a593Smuzhiyun
102*4882a593Smuzhiyunif [ ! -z "$driver" ]; then
103*4882a593Smuzhiyun	printf "driver:\t\t\t$driver\n"
104*4882a593Smuzhiyunfi
105*4882a593Smuzhiyun
106*4882a593Smuzhiyunif [ ! -z "$input_node" ]; then
107*4882a593Smuzhiyun	printf "associated input node:\t$input_node\n"
108*4882a593Smuzhiyunfi
109*4882a593Smuzhiyun
110*4882a593Smuzhiyunprintf "\n####################################\n"
111*4882a593Smuzhiyunprintf "# LED class device name validation #\n"
112*4882a593Smuzhiyunprintf "####################################\n\n"
113*4882a593Smuzhiyun
114*4882a593Smuzhiyunled_name=`echo $led_cdev_path | sed s'/.*\///'`
115*4882a593Smuzhiyun
116*4882a593Smuzhiyunnum_sections=`echo $led_name | awk -F: '{print NF}'`
117*4882a593Smuzhiyun
118*4882a593Smuzhiyunif [ $num_sections -eq 1 ]; then
119*4882a593Smuzhiyun	printf "\":\" delimiter not detected.\t[ FAILED ]\n"
120*4882a593Smuzhiyun	exit 1
121*4882a593Smuzhiyunelif [ $num_sections -eq 2 ]; then
122*4882a593Smuzhiyun	color=`echo $led_name | cut -d: -f1`
123*4882a593Smuzhiyun	function=`echo $led_name | cut -d: -f2`
124*4882a593Smuzhiyunelif [ $num_sections -eq 3 ]; then
125*4882a593Smuzhiyun	devicename=`echo $led_name | cut -d: -f1`
126*4882a593Smuzhiyun	color=`echo $led_name | cut -d: -f2`
127*4882a593Smuzhiyun	function=`echo $led_name | cut -d: -f3`
128*4882a593Smuzhiyunelse
129*4882a593Smuzhiyun	printf "Detected %d sections in the LED class device name - should the script be updated?\n" $num_sections
130*4882a593Smuzhiyun	exit 1
131*4882a593Smuzhiyunfi
132*4882a593Smuzhiyun
133*4882a593SmuzhiyunS_DEV="devicename"
134*4882a593SmuzhiyunS_CLR="color     "
135*4882a593SmuzhiyunS_FUN="function  "
136*4882a593Smuzhiyunstatus_tab=20
137*4882a593Smuzhiyun
138*4882a593Smuzhiyunprint_msg_ok()
139*4882a593Smuzhiyun{
140*4882a593Smuzhiyun	local section_name="$1"
141*4882a593Smuzhiyun	local section_val="$2"
142*4882a593Smuzhiyun	local msg="$3"
143*4882a593Smuzhiyun	printf "$section_name :\t%-${status_tab}.${status_tab}s %s %s\n" "$section_val" "[ OK ]    " "$msg"
144*4882a593Smuzhiyun}
145*4882a593Smuzhiyun
146*4882a593Smuzhiyunprint_msg_failed()
147*4882a593Smuzhiyun{
148*4882a593Smuzhiyun	local section_name="$1"
149*4882a593Smuzhiyun	local section_val="$2"
150*4882a593Smuzhiyun	local msg="$3"
151*4882a593Smuzhiyun	printf "$section_name :\t%-${status_tab}.${status_tab}s %s %s\n" "$section_val" "[ FAILED ]" "$msg"
152*4882a593Smuzhiyun}
153*4882a593Smuzhiyun
154*4882a593Smuzhiyunif [ ! -z "$input_node" ]; then
155*4882a593Smuzhiyun	expected_devname=$input_node
156*4882a593Smuzhiyunelif [ ! -z "$wifi_phy" ]; then
157*4882a593Smuzhiyun	expected_devname=$wifi_phy
158*4882a593Smuzhiyunfi
159*4882a593Smuzhiyun
160*4882a593Smuzhiyunif [ ! -z "$devicename" ]; then
161*4882a593Smuzhiyun	if [ ! -z "$expected_devname" ]; then
162*4882a593Smuzhiyun		if [ "$devicename" = "$expected_devname" ]; then
163*4882a593Smuzhiyun			print_msg_ok "$S_DEV" "$devicename"
164*4882a593Smuzhiyun		else
165*4882a593Smuzhiyun			print_msg_failed "$S_DEV" "$devicename" "Expected: $expected_devname"
166*4882a593Smuzhiyun		fi
167*4882a593Smuzhiyun	else
168*4882a593Smuzhiyun		if [ "$devicename" = "$manufacturer" ]; then
169*4882a593Smuzhiyun			print_msg_failed "$S_DEV" "$devicename" "Redundant: use of vendor name is discouraged"
170*4882a593Smuzhiyun		elif [ "$devicename" = "$product" ]; then
171*4882a593Smuzhiyun			print_msg_failed "$S_DEV" "$devicename" "Redundant: use of product name is discouraged"
172*4882a593Smuzhiyun		else
173*4882a593Smuzhiyun			print_msg_failed "$S_DEV" "$devicename" "Unknown devicename - should the script be updated?"
174*4882a593Smuzhiyun		fi
175*4882a593Smuzhiyun	fi
176*4882a593Smuzhiyunelif [ ! -z "$expected_devname" ]; then
177*4882a593Smuzhiyun	print_msg_failed "$S_DEV" "blank" "Expected: $expected_devname"
178*4882a593Smuzhiyunfi
179*4882a593Smuzhiyun
180*4882a593Smuzhiyunif [ ! -z "$color" ]; then
181*4882a593Smuzhiyun	color_upper=`echo $color | tr [:lower:] [:upper:]`
182*4882a593Smuzhiyun	color_id_definition=$(cat $led_defs_path | grep "_$color_upper\s" | awk '{print $2}')
183*4882a593Smuzhiyun	if [ ! -z "$color_id_definition" ]; then
184*4882a593Smuzhiyun		print_msg_ok "$S_CLR" "$color" "Matching definition: $color_id_definition"
185*4882a593Smuzhiyun	else
186*4882a593Smuzhiyun		print_msg_failed "$S_CLR" "$color" "Definition not found in $led_defs_path"
187*4882a593Smuzhiyun	fi
188*4882a593Smuzhiyun
189*4882a593Smuzhiyunfi
190*4882a593Smuzhiyun
191*4882a593Smuzhiyunif [ ! -z "$function" ]; then
192*4882a593Smuzhiyun	# strip optional enumerator
193*4882a593Smuzhiyun	function=`echo $function | sed s'/\(.*\)-[0-9]*$/\1/'`
194*4882a593Smuzhiyun	fun_definition=$(cat $led_defs_path | grep "\"$function\"" | awk '{print $2}')
195*4882a593Smuzhiyun	if [ ! -z "$fun_definition" ]; then
196*4882a593Smuzhiyun		print_msg_ok "$S_FUN" "$function" "Matching definition: $fun_definition"
197*4882a593Smuzhiyun	else
198*4882a593Smuzhiyun		print_msg_failed "$S_FUN" "$function" "Definition not found in $led_defs_path"
199*4882a593Smuzhiyun	fi
200*4882a593Smuzhiyun
201*4882a593Smuzhiyunfi
202