at v5.8 63 lines 1.7 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Device property helpers for GPIO chips. 4 * 5 * Copyright (C) 2016, Intel Corporation 6 * Author: Mika Westerberg <mika.westerberg@linux.intel.com> 7 */ 8 9#include <linux/property.h> 10#include <linux/slab.h> 11#include <linux/gpio/consumer.h> 12#include <linux/gpio/driver.h> 13#include <linux/export.h> 14 15#include "gpiolib.h" 16 17/** 18 * devprop_gpiochip_set_names - Set GPIO line names using device properties 19 * @chip: GPIO chip whose lines should be named, if possible 20 * @fwnode: Property Node containing the gpio-line-names property 21 * 22 * Looks for device property "gpio-line-names" and if it exists assigns 23 * GPIO line names for the chip. The memory allocated for the assigned 24 * names belong to the underlying firmware node and should not be released 25 * by the caller. 26 */ 27void devprop_gpiochip_set_names(struct gpio_chip *chip, 28 const struct fwnode_handle *fwnode) 29{ 30 struct gpio_device *gdev = chip->gpiodev; 31 const char **names; 32 int ret, i; 33 int count; 34 35 count = fwnode_property_read_string_array(fwnode, "gpio-line-names", 36 NULL, 0); 37 if (count < 0) 38 return; 39 40 if (count > gdev->ngpio) { 41 dev_warn(&gdev->dev, "gpio-line-names is length %d but should be at most length %d", 42 count, gdev->ngpio); 43 count = gdev->ngpio; 44 } 45 46 names = kcalloc(count, sizeof(*names), GFP_KERNEL); 47 if (!names) 48 return; 49 50 ret = fwnode_property_read_string_array(fwnode, "gpio-line-names", 51 names, count); 52 if (ret < 0) { 53 dev_warn(&gdev->dev, "failed to read GPIO line names\n"); 54 kfree(names); 55 return; 56 } 57 58 for (i = 0; i < count; i++) 59 gdev->descs[i].name = names[i]; 60 61 kfree(names); 62} 63EXPORT_SYMBOL_GPL(devprop_gpiochip_set_names);