Eu estava sem dados da plataforma para este dispositivo.
Consegui que funcionasse inserindo os dados da plataforma diretamente no código do módulo do driver:
static uint32_t tca8418_km_data[] = {
KEY(0, 0, KEY_F1),
KEY(0, 1, KEY_F2),
KEY(0, 2, KEY_F3),
...
};
static const struct matrix_keymap_data tca8418_mk_data = {
.keymap = tca8418_km_data,
.keymap_size = ARRAY_SIZE(tca8418_km_data),
};
static struct tca8418_keypad_platform_data my_tca8418_plat_data = {
.keymap_data = &tca8418_mk_data,
.rows = 6,
.cols = 8,
.rep = 1,
.irq_is_gpio = 1,
};
static struct i2c_board_info tca8418_board_info __initdata = {
I2C_BOARD_INFO("tca8418_keypad", 0x34),
.platform_data = &my_tca8418_plat_data,
.irq = 16, // GPIO pin 16
};
Em seguida, adicione isso à função __init:
static int __init tca8418_keypad_init(void)
{
struct i2c_adapter *i2c_adap;
i2c_adap = i2c_get_adapter(1);
i2c_new_device(i2c_adap, &tca8418_board_info);
...
}
Esta não é a mais elegante das correções, mas funcionou para mim. Eu preferia uma solução de espaço de usuário, mas não consegui encontrar uma.