页次: 1
我在全志T113s3上移植ili9341的时候,遇到了Failed to request reset-gpios GPIO:-2驱动报错
然后通过分析发现是fbtft_request_one_gpio这个函数报错
5.x以上该函数原型
static int fbtft_request_one_gpio(struct fbtft_par *par,
const char *name, int index,
struct gpio_desc **gpiop)
{
struct device *dev = par->info->device;
*gpiop = devm_gpiod_get_index_optional(dev, name, index,
GPIOD_OUT_LOW);
if (IS_ERR(*gpiop))
return dev_err_probe(dev, PTR_ERR(*gpiop), "Failed to request %s GPIO\n", name);
fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' GPIO\n",
__func__, name);
return 0;
}
4.x及以下函数原型
static int fbtft_request_one_gpio(struct fbtft_par *par,
const char *name, int index,
struct gpio_desc **gpiop)
{
struct device *dev = par->info->device;
struct device_node *node = dev->of_node;
int gpio, flags, ret = 0;
enum of_gpio_flags of_flags;
char gpio_names[32];
sprintf(gpio_names, "%s-gpios", name);
if (of_find_property(node, gpio_names, NULL)) {
gpio = of_get_named_gpio_flags(node, gpio_names, index, &of_flags);
if (gpio == -ENOENT)
return 0;
if (gpio == -EPROBE_DEFER)
return gpio;
if (gpio < 0) {
dev_err(dev,
"failed to get '%s' from DT\n", gpio_names);
return gpio;
}
//active low translates to initially low
flags = (of_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW :
GPIOF_OUT_INIT_HIGH;
ret = devm_gpio_request_one(dev, gpio, flags,
dev->driver->name);
if (ret) {
dev_err(dev,
"gpio_request_one('%s'=%d) failed with %d\n",
gpio_names, gpio, ret);
return ret;
}
*gpiop = gpio_to_desc(gpio);
fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' = GPIO%d\n",
__func__, gpio_names, gpio);
}
return ret;
}
对比了一下发现是高版本的Linux使用了最新的 GPIO 消费者 API 规范中的devm_gpiod_get_index_optional,将其修改为老版本的函数就不会报错
但是我有一些问题,全志T113 BSP中的内核是5.4的,是全志BSP中没有对这些新的消费者 API 规范进行完善吗?如果使用新版主线的话,这些函数还能使用吗?
本人小白一个,希望大佬们能给一些见解
页次: 1