mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-26 06:30:39 +00:00
spi: pl022: Simplify platdata code
pl022 spi driver support both OF_CONTROL and PLATDATA, this patch is trying to simplify the code that differentiating platdata vs of_control. - Move OF_CONTROL code at one place - Handle clock setup code directly in pl022_spi_ofdata_to_platdata Acked-by: Quentin Schulz <quentin.schulz@bootlin.com> Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
This commit is contained in:
parent
052cafd2a5
commit
3deb1f731d
2 changed files with 20 additions and 35 deletions
|
@ -72,11 +72,7 @@
|
||||||
|
|
||||||
struct pl022_spi_slave {
|
struct pl022_spi_slave {
|
||||||
void *base;
|
void *base;
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
||||||
struct clk clk;
|
|
||||||
#else
|
|
||||||
unsigned int freq;
|
unsigned int freq;
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -96,30 +92,13 @@ static int pl022_is_supported(struct pl022_spi_slave *ps)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
||||||
static int pl022_spi_ofdata_to_platdata(struct udevice *bus)
|
|
||||||
{
|
|
||||||
struct pl022_spi_pdata *plat = bus->platdata;
|
|
||||||
const void *fdt = gd->fdt_blob;
|
|
||||||
int node = dev_of_offset(bus);
|
|
||||||
|
|
||||||
plat->addr = fdtdec_get_addr_size(fdt, node, "reg", &plat->size);
|
|
||||||
|
|
||||||
return clk_get_by_index(bus, 0, &plat->clk);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int pl022_spi_probe(struct udevice *bus)
|
static int pl022_spi_probe(struct udevice *bus)
|
||||||
{
|
{
|
||||||
struct pl022_spi_pdata *plat = dev_get_platdata(bus);
|
struct pl022_spi_pdata *plat = dev_get_platdata(bus);
|
||||||
struct pl022_spi_slave *ps = dev_get_priv(bus);
|
struct pl022_spi_slave *ps = dev_get_priv(bus);
|
||||||
|
|
||||||
ps->base = ioremap(plat->addr, plat->size);
|
ps->base = ioremap(plat->addr, plat->size);
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
||||||
ps->clk = plat->clk;
|
|
||||||
#else
|
|
||||||
ps->freq = plat->freq;
|
ps->freq = plat->freq;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Check the PL022 version */
|
/* Check the PL022 version */
|
||||||
if (!pl022_is_supported(ps))
|
if (!pl022_is_supported(ps))
|
||||||
|
@ -240,11 +219,7 @@ static int pl022_spi_set_speed(struct udevice *bus, uint speed)
|
||||||
u16 scr = SSP_SCR_MIN, cr0 = 0, cpsr = SSP_CPSR_MIN, best_scr = scr,
|
u16 scr = SSP_SCR_MIN, cr0 = 0, cpsr = SSP_CPSR_MIN, best_scr = scr,
|
||||||
best_cpsr = cpsr;
|
best_cpsr = cpsr;
|
||||||
u32 min, max, best_freq = 0, tmp;
|
u32 min, max, best_freq = 0, tmp;
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
||||||
u32 rate = clk_get_rate(&ps->clk);
|
|
||||||
#else
|
|
||||||
u32 rate = ps->freq;
|
u32 rate = ps->freq;
|
||||||
#endif
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
max = spi_rate(rate, SSP_CPSR_MIN, SSP_SCR_MIN);
|
max = spi_rate(rate, SSP_CPSR_MIN, SSP_SCR_MIN);
|
||||||
|
@ -316,6 +291,25 @@ static const struct dm_spi_ops pl022_spi_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||||
|
static int pl022_spi_ofdata_to_platdata(struct udevice *bus)
|
||||||
|
{
|
||||||
|
struct pl022_spi_pdata *plat = bus->platdata;
|
||||||
|
const void *fdt = gd->fdt_blob;
|
||||||
|
int node = dev_of_offset(bus);
|
||||||
|
struct clk clkdev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
plat->addr = fdtdec_get_addr_size(fdt, node, "reg", &plat->size);
|
||||||
|
|
||||||
|
ret = clk_get_by_index(bus, 0, &clkdev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
plat->freq = clk_get_rate(&clkdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct udevice_id pl022_spi_ids[] = {
|
static const struct udevice_id pl022_spi_ids[] = {
|
||||||
{ .compatible = "arm,pl022-spi" },
|
{ .compatible = "arm,pl022-spi" },
|
||||||
{ }
|
{ }
|
||||||
|
@ -327,11 +321,9 @@ U_BOOT_DRIVER(pl022_spi) = {
|
||||||
.id = UCLASS_SPI,
|
.id = UCLASS_SPI,
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
||||||
.of_match = pl022_spi_ids,
|
.of_match = pl022_spi_ids,
|
||||||
#endif
|
|
||||||
.ops = &pl022_spi_ops,
|
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
||||||
.ofdata_to_platdata = pl022_spi_ofdata_to_platdata,
|
.ofdata_to_platdata = pl022_spi_ofdata_to_platdata,
|
||||||
#endif
|
#endif
|
||||||
|
.ops = &pl022_spi_ops,
|
||||||
.platdata_auto_alloc_size = sizeof(struct pl022_spi_pdata),
|
.platdata_auto_alloc_size = sizeof(struct pl022_spi_pdata),
|
||||||
.priv_auto_alloc_size = sizeof(struct pl022_spi_slave),
|
.priv_auto_alloc_size = sizeof(struct pl022_spi_slave),
|
||||||
.probe = pl022_spi_probe,
|
.probe = pl022_spi_probe,
|
||||||
|
|
|
@ -10,19 +10,12 @@
|
||||||
#ifndef __PL022_SPI_H__
|
#ifndef __PL022_SPI_H__
|
||||||
#define __PL022_SPI_H__
|
#define __PL022_SPI_H__
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
||||||
#include <clk.h>
|
|
||||||
#endif
|
|
||||||
#include <fdtdec.h>
|
#include <fdtdec.h>
|
||||||
|
|
||||||
struct pl022_spi_pdata {
|
struct pl022_spi_pdata {
|
||||||
fdt_addr_t addr;
|
fdt_addr_t addr;
|
||||||
fdt_size_t size;
|
fdt_size_t size;
|
||||||
#if !CONFIG_IS_ENABLED(OF_PLATDATA)
|
|
||||||
struct clk clk;
|
|
||||||
#else
|
|
||||||
unsigned int freq;
|
unsigned int freq;
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue