Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | // 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); |