mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2025-12-10 08:44:39 +01:00
gpio-button-hotplug: some modern cleanups
devm_kmalloc_array addition. of_property_present instead of boolean hack. for_each_available_child_of_node_scoped to avoid of_node_put. Signed-off-by: Rosen Penev <rosenp@gmail.com> Link: https://github.com/openwrt/openwrt/pull/21033 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
parent
cc2aefe619
commit
05cd169cd4
1 changed files with 11 additions and 17 deletions
|
|
@ -363,38 +363,34 @@ static irqreturn_t button_handle_irq(int irq, void *_bdata)
|
||||||
static struct gpio_keys_platform_data *
|
static struct gpio_keys_platform_data *
|
||||||
gpio_keys_get_devtree_pdata(struct device *dev)
|
gpio_keys_get_devtree_pdata(struct device *dev)
|
||||||
{
|
{
|
||||||
struct device_node *node, *pp;
|
struct device_node *node = dev->of_node;
|
||||||
struct gpio_keys_platform_data *pdata;
|
struct gpio_keys_platform_data *pdata;
|
||||||
struct gpio_keys_button *button;
|
|
||||||
int nbuttons;
|
int nbuttons;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
node = dev->of_node;
|
|
||||||
if (!node)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
nbuttons = of_get_available_child_count(node);
|
nbuttons = of_get_available_child_count(node);
|
||||||
if (nbuttons == 0)
|
if (nbuttons == 0)
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
pdata = devm_kzalloc(dev, sizeof(*pdata) + nbuttons * (sizeof *button),
|
pdata = devm_kzalloc(dev, sizeof(struct gpio_keys_platform_data), GFP_KERNEL);
|
||||||
GFP_KERNEL);
|
|
||||||
if (!pdata)
|
if (!pdata)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
pdata->buttons = (struct gpio_keys_button *)(pdata + 1);
|
pdata->buttons = devm_kmalloc_array(dev, nbuttons, sizeof(struct gpio_keys_button), GFP_KERNEL);
|
||||||
|
if (!pdata->buttons)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
pdata->nbuttons = nbuttons;
|
pdata->nbuttons = nbuttons;
|
||||||
|
|
||||||
pdata->rep = !!of_get_property(node, "autorepeat", NULL);
|
pdata->rep = of_property_present(node, "autorepeat");
|
||||||
of_property_read_u32(node, "poll-interval", &pdata->poll_interval);
|
of_property_read_u32(node, "poll-interval", &pdata->poll_interval);
|
||||||
|
|
||||||
for_each_available_child_of_node(node, pp) {
|
for_each_available_child_of_node_scoped(node, pp) {
|
||||||
button = (struct gpio_keys_button *)(&pdata->buttons[i++]);
|
struct gpio_keys_button *button = (struct gpio_keys_button *)&pdata->buttons[i++];
|
||||||
|
|
||||||
if (of_property_read_u32(pp, "linux,code", &button->code)) {
|
if (of_property_read_u32(pp, "linux,code", &button->code)) {
|
||||||
dev_err(dev, "Button node '%s' without keycode\n",
|
dev_err(dev, "Button node '%s' without keycode\n",
|
||||||
pp->full_name);
|
pp->full_name);
|
||||||
of_node_put(pp);
|
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -403,7 +399,7 @@ gpio_keys_get_devtree_pdata(struct device *dev)
|
||||||
if (of_property_read_u32(pp, "linux,input-type", &button->type))
|
if (of_property_read_u32(pp, "linux,input-type", &button->type))
|
||||||
button->type = EV_KEY;
|
button->type = EV_KEY;
|
||||||
|
|
||||||
button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL);
|
button->wakeup = of_property_present(pp, "gpio-key,wakeup");
|
||||||
|
|
||||||
if (of_property_read_u32(pp, "debounce-interval",
|
if (of_property_read_u32(pp, "debounce-interval",
|
||||||
&button->debounce_interval))
|
&button->debounce_interval))
|
||||||
|
|
@ -470,9 +466,7 @@ static int gpio_keys_button_probe(struct platform_device *pdev,
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdev = devm_kzalloc(dev, sizeof(struct gpio_keys_button_dev) +
|
bdev = devm_kzalloc(dev, struct_size(bdev, data, pdata->nbuttons), GFP_KERNEL);
|
||||||
pdata->nbuttons * sizeof(struct gpio_keys_button_data),
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (!bdev) {
|
if (!bdev) {
|
||||||
dev_err(dev, "no memory for private data\n");
|
dev_err(dev, "no memory for private data\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue