162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * HSI clients registration interface
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2010 Nokia Corporation. All rights reserved.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Contact: Carlos Chinea <carlos.chinea@nokia.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci#include <linux/hsi/hsi.h>
1062306a36Sopenharmony_ci#include <linux/list.h>
1162306a36Sopenharmony_ci#include <linux/slab.h>
1262306a36Sopenharmony_ci#include "hsi_core.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * hsi_board_list is only used internally by the HSI framework.
1662306a36Sopenharmony_ci * No one else is allowed to make use of it.
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_ciLIST_HEAD(hsi_board_list);
1962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(hsi_board_list);
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/**
2262306a36Sopenharmony_ci * hsi_register_board_info - Register HSI clients information
2362306a36Sopenharmony_ci * @info: Array of HSI clients on the board
2462306a36Sopenharmony_ci * @len: Length of the array
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci * HSI clients are statically declared and registered on board files.
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * HSI clients will be automatically registered to the HSI bus once the
2962306a36Sopenharmony_ci * controller and the port where the clients wishes to attach are registered
3062306a36Sopenharmony_ci * to it.
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci * Return -errno on failure, 0 on success.
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_ciint __init hsi_register_board_info(struct hsi_board_info const *info,
3562306a36Sopenharmony_ci							unsigned int len)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	struct hsi_cl_info *cl_info;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	cl_info = kcalloc(len, sizeof(*cl_info), GFP_KERNEL);
4062306a36Sopenharmony_ci	if (!cl_info)
4162306a36Sopenharmony_ci		return -ENOMEM;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	for (; len; len--, info++, cl_info++) {
4462306a36Sopenharmony_ci		cl_info->info = *info;
4562306a36Sopenharmony_ci		list_add_tail(&cl_info->list, &hsi_board_list);
4662306a36Sopenharmony_ci	}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	return 0;
4962306a36Sopenharmony_ci}
50