1debee64aSJoseph Chen /* 2debee64aSJoseph Chen * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3debee64aSJoseph Chen * 4debee64aSJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 5debee64aSJoseph Chen */ 6debee64aSJoseph Chen 7debee64aSJoseph Chen #include <common.h> 8debee64aSJoseph Chen #include <dm.h> 9debee64aSJoseph Chen #include <key.h> 10debee64aSJoseph Chen 11*5a54baa7SJoseph Chen static int rk_key_ofdata_to_platdata(struct udevice *dev) 12debee64aSJoseph Chen { 13*5a54baa7SJoseph Chen struct dm_key_uclass_platdata *uc_key; 14*5a54baa7SJoseph Chen u32 chn[2]; 15debee64aSJoseph Chen 16*5a54baa7SJoseph Chen uc_key = dev_get_uclass_platdata(dev); 17*5a54baa7SJoseph Chen if (!uc_key) 18*5a54baa7SJoseph Chen return -ENXIO; 19debee64aSJoseph Chen 20*5a54baa7SJoseph Chen uc_key->name = dev_read_string(dev, "label"); 21*5a54baa7SJoseph Chen uc_key->code = dev_read_u32_default(dev, "linux,code", -ENODATA); 22debee64aSJoseph Chen 23*5a54baa7SJoseph Chen if (dev_read_u32_array(dev_get_parent(dev), "io-channels", chn, 2)) { 24*5a54baa7SJoseph Chen printf("%s: read 'io-channels' failed\n", uc_key->name); 25debee64aSJoseph Chen return -EINVAL; 26debee64aSJoseph Chen } 27debee64aSJoseph Chen 28*5a54baa7SJoseph Chen if (dev_read_bool(dev, "rockchip,adc_value")) { 29*5a54baa7SJoseph Chen uc_key->type = ADC_KEY; 30*5a54baa7SJoseph Chen uc_key->channel = chn[1]; 31*5a54baa7SJoseph Chen uc_key->adcval = 32*5a54baa7SJoseph Chen dev_read_u32_default(dev, "rockchip,adc_value", 0); 33debee64aSJoseph Chen } else { 34*5a54baa7SJoseph Chen uc_key->type = GPIO_KEY; 35*5a54baa7SJoseph Chen if (dev_read_u32_array(dev, "gpios", 36*5a54baa7SJoseph Chen uc_key->gpios, 37*5a54baa7SJoseph Chen ARRAY_SIZE(uc_key->gpios))) { 38*5a54baa7SJoseph Chen printf("%s: read 'gpios' failed\n", uc_key->name); 39*5a54baa7SJoseph Chen return -EINVAL; 40debee64aSJoseph Chen } 41debee64aSJoseph Chen } 42debee64aSJoseph Chen 43debee64aSJoseph Chen return 0; 44debee64aSJoseph Chen } 45debee64aSJoseph Chen 46*5a54baa7SJoseph Chen U_BOOT_DRIVER(rk_key) = { 47*5a54baa7SJoseph Chen .name = "rk_key", 48*5a54baa7SJoseph Chen .id = UCLASS_KEY, 49*5a54baa7SJoseph Chen .ofdata_to_platdata = rk_key_ofdata_to_platdata, 50debee64aSJoseph Chen }; 51debee64aSJoseph Chen 52*5a54baa7SJoseph Chen /* Key Bus */ 53*5a54baa7SJoseph Chen static int rk_key_bus_bind(struct udevice *dev) 54*5a54baa7SJoseph Chen { 55*5a54baa7SJoseph Chen return key_bind_children(dev, "rk_key"); 56*5a54baa7SJoseph Chen } 57*5a54baa7SJoseph Chen 58*5a54baa7SJoseph Chen static const struct udevice_id rk_key_bus_match[] = { 59debee64aSJoseph Chen { .compatible = "rockchip,key" }, 60debee64aSJoseph Chen { }, 61debee64aSJoseph Chen }; 62debee64aSJoseph Chen 63*5a54baa7SJoseph Chen U_BOOT_DRIVER(rk_key_bus) = { 64*5a54baa7SJoseph Chen .name = "rk_key_bus", 65*5a54baa7SJoseph Chen .id = UCLASS_SIMPLE_BUS, 66*5a54baa7SJoseph Chen .of_match = rk_key_bus_match, 67*5a54baa7SJoseph Chen .bind = rk_key_bus_bind, 68debee64aSJoseph Chen }; 69