Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86d88bfc authored by Dmitry Eremin-Solenikov's avatar Dmitry Eremin-Solenikov Committed by Russell King
Browse files

ARM: 8247/2: pcmcia: sa1100: make use of device clock



Use per-device clock (instead of calling cpufreq_get(0), which can
return 0 if no cpu frequency driver is selected) to program timings.

Signed-off-by: default avatarDmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent b02cba86
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -93,6 +93,7 @@ static int sa11x0_drv_pcmcia_remove(struct platform_device *dev)
	for (i = 0; i < sinfo->nskt; i++)
	for (i = 0; i < sinfo->nskt; i++)
		soc_pcmcia_remove_one(&sinfo->skt[i]);
		soc_pcmcia_remove_one(&sinfo->skt[i]);


	clk_put(sinfo->clk);
	kfree(sinfo);
	kfree(sinfo);
	return 0;
	return 0;
}
}
+12 −2
Original line number Original line Diff line number Diff line
@@ -135,14 +135,16 @@ sa1100_pcmcia_frequency_change(struct soc_pcmcia_socket *skt,
static int
static int
sa1100_pcmcia_set_timing(struct soc_pcmcia_socket *skt)
sa1100_pcmcia_set_timing(struct soc_pcmcia_socket *skt)
{
{
	return sa1100_pcmcia_set_mecr(skt, cpufreq_get(0));
	unsigned long clk = clk_get_rate(skt->clk);

	return sa1100_pcmcia_set_mecr(skt, clk / 1000);
}
}


static int
static int
sa1100_pcmcia_show_timing(struct soc_pcmcia_socket *skt, char *buf)
sa1100_pcmcia_show_timing(struct soc_pcmcia_socket *skt, char *buf)
{
{
	struct soc_pcmcia_timing timing;
	struct soc_pcmcia_timing timing;
	unsigned int clock = cpufreq_get(0);
	unsigned int clock = clk_get_rate(skt->clk);
	unsigned long mecr = MECR;
	unsigned long mecr = MECR;
	char *p = buf;
	char *p = buf;


@@ -218,6 +220,11 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
	struct skt_dev_info *sinfo;
	struct skt_dev_info *sinfo;
	struct soc_pcmcia_socket *skt;
	struct soc_pcmcia_socket *skt;
	int i, ret = 0;
	int i, ret = 0;
	struct clk *clk;

	clk = clk_get(dev, NULL);
	if (IS_ERR(clk))
		return PTR_ERR(clk);


	sa11xx_drv_pcmcia_ops(ops);
	sa11xx_drv_pcmcia_ops(ops);


@@ -226,12 +233,14 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
		return -ENOMEM;
		return -ENOMEM;


	sinfo->nskt = nr;
	sinfo->nskt = nr;
	sinfo->clk = clk;


	/* Initialize processor specific parameters */
	/* Initialize processor specific parameters */
	for (i = 0; i < nr; i++) {
	for (i = 0; i < nr; i++) {
		skt = &sinfo->skt[i];
		skt = &sinfo->skt[i];


		skt->nr = first + i;
		skt->nr = first + i;
		skt->clk = clk;
		soc_pcmcia_init_one(skt, ops, dev);
		soc_pcmcia_init_one(skt, ops, dev);


		ret = sa11xx_drv_pcmcia_add_one(skt);
		ret = sa11xx_drv_pcmcia_add_one(skt);
@@ -242,6 +251,7 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops,
	if (ret) {
	if (ret) {
		while (--i >= 0)
		while (--i >= 0)
			soc_pcmcia_remove_one(&sinfo->skt[i]);
			soc_pcmcia_remove_one(&sinfo->skt[i]);
		clk_put(clk);
		kfree(sinfo);
		kfree(sinfo);
	} else {
	} else {
		dev_set_drvdata(dev, sinfo);
		dev_set_drvdata(dev, sinfo);