1 /* 2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 2 7 * of the License, or (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 17 */ 18 19 #ifndef __HI_OSAL__ 20 #define __HI_OSAL__ 21 22 #define HI_OSAL_VERSION "1.0" 23 24 #include "osal_list.h" 25 #include "autoconf.h" 26 27 #define osal_gfp_kernel 0 28 #define osal_gfp_atomic 1 29 extern void *osal_vmalloc(unsigned long size); 30 extern void osal_vfree(const void *addr); 31 extern void *osal_kmalloc(unsigned long size, unsigned int osal_gfp_flag); 32 extern void osal_kfree(const void *addr); 33 34 /* atomic api */ 35 typedef struct { 36 void *atomic; 37 } osal_atomic_t; 38 39 #define OSAL_ATOMIC_INIT(i) { (i) } 40 41 extern int osal_atomic_init(osal_atomic_t *atomic); 42 extern void osal_atomic_destroy(osal_atomic_t *atomic); 43 extern int osal_atomic_read(osal_atomic_t *v); 44 extern void osal_atomic_set(osal_atomic_t *v, int i); 45 extern int osal_atomic_inc_return(osal_atomic_t *v); 46 extern int osal_atomic_dec_return(osal_atomic_t *v); 47 48 /* semaphore api */ 49 #define EINTR 4 50 typedef struct osal_semaphore { 51 void *sem; 52 } osal_semaphore_t; 53 extern int osal_sema_init(osal_semaphore_t *sem, int val); 54 extern int osal_down(osal_semaphore_t *sem); 55 extern int osal_down_interruptible(osal_semaphore_t *sem); 56 extern int osal_down_trylock(osal_semaphore_t *sem); 57 extern void osal_up(osal_semaphore_t *sem); 58 /* notice:must be called when kmod exit, other wise will lead to memory leak; */ 59 extern void osal_sema_destroy(osal_semaphore_t *sem); 60 61 /* mutex api */ 62 typedef struct osal_mutex { 63 void *mutex; 64 } osal_mutex_t; 65 extern int osal_mutex_init(osal_mutex_t *mutex); 66 extern int osal_mutex_lock(osal_mutex_t *mutex); 67 extern int osal_mutex_lock_interruptible(osal_mutex_t *mutex); 68 extern int osal_mutex_trylock(osal_mutex_t *mutex); 69 extern void osal_mutex_unlock(osal_mutex_t *mutex); 70 /* notice:must be called when kmod exit, other wise will lead to memory leak; */ 71 extern void osal_mutex_destroy(osal_mutex_t *mutex); 72 73 /* spin lock api */ 74 typedef struct osal_spinlock { 75 void *lock; 76 } osal_spinlock_t; 77 extern int osal_spin_lock_init(osal_spinlock_t *lock); 78 extern void osal_spin_lock(osal_spinlock_t *lock); 79 extern int osal_spin_trylock(osal_spinlock_t *lock); 80 extern void osal_spin_unlock(osal_spinlock_t *lock); 81 extern void osal_spin_lock_irqsave(osal_spinlock_t *lock, unsigned long *flags); 82 extern void osal_spin_unlock_irqrestore(osal_spinlock_t *lock, const unsigned long *flags); 83 /* notice:must be called when kmod exit, other wise will lead to memory leak; */ 84 extern void osal_spin_lock_destroy(osal_spinlock_t *lock); 85 86 /* wait api */ 87 typedef int (*osal_wait_cond_func_t)(const void *param); 88 89 typedef struct osal_wait { 90 void *wait; 91 } osal_wait_t; 92 #define ERESTARTSYS 512 93 94 95 extern unsigned long osal_msecs_to_jiffies(const unsigned int m); 96 extern int osal_wait_init(osal_wait_t *wait); 97 extern int osal_wait_interruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param); 98 extern int osal_wait_uninterruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param); 99 extern int osal_wait_timeout_interruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param, 100 unsigned long ms); 101 extern int osal_wait_timeout_uninterruptible(osal_wait_t *wait, osal_wait_cond_func_t func, const void *param, 102 unsigned long ms); 103 104 #define osal_wait_event_interruptible(wait, func, param) \ 105 ({ \ 106 int __ret = 0; \ 107 \ 108 for (;;) { \ 109 if (func(param) != 0) { \ 110 __ret = 0; \ 111 break; \ 112 } \ 113 __ret = osal_wait_timeout_interruptible(wait, (func), param, 100); \ 114 if (__ret < 0) { \ 115 break; \ 116 } \ 117 } \ 118 __ret; \ 119 }) 120 121 #define osal_wait_event_uninterruptible(wait, func, param) \ 122 ({ \ 123 int __ret = 0; \ 124 \ 125 for (;;) { \ 126 if (func(param) != 0) { \ 127 __ret = 0; \ 128 break; \ 129 } \ 130 __ret = osal_wait_uninterruptible(wait, (func), param); \ 131 if (__ret < 0) { \ 132 break; \ 133 } \ 134 } \ 135 __ret; \ 136 }) 137 138 #define osal_wait_event_timeout_interruptible(wait, func, param, timeout) \ 139 ({ \ 140 int __ret = timeout; \ 141 \ 142 if ((func(param) != 0) && ((timeout) == 0)) { \ 143 __ret = 1; \ 144 } \ 145 \ 146 for (;;) { \ 147 if (func(param) != 0) { \ 148 __ret = osal_msecs_to_jiffies(__ret); \ 149 break; \ 150 } \ 151 __ret = osal_wait_timeout_interruptible(wait, (func), param, __ret); \ 152 if ((__ret == 0) || (__ret == -ERESTARTSYS)) { \ 153 break; \ 154 } \ 155 } \ 156 __ret; \ 157 }) 158 159 #define osal_wait_event_timeout_uninterruptible(wait, func, param, timeout) \ 160 ({ \ 161 int __ret = timeout; \ 162 \ 163 if ((func(param) != 0) && ((timeout) == 0)) { \ 164 __ret = 1; \ 165 } \ 166 \ 167 for (;;) { \ 168 if (func(param) != 0) { \ 169 __ret = osal_msecs_to_jiffies(__ret); \ 170 break; \ 171 } \ 172 __ret = osal_wait_timeout_uninterruptible(wait, (func), param, __ret); \ 173 if ((__ret == 0) || (__ret == -ERESTARTSYS)) { \ 174 break; \ 175 } \ 176 } \ 177 __ret; \ 178 }) 179 180 extern void osal_wakeup(osal_wait_t *wait); /* same as wake_up_all */ 181 extern void osal_wait_destroy(osal_wait_t *wait); 182 183 /* workqueue api */ 184 typedef struct osal_work_struct { 185 int queue_flag; 186 void *work; 187 void (*func)(struct osal_work_struct *work); 188 } osal_work_struct_t; 189 typedef void (*osal_work_func_t)(struct osal_work_struct *work); 190 191 extern int osal_init_work(struct osal_work_struct *work, osal_work_func_t func); 192 193 #define OSAL_INIT_WORK(_work, _func) \ 194 do { \ 195 osal_init_work((_work), (_func)); \ 196 } while (0) 197 198 extern int osal_schedule_work(struct osal_work_struct *work); 199 extern void osal_destroy_work(struct osal_work_struct *work); 200 201 /* schedule */ 202 extern void osal_yield(void); 203 204 /* interrupt api */ 205 enum osal_irqreturn { 206 OSAL_IRQ_NONE = (0 << 0), 207 OSAL_IRQ_HANDLED = (1 << 0), 208 OSAL_IRQ_WAKE_THREAD = (1 << 1), 209 }; 210 211 typedef int (*osal_irq_handler_t)(int, void *); 212 extern int osal_request_irq(unsigned int irq, osal_irq_handler_t handler, osal_irq_handler_t thread_fn, 213 const char *name, void *dev); 214 extern void osal_free_irq(unsigned int irq, void *dev); 215 extern int osal_in_interrupt(void); 216 217 #define OSAL_DIS_IRQ_CNT 2 218 typedef void (*osal_gic_handle_t)(unsigned int, unsigned int, void *); 219 extern int osal_register_gic_handle(unsigned int index, unsigned int irq, osal_gic_handle_t handle, const char *name, 220 void *dev); 221 extern int osal_unregister_gic_handle(unsigned int index, unsigned int irq, void *dev); 222 223 /* task api */ 224 typedef struct osal_task { 225 void *task_struct; 226 } osal_task_t; 227 typedef int (*threadfn_t)(void *data); 228 extern osal_task_t *osal_kthread_create(threadfn_t thread, void *data, const char *name); 229 extern void osal_kthread_destroy(osal_task_t *task, unsigned int stop_flag); 230 231 /* string api */ 232 extern int osal_strcmp(const char *s1, const char *s2); 233 extern int osal_strncmp(const char *s1, const char *s2, int size); 234 extern int osal_strnicmp(const char *s1, const char *s2, int size); 235 extern int osal_strcasecmp(const char *s1, const char *s2); 236 extern int osal_strncasecmp(const char *s1, const char *s2, int n); 237 extern char *osal_strchr(const char *s, int n); 238 extern char *osal_strnchr(const char *s, int count, int c); 239 extern char *osal_strrchr(const char *s, int c); 240 extern char *osal_strstr(const char *s1, const char *s2); 241 extern char *osal_strnstr(const char *s1, const char *s2, int n); 242 extern int osal_strlen(const char *s); 243 extern int osal_strnlen(const char *s, int size); 244 extern char *osal_strpbrk(const char *s1, const char *s2); 245 extern char *osal_strsep(char **s, const char *ct); 246 extern int osal_strspn(const char *s, const char *accept); 247 extern int osal_strcspn(const char *s, const char *reject); 248 extern void *osal_memscan(void *addr, int c, int size); 249 extern int osal_memcmp(const void *cs, const void *ct, int count); 250 extern void *osal_memchr(const void *s, int c, int n); 251 extern void *osal_memchr_inv(const void *s, int c, int n); 252 253 extern unsigned long long osal_strtoull(const char *cp, char **endp, unsigned int base); 254 extern unsigned long osal_strtoul(const char *cp, char **endp, unsigned int base); 255 extern long osal_strtol(const char *cp, char **endp, unsigned int base); 256 extern long long osal_strtoll(const char *cp, char **endp, unsigned int base); 257 258 /* addr translate */ 259 extern void *osal_ioremap(unsigned long phys_addr, unsigned long size); 260 extern void *osal_ioremap_nocache(unsigned long phys_addr, unsigned long size); 261 extern void *osal_ioremap_cached(unsigned long phys_addr, unsigned long size); 262 extern void *osal_ioremap_wc(unsigned long phys_addr, unsigned long size); 263 extern void osal_iounmap(void *addr, unsigned long size); 264 265 #define osal_readl(x) (*((volatile int *)(x))) 266 #define osal_writel(v, x) (*((volatile int *)(x)) = (v)) 267 268 extern unsigned long osal_copy_from_user(void *to, const void *from, unsigned long n); 269 extern unsigned long osal_copy_to_user(void *to, const void *from, unsigned long n); 270 271 #define OSAL_VERIFY_READ 0 272 #define OSAL_VERIFY_WRITE 1 273 extern int osal_access_ok(int type, const void *addr, unsigned long size); 274 275 /* cache api */ 276 extern void osal_flush_dcache_area(void *kvirt, unsigned long phys_addr, unsigned long length); 277 278 /* math */ 279 extern unsigned long long osal_div_u64(unsigned long long dividend, unsigned int divisor); 280 extern long long osal_div_s64(long long dividend, int divisor); 281 extern unsigned long long osal_div64_u64(unsigned long long dividend, unsigned long long divisor); 282 extern long long osal_div64_s64(long long dividend, long long divisor); 283 extern unsigned long long osal_div_u64_rem(unsigned long long dividend, unsigned int divisor); 284 extern long long osal_div_s64_rem(long long dividend, int divisor); 285 extern unsigned long long osal_div64_u64_rem(unsigned long long dividend, unsigned long long divisor); 286 extern unsigned int osal_random(void); 287 288 #define osal_max(x, y) ({ \ 289 __typeof__(x) _max1 = (x); \ 290 __typeof__(y) _max2 = (y); \ 291 (void) (&_max1 == &_max2); \ 292 _max1 > _max2 ? _max1 : _max2; }) 293 294 #define osal_min(x, y) ({ \ 295 __typeof__(x) _min1 = (x); \ 296 __typeof__(y) _min2 = (y); \ 297 (void) (&_min1 == &_min2); \ 298 _min1 < _min2 ? _min1 : _min2; }) 299 300 #define osal_abs(x) ({ \ 301 long ret; \ 302 if (sizeof(x) == sizeof(long)) { \ 303 long __x = (x); \ 304 ret = (__x < 0) ? -__x : __x; \ 305 } else { \ 306 int __x = (x); \ 307 ret = (__x < 0) ? -__x : __x; \ 308 } \ 309 ret; \ 310 }) 311 312 /* barrier */ 313 extern void osal_mb(void); 314 extern void osal_rmb(void); 315 extern void osal_wmb(void); 316 extern void osal_smp_mb(void); 317 extern void osal_smp_rmb(void); 318 extern void osal_smp_wmb(void); 319 extern void osal_isb(void); 320 extern void osal_dsb(void); 321 extern void osal_dmb(void); 322 323 /* debug */ 324 extern int osal_printk(const char *fmt, ...) __attribute__((format(printf, 1, 2))); 325 extern void osal_panic(const char *fmt, const char *fun, int line, const char *); 326 #define OSAL_BUG() \ 327 do { \ 328 } while (1) 329 330 #define OSAL_ASSERT(expr) \ 331 do { \ 332 if (!(expr)) { \ 333 osal_printk("\nASSERT failed at:\n" \ 334 " >Condition: %s\n", \ 335 #expr); \ 336 OSAL_BUG(); \ 337 } \ 338 } while (0) 339 340 #define OSAL_BUG_ON(expr) \ 341 do { \ 342 if (expr) { \ 343 osal_printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ 344 OSAL_BUG(); \ 345 } \ 346 } while (0) 347 348 #ifdef CONFIG_HI_LOG_TRACE_SUPPORT 349 #define osal_trace osal_printk 350 #else 351 #define osal_trace(str, fmt...) 352 #endif 353 354 /* proc */ 355 #define OSAL_MAX_PROC_NAME_LEN 50 356 typedef struct osal_proc_dir_entry { 357 char name[OSAL_MAX_PROC_NAME_LEN]; 358 void *proc_dir_entry; 359 int (*open)(struct osal_proc_dir_entry *entry); 360 int (*read)(struct osal_proc_dir_entry *entry); 361 int (*write)(struct osal_proc_dir_entry *entry, const char *buf, int count, long long *); 362 void *private; 363 void *seqfile; 364 struct osal_list_head node; 365 } osal_proc_entry_t; 366 extern osal_proc_entry_t *osal_create_proc_entry(const char *name, osal_proc_entry_t *parent); 367 extern osal_proc_entry_t *osal_proc_mkdir(const char *name, osal_proc_entry_t *parent); 368 extern void osal_remove_proc_entry(const char *name, osal_proc_entry_t *parent); 369 extern void osal_seq_printf(osal_proc_entry_t *entry, const char *fmt, ...) __attribute__((format(printf, 2, 3))); 370 371 /* device api */ 372 #ifndef _IOC_TYPECHECK 373 #include "osal_ioctl.h" 374 #endif 375 #define OSAL_MAX_DEV_NAME_LEN 48 376 377 typedef struct osal_dev { 378 struct osal_list_head list; 379 char name[OSAL_MAX_DEV_NAME_LEN]; 380 void *dev; 381 unsigned int minor; 382 unsigned int count; 383 struct osal_fileops *fops; 384 struct osal_pmops *osal_pmops; 385 } osal_dev_t; 386 387 typedef struct osal_vm { 388 void *vm; 389 } osal_vm_t; 390 391 #define OSAL_POLLIN 0x0001U 392 #define OSAL_POLLPRI 0x0002U 393 #define OSAL_POLLOUT 0x0004U 394 #define OSAL_POLLERR 0x0008U 395 #define OSAL_POLLHUP 0x0010U 396 #define OSAL_POLLNVAL 0x0020U 397 #define OSAL_POLLRDNORM 0x0040U 398 #define OSAL_POLLRDBAND 0x0080U 399 #define OSAL_POLLWRNORM 0x0100U 400 401 typedef struct osal_poll { 402 void *poll_table; 403 void *data; 404 } osal_poll_t; 405 406 typedef struct osal_fileops { 407 int (*open)(void *private_data); 408 int (*read)(char *buf, int size, long *offset, void *private_data); 409 int (*write)(const char *buf, int size, long *offset, void *private_data); 410 long (*llseek)(long offset, int whence, void *private_data); 411 int (*release)(void *private_data); 412 long (*unlocked_ioctl)(unsigned int cmd, unsigned long arg, void *private_data); 413 unsigned int (*poll)(osal_poll_t *osal_poll, void *private_data); 414 int (*mmap)(osal_vm_t *vm, unsigned long start, unsigned long end, unsigned long vm_pgoff, void *private_data); 415 #ifdef CONFIG_COMPAT 416 long (*compat_ioctl)(unsigned int cmd, unsigned long arg, void *private_data); 417 #endif 418 } osal_fileops_t; 419 420 typedef struct osal_pmops { 421 int (*pm_prepare)(osal_dev_t *dev); 422 void (*pm_complete)(osal_dev_t *dev); 423 int (*pm_suspend)(osal_dev_t *dev); 424 int (*pm_resume)(osal_dev_t *dev); 425 int (*pm_freeze)(osal_dev_t *dev); 426 int (*pm_thaw)(osal_dev_t *dev); 427 int (*pm_poweroff)(osal_dev_t *dev); 428 int (*pm_restore)(osal_dev_t *dev); 429 int (*pm_suspend_late)(osal_dev_t *dev); 430 int (*pm_resume_early)(osal_dev_t *dev); 431 int (*pm_freeze_late)(osal_dev_t *dev); 432 int (*pm_thaw_early)(osal_dev_t *dev); 433 int (*pm_poweroff_late)(osal_dev_t *dev); 434 int (*pm_restore_early)(osal_dev_t *dev); 435 int (*pm_suspend_noirq)(osal_dev_t *dev); 436 int (*pm_resume_noirq)(osal_dev_t *dev); 437 int (*pm_freeze_noirq)(osal_dev_t *dev); 438 int (*pm_thaw_noirq)(osal_dev_t *dev); 439 int (*pm_poweroff_noirq)(osal_dev_t *dev); 440 int (*pm_restore_noirq)(osal_dev_t *dev); 441 } osal_pmops_t; 442 443 #define OSAL_SEEK_SET 0 444 #define OSAL_SEEK_CUR 1 445 #define OSAL_SEEK_END 2 446 447 extern osal_dev_t *osal_createdev(const char *name); 448 extern int osal_destroydev(osal_dev_t *pdev); 449 extern int osal_registerdevice(osal_dev_t *pdev); 450 extern void osal_deregisterdevice(osal_dev_t *pdev); 451 extern void osal_poll_wait(osal_poll_t *table, osal_wait_t *wait); 452 extern void osal_pgprot_noncached(osal_vm_t *vm); 453 extern void osal_pgprot_cached(osal_vm_t *vm); 454 extern void osal_pgprot_writecombine(osal_vm_t *vm); 455 extern int osal_remap_pfn_range(osal_vm_t *vm, unsigned long addr, unsigned long pfn, unsigned long size); 456 457 /* timer */ 458 typedef struct osal_timer { 459 void *timer; 460 void (*function)(unsigned long); 461 unsigned long data; 462 } osal_timer_t; 463 464 typedef struct osal_timeval { 465 long tv_sec; 466 long tv_usec; 467 } osal_timeval_t; 468 469 typedef struct osal_rtc_time { 470 int tm_sec; 471 int tm_min; 472 int tm_hour; 473 int tm_mday; 474 int tm_mon; 475 int tm_year; 476 int tm_wday; 477 int tm_yday; 478 int tm_isdst; 479 } osal_rtc_time_t; 480 481 /* Return values for the timer callback function */ 482 typedef enum hiOSAL_HRTIMER_RESTART_E { 483 OSAL_HRTIMER_NORESTART, /* < The timer will not be restarted. */ 484 OSAL_HRTIMER_RESTART /* < The timer must be restarted. */ 485 } OSAL_HRTIMER_RESTART_E; 486 487 /* hrtimer struct */ 488 typedef struct osal_hrtimer { 489 void *timer; 490 OSAL_HRTIMER_RESTART_E (*function)(void *timer); 491 unsigned long interval; /* Unit ms */ 492 } osal_hrtimer_t; 493 494 extern int osal_hrtimer_create(osal_hrtimer_t *phrtimer); 495 extern int osal_hrtimer_start(osal_hrtimer_t *phrtimer); 496 extern int osal_hrtimer_destroy(osal_hrtimer_t *phrtimer); 497 498 extern int osal_timer_init(osal_timer_t *timer); 499 extern int osal_set_timer(osal_timer_t *timer, unsigned long interval); /* ms */ 500 extern unsigned long osal_timer_get_private_data(void *data); 501 extern int osal_del_timer(osal_timer_t *timer); 502 extern int osal_timer_destroy(osal_timer_t *timer); 503 504 extern unsigned long osal_msleep(unsigned int msecs); 505 extern void osal_udelay(unsigned int usecs); 506 extern void osal_mdelay(unsigned int msecs); 507 508 extern unsigned int osal_get_tickcount(void); 509 extern unsigned long long osal_sched_clock(void); 510 extern void osal_gettimeofday(osal_timeval_t *tv); 511 extern void osal_rtc_time_to_tm(unsigned long time, osal_rtc_time_t *tm); 512 extern void osal_rtc_tm_to_time(osal_rtc_time_t *tm, unsigned long *time); 513 extern int osal_rtc_valid_tm(struct osal_rtc_time *tm); 514 extern void osal_getjiffies(unsigned long long *pjiffies); 515 516 #define OSAL_O_ACCMODE 00000003 517 #define OSAL_O_RDONLY 00000000 518 #define OSAL_O_WRONLY 00000001 519 #define OSAL_O_RDWR 00000002 520 #define OSAL_O_CREAT 00000100 521 522 extern void *osal_klib_fopen(const char *filename, int flags, int mode); 523 extern void osal_klib_fclose(void *filp); 524 extern int osal_klib_fwrite(const char *buf, int len, void *filp); 525 extern int osal_klib_fread(char *buf, unsigned int len, void *filp); 526 527 /* reboot */ 528 struct osal_notifier_block { 529 int (*notifier_call)(struct osal_notifier_block *nb, unsigned long action, void *data); 530 void *notifier_block; 531 }; 532 typedef int (*osal_notifier_fn_t)(struct osal_notifier_block *nb, unsigned long action, void *data); 533 534 extern int osal_register_reboot_notifier(struct osal_notifier_block *nb); 535 extern int osal_unregister_reboot_notifier(struct osal_notifier_block *nb); 536 537 #include <stdarg.h> 538 539 #ifndef _OSAL_VA_LIST 540 541 #define _OSAL_VA_LIST 542 #define osal_va_list va_list 543 #define osal_va_arg(ap, T) va_arg(ap, T) 544 #define osal_va_end(ap) va_end(ap) 545 #define osal_va_start(ap, A) va_start(ap, A) 546 547 #endif /* va_arg */ 548 549 #define NULL_STRING "NULL" 550 551 extern void osal_vprintk(const char *fmt, osal_va_list args); 552 553 #define osal_platform_get_module_param(pdev, name, type, value) \ 554 osal_platform_get_modparam_##type(pdev, name, value) 555 556 int osal_platform_get_modparam_uint(void *pdev, const char *name, unsigned int *value); 557 int osal_platform_get_modparam_int(void *pdev, const char *name, int *value); 558 int osal_platform_get_modparam_string(void *pdev, const char *name, unsigned int size, char *value); 559 int osal_platform_get_modparam_uchar(void *pdev, const char *name, unsigned char *value); 560 int osal_platform_get_modparam_ushort(void *pdev, const char *name, unsigned short *value); 561 /* of function */ 562 int osal_of_property_read_u32(const void *np, const char *propname, unsigned int *value); 563 564 int osal_platform_driver_register(void *drv); 565 void osal_platform_driver_unregister(void *drv); 566 void *osal_platform_get_resource_byname(void *dev, unsigned int type, 567 const char *name); 568 void *osal_platform_get_resource(void *dev, unsigned int type, 569 unsigned int num); 570 int osal_platform_get_irq(void *dev, unsigned int num); 571 int osal_platform_get_irq_byname(void *dev, const char *name); 572 573 #define osal_module_driver(osal_driver, osal_register, osal_unregister, ...) \ 574 static int __init osal_driver##_init(void) \ 575 { \ 576 return osal_register(&(osal_driver)); \ 577 } \ 578 module_init(osal_driver##_init); \ 579 static void __exit osal_driver##_exit(void) \ 580 { \ 581 osal_unregister(&(osal_driver)); \ 582 } \ 583 module_exit(osal_driver##_exit); 584 585 #define osal_module_platform_driver(platform_driver) \ 586 osal_module_driver(platform_driver, osal_platform_driver_register, \ 587 osal_platform_driver_unregister) 588 589 /* mmz apis */ 590 extern unsigned long long cmpi_mmz_malloc(const char *mmz_name, const char *buf_name, unsigned long ul_size); 591 extern void cmpi_mmz_free(unsigned long long phy_addr, void *vir_addr); 592 extern int cmpi_mmz_malloc_nocache(const char *cp_mmz_name, const char *buf_name, 593 unsigned long long *phy_addr, void **pp_vir_addr, unsigned long ul_len); 594 extern int cmpi_mmz_malloc_cached(const char *cp_mmz_name, const char *buf_name, 595 unsigned long long *phy_addr, void **pp_vir_addr, unsigned long ul_len); 596 extern int cmpi_check_mmz_phy_addr(unsigned long long phy_addr, unsigned int len); 597 598 void *cmpi_remap_cached(unsigned long long phy_addr, unsigned long ul_size); 599 void *cmpi_remap_nocache(unsigned long long phy_addr, unsigned long ul_size); 600 void cmpi_unmap(void *virt_addr); 601 602 #ifdef CONFIG_USER_SPACE 603 extern int cmpi_get_fd(void); 604 extern void cmpi_set_fd(int fd); 605 #endif 606 607 #ifndef IORESOURCE_MEM 608 #define IORESOURCE_MEM 0x00000200 609 #endif 610 611 #endif /* __HI_OSAL__ */ 612