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

spi.c (1726B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * SPI bridge PHY driver.
      4 *
      5 * Copyright 2014-2016 Google Inc.
      6 * Copyright 2014-2016 Linaro Ltd.
      7 */
      8
      9#include <linux/module.h>
     10#include <linux/greybus.h>
     11
     12#include "gbphy.h"
     13#include "spilib.h"
     14
     15static struct spilib_ops *spilib_ops;
     16
     17static int gb_spi_probe(struct gbphy_device *gbphy_dev,
     18			const struct gbphy_device_id *id)
     19{
     20	struct gb_connection *connection;
     21	int ret;
     22
     23	connection = gb_connection_create(gbphy_dev->bundle,
     24					  le16_to_cpu(gbphy_dev->cport_desc->id),
     25					  NULL);
     26	if (IS_ERR(connection))
     27		return PTR_ERR(connection);
     28
     29	ret = gb_connection_enable(connection);
     30	if (ret)
     31		goto exit_connection_destroy;
     32
     33	ret = gb_spilib_master_init(connection, &gbphy_dev->dev, spilib_ops);
     34	if (ret)
     35		goto exit_connection_disable;
     36
     37	gb_gbphy_set_data(gbphy_dev, connection);
     38
     39	gbphy_runtime_put_autosuspend(gbphy_dev);
     40	return 0;
     41
     42exit_connection_disable:
     43	gb_connection_disable(connection);
     44exit_connection_destroy:
     45	gb_connection_destroy(connection);
     46
     47	return ret;
     48}
     49
     50static void gb_spi_remove(struct gbphy_device *gbphy_dev)
     51{
     52	struct gb_connection *connection = gb_gbphy_get_data(gbphy_dev);
     53	int ret;
     54
     55	ret = gbphy_runtime_get_sync(gbphy_dev);
     56	if (ret)
     57		gbphy_runtime_get_noresume(gbphy_dev);
     58
     59	gb_spilib_master_exit(connection);
     60	gb_connection_disable(connection);
     61	gb_connection_destroy(connection);
     62}
     63
     64static const struct gbphy_device_id gb_spi_id_table[] = {
     65	{ GBPHY_PROTOCOL(GREYBUS_PROTOCOL_SPI) },
     66	{ },
     67};
     68MODULE_DEVICE_TABLE(gbphy, gb_spi_id_table);
     69
     70static struct gbphy_driver spi_driver = {
     71	.name		= "spi",
     72	.probe		= gb_spi_probe,
     73	.remove		= gb_spi_remove,
     74	.id_table	= gb_spi_id_table,
     75};
     76
     77module_gbphy_driver(spi_driver);
     78MODULE_LICENSE("GPL v2");