Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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