IIO Device drivers This is not intended to provide a comprehensive guide to writing an IIO device driver. For further information see the drivers within the subsystem. The crucial structure for device drivers in iio is iio_dev. First allocate one using: struct iio_dev *indio_dev = iio_allocate_device(sizeof(struct chip_state)); where chip_state is a structure of local state data for this instance of the chip. That data can be accessed using iio_priv(struct iio_dev *) Then fill in the following: - indio_dev->dev.parent Struct device associated with the underlying hardware. - indio_dev->name Name of the device being driven - made available as the name attribute in sysfs. - indio_dev->info pointer to a structure with elements that tend to be fixed for large sets of different parts supported by a given driver. This contains: * info->driver_module: Set to THIS_MODULE. Used to ensure correct ownership of various resources allocate by the core. * info->num_interrupt_lines: Number of event triggering hardware lines the device has. * info->event_attrs: Attributes used to enable / disable hardware events. * info->attrs: General device attributes. Typically used for the weird and the wonderful bits not covered by the channel specification. * info->read_raw: Raw data reading function. Used for both raw channel access and for associate parameters such as offsets and scales. * info->write_raw: Raw value writing function. Used for writable device values such as DAC values and caliboffset. * info->read_event_config: Typically only set if there are some interrupt lines. This is used to read if an on sensor event detector is enabled. * info->write_event_config: Enable / disable an on sensor event detector. * info->read_event_value: Read value associated with on sensor event detectors. Note that the meaning of the returned value is dependent on the event type. * info->write_event_value: Write the value associated with on sensor event detectors. E.g. a threshold above which an interrupt occurs. Note that the meaning of the value to be set is event type dependant. - indio_dev->modes: Specify whether direct access and / or ring buffer access is supported. - indio_dev->ring: An optional associated buffer. - indio_dev->pollfunc: Poll function related elements. This controls what occurs when a trigger to which this device is attached sends and event. - indio_dev->channels: Specification of device channels. Most attributes etc are built form this spec. - indio_dev->num_channels: How many channels are there? Once these are set up, a call to iio_device_register(indio_dev), will register the device with the iio core. Worth noting here is that, if a ring buffer is to be used, it can be allocated prior to registering the device with the iio-core, but must be registered afterwards (otherwise the whole parentage of devices gets confused) On remove, iio_device_unregister(indio_dev) will remove the device from the core, and iio_free_device will clean up.