Драйвер ядра, всегда ли требуется свойство pinctrl при использовании наложения GPIO?

Я задал этот вопрос на Unix Stackexchange, но, похоже, это было неподходящее место для такого рода проблем. Объявления:

Я создаю драйвер ядра для дисплея, управляемого SPI, который предназначен для работы с Raspberry PI. Помимо трех линий SPI, дисплей имеет 3 дополнительные линии управления: BUSY, RST и DC. Для того, чтобы иметь возможность управлять этими линиями, мой DTS должен включать дополнительный фрагмент для GPIO.

fragment@0 {
    target = <&spi0>;
    __overlay__ {
        #address-cells = <1>;
        #size-cells = <0>;

        status = "okay";

        spidev@0 {
            status = "disabled";
        };

        epd0: epd@0 {
            compatible = "waveshare,epd";
            reg = <0>;

            pinctrl-names = "default";
            pinctrl-0 = <&epd_pins>;

            spi-max-frequency = <1000000>;

            width = <128>;
            height = <296>;

            dc-gpios = <&gpio 16 0>;
            reset-gpios = <&gpio 20 0>;
            busy-gpios = <&gpio 21 0>;

            status = "okay";
        };
    };
};

fragment@1 {
    target = <&gpio>;
    __overlay__ {
        epd_pins: epd_pins {
            brcm,pins = <16 20 21>; /* DC RST BUSY */
            brcm,function = <1 1 0>; /* out out in */
        };
    };
};

Этот DTS работает отлично, и я не ожидал никаких проблем. Но есть одна вещь, в которой я не уверен:

pinctrl-names = "default";
pinctrl-0 = <&epd_pins>;

Подобные свойства я встречал и у других ДТ с gpio фрагментами, но не всегда; иногда они есть, иногда нет. Если я закомментирую эти две строчки, то вроде ничего не изменится, а мой драйвер все так же работает как надо.

У меня есть два вопроса:

  1. Какова цель этих pinctrl строк? Я знаю о подсистеме контактного контроллера, но спрашиваю строго в контексте моего DT.
  2. Зачем мне объявлять оверлей gpio? В любом случае я устанавливаю функцию IN или OUT непосредственно из кода моего драйвера, и мои номера gpio определены в оверлее spi (dc-gpios, reset-gpios, busy-gpios).

person itachi    schedule 21.12.2018    source источник


Ответы (1)


Чтобы ответить на ваш вопрос (при условии, что вы понимаете функцию строки pinctrl в дереве устройств в целом).

  1. Когда ваше устройство проверяется ядром, если у вас есть эти строки pinctrl в ваших dts, тогда ядро ​​запрашивает подсистему pinctrl для настройки контактов, перечисленных в разделе brcm,pins, как их соответствующие функции, определенные в разделе brcm,function. Состояние pinctrl с именем default запрашивается ядром для автоматической установки. Вы можете определить другие состояния как

    pinctrl-names = "default", "sleep";

    pinctrl-0 = <&spi1_default>;

    pinctrl-1 = <&spi1_sleep>;

    а для других состояний, таких как сон или бездействие, вам придется явно вызывать их, когда драйвер меняет состояние для управления питанием, вызывая функции pinctrl_pm_select_sleep_state или pinctrl_pm_select_idle_state соответственно. Вы можете вызывать эти функции только в том случае, если соответствующие состояния контактов определены в дереве устройств, иначе вам, возможно, придется выполнить настройку вручную, вызвав API-интерфейс pinctrl.

  2. В вашем случае нет необходимости, так как вам сказали, что вы явно устанавливаете режимы контактов и конфигурацию в драйвере устройства, тогда в этом случае для вашего конкретного случая вам могут не понадобиться эти строки в вашем дереве устройств.

person yashC    schedule 24.12.2018
comment
Спасибо! Еще один вопрос к 1-му пункту: что делать, если два или более пин-контроллера используют одни и те же пины? Какой пин-контроллер победитель? Я был бы рад удалить настройки GPIO из кода моего драйвера, но как я могу быть уверен, что мой контактный контроллер в настоящее время действует? - person itachi; 24.12.2018
comment
@itachi, если под двумя или более контроллерами выводов вы подразумеваете объявление pinctrl-x, то тот, который настроен последним, является победителем, то есть тот, кто делает последний вызов для управления выводами, является победителем. - person yashC; 24.12.2018
comment
Не совсем так, я имел в виду ситуацию, когда в DT два разных устройства с пин-контроллерами имеют один или несколько общих пинов. Этого не должно быть, а что если? - person itachi; 24.12.2018
comment
в этом случае устройство, чья функция датчика вызывается последней, является тем устройством, настройка которого применяется к контакту. (конечно, вы можете обойти это в коде инициализации драйвера, но два устройства/драйвера, ожидающие одновременного использования одних и тех же контактов, не являются хорошей идеей) - person yashC; 24.12.2018
comment
Ваш ответ и комментарии очень полезны. Есть ли шанс, что вы знаете расположение кода, который анализирует записи pinctrl в DT и использует их для настройки этих контактов? Я понимаю, что я не обязан делать это в своем коде. - person itachi; 24.12.2018
comment
вы можете найти его под drivers/of. Я не знаю точную часть кода, но она должна быть в этом каталоге. - person yashC; 24.12.2018