Lines Matching +full:user +full:- +full:otp

1 // SPDX-License-Identifier: GPL-2.0
3 * OTP Memory controller
13 #include <linux/nvmem-provider.h>
28 #define MCHP_OTPC_NAME "mchp-otpc"
32 * struct mchp_otpc - OTPC private data structure
35 * @packets: list of packets in OTP memory
36 * @npackets: number of packets in OTP memory
46 * struct mchp_otpc_packet - OTPC packet data structure
49 * @offset: packet offset (in words) in OTP memory
62 if (id >= otpc->npackets) in mchp_otpc_id_to_packet()
65 list_for_each_entry(packet, &otpc->packets, list) { in mchp_otpc_id_to_packet()
66 if (packet->id == id) in mchp_otpc_id_to_packet()
79 tmp = readl_relaxed(otpc->base + MCHP_OTPC_MR); in mchp_otpc_prepare_read()
82 writel_relaxed(tmp, otpc->base + MCHP_OTPC_MR); in mchp_otpc_prepare_read()
85 tmp = readl_relaxed(otpc->base + MCHP_OTPC_CR); in mchp_otpc_prepare_read()
87 writel_relaxed(tmp, otpc->base + MCHP_OTPC_CR); in mchp_otpc_prepare_read()
91 10000, 2000, false, otpc->base + MCHP_OTPC_SR); in mchp_otpc_prepare_read()
100 * ------------- ---------------- ---------
102 * 0x0 +------------+ <-- packet 0
104 * 0x4 +------------+
109 * offset1 +------------+ <-- packet 1
111 * offset1 + 0x4 +------------+
116 * offset2 +------------+ <-- packet 2
120 * offsetN +------------+ <-- packet N
122 * offsetN + 0x4 +------------+
127 * +------------+
130 * payload N-1.
143 * packet. The user will have to be aware of the memory footprint before doing
164 return -EINVAL; in mchp_otpc_read()
165 offset = packet->offset; in mchp_otpc_read()
173 *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_HR); in mchp_otpc_read()
180 payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, *(buf - 1)); in mchp_otpc_read()
181 writel_relaxed(0UL, otpc->base + MCHP_OTPC_AR); in mchp_otpc_read()
183 *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_DR); in mchp_otpc_read()
186 payload_size--; in mchp_otpc_read()
199 INIT_LIST_HEAD(&otpc->packets); in mchp_otpc_init_packets_list()
207 word = readl_relaxed(otpc->base + MCHP_OTPC_HR); in mchp_otpc_init_packets_list()
212 packet = devm_kzalloc(otpc->dev, sizeof(*packet), GFP_KERNEL); in mchp_otpc_init_packets_list()
214 return -ENOMEM; in mchp_otpc_init_packets_list()
216 packet->id = id++; in mchp_otpc_init_packets_list()
217 packet->offset = word_pos; in mchp_otpc_init_packets_list()
218 INIT_LIST_HEAD(&packet->list); in mchp_otpc_init_packets_list()
219 list_add_tail(&packet->list, &otpc->packets); in mchp_otpc_init_packets_list()
229 otpc->npackets = npackets; in mchp_otpc_init_packets_list()
250 otpc = devm_kzalloc(&pdev->dev, sizeof(*otpc), GFP_KERNEL); in mchp_otpc_probe()
252 return -ENOMEM; in mchp_otpc_probe()
254 otpc->base = devm_platform_ioremap_resource(pdev, 0); in mchp_otpc_probe()
255 if (IS_ERR(otpc->base)) in mchp_otpc_probe()
256 return PTR_ERR(otpc->base); in mchp_otpc_probe()
258 otpc->dev = &pdev->dev; in mchp_otpc_probe()
263 mchp_nvmem_config.dev = otpc->dev; in mchp_otpc_probe()
267 nvmem = devm_nvmem_register(&pdev->dev, &mchp_nvmem_config); in mchp_otpc_probe()
273 { .compatible = "microchip,sama7g5-otpc", },