cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gpio.c (15810B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * GPIO Greybus driver.
      4 *
      5 * Copyright 2014 Google Inc.
      6 * Copyright 2014 Linaro Ltd.
      7 */
      8
      9#include <linux/kernel.h>
     10#include <linux/module.h>
     11#include <linux/slab.h>
     12#include <linux/irq.h>
     13#include <linux/irqdomain.h>
     14#include <linux/gpio/driver.h>
     15#include <linux/mutex.h>
     16#include <linux/greybus.h>
     17
     18#include "gbphy.h"
     19
     20struct gb_gpio_line {
     21	/* The following has to be an array of line_max entries */
     22	/* --> make them just a flags field */
     23	u8			active:    1,
     24				direction: 1,	/* 0 = output, 1 = input */
     25				value:     1;	/* 0 = low, 1 = high */
     26	u16			debounce_usec;
     27
     28	u8			irq_type;
     29	bool			irq_type_pending;
     30	bool			masked;
     31	bool			masked_pending;
     32};
     33
     34struct gb_gpio_controller {
     35	struct gbphy_device	*gbphy_dev;
     36	struct gb_connection	*connection;
     37	u8			line_max;	/* max line number */
     38	struct gb_gpio_line	*lines;
     39
     40	struct gpio_chip	chip;
     41	struct irq_chip		irqc;
     42	struct mutex		irq_lock;
     43};
     44#define gpio_chip_to_gb_gpio_controller(chip) \
     45	container_of(chip, struct gb_gpio_controller, chip)
     46#define irq_data_to_gpio_chip(d) (d->domain->host_data)
     47
     48static int gb_gpio_line_count_operation(struct gb_gpio_controller *ggc)
     49{
     50	struct gb_gpio_line_count_response response;
     51	int ret;
     52
     53	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_LINE_COUNT,
     54				NULL, 0, &response, sizeof(response));
     55	if (!ret)
     56		ggc->line_max = response.count;
     57	return ret;
     58}
     59
     60static int gb_gpio_activate_operation(struct gb_gpio_controller *ggc, u8 which)
     61{
     62	struct gb_gpio_activate_request request;
     63	struct gbphy_device *gbphy_dev = ggc->gbphy_dev;
     64	int ret;
     65
     66	ret = gbphy_runtime_get_sync(gbphy_dev);
     67	if (ret)
     68		return ret;
     69
     70	request.which = which;
     71	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_ACTIVATE,
     72				&request, sizeof(request), NULL, 0);
     73	if (ret) {
     74		gbphy_runtime_put_autosuspend(gbphy_dev);
     75		return ret;
     76	}
     77
     78	ggc->lines[which].active = true;
     79
     80	return 0;
     81}
     82
     83static void gb_gpio_deactivate_operation(struct gb_gpio_controller *ggc,
     84					 u8 which)
     85{
     86	struct gbphy_device *gbphy_dev = ggc->gbphy_dev;
     87	struct device *dev = &gbphy_dev->dev;
     88	struct gb_gpio_deactivate_request request;
     89	int ret;
     90
     91	request.which = which;
     92	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_DEACTIVATE,
     93				&request, sizeof(request), NULL, 0);
     94	if (ret) {
     95		dev_err(dev, "failed to deactivate gpio %u\n", which);
     96		goto out_pm_put;
     97	}
     98
     99	ggc->lines[which].active = false;
    100
    101out_pm_put:
    102	gbphy_runtime_put_autosuspend(gbphy_dev);
    103}
    104
    105static int gb_gpio_get_direction_operation(struct gb_gpio_controller *ggc,
    106					   u8 which)
    107{
    108	struct device *dev = &ggc->gbphy_dev->dev;
    109	struct gb_gpio_get_direction_request request;
    110	struct gb_gpio_get_direction_response response;
    111	int ret;
    112	u8 direction;
    113
    114	request.which = which;
    115	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_GET_DIRECTION,
    116				&request, sizeof(request),
    117				&response, sizeof(response));
    118	if (ret)
    119		return ret;
    120
    121	direction = response.direction;
    122	if (direction && direction != 1) {
    123		dev_warn(dev, "gpio %u direction was %u (should be 0 or 1)\n",
    124			 which, direction);
    125	}
    126	ggc->lines[which].direction = direction ? 1 : 0;
    127	return 0;
    128}
    129
    130static int gb_gpio_direction_in_operation(struct gb_gpio_controller *ggc,
    131					  u8 which)
    132{
    133	struct gb_gpio_direction_in_request request;
    134	int ret;
    135
    136	request.which = which;
    137	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_DIRECTION_IN,
    138				&request, sizeof(request), NULL, 0);
    139	if (!ret)
    140		ggc->lines[which].direction = 1;
    141	return ret;
    142}
    143
    144static int gb_gpio_direction_out_operation(struct gb_gpio_controller *ggc,
    145					   u8 which, bool value_high)
    146{
    147	struct gb_gpio_direction_out_request request;
    148	int ret;
    149
    150	request.which = which;
    151	request.value = value_high ? 1 : 0;
    152	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_DIRECTION_OUT,
    153				&request, sizeof(request), NULL, 0);
    154	if (!ret)
    155		ggc->lines[which].direction = 0;
    156	return ret;
    157}
    158
    159static int gb_gpio_get_value_operation(struct gb_gpio_controller *ggc,
    160				       u8 which)
    161{
    162	struct device *dev = &ggc->gbphy_dev->dev;
    163	struct gb_gpio_get_value_request request;
    164	struct gb_gpio_get_value_response response;
    165	int ret;
    166	u8 value;
    167
    168	request.which = which;
    169	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_GET_VALUE,
    170				&request, sizeof(request),
    171				&response, sizeof(response));
    172	if (ret) {
    173		dev_err(dev, "failed to get value of gpio %u\n", which);
    174		return ret;
    175	}
    176
    177	value = response.value;
    178	if (value && value != 1) {
    179		dev_warn(dev, "gpio %u value was %u (should be 0 or 1)\n",
    180			 which, value);
    181	}
    182	ggc->lines[which].value = value ? 1 : 0;
    183	return 0;
    184}
    185
    186static void gb_gpio_set_value_operation(struct gb_gpio_controller *ggc,
    187					u8 which, bool value_high)
    188{
    189	struct device *dev = &ggc->gbphy_dev->dev;
    190	struct gb_gpio_set_value_request request;
    191	int ret;
    192
    193	if (ggc->lines[which].direction == 1) {
    194		dev_warn(dev, "refusing to set value of input gpio %u\n",
    195			 which);
    196		return;
    197	}
    198
    199	request.which = which;
    200	request.value = value_high ? 1 : 0;
    201	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_SET_VALUE,
    202				&request, sizeof(request), NULL, 0);
    203	if (ret) {
    204		dev_err(dev, "failed to set value of gpio %u\n", which);
    205		return;
    206	}
    207
    208	ggc->lines[which].value = request.value;
    209}
    210
    211static int gb_gpio_set_debounce_operation(struct gb_gpio_controller *ggc,
    212					  u8 which, u16 debounce_usec)
    213{
    214	struct gb_gpio_set_debounce_request request;
    215	int ret;
    216
    217	request.which = which;
    218	request.usec = cpu_to_le16(debounce_usec);
    219	ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_SET_DEBOUNCE,
    220				&request, sizeof(request), NULL, 0);
    221	if (!ret)
    222		ggc->lines[which].debounce_usec = debounce_usec;
    223	return ret;
    224}
    225
    226static void _gb_gpio_irq_mask(struct gb_gpio_controller *ggc, u8 hwirq)
    227{
    228	struct device *dev = &ggc->gbphy_dev->dev;
    229	struct gb_gpio_irq_mask_request request;
    230	int ret;
    231
    232	request.which = hwirq;
    233	ret = gb_operation_sync(ggc->connection,
    234				GB_GPIO_TYPE_IRQ_MASK,
    235				&request, sizeof(request), NULL, 0);
    236	if (ret)
    237		dev_err(dev, "failed to mask irq: %d\n", ret);
    238}
    239
    240static void _gb_gpio_irq_unmask(struct gb_gpio_controller *ggc, u8 hwirq)
    241{
    242	struct device *dev = &ggc->gbphy_dev->dev;
    243	struct gb_gpio_irq_unmask_request request;
    244	int ret;
    245
    246	request.which = hwirq;
    247	ret = gb_operation_sync(ggc->connection,
    248				GB_GPIO_TYPE_IRQ_UNMASK,
    249				&request, sizeof(request), NULL, 0);
    250	if (ret)
    251		dev_err(dev, "failed to unmask irq: %d\n", ret);
    252}
    253
    254static void _gb_gpio_irq_set_type(struct gb_gpio_controller *ggc,
    255				  u8 hwirq, u8 type)
    256{
    257	struct device *dev = &ggc->gbphy_dev->dev;
    258	struct gb_gpio_irq_type_request request;
    259	int ret;
    260
    261	request.which = hwirq;
    262	request.type = type;
    263
    264	ret = gb_operation_sync(ggc->connection,
    265				GB_GPIO_TYPE_IRQ_TYPE,
    266				&request, sizeof(request), NULL, 0);
    267	if (ret)
    268		dev_err(dev, "failed to set irq type: %d\n", ret);
    269}
    270
    271static void gb_gpio_irq_mask(struct irq_data *d)
    272{
    273	struct gpio_chip *chip = irq_data_to_gpio_chip(d);
    274	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    275	struct gb_gpio_line *line = &ggc->lines[d->hwirq];
    276
    277	line->masked = true;
    278	line->masked_pending = true;
    279}
    280
    281static void gb_gpio_irq_unmask(struct irq_data *d)
    282{
    283	struct gpio_chip *chip = irq_data_to_gpio_chip(d);
    284	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    285	struct gb_gpio_line *line = &ggc->lines[d->hwirq];
    286
    287	line->masked = false;
    288	line->masked_pending = true;
    289}
    290
    291static int gb_gpio_irq_set_type(struct irq_data *d, unsigned int type)
    292{
    293	struct gpio_chip *chip = irq_data_to_gpio_chip(d);
    294	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    295	struct gb_gpio_line *line = &ggc->lines[d->hwirq];
    296	struct device *dev = &ggc->gbphy_dev->dev;
    297	u8 irq_type;
    298
    299	switch (type) {
    300	case IRQ_TYPE_NONE:
    301		irq_type = GB_GPIO_IRQ_TYPE_NONE;
    302		break;
    303	case IRQ_TYPE_EDGE_RISING:
    304		irq_type = GB_GPIO_IRQ_TYPE_EDGE_RISING;
    305		break;
    306	case IRQ_TYPE_EDGE_FALLING:
    307		irq_type = GB_GPIO_IRQ_TYPE_EDGE_FALLING;
    308		break;
    309	case IRQ_TYPE_EDGE_BOTH:
    310		irq_type = GB_GPIO_IRQ_TYPE_EDGE_BOTH;
    311		break;
    312	case IRQ_TYPE_LEVEL_LOW:
    313		irq_type = GB_GPIO_IRQ_TYPE_LEVEL_LOW;
    314		break;
    315	case IRQ_TYPE_LEVEL_HIGH:
    316		irq_type = GB_GPIO_IRQ_TYPE_LEVEL_HIGH;
    317		break;
    318	default:
    319		dev_err(dev, "unsupported irq type: %u\n", type);
    320		return -EINVAL;
    321	}
    322
    323	line->irq_type = irq_type;
    324	line->irq_type_pending = true;
    325
    326	return 0;
    327}
    328
    329static void gb_gpio_irq_bus_lock(struct irq_data *d)
    330{
    331	struct gpio_chip *chip = irq_data_to_gpio_chip(d);
    332	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    333
    334	mutex_lock(&ggc->irq_lock);
    335}
    336
    337static void gb_gpio_irq_bus_sync_unlock(struct irq_data *d)
    338{
    339	struct gpio_chip *chip = irq_data_to_gpio_chip(d);
    340	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    341	struct gb_gpio_line *line = &ggc->lines[d->hwirq];
    342
    343	if (line->irq_type_pending) {
    344		_gb_gpio_irq_set_type(ggc, d->hwirq, line->irq_type);
    345		line->irq_type_pending = false;
    346	}
    347
    348	if (line->masked_pending) {
    349		if (line->masked)
    350			_gb_gpio_irq_mask(ggc, d->hwirq);
    351		else
    352			_gb_gpio_irq_unmask(ggc, d->hwirq);
    353		line->masked_pending = false;
    354	}
    355
    356	mutex_unlock(&ggc->irq_lock);
    357}
    358
    359static int gb_gpio_request_handler(struct gb_operation *op)
    360{
    361	struct gb_connection *connection = op->connection;
    362	struct gb_gpio_controller *ggc = gb_connection_get_data(connection);
    363	struct device *dev = &ggc->gbphy_dev->dev;
    364	struct gb_message *request;
    365	struct gb_gpio_irq_event_request *event;
    366	u8 type = op->type;
    367	int irq, ret;
    368
    369	if (type != GB_GPIO_TYPE_IRQ_EVENT) {
    370		dev_err(dev, "unsupported unsolicited request: %u\n", type);
    371		return -EINVAL;
    372	}
    373
    374	request = op->request;
    375
    376	if (request->payload_size < sizeof(*event)) {
    377		dev_err(dev, "short event received (%zu < %zu)\n",
    378			request->payload_size, sizeof(*event));
    379		return -EINVAL;
    380	}
    381
    382	event = request->payload;
    383	if (event->which > ggc->line_max) {
    384		dev_err(dev, "invalid hw irq: %d\n", event->which);
    385		return -EINVAL;
    386	}
    387
    388	irq = irq_find_mapping(ggc->chip.irq.domain, event->which);
    389	if (!irq) {
    390		dev_err(dev, "failed to find IRQ\n");
    391		return -EINVAL;
    392	}
    393
    394	ret = generic_handle_irq_safe(irq);
    395	if (ret)
    396		dev_err(dev, "failed to invoke irq handler\n");
    397
    398	return ret;
    399}
    400
    401static int gb_gpio_request(struct gpio_chip *chip, unsigned int offset)
    402{
    403	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    404
    405	return gb_gpio_activate_operation(ggc, (u8)offset);
    406}
    407
    408static void gb_gpio_free(struct gpio_chip *chip, unsigned int offset)
    409{
    410	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    411
    412	gb_gpio_deactivate_operation(ggc, (u8)offset);
    413}
    414
    415static int gb_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
    416{
    417	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    418	u8 which;
    419	int ret;
    420
    421	which = (u8)offset;
    422	ret = gb_gpio_get_direction_operation(ggc, which);
    423	if (ret)
    424		return ret;
    425
    426	return ggc->lines[which].direction ? 1 : 0;
    427}
    428
    429static int gb_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
    430{
    431	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    432
    433	return gb_gpio_direction_in_operation(ggc, (u8)offset);
    434}
    435
    436static int gb_gpio_direction_output(struct gpio_chip *chip, unsigned int offset,
    437				    int value)
    438{
    439	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    440
    441	return gb_gpio_direction_out_operation(ggc, (u8)offset, !!value);
    442}
    443
    444static int gb_gpio_get(struct gpio_chip *chip, unsigned int offset)
    445{
    446	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    447	u8 which;
    448	int ret;
    449
    450	which = (u8)offset;
    451	ret = gb_gpio_get_value_operation(ggc, which);
    452	if (ret)
    453		return ret;
    454
    455	return ggc->lines[which].value;
    456}
    457
    458static void gb_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
    459{
    460	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    461
    462	gb_gpio_set_value_operation(ggc, (u8)offset, !!value);
    463}
    464
    465static int gb_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
    466			      unsigned long config)
    467{
    468	struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip);
    469	u32 debounce;
    470
    471	if (pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE)
    472		return -ENOTSUPP;
    473
    474	debounce = pinconf_to_config_argument(config);
    475	if (debounce > U16_MAX)
    476		return -EINVAL;
    477
    478	return gb_gpio_set_debounce_operation(ggc, (u8)offset, (u16)debounce);
    479}
    480
    481static int gb_gpio_controller_setup(struct gb_gpio_controller *ggc)
    482{
    483	int ret;
    484
    485	/* Now find out how many lines there are */
    486	ret = gb_gpio_line_count_operation(ggc);
    487	if (ret)
    488		return ret;
    489
    490	ggc->lines = kcalloc(ggc->line_max + 1, sizeof(*ggc->lines),
    491			     GFP_KERNEL);
    492	if (!ggc->lines)
    493		return -ENOMEM;
    494
    495	return ret;
    496}
    497
    498static int gb_gpio_probe(struct gbphy_device *gbphy_dev,
    499			 const struct gbphy_device_id *id)
    500{
    501	struct gb_connection *connection;
    502	struct gb_gpio_controller *ggc;
    503	struct gpio_chip *gpio;
    504	struct gpio_irq_chip *girq;
    505	struct irq_chip *irqc;
    506	int ret;
    507
    508	ggc = kzalloc(sizeof(*ggc), GFP_KERNEL);
    509	if (!ggc)
    510		return -ENOMEM;
    511
    512	connection =
    513		gb_connection_create(gbphy_dev->bundle,
    514				     le16_to_cpu(gbphy_dev->cport_desc->id),
    515				     gb_gpio_request_handler);
    516	if (IS_ERR(connection)) {
    517		ret = PTR_ERR(connection);
    518		goto exit_ggc_free;
    519	}
    520
    521	ggc->connection = connection;
    522	gb_connection_set_data(connection, ggc);
    523	ggc->gbphy_dev = gbphy_dev;
    524	gb_gbphy_set_data(gbphy_dev, ggc);
    525
    526	ret = gb_connection_enable_tx(connection);
    527	if (ret)
    528		goto exit_connection_destroy;
    529
    530	ret = gb_gpio_controller_setup(ggc);
    531	if (ret)
    532		goto exit_connection_disable;
    533
    534	irqc = &ggc->irqc;
    535	irqc->irq_mask = gb_gpio_irq_mask;
    536	irqc->irq_unmask = gb_gpio_irq_unmask;
    537	irqc->irq_set_type = gb_gpio_irq_set_type;
    538	irqc->irq_bus_lock = gb_gpio_irq_bus_lock;
    539	irqc->irq_bus_sync_unlock = gb_gpio_irq_bus_sync_unlock;
    540	irqc->name = "greybus_gpio";
    541
    542	mutex_init(&ggc->irq_lock);
    543
    544	gpio = &ggc->chip;
    545
    546	gpio->label = "greybus_gpio";
    547	gpio->parent = &gbphy_dev->dev;
    548	gpio->owner = THIS_MODULE;
    549
    550	gpio->request = gb_gpio_request;
    551	gpio->free = gb_gpio_free;
    552	gpio->get_direction = gb_gpio_get_direction;
    553	gpio->direction_input = gb_gpio_direction_input;
    554	gpio->direction_output = gb_gpio_direction_output;
    555	gpio->get = gb_gpio_get;
    556	gpio->set = gb_gpio_set;
    557	gpio->set_config = gb_gpio_set_config;
    558	gpio->base = -1;		/* Allocate base dynamically */
    559	gpio->ngpio = ggc->line_max + 1;
    560	gpio->can_sleep = true;
    561
    562	girq = &gpio->irq;
    563	girq->chip = irqc;
    564	/* The event comes from the outside so no parent handler */
    565	girq->parent_handler = NULL;
    566	girq->num_parents = 0;
    567	girq->parents = NULL;
    568	girq->default_type = IRQ_TYPE_NONE;
    569	girq->handler = handle_level_irq;
    570
    571	ret = gb_connection_enable(connection);
    572	if (ret)
    573		goto exit_line_free;
    574
    575	ret = gpiochip_add(gpio);
    576	if (ret) {
    577		dev_err(&gbphy_dev->dev, "failed to add gpio chip: %d\n", ret);
    578		goto exit_line_free;
    579	}
    580
    581	gbphy_runtime_put_autosuspend(gbphy_dev);
    582	return 0;
    583
    584exit_line_free:
    585	kfree(ggc->lines);
    586exit_connection_disable:
    587	gb_connection_disable(connection);
    588exit_connection_destroy:
    589	gb_connection_destroy(connection);
    590exit_ggc_free:
    591	kfree(ggc);
    592	return ret;
    593}
    594
    595static void gb_gpio_remove(struct gbphy_device *gbphy_dev)
    596{
    597	struct gb_gpio_controller *ggc = gb_gbphy_get_data(gbphy_dev);
    598	struct gb_connection *connection = ggc->connection;
    599	int ret;
    600
    601	ret = gbphy_runtime_get_sync(gbphy_dev);
    602	if (ret)
    603		gbphy_runtime_get_noresume(gbphy_dev);
    604
    605	gb_connection_disable_rx(connection);
    606	gpiochip_remove(&ggc->chip);
    607	gb_connection_disable(connection);
    608	gb_connection_destroy(connection);
    609	kfree(ggc->lines);
    610	kfree(ggc);
    611}
    612
    613static const struct gbphy_device_id gb_gpio_id_table[] = {
    614	{ GBPHY_PROTOCOL(GREYBUS_PROTOCOL_GPIO) },
    615	{ },
    616};
    617MODULE_DEVICE_TABLE(gbphy, gb_gpio_id_table);
    618
    619static struct gbphy_driver gpio_driver = {
    620	.name		= "gpio",
    621	.probe		= gb_gpio_probe,
    622	.remove		= gb_gpio_remove,
    623	.id_table	= gb_gpio_id_table,
    624};
    625
    626module_gbphy_driver(gpio_driver);
    627MODULE_LICENSE("GPL v2");