162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2020, MIPI Alliance, Inc. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Author: Nicolas Pitre <npitre@baylibre.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/device.h> 962306a36Sopenharmony_ci#include <linux/bitfield.h> 1062306a36Sopenharmony_ci#include <linux/i3c/master.h> 1162306a36Sopenharmony_ci#include <linux/io.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "hci.h" 1462306a36Sopenharmony_ci#include "dct.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * Device Characteristic Table 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_civoid i3c_hci_dct_get_val(struct i3c_hci *hci, unsigned int dct_idx, 2162306a36Sopenharmony_ci u64 *pid, unsigned int *dcr, unsigned int *bcr) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci void __iomem *reg = hci->DCT_regs + dct_idx * 4 * 4; 2462306a36Sopenharmony_ci u32 dct_entry_data[4]; 2562306a36Sopenharmony_ci unsigned int i; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci for (i = 0; i < 4; i++) { 2862306a36Sopenharmony_ci dct_entry_data[i] = readl(reg); 2962306a36Sopenharmony_ci reg += 4; 3062306a36Sopenharmony_ci } 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci *pid = ((u64)dct_entry_data[0]) << (47 - 32 + 1) | 3362306a36Sopenharmony_ci FIELD_GET(W1_MASK(47, 32), dct_entry_data[1]); 3462306a36Sopenharmony_ci *dcr = FIELD_GET(W2_MASK(71, 64), dct_entry_data[2]); 3562306a36Sopenharmony_ci *bcr = FIELD_GET(W2_MASK(79, 72), dct_entry_data[2]); 3662306a36Sopenharmony_ci} 37