ADT7516 센서의 DT 바인딩

ADT7516 센서의 DT 바인딩

저는 BeagleBone green과 ADT7516용 평가 보드를 SDA 및 SCL 핀에 연결했습니다.

i2cDetect -y -r 2를 수행하면 i2c 주소가 0x4b임을 확인할 수 있고 IIO 하위 시스템에서 adt7316 드라이버의 존재를 감지할 수 있습니다.

adt7316 드라이버는 플랫폼 데이터를 사용하여 하드웨어 설명을 얻습니다. 하지만 내 목표는 플랫폼 데이터를 제거하고 DT 바인딩을 사용하는 것입니다.

나는 다음과 같은 DT 바인딩에 대한 몇 가지 기본 지식을 이해합니다.

  1. 호환 가능
  2. 등록하다

그런데 드라이버를 자세히 보면 플랫폼 데이터에서 가져와 드라이버 전반에 걸쳐 사용하는 것들이 있다는 것을 알 수 있습니다.

따라서 제 질문은 플랫폼 데이터를 제거하고 DT 바인딩을 사용하는 경우 드라이버에서 이를 어떻게 교체합니까?입니다.

여기에 프로브 기능에 대한 코드를 넣겠습니다.

int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
    const char *name)
{
struct adt7316_chip_info *chip;
struct iio_dev *indio_dev;
unsigned short *adt7316_platform_data = dev->platform_data;
int ret = 0;

indio_dev = devm_iio_device_alloc(dev, sizeof(*chip));
if (!indio_dev)
    return -ENOMEM;
chip = iio_priv(indio_dev);
/* this is only used for device removal purposes */
dev_set_drvdata(dev, indio_dev);

chip->bus = *bus;

if (name[4] == '3')
    chip->id = ID_ADT7316 + (name[6] - '6');
else if (name[4] == '5')
    chip->id = ID_ADT7516 + (name[6] - '6');
else
    return -ENODEV;

chip->ldac_pin = adt7316_platform_data[1];
if (chip->ldac_pin) {
    chip->config3 |= ADT7316_DA_EN_VIA_DAC_LDCA;
    if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
        chip->config1 |= ADT7516_SEL_AIN3;
}
chip->int_mask = ADT7316_TEMP_INT_MASK | ADT7316_VDD_INT_MASK;
if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
    chip->int_mask |= ADT7516_AIN_INT_MASK;

indio_dev->dev.parent = dev;
if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
    indio_dev->info = &adt7516_info;
else
    indio_dev->info = &adt7316_info;
indio_dev->name = name;
indio_dev->modes = INDIO_DIRECT_MODE;

if (chip->bus.irq > 0) {
    if (adt7316_platform_data[0])
        chip->bus.irq_flags = adt7316_platform_data[0];

    ret = devm_request_threaded_irq(dev, chip->bus.irq,
                    NULL,
                    adt7316_event_handler,
                    chip->bus.irq_flags |
                    IRQF_ONESHOT,
                    indio_dev->name,
                    indio_dev);
    if (ret)
        return ret;

    if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH)
        chip->config1 |= ADT7316_INT_POLARITY;
}

ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, chip->config1);
if (ret)
    return -EIO;

ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, chip->config3);
if (ret)
    return -EIO;

ret = devm_iio_device_register(dev, indio_dev);
if (ret)
    return ret;

dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n",
        indio_dev->name);

return 0;
}
EXPORT_SYMBOL(adt7316_probe);

코드에서 우리는 볼 수 있습니다칩->ldac_pin그리고칩->Bus.irq_flags플랫폼 데이터를 사용하세요. DT 바인딩을 사용하면 플랫폼 데이터에 NULL 값이 포함됩니다.

그렇다면 여기에서 DT 바인딩을 어떻게 디자인하고 드라이버에서 이 데이터를 어떻게 얻을 수 있습니까?

DT 바인딩의 많은 예를 보았지만 adt7516 센서에 대한 구체적인 도움이 필요합니다.

adt7516 센서 데이터시트

http://www.analog.com/media/en/technical-documentation/data-sheets/ADT7516_7517_7519.pdf

관련 정보