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 int rsnd_gen_path_init(struct rsnd_priv *priv, 15907539c1dSKuninori Morimoto struct rsnd_dai *rdai, 16007539c1dSKuninori Morimoto struct rsnd_dai_stream *io) 16107539c1dSKuninori Morimoto { 16207539c1dSKuninori Morimoto struct rsnd_mod *mod; 16307539c1dSKuninori Morimoto int ret; 16407539c1dSKuninori Morimoto int id; 16507539c1dSKuninori Morimoto 16607539c1dSKuninori Morimoto /* 16707539c1dSKuninori Morimoto * Gen1 is created by SRU/SSI, and this SRU is base module of 16807539c1dSKuninori Morimoto * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU) 16907539c1dSKuninori Morimoto * 17007539c1dSKuninori Morimoto * Easy image is.. 17107539c1dSKuninori Morimoto * Gen1 SRU = Gen2 SCU + SSIU + etc 17207539c1dSKuninori Morimoto * 17307539c1dSKuninori Morimoto * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is 17407539c1dSKuninori Morimoto * using fixed path. 17507539c1dSKuninori Morimoto * 17607539c1dSKuninori Morimoto * Then, SSI id = SCU id here 17707539c1dSKuninori Morimoto */ 17807539c1dSKuninori Morimoto 1794b4dab82SKuninori Morimoto /* get SSI's ID */ 1804b4dab82SKuninori Morimoto mod = rsnd_ssi_mod_get_frm_dai(priv, 1814b4dab82SKuninori Morimoto rsnd_dai_id(priv, rdai), 1824b4dab82SKuninori Morimoto rsnd_dai_is_play(rdai, io)); 1834b4dab82SKuninori Morimoto id = rsnd_mod_id(mod); 18407539c1dSKuninori Morimoto 185ae5c3223SKuninori Morimoto /* SSI */ 186ae5c3223SKuninori Morimoto mod = rsnd_ssi_mod_get(priv, id); 187ae5c3223SKuninori Morimoto ret = rsnd_dai_connect(rdai, mod, io); 188ae5c3223SKuninori Morimoto if (ret < 0) 189ae5c3223SKuninori Morimoto return ret; 190ae5c3223SKuninori Morimoto 19107539c1dSKuninori Morimoto /* SCU */ 19207539c1dSKuninori Morimoto mod = rsnd_scu_mod_get(priv, id); 19307539c1dSKuninori Morimoto ret = rsnd_dai_connect(rdai, mod, io); 19407539c1dSKuninori Morimoto 19507539c1dSKuninori Morimoto return ret; 19607539c1dSKuninori Morimoto } 19707539c1dSKuninori Morimoto 198994a9df1SKuninori Morimoto int rsnd_gen_path_exit(struct rsnd_priv *priv, 19907539c1dSKuninori Morimoto struct rsnd_dai *rdai, 20007539c1dSKuninori Morimoto struct rsnd_dai_stream *io) 20107539c1dSKuninori Morimoto { 20207539c1dSKuninori Morimoto struct rsnd_mod *mod, *n; 20307539c1dSKuninori Morimoto int ret = 0; 20407539c1dSKuninori Morimoto 20507539c1dSKuninori Morimoto /* 20607539c1dSKuninori Morimoto * remove all mod from rdai 20707539c1dSKuninori Morimoto */ 20807539c1dSKuninori Morimoto for_each_rsnd_mod(mod, n, io) 20907539c1dSKuninori Morimoto ret |= rsnd_dai_disconnect(mod); 21007539c1dSKuninori Morimoto 21107539c1dSKuninori Morimoto return ret; 21207539c1dSKuninori Morimoto } 21307539c1dSKuninori Morimoto 214994a9df1SKuninori Morimoto /* 215994a9df1SKuninori Morimoto * Gen2 216994a9df1SKuninori Morimoto */ 217994a9df1SKuninori Morimoto 218507d466cSKuninori Morimoto /* single address mapping */ 219507d466cSKuninori Morimoto #define RSND_GEN2_S_REG(gen, reg, id, offset) \ 2201a1c75a7SKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN2_##reg, offset, 0, 10) 221507d466cSKuninori Morimoto 222507d466cSKuninori Morimoto /* multi address mapping */ 223507d466cSKuninori Morimoto #define RSND_GEN2_M_REG(gen, reg, id, offset, _id_offset) \ 2241a1c75a7SKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN2_##reg, offset, _id_offset, 10) 225507d466cSKuninori Morimoto 226507d466cSKuninori Morimoto static int rsnd_gen2_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen) 227507d466cSKuninori Morimoto { 228507d466cSKuninori Morimoto struct reg_field regf[RSND_REG_MAX] = { 229507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, SSIU, SSI_MODE0, 0x800), 230507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, SSIU, SSI_MODE1, 0x804), 231507d466cSKuninori Morimoto /* FIXME: it needs SSI_MODE2/3 in the future */ 232507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSIU, INT_ENABLE, 0x18, 0x80), 233507d466cSKuninori Morimoto 234507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, BRRA, 0x00), 235507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, BRRB, 0x04), 236507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, SSICKR, 0x08), 237507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL0, 0x0c), 238507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL1, 0x10), 239507d466cSKuninori Morimoto RSND_GEN2_S_REG(gen, ADG, AUDIO_CLK_SEL2, 0x14), 240507d466cSKuninori Morimoto 241507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSICR, 0x00, 0x40), 242507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSISR, 0x04, 0x40), 243507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSITDR, 0x08, 0x40), 244507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSIRDR, 0x0c, 0x40), 245507d466cSKuninori Morimoto RSND_GEN2_M_REG(gen, SSI, SSIWSR, 0x20, 0x40), 246507d466cSKuninori Morimoto }; 247507d466cSKuninori Morimoto 248507d466cSKuninori Morimoto return rsnd_gen_regmap_init(priv, gen, regf); 249507d466cSKuninori Morimoto } 250507d466cSKuninori Morimoto 251507d466cSKuninori Morimoto static int rsnd_gen2_probe(struct platform_device *pdev, 252507d466cSKuninori Morimoto struct rcar_snd_info *info, 253507d466cSKuninori Morimoto struct rsnd_priv *priv) 254507d466cSKuninori Morimoto { 255507d466cSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 256507d466cSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 257507d466cSKuninori Morimoto struct resource *scu_res; 258507d466cSKuninori Morimoto struct resource *adg_res; 259507d466cSKuninori Morimoto struct resource *ssiu_res; 260507d466cSKuninori Morimoto struct resource *ssi_res; 261507d466cSKuninori Morimoto int ret; 262507d466cSKuninori Morimoto 263507d466cSKuninori Morimoto /* 264507d466cSKuninori Morimoto * map address 265507d466cSKuninori Morimoto */ 266507d466cSKuninori Morimoto scu_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SCU); 267507d466cSKuninori Morimoto adg_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_ADG); 268507d466cSKuninori Morimoto ssiu_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SSIU); 269507d466cSKuninori Morimoto ssi_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN2_SSI); 270507d466cSKuninori Morimoto 271507d466cSKuninori Morimoto gen->base[RSND_GEN2_SCU] = devm_ioremap_resource(dev, scu_res); 272507d466cSKuninori Morimoto gen->base[RSND_GEN2_ADG] = devm_ioremap_resource(dev, adg_res); 273507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSIU] = devm_ioremap_resource(dev, ssiu_res); 274507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSI] = devm_ioremap_resource(dev, ssi_res); 275507d466cSKuninori Morimoto if (IS_ERR(gen->base[RSND_GEN2_SCU]) || 276507d466cSKuninori Morimoto IS_ERR(gen->base[RSND_GEN2_ADG]) || 277507d466cSKuninori Morimoto IS_ERR(gen->base[RSND_GEN2_SSIU]) || 278507d466cSKuninori Morimoto IS_ERR(gen->base[RSND_GEN2_SSI])) 279507d466cSKuninori Morimoto return -ENODEV; 280507d466cSKuninori Morimoto 281507d466cSKuninori Morimoto ret = rsnd_gen2_regmap_init(priv, gen); 282507d466cSKuninori Morimoto if (ret < 0) 283507d466cSKuninori Morimoto return ret; 284507d466cSKuninori Morimoto 285507d466cSKuninori Morimoto dev_dbg(dev, "Gen2 device probed\n"); 28664de62b3SKuninori Morimoto dev_dbg(dev, "SCU : %08x => %p\n", scu_res->start, 287507d466cSKuninori Morimoto gen->base[RSND_GEN2_SCU]); 288507d466cSKuninori Morimoto dev_dbg(dev, "ADG : %08x => %p\n", adg_res->start, 289507d466cSKuninori Morimoto gen->base[RSND_GEN2_ADG]); 290507d466cSKuninori Morimoto dev_dbg(dev, "SSIU : %08x => %p\n", ssiu_res->start, 291507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSIU]); 292507d466cSKuninori Morimoto dev_dbg(dev, "SSI : %08x => %p\n", ssi_res->start, 293507d466cSKuninori Morimoto gen->base[RSND_GEN2_SSI]); 294507d466cSKuninori Morimoto 295507d466cSKuninori Morimoto return 0; 296507d466cSKuninori Morimoto } 297507d466cSKuninori Morimoto 298994a9df1SKuninori Morimoto /* 299994a9df1SKuninori Morimoto * Gen1 300994a9df1SKuninori Morimoto */ 301994a9df1SKuninori Morimoto 30255e5b6fdSKuninori Morimoto /* single address mapping */ 30355e5b6fdSKuninori Morimoto #define RSND_GEN1_S_REG(gen, reg, id, offset) \ 30455e5b6fdSKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN1_##reg, offset, 0, 9) 30507539c1dSKuninori Morimoto 30655e5b6fdSKuninori Morimoto /* multi address mapping */ 30755e5b6fdSKuninori Morimoto #define RSND_GEN1_M_REG(gen, reg, id, offset, _id_offset) \ 30855e5b6fdSKuninori Morimoto RSND_REG_SET(gen, RSND_REG_##id, RSND_GEN1_##reg, offset, _id_offset, 9) 30955e5b6fdSKuninori Morimoto 31055e5b6fdSKuninori Morimoto static int rsnd_gen1_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen) 31107539c1dSKuninori Morimoto { 31255e5b6fdSKuninori Morimoto struct reg_field regf[RSND_REG_MAX] = { 31355e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_ROUTE_SEL, 0x00), 31455e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL0, 0x08), 31555e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL1, 0x0c), 31655e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_TMG_SEL2, 0x10), 317690ef81eSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SRC_ROUTE_CTRL, 0xc0), 31855e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SSI_MODE0, 0xD0), 31955e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, SRU, SSI_MODE1, 0xD4), 3200290d2a4SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_BUSIF_MODE, 0x20, 0x4), 321ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_ROUTE_MODE0,0x50, 0x8), 322ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_SWRSR, 0x200, 0x40), 323ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_SRCIR, 0x204, 0x40), 324690ef81eSKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_ADINR, 0x214, 0x40), 325ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_IFSCR, 0x21c, 0x40), 326ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_IFSVR, 0x220, 0x40), 327ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_SRCCR, 0x224, 0x40), 328ef749400SKuninori Morimoto RSND_GEN1_M_REG(gen, SRU, SRC_MNFSR, 0x228, 0x40), 329dfc9403bSKuninori Morimoto 33055e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, BRRA, 0x00), 33155e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, BRRB, 0x04), 33255e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, SSICKR, 0x08), 33355e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL0, 0x0c), 33455e5b6fdSKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL1, 0x10), 335ef749400SKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL3, 0x18), 336ef749400SKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL4, 0x1c), 337ef749400SKuninori Morimoto RSND_GEN1_S_REG(gen, ADG, AUDIO_CLK_SEL5, 0x20), 338ae5c3223SKuninori Morimoto 33955e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSICR, 0x00, 0x40), 34055e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSISR, 0x04, 0x40), 34155e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSITDR, 0x08, 0x40), 34255e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSIRDR, 0x0c, 0x40), 34355e5b6fdSKuninori Morimoto RSND_GEN1_M_REG(gen, SSI, SSIWSR, 0x20, 0x40), 34455e5b6fdSKuninori Morimoto }; 34555e5b6fdSKuninori Morimoto 346c1e6cc5eSKuninori Morimoto return rsnd_gen_regmap_init(priv, gen, regf); 34707539c1dSKuninori Morimoto } 34807539c1dSKuninori Morimoto 3493337744aSKuninori Morimoto static int rsnd_gen1_probe(struct platform_device *pdev, 3503337744aSKuninori Morimoto struct rcar_snd_info *info, 3513337744aSKuninori Morimoto struct rsnd_priv *priv) 3523337744aSKuninori Morimoto { 35307539c1dSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 35407539c1dSKuninori Morimoto struct rsnd_gen *gen = rsnd_priv_to_gen(priv); 35507539c1dSKuninori Morimoto struct resource *sru_res; 356dfc9403bSKuninori Morimoto struct resource *adg_res; 357ae5c3223SKuninori Morimoto struct resource *ssi_res; 35855e5b6fdSKuninori Morimoto int ret; 35907539c1dSKuninori Morimoto 36007539c1dSKuninori Morimoto /* 36107539c1dSKuninori Morimoto * map address 36207539c1dSKuninori Morimoto */ 36307539c1dSKuninori Morimoto sru_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_SRU); 364dfc9403bSKuninori Morimoto adg_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_ADG); 365ae5c3223SKuninori Morimoto ssi_res = platform_get_resource(pdev, IORESOURCE_MEM, RSND_GEN1_SSI); 36607539c1dSKuninori Morimoto 36707539c1dSKuninori Morimoto gen->base[RSND_GEN1_SRU] = devm_ioremap_resource(dev, sru_res); 368dfc9403bSKuninori Morimoto gen->base[RSND_GEN1_ADG] = devm_ioremap_resource(dev, adg_res); 369ae5c3223SKuninori Morimoto gen->base[RSND_GEN1_SSI] = devm_ioremap_resource(dev, ssi_res); 37070263cb4SWei Yongjun if (IS_ERR(gen->base[RSND_GEN1_SRU]) || 37170263cb4SWei Yongjun IS_ERR(gen->base[RSND_GEN1_ADG]) || 37270263cb4SWei Yongjun IS_ERR(gen->base[RSND_GEN1_SSI])) 37307539c1dSKuninori Morimoto return -ENODEV; 37407539c1dSKuninori Morimoto 37555e5b6fdSKuninori Morimoto ret = rsnd_gen1_regmap_init(priv, gen); 37655e5b6fdSKuninori Morimoto if (ret < 0) 37755e5b6fdSKuninori Morimoto return ret; 37807539c1dSKuninori Morimoto 37907539c1dSKuninori Morimoto dev_dbg(dev, "Gen1 device probed\n"); 38007539c1dSKuninori Morimoto dev_dbg(dev, "SRU : %08x => %p\n", sru_res->start, 38107539c1dSKuninori Morimoto gen->base[RSND_GEN1_SRU]); 382dfc9403bSKuninori Morimoto dev_dbg(dev, "ADG : %08x => %p\n", adg_res->start, 383dfc9403bSKuninori Morimoto gen->base[RSND_GEN1_ADG]); 384ae5c3223SKuninori Morimoto dev_dbg(dev, "SSI : %08x => %p\n", ssi_res->start, 385ae5c3223SKuninori Morimoto gen->base[RSND_GEN1_SSI]); 38607539c1dSKuninori Morimoto 3873337744aSKuninori Morimoto return 0; 388ae5c3223SKuninori Morimoto 3893337744aSKuninori Morimoto } 3903337744aSKuninori Morimoto 3913337744aSKuninori Morimoto /* 3923337744aSKuninori Morimoto * Gen 3933337744aSKuninori Morimoto */ 3943337744aSKuninori Morimoto int rsnd_gen_probe(struct platform_device *pdev, 3953337744aSKuninori Morimoto struct rcar_snd_info *info, 3963337744aSKuninori Morimoto struct rsnd_priv *priv) 3973337744aSKuninori Morimoto { 3983337744aSKuninori Morimoto struct device *dev = rsnd_priv_to_dev(priv); 3993337744aSKuninori Morimoto struct rsnd_gen *gen; 400531eaf49SKuninori Morimoto int ret; 4013337744aSKuninori Morimoto 4023337744aSKuninori Morimoto gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL); 4033337744aSKuninori Morimoto if (!gen) { 4043337744aSKuninori Morimoto dev_err(dev, "GEN allocate failed\n"); 4053337744aSKuninori Morimoto return -ENOMEM; 4063337744aSKuninori Morimoto } 4073337744aSKuninori Morimoto 408531eaf49SKuninori Morimoto priv->gen = gen; 409072188b6SKuninori Morimoto 410507d466cSKuninori Morimoto ret = -ENODEV; 411507d466cSKuninori Morimoto if (rsnd_is_gen1(priv)) 412531eaf49SKuninori Morimoto ret = rsnd_gen1_probe(pdev, info, priv); 413507d466cSKuninori Morimoto else if (rsnd_is_gen2(priv)) 414507d466cSKuninori Morimoto ret = rsnd_gen2_probe(pdev, info, priv); 415507d466cSKuninori Morimoto 416507d466cSKuninori Morimoto if (ret < 0) 417072188b6SKuninori Morimoto dev_err(dev, "unknown generation R-Car sound device\n"); 418072188b6SKuninori Morimoto 419531eaf49SKuninori Morimoto return ret; 4203337744aSKuninori Morimoto } 4213337744aSKuninori Morimoto 4223337744aSKuninori Morimoto void rsnd_gen_remove(struct platform_device *pdev, 4233337744aSKuninori Morimoto struct rsnd_priv *priv) 4243337744aSKuninori Morimoto { 4253337744aSKuninori Morimoto } 426