Update source to Armbian-dev-202610.A311Y3
This commit is contained in:
@@ -72,6 +72,11 @@ static ssize_t direction_show(struct device *dev,
|
||||
struct gpio_desc *desc = data->desc;
|
||||
ssize_t status;
|
||||
|
||||
if (!data->desc)
|
||||
return -EINVAL;
|
||||
|
||||
desc = data->desc;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
|
||||
gpiod_get_direction(desc);
|
||||
@@ -129,15 +134,20 @@ static ssize_t value_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf, size_t size)
|
||||
{
|
||||
struct gpiod_data *data = dev_get_drvdata(dev);
|
||||
struct gpio_desc *desc = data->desc;
|
||||
struct gpio_desc *desc;
|
||||
ssize_t status = 0;
|
||||
|
||||
if (!data->desc)
|
||||
return -EINVAL;
|
||||
|
||||
desc = data->desc;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
|
||||
if (!test_bit(FLAG_IS_OUT, &desc->flags)) {
|
||||
status = -EPERM;
|
||||
} else {
|
||||
long value;
|
||||
long value = 0;
|
||||
|
||||
if (size <= 2 && isdigit(buf[0]) &&
|
||||
(size == 1 || buf[1] == '\n'))
|
||||
@@ -169,10 +179,18 @@ static irqreturn_t gpio_sysfs_irq(int irq, void *priv)
|
||||
static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags)
|
||||
{
|
||||
struct gpiod_data *data = dev_get_drvdata(dev);
|
||||
struct gpio_desc *desc = data->desc;
|
||||
struct gpio_desc *desc;
|
||||
unsigned long irq_flags;
|
||||
int ret;
|
||||
|
||||
if (!data->desc)
|
||||
return -EINVAL;
|
||||
|
||||
desc = data->desc;
|
||||
|
||||
if (!desc->gdev || !desc->gdev->chip)
|
||||
return -ENODEV;
|
||||
|
||||
data->irq = gpiod_to_irq(desc);
|
||||
if (data->irq < 0)
|
||||
return -EIO;
|
||||
@@ -225,7 +243,14 @@ err_put_kn:
|
||||
static void gpio_sysfs_free_irq(struct device *dev)
|
||||
{
|
||||
struct gpiod_data *data = dev_get_drvdata(dev);
|
||||
struct gpio_desc *desc = data->desc;
|
||||
struct gpio_desc *desc;
|
||||
|
||||
if (!data->desc)
|
||||
return;
|
||||
|
||||
desc = data->desc;
|
||||
if (!desc->gdev || !desc->gdev->chip)
|
||||
return;
|
||||
|
||||
data->irq_flags = 0;
|
||||
free_irq(data->irq, data);
|
||||
@@ -309,10 +334,15 @@ static DEVICE_ATTR_RW(edge);
|
||||
static int gpio_sysfs_set_active_low(struct device *dev, int value)
|
||||
{
|
||||
struct gpiod_data *data = dev_get_drvdata(dev);
|
||||
struct gpio_desc *desc = data->desc;
|
||||
struct gpio_desc *desc;
|
||||
int status = 0;
|
||||
unsigned int flags = data->irq_flags;
|
||||
|
||||
if (!data->desc)
|
||||
return -EINVAL;
|
||||
|
||||
desc = data->desc;
|
||||
|
||||
if (!!test_bit(FLAG_ACTIVE_LOW, &desc->flags) == !!value)
|
||||
return 0;
|
||||
|
||||
@@ -332,9 +362,14 @@ static ssize_t active_low_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct gpiod_data *data = dev_get_drvdata(dev);
|
||||
struct gpio_desc *desc = data->desc;
|
||||
struct gpio_desc *desc;
|
||||
ssize_t status;
|
||||
|
||||
if (!data->desc)
|
||||
return -EINVAL;
|
||||
|
||||
desc = data->desc;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
|
||||
status = sysfs_emit(buf, "%d\n",
|
||||
@@ -350,7 +385,7 @@ static ssize_t active_low_store(struct device *dev,
|
||||
{
|
||||
struct gpiod_data *data = dev_get_drvdata(dev);
|
||||
ssize_t status;
|
||||
long value;
|
||||
long value = 0;
|
||||
|
||||
mutex_lock(&data->mutex);
|
||||
|
||||
@@ -369,10 +404,15 @@ static umode_t gpio_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct gpiod_data *data = dev_get_drvdata(dev);
|
||||
struct gpio_desc *desc = data->desc;
|
||||
struct gpio_desc *desc;
|
||||
umode_t mode = attr->mode;
|
||||
bool show_direction = data->direction_can_change;
|
||||
|
||||
if (!data->desc)
|
||||
return 0;
|
||||
|
||||
desc = data->desc;
|
||||
|
||||
if (attr == &dev_attr_direction.attr) {
|
||||
if (!show_direction)
|
||||
mode = 0;
|
||||
@@ -456,7 +496,7 @@ static ssize_t export_store(const struct class *class,
|
||||
const struct class_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
long gpio;
|
||||
long gpio = 0;
|
||||
struct gpio_desc *desc;
|
||||
int status;
|
||||
struct gpio_chip *gc;
|
||||
@@ -468,7 +508,7 @@ static ssize_t export_store(const struct class *class,
|
||||
|
||||
desc = gpio_to_desc(gpio);
|
||||
/* reject invalid GPIOs */
|
||||
if (!desc) {
|
||||
if (!desc || !desc->gdev || !desc->gdev->chip) {
|
||||
pr_warn("%s: invalid GPIO %ld\n", __func__, gpio);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -508,7 +548,7 @@ static ssize_t unexport_store(const struct class *class,
|
||||
const struct class_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
long gpio;
|
||||
long gpio = 0;
|
||||
struct gpio_desc *desc;
|
||||
int status;
|
||||
|
||||
@@ -590,6 +630,9 @@ static int gpiod_sysfs_export(struct gpio_desc *desc, bool direction_may_change)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!desc->gdev || !desc->gdev->chip)
|
||||
return -EINVAL;
|
||||
|
||||
gdev = desc->gdev;
|
||||
chip = gdev->chip;
|
||||
|
||||
@@ -714,7 +757,7 @@ int gpiochip_sysfs_register(struct gpio_device *gdev)
|
||||
* register later, in gpiolib_sysfs_init() ... here we just
|
||||
* verify that _some_ field of gpio_class got initialized.
|
||||
*/
|
||||
if (!class_is_registered(&gpio_class))
|
||||
if (!class_is_registered(&gpio_class) || !chip)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
@@ -747,7 +790,7 @@ static void __maybe_unused gpiochip_sysfs_unregister(struct gpio_device *gdev)
|
||||
struct gpio_chip *chip = gdev->chip;
|
||||
unsigned int i;
|
||||
|
||||
if (!gdev->mockdev)
|
||||
if (!gdev->mockdev || !gdev->descs || !chip)
|
||||
return;
|
||||
|
||||
device_unregister(gdev->mockdev);
|
||||
|
||||
Reference in New Issue
Block a user