diff --git a/arch/arm/boot/dts/amlogic/mesont5m.dtsi b/arch/arm/boot/dts/amlogic/mesont5m.dtsi index a9dfbfb74..e0b990edc 100644 --- a/arch/arm/boot/dts/amlogic/mesont5m.dtsi +++ b/arch/arm/boot/dts/amlogic/mesont5m.dtsi @@ -21,6 +21,8 @@ #include #include #include +#include + / { cpus:cpus { @@ -981,6 +983,8 @@ compatible = "amlogic,led_unipolar_ctrl"; reg = <0x74000 0x88>; interrupts = ; + led-mode = ; + led_number = <2>; status = "disabled"; }; diff --git a/arch/arm/boot/dts/amlogic/mesont6d.dtsi b/arch/arm/boot/dts/amlogic/mesont6d.dtsi index a471c31bd..f4ccfde5d 100644 --- a/arch/arm/boot/dts/amlogic/mesont6d.dtsi +++ b/arch/arm/boot/dts/amlogic/mesont6d.dtsi @@ -22,6 +22,7 @@ #include #include #include +#include / { cpus:cpus { @@ -742,6 +743,8 @@ compatible = "amlogic,led_unipolar_ctrl"; reg = <0x74000 0x88>; interrupts = ; + led-mode = ; + led_number = <2>; status = "disabled"; }; diff --git a/arch/arm/boot/dts/amlogic/mesontxhd2.dtsi b/arch/arm/boot/dts/amlogic/mesontxhd2.dtsi index 1ce3f0172..a546e8356 100644 --- a/arch/arm/boot/dts/amlogic/mesontxhd2.dtsi +++ b/arch/arm/boot/dts/amlogic/mesontxhd2.dtsi @@ -21,6 +21,8 @@ #include #include #include "mesongxbb-gpu-mali450.dtsi" +#include + / { cpus:cpus { @@ -1480,6 +1482,8 @@ compatible = "amlogic,led_unipolar_ctrl"; reg = <0x1000 0x88>; interrupts = ; + led-mode = ; + led_number = <2>; status = "disabled"; }; diff --git a/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1.5g.dts b/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1.5g.dts index 5364dcf95..dfe0eb6d9 100644 --- a/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1.5g.dts +++ b/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1.5g.dts @@ -1379,10 +1379,11 @@ }; &dcon_led { - status = "disabled"; - led_number = <13>; + status = "okay"; + led_number = <2>; pinctrl-names = "default"; pinctrl-0 = <&dcon_led_pins1>; + // polarity-inversed; }; &i2c0 { diff --git a/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1g.dts b/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1g.dts index 6fde8ed7c..cfdf576b2 100644 --- a/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1g.dts +++ b/arch/arm/boot/dts/amlogic/t6d_t950d5_br301_1g.dts @@ -1379,10 +1379,11 @@ }; &dcon_led { - status = "disabled"; - led_number = <13>; + status = "okay"; + led_number = <2>; pinctrl-names = "default"; pinctrl-0 = <&dcon_led_pins1>; + // polarity-inversed; }; &i2c0 { diff --git a/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1.5g.dts b/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1.5g.dts index d6eaaf982..6861b13fd 100644 --- a/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1.5g.dts +++ b/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1.5g.dts @@ -1369,10 +1369,11 @@ }; &dcon_led { - status = "disabled"; - led_number = <13>; + status = "okay"; + led_number = <1>; pinctrl-names = "default"; pinctrl-0 = <&dcon_led_pins1>; + // polarity-inversed; }; &i2c0 { diff --git a/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1g.dts b/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1g.dts index 32958ebf1..2a304742c 100644 --- a/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1g.dts +++ b/arch/arm/boot/dts/amlogic/t6d_t950d5_br309_1g.dts @@ -1370,10 +1370,11 @@ }; &dcon_led { - status = "disabled"; - led_number = <13>; + status = "okay"; + led_number = <1>; pinctrl-names = "default"; pinctrl-0 = <&dcon_led_pins1>; + // polarity-inversed; }; &i2c0 { diff --git a/arch/arm64/boot/dts/amlogic/mesont3x.dtsi b/arch/arm64/boot/dts/amlogic/mesont3x.dtsi index 317cd47ed..d03ee57ca 100644 --- a/arch/arm64/boot/dts/amlogic/mesont3x.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesont3x.dtsi @@ -21,6 +21,8 @@ #include "meson-ir-map.dtsi" #include "meson-valhall.dtsi" #include +#include + / { cpus:cpus { @@ -1697,6 +1699,8 @@ compatible = "amlogic,led_unipolar_ctrl"; reg = <0x0 0x4c000 0x0 0x88>; interrupts = ; + led-mode = ; + led_number = <2>; status = "disabled"; }; diff --git a/arch/arm64/boot/dts/amlogic/mesont5m.dtsi b/arch/arm64/boot/dts/amlogic/mesont5m.dtsi index 3184e48a0..99bdc5100 100644 --- a/arch/arm64/boot/dts/amlogic/mesont5m.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesont5m.dtsi @@ -21,6 +21,9 @@ #include #include #include +#include +#include + / { cpus:cpus { @@ -989,6 +992,8 @@ compatible = "amlogic,led_unipolar_ctrl"; reg = <0x0 0x74000 0x0 0x88>; interrupts = ; + led-mode = ; + led_number = <2>; status = "disabled"; }; diff --git a/drivers/led/meson_led_unipolar_ctrl.c b/drivers/led/meson_led_unipolar_ctrl.c index 3c86c83c4..fafe5bc21 100644 --- a/drivers/led/meson_led_unipolar_ctrl.c +++ b/drivers/led/meson_led_unipolar_ctrl.c @@ -16,6 +16,7 @@ #include #include #include +#include // #define M_DEBUG #ifdef M_DEBUG @@ -56,6 +57,7 @@ enum { }; /* Control DCON_LED RATIO fields */ +#define RATIO_FLIP_CTRL BIT(30) #define RATIO_INTERRUPT_STATUS BIT(29) #define RATIO_BUSY_STATUS BIT(28) #define RATIO_PRE_RESETCODE BIT(27) @@ -78,6 +80,8 @@ struct meson_unipolar_ctrl { uint led_num; u8 *color_data; struct completion done; + bool polarity_inversed; + uint mode; }; #define MESON_UNIPOLAR_CTRL_CDEV_NAME "unipolar_led" @@ -144,7 +148,9 @@ static void meson_unipolar_ctrl_init(struct meson_unipolar_ctrl *dcon_led) /*set reset duration 0x240*1.25 = 300 us*/ meson_unipolar_ctrl_set_mask(dcon_led, LED_CYCLE_RATIO_RES, RATIO_RESET_DURATION_MSK, 0xF0 << RATIO_RESET_DURATION_SHIFT); - + if (dcon_led->polarity_inversed) + meson_unipolar_ctrl_set_mask(dcon_led, LED_CYCLE_RATIO_RES, + RATIO_FLIP_CTRL, RATIO_FLIP_CTRL); /*send data with out reset*/ // meson_unipolar_ctrl_set_mask(dcon_led,LED_CYCLE_RATIO_RES, // RATIO_RESET_DURATION_MSK, RATIO_PRE_RESETCODE); @@ -175,14 +181,28 @@ static void meson_unipolar_ctrl_put_data_to_buffer(struct meson_unipolar_ctrl *d u8 buffer_id, u8 r_data, u8 g_data, u8 b_data) { spin_lock(&dcon_led->lock); - /*R G B*/ - // dcon_led->color_data[buffer_id] = r_data; - // dcon_led->color_data[buffer_id + 1] = g_data; - // dcon_led->color_data[buffer_id + 2] = b_data; - /*G R B*/ - dcon_led->color_data[buffer_id] = g_data; - dcon_led->color_data[buffer_id + 1] = r_data; - dcon_led->color_data[buffer_id + 2] = b_data; + switch (dcon_led->mode) { + case LED_MESON_RGB: + /*R G B*/ + LEDCON_DBG("%s LED_MESON_RGB\n", __func__); + dcon_led->color_data[buffer_id] = r_data; + dcon_led->color_data[buffer_id + 1] = g_data; + dcon_led->color_data[buffer_id + 2] = b_data; + break; + case LED_MESON_GRB: + /*G R B*/ + LEDCON_DBG("%s LED_MESON_GRB\n", __func__); + dcon_led->color_data[buffer_id] = g_data; + dcon_led->color_data[buffer_id + 1] = r_data; + dcon_led->color_data[buffer_id + 2] = b_data; + break; + default: + /*R G B*/ + dcon_led->color_data[buffer_id] = r_data; + dcon_led->color_data[buffer_id + 1] = g_data; + dcon_led->color_data[buffer_id + 2] = b_data; + break; + } spin_unlock(&dcon_led->lock); } @@ -431,6 +451,13 @@ static int unipolar_ctrl_probe(struct platform_device *pdev) dev_err(&pdev->dev, "erro, LED num over than LED_MAX_NUM:%d\n", LED_MAX_NUM); return -EINVAL; } + if (device_property_read_bool(&pdev->dev, "polarity-inversed")) + dcon_led->polarity_inversed = true; + ret = device_property_read_u32(&pdev->dev, "led-mode", &dcon_led->mode); + if (ret < 0) { + dev_err(&pdev->dev, "Failure to get led mode = %d\n", ret); + return ret; + } dcon_led->color_data = devm_kzalloc(&pdev->dev, dcon_led->led_num * COLOR_CHANNEL_NUM, GFP_KERNEL); if (!dcon_led->color_data) diff --git a/include/dt-bindings/leds/leds-meson.h b/include/dt-bindings/leds/leds-meson.h new file mode 100644 index 000000000..1ed81a6bf --- /dev/null +++ b/include/dt-bindings/leds/leds-meson.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ +/* + * Copyright (c) 2019 Amlogic, Inc. All rights reserved. + */ + +#ifndef _DT_BINDINGS_LEDS_MESON_H +#define _DT_BINDINGS_LEDS_MESON_H + +/*defination for LEDS MODE index + * + */ +#define LED_MESON_RGB 0 +#define LED_MESON_RBG 1 +#define LED_MESON_GBR 2 +#define LED_MESON_GRB 3 +#define LED_MESON_BRG 4 +#define LED_MESON_BGR 5 + +#endif