Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 68225
b: refs/heads/master
c: 8786c95
h: refs/heads/master
i:
  68223: 63a3c4b
v: v3
  • Loading branch information
Paul Mundt committed Sep 21, 2007
1 parent 84d79c6 commit 7ce5e78
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 40 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2eb0303c2cd536d7f15c7f3bafc848b850a447f0
refs/heads/master: 8786c952c1682a132e99b736beae4523e409b13d
16 changes: 12 additions & 4 deletions trunk/arch/sh/boards/renesas/r7780rp/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <asm/machvec.h>
#include <asm/r7780rp.h>
#include <asm/clock.h>
#include <asm/heartbeat.h>
#include <asm/io.h>

static struct resource r8a66597_usb_host_resources[] = {
Expand Down Expand Up @@ -108,24 +109,31 @@ static struct platform_device cf_ide_device = {
},
};

static unsigned char heartbeat_bit_pos[] = { 2, 1, 0, 3, 6, 5, 4, 7 };

static struct resource heartbeat_resources[] = {
[0] = {
.start = PA_OBLED,
.end = PA_OBLED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
.end = PA_OBLED + 8 - 1,
.flags = IORESOURCE_MEM,
},
};

#ifndef CONFIG_SH_R7785RP
static unsigned char heartbeat_bit_pos[] = { 2, 1, 0, 3, 6, 5, 4, 7 };

static struct heartbeat_data heartbeat_data = {
.bit_pos = heartbeat_bit_pos,
.nr_bits = ARRAY_SIZE(heartbeat_bit_pos),
};
#endif

static struct platform_device heartbeat_device = {
.name = "heartbeat",
.id = -1,

/* R7785RP has a slightly more sensible FPGA.. */
#ifndef CONFIG_SH_R7785RP
.dev = {
.platform_data = heartbeat_bit_pos,
.platform_data = heartbeat_data,
},
#endif
.num_resources = ARRAY_SIZE(heartbeat_resources),
Expand Down
8 changes: 7 additions & 1 deletion trunk/arch/sh/boards/se/7206/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <asm/se7206.h>
#include <asm/io.h>
#include <asm/machvec.h>
#include <asm/heartbeat.h>

static struct resource smc91x_resources[] = {
[0] = {
Expand All @@ -37,6 +38,11 @@ static struct platform_device smc91x_device = {

static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };

static struct heartbeat_data heartbeat_data = {
.bit_pos = heartbeat_bit_pos,
.nr_bits = ARRAY_SIZE(heartbeat_bit_pos),
};

static struct resource heartbeat_resources[] = {
[0] = {
.start = PA_LED,
Expand All @@ -49,7 +55,7 @@ static struct platform_device heartbeat_device = {
.name = "heartbeat",
.id = -1,
.dev = {
.platform_data = heartbeat_bit_pos,
.platform_data = heartbeat_data,
},
.num_resources = ARRAY_SIZE(heartbeat_resources),
.resource = heartbeat_resources,
Expand Down
8 changes: 7 additions & 1 deletion trunk/arch/sh/boards/se/770x/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <asm/se.h>
#include <asm/io.h>
#include <asm/smc37c93x.h>
#include <asm/heartbeat.h>

void init_se_IRQ(void);

Expand Down Expand Up @@ -90,6 +91,11 @@ static struct platform_device cf_ide_device = {

static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };

static struct heartbeat_data heartbeat_data = {
.bit_pos = heartbeat_bit_pos,
.nr_bits = ARRAY_SIZE(heartbeat_bit_pos),
};

static struct resource heartbeat_resources[] = {
[0] = {
.start = PA_LED,
Expand All @@ -102,7 +108,7 @@ static struct platform_device heartbeat_device = {
.name = "heartbeat",
.id = -1,
.dev = {
.platform_data = heartbeat_bit_pos,
.platform_data = heartbeat_data,
},
.num_resources = ARRAY_SIZE(heartbeat_resources),
.resource = heartbeat_resources,
Expand Down
9 changes: 2 additions & 7 deletions trunk/arch/sh/boards/se/7722/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,17 @@
#include <asm/io.h>

/* Heartbeat */
static unsigned char heartbeat_bit_pos[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

static struct resource heartbeat_resources[] = {
[0] = {
.start = PA_LED,
.end = PA_LED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
.end = PA_LED + 8 - 1,
.flags = IORESOURCE_MEM,
},
};

static struct platform_device heartbeat_device = {
.name = "heartbeat",
.id = -1,
.dev = {
.platform_data = heartbeat_bit_pos,
},
.num_resources = ARRAY_SIZE(heartbeat_resources),
.resource = heartbeat_resources,
};
Expand Down Expand Up @@ -109,7 +104,7 @@ static void __init se7722_setup(char **cmdline_p)
ctrl_outl(0x00051001, MSTPCR0);
ctrl_outl(0x00000000, MSTPCR1);
/* KEYSC, VOU, BEU, CEU, VEU, VPU, LCDC */
ctrl_outl(0xffffbfC0, MSTPCR2);
ctrl_outl(0xffffbfC0, MSTPCR2);

ctrl_outw(0x0000, PORT_PECR); /* PORT E 1 = IRQ5 ,E 0 = BS */
ctrl_outw(0x1000, PORT_PJCR); /* PORT J 1 = IRQ1,J 0 =IRQ0 */
Expand Down
8 changes: 7 additions & 1 deletion trunk/arch/sh/boards/se/7751/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,15 @@
#include <asm/machvec.h>
#include <asm/se7751.h>
#include <asm/io.h>
#include <asm/heartbeat.h>

static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };

static struct heartbeat_data heartbeat_data = {
.bit_pos = heartbeat_bit_pos,
.nr_bits = ARRAY_SIZE(heartbeat_bit_pos),
};

static struct resource heartbeat_resources[] = {
[0] = {
.start = PA_LED,
Expand All @@ -28,7 +34,7 @@ static struct platform_device heartbeat_device = {
.name = "heartbeat",
.id = -1,
.dev = {
.platform_data = heartbeat_bit_pos,
.platform_data = heartbeat_data,
},
.num_resources = ARRAY_SIZE(heartbeat_resources),
.resource = heartbeat_resources,
Expand Down
7 changes: 1 addition & 6 deletions trunk/arch/sh/boards/se/7780/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,17 @@
#include <asm/io.h>

/* Heartbeat */
static unsigned char heartbeat_bit_pos[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

static struct resource heartbeat_resources[] = {
[0] = {
.start = PA_LED,
.end = PA_LED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
.end = PA_LED + 8 - 1,
.flags = IORESOURCE_MEM,
},
};

static struct platform_device heartbeat_device = {
.name = "heartbeat",
.id = -1,
.dev = {
.platform_data = heartbeat_bit_pos,
},
.num_resources = ARRAY_SIZE(heartbeat_resources),
.resource = heartbeat_resources,
};
Expand Down
70 changes: 51 additions & 19 deletions trunk/arch/sh/drivers/heartbeat.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,44 @@
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/io.h>
#include <asm/heartbeat.h>

#define DRV_NAME "heartbeat"
#define DRV_VERSION "0.1.0"
#define DRV_VERSION "0.1.1"

struct heartbeat_data {
void __iomem *base;
unsigned char bit_pos[8];
struct timer_list timer;
};
static unsigned char default_bit_pos[] = { 0, 1, 2, 3, 4, 5, 6, 7 };

static inline void heartbeat_toggle_bit(struct heartbeat_data *hd,
unsigned bit, unsigned int inverted)
{
unsigned int new;

new = (1 << hd->bit_pos[bit]);
if (inverted)
new = ~new;

switch (hd->regsize) {
case 32:
iowrite32(new, hd->base);
break;
case 16:
iowrite16(new, hd->base);
break;
default:
iowrite8(new, hd->base);
break;
}
}

static void heartbeat_timer(unsigned long data)
{
struct heartbeat_data *hd = (struct heartbeat_data *)data;
static unsigned bit = 0, up = 1;

ctrl_outw(1 << hd->bit_pos[bit], (unsigned long)hd->base);
heartbeat_toggle_bit(hd, bit, hd->flags & HEARTBEAT_INVERTED);

bit += up;
if ((bit == 0) || (bit == ARRAY_SIZE(hd->bit_pos)-1))
if ((bit == 0) || (bit == (hd->nr_bits)-1))
up = -up;

mod_timer(&hd->timer, jiffies + (110 - ((300 << FSHIFT) /
Expand All @@ -64,21 +84,31 @@ static int heartbeat_drv_probe(struct platform_device *pdev)
return -EINVAL;
}

hd = kmalloc(sizeof(struct heartbeat_data), GFP_KERNEL);
if (unlikely(!hd))
return -ENOMEM;

if (pdev->dev.platform_data) {
memcpy(hd->bit_pos, pdev->dev.platform_data,
ARRAY_SIZE(hd->bit_pos));
hd = pdev->dev.platform_data;
} else {
int i;
hd = kzalloc(sizeof(struct heartbeat_data), GFP_KERNEL);
if (unlikely(!hd))
return -ENOMEM;
}

hd->base = ioremap_nocache(res->start, res->end - res->start + 1);
if (!unlikely(hd->base)) {
dev_err(&pdev->dev, "ioremap failed\n");

if (!pdev->dev.platform_data)
kfree(hd);

return -ENXIO;
}

for (i = 0; i < ARRAY_SIZE(hd->bit_pos); i++)
hd->bit_pos[i] = i;
if (!hd->nr_bits) {
hd->bit_pos = default_bit_pos;
hd->nr_bits = ARRAY_SIZE(default_bit_pos);
}

hd->base = (void __iomem *)(unsigned long)res->start;
if (!hd->regsize)
hd->regsize = 8; /* default access size */

setup_timer(&hd->timer, heartbeat_timer, (unsigned long)hd);
platform_set_drvdata(pdev, hd);
Expand All @@ -91,10 +121,12 @@ static int heartbeat_drv_remove(struct platform_device *pdev)
struct heartbeat_data *hd = platform_get_drvdata(pdev);

del_timer_sync(&hd->timer);
iounmap(hd->base);

platform_set_drvdata(pdev, NULL);

kfree(hd);
if (!pdev->dev.platform_data)
kfree(hd);

return 0;
}
Expand Down
17 changes: 17 additions & 0 deletions trunk/include/asm-sh/heartbeat.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef __ASM_SH_HEARTBEAT_H
#define __ASM_SH_HEARTBEAT_H

#include <linux/timer.h>

#define HEARTBEAT_INVERTED (1 << 0)

struct heartbeat_data {
void __iomem *base;
unsigned char *bit_pos;
unsigned int nr_bits;
struct timer_list timer;
unsigned int regsize;
unsigned long flags;
};

#endif /* __ASM_SH_HEARTBEAT_H */

0 comments on commit 7ce5e78

Please sign in to comment.