Lines Matching +full:has +full:- +full:chip +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-only
3 * drivers/pwm/pwm-pxa.c
7 * 2008-02-13 initial version
27 { "pxa25x-pwm", 0 },
28 { "pxa27x-pwm", HAS_SECONDARY_PWM },
29 { "pxa168-pwm", 0 },
30 { "pxa910-pwm", 0 },
44 struct pwm_chip chip; member
51 static inline struct pxa_pwm_chip *to_pxa_pwm_chip(struct pwm_chip *chip) in to_pxa_pwm_chip() argument
53 return container_of(chip, struct pxa_pwm_chip, chip); in to_pxa_pwm_chip()
60 static int pxa_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, in pxa_pwm_config() argument
63 struct pxa_pwm_chip *pc = to_pxa_pwm_chip(chip); in pxa_pwm_config()
69 offset = pwm->hwpwm ? 0x10 : 0; in pxa_pwm_config()
71 c = clk_get_rate(pc->clk); in pxa_pwm_config()
78 prescale = (period_cycles - 1) / 1024; in pxa_pwm_config()
79 pv = period_cycles / (prescale + 1) - 1; in pxa_pwm_config()
82 return -EINVAL; in pxa_pwm_config()
89 /* NOTE: the clock to PWM has to be enabled first in pxa_pwm_config()
92 rc = clk_prepare_enable(pc->clk); in pxa_pwm_config()
96 writel(prescale, pc->mmio_base + offset + PWMCR); in pxa_pwm_config()
97 writel(dc, pc->mmio_base + offset + PWMDCR); in pxa_pwm_config()
98 writel(pv, pc->mmio_base + offset + PWMPCR); in pxa_pwm_config()
100 clk_disable_unprepare(pc->clk); in pxa_pwm_config()
104 static int pxa_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) in pxa_pwm_enable() argument
106 struct pxa_pwm_chip *pc = to_pxa_pwm_chip(chip); in pxa_pwm_enable()
108 return clk_prepare_enable(pc->clk); in pxa_pwm_enable()
111 static void pxa_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) in pxa_pwm_disable() argument
113 struct pxa_pwm_chip *pc = to_pxa_pwm_chip(chip); in pxa_pwm_disable()
115 clk_disable_unprepare(pc->clk); in pxa_pwm_disable()
129 * code that this is a single channel pxa25x-pwm. Currently all devices are
133 { .compatible = "marvell,pxa250-pwm", .data = &pwm_id_table[0]},
134 { .compatible = "marvell,pxa270-pwm", .data = &pwm_id_table[0]},
135 { .compatible = "marvell,pxa168-pwm", .data = &pwm_id_table[0]},
136 { .compatible = "marvell,pxa910-pwm", .data = &pwm_id_table[0]},
146 const struct of_device_id *id = of_match_device(pwm_of_match, dev); in pxa_pwm_get_id_dt() local
148 return id ? id->data : NULL; in pxa_pwm_get_id_dt()
160 pwm->args.period = args->args[0]; in pxa_pwm_of_xlate()
167 const struct platform_device_id *id = platform_get_device_id(pdev); in pwm_probe() local
171 if (IS_ENABLED(CONFIG_OF) && id == NULL) in pwm_probe()
172 id = pxa_pwm_get_id_dt(&pdev->dev); in pwm_probe()
174 if (id == NULL) in pwm_probe()
175 return -EINVAL; in pwm_probe()
177 pc = devm_kzalloc(&pdev->dev, sizeof(*pc), GFP_KERNEL); in pwm_probe()
179 return -ENOMEM; in pwm_probe()
181 pc->clk = devm_clk_get(&pdev->dev, NULL); in pwm_probe()
182 if (IS_ERR(pc->clk)) in pwm_probe()
183 return PTR_ERR(pc->clk); in pwm_probe()
185 pc->chip.dev = &pdev->dev; in pwm_probe()
186 pc->chip.ops = &pxa_pwm_ops; in pwm_probe()
187 pc->chip.npwm = (id->driver_data & HAS_SECONDARY_PWM) ? 2 : 1; in pwm_probe()
190 pc->chip.of_xlate = pxa_pwm_of_xlate; in pwm_probe()
191 pc->chip.of_pwm_n_cells = 1; in pwm_probe()
194 pc->mmio_base = devm_platform_ioremap_resource(pdev, 0); in pwm_probe()
195 if (IS_ERR(pc->mmio_base)) in pwm_probe()
196 return PTR_ERR(pc->mmio_base); in pwm_probe()
198 ret = devm_pwmchip_add(&pdev->dev, &pc->chip); in pwm_probe()
200 dev_err(&pdev->dev, "pwmchip_add() failed: %d\n", ret); in pwm_probe()
209 .name = "pxa25x-pwm",