18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Port on Texas Instruments TMS320C6x architecture 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated 68c2ecf20Sopenharmony_ci * Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#ifndef _ASM_C6X_CMPXCHG_H 98c2ecf20Sopenharmony_ci#define _ASM_C6X_CMPXCHG_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/irqflags.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* 148c2ecf20Sopenharmony_ci * Misc. functions 158c2ecf20Sopenharmony_ci */ 168c2ecf20Sopenharmony_cistatic inline unsigned int __xchg(unsigned int x, volatile void *ptr, int size) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci unsigned int tmp; 198c2ecf20Sopenharmony_ci unsigned long flags; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci local_irq_save(flags); 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci switch (size) { 248c2ecf20Sopenharmony_ci case 1: 258c2ecf20Sopenharmony_ci tmp = 0; 268c2ecf20Sopenharmony_ci tmp = *((unsigned char *) ptr); 278c2ecf20Sopenharmony_ci *((unsigned char *) ptr) = (unsigned char) x; 288c2ecf20Sopenharmony_ci break; 298c2ecf20Sopenharmony_ci case 2: 308c2ecf20Sopenharmony_ci tmp = 0; 318c2ecf20Sopenharmony_ci tmp = *((unsigned short *) ptr); 328c2ecf20Sopenharmony_ci *((unsigned short *) ptr) = x; 338c2ecf20Sopenharmony_ci break; 348c2ecf20Sopenharmony_ci case 4: 358c2ecf20Sopenharmony_ci tmp = 0; 368c2ecf20Sopenharmony_ci tmp = *((unsigned int *) ptr); 378c2ecf20Sopenharmony_ci *((unsigned int *) ptr) = x; 388c2ecf20Sopenharmony_ci break; 398c2ecf20Sopenharmony_ci } 408c2ecf20Sopenharmony_ci local_irq_restore(flags); 418c2ecf20Sopenharmony_ci return tmp; 428c2ecf20Sopenharmony_ci} 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#define xchg(ptr, x) \ 458c2ecf20Sopenharmony_ci ((__typeof__(*(ptr)))__xchg((unsigned int)(x), (void *) (ptr), \ 468c2ecf20Sopenharmony_ci sizeof(*(ptr)))) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#include <asm-generic/cmpxchg-local.h> 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci/* 518c2ecf20Sopenharmony_ci * cmpxchg_local and cmpxchg64_local are atomic wrt current CPU. Always make 528c2ecf20Sopenharmony_ci * them available. 538c2ecf20Sopenharmony_ci */ 548c2ecf20Sopenharmony_ci#define cmpxchg_local(ptr, o, n) \ 558c2ecf20Sopenharmony_ci ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), \ 568c2ecf20Sopenharmony_ci (unsigned long)(o), \ 578c2ecf20Sopenharmony_ci (unsigned long)(n), \ 588c2ecf20Sopenharmony_ci sizeof(*(ptr)))) 598c2ecf20Sopenharmony_ci#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n)) 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#include <asm-generic/cmpxchg.h> 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci#endif /* _ASM_C6X_CMPXCHG_H */ 64