13337744aSKuninori Morimoto /* 23337744aSKuninori Morimoto * Renesas R-Car Gen1 SRU/SSI support 33337744aSKuninori Morimoto * 43337744aSKuninori Morimoto * Copyright (C) 2013 Renesas Solutions Corp. 53337744aSKuninori Morimoto * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 63337744aSKuninori Morimoto * 73337744aSKuninori Morimoto * This program is free software; you can redistribute it and/or modify 83337744aSKuninori Morimoto * it under the terms of the GNU General Public License version 2 as 93337744aSKuninori Morimoto * published by the Free Software Foundation. 103337744aSKuninori Morimoto */ 113337744aSKuninori Morimoto #include "rsnd.h" 123337744aSKuninori Morimoto 133337744aSKuninori Morimoto struct rsnd_gen { 143337744aSKuninori Morimoto void __iomem *base[RSND_BASE_MAX]; 153337744aSKuninori Morimoto 163337744aSKuninori Morimoto struct rsnd_gen_ops *ops; 1755e5b6fdSKuninori Morimoto 1855e5b6fdSKuninori Morimoto struct regmap *regmap; 1955e5b6fdSKuninori Morimoto struct regmap_field *regs[RSND_REG_MAX]; 203337744aSKuninori Morimoto }; 213337744aSKuninori Morimoto 223337744aSKuninori Morimoto #define rsnd_priv_to_gen(p) ((struct rsnd_gen *)(p)->gen) 233337744aSKuninori Morimoto 2455e5b6fdSKuninori Morimoto #define RSND_REG_SET(gen, id, reg_id, offset, _id_offset, _id_size) \ 2555e5b6fdSKuninori Morimoto [id] = { \ 2655e5b6fdSKuninori Morimoto .reg = (unsigned int)gen->base[reg_id] + offset, \ 2755e5b6fdSKuninori Morimoto .lsb = 0, \ 2855e5b6fdSKuninori Morimoto .msb = 31, \ 2955e5b6fdSKuninori Morimoto .id_size = _id_size, \ 3055e5b6fdSKuninori Morimoto .id_offset = _id_offset, \ 3155e5b6fdSKuninori Morimoto } 3255e5b6fdSKuninori Morimoto 3355e5b6fdSKuninori Morimoto /* 3455e5b6fdSKuninori Morimoto * basic function 3555e5b6fdSKuninori Morimoto */ 3655e5b6fdSKuninori Morimoto static int rsnd_regmap_write32(void *context, const void *_data, size_t count) 3755e5b6fdSKuninori Morimoto { 3855e5b6fdSKuninori Morimoto struct rsnd_priv *priv = context; 3955e5b6fdSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 4055e5b6fdSKuninori Morimoto u32 *data = (u32 *)_data; 4155e5b6fdSKuninori Morimoto u32 val = data[1]; 4255e5b6fdSKuninori Morimoto void __iomem *reg = (void *)data[0]; 4355e5b6fdSKuninori Morimoto 4455e5b6fdSKuninori Morimoto iowrite32(val, reg); 4555e5b6fdSKuninori Morimoto 4655e5b6fdSKuninori Morimoto dev_dbg(dev, "w %p : %08x\n", reg, val); 4755e5b6fdSKuninori Morimoto 4855e5b6fdSKuninori Morimoto return 0; 4955e5b6fdSKuninori Morimoto } 5055e5b6fdSKuninori Morimoto 5155e5b6fdSKuninori Morimoto static int rsnd_regmap_read32(void *context, 5255e5b6fdSKuninori Morimoto const void *_data, size_t reg_size, 5355e5b6fdSKuninori Morimoto void *_val, size_t val_size) 5455e5b6fdSKuninori Morimoto { 5555e5b6fdSKuninori Morimoto struct rsnd_priv *priv = context; 5655e5b6fdSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 5755e5b6fdSKuninori Morimoto u32 *data = (u32 *)_data; 5855e5b6fdSKuninori Morimoto u32 *val = (u32 *)_val; 5955e5b6fdSKuninori Morimoto void __iomem *reg = (void *)data[0]; 6055e5b6fdSKuninori Morimoto 6155e5b6fdSKuninori Morimoto *val = ioread32(reg); 6255e5b6fdSKuninori Morimoto 6355e5b6fdSKuninori Morimoto dev_dbg(dev, "r %p : %08x\n", reg, *val); 6455e5b6fdSKuninori Morimoto 6555e5b6fdSKuninori Morimoto return 0; 6655e5b6fdSKuninori Morimoto } 6755e5b6fdSKuninori Morimoto 6855e5b6fdSKuninori Morimoto static struct regmap_bus rsnd_regmap_bus = { 6955e5b6fdSKuninori Morimoto .write = rsnd_regmap_write32, 7055e5b6fdSKuninori Morimoto .read = rsnd_regmap_read32, 7155e5b6fdSKuninori Morimoto .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, 7255e5b6fdSKuninori Morimoto .val_format_endian_default = REGMAP_ENDIAN_NATIVE, 7355e5b6fdSKuninori Morimoto }; 7455e5b6fdSKuninori Morimoto 7542ee5d22SKuninori Morimoto static int rsnd_is_accessible_reg(struct rsnd_priv *priv, 7642ee5d22SKuninori Morimoto struct rsnd_gen *gen, enum rsnd_reg reg) 7742ee5d22SKuninori Morimoto { 7842ee5d22SKuninori Morimoto if (!gen->regs[reg]) { 7942ee5d22SKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 8042ee5d22SKuninori Morimoto 8142ee5d22SKuninori Morimoto dev_err(dev, "unsupported register access %x\n", reg); 8242ee5d22SKuninori Morimoto return 0; 8342ee5d22SKuninori Morimoto } 8442ee5d22SKuninori Morimoto 8542ee5d22SKuninori Morimoto return 1; 8642ee5d22SKuninori Morimoto } 8742ee5d22SKuninori Morimoto 8855e5b6fdSKuninori Morimoto u32 rsnd_read(struct rsnd_priv *priv, 8955e5b6fdSKuninori Morimoto struct rsnd_mod *mod, enum rsnd_reg reg) 9055e5b6fdSKuninori Morimoto { 9155e5b6fdSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 9255e5b6fdSKuninori Morimoto u32 val; 9355e5b6fdSKuninori Morimoto 9442ee5d22SKuninori Morimoto if (!rsnd_is_accessible_reg(priv, gen, reg)) 9542ee5d22SKuninori Morimoto return 0; 9642ee5d22SKuninori Morimoto 9755e5b6fdSKuninori Morimoto regmap_fields_read(gen->regs[reg], rsnd_mod_id(mod), &val); 9855e5b6fdSKuninori Morimoto 9955e5b6fdSKuninori Morimoto return val; 10055e5b6fdSKuninori Morimoto } 10155e5b6fdSKuninori Morimoto 10255e5b6fdSKuninori Morimoto void rsnd_write(struct rsnd_priv *priv, 10355e5b6fdSKuninori Morimoto struct rsnd_mod *mod, 10455e5b6fdSKuninori Morimoto enum rsnd_reg reg, u32 data) 10555e5b6fdSKuninori Morimoto { 10655e5b6fdSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 10755e5b6fdSKuninori Morimoto 10842ee5d22SKuninori Morimoto if (!rsnd_is_accessible_reg(priv, gen, reg)) 10942ee5d22SKuninori Morimoto return; 11042ee5d22SKuninori Morimoto 11155e5b6fdSKuninori Morimoto regmap_fields_write(gen->regs[reg], rsnd_mod_id(mod), data); 11255e5b6fdSKuninori Morimoto } 11355e5b6fdSKuninori Morimoto 11455e5b6fdSKuninori Morimoto void rsnd_bset(struct rsnd_priv *priv, struct rsnd_mod *mod, 11555e5b6fdSKuninori Morimoto enum rsnd_reg reg, u32 mask, u32 data) 11655e5b6fdSKuninori Morimoto { 11755e5b6fdSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 11855e5b6fdSKuninori Morimoto 11942ee5d22SKuninori Morimoto if (!rsnd_is_accessible_reg(priv, gen, reg)) 12042ee5d22SKuninori Morimoto return; 12142ee5d22SKuninori Morimoto 12255e5b6fdSKuninori Morimoto regmap_fields_update_bits(gen->regs[reg], rsnd_mod_id(mod), 12355e5b6fdSKuninori Morimoto mask, data); 12455e5b6fdSKuninori Morimoto } 12555e5b6fdSKuninori Morimoto 126c1e6cc5eSKuninori Morimoto static int rsnd_gen_regmap_init(struct rsnd_priv *priv, 127c1e6cc5eSKuninori Morimoto struct rsnd_gen *gen, 128c1e6cc5eSKuninori Morimoto struct reg_field *regf) 129c1e6cc5eSKuninori Morimoto { 130c1e6cc5eSKuninori Morimoto int i; 131c1e6cc5eSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 132c1e6cc5eSKuninori Morimoto struct regmap_config regc; 133c1e6cc5eSKuninori Morimoto 134c1e6cc5eSKuninori Morimoto memset(®c, 0, sizeof(regc)); 135c1e6cc5eSKuninori Morimoto regc.reg_bits = 32; 136c1e6cc5eSKuninori Morimoto regc.val_bits = 32; 137c1e6cc5eSKuninori Morimoto 138c1e6cc5eSKuninori Morimoto gen->regmap = devm_regmap_init(dev, &rsnd_regmap_bus, priv, ®c); 139c1e6cc5eSKuninori Morimoto if (IS_ERR(gen->regmap)) { 140c1e6cc5eSKuninori Morimoto dev_err(dev, "regmap error %ld\n", PTR_ERR(gen->regmap)); 141c1e6cc5eSKuninori Morimoto return PTR_ERR(gen->regmap); 142c1e6cc5eSKuninori Morimoto } 143c1e6cc5eSKuninori Morimoto 144c1e6cc5eSKuninori Morimoto for (i = 0; i < RSND_REG_MAX; i++) { 14542ee5d22SKuninori Morimoto gen->regs[i] = NULL; 14642ee5d22SKuninori Morimoto if (!regf[i].reg) 14742ee5d22SKuninori Morimoto continue; 14842ee5d22SKuninori Morimoto 149c1e6cc5eSKuninori Morimoto gen->regs[i] = devm_regmap_field_alloc(dev, gen->regmap, regf[i]); 150c1e6cc5eSKuninori Morimoto if (IS_ERR(gen->regs[i])) 151c1e6cc5eSKuninori Morimoto return PTR_ERR(gen->regs[i]); 152c1e6cc5eSKuninori Morimoto 153c1e6cc5eSKuninori Morimoto } 154c1e6cc5eSKuninori Morimoto 155c1e6cc5eSKuninori Morimoto return 0; 156c1e6cc5eSKuninori Morimoto } 1573337744aSKuninori Morimoto 158994a9df1SKuninori Morimoto /* 159994a9df1SKuninori Morimoto * Gen2 160994a9df1SKuninori Morimoto */ 161994a9df1SKuninori Morimoto 162507d466cSKuninori Morimoto /* single address mapping */ 163507d466cSKuninori Morimoto #define RSND_GEN2_S_REG(gen, reg, id, offset) \ 1641a1c75a7SKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN2_##reg, offset, 0, 10) 165507d466cSKuninori Morimoto 166507d466cSKuninori Morimoto /* multi address mapping */ 167507d466cSKuninori Morimoto #define RSND_GEN2_M_REG(gen, reg, id, offset, _id_offset) \ 1681a1c75a7SKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN2_##reg, offset, _id_offset, 10) 169507d466cSKuninori Morimoto 170507d466cSKuninori Morimoto static int rsnd_gen2_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen) 171507d466cSKuninori Morimoto { 172507d466cSKuninori Morimoto struct reg_field regf[RSND_REG_MAX] = { 173507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, SSIU, SSI_MODE0, 0x800), 174507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, SSIU, SSI_MODE1, 0x804), 175507d466cSKuninori Morimoto /* FIXME: it needs SSI_MODE2/3 in the future */ 176629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SSIU, SSI_BUSIF_MODE, 0x0, 0x80), 177629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SSIU, SSI_BUSIF_ADINR,0x4, 0x80), 178629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SSIU, SSI_CTRL, 0x10, 0x80), 179507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSIU, INT_ENABLE, 0x18, 0x80), 180507d466cSKuninori Morimoto 181629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_BUSIF_MODE, 0x0, 0x20), 182629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_ROUTE_MODE0,0xc, 0x20), 183629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_CTRL, 0x10, 0x20), 184bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, CMD_ROUTE_SLCT, 0x18c, 0x20), 185bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, CMD_CTRL, 0x190, 0x20), 186629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_SWRSR, 0x200, 0x40), 187629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_SRCIR, 0x204, 0x40), 188629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_ADINR, 0x214, 0x40), 189629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_IFSCR, 0x21c, 0x40), 190629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_IFSVR, 0x220, 0x40), 191629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_SRCCR, 0x224, 0x40), 192629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_BSDSR, 0x22c, 0x40), 193629509c5SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, SRC_BSISR, 0x238, 0x40), 194bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_SWRSR, 0xe00, 0x100), 195bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_DVUIR, 0xe04, 0x100), 196bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_ADINR, 0xe08, 0x100), 197bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_DVUCR, 0xe10, 0x100), 198bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_ZCMCR, 0xe14, 0x100), 199bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_VOL0R, 0xe28, 0x100), 200bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_VOL1R, 0xe2c, 0x100), 201bff58ea4SKuninori Morimoto RSND_GEN2_M_REG(gen, SCU, DVC_DVUER, 0xe48, 0x100), 202629509c5SKuninori Morimoto 203507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, BRRA, 0x00), 204507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, BRRB, 0x04), 205507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SSICKR, 0x08), 206507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL0, 0x0c), 207507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL1, 0x10), 208507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL2, 0x14), 209ee2c828dSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, DIV_EN, 0x30), 210629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCIN_TIMSEL0, 0x34), 211629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCIN_TIMSEL1, 0x38), 212629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCIN_TIMSEL2, 0x3c), 213629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCIN_TIMSEL3, 0x40), 214629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCIN_TIMSEL4, 0x44), 215629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCOUT_TIMSEL0, 0x48), 216629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCOUT_TIMSEL1, 0x4c), 217629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCOUT_TIMSEL2, 0x50), 218629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCOUT_TIMSEL3, 0x54), 219629509c5SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SRCOUT_TIMSEL4, 0x58), 220bff58ea4SKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, CMDOUT_TIMSEL, 0x5c), 221507d466cSKuninori Morimoto 222507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSICR, 0x00, 0x40), 223507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSISR, 0x04, 0x40), 224507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSITDR, 0x08, 0x40), 225507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSIRDR, 0x0c, 0x40), 226507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSIWSR, 0x20, 0x40), 227507d466cSKuninori Morimoto }; 228507d466cSKuninori Morimoto 229507d466cSKuninori Morimoto return rsnd_gen_regmap_init(priv, gen, regf); 230507d466cSKuninori Morimoto } 231507d466cSKuninori Morimoto 232507d466cSKuninori Morimoto static int rsnd_gen2_probe(struct platform_device *pdev, 233507d466cSKuninori Morimoto struct rsnd_priv *priv) 234507d466cSKuninori Morimoto { 235507d466cSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 236507d466cSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 237507d466cSKuninori Morimoto struct resource *scu_res; 238507d466cSKuninori Morimoto struct resource *adg_res; 239507d466cSKuninori Morimoto struct resource *ssiu_res; 240507d466cSKuninori Morimoto struct resource *ssi_res; 241507d466cSKuninori Morimoto int ret; 242507d466cSKuninori Morimoto 243507d466cSKuninori Morimoto /* 244507d466cSKuninori Morimoto * map address 245507d466cSKuninori Morimoto */ 246507d466cSKuninori Morimoto scu_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SCU); 247507d466cSKuninori Morimoto adg_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_ADG); 248507d466cSKuninori Morimoto ssiu_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SSIU); 249507d466cSKuninori Morimoto ssi_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SSI); 250507d466cSKuninori Morimoto 251507d466cSKuninori Morimoto gen->base[RSND_GEN2_SCU] = devm_ioremap_resource(dev, scu_res); 252507d466cSKuninori Morimoto gen->base[RSND_GEN2_ADG] = devm_ioremap_resource(dev, adg_res); 253507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSIU] = devm_ioremap_resource(dev, ssiu_res); 254507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSI] = devm_ioremap_resource(dev, ssi_res); 255507d466cSKuninori Morimoto if (IS_ERR(gen->base[RSND_GEN2_SCU]) || 256507d466cSKuninori Morimoto IS_ERR(gen->base[RSND_GEN2_ADG]) || 257507d466cSKuninori Morimoto IS_ERR(gen->base[RSND_GEN2_SSIU]) || 258507d466cSKuninori Morimoto IS_ERR(gen->base[RSND_GEN2_SSI])) 259507d466cSKuninori Morimoto return -ENODEV; 260507d466cSKuninori Morimoto 261507d466cSKuninori Morimoto ret = rsnd_gen2_regmap_init(priv, gen); 262507d466cSKuninori Morimoto if (ret < 0) 263507d466cSKuninori Morimoto return ret; 264507d466cSKuninori Morimoto 265507d466cSKuninori Morimoto dev_dbg(dev, "Gen2 device probed\n"); 26664de62b3SKuninori Morimoto dev_dbg(dev, "SCU : %08x => %p\n", scu_res->start, 267507d466cSKuninori Morimoto gen->base[RSND_GEN2_SCU]); 268507d466cSKuninori Morimoto dev_dbg(dev, "ADG : %08x => %p\n", adg_res->start, 269507d466cSKuninori Morimoto gen->base[RSND_GEN2_ADG]); 270507d466cSKuninori Morimoto dev_dbg(dev, "SSIU : %08x => %p\n", ssiu_res->start, 271507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSIU]); 272507d466cSKuninori Morimoto dev_dbg(dev, "SSI : %08x => %p\n", ssi_res->start, 273507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSI]); 274507d466cSKuninori Morimoto 275507d466cSKuninori Morimoto return 0; 276507d466cSKuninori Morimoto } 277507d466cSKuninori Morimoto 278994a9df1SKuninori Morimoto /* 279994a9df1SKuninori Morimoto * Gen1 280994a9df1SKuninori Morimoto */ 281994a9df1SKuninori Morimoto 28255e5b6fdSKuninori Morimoto /* single address mapping */ 28355e5b6fdSKuninori Morimoto #define RSND_GEN1_S_REG(gen, reg, id, offset) \ 28455e5b6fdSKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN1_##reg, offset, 0, 9) 28507539c1dSKuninori Morimoto 28655e5b6fdSKuninori Morimoto /* multi address mapping */ 28755e5b6fdSKuninori Morimoto #define RSND_GEN1_M_REG(gen, reg, id, offset, _id_offset) \ 28855e5b6fdSKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN1_##reg, offset, _id_offset, 9) 28955e5b6fdSKuninori Morimoto 29055e5b6fdSKuninori Morimoto static int rsnd_gen1_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen) 29107539c1dSKuninori Morimoto { 29255e5b6fdSKuninori Morimoto struct reg_field regf[RSND_REG_MAX] = { 29355e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_ROUTE_SEL, 0x00), 29455e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL0, 0x08), 29555e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL1, 0x0c), 29655e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL2, 0x10), 297690ef81eSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_ROUTE_CTRL, 0xc0), 29855e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SSI_MODE0, 0xD0), 29955e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SSI_MODE1, 0xD4), 3000290d2a4SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_BUSIF_MODE, 0x20, 0x4), 301ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_ROUTE_MODE0,0x50, 0x8), 302ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_SWRSR, 0x200, 0x40), 303ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_SRCIR, 0x204, 0x40), 304690ef81eSKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_ADINR, 0x214, 0x40), 305ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_IFSCR, 0x21c, 0x40), 306ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_IFSVR, 0x220, 0x40), 307ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_SRCCR, 0x224, 0x40), 308ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_MNFSR, 0x228, 0x40), 309dfc9403bSKuninori Morimoto 31055e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, BRRA, 0x00), 31155e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, BRRB, 0x04), 31255e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, SSICKR, 0x08), 31355e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL0, 0x0c), 31455e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL1, 0x10), 315ef749400SKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL3, 0x18), 316ef749400SKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL4, 0x1c), 317ef749400SKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL5, 0x20), 318ae5c3223SKuninori Morimoto 31955e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSICR, 0x00, 0x40), 32055e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSISR, 0x04, 0x40), 32155e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSITDR, 0x08, 0x40), 32255e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSIRDR, 0x0c, 0x40), 32355e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSIWSR, 0x20, 0x40), 32455e5b6fdSKuninori Morimoto }; 32555e5b6fdSKuninori Morimoto 326c1e6cc5eSKuninori Morimoto return rsnd_gen_regmap_init(priv, gen, regf); 32707539c1dSKuninori Morimoto } 32807539c1dSKuninori Morimoto 3293337744aSKuninori Morimoto static int rsnd_gen1_probe(struct platform_device *pdev, 3303337744aSKuninori Morimoto struct rsnd_priv *priv) 3313337744aSKuninori Morimoto { 33207539c1dSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 33307539c1dSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 33407539c1dSKuninori Morimoto struct resource *sru_res; 335dfc9403bSKuninori Morimoto struct resource *adg_res; 336ae5c3223SKuninori Morimoto struct resource *ssi_res; 33755e5b6fdSKuninori Morimoto int ret; 33807539c1dSKuninori Morimoto 33907539c1dSKuninori Morimoto /* 34007539c1dSKuninori Morimoto * map address 34107539c1dSKuninori Morimoto */ 34207539c1dSKuninori Morimoto sru_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_SRU); 343dfc9403bSKuninori Morimoto adg_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_ADG); 344ae5c3223SKuninori Morimoto ssi_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_SSI); 34507539c1dSKuninori Morimoto 34607539c1dSKuninori Morimoto gen->base[RSND_GEN1_SRU] = devm_ioremap_resource(dev, sru_res); 347dfc9403bSKuninori Morimoto gen->base[RSND_GEN1_ADG] = devm_ioremap_resource(dev, adg_res); 348ae5c3223SKuninori Morimoto gen->base[RSND_GEN1_SSI] = devm_ioremap_resource(dev, ssi_res); 34970263cb4SWei Yongjun if (IS_ERR(gen->base[RSND_GEN1_SRU]) || 35070263cb4SWei Yongjun IS_ERR(gen->base[RSND_GEN1_ADG]) || 35170263cb4SWei Yongjun IS_ERR(gen->base[RSND_GEN1_SSI])) 35207539c1dSKuninori Morimoto return -ENODEV; 35307539c1dSKuninori Morimoto 35455e5b6fdSKuninori Morimoto ret = rsnd_gen1_regmap_init(priv, gen); 35555e5b6fdSKuninori Morimoto if (ret < 0) 35655e5b6fdSKuninori Morimoto return ret; 35707539c1dSKuninori Morimoto 35807539c1dSKuninori Morimoto dev_dbg(dev, "Gen1 device probed\n"); 35907539c1dSKuninori Morimoto dev_dbg(dev, "SRU : %08x => %p\n", sru_res->start, 36007539c1dSKuninori Morimoto gen->base[RSND_GEN1_SRU]); 361dfc9403bSKuninori Morimoto dev_dbg(dev, "ADG : %08x => %p\n", adg_res->start, 362dfc9403bSKuninori Morimoto gen->base[RSND_GEN1_ADG]); 363ae5c3223SKuninori Morimoto dev_dbg(dev, "SSI : %08x => %p\n", ssi_res->start, 364ae5c3223SKuninori Morimoto gen->base[RSND_GEN1_SSI]); 36507539c1dSKuninori Morimoto 3663337744aSKuninori Morimoto return 0; 367ae5c3223SKuninori Morimoto 3683337744aSKuninori Morimoto } 3693337744aSKuninori Morimoto 3703337744aSKuninori Morimoto /* 3713337744aSKuninori Morimoto * Gen 3723337744aSKuninori Morimoto */ 37390e8e50fSKuninori Morimoto static void rsnd_of_parse_gen(struct platform_device *pdev, 37490e8e50fSKuninori Morimoto const struct rsnd_of_data *of_data, 37590e8e50fSKuninori Morimoto struct rsnd_priv *priv) 37690e8e50fSKuninori Morimoto { 37790e8e50fSKuninori Morimoto struct rcar_snd_info *info = priv->info; 37890e8e50fSKuninori Morimoto 37990e8e50fSKuninori Morimoto if (!of_data) 38090e8e50fSKuninori Morimoto return; 38190e8e50fSKuninori Morimoto 38290e8e50fSKuninori Morimoto info->flags = of_data->flags; 38390e8e50fSKuninori Morimoto } 38490e8e50fSKuninori Morimoto 3853337744aSKuninori Morimoto int rsnd_gen_probe(struct platform_device *pdev, 38690e8e50fSKuninori Morimoto const struct rsnd_of_data *of_data, 3873337744aSKuninori Morimoto struct rsnd_priv *priv) 3883337744aSKuninori Morimoto { 3893337744aSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 3903337744aSKuninori Morimoto struct rsnd_gen *gen; 391531eaf49SKuninori Morimoto int ret; 3923337744aSKuninori Morimoto 39390e8e50fSKuninori Morimoto rsnd_of_parse_gen(pdev, of_data, priv); 39490e8e50fSKuninori Morimoto 3953337744aSKuninori Morimoto gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL); 3963337744aSKuninori Morimoto if (!gen) { 3973337744aSKuninori Morimoto dev_err(dev, "GEN allocate failed\n"); 3983337744aSKuninori Morimoto return -ENOMEM; 3993337744aSKuninori Morimoto } 4003337744aSKuninori Morimoto 401531eaf49SKuninori Morimoto priv->gen = gen; 402072188b6SKuninori Morimoto 403507d466cSKuninori Morimoto ret = -ENODEV; 404507d466cSKuninori Morimoto if (rsnd_is_gen1(priv)) 4055da39cf3SKuninori Morimoto ret = rsnd_gen1_probe(pdev, priv); 406507d466cSKuninori Morimoto else if (rsnd_is_gen2(priv)) 4075da39cf3SKuninori Morimoto ret = rsnd_gen2_probe(pdev, priv); 408507d466cSKuninori Morimoto 409507d466cSKuninori Morimoto if (ret < 0) 410072188b6SKuninori Morimoto dev_err(dev, "unknown generation R-Car sound device\n"); 411072188b6SKuninori Morimoto 412531eaf49SKuninori Morimoto return ret; 4133337744aSKuninori Morimoto } 414