1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
2 | /* |
3 | * Initialization protocol for ISHTP driver |
4 | * |
5 | * Copyright (c) 2003-2016, Intel Corporation. |
6 | */ |
7 | |
8 | #include <linux/export.h> |
9 | #include <linux/slab.h> |
10 | #include <linux/sched.h> |
11 | #include "ishtp-dev.h" |
12 | #include "hbm.h" |
13 | #include "client.h" |
14 | |
15 | /** |
16 | * ishtp_dev_state_str() -Convert to string format |
17 | * @state: state to convert |
18 | * |
19 | * Convert state to string for prints |
20 | * |
21 | * Return: character pointer to converted string |
22 | */ |
23 | const char *ishtp_dev_state_str(int state) |
24 | { |
25 | switch (state) { |
26 | case ISHTP_DEV_INITIALIZING: |
27 | return "INITIALIZING"; |
28 | case ISHTP_DEV_INIT_CLIENTS: |
29 | return "INIT_CLIENTS"; |
30 | case ISHTP_DEV_ENABLED: |
31 | return "ENABLED"; |
32 | case ISHTP_DEV_RESETTING: |
33 | return "RESETTING"; |
34 | case ISHTP_DEV_DISABLED: |
35 | return "DISABLED"; |
36 | case ISHTP_DEV_POWER_DOWN: |
37 | return "POWER_DOWN"; |
38 | case ISHTP_DEV_POWER_UP: |
39 | return "POWER_UP"; |
40 | default: |
41 | return "unknown"; |
42 | } |
43 | } |
44 | |
45 | /** |
46 | * ishtp_device_init() - ishtp device init |
47 | * @dev: ISHTP device instance |
48 | * |
49 | * After ISHTP device is alloacted, this function is used to initialize |
50 | * each field which includes spin lock, work struct and lists |
51 | */ |
52 | void ishtp_device_init(struct ishtp_device *dev) |
53 | { |
54 | dev->dev_state = ISHTP_DEV_INITIALIZING; |
55 | INIT_LIST_HEAD(list: &dev->cl_list); |
56 | INIT_LIST_HEAD(list: &dev->device_list); |
57 | dev->rd_msg_fifo_head = 0; |
58 | dev->rd_msg_fifo_tail = 0; |
59 | spin_lock_init(&dev->rd_msg_spinlock); |
60 | |
61 | init_waitqueue_head(&dev->wait_hbm_recvd_msg); |
62 | spin_lock_init(&dev->read_list_spinlock); |
63 | spin_lock_init(&dev->device_lock); |
64 | spin_lock_init(&dev->device_list_lock); |
65 | spin_lock_init(&dev->cl_list_lock); |
66 | spin_lock_init(&dev->fw_clients_lock); |
67 | INIT_WORK(&dev->bh_hbm_work, bh_hbm_work_fn); |
68 | |
69 | bitmap_zero(dst: dev->host_clients_map, ISHTP_CLIENTS_MAX); |
70 | dev->open_handle_count = 0; |
71 | |
72 | /* |
73 | * Reserving client ID 0 for ISHTP Bus Message communications |
74 | */ |
75 | bitmap_set(map: dev->host_clients_map, start: 0, nbits: 1); |
76 | |
77 | INIT_LIST_HEAD(list: &dev->read_list.list); |
78 | |
79 | } |
80 | EXPORT_SYMBOL(ishtp_device_init); |
81 | |
82 | /** |
83 | * ishtp_start() - Start ISH processing |
84 | * @dev: ISHTP device instance |
85 | * |
86 | * Start ISHTP processing by sending query subscriber message |
87 | * |
88 | * Return: 0 on success else -ENODEV |
89 | */ |
90 | int ishtp_start(struct ishtp_device *dev) |
91 | { |
92 | if (ishtp_hbm_start_wait(dev)) { |
93 | dev_err(dev->devc, "HBM haven't started"); |
94 | goto err; |
95 | } |
96 | |
97 | /* suspend & resume notification - send QUERY_SUBSCRIBERS msg */ |
98 | ishtp_query_subscribers(dev); |
99 | |
100 | return 0; |
101 | err: |
102 | dev_err(dev->devc, "link layer initialization failed.\n"); |
103 | dev->dev_state = ISHTP_DEV_DISABLED; |
104 | return -ENODEV; |
105 | } |
106 | EXPORT_SYMBOL(ishtp_start); |
107 |