1*4619b6b9SAndré Apitzsch // SPDX-License-Identifier: GPL-2.0-only 2*4619b6b9SAndré Apitzsch /* 3*4619b6b9SAndré Apitzsch * Copyright (c) 2025 André Apitzsch <git@apitzsch.eu> 4*4619b6b9SAndré Apitzsch */ 5*4619b6b9SAndré Apitzsch 6*4619b6b9SAndré Apitzsch #include <linux/input.h> 7*4619b6b9SAndré Apitzsch #include <linux/property.h> 8*4619b6b9SAndré Apitzsch #include "rmi_driver.h" 9*4619b6b9SAndré Apitzsch 10*4619b6b9SAndré Apitzsch struct f1a_data { 11*4619b6b9SAndré Apitzsch struct input_dev *input; 12*4619b6b9SAndré Apitzsch 13*4619b6b9SAndré Apitzsch u32 *keymap; 14*4619b6b9SAndré Apitzsch unsigned int num_keys; 15*4619b6b9SAndré Apitzsch }; 16*4619b6b9SAndré Apitzsch 17*4619b6b9SAndré Apitzsch static int rmi_f1a_parse_device_properties(struct rmi_function *fn, struct f1a_data *f1a) 18*4619b6b9SAndré Apitzsch { 19*4619b6b9SAndré Apitzsch static const char buttons_property[] = "linux,keycodes"; 20*4619b6b9SAndré Apitzsch struct device *dev = &fn->dev; 21*4619b6b9SAndré Apitzsch u32 *buttonmap; 22*4619b6b9SAndré Apitzsch int n_keys; 23*4619b6b9SAndré Apitzsch int error; 24*4619b6b9SAndré Apitzsch 25*4619b6b9SAndré Apitzsch if (!device_property_present(dev, buttons_property)) 26*4619b6b9SAndré Apitzsch return 0; 27*4619b6b9SAndré Apitzsch 28*4619b6b9SAndré Apitzsch n_keys = device_property_count_u32(dev, buttons_property); 29*4619b6b9SAndré Apitzsch if (n_keys <= 0) { 30*4619b6b9SAndré Apitzsch error = n_keys < 0 ? n_keys : -EINVAL; 31*4619b6b9SAndré Apitzsch dev_err(dev, "Invalid/malformed '%s' property: %d\n", 32*4619b6b9SAndré Apitzsch buttons_property, error); 33*4619b6b9SAndré Apitzsch return error; 34*4619b6b9SAndré Apitzsch } 35*4619b6b9SAndré Apitzsch 36*4619b6b9SAndré Apitzsch buttonmap = devm_kmalloc_array(dev, n_keys, sizeof(*buttonmap), 37*4619b6b9SAndré Apitzsch GFP_KERNEL); 38*4619b6b9SAndré Apitzsch if (!buttonmap) 39*4619b6b9SAndré Apitzsch return -ENOMEM; 40*4619b6b9SAndré Apitzsch 41*4619b6b9SAndré Apitzsch error = device_property_read_u32_array(dev, buttons_property, 42*4619b6b9SAndré Apitzsch buttonmap, n_keys); 43*4619b6b9SAndré Apitzsch if (error) { 44*4619b6b9SAndré Apitzsch dev_err(dev, "Failed to parse '%s' property: %d\n", 45*4619b6b9SAndré Apitzsch buttons_property, error); 46*4619b6b9SAndré Apitzsch return error; 47*4619b6b9SAndré Apitzsch } 48*4619b6b9SAndré Apitzsch 49*4619b6b9SAndré Apitzsch f1a->keymap = buttonmap; 50*4619b6b9SAndré Apitzsch f1a->num_keys = n_keys; 51*4619b6b9SAndré Apitzsch 52*4619b6b9SAndré Apitzsch return 0; 53*4619b6b9SAndré Apitzsch } 54*4619b6b9SAndré Apitzsch 55*4619b6b9SAndré Apitzsch static irqreturn_t rmi_f1a_attention(int irq, void *ctx) 56*4619b6b9SAndré Apitzsch { 57*4619b6b9SAndré Apitzsch struct rmi_function *fn = ctx; 58*4619b6b9SAndré Apitzsch struct f1a_data *f1a = dev_get_drvdata(&fn->dev); 59*4619b6b9SAndré Apitzsch char button_bitmask; 60*4619b6b9SAndré Apitzsch int key; 61*4619b6b9SAndré Apitzsch int error; 62*4619b6b9SAndré Apitzsch 63*4619b6b9SAndré Apitzsch error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr, 64*4619b6b9SAndré Apitzsch &button_bitmask, sizeof(button_bitmask)); 65*4619b6b9SAndré Apitzsch if (error) { 66*4619b6b9SAndré Apitzsch dev_err(&fn->dev, "Failed to read object data. Code: %d.\n", 67*4619b6b9SAndré Apitzsch error); 68*4619b6b9SAndré Apitzsch return IRQ_RETVAL(error); 69*4619b6b9SAndré Apitzsch } 70*4619b6b9SAndré Apitzsch 71*4619b6b9SAndré Apitzsch for (key = 0; key < f1a->num_keys; key++) 72*4619b6b9SAndré Apitzsch input_report_key(f1a->input, f1a->keymap[key], 73*4619b6b9SAndré Apitzsch button_bitmask & BIT(key)); 74*4619b6b9SAndré Apitzsch 75*4619b6b9SAndré Apitzsch return IRQ_HANDLED; 76*4619b6b9SAndré Apitzsch } 77*4619b6b9SAndré Apitzsch 78*4619b6b9SAndré Apitzsch static int rmi_f1a_config(struct rmi_function *fn) 79*4619b6b9SAndré Apitzsch { 80*4619b6b9SAndré Apitzsch struct f1a_data *f1a = dev_get_drvdata(&fn->dev); 81*4619b6b9SAndré Apitzsch struct rmi_driver *drv = fn->rmi_dev->driver; 82*4619b6b9SAndré Apitzsch 83*4619b6b9SAndré Apitzsch if (f1a->num_keys) 84*4619b6b9SAndré Apitzsch drv->set_irq_bits(fn->rmi_dev, fn->irq_mask); 85*4619b6b9SAndré Apitzsch 86*4619b6b9SAndré Apitzsch return 0; 87*4619b6b9SAndré Apitzsch } 88*4619b6b9SAndré Apitzsch 89*4619b6b9SAndré Apitzsch static int rmi_f1a_initialize(struct rmi_function *fn, struct f1a_data *f1a) 90*4619b6b9SAndré Apitzsch { 91*4619b6b9SAndré Apitzsch int error; 92*4619b6b9SAndré Apitzsch int i; 93*4619b6b9SAndré Apitzsch 94*4619b6b9SAndré Apitzsch error = rmi_f1a_parse_device_properties(fn, f1a); 95*4619b6b9SAndré Apitzsch if (error) 96*4619b6b9SAndré Apitzsch return error; 97*4619b6b9SAndré Apitzsch 98*4619b6b9SAndré Apitzsch for (i = 0; i < f1a->num_keys; i++) 99*4619b6b9SAndré Apitzsch input_set_capability(f1a->input, EV_KEY, f1a->keymap[i]); 100*4619b6b9SAndré Apitzsch 101*4619b6b9SAndré Apitzsch f1a->input->keycode = f1a->keymap; 102*4619b6b9SAndré Apitzsch f1a->input->keycodemax = f1a->num_keys; 103*4619b6b9SAndré Apitzsch f1a->input->keycodesize = sizeof(f1a->keymap[0]); 104*4619b6b9SAndré Apitzsch 105*4619b6b9SAndré Apitzsch return 0; 106*4619b6b9SAndré Apitzsch } 107*4619b6b9SAndré Apitzsch 108*4619b6b9SAndré Apitzsch static int rmi_f1a_probe(struct rmi_function *fn) 109*4619b6b9SAndré Apitzsch { 110*4619b6b9SAndré Apitzsch struct rmi_device *rmi_dev = fn->rmi_dev; 111*4619b6b9SAndré Apitzsch struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); 112*4619b6b9SAndré Apitzsch struct f1a_data *f1a; 113*4619b6b9SAndré Apitzsch int error; 114*4619b6b9SAndré Apitzsch 115*4619b6b9SAndré Apitzsch if (!drv_data->input) { 116*4619b6b9SAndré Apitzsch dev_info(&fn->dev, "F1A: no input device found, ignoring\n"); 117*4619b6b9SAndré Apitzsch return -ENXIO; 118*4619b6b9SAndré Apitzsch } 119*4619b6b9SAndré Apitzsch 120*4619b6b9SAndré Apitzsch f1a = devm_kzalloc(&fn->dev, sizeof(*f1a), GFP_KERNEL); 121*4619b6b9SAndré Apitzsch if (!f1a) 122*4619b6b9SAndré Apitzsch return -ENOMEM; 123*4619b6b9SAndré Apitzsch 124*4619b6b9SAndré Apitzsch f1a->input = drv_data->input; 125*4619b6b9SAndré Apitzsch 126*4619b6b9SAndré Apitzsch error = rmi_f1a_initialize(fn, f1a); 127*4619b6b9SAndré Apitzsch if (error) 128*4619b6b9SAndré Apitzsch return error; 129*4619b6b9SAndré Apitzsch 130*4619b6b9SAndré Apitzsch dev_set_drvdata(&fn->dev, f1a); 131*4619b6b9SAndré Apitzsch 132*4619b6b9SAndré Apitzsch return 0; 133*4619b6b9SAndré Apitzsch } 134*4619b6b9SAndré Apitzsch 135*4619b6b9SAndré Apitzsch struct rmi_function_handler rmi_f1a_handler = { 136*4619b6b9SAndré Apitzsch .driver = { 137*4619b6b9SAndré Apitzsch .name = "rmi4_f1a", 138*4619b6b9SAndré Apitzsch }, 139*4619b6b9SAndré Apitzsch .func = 0x1a, 140*4619b6b9SAndré Apitzsch .probe = rmi_f1a_probe, 141*4619b6b9SAndré Apitzsch .config = rmi_f1a_config, 142*4619b6b9SAndré Apitzsch .attention = rmi_f1a_attention, 143*4619b6b9SAndré Apitzsch }; 144