cregit-Linux how code gets into the kernel

Release 4.14 arch/powerpc/platforms/powermac/backlight.c

/*
 * Miscellaneous procedures for dealing with the PowerMac hardware.
 * Contains support for the backlight.
 *
 *   Copyright (C) 2000 Benjamin Herrenschmidt
 *   Copyright (C) 2006 Michael Hanselmann <linux-kernel@hansmi.ch>
 *
 */

#include <linux/kernel.h>
#include <linux/fb.h>
#include <linux/backlight.h>
#include <linux/adb.h>
#include <linux/pmu.h>
#include <linux/atomic.h>
#include <linux/export.h>
#include <asm/prom.h>
#include <asm/backlight.h>


#define OLD_BACKLIGHT_MAX 15

static void pmac_backlight_key_worker(struct work_struct *work);
static void pmac_backlight_set_legacy_worker(struct work_struct *work);

static DECLARE_WORK(pmac_backlight_key_work, pmac_backlight_key_worker);
static DECLARE_WORK(pmac_backlight_set_legacy_work, pmac_backlight_set_legacy_worker);

/* Although these variables are used in interrupt context, it makes no sense to
 * protect them. No user is able to produce enough key events per second and
 * notice the errors that might happen.
 */

static int pmac_backlight_key_queued;

static int pmac_backlight_set_legacy_queued;

/* The via-pmu code allows the backlight to be grabbed, in which case the
 * in-kernel control of the brightness needs to be disabled. This should
 * only be used by really old PowerBooks.
 */

static atomic_t kernel_backlight_disabled = ATOMIC_INIT(0);

/* Protect the pmac_backlight variable below.
   You should hold this lock when using the pmac_backlight pointer to
   prevent its potential removal. */

DEFINE_MUTEX(pmac_backlight_mutex);

/* Main backlight storage
 *
 * Backlight drivers in this variable are required to have the "ops"
 * attribute set and to have an update_status function.
 *
 * We can only store one backlight here, but since Apple laptops have only one
 * internal display, it doesn't matter. Other backlight drivers can be used
 * independently.
 *
 */

struct backlight_device *pmac_backlight;


int pmac_has_backlight_type(const char *type) { struct device_node* bk_node = of_find_node_by_name(NULL, "backlight"); if (bk_node) { const char *prop = of_get_property(bk_node, "backlight-control", NULL); if (prop && strncmp(prop, type, strlen(type)) == 0) { of_node_put(bk_node); return 1; } of_node_put(bk_node); } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Paul Mackerras4760.26%120.00%
Stephen Rothwell1620.51%240.00%
Michael Hanselmann1417.95%120.00%
Jeremy Kerr11.28%120.00%
Total78100.00%5100.00%


int pmac_backlight_curve_lookup(struct fb_info *info, int value) { int level = (FB_BACKLIGHT_LEVELS - 1); if (info && info->bl_dev) { int i, max = 0; /* Look for biggest value */ for (i = 0; i < FB_BACKLIGHT_LEVELS; i++) max = max((int)info->bl_curve[i], max); /* Look for nearest value */ for (i = 0; i < FB_BACKLIGHT_LEVELS; i++) { int diff = abs(info->bl_curve[i] - value); if (diff < max) { max = diff; level = i; } } } return level; }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann9276.67%150.00%
Paul Mackerras2823.33%150.00%
Total120100.00%2100.00%


static void pmac_backlight_key_worker(struct work_struct *work) { if (atomic_read(&kernel_backlight_disabled)) return; mutex_lock(&pmac_backlight_mutex); if (pmac_backlight) { struct backlight_properties *props; int brightness; props = &pmac_backlight->props; brightness = props->brightness + ((pmac_backlight_key_queued?-1:1) * (props->max_brightness / 15)); if (brightness < 0) brightness = 0; else if (brightness > props->max_brightness) brightness = props->max_brightness; props->brightness = brightness; backlight_update_status(pmac_backlight); } mutex_unlock(&pmac_backlight_mutex); }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann8675.44%342.86%
Paul Mackerras2320.18%114.29%
David Howells32.63%114.29%
Richard Purdie21.75%228.57%
Total114100.00%7100.00%

/* This function is called in interrupt context */
void pmac_backlight_key(int direction) { if (atomic_read(&kernel_backlight_disabled)) return; /* we can receive multiple interrupts here, but the scheduled work * will run only once, with the last value */ pmac_backlight_key_queued = direction; schedule_work(&pmac_backlight_key_work); }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann2692.86%375.00%
Paul Mackerras27.14%125.00%
Total28100.00%4100.00%


static int __pmac_backlight_set_legacy_brightness(int brightness) { int error = -ENXIO; mutex_lock(&pmac_backlight_mutex); if (pmac_backlight) { struct backlight_properties *props; props = &pmac_backlight->props; props->brightness = brightness * (props->max_brightness + 1) / (OLD_BACKLIGHT_MAX + 1); if (props->brightness > props->max_brightness) props->brightness = props->max_brightness; else if (props->brightness < 0) props->brightness = 0; backlight_update_status(pmac_backlight); error = 0; } mutex_unlock(&pmac_backlight_mutex); return error; }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann8880.00%350.00%
Paul Mackerras2018.18%116.67%
Richard Purdie21.82%233.33%
Total110100.00%6100.00%


static void pmac_backlight_set_legacy_worker(struct work_struct *work) { if (atomic_read(&kernel_backlight_disabled)) return; __pmac_backlight_set_legacy_brightness(pmac_backlight_set_legacy_queued); }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann2288.00%150.00%
David Howells312.00%150.00%
Total25100.00%2100.00%

/* This function is called in interrupt context */
void pmac_backlight_set_legacy_brightness_pmu(int brightness) { if (atomic_read(&kernel_backlight_disabled)) return; pmac_backlight_set_legacy_queued = brightness; schedule_work(&pmac_backlight_set_legacy_work); }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann27100.00%1100.00%
Total27100.00%1100.00%


int pmac_backlight_set_legacy_brightness(int brightness) { return __pmac_backlight_set_legacy_brightness(brightness); }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann14100.00%1100.00%
Total14100.00%1100.00%


int pmac_backlight_get_legacy_brightness() { int result = -ENXIO; mutex_lock(&pmac_backlight_mutex); if (pmac_backlight) { struct backlight_properties *props; props = &pmac_backlight->props; result = props->brightness * (OLD_BACKLIGHT_MAX + 1) / (props->max_brightness + 1); } mutex_unlock(&pmac_backlight_mutex); return result; }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann5078.12%250.00%
Paul Mackerras1320.31%125.00%
Richard Purdie11.56%125.00%
Total64100.00%4100.00%


void pmac_backlight_disable() { atomic_inc(&kernel_backlight_disabled); }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann11100.00%1100.00%
Total11100.00%1100.00%


void pmac_backlight_enable() { atomic_dec(&kernel_backlight_disabled); }

Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann11100.00%1100.00%
Total11100.00%1100.00%

EXPORT_SYMBOL_GPL(pmac_backlight); EXPORT_SYMBOL_GPL(pmac_backlight_mutex); EXPORT_SYMBOL_GPL(pmac_has_backlight_type);

Overall Contributors

PersonTokensPropCommitsCommitProp
Michael Hanselmann53073.82%430.77%
Paul Mackerras14820.61%17.69%
Stephen Rothwell162.23%215.38%
David Howells121.67%17.69%
Richard Purdie70.97%215.38%
Paul Gortmaker30.42%17.69%
Jeremy Kerr10.14%17.69%
Arun Sharma10.14%17.69%
Total718100.00%13100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.