mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-06 08:46:46 +00:00
clocksource: sh_mtu2: Drop support for legacy platform data
Now that all platforms have switched to the new-style platform data, drop support for the legacy version. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Tested-by: Wolfram Sang <wsa@sang-engineering.com>
This commit is contained in:
parent
2b027f1f0f
commit
1a5da0e43b
1 changed files with 32 additions and 100 deletions
|
@ -37,7 +37,6 @@ struct sh_mtu2_channel {
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
|
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
int irq;
|
|
||||||
|
|
||||||
struct clock_event_device ced;
|
struct clock_event_device ced;
|
||||||
};
|
};
|
||||||
|
@ -51,7 +50,6 @@ struct sh_mtu2_device {
|
||||||
struct sh_mtu2_channel *channels;
|
struct sh_mtu2_channel *channels;
|
||||||
unsigned int num_channels;
|
unsigned int num_channels;
|
||||||
|
|
||||||
bool legacy;
|
|
||||||
bool has_clockevent;
|
bool has_clockevent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -162,12 +160,8 @@ static inline unsigned long sh_mtu2_read(struct sh_mtu2_channel *ch, int reg_nr)
|
||||||
{
|
{
|
||||||
unsigned long offs;
|
unsigned long offs;
|
||||||
|
|
||||||
if (reg_nr == TSTR) {
|
if (reg_nr == TSTR)
|
||||||
if (ch->mtu->legacy)
|
return ioread8(ch->mtu->mapbase + 0x280);
|
||||||
return ioread8(ch->mtu->mapbase);
|
|
||||||
else
|
|
||||||
return ioread8(ch->mtu->mapbase + 0x280);
|
|
||||||
}
|
|
||||||
|
|
||||||
offs = mtu2_reg_offs[reg_nr];
|
offs = mtu2_reg_offs[reg_nr];
|
||||||
|
|
||||||
|
@ -182,12 +176,8 @@ static inline void sh_mtu2_write(struct sh_mtu2_channel *ch, int reg_nr,
|
||||||
{
|
{
|
||||||
unsigned long offs;
|
unsigned long offs;
|
||||||
|
|
||||||
if (reg_nr == TSTR) {
|
if (reg_nr == TSTR)
|
||||||
if (ch->mtu->legacy)
|
return iowrite8(value, ch->mtu->mapbase + 0x280);
|
||||||
return iowrite8(value, ch->mtu->mapbase);
|
|
||||||
else
|
|
||||||
return iowrite8(value, ch->mtu->mapbase + 0x280);
|
|
||||||
}
|
|
||||||
|
|
||||||
offs = mtu2_reg_offs[reg_nr];
|
offs = mtu2_reg_offs[reg_nr];
|
||||||
|
|
||||||
|
@ -331,7 +321,6 @@ static void sh_mtu2_register_clockevent(struct sh_mtu2_channel *ch,
|
||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
struct clock_event_device *ced = &ch->ced;
|
struct clock_event_device *ced = &ch->ced;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ced->name = name;
|
ced->name = name;
|
||||||
ced->features = CLOCK_EVT_FEAT_PERIODIC;
|
ced->features = CLOCK_EVT_FEAT_PERIODIC;
|
||||||
|
@ -344,24 +333,12 @@ static void sh_mtu2_register_clockevent(struct sh_mtu2_channel *ch,
|
||||||
dev_info(&ch->mtu->pdev->dev, "ch%u: used for clock events\n",
|
dev_info(&ch->mtu->pdev->dev, "ch%u: used for clock events\n",
|
||||||
ch->index);
|
ch->index);
|
||||||
clockevents_register_device(ced);
|
clockevents_register_device(ced);
|
||||||
|
|
||||||
ret = request_irq(ch->irq, sh_mtu2_interrupt,
|
|
||||||
IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
|
||||||
dev_name(&ch->mtu->pdev->dev), ch);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(&ch->mtu->pdev->dev, "ch%u: failed to request irq %d\n",
|
|
||||||
ch->index, ch->irq);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_mtu2_register(struct sh_mtu2_channel *ch, const char *name,
|
static int sh_mtu2_register(struct sh_mtu2_channel *ch, const char *name)
|
||||||
bool clockevent)
|
|
||||||
{
|
{
|
||||||
if (clockevent) {
|
ch->mtu->has_clockevent = true;
|
||||||
ch->mtu->has_clockevent = true;
|
sh_mtu2_register_clockevent(ch, name);
|
||||||
sh_mtu2_register_clockevent(ch, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -372,40 +349,32 @@ static int sh_mtu2_setup_channel(struct sh_mtu2_channel *ch, unsigned int index,
|
||||||
static const unsigned int channel_offsets[] = {
|
static const unsigned int channel_offsets[] = {
|
||||||
0x300, 0x380, 0x000,
|
0x300, 0x380, 0x000,
|
||||||
};
|
};
|
||||||
bool clockevent;
|
char name[6];
|
||||||
|
int irq;
|
||||||
|
int ret;
|
||||||
|
|
||||||
ch->mtu = mtu;
|
ch->mtu = mtu;
|
||||||
|
|
||||||
if (mtu->legacy) {
|
sprintf(name, "tgi%ua", index);
|
||||||
struct sh_timer_config *cfg = mtu->pdev->dev.platform_data;
|
irq = platform_get_irq_byname(mtu->pdev, name);
|
||||||
|
if (irq < 0) {
|
||||||
clockevent = cfg->clockevent_rating != 0;
|
|
||||||
|
|
||||||
ch->irq = platform_get_irq(mtu->pdev, 0);
|
|
||||||
ch->base = mtu->mapbase - cfg->channel_offset;
|
|
||||||
ch->index = cfg->timer_bit;
|
|
||||||
} else {
|
|
||||||
char name[6];
|
|
||||||
|
|
||||||
clockevent = true;
|
|
||||||
|
|
||||||
sprintf(name, "tgi%ua", index);
|
|
||||||
ch->irq = platform_get_irq_byname(mtu->pdev, name);
|
|
||||||
ch->base = mtu->mapbase + channel_offsets[index];
|
|
||||||
ch->index = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ch->irq < 0) {
|
|
||||||
/* Skip channels with no declared interrupt. */
|
/* Skip channels with no declared interrupt. */
|
||||||
if (!mtu->legacy)
|
return 0;
|
||||||
return 0;
|
|
||||||
|
|
||||||
dev_err(&mtu->pdev->dev, "ch%u: failed to get irq\n",
|
|
||||||
ch->index);
|
|
||||||
return ch->irq;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return sh_mtu2_register(ch, dev_name(&mtu->pdev->dev), clockevent);
|
ret = request_irq(irq, sh_mtu2_interrupt,
|
||||||
|
IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
||||||
|
dev_name(&ch->mtu->pdev->dev), ch);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&ch->mtu->pdev->dev, "ch%u: failed to request irq %d\n",
|
||||||
|
index, irq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ch->base = mtu->mapbase + channel_offsets[index];
|
||||||
|
ch->index = index;
|
||||||
|
|
||||||
|
return sh_mtu2_register(ch, dev_name(&mtu->pdev->dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_mtu2_map_memory(struct sh_mtu2_device *mtu)
|
static int sh_mtu2_map_memory(struct sh_mtu2_device *mtu)
|
||||||
|
@ -422,46 +391,19 @@ static int sh_mtu2_map_memory(struct sh_mtu2_device *mtu)
|
||||||
if (mtu->mapbase == NULL)
|
if (mtu->mapbase == NULL)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
/*
|
|
||||||
* In legacy platform device configuration (with one device per channel)
|
|
||||||
* the resource points to the channel base address.
|
|
||||||
*/
|
|
||||||
if (mtu->legacy) {
|
|
||||||
struct sh_timer_config *cfg = mtu->pdev->dev.platform_data;
|
|
||||||
mtu->mapbase += cfg->channel_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sh_mtu2_unmap_memory(struct sh_mtu2_device *mtu)
|
|
||||||
{
|
|
||||||
if (mtu->legacy) {
|
|
||||||
struct sh_timer_config *cfg = mtu->pdev->dev.platform_data;
|
|
||||||
mtu->mapbase -= cfg->channel_offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
iounmap(mtu->mapbase);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int sh_mtu2_setup(struct sh_mtu2_device *mtu,
|
static int sh_mtu2_setup(struct sh_mtu2_device *mtu,
|
||||||
struct platform_device *pdev)
|
struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct sh_timer_config *cfg = pdev->dev.platform_data;
|
|
||||||
const struct platform_device_id *id = pdev->id_entry;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mtu->pdev = pdev;
|
mtu->pdev = pdev;
|
||||||
mtu->legacy = id->driver_data;
|
|
||||||
|
|
||||||
if (mtu->legacy && !cfg) {
|
|
||||||
dev_err(&mtu->pdev->dev, "missing platform data\n");
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get hold of clock. */
|
/* Get hold of clock. */
|
||||||
mtu->clk = clk_get(&mtu->pdev->dev, mtu->legacy ? "mtu2_fck" : "fck");
|
mtu->clk = clk_get(&mtu->pdev->dev, "fck");
|
||||||
if (IS_ERR(mtu->clk)) {
|
if (IS_ERR(mtu->clk)) {
|
||||||
dev_err(&mtu->pdev->dev, "cannot get clock\n");
|
dev_err(&mtu->pdev->dev, "cannot get clock\n");
|
||||||
return PTR_ERR(mtu->clk);
|
return PTR_ERR(mtu->clk);
|
||||||
|
@ -479,10 +421,7 @@ static int sh_mtu2_setup(struct sh_mtu2_device *mtu,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate and setup the channels. */
|
/* Allocate and setup the channels. */
|
||||||
if (mtu->legacy)
|
mtu->num_channels = 3;
|
||||||
mtu->num_channels = 1;
|
|
||||||
else
|
|
||||||
mtu->num_channels = 3;
|
|
||||||
|
|
||||||
mtu->channels = kzalloc(sizeof(*mtu->channels) * mtu->num_channels,
|
mtu->channels = kzalloc(sizeof(*mtu->channels) * mtu->num_channels,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
@ -491,16 +430,10 @@ static int sh_mtu2_setup(struct sh_mtu2_device *mtu,
|
||||||
goto err_unmap;
|
goto err_unmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mtu->legacy) {
|
for (i = 0; i < mtu->num_channels; ++i) {
|
||||||
ret = sh_mtu2_setup_channel(&mtu->channels[0], 0, mtu);
|
ret = sh_mtu2_setup_channel(&mtu->channels[i], i, mtu);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err_unmap;
|
goto err_unmap;
|
||||||
} else {
|
|
||||||
for (i = 0; i < mtu->num_channels; ++i) {
|
|
||||||
ret = sh_mtu2_setup_channel(&mtu->channels[i], i, mtu);
|
|
||||||
if (ret < 0)
|
|
||||||
goto err_unmap;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
platform_set_drvdata(pdev, mtu);
|
platform_set_drvdata(pdev, mtu);
|
||||||
|
@ -509,7 +442,7 @@ static int sh_mtu2_setup(struct sh_mtu2_device *mtu,
|
||||||
|
|
||||||
err_unmap:
|
err_unmap:
|
||||||
kfree(mtu->channels);
|
kfree(mtu->channels);
|
||||||
sh_mtu2_unmap_memory(mtu);
|
iounmap(mtu->mapbase);
|
||||||
err_clk_unprepare:
|
err_clk_unprepare:
|
||||||
clk_unprepare(mtu->clk);
|
clk_unprepare(mtu->clk);
|
||||||
err_clk_put:
|
err_clk_put:
|
||||||
|
@ -560,7 +493,6 @@ static int sh_mtu2_remove(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct platform_device_id sh_mtu2_id_table[] = {
|
static const struct platform_device_id sh_mtu2_id_table[] = {
|
||||||
{ "sh_mtu2", 1 },
|
|
||||||
{ "sh-mtu2", 0 },
|
{ "sh-mtu2", 0 },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue