mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (53 commits) powerpc: Support for relocatable kdump kernel powerpc: Don't use a 16G page if beyond mem= limits powerpc: Add del_node() for early boot code to prune inapplicable devices. powerpc: Further compile fixup for STRICT_MM_TYPECHECKS powerpc: Remove empty #else from signal_64.c powerpc: Move memory size print into common show_cpuinfo for 32-bit hvc_console: Remove __devexit annotation of hvc_remove() hvc_console: Add support for tty window resizing hvc_console: Fix loop if put_char() returns 0 hvc_console: Add tty driver flag TTY_DRIVER_RESET_TERMIOS hvc_console: Add a hangup notifier for backends powerpc/83xx: Add DS1339 RTC support for MPC8349E-mITX boards .dts powerpc/83xx: Add support for MCU microcontroller in .dts files powerpc/85xx: Move mpc8572ds.dts to address-cells/size-cells = <2> of/spi: Support specifying chip select as active high via device tree powerpc: Remove device_type = "board_control" properties in .dts files i2c-cpm: Suppress autoprobing for devices powerpc/85xx: Fix mpc8536ds dma interrupt numbers powerpc/85xx: Enable enhanced functions for 8536 TSEC powerpc: Delete unused prom_strtoul and prom_memparse ...
This commit is contained in:
commit
9bf9b2f3ad
96 changed files with 3745 additions and 414 deletions
|
|
@ -161,7 +161,7 @@ static void hvc_console_print(struct console *co, const char *b,
|
|||
}
|
||||
} else {
|
||||
r = cons_ops[index]->put_chars(vtermnos[index], c, i);
|
||||
if (r < 0) {
|
||||
if (r <= 0) {
|
||||
/* throw away chars on error */
|
||||
i = 0;
|
||||
} else if (r > 0) {
|
||||
|
|
@ -374,6 +374,9 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
|
|||
if (hp->ops->notifier_del)
|
||||
hp->ops->notifier_del(hp, hp->data);
|
||||
|
||||
/* cancel pending tty resize work */
|
||||
cancel_work_sync(&hp->tty_resize);
|
||||
|
||||
/*
|
||||
* Chain calls chars_in_buffer() and returns immediately if
|
||||
* there is no buffered data otherwise sleeps on a wait queue
|
||||
|
|
@ -399,6 +402,9 @@ static void hvc_hangup(struct tty_struct *tty)
|
|||
if (!hp)
|
||||
return;
|
||||
|
||||
/* cancel pending tty resize work */
|
||||
cancel_work_sync(&hp->tty_resize);
|
||||
|
||||
spin_lock_irqsave(&hp->lock, flags);
|
||||
|
||||
/*
|
||||
|
|
@ -418,8 +424,8 @@ static void hvc_hangup(struct tty_struct *tty)
|
|||
|
||||
spin_unlock_irqrestore(&hp->lock, flags);
|
||||
|
||||
if (hp->ops->notifier_del)
|
||||
hp->ops->notifier_del(hp, hp->data);
|
||||
if (hp->ops->notifier_hangup)
|
||||
hp->ops->notifier_hangup(hp, hp->data);
|
||||
|
||||
while(temp_open_count) {
|
||||
--temp_open_count;
|
||||
|
|
@ -431,7 +437,7 @@ static void hvc_hangup(struct tty_struct *tty)
|
|||
* Push buffered characters whether they were just recently buffered or waiting
|
||||
* on a blocked hypervisor. Call this function with hp->lock held.
|
||||
*/
|
||||
static void hvc_push(struct hvc_struct *hp)
|
||||
static int hvc_push(struct hvc_struct *hp)
|
||||
{
|
||||
int n;
|
||||
|
||||
|
|
@ -439,7 +445,7 @@ static void hvc_push(struct hvc_struct *hp)
|
|||
if (n <= 0) {
|
||||
if (n == 0) {
|
||||
hp->do_wakeup = 1;
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
/* throw away output on error; this happens when
|
||||
there is no session connected to the vterm. */
|
||||
|
|
@ -450,6 +456,8 @@ static void hvc_push(struct hvc_struct *hp)
|
|||
memmove(hp->outbuf, hp->outbuf + n, hp->n_outbuf);
|
||||
else
|
||||
hp->do_wakeup = 1;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count)
|
||||
|
|
@ -492,6 +500,39 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count
|
|||
return written;
|
||||
}
|
||||
|
||||
/**
|
||||
* hvc_set_winsz() - Resize the hvc tty terminal window.
|
||||
* @work: work structure.
|
||||
*
|
||||
* The routine shall not be called within an atomic context because it
|
||||
* might sleep.
|
||||
*
|
||||
* Locking: hp->lock
|
||||
*/
|
||||
static void hvc_set_winsz(struct work_struct *work)
|
||||
{
|
||||
struct hvc_struct *hp;
|
||||
unsigned long hvc_flags;
|
||||
struct tty_struct *tty;
|
||||
struct winsize ws;
|
||||
|
||||
hp = container_of(work, struct hvc_struct, tty_resize);
|
||||
if (!hp)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&hp->lock, hvc_flags);
|
||||
if (!hp->tty) {
|
||||
spin_unlock_irqrestore(&hp->lock, hvc_flags);
|
||||
return;
|
||||
}
|
||||
ws = hp->ws;
|
||||
tty = tty_kref_get(hp->tty);
|
||||
spin_unlock_irqrestore(&hp->lock, hvc_flags);
|
||||
|
||||
tty_do_resize(tty, tty, &ws);
|
||||
tty_kref_put(tty);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is actually a contract between the driver and the tty layer outlining
|
||||
* how much write room the driver can guarantee will be sent OR BUFFERED. This
|
||||
|
|
@ -538,16 +579,20 @@ int hvc_poll(struct hvc_struct *hp)
|
|||
char buf[N_INBUF] __ALIGNED__;
|
||||
unsigned long flags;
|
||||
int read_total = 0;
|
||||
int written_total = 0;
|
||||
|
||||
spin_lock_irqsave(&hp->lock, flags);
|
||||
|
||||
/* Push pending writes */
|
||||
if (hp->n_outbuf > 0)
|
||||
hvc_push(hp);
|
||||
written_total = hvc_push(hp);
|
||||
|
||||
/* Reschedule us if still some write pending */
|
||||
if (hp->n_outbuf > 0)
|
||||
if (hp->n_outbuf > 0) {
|
||||
poll_mask |= HVC_POLL_WRITE;
|
||||
/* If hvc_push() was not able to write, sleep a few msecs */
|
||||
timeout = (written_total) ? 0 : MIN_TIMEOUT;
|
||||
}
|
||||
|
||||
/* No tty attached, just skip */
|
||||
tty = hp->tty;
|
||||
|
|
@ -632,6 +677,24 @@ int hvc_poll(struct hvc_struct *hp)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(hvc_poll);
|
||||
|
||||
/**
|
||||
* hvc_resize() - Update terminal window size information.
|
||||
* @hp: HVC console pointer
|
||||
* @ws: Terminal window size structure
|
||||
*
|
||||
* Stores the specified window size information in the hvc structure of @hp.
|
||||
* The function schedule the tty resize update.
|
||||
*
|
||||
* Locking: Locking free; the function MUST be called holding hp->lock
|
||||
*/
|
||||
void hvc_resize(struct hvc_struct *hp, struct winsize ws)
|
||||
{
|
||||
if ((hp->ws.ws_row != ws.ws_row) || (hp->ws.ws_col != ws.ws_col)) {
|
||||
hp->ws = ws;
|
||||
schedule_work(&hp->tty_resize);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This kthread is either polling or interrupt driven. This is determined by
|
||||
* calling hvc_poll() who determines whether a console adapter support
|
||||
|
|
@ -659,10 +722,6 @@ static int khvcd(void *unused)
|
|||
poll_mask |= HVC_POLL_READ;
|
||||
if (hvc_kicked)
|
||||
continue;
|
||||
if (poll_mask & HVC_POLL_WRITE) {
|
||||
yield();
|
||||
continue;
|
||||
}
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
if (!hvc_kicked) {
|
||||
if (poll_mask == 0)
|
||||
|
|
@ -718,6 +777,7 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int data,
|
|||
|
||||
kref_init(&hp->kref);
|
||||
|
||||
INIT_WORK(&hp->tty_resize, hvc_set_winsz);
|
||||
spin_lock_init(&hp->lock);
|
||||
spin_lock(&hvc_structs_lock);
|
||||
|
||||
|
|
@ -743,7 +803,7 @@ struct hvc_struct __devinit *hvc_alloc(uint32_t vtermno, int data,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(hvc_alloc);
|
||||
|
||||
int __devexit hvc_remove(struct hvc_struct *hp)
|
||||
int hvc_remove(struct hvc_struct *hp)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct tty_struct *tty;
|
||||
|
|
@ -796,7 +856,7 @@ static int hvc_init(void)
|
|||
drv->minor_start = HVC_MINOR;
|
||||
drv->type = TTY_DRIVER_TYPE_SYSTEM;
|
||||
drv->init_termios = tty_std_termios;
|
||||
drv->flags = TTY_DRIVER_REAL_RAW;
|
||||
drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;
|
||||
tty_set_operations(drv, &hvc_ops);
|
||||
|
||||
/* Always start the kthread because there can be hotplug vty adapters
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#ifndef HVC_CONSOLE_H
|
||||
#define HVC_CONSOLE_H
|
||||
#include <linux/kref.h>
|
||||
#include <linux/tty.h>
|
||||
|
||||
/*
|
||||
* This is the max number of console adapters that can/will be found as
|
||||
|
|
@ -56,6 +57,8 @@ struct hvc_struct {
|
|||
struct hv_ops *ops;
|
||||
int irq_requested;
|
||||
int data;
|
||||
struct winsize ws;
|
||||
struct work_struct tty_resize;
|
||||
struct list_head next;
|
||||
struct kref kref; /* ref count & hvc_struct lifetime */
|
||||
};
|
||||
|
|
@ -65,9 +68,10 @@ struct hv_ops {
|
|||
int (*get_chars)(uint32_t vtermno, char *buf, int count);
|
||||
int (*put_chars)(uint32_t vtermno, const char *buf, int count);
|
||||
|
||||
/* Callbacks for notification. Called in open and close */
|
||||
/* Callbacks for notification. Called in open, close and hangup */
|
||||
int (*notifier_add)(struct hvc_struct *hp, int irq);
|
||||
void (*notifier_del)(struct hvc_struct *hp, int irq);
|
||||
void (*notifier_hangup)(struct hvc_struct *hp, int irq);
|
||||
};
|
||||
|
||||
/* Register a vterm and a slot index for use as a console (console_init) */
|
||||
|
|
@ -77,15 +81,19 @@ extern int hvc_instantiate(uint32_t vtermno, int index, struct hv_ops *ops);
|
|||
extern struct hvc_struct * __devinit hvc_alloc(uint32_t vtermno, int data,
|
||||
struct hv_ops *ops, int outbuf_size);
|
||||
/* remove a vterm from hvc tty operation (module_exit or hotplug remove) */
|
||||
extern int __devexit hvc_remove(struct hvc_struct *hp);
|
||||
extern int hvc_remove(struct hvc_struct *hp);
|
||||
|
||||
/* data available */
|
||||
int hvc_poll(struct hvc_struct *hp);
|
||||
void hvc_kick(void);
|
||||
|
||||
/* Resize hvc tty terminal window */
|
||||
extern void hvc_resize(struct hvc_struct *hp, struct winsize ws);
|
||||
|
||||
/* default notifier for irq based notification */
|
||||
extern int notifier_add_irq(struct hvc_struct *hp, int data);
|
||||
extern void notifier_del_irq(struct hvc_struct *hp, int data);
|
||||
extern void notifier_hangup_irq(struct hvc_struct *hp, int data);
|
||||
|
||||
|
||||
#if defined(CONFIG_XMON) && defined(CONFIG_SMP)
|
||||
|
|
|
|||
|
|
@ -42,3 +42,8 @@ void notifier_del_irq(struct hvc_struct *hp, int irq)
|
|||
free_irq(irq, hp);
|
||||
hp->irq_requested = 0;
|
||||
}
|
||||
|
||||
void notifier_hangup_irq(struct hvc_struct *hp, int irq)
|
||||
{
|
||||
notifier_del_irq(hp, irq);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -202,6 +202,7 @@ static struct hv_ops hvc_get_put_ops = {
|
|||
.put_chars = put_chars,
|
||||
.notifier_add = notifier_add_irq,
|
||||
.notifier_del = notifier_del_irq,
|
||||
.notifier_hangup = notifier_hangup_irq,
|
||||
};
|
||||
|
||||
static int __devinit hvc_vio_probe(struct vio_dev *vdev,
|
||||
|
|
|
|||
|
|
@ -82,6 +82,7 @@ static struct hv_ops hvc_get_put_ops = {
|
|||
.put_chars = hvc_put_chars,
|
||||
.notifier_add = notifier_add_irq,
|
||||
.notifier_del = notifier_del_irq,
|
||||
.notifier_hangup = notifier_hangup_irq,
|
||||
};
|
||||
|
||||
static int __devinit hvc_vio_probe(struct vio_dev *vdev,
|
||||
|
|
|
|||
|
|
@ -102,6 +102,7 @@ static struct hv_ops hvc_ops = {
|
|||
.put_chars = write_console,
|
||||
.notifier_add = notifier_add_irq,
|
||||
.notifier_del = notifier_del_irq,
|
||||
.notifier_hangup = notifier_hangup_irq,
|
||||
};
|
||||
|
||||
static int __init xen_init(void)
|
||||
|
|
|
|||
|
|
@ -198,6 +198,7 @@ static int __devinit virtcons_probe(struct virtio_device *dev)
|
|||
virtio_cons.put_chars = put_chars;
|
||||
virtio_cons.notifier_add = notifier_add_vio;
|
||||
virtio_cons.notifier_del = notifier_del_vio;
|
||||
virtio_cons.notifier_hangup = notifier_del_vio;
|
||||
|
||||
/* The first argument of hvc_alloc() is the virtual console number, so
|
||||
* we use zero. The second argument is the parameter for the
|
||||
|
|
|
|||
|
|
@ -423,7 +423,6 @@ static const struct i2c_adapter cpm_ops = {
|
|||
.owner = THIS_MODULE,
|
||||
.name = "i2c-cpm",
|
||||
.algo = &cpm_i2c_algo,
|
||||
.class = I2C_CLASS_HWMON | I2C_CLASS_SPD,
|
||||
};
|
||||
|
||||
static int __devinit cpm_i2c_setup(struct cpm_i2c *cpm)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
* Driver for the MPC5200 Fast Ethernet Controller - MDIO bus driver
|
||||
*
|
||||
* Copyright (C) 2007 Domen Puncer, Telargo, Inc.
|
||||
* Copyright (C) 2008 Wolfram Sang, Pengutronix
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
|
|
@ -21,58 +22,45 @@ struct mpc52xx_fec_mdio_priv {
|
|||
struct mpc52xx_fec __iomem *regs;
|
||||
};
|
||||
|
||||
static int mpc52xx_fec_mdio_read(struct mii_bus *bus, int phy_id, int reg)
|
||||
static int mpc52xx_fec_mdio_transfer(struct mii_bus *bus, int phy_id,
|
||||
int reg, u32 value)
|
||||
{
|
||||
struct mpc52xx_fec_mdio_priv *priv = bus->priv;
|
||||
struct mpc52xx_fec __iomem *fec;
|
||||
int tries = 100;
|
||||
u32 request = FEC_MII_READ_FRAME;
|
||||
|
||||
value |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK;
|
||||
value |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK;
|
||||
|
||||
fec = priv->regs;
|
||||
out_be32(&fec->ievent, FEC_IEVENT_MII);
|
||||
|
||||
request |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK;
|
||||
request |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK;
|
||||
|
||||
out_be32(&priv->regs->mii_data, request);
|
||||
out_be32(&priv->regs->mii_data, value);
|
||||
|
||||
/* wait for it to finish, this takes about 23 us on lite5200b */
|
||||
while (!(in_be32(&fec->ievent) & FEC_IEVENT_MII) && --tries)
|
||||
udelay(5);
|
||||
|
||||
if (tries == 0)
|
||||
if (!tries)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return in_be32(&priv->regs->mii_data) & FEC_MII_DATA_DATAMSK;
|
||||
return value & FEC_MII_DATA_OP_RD ?
|
||||
in_be32(&priv->regs->mii_data) & FEC_MII_DATA_DATAMSK : 0;
|
||||
}
|
||||
|
||||
static int mpc52xx_fec_mdio_write(struct mii_bus *bus, int phy_id, int reg, u16 data)
|
||||
static int mpc52xx_fec_mdio_read(struct mii_bus *bus, int phy_id, int reg)
|
||||
{
|
||||
struct mpc52xx_fec_mdio_priv *priv = bus->priv;
|
||||
struct mpc52xx_fec __iomem *fec;
|
||||
u32 value = data;
|
||||
int tries = 100;
|
||||
|
||||
fec = priv->regs;
|
||||
out_be32(&fec->ievent, FEC_IEVENT_MII);
|
||||
|
||||
value |= FEC_MII_WRITE_FRAME;
|
||||
value |= (phy_id << FEC_MII_DATA_PA_SHIFT) & FEC_MII_DATA_PA_MSK;
|
||||
value |= (reg << FEC_MII_DATA_RA_SHIFT) & FEC_MII_DATA_RA_MSK;
|
||||
|
||||
out_be32(&priv->regs->mii_data, value);
|
||||
|
||||
/* wait for request to finish */
|
||||
while (!(in_be32(&fec->ievent) & FEC_IEVENT_MII) && --tries)
|
||||
udelay(5);
|
||||
|
||||
if (tries == 0)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return 0;
|
||||
return mpc52xx_fec_mdio_transfer(bus, phy_id, reg, FEC_MII_READ_FRAME);
|
||||
}
|
||||
|
||||
static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_id *match)
|
||||
static int mpc52xx_fec_mdio_write(struct mii_bus *bus, int phy_id, int reg,
|
||||
u16 data)
|
||||
{
|
||||
return mpc52xx_fec_mdio_transfer(bus, phy_id, reg,
|
||||
data | FEC_MII_WRITE_FRAME);
|
||||
}
|
||||
|
||||
static int mpc52xx_fec_mdio_probe(struct of_device *of,
|
||||
const struct of_device_id *match)
|
||||
{
|
||||
struct device *dev = &of->dev;
|
||||
struct device_node *np = of->node;
|
||||
|
|
@ -131,7 +119,8 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_i
|
|||
dev_set_drvdata(dev, bus);
|
||||
|
||||
/* set MII speed */
|
||||
out_be32(&priv->regs->mii_speed, ((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1);
|
||||
out_be32(&priv->regs->mii_speed,
|
||||
((mpc52xx_find_ipb_freq(of->node) >> 20) / 5) << 1);
|
||||
|
||||
/* enable MII interrupt */
|
||||
out_be32(&priv->regs->imask, in_be32(&priv->regs->imask) | FEC_IMASK_MII);
|
||||
|
|
|
|||
|
|
@ -2604,8 +2604,16 @@ static int __devinit emac_init_config(struct emac_instance *dev)
|
|||
if (of_device_is_compatible(np, "ibm,emac-440ep") ||
|
||||
of_device_is_compatible(np, "ibm,emac-440gr"))
|
||||
dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX;
|
||||
if (of_device_is_compatible(np, "ibm,emac-405ez"))
|
||||
if (of_device_is_compatible(np, "ibm,emac-405ez")) {
|
||||
#ifdef CONFIG_IBM_NEW_EMAC_NO_FLOW_CONTROL
|
||||
dev->features |= EMAC_FTR_NO_FLOW_CONTROL_40x;
|
||||
#else
|
||||
printk(KERN_ERR "%s: Flow control not disabled!\n",
|
||||
np->full_name);
|
||||
return -ENXIO;
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Fixup some feature bits based on the device tree */
|
||||
|
|
|
|||
|
|
@ -280,9 +280,11 @@ static irqreturn_t mal_txeob(int irq, void *dev_instance)
|
|||
mal_schedule_poll(mal);
|
||||
set_mal_dcrn(mal, MAL_TXEOBISR, r);
|
||||
|
||||
#ifdef CONFIG_PPC_DCR_NATIVE
|
||||
if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT))
|
||||
mtdcri(SDR0, DCRN_SDR_ICINTSTAT,
|
||||
(mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICTX));
|
||||
#endif
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
@ -298,9 +300,11 @@ static irqreturn_t mal_rxeob(int irq, void *dev_instance)
|
|||
mal_schedule_poll(mal);
|
||||
set_mal_dcrn(mal, MAL_RXEOBISR, r);
|
||||
|
||||
#ifdef CONFIG_PPC_DCR_NATIVE
|
||||
if (mal_has_feature(mal, MAL_FTR_CLEAR_ICINTSTAT))
|
||||
mtdcri(SDR0, DCRN_SDR_ICINTSTAT,
|
||||
(mfdcri(SDR0, DCRN_SDR_ICINTSTAT) | ICINTSTAT_ICRX));
|
||||
#endif
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
@ -572,9 +576,18 @@ static int __devinit mal_probe(struct of_device *ofdev,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez"))
|
||||
if (of_device_is_compatible(ofdev->node, "ibm,mcmal-405ez")) {
|
||||
#if defined(CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT) && \
|
||||
defined(CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR)
|
||||
mal->features |= (MAL_FTR_CLEAR_ICINTSTAT |
|
||||
MAL_FTR_COMMON_ERR_INT);
|
||||
#else
|
||||
printk(KERN_ERR "%s: Support for 405EZ not enabled!\n",
|
||||
ofdev->node->full_name);
|
||||
err = -ENODEV;
|
||||
goto fail;
|
||||
#endif
|
||||
}
|
||||
|
||||
mal->txeob_irq = irq_of_parse_and_map(ofdev->node, 0);
|
||||
mal->rxeob_irq = irq_of_parse_and_map(ofdev->node, 1);
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ void of_register_i2c_devices(struct i2c_adapter *adap,
|
|||
|
||||
info.addr = *addr;
|
||||
|
||||
request_module(info.type);
|
||||
request_module("%s", info.type);
|
||||
|
||||
result = i2c_new_device(adap, &info);
|
||||
if (result == NULL) {
|
||||
|
|
|
|||
|
|
@ -61,6 +61,8 @@ void of_register_spi_devices(struct spi_master *master, struct device_node *np)
|
|||
spi->mode |= SPI_CPHA;
|
||||
if (of_find_property(nc, "spi-cpol", NULL))
|
||||
spi->mode |= SPI_CPOL;
|
||||
if (of_find_property(nc, "spi-cs-high", NULL))
|
||||
spi->mode |= SPI_CS_HIGH;
|
||||
|
||||
/* Device speed */
|
||||
prop = of_get_property(nc, "spi-max-frequency", &len);
|
||||
|
|
|
|||
|
|
@ -628,3 +628,27 @@ void sync_buffer(int cpu)
|
|||
|
||||
mutex_unlock(&buffer_mutex);
|
||||
}
|
||||
|
||||
/* The function can be used to add a buffer worth of data directly to
|
||||
* the kernel buffer. The buffer is assumed to be a circular buffer.
|
||||
* Take the entries from index start and end at index end, wrapping
|
||||
* at max_entries.
|
||||
*/
|
||||
void oprofile_put_buff(unsigned long *buf, unsigned int start,
|
||||
unsigned int stop, unsigned int max)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = start;
|
||||
|
||||
mutex_lock(&buffer_mutex);
|
||||
while (i != stop) {
|
||||
add_event_entry(buf[i++]);
|
||||
|
||||
if (i >= max)
|
||||
i = 0;
|
||||
}
|
||||
|
||||
mutex_unlock(&buffer_mutex);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,13 +38,26 @@ static int work_enabled;
|
|||
void free_cpu_buffers(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
vfree(per_cpu(cpu_buffer, i).buffer);
|
||||
per_cpu(cpu_buffer, i).buffer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long oprofile_get_cpu_buffer_size(void)
|
||||
{
|
||||
return fs_cpu_buffer_size;
|
||||
}
|
||||
|
||||
void oprofile_cpu_buffer_inc_smpl_lost(void)
|
||||
{
|
||||
struct oprofile_cpu_buffer *cpu_buf
|
||||
= &__get_cpu_var(cpu_buffer);
|
||||
|
||||
cpu_buf->sample_lost_overflow++;
|
||||
}
|
||||
|
||||
int alloc_cpu_buffers(void)
|
||||
{
|
||||
int i;
|
||||
|
|
|
|||
|
|
@ -17,6 +17,13 @@ int alloc_event_buffer(void);
|
|||
|
||||
void free_event_buffer(void);
|
||||
|
||||
/**
|
||||
* Add data to the event buffer.
|
||||
* The data passed is free-form, but typically consists of
|
||||
* file offsets, dcookies, context information, and ESCAPE codes.
|
||||
*/
|
||||
void add_event_entry(unsigned long data);
|
||||
|
||||
/* wake up the process sleeping on the event file */
|
||||
void wake_up_buffer_waiter(void);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue