2011/8/9 Mark Brown broonie@opensource.wolfsonmicro.com:
On Mon, Aug 08, 2011 at 11:51:00PM -0700, Dmitry Torokhov wrote:
The issue I have with the ads7846 driver is that it still needs platform code to supply the needed platform data structure to make the driver/device usable. So I am not sure what the benefit DT matching code brings to that driver.
Oh, if that's the case the driver ought to have device tree bindings which replicate the platform data. Unless the platform data is sufficiently obscure for hardly anyone to want to use it I guess.
With the device tree binding in ads7846, we don't need spi_board_info any more since we have ts@0 { compatible = "ti,ads7845"; reg = <0x0>; spi-max-frequency = <31250>; interrupts = <90>; }; in dts.
I guess what Dmitry said is the big ads7846_platform_data structure.
struct ads7846_platform_data { u16 model; /* 7843, 7845, 7846, 7873. */ u16 vref_delay_usecs; /* 0 for external vref; etc */ u16 vref_mv; /* external vref value, milliVolts * ads7846: if 0, use internal vref */ bool keep_vref_on; /* set to keep vref on for differential * measurements as well */ bool swap_xy; /* swap x and y axes */
/* Settling time of the analog signals; a function of Vcc and the * capacitance on the X/Y drivers. If set to non-zero, two samples * are taken with settle_delay us apart, and the second one is used. * ~150 uSec with 0.01uF caps. */ u16 settle_delay_usecs;
/* If set to non-zero, after samples are taken this delay is applied * and penirq is rechecked, to help avoid false events. This value * is affected by the material used to build the touch layer. */ u16 penirq_recheck_delay_usecs;
u16 x_plate_ohms; u16 y_plate_ohms;
u16 x_min, x_max; u16 y_min, y_max; u16 pressure_min, pressure_max;
u16 debounce_max; /* max number of additional readings * per sample */ u16 debounce_tol; /* tolerance used for filtering */ u16 debounce_rep; /* additional consecutive good readings * required after the first two */ int gpio_pendown; /* the GPIO used to decide the pendown * state if get_pendown_state == NULL */ int (*get_pendown_state)(void); int (*filter_init) (const struct ads7846_platform_data *pdata, void **filter_data); int (*filter) (void *filter_data, int data_idx, int *val); void (*filter_cleanup)(void *filter_data); void (*wait_for_sync)(void); bool wakeup; unsigned long irq_flags; };
The structure even has some callbacks which can't be possible in dts.