Commit 940cca1a authored by Marek Behún's avatar Marek Behún Committed by Pavel Machek

leds: ns2: convert to fwnode API

Convert from OF api to fwnode API, so that it is possible to bind this
driver without device-tree.

The fwnode API does not expose a function to read a specific element of
an array. We therefore change the types of the ns2_led_modval structure
so that we can read the whole modval array with one fwnode call.
Signed-off-by: default avatarMarek Behún <kabel@kernel.org>
Tested-by: default avatarSimon Guinot <simon.guinot@sequanux.org>
Signed-off-by: default avatarPavel Machek <pavel@ucw.cz>
parent 108f4664
...@@ -24,11 +24,16 @@ enum ns2_led_modes { ...@@ -24,11 +24,16 @@ enum ns2_led_modes {
NS_V2_LED_SATA, NS_V2_LED_SATA,
}; };
/*
* If the size of this structure or types of its members is changed,
* the filling of array modval in function ns2_led_register must be changed
* accordingly.
*/
struct ns2_led_modval { struct ns2_led_modval {
enum ns2_led_modes mode; u32 mode;
int cmd_level; u32 cmd_level;
int slow_level; u32 slow_level;
}; } __packed;
/* /*
* The Network Space v2 dual-GPIO LED is wired to a CPLD. Three different LED * The Network Space v2 dual-GPIO LED is wired to a CPLD. Three different LED
...@@ -167,27 +172,28 @@ static struct attribute *ns2_led_attrs[] = { ...@@ -167,27 +172,28 @@ static struct attribute *ns2_led_attrs[] = {
}; };
ATTRIBUTE_GROUPS(ns2_led); ATTRIBUTE_GROUPS(ns2_led);
static int ns2_led_register(struct device *dev, struct device_node *np, static int ns2_led_register(struct device *dev, struct fwnode_handle *node,
struct ns2_led *led) struct ns2_led *led)
{ {
struct led_init_data init_data = {}; struct led_init_data init_data = {};
struct ns2_led_modval *modval; struct ns2_led_modval *modval;
enum ns2_led_modes mode; enum ns2_led_modes mode;
int nmodes, ret, i; int nmodes, ret;
led->cmd = devm_gpiod_get_from_of_node(dev, np, "cmd-gpio", 0, led->cmd = devm_fwnode_gpiod_get_index(dev, node, "cmd", 0, GPIOD_ASIS,
GPIOD_ASIS, np->name); fwnode_get_name(node));
if (IS_ERR(led->cmd)) if (IS_ERR(led->cmd))
return PTR_ERR(led->cmd); return PTR_ERR(led->cmd);
led->slow = devm_gpiod_get_from_of_node(dev, np, "slow-gpio", 0, led->slow = devm_fwnode_gpiod_get_index(dev, node, "slow", 0,
GPIOD_ASIS, np->name); GPIOD_ASIS,
fwnode_get_name(node));
if (IS_ERR(led->slow)) if (IS_ERR(led->slow))
return PTR_ERR(led->slow); return PTR_ERR(led->slow);
ret = of_property_count_u32_elems(np, "modes-map"); ret = fwnode_property_count_u32(node, "modes-map");
if (ret < 0 || ret % 3) { if (ret < 0 || ret % 3) {
dev_err(dev, "Missing or malformed modes-map for %pOF\n", np); dev_err(dev, "Missing or malformed modes-map for %pfw\n", node);
return -EINVAL; return -EINVAL;
} }
...@@ -196,16 +202,8 @@ static int ns2_led_register(struct device *dev, struct device_node *np, ...@@ -196,16 +202,8 @@ static int ns2_led_register(struct device *dev, struct device_node *np,
if (!modval) if (!modval)
return -ENOMEM; return -ENOMEM;
for (i = 0; i < nmodes; i++) { fwnode_property_read_u32_array(node, "modes-map", (void *)modval,
u32 val; nmodes * 3);
of_property_read_u32_index(np, "modes-map", 3 * i, &val);
modval[i].mode = val;
of_property_read_u32_index(np, "modes-map", 3 * i + 1, &val);
modval[i].cmd_level = val;
of_property_read_u32_index(np, "modes-map", 3 * i + 2, &val);
modval[i].slow_level = val;
}
rwlock_init(&led->rw_lock); rwlock_init(&led->rw_lock);
...@@ -228,11 +226,11 @@ static int ns2_led_register(struct device *dev, struct device_node *np, ...@@ -228,11 +226,11 @@ static int ns2_led_register(struct device *dev, struct device_node *np,
led->sata = (mode == NS_V2_LED_SATA) ? 1 : 0; led->sata = (mode == NS_V2_LED_SATA) ? 1 : 0;
led->cdev.brightness = (mode == NS_V2_LED_OFF) ? LED_OFF : LED_FULL; led->cdev.brightness = (mode == NS_V2_LED_OFF) ? LED_OFF : LED_FULL;
init_data.fwnode = of_fwnode_handle(np); init_data.fwnode = node;
ret = devm_led_classdev_register_ext(dev, &led->cdev, &init_data); ret = devm_led_classdev_register_ext(dev, &led->cdev, &init_data);
if (ret) if (ret)
dev_err(dev, "Failed to register LED for node %pOF\n", np); dev_err(dev, "Failed to register LED for node %pfw\n", node);
return ret; return ret;
} }
...@@ -246,13 +244,12 @@ MODULE_DEVICE_TABLE(of, of_ns2_leds_match); ...@@ -246,13 +244,12 @@ MODULE_DEVICE_TABLE(of, of_ns2_leds_match);
static int ns2_led_probe(struct platform_device *pdev) static int ns2_led_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *np, *child; struct fwnode_handle *child;
struct ns2_led *leds; struct ns2_led *leds;
int count; int count;
int ret; int ret;
np = dev_of_node(dev); count = device_get_child_node_count(dev);
count = of_get_available_child_count(np);
if (!count) if (!count)
return -ENODEV; return -ENODEV;
...@@ -260,10 +257,10 @@ static int ns2_led_probe(struct platform_device *pdev) ...@@ -260,10 +257,10 @@ static int ns2_led_probe(struct platform_device *pdev)
if (!leds) if (!leds)
return -ENOMEM; return -ENOMEM;
for_each_available_child_of_node(np, child) { device_for_each_child_node(dev, child) {
ret = ns2_led_register(dev, child, leds++); ret = ns2_led_register(dev, child, leds++);
if (ret) { if (ret) {
of_node_put(child); fwnode_handle_put(child);
return ret; return ret;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment