firmware.h revision 1.4
11.4Sriastrad/* $NetBSD: firmware.h,v 1.4 2014/07/17 20:37:01 riastradh Exp $ */ 21.2Sriastrad 31.2Sriastrad/*- 41.2Sriastrad * Copyright (c) 2013 The NetBSD Foundation, Inc. 51.2Sriastrad * All rights reserved. 61.2Sriastrad * 71.2Sriastrad * This code is derived from software contributed to The NetBSD Foundation 81.2Sriastrad * by Taylor R. Campbell. 91.2Sriastrad * 101.2Sriastrad * Redistribution and use in source and binary forms, with or without 111.2Sriastrad * modification, are permitted provided that the following conditions 121.2Sriastrad * are met: 131.2Sriastrad * 1. Redistributions of source code must retain the above copyright 141.2Sriastrad * notice, this list of conditions and the following disclaimer. 151.2Sriastrad * 2. Redistributions in binary form must reproduce the above copyright 161.2Sriastrad * notice, this list of conditions and the following disclaimer in the 171.2Sriastrad * documentation and/or other materials provided with the distribution. 181.2Sriastrad * 191.2Sriastrad * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.2Sriastrad * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.2Sriastrad * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.2Sriastrad * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.2Sriastrad * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.2Sriastrad * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.2Sriastrad * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.2Sriastrad * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.2Sriastrad * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.2Sriastrad * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.2Sriastrad * POSSIBILITY OF SUCH DAMAGE. 301.2Sriastrad */ 311.2Sriastrad 321.2Sriastrad#ifndef _LINUX_FIRMWARE_H_ 331.2Sriastrad#define _LINUX_FIRMWARE_H_ 341.2Sriastrad 351.3Sriastrad#include <sys/types.h> 361.3Sriastrad#include <sys/device.h> 371.3Sriastrad#include <sys/kmem.h> 381.3Sriastrad#include <sys/systm.h> 391.3Sriastrad 401.3Sriastrad#include <dev/firmload.h> 411.3Sriastrad 421.3Sriastradstruct device; 431.3Sriastrad 441.3Sriastradstruct firmware { 451.3Sriastrad firmware_handle_t fw_h; 461.3Sriastrad void *data; 471.3Sriastrad size_t size; 481.3Sriastrad}; 491.3Sriastrad 501.3Sriastradstatic inline int 511.3Sriastradrequest_firmware(const struct firmware **fwp, const char *image_name, 521.3Sriastrad struct device *dev) 531.3Sriastrad{ 541.3Sriastrad struct firmware *fw; 551.3Sriastrad int ret; 561.3Sriastrad 571.3Sriastrad fw = kmem_alloc(sizeof(*fw), KM_SLEEP); 581.3Sriastrad 591.3Sriastrad /* XXX errno NetBSD->Linux */ 601.3Sriastrad ret = -firmware_open(device_cfdriver(dev)->cd_name, image_name, 611.3Sriastrad &fw->fw_h); 621.3Sriastrad if (ret) 631.3Sriastrad goto fail0; 641.3Sriastrad fw->size = firmware_get_size(fw->fw_h); 651.3Sriastrad fw->data = firmware_malloc(fw->size); 661.3Sriastrad 671.3Sriastrad /* XXX errno NetBSD->Linux */ 681.3Sriastrad ret = -firmware_read(fw->fw_h, 0, fw->data, fw->size); 691.3Sriastrad if (ret) 701.3Sriastrad goto fail1; 711.3Sriastrad 721.3Sriastrad /* Success! */ 731.3Sriastrad *fwp = fw; 741.3Sriastrad return 0; 751.3Sriastrad 761.3Sriastradfail1: firmware_free(fw->data, fw->size); 771.3Sriastradfail0: KASSERT(ret); 781.3Sriastrad kmem_free(fw, sizeof(*fw)); 791.4Sriastrad *fwp = NULL; 801.3Sriastrad return ret; 811.3Sriastrad} 821.3Sriastrad 831.3Sriastradstatic inline void 841.3Sriastradrelease_firmware(const struct firmware *fw) 851.3Sriastrad{ 861.3Sriastrad 871.4Sriastrad if (fw != NULL) { 881.4Sriastrad firmware_free(fw->data, fw->size); 891.4Sriastrad kmem_free(__UNCONST(fw), sizeof(*fw)); 901.4Sriastrad } 911.3Sriastrad} 921.3Sriastrad 931.2Sriastrad#endif /* _LINUX_FIRMWARE_H_ */ 94