Ignore:
Timestamp:
Sep 2, 2022, 4:26:36 AM (3 years ago)
Author:
Paul Smedley
Message:

WIP trying to fix non-HDA Hardware

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/branches/uniaud32-next/lib32/devres.c

    r716 r718  
    1313#include <linux/gfp.h>
    1414#include <linux/errno.h>
     15#include <asm/io.h>
    1516
    1617struct devres_node {
    1718        struct list_head                entry;
    1819        dr_release_t                    release;
    19 #ifdef CONFIG_DEBUG_DEVRES
    2020        const char                      *name;
    2121        size_t                          size;
    22 #endif
    2322};
    2423
     
    2625        struct devres_node              node;
    2726        /* -- 3 pointers */
    28         unsigned long long              data[]; /* guarantee ull alignment */
     27        u8              data[]; /* guarantee ull alignment */
    2928};
    3029
     
    3635};
    3736
     37static void set_node_dbginfo(struct devres_node *node, const char *name,
     38                             size_t size)
     39{
     40        node->name = name;
     41        node->size = size;
     42}
     43
    3844#define devres_log(dev, node, op)       do {} while (0)
    3945
     
    8389        BUG_ON(!list_empty(&node->entry));
    8490//#ifndef TARGET_OS2
    85         /* Traps here on OS/2 */
     91        /* Traps here on OS/2 - release builds on non-HDA hardware only */
     92        rprintf(("add_dr"));
    8693        list_add_tail(&node->entry, &dev->devres_head);
     94        rprintf(("add_dr2"));
    8795//#endif
    8896}
     
    99107void devres_add(struct device *dev, void *res)
    100108{
    101         /* Traps here on OS/2 */
    102109        struct devres *dr = container_of(res, struct devres, data);
    103110        unsigned long flags;
     111
    104112        spin_lock_irqsave(&dev->devres_lock, flags);
    105113        add_dr(dev, &dr->node);
     
    108116
    109117/**
    110  * devres_alloc - Allocate device resource data
     118 * __devres_alloc_node - Allocate device resource data
    111119 * @release: Release function devres will be associated with
    112120 * @size: Allocation size
    113121 * @gfp: Allocation flags
    114122 * @nid: NUMA node
     123 * @name: Name of the resource
    115124 *
    116125 * Allocate devres of @size bytes.  The allocated area is zeroed, then
     
    121130 * Pointer to allocated devres on success, NULL on failure.
    122131 */
    123 void * devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid)
     132void *__devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid,
     133                          const char *name)
    124134{
    125135        struct devres *dr;
    126136
    127137        dr = alloc_dr(release, size, gfp | __GFP_ZERO, nid);
     138        if (unlikely(!dr))
     139                return NULL;
     140        set_node_dbginfo(&dr->node, name, size);
    128141        return dr->data;
    129142}
     
    145158}
    146159
     160#if 0 //2022-09-02
    147161static int remove_nodes(struct device *dev,
    148162                        struct list_head *first, struct list_head *end,
     
    257271                             flags);
    258272}
     273#endif
    259274
    260275static struct devres *find_dr(struct device *dev, dr_release_t release,
     
    305320}
    306321
     322/*
     323 * Custom devres actions allow inserting a simple function call
     324 * into the teadown sequence.
     325 */
     326
     327struct action_devres {
     328        void *data;
     329        void (*action)(void *);
     330};
     331
     332static void devm_action_release(struct device *dev, void *res)
     333{
     334        struct action_devres *devres = res;
     335
     336        devres->action(devres->data);
     337}
     338
    307339/**
    308340 * devm_add_action() - add a custom action to list of managed resources
     
    316348int devm_add_action(struct device *dev, void (*action)(void *), void *data)
    317349{
     350        struct action_devres *devres;
     351
     352        devres = devres_alloc(devm_action_release,
     353                              sizeof(struct action_devres), GFP_KERNEL);
     354        if (!devres)
     355                return -ENOMEM;
     356
     357        devres->data = data;
     358        devres->action = action;
     359
     360        devres_add(dev, devres);
     361
    318362        return 0;
    319363}
     
    331375{
    332376}
     377
     378/*
     379 * Managed kmalloc/kfree
     380 */
     381static void devm_kmalloc_release(struct device *dev, void *res)
     382{
     383        /* noop */
     384}
     385
     386static int devm_kmalloc_match(struct device *dev, void *res, void *data)
     387{
     388        return res == data;
     389}
     390
     391/**
     392 * devm_kmalloc - Resource-managed kmalloc
     393 * @dev: Device to allocate memory for
     394 * @size: Allocation size
     395 * @gfp: Allocation gfp flags
     396 *
     397 * Managed kmalloc.  Memory allocated with this function is
     398 * automatically freed on driver detach.  Like all other devres
     399 * resources, guaranteed alignment is unsigned long long.
     400 *
     401 * RETURNS:
     402 * Pointer to allocated memory on success, NULL on failure.
     403 */
     404void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)
     405{
     406        struct devres *dr;
     407
     408        if (unlikely(!size))
     409                return ZERO_SIZE_PTR;
     410
     411        /* use raw alloc_dr for kmalloc caller tracing */
     412        dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
     413        if (unlikely(!dr))
     414                return NULL;
     415
     416        /*
     417         * This is named devm_kzalloc_release for historical reasons
     418         * The initial implementation did not support kmalloc, only kzalloc
     419         */
     420        set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);
     421        devres_add(dev, dr->data);
     422        return dr->data;
     423}
     424EXPORT_SYMBOL_GPL(devm_kmalloc);
     425
     426enum devm_ioremap_type {
     427        DEVM_IOREMAP = 0,
     428        DEVM_IOREMAP_UC,
     429        DEVM_IOREMAP_WC,
     430        DEVM_IOREMAP_NP,
     431};
     432
     433void devm_ioremap_release(struct device *dev, void *res)
     434{
     435        iounmap(*(void __iomem **)res);
     436}
     437
     438static int devm_ioremap_match(struct device *dev, void *res, void *match_data)
     439{
     440        return *(void **)res == match_data;
     441}
     442
     443static void *__devm_ioremap(struct device *dev, resource_size_t offset,
     444                                    resource_size_t size,
     445                                    enum devm_ioremap_type type)
     446{
     447        void __iomem **ptr, *addr = NULL;
     448
     449        ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
     450        if (!ptr)
     451                return NULL;
     452
     453        switch (type) {
     454        case DEVM_IOREMAP:
     455                addr = ioremap(offset, size);
     456                break;
     457#if 0
     458        case DEVM_IOREMAP_UC:
     459                addr = ioremap_uc(offset, size);
     460                break;
     461        case DEVM_IOREMAP_WC:
     462                addr = ioremap_wc(offset, size);
     463                break;
     464        case DEVM_IOREMAP_NP:
     465                addr = ioremap_np(offset, size);
     466                break;
     467#endif
     468        }
     469
     470        if (addr) {
     471                *ptr = addr;
     472                devres_add(dev, ptr);
     473        } else
     474                devres_free(ptr);
     475
     476        return addr;
     477}
     478
     479/**
     480 * devm_ioremap - Managed ioremap()
     481 * @dev: Generic device to remap IO address for
     482 * @offset: Resource address to map
     483 * @size: Size of map
     484 *
     485 * Managed ioremap().  Map is automatically unmapped on driver detach.
     486 */
     487void __iomem *devm_ioremap(struct device *dev, resource_size_t offset,
     488                           resource_size_t size)
     489{
     490        return __devm_ioremap(dev, offset, size, DEVM_IOREMAP);
     491}
     492EXPORT_SYMBOL(devm_ioremap);
Note: See TracChangeset for help on using the changeset viewer.