123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // SPDX-License-Identifier: GPL-2.0-only
- /*
- * Initialization protocol for ISHTP driver
- *
- * Copyright (c) 2003-2016, Intel Corporation.
- */
- #include <linux/export.h>
- #include <linux/slab.h>
- #include <linux/sched.h>
- #include "ishtp-dev.h"
- #include "hbm.h"
- #include "client.h"
- /**
- * ishtp_dev_state_str() -Convert to string format
- * @state: state to convert
- *
- * Convert state to string for prints
- *
- * Return: character pointer to converted string
- */
- const char *ishtp_dev_state_str(int state)
- {
- switch (state) {
- case ISHTP_DEV_INITIALIZING:
- return "INITIALIZING";
- case ISHTP_DEV_INIT_CLIENTS:
- return "INIT_CLIENTS";
- case ISHTP_DEV_ENABLED:
- return "ENABLED";
- case ISHTP_DEV_RESETTING:
- return "RESETTING";
- case ISHTP_DEV_DISABLED:
- return "DISABLED";
- case ISHTP_DEV_POWER_DOWN:
- return "POWER_DOWN";
- case ISHTP_DEV_POWER_UP:
- return "POWER_UP";
- default:
- return "unknown";
- }
- }
- /**
- * ishtp_device_init() - ishtp device init
- * @dev: ISHTP device instance
- *
- * After ISHTP device is alloacted, this function is used to initialize
- * each field which includes spin lock, work struct and lists
- */
- void ishtp_device_init(struct ishtp_device *dev)
- {
- dev->dev_state = ISHTP_DEV_INITIALIZING;
- INIT_LIST_HEAD(&dev->cl_list);
- INIT_LIST_HEAD(&dev->device_list);
- dev->rd_msg_fifo_head = 0;
- dev->rd_msg_fifo_tail = 0;
- spin_lock_init(&dev->rd_msg_spinlock);
- init_waitqueue_head(&dev->wait_hbm_recvd_msg);
- spin_lock_init(&dev->read_list_spinlock);
- spin_lock_init(&dev->device_lock);
- spin_lock_init(&dev->device_list_lock);
- spin_lock_init(&dev->cl_list_lock);
- spin_lock_init(&dev->fw_clients_lock);
- INIT_WORK(&dev->bh_hbm_work, bh_hbm_work_fn);
- bitmap_zero(dev->host_clients_map, ISHTP_CLIENTS_MAX);
- dev->open_handle_count = 0;
- /*
- * Reserving client ID 0 for ISHTP Bus Message communications
- */
- bitmap_set(dev->host_clients_map, 0, 1);
- INIT_LIST_HEAD(&dev->read_list.list);
- }
- EXPORT_SYMBOL(ishtp_device_init);
- /**
- * ishtp_start() - Start ISH processing
- * @dev: ISHTP device instance
- *
- * Start ISHTP processing by sending query subscriber message
- *
- * Return: 0 on success else -ENODEV
- */
- int ishtp_start(struct ishtp_device *dev)
- {
- if (ishtp_hbm_start_wait(dev)) {
- dev_err(dev->devc, "HBM haven't started");
- goto err;
- }
- /* suspend & resume notification - send QUERY_SUBSCRIBERS msg */
- ishtp_query_subscribers(dev);
- return 0;
- err:
- dev_err(dev->devc, "link layer initialization failed.\n");
- dev->dev_state = ISHTP_DEV_DISABLED;
- return -ENODEV;
- }
- EXPORT_SYMBOL(ishtp_start);
|