浏览代码

as3645a: Use integer numbers for parsing LEDs

Use integer numbers for LEDs, 0 is the flash and 1 is the indicator.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
Sakari Ailus 8 年之前
父节点
当前提交
e626c32527
共有 2 个文件被更改,包括 30 次插入4 次删除
  1. 6 2
      arch/arm/boot/dts/omap3-n950-n9.dtsi
  2. 24 2
      drivers/leds/leds-as3645a.c

+ 6 - 2
arch/arm/boot/dts/omap3-n950-n9.dtsi

@@ -267,15 +267,19 @@
 	clock-frequency = <400000>;
 	clock-frequency = <400000>;
 
 
 	as3645a@30 {
 	as3645a@30 {
+		#address-cells = <1>;
+		#size-cells = <0>;
 		reg = <0x30>;
 		reg = <0x30>;
 		compatible = "ams,as3645a";
 		compatible = "ams,as3645a";
-		flash {
+		flash@0 {
+			reg = <0x0>;
 			flash-timeout-us = <150000>;
 			flash-timeout-us = <150000>;
 			flash-max-microamp = <320000>;
 			flash-max-microamp = <320000>;
 			led-max-microamp = <60000>;
 			led-max-microamp = <60000>;
 			ams,input-max-microamp = <1750000>;
 			ams,input-max-microamp = <1750000>;
 		};
 		};
-		indicator {
+		indicator@1 {
+			reg = <0x1>;
 			led-max-microamp = <10000>;
 			led-max-microamp = <10000>;
 		};
 		};
 	};
 	};

+ 24 - 2
drivers/leds/leds-as3645a.c

@@ -112,6 +112,10 @@
 #define AS_PEAK_mA_TO_REG(a) \
 #define AS_PEAK_mA_TO_REG(a) \
 	((min_t(u32, AS_PEAK_mA_MAX, a) - 1250) / 250)
 	((min_t(u32, AS_PEAK_mA_MAX, a) - 1250) / 250)
 
 
+/* LED numbers for Devicetree */
+#define AS_LED_FLASH				0
+#define AS_LED_INDICATOR			1
+
 enum as_mode {
 enum as_mode {
 	AS_MODE_EXT_TORCH = 0 << AS_CONTROL_MODE_SETTING_SHIFT,
 	AS_MODE_EXT_TORCH = 0 << AS_CONTROL_MODE_SETTING_SHIFT,
 	AS_MODE_INDICATOR = 1 << AS_CONTROL_MODE_SETTING_SHIFT,
 	AS_MODE_INDICATOR = 1 << AS_CONTROL_MODE_SETTING_SHIFT,
@@ -491,10 +495,29 @@ static int as3645a_parse_node(struct as3645a *flash,
 			      struct device_node *node)
 			      struct device_node *node)
 {
 {
 	struct as3645a_config *cfg = &flash->cfg;
 	struct as3645a_config *cfg = &flash->cfg;
+	struct device_node *child;
 	const char *name;
 	const char *name;
 	int rval;
 	int rval;
 
 
-	flash->flash_node = of_get_child_by_name(node, "flash");
+	for_each_child_of_node(node, child) {
+		u32 id = 0;
+
+		of_property_read_u32(child, "reg", &id);
+
+		switch (id) {
+		case AS_LED_FLASH:
+			flash->flash_node = of_node_get(child);
+			break;
+		case AS_LED_INDICATOR:
+			flash->indicator_node = of_node_get(child);
+			break;
+		default:
+			dev_warn(&flash->client->dev,
+				 "unknown LED %u encountered, ignoring\n", id);
+			break;
+		}
+	}
+
 	if (!flash->flash_node) {
 	if (!flash->flash_node) {
 		dev_err(&flash->client->dev, "can't find flash node\n");
 		dev_err(&flash->client->dev, "can't find flash node\n");
 		return -ENODEV;
 		return -ENODEV;
@@ -538,7 +561,6 @@ static int as3645a_parse_node(struct as3645a *flash,
 			     &cfg->peak);
 			     &cfg->peak);
 	cfg->peak = AS_PEAK_mA_TO_REG(cfg->peak);
 	cfg->peak = AS_PEAK_mA_TO_REG(cfg->peak);
 
 
-	flash->indicator_node = of_get_child_by_name(node, "indicator");
 	if (!flash->indicator_node) {
 	if (!flash->indicator_node) {
 		dev_warn(&flash->client->dev,
 		dev_warn(&flash->client->dev,
 			 "can't find indicator node\n");
 			 "can't find indicator node\n");